Coverage Report

Created: 2024-10-11 15:21

/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
64.7k
#define WUFFS_VERSION 0
85
64.7k
#define WUFFS_VERSION_MAJOR 0
86
64.7k
#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
5.56k
wuffs_base__cpu_arch__have_x86_bmi2(void) {
352
#if defined(__BMI2__)
353
  return true;
354
#else
355
5.56k
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64)
356
  // GCC defines these macros but MSVC does not.
357
  //  - bit_BMI2 = (1 <<  8)
358
5.56k
  const unsigned int bmi2_ebx7 = 0x00000100;
359
360
  // clang defines __GNUC__ and clang-cl defines _MSC_VER (but not __GNUC__).
361
5.56k
#if defined(__GNUC__)
362
5.56k
  unsigned int eax7 = 0;
363
5.56k
  unsigned int ebx7 = 0;
364
5.56k
  unsigned int ecx7 = 0;
365
5.56k
  unsigned int edx7 = 0;
366
5.56k
  if (__get_cpuid_count(7, 0, &eax7, &ebx7, &ecx7, &edx7) &&
367
5.56k
      ((ebx7 & bmi2_ebx7) == bmi2_ebx7)) {
368
5.56k
    return true;
369
5.56k
  }
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
5.56k
#endif  // defined(__BMI2__)
382
5.56k
}
383
384
static inline bool  //
385
33.9k
wuffs_base__cpu_arch__have_x86_sse42(void) {
386
#if defined(__PCLMUL__) && defined(__POPCNT__) && defined(__SSE4_2__)
387
  return true;
388
#else
389
33.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
33.9k
  const unsigned int sse42_ecx1 = 0x00900002;
395
396
  // clang defines __GNUC__ and clang-cl defines _MSC_VER (but not __GNUC__).
397
33.9k
#if defined(__GNUC__)
398
33.9k
  unsigned int eax1 = 0;
399
33.9k
  unsigned int ebx1 = 0;
400
33.9k
  unsigned int ecx1 = 0;
401
33.9k
  unsigned int edx1 = 0;
402
33.9k
  if (__get_cpuid(1, &eax1, &ebx1, &ecx1, &edx1) &&
403
33.9k
      ((ecx1 & sse42_ecx1) == sse42_ecx1)) {
404
33.9k
    return true;
405
33.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
33.9k
#endif  // defined(__PCLMUL__) && defined(__POPCNT__) && defined(__SSE4_2__)
418
33.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
67.6k
#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
76.8k
  ((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
659k
wuffs_base__make_empty_struct(void) {
554
659k
  wuffs_base__empty_struct ret;
555
659k
  ret.private_impl = 0;
556
659k
  return ret;
557
659k
}
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
509k
wuffs_base__make_status(const char* repr) {
635
509k
  wuffs_base__status z;
636
509k
  z.repr = repr;
637
509k
  return z;
638
509k
}
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
110k
wuffs_base__status__is_error(const wuffs_base__status* z) {
647
110k
  return z->repr && (*z->repr == '#');
648
110k
}
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
109k
wuffs_base__status__is_ok(const wuffs_base__status* z) {
657
109k
  return z->repr == NULL;
658
109k
}
659
660
static inline bool  //
661
159k
wuffs_base__status__is_suspension(const wuffs_base__status* z) {
662
159k
  return z->repr && (*z->repr == '$');
663
159k
}
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.72k
wuffs_base__status__message(const wuffs_base__status* z) {
685
5.72k
  if (z->repr) {
686
5.72k
    if ((*z->repr == '$') || (*z->repr == '#') || (*z->repr == '@')) {
687
5.72k
      return z->repr + 1;
688
5.72k
    }
689
5.72k
  }
690
0
  return z->repr;
691
5.72k
}
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
// Hypertext Markup Language.
823
#define WUFFS_BASE__FOURCC__HTML 0x48544D4C
824
825
// International Color Consortium Profile.
826
#define WUFFS_BASE__FOURCC__ICCP 0x49434350
827
828
// Icon.
829
#define WUFFS_BASE__FOURCC__ICO 0x49434F20
830
831
// Icon Vector Graphics.
832
#define WUFFS_BASE__FOURCC__ICVG 0x49435647
833
834
// Initialization.
835
#define WUFFS_BASE__FOURCC__INI 0x494E4920
836
837
// Joint Photographic Experts Group.
838
#define WUFFS_BASE__FOURCC__JPEG 0x4A504547
839
840
// JavaScript.
841
#define WUFFS_BASE__FOURCC__JS 0x4A532020
842
843
// JavaScript Object Notation.
844
#define WUFFS_BASE__FOURCC__JSON 0x4A534F4E
845
846
// JSON With Commas and Comments.
847
#define WUFFS_BASE__FOURCC__JWCC 0x4A574343
848
849
// Key-Value Pair.
850
#define WUFFS_BASE__FOURCC__KVP 0x4B565020
851
852
// Key-Value Pair (Key).
853
#define WUFFS_BASE__FOURCC__KVPK 0x4B56504B
854
855
// Key-Value Pair (Value).
856
#define WUFFS_BASE__FOURCC__KVPV 0x4B565056
857
858
// Lempelโ€“Ziv 4.
859
#define WUFFS_BASE__FOURCC__LZ4 0x4C5A3420
860
861
// Lzip.
862
#define WUFFS_BASE__FOURCC__LZIP 0x4C5A4950
863
864
// Lempelโ€“Ziv Markov-chain Algorithm.
865
#define WUFFS_BASE__FOURCC__LZMA 0x4C5A4D41
866
867
// Markdown.
868
#define WUFFS_BASE__FOURCC__MD 0x4D442020
869
870
// Modification Time.
871
#define WUFFS_BASE__FOURCC__MTIM 0x4D54494D
872
873
// MPEG-1 Audio Layer III.
874
#define WUFFS_BASE__FOURCC__MP3 0x4D503320
875
876
// Naive Image.
877
#define WUFFS_BASE__FOURCC__NIE 0x4E494520
878
879
// Netpbm (Portable Anymap).
880
#define WUFFS_BASE__FOURCC__NPBM 0x4E50424D
881
882
// Offset (2-Dimensional).
883
#define WUFFS_BASE__FOURCC__OFS2 0x4F465332
884
885
// Open Type Format.
886
#define WUFFS_BASE__FOURCC__OTF 0x4F544620
887
888
// Portable Document Format.
889
#define WUFFS_BASE__FOURCC__PDF 0x50444620
890
891
// Physical Dimensions.
892
#define WUFFS_BASE__FOURCC__PHYD 0x50485944
893
894
// Portable Network Graphics.
895
#define WUFFS_BASE__FOURCC__PNG 0x504E4720
896
897
// PostScript.
898
#define WUFFS_BASE__FOURCC__PS 0x50532020
899
900
// Quite OK Image.
901
#define WUFFS_BASE__FOURCC__QOI 0x514F4920
902
903
// Random Access Compression.
904
#define WUFFS_BASE__FOURCC__RAC 0x52414320
905
906
// Raw.
907
#define WUFFS_BASE__FOURCC__RAW 0x52415720
908
909
// Resource Interchange File Format.
910
#define WUFFS_BASE__FOURCC__RIFF 0x52494646
911
912
// Riegeli Records.
913
#define WUFFS_BASE__FOURCC__RIGL 0x5249474C
914
915
// Snappy.
916
#define WUFFS_BASE__FOURCC__SNPY 0x534E5059
917
918
// Standard Red Green Blue (Rendering Intent).
919
#define WUFFS_BASE__FOURCC__SRGB 0x53524742
920
921
// Scalable Vector Graphics.
922
#define WUFFS_BASE__FOURCC__SVG 0x53564720
923
924
// Tape Archive.
925
#define WUFFS_BASE__FOURCC__TAR 0x54415220
926
927
// Text.
928
#define WUFFS_BASE__FOURCC__TEXT 0x54455854
929
930
// Truevision Advanced Raster Graphics Adapter.
931
#define WUFFS_BASE__FOURCC__TGA 0x54474120
932
933
// Thumbhash.
934
#define WUFFS_BASE__FOURCC__TH 0x54482020
935
936
// Tagged Image File Format.
937
#define WUFFS_BASE__FOURCC__TIFF 0x54494646
938
939
// Tom's Obvious Minimal Language.
940
#define WUFFS_BASE__FOURCC__TOML 0x544F4D4C
941
942
// Waveform.
943
#define WUFFS_BASE__FOURCC__WAVE 0x57415645
944
945
// Wireless Bitmap.
946
#define WUFFS_BASE__FOURCC__WBMP 0x57424D50
947
948
// Web Picture.
949
#define WUFFS_BASE__FOURCC__WEBP 0x57454250
950
951
// Web Open Font Format.
952
#define WUFFS_BASE__FOURCC__WOFF 0x574F4646
953
954
// Extensible Markup Language.
955
#define WUFFS_BASE__FOURCC__XML 0x584D4C20
956
957
// Extensible Metadata Platform.
958
#define WUFFS_BASE__FOURCC__XMP 0x584D5020
959
960
// Xz.
961
#define WUFFS_BASE__FOURCC__XZ 0x585A2020
962
963
// Zip.
964
#define WUFFS_BASE__FOURCC__ZIP 0x5A495020
965
966
// Zlib.
967
#define WUFFS_BASE__FOURCC__ZLIB 0x5A4C4942
968
969
// Zstandard.
970
#define WUFFS_BASE__FOURCC__ZSTD 0x5A535444
971
972
// --------
973
974
// Quirks.
975
976
#define WUFFS_BASE__QUIRK_IGNORE_CHECKSUM 1
977
978
#define WUFFS_BASE__QUIRK_QUALITY 2
979
980
// --------
981
982
// Flicks are a unit of time. One flick (frame-tick) is 1 / 705_600_000 of a
983
// second. See https://github.com/OculusVR/Flicks
984
typedef int64_t wuffs_base__flicks;
985
986
#define WUFFS_BASE__FLICKS_PER_SECOND ((uint64_t)705600000)
987
#define WUFFS_BASE__FLICKS_PER_MILLISECOND ((uint64_t)705600)
988
989
// ---------------- Numeric Types
990
991
// The helpers below are functions, instead of macros, because their arguments
992
// can be an expression that we shouldn't evaluate more than once.
993
//
994
// They are static, so that linking multiple wuffs .o files won't complain about
995
// duplicate function definitions.
996
//
997
// They are explicitly marked inline, even if modern compilers don't use the
998
// inline attribute to guide optimizations such as inlining, to avoid the
999
// -Wunused-function warning, and we like to compile with -Wall -Werror.
1000
1001
static inline int8_t  //
1002
0
wuffs_base__i8__min(int8_t x, int8_t y) {
1003
0
  return x < y ? x : y;
1004
0
}
1005
1006
static inline int8_t  //
1007
0
wuffs_base__i8__max(int8_t x, int8_t y) {
1008
0
  return x > y ? x : y;
1009
0
}
1010
1011
static inline int16_t  //
1012
0
wuffs_base__i16__min(int16_t x, int16_t y) {
1013
0
  return x < y ? x : y;
1014
0
}
1015
1016
static inline int16_t  //
1017
0
wuffs_base__i16__max(int16_t x, int16_t y) {
1018
0
  return x > y ? x : y;
1019
0
}
1020
1021
static inline int32_t  //
1022
0
wuffs_base__i32__min(int32_t x, int32_t y) {
1023
0
  return x < y ? x : y;
1024
0
}
1025
1026
static inline int32_t  //
1027
0
wuffs_base__i32__max(int32_t x, int32_t y) {
1028
0
  return x > y ? x : y;
1029
0
}
1030
1031
static inline int64_t  //
1032
0
wuffs_base__i64__min(int64_t x, int64_t y) {
1033
0
  return x < y ? x : y;
1034
0
}
1035
1036
static inline int64_t  //
1037
0
wuffs_base__i64__max(int64_t x, int64_t y) {
1038
0
  return x > y ? x : y;
1039
0
}
1040
1041
static inline uint8_t  //
1042
0
wuffs_base__u8__min(uint8_t x, uint8_t y) {
1043
0
  return x < y ? x : y;
1044
0
}
1045
1046
static inline uint8_t  //
1047
0
wuffs_base__u8__max(uint8_t x, uint8_t y) {
1048
0
  return x > y ? x : y;
1049
0
}
1050
1051
static inline uint16_t  //
1052
0
wuffs_base__u16__min(uint16_t x, uint16_t y) {
1053
0
  return x < y ? x : y;
1054
0
}
1055
1056
static inline uint16_t  //
1057
0
wuffs_base__u16__max(uint16_t x, uint16_t y) {
1058
0
  return x > y ? x : y;
1059
0
}
1060
1061
static inline uint32_t  //
1062
13.0k
wuffs_base__u32__min(uint32_t x, uint32_t y) {
1063
13.0k
  return x < y ? x : y;
1064
13.0k
}
1065
1066
static inline uint32_t  //
1067
13.0k
wuffs_base__u32__max(uint32_t x, uint32_t y) {
1068
13.0k
  return x > y ? x : y;
1069
13.0k
}
1070
1071
static inline uint64_t  //
1072
396k
wuffs_base__u64__min(uint64_t x, uint64_t y) {
1073
396k
  return x < y ? x : y;
1074
396k
}
1075
1076
static inline uint64_t  //
1077
0
wuffs_base__u64__max(uint64_t x, uint64_t y) {
1078
0
  return x > y ? x : y;
1079
0
}
1080
1081
// --------
1082
1083
static inline uint8_t  //
1084
0
wuffs_base__u8__rotate_left(uint8_t x, uint32_t n) {
1085
0
  n &= 7;
1086
0
  return ((uint8_t)(x << n)) | ((uint8_t)(x >> (8 - n)));
1087
0
}
1088
1089
static inline uint8_t  //
1090
0
wuffs_base__u8__rotate_right(uint8_t x, uint32_t n) {
1091
0
  n &= 7;
1092
0
  return ((uint8_t)(x >> n)) | ((uint8_t)(x << (8 - n)));
1093
0
}
1094
1095
static inline uint16_t  //
1096
0
wuffs_base__u16__rotate_left(uint16_t x, uint32_t n) {
1097
0
  n &= 15;
1098
0
  return ((uint16_t)(x << n)) | ((uint16_t)(x >> (16 - n)));
1099
0
}
1100
1101
static inline uint16_t  //
1102
0
wuffs_base__u16__rotate_right(uint16_t x, uint32_t n) {
1103
0
  n &= 15;
1104
0
  return ((uint16_t)(x >> n)) | ((uint16_t)(x << (16 - n)));
1105
0
}
1106
1107
static inline uint32_t  //
1108
0
wuffs_base__u32__rotate_left(uint32_t x, uint32_t n) {
1109
0
  n &= 31;
1110
0
  return ((uint32_t)(x << n)) | ((uint32_t)(x >> (32 - n)));
1111
0
}
1112
1113
static inline uint32_t  //
1114
0
wuffs_base__u32__rotate_right(uint32_t x, uint32_t n) {
1115
0
  n &= 31;
1116
0
  return ((uint32_t)(x >> n)) | ((uint32_t)(x << (32 - n)));
1117
0
}
1118
1119
static inline uint64_t  //
1120
0
wuffs_base__u64__rotate_left(uint64_t x, uint32_t n) {
1121
0
  n &= 63;
1122
0
  return ((uint64_t)(x << n)) | ((uint64_t)(x >> (64 - n)));
1123
0
}
1124
1125
static inline uint64_t  //
1126
5.73k
wuffs_base__u64__rotate_right(uint64_t x, uint32_t n) {
1127
5.73k
  n &= 63;
1128
5.73k
  return ((uint64_t)(x >> n)) | ((uint64_t)(x << (64 - n)));
1129
5.73k
}
1130
1131
// --------
1132
1133
// Saturating arithmetic (sat_add, sat_sub) branchless bit-twiddling algorithms
1134
// are per https://locklessinc.com/articles/sat_arithmetic/
1135
//
1136
// It is important that the underlying types are unsigned integers, as signed
1137
// integer arithmetic overflow is undefined behavior in C.
1138
1139
static inline uint8_t  //
1140
0
wuffs_base__u8__sat_add(uint8_t x, uint8_t y) {
1141
0
  uint8_t res = (uint8_t)(x + y);
1142
0
  res |= (uint8_t)(-(res < x));
1143
0
  return res;
1144
0
}
1145
1146
static inline uint8_t  //
1147
0
wuffs_base__u8__sat_sub(uint8_t x, uint8_t y) {
1148
0
  uint8_t res = (uint8_t)(x - y);
1149
0
  res &= (uint8_t)(-(res <= x));
1150
0
  return res;
1151
0
}
1152
1153
static inline uint16_t  //
1154
0
wuffs_base__u16__sat_add(uint16_t x, uint16_t y) {
1155
0
  uint16_t res = (uint16_t)(x + y);
1156
0
  res |= (uint16_t)(-(res < x));
1157
0
  return res;
1158
0
}
1159
1160
static inline uint16_t  //
1161
0
wuffs_base__u16__sat_sub(uint16_t x, uint16_t y) {
1162
0
  uint16_t res = (uint16_t)(x - y);
1163
0
  res &= (uint16_t)(-(res <= x));
1164
0
  return res;
1165
0
}
1166
1167
static inline uint32_t  //
1168
9.39k
wuffs_base__u32__sat_add(uint32_t x, uint32_t y) {
1169
9.39k
  uint32_t res = (uint32_t)(x + y);
1170
9.39k
  res |= (uint32_t)(-(res < x));
1171
9.39k
  return res;
1172
9.39k
}
1173
1174
static inline uint32_t  //
1175
21.3k
wuffs_base__u32__sat_sub(uint32_t x, uint32_t y) {
1176
21.3k
  uint32_t res = (uint32_t)(x - y);
1177
21.3k
  res &= (uint32_t)(-(res <= x));
1178
21.3k
  return res;
1179
21.3k
}
1180
1181
static inline uint64_t  //
1182
44.4k
wuffs_base__u64__sat_add(uint64_t x, uint64_t y) {
1183
44.4k
  uint64_t res = (uint64_t)(x + y);
1184
44.4k
  res |= (uint64_t)(-(res < x));
1185
44.4k
  return res;
1186
44.4k
}
1187
1188
static inline uint64_t  //
1189
0
wuffs_base__u64__sat_sub(uint64_t x, uint64_t y) {
1190
0
  uint64_t res = (uint64_t)(x - y);
1191
0
  res &= (uint64_t)(-(res <= x));
1192
0
  return res;
1193
0
}
1194
1195
// --------
1196
1197
typedef struct wuffs_base__multiply_u64__output__struct {
1198
  uint64_t lo;
1199
  uint64_t hi;
1200
} wuffs_base__multiply_u64__output;
1201
1202
// wuffs_base__multiply_u64 returns x*y as a 128-bit value.
1203
//
1204
// The maximum inclusive output hi_lo is 0xFFFFFFFFFFFFFFFE_0000000000000001.
1205
static inline wuffs_base__multiply_u64__output  //
1206
0
wuffs_base__multiply_u64(uint64_t x, uint64_t y) {
1207
0
#if defined(__SIZEOF_INT128__)
1208
0
  __uint128_t z = ((__uint128_t)x) * ((__uint128_t)y);
1209
0
  wuffs_base__multiply_u64__output o;
1210
0
  o.lo = ((uint64_t)(z));
1211
0
  o.hi = ((uint64_t)(z >> 64));
1212
0
  return o;
1213
#else
1214
  // TODO: consider using the _mul128 intrinsic if defined(_MSC_VER).
1215
  uint64_t x0 = x & 0xFFFFFFFF;
1216
  uint64_t x1 = x >> 32;
1217
  uint64_t y0 = y & 0xFFFFFFFF;
1218
  uint64_t y1 = y >> 32;
1219
  uint64_t w0 = x0 * y0;
1220
  uint64_t t = (x1 * y0) + (w0 >> 32);
1221
  uint64_t w1 = t & 0xFFFFFFFF;
1222
  uint64_t w2 = t >> 32;
1223
  w1 += x0 * y1;
1224
  wuffs_base__multiply_u64__output o;
1225
  o.lo = x * y;
1226
  o.hi = (x1 * y1) + w2 + (w1 >> 32);
1227
  return o;
1228
#endif
1229
0
}
1230
1231
// --------
1232
1233
typedef struct wuffs_base__bitvec256__struct {
1234
  // elements_u64[0] holds the LSBs (least significant bits) and
1235
  // elements_u64[3] holds the MSBs (most significant bits).
1236
  uint64_t elements_u64[4];
1237
} wuffs_base__bitvec256;
1238
1239
static inline wuffs_base__bitvec256  //
1240
wuffs_base__make_bitvec256(uint64_t e00,
1241
                           uint64_t e01,
1242
                           uint64_t e02,
1243
0
                           uint64_t e03) {
1244
0
  wuffs_base__bitvec256 res;
1245
0
  res.elements_u64[0] = e00;
1246
0
  res.elements_u64[1] = e01;
1247
0
  res.elements_u64[2] = e02;
1248
0
  res.elements_u64[3] = e03;
1249
0
  return res;
1250
0
}
1251
1252
static inline uint64_t  //
1253
0
wuffs_base__bitvec256__get_u64(const wuffs_base__bitvec256* b, uint32_t i) {
1254
0
  return b->elements_u64[i & 3];
1255
0
}
1256
1257
// --------
1258
1259
// wuffs_base__optional_u63 is like a std::optional<uint64_t>, but for C (not
1260
// just C++) and the value can only hold 63 bits (not 64).
1261
//
1262
// Do not manipulate repr directly; it is a private implementation detail.
1263
typedef struct wuffs_base__optional_u63__struct {
1264
  uint64_t repr;
1265
1266
#ifdef __cplusplus
1267
  inline bool has_value() const;
1268
  inline uint64_t value() const;
1269
  inline uint64_t value_or(uint64_t default_value) const;
1270
#endif  // __cplusplus
1271
1272
} wuffs_base__optional_u63;
1273
1274
// wuffs_base__make_optional_u63 ignores value when has_value is false.
1275
//
1276
// Preconditions:
1277
//  - value < (1 << 63).
1278
static inline wuffs_base__optional_u63  //
1279
0
wuffs_base__make_optional_u63(bool has_value, uint64_t value) {
1280
0
  wuffs_base__optional_u63 res;
1281
0
  res.repr = has_value ? ((value << 1u) | 1u) : 0u;
1282
0
  return res;
1283
0
}
1284
1285
static inline bool  //
1286
0
wuffs_base__optional_u63__has_value(const wuffs_base__optional_u63* o) {
1287
0
  return o->repr;
1288
0
}
1289
1290
// wuffs_base__optional_u63__value returns zero when o does not have a value.
1291
static inline uint64_t  //
1292
0
wuffs_base__optional_u63__value(const wuffs_base__optional_u63* o) {
1293
0
  return o->repr >> 1u;
1294
0
}
1295
1296
static inline uint64_t  //
1297
wuffs_base__optional_u63__value_or(const wuffs_base__optional_u63* o,
1298
0
                                   uint64_t default_value) {
1299
0
  return o->repr ? (o->repr >> 1u) : default_value;
1300
0
}
1301
1302
#ifdef __cplusplus
1303
1304
inline bool  //
1305
wuffs_base__optional_u63::has_value() const {
1306
  return wuffs_base__optional_u63__has_value(this);
1307
}
1308
1309
inline uint64_t  //
1310
wuffs_base__optional_u63::value() const {
1311
  return wuffs_base__optional_u63__value(this);
1312
}
1313
1314
inline uint64_t  //
1315
wuffs_base__optional_u63::value_or(uint64_t default_value) const {
1316
  return wuffs_base__optional_u63__value_or(this, default_value);
1317
}
1318
1319
#endif  // __cplusplus
1320
1321
// --------
1322
1323
// The "defined(__clang__)" isn't redundant. While vanilla clang defines
1324
// __GNUC__, clang-cl (which mimics MSVC's cl.exe) does not.
1325
#if (defined(__GNUC__) || defined(__clang__)) && (__SIZEOF_LONG__ == 8)
1326
1327
static inline uint32_t  //
1328
0
wuffs_base__count_leading_zeroes_u64(uint64_t u) {
1329
0
  return u ? ((uint32_t)(__builtin_clzl(u))) : 64u;
1330
0
}
1331
1332
#else
1333
// TODO: consider using the _BitScanReverse intrinsic if defined(_MSC_VER).
1334
1335
static inline uint32_t  //
1336
wuffs_base__count_leading_zeroes_u64(uint64_t u) {
1337
  if (u == 0) {
1338
    return 64;
1339
  }
1340
1341
  uint32_t n = 0;
1342
  if ((u >> 32) == 0) {
1343
    n |= 32;
1344
    u <<= 32;
1345
  }
1346
  if ((u >> 48) == 0) {
1347
    n |= 16;
1348
    u <<= 16;
1349
  }
1350
  if ((u >> 56) == 0) {
1351
    n |= 8;
1352
    u <<= 8;
1353
  }
1354
  if ((u >> 60) == 0) {
1355
    n |= 4;
1356
    u <<= 4;
1357
  }
1358
  if ((u >> 62) == 0) {
1359
    n |= 2;
1360
    u <<= 2;
1361
  }
1362
  if ((u >> 63) == 0) {
1363
    n |= 1;
1364
    u <<= 1;
1365
  }
1366
  return n;
1367
}
1368
1369
#endif  // (defined(__GNUC__) || defined(__clang__)) && (__SIZEOF_LONG__ == 8)
1370
1371
// --------
1372
1373
// Normally, the wuffs_base__peek_etc and wuffs_base__poke_etc implementations
1374
// are both (1) correct regardless of CPU endianness and (2) very fast (e.g. an
1375
// inlined wuffs_base__peek_u32le__no_bounds_check call, in an optimized clang
1376
// or gcc build, is a single MOV instruction on x86_64).
1377
//
1378
// However, the endian-agnostic implementations are slow on Microsoft's C
1379
// compiler (MSC). Alternative memcpy-based implementations restore speed, but
1380
// they are only correct on little-endian CPU architectures. Defining
1381
// WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE opts in to these implementations.
1382
//
1383
// https://godbolt.org/z/q4MfjzTPh
1384
#if defined(_MSC_VER) && !defined(__clang__) && \
1385
    (defined(_M_ARM64) || defined(_M_X64))
1386
#define WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE
1387
#endif
1388
1389
#define wuffs_base__peek_u8be__no_bounds_check \
1390
0
  wuffs_base__peek_u8__no_bounds_check
1391
#define wuffs_base__peek_u8le__no_bounds_check \
1392
  wuffs_base__peek_u8__no_bounds_check
1393
1394
static inline uint8_t  //
1395
0
wuffs_base__peek_u8__no_bounds_check(const uint8_t* p) {
1396
0
  return p[0];
1397
0
}
1398
1399
static inline uint16_t  //
1400
11.5k
wuffs_base__peek_u16be__no_bounds_check(const uint8_t* p) {
1401
#if defined(WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE)
1402
  uint16_t x;
1403
  memcpy(&x, p, 2);
1404
  return _byteswap_ushort(x);
1405
#else
1406
11.5k
  return (uint16_t)(((uint16_t)(p[0]) << 8) | ((uint16_t)(p[1]) << 0));
1407
11.5k
#endif
1408
11.5k
}
1409
1410
static inline uint16_t  //
1411
0
wuffs_base__peek_u16le__no_bounds_check(const uint8_t* p) {
1412
#if defined(WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE)
1413
  uint16_t x;
1414
  memcpy(&x, p, 2);
1415
  return x;
1416
#else
1417
0
  return (uint16_t)(((uint16_t)(p[0]) << 0) | ((uint16_t)(p[1]) << 8));
1418
0
#endif
1419
0
}
1420
1421
static inline uint32_t  //
1422
5.85k
wuffs_base__peek_u24be__no_bounds_check(const uint8_t* p) {
1423
5.85k
  return ((uint32_t)(p[0]) << 16) | ((uint32_t)(p[1]) << 8) |
1424
5.85k
         ((uint32_t)(p[2]) << 0);
1425
5.85k
}
1426
1427
static inline uint32_t  //
1428
11.2k
wuffs_base__peek_u24le__no_bounds_check(const uint8_t* p) {
1429
11.2k
  return ((uint32_t)(p[0]) << 0) | ((uint32_t)(p[1]) << 8) |
1430
11.2k
         ((uint32_t)(p[2]) << 16);
1431
11.2k
}
1432
1433
static inline uint32_t  //
1434
83.7k
wuffs_base__peek_u32be__no_bounds_check(const uint8_t* p) {
1435
#if defined(WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE)
1436
  uint32_t x;
1437
  memcpy(&x, p, 4);
1438
  return _byteswap_ulong(x);
1439
#else
1440
83.7k
  return ((uint32_t)(p[0]) << 24) | ((uint32_t)(p[1]) << 16) |
1441
83.7k
         ((uint32_t)(p[2]) << 8) | ((uint32_t)(p[3]) << 0);
1442
83.7k
#endif
1443
83.7k
}
1444
1445
static inline uint32_t  //
1446
119M
wuffs_base__peek_u32le__no_bounds_check(const uint8_t* p) {
1447
#if defined(WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE)
1448
  uint32_t x;
1449
  memcpy(&x, p, 4);
1450
  return x;
1451
#else
1452
119M
  return ((uint32_t)(p[0]) << 0) | ((uint32_t)(p[1]) << 8) |
1453
119M
         ((uint32_t)(p[2]) << 16) | ((uint32_t)(p[3]) << 24);
1454
119M
#endif
1455
119M
}
1456
1457
static inline uint64_t  //
1458
0
wuffs_base__peek_u40be__no_bounds_check(const uint8_t* p) {
1459
0
  return ((uint64_t)(p[0]) << 32) | ((uint64_t)(p[1]) << 24) |
1460
0
         ((uint64_t)(p[2]) << 16) | ((uint64_t)(p[3]) << 8) |
1461
0
         ((uint64_t)(p[4]) << 0);
1462
0
}
1463
1464
static inline uint64_t  //
1465
0
wuffs_base__peek_u40le__no_bounds_check(const uint8_t* p) {
1466
0
  return ((uint64_t)(p[0]) << 0) | ((uint64_t)(p[1]) << 8) |
1467
0
         ((uint64_t)(p[2]) << 16) | ((uint64_t)(p[3]) << 24) |
1468
0
         ((uint64_t)(p[4]) << 32);
1469
0
}
1470
1471
static inline uint64_t  //
1472
83
wuffs_base__peek_u48be__no_bounds_check(const uint8_t* p) {
1473
83
  return ((uint64_t)(p[0]) << 40) | ((uint64_t)(p[1]) << 32) |
1474
83
         ((uint64_t)(p[2]) << 24) | ((uint64_t)(p[3]) << 16) |
1475
83
         ((uint64_t)(p[4]) << 8) | ((uint64_t)(p[5]) << 0);
1476
83
}
1477
1478
static inline uint64_t  //
1479
0
wuffs_base__peek_u48le__no_bounds_check(const uint8_t* p) {
1480
0
  return ((uint64_t)(p[0]) << 0) | ((uint64_t)(p[1]) << 8) |
1481
0
         ((uint64_t)(p[2]) << 16) | ((uint64_t)(p[3]) << 24) |
1482
0
         ((uint64_t)(p[4]) << 32) | ((uint64_t)(p[5]) << 40);
1483
0
}
1484
1485
static inline uint64_t  //
1486
0
wuffs_base__peek_u56be__no_bounds_check(const uint8_t* p) {
1487
0
  return ((uint64_t)(p[0]) << 48) | ((uint64_t)(p[1]) << 40) |
1488
0
         ((uint64_t)(p[2]) << 32) | ((uint64_t)(p[3]) << 24) |
1489
0
         ((uint64_t)(p[4]) << 16) | ((uint64_t)(p[5]) << 8) |
1490
0
         ((uint64_t)(p[6]) << 0);
1491
0
}
1492
1493
static inline uint64_t  //
1494
0
wuffs_base__peek_u56le__no_bounds_check(const uint8_t* p) {
1495
0
  return ((uint64_t)(p[0]) << 0) | ((uint64_t)(p[1]) << 8) |
1496
0
         ((uint64_t)(p[2]) << 16) | ((uint64_t)(p[3]) << 24) |
1497
0
         ((uint64_t)(p[4]) << 32) | ((uint64_t)(p[5]) << 40) |
1498
0
         ((uint64_t)(p[6]) << 48);
1499
0
}
1500
1501
static inline uint64_t  //
1502
0
wuffs_base__peek_u64be__no_bounds_check(const uint8_t* p) {
1503
0
#if defined(WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE)
1504
0
  uint64_t x;
1505
0
  memcpy(&x, p, 8);
1506
0
  return _byteswap_uint64(x);
1507
0
#else
1508
0
  return ((uint64_t)(p[0]) << 56) | ((uint64_t)(p[1]) << 48) |
1509
0
         ((uint64_t)(p[2]) << 40) | ((uint64_t)(p[3]) << 32) |
1510
0
         ((uint64_t)(p[4]) << 24) | ((uint64_t)(p[5]) << 16) |
1511
0
         ((uint64_t)(p[6]) << 8) | ((uint64_t)(p[7]) << 0);
1512
0
#endif
1513
0
}
1514
1515
static inline uint64_t  //
1516
43.5M
wuffs_base__peek_u64le__no_bounds_check(const uint8_t* p) {
1517
#if defined(WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE)
1518
  uint64_t x;
1519
  memcpy(&x, p, 8);
1520
  return x;
1521
#else
1522
43.5M
  return ((uint64_t)(p[0]) << 0) | ((uint64_t)(p[1]) << 8) |
1523
43.5M
         ((uint64_t)(p[2]) << 16) | ((uint64_t)(p[3]) << 24) |
1524
43.5M
         ((uint64_t)(p[4]) << 32) | ((uint64_t)(p[5]) << 40) |
1525
43.5M
         ((uint64_t)(p[6]) << 48) | ((uint64_t)(p[7]) << 56);
1526
43.5M
#endif
1527
43.5M
}
1528
1529
// --------
1530
1531
#define wuffs_base__poke_u8be__no_bounds_check \
1532
18.1M
  wuffs_base__poke_u8__no_bounds_check
1533
#define wuffs_base__poke_u8le__no_bounds_check \
1534
  wuffs_base__poke_u8__no_bounds_check
1535
1536
static inline void  //
1537
18.1M
wuffs_base__poke_u8__no_bounds_check(uint8_t* p, uint8_t x) {
1538
18.1M
  p[0] = x;
1539
18.1M
}
1540
1541
static inline void  //
1542
0
wuffs_base__poke_u16be__no_bounds_check(uint8_t* p, uint16_t x) {
1543
0
  p[0] = (uint8_t)(x >> 8);
1544
0
  p[1] = (uint8_t)(x >> 0);
1545
0
}
1546
1547
static inline void  //
1548
0
wuffs_base__poke_u16le__no_bounds_check(uint8_t* p, uint16_t x) {
1549
#if defined(WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE) || \
1550
    (defined(__GNUC__) && !defined(__clang__) && defined(__x86_64__))
1551
  // This seems to perform better on gcc 10 (but not clang 9). Clang also
1552
  // defines "__GNUC__".
1553
  memcpy(p, &x, 2);
1554
#else
1555
0
  p[0] = (uint8_t)(x >> 0);
1556
0
  p[1] = (uint8_t)(x >> 8);
1557
0
#endif
1558
0
}
1559
1560
static inline void  //
1561
0
wuffs_base__poke_u24be__no_bounds_check(uint8_t* p, uint32_t x) {
1562
0
  p[0] = (uint8_t)(x >> 16);
1563
0
  p[1] = (uint8_t)(x >> 8);
1564
0
  p[2] = (uint8_t)(x >> 0);
1565
0
}
1566
1567
static inline void  //
1568
1.40M
wuffs_base__poke_u24le__no_bounds_check(uint8_t* p, uint32_t x) {
1569
1.40M
  p[0] = (uint8_t)(x >> 0);
1570
1.40M
  p[1] = (uint8_t)(x >> 8);
1571
1.40M
  p[2] = (uint8_t)(x >> 16);
1572
1.40M
}
1573
1574
static inline void  //
1575
0
wuffs_base__poke_u32be__no_bounds_check(uint8_t* p, uint32_t x) {
1576
0
  p[0] = (uint8_t)(x >> 24);
1577
0
  p[1] = (uint8_t)(x >> 16);
1578
0
  p[2] = (uint8_t)(x >> 8);
1579
0
  p[3] = (uint8_t)(x >> 0);
1580
0
}
1581
1582
static inline void  //
1583
141M
wuffs_base__poke_u32le__no_bounds_check(uint8_t* p, uint32_t x) {
1584
#if defined(WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE) || \
1585
    (defined(__GNUC__) && !defined(__clang__) && defined(__x86_64__))
1586
  // This seems to perform better on gcc 10 (but not clang 9). Clang also
1587
  // defines "__GNUC__".
1588
  memcpy(p, &x, 4);
1589
#else
1590
141M
  p[0] = (uint8_t)(x >> 0);
1591
141M
  p[1] = (uint8_t)(x >> 8);
1592
141M
  p[2] = (uint8_t)(x >> 16);
1593
141M
  p[3] = (uint8_t)(x >> 24);
1594
141M
#endif
1595
141M
}
1596
1597
static inline void  //
1598
0
wuffs_base__poke_u40be__no_bounds_check(uint8_t* p, uint64_t x) {
1599
0
  p[0] = (uint8_t)(x >> 32);
1600
0
  p[1] = (uint8_t)(x >> 24);
1601
0
  p[2] = (uint8_t)(x >> 16);
1602
0
  p[3] = (uint8_t)(x >> 8);
1603
0
  p[4] = (uint8_t)(x >> 0);
1604
0
}
1605
1606
static inline void  //
1607
0
wuffs_base__poke_u40le__no_bounds_check(uint8_t* p, uint64_t x) {
1608
0
  p[0] = (uint8_t)(x >> 0);
1609
0
  p[1] = (uint8_t)(x >> 8);
1610
0
  p[2] = (uint8_t)(x >> 16);
1611
0
  p[3] = (uint8_t)(x >> 24);
1612
0
  p[4] = (uint8_t)(x >> 32);
1613
0
}
1614
1615
static inline void  //
1616
0
wuffs_base__poke_u48be__no_bounds_check(uint8_t* p, uint64_t x) {
1617
0
  p[0] = (uint8_t)(x >> 40);
1618
0
  p[1] = (uint8_t)(x >> 32);
1619
0
  p[2] = (uint8_t)(x >> 24);
1620
0
  p[3] = (uint8_t)(x >> 16);
1621
0
  p[4] = (uint8_t)(x >> 8);
1622
0
  p[5] = (uint8_t)(x >> 0);
1623
0
}
1624
1625
static inline void  //
1626
0
wuffs_base__poke_u48le__no_bounds_check(uint8_t* p, uint64_t x) {
1627
0
  p[0] = (uint8_t)(x >> 0);
1628
0
  p[1] = (uint8_t)(x >> 8);
1629
0
  p[2] = (uint8_t)(x >> 16);
1630
0
  p[3] = (uint8_t)(x >> 24);
1631
0
  p[4] = (uint8_t)(x >> 32);
1632
0
  p[5] = (uint8_t)(x >> 40);
1633
0
}
1634
1635
static inline void  //
1636
0
wuffs_base__poke_u56be__no_bounds_check(uint8_t* p, uint64_t x) {
1637
0
  p[0] = (uint8_t)(x >> 48);
1638
0
  p[1] = (uint8_t)(x >> 40);
1639
0
  p[2] = (uint8_t)(x >> 32);
1640
0
  p[3] = (uint8_t)(x >> 24);
1641
0
  p[4] = (uint8_t)(x >> 16);
1642
0
  p[5] = (uint8_t)(x >> 8);
1643
0
  p[6] = (uint8_t)(x >> 0);
1644
0
}
1645
1646
static inline void  //
1647
0
wuffs_base__poke_u56le__no_bounds_check(uint8_t* p, uint64_t x) {
1648
0
  p[0] = (uint8_t)(x >> 0);
1649
0
  p[1] = (uint8_t)(x >> 8);
1650
0
  p[2] = (uint8_t)(x >> 16);
1651
0
  p[3] = (uint8_t)(x >> 24);
1652
0
  p[4] = (uint8_t)(x >> 32);
1653
0
  p[5] = (uint8_t)(x >> 40);
1654
0
  p[6] = (uint8_t)(x >> 48);
1655
0
}
1656
1657
static inline void  //
1658
0
wuffs_base__poke_u64be__no_bounds_check(uint8_t* p, uint64_t x) {
1659
0
  p[0] = (uint8_t)(x >> 56);
1660
0
  p[1] = (uint8_t)(x >> 48);
1661
0
  p[2] = (uint8_t)(x >> 40);
1662
0
  p[3] = (uint8_t)(x >> 32);
1663
0
  p[4] = (uint8_t)(x >> 24);
1664
0
  p[5] = (uint8_t)(x >> 16);
1665
0
  p[6] = (uint8_t)(x >> 8);
1666
0
  p[7] = (uint8_t)(x >> 0);
1667
0
}
1668
1669
static inline void  //
1670
89.6M
wuffs_base__poke_u64le__no_bounds_check(uint8_t* p, uint64_t x) {
1671
#if defined(WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE) || \
1672
    (defined(__GNUC__) && !defined(__clang__) && defined(__x86_64__))
1673
  // This seems to perform better on gcc 10 (but not clang 9). Clang also
1674
  // defines "__GNUC__".
1675
  memcpy(p, &x, 8);
1676
#else
1677
89.6M
  p[0] = (uint8_t)(x >> 0);
1678
89.6M
  p[1] = (uint8_t)(x >> 8);
1679
89.6M
  p[2] = (uint8_t)(x >> 16);
1680
89.6M
  p[3] = (uint8_t)(x >> 24);
1681
89.6M
  p[4] = (uint8_t)(x >> 32);
1682
89.6M
  p[5] = (uint8_t)(x >> 40);
1683
89.6M
  p[6] = (uint8_t)(x >> 48);
1684
89.6M
  p[7] = (uint8_t)(x >> 56);
1685
89.6M
#endif
1686
89.6M
}
1687
1688
// ---------------- Slices and Tables
1689
1690
// WUFFS_BASE__SLICE is a 1-dimensional buffer.
1691
//
1692
// len measures a number of elements, not necessarily a size in bytes.
1693
//
1694
// A value with all fields NULL or zero is a valid, empty slice.
1695
#define WUFFS_BASE__SLICE(T) \
1696
  struct {                   \
1697
    T* ptr;                  \
1698
    size_t len;              \
1699
  }
1700
1701
// WUFFS_BASE__TABLE is a 2-dimensional buffer.
1702
//
1703
// width, height and stride measure a number of elements, not necessarily a
1704
// size in bytes.
1705
//
1706
// A value with all fields NULL or zero is a valid, empty table.
1707
#define WUFFS_BASE__TABLE(T) \
1708
  struct {                   \
1709
    T* ptr;                  \
1710
    size_t width;            \
1711
    size_t height;           \
1712
    size_t stride;           \
1713
  }
1714
1715
typedef WUFFS_BASE__SLICE(uint8_t) wuffs_base__slice_u8;
1716
typedef WUFFS_BASE__SLICE(uint16_t) wuffs_base__slice_u16;
1717
typedef WUFFS_BASE__SLICE(uint32_t) wuffs_base__slice_u32;
1718
typedef WUFFS_BASE__SLICE(uint64_t) wuffs_base__slice_u64;
1719
1720
typedef WUFFS_BASE__TABLE(uint8_t) wuffs_base__table_u8;
1721
typedef WUFFS_BASE__TABLE(uint16_t) wuffs_base__table_u16;
1722
typedef WUFFS_BASE__TABLE(uint32_t) wuffs_base__table_u32;
1723
typedef WUFFS_BASE__TABLE(uint64_t) wuffs_base__table_u64;
1724
1725
static inline wuffs_base__slice_u8  //
1726
494M
wuffs_base__make_slice_u8(uint8_t* ptr, size_t len) {
1727
494M
  wuffs_base__slice_u8 ret;
1728
494M
  ret.ptr = ptr;
1729
494M
  ret.len = len;
1730
494M
  return ret;
1731
494M
}
1732
1733
static inline wuffs_base__slice_u16  //
1734
0
wuffs_base__make_slice_u16(uint16_t* ptr, size_t len) {
1735
0
  wuffs_base__slice_u16 ret;
1736
0
  ret.ptr = ptr;
1737
0
  ret.len = len;
1738
0
  return ret;
1739
0
}
1740
1741
static inline wuffs_base__slice_u32  //
1742
0
wuffs_base__make_slice_u32(uint32_t* ptr, size_t len) {
1743
0
  wuffs_base__slice_u32 ret;
1744
0
  ret.ptr = ptr;
1745
0
  ret.len = len;
1746
0
  return ret;
1747
0
}
1748
1749
static inline wuffs_base__slice_u64  //
1750
0
wuffs_base__make_slice_u64(uint64_t* ptr, size_t len) {
1751
0
  wuffs_base__slice_u64 ret;
1752
0
  ret.ptr = ptr;
1753
0
  ret.len = len;
1754
0
  return ret;
1755
0
}
1756
1757
static inline wuffs_base__slice_u8  //
1758
238k
wuffs_base__make_slice_u8_ij(uint8_t* ptr, size_t i, size_t j) {
1759
238k
  wuffs_base__slice_u8 ret;
1760
238k
  ret.ptr = ptr ? (ptr + i) : NULL;
1761
238k
  ret.len = (j >= i) ? (j - i) : 0;
1762
238k
  return ret;
1763
238k
}
1764
1765
static inline wuffs_base__slice_u16  //
1766
0
wuffs_base__make_slice_u16_ij(uint16_t* ptr, size_t i, size_t j) {
1767
0
  wuffs_base__slice_u16 ret;
1768
0
  ret.ptr = ptr ? (ptr + i) : NULL;
1769
0
  ret.len = (j >= i) ? (j - i) : 0;
1770
0
  return ret;
1771
0
}
1772
1773
static inline wuffs_base__slice_u32  //
1774
0
wuffs_base__make_slice_u32_ij(uint32_t* ptr, size_t i, size_t j) {
1775
0
  wuffs_base__slice_u32 ret;
1776
0
  ret.ptr = ptr ? (ptr + i) : NULL;
1777
0
  ret.len = (j >= i) ? (j - i) : 0;
1778
0
  return ret;
1779
0
}
1780
1781
static inline wuffs_base__slice_u64  //
1782
0
wuffs_base__make_slice_u64_ij(uint64_t* ptr, size_t i, size_t j) {
1783
0
  wuffs_base__slice_u64 ret;
1784
0
  ret.ptr = ptr ? (ptr + i) : NULL;
1785
0
  ret.len = (j >= i) ? (j - i) : 0;
1786
0
  return ret;
1787
0
}
1788
1789
static inline wuffs_base__slice_u8  //
1790
32.7k
wuffs_base__empty_slice_u8(void) {
1791
32.7k
  wuffs_base__slice_u8 ret;
1792
32.7k
  ret.ptr = NULL;
1793
32.7k
  ret.len = 0;
1794
32.7k
  return ret;
1795
32.7k
}
1796
1797
static inline wuffs_base__slice_u16  //
1798
0
wuffs_base__empty_slice_u16(void) {
1799
0
  wuffs_base__slice_u16 ret;
1800
0
  ret.ptr = NULL;
1801
0
  ret.len = 0;
1802
0
  return ret;
1803
0
}
1804
1805
static inline wuffs_base__slice_u32  //
1806
0
wuffs_base__empty_slice_u32(void) {
1807
0
  wuffs_base__slice_u32 ret;
1808
0
  ret.ptr = NULL;
1809
0
  ret.len = 0;
1810
0
  return ret;
1811
0
}
1812
1813
static inline wuffs_base__slice_u64  //
1814
0
wuffs_base__empty_slice_u64(void) {
1815
0
  wuffs_base__slice_u64 ret;
1816
0
  ret.ptr = NULL;
1817
0
  ret.len = 0;
1818
0
  return ret;
1819
0
}
1820
1821
static inline wuffs_base__table_u8  //
1822
wuffs_base__make_table_u8(uint8_t* ptr,
1823
                          size_t width,
1824
                          size_t height,
1825
4.65k
                          size_t stride) {
1826
4.65k
  wuffs_base__table_u8 ret;
1827
4.65k
  ret.ptr = ptr;
1828
4.65k
  ret.width = width;
1829
4.65k
  ret.height = height;
1830
4.65k
  ret.stride = stride;
1831
4.65k
  return ret;
1832
4.65k
}
1833
1834
static inline wuffs_base__table_u16  //
1835
wuffs_base__make_table_u16(uint16_t* ptr,
1836
                           size_t width,
1837
                           size_t height,
1838
0
                           size_t stride) {
1839
0
  wuffs_base__table_u16 ret;
1840
0
  ret.ptr = ptr;
1841
0
  ret.width = width;
1842
0
  ret.height = height;
1843
0
  ret.stride = stride;
1844
0
  return ret;
1845
0
}
1846
1847
static inline wuffs_base__table_u32  //
1848
wuffs_base__make_table_u32(uint32_t* ptr,
1849
                           size_t width,
1850
                           size_t height,
1851
0
                           size_t stride) {
1852
0
  wuffs_base__table_u32 ret;
1853
0
  ret.ptr = ptr;
1854
0
  ret.width = width;
1855
0
  ret.height = height;
1856
0
  ret.stride = stride;
1857
0
  return ret;
1858
0
}
1859
1860
static inline wuffs_base__table_u64  //
1861
wuffs_base__make_table_u64(uint64_t* ptr,
1862
                           size_t width,
1863
                           size_t height,
1864
0
                           size_t stride) {
1865
0
  wuffs_base__table_u64 ret;
1866
0
  ret.ptr = ptr;
1867
0
  ret.width = width;
1868
0
  ret.height = height;
1869
0
  ret.stride = stride;
1870
0
  return ret;
1871
0
}
1872
1873
static inline wuffs_base__table_u8  //
1874
0
wuffs_base__empty_table_u8(void) {
1875
0
  wuffs_base__table_u8 ret;
1876
0
  ret.ptr = NULL;
1877
0
  ret.width = 0;
1878
0
  ret.height = 0;
1879
0
  ret.stride = 0;
1880
0
  return ret;
1881
0
}
1882
1883
static inline wuffs_base__table_u16  //
1884
0
wuffs_base__empty_table_u16(void) {
1885
0
  wuffs_base__table_u16 ret;
1886
0
  ret.ptr = NULL;
1887
0
  ret.width = 0;
1888
0
  ret.height = 0;
1889
0
  ret.stride = 0;
1890
0
  return ret;
1891
0
}
1892
1893
static inline wuffs_base__table_u32  //
1894
0
wuffs_base__empty_table_u32(void) {
1895
0
  wuffs_base__table_u32 ret;
1896
0
  ret.ptr = NULL;
1897
0
  ret.width = 0;
1898
0
  ret.height = 0;
1899
0
  ret.stride = 0;
1900
0
  return ret;
1901
0
}
1902
1903
static inline wuffs_base__table_u64  //
1904
0
wuffs_base__empty_table_u64(void) {
1905
0
  wuffs_base__table_u64 ret;
1906
0
  ret.ptr = NULL;
1907
0
  ret.width = 0;
1908
0
  ret.height = 0;
1909
0
  ret.stride = 0;
1910
0
  return ret;
1911
0
}
1912
1913
static inline bool  //
1914
0
wuffs_base__slice_u8__overlaps(wuffs_base__slice_u8 s, wuffs_base__slice_u8 t) {
1915
0
  return ((s.ptr <= t.ptr) && (t.ptr < (s.ptr + s.len))) ||
1916
0
         ((t.ptr <= s.ptr) && (s.ptr < (t.ptr + t.len)));
1917
0
}
1918
1919
// wuffs_base__slice_u8__subslice_i returns s[i:].
1920
//
1921
// It returns an empty slice if i is out of bounds.
1922
static inline wuffs_base__slice_u8  //
1923
320M
wuffs_base__slice_u8__subslice_i(wuffs_base__slice_u8 s, uint64_t i) {
1924
320M
  if ((i <= SIZE_MAX) && (i <= s.len)) {
1925
320M
    return wuffs_base__make_slice_u8(s.ptr + i, ((size_t)(s.len - i)));
1926
320M
  }
1927
0
  return wuffs_base__empty_slice_u8();
1928
320M
}
1929
1930
// wuffs_base__slice_u8__subslice_j returns s[:j].
1931
//
1932
// It returns an empty slice if j is out of bounds.
1933
static inline wuffs_base__slice_u8  //
1934
93.9M
wuffs_base__slice_u8__subslice_j(wuffs_base__slice_u8 s, uint64_t j) {
1935
93.9M
  if ((j <= SIZE_MAX) && (j <= s.len)) {
1936
93.9M
    return wuffs_base__make_slice_u8(s.ptr, ((size_t)j));
1937
93.9M
  }
1938
0
  return wuffs_base__empty_slice_u8();
1939
93.9M
}
1940
1941
// wuffs_base__slice_u8__subslice_ij returns s[i:j].
1942
//
1943
// It returns an empty slice if i or j is out of bounds.
1944
static inline wuffs_base__slice_u8  //
1945
wuffs_base__slice_u8__subslice_ij(wuffs_base__slice_u8 s,
1946
                                  uint64_t i,
1947
21.3k
                                  uint64_t j) {
1948
21.3k
  if ((i <= j) && (j <= SIZE_MAX) && (j <= s.len)) {
1949
21.3k
    return wuffs_base__make_slice_u8(s.ptr + i, ((size_t)(j - i)));
1950
21.3k
  }
1951
0
  return wuffs_base__empty_slice_u8();
1952
21.3k
}
1953
1954
// wuffs_base__table_u8__subtable_ij returns t[ix:jx, iy:jy].
1955
//
1956
// It returns an empty table if i or j is out of bounds.
1957
static inline wuffs_base__table_u8  //
1958
wuffs_base__table_u8__subtable_ij(wuffs_base__table_u8 t,
1959
                                  uint64_t ix,
1960
                                  uint64_t iy,
1961
                                  uint64_t jx,
1962
4.65k
                                  uint64_t jy) {
1963
4.65k
  if ((ix <= jx) && (jx <= SIZE_MAX) && (jx <= t.width) &&  //
1964
4.65k
      (iy <= jy) && (jy <= SIZE_MAX) && (jy <= t.height)) {
1965
4.65k
    return wuffs_base__make_table_u8(t.ptr + ix + (iy * t.stride),  //
1966
4.65k
                                     ((size_t)(jx - ix)),           //
1967
4.65k
                                     ((size_t)(jy - iy)),           //
1968
4.65k
                                     t.stride);                     //
1969
4.65k
  }
1970
0
  return wuffs_base__make_table_u8(NULL, 0, 0, 0);
1971
4.65k
}
1972
1973
// wuffs_base__table__flattened_length returns the number of elements covered
1974
// by the 1-dimensional span that backs a 2-dimensional table. This counts the
1975
// elements inside the table and, when width != stride, the elements outside
1976
// the table but between its rows.
1977
//
1978
// For example, consider a width 10, height 4, stride 10 table. Mark its first
1979
// and last (inclusive) elements with 'a' and 'z'. This function returns 40.
1980
//
1981
//    a123456789
1982
//    0123456789
1983
//    0123456789
1984
//    012345678z
1985
//
1986
// Now consider the sub-table of that from (2, 1) inclusive to (8, 4) exclusive.
1987
//
1988
//    a123456789
1989
//    01iiiiiioo
1990
//    ooiiiiiioo
1991
//    ooiiiiii8z
1992
//
1993
// This function (called with width 6, height 3, stride 10) returns 26: 18 'i'
1994
// inside elements plus 8 'o' outside elements. Note that 26 is less than a
1995
// naive (height * stride = 30) computation. Indeed, advancing 29 elements from
1996
// the first 'i' would venture past 'z', out of bounds of the original table.
1997
//
1998
// It does not check for overflow, but if the arguments come from a table that
1999
// exists in memory and each element occupies a positive number of bytes then
2000
// the result should be bounded by the amount of allocatable memory (which
2001
// shouldn't overflow SIZE_MAX).
2002
static inline size_t  //
2003
wuffs_base__table__flattened_length(size_t width,
2004
                                    size_t height,
2005
0
                                    size_t stride) {
2006
0
  if (height == 0) {
2007
0
    return 0;
2008
0
  }
2009
0
  return ((height - 1) * stride) + width;
2010
0
}
2011
2012
// ---------------- Magic Numbers
2013
2014
// wuffs_base__magic_number_guess_fourcc guesses the file format of some data,
2015
// given its starting bytes (the prefix_data argument) and whether or not there
2016
// may be further bytes (the prefix_closed argument; true means that
2017
// prefix_data is the entire data).
2018
//
2019
// It returns a positive FourCC value on success.
2020
//
2021
// It returns zero if nothing matches its hard-coded list of 'magic numbers'.
2022
//
2023
// It returns a negative value if prefix_closed is false and a longer prefix is
2024
// required for a conclusive result. For example, a single 'B' byte (without
2025
// further data) is not enough to discriminate the BMP and BPG image file
2026
// formats. Similarly, a single '\xFF' byte might be the start of JPEG data or
2027
// it might be the start of some other binary data.
2028
//
2029
// It does not do a full validity check. Like any guess made from a short
2030
// prefix of the data, it may return false positives. Data that starts with 99
2031
// bytes of valid JPEG followed by corruption or truncation is an invalid JPEG
2032
// image overall, but this function will still return WUFFS_BASE__FOURCC__JPEG.
2033
//
2034
// Another source of false positives is that some 'magic numbers' are valid
2035
// ASCII data. A file starting with "GIF87a and GIF89a are the two versions of
2036
// GIF" will match GIF's 'magic number' even if it's plain text, not an image.
2037
//
2038
// For modular builds that divide the base module into sub-modules, using this
2039
// function requires the WUFFS_CONFIG__MODULE__BASE__MAGIC sub-module, not just
2040
// WUFFS_CONFIG__MODULE__BASE__CORE.
2041
WUFFS_BASE__MAYBE_STATIC int32_t  //
2042
wuffs_base__magic_number_guess_fourcc(wuffs_base__slice_u8 prefix_data,
2043
                                      bool prefix_closed);
2044
2045
// ---------------- Quirk Values
2046
2047
// These constants are the value half of a key-value pair, where the key is
2048
// WUFFS_BASE__QUIRK_QUALITY.
2049
//
2050
// In the Wuffs API, set_quirk takes a u64 value. These macro definitions are
2051
// likewise unsigned values (uint64_t) but for this particular key, they are
2052
// best interpreted as signed values (int64_t). "Lower-than-default quality"
2053
// and "higher-than-default quality", as signed values, are -1 and +1.
2054
//
2055
// See doc/note/quirks.md for some more discussion about trade-offs.
2056
#define WUFFS_BASE__QUIRK_QUALITY__VALUE__LOWER_QUALITY UINT64_MAX
2057
#define WUFFS_BASE__QUIRK_QUALITY__VALUE__HIGHER_QUALITY ((uint64_t)1)
2058
2059
// ---------------- Ranges and Rects
2060
2061
// See https://github.com/google/wuffs/blob/main/doc/note/ranges-and-rects.md
2062
2063
typedef struct wuffs_base__range_ii_u32__struct {
2064
  uint32_t min_incl;
2065
  uint32_t max_incl;
2066
2067
#ifdef __cplusplus
2068
  inline bool is_empty() const;
2069
  inline bool equals(wuffs_base__range_ii_u32__struct s) const;
2070
  inline wuffs_base__range_ii_u32__struct intersect(
2071
      wuffs_base__range_ii_u32__struct s) const;
2072
  inline wuffs_base__range_ii_u32__struct unite(
2073
      wuffs_base__range_ii_u32__struct s) const;
2074
  inline bool contains(uint32_t x) const;
2075
  inline bool contains_range(wuffs_base__range_ii_u32__struct s) const;
2076
#endif  // __cplusplus
2077
2078
} wuffs_base__range_ii_u32;
2079
2080
static inline wuffs_base__range_ii_u32  //
2081
0
wuffs_base__empty_range_ii_u32(void) {
2082
0
  wuffs_base__range_ii_u32 ret;
2083
0
  ret.min_incl = 0;
2084
0
  ret.max_incl = 0;
2085
0
  return ret;
2086
0
}
2087
2088
static inline wuffs_base__range_ii_u32  //
2089
0
wuffs_base__make_range_ii_u32(uint32_t min_incl, uint32_t max_incl) {
2090
0
  wuffs_base__range_ii_u32 ret;
2091
0
  ret.min_incl = min_incl;
2092
0
  ret.max_incl = max_incl;
2093
0
  return ret;
2094
0
}
2095
2096
static inline bool  //
2097
0
wuffs_base__range_ii_u32__is_empty(const wuffs_base__range_ii_u32* r) {
2098
0
  return r->min_incl > r->max_incl;
2099
0
}
2100
2101
static inline bool  //
2102
wuffs_base__range_ii_u32__equals(const wuffs_base__range_ii_u32* r,
2103
0
                                 wuffs_base__range_ii_u32 s) {
2104
0
  return (r->min_incl == s.min_incl && r->max_incl == s.max_incl) ||
2105
0
         (wuffs_base__range_ii_u32__is_empty(r) &&
2106
0
          wuffs_base__range_ii_u32__is_empty(&s));
2107
0
}
2108
2109
static inline wuffs_base__range_ii_u32  //
2110
wuffs_base__range_ii_u32__intersect(const wuffs_base__range_ii_u32* r,
2111
0
                                    wuffs_base__range_ii_u32 s) {
2112
0
  wuffs_base__range_ii_u32 t;
2113
0
  t.min_incl = wuffs_base__u32__max(r->min_incl, s.min_incl);
2114
0
  t.max_incl = wuffs_base__u32__min(r->max_incl, s.max_incl);
2115
0
  return t;
2116
0
}
2117
2118
static inline wuffs_base__range_ii_u32  //
2119
wuffs_base__range_ii_u32__unite(const wuffs_base__range_ii_u32* r,
2120
0
                                wuffs_base__range_ii_u32 s) {
2121
0
  if (wuffs_base__range_ii_u32__is_empty(r)) {
2122
0
    return s;
2123
0
  }
2124
0
  if (wuffs_base__range_ii_u32__is_empty(&s)) {
2125
0
    return *r;
2126
0
  }
2127
0
  wuffs_base__range_ii_u32 t;
2128
0
  t.min_incl = wuffs_base__u32__min(r->min_incl, s.min_incl);
2129
0
  t.max_incl = wuffs_base__u32__max(r->max_incl, s.max_incl);
2130
0
  return t;
2131
0
}
2132
2133
static inline bool  //
2134
wuffs_base__range_ii_u32__contains(const wuffs_base__range_ii_u32* r,
2135
0
                                   uint32_t x) {
2136
0
  return (r->min_incl <= x) && (x <= r->max_incl);
2137
0
}
2138
2139
static inline bool  //
2140
wuffs_base__range_ii_u32__contains_range(const wuffs_base__range_ii_u32* r,
2141
0
                                         wuffs_base__range_ii_u32 s) {
2142
0
  return wuffs_base__range_ii_u32__equals(
2143
0
      &s, wuffs_base__range_ii_u32__intersect(r, s));
2144
0
}
2145
2146
#ifdef __cplusplus
2147
2148
inline bool  //
2149
wuffs_base__range_ii_u32::is_empty() const {
2150
  return wuffs_base__range_ii_u32__is_empty(this);
2151
}
2152
2153
inline bool  //
2154
wuffs_base__range_ii_u32::equals(wuffs_base__range_ii_u32 s) const {
2155
  return wuffs_base__range_ii_u32__equals(this, s);
2156
}
2157
2158
inline wuffs_base__range_ii_u32  //
2159
wuffs_base__range_ii_u32::intersect(wuffs_base__range_ii_u32 s) const {
2160
  return wuffs_base__range_ii_u32__intersect(this, s);
2161
}
2162
2163
inline wuffs_base__range_ii_u32  //
2164
wuffs_base__range_ii_u32::unite(wuffs_base__range_ii_u32 s) const {
2165
  return wuffs_base__range_ii_u32__unite(this, s);
2166
}
2167
2168
inline bool  //
2169
wuffs_base__range_ii_u32::contains(uint32_t x) const {
2170
  return wuffs_base__range_ii_u32__contains(this, x);
2171
}
2172
2173
inline bool  //
2174
wuffs_base__range_ii_u32::contains_range(wuffs_base__range_ii_u32 s) const {
2175
  return wuffs_base__range_ii_u32__contains_range(this, s);
2176
}
2177
2178
#endif  // __cplusplus
2179
2180
// --------
2181
2182
typedef struct wuffs_base__range_ie_u32__struct {
2183
  uint32_t min_incl;
2184
  uint32_t max_excl;
2185
2186
#ifdef __cplusplus
2187
  inline bool is_empty() const;
2188
  inline bool equals(wuffs_base__range_ie_u32__struct s) const;
2189
  inline wuffs_base__range_ie_u32__struct intersect(
2190
      wuffs_base__range_ie_u32__struct s) const;
2191
  inline wuffs_base__range_ie_u32__struct unite(
2192
      wuffs_base__range_ie_u32__struct s) const;
2193
  inline bool contains(uint32_t x) const;
2194
  inline bool contains_range(wuffs_base__range_ie_u32__struct s) const;
2195
  inline uint32_t length() const;
2196
#endif  // __cplusplus
2197
2198
} wuffs_base__range_ie_u32;
2199
2200
static inline wuffs_base__range_ie_u32  //
2201
0
wuffs_base__empty_range_ie_u32(void) {
2202
0
  wuffs_base__range_ie_u32 ret;
2203
0
  ret.min_incl = 0;
2204
0
  ret.max_excl = 0;
2205
0
  return ret;
2206
0
}
2207
2208
static inline wuffs_base__range_ie_u32  //
2209
0
wuffs_base__make_range_ie_u32(uint32_t min_incl, uint32_t max_excl) {
2210
0
  wuffs_base__range_ie_u32 ret;
2211
0
  ret.min_incl = min_incl;
2212
0
  ret.max_excl = max_excl;
2213
0
  return ret;
2214
0
}
2215
2216
static inline bool  //
2217
0
wuffs_base__range_ie_u32__is_empty(const wuffs_base__range_ie_u32* r) {
2218
0
  return r->min_incl >= r->max_excl;
2219
0
}
2220
2221
static inline bool  //
2222
wuffs_base__range_ie_u32__equals(const wuffs_base__range_ie_u32* r,
2223
0
                                 wuffs_base__range_ie_u32 s) {
2224
0
  return (r->min_incl == s.min_incl && r->max_excl == s.max_excl) ||
2225
0
         (wuffs_base__range_ie_u32__is_empty(r) &&
2226
0
          wuffs_base__range_ie_u32__is_empty(&s));
2227
0
}
2228
2229
static inline wuffs_base__range_ie_u32  //
2230
wuffs_base__range_ie_u32__intersect(const wuffs_base__range_ie_u32* r,
2231
0
                                    wuffs_base__range_ie_u32 s) {
2232
0
  wuffs_base__range_ie_u32 t;
2233
0
  t.min_incl = wuffs_base__u32__max(r->min_incl, s.min_incl);
2234
0
  t.max_excl = wuffs_base__u32__min(r->max_excl, s.max_excl);
2235
0
  return t;
2236
0
}
2237
2238
static inline wuffs_base__range_ie_u32  //
2239
wuffs_base__range_ie_u32__unite(const wuffs_base__range_ie_u32* r,
2240
0
                                wuffs_base__range_ie_u32 s) {
2241
0
  if (wuffs_base__range_ie_u32__is_empty(r)) {
2242
0
    return s;
2243
0
  }
2244
0
  if (wuffs_base__range_ie_u32__is_empty(&s)) {
2245
0
    return *r;
2246
0
  }
2247
0
  wuffs_base__range_ie_u32 t;
2248
0
  t.min_incl = wuffs_base__u32__min(r->min_incl, s.min_incl);
2249
0
  t.max_excl = wuffs_base__u32__max(r->max_excl, s.max_excl);
2250
0
  return t;
2251
0
}
2252
2253
static inline bool  //
2254
wuffs_base__range_ie_u32__contains(const wuffs_base__range_ie_u32* r,
2255
0
                                   uint32_t x) {
2256
0
  return (r->min_incl <= x) && (x < r->max_excl);
2257
0
}
2258
2259
static inline bool  //
2260
wuffs_base__range_ie_u32__contains_range(const wuffs_base__range_ie_u32* r,
2261
0
                                         wuffs_base__range_ie_u32 s) {
2262
0
  return wuffs_base__range_ie_u32__equals(
2263
0
      &s, wuffs_base__range_ie_u32__intersect(r, s));
2264
0
}
2265
2266
static inline uint32_t  //
2267
0
wuffs_base__range_ie_u32__length(const wuffs_base__range_ie_u32* r) {
2268
0
  return wuffs_base__u32__sat_sub(r->max_excl, r->min_incl);
2269
0
}
2270
2271
#ifdef __cplusplus
2272
2273
inline bool  //
2274
wuffs_base__range_ie_u32::is_empty() const {
2275
  return wuffs_base__range_ie_u32__is_empty(this);
2276
}
2277
2278
inline bool  //
2279
wuffs_base__range_ie_u32::equals(wuffs_base__range_ie_u32 s) const {
2280
  return wuffs_base__range_ie_u32__equals(this, s);
2281
}
2282
2283
inline wuffs_base__range_ie_u32  //
2284
wuffs_base__range_ie_u32::intersect(wuffs_base__range_ie_u32 s) const {
2285
  return wuffs_base__range_ie_u32__intersect(this, s);
2286
}
2287
2288
inline wuffs_base__range_ie_u32  //
2289
wuffs_base__range_ie_u32::unite(wuffs_base__range_ie_u32 s) const {
2290
  return wuffs_base__range_ie_u32__unite(this, s);
2291
}
2292
2293
inline bool  //
2294
wuffs_base__range_ie_u32::contains(uint32_t x) const {
2295
  return wuffs_base__range_ie_u32__contains(this, x);
2296
}
2297
2298
inline bool  //
2299
wuffs_base__range_ie_u32::contains_range(wuffs_base__range_ie_u32 s) const {
2300
  return wuffs_base__range_ie_u32__contains_range(this, s);
2301
}
2302
2303
inline uint32_t  //
2304
wuffs_base__range_ie_u32::length() const {
2305
  return wuffs_base__range_ie_u32__length(this);
2306
}
2307
2308
#endif  // __cplusplus
2309
2310
// --------
2311
2312
typedef struct wuffs_base__range_ii_u64__struct {
2313
  uint64_t min_incl;
2314
  uint64_t max_incl;
2315
2316
#ifdef __cplusplus
2317
  inline bool is_empty() const;
2318
  inline bool equals(wuffs_base__range_ii_u64__struct s) const;
2319
  inline wuffs_base__range_ii_u64__struct intersect(
2320
      wuffs_base__range_ii_u64__struct s) const;
2321
  inline wuffs_base__range_ii_u64__struct unite(
2322
      wuffs_base__range_ii_u64__struct s) const;
2323
  inline bool contains(uint64_t x) const;
2324
  inline bool contains_range(wuffs_base__range_ii_u64__struct s) const;
2325
#endif  // __cplusplus
2326
2327
} wuffs_base__range_ii_u64;
2328
2329
static inline wuffs_base__range_ii_u64  //
2330
0
wuffs_base__empty_range_ii_u64(void) {
2331
0
  wuffs_base__range_ii_u64 ret;
2332
0
  ret.min_incl = 0;
2333
0
  ret.max_incl = 0;
2334
0
  return ret;
2335
0
}
2336
2337
static inline wuffs_base__range_ii_u64  //
2338
4.03k
wuffs_base__make_range_ii_u64(uint64_t min_incl, uint64_t max_incl) {
2339
4.03k
  wuffs_base__range_ii_u64 ret;
2340
4.03k
  ret.min_incl = min_incl;
2341
4.03k
  ret.max_incl = max_incl;
2342
4.03k
  return ret;
2343
4.03k
}
2344
2345
static inline bool  //
2346
0
wuffs_base__range_ii_u64__is_empty(const wuffs_base__range_ii_u64* r) {
2347
0
  return r->min_incl > r->max_incl;
2348
0
}
2349
2350
static inline bool  //
2351
wuffs_base__range_ii_u64__equals(const wuffs_base__range_ii_u64* r,
2352
0
                                 wuffs_base__range_ii_u64 s) {
2353
0
  return (r->min_incl == s.min_incl && r->max_incl == s.max_incl) ||
2354
0
         (wuffs_base__range_ii_u64__is_empty(r) &&
2355
0
          wuffs_base__range_ii_u64__is_empty(&s));
2356
0
}
2357
2358
static inline wuffs_base__range_ii_u64  //
2359
wuffs_base__range_ii_u64__intersect(const wuffs_base__range_ii_u64* r,
2360
0
                                    wuffs_base__range_ii_u64 s) {
2361
0
  wuffs_base__range_ii_u64 t;
2362
0
  t.min_incl = wuffs_base__u64__max(r->min_incl, s.min_incl);
2363
0
  t.max_incl = wuffs_base__u64__min(r->max_incl, s.max_incl);
2364
0
  return t;
2365
0
}
2366
2367
static inline wuffs_base__range_ii_u64  //
2368
wuffs_base__range_ii_u64__unite(const wuffs_base__range_ii_u64* r,
2369
0
                                wuffs_base__range_ii_u64 s) {
2370
0
  if (wuffs_base__range_ii_u64__is_empty(r)) {
2371
0
    return s;
2372
0
  }
2373
0
  if (wuffs_base__range_ii_u64__is_empty(&s)) {
2374
0
    return *r;
2375
0
  }
2376
0
  wuffs_base__range_ii_u64 t;
2377
0
  t.min_incl = wuffs_base__u64__min(r->min_incl, s.min_incl);
2378
0
  t.max_incl = wuffs_base__u64__max(r->max_incl, s.max_incl);
2379
0
  return t;
2380
0
}
2381
2382
static inline bool  //
2383
wuffs_base__range_ii_u64__contains(const wuffs_base__range_ii_u64* r,
2384
0
                                   uint64_t x) {
2385
0
  return (r->min_incl <= x) && (x <= r->max_incl);
2386
0
}
2387
2388
static inline bool  //
2389
wuffs_base__range_ii_u64__contains_range(const wuffs_base__range_ii_u64* r,
2390
0
                                         wuffs_base__range_ii_u64 s) {
2391
0
  return wuffs_base__range_ii_u64__equals(
2392
0
      &s, wuffs_base__range_ii_u64__intersect(r, s));
2393
0
}
2394
2395
#ifdef __cplusplus
2396
2397
inline bool  //
2398
wuffs_base__range_ii_u64::is_empty() const {
2399
  return wuffs_base__range_ii_u64__is_empty(this);
2400
}
2401
2402
inline bool  //
2403
wuffs_base__range_ii_u64::equals(wuffs_base__range_ii_u64 s) const {
2404
  return wuffs_base__range_ii_u64__equals(this, s);
2405
}
2406
2407
inline wuffs_base__range_ii_u64  //
2408
wuffs_base__range_ii_u64::intersect(wuffs_base__range_ii_u64 s) const {
2409
  return wuffs_base__range_ii_u64__intersect(this, s);
2410
}
2411
2412
inline wuffs_base__range_ii_u64  //
2413
wuffs_base__range_ii_u64::unite(wuffs_base__range_ii_u64 s) const {
2414
  return wuffs_base__range_ii_u64__unite(this, s);
2415
}
2416
2417
inline bool  //
2418
wuffs_base__range_ii_u64::contains(uint64_t x) const {
2419
  return wuffs_base__range_ii_u64__contains(this, x);
2420
}
2421
2422
inline bool  //
2423
wuffs_base__range_ii_u64::contains_range(wuffs_base__range_ii_u64 s) const {
2424
  return wuffs_base__range_ii_u64__contains_range(this, s);
2425
}
2426
2427
#endif  // __cplusplus
2428
2429
// --------
2430
2431
typedef struct wuffs_base__range_ie_u64__struct {
2432
  uint64_t min_incl;
2433
  uint64_t max_excl;
2434
2435
#ifdef __cplusplus
2436
  inline bool is_empty() const;
2437
  inline bool equals(wuffs_base__range_ie_u64__struct s) const;
2438
  inline wuffs_base__range_ie_u64__struct intersect(
2439
      wuffs_base__range_ie_u64__struct s) const;
2440
  inline wuffs_base__range_ie_u64__struct unite(
2441
      wuffs_base__range_ie_u64__struct s) const;
2442
  inline bool contains(uint64_t x) const;
2443
  inline bool contains_range(wuffs_base__range_ie_u64__struct s) const;
2444
  inline uint64_t length() const;
2445
#endif  // __cplusplus
2446
2447
} wuffs_base__range_ie_u64;
2448
2449
static inline wuffs_base__range_ie_u64  //
2450
0
wuffs_base__empty_range_ie_u64(void) {
2451
0
  wuffs_base__range_ie_u64 ret;
2452
0
  ret.min_incl = 0;
2453
0
  ret.max_excl = 0;
2454
0
  return ret;
2455
0
}
2456
2457
static inline wuffs_base__range_ie_u64  //
2458
0
wuffs_base__make_range_ie_u64(uint64_t min_incl, uint64_t max_excl) {
2459
0
  wuffs_base__range_ie_u64 ret;
2460
0
  ret.min_incl = min_incl;
2461
0
  ret.max_excl = max_excl;
2462
0
  return ret;
2463
0
}
2464
2465
static inline bool  //
2466
0
wuffs_base__range_ie_u64__is_empty(const wuffs_base__range_ie_u64* r) {
2467
0
  return r->min_incl >= r->max_excl;
2468
0
}
2469
2470
static inline bool  //
2471
wuffs_base__range_ie_u64__equals(const wuffs_base__range_ie_u64* r,
2472
0
                                 wuffs_base__range_ie_u64 s) {
2473
0
  return (r->min_incl == s.min_incl && r->max_excl == s.max_excl) ||
2474
0
         (wuffs_base__range_ie_u64__is_empty(r) &&
2475
0
          wuffs_base__range_ie_u64__is_empty(&s));
2476
0
}
2477
2478
static inline wuffs_base__range_ie_u64  //
2479
wuffs_base__range_ie_u64__intersect(const wuffs_base__range_ie_u64* r,
2480
0
                                    wuffs_base__range_ie_u64 s) {
2481
0
  wuffs_base__range_ie_u64 t;
2482
0
  t.min_incl = wuffs_base__u64__max(r->min_incl, s.min_incl);
2483
0
  t.max_excl = wuffs_base__u64__min(r->max_excl, s.max_excl);
2484
0
  return t;
2485
0
}
2486
2487
static inline wuffs_base__range_ie_u64  //
2488
wuffs_base__range_ie_u64__unite(const wuffs_base__range_ie_u64* r,
2489
0
                                wuffs_base__range_ie_u64 s) {
2490
0
  if (wuffs_base__range_ie_u64__is_empty(r)) {
2491
0
    return s;
2492
0
  }
2493
0
  if (wuffs_base__range_ie_u64__is_empty(&s)) {
2494
0
    return *r;
2495
0
  }
2496
0
  wuffs_base__range_ie_u64 t;
2497
0
  t.min_incl = wuffs_base__u64__min(r->min_incl, s.min_incl);
2498
0
  t.max_excl = wuffs_base__u64__max(r->max_excl, s.max_excl);
2499
0
  return t;
2500
0
}
2501
2502
static inline bool  //
2503
wuffs_base__range_ie_u64__contains(const wuffs_base__range_ie_u64* r,
2504
0
                                   uint64_t x) {
2505
0
  return (r->min_incl <= x) && (x < r->max_excl);
2506
0
}
2507
2508
static inline bool  //
2509
wuffs_base__range_ie_u64__contains_range(const wuffs_base__range_ie_u64* r,
2510
0
                                         wuffs_base__range_ie_u64 s) {
2511
0
  return wuffs_base__range_ie_u64__equals(
2512
0
      &s, wuffs_base__range_ie_u64__intersect(r, s));
2513
0
}
2514
2515
static inline uint64_t  //
2516
0
wuffs_base__range_ie_u64__length(const wuffs_base__range_ie_u64* r) {
2517
0
  return wuffs_base__u64__sat_sub(r->max_excl, r->min_incl);
2518
0
}
2519
2520
#ifdef __cplusplus
2521
2522
inline bool  //
2523
wuffs_base__range_ie_u64::is_empty() const {
2524
  return wuffs_base__range_ie_u64__is_empty(this);
2525
}
2526
2527
inline bool  //
2528
wuffs_base__range_ie_u64::equals(wuffs_base__range_ie_u64 s) const {
2529
  return wuffs_base__range_ie_u64__equals(this, s);
2530
}
2531
2532
inline wuffs_base__range_ie_u64  //
2533
wuffs_base__range_ie_u64::intersect(wuffs_base__range_ie_u64 s) const {
2534
  return wuffs_base__range_ie_u64__intersect(this, s);
2535
}
2536
2537
inline wuffs_base__range_ie_u64  //
2538
wuffs_base__range_ie_u64::unite(wuffs_base__range_ie_u64 s) const {
2539
  return wuffs_base__range_ie_u64__unite(this, s);
2540
}
2541
2542
inline bool  //
2543
wuffs_base__range_ie_u64::contains(uint64_t x) const {
2544
  return wuffs_base__range_ie_u64__contains(this, x);
2545
}
2546
2547
inline bool  //
2548
wuffs_base__range_ie_u64::contains_range(wuffs_base__range_ie_u64 s) const {
2549
  return wuffs_base__range_ie_u64__contains_range(this, s);
2550
}
2551
2552
inline uint64_t  //
2553
wuffs_base__range_ie_u64::length() const {
2554
  return wuffs_base__range_ie_u64__length(this);
2555
}
2556
2557
#endif  // __cplusplus
2558
2559
// --------
2560
2561
typedef struct wuffs_base__rect_ii_u32__struct {
2562
  uint32_t min_incl_x;
2563
  uint32_t min_incl_y;
2564
  uint32_t max_incl_x;
2565
  uint32_t max_incl_y;
2566
2567
#ifdef __cplusplus
2568
  inline bool is_empty() const;
2569
  inline bool equals(wuffs_base__rect_ii_u32__struct s) const;
2570
  inline wuffs_base__rect_ii_u32__struct intersect(
2571
      wuffs_base__rect_ii_u32__struct s) const;
2572
  inline wuffs_base__rect_ii_u32__struct unite(
2573
      wuffs_base__rect_ii_u32__struct s) const;
2574
  inline bool contains(uint32_t x, uint32_t y) const;
2575
  inline bool contains_rect(wuffs_base__rect_ii_u32__struct s) const;
2576
#endif  // __cplusplus
2577
2578
} wuffs_base__rect_ii_u32;
2579
2580
static inline wuffs_base__rect_ii_u32  //
2581
0
wuffs_base__empty_rect_ii_u32(void) {
2582
0
  wuffs_base__rect_ii_u32 ret;
2583
0
  ret.min_incl_x = 0;
2584
0
  ret.min_incl_y = 0;
2585
0
  ret.max_incl_x = 0;
2586
0
  ret.max_incl_y = 0;
2587
0
  return ret;
2588
0
}
2589
2590
static inline wuffs_base__rect_ii_u32  //
2591
wuffs_base__make_rect_ii_u32(uint32_t min_incl_x,
2592
                             uint32_t min_incl_y,
2593
                             uint32_t max_incl_x,
2594
0
                             uint32_t max_incl_y) {
2595
0
  wuffs_base__rect_ii_u32 ret;
2596
0
  ret.min_incl_x = min_incl_x;
2597
0
  ret.min_incl_y = min_incl_y;
2598
0
  ret.max_incl_x = max_incl_x;
2599
0
  ret.max_incl_y = max_incl_y;
2600
0
  return ret;
2601
0
}
2602
2603
static inline bool  //
2604
0
wuffs_base__rect_ii_u32__is_empty(const wuffs_base__rect_ii_u32* r) {
2605
0
  return (r->min_incl_x > r->max_incl_x) || (r->min_incl_y > r->max_incl_y);
2606
0
}
2607
2608
static inline bool  //
2609
wuffs_base__rect_ii_u32__equals(const wuffs_base__rect_ii_u32* r,
2610
0
                                wuffs_base__rect_ii_u32 s) {
2611
0
  return (r->min_incl_x == s.min_incl_x && r->min_incl_y == s.min_incl_y &&
2612
0
          r->max_incl_x == s.max_incl_x && r->max_incl_y == s.max_incl_y) ||
2613
0
         (wuffs_base__rect_ii_u32__is_empty(r) &&
2614
0
          wuffs_base__rect_ii_u32__is_empty(&s));
2615
0
}
2616
2617
static inline wuffs_base__rect_ii_u32  //
2618
wuffs_base__rect_ii_u32__intersect(const wuffs_base__rect_ii_u32* r,
2619
0
                                   wuffs_base__rect_ii_u32 s) {
2620
0
  wuffs_base__rect_ii_u32 t;
2621
0
  t.min_incl_x = wuffs_base__u32__max(r->min_incl_x, s.min_incl_x);
2622
0
  t.min_incl_y = wuffs_base__u32__max(r->min_incl_y, s.min_incl_y);
2623
0
  t.max_incl_x = wuffs_base__u32__min(r->max_incl_x, s.max_incl_x);
2624
0
  t.max_incl_y = wuffs_base__u32__min(r->max_incl_y, s.max_incl_y);
2625
0
  return t;
2626
0
}
2627
2628
static inline wuffs_base__rect_ii_u32  //
2629
wuffs_base__rect_ii_u32__unite(const wuffs_base__rect_ii_u32* r,
2630
0
                               wuffs_base__rect_ii_u32 s) {
2631
0
  if (wuffs_base__rect_ii_u32__is_empty(r)) {
2632
0
    return s;
2633
0
  }
2634
0
  if (wuffs_base__rect_ii_u32__is_empty(&s)) {
2635
0
    return *r;
2636
0
  }
2637
0
  wuffs_base__rect_ii_u32 t;
2638
0
  t.min_incl_x = wuffs_base__u32__min(r->min_incl_x, s.min_incl_x);
2639
0
  t.min_incl_y = wuffs_base__u32__min(r->min_incl_y, s.min_incl_y);
2640
0
  t.max_incl_x = wuffs_base__u32__max(r->max_incl_x, s.max_incl_x);
2641
0
  t.max_incl_y = wuffs_base__u32__max(r->max_incl_y, s.max_incl_y);
2642
0
  return t;
2643
0
}
2644
2645
static inline bool  //
2646
wuffs_base__rect_ii_u32__contains(const wuffs_base__rect_ii_u32* r,
2647
                                  uint32_t x,
2648
0
                                  uint32_t y) {
2649
0
  return (r->min_incl_x <= x) && (x <= r->max_incl_x) && (r->min_incl_y <= y) &&
2650
0
         (y <= r->max_incl_y);
2651
0
}
2652
2653
static inline bool  //
2654
wuffs_base__rect_ii_u32__contains_rect(const wuffs_base__rect_ii_u32* r,
2655
0
                                       wuffs_base__rect_ii_u32 s) {
2656
0
  return wuffs_base__rect_ii_u32__equals(
2657
0
      &s, wuffs_base__rect_ii_u32__intersect(r, s));
2658
0
}
2659
2660
#ifdef __cplusplus
2661
2662
inline bool  //
2663
wuffs_base__rect_ii_u32::is_empty() const {
2664
  return wuffs_base__rect_ii_u32__is_empty(this);
2665
}
2666
2667
inline bool  //
2668
wuffs_base__rect_ii_u32::equals(wuffs_base__rect_ii_u32 s) const {
2669
  return wuffs_base__rect_ii_u32__equals(this, s);
2670
}
2671
2672
inline wuffs_base__rect_ii_u32  //
2673
wuffs_base__rect_ii_u32::intersect(wuffs_base__rect_ii_u32 s) const {
2674
  return wuffs_base__rect_ii_u32__intersect(this, s);
2675
}
2676
2677
inline wuffs_base__rect_ii_u32  //
2678
wuffs_base__rect_ii_u32::unite(wuffs_base__rect_ii_u32 s) const {
2679
  return wuffs_base__rect_ii_u32__unite(this, s);
2680
}
2681
2682
inline bool  //
2683
wuffs_base__rect_ii_u32::contains(uint32_t x, uint32_t y) const {
2684
  return wuffs_base__rect_ii_u32__contains(this, x, y);
2685
}
2686
2687
inline bool  //
2688
wuffs_base__rect_ii_u32::contains_rect(wuffs_base__rect_ii_u32 s) const {
2689
  return wuffs_base__rect_ii_u32__contains_rect(this, s);
2690
}
2691
2692
#endif  // __cplusplus
2693
2694
// --------
2695
2696
typedef struct wuffs_base__rect_ie_u32__struct {
2697
  uint32_t min_incl_x;
2698
  uint32_t min_incl_y;
2699
  uint32_t max_excl_x;
2700
  uint32_t max_excl_y;
2701
2702
#ifdef __cplusplus
2703
  inline bool is_empty() const;
2704
  inline bool equals(wuffs_base__rect_ie_u32__struct s) const;
2705
  inline wuffs_base__rect_ie_u32__struct intersect(
2706
      wuffs_base__rect_ie_u32__struct s) const;
2707
  inline wuffs_base__rect_ie_u32__struct unite(
2708
      wuffs_base__rect_ie_u32__struct s) const;
2709
  inline bool contains(uint32_t x, uint32_t y) const;
2710
  inline bool contains_rect(wuffs_base__rect_ie_u32__struct s) const;
2711
  inline uint32_t width() const;
2712
  inline uint32_t height() const;
2713
#endif  // __cplusplus
2714
2715
} wuffs_base__rect_ie_u32;
2716
2717
static inline wuffs_base__rect_ie_u32  //
2718
0
wuffs_base__empty_rect_ie_u32(void) {
2719
0
  wuffs_base__rect_ie_u32 ret;
2720
0
  ret.min_incl_x = 0;
2721
0
  ret.min_incl_y = 0;
2722
0
  ret.max_excl_x = 0;
2723
0
  ret.max_excl_y = 0;
2724
0
  return ret;
2725
0
}
2726
2727
static inline wuffs_base__rect_ie_u32  //
2728
wuffs_base__make_rect_ie_u32(uint32_t min_incl_x,
2729
                             uint32_t min_incl_y,
2730
                             uint32_t max_excl_x,
2731
13.0k
                             uint32_t max_excl_y) {
2732
13.0k
  wuffs_base__rect_ie_u32 ret;
2733
13.0k
  ret.min_incl_x = min_incl_x;
2734
13.0k
  ret.min_incl_y = min_incl_y;
2735
13.0k
  ret.max_excl_x = max_excl_x;
2736
13.0k
  ret.max_excl_y = max_excl_y;
2737
13.0k
  return ret;
2738
13.0k
}
2739
2740
static inline bool  //
2741
0
wuffs_base__rect_ie_u32__is_empty(const wuffs_base__rect_ie_u32* r) {
2742
0
  return (r->min_incl_x >= r->max_excl_x) || (r->min_incl_y >= r->max_excl_y);
2743
0
}
2744
2745
static inline bool  //
2746
wuffs_base__rect_ie_u32__equals(const wuffs_base__rect_ie_u32* r,
2747
9.39k
                                wuffs_base__rect_ie_u32 s) {
2748
9.39k
  return (r->min_incl_x == s.min_incl_x && r->min_incl_y == s.min_incl_y &&
2749
9.39k
          r->max_excl_x == s.max_excl_x && r->max_excl_y == s.max_excl_y) ||
2750
9.39k
         (wuffs_base__rect_ie_u32__is_empty(r) &&
2751
0
          wuffs_base__rect_ie_u32__is_empty(&s));
2752
9.39k
}
2753
2754
static inline wuffs_base__rect_ie_u32  //
2755
wuffs_base__rect_ie_u32__intersect(const wuffs_base__rect_ie_u32* r,
2756
6.52k
                                   wuffs_base__rect_ie_u32 s) {
2757
6.52k
  wuffs_base__rect_ie_u32 t;
2758
6.52k
  t.min_incl_x = wuffs_base__u32__max(r->min_incl_x, s.min_incl_x);
2759
6.52k
  t.min_incl_y = wuffs_base__u32__max(r->min_incl_y, s.min_incl_y);
2760
6.52k
  t.max_excl_x = wuffs_base__u32__min(r->max_excl_x, s.max_excl_x);
2761
6.52k
  t.max_excl_y = wuffs_base__u32__min(r->max_excl_y, s.max_excl_y);
2762
6.52k
  return t;
2763
6.52k
}
2764
2765
static inline wuffs_base__rect_ie_u32  //
2766
wuffs_base__rect_ie_u32__unite(const wuffs_base__rect_ie_u32* r,
2767
0
                               wuffs_base__rect_ie_u32 s) {
2768
0
  if (wuffs_base__rect_ie_u32__is_empty(r)) {
2769
0
    return s;
2770
0
  }
2771
0
  if (wuffs_base__rect_ie_u32__is_empty(&s)) {
2772
0
    return *r;
2773
0
  }
2774
0
  wuffs_base__rect_ie_u32 t;
2775
0
  t.min_incl_x = wuffs_base__u32__min(r->min_incl_x, s.min_incl_x);
2776
0
  t.min_incl_y = wuffs_base__u32__min(r->min_incl_y, s.min_incl_y);
2777
0
  t.max_excl_x = wuffs_base__u32__max(r->max_excl_x, s.max_excl_x);
2778
0
  t.max_excl_y = wuffs_base__u32__max(r->max_excl_y, s.max_excl_y);
2779
0
  return t;
2780
0
}
2781
2782
static inline bool  //
2783
wuffs_base__rect_ie_u32__contains(const wuffs_base__rect_ie_u32* r,
2784
                                  uint32_t x,
2785
0
                                  uint32_t y) {
2786
0
  return (r->min_incl_x <= x) && (x < r->max_excl_x) && (r->min_incl_y <= y) &&
2787
0
         (y < r->max_excl_y);
2788
0
}
2789
2790
static inline bool  //
2791
wuffs_base__rect_ie_u32__contains_rect(const wuffs_base__rect_ie_u32* r,
2792
6.52k
                                       wuffs_base__rect_ie_u32 s) {
2793
6.52k
  return wuffs_base__rect_ie_u32__equals(
2794
6.52k
      &s, wuffs_base__rect_ie_u32__intersect(r, s));
2795
6.52k
}
2796
2797
static inline uint32_t  //
2798
0
wuffs_base__rect_ie_u32__width(const wuffs_base__rect_ie_u32* r) {
2799
0
  return wuffs_base__u32__sat_sub(r->max_excl_x, r->min_incl_x);
2800
0
}
2801
2802
static inline uint32_t  //
2803
0
wuffs_base__rect_ie_u32__height(const wuffs_base__rect_ie_u32* r) {
2804
0
  return wuffs_base__u32__sat_sub(r->max_excl_y, r->min_incl_y);
2805
0
}
2806
2807
#ifdef __cplusplus
2808
2809
inline bool  //
2810
wuffs_base__rect_ie_u32::is_empty() const {
2811
  return wuffs_base__rect_ie_u32__is_empty(this);
2812
}
2813
2814
inline bool  //
2815
wuffs_base__rect_ie_u32::equals(wuffs_base__rect_ie_u32 s) const {
2816
  return wuffs_base__rect_ie_u32__equals(this, s);
2817
}
2818
2819
inline wuffs_base__rect_ie_u32  //
2820
wuffs_base__rect_ie_u32::intersect(wuffs_base__rect_ie_u32 s) const {
2821
  return wuffs_base__rect_ie_u32__intersect(this, s);
2822
}
2823
2824
inline wuffs_base__rect_ie_u32  //
2825
wuffs_base__rect_ie_u32::unite(wuffs_base__rect_ie_u32 s) const {
2826
  return wuffs_base__rect_ie_u32__unite(this, s);
2827
}
2828
2829
inline bool  //
2830
wuffs_base__rect_ie_u32::contains(uint32_t x, uint32_t y) const {
2831
  return wuffs_base__rect_ie_u32__contains(this, x, y);
2832
}
2833
2834
inline bool  //
2835
wuffs_base__rect_ie_u32::contains_rect(wuffs_base__rect_ie_u32 s) const {
2836
  return wuffs_base__rect_ie_u32__contains_rect(this, s);
2837
}
2838
2839
inline uint32_t  //
2840
wuffs_base__rect_ie_u32::width() const {
2841
  return wuffs_base__rect_ie_u32__width(this);
2842
}
2843
2844
inline uint32_t  //
2845
wuffs_base__rect_ie_u32::height() const {
2846
  return wuffs_base__rect_ie_u32__height(this);
2847
}
2848
2849
#endif  // __cplusplus
2850
2851
// ---------------- More Information
2852
2853
// wuffs_base__more_information holds additional fields, typically when a Wuffs
2854
// method returns a [note status](/doc/note/statuses.md).
2855
//
2856
// The flavor field follows the base38 namespace
2857
// convention](/doc/note/base38-and-fourcc.md). The other fields' semantics
2858
// depends on the flavor.
2859
typedef struct wuffs_base__more_information__struct {
2860
  uint32_t flavor;
2861
  uint32_t w;
2862
  uint64_t x;
2863
  uint64_t y;
2864
  uint64_t z;
2865
2866
#ifdef __cplusplus
2867
  inline void set(uint32_t flavor_arg,
2868
                  uint32_t w_arg,
2869
                  uint64_t x_arg,
2870
                  uint64_t y_arg,
2871
                  uint64_t z_arg);
2872
  inline uint32_t io_redirect__fourcc() const;
2873
  inline wuffs_base__range_ie_u64 io_redirect__range() const;
2874
  inline uint64_t io_seek__position() const;
2875
  inline uint32_t metadata__fourcc() const;
2876
  inline wuffs_base__range_ie_u64 metadata_raw_passthrough__range() const;
2877
  inline int32_t metadata_parsed__chrm(uint32_t component) const;
2878
  inline uint32_t metadata_parsed__gama() const;
2879
  inline uint32_t metadata_parsed__srgb() const;
2880
#endif  // __cplusplus
2881
2882
} wuffs_base__more_information;
2883
2884
#define WUFFS_BASE__MORE_INFORMATION__FLAVOR__IO_REDIRECT 1
2885
#define WUFFS_BASE__MORE_INFORMATION__FLAVOR__IO_SEEK 2
2886
#define WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA_RAW_PASSTHROUGH 3
2887
#define WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA_RAW_TRANSFORM 4
2888
#define WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA_PARSED 5
2889
2890
static inline wuffs_base__more_information  //
2891
0
wuffs_base__empty_more_information(void) {
2892
0
  wuffs_base__more_information ret;
2893
0
  ret.flavor = 0;
2894
0
  ret.w = 0;
2895
0
  ret.x = 0;
2896
0
  ret.y = 0;
2897
0
  ret.z = 0;
2898
0
  return ret;
2899
0
}
2900
2901
static inline void  //
2902
wuffs_base__more_information__set(wuffs_base__more_information* m,
2903
                                  uint32_t flavor,
2904
                                  uint32_t w,
2905
                                  uint64_t x,
2906
                                  uint64_t y,
2907
0
                                  uint64_t z) {
2908
0
  if (!m) {
2909
0
    return;
2910
0
  }
2911
0
  m->flavor = flavor;
2912
0
  m->w = w;
2913
0
  m->x = x;
2914
0
  m->y = y;
2915
0
  m->z = z;
2916
0
}
2917
2918
static inline uint32_t  //
2919
wuffs_base__more_information__io_redirect__fourcc(
2920
0
    const wuffs_base__more_information* m) {
2921
0
  return m->w;
2922
0
}
2923
2924
static inline wuffs_base__range_ie_u64  //
2925
wuffs_base__more_information__io_redirect__range(
2926
0
    const wuffs_base__more_information* m) {
2927
0
  wuffs_base__range_ie_u64 ret;
2928
0
  ret.min_incl = m->y;
2929
0
  ret.max_excl = m->z;
2930
0
  return ret;
2931
0
}
2932
2933
static inline uint64_t  //
2934
wuffs_base__more_information__io_seek__position(
2935
0
    const wuffs_base__more_information* m) {
2936
0
  return m->x;
2937
0
}
2938
2939
static inline uint32_t  //
2940
wuffs_base__more_information__metadata__fourcc(
2941
0
    const wuffs_base__more_information* m) {
2942
0
  return m->w;
2943
0
}
2944
2945
static inline wuffs_base__range_ie_u64  //
2946
wuffs_base__more_information__metadata_raw_passthrough__range(
2947
0
    const wuffs_base__more_information* m) {
2948
0
  wuffs_base__range_ie_u64 ret;
2949
0
  ret.min_incl = m->y;
2950
0
  ret.max_excl = m->z;
2951
0
  return ret;
2952
0
}
2953
2954
#define WUFFS_BASE__MORE_INFORMATION__METADATA_PARSED__CHRM__WHITE_X 0
2955
#define WUFFS_BASE__MORE_INFORMATION__METADATA_PARSED__CHRM__WHITE_Y 1
2956
#define WUFFS_BASE__MORE_INFORMATION__METADATA_PARSED__CHRM__RED_X 2
2957
#define WUFFS_BASE__MORE_INFORMATION__METADATA_PARSED__CHRM__RED_Y 3
2958
#define WUFFS_BASE__MORE_INFORMATION__METADATA_PARSED__CHRM__GREEN_X 4
2959
#define WUFFS_BASE__MORE_INFORMATION__METADATA_PARSED__CHRM__GREEN_Y 5
2960
#define WUFFS_BASE__MORE_INFORMATION__METADATA_PARSED__CHRM__BLUE_X 6
2961
#define WUFFS_BASE__MORE_INFORMATION__METADATA_PARSED__CHRM__BLUE_Y 7
2962
2963
// wuffs_base__more_information__metadata_parsed__chrm returns chromaticity
2964
// values (scaled by 100000) like the PNG "cHRM" chunk. For example, the sRGB
2965
// color space corresponds to:
2966
//  - ETC__CHRM__WHITE_X 31270
2967
//  - ETC__CHRM__WHITE_Y 32900
2968
//  - ETC__CHRM__RED_X   64000
2969
//  - ETC__CHRM__RED_Y   33000
2970
//  - ETC__CHRM__GREEN_X 30000
2971
//  - ETC__CHRM__GREEN_Y 60000
2972
//  - ETC__CHRM__BLUE_X  15000
2973
//  - ETC__CHRM__BLUE_Y   6000
2974
//
2975
// See
2976
// https://ciechanow.ski/color-spaces/#chromaticity-and-white-point-coordinates
2977
static inline int32_t  //
2978
wuffs_base__more_information__metadata_parsed__chrm(
2979
    const wuffs_base__more_information* m,
2980
0
    uint32_t component) {
2981
0
  // After the flavor and the w field (holding a FourCC), a
2982
0
  // wuffs_base__more_information holds 24 bytes of data in three uint64_t
2983
0
  // typed fields (x, y and z). We pack the eight chromaticity values (wx, wy,
2984
0
  // rx, ..., by), basically int24_t values, into 24 bytes like this:
2985
0
  //  -    LSB                 MSB
2986
0
  //  - x: wx wx wx wy wy wy rx rx
2987
0
  //  - y: rx ry ry ry gx gx gx gy
2988
0
  //  - z: gy gy bx bx bx by by by
2989
0
  uint32_t u = 0;
2990
0
  switch (component & 7) {
2991
0
    case 0:
2992
0
      u = ((uint32_t)(m->x >> 0));
2993
0
      break;
2994
0
    case 1:
2995
0
      u = ((uint32_t)(m->x >> 24));
2996
0
      break;
2997
0
    case 2:
2998
0
      u = ((uint32_t)((m->x >> 48) | (m->y << 16)));
2999
0
      break;
3000
0
    case 3:
3001
0
      u = ((uint32_t)(m->y >> 8));
3002
0
      break;
3003
0
    case 4:
3004
0
      u = ((uint32_t)(m->y >> 32));
3005
0
      break;
3006
0
    case 5:
3007
0
      u = ((uint32_t)((m->y >> 56) | (m->z << 8)));
3008
0
      break;
3009
0
    case 6:
3010
0
      u = ((uint32_t)(m->z >> 16));
3011
0
      break;
3012
0
    case 7:
3013
0
      u = ((uint32_t)(m->z >> 40));
3014
0
      break;
3015
0
  }
3016
0
  // The left-right shifts sign-extend from 24-bit to 32-bit integers.
3017
0
  return ((int32_t)(u << 8)) >> 8;
3018
0
}
3019
3020
// wuffs_base__more_information__metadata_parsed__gama returns inverse gamma
3021
// correction values (scaled by 100000) like the PNG "gAMA" chunk. For example,
3022
// for gamma = 2.2, this returns 45455 (approximating 100000 / 2.2).
3023
static inline uint32_t  //
3024
wuffs_base__more_information__metadata_parsed__gama(
3025
0
    const wuffs_base__more_information* m) {
3026
0
  return ((uint32_t)(m->x));
3027
0
}
3028
3029
#define WUFFS_BASE__SRGB_RENDERING_INTENT__PERCEPTUAL 0
3030
#define WUFFS_BASE__SRGB_RENDERING_INTENT__RELATIVE_COLORIMETRIC 1
3031
#define WUFFS_BASE__SRGB_RENDERING_INTENT__SATURATION 2
3032
#define WUFFS_BASE__SRGB_RENDERING_INTENT__ABSOLUTE_COLORIMETRIC 3
3033
3034
// wuffs_base__more_information__metadata_parsed__srgb returns the sRGB
3035
// rendering intent like the PNG "sRGB" chunk.
3036
static inline uint32_t  //
3037
wuffs_base__more_information__metadata_parsed__srgb(
3038
0
    const wuffs_base__more_information* m) {
3039
0
  return m->x & 3;
3040
0
}
3041
3042
#ifdef __cplusplus
3043
3044
inline void  //
3045
wuffs_base__more_information::set(uint32_t flavor_arg,
3046
                                  uint32_t w_arg,
3047
                                  uint64_t x_arg,
3048
                                  uint64_t y_arg,
3049
                                  uint64_t z_arg) {
3050
  wuffs_base__more_information__set(this, flavor_arg, w_arg, x_arg, y_arg,
3051
                                    z_arg);
3052
}
3053
3054
inline uint32_t  //
3055
wuffs_base__more_information::io_redirect__fourcc() const {
3056
  return wuffs_base__more_information__io_redirect__fourcc(this);
3057
}
3058
3059
inline wuffs_base__range_ie_u64  //
3060
wuffs_base__more_information::io_redirect__range() const {
3061
  return wuffs_base__more_information__io_redirect__range(this);
3062
}
3063
3064
inline uint64_t  //
3065
wuffs_base__more_information::io_seek__position() const {
3066
  return wuffs_base__more_information__io_seek__position(this);
3067
}
3068
3069
inline uint32_t  //
3070
wuffs_base__more_information::metadata__fourcc() const {
3071
  return wuffs_base__more_information__metadata__fourcc(this);
3072
}
3073
3074
inline wuffs_base__range_ie_u64  //
3075
wuffs_base__more_information::metadata_raw_passthrough__range() const {
3076
  return wuffs_base__more_information__metadata_raw_passthrough__range(this);
3077
}
3078
3079
inline int32_t  //
3080
wuffs_base__more_information::metadata_parsed__chrm(uint32_t component) const {
3081
  return wuffs_base__more_information__metadata_parsed__chrm(this, component);
3082
}
3083
3084
inline uint32_t  //
3085
wuffs_base__more_information::metadata_parsed__gama() const {
3086
  return wuffs_base__more_information__metadata_parsed__gama(this);
3087
}
3088
3089
inline uint32_t  //
3090
wuffs_base__more_information::metadata_parsed__srgb() const {
3091
  return wuffs_base__more_information__metadata_parsed__srgb(this);
3092
}
3093
3094
#endif  // __cplusplus
3095
3096
// ---------------- I/O
3097
//
3098
// See (/doc/note/io-input-output.md).
3099
3100
// wuffs_base__io_buffer_meta is the metadata for a wuffs_base__io_buffer's
3101
// data.
3102
typedef struct wuffs_base__io_buffer_meta__struct {
3103
  size_t wi;     // Write index. Invariant: wi <= len.
3104
  size_t ri;     // Read  index. Invariant: ri <= wi.
3105
  uint64_t pos;  // Buffer position (relative to the start of stream).
3106
  bool closed;   // No further writes are expected.
3107
} wuffs_base__io_buffer_meta;
3108
3109
// wuffs_base__io_buffer is a 1-dimensional buffer (a pointer and length) plus
3110
// additional metadata.
3111
//
3112
// A value with all fields zero is a valid, empty buffer.
3113
typedef struct wuffs_base__io_buffer__struct {
3114
  wuffs_base__slice_u8 data;
3115
  wuffs_base__io_buffer_meta meta;
3116
3117
#ifdef __cplusplus
3118
  inline bool is_valid() const;
3119
  inline size_t compact();
3120
  inline size_t compact_retaining(uint64_t history_retain_length);
3121
  inline size_t reader_length() const;
3122
  inline uint8_t* reader_pointer() const;
3123
  inline uint64_t reader_position() const;
3124
  inline wuffs_base__slice_u8 reader_slice() const;
3125
  inline size_t writer_length() const;
3126
  inline uint8_t* writer_pointer() const;
3127
  inline uint64_t writer_position() const;
3128
  inline wuffs_base__slice_u8 writer_slice() const;
3129
#endif  // __cplusplus
3130
3131
} wuffs_base__io_buffer;
3132
3133
static inline wuffs_base__io_buffer  //
3134
wuffs_base__make_io_buffer(wuffs_base__slice_u8 data,
3135
0
                           wuffs_base__io_buffer_meta meta) {
3136
0
  wuffs_base__io_buffer ret;
3137
0
  ret.data = data;
3138
0
  ret.meta = meta;
3139
0
  return ret;
3140
0
}
3141
3142
static inline wuffs_base__io_buffer_meta  //
3143
wuffs_base__make_io_buffer_meta(size_t wi,
3144
                                size_t ri,
3145
                                uint64_t pos,
3146
0
                                bool closed) {
3147
0
  wuffs_base__io_buffer_meta ret;
3148
0
  ret.wi = wi;
3149
0
  ret.ri = ri;
3150
0
  ret.pos = pos;
3151
0
  ret.closed = closed;
3152
0
  return ret;
3153
0
}
3154
3155
static inline wuffs_base__io_buffer  //
3156
5.73k
wuffs_base__ptr_u8__reader(uint8_t* ptr, size_t len, bool closed) {
3157
5.73k
  wuffs_base__io_buffer ret;
3158
5.73k
  ret.data.ptr = ptr;
3159
5.73k
  ret.data.len = len;
3160
5.73k
  ret.meta.wi = len;
3161
5.73k
  ret.meta.ri = 0;
3162
5.73k
  ret.meta.pos = 0;
3163
5.73k
  ret.meta.closed = closed;
3164
5.73k
  return ret;
3165
5.73k
}
3166
3167
static inline wuffs_base__io_buffer  //
3168
0
wuffs_base__ptr_u8__writer(uint8_t* ptr, size_t len) {
3169
0
  wuffs_base__io_buffer ret;
3170
0
  ret.data.ptr = ptr;
3171
0
  ret.data.len = len;
3172
0
  ret.meta.wi = 0;
3173
0
  ret.meta.ri = 0;
3174
0
  ret.meta.pos = 0;
3175
0
  ret.meta.closed = false;
3176
0
  return ret;
3177
0
}
3178
3179
static inline wuffs_base__io_buffer  //
3180
0
wuffs_base__slice_u8__reader(wuffs_base__slice_u8 s, bool closed) {
3181
0
  wuffs_base__io_buffer ret;
3182
0
  ret.data.ptr = s.ptr;
3183
0
  ret.data.len = s.len;
3184
0
  ret.meta.wi = s.len;
3185
0
  ret.meta.ri = 0;
3186
0
  ret.meta.pos = 0;
3187
0
  ret.meta.closed = closed;
3188
0
  return ret;
3189
0
}
3190
3191
static inline wuffs_base__io_buffer  //
3192
0
wuffs_base__slice_u8__writer(wuffs_base__slice_u8 s) {
3193
0
  wuffs_base__io_buffer ret;
3194
0
  ret.data.ptr = s.ptr;
3195
0
  ret.data.len = s.len;
3196
0
  ret.meta.wi = 0;
3197
0
  ret.meta.ri = 0;
3198
0
  ret.meta.pos = 0;
3199
0
  ret.meta.closed = false;
3200
0
  return ret;
3201
0
}
3202
3203
static inline wuffs_base__io_buffer  //
3204
10.3k
wuffs_base__empty_io_buffer(void) {
3205
10.3k
  wuffs_base__io_buffer ret;
3206
10.3k
  ret.data.ptr = NULL;
3207
10.3k
  ret.data.len = 0;
3208
10.3k
  ret.meta.wi = 0;
3209
10.3k
  ret.meta.ri = 0;
3210
10.3k
  ret.meta.pos = 0;
3211
10.3k
  ret.meta.closed = false;
3212
10.3k
  return ret;
3213
10.3k
}
3214
3215
static inline wuffs_base__io_buffer_meta  //
3216
0
wuffs_base__empty_io_buffer_meta(void) {
3217
0
  wuffs_base__io_buffer_meta ret;
3218
0
  ret.wi = 0;
3219
0
  ret.ri = 0;
3220
0
  ret.pos = 0;
3221
0
  ret.closed = false;
3222
0
  return ret;
3223
0
}
3224
3225
static inline bool  //
3226
0
wuffs_base__io_buffer__is_valid(const wuffs_base__io_buffer* buf) {
3227
0
  if (buf) {
3228
0
    if (buf->data.ptr) {
3229
0
      return (buf->meta.ri <= buf->meta.wi) && (buf->meta.wi <= buf->data.len);
3230
0
    } else {
3231
0
      return (buf->meta.ri == 0) && (buf->meta.wi == 0) && (buf->data.len == 0);
3232
0
    }
3233
0
  }
3234
0
  return false;
3235
0
}
3236
3237
// wuffs_base__io_buffer__compact moves any written but unread bytes to the
3238
// start of the buffer.
3239
//
3240
// It returns the increase in the writer length: how much meta.wi fell by.
3241
static inline size_t  //
3242
0
wuffs_base__io_buffer__compact(wuffs_base__io_buffer* buf) {
3243
0
  if (!buf || (buf->meta.ri == 0)) {
3244
0
    return 0;
3245
0
  }
3246
0
  size_t old_ri = buf->meta.ri;
3247
0
  buf->meta.pos = wuffs_base__u64__sat_add(buf->meta.pos, buf->meta.ri);
3248
0
  size_t new_wi = buf->meta.wi - buf->meta.ri;
3249
0
  if (new_wi != 0) {
3250
0
    memmove(buf->data.ptr, buf->data.ptr + buf->meta.ri, new_wi);
3251
0
  }
3252
0
  buf->meta.wi = new_wi;
3253
0
  buf->meta.ri = 0;
3254
0
  return old_ri;
3255
0
}
3256
3257
// wuffs_base__io_buffer__compact_retaining moves any written but unread bytes
3258
// closer to the start of the buffer. It retains H bytes of history (the most
3259
// recently read bytes), where H is min(buf->meta.ri, history_retain_length).
3260
// It is therefore a no-op if history_retain_length is UINT64_MAX. A
3261
// postcondition is that buf->meta.ri == H.
3262
//
3263
// It returns the increase in the writer length: how much meta.wi fell by.
3264
//
3265
// wuffs_base__io_buffer__compact_retaining(0) is equivalent to
3266
// wuffs_base__io_buffer__compact().
3267
//
3268
// For example, if buf started like this:
3269
//
3270
//        +--- ri = 3
3271
//        v
3272
//     abcdefgh??    len = 10, pos = 900
3273
//             ^
3274
//             +--- wi = 8
3275
//
3276
// Then, depending on history_retain_length, the resultant buf would be:
3277
//
3278
// HRL = 0     defgh?????    ri = 0    wi = 5    pos = 903    return = 3
3279
// HRL = 1     cdefgh????    ri = 1    wi = 6    pos = 902    return = 2
3280
// HRL = 2     bcdefgh???    ri = 2    wi = 7    pos = 901    return = 1
3281
// HRL = 3     abcdefgh??    ri = 3    wi = 8    pos = 900    return = 0
3282
// HRL = 4+    abcdefgh??    ri = 3    wi = 8    pos = 900    return = 0
3283
static inline size_t  //
3284
wuffs_base__io_buffer__compact_retaining(wuffs_base__io_buffer* buf,
3285
0
                                         uint64_t history_retain_length) {
3286
0
  if (!buf || (buf->meta.ri == 0)) {
3287
0
    return 0;
3288
0
  }
3289
0
  size_t old_ri = buf->meta.ri;
3290
0
  size_t new_ri = (size_t)(wuffs_base__u64__min(old_ri, history_retain_length));
3291
0
  size_t memmove_start = old_ri - new_ri;
3292
0
  buf->meta.pos = wuffs_base__u64__sat_add(buf->meta.pos, memmove_start);
3293
0
  size_t new_wi = buf->meta.wi - memmove_start;
3294
0
  if ((new_wi != 0) && (memmove_start != 0)) {
3295
0
    memmove(buf->data.ptr, buf->data.ptr + memmove_start, new_wi);
3296
0
  }
3297
0
  buf->meta.wi = new_wi;
3298
0
  buf->meta.ri = new_ri;
3299
0
  return memmove_start;
3300
0
}
3301
3302
static inline size_t  //
3303
0
wuffs_base__io_buffer__reader_length(const wuffs_base__io_buffer* buf) {
3304
0
  return buf ? buf->meta.wi - buf->meta.ri : 0;
3305
0
}
3306
3307
static inline uint8_t*  //
3308
0
wuffs_base__io_buffer__reader_pointer(const wuffs_base__io_buffer* buf) {
3309
0
  return (buf && buf->data.ptr) ? (buf->data.ptr + buf->meta.ri) : NULL;
3310
0
}
3311
3312
static inline uint64_t  //
3313
0
wuffs_base__io_buffer__reader_position(const wuffs_base__io_buffer* buf) {
3314
0
  return buf ? wuffs_base__u64__sat_add(buf->meta.pos, buf->meta.ri) : 0;
3315
0
}
3316
3317
static inline wuffs_base__slice_u8  //
3318
0
wuffs_base__io_buffer__reader_slice(const wuffs_base__io_buffer* buf) {
3319
0
  return (buf && buf->data.ptr)
3320
0
             ? wuffs_base__make_slice_u8(buf->data.ptr + buf->meta.ri,
3321
0
                                         buf->meta.wi - buf->meta.ri)
3322
0
             : wuffs_base__empty_slice_u8();
3323
0
}
3324
3325
static inline size_t  //
3326
0
wuffs_base__io_buffer__writer_length(const wuffs_base__io_buffer* buf) {
3327
0
  return buf ? buf->data.len - buf->meta.wi : 0;
3328
0
}
3329
3330
static inline uint8_t*  //
3331
0
wuffs_base__io_buffer__writer_pointer(const wuffs_base__io_buffer* buf) {
3332
0
  return (buf && buf->data.ptr) ? (buf->data.ptr + buf->meta.wi) : NULL;
3333
0
}
3334
3335
static inline uint64_t  //
3336
0
wuffs_base__io_buffer__writer_position(const wuffs_base__io_buffer* buf) {
3337
0
  return buf ? wuffs_base__u64__sat_add(buf->meta.pos, buf->meta.wi) : 0;
3338
0
}
3339
3340
static inline wuffs_base__slice_u8  //
3341
0
wuffs_base__io_buffer__writer_slice(const wuffs_base__io_buffer* buf) {
3342
0
  return (buf && buf->data.ptr)
3343
0
             ? wuffs_base__make_slice_u8(buf->data.ptr + buf->meta.wi,
3344
0
                                         buf->data.len - buf->meta.wi)
3345
0
             : wuffs_base__empty_slice_u8();
3346
0
}
3347
3348
#ifdef __cplusplus
3349
3350
inline bool  //
3351
wuffs_base__io_buffer::is_valid() const {
3352
  return wuffs_base__io_buffer__is_valid(this);
3353
}
3354
3355
inline size_t  //
3356
wuffs_base__io_buffer::compact() {
3357
  return wuffs_base__io_buffer__compact(this);
3358
}
3359
3360
inline size_t  //
3361
wuffs_base__io_buffer::compact_retaining(uint64_t history_retain_length) {
3362
  return wuffs_base__io_buffer__compact_retaining(this, history_retain_length);
3363
}
3364
3365
inline size_t  //
3366
wuffs_base__io_buffer::reader_length() const {
3367
  return wuffs_base__io_buffer__reader_length(this);
3368
}
3369
3370
inline uint8_t*  //
3371
wuffs_base__io_buffer::reader_pointer() const {
3372
  return wuffs_base__io_buffer__reader_pointer(this);
3373
}
3374
3375
inline uint64_t  //
3376
wuffs_base__io_buffer::reader_position() const {
3377
  return wuffs_base__io_buffer__reader_position(this);
3378
}
3379
3380
inline wuffs_base__slice_u8  //
3381
wuffs_base__io_buffer::reader_slice() const {
3382
  return wuffs_base__io_buffer__reader_slice(this);
3383
}
3384
3385
inline size_t  //
3386
wuffs_base__io_buffer::writer_length() const {
3387
  return wuffs_base__io_buffer__writer_length(this);
3388
}
3389
3390
inline uint8_t*  //
3391
wuffs_base__io_buffer::writer_pointer() const {
3392
  return wuffs_base__io_buffer__writer_pointer(this);
3393
}
3394
3395
inline uint64_t  //
3396
wuffs_base__io_buffer::writer_position() const {
3397
  return wuffs_base__io_buffer__writer_position(this);
3398
}
3399
3400
inline wuffs_base__slice_u8  //
3401
wuffs_base__io_buffer::writer_slice() const {
3402
  return wuffs_base__io_buffer__writer_slice(this);
3403
}
3404
3405
#endif  // __cplusplus
3406
3407
// ---------------- Tokens
3408
3409
// wuffs_base__token is an element of a byte stream's tokenization.
3410
//
3411
// See https://github.com/google/wuffs/blob/main/doc/note/tokens.md
3412
typedef struct wuffs_base__token__struct {
3413
  uint64_t repr;
3414
3415
#ifdef __cplusplus
3416
  inline int64_t value() const;
3417
  inline int64_t value_extension() const;
3418
  inline int64_t value_major() const;
3419
  inline int64_t value_base_category() const;
3420
  inline uint64_t value_minor() const;
3421
  inline uint64_t value_base_detail() const;
3422
  inline int64_t value_base_detail__sign_extended() const;
3423
  inline bool continued() const;
3424
  inline uint64_t length() const;
3425
#endif  // __cplusplus
3426
3427
} wuffs_base__token;
3428
3429
static inline wuffs_base__token  //
3430
0
wuffs_base__make_token(uint64_t repr) {
3431
0
  wuffs_base__token ret;
3432
0
  ret.repr = repr;
3433
0
  return ret;
3434
0
}
3435
3436
// --------
3437
3438
// clang-format off
3439
3440
// --------
3441
3442
#define WUFFS_BASE__TOKEN__LENGTH__MAX_INCL 0xFFFF
3443
3444
#define WUFFS_BASE__TOKEN__VALUE__SHIFT               17
3445
#define WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT     17
3446
#define WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT         42
3447
#define WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT         17
3448
#define WUFFS_BASE__TOKEN__VALUE_BASE_CATEGORY__SHIFT 38
3449
#define WUFFS_BASE__TOKEN__VALUE_BASE_DETAIL__SHIFT   17
3450
#define WUFFS_BASE__TOKEN__CONTINUED__SHIFT           16
3451
#define WUFFS_BASE__TOKEN__LENGTH__SHIFT               0
3452
3453
#define WUFFS_BASE__TOKEN__VALUE_EXTENSION__NUM_BITS  46
3454
3455
// --------
3456
3457
#define WUFFS_BASE__TOKEN__VBC__FILLER                  0
3458
#define WUFFS_BASE__TOKEN__VBC__STRUCTURE               1
3459
#define WUFFS_BASE__TOKEN__VBC__STRING                  2
3460
#define WUFFS_BASE__TOKEN__VBC__UNICODE_CODE_POINT      3
3461
#define WUFFS_BASE__TOKEN__VBC__LITERAL                 4
3462
#define WUFFS_BASE__TOKEN__VBC__NUMBER                  5
3463
#define WUFFS_BASE__TOKEN__VBC__INLINE_INTEGER_SIGNED   6
3464
#define WUFFS_BASE__TOKEN__VBC__INLINE_INTEGER_UNSIGNED 7
3465
3466
// --------
3467
3468
#define WUFFS_BASE__TOKEN__VBD__FILLER__PUNCTUATION   0x00001
3469
#define WUFFS_BASE__TOKEN__VBD__FILLER__COMMENT_BLOCK 0x00002
3470
#define WUFFS_BASE__TOKEN__VBD__FILLER__COMMENT_LINE  0x00004
3471
3472
// COMMENT_ANY is a bit-wise or of COMMENT_BLOCK AND COMMENT_LINE.
3473
#define WUFFS_BASE__TOKEN__VBD__FILLER__COMMENT_ANY   0x00006
3474
3475
// --------
3476
3477
#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__PUSH      0x00001
3478
#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__POP       0x00002
3479
#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_NONE 0x00010
3480
#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_LIST 0x00020
3481
#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_DICT 0x00040
3482
#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_NONE   0x01000
3483
#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_LIST   0x02000
3484
#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_DICT   0x04000
3485
3486
// --------
3487
3488
// DEFINITELY_FOO means that the destination bytes (and also the source bytes,
3489
// for 1_DST_1_SRC_COPY) are in the FOO format. Definitely means that the lack
3490
// of the bit means "maybe FOO". It does not necessarily mean "not FOO".
3491
//
3492
// CHAIN_ETC means that decoding the entire token chain forms a UTF-8 or ASCII
3493
// string, not just this current token. CHAIN_ETC_UTF_8 therefore distinguishes
3494
// Unicode (UTF-8) strings from byte strings. MUST means that the the token
3495
// producer (e.g. parser) must verify this. SHOULD means that the token
3496
// consumer (e.g. renderer) should verify this.
3497
//
3498
// When a CHAIN_ETC_UTF_8 bit is set, the parser must ensure that non-ASCII
3499
// code points (with multi-byte UTF-8 encodings) do not straddle token
3500
// boundaries. Checking UTF-8 validity can inspect each token separately.
3501
//
3502
// The lack of any particular bit is conservative: it is valid for all-ASCII
3503
// strings, in a single- or multi-token chain, to have none of these bits set.
3504
#define WUFFS_BASE__TOKEN__VBD__STRING__DEFINITELY_UTF_8      0x00001
3505
#define WUFFS_BASE__TOKEN__VBD__STRING__CHAIN_MUST_BE_UTF_8   0x00002
3506
#define WUFFS_BASE__TOKEN__VBD__STRING__CHAIN_SHOULD_BE_UTF_8 0x00004
3507
#define WUFFS_BASE__TOKEN__VBD__STRING__DEFINITELY_ASCII      0x00010
3508
#define WUFFS_BASE__TOKEN__VBD__STRING__CHAIN_MUST_BE_ASCII   0x00020
3509
#define WUFFS_BASE__TOKEN__VBD__STRING__CHAIN_SHOULD_BE_ASCII 0x00040
3510
3511
// CONVERT_D_DST_S_SRC means that multiples of S source bytes (possibly padded)
3512
// produces multiples of D destination bytes. For example,
3513
// CONVERT_1_DST_4_SRC_BACKSLASH_X means a source like "\\x23\\x67\\xAB", where
3514
// 12 src bytes encode 3 dst bytes.
3515
//
3516
// Post-processing may further transform those D destination bytes (e.g. treat
3517
// "\\xFF" as the Unicode code point U+00FF instead of the byte 0xFF), but that
3518
// is out of scope of this VBD's semantics.
3519
//
3520
// When src is the empty string, multiple conversion algorithms are applicable
3521
// (so these bits are not necessarily mutually exclusive), all producing the
3522
// same empty dst string.
3523
#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_0_DST_1_SRC_DROP        0x00100
3524
#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_1_DST_1_SRC_COPY        0x00200
3525
#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_1_DST_2_SRC_HEXADECIMAL 0x00400
3526
#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_1_DST_4_SRC_BACKSLASH_X 0x00800
3527
#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_3_DST_4_SRC_BASE_64_STD 0x01000
3528
#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_3_DST_4_SRC_BASE_64_URL 0x02000
3529
#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_4_DST_5_SRC_ASCII_85    0x04000
3530
#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_5_DST_8_SRC_BASE_32_HEX 0x08000
3531
#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_5_DST_8_SRC_BASE_32_STD 0x10000
3532
3533
// --------
3534
3535
#define WUFFS_BASE__TOKEN__VBD__LITERAL__UNDEFINED 0x00001
3536
#define WUFFS_BASE__TOKEN__VBD__LITERAL__NULL      0x00002
3537
#define WUFFS_BASE__TOKEN__VBD__LITERAL__FALSE     0x00004
3538
#define WUFFS_BASE__TOKEN__VBD__LITERAL__TRUE      0x00008
3539
3540
// --------
3541
3542
// For a source string of "123" or "0x9A", it is valid for a tokenizer to
3543
// return any combination of:
3544
//  - WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_FLOATING_POINT.
3545
//  - WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_INTEGER_SIGNED.
3546
//  - WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_INTEGER_UNSIGNED.
3547
//
3548
// For a source string of "+123" or "-0x9A", only the first two are valid.
3549
//
3550
// For a source string of "123.", only the first one is valid.
3551
#define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_FLOATING_POINT   0x00001
3552
#define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_INTEGER_SIGNED   0x00002
3553
#define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_INTEGER_UNSIGNED 0x00004
3554
3555
#define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_NEG_INF 0x00010
3556
#define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_POS_INF 0x00020
3557
#define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_NEG_NAN 0x00040
3558
#define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_POS_NAN 0x00080
3559
3560
// The number 300 might be represented as "\x01\x2C", "\x2C\x01\x00\x00" or
3561
// "300", which are big-endian, little-endian or text. For binary formats, the
3562
// token length (after adjusting for FORMAT_IGNORE_ETC) discriminates
3563
// e.g. u16 little-endian vs u32 little-endian.
3564
#define WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_BINARY_BIG_ENDIAN    0x00100
3565
#define WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_BINARY_LITTLE_ENDIAN 0x00200
3566
#define WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_TEXT                 0x00400
3567
3568
#define WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_IGNORE_FIRST_BYTE    0x01000
3569
3570
// --------
3571
3572
// clang-format on
3573
3574
// --------
3575
3576
// wuffs_base__token__value returns the token's high 46 bits, sign-extended. A
3577
// negative value means an extended token, non-negative means a simple token.
3578
static inline int64_t  //
3579
0
wuffs_base__token__value(const wuffs_base__token* t) {
3580
0
  return ((int64_t)(t->repr)) >> WUFFS_BASE__TOKEN__VALUE__SHIFT;
3581
0
}
3582
3583
// wuffs_base__token__value_extension returns a negative value if the token was
3584
// not an extended token.
3585
static inline int64_t  //
3586
0
wuffs_base__token__value_extension(const wuffs_base__token* t) {
3587
0
  return (~(int64_t)(t->repr)) >> WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT;
3588
0
}
3589
3590
// wuffs_base__token__value_major returns a negative value if the token was not
3591
// a simple token.
3592
static inline int64_t  //
3593
0
wuffs_base__token__value_major(const wuffs_base__token* t) {
3594
0
  return ((int64_t)(t->repr)) >> WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT;
3595
0
}
3596
3597
// wuffs_base__token__value_base_category returns a negative value if the token
3598
// was not a simple token.
3599
static inline int64_t  //
3600
0
wuffs_base__token__value_base_category(const wuffs_base__token* t) {
3601
0
  return ((int64_t)(t->repr)) >> WUFFS_BASE__TOKEN__VALUE_BASE_CATEGORY__SHIFT;
3602
0
}
3603
3604
static inline uint64_t  //
3605
0
wuffs_base__token__value_minor(const wuffs_base__token* t) {
3606
0
  return (t->repr >> WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) & 0x1FFFFFF;
3607
0
}
3608
3609
static inline uint64_t  //
3610
0
wuffs_base__token__value_base_detail(const wuffs_base__token* t) {
3611
0
  return (t->repr >> WUFFS_BASE__TOKEN__VALUE_BASE_DETAIL__SHIFT) & 0x1FFFFF;
3612
0
}
3613
3614
static inline int64_t  //
3615
wuffs_base__token__value_base_detail__sign_extended(
3616
0
    const wuffs_base__token* t) {
3617
0
  // The VBD is 21 bits in the middle of t->repr. Left shift the high (64 - 21
3618
0
  // - ETC__SHIFT) bits off, then right shift (sign-extending) back down.
3619
0
  uint64_t u = t->repr << (43 - WUFFS_BASE__TOKEN__VALUE_BASE_DETAIL__SHIFT);
3620
0
  return ((int64_t)u) >> 43;
3621
0
}
3622
3623
static inline bool  //
3624
0
wuffs_base__token__continued(const wuffs_base__token* t) {
3625
0
  return t->repr & 0x10000;
3626
0
}
3627
3628
static inline uint64_t  //
3629
0
wuffs_base__token__length(const wuffs_base__token* t) {
3630
0
  return (t->repr >> WUFFS_BASE__TOKEN__LENGTH__SHIFT) & 0xFFFF;
3631
0
}
3632
3633
#ifdef __cplusplus
3634
3635
inline int64_t  //
3636
wuffs_base__token::value() const {
3637
  return wuffs_base__token__value(this);
3638
}
3639
3640
inline int64_t  //
3641
wuffs_base__token::value_extension() const {
3642
  return wuffs_base__token__value_extension(this);
3643
}
3644
3645
inline int64_t  //
3646
wuffs_base__token::value_major() const {
3647
  return wuffs_base__token__value_major(this);
3648
}
3649
3650
inline int64_t  //
3651
wuffs_base__token::value_base_category() const {
3652
  return wuffs_base__token__value_base_category(this);
3653
}
3654
3655
inline uint64_t  //
3656
wuffs_base__token::value_minor() const {
3657
  return wuffs_base__token__value_minor(this);
3658
}
3659
3660
inline uint64_t  //
3661
wuffs_base__token::value_base_detail() const {
3662
  return wuffs_base__token__value_base_detail(this);
3663
}
3664
3665
inline int64_t  //
3666
wuffs_base__token::value_base_detail__sign_extended() const {
3667
  return wuffs_base__token__value_base_detail__sign_extended(this);
3668
}
3669
3670
inline bool  //
3671
wuffs_base__token::continued() const {
3672
  return wuffs_base__token__continued(this);
3673
}
3674
3675
inline uint64_t  //
3676
wuffs_base__token::length() const {
3677
  return wuffs_base__token__length(this);
3678
}
3679
3680
#endif  // __cplusplus
3681
3682
// --------
3683
3684
#if defined(__GNUC__)
3685
#pragma GCC diagnostic push
3686
#pragma GCC diagnostic ignored "-Wcast-qual"
3687
#endif
3688
3689
static inline wuffs_base__token*  //
3690
0
wuffs_base__strip_const_from_token_ptr(const wuffs_base__token* ptr) {
3691
0
  return (wuffs_base__token*)ptr;
3692
0
}
3693
3694
#if defined(__GNUC__)
3695
#pragma GCC diagnostic pop
3696
#endif
3697
3698
// --------
3699
3700
typedef WUFFS_BASE__SLICE(wuffs_base__token) wuffs_base__slice_token;
3701
3702
static inline wuffs_base__slice_token  //
3703
0
wuffs_base__make_slice_token(wuffs_base__token* ptr, size_t len) {
3704
0
  wuffs_base__slice_token ret;
3705
0
  ret.ptr = ptr;
3706
0
  ret.len = len;
3707
0
  return ret;
3708
0
}
3709
3710
static inline wuffs_base__slice_token  //
3711
0
wuffs_base__empty_slice_token(void) {
3712
0
  wuffs_base__slice_token ret;
3713
0
  ret.ptr = NULL;
3714
0
  ret.len = 0;
3715
0
  return ret;
3716
0
}
3717
3718
// --------
3719
3720
// wuffs_base__token_buffer_meta is the metadata for a
3721
// wuffs_base__token_buffer's data.
3722
typedef struct wuffs_base__token_buffer_meta__struct {
3723
  size_t wi;     // Write index. Invariant: wi <= len.
3724
  size_t ri;     // Read  index. Invariant: ri <= wi.
3725
  uint64_t pos;  // Position of the buffer start relative to the stream start.
3726
  bool closed;   // No further writes are expected.
3727
} wuffs_base__token_buffer_meta;
3728
3729
// wuffs_base__token_buffer is a 1-dimensional buffer (a pointer and length)
3730
// plus additional metadata.
3731
//
3732
// A value with all fields zero is a valid, empty buffer.
3733
typedef struct wuffs_base__token_buffer__struct {
3734
  wuffs_base__slice_token data;
3735
  wuffs_base__token_buffer_meta meta;
3736
3737
#ifdef __cplusplus
3738
  inline bool is_valid() const;
3739
  inline size_t compact();
3740
  inline size_t compact_retaining(uint64_t history_retain_length);
3741
  inline uint64_t reader_length() const;
3742
  inline wuffs_base__token* reader_pointer() const;
3743
  inline wuffs_base__slice_token reader_slice() const;
3744
  inline uint64_t reader_token_position() const;
3745
  inline uint64_t writer_length() const;
3746
  inline uint64_t writer_token_position() const;
3747
  inline wuffs_base__token* writer_pointer() const;
3748
  inline wuffs_base__slice_token writer_slice() const;
3749
#endif  // __cplusplus
3750
3751
} wuffs_base__token_buffer;
3752
3753
static inline wuffs_base__token_buffer  //
3754
wuffs_base__make_token_buffer(wuffs_base__slice_token data,
3755
0
                              wuffs_base__token_buffer_meta meta) {
3756
0
  wuffs_base__token_buffer ret;
3757
0
  ret.data = data;
3758
0
  ret.meta = meta;
3759
0
  return ret;
3760
0
}
3761
3762
static inline wuffs_base__token_buffer_meta  //
3763
wuffs_base__make_token_buffer_meta(size_t wi,
3764
                                   size_t ri,
3765
                                   uint64_t pos,
3766
0
                                   bool closed) {
3767
0
  wuffs_base__token_buffer_meta ret;
3768
0
  ret.wi = wi;
3769
0
  ret.ri = ri;
3770
0
  ret.pos = pos;
3771
0
  ret.closed = closed;
3772
0
  return ret;
3773
0
}
3774
3775
static inline wuffs_base__token_buffer  //
3776
0
wuffs_base__slice_token__reader(wuffs_base__slice_token s, bool closed) {
3777
0
  wuffs_base__token_buffer ret;
3778
0
  ret.data.ptr = s.ptr;
3779
0
  ret.data.len = s.len;
3780
0
  ret.meta.wi = s.len;
3781
0
  ret.meta.ri = 0;
3782
0
  ret.meta.pos = 0;
3783
0
  ret.meta.closed = closed;
3784
0
  return ret;
3785
0
}
3786
3787
static inline wuffs_base__token_buffer  //
3788
0
wuffs_base__slice_token__writer(wuffs_base__slice_token s) {
3789
0
  wuffs_base__token_buffer ret;
3790
0
  ret.data.ptr = s.ptr;
3791
0
  ret.data.len = s.len;
3792
0
  ret.meta.wi = 0;
3793
0
  ret.meta.ri = 0;
3794
0
  ret.meta.pos = 0;
3795
0
  ret.meta.closed = false;
3796
0
  return ret;
3797
0
}
3798
3799
static inline wuffs_base__token_buffer  //
3800
0
wuffs_base__empty_token_buffer(void) {
3801
0
  wuffs_base__token_buffer ret;
3802
0
  ret.data.ptr = NULL;
3803
0
  ret.data.len = 0;
3804
0
  ret.meta.wi = 0;
3805
0
  ret.meta.ri = 0;
3806
0
  ret.meta.pos = 0;
3807
0
  ret.meta.closed = false;
3808
0
  return ret;
3809
0
}
3810
3811
static inline wuffs_base__token_buffer_meta  //
3812
0
wuffs_base__empty_token_buffer_meta(void) {
3813
0
  wuffs_base__token_buffer_meta ret;
3814
0
  ret.wi = 0;
3815
0
  ret.ri = 0;
3816
0
  ret.pos = 0;
3817
0
  ret.closed = false;
3818
0
  return ret;
3819
0
}
3820
3821
static inline bool  //
3822
0
wuffs_base__token_buffer__is_valid(const wuffs_base__token_buffer* buf) {
3823
0
  if (buf) {
3824
0
    if (buf->data.ptr) {
3825
0
      return (buf->meta.ri <= buf->meta.wi) && (buf->meta.wi <= buf->data.len);
3826
0
    } else {
3827
0
      return (buf->meta.ri == 0) && (buf->meta.wi == 0) && (buf->data.len == 0);
3828
0
    }
3829
0
  }
3830
0
  return false;
3831
0
}
3832
3833
// wuffs_base__token_buffer__compact moves any written but unread tokens to the
3834
// start of the buffer.
3835
//
3836
// It returns the increase in the writer length: how much meta.wi fell by.
3837
static inline size_t  //
3838
0
wuffs_base__token_buffer__compact(wuffs_base__token_buffer* buf) {
3839
0
  if (!buf || (buf->meta.ri == 0)) {
3840
0
    return 0;
3841
0
  }
3842
0
  size_t old_ri = buf->meta.ri;
3843
0
  buf->meta.pos = wuffs_base__u64__sat_add(buf->meta.pos, buf->meta.ri);
3844
0
  size_t new_wi = buf->meta.wi - buf->meta.ri;
3845
0
  if (new_wi != 0) {
3846
0
    memmove(buf->data.ptr, buf->data.ptr + buf->meta.ri,
3847
0
            new_wi * sizeof(wuffs_base__token));
3848
0
  }
3849
0
  buf->meta.wi = new_wi;
3850
0
  buf->meta.ri = 0;
3851
0
  return old_ri;
3852
0
}
3853
3854
// wuffs_base__token_buffer__compact_retaining moves any written but unread
3855
// tokens closer to the start of the buffer. It retains H tokens of history
3856
// (the most recently read tokens), where H is min(buf->meta.ri,
3857
// history_retain_length). It is therefore a no-op if history_retain_length is
3858
// UINT64_MAX. A postcondition is that buf->meta.ri == H.
3859
//
3860
// It returns the increase in the writer length: how much meta.wi fell by.
3861
//
3862
// wuffs_base__token_buffer__compact_retaining(0) is equivalent to
3863
// wuffs_base__token_buffer__compact().
3864
//
3865
// For example, if buf started like this:
3866
//
3867
//        +--- ri = 3
3868
//        v
3869
//     abcdefgh??    len = 10, pos = 900
3870
//             ^
3871
//             +--- wi = 8
3872
//
3873
// Then, depending on history_retain_length, the resultant buf would be:
3874
//
3875
// HRL = 0     defgh?????    ri = 0    wi = 5    pos = 903    return = 3
3876
// HRL = 1     cdefgh????    ri = 1    wi = 6    pos = 902    return = 2
3877
// HRL = 2     bcdefgh???    ri = 2    wi = 7    pos = 901    return = 1
3878
// HRL = 3     abcdefgh??    ri = 3    wi = 8    pos = 900    return = 0
3879
// HRL = 4+    abcdefgh??    ri = 3    wi = 8    pos = 900    return = 0
3880
static inline size_t  //
3881
wuffs_base__token_buffer__compact_retaining(wuffs_base__token_buffer* buf,
3882
0
                                            uint64_t history_retain_length) {
3883
0
  if (!buf || (buf->meta.ri == 0)) {
3884
0
    return 0;
3885
0
  }
3886
0
  size_t old_ri = buf->meta.ri;
3887
0
  size_t new_ri = (size_t)(wuffs_base__u64__min(old_ri, history_retain_length));
3888
0
  size_t memmove_start = old_ri - new_ri;
3889
0
  buf->meta.pos = wuffs_base__u64__sat_add(buf->meta.pos, memmove_start);
3890
0
  size_t new_wi = buf->meta.wi - memmove_start;
3891
0
  if ((new_wi != 0) && (memmove_start != 0)) {
3892
0
    memmove(buf->data.ptr, buf->data.ptr + memmove_start,
3893
0
            new_wi * sizeof(wuffs_base__token));
3894
0
  }
3895
0
  buf->meta.wi = new_wi;
3896
0
  buf->meta.ri = new_ri;
3897
0
  return memmove_start;
3898
0
}
3899
3900
static inline uint64_t  //
3901
0
wuffs_base__token_buffer__reader_length(const wuffs_base__token_buffer* buf) {
3902
0
  return buf ? buf->meta.wi - buf->meta.ri : 0;
3903
0
}
3904
3905
static inline wuffs_base__token*  //
3906
0
wuffs_base__token_buffer__reader_pointer(const wuffs_base__token_buffer* buf) {
3907
0
  return buf ? (buf->data.ptr + buf->meta.ri) : NULL;
3908
0
}
3909
3910
static inline wuffs_base__slice_token  //
3911
0
wuffs_base__token_buffer__reader_slice(const wuffs_base__token_buffer* buf) {
3912
0
  return buf ? wuffs_base__make_slice_token(buf->data.ptr + buf->meta.ri,
3913
0
                                            buf->meta.wi - buf->meta.ri)
3914
0
             : wuffs_base__empty_slice_token();
3915
0
}
3916
3917
static inline uint64_t  //
3918
wuffs_base__token_buffer__reader_token_position(
3919
0
    const wuffs_base__token_buffer* buf) {
3920
0
  return buf ? wuffs_base__u64__sat_add(buf->meta.pos, buf->meta.ri) : 0;
3921
0
}
3922
3923
static inline uint64_t  //
3924
0
wuffs_base__token_buffer__writer_length(const wuffs_base__token_buffer* buf) {
3925
0
  return buf ? buf->data.len - buf->meta.wi : 0;
3926
0
}
3927
3928
static inline wuffs_base__token*  //
3929
0
wuffs_base__token_buffer__writer_pointer(const wuffs_base__token_buffer* buf) {
3930
0
  return buf ? (buf->data.ptr + buf->meta.wi) : NULL;
3931
0
}
3932
3933
static inline wuffs_base__slice_token  //
3934
0
wuffs_base__token_buffer__writer_slice(const wuffs_base__token_buffer* buf) {
3935
0
  return buf ? wuffs_base__make_slice_token(buf->data.ptr + buf->meta.wi,
3936
0
                                            buf->data.len - buf->meta.wi)
3937
0
             : wuffs_base__empty_slice_token();
3938
0
}
3939
3940
static inline uint64_t  //
3941
wuffs_base__token_buffer__writer_token_position(
3942
0
    const wuffs_base__token_buffer* buf) {
3943
0
  return buf ? wuffs_base__u64__sat_add(buf->meta.pos, buf->meta.wi) : 0;
3944
0
}
3945
3946
#ifdef __cplusplus
3947
3948
inline bool  //
3949
wuffs_base__token_buffer::is_valid() const {
3950
  return wuffs_base__token_buffer__is_valid(this);
3951
}
3952
3953
inline size_t  //
3954
wuffs_base__token_buffer::compact() {
3955
  return wuffs_base__token_buffer__compact(this);
3956
}
3957
3958
inline size_t  //
3959
wuffs_base__token_buffer::compact_retaining(uint64_t history_retain_length) {
3960
  return wuffs_base__token_buffer__compact_retaining(this,
3961
                                                     history_retain_length);
3962
}
3963
3964
inline uint64_t  //
3965
wuffs_base__token_buffer::reader_length() const {
3966
  return wuffs_base__token_buffer__reader_length(this);
3967
}
3968
3969
inline wuffs_base__token*  //
3970
wuffs_base__token_buffer::reader_pointer() const {
3971
  return wuffs_base__token_buffer__reader_pointer(this);
3972
}
3973
3974
inline wuffs_base__slice_token  //
3975
wuffs_base__token_buffer::reader_slice() const {
3976
  return wuffs_base__token_buffer__reader_slice(this);
3977
}
3978
3979
inline uint64_t  //
3980
wuffs_base__token_buffer::reader_token_position() const {
3981
  return wuffs_base__token_buffer__reader_token_position(this);
3982
}
3983
3984
inline uint64_t  //
3985
wuffs_base__token_buffer::writer_length() const {
3986
  return wuffs_base__token_buffer__writer_length(this);
3987
}
3988
3989
inline wuffs_base__token*  //
3990
wuffs_base__token_buffer::writer_pointer() const {
3991
  return wuffs_base__token_buffer__writer_pointer(this);
3992
}
3993
3994
inline wuffs_base__slice_token  //
3995
wuffs_base__token_buffer::writer_slice() const {
3996
  return wuffs_base__token_buffer__writer_slice(this);
3997
}
3998
3999
inline uint64_t  //
4000
wuffs_base__token_buffer::writer_token_position() const {
4001
  return wuffs_base__token_buffer__writer_token_position(this);
4002
}
4003
4004
#endif  // __cplusplus
4005
4006
// ---------------- Memory Allocation
4007
4008
// The memory allocation related functions in this section aren't used by Wuffs
4009
// per se, but they may be helpful to the code that uses Wuffs.
4010
4011
// wuffs_base__malloc_slice_uxx wraps calling a malloc-like function, except
4012
// that it takes a uint64_t number of elements instead of a size_t size in
4013
// bytes, and it returns a slice (a pointer and a length) instead of just a
4014
// pointer.
4015
//
4016
// You can pass the C stdlib's malloc as the malloc_func.
4017
//
4018
// It returns an empty slice (containing a NULL ptr field) if num_uxx is zero
4019
// or if (num_uxx * sizeof(uintxx_t)) would overflow SIZE_MAX.
4020
4021
static inline wuffs_base__slice_u8  //
4022
8.06k
wuffs_base__malloc_slice_u8(void* (*malloc_func)(size_t), uint64_t num_u8) {
4023
8.06k
  if (malloc_func && num_u8 && (num_u8 <= (SIZE_MAX / sizeof(uint8_t)))) {
4024
8.06k
    void* p = (*malloc_func)((size_t)(num_u8 * sizeof(uint8_t)));
4025
8.06k
    if (p) {
4026
8.06k
      return wuffs_base__make_slice_u8((uint8_t*)(p), (size_t)num_u8);
4027
8.06k
    }
4028
8.06k
  }
4029
0
  return wuffs_base__empty_slice_u8();
4030
8.06k
}
4031
4032
static inline wuffs_base__slice_u16  //
4033
0
wuffs_base__malloc_slice_u16(void* (*malloc_func)(size_t), uint64_t num_u16) {
4034
0
  if (malloc_func && num_u16 && (num_u16 <= (SIZE_MAX / sizeof(uint16_t)))) {
4035
0
    void* p = (*malloc_func)((size_t)(num_u16 * sizeof(uint16_t)));
4036
0
    if (p) {
4037
0
      return wuffs_base__make_slice_u16((uint16_t*)(p), (size_t)num_u16);
4038
0
    }
4039
0
  }
4040
0
  return wuffs_base__empty_slice_u16();
4041
0
}
4042
4043
static inline wuffs_base__slice_u32  //
4044
0
wuffs_base__malloc_slice_u32(void* (*malloc_func)(size_t), uint64_t num_u32) {
4045
0
  if (malloc_func && num_u32 && (num_u32 <= (SIZE_MAX / sizeof(uint32_t)))) {
4046
0
    void* p = (*malloc_func)((size_t)(num_u32 * sizeof(uint32_t)));
4047
0
    if (p) {
4048
0
      return wuffs_base__make_slice_u32((uint32_t*)(p), (size_t)num_u32);
4049
0
    }
4050
0
  }
4051
0
  return wuffs_base__empty_slice_u32();
4052
0
}
4053
4054
static inline wuffs_base__slice_u64  //
4055
0
wuffs_base__malloc_slice_u64(void* (*malloc_func)(size_t), uint64_t num_u64) {
4056
0
  if (malloc_func && num_u64 && (num_u64 <= (SIZE_MAX / sizeof(uint64_t)))) {
4057
0
    void* p = (*malloc_func)((size_t)(num_u64 * sizeof(uint64_t)));
4058
0
    if (p) {
4059
0
      return wuffs_base__make_slice_u64((uint64_t*)(p), (size_t)num_u64);
4060
0
    }
4061
0
  }
4062
0
  return wuffs_base__empty_slice_u64();
4063
0
}
4064
4065
// ---------------- Images
4066
4067
// WUFFS_BASE__IMAGE__DIMENSION_MAX_INCL is the largest width or height
4068
// (measured in pixels) supported by Wuffs' standard library's image codecs.
4069
//
4070
// Any non-negative integer N less than or equal to ((1 << 24) - 1) can be
4071
// losslessly converted to and from single-precision floating point (what C
4072
// calls the "float" type and what Go calls "float32").
4073
//
4074
// A Wuffs image can have up to 4 channels and up to 8 bytes per channel (8 is
4075
// also known as sizeof(double)), combining for up to 32 bytes per pixel. When
4076
// calculating memory requirements, the 0xFFFFFF upper bound also means that:
4077
//   - (32 * N)     will not overflow an int32_t or uint32_t.
4078
//   - (32 * N * N) will not overflow an int64_t or uint64_t, provided that N
4079
//     already has a 64-bit type.
4080
//
4081
// 0xFFFFFF in decimal is 16777215.
4082
#define WUFFS_BASE__IMAGE__DIMENSION_MAX_INCL 0xFFFFFF
4083
4084
// wuffs_base__color_u32_argb_premul is an 8 bit per channel premultiplied
4085
// Alpha, Red, Green, Blue color, as a uint32_t value. Its value is always
4086
// 0xAARRGGBB (Alpha most significant, Blue least), regardless of endianness.
4087
typedef uint32_t wuffs_base__color_u32_argb_premul;
4088
4089
// wuffs_base__color_u32_argb_premul__is_valid returns whether c's Red, Green
4090
// and Blue channels are all less than or equal to its Alpha channel. c uses
4091
// premultiplied alpha, so 50% opaque 100% saturated red is 0x7F7F_0000 and a
4092
// value like 0x7F80_0000 is invalid.
4093
static inline bool  //
4094
wuffs_base__color_u32_argb_premul__is_valid(
4095
0
    wuffs_base__color_u32_argb_premul c) {
4096
0
  uint32_t a = 0xFF & (c >> 24);
4097
0
  uint32_t r = 0xFF & (c >> 16);
4098
0
  uint32_t g = 0xFF & (c >> 8);
4099
0
  uint32_t b = 0xFF & (c >> 0);
4100
0
  return (a >= r) && (a >= g) && (a >= b);
4101
0
}
4102
4103
static inline uint16_t  //
4104
wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(
4105
0
    wuffs_base__color_u32_argb_premul c) {
4106
0
  uint32_t r5 = 0xF800 & (c >> 8);
4107
0
  uint32_t g6 = 0x07E0 & (c >> 5);
4108
0
  uint32_t b5 = 0x001F & (c >> 3);
4109
0
  return (uint16_t)(r5 | g6 | b5);
4110
0
}
4111
4112
static inline wuffs_base__color_u32_argb_premul  //
4113
0
wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul(uint16_t rgb_565) {
4114
0
  uint32_t b5 = 0x1F & (rgb_565 >> 0);
4115
0
  uint32_t b = (b5 << 3) | (b5 >> 2);
4116
0
  uint32_t g6 = 0x3F & (rgb_565 >> 5);
4117
0
  uint32_t g = (g6 << 2) | (g6 >> 4);
4118
0
  uint32_t r5 = 0x1F & (rgb_565 >> 11);
4119
0
  uint32_t r = (r5 << 3) | (r5 >> 2);
4120
0
  return 0xFF000000 | (r << 16) | (g << 8) | (b << 0);
4121
0
}
4122
4123
static inline uint8_t  //
4124
wuffs_base__color_u32_argb_premul__as__color_u8_gray(
4125
0
    wuffs_base__color_u32_argb_premul c) {
4126
  // Work in 16-bit color.
4127
0
  uint32_t cr = 0x101 * (0xFF & (c >> 16));
4128
0
  uint32_t cg = 0x101 * (0xFF & (c >> 8));
4129
0
  uint32_t cb = 0x101 * (0xFF & (c >> 0));
4130
4131
  // These coefficients (the fractions 0.299, 0.587 and 0.114) are the same
4132
  // as those given by the JFIF specification.
4133
  //
4134
  // Note that 19595 + 38470 + 7471 equals 65536, also known as (1 << 16). We
4135
  // shift by 24, not just by 16, because the return value is 8-bit color, not
4136
  // 16-bit color.
4137
0
  uint32_t weighted_average = (19595 * cr) + (38470 * cg) + (7471 * cb) + 32768;
4138
0
  return (uint8_t)(weighted_average >> 24);
4139
0
}
4140
4141
static inline uint16_t  //
4142
wuffs_base__color_u32_argb_premul__as__color_u16_alpha_gray_nonpremul(
4143
0
    wuffs_base__color_u32_argb_premul c) {
4144
0
  uint32_t a = 0xFF & (c >> 24);
4145
0
  if (a == 0) {
4146
0
    return 0;
4147
0
  }
4148
0
  uint32_t a16 = a * 0x101;
4149
4150
0
  uint32_t cr = 0xFF & (c >> 16);
4151
0
  cr = (cr * (0x101 * 0xFFFF)) / a16;
4152
0
  uint32_t cg = 0xFF & (c >> 8);
4153
0
  cg = (cg * (0x101 * 0xFFFF)) / a16;
4154
0
  uint32_t cb = 0xFF & (c >> 0);
4155
0
  cb = (cb * (0x101 * 0xFFFF)) / a16;
4156
4157
0
  uint32_t weighted_average = (19595 * cr) + (38470 * cg) + (7471 * cb) + 32768;
4158
0
  return (uint16_t)((a16 & 0xFF00) | (weighted_average >> 24));
4159
0
}
4160
4161
static inline uint16_t  //
4162
wuffs_base__color_u32_argb_premul__as__color_u16_gray(
4163
0
    wuffs_base__color_u32_argb_premul c) {
4164
  // Work in 16-bit color.
4165
0
  uint32_t cr = 0x101 * (0xFF & (c >> 16));
4166
0
  uint32_t cg = 0x101 * (0xFF & (c >> 8));
4167
0
  uint32_t cb = 0x101 * (0xFF & (c >> 0));
4168
4169
  // These coefficients (the fractions 0.299, 0.587 and 0.114) are the same
4170
  // as those given by the JFIF specification.
4171
  //
4172
  // Note that 19595 + 38470 + 7471 equals 65536, also known as (1 << 16).
4173
0
  uint32_t weighted_average = (19595 * cr) + (38470 * cg) + (7471 * cb) + 32768;
4174
0
  return (uint16_t)(weighted_average >> 16);
4175
0
}
4176
4177
// wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul converts
4178
// from non-premultiplied alpha to premultiplied alpha.
4179
static inline wuffs_base__color_u32_argb_premul  //
4180
wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(
4181
67.6M
    uint32_t argb_nonpremul) {
4182
  // Multiplying by 0x101 (twice, once for alpha and once for color) converts
4183
  // from 8-bit to 16-bit color. Shifting right by 8 undoes that.
4184
  //
4185
  // Working in the higher bit depth can produce slightly different (and
4186
  // arguably slightly more accurate) results. For example, given 8-bit blue
4187
  // and alpha of 0x80 and 0x81:
4188
  //
4189
  //  - ((0x80   * 0x81  ) / 0xFF  )      = 0x40        = 0x40
4190
  //  - ((0x8080 * 0x8181) / 0xFFFF) >> 8 = 0x4101 >> 8 = 0x41
4191
67.6M
  uint32_t a = 0xFF & (argb_nonpremul >> 24);
4192
67.6M
  uint32_t a16 = a * (0x101 * 0x101);
4193
4194
67.6M
  uint32_t r = 0xFF & (argb_nonpremul >> 16);
4195
67.6M
  r = ((r * a16) / 0xFFFF) >> 8;
4196
67.6M
  uint32_t g = 0xFF & (argb_nonpremul >> 8);
4197
67.6M
  g = ((g * a16) / 0xFFFF) >> 8;
4198
67.6M
  uint32_t b = 0xFF & (argb_nonpremul >> 0);
4199
67.6M
  b = ((b * a16) / 0xFFFF) >> 8;
4200
4201
67.6M
  return (a << 24) | (r << 16) | (g << 8) | (b << 0);
4202
67.6M
}
4203
4204
// wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul converts
4205
// from premultiplied alpha to non-premultiplied alpha.
4206
static inline uint32_t  //
4207
wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul(
4208
0
    wuffs_base__color_u32_argb_premul c) {
4209
0
  uint32_t a = 0xFF & (c >> 24);
4210
0
  if (a == 0xFF) {
4211
0
    return c;
4212
0
  } else if (a == 0) {
4213
0
    return 0;
4214
0
  }
4215
0
  uint32_t a16 = a * 0x101;
4216
4217
0
  uint32_t r = 0xFF & (c >> 16);
4218
0
  r = ((r * (0x101 * 0xFFFF)) / a16) >> 8;
4219
0
  uint32_t g = 0xFF & (c >> 8);
4220
0
  g = ((g * (0x101 * 0xFFFF)) / a16) >> 8;
4221
0
  uint32_t b = 0xFF & (c >> 0);
4222
0
  b = ((b * (0x101 * 0xFFFF)) / a16) >> 8;
4223
4224
0
  return (a << 24) | (r << 16) | (g << 8) | (b << 0);
4225
0
}
4226
4227
// wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul converts
4228
// from 4x16LE non-premultiplied alpha to 4x8 premultiplied alpha.
4229
static inline wuffs_base__color_u32_argb_premul  //
4230
wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul(
4231
17.3M
    uint64_t argb_nonpremul) {
4232
17.3M
  uint32_t a16 = ((uint32_t)(0xFFFF & (argb_nonpremul >> 48)));
4233
4234
17.3M
  uint32_t r16 = ((uint32_t)(0xFFFF & (argb_nonpremul >> 32)));
4235
17.3M
  r16 = (r16 * a16) / 0xFFFF;
4236
17.3M
  uint32_t g16 = ((uint32_t)(0xFFFF & (argb_nonpremul >> 16)));
4237
17.3M
  g16 = (g16 * a16) / 0xFFFF;
4238
17.3M
  uint32_t b16 = ((uint32_t)(0xFFFF & (argb_nonpremul >> 0)));
4239
17.3M
  b16 = (b16 * a16) / 0xFFFF;
4240
4241
17.3M
  return ((a16 >> 8) << 24) | ((r16 >> 8) << 16) | ((g16 >> 8) << 8) |
4242
17.3M
         ((b16 >> 8) << 0);
4243
17.3M
}
4244
4245
// wuffs_base__color_u32_argb_premul__as__color_u64_argb_nonpremul converts
4246
// from 4x8 premultiplied alpha to 4x16LE non-premultiplied alpha.
4247
static inline uint64_t  //
4248
wuffs_base__color_u32_argb_premul__as__color_u64_argb_nonpremul(
4249
0
    wuffs_base__color_u32_argb_premul c) {
4250
0
  uint32_t a = 0xFF & (c >> 24);
4251
0
  if (a == 0xFF) {
4252
0
    uint64_t r16 = 0x101 * (0xFF & (c >> 16));
4253
0
    uint64_t g16 = 0x101 * (0xFF & (c >> 8));
4254
0
    uint64_t b16 = 0x101 * (0xFF & (c >> 0));
4255
0
    return 0xFFFF000000000000u | (r16 << 32) | (g16 << 16) | (b16 << 0);
4256
0
  } else if (a == 0) {
4257
0
    return 0;
4258
0
  }
4259
0
  uint64_t a16 = a * 0x101;
4260
4261
0
  uint64_t r = 0xFF & (c >> 16);
4262
0
  uint64_t r16 = (r * (0x101 * 0xFFFF)) / a16;
4263
0
  uint64_t g = 0xFF & (c >> 8);
4264
0
  uint64_t g16 = (g * (0x101 * 0xFFFF)) / a16;
4265
0
  uint64_t b = 0xFF & (c >> 0);
4266
0
  uint64_t b16 = (b * (0x101 * 0xFFFF)) / a16;
4267
4268
0
  return (a16 << 48) | (r16 << 32) | (g16 << 16) | (b16 << 0);
4269
0
}
4270
4271
static inline uint8_t  //
4272
0
wuffs_base__color_u64_argb_premul__as__color_u8_gray(uint64_t argb_premul) {
4273
0
  uint32_t r16 = ((uint32_t)(0xFFFF & (argb_premul >> 32)));
4274
0
  uint32_t g16 = ((uint32_t)(0xFFFF & (argb_premul >> 16)));
4275
0
  uint32_t b16 = ((uint32_t)(0xFFFF & (argb_premul >> 0)));
4276
0
4277
0
  // These coefficients (the fractions 0.299, 0.587 and 0.114) are the same
4278
0
  // as those given by the JFIF specification.
4279
0
  //
4280
0
  // Note that 19595 + 38470 + 7471 equals 65536, also known as (1 << 16). We
4281
0
  // shift by 24, not just by 16, because the return value is 8-bit color, not
4282
0
  // 16-bit color.
4283
0
  uint32_t weighted_average =
4284
0
      (19595 * r16) + (38470 * g16) + (7471 * b16) + 32768;
4285
0
  return (uint8_t)(weighted_average >> 24);
4286
0
}
4287
4288
static inline uint8_t  //
4289
wuffs_base__color_u64_argb_nonpremul__as__color_u8_gray(
4290
0
    uint64_t argb_nonpremul) {
4291
0
  uint32_t a16 = ((uint32_t)(0xFFFF & (argb_nonpremul >> 48)));
4292
4293
0
  uint32_t r16 = ((uint32_t)(0xFFFF & (argb_nonpremul >> 32)));
4294
0
  r16 = (r16 * a16) / 0xFFFF;
4295
0
  uint32_t g16 = ((uint32_t)(0xFFFF & (argb_nonpremul >> 16)));
4296
0
  g16 = (g16 * a16) / 0xFFFF;
4297
0
  uint32_t b16 = ((uint32_t)(0xFFFF & (argb_nonpremul >> 0)));
4298
0
  b16 = (b16 * a16) / 0xFFFF;
4299
4300
  // These coefficients (the fractions 0.299, 0.587 and 0.114) are the same
4301
  // as those given by the JFIF specification.
4302
  //
4303
  // Note that 19595 + 38470 + 7471 equals 65536, also known as (1 << 16). We
4304
  // shift by 24, not just by 16, because the return value is 8-bit color, not
4305
  // 16-bit color.
4306
0
  uint32_t weighted_average =
4307
0
      (19595 * r16) + (38470 * g16) + (7471 * b16) + 32768;
4308
0
  return (uint8_t)(weighted_average >> 24);
4309
0
}
4310
4311
static inline uint64_t  //
4312
0
wuffs_base__color_u32__as__color_u64(uint32_t c) {
4313
0
  uint64_t a16 = 0x101 * (0xFF & (c >> 24));
4314
0
  uint64_t r16 = 0x101 * (0xFF & (c >> 16));
4315
0
  uint64_t g16 = 0x101 * (0xFF & (c >> 8));
4316
0
  uint64_t b16 = 0x101 * (0xFF & (c >> 0));
4317
0
  return (a16 << 48) | (r16 << 32) | (g16 << 16) | (b16 << 0);
4318
0
}
4319
4320
static inline uint32_t  //
4321
0
wuffs_base__color_u64__as__color_u32(uint64_t c) {
4322
0
  uint32_t a = ((uint32_t)(0xFF & (c >> 56)));
4323
0
  uint32_t r = ((uint32_t)(0xFF & (c >> 40)));
4324
0
  uint32_t g = ((uint32_t)(0xFF & (c >> 24)));
4325
0
  uint32_t b = ((uint32_t)(0xFF & (c >> 8)));
4326
0
  return (a << 24) | (r << 16) | (g << 8) | (b << 0);
4327
0
}
4328
4329
// wuffs_base__color_ycc__as__color_u32 converts from YCbCr to 0xAARRGGBB. The
4330
// alpha bits are always 0xFF.
4331
static inline wuffs_base__color_u32_argb_premul  //
4332
0
wuffs_base__color_ycc__as__color_u32(uint8_t yy, uint8_t cb, uint8_t cr) {
4333
  // Work in 16.16 fixed point arithmetic (so that 'one half' is (1 << 15)) and
4334
  // bias the chroma values by 0x80.
4335
0
  uint32_t yy32 = (((uint32_t)yy) << 16) | (1 << 15);
4336
0
  uint32_t cb32 = (((uint32_t)cb) - 0x80);
4337
0
  uint32_t cr32 = (((uint32_t)cr) - 0x80);
4338
4339
  // The formulae:
4340
  //
4341
  //  R = Y                + 1.40200 * Cr
4342
  //  G = Y - 0.34414 * Cb - 0.71414 * Cr
4343
  //  B = Y + 1.77200 * Cb
4344
  //
4345
  // When scaled by 1<<16:
4346
  //
4347
  //  0.34414 becomes 0x0581A =  22554.
4348
  //  0.71414 becomes 0x0B6D2 =  46802.
4349
  //  1.40200 becomes 0x166E9 =  91881.
4350
  //  1.77200 becomes 0x1C5A2 = 116130.
4351
  //
4352
  // Since we're working in 16.16 fixed point arithmetic, masking by 0x00FF0000
4353
  // (possibly followed by a shift) gives the relevant 8 bits per channel.
4354
  //
4355
  // However, we need to saturate for overflow (above 0x00FFFFFF, but not so
4356
  // high that the MSB Most Significant Bit is set) or for underflow (below
4357
  // 0x00000000 as int32_t, which means that the MSB is set as uint32_t). In
4358
  // both cases, some of the high 8 bits (bits 24 ..= 31) will be set.
4359
  //
4360
  // "((uint32_t)(((int32_t)x) >> 31))" just replicates x's MSB across all 32
4361
  // bits. Prepending that with "~" inverts those bits. Thus, "~(etc)" is
4362
  // either 0xFFFFFFFF (for overflow) or 0x00000000 (for underflow).
4363
0
  uint32_t rr32 = yy32 + (0x166E9 * cr32);
4364
0
  uint32_t gg32 = yy32 - (0x0581A * cb32) - (0x0B6D2 * cr32);
4365
0
  uint32_t bb32 = yy32 + (0x1C5A2 * cb32);
4366
0
  if (rr32 >> 24) {
4367
0
    rr32 = ~((uint32_t)(((int32_t)rr32) >> 31));
4368
0
  }
4369
0
  if (gg32 >> 24) {
4370
0
    gg32 = ~((uint32_t)(((int32_t)gg32) >> 31));
4371
0
  }
4372
0
  if (bb32 >> 24) {
4373
0
    bb32 = ~((uint32_t)(((int32_t)bb32) >> 31));
4374
0
  }
4375
0
  return 0xFF000000 |                  //
4376
0
         ((0x00FF0000 & rr32) >> 0) |  //
4377
0
         ((0x00FF0000 & gg32) >> 8) |  //
4378
0
         ((0x00FF0000 & bb32) >> 16);
4379
0
}
4380
4381
// wuffs_base__color_ycc__as__color_u32_abgr is like
4382
// wuffs_base__color_ycc__as__color_u32 but the uint32_t returned is in
4383
// 0xAABBGGRR order, not 0xAARRGGBB.
4384
static inline uint32_t  //
4385
0
wuffs_base__color_ycc__as__color_u32_abgr(uint8_t yy, uint8_t cb, uint8_t cr) {
4386
0
  uint32_t yy32 = (((uint32_t)yy) << 16) | (1 << 15);
4387
0
  uint32_t cb32 = (((uint32_t)cb) - 0x80);
4388
0
  uint32_t cr32 = (((uint32_t)cr) - 0x80);
4389
0
  uint32_t rr32 = yy32 + (0x166E9 * cr32);
4390
0
  uint32_t gg32 = yy32 - (0x0581A * cb32) - (0x0B6D2 * cr32);
4391
0
  uint32_t bb32 = yy32 + (0x1C5A2 * cb32);
4392
0
  if (rr32 >> 24) {
4393
0
    rr32 = ~((uint32_t)(((int32_t)rr32) >> 31));
4394
0
  }
4395
0
  if (gg32 >> 24) {
4396
0
    gg32 = ~((uint32_t)(((int32_t)gg32) >> 31));
4397
0
  }
4398
0
  if (bb32 >> 24) {
4399
0
    bb32 = ~((uint32_t)(((int32_t)bb32) >> 31));
4400
0
  }
4401
0
  return 0xFF000000 |                  //
4402
0
         ((0x00FF0000 & bb32) >> 0) |  //
4403
0
         ((0x00FF0000 & gg32) >> 8) |  //
4404
0
         ((0x00FF0000 & rr32) >> 16);
4405
0
}
4406
4407
// --------
4408
4409
typedef uint8_t wuffs_base__pixel_blend;
4410
4411
// wuffs_base__pixel_blend encodes how to blend source and destination pixels,
4412
// accounting for transparency. It encompasses the Porter-Duff compositing
4413
// operators as well as the other blending modes defined by PDF.
4414
//
4415
// TODO: implement the other modes.
4416
16.3k
#define WUFFS_BASE__PIXEL_BLEND__SRC ((wuffs_base__pixel_blend)0)
4417
0
#define WUFFS_BASE__PIXEL_BLEND__SRC_OVER ((wuffs_base__pixel_blend)1)
4418
4419
// --------
4420
4421
// wuffs_base__pixel_alpha_transparency is a pixel format's alpha channel
4422
// model. It is a property of the pixel format in general, not of a specific
4423
// pixel. An RGBA pixel format (with alpha) can still have fully opaque pixels.
4424
typedef uint32_t wuffs_base__pixel_alpha_transparency;
4425
4426
0
#define WUFFS_BASE__PIXEL_ALPHA_TRANSPARENCY__OPAQUE 0
4427
#define WUFFS_BASE__PIXEL_ALPHA_TRANSPARENCY__NONPREMULTIPLIED_ALPHA 1
4428
#define WUFFS_BASE__PIXEL_ALPHA_TRANSPARENCY__PREMULTIPLIED_ALPHA 2
4429
#define WUFFS_BASE__PIXEL_ALPHA_TRANSPARENCY__BINARY_ALPHA 3
4430
4431
// --------
4432
4433
// wuffs_base__pixel_coloration is whether a pixel format's color model has no
4434
// color (alpha only), gray color or rich (non-gray) color. Rich color includes
4435
// RGB, BGR, YCC, YCCK, CMY and CMYK.
4436
//
4437
// Coloration does not capture the alpha aspect of the color model. It does not
4438
// distinguish RGB from RGBA.
4439
typedef uint32_t wuffs_base__pixel_coloration;
4440
4441
#define WUFFS_BASE__PIXEL_COLORATION__NONE 0
4442
#define WUFFS_BASE__PIXEL_COLORATION__GRAY 1
4443
#define WUFFS_BASE__PIXEL_COLORATION__RICH 3
4444
4445
// --------
4446
4447
// Deprecated: use WUFFS_BASE__PIXEL_FORMAT__NUM_PLANES_MAX_INCL.
4448
#define WUFFS_BASE__PIXEL_FORMAT__NUM_PLANES_MAX 4
4449
4450
9.55k
#define WUFFS_BASE__PIXEL_FORMAT__NUM_PLANES_MAX_INCL 4
4451
4452
#define WUFFS_BASE__PIXEL_FORMAT__INDEXED__INDEX_PLANE 0
4453
1.18k
#define WUFFS_BASE__PIXEL_FORMAT__INDEXED__COLOR_PLANE 3
4454
4455
// A palette is 256 entries ร— 4 bytes per entry (e.g. BGRA).
4456
922k
#define WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH 1024
4457
4458
// wuffs_base__pixel_format encodes the format of the bytes that constitute an
4459
// image frame's pixel data.
4460
//
4461
// See https://github.com/google/wuffs/blob/main/doc/note/pixel-formats.md
4462
//
4463
// Do not manipulate its bits directly; they are private implementation
4464
// details. Use methods such as wuffs_base__pixel_format__num_planes instead.
4465
typedef struct wuffs_base__pixel_format__struct {
4466
  uint32_t repr;
4467
4468
#ifdef __cplusplus
4469
  inline bool is_valid() const;
4470
  inline uint32_t bits_per_pixel() const;
4471
  inline uint32_t default_background_color() const;
4472
  inline bool is_direct() const;
4473
  inline bool is_indexed() const;
4474
  inline bool is_interleaved() const;
4475
  inline bool is_planar() const;
4476
  inline uint32_t coloration() const;
4477
  inline uint32_t num_planes() const;
4478
  inline wuffs_base__pixel_alpha_transparency transparency() const;
4479
#endif  // __cplusplus
4480
4481
} wuffs_base__pixel_format;
4482
4483
static inline wuffs_base__pixel_format  //
4484
12.7k
wuffs_base__make_pixel_format(uint32_t repr) {
4485
12.7k
  wuffs_base__pixel_format f;
4486
12.7k
  f.repr = repr;
4487
12.7k
  return f;
4488
12.7k
}
4489
4490
// Common 8-bit-depth pixel formats. This list is not exhaustive; not all valid
4491
// wuffs_base__pixel_format values are present.
4492
4493
// clang-format off
4494
4495
0
#define WUFFS_BASE__PIXEL_FORMAT__INVALID                   0x00000000
4496
4497
#define WUFFS_BASE__PIXEL_FORMAT__A                         0x02000008
4498
4499
2.08k
#define WUFFS_BASE__PIXEL_FORMAT__Y                         0x20000008
4500
93
#define WUFFS_BASE__PIXEL_FORMAT__Y_16LE                    0x2000000B
4501
184
#define WUFFS_BASE__PIXEL_FORMAT__Y_16BE                    0x2010000B
4502
168
#define WUFFS_BASE__PIXEL_FORMAT__YA_NONPREMUL              0x21000088
4503
#define WUFFS_BASE__PIXEL_FORMAT__YA_PREMUL                 0x22000088
4504
#define WUFFS_BASE__PIXEL_FORMAT__YXXX                      0x30008888
4505
4506
#define WUFFS_BASE__PIXEL_FORMAT__YCBCR                     0x40020888
4507
#define WUFFS_BASE__PIXEL_FORMAT__YCBCRA_NONPREMUL          0x41038888
4508
#define WUFFS_BASE__PIXEL_FORMAT__YCBCRK                    0x50038888
4509
4510
#define WUFFS_BASE__PIXEL_FORMAT__YCOCG                     0x60020888
4511
#define WUFFS_BASE__PIXEL_FORMAT__YCOCGA_NONPREMUL          0x61038888
4512
#define WUFFS_BASE__PIXEL_FORMAT__YCOCGK                    0x70038888
4513
4514
387
#define WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL   0x81040008
4515
0
#define WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL      0x82040008
4516
1.43k
#define WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY      0x83040008
4517
4518
0
#define WUFFS_BASE__PIXEL_FORMAT__BGR_565                   0x80000565
4519
528
#define WUFFS_BASE__PIXEL_FORMAT__BGR                       0x80000888
4520
946
#define WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL            0x81008888
4521
786
#define WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE     0x8100BBBB
4522
5.33k
#define WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL               0x82008888
4523
0
#define WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE        0x8200BBBB
4524
1.95k
#define WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY               0x83008888
4525
1.35k
#define WUFFS_BASE__PIXEL_FORMAT__BGRX                      0x90008888
4526
4527
1.12k
#define WUFFS_BASE__PIXEL_FORMAT__RGB                       0xA0000888
4528
2.26k
#define WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL            0xA1008888
4529
0
#define WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL_4X16LE     0xA100BBBB
4530
824
#define WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL               0xA2008888
4531
0
#define WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL_4X16LE        0xA200BBBB
4532
762
#define WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY               0xA3008888
4533
762
#define WUFFS_BASE__PIXEL_FORMAT__RGBX                      0xB0008888
4534
4535
#define WUFFS_BASE__PIXEL_FORMAT__CMY                       0xC0020888
4536
#define WUFFS_BASE__PIXEL_FORMAT__CMYK                      0xD0038888
4537
4538
// clang-format on
4539
4540
extern const uint32_t wuffs_private_impl__pixel_format__bits_per_channel[16];
4541
4542
static inline bool  //
4543
0
wuffs_base__pixel_format__is_valid(const wuffs_base__pixel_format* f) {
4544
0
  return f->repr != 0;
4545
0
}
4546
4547
// wuffs_base__pixel_format__bits_per_pixel returns the number of bits per
4548
// pixel for interleaved pixel formats, and returns 0 for planar pixel formats.
4549
static inline uint32_t  //
4550
30.1k
wuffs_base__pixel_format__bits_per_pixel(const wuffs_base__pixel_format* f) {
4551
30.1k
  if (((f->repr >> 16) & 0x03) != 0) {
4552
0
    return 0;
4553
0
  }
4554
30.1k
  return wuffs_private_impl__pixel_format__bits_per_channel[0x0F &
4555
30.1k
                                                            (f->repr >> 0)] +
4556
30.1k
         wuffs_private_impl__pixel_format__bits_per_channel[0x0F &
4557
30.1k
                                                            (f->repr >> 4)] +
4558
30.1k
         wuffs_private_impl__pixel_format__bits_per_channel[0x0F &
4559
30.1k
                                                            (f->repr >> 8)] +
4560
30.1k
         wuffs_private_impl__pixel_format__bits_per_channel[0x0F &
4561
30.1k
                                                            (f->repr >> 12)];
4562
30.1k
}
4563
4564
static inline uint32_t  //
4565
wuffs_base__pixel_format__default_background_color(
4566
6.52k
    const wuffs_base__pixel_format* f) {
4567
6.52k
  return ((f->repr & 0x03000000) == 0) ? 0xFF000000   // Opaque black.
4568
6.52k
                                       : 0x00000000;  // Transparent black.
4569
6.52k
}
4570
4571
static inline bool  //
4572
0
wuffs_base__pixel_format__is_direct(const wuffs_base__pixel_format* f) {
4573
0
  return ((f->repr >> 18) & 0x01) == 0;
4574
0
}
4575
4576
static inline bool  //
4577
23.8k
wuffs_base__pixel_format__is_indexed(const wuffs_base__pixel_format* f) {
4578
23.8k
  return ((f->repr >> 18) & 0x01) != 0;
4579
23.8k
}
4580
4581
static inline bool  //
4582
0
wuffs_base__pixel_format__is_interleaved(const wuffs_base__pixel_format* f) {
4583
0
  return ((f->repr >> 16) & 0x03) == 0;
4584
0
}
4585
4586
static inline bool  //
4587
8.06k
wuffs_base__pixel_format__is_planar(const wuffs_base__pixel_format* f) {
4588
8.06k
  return ((f->repr >> 16) & 0x03) != 0;
4589
8.06k
}
4590
4591
static inline uint32_t  //
4592
0
wuffs_base__pixel_format__coloration(const wuffs_base__pixel_format* f) {
4593
0
  uint32_t n = (f->repr) >> 29;
4594
0
  return (n <= 1) ? n : 3;
4595
0
}
4596
4597
static inline uint32_t  //
4598
0
wuffs_base__pixel_format__num_planes(const wuffs_base__pixel_format* f) {
4599
0
  return ((f->repr >> 16) & 0x03) + 1;
4600
0
}
4601
4602
static inline wuffs_base__pixel_alpha_transparency  //
4603
0
wuffs_base__pixel_format__transparency(const wuffs_base__pixel_format* f) {
4604
0
  return (wuffs_base__pixel_alpha_transparency)((f->repr >> 24) & 0x03);
4605
0
}
4606
4607
#ifdef __cplusplus
4608
4609
inline bool  //
4610
wuffs_base__pixel_format::is_valid() const {
4611
  return wuffs_base__pixel_format__is_valid(this);
4612
}
4613
4614
inline uint32_t  //
4615
wuffs_base__pixel_format::bits_per_pixel() const {
4616
  return wuffs_base__pixel_format__bits_per_pixel(this);
4617
}
4618
4619
inline uint32_t  //
4620
wuffs_base__pixel_format::default_background_color() const {
4621
  return wuffs_base__pixel_format__default_background_color(this);
4622
}
4623
4624
inline bool  //
4625
wuffs_base__pixel_format::is_direct() const {
4626
  return wuffs_base__pixel_format__is_direct(this);
4627
}
4628
4629
inline bool  //
4630
wuffs_base__pixel_format::is_indexed() const {
4631
  return wuffs_base__pixel_format__is_indexed(this);
4632
}
4633
4634
inline bool  //
4635
wuffs_base__pixel_format::is_interleaved() const {
4636
  return wuffs_base__pixel_format__is_interleaved(this);
4637
}
4638
4639
inline bool  //
4640
wuffs_base__pixel_format::is_planar() const {
4641
  return wuffs_base__pixel_format__is_planar(this);
4642
}
4643
4644
inline uint32_t  //
4645
wuffs_base__pixel_format::coloration() const {
4646
  return wuffs_base__pixel_format__coloration(this);
4647
}
4648
4649
inline uint32_t  //
4650
wuffs_base__pixel_format::num_planes() const {
4651
  return wuffs_base__pixel_format__num_planes(this);
4652
}
4653
4654
inline wuffs_base__pixel_alpha_transparency  //
4655
wuffs_base__pixel_format::transparency() const {
4656
  return wuffs_base__pixel_format__transparency(this);
4657
}
4658
4659
#endif  // __cplusplus
4660
4661
// --------
4662
4663
// wuffs_base__pixel_subsampling encodes whether sample values cover one pixel
4664
// or cover multiple pixels.
4665
//
4666
// See https://github.com/google/wuffs/blob/main/doc/note/pixel-subsampling.md
4667
//
4668
// Do not manipulate its bits directly; they are private implementation
4669
// details. Use methods such as wuffs_base__pixel_subsampling__bias_x instead.
4670
typedef struct wuffs_base__pixel_subsampling__struct {
4671
  uint32_t repr;
4672
4673
#ifdef __cplusplus
4674
  inline uint32_t bias_x(uint32_t plane) const;
4675
  inline uint32_t denominator_x(uint32_t plane) const;
4676
  inline uint32_t bias_y(uint32_t plane) const;
4677
  inline uint32_t denominator_y(uint32_t plane) const;
4678
#endif  // __cplusplus
4679
4680
} wuffs_base__pixel_subsampling;
4681
4682
static inline wuffs_base__pixel_subsampling  //
4683
0
wuffs_base__make_pixel_subsampling(uint32_t repr) {
4684
0
  wuffs_base__pixel_subsampling s;
4685
0
  s.repr = repr;
4686
0
  return s;
4687
0
}
4688
4689
2.06k
#define WUFFS_BASE__PIXEL_SUBSAMPLING__NONE 0x00000000
4690
4691
#define WUFFS_BASE__PIXEL_SUBSAMPLING__444 0x000000
4692
#define WUFFS_BASE__PIXEL_SUBSAMPLING__440 0x010100
4693
#define WUFFS_BASE__PIXEL_SUBSAMPLING__422 0x101000
4694
#define WUFFS_BASE__PIXEL_SUBSAMPLING__420 0x111100
4695
#define WUFFS_BASE__PIXEL_SUBSAMPLING__411 0x303000
4696
#define WUFFS_BASE__PIXEL_SUBSAMPLING__410 0x313100
4697
4698
static inline uint32_t  //
4699
wuffs_base__pixel_subsampling__bias_x(const wuffs_base__pixel_subsampling* s,
4700
0
                                      uint32_t plane) {
4701
0
  uint32_t shift = ((plane & 0x03) * 8) + 6;
4702
0
  return (s->repr >> shift) & 0x03;
4703
0
}
4704
4705
static inline uint32_t  //
4706
wuffs_base__pixel_subsampling__denominator_x(
4707
    const wuffs_base__pixel_subsampling* s,
4708
0
    uint32_t plane) {
4709
0
  uint32_t shift = ((plane & 0x03) * 8) + 4;
4710
0
  return ((s->repr >> shift) & 0x03) + 1;
4711
0
}
4712
4713
static inline uint32_t  //
4714
wuffs_base__pixel_subsampling__bias_y(const wuffs_base__pixel_subsampling* s,
4715
0
                                      uint32_t plane) {
4716
0
  uint32_t shift = ((plane & 0x03) * 8) + 2;
4717
0
  return (s->repr >> shift) & 0x03;
4718
0
}
4719
4720
static inline uint32_t  //
4721
wuffs_base__pixel_subsampling__denominator_y(
4722
    const wuffs_base__pixel_subsampling* s,
4723
0
    uint32_t plane) {
4724
0
  uint32_t shift = ((plane & 0x03) * 8) + 0;
4725
0
  return ((s->repr >> shift) & 0x03) + 1;
4726
0
}
4727
4728
#ifdef __cplusplus
4729
4730
inline uint32_t  //
4731
wuffs_base__pixel_subsampling::bias_x(uint32_t plane) const {
4732
  return wuffs_base__pixel_subsampling__bias_x(this, plane);
4733
}
4734
4735
inline uint32_t  //
4736
wuffs_base__pixel_subsampling::denominator_x(uint32_t plane) const {
4737
  return wuffs_base__pixel_subsampling__denominator_x(this, plane);
4738
}
4739
4740
inline uint32_t  //
4741
wuffs_base__pixel_subsampling::bias_y(uint32_t plane) const {
4742
  return wuffs_base__pixel_subsampling__bias_y(this, plane);
4743
}
4744
4745
inline uint32_t  //
4746
wuffs_base__pixel_subsampling::denominator_y(uint32_t plane) const {
4747
  return wuffs_base__pixel_subsampling__denominator_y(this, plane);
4748
}
4749
4750
#endif  // __cplusplus
4751
4752
// --------
4753
4754
typedef struct wuffs_base__pixel_config__struct {
4755
  // Do not access the private_impl's fields directly. There is no API/ABI
4756
  // compatibility or safety guarantee if you do so.
4757
  struct {
4758
    wuffs_base__pixel_format pixfmt;
4759
    wuffs_base__pixel_subsampling pixsub;
4760
    uint32_t width;
4761
    uint32_t height;
4762
  } private_impl;
4763
4764
#ifdef __cplusplus
4765
  inline void set(uint32_t pixfmt_repr,
4766
                  uint32_t pixsub_repr,
4767
                  uint32_t width,
4768
                  uint32_t height);
4769
  inline void invalidate();
4770
  inline bool is_valid() const;
4771
  inline wuffs_base__pixel_format pixel_format() const;
4772
  inline wuffs_base__pixel_subsampling pixel_subsampling() const;
4773
  inline wuffs_base__rect_ie_u32 bounds() const;
4774
  inline uint32_t width() const;
4775
  inline uint32_t height() const;
4776
  inline uint64_t pixbuf_len() const;
4777
#endif  // __cplusplus
4778
4779
} wuffs_base__pixel_config;
4780
4781
static inline wuffs_base__pixel_config  //
4782
0
wuffs_base__null_pixel_config(void) {
4783
0
  wuffs_base__pixel_config ret;
4784
0
  ret.private_impl.pixfmt.repr = 0;
4785
0
  ret.private_impl.pixsub.repr = 0;
4786
0
  ret.private_impl.width = 0;
4787
0
  ret.private_impl.height = 0;
4788
0
  return ret;
4789
0
}
4790
4791
// TODO: Should this function return bool? An error type?
4792
static inline void  //
4793
wuffs_base__pixel_config__set(wuffs_base__pixel_config* c,
4794
                              uint32_t pixfmt_repr,
4795
                              uint32_t pixsub_repr,
4796
                              uint32_t width,
4797
2.06k
                              uint32_t height) {
4798
2.06k
  if (!c) {
4799
0
    return;
4800
0
  }
4801
2.06k
  if (pixfmt_repr) {
4802
2.06k
    do {
4803
#if SIZE_MAX < 0xFFFFFFFFFFFFFFFFull
4804
      uint64_t wh = ((uint64_t)width) * ((uint64_t)height);
4805
      // TODO: handle things other than 1 byte per pixel.
4806
      if (wh > ((uint64_t)SIZE_MAX)) {
4807
        break;
4808
      }
4809
#endif
4810
2.06k
      c->private_impl.pixfmt.repr = pixfmt_repr;
4811
2.06k
      c->private_impl.pixsub.repr = pixsub_repr;
4812
2.06k
      c->private_impl.width = width;
4813
2.06k
      c->private_impl.height = height;
4814
2.06k
      return;
4815
2.06k
    } while (0);
4816
2.06k
  }
4817
4818
0
  c->private_impl.pixfmt.repr = 0;
4819
0
  c->private_impl.pixsub.repr = 0;
4820
0
  c->private_impl.width = 0;
4821
0
  c->private_impl.height = 0;
4822
0
}
4823
4824
static inline void  //
4825
0
wuffs_base__pixel_config__invalidate(wuffs_base__pixel_config* c) {
4826
0
  if (c) {
4827
0
    c->private_impl.pixfmt.repr = 0;
4828
0
    c->private_impl.pixsub.repr = 0;
4829
0
    c->private_impl.width = 0;
4830
0
    c->private_impl.height = 0;
4831
0
  }
4832
0
}
4833
4834
static inline bool  //
4835
4.03k
wuffs_base__pixel_config__is_valid(const wuffs_base__pixel_config* c) {
4836
4.03k
  return c && c->private_impl.pixfmt.repr;
4837
4.03k
}
4838
4839
static inline wuffs_base__pixel_format  //
4840
0
wuffs_base__pixel_config__pixel_format(const wuffs_base__pixel_config* c) {
4841
0
  return c ? c->private_impl.pixfmt : wuffs_base__make_pixel_format(0);
4842
0
}
4843
4844
static inline wuffs_base__pixel_subsampling  //
4845
0
wuffs_base__pixel_config__pixel_subsampling(const wuffs_base__pixel_config* c) {
4846
0
  return c ? c->private_impl.pixsub : wuffs_base__make_pixel_subsampling(0);
4847
0
}
4848
4849
static inline wuffs_base__rect_ie_u32  //
4850
0
wuffs_base__pixel_config__bounds(const wuffs_base__pixel_config* c) {
4851
0
  if (c) {
4852
0
    wuffs_base__rect_ie_u32 ret;
4853
0
    ret.min_incl_x = 0;
4854
0
    ret.min_incl_y = 0;
4855
0
    ret.max_excl_x = c->private_impl.width;
4856
0
    ret.max_excl_y = c->private_impl.height;
4857
0
    return ret;
4858
0
  }
4859
4860
0
  wuffs_base__rect_ie_u32 ret;
4861
0
  ret.min_incl_x = 0;
4862
0
  ret.min_incl_y = 0;
4863
0
  ret.max_excl_x = 0;
4864
0
  ret.max_excl_y = 0;
4865
0
  return ret;
4866
0
}
4867
4868
static inline uint32_t  //
4869
2.06k
wuffs_base__pixel_config__width(const wuffs_base__pixel_config* c) {
4870
2.06k
  return c ? c->private_impl.width : 0;
4871
2.06k
}
4872
4873
static inline uint32_t  //
4874
2.06k
wuffs_base__pixel_config__height(const wuffs_base__pixel_config* c) {
4875
2.06k
  return c ? c->private_impl.height : 0;
4876
2.06k
}
4877
4878
// TODO: this is the right API for planar (not interleaved) pixbufs? Should it
4879
// allow decoding into a color model different from the format's intrinsic one?
4880
// For example, decoding a JPEG image straight to RGBA instead of to YCbCr?
4881
static inline uint64_t  //
4882
4.03k
wuffs_base__pixel_config__pixbuf_len(const wuffs_base__pixel_config* c) {
4883
4.03k
  if (!c) {
4884
0
    return 0;
4885
0
  }
4886
4.03k
  if (wuffs_base__pixel_format__is_planar(&c->private_impl.pixfmt)) {
4887
    // TODO: support planar pixel formats, concious of pixel subsampling.
4888
0
    return 0;
4889
0
  }
4890
4.03k
  uint32_t bits_per_pixel =
4891
4.03k
      wuffs_base__pixel_format__bits_per_pixel(&c->private_impl.pixfmt);
4892
4.03k
  if ((bits_per_pixel == 0) || ((bits_per_pixel % 8) != 0)) {
4893
    // TODO: support fraction-of-byte pixels, e.g. 1 bit per pixel?
4894
0
    return 0;
4895
0
  }
4896
4.03k
  uint64_t bytes_per_pixel = bits_per_pixel / 8;
4897
4898
4.03k
  uint64_t n =
4899
4.03k
      ((uint64_t)c->private_impl.width) * ((uint64_t)c->private_impl.height);
4900
4.03k
  if (n > (UINT64_MAX / bytes_per_pixel)) {
4901
0
    return 0;
4902
0
  }
4903
4.03k
  n *= bytes_per_pixel;
4904
4905
4.03k
  if (wuffs_base__pixel_format__is_indexed(&c->private_impl.pixfmt)) {
4906
68
    if (n >
4907
68
        (UINT64_MAX - WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH)) {
4908
0
      return 0;
4909
0
    }
4910
68
    n += WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH;
4911
68
  }
4912
4913
4.03k
  return n;
4914
4.03k
}
4915
4916
#ifdef __cplusplus
4917
4918
inline void  //
4919
wuffs_base__pixel_config::set(uint32_t pixfmt_repr,
4920
                              uint32_t pixsub_repr,
4921
                              uint32_t width,
4922
                              uint32_t height) {
4923
  wuffs_base__pixel_config__set(this, pixfmt_repr, pixsub_repr, width, height);
4924
}
4925
4926
inline void  //
4927
wuffs_base__pixel_config::invalidate() {
4928
  wuffs_base__pixel_config__invalidate(this);
4929
}
4930
4931
inline bool  //
4932
wuffs_base__pixel_config::is_valid() const {
4933
  return wuffs_base__pixel_config__is_valid(this);
4934
}
4935
4936
inline wuffs_base__pixel_format  //
4937
wuffs_base__pixel_config::pixel_format() const {
4938
  return wuffs_base__pixel_config__pixel_format(this);
4939
}
4940
4941
inline wuffs_base__pixel_subsampling  //
4942
wuffs_base__pixel_config::pixel_subsampling() const {
4943
  return wuffs_base__pixel_config__pixel_subsampling(this);
4944
}
4945
4946
inline wuffs_base__rect_ie_u32  //
4947
wuffs_base__pixel_config::bounds() const {
4948
  return wuffs_base__pixel_config__bounds(this);
4949
}
4950
4951
inline uint32_t  //
4952
wuffs_base__pixel_config::width() const {
4953
  return wuffs_base__pixel_config__width(this);
4954
}
4955
4956
inline uint32_t  //
4957
wuffs_base__pixel_config::height() const {
4958
  return wuffs_base__pixel_config__height(this);
4959
}
4960
4961
inline uint64_t  //
4962
wuffs_base__pixel_config::pixbuf_len() const {
4963
  return wuffs_base__pixel_config__pixbuf_len(this);
4964
}
4965
4966
#endif  // __cplusplus
4967
4968
// --------
4969
4970
typedef struct wuffs_base__image_config__struct {
4971
  wuffs_base__pixel_config pixcfg;
4972
4973
  // Do not access the private_impl's fields directly. There is no API/ABI
4974
  // compatibility or safety guarantee if you do so.
4975
  struct {
4976
    uint64_t first_frame_io_position;
4977
    bool first_frame_is_opaque;
4978
  } private_impl;
4979
4980
#ifdef __cplusplus
4981
  inline void set(uint32_t pixfmt_repr,
4982
                  uint32_t pixsub_repr,
4983
                  uint32_t width,
4984
                  uint32_t height,
4985
                  uint64_t first_frame_io_position,
4986
                  bool first_frame_is_opaque);
4987
  inline void invalidate();
4988
  inline bool is_valid() const;
4989
  inline uint64_t first_frame_io_position() const;
4990
  inline bool first_frame_is_opaque() const;
4991
#endif  // __cplusplus
4992
4993
} wuffs_base__image_config;
4994
4995
static inline wuffs_base__image_config  //
4996
0
wuffs_base__null_image_config(void) {
4997
0
  wuffs_base__image_config ret;
4998
0
  ret.pixcfg = wuffs_base__null_pixel_config();
4999
0
  ret.private_impl.first_frame_io_position = 0;
5000
0
  ret.private_impl.first_frame_is_opaque = false;
5001
0
  return ret;
5002
0
}
5003
5004
// TODO: Should this function return bool? An error type?
5005
static inline void  //
5006
wuffs_base__image_config__set(wuffs_base__image_config* c,
5007
                              uint32_t pixfmt_repr,
5008
                              uint32_t pixsub_repr,
5009
                              uint32_t width,
5010
                              uint32_t height,
5011
                              uint64_t first_frame_io_position,
5012
4.03k
                              bool first_frame_is_opaque) {
5013
4.03k
  if (!c) {
5014
0
    return;
5015
0
  }
5016
4.03k
  if (pixfmt_repr) {
5017
4.03k
    c->pixcfg.private_impl.pixfmt.repr = pixfmt_repr;
5018
4.03k
    c->pixcfg.private_impl.pixsub.repr = pixsub_repr;
5019
4.03k
    c->pixcfg.private_impl.width = width;
5020
4.03k
    c->pixcfg.private_impl.height = height;
5021
4.03k
    c->private_impl.first_frame_io_position = first_frame_io_position;
5022
4.03k
    c->private_impl.first_frame_is_opaque = first_frame_is_opaque;
5023
4.03k
    return;
5024
4.03k
  }
5025
5026
0
  c->pixcfg.private_impl.pixfmt.repr = 0;
5027
0
  c->pixcfg.private_impl.pixsub.repr = 0;
5028
0
  c->pixcfg.private_impl.width = 0;
5029
0
  c->pixcfg.private_impl.height = 0;
5030
0
  c->private_impl.first_frame_io_position = 0;
5031
0
  c->private_impl.first_frame_is_opaque = 0;
5032
0
}
5033
5034
static inline void  //
5035
0
wuffs_base__image_config__invalidate(wuffs_base__image_config* c) {
5036
0
  if (c) {
5037
0
    c->pixcfg.private_impl.pixfmt.repr = 0;
5038
0
    c->pixcfg.private_impl.pixsub.repr = 0;
5039
0
    c->pixcfg.private_impl.width = 0;
5040
0
    c->pixcfg.private_impl.height = 0;
5041
0
    c->private_impl.first_frame_io_position = 0;
5042
0
    c->private_impl.first_frame_is_opaque = 0;
5043
0
  }
5044
0
}
5045
5046
static inline bool  //
5047
4.03k
wuffs_base__image_config__is_valid(const wuffs_base__image_config* c) {
5048
4.03k
  return c && wuffs_base__pixel_config__is_valid(&(c->pixcfg));
5049
4.03k
}
5050
5051
static inline uint64_t  //
5052
wuffs_base__image_config__first_frame_io_position(
5053
0
    const wuffs_base__image_config* c) {
5054
0
  return c ? c->private_impl.first_frame_io_position : 0;
5055
0
}
5056
5057
static inline bool  //
5058
wuffs_base__image_config__first_frame_is_opaque(
5059
0
    const wuffs_base__image_config* c) {
5060
0
  return c ? c->private_impl.first_frame_is_opaque : false;
5061
0
}
5062
5063
#ifdef __cplusplus
5064
5065
inline void  //
5066
wuffs_base__image_config::set(uint32_t pixfmt_repr,
5067
                              uint32_t pixsub_repr,
5068
                              uint32_t width,
5069
                              uint32_t height,
5070
                              uint64_t first_frame_io_position,
5071
                              bool first_frame_is_opaque) {
5072
  wuffs_base__image_config__set(this, pixfmt_repr, pixsub_repr, width, height,
5073
                                first_frame_io_position, first_frame_is_opaque);
5074
}
5075
5076
inline void  //
5077
wuffs_base__image_config::invalidate() {
5078
  wuffs_base__image_config__invalidate(this);
5079
}
5080
5081
inline bool  //
5082
wuffs_base__image_config::is_valid() const {
5083
  return wuffs_base__image_config__is_valid(this);
5084
}
5085
5086
inline uint64_t  //
5087
wuffs_base__image_config::first_frame_io_position() const {
5088
  return wuffs_base__image_config__first_frame_io_position(this);
5089
}
5090
5091
inline bool  //
5092
wuffs_base__image_config::first_frame_is_opaque() const {
5093
  return wuffs_base__image_config__first_frame_is_opaque(this);
5094
}
5095
5096
#endif  // __cplusplus
5097
5098
// --------
5099
5100
// wuffs_base__animation_disposal encodes, for an animated image, how to
5101
// dispose of a frame after displaying it:
5102
//  - None means to draw the next frame on top of this one.
5103
//  - Restore Background means to clear the frame's dirty rectangle to "the
5104
//    background color" (in practice, this means transparent black) before
5105
//    drawing the next frame.
5106
//  - Restore Previous means to undo the current frame, so that the next frame
5107
//    is drawn on top of the previous one.
5108
typedef uint8_t wuffs_base__animation_disposal;
5109
5110
#define WUFFS_BASE__ANIMATION_DISPOSAL__NONE ((wuffs_base__animation_disposal)0)
5111
#define WUFFS_BASE__ANIMATION_DISPOSAL__RESTORE_BACKGROUND \
5112
  ((wuffs_base__animation_disposal)1)
5113
#define WUFFS_BASE__ANIMATION_DISPOSAL__RESTORE_PREVIOUS \
5114
  ((wuffs_base__animation_disposal)2)
5115
5116
// --------
5117
5118
typedef struct wuffs_base__frame_config__struct {
5119
  // Do not access the private_impl's fields directly. There is no API/ABI
5120
  // compatibility or safety guarantee if you do so.
5121
  struct {
5122
    wuffs_base__rect_ie_u32 bounds;
5123
    wuffs_base__flicks duration;
5124
    uint64_t index;
5125
    uint64_t io_position;
5126
    wuffs_base__animation_disposal disposal;
5127
    bool opaque_within_bounds;
5128
    bool overwrite_instead_of_blend;
5129
    wuffs_base__color_u32_argb_premul background_color;
5130
  } private_impl;
5131
5132
#ifdef __cplusplus
5133
  inline void set(wuffs_base__rect_ie_u32 bounds,
5134
                  wuffs_base__flicks duration,
5135
                  uint64_t index,
5136
                  uint64_t io_position,
5137
                  wuffs_base__animation_disposal disposal,
5138
                  bool opaque_within_bounds,
5139
                  bool overwrite_instead_of_blend,
5140
                  wuffs_base__color_u32_argb_premul background_color);
5141
  inline wuffs_base__rect_ie_u32 bounds() const;
5142
  inline uint32_t width() const;
5143
  inline uint32_t height() const;
5144
  inline wuffs_base__flicks duration() const;
5145
  inline uint64_t index() const;
5146
  inline uint64_t io_position() const;
5147
  inline wuffs_base__animation_disposal disposal() const;
5148
  inline bool opaque_within_bounds() const;
5149
  inline bool overwrite_instead_of_blend() const;
5150
  inline wuffs_base__color_u32_argb_premul background_color() const;
5151
#endif  // __cplusplus
5152
5153
} wuffs_base__frame_config;
5154
5155
static inline wuffs_base__frame_config  //
5156
0
wuffs_base__null_frame_config(void) {
5157
0
  wuffs_base__frame_config ret;
5158
0
  ret.private_impl.bounds = wuffs_base__make_rect_ie_u32(0, 0, 0, 0);
5159
0
  ret.private_impl.duration = 0;
5160
0
  ret.private_impl.index = 0;
5161
0
  ret.private_impl.io_position = 0;
5162
0
  ret.private_impl.disposal = 0;
5163
0
  ret.private_impl.opaque_within_bounds = false;
5164
0
  ret.private_impl.overwrite_instead_of_blend = false;
5165
0
  return ret;
5166
0
}
5167
5168
static inline void  //
5169
wuffs_base__frame_config__set(
5170
    wuffs_base__frame_config* c,
5171
    wuffs_base__rect_ie_u32 bounds,
5172
    wuffs_base__flicks duration,
5173
    uint64_t index,
5174
    uint64_t io_position,
5175
    wuffs_base__animation_disposal disposal,
5176
    bool opaque_within_bounds,
5177
    bool overwrite_instead_of_blend,
5178
6.52k
    wuffs_base__color_u32_argb_premul background_color) {
5179
6.52k
  if (!c) {
5180
0
    return;
5181
0
  }
5182
5183
6.52k
  c->private_impl.bounds = bounds;
5184
6.52k
  c->private_impl.duration = duration;
5185
6.52k
  c->private_impl.index = index;
5186
6.52k
  c->private_impl.io_position = io_position;
5187
6.52k
  c->private_impl.disposal = disposal;
5188
6.52k
  c->private_impl.opaque_within_bounds = opaque_within_bounds;
5189
6.52k
  c->private_impl.overwrite_instead_of_blend = overwrite_instead_of_blend;
5190
6.52k
  c->private_impl.background_color = background_color;
5191
6.52k
}
5192
5193
static inline wuffs_base__rect_ie_u32  //
5194
6.52k
wuffs_base__frame_config__bounds(const wuffs_base__frame_config* c) {
5195
6.52k
  if (c) {
5196
6.52k
    return c->private_impl.bounds;
5197
6.52k
  }
5198
5199
0
  wuffs_base__rect_ie_u32 ret;
5200
0
  ret.min_incl_x = 0;
5201
0
  ret.min_incl_y = 0;
5202
0
  ret.max_excl_x = 0;
5203
0
  ret.max_excl_y = 0;
5204
0
  return ret;
5205
6.52k
}
5206
5207
static inline uint32_t  //
5208
0
wuffs_base__frame_config__width(const wuffs_base__frame_config* c) {
5209
0
  return c ? wuffs_base__rect_ie_u32__width(&c->private_impl.bounds) : 0;
5210
0
}
5211
5212
static inline uint32_t  //
5213
0
wuffs_base__frame_config__height(const wuffs_base__frame_config* c) {
5214
0
  return c ? wuffs_base__rect_ie_u32__height(&c->private_impl.bounds) : 0;
5215
0
}
5216
5217
// wuffs_base__frame_config__duration returns the amount of time to display
5218
// this frame. Zero means to display forever - a still (non-animated) image.
5219
static inline wuffs_base__flicks  //
5220
0
wuffs_base__frame_config__duration(const wuffs_base__frame_config* c) {
5221
0
  return c ? c->private_impl.duration : 0;
5222
0
}
5223
5224
// wuffs_base__frame_config__index returns the index of this frame. The first
5225
// frame in an image has index 0, the second frame has index 1, and so on.
5226
static inline uint64_t  //
5227
0
wuffs_base__frame_config__index(const wuffs_base__frame_config* c) {
5228
0
  return c ? c->private_impl.index : 0;
5229
0
}
5230
5231
// wuffs_base__frame_config__io_position returns the I/O stream position before
5232
// the frame config.
5233
static inline uint64_t  //
5234
0
wuffs_base__frame_config__io_position(const wuffs_base__frame_config* c) {
5235
0
  return c ? c->private_impl.io_position : 0;
5236
0
}
5237
5238
// wuffs_base__frame_config__disposal returns, for an animated image, how to
5239
// dispose of this frame after displaying it.
5240
static inline wuffs_base__animation_disposal  //
5241
0
wuffs_base__frame_config__disposal(const wuffs_base__frame_config* c) {
5242
0
  return c ? c->private_impl.disposal : 0;
5243
0
}
5244
5245
// wuffs_base__frame_config__opaque_within_bounds returns whether all pixels
5246
// within the frame's bounds are fully opaque. It makes no claim about pixels
5247
// outside the frame bounds but still inside the overall image. The two
5248
// bounding rectangles can differ for animated images.
5249
//
5250
// Its semantics are conservative. It is valid for a fully opaque frame to have
5251
// this value be false: a false negative.
5252
//
5253
// If true, drawing the frame with WUFFS_BASE__PIXEL_BLEND__SRC and
5254
// WUFFS_BASE__PIXEL_BLEND__SRC_OVER should be equivalent, in terms of
5255
// resultant pixels, but the former may be faster.
5256
static inline bool  //
5257
wuffs_base__frame_config__opaque_within_bounds(
5258
0
    const wuffs_base__frame_config* c) {
5259
0
  return c && c->private_impl.opaque_within_bounds;
5260
0
}
5261
5262
// wuffs_base__frame_config__overwrite_instead_of_blend returns, for an
5263
// animated image, whether to ignore the previous image state (within the frame
5264
// bounds) when drawing this incremental frame. Equivalently, whether to use
5265
// WUFFS_BASE__PIXEL_BLEND__SRC instead of WUFFS_BASE__PIXEL_BLEND__SRC_OVER.
5266
//
5267
// The WebP spec (https://developers.google.com/speed/webp/docs/riff_container)
5268
// calls this the "Blending method" bit. WebP's "Do not blend" corresponds to
5269
// Wuffs' "overwrite_instead_of_blend".
5270
static inline bool  //
5271
wuffs_base__frame_config__overwrite_instead_of_blend(
5272
0
    const wuffs_base__frame_config* c) {
5273
0
  return c && c->private_impl.overwrite_instead_of_blend;
5274
0
}
5275
5276
static inline wuffs_base__color_u32_argb_premul  //
5277
0
wuffs_base__frame_config__background_color(const wuffs_base__frame_config* c) {
5278
0
  return c ? c->private_impl.background_color : 0;
5279
0
}
5280
5281
#ifdef __cplusplus
5282
5283
inline void  //
5284
wuffs_base__frame_config::set(
5285
    wuffs_base__rect_ie_u32 bounds,
5286
    wuffs_base__flicks duration,
5287
    uint64_t index,
5288
    uint64_t io_position,
5289
    wuffs_base__animation_disposal disposal,
5290
    bool opaque_within_bounds,
5291
    bool overwrite_instead_of_blend,
5292
    wuffs_base__color_u32_argb_premul background_color) {
5293
  wuffs_base__frame_config__set(this, bounds, duration, index, io_position,
5294
                                disposal, opaque_within_bounds,
5295
                                overwrite_instead_of_blend, background_color);
5296
}
5297
5298
inline wuffs_base__rect_ie_u32  //
5299
wuffs_base__frame_config::bounds() const {
5300
  return wuffs_base__frame_config__bounds(this);
5301
}
5302
5303
inline uint32_t  //
5304
wuffs_base__frame_config::width() const {
5305
  return wuffs_base__frame_config__width(this);
5306
}
5307
5308
inline uint32_t  //
5309
wuffs_base__frame_config::height() const {
5310
  return wuffs_base__frame_config__height(this);
5311
}
5312
5313
inline wuffs_base__flicks  //
5314
wuffs_base__frame_config::duration() const {
5315
  return wuffs_base__frame_config__duration(this);
5316
}
5317
5318
inline uint64_t  //
5319
wuffs_base__frame_config::index() const {
5320
  return wuffs_base__frame_config__index(this);
5321
}
5322
5323
inline uint64_t  //
5324
wuffs_base__frame_config::io_position() const {
5325
  return wuffs_base__frame_config__io_position(this);
5326
}
5327
5328
inline wuffs_base__animation_disposal  //
5329
wuffs_base__frame_config::disposal() const {
5330
  return wuffs_base__frame_config__disposal(this);
5331
}
5332
5333
inline bool  //
5334
wuffs_base__frame_config::opaque_within_bounds() const {
5335
  return wuffs_base__frame_config__opaque_within_bounds(this);
5336
}
5337
5338
inline bool  //
5339
wuffs_base__frame_config::overwrite_instead_of_blend() const {
5340
  return wuffs_base__frame_config__overwrite_instead_of_blend(this);
5341
}
5342
5343
inline wuffs_base__color_u32_argb_premul  //
5344
wuffs_base__frame_config::background_color() const {
5345
  return wuffs_base__frame_config__background_color(this);
5346
}
5347
5348
#endif  // __cplusplus
5349
5350
// --------
5351
5352
typedef struct wuffs_base__pixel_buffer__struct {
5353
  wuffs_base__pixel_config pixcfg;
5354
5355
  // Do not access the private_impl's fields directly. There is no API/ABI
5356
  // compatibility or safety guarantee if you do so.
5357
  struct {
5358
    wuffs_base__table_u8 planes[WUFFS_BASE__PIXEL_FORMAT__NUM_PLANES_MAX_INCL];
5359
    // TODO: color spaces.
5360
  } private_impl;
5361
5362
#ifdef __cplusplus
5363
  inline wuffs_base__status set_interleaved(
5364
      const wuffs_base__pixel_config* pixcfg,
5365
      wuffs_base__table_u8 primary_memory,
5366
      wuffs_base__slice_u8 palette_memory);
5367
  inline wuffs_base__status set_from_slice(
5368
      const wuffs_base__pixel_config* pixcfg,
5369
      wuffs_base__slice_u8 pixbuf_memory);
5370
  inline wuffs_base__slice_u8 palette();
5371
  inline wuffs_base__slice_u8 palette_or_else(wuffs_base__slice_u8 fallback);
5372
  inline wuffs_base__pixel_format pixel_format() const;
5373
  inline wuffs_base__table_u8 plane(uint32_t p);
5374
  inline wuffs_base__color_u32_argb_premul color_u32_at(uint32_t x,
5375
                                                        uint32_t y) const;
5376
  inline wuffs_base__status set_color_u32_at(
5377
      uint32_t x,
5378
      uint32_t y,
5379
      wuffs_base__color_u32_argb_premul color);
5380
  inline wuffs_base__status set_color_u32_fill_rect(
5381
      wuffs_base__rect_ie_u32 rect,
5382
      wuffs_base__color_u32_argb_premul color);
5383
  inline bool is_opaque();
5384
#endif  // __cplusplus
5385
5386
} wuffs_base__pixel_buffer;
5387
5388
static inline wuffs_base__pixel_buffer  //
5389
0
wuffs_base__null_pixel_buffer(void) {
5390
0
  wuffs_base__pixel_buffer ret;
5391
0
  ret.pixcfg = wuffs_base__null_pixel_config();
5392
0
  ret.private_impl.planes[0] = wuffs_base__empty_table_u8();
5393
0
  ret.private_impl.planes[1] = wuffs_base__empty_table_u8();
5394
0
  ret.private_impl.planes[2] = wuffs_base__empty_table_u8();
5395
0
  ret.private_impl.planes[3] = wuffs_base__empty_table_u8();
5396
0
  return ret;
5397
0
}
5398
5399
static inline wuffs_base__status  //
5400
wuffs_base__pixel_buffer__set_interleaved(
5401
    wuffs_base__pixel_buffer* pb,
5402
    const wuffs_base__pixel_config* pixcfg,
5403
    wuffs_base__table_u8 primary_memory,
5404
0
    wuffs_base__slice_u8 palette_memory) {
5405
0
  if (!pb) {
5406
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
5407
0
  }
5408
0
  memset(pb, 0, sizeof(*pb));
5409
0
  if (!pixcfg ||
5410
0
      wuffs_base__pixel_format__is_planar(&pixcfg->private_impl.pixfmt)) {
5411
0
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
5412
0
  }
5413
0
  if (wuffs_base__pixel_format__is_indexed(&pixcfg->private_impl.pixfmt) &&
5414
0
      (palette_memory.len <
5415
0
       WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH)) {
5416
0
    return wuffs_base__make_status(
5417
0
        wuffs_base__error__bad_argument_length_too_short);
5418
0
  }
5419
0
  uint32_t bits_per_pixel =
5420
0
      wuffs_base__pixel_format__bits_per_pixel(&pixcfg->private_impl.pixfmt);
5421
0
  if ((bits_per_pixel == 0) || ((bits_per_pixel % 8) != 0)) {
5422
0
    // TODO: support fraction-of-byte pixels, e.g. 1 bit per pixel?
5423
0
    return wuffs_base__make_status(wuffs_base__error__unsupported_option);
5424
0
  }
5425
0
  uint64_t bytes_per_pixel = bits_per_pixel / 8;
5426
0
5427
0
  uint64_t width_in_bytes =
5428
0
      ((uint64_t)pixcfg->private_impl.width) * bytes_per_pixel;
5429
0
  if ((width_in_bytes > primary_memory.width) ||
5430
0
      (pixcfg->private_impl.height > primary_memory.height)) {
5431
0
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
5432
0
  }
5433
0
5434
0
  pb->pixcfg = *pixcfg;
5435
0
  pb->private_impl.planes[0] = primary_memory;
5436
0
  if (wuffs_base__pixel_format__is_indexed(&pixcfg->private_impl.pixfmt)) {
5437
0
    wuffs_base__table_u8* tab =
5438
0
        &pb->private_impl
5439
0
             .planes[WUFFS_BASE__PIXEL_FORMAT__INDEXED__COLOR_PLANE];
5440
0
    tab->ptr = palette_memory.ptr;
5441
0
    tab->width = WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH;
5442
0
    tab->height = 1;
5443
0
    tab->stride = WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH;
5444
0
  }
5445
0
  return wuffs_base__make_status(NULL);
5446
0
}
5447
5448
static inline wuffs_base__status  //
5449
wuffs_base__pixel_buffer__set_from_slice(wuffs_base__pixel_buffer* pb,
5450
                                         const wuffs_base__pixel_config* pixcfg,
5451
4.02k
                                         wuffs_base__slice_u8 pixbuf_memory) {
5452
4.02k
  if (!pb) {
5453
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
5454
0
  }
5455
4.02k
  memset(pb, 0, sizeof(*pb));
5456
4.02k
  if (!pixcfg) {
5457
0
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
5458
0
  }
5459
4.02k
  if (wuffs_base__pixel_format__is_planar(&pixcfg->private_impl.pixfmt)) {
5460
    // TODO: support planar pixel formats, concious of pixel subsampling.
5461
0
    return wuffs_base__make_status(wuffs_base__error__unsupported_option);
5462
0
  }
5463
4.02k
  uint32_t bits_per_pixel =
5464
4.02k
      wuffs_base__pixel_format__bits_per_pixel(&pixcfg->private_impl.pixfmt);
5465
4.02k
  if ((bits_per_pixel == 0) || ((bits_per_pixel % 8) != 0)) {
5466
    // TODO: support fraction-of-byte pixels, e.g. 1 bit per pixel?
5467
0
    return wuffs_base__make_status(wuffs_base__error__unsupported_option);
5468
0
  }
5469
4.02k
  uint64_t bytes_per_pixel = bits_per_pixel / 8;
5470
5471
4.02k
  uint8_t* ptr = pixbuf_memory.ptr;
5472
4.02k
  uint64_t len = pixbuf_memory.len;
5473
4.02k
  if (wuffs_base__pixel_format__is_indexed(&pixcfg->private_impl.pixfmt)) {
5474
    // Split a WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH byte
5475
    // chunk (1024 bytes = 256 palette entries ร— 4 bytes per entry) from the
5476
    // start of pixbuf_memory. We split from the start, not the end, so that
5477
    // the both chunks' pointers have the same alignment as the original
5478
    // pointer, up to an alignment of 1024.
5479
67
    if (len < WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
5480
0
      return wuffs_base__make_status(
5481
0
          wuffs_base__error__bad_argument_length_too_short);
5482
0
    }
5483
67
    wuffs_base__table_u8* tab =
5484
67
        &pb->private_impl
5485
67
             .planes[WUFFS_BASE__PIXEL_FORMAT__INDEXED__COLOR_PLANE];
5486
67
    tab->ptr = ptr;
5487
67
    tab->width = WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH;
5488
67
    tab->height = 1;
5489
67
    tab->stride = WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH;
5490
67
    ptr += WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH;
5491
67
    len -= WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH;
5492
67
  }
5493
5494
4.02k
  uint64_t wh = ((uint64_t)pixcfg->private_impl.width) *
5495
4.02k
                ((uint64_t)pixcfg->private_impl.height);
5496
4.02k
  size_t width = (size_t)(pixcfg->private_impl.width);
5497
4.02k
  if ((wh > (UINT64_MAX / bytes_per_pixel)) ||
5498
4.02k
      (width > (SIZE_MAX / bytes_per_pixel))) {
5499
0
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
5500
0
  }
5501
4.02k
  wh *= bytes_per_pixel;
5502
4.02k
  width = ((size_t)(width * bytes_per_pixel));
5503
4.02k
  if (wh > len) {
5504
0
    return wuffs_base__make_status(
5505
0
        wuffs_base__error__bad_argument_length_too_short);
5506
0
  }
5507
5508
4.02k
  pb->pixcfg = *pixcfg;
5509
4.02k
  wuffs_base__table_u8* tab = &pb->private_impl.planes[0];
5510
4.02k
  tab->ptr = ptr;
5511
4.02k
  tab->width = width;
5512
4.02k
  tab->height = pixcfg->private_impl.height;
5513
4.02k
  tab->stride = width;
5514
4.02k
  return wuffs_base__make_status(NULL);
5515
4.02k
}
5516
5517
// wuffs_base__pixel_buffer__palette returns the palette color data. If
5518
// non-empty, it will have length
5519
// WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH.
5520
static inline wuffs_base__slice_u8  //
5521
0
wuffs_base__pixel_buffer__palette(wuffs_base__pixel_buffer* pb) {
5522
0
  if (pb &&
5523
0
      wuffs_base__pixel_format__is_indexed(&pb->pixcfg.private_impl.pixfmt)) {
5524
0
    wuffs_base__table_u8* tab =
5525
0
        &pb->private_impl
5526
0
             .planes[WUFFS_BASE__PIXEL_FORMAT__INDEXED__COLOR_PLANE];
5527
0
    if ((tab->width ==
5528
0
         WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) &&
5529
0
        (tab->height == 1)) {
5530
0
      return wuffs_base__make_slice_u8(
5531
0
          tab->ptr, WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH);
5532
0
    }
5533
0
  }
5534
0
  return wuffs_base__empty_slice_u8();
5535
0
}
5536
5537
static inline wuffs_base__slice_u8  //
5538
wuffs_base__pixel_buffer__palette_or_else(wuffs_base__pixel_buffer* pb,
5539
15.8k
                                          wuffs_base__slice_u8 fallback) {
5540
15.8k
  if (pb &&
5541
15.8k
      wuffs_base__pixel_format__is_indexed(&pb->pixcfg.private_impl.pixfmt)) {
5542
1.11k
    wuffs_base__table_u8* tab =
5543
1.11k
        &pb->private_impl
5544
1.11k
             .planes[WUFFS_BASE__PIXEL_FORMAT__INDEXED__COLOR_PLANE];
5545
1.11k
    if ((tab->width ==
5546
1.11k
         WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) &&
5547
1.11k
        (tab->height == 1)) {
5548
1.11k
      return wuffs_base__make_slice_u8(
5549
1.11k
          tab->ptr, WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH);
5550
1.11k
    }
5551
1.11k
  }
5552
14.6k
  return fallback;
5553
15.8k
}
5554
5555
static inline wuffs_base__pixel_format  //
5556
15.8k
wuffs_base__pixel_buffer__pixel_format(const wuffs_base__pixel_buffer* pb) {
5557
15.8k
  if (pb) {
5558
15.8k
    return pb->pixcfg.private_impl.pixfmt;
5559
15.8k
  }
5560
0
  return wuffs_base__make_pixel_format(WUFFS_BASE__PIXEL_FORMAT__INVALID);
5561
15.8k
}
5562
5563
static inline wuffs_base__table_u8  //
5564
9.55k
wuffs_base__pixel_buffer__plane(wuffs_base__pixel_buffer* pb, uint32_t p) {
5565
9.55k
  if (pb && (p < WUFFS_BASE__PIXEL_FORMAT__NUM_PLANES_MAX_INCL)) {
5566
9.55k
    return pb->private_impl.planes[p];
5567
9.55k
  }
5568
5569
0
  wuffs_base__table_u8 ret;
5570
0
  ret.ptr = NULL;
5571
0
  ret.width = 0;
5572
0
  ret.height = 0;
5573
0
  ret.stride = 0;
5574
0
  return ret;
5575
9.55k
}
5576
5577
WUFFS_BASE__MAYBE_STATIC wuffs_base__color_u32_argb_premul  //
5578
wuffs_base__pixel_buffer__color_u32_at(const wuffs_base__pixel_buffer* pb,
5579
                                       uint32_t x,
5580
                                       uint32_t y);
5581
5582
WUFFS_BASE__MAYBE_STATIC wuffs_base__status  //
5583
wuffs_base__pixel_buffer__set_color_u32_at(
5584
    wuffs_base__pixel_buffer* pb,
5585
    uint32_t x,
5586
    uint32_t y,
5587
    wuffs_base__color_u32_argb_premul color);
5588
5589
WUFFS_BASE__MAYBE_STATIC wuffs_base__status  //
5590
wuffs_base__pixel_buffer__set_color_u32_fill_rect(
5591
    wuffs_base__pixel_buffer* pb,
5592
    wuffs_base__rect_ie_u32 rect,
5593
    wuffs_base__color_u32_argb_premul color);
5594
5595
WUFFS_BASE__MAYBE_STATIC bool  //
5596
wuffs_base__pixel_buffer__is_opaque(const wuffs_base__pixel_buffer* pb);
5597
5598
#ifdef __cplusplus
5599
5600
inline wuffs_base__status  //
5601
wuffs_base__pixel_buffer::set_interleaved(
5602
    const wuffs_base__pixel_config* pixcfg_arg,
5603
    wuffs_base__table_u8 primary_memory,
5604
    wuffs_base__slice_u8 palette_memory) {
5605
  return wuffs_base__pixel_buffer__set_interleaved(
5606
      this, pixcfg_arg, primary_memory, palette_memory);
5607
}
5608
5609
inline wuffs_base__status  //
5610
wuffs_base__pixel_buffer::set_from_slice(
5611
    const wuffs_base__pixel_config* pixcfg_arg,
5612
    wuffs_base__slice_u8 pixbuf_memory) {
5613
  return wuffs_base__pixel_buffer__set_from_slice(this, pixcfg_arg,
5614
                                                  pixbuf_memory);
5615
}
5616
5617
inline wuffs_base__slice_u8  //
5618
wuffs_base__pixel_buffer::palette() {
5619
  return wuffs_base__pixel_buffer__palette(this);
5620
}
5621
5622
inline wuffs_base__slice_u8  //
5623
wuffs_base__pixel_buffer::palette_or_else(wuffs_base__slice_u8 fallback) {
5624
  return wuffs_base__pixel_buffer__palette_or_else(this, fallback);
5625
}
5626
5627
inline wuffs_base__pixel_format  //
5628
wuffs_base__pixel_buffer::pixel_format() const {
5629
  return wuffs_base__pixel_buffer__pixel_format(this);
5630
}
5631
5632
inline wuffs_base__table_u8  //
5633
wuffs_base__pixel_buffer::plane(uint32_t p) {
5634
  return wuffs_base__pixel_buffer__plane(this, p);
5635
}
5636
5637
inline wuffs_base__color_u32_argb_premul  //
5638
wuffs_base__pixel_buffer::color_u32_at(uint32_t x, uint32_t y) const {
5639
  return wuffs_base__pixel_buffer__color_u32_at(this, x, y);
5640
}
5641
5642
inline wuffs_base__status  //
5643
wuffs_base__pixel_buffer::set_color_u32_at(
5644
    uint32_t x,
5645
    uint32_t y,
5646
    wuffs_base__color_u32_argb_premul color) {
5647
  return wuffs_base__pixel_buffer__set_color_u32_at(this, x, y, color);
5648
}
5649
5650
inline wuffs_base__status  //
5651
wuffs_base__pixel_buffer::set_color_u32_fill_rect(
5652
    wuffs_base__rect_ie_u32 rect,
5653
    wuffs_base__color_u32_argb_premul color) {
5654
  return wuffs_base__pixel_buffer__set_color_u32_fill_rect(this, rect, color);
5655
}
5656
5657
inline bool  //
5658
wuffs_base__pixel_buffer::is_opaque() {
5659
  return wuffs_base__pixel_buffer__is_opaque(this);
5660
}
5661
5662
#endif  // __cplusplus
5663
5664
// --------
5665
5666
typedef struct wuffs_base__decode_frame_options__struct {
5667
  // Do not access the private_impl's fields directly. There is no API/ABI
5668
  // compatibility or safety guarantee if you do so.
5669
  struct {
5670
    uint8_t TODO;
5671
  } private_impl;
5672
5673
#ifdef __cplusplus
5674
#endif  // __cplusplus
5675
5676
} wuffs_base__decode_frame_options;
5677
5678
#ifdef __cplusplus
5679
5680
#endif  // __cplusplus
5681
5682
// --------
5683
5684
// wuffs_base__pixel_palette__closest_element returns the index of the palette
5685
// element that minimizes the sum of squared differences of the four ARGB
5686
// channels, working in premultiplied alpha. Ties favor the smaller index.
5687
//
5688
// The palette_slice.len may equal (N*4), for N less than 256, which means that
5689
// only the first N palette elements are considered. It returns 0 when N is 0.
5690
//
5691
// Applying this function on a per-pixel basis will not produce whole-of-image
5692
// dithering.
5693
WUFFS_BASE__MAYBE_STATIC uint8_t  //
5694
wuffs_base__pixel_palette__closest_element(
5695
    wuffs_base__slice_u8 palette_slice,
5696
    wuffs_base__pixel_format palette_format,
5697
    wuffs_base__color_u32_argb_premul c);
5698
5699
// --------
5700
5701
// TODO: should the func type take restrict pointers?
5702
typedef uint64_t (*wuffs_base__pixel_swizzler__func)(uint8_t* dst_ptr,
5703
                                                     size_t dst_len,
5704
                                                     uint8_t* dst_palette_ptr,
5705
                                                     size_t dst_palette_len,
5706
                                                     const uint8_t* src_ptr,
5707
                                                     size_t src_len);
5708
5709
typedef uint64_t (*wuffs_base__pixel_swizzler__transparent_black_func)(
5710
    uint8_t* dst_ptr,
5711
    size_t dst_len,
5712
    uint8_t* dst_palette_ptr,
5713
    size_t dst_palette_len,
5714
    uint64_t num_pixels,
5715
    uint32_t dst_pixfmt_bytes_per_pixel);
5716
5717
typedef struct wuffs_base__pixel_swizzler__struct {
5718
  // Do not access the private_impl's fields directly. There is no API/ABI
5719
  // compatibility or safety guarantee if you do so.
5720
  struct {
5721
    wuffs_base__pixel_swizzler__func func;
5722
    wuffs_base__pixel_swizzler__transparent_black_func transparent_black_func;
5723
    uint32_t dst_pixfmt_bytes_per_pixel;
5724
    uint32_t src_pixfmt_bytes_per_pixel;
5725
  } private_impl;
5726
5727
#ifdef __cplusplus
5728
  inline wuffs_base__status prepare(wuffs_base__pixel_format dst_pixfmt,
5729
                                    wuffs_base__slice_u8 dst_palette,
5730
                                    wuffs_base__pixel_format src_pixfmt,
5731
                                    wuffs_base__slice_u8 src_palette,
5732
                                    wuffs_base__pixel_blend blend);
5733
  inline uint64_t swizzle_interleaved_from_slice(
5734
      wuffs_base__slice_u8 dst,
5735
      wuffs_base__slice_u8 dst_palette,
5736
      wuffs_base__slice_u8 src) const;
5737
#endif  // __cplusplus
5738
5739
} wuffs_base__pixel_swizzler;
5740
5741
// wuffs_base__pixel_swizzler__prepare readies the pixel swizzler so that its
5742
// other methods may be called.
5743
//
5744
// For modular builds that divide the base module into sub-modules, using this
5745
// function requires the WUFFS_CONFIG__MODULE__BASE__PIXCONV sub-module, not
5746
// just WUFFS_CONFIG__MODULE__BASE__CORE.
5747
WUFFS_BASE__MAYBE_STATIC wuffs_base__status  //
5748
wuffs_base__pixel_swizzler__prepare(wuffs_base__pixel_swizzler* p,
5749
                                    wuffs_base__pixel_format dst_pixfmt,
5750
                                    wuffs_base__slice_u8 dst_palette,
5751
                                    wuffs_base__pixel_format src_pixfmt,
5752
                                    wuffs_base__slice_u8 src_palette,
5753
                                    wuffs_base__pixel_blend blend);
5754
5755
// wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice converts pixels
5756
// from a source format to a destination format.
5757
//
5758
// For modular builds that divide the base module into sub-modules, using this
5759
// function requires the WUFFS_CONFIG__MODULE__BASE__PIXCONV sub-module, not
5760
// just WUFFS_CONFIG__MODULE__BASE__CORE.
5761
WUFFS_BASE__MAYBE_STATIC uint64_t  //
5762
wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(
5763
    const wuffs_base__pixel_swizzler* p,
5764
    wuffs_base__slice_u8 dst,
5765
    wuffs_base__slice_u8 dst_palette,
5766
    wuffs_base__slice_u8 src);
5767
5768
#ifdef __cplusplus
5769
5770
inline wuffs_base__status  //
5771
wuffs_base__pixel_swizzler::prepare(wuffs_base__pixel_format dst_pixfmt,
5772
                                    wuffs_base__slice_u8 dst_palette,
5773
                                    wuffs_base__pixel_format src_pixfmt,
5774
                                    wuffs_base__slice_u8 src_palette,
5775
                                    wuffs_base__pixel_blend blend) {
5776
  return wuffs_base__pixel_swizzler__prepare(this, dst_pixfmt, dst_palette,
5777
                                             src_pixfmt, src_palette, blend);
5778
}
5779
5780
uint64_t  //
5781
wuffs_base__pixel_swizzler::swizzle_interleaved_from_slice(
5782
    wuffs_base__slice_u8 dst,
5783
    wuffs_base__slice_u8 dst_palette,
5784
    wuffs_base__slice_u8 src) const {
5785
  return wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(
5786
      this, dst, dst_palette, src);
5787
}
5788
5789
#endif  // __cplusplus
5790
5791
// ---------------- String Conversions
5792
5793
// Options (bitwise or'ed together) for wuffs_base__parse_number_xxx
5794
// functions. The XXX options apply to both integer and floating point. The FXX
5795
// options apply only to floating point.
5796
5797
#define WUFFS_BASE__PARSE_NUMBER_XXX__DEFAULT_OPTIONS ((uint32_t)0x00000000)
5798
5799
// WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_MULTIPLE_LEADING_ZEROES means to accept
5800
// inputs like "00", "0644" and "00.7". By default, they are rejected.
5801
#define WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_MULTIPLE_LEADING_ZEROES \
5802
0
  ((uint32_t)0x00000001)
5803
5804
// WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES means to accept inputs like
5805
// "1__2" and "_3.141_592". By default, they are rejected.
5806
0
#define WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES ((uint32_t)0x00000002)
5807
5808
// WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA means to accept
5809
// "1,5" and not "1.5" as one-and-a-half.
5810
//
5811
// If the caller wants to accept either, it is responsible for canonicalizing
5812
// the input before calling wuffs_base__parse_number_fxx. The caller also has
5813
// more context on e.g. exactly how to treat something like "$1,234".
5814
#define WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA \
5815
0
  ((uint32_t)0x00000010)
5816
5817
// WUFFS_BASE__PARSE_NUMBER_FXX__REJECT_INF_AND_NAN means to reject inputs that
5818
// would lead to infinite or Not-a-Number floating point values. By default,
5819
// they are accepted.
5820
//
5821
// This affects the literal "inf" as input, but also affects inputs like
5822
// "1e999" that would overflow double-precision floating point.
5823
0
#define WUFFS_BASE__PARSE_NUMBER_FXX__REJECT_INF_AND_NAN ((uint32_t)0x00000020)
5824
5825
// --------
5826
5827
// Options (bitwise or'ed together) for wuffs_base__render_number_xxx
5828
// functions. The XXX options apply to both integer and floating point. The FXX
5829
// options apply only to floating point.
5830
5831
#define WUFFS_BASE__RENDER_NUMBER_XXX__DEFAULT_OPTIONS ((uint32_t)0x00000000)
5832
5833
// WUFFS_BASE__RENDER_NUMBER_XXX__ALIGN_RIGHT means to render to the right side
5834
// (higher indexes) of the destination slice, leaving any untouched bytes on
5835
// the left side (lower indexes). The default is vice versa: rendering on the
5836
// left with slack on the right.
5837
0
#define WUFFS_BASE__RENDER_NUMBER_XXX__ALIGN_RIGHT ((uint32_t)0x00000100)
5838
5839
// WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN means to render the leading
5840
// "+" for non-negative numbers: "+0" and "+12.3" instead of "0" and "12.3".
5841
0
#define WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN ((uint32_t)0x00000200)
5842
5843
// WUFFS_BASE__RENDER_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA means to render
5844
// one-and-a-half as "1,5" instead of "1.5".
5845
#define WUFFS_BASE__RENDER_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA \
5846
0
  ((uint32_t)0x00001000)
5847
5848
// WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_ETC means whether to never
5849
// (EXPONENT_ABSENT, equivalent to printf's "%f") or to always
5850
// (EXPONENT_PRESENT, equivalent to printf's "%e") render a floating point
5851
// number as "1.23e+05" instead of "123000".
5852
//
5853
// Having both bits set is the same has having neither bit set, where the
5854
// notation used depends on whether the exponent is sufficiently large: "0.5"
5855
// is preferred over "5e-01" but "5e-09" is preferred over "0.000000005".
5856
0
#define WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_ABSENT ((uint32_t)0x00002000)
5857
0
#define WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_PRESENT ((uint32_t)0x00004000)
5858
5859
// WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION means to render the
5860
// smallest number of digits so that parsing the resultant string will recover
5861
// the same double-precision floating point number.
5862
//
5863
// For example, double-precision cannot distinguish between 0.3 and
5864
// 0.299999999999999988897769753748434595763683319091796875, so when this bit
5865
// is set, rendering the latter will produce "0.3" but rendering
5866
// 0.3000000000000000444089209850062616169452667236328125 will produce
5867
// "0.30000000000000004".
5868
#define WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION \
5869
0
  ((uint32_t)0x00008000)
5870
5871
// ---------------- IEEE 754 Floating Point
5872
5873
// wuffs_base__ieee_754_bit_representation__etc converts between a double
5874
// precision numerical value and its IEEE 754 representations:
5875
//  - 16-bit: 1 sign bit,  5 exponent bits, 10 explicit significand bits.
5876
//  - 32-bit: 1 sign bit,  8 exponent bits, 23 explicit significand bits.
5877
//  - 64-bit: 1 sign bit, 11 exponent bits, 52 explicit significand bits.
5878
//
5879
// For example, it converts between:
5880
//  - +1.0 and 0x3C00, 0x3F80_0000 or 0x3FF0_0000_0000_0000.
5881
//  - +5.5 and 0x4580, 0x40B0_0000 or 0x4016_0000_0000_0000.
5882
//  - -inf and 0xFC00, 0xFF80_0000 or 0xFFF0_0000_0000_0000.
5883
//
5884
// Converting from f64 to shorter formats (f16 or f32, represented in C as
5885
// uint16_t and uint32_t) may be lossy. Such functions have names that look
5886
// like etc_truncate, as converting finite numbers produce equal or smaller
5887
// (closer-to-zero) finite numbers. For example, 1048576.0 is a perfectly valid
5888
// f64 number, but converting it to a f16 (with truncation) produces 65504.0,
5889
// the largest finite f16 number. Truncating a f64-typed value d to f32 does
5890
// not always produce the same result as the C-style cast ((float)d), as
5891
// casting can convert from finite numbers to infinite ones.
5892
//
5893
// Converting infinities or NaNs produces infinities or NaNs and always report
5894
// no loss, even though there a multiple NaN representations so that round-
5895
// tripping a f64-typed NaN may produce a different 64 bits. Nonetheless, the
5896
// etc_truncate functions preserve a NaN's "quiet vs signaling" bit.
5897
//
5898
// See https://en.wikipedia.org/wiki/Double-precision_floating-point_format
5899
5900
typedef struct wuffs_base__lossy_value_u16__struct {
5901
  uint16_t value;
5902
  bool lossy;
5903
} wuffs_base__lossy_value_u16;
5904
5905
typedef struct wuffs_base__lossy_value_u32__struct {
5906
  uint32_t value;
5907
  bool lossy;
5908
} wuffs_base__lossy_value_u32;
5909
5910
WUFFS_BASE__MAYBE_STATIC wuffs_base__lossy_value_u16  //
5911
wuffs_base__ieee_754_bit_representation__from_f64_to_u16_truncate(double f);
5912
5913
WUFFS_BASE__MAYBE_STATIC wuffs_base__lossy_value_u32  //
5914
wuffs_base__ieee_754_bit_representation__from_f64_to_u32_truncate(double f);
5915
5916
static inline uint64_t  //
5917
0
wuffs_base__ieee_754_bit_representation__from_f64_to_u64(double f) {
5918
0
  uint64_t u = 0;
5919
0
  if (sizeof(uint64_t) == sizeof(double)) {
5920
0
    memcpy(&u, &f, sizeof(uint64_t));
5921
0
  }
5922
0
  return u;
5923
0
}
5924
5925
static inline double  //
5926
0
wuffs_base__ieee_754_bit_representation__from_u16_to_f64(uint16_t u) {
5927
0
  uint64_t v = ((uint64_t)(u & 0x8000)) << 48;
5928
0
5929
0
  do {
5930
0
    uint64_t exp = (u >> 10) & 0x1F;
5931
0
    uint64_t man = u & 0x3FF;
5932
0
    if (exp == 0x1F) {  // Infinity or NaN.
5933
0
      exp = 2047;
5934
0
    } else if (exp != 0) {  // Normal.
5935
0
      exp += 1008;          // 1008 = 1023 - 15, the difference in biases.
5936
0
    } else if (man != 0) {  // Subnormal but non-zero.
5937
0
      uint32_t clz = wuffs_base__count_leading_zeroes_u64(man);
5938
0
      exp = 1062 - clz;  // 1062 = 1008 + 64 - 10.
5939
0
      man = 0x3FF & (man << (clz - 53));
5940
0
    } else {  // Zero.
5941
0
      break;
5942
0
    }
5943
0
    v |= (exp << 52) | (man << 42);
5944
0
  } while (0);
5945
0
5946
0
  double f = 0;
5947
0
  if (sizeof(uint64_t) == sizeof(double)) {
5948
0
    memcpy(&f, &v, sizeof(uint64_t));
5949
0
  }
5950
0
  return f;
5951
0
}
5952
5953
static inline double  //
5954
0
wuffs_base__ieee_754_bit_representation__from_u32_to_f64(uint32_t u) {
5955
0
  float f = 0;
5956
0
  if (sizeof(uint32_t) == sizeof(float)) {
5957
0
    memcpy(&f, &u, sizeof(uint32_t));
5958
0
  }
5959
0
  return (double)f;
5960
0
}
5961
5962
static inline double  //
5963
0
wuffs_base__ieee_754_bit_representation__from_u64_to_f64(uint64_t u) {
5964
0
  double f = 0;
5965
0
  if (sizeof(uint64_t) == sizeof(double)) {
5966
0
    memcpy(&f, &u, sizeof(uint64_t));
5967
0
  }
5968
0
  return f;
5969
0
}
5970
5971
// ---------------- Parsing and Rendering Numbers
5972
5973
// wuffs_base__parse_number_f64 parses the floating point number in s. For
5974
// example, if s contains the bytes "1.5" then it will return the double 1.5.
5975
//
5976
// It returns an error if s does not contain a floating point number.
5977
//
5978
// It does not necessarily return an error if the conversion is lossy, e.g. if
5979
// s is "0.3", which double-precision floating point cannot represent exactly.
5980
//
5981
// Similarly, the returned value may be infinite (and no error returned) even
5982
// if s was not "inf", when the input is nominally finite but sufficiently
5983
// larger than DBL_MAX, about 1.8e+308.
5984
//
5985
// It is similar to the C standard library's strtod function, but:
5986
//  - Errors are returned in-band (in a result type), not out-of-band (errno).
5987
//  - It takes a slice (a pointer and length), not a NUL-terminated C string.
5988
//  - It does not take an optional endptr argument. It does not allow a partial
5989
//    parse: it returns an error unless all of s is consumed.
5990
//  - It does not allow whitespace, leading or otherwise.
5991
//  - It does not allow hexadecimal floating point numbers.
5992
//  - It is not affected by i18n / l10n settings such as environment variables.
5993
//
5994
// The options argument can change these, but by default, it:
5995
//  - Allows "inf", "+Infinity" and "-NAN", case insensitive. Similarly,
5996
//    without an explicit opt-out, it would successfully parse "1e999" as
5997
//    infinity, even though it overflows double-precision floating point.
5998
//  - Rejects underscores. With an explicit opt-in, "_3.141_592" would
5999
//    successfully parse as an approximation to ฯ€.
6000
//  - Rejects unnecessary leading zeroes: "00", "0644" and "00.7".
6001
//  - Uses a dot '1.5' instead of a comma '1,5' for the decimal separator.
6002
//
6003
// For modular builds that divide the base module into sub-modules, using this
6004
// function requires the WUFFS_CONFIG__MODULE__BASE__FLOATCONV sub-module, not
6005
// just WUFFS_CONFIG__MODULE__BASE__CORE.
6006
WUFFS_BASE__MAYBE_STATIC wuffs_base__result_f64  //
6007
wuffs_base__parse_number_f64(wuffs_base__slice_u8 s, uint32_t options);
6008
6009
// wuffs_base__parse_number_i64 parses the ASCII integer in s. For example, if
6010
// s contains the bytes "-123" then it will return the int64_t -123.
6011
//
6012
// It returns an error if s does not contain an integer or if the integer
6013
// within would overflow an int64_t.
6014
//
6015
// It is similar to wuffs_base__parse_number_u64 but it returns a signed
6016
// integer, not an unsigned integer. It also allows a leading '+' or '-'.
6017
//
6018
// For modular builds that divide the base module into sub-modules, using this
6019
// function requires the WUFFS_CONFIG__MODULE__BASE__INTCONV sub-module, not
6020
// just WUFFS_CONFIG__MODULE__BASE__CORE.
6021
WUFFS_BASE__MAYBE_STATIC wuffs_base__result_i64  //
6022
wuffs_base__parse_number_i64(wuffs_base__slice_u8 s, uint32_t options);
6023
6024
// wuffs_base__parse_number_u64 parses the ASCII integer in s. For example, if
6025
// s contains the bytes "123" then it will return the uint64_t 123.
6026
//
6027
// It returns an error if s does not contain an integer or if the integer
6028
// within would overflow a uint64_t.
6029
//
6030
// It is similar to the C standard library's strtoull function, but:
6031
//  - Errors are returned in-band (in a result type), not out-of-band (errno).
6032
//  - It takes a slice (a pointer and length), not a NUL-terminated C string.
6033
//  - It does not take an optional endptr argument. It does not allow a partial
6034
//    parse: it returns an error unless all of s is consumed.
6035
//  - It does not allow whitespace, leading or otherwise.
6036
//  - It does not allow a leading '+' or '-'.
6037
//  - It does not take a base argument (e.g. base 10 vs base 16). Instead, it
6038
//    always accepts both decimal (e.g "1234", "0d5678") and hexadecimal (e.g.
6039
//    "0x9aBC"). The caller is responsible for prior filtering of e.g. hex
6040
//    numbers if they are unwanted. For example, Wuffs' JSON decoder will only
6041
//    produce a wuffs_base__token for decimal numbers, not hexadecimal.
6042
//  - It is not affected by i18n / l10n settings such as environment variables.
6043
//
6044
// The options argument can change these, but by default, it:
6045
//  - Rejects underscores. With an explicit opt-in, "__0D_1_002" would
6046
//    successfully parse as "one thousand and two". Underscores are still
6047
//    rejected inside the optional 2-byte opening "0d" or "0X" that denotes
6048
//    base-10 or base-16.
6049
//  - Rejects unnecessary leading zeroes: "00" and "0644".
6050
//
6051
// For modular builds that divide the base module into sub-modules, using this
6052
// function requires the WUFFS_CONFIG__MODULE__BASE__INTCONV sub-module, not
6053
// just WUFFS_CONFIG__MODULE__BASE__CORE.
6054
WUFFS_BASE__MAYBE_STATIC wuffs_base__result_u64  //
6055
wuffs_base__parse_number_u64(wuffs_base__slice_u8 s, uint32_t options);
6056
6057
// --------
6058
6059
// WUFFS_BASE__I64__BYTE_LENGTH__MAX_INCL is the string length of
6060
// "-9223372036854775808" and "+9223372036854775807", INT64_MIN and INT64_MAX.
6061
#define WUFFS_BASE__I64__BYTE_LENGTH__MAX_INCL 20
6062
6063
// WUFFS_BASE__U64__BYTE_LENGTH__MAX_INCL is the string length of
6064
// "+18446744073709551615", UINT64_MAX.
6065
#define WUFFS_BASE__U64__BYTE_LENGTH__MAX_INCL 21
6066
6067
// wuffs_base__render_number_f64 writes the decimal encoding of x to dst and
6068
// returns the number of bytes written. If dst is shorter than the entire
6069
// encoding, it returns 0 (and no bytes are written).
6070
//
6071
// For those familiar with C's printf or Go's fmt.Printf functions:
6072
//  - "%e" means the WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_PRESENT option.
6073
//  - "%f" means the WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_ABSENT  option.
6074
//  - "%g" means neither or both bits are set.
6075
//
6076
// The precision argument controls the number of digits rendered, excluding the
6077
// exponent (the "e+05" in "1.23e+05"):
6078
//  - for "%e" and "%f" it is the number of digits after the decimal separator,
6079
//  - for "%g" it is the number of significant digits (and trailing zeroes are
6080
//    removed).
6081
//
6082
// A precision of 6 gives similar output to printf's defaults.
6083
//
6084
// A precision greater than 4095 is equivalent to 4095.
6085
//
6086
// The precision argument is ignored when the
6087
// WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION option is set. This is
6088
// similar to Go's strconv.FormatFloat with a negative (i.e. non-sensical)
6089
// precision, but there is no corresponding feature in C's printf.
6090
//
6091
// Extreme values of x will be rendered as "NaN", "Inf" (or "+Inf" if the
6092
// WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN option is set) or "-Inf".
6093
//
6094
// For modular builds that divide the base module into sub-modules, using this
6095
// function requires the WUFFS_CONFIG__MODULE__BASE__FLOATCONV sub-module, not
6096
// just WUFFS_CONFIG__MODULE__BASE__CORE.
6097
WUFFS_BASE__MAYBE_STATIC size_t  //
6098
wuffs_base__render_number_f64(wuffs_base__slice_u8 dst,
6099
                              double x,
6100
                              uint32_t precision,
6101
                              uint32_t options);
6102
6103
// wuffs_base__render_number_i64 writes the decimal encoding of x to dst and
6104
// returns the number of bytes written. If dst is shorter than the entire
6105
// encoding, it returns 0 (and no bytes are written).
6106
//
6107
// dst will never be too short if its length is at least 20, also known as
6108
// WUFFS_BASE__I64__BYTE_LENGTH__MAX_INCL.
6109
//
6110
// For modular builds that divide the base module into sub-modules, using this
6111
// function requires the WUFFS_CONFIG__MODULE__BASE__INTCONV sub-module, not
6112
// just WUFFS_CONFIG__MODULE__BASE__CORE.
6113
WUFFS_BASE__MAYBE_STATIC size_t  //
6114
wuffs_base__render_number_i64(wuffs_base__slice_u8 dst,
6115
                              int64_t x,
6116
                              uint32_t options);
6117
6118
// wuffs_base__render_number_u64 writes the decimal encoding of x to dst and
6119
// returns the number of bytes written. If dst is shorter than the entire
6120
// encoding, it returns 0 (and no bytes are written).
6121
//
6122
// dst will never be too short if its length is at least 21, also known as
6123
// WUFFS_BASE__U64__BYTE_LENGTH__MAX_INCL.
6124
//
6125
// For modular builds that divide the base module into sub-modules, using this
6126
// function requires the WUFFS_CONFIG__MODULE__BASE__INTCONV sub-module, not
6127
// just WUFFS_CONFIG__MODULE__BASE__CORE.
6128
WUFFS_BASE__MAYBE_STATIC size_t  //
6129
wuffs_base__render_number_u64(wuffs_base__slice_u8 dst,
6130
                              uint64_t x,
6131
                              uint32_t options);
6132
6133
// ---------------- Base-16
6134
6135
// Options (bitwise or'ed together) for wuffs_base__base_16__xxx functions.
6136
6137
#define WUFFS_BASE__BASE_16__DEFAULT_OPTIONS ((uint32_t)0x00000000)
6138
6139
// wuffs_base__base_16__decode2 converts "6A6b" to "jk", where e.g. 'j' is
6140
// U+006A. There are 2 src bytes for every dst byte.
6141
//
6142
// It assumes that the src bytes are two hexadecimal digits (0-9, A-F, a-f),
6143
// repeated. It may write nonsense bytes if not, although it will not read or
6144
// write out of bounds.
6145
//
6146
// For modular builds that divide the base module into sub-modules, using this
6147
// function requires the WUFFS_CONFIG__MODULE__BASE__INTCONV sub-module, not
6148
// just WUFFS_CONFIG__MODULE__BASE__CORE.
6149
WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output  //
6150
wuffs_base__base_16__decode2(wuffs_base__slice_u8 dst,
6151
                             wuffs_base__slice_u8 src,
6152
                             bool src_closed,
6153
                             uint32_t options);
6154
6155
// wuffs_base__base_16__decode4 converts both "\\x6A\\x6b" and "??6a??6B" to
6156
// "jk", where e.g. 'j' is U+006A. There are 4 src bytes for every dst byte.
6157
//
6158
// It assumes that the src bytes are two ignored bytes and then two hexadecimal
6159
// digits (0-9, A-F, a-f), repeated. It may write nonsense bytes if not,
6160
// although it will not read or write out of bounds.
6161
//
6162
// For modular builds that divide the base module into sub-modules, using this
6163
// function requires the WUFFS_CONFIG__MODULE__BASE__INTCONV sub-module, not
6164
// just WUFFS_CONFIG__MODULE__BASE__CORE.
6165
WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output  //
6166
wuffs_base__base_16__decode4(wuffs_base__slice_u8 dst,
6167
                             wuffs_base__slice_u8 src,
6168
                             bool src_closed,
6169
                             uint32_t options);
6170
6171
// wuffs_base__base_16__encode2 converts "jk" to "6A6B", where e.g. 'j' is
6172
// U+006A. There are 2 dst bytes for every src byte.
6173
//
6174
// For modular builds that divide the base module into sub-modules, using this
6175
// function requires the WUFFS_CONFIG__MODULE__BASE__INTCONV sub-module, not
6176
// just WUFFS_CONFIG__MODULE__BASE__CORE.
6177
WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output  //
6178
wuffs_base__base_16__encode2(wuffs_base__slice_u8 dst,
6179
                             wuffs_base__slice_u8 src,
6180
                             bool src_closed,
6181
                             uint32_t options);
6182
6183
// wuffs_base__base_16__encode4 converts "jk" to "\\x6A\\x6B", where e.g. 'j'
6184
// is U+006A. There are 4 dst bytes for every src byte.
6185
//
6186
// For modular builds that divide the base module into sub-modules, using this
6187
// function requires the WUFFS_CONFIG__MODULE__BASE__INTCONV sub-module, not
6188
// just WUFFS_CONFIG__MODULE__BASE__CORE.
6189
WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output  //
6190
wuffs_base__base_16__encode4(wuffs_base__slice_u8 dst,
6191
                             wuffs_base__slice_u8 src,
6192
                             bool src_closed,
6193
                             uint32_t options);
6194
6195
// ---------------- Base-64
6196
6197
// Options (bitwise or'ed together) for wuffs_base__base_64__xxx functions.
6198
6199
#define WUFFS_BASE__BASE_64__DEFAULT_OPTIONS ((uint32_t)0x00000000)
6200
6201
// WUFFS_BASE__BASE_64__DECODE_ALLOW_PADDING means that, when decoding base-64,
6202
// the input may (but does not need to) be padded with '=' bytes so that the
6203
// overall encoded length in bytes is a multiple of 4. A successful decoding
6204
// will return a num_src that includes those padding bytes.
6205
//
6206
// Excess padding (e.g. three final '='s) will be rejected as bad data.
6207
0
#define WUFFS_BASE__BASE_64__DECODE_ALLOW_PADDING ((uint32_t)0x00000001)
6208
6209
// WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING means that, when encoding base-64,
6210
// the output will be padded with '=' bytes so that the overall encoded length
6211
// in bytes is a multiple of 4.
6212
0
#define WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING ((uint32_t)0x00000002)
6213
6214
// WUFFS_BASE__BASE_64__URL_ALPHABET means that, for base-64, the URL-friendly
6215
// and file-name-friendly alphabet be used, as per RFC 4648 section 5. When
6216
// this option bit is off, the standard alphabet from section 4 is used.
6217
0
#define WUFFS_BASE__BASE_64__URL_ALPHABET ((uint32_t)0x00000100)
6218
6219
// wuffs_base__base_64__decode transforms base-64 encoded bytes from src to
6220
// arbitrary bytes in dst.
6221
//
6222
// It will not permit line breaks or other whitespace in src. Filtering those
6223
// out is the responsibility of the caller.
6224
//
6225
// For modular builds that divide the base module into sub-modules, using this
6226
// function requires the WUFFS_CONFIG__MODULE__BASE__INTCONV sub-module, not
6227
// just WUFFS_CONFIG__MODULE__BASE__CORE.
6228
WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output  //
6229
wuffs_base__base_64__decode(wuffs_base__slice_u8 dst,
6230
                            wuffs_base__slice_u8 src,
6231
                            bool src_closed,
6232
                            uint32_t options);
6233
6234
// wuffs_base__base_64__encode transforms arbitrary bytes from src to base-64
6235
// encoded bytes in dst.
6236
//
6237
// For modular builds that divide the base module into sub-modules, using this
6238
// function requires the WUFFS_CONFIG__MODULE__BASE__INTCONV sub-module, not
6239
// just WUFFS_CONFIG__MODULE__BASE__CORE.
6240
WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output  //
6241
wuffs_base__base_64__encode(wuffs_base__slice_u8 dst,
6242
                            wuffs_base__slice_u8 src,
6243
                            bool src_closed,
6244
                            uint32_t options);
6245
6246
// ---------------- Unicode and UTF-8
6247
6248
#define WUFFS_BASE__UNICODE_CODE_POINT__MIN_INCL 0x00000000
6249
#define WUFFS_BASE__UNICODE_CODE_POINT__MAX_INCL 0x0010FFFF
6250
6251
0
#define WUFFS_BASE__UNICODE_REPLACEMENT_CHARACTER 0x0000FFFD
6252
6253
#define WUFFS_BASE__UNICODE_SURROGATE__MIN_INCL 0x0000D800
6254
#define WUFFS_BASE__UNICODE_SURROGATE__MAX_INCL 0x0000DFFF
6255
6256
#define WUFFS_BASE__ASCII__MIN_INCL 0x00
6257
#define WUFFS_BASE__ASCII__MAX_INCL 0x7F
6258
6259
#define WUFFS_BASE__UTF_8__BYTE_LENGTH__MIN_INCL 1
6260
#define WUFFS_BASE__UTF_8__BYTE_LENGTH__MAX_INCL 4
6261
6262
#define WUFFS_BASE__UTF_8__BYTE_LENGTH_1__CODE_POINT__MIN_INCL 0x00000000
6263
#define WUFFS_BASE__UTF_8__BYTE_LENGTH_1__CODE_POINT__MAX_INCL 0x0000007F
6264
#define WUFFS_BASE__UTF_8__BYTE_LENGTH_2__CODE_POINT__MIN_INCL 0x00000080
6265
#define WUFFS_BASE__UTF_8__BYTE_LENGTH_2__CODE_POINT__MAX_INCL 0x000007FF
6266
#define WUFFS_BASE__UTF_8__BYTE_LENGTH_3__CODE_POINT__MIN_INCL 0x00000800
6267
#define WUFFS_BASE__UTF_8__BYTE_LENGTH_3__CODE_POINT__MAX_INCL 0x0000FFFF
6268
#define WUFFS_BASE__UTF_8__BYTE_LENGTH_4__CODE_POINT__MIN_INCL 0x00010000
6269
#define WUFFS_BASE__UTF_8__BYTE_LENGTH_4__CODE_POINT__MAX_INCL 0x0010FFFF
6270
6271
// --------
6272
6273
// wuffs_base__utf_8__next__output is the type returned by
6274
// wuffs_base__utf_8__next.
6275
typedef struct wuffs_base__utf_8__next__output__struct {
6276
  uint32_t code_point;
6277
  uint32_t byte_length;
6278
6279
#ifdef __cplusplus
6280
  inline bool is_valid() const;
6281
#endif  // __cplusplus
6282
6283
} wuffs_base__utf_8__next__output;
6284
6285
static inline wuffs_base__utf_8__next__output  //
6286
wuffs_base__make_utf_8__next__output(uint32_t code_point,
6287
0
                                     uint32_t byte_length) {
6288
0
  wuffs_base__utf_8__next__output ret;
6289
0
  ret.code_point = code_point;
6290
0
  ret.byte_length = byte_length;
6291
0
  return ret;
6292
0
}
6293
6294
static inline bool  //
6295
wuffs_base__utf_8__next__output__is_valid(
6296
0
    const wuffs_base__utf_8__next__output* o) {
6297
0
  if (o) {
6298
0
    uint32_t cp = o->code_point;
6299
0
    switch (o->byte_length) {
6300
0
      case 1:
6301
0
        return (cp <= 0x7F);
6302
0
      case 2:
6303
0
        return (0x080 <= cp) && (cp <= 0x7FF);
6304
0
      case 3:
6305
0
        // Avoid the 0xD800 ..= 0xDFFF surrogate range.
6306
0
        return ((0x0800 <= cp) && (cp <= 0xD7FF)) ||
6307
0
               ((0xE000 <= cp) && (cp <= 0xFFFF));
6308
0
      case 4:
6309
0
        return (0x00010000 <= cp) && (cp <= 0x0010FFFF);
6310
0
    }
6311
0
  }
6312
0
  return false;
6313
0
}
6314
6315
#ifdef __cplusplus
6316
6317
inline bool  //
6318
wuffs_base__utf_8__next__output::is_valid() const {
6319
  return wuffs_base__utf_8__next__output__is_valid(this);
6320
}
6321
6322
#endif  // __cplusplus
6323
6324
// --------
6325
6326
// wuffs_base__utf_8__encode writes the UTF-8 encoding of code_point to s and
6327
// returns the number of bytes written. If code_point is invalid, or if s is
6328
// shorter than the entire encoding, it returns 0 (and no bytes are written).
6329
//
6330
// s will never be too short if its length is at least 4, also known as
6331
// WUFFS_BASE__UTF_8__BYTE_LENGTH__MAX_INCL.
6332
//
6333
// For modular builds that divide the base module into sub-modules, using this
6334
// function requires the WUFFS_CONFIG__MODULE__BASE__UTF8 sub-module, not just
6335
// WUFFS_CONFIG__MODULE__BASE__CORE.
6336
WUFFS_BASE__MAYBE_STATIC size_t  //
6337
wuffs_base__utf_8__encode(wuffs_base__slice_u8 dst, uint32_t code_point);
6338
6339
// wuffs_base__utf_8__next returns the next UTF-8 code point (and that code
6340
// point's byte length) at the start of the read-only slice (s_ptr, s_len).
6341
//
6342
// There are exactly two cases in which this function returns something where
6343
// wuffs_base__utf_8__next__output__is_valid is false:
6344
//  - If s is empty then it returns {.code_point=0, .byte_length=0}.
6345
//  - If s is non-empty and starts with invalid UTF-8 then it returns
6346
//    {.code_point=WUFFS_BASE__UNICODE_REPLACEMENT_CHARACTER, .byte_length=1}.
6347
//
6348
// Otherwise, it returns something where
6349
// wuffs_base__utf_8__next__output__is_valid is true.
6350
//
6351
// In any case, it always returns an output that satisfies both of:
6352
//  - (output.code_point  <= WUFFS_BASE__UNICODE_CODE_POINT__MAX_INCL).
6353
//  - (output.byte_length <= s_len).
6354
//
6355
// If s is a sub-slice of a larger slice of valid UTF-8, but that sub-slice
6356
// boundary occurs in the middle of a multi-byte UTF-8 encoding of a single
6357
// code point, then this function may return something invalid. It is the
6358
// caller's responsibility to split on or otherwise manage UTF-8 boundaries.
6359
//
6360
// For modular builds that divide the base module into sub-modules, using this
6361
// function requires the WUFFS_CONFIG__MODULE__BASE__UTF8 sub-module, not just
6362
// WUFFS_CONFIG__MODULE__BASE__CORE.
6363
WUFFS_BASE__MAYBE_STATIC wuffs_base__utf_8__next__output  //
6364
wuffs_base__utf_8__next(const uint8_t* s_ptr, size_t s_len);
6365
6366
// wuffs_base__utf_8__next_from_end is like wuffs_base__utf_8__next except that
6367
// it looks at the end of (s_ptr, s_len) instead of the start.
6368
//
6369
// For modular builds that divide the base module into sub-modules, using this
6370
// function requires the WUFFS_CONFIG__MODULE__BASE__UTF8 sub-module, not just
6371
// WUFFS_CONFIG__MODULE__BASE__CORE.
6372
WUFFS_BASE__MAYBE_STATIC wuffs_base__utf_8__next__output  //
6373
wuffs_base__utf_8__next_from_end(const uint8_t* s_ptr, size_t s_len);
6374
6375
// wuffs_base__utf_8__longest_valid_prefix returns the largest n such that the
6376
// sub-slice s[..n] is valid UTF-8, where s is the read-only slice (s_ptr,
6377
// s_len).
6378
//
6379
// In particular, it returns s_len if and only if all of s is valid UTF-8.
6380
//
6381
// If s is a sub-slice of a larger slice of valid UTF-8, but that sub-slice
6382
// boundary occurs in the middle of a multi-byte UTF-8 encoding of a single
6383
// code point, then this function will return less than s_len. It is the
6384
// caller's responsibility to split on or otherwise manage UTF-8 boundaries.
6385
//
6386
// For modular builds that divide the base module into sub-modules, using this
6387
// function requires the WUFFS_CONFIG__MODULE__BASE__UTF8 sub-module, not just
6388
// WUFFS_CONFIG__MODULE__BASE__CORE.
6389
WUFFS_BASE__MAYBE_STATIC size_t  //
6390
wuffs_base__utf_8__longest_valid_prefix(const uint8_t* s_ptr, size_t s_len);
6391
6392
// wuffs_base__ascii__longest_valid_prefix returns the largest n such that the
6393
// sub-slice s[..n] is valid ASCII, where s is the read-only slice (s_ptr,
6394
// s_len).
6395
//
6396
// In particular, it returns s_len if and only if all of s is valid ASCII.
6397
// Equivalently, when none of the bytes in s have the 0x80 high bit set.
6398
//
6399
// For modular builds that divide the base module into sub-modules, using this
6400
// function requires the WUFFS_CONFIG__MODULE__BASE__UTF8 sub-module, not just
6401
// WUFFS_CONFIG__MODULE__BASE__CORE.
6402
WUFFS_BASE__MAYBE_STATIC size_t  //
6403
wuffs_base__ascii__longest_valid_prefix(const uint8_t* s_ptr, size_t s_len);
6404
6405
// ---------------- Interface Declarations.
6406
6407
// For modular builds that divide the base module into sub-modules, using these
6408
// functions require the WUFFS_CONFIG__MODULE__BASE__INTERFACES sub-module, not
6409
// just WUFFS_CONFIG__MODULE__BASE__CORE.
6410
6411
// --------
6412
6413
extern const char wuffs_base__hasher_u32__vtable_name[];
6414
6415
typedef struct wuffs_base__hasher_u32__func_ptrs__struct {
6416
  uint32_t (*checksum_u32)(
6417
    const void* self);
6418
  uint64_t (*get_quirk)(
6419
    const void* self,
6420
    uint32_t a_key);
6421
  wuffs_base__status (*set_quirk)(
6422
    void* self,
6423
    uint32_t a_key,
6424
    uint64_t a_value);
6425
  wuffs_base__empty_struct (*update)(
6426
    void* self,
6427
    wuffs_base__slice_u8 a_x);
6428
  uint32_t (*update_u32)(
6429
    void* self,
6430
    wuffs_base__slice_u8 a_x);
6431
} wuffs_base__hasher_u32__func_ptrs;
6432
6433
typedef struct wuffs_base__hasher_u32__struct wuffs_base__hasher_u32;
6434
6435
WUFFS_BASE__GENERATED_C_CODE
6436
WUFFS_BASE__MAYBE_STATIC uint32_t
6437
wuffs_base__hasher_u32__checksum_u32(
6438
    const wuffs_base__hasher_u32* self);
6439
6440
WUFFS_BASE__GENERATED_C_CODE
6441
WUFFS_BASE__MAYBE_STATIC uint64_t
6442
wuffs_base__hasher_u32__get_quirk(
6443
    const wuffs_base__hasher_u32* self,
6444
    uint32_t a_key);
6445
6446
WUFFS_BASE__GENERATED_C_CODE
6447
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
6448
wuffs_base__hasher_u32__set_quirk(
6449
    wuffs_base__hasher_u32* self,
6450
    uint32_t a_key,
6451
    uint64_t a_value);
6452
6453
WUFFS_BASE__GENERATED_C_CODE
6454
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
6455
wuffs_base__hasher_u32__update(
6456
    wuffs_base__hasher_u32* self,
6457
    wuffs_base__slice_u8 a_x);
6458
6459
WUFFS_BASE__GENERATED_C_CODE
6460
WUFFS_BASE__MAYBE_STATIC uint32_t
6461
wuffs_base__hasher_u32__update_u32(
6462
    wuffs_base__hasher_u32* self,
6463
    wuffs_base__slice_u8 a_x);
6464
6465
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
6466
6467
struct wuffs_base__hasher_u32__struct {
6468
  struct {
6469
    uint32_t magic;
6470
    uint32_t active_coroutine;
6471
    wuffs_base__vtable first_vtable;
6472
  } private_impl;
6473
6474
#ifdef __cplusplus
6475
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
6476
  using unique_ptr = std::unique_ptr<wuffs_base__hasher_u32, wuffs_unique_ptr_deleter>;
6477
#endif
6478
6479
  inline uint32_t
6480
  checksum_u32() const {
6481
    return wuffs_base__hasher_u32__checksum_u32(this);
6482
  }
6483
6484
  inline uint64_t
6485
  get_quirk(
6486
      uint32_t a_key) const {
6487
    return wuffs_base__hasher_u32__get_quirk(
6488
        this, a_key);
6489
  }
6490
6491
  inline wuffs_base__status
6492
  set_quirk(
6493
      uint32_t a_key,
6494
      uint64_t a_value) {
6495
    return wuffs_base__hasher_u32__set_quirk(
6496
        this, a_key, a_value);
6497
  }
6498
6499
  inline wuffs_base__empty_struct
6500
  update(
6501
      wuffs_base__slice_u8 a_x) {
6502
    return wuffs_base__hasher_u32__update(
6503
        this, a_x);
6504
  }
6505
6506
  inline uint32_t
6507
  update_u32(
6508
      wuffs_base__slice_u8 a_x) {
6509
    return wuffs_base__hasher_u32__update_u32(
6510
        this, a_x);
6511
  }
6512
6513
#endif  // __cplusplus
6514
};  // struct wuffs_base__hasher_u32__struct
6515
6516
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
6517
6518
// --------
6519
6520
extern const char wuffs_base__hasher_u64__vtable_name[];
6521
6522
typedef struct wuffs_base__hasher_u64__func_ptrs__struct {
6523
  uint64_t (*checksum_u64)(
6524
    const void* self);
6525
  uint64_t (*get_quirk)(
6526
    const void* self,
6527
    uint32_t a_key);
6528
  wuffs_base__status (*set_quirk)(
6529
    void* self,
6530
    uint32_t a_key,
6531
    uint64_t a_value);
6532
  wuffs_base__empty_struct (*update)(
6533
    void* self,
6534
    wuffs_base__slice_u8 a_x);
6535
  uint64_t (*update_u64)(
6536
    void* self,
6537
    wuffs_base__slice_u8 a_x);
6538
} wuffs_base__hasher_u64__func_ptrs;
6539
6540
typedef struct wuffs_base__hasher_u64__struct wuffs_base__hasher_u64;
6541
6542
WUFFS_BASE__GENERATED_C_CODE
6543
WUFFS_BASE__MAYBE_STATIC uint64_t
6544
wuffs_base__hasher_u64__checksum_u64(
6545
    const wuffs_base__hasher_u64* self);
6546
6547
WUFFS_BASE__GENERATED_C_CODE
6548
WUFFS_BASE__MAYBE_STATIC uint64_t
6549
wuffs_base__hasher_u64__get_quirk(
6550
    const wuffs_base__hasher_u64* self,
6551
    uint32_t a_key);
6552
6553
WUFFS_BASE__GENERATED_C_CODE
6554
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
6555
wuffs_base__hasher_u64__set_quirk(
6556
    wuffs_base__hasher_u64* self,
6557
    uint32_t a_key,
6558
    uint64_t a_value);
6559
6560
WUFFS_BASE__GENERATED_C_CODE
6561
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
6562
wuffs_base__hasher_u64__update(
6563
    wuffs_base__hasher_u64* self,
6564
    wuffs_base__slice_u8 a_x);
6565
6566
WUFFS_BASE__GENERATED_C_CODE
6567
WUFFS_BASE__MAYBE_STATIC uint64_t
6568
wuffs_base__hasher_u64__update_u64(
6569
    wuffs_base__hasher_u64* self,
6570
    wuffs_base__slice_u8 a_x);
6571
6572
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
6573
6574
struct wuffs_base__hasher_u64__struct {
6575
  struct {
6576
    uint32_t magic;
6577
    uint32_t active_coroutine;
6578
    wuffs_base__vtable first_vtable;
6579
  } private_impl;
6580
6581
#ifdef __cplusplus
6582
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
6583
  using unique_ptr = std::unique_ptr<wuffs_base__hasher_u64, wuffs_unique_ptr_deleter>;
6584
#endif
6585
6586
  inline uint64_t
6587
  checksum_u64() const {
6588
    return wuffs_base__hasher_u64__checksum_u64(this);
6589
  }
6590
6591
  inline uint64_t
6592
  get_quirk(
6593
      uint32_t a_key) const {
6594
    return wuffs_base__hasher_u64__get_quirk(
6595
        this, a_key);
6596
  }
6597
6598
  inline wuffs_base__status
6599
  set_quirk(
6600
      uint32_t a_key,
6601
      uint64_t a_value) {
6602
    return wuffs_base__hasher_u64__set_quirk(
6603
        this, a_key, a_value);
6604
  }
6605
6606
  inline wuffs_base__empty_struct
6607
  update(
6608
      wuffs_base__slice_u8 a_x) {
6609
    return wuffs_base__hasher_u64__update(
6610
        this, a_x);
6611
  }
6612
6613
  inline uint64_t
6614
  update_u64(
6615
      wuffs_base__slice_u8 a_x) {
6616
    return wuffs_base__hasher_u64__update_u64(
6617
        this, a_x);
6618
  }
6619
6620
#endif  // __cplusplus
6621
};  // struct wuffs_base__hasher_u64__struct
6622
6623
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
6624
6625
// --------
6626
6627
extern const char wuffs_base__hasher_bitvec256__vtable_name[];
6628
6629
typedef struct wuffs_base__hasher_bitvec256__func_ptrs__struct {
6630
  wuffs_base__bitvec256 (*checksum_bitvec256)(
6631
    const void* self);
6632
  uint64_t (*get_quirk)(
6633
    const void* self,
6634
    uint32_t a_key);
6635
  wuffs_base__status (*set_quirk)(
6636
    void* self,
6637
    uint32_t a_key,
6638
    uint64_t a_value);
6639
  wuffs_base__empty_struct (*update)(
6640
    void* self,
6641
    wuffs_base__slice_u8 a_x);
6642
  wuffs_base__bitvec256 (*update_bitvec256)(
6643
    void* self,
6644
    wuffs_base__slice_u8 a_x);
6645
} wuffs_base__hasher_bitvec256__func_ptrs;
6646
6647
typedef struct wuffs_base__hasher_bitvec256__struct wuffs_base__hasher_bitvec256;
6648
6649
WUFFS_BASE__GENERATED_C_CODE
6650
WUFFS_BASE__MAYBE_STATIC wuffs_base__bitvec256
6651
wuffs_base__hasher_bitvec256__checksum_bitvec256(
6652
    const wuffs_base__hasher_bitvec256* self);
6653
6654
WUFFS_BASE__GENERATED_C_CODE
6655
WUFFS_BASE__MAYBE_STATIC uint64_t
6656
wuffs_base__hasher_bitvec256__get_quirk(
6657
    const wuffs_base__hasher_bitvec256* self,
6658
    uint32_t a_key);
6659
6660
WUFFS_BASE__GENERATED_C_CODE
6661
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
6662
wuffs_base__hasher_bitvec256__set_quirk(
6663
    wuffs_base__hasher_bitvec256* self,
6664
    uint32_t a_key,
6665
    uint64_t a_value);
6666
6667
WUFFS_BASE__GENERATED_C_CODE
6668
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
6669
wuffs_base__hasher_bitvec256__update(
6670
    wuffs_base__hasher_bitvec256* self,
6671
    wuffs_base__slice_u8 a_x);
6672
6673
WUFFS_BASE__GENERATED_C_CODE
6674
WUFFS_BASE__MAYBE_STATIC wuffs_base__bitvec256
6675
wuffs_base__hasher_bitvec256__update_bitvec256(
6676
    wuffs_base__hasher_bitvec256* self,
6677
    wuffs_base__slice_u8 a_x);
6678
6679
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
6680
6681
struct wuffs_base__hasher_bitvec256__struct {
6682
  struct {
6683
    uint32_t magic;
6684
    uint32_t active_coroutine;
6685
    wuffs_base__vtable first_vtable;
6686
  } private_impl;
6687
6688
#ifdef __cplusplus
6689
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
6690
  using unique_ptr = std::unique_ptr<wuffs_base__hasher_bitvec256, wuffs_unique_ptr_deleter>;
6691
#endif
6692
6693
  inline wuffs_base__bitvec256
6694
  checksum_bitvec256() const {
6695
    return wuffs_base__hasher_bitvec256__checksum_bitvec256(this);
6696
  }
6697
6698
  inline uint64_t
6699
  get_quirk(
6700
      uint32_t a_key) const {
6701
    return wuffs_base__hasher_bitvec256__get_quirk(
6702
        this, a_key);
6703
  }
6704
6705
  inline wuffs_base__status
6706
  set_quirk(
6707
      uint32_t a_key,
6708
      uint64_t a_value) {
6709
    return wuffs_base__hasher_bitvec256__set_quirk(
6710
        this, a_key, a_value);
6711
  }
6712
6713
  inline wuffs_base__empty_struct
6714
  update(
6715
      wuffs_base__slice_u8 a_x) {
6716
    return wuffs_base__hasher_bitvec256__update(
6717
        this, a_x);
6718
  }
6719
6720
  inline wuffs_base__bitvec256
6721
  update_bitvec256(
6722
      wuffs_base__slice_u8 a_x) {
6723
    return wuffs_base__hasher_bitvec256__update_bitvec256(
6724
        this, a_x);
6725
  }
6726
6727
#endif  // __cplusplus
6728
};  // struct wuffs_base__hasher_bitvec256__struct
6729
6730
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
6731
6732
// --------
6733
6734
extern const char wuffs_base__image_decoder__vtable_name[];
6735
6736
typedef struct wuffs_base__image_decoder__func_ptrs__struct {
6737
  wuffs_base__status (*decode_frame)(
6738
    void* self,
6739
    wuffs_base__pixel_buffer* a_dst,
6740
    wuffs_base__io_buffer* a_src,
6741
    wuffs_base__pixel_blend a_blend,
6742
    wuffs_base__slice_u8 a_workbuf,
6743
    wuffs_base__decode_frame_options* a_opts);
6744
  wuffs_base__status (*decode_frame_config)(
6745
    void* self,
6746
    wuffs_base__frame_config* a_dst,
6747
    wuffs_base__io_buffer* a_src);
6748
  wuffs_base__status (*decode_image_config)(
6749
    void* self,
6750
    wuffs_base__image_config* a_dst,
6751
    wuffs_base__io_buffer* a_src);
6752
  wuffs_base__rect_ie_u32 (*frame_dirty_rect)(
6753
    const void* self);
6754
  uint64_t (*get_quirk)(
6755
    const void* self,
6756
    uint32_t a_key);
6757
  uint32_t (*num_animation_loops)(
6758
    const void* self);
6759
  uint64_t (*num_decoded_frame_configs)(
6760
    const void* self);
6761
  uint64_t (*num_decoded_frames)(
6762
    const void* self);
6763
  wuffs_base__status (*restart_frame)(
6764
    void* self,
6765
    uint64_t a_index,
6766
    uint64_t a_io_position);
6767
  wuffs_base__status (*set_quirk)(
6768
    void* self,
6769
    uint32_t a_key,
6770
    uint64_t a_value);
6771
  wuffs_base__empty_struct (*set_report_metadata)(
6772
    void* self,
6773
    uint32_t a_fourcc,
6774
    bool a_report);
6775
  wuffs_base__status (*tell_me_more)(
6776
    void* self,
6777
    wuffs_base__io_buffer* a_dst,
6778
    wuffs_base__more_information* a_minfo,
6779
    wuffs_base__io_buffer* a_src);
6780
  wuffs_base__range_ii_u64 (*workbuf_len)(
6781
    const void* self);
6782
} wuffs_base__image_decoder__func_ptrs;
6783
6784
typedef struct wuffs_base__image_decoder__struct wuffs_base__image_decoder;
6785
6786
WUFFS_BASE__GENERATED_C_CODE
6787
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
6788
wuffs_base__image_decoder__decode_frame(
6789
    wuffs_base__image_decoder* self,
6790
    wuffs_base__pixel_buffer* a_dst,
6791
    wuffs_base__io_buffer* a_src,
6792
    wuffs_base__pixel_blend a_blend,
6793
    wuffs_base__slice_u8 a_workbuf,
6794
    wuffs_base__decode_frame_options* a_opts);
6795
6796
WUFFS_BASE__GENERATED_C_CODE
6797
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
6798
wuffs_base__image_decoder__decode_frame_config(
6799
    wuffs_base__image_decoder* self,
6800
    wuffs_base__frame_config* a_dst,
6801
    wuffs_base__io_buffer* a_src);
6802
6803
WUFFS_BASE__GENERATED_C_CODE
6804
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
6805
wuffs_base__image_decoder__decode_image_config(
6806
    wuffs_base__image_decoder* self,
6807
    wuffs_base__image_config* a_dst,
6808
    wuffs_base__io_buffer* a_src);
6809
6810
WUFFS_BASE__GENERATED_C_CODE
6811
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
6812
wuffs_base__image_decoder__frame_dirty_rect(
6813
    const wuffs_base__image_decoder* self);
6814
6815
WUFFS_BASE__GENERATED_C_CODE
6816
WUFFS_BASE__MAYBE_STATIC uint64_t
6817
wuffs_base__image_decoder__get_quirk(
6818
    const wuffs_base__image_decoder* self,
6819
    uint32_t a_key);
6820
6821
WUFFS_BASE__GENERATED_C_CODE
6822
WUFFS_BASE__MAYBE_STATIC uint32_t
6823
wuffs_base__image_decoder__num_animation_loops(
6824
    const wuffs_base__image_decoder* self);
6825
6826
WUFFS_BASE__GENERATED_C_CODE
6827
WUFFS_BASE__MAYBE_STATIC uint64_t
6828
wuffs_base__image_decoder__num_decoded_frame_configs(
6829
    const wuffs_base__image_decoder* self);
6830
6831
WUFFS_BASE__GENERATED_C_CODE
6832
WUFFS_BASE__MAYBE_STATIC uint64_t
6833
wuffs_base__image_decoder__num_decoded_frames(
6834
    const wuffs_base__image_decoder* self);
6835
6836
WUFFS_BASE__GENERATED_C_CODE
6837
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
6838
wuffs_base__image_decoder__restart_frame(
6839
    wuffs_base__image_decoder* self,
6840
    uint64_t a_index,
6841
    uint64_t a_io_position);
6842
6843
WUFFS_BASE__GENERATED_C_CODE
6844
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
6845
wuffs_base__image_decoder__set_quirk(
6846
    wuffs_base__image_decoder* self,
6847
    uint32_t a_key,
6848
    uint64_t a_value);
6849
6850
WUFFS_BASE__GENERATED_C_CODE
6851
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
6852
wuffs_base__image_decoder__set_report_metadata(
6853
    wuffs_base__image_decoder* self,
6854
    uint32_t a_fourcc,
6855
    bool a_report);
6856
6857
WUFFS_BASE__GENERATED_C_CODE
6858
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
6859
wuffs_base__image_decoder__tell_me_more(
6860
    wuffs_base__image_decoder* self,
6861
    wuffs_base__io_buffer* a_dst,
6862
    wuffs_base__more_information* a_minfo,
6863
    wuffs_base__io_buffer* a_src);
6864
6865
WUFFS_BASE__GENERATED_C_CODE
6866
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
6867
wuffs_base__image_decoder__workbuf_len(
6868
    const wuffs_base__image_decoder* self);
6869
6870
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
6871
6872
struct wuffs_base__image_decoder__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__image_decoder, wuffs_unique_ptr_deleter>;
6882
#endif
6883
6884
  inline wuffs_base__status
6885
  decode_frame(
6886
      wuffs_base__pixel_buffer* a_dst,
6887
      wuffs_base__io_buffer* a_src,
6888
      wuffs_base__pixel_blend a_blend,
6889
      wuffs_base__slice_u8 a_workbuf,
6890
      wuffs_base__decode_frame_options* a_opts) {
6891
    return wuffs_base__image_decoder__decode_frame(
6892
        this, a_dst, a_src, a_blend, a_workbuf, a_opts);
6893
  }
6894
6895
  inline wuffs_base__status
6896
  decode_frame_config(
6897
      wuffs_base__frame_config* a_dst,
6898
      wuffs_base__io_buffer* a_src) {
6899
    return wuffs_base__image_decoder__decode_frame_config(
6900
        this, a_dst, a_src);
6901
  }
6902
6903
  inline wuffs_base__status
6904
  decode_image_config(
6905
      wuffs_base__image_config* a_dst,
6906
      wuffs_base__io_buffer* a_src) {
6907
    return wuffs_base__image_decoder__decode_image_config(
6908
        this, a_dst, a_src);
6909
  }
6910
6911
  inline wuffs_base__rect_ie_u32
6912
  frame_dirty_rect() const {
6913
    return wuffs_base__image_decoder__frame_dirty_rect(this);
6914
  }
6915
6916
  inline uint64_t
6917
  get_quirk(
6918
      uint32_t a_key) const {
6919
    return wuffs_base__image_decoder__get_quirk(
6920
        this, a_key);
6921
  }
6922
6923
  inline uint32_t
6924
  num_animation_loops() const {
6925
    return wuffs_base__image_decoder__num_animation_loops(this);
6926
  }
6927
6928
  inline uint64_t
6929
  num_decoded_frame_configs() const {
6930
    return wuffs_base__image_decoder__num_decoded_frame_configs(this);
6931
  }
6932
6933
  inline uint64_t
6934
  num_decoded_frames() const {
6935
    return wuffs_base__image_decoder__num_decoded_frames(this);
6936
  }
6937
6938
  inline wuffs_base__status
6939
  restart_frame(
6940
      uint64_t a_index,
6941
      uint64_t a_io_position) {
6942
    return wuffs_base__image_decoder__restart_frame(
6943
        this, a_index, a_io_position);
6944
  }
6945
6946
  inline wuffs_base__status
6947
  set_quirk(
6948
      uint32_t a_key,
6949
      uint64_t a_value) {
6950
    return wuffs_base__image_decoder__set_quirk(
6951
        this, a_key, a_value);
6952
  }
6953
6954
  inline wuffs_base__empty_struct
6955
  set_report_metadata(
6956
      uint32_t a_fourcc,
6957
      bool a_report) {
6958
    return wuffs_base__image_decoder__set_report_metadata(
6959
        this, a_fourcc, a_report);
6960
  }
6961
6962
  inline wuffs_base__status
6963
  tell_me_more(
6964
      wuffs_base__io_buffer* a_dst,
6965
      wuffs_base__more_information* a_minfo,
6966
      wuffs_base__io_buffer* a_src) {
6967
    return wuffs_base__image_decoder__tell_me_more(
6968
        this, a_dst, a_minfo, a_src);
6969
  }
6970
6971
  inline wuffs_base__range_ii_u64
6972
  workbuf_len() const {
6973
    return wuffs_base__image_decoder__workbuf_len(this);
6974
  }
6975
6976
#endif  // __cplusplus
6977
};  // struct wuffs_base__image_decoder__struct
6978
6979
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
6980
6981
// --------
6982
6983
extern const char wuffs_base__io_transformer__vtable_name[];
6984
6985
typedef struct wuffs_base__io_transformer__func_ptrs__struct {
6986
  wuffs_base__optional_u63 (*dst_history_retain_length)(
6987
    const void* self);
6988
  uint64_t (*get_quirk)(
6989
    const void* self,
6990
    uint32_t a_key);
6991
  wuffs_base__status (*set_quirk)(
6992
    void* self,
6993
    uint32_t a_key,
6994
    uint64_t a_value);
6995
  wuffs_base__status (*transform_io)(
6996
    void* self,
6997
    wuffs_base__io_buffer* a_dst,
6998
    wuffs_base__io_buffer* a_src,
6999
    wuffs_base__slice_u8 a_workbuf);
7000
  wuffs_base__range_ii_u64 (*workbuf_len)(
7001
    const void* self);
7002
} wuffs_base__io_transformer__func_ptrs;
7003
7004
typedef struct wuffs_base__io_transformer__struct wuffs_base__io_transformer;
7005
7006
WUFFS_BASE__GENERATED_C_CODE
7007
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
7008
wuffs_base__io_transformer__dst_history_retain_length(
7009
    const wuffs_base__io_transformer* self);
7010
7011
WUFFS_BASE__GENERATED_C_CODE
7012
WUFFS_BASE__MAYBE_STATIC uint64_t
7013
wuffs_base__io_transformer__get_quirk(
7014
    const wuffs_base__io_transformer* self,
7015
    uint32_t a_key);
7016
7017
WUFFS_BASE__GENERATED_C_CODE
7018
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
7019
wuffs_base__io_transformer__set_quirk(
7020
    wuffs_base__io_transformer* self,
7021
    uint32_t a_key,
7022
    uint64_t a_value);
7023
7024
WUFFS_BASE__GENERATED_C_CODE
7025
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
7026
wuffs_base__io_transformer__transform_io(
7027
    wuffs_base__io_transformer* self,
7028
    wuffs_base__io_buffer* a_dst,
7029
    wuffs_base__io_buffer* a_src,
7030
    wuffs_base__slice_u8 a_workbuf);
7031
7032
WUFFS_BASE__GENERATED_C_CODE
7033
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
7034
wuffs_base__io_transformer__workbuf_len(
7035
    const wuffs_base__io_transformer* self);
7036
7037
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
7038
7039
struct wuffs_base__io_transformer__struct {
7040
  struct {
7041
    uint32_t magic;
7042
    uint32_t active_coroutine;
7043
    wuffs_base__vtable first_vtable;
7044
  } private_impl;
7045
7046
#ifdef __cplusplus
7047
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
7048
  using unique_ptr = std::unique_ptr<wuffs_base__io_transformer, wuffs_unique_ptr_deleter>;
7049
#endif
7050
7051
  inline wuffs_base__optional_u63
7052
  dst_history_retain_length() const {
7053
    return wuffs_base__io_transformer__dst_history_retain_length(this);
7054
  }
7055
7056
  inline uint64_t
7057
  get_quirk(
7058
      uint32_t a_key) const {
7059
    return wuffs_base__io_transformer__get_quirk(
7060
        this, a_key);
7061
  }
7062
7063
  inline wuffs_base__status
7064
  set_quirk(
7065
      uint32_t a_key,
7066
      uint64_t a_value) {
7067
    return wuffs_base__io_transformer__set_quirk(
7068
        this, a_key, a_value);
7069
  }
7070
7071
  inline wuffs_base__status
7072
  transform_io(
7073
      wuffs_base__io_buffer* a_dst,
7074
      wuffs_base__io_buffer* a_src,
7075
      wuffs_base__slice_u8 a_workbuf) {
7076
    return wuffs_base__io_transformer__transform_io(
7077
        this, a_dst, a_src, a_workbuf);
7078
  }
7079
7080
  inline wuffs_base__range_ii_u64
7081
  workbuf_len() const {
7082
    return wuffs_base__io_transformer__workbuf_len(this);
7083
  }
7084
7085
#endif  // __cplusplus
7086
};  // struct wuffs_base__io_transformer__struct
7087
7088
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
7089
7090
// --------
7091
7092
extern const char wuffs_base__token_decoder__vtable_name[];
7093
7094
typedef struct wuffs_base__token_decoder__func_ptrs__struct {
7095
  wuffs_base__status (*decode_tokens)(
7096
    void* self,
7097
    wuffs_base__token_buffer* a_dst,
7098
    wuffs_base__io_buffer* a_src,
7099
    wuffs_base__slice_u8 a_workbuf);
7100
  uint64_t (*get_quirk)(
7101
    const void* self,
7102
    uint32_t a_key);
7103
  wuffs_base__status (*set_quirk)(
7104
    void* self,
7105
    uint32_t a_key,
7106
    uint64_t a_value);
7107
  wuffs_base__range_ii_u64 (*workbuf_len)(
7108
    const void* self);
7109
} wuffs_base__token_decoder__func_ptrs;
7110
7111
typedef struct wuffs_base__token_decoder__struct wuffs_base__token_decoder;
7112
7113
WUFFS_BASE__GENERATED_C_CODE
7114
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
7115
wuffs_base__token_decoder__decode_tokens(
7116
    wuffs_base__token_decoder* self,
7117
    wuffs_base__token_buffer* a_dst,
7118
    wuffs_base__io_buffer* a_src,
7119
    wuffs_base__slice_u8 a_workbuf);
7120
7121
WUFFS_BASE__GENERATED_C_CODE
7122
WUFFS_BASE__MAYBE_STATIC uint64_t
7123
wuffs_base__token_decoder__get_quirk(
7124
    const wuffs_base__token_decoder* self,
7125
    uint32_t a_key);
7126
7127
WUFFS_BASE__GENERATED_C_CODE
7128
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
7129
wuffs_base__token_decoder__set_quirk(
7130
    wuffs_base__token_decoder* self,
7131
    uint32_t a_key,
7132
    uint64_t a_value);
7133
7134
WUFFS_BASE__GENERATED_C_CODE
7135
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
7136
wuffs_base__token_decoder__workbuf_len(
7137
    const wuffs_base__token_decoder* self);
7138
7139
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
7140
7141
struct wuffs_base__token_decoder__struct {
7142
  struct {
7143
    uint32_t magic;
7144
    uint32_t active_coroutine;
7145
    wuffs_base__vtable first_vtable;
7146
  } private_impl;
7147
7148
#ifdef __cplusplus
7149
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
7150
  using unique_ptr = std::unique_ptr<wuffs_base__token_decoder, wuffs_unique_ptr_deleter>;
7151
#endif
7152
7153
  inline wuffs_base__status
7154
  decode_tokens(
7155
      wuffs_base__token_buffer* a_dst,
7156
      wuffs_base__io_buffer* a_src,
7157
      wuffs_base__slice_u8 a_workbuf) {
7158
    return wuffs_base__token_decoder__decode_tokens(
7159
        this, a_dst, a_src, a_workbuf);
7160
  }
7161
7162
  inline uint64_t
7163
  get_quirk(
7164
      uint32_t a_key) const {
7165
    return wuffs_base__token_decoder__get_quirk(
7166
        this, a_key);
7167
  }
7168
7169
  inline wuffs_base__status
7170
  set_quirk(
7171
      uint32_t a_key,
7172
      uint64_t a_value) {
7173
    return wuffs_base__token_decoder__set_quirk(
7174
        this, a_key, a_value);
7175
  }
7176
7177
  inline wuffs_base__range_ii_u64
7178
  workbuf_len() const {
7179
    return wuffs_base__token_decoder__workbuf_len(this);
7180
  }
7181
7182
#endif  // __cplusplus
7183
};  // struct wuffs_base__token_decoder__struct
7184
7185
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
7186
7187
// ----------------
7188
7189
#ifdef __cplusplus
7190
}  // extern "C"
7191
#endif
7192
7193
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ADLER32) || defined(WUFFS_NONMONOLITHIC)
7194
7195
// ---------------- Status Codes
7196
7197
// ---------------- Public Consts
7198
7199
// ---------------- Struct Declarations
7200
7201
typedef struct wuffs_adler32__hasher__struct wuffs_adler32__hasher;
7202
7203
#ifdef __cplusplus
7204
extern "C" {
7205
#endif
7206
7207
// ---------------- Public Initializer Prototypes
7208
7209
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
7210
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
7211
//
7212
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
7213
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
7214
7215
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
7216
wuffs_adler32__hasher__initialize(
7217
    wuffs_adler32__hasher* self,
7218
    size_t sizeof_star_self,
7219
    uint64_t wuffs_version,
7220
    uint32_t options);
7221
7222
size_t
7223
sizeof__wuffs_adler32__hasher(void);
7224
7225
// ---------------- Allocs
7226
7227
// These functions allocate and initialize Wuffs structs. They return NULL if
7228
// memory allocation fails. If they return non-NULL, there is no need to call
7229
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
7230
// calling free on the returned pointer. That pointer is effectively a C++
7231
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
7232
7233
wuffs_adler32__hasher*
7234
wuffs_adler32__hasher__alloc(void);
7235
7236
static inline wuffs_base__hasher_u32*
7237
0
wuffs_adler32__hasher__alloc_as__wuffs_base__hasher_u32(void) {
7238
0
  return (wuffs_base__hasher_u32*)(wuffs_adler32__hasher__alloc());
7239
0
}
7240
7241
// ---------------- Upcasts
7242
7243
static inline wuffs_base__hasher_u32*
7244
wuffs_adler32__hasher__upcast_as__wuffs_base__hasher_u32(
7245
0
    wuffs_adler32__hasher* p) {
7246
0
  return (wuffs_base__hasher_u32*)p;
7247
0
}
7248
7249
// ---------------- Public Function Prototypes
7250
7251
WUFFS_BASE__GENERATED_C_CODE
7252
WUFFS_BASE__MAYBE_STATIC uint64_t
7253
wuffs_adler32__hasher__get_quirk(
7254
    const wuffs_adler32__hasher* self,
7255
    uint32_t a_key);
7256
7257
WUFFS_BASE__GENERATED_C_CODE
7258
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
7259
wuffs_adler32__hasher__set_quirk(
7260
    wuffs_adler32__hasher* self,
7261
    uint32_t a_key,
7262
    uint64_t a_value);
7263
7264
WUFFS_BASE__GENERATED_C_CODE
7265
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
7266
wuffs_adler32__hasher__update(
7267
    wuffs_adler32__hasher* self,
7268
    wuffs_base__slice_u8 a_x);
7269
7270
WUFFS_BASE__GENERATED_C_CODE
7271
WUFFS_BASE__MAYBE_STATIC uint32_t
7272
wuffs_adler32__hasher__update_u32(
7273
    wuffs_adler32__hasher* self,
7274
    wuffs_base__slice_u8 a_x);
7275
7276
WUFFS_BASE__GENERATED_C_CODE
7277
WUFFS_BASE__MAYBE_STATIC uint32_t
7278
wuffs_adler32__hasher__checksum_u32(
7279
    const wuffs_adler32__hasher* self);
7280
7281
#ifdef __cplusplus
7282
}  // extern "C"
7283
#endif
7284
7285
// ---------------- Struct Definitions
7286
7287
// These structs' fields, and the sizeof them, are private implementation
7288
// details that aren't guaranteed to be stable across Wuffs versions.
7289
//
7290
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
7291
7292
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
7293
7294
struct wuffs_adler32__hasher__struct {
7295
  // Do not access the private_impl's or private_data's fields directly. There
7296
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
7297
  // the wuffs_foo__bar__baz functions.
7298
  //
7299
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
7300
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
7301
7302
  struct {
7303
    uint32_t magic;
7304
    uint32_t active_coroutine;
7305
    wuffs_base__vtable vtable_for__wuffs_base__hasher_u32;
7306
    wuffs_base__vtable null_vtable;
7307
7308
    uint32_t f_state;
7309
    bool f_started;
7310
7311
    wuffs_base__empty_struct (*choosy_up)(
7312
        wuffs_adler32__hasher* self,
7313
        wuffs_base__slice_u8 a_x);
7314
  } private_impl;
7315
7316
#ifdef __cplusplus
7317
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
7318
  using unique_ptr = std::unique_ptr<wuffs_adler32__hasher, wuffs_unique_ptr_deleter>;
7319
7320
  // On failure, the alloc_etc functions return nullptr. They don't throw.
7321
7322
  static inline unique_ptr
7323
  alloc() {
7324
    return unique_ptr(wuffs_adler32__hasher__alloc());
7325
  }
7326
7327
  static inline wuffs_base__hasher_u32::unique_ptr
7328
  alloc_as__wuffs_base__hasher_u32() {
7329
    return wuffs_base__hasher_u32::unique_ptr(
7330
        wuffs_adler32__hasher__alloc_as__wuffs_base__hasher_u32());
7331
  }
7332
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
7333
7334
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
7335
  // Disallow constructing or copying an object via standard C++ mechanisms,
7336
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
7337
  // size and field layout is not part of the public, stable, memory-safe API.
7338
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
7339
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
7340
  // their first argument) rather than tweaking bar.private_impl.qux fields.
7341
  //
7342
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
7343
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
7344
  // order to provide convenience methods. These forward on "this", so that you
7345
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
7346
  wuffs_adler32__hasher__struct() = delete;
7347
  wuffs_adler32__hasher__struct(const wuffs_adler32__hasher__struct&) = delete;
7348
  wuffs_adler32__hasher__struct& operator=(
7349
      const wuffs_adler32__hasher__struct&) = delete;
7350
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
7351
7352
#if !defined(WUFFS_IMPLEMENTATION)
7353
  // As above, the size of the struct is not part of the public API, and unless
7354
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
7355
  // allocated, not stack allocated. Its size is not intended to be known at
7356
  // compile time, but it is unfortunately divulged as a side effect of
7357
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
7358
  // instead of "sizeof T", invoking the operator. To make the two values
7359
  // different, so that passing the latter will be rejected by the initialize
7360
  // function, we add an arbitrary amount of dead weight.
7361
  uint8_t dead_weight[123000000];  // 123 MB.
7362
#endif  // !defined(WUFFS_IMPLEMENTATION)
7363
7364
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
7365
  initialize(
7366
      size_t sizeof_star_self,
7367
      uint64_t wuffs_version,
7368
      uint32_t options) {
7369
    return wuffs_adler32__hasher__initialize(
7370
        this, sizeof_star_self, wuffs_version, options);
7371
  }
7372
7373
  inline wuffs_base__hasher_u32*
7374
  upcast_as__wuffs_base__hasher_u32() {
7375
    return (wuffs_base__hasher_u32*)this;
7376
  }
7377
7378
  inline uint64_t
7379
  get_quirk(
7380
      uint32_t a_key) const {
7381
    return wuffs_adler32__hasher__get_quirk(this, a_key);
7382
  }
7383
7384
  inline wuffs_base__status
7385
  set_quirk(
7386
      uint32_t a_key,
7387
      uint64_t a_value) {
7388
    return wuffs_adler32__hasher__set_quirk(this, a_key, a_value);
7389
  }
7390
7391
  inline wuffs_base__empty_struct
7392
  update(
7393
      wuffs_base__slice_u8 a_x) {
7394
    return wuffs_adler32__hasher__update(this, a_x);
7395
  }
7396
7397
  inline uint32_t
7398
  update_u32(
7399
      wuffs_base__slice_u8 a_x) {
7400
    return wuffs_adler32__hasher__update_u32(this, a_x);
7401
  }
7402
7403
  inline uint32_t
7404
  checksum_u32() const {
7405
    return wuffs_adler32__hasher__checksum_u32(this);
7406
  }
7407
7408
#endif  // __cplusplus
7409
};  // struct wuffs_adler32__hasher__struct
7410
7411
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
7412
7413
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ADLER32) || defined(WUFFS_NONMONOLITHIC)
7414
7415
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BMP) || defined(WUFFS_NONMONOLITHIC)
7416
7417
// ---------------- Status Codes
7418
7419
extern const char wuffs_bmp__error__bad_header[];
7420
extern const char wuffs_bmp__error__bad_rle_compression[];
7421
extern const char wuffs_bmp__error__truncated_input[];
7422
extern const char wuffs_bmp__error__unsupported_bmp_file[];
7423
7424
// ---------------- Public Consts
7425
7426
#define WUFFS_BMP__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u
7427
7428
// ---------------- Struct Declarations
7429
7430
typedef struct wuffs_bmp__decoder__struct wuffs_bmp__decoder;
7431
7432
#ifdef __cplusplus
7433
extern "C" {
7434
#endif
7435
7436
// ---------------- Public Initializer Prototypes
7437
7438
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
7439
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
7440
//
7441
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
7442
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
7443
7444
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
7445
wuffs_bmp__decoder__initialize(
7446
    wuffs_bmp__decoder* self,
7447
    size_t sizeof_star_self,
7448
    uint64_t wuffs_version,
7449
    uint32_t options);
7450
7451
size_t
7452
sizeof__wuffs_bmp__decoder(void);
7453
7454
// ---------------- Allocs
7455
7456
// These functions allocate and initialize Wuffs structs. They return NULL if
7457
// memory allocation fails. If they return non-NULL, there is no need to call
7458
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
7459
// calling free on the returned pointer. That pointer is effectively a C++
7460
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
7461
7462
wuffs_bmp__decoder*
7463
wuffs_bmp__decoder__alloc(void);
7464
7465
static inline wuffs_base__image_decoder*
7466
wuffs_bmp__decoder__alloc_as__wuffs_base__image_decoder(void) {
7467
  return (wuffs_base__image_decoder*)(wuffs_bmp__decoder__alloc());
7468
}
7469
7470
// ---------------- Upcasts
7471
7472
static inline wuffs_base__image_decoder*
7473
wuffs_bmp__decoder__upcast_as__wuffs_base__image_decoder(
7474
    wuffs_bmp__decoder* p) {
7475
  return (wuffs_base__image_decoder*)p;
7476
}
7477
7478
// ---------------- Public Function Prototypes
7479
7480
WUFFS_BASE__GENERATED_C_CODE
7481
WUFFS_BASE__MAYBE_STATIC uint64_t
7482
wuffs_bmp__decoder__get_quirk(
7483
    const wuffs_bmp__decoder* self,
7484
    uint32_t a_key);
7485
7486
WUFFS_BASE__GENERATED_C_CODE
7487
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
7488
wuffs_bmp__decoder__set_quirk(
7489
    wuffs_bmp__decoder* self,
7490
    uint32_t a_key,
7491
    uint64_t a_value);
7492
7493
WUFFS_BASE__GENERATED_C_CODE
7494
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
7495
wuffs_bmp__decoder__decode_image_config(
7496
    wuffs_bmp__decoder* self,
7497
    wuffs_base__image_config* a_dst,
7498
    wuffs_base__io_buffer* a_src);
7499
7500
WUFFS_BASE__GENERATED_C_CODE
7501
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
7502
wuffs_bmp__decoder__decode_frame_config(
7503
    wuffs_bmp__decoder* self,
7504
    wuffs_base__frame_config* a_dst,
7505
    wuffs_base__io_buffer* a_src);
7506
7507
WUFFS_BASE__GENERATED_C_CODE
7508
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
7509
wuffs_bmp__decoder__decode_frame(
7510
    wuffs_bmp__decoder* self,
7511
    wuffs_base__pixel_buffer* a_dst,
7512
    wuffs_base__io_buffer* a_src,
7513
    wuffs_base__pixel_blend a_blend,
7514
    wuffs_base__slice_u8 a_workbuf,
7515
    wuffs_base__decode_frame_options* a_opts);
7516
7517
WUFFS_BASE__GENERATED_C_CODE
7518
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
7519
wuffs_bmp__decoder__frame_dirty_rect(
7520
    const wuffs_bmp__decoder* self);
7521
7522
WUFFS_BASE__GENERATED_C_CODE
7523
WUFFS_BASE__MAYBE_STATIC uint32_t
7524
wuffs_bmp__decoder__num_animation_loops(
7525
    const wuffs_bmp__decoder* self);
7526
7527
WUFFS_BASE__GENERATED_C_CODE
7528
WUFFS_BASE__MAYBE_STATIC uint64_t
7529
wuffs_bmp__decoder__num_decoded_frame_configs(
7530
    const wuffs_bmp__decoder* self);
7531
7532
WUFFS_BASE__GENERATED_C_CODE
7533
WUFFS_BASE__MAYBE_STATIC uint64_t
7534
wuffs_bmp__decoder__num_decoded_frames(
7535
    const wuffs_bmp__decoder* self);
7536
7537
WUFFS_BASE__GENERATED_C_CODE
7538
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
7539
wuffs_bmp__decoder__restart_frame(
7540
    wuffs_bmp__decoder* self,
7541
    uint64_t a_index,
7542
    uint64_t a_io_position);
7543
7544
WUFFS_BASE__GENERATED_C_CODE
7545
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
7546
wuffs_bmp__decoder__set_report_metadata(
7547
    wuffs_bmp__decoder* self,
7548
    uint32_t a_fourcc,
7549
    bool a_report);
7550
7551
WUFFS_BASE__GENERATED_C_CODE
7552
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
7553
wuffs_bmp__decoder__tell_me_more(
7554
    wuffs_bmp__decoder* self,
7555
    wuffs_base__io_buffer* a_dst,
7556
    wuffs_base__more_information* a_minfo,
7557
    wuffs_base__io_buffer* a_src);
7558
7559
WUFFS_BASE__GENERATED_C_CODE
7560
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
7561
wuffs_bmp__decoder__workbuf_len(
7562
    const wuffs_bmp__decoder* self);
7563
7564
#ifdef __cplusplus
7565
}  // extern "C"
7566
#endif
7567
7568
// ---------------- Struct Definitions
7569
7570
// These structs' fields, and the sizeof them, are private implementation
7571
// details that aren't guaranteed to be stable across Wuffs versions.
7572
//
7573
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
7574
7575
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
7576
7577
struct wuffs_bmp__decoder__struct {
7578
  // Do not access the private_impl's or private_data's fields directly. There
7579
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
7580
  // the wuffs_foo__bar__baz functions.
7581
  //
7582
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
7583
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
7584
7585
  struct {
7586
    uint32_t magic;
7587
    uint32_t active_coroutine;
7588
    wuffs_base__vtable vtable_for__wuffs_base__image_decoder;
7589
    wuffs_base__vtable null_vtable;
7590
7591
    uint32_t f_width;
7592
    uint32_t f_height;
7593
    uint8_t f_call_sequence;
7594
    bool f_top_down;
7595
    uint32_t f_pad_per_row;
7596
    uint32_t f_src_pixfmt;
7597
    uint32_t f_io_redirect_fourcc;
7598
    uint64_t f_io_redirect_pos;
7599
    uint64_t f_frame_config_io_position;
7600
    uint32_t f_bitmap_info_len;
7601
    uint32_t f_padding;
7602
    uint32_t f_bits_per_pixel;
7603
    uint32_t f_compression;
7604
    uint32_t f_channel_masks[4];
7605
    uint8_t f_channel_shifts[4];
7606
    uint8_t f_channel_num_bits[4];
7607
    uint32_t f_dst_x;
7608
    uint32_t f_dst_y;
7609
    uint32_t f_dst_y_inc;
7610
    uint32_t f_pending_pad;
7611
    uint32_t f_rle_state;
7612
    uint32_t f_rle_length;
7613
    uint8_t f_rle_delta_x;
7614
    bool f_rle_padded;
7615
    wuffs_base__pixel_swizzler f_swizzler;
7616
7617
    uint32_t p_decode_image_config;
7618
    uint32_t p_do_decode_image_config;
7619
    uint32_t p_decode_frame_config;
7620
    uint32_t p_do_decode_frame_config;
7621
    uint32_t p_decode_frame;
7622
    uint32_t p_do_decode_frame;
7623
    uint32_t p_tell_me_more;
7624
    uint32_t p_read_palette;
7625
  } private_impl;
7626
7627
  struct {
7628
    uint8_t f_scratch[2048];
7629
    uint8_t f_src_palette[1024];
7630
7631
    struct {
7632
      uint64_t scratch;
7633
    } s_do_decode_image_config;
7634
    struct {
7635
      uint64_t scratch;
7636
    } s_do_decode_frame;
7637
    struct {
7638
      uint32_t v_i;
7639
      uint64_t scratch;
7640
    } s_read_palette;
7641
  } private_data;
7642
7643
#ifdef __cplusplus
7644
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
7645
  using unique_ptr = std::unique_ptr<wuffs_bmp__decoder, wuffs_unique_ptr_deleter>;
7646
7647
  // On failure, the alloc_etc functions return nullptr. They don't throw.
7648
7649
  static inline unique_ptr
7650
  alloc() {
7651
    return unique_ptr(wuffs_bmp__decoder__alloc());
7652
  }
7653
7654
  static inline wuffs_base__image_decoder::unique_ptr
7655
  alloc_as__wuffs_base__image_decoder() {
7656
    return wuffs_base__image_decoder::unique_ptr(
7657
        wuffs_bmp__decoder__alloc_as__wuffs_base__image_decoder());
7658
  }
7659
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
7660
7661
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
7662
  // Disallow constructing or copying an object via standard C++ mechanisms,
7663
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
7664
  // size and field layout is not part of the public, stable, memory-safe API.
7665
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
7666
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
7667
  // their first argument) rather than tweaking bar.private_impl.qux fields.
7668
  //
7669
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
7670
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
7671
  // order to provide convenience methods. These forward on "this", so that you
7672
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
7673
  wuffs_bmp__decoder__struct() = delete;
7674
  wuffs_bmp__decoder__struct(const wuffs_bmp__decoder__struct&) = delete;
7675
  wuffs_bmp__decoder__struct& operator=(
7676
      const wuffs_bmp__decoder__struct&) = delete;
7677
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
7678
7679
#if !defined(WUFFS_IMPLEMENTATION)
7680
  // As above, the size of the struct is not part of the public API, and unless
7681
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
7682
  // allocated, not stack allocated. Its size is not intended to be known at
7683
  // compile time, but it is unfortunately divulged as a side effect of
7684
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
7685
  // instead of "sizeof T", invoking the operator. To make the two values
7686
  // different, so that passing the latter will be rejected by the initialize
7687
  // function, we add an arbitrary amount of dead weight.
7688
  uint8_t dead_weight[123000000];  // 123 MB.
7689
#endif  // !defined(WUFFS_IMPLEMENTATION)
7690
7691
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
7692
  initialize(
7693
      size_t sizeof_star_self,
7694
      uint64_t wuffs_version,
7695
      uint32_t options) {
7696
    return wuffs_bmp__decoder__initialize(
7697
        this, sizeof_star_self, wuffs_version, options);
7698
  }
7699
7700
  inline wuffs_base__image_decoder*
7701
  upcast_as__wuffs_base__image_decoder() {
7702
    return (wuffs_base__image_decoder*)this;
7703
  }
7704
7705
  inline uint64_t
7706
  get_quirk(
7707
      uint32_t a_key) const {
7708
    return wuffs_bmp__decoder__get_quirk(this, a_key);
7709
  }
7710
7711
  inline wuffs_base__status
7712
  set_quirk(
7713
      uint32_t a_key,
7714
      uint64_t a_value) {
7715
    return wuffs_bmp__decoder__set_quirk(this, a_key, a_value);
7716
  }
7717
7718
  inline wuffs_base__status
7719
  decode_image_config(
7720
      wuffs_base__image_config* a_dst,
7721
      wuffs_base__io_buffer* a_src) {
7722
    return wuffs_bmp__decoder__decode_image_config(this, a_dst, a_src);
7723
  }
7724
7725
  inline wuffs_base__status
7726
  decode_frame_config(
7727
      wuffs_base__frame_config* a_dst,
7728
      wuffs_base__io_buffer* a_src) {
7729
    return wuffs_bmp__decoder__decode_frame_config(this, a_dst, a_src);
7730
  }
7731
7732
  inline wuffs_base__status
7733
  decode_frame(
7734
      wuffs_base__pixel_buffer* a_dst,
7735
      wuffs_base__io_buffer* a_src,
7736
      wuffs_base__pixel_blend a_blend,
7737
      wuffs_base__slice_u8 a_workbuf,
7738
      wuffs_base__decode_frame_options* a_opts) {
7739
    return wuffs_bmp__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts);
7740
  }
7741
7742
  inline wuffs_base__rect_ie_u32
7743
  frame_dirty_rect() const {
7744
    return wuffs_bmp__decoder__frame_dirty_rect(this);
7745
  }
7746
7747
  inline uint32_t
7748
  num_animation_loops() const {
7749
    return wuffs_bmp__decoder__num_animation_loops(this);
7750
  }
7751
7752
  inline uint64_t
7753
  num_decoded_frame_configs() const {
7754
    return wuffs_bmp__decoder__num_decoded_frame_configs(this);
7755
  }
7756
7757
  inline uint64_t
7758
  num_decoded_frames() const {
7759
    return wuffs_bmp__decoder__num_decoded_frames(this);
7760
  }
7761
7762
  inline wuffs_base__status
7763
  restart_frame(
7764
      uint64_t a_index,
7765
      uint64_t a_io_position) {
7766
    return wuffs_bmp__decoder__restart_frame(this, a_index, a_io_position);
7767
  }
7768
7769
  inline wuffs_base__empty_struct
7770
  set_report_metadata(
7771
      uint32_t a_fourcc,
7772
      bool a_report) {
7773
    return wuffs_bmp__decoder__set_report_metadata(this, a_fourcc, a_report);
7774
  }
7775
7776
  inline wuffs_base__status
7777
  tell_me_more(
7778
      wuffs_base__io_buffer* a_dst,
7779
      wuffs_base__more_information* a_minfo,
7780
      wuffs_base__io_buffer* a_src) {
7781
    return wuffs_bmp__decoder__tell_me_more(this, a_dst, a_minfo, a_src);
7782
  }
7783
7784
  inline wuffs_base__range_ii_u64
7785
  workbuf_len() const {
7786
    return wuffs_bmp__decoder__workbuf_len(this);
7787
  }
7788
7789
#endif  // __cplusplus
7790
};  // struct wuffs_bmp__decoder__struct
7791
7792
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
7793
7794
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BMP) || defined(WUFFS_NONMONOLITHIC)
7795
7796
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BZIP2) || defined(WUFFS_NONMONOLITHIC)
7797
7798
// ---------------- Status Codes
7799
7800
extern const char wuffs_bzip2__error__bad_huffman_code_over_subscribed[];
7801
extern const char wuffs_bzip2__error__bad_huffman_code_under_subscribed[];
7802
extern const char wuffs_bzip2__error__bad_block_header[];
7803
extern const char wuffs_bzip2__error__bad_block_length[];
7804
extern const char wuffs_bzip2__error__bad_checksum[];
7805
extern const char wuffs_bzip2__error__bad_header[];
7806
extern const char wuffs_bzip2__error__bad_number_of_sections[];
7807
extern const char wuffs_bzip2__error__truncated_input[];
7808
extern const char wuffs_bzip2__error__unsupported_block_randomization[];
7809
7810
// ---------------- Public Consts
7811
7812
#define WUFFS_BZIP2__DECODER_DST_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0u
7813
7814
#define WUFFS_BZIP2__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u
7815
7816
// ---------------- Struct Declarations
7817
7818
typedef struct wuffs_bzip2__decoder__struct wuffs_bzip2__decoder;
7819
7820
#ifdef __cplusplus
7821
extern "C" {
7822
#endif
7823
7824
// ---------------- Public Initializer Prototypes
7825
7826
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
7827
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
7828
//
7829
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
7830
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
7831
7832
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
7833
wuffs_bzip2__decoder__initialize(
7834
    wuffs_bzip2__decoder* self,
7835
    size_t sizeof_star_self,
7836
    uint64_t wuffs_version,
7837
    uint32_t options);
7838
7839
size_t
7840
sizeof__wuffs_bzip2__decoder(void);
7841
7842
// ---------------- Allocs
7843
7844
// These functions allocate and initialize Wuffs structs. They return NULL if
7845
// memory allocation fails. If they return non-NULL, there is no need to call
7846
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
7847
// calling free on the returned pointer. That pointer is effectively a C++
7848
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
7849
7850
wuffs_bzip2__decoder*
7851
wuffs_bzip2__decoder__alloc(void);
7852
7853
static inline wuffs_base__io_transformer*
7854
wuffs_bzip2__decoder__alloc_as__wuffs_base__io_transformer(void) {
7855
  return (wuffs_base__io_transformer*)(wuffs_bzip2__decoder__alloc());
7856
}
7857
7858
// ---------------- Upcasts
7859
7860
static inline wuffs_base__io_transformer*
7861
wuffs_bzip2__decoder__upcast_as__wuffs_base__io_transformer(
7862
    wuffs_bzip2__decoder* p) {
7863
  return (wuffs_base__io_transformer*)p;
7864
}
7865
7866
// ---------------- Public Function Prototypes
7867
7868
WUFFS_BASE__GENERATED_C_CODE
7869
WUFFS_BASE__MAYBE_STATIC uint64_t
7870
wuffs_bzip2__decoder__get_quirk(
7871
    const wuffs_bzip2__decoder* self,
7872
    uint32_t a_key);
7873
7874
WUFFS_BASE__GENERATED_C_CODE
7875
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
7876
wuffs_bzip2__decoder__set_quirk(
7877
    wuffs_bzip2__decoder* self,
7878
    uint32_t a_key,
7879
    uint64_t a_value);
7880
7881
WUFFS_BASE__GENERATED_C_CODE
7882
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
7883
wuffs_bzip2__decoder__dst_history_retain_length(
7884
    const wuffs_bzip2__decoder* self);
7885
7886
WUFFS_BASE__GENERATED_C_CODE
7887
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
7888
wuffs_bzip2__decoder__workbuf_len(
7889
    const wuffs_bzip2__decoder* self);
7890
7891
WUFFS_BASE__GENERATED_C_CODE
7892
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
7893
wuffs_bzip2__decoder__transform_io(
7894
    wuffs_bzip2__decoder* self,
7895
    wuffs_base__io_buffer* a_dst,
7896
    wuffs_base__io_buffer* a_src,
7897
    wuffs_base__slice_u8 a_workbuf);
7898
7899
#ifdef __cplusplus
7900
}  // extern "C"
7901
#endif
7902
7903
// ---------------- Struct Definitions
7904
7905
// These structs' fields, and the sizeof them, are private implementation
7906
// details that aren't guaranteed to be stable across Wuffs versions.
7907
//
7908
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
7909
7910
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
7911
7912
struct wuffs_bzip2__decoder__struct {
7913
  // Do not access the private_impl's or private_data's fields directly. There
7914
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
7915
  // the wuffs_foo__bar__baz functions.
7916
  //
7917
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
7918
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
7919
7920
  struct {
7921
    uint32_t magic;
7922
    uint32_t active_coroutine;
7923
    wuffs_base__vtable vtable_for__wuffs_base__io_transformer;
7924
    wuffs_base__vtable null_vtable;
7925
7926
    uint32_t f_bits;
7927
    uint32_t f_n_bits;
7928
    uint32_t f_max_incl_block_size;
7929
    uint32_t f_block_size;
7930
    bool f_decode_huffman_finished;
7931
    uint8_t f_decode_huffman_which;
7932
    uint32_t f_decode_huffman_ticks;
7933
    uint32_t f_decode_huffman_section;
7934
    uint32_t f_decode_huffman_run_shift;
7935
    uint32_t f_flush_pointer;
7936
    uint32_t f_flush_repeat_count;
7937
    uint8_t f_flush_prev;
7938
    bool f_ignore_checksum;
7939
    uint32_t f_final_checksum_have;
7940
    uint32_t f_block_checksum_have;
7941
    uint32_t f_block_checksum_want;
7942
    uint32_t f_original_pointer;
7943
    uint32_t f_num_symbols;
7944
    uint32_t f_num_huffman_codes;
7945
    uint32_t f_num_sections;
7946
    uint32_t f_code_lengths_bitmask;
7947
7948
    uint32_t p_transform_io;
7949
    uint32_t p_do_transform_io;
7950
    uint32_t p_prepare_block;
7951
    uint32_t p_read_code_lengths;
7952
    uint32_t p_flush_slow;
7953
    uint32_t p_decode_huffman_slow;
7954
  } private_impl;
7955
7956
  struct {
7957
    uint32_t f_scratch;
7958
    uint32_t f_letter_counts[256];
7959
    uint8_t f_presence[256];
7960
    uint8_t f_mtft[256];
7961
    uint8_t f_huffman_selectors[32768];
7962
    uint16_t f_huffman_trees[6][257][2];
7963
    uint16_t f_huffman_tables[6][256];
7964
    uint32_t f_bwt[1048576];
7965
7966
    struct {
7967
      uint32_t v_i;
7968
      uint64_t v_tag;
7969
      uint32_t v_final_checksum_want;
7970
    } s_do_transform_io;
7971
    struct {
7972
      uint32_t v_i;
7973
      uint32_t v_selector;
7974
    } s_prepare_block;
7975
    struct {
7976
      uint32_t v_i;
7977
      uint32_t v_code_length;
7978
    } s_read_code_lengths;
7979
    struct {
7980
      uint32_t v_flush_pointer;
7981
      uint32_t v_flush_repeat_count;
7982
      uint8_t v_flush_prev;
7983
      uint32_t v_block_checksum_have;
7984
      uint32_t v_block_size;
7985
      uint8_t v_curr;
7986
      uint64_t scratch;
7987
    } s_flush_slow;
7988
    struct {
7989
      uint32_t v_node_index;
7990
    } s_decode_huffman_slow;
7991
  } private_data;
7992
7993
#ifdef __cplusplus
7994
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
7995
  using unique_ptr = std::unique_ptr<wuffs_bzip2__decoder, wuffs_unique_ptr_deleter>;
7996
7997
  // On failure, the alloc_etc functions return nullptr. They don't throw.
7998
7999
  static inline unique_ptr
8000
  alloc() {
8001
    return unique_ptr(wuffs_bzip2__decoder__alloc());
8002
  }
8003
8004
  static inline wuffs_base__io_transformer::unique_ptr
8005
  alloc_as__wuffs_base__io_transformer() {
8006
    return wuffs_base__io_transformer::unique_ptr(
8007
        wuffs_bzip2__decoder__alloc_as__wuffs_base__io_transformer());
8008
  }
8009
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
8010
8011
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
8012
  // Disallow constructing or copying an object via standard C++ mechanisms,
8013
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
8014
  // size and field layout is not part of the public, stable, memory-safe API.
8015
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
8016
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
8017
  // their first argument) rather than tweaking bar.private_impl.qux fields.
8018
  //
8019
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
8020
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
8021
  // order to provide convenience methods. These forward on "this", so that you
8022
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
8023
  wuffs_bzip2__decoder__struct() = delete;
8024
  wuffs_bzip2__decoder__struct(const wuffs_bzip2__decoder__struct&) = delete;
8025
  wuffs_bzip2__decoder__struct& operator=(
8026
      const wuffs_bzip2__decoder__struct&) = delete;
8027
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
8028
8029
#if !defined(WUFFS_IMPLEMENTATION)
8030
  // As above, the size of the struct is not part of the public API, and unless
8031
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
8032
  // allocated, not stack allocated. Its size is not intended to be known at
8033
  // compile time, but it is unfortunately divulged as a side effect of
8034
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
8035
  // instead of "sizeof T", invoking the operator. To make the two values
8036
  // different, so that passing the latter will be rejected by the initialize
8037
  // function, we add an arbitrary amount of dead weight.
8038
  uint8_t dead_weight[123000000];  // 123 MB.
8039
#endif  // !defined(WUFFS_IMPLEMENTATION)
8040
8041
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
8042
  initialize(
8043
      size_t sizeof_star_self,
8044
      uint64_t wuffs_version,
8045
      uint32_t options) {
8046
    return wuffs_bzip2__decoder__initialize(
8047
        this, sizeof_star_self, wuffs_version, options);
8048
  }
8049
8050
  inline wuffs_base__io_transformer*
8051
  upcast_as__wuffs_base__io_transformer() {
8052
    return (wuffs_base__io_transformer*)this;
8053
  }
8054
8055
  inline uint64_t
8056
  get_quirk(
8057
      uint32_t a_key) const {
8058
    return wuffs_bzip2__decoder__get_quirk(this, a_key);
8059
  }
8060
8061
  inline wuffs_base__status
8062
  set_quirk(
8063
      uint32_t a_key,
8064
      uint64_t a_value) {
8065
    return wuffs_bzip2__decoder__set_quirk(this, a_key, a_value);
8066
  }
8067
8068
  inline wuffs_base__optional_u63
8069
  dst_history_retain_length() const {
8070
    return wuffs_bzip2__decoder__dst_history_retain_length(this);
8071
  }
8072
8073
  inline wuffs_base__range_ii_u64
8074
  workbuf_len() const {
8075
    return wuffs_bzip2__decoder__workbuf_len(this);
8076
  }
8077
8078
  inline wuffs_base__status
8079
  transform_io(
8080
      wuffs_base__io_buffer* a_dst,
8081
      wuffs_base__io_buffer* a_src,
8082
      wuffs_base__slice_u8 a_workbuf) {
8083
    return wuffs_bzip2__decoder__transform_io(this, a_dst, a_src, a_workbuf);
8084
  }
8085
8086
#endif  // __cplusplus
8087
};  // struct wuffs_bzip2__decoder__struct
8088
8089
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
8090
8091
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BZIP2) || defined(WUFFS_NONMONOLITHIC)
8092
8093
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CBOR) || defined(WUFFS_NONMONOLITHIC)
8094
8095
// ---------------- Status Codes
8096
8097
extern const char wuffs_cbor__error__bad_input[];
8098
extern const char wuffs_cbor__error__unsupported_recursion_depth[];
8099
8100
// ---------------- Public Consts
8101
8102
#define WUFFS_CBOR__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u
8103
8104
#define WUFFS_CBOR__DECODER_DEPTH_MAX_INCL 1024u
8105
8106
#define WUFFS_CBOR__DECODER_DST_TOKEN_BUFFER_LENGTH_MIN_INCL 2u
8107
8108
#define WUFFS_CBOR__DECODER_SRC_IO_BUFFER_LENGTH_MIN_INCL 9u
8109
8110
#define WUFFS_CBOR__TOKEN_VALUE_MAJOR 731642u
8111
8112
#define WUFFS_CBOR__TOKEN_VALUE_MINOR__DETAIL_MASK 262143u
8113
8114
#define WUFFS_CBOR__TOKEN_VALUE_MINOR__MINUS_1_MINUS_X 16777216u
8115
8116
#define WUFFS_CBOR__TOKEN_VALUE_MINOR__SIMPLE_VALUE 8388608u
8117
8118
#define WUFFS_CBOR__TOKEN_VALUE_MINOR__TAG 4194304u
8119
8120
// ---------------- Struct Declarations
8121
8122
typedef struct wuffs_cbor__decoder__struct wuffs_cbor__decoder;
8123
8124
#ifdef __cplusplus
8125
extern "C" {
8126
#endif
8127
8128
// ---------------- Public Initializer Prototypes
8129
8130
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
8131
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
8132
//
8133
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
8134
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
8135
8136
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
8137
wuffs_cbor__decoder__initialize(
8138
    wuffs_cbor__decoder* self,
8139
    size_t sizeof_star_self,
8140
    uint64_t wuffs_version,
8141
    uint32_t options);
8142
8143
size_t
8144
sizeof__wuffs_cbor__decoder(void);
8145
8146
// ---------------- Allocs
8147
8148
// These functions allocate and initialize Wuffs structs. They return NULL if
8149
// memory allocation fails. If they return non-NULL, there is no need to call
8150
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
8151
// calling free on the returned pointer. That pointer is effectively a C++
8152
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
8153
8154
wuffs_cbor__decoder*
8155
wuffs_cbor__decoder__alloc(void);
8156
8157
static inline wuffs_base__token_decoder*
8158
wuffs_cbor__decoder__alloc_as__wuffs_base__token_decoder(void) {
8159
  return (wuffs_base__token_decoder*)(wuffs_cbor__decoder__alloc());
8160
}
8161
8162
// ---------------- Upcasts
8163
8164
static inline wuffs_base__token_decoder*
8165
wuffs_cbor__decoder__upcast_as__wuffs_base__token_decoder(
8166
    wuffs_cbor__decoder* p) {
8167
  return (wuffs_base__token_decoder*)p;
8168
}
8169
8170
// ---------------- Public Function Prototypes
8171
8172
WUFFS_BASE__GENERATED_C_CODE
8173
WUFFS_BASE__MAYBE_STATIC uint64_t
8174
wuffs_cbor__decoder__get_quirk(
8175
    const wuffs_cbor__decoder* self,
8176
    uint32_t a_key);
8177
8178
WUFFS_BASE__GENERATED_C_CODE
8179
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
8180
wuffs_cbor__decoder__set_quirk(
8181
    wuffs_cbor__decoder* self,
8182
    uint32_t a_key,
8183
    uint64_t a_value);
8184
8185
WUFFS_BASE__GENERATED_C_CODE
8186
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
8187
wuffs_cbor__decoder__workbuf_len(
8188
    const wuffs_cbor__decoder* self);
8189
8190
WUFFS_BASE__GENERATED_C_CODE
8191
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
8192
wuffs_cbor__decoder__decode_tokens(
8193
    wuffs_cbor__decoder* self,
8194
    wuffs_base__token_buffer* a_dst,
8195
    wuffs_base__io_buffer* a_src,
8196
    wuffs_base__slice_u8 a_workbuf);
8197
8198
#ifdef __cplusplus
8199
}  // extern "C"
8200
#endif
8201
8202
// ---------------- Struct Definitions
8203
8204
// These structs' fields, and the sizeof them, are private implementation
8205
// details that aren't guaranteed to be stable across Wuffs versions.
8206
//
8207
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
8208
8209
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
8210
8211
struct wuffs_cbor__decoder__struct {
8212
  // Do not access the private_impl's or private_data's fields directly. There
8213
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
8214
  // the wuffs_foo__bar__baz functions.
8215
  //
8216
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
8217
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
8218
8219
  struct {
8220
    uint32_t magic;
8221
    uint32_t active_coroutine;
8222
    wuffs_base__vtable vtable_for__wuffs_base__token_decoder;
8223
    wuffs_base__vtable null_vtable;
8224
8225
    bool f_end_of_data;
8226
8227
    uint32_t p_decode_tokens;
8228
  } private_impl;
8229
8230
  struct {
8231
    uint32_t f_stack[64];
8232
    uint64_t f_container_num_remaining[1024];
8233
8234
    struct {
8235
      uint64_t v_string_length;
8236
      uint32_t v_depth;
8237
      bool v_tagged;
8238
      uint8_t v_indefinite_string_major_type;
8239
    } s_decode_tokens;
8240
  } private_data;
8241
8242
#ifdef __cplusplus
8243
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
8244
  using unique_ptr = std::unique_ptr<wuffs_cbor__decoder, wuffs_unique_ptr_deleter>;
8245
8246
  // On failure, the alloc_etc functions return nullptr. They don't throw.
8247
8248
  static inline unique_ptr
8249
  alloc() {
8250
    return unique_ptr(wuffs_cbor__decoder__alloc());
8251
  }
8252
8253
  static inline wuffs_base__token_decoder::unique_ptr
8254
  alloc_as__wuffs_base__token_decoder() {
8255
    return wuffs_base__token_decoder::unique_ptr(
8256
        wuffs_cbor__decoder__alloc_as__wuffs_base__token_decoder());
8257
  }
8258
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
8259
8260
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
8261
  // Disallow constructing or copying an object via standard C++ mechanisms,
8262
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
8263
  // size and field layout is not part of the public, stable, memory-safe API.
8264
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
8265
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
8266
  // their first argument) rather than tweaking bar.private_impl.qux fields.
8267
  //
8268
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
8269
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
8270
  // order to provide convenience methods. These forward on "this", so that you
8271
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
8272
  wuffs_cbor__decoder__struct() = delete;
8273
  wuffs_cbor__decoder__struct(const wuffs_cbor__decoder__struct&) = delete;
8274
  wuffs_cbor__decoder__struct& operator=(
8275
      const wuffs_cbor__decoder__struct&) = delete;
8276
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
8277
8278
#if !defined(WUFFS_IMPLEMENTATION)
8279
  // As above, the size of the struct is not part of the public API, and unless
8280
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
8281
  // allocated, not stack allocated. Its size is not intended to be known at
8282
  // compile time, but it is unfortunately divulged as a side effect of
8283
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
8284
  // instead of "sizeof T", invoking the operator. To make the two values
8285
  // different, so that passing the latter will be rejected by the initialize
8286
  // function, we add an arbitrary amount of dead weight.
8287
  uint8_t dead_weight[123000000];  // 123 MB.
8288
#endif  // !defined(WUFFS_IMPLEMENTATION)
8289
8290
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
8291
  initialize(
8292
      size_t sizeof_star_self,
8293
      uint64_t wuffs_version,
8294
      uint32_t options) {
8295
    return wuffs_cbor__decoder__initialize(
8296
        this, sizeof_star_self, wuffs_version, options);
8297
  }
8298
8299
  inline wuffs_base__token_decoder*
8300
  upcast_as__wuffs_base__token_decoder() {
8301
    return (wuffs_base__token_decoder*)this;
8302
  }
8303
8304
  inline uint64_t
8305
  get_quirk(
8306
      uint32_t a_key) const {
8307
    return wuffs_cbor__decoder__get_quirk(this, a_key);
8308
  }
8309
8310
  inline wuffs_base__status
8311
  set_quirk(
8312
      uint32_t a_key,
8313
      uint64_t a_value) {
8314
    return wuffs_cbor__decoder__set_quirk(this, a_key, a_value);
8315
  }
8316
8317
  inline wuffs_base__range_ii_u64
8318
  workbuf_len() const {
8319
    return wuffs_cbor__decoder__workbuf_len(this);
8320
  }
8321
8322
  inline wuffs_base__status
8323
  decode_tokens(
8324
      wuffs_base__token_buffer* a_dst,
8325
      wuffs_base__io_buffer* a_src,
8326
      wuffs_base__slice_u8 a_workbuf) {
8327
    return wuffs_cbor__decoder__decode_tokens(this, a_dst, a_src, a_workbuf);
8328
  }
8329
8330
#endif  // __cplusplus
8331
};  // struct wuffs_cbor__decoder__struct
8332
8333
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
8334
8335
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CBOR) || defined(WUFFS_NONMONOLITHIC)
8336
8337
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC32) || defined(WUFFS_NONMONOLITHIC)
8338
8339
// ---------------- Status Codes
8340
8341
// ---------------- Public Consts
8342
8343
// ---------------- Struct Declarations
8344
8345
typedef struct wuffs_crc32__ieee_hasher__struct wuffs_crc32__ieee_hasher;
8346
8347
#ifdef __cplusplus
8348
extern "C" {
8349
#endif
8350
8351
// ---------------- Public Initializer Prototypes
8352
8353
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
8354
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
8355
//
8356
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
8357
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
8358
8359
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
8360
wuffs_crc32__ieee_hasher__initialize(
8361
    wuffs_crc32__ieee_hasher* self,
8362
    size_t sizeof_star_self,
8363
    uint64_t wuffs_version,
8364
    uint32_t options);
8365
8366
size_t
8367
sizeof__wuffs_crc32__ieee_hasher(void);
8368
8369
// ---------------- Allocs
8370
8371
// These functions allocate and initialize Wuffs structs. They return NULL if
8372
// memory allocation fails. If they return non-NULL, there is no need to call
8373
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
8374
// calling free on the returned pointer. That pointer is effectively a C++
8375
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
8376
8377
wuffs_crc32__ieee_hasher*
8378
wuffs_crc32__ieee_hasher__alloc(void);
8379
8380
static inline wuffs_base__hasher_u32*
8381
0
wuffs_crc32__ieee_hasher__alloc_as__wuffs_base__hasher_u32(void) {
8382
0
  return (wuffs_base__hasher_u32*)(wuffs_crc32__ieee_hasher__alloc());
8383
0
}
8384
8385
// ---------------- Upcasts
8386
8387
static inline wuffs_base__hasher_u32*
8388
wuffs_crc32__ieee_hasher__upcast_as__wuffs_base__hasher_u32(
8389
0
    wuffs_crc32__ieee_hasher* p) {
8390
0
  return (wuffs_base__hasher_u32*)p;
8391
0
}
8392
8393
// ---------------- Public Function Prototypes
8394
8395
WUFFS_BASE__GENERATED_C_CODE
8396
WUFFS_BASE__MAYBE_STATIC uint64_t
8397
wuffs_crc32__ieee_hasher__get_quirk(
8398
    const wuffs_crc32__ieee_hasher* self,
8399
    uint32_t a_key);
8400
8401
WUFFS_BASE__GENERATED_C_CODE
8402
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
8403
wuffs_crc32__ieee_hasher__set_quirk(
8404
    wuffs_crc32__ieee_hasher* self,
8405
    uint32_t a_key,
8406
    uint64_t a_value);
8407
8408
WUFFS_BASE__GENERATED_C_CODE
8409
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
8410
wuffs_crc32__ieee_hasher__update(
8411
    wuffs_crc32__ieee_hasher* self,
8412
    wuffs_base__slice_u8 a_x);
8413
8414
WUFFS_BASE__GENERATED_C_CODE
8415
WUFFS_BASE__MAYBE_STATIC uint32_t
8416
wuffs_crc32__ieee_hasher__update_u32(
8417
    wuffs_crc32__ieee_hasher* self,
8418
    wuffs_base__slice_u8 a_x);
8419
8420
WUFFS_BASE__GENERATED_C_CODE
8421
WUFFS_BASE__MAYBE_STATIC uint32_t
8422
wuffs_crc32__ieee_hasher__checksum_u32(
8423
    const wuffs_crc32__ieee_hasher* self);
8424
8425
#ifdef __cplusplus
8426
}  // extern "C"
8427
#endif
8428
8429
// ---------------- Struct Definitions
8430
8431
// These structs' fields, and the sizeof them, are private implementation
8432
// details that aren't guaranteed to be stable across Wuffs versions.
8433
//
8434
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
8435
8436
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
8437
8438
struct wuffs_crc32__ieee_hasher__struct {
8439
  // Do not access the private_impl's or private_data's fields directly. There
8440
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
8441
  // the wuffs_foo__bar__baz functions.
8442
  //
8443
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
8444
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
8445
8446
  struct {
8447
    uint32_t magic;
8448
    uint32_t active_coroutine;
8449
    wuffs_base__vtable vtable_for__wuffs_base__hasher_u32;
8450
    wuffs_base__vtable null_vtable;
8451
8452
    uint32_t f_state;
8453
8454
    wuffs_base__empty_struct (*choosy_up)(
8455
        wuffs_crc32__ieee_hasher* self,
8456
        wuffs_base__slice_u8 a_x);
8457
  } private_impl;
8458
8459
#ifdef __cplusplus
8460
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
8461
  using unique_ptr = std::unique_ptr<wuffs_crc32__ieee_hasher, wuffs_unique_ptr_deleter>;
8462
8463
  // On failure, the alloc_etc functions return nullptr. They don't throw.
8464
8465
  static inline unique_ptr
8466
  alloc() {
8467
    return unique_ptr(wuffs_crc32__ieee_hasher__alloc());
8468
  }
8469
8470
  static inline wuffs_base__hasher_u32::unique_ptr
8471
  alloc_as__wuffs_base__hasher_u32() {
8472
    return wuffs_base__hasher_u32::unique_ptr(
8473
        wuffs_crc32__ieee_hasher__alloc_as__wuffs_base__hasher_u32());
8474
  }
8475
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
8476
8477
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
8478
  // Disallow constructing or copying an object via standard C++ mechanisms,
8479
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
8480
  // size and field layout is not part of the public, stable, memory-safe API.
8481
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
8482
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
8483
  // their first argument) rather than tweaking bar.private_impl.qux fields.
8484
  //
8485
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
8486
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
8487
  // order to provide convenience methods. These forward on "this", so that you
8488
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
8489
  wuffs_crc32__ieee_hasher__struct() = delete;
8490
  wuffs_crc32__ieee_hasher__struct(const wuffs_crc32__ieee_hasher__struct&) = delete;
8491
  wuffs_crc32__ieee_hasher__struct& operator=(
8492
      const wuffs_crc32__ieee_hasher__struct&) = delete;
8493
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
8494
8495
#if !defined(WUFFS_IMPLEMENTATION)
8496
  // As above, the size of the struct is not part of the public API, and unless
8497
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
8498
  // allocated, not stack allocated. Its size is not intended to be known at
8499
  // compile time, but it is unfortunately divulged as a side effect of
8500
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
8501
  // instead of "sizeof T", invoking the operator. To make the two values
8502
  // different, so that passing the latter will be rejected by the initialize
8503
  // function, we add an arbitrary amount of dead weight.
8504
  uint8_t dead_weight[123000000];  // 123 MB.
8505
#endif  // !defined(WUFFS_IMPLEMENTATION)
8506
8507
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
8508
  initialize(
8509
      size_t sizeof_star_self,
8510
      uint64_t wuffs_version,
8511
      uint32_t options) {
8512
    return wuffs_crc32__ieee_hasher__initialize(
8513
        this, sizeof_star_self, wuffs_version, options);
8514
  }
8515
8516
  inline wuffs_base__hasher_u32*
8517
  upcast_as__wuffs_base__hasher_u32() {
8518
    return (wuffs_base__hasher_u32*)this;
8519
  }
8520
8521
  inline uint64_t
8522
  get_quirk(
8523
      uint32_t a_key) const {
8524
    return wuffs_crc32__ieee_hasher__get_quirk(this, a_key);
8525
  }
8526
8527
  inline wuffs_base__status
8528
  set_quirk(
8529
      uint32_t a_key,
8530
      uint64_t a_value) {
8531
    return wuffs_crc32__ieee_hasher__set_quirk(this, a_key, a_value);
8532
  }
8533
8534
  inline wuffs_base__empty_struct
8535
  update(
8536
      wuffs_base__slice_u8 a_x) {
8537
    return wuffs_crc32__ieee_hasher__update(this, a_x);
8538
  }
8539
8540
  inline uint32_t
8541
  update_u32(
8542
      wuffs_base__slice_u8 a_x) {
8543
    return wuffs_crc32__ieee_hasher__update_u32(this, a_x);
8544
  }
8545
8546
  inline uint32_t
8547
  checksum_u32() const {
8548
    return wuffs_crc32__ieee_hasher__checksum_u32(this);
8549
  }
8550
8551
#endif  // __cplusplus
8552
};  // struct wuffs_crc32__ieee_hasher__struct
8553
8554
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
8555
8556
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC32) || defined(WUFFS_NONMONOLITHIC)
8557
8558
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC64) || defined(WUFFS_NONMONOLITHIC)
8559
8560
// ---------------- Status Codes
8561
8562
// ---------------- Public Consts
8563
8564
// ---------------- Struct Declarations
8565
8566
typedef struct wuffs_crc64__ecma_hasher__struct wuffs_crc64__ecma_hasher;
8567
8568
#ifdef __cplusplus
8569
extern "C" {
8570
#endif
8571
8572
// ---------------- Public Initializer Prototypes
8573
8574
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
8575
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
8576
//
8577
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
8578
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
8579
8580
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
8581
wuffs_crc64__ecma_hasher__initialize(
8582
    wuffs_crc64__ecma_hasher* self,
8583
    size_t sizeof_star_self,
8584
    uint64_t wuffs_version,
8585
    uint32_t options);
8586
8587
size_t
8588
sizeof__wuffs_crc64__ecma_hasher(void);
8589
8590
// ---------------- Allocs
8591
8592
// These functions allocate and initialize Wuffs structs. They return NULL if
8593
// memory allocation fails. If they return non-NULL, there is no need to call
8594
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
8595
// calling free on the returned pointer. That pointer is effectively a C++
8596
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
8597
8598
wuffs_crc64__ecma_hasher*
8599
wuffs_crc64__ecma_hasher__alloc(void);
8600
8601
static inline wuffs_base__hasher_u64*
8602
wuffs_crc64__ecma_hasher__alloc_as__wuffs_base__hasher_u64(void) {
8603
  return (wuffs_base__hasher_u64*)(wuffs_crc64__ecma_hasher__alloc());
8604
}
8605
8606
// ---------------- Upcasts
8607
8608
static inline wuffs_base__hasher_u64*
8609
wuffs_crc64__ecma_hasher__upcast_as__wuffs_base__hasher_u64(
8610
    wuffs_crc64__ecma_hasher* p) {
8611
  return (wuffs_base__hasher_u64*)p;
8612
}
8613
8614
// ---------------- Public Function Prototypes
8615
8616
WUFFS_BASE__GENERATED_C_CODE
8617
WUFFS_BASE__MAYBE_STATIC uint64_t
8618
wuffs_crc64__ecma_hasher__get_quirk(
8619
    const wuffs_crc64__ecma_hasher* self,
8620
    uint32_t a_key);
8621
8622
WUFFS_BASE__GENERATED_C_CODE
8623
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
8624
wuffs_crc64__ecma_hasher__set_quirk(
8625
    wuffs_crc64__ecma_hasher* self,
8626
    uint32_t a_key,
8627
    uint64_t a_value);
8628
8629
WUFFS_BASE__GENERATED_C_CODE
8630
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
8631
wuffs_crc64__ecma_hasher__update(
8632
    wuffs_crc64__ecma_hasher* self,
8633
    wuffs_base__slice_u8 a_x);
8634
8635
WUFFS_BASE__GENERATED_C_CODE
8636
WUFFS_BASE__MAYBE_STATIC uint64_t
8637
wuffs_crc64__ecma_hasher__update_u64(
8638
    wuffs_crc64__ecma_hasher* self,
8639
    wuffs_base__slice_u8 a_x);
8640
8641
WUFFS_BASE__GENERATED_C_CODE
8642
WUFFS_BASE__MAYBE_STATIC uint64_t
8643
wuffs_crc64__ecma_hasher__checksum_u64(
8644
    const wuffs_crc64__ecma_hasher* self);
8645
8646
#ifdef __cplusplus
8647
}  // extern "C"
8648
#endif
8649
8650
// ---------------- Struct Definitions
8651
8652
// These structs' fields, and the sizeof them, are private implementation
8653
// details that aren't guaranteed to be stable across Wuffs versions.
8654
//
8655
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
8656
8657
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
8658
8659
struct wuffs_crc64__ecma_hasher__struct {
8660
  // Do not access the private_impl's or private_data's fields directly. There
8661
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
8662
  // the wuffs_foo__bar__baz functions.
8663
  //
8664
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
8665
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
8666
8667
  struct {
8668
    uint32_t magic;
8669
    uint32_t active_coroutine;
8670
    wuffs_base__vtable vtable_for__wuffs_base__hasher_u64;
8671
    wuffs_base__vtable null_vtable;
8672
8673
    uint64_t f_state;
8674
8675
    wuffs_base__empty_struct (*choosy_up)(
8676
        wuffs_crc64__ecma_hasher* self,
8677
        wuffs_base__slice_u8 a_x);
8678
  } private_impl;
8679
8680
#ifdef __cplusplus
8681
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
8682
  using unique_ptr = std::unique_ptr<wuffs_crc64__ecma_hasher, wuffs_unique_ptr_deleter>;
8683
8684
  // On failure, the alloc_etc functions return nullptr. They don't throw.
8685
8686
  static inline unique_ptr
8687
  alloc() {
8688
    return unique_ptr(wuffs_crc64__ecma_hasher__alloc());
8689
  }
8690
8691
  static inline wuffs_base__hasher_u64::unique_ptr
8692
  alloc_as__wuffs_base__hasher_u64() {
8693
    return wuffs_base__hasher_u64::unique_ptr(
8694
        wuffs_crc64__ecma_hasher__alloc_as__wuffs_base__hasher_u64());
8695
  }
8696
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
8697
8698
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
8699
  // Disallow constructing or copying an object via standard C++ mechanisms,
8700
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
8701
  // size and field layout is not part of the public, stable, memory-safe API.
8702
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
8703
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
8704
  // their first argument) rather than tweaking bar.private_impl.qux fields.
8705
  //
8706
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
8707
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
8708
  // order to provide convenience methods. These forward on "this", so that you
8709
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
8710
  wuffs_crc64__ecma_hasher__struct() = delete;
8711
  wuffs_crc64__ecma_hasher__struct(const wuffs_crc64__ecma_hasher__struct&) = delete;
8712
  wuffs_crc64__ecma_hasher__struct& operator=(
8713
      const wuffs_crc64__ecma_hasher__struct&) = delete;
8714
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
8715
8716
#if !defined(WUFFS_IMPLEMENTATION)
8717
  // As above, the size of the struct is not part of the public API, and unless
8718
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
8719
  // allocated, not stack allocated. Its size is not intended to be known at
8720
  // compile time, but it is unfortunately divulged as a side effect of
8721
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
8722
  // instead of "sizeof T", invoking the operator. To make the two values
8723
  // different, so that passing the latter will be rejected by the initialize
8724
  // function, we add an arbitrary amount of dead weight.
8725
  uint8_t dead_weight[123000000];  // 123 MB.
8726
#endif  // !defined(WUFFS_IMPLEMENTATION)
8727
8728
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
8729
  initialize(
8730
      size_t sizeof_star_self,
8731
      uint64_t wuffs_version,
8732
      uint32_t options) {
8733
    return wuffs_crc64__ecma_hasher__initialize(
8734
        this, sizeof_star_self, wuffs_version, options);
8735
  }
8736
8737
  inline wuffs_base__hasher_u64*
8738
  upcast_as__wuffs_base__hasher_u64() {
8739
    return (wuffs_base__hasher_u64*)this;
8740
  }
8741
8742
  inline uint64_t
8743
  get_quirk(
8744
      uint32_t a_key) const {
8745
    return wuffs_crc64__ecma_hasher__get_quirk(this, a_key);
8746
  }
8747
8748
  inline wuffs_base__status
8749
  set_quirk(
8750
      uint32_t a_key,
8751
      uint64_t a_value) {
8752
    return wuffs_crc64__ecma_hasher__set_quirk(this, a_key, a_value);
8753
  }
8754
8755
  inline wuffs_base__empty_struct
8756
  update(
8757
      wuffs_base__slice_u8 a_x) {
8758
    return wuffs_crc64__ecma_hasher__update(this, a_x);
8759
  }
8760
8761
  inline uint64_t
8762
  update_u64(
8763
      wuffs_base__slice_u8 a_x) {
8764
    return wuffs_crc64__ecma_hasher__update_u64(this, a_x);
8765
  }
8766
8767
  inline uint64_t
8768
  checksum_u64() const {
8769
    return wuffs_crc64__ecma_hasher__checksum_u64(this);
8770
  }
8771
8772
#endif  // __cplusplus
8773
};  // struct wuffs_crc64__ecma_hasher__struct
8774
8775
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
8776
8777
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC64) || defined(WUFFS_NONMONOLITHIC)
8778
8779
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__DEFLATE) || defined(WUFFS_NONMONOLITHIC)
8780
8781
// ---------------- Status Codes
8782
8783
extern const char wuffs_deflate__error__bad_huffman_code_over_subscribed[];
8784
extern const char wuffs_deflate__error__bad_huffman_code_under_subscribed[];
8785
extern const char wuffs_deflate__error__bad_huffman_code_length_count[];
8786
extern const char wuffs_deflate__error__bad_huffman_code_length_repetition[];
8787
extern const char wuffs_deflate__error__bad_huffman_code[];
8788
extern const char wuffs_deflate__error__bad_huffman_minimum_code_length[];
8789
extern const char wuffs_deflate__error__bad_block[];
8790
extern const char wuffs_deflate__error__bad_distance[];
8791
extern const char wuffs_deflate__error__bad_distance_code_count[];
8792
extern const char wuffs_deflate__error__bad_literal_length_code_count[];
8793
extern const char wuffs_deflate__error__inconsistent_stored_block_length[];
8794
extern const char wuffs_deflate__error__missing_end_of_block_code[];
8795
extern const char wuffs_deflate__error__no_huffman_codes[];
8796
extern const char wuffs_deflate__error__truncated_input[];
8797
8798
// ---------------- Public Consts
8799
8800
#define WUFFS_DEFLATE__DECODER_DST_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0u
8801
8802
#define WUFFS_DEFLATE__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 1u
8803
8804
// ---------------- Struct Declarations
8805
8806
typedef struct wuffs_deflate__decoder__struct wuffs_deflate__decoder;
8807
8808
#ifdef __cplusplus
8809
extern "C" {
8810
#endif
8811
8812
// ---------------- Public Initializer Prototypes
8813
8814
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
8815
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
8816
//
8817
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
8818
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
8819
8820
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
8821
wuffs_deflate__decoder__initialize(
8822
    wuffs_deflate__decoder* self,
8823
    size_t sizeof_star_self,
8824
    uint64_t wuffs_version,
8825
    uint32_t options);
8826
8827
size_t
8828
sizeof__wuffs_deflate__decoder(void);
8829
8830
// ---------------- Allocs
8831
8832
// These functions allocate and initialize Wuffs structs. They return NULL if
8833
// memory allocation fails. If they return non-NULL, there is no need to call
8834
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
8835
// calling free on the returned pointer. That pointer is effectively a C++
8836
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
8837
8838
wuffs_deflate__decoder*
8839
wuffs_deflate__decoder__alloc(void);
8840
8841
static inline wuffs_base__io_transformer*
8842
0
wuffs_deflate__decoder__alloc_as__wuffs_base__io_transformer(void) {
8843
0
  return (wuffs_base__io_transformer*)(wuffs_deflate__decoder__alloc());
8844
0
}
8845
8846
// ---------------- Upcasts
8847
8848
static inline wuffs_base__io_transformer*
8849
wuffs_deflate__decoder__upcast_as__wuffs_base__io_transformer(
8850
0
    wuffs_deflate__decoder* p) {
8851
0
  return (wuffs_base__io_transformer*)p;
8852
0
}
8853
8854
// ---------------- Public Function Prototypes
8855
8856
WUFFS_BASE__GENERATED_C_CODE
8857
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
8858
wuffs_deflate__decoder__add_history(
8859
    wuffs_deflate__decoder* self,
8860
    wuffs_base__slice_u8 a_hist);
8861
8862
WUFFS_BASE__GENERATED_C_CODE
8863
WUFFS_BASE__MAYBE_STATIC uint64_t
8864
wuffs_deflate__decoder__get_quirk(
8865
    const wuffs_deflate__decoder* self,
8866
    uint32_t a_key);
8867
8868
WUFFS_BASE__GENERATED_C_CODE
8869
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
8870
wuffs_deflate__decoder__set_quirk(
8871
    wuffs_deflate__decoder* self,
8872
    uint32_t a_key,
8873
    uint64_t a_value);
8874
8875
WUFFS_BASE__GENERATED_C_CODE
8876
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
8877
wuffs_deflate__decoder__dst_history_retain_length(
8878
    const wuffs_deflate__decoder* self);
8879
8880
WUFFS_BASE__GENERATED_C_CODE
8881
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
8882
wuffs_deflate__decoder__workbuf_len(
8883
    const wuffs_deflate__decoder* self);
8884
8885
WUFFS_BASE__GENERATED_C_CODE
8886
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
8887
wuffs_deflate__decoder__transform_io(
8888
    wuffs_deflate__decoder* self,
8889
    wuffs_base__io_buffer* a_dst,
8890
    wuffs_base__io_buffer* a_src,
8891
    wuffs_base__slice_u8 a_workbuf);
8892
8893
#ifdef __cplusplus
8894
}  // extern "C"
8895
#endif
8896
8897
// ---------------- Struct Definitions
8898
8899
// These structs' fields, and the sizeof them, are private implementation
8900
// details that aren't guaranteed to be stable across Wuffs versions.
8901
//
8902
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
8903
8904
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
8905
8906
struct wuffs_deflate__decoder__struct {
8907
  // Do not access the private_impl's or private_data's fields directly. There
8908
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
8909
  // the wuffs_foo__bar__baz functions.
8910
  //
8911
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
8912
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
8913
8914
  struct {
8915
    uint32_t magic;
8916
    uint32_t active_coroutine;
8917
    wuffs_base__vtable vtable_for__wuffs_base__io_transformer;
8918
    wuffs_base__vtable null_vtable;
8919
8920
    uint32_t f_bits;
8921
    uint32_t f_n_bits;
8922
    uint64_t f_transformed_history_count;
8923
    uint32_t f_history_index;
8924
    uint32_t f_n_huffs_bits[2];
8925
    bool f_end_of_block;
8926
8927
    uint32_t p_transform_io;
8928
    uint32_t p_do_transform_io;
8929
    uint32_t p_decode_blocks;
8930
    uint32_t p_decode_uncompressed;
8931
    uint32_t p_init_dynamic_huffman;
8932
    wuffs_base__status (*choosy_decode_huffman_fast64)(
8933
        wuffs_deflate__decoder* self,
8934
        wuffs_base__io_buffer* a_dst,
8935
        wuffs_base__io_buffer* a_src);
8936
    uint32_t p_decode_huffman_slow;
8937
  } private_impl;
8938
8939
  struct {
8940
    uint32_t f_huffs[2][1024];
8941
    uint8_t f_history[33025];
8942
    uint8_t f_code_lengths[320];
8943
8944
    struct {
8945
      uint32_t v_final;
8946
    } s_decode_blocks;
8947
    struct {
8948
      uint32_t v_length;
8949
      uint64_t scratch;
8950
    } s_decode_uncompressed;
8951
    struct {
8952
      uint32_t v_bits;
8953
      uint32_t v_n_bits;
8954
      uint32_t v_n_lit;
8955
      uint32_t v_n_dist;
8956
      uint32_t v_n_clen;
8957
      uint32_t v_i;
8958
      uint32_t v_mask;
8959
      uint32_t v_n_extra_bits;
8960
      uint8_t v_rep_symbol;
8961
      uint32_t v_rep_count;
8962
    } s_init_dynamic_huffman;
8963
    struct {
8964
      uint32_t v_bits;
8965
      uint32_t v_n_bits;
8966
      uint32_t v_table_entry_n_bits;
8967
      uint32_t v_lmask;
8968
      uint32_t v_dmask;
8969
      uint32_t v_redir_top;
8970
      uint32_t v_redir_mask;
8971
      uint32_t v_length;
8972
      uint32_t v_dist_minus_1;
8973
      uint64_t scratch;
8974
    } s_decode_huffman_slow;
8975
  } private_data;
8976
8977
#ifdef __cplusplus
8978
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
8979
  using unique_ptr = std::unique_ptr<wuffs_deflate__decoder, wuffs_unique_ptr_deleter>;
8980
8981
  // On failure, the alloc_etc functions return nullptr. They don't throw.
8982
8983
  static inline unique_ptr
8984
  alloc() {
8985
    return unique_ptr(wuffs_deflate__decoder__alloc());
8986
  }
8987
8988
  static inline wuffs_base__io_transformer::unique_ptr
8989
  alloc_as__wuffs_base__io_transformer() {
8990
    return wuffs_base__io_transformer::unique_ptr(
8991
        wuffs_deflate__decoder__alloc_as__wuffs_base__io_transformer());
8992
  }
8993
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
8994
8995
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
8996
  // Disallow constructing or copying an object via standard C++ mechanisms,
8997
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
8998
  // size and field layout is not part of the public, stable, memory-safe API.
8999
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
9000
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
9001
  // their first argument) rather than tweaking bar.private_impl.qux fields.
9002
  //
9003
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
9004
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
9005
  // order to provide convenience methods. These forward on "this", so that you
9006
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
9007
  wuffs_deflate__decoder__struct() = delete;
9008
  wuffs_deflate__decoder__struct(const wuffs_deflate__decoder__struct&) = delete;
9009
  wuffs_deflate__decoder__struct& operator=(
9010
      const wuffs_deflate__decoder__struct&) = delete;
9011
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
9012
9013
#if !defined(WUFFS_IMPLEMENTATION)
9014
  // As above, the size of the struct is not part of the public API, and unless
9015
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
9016
  // allocated, not stack allocated. Its size is not intended to be known at
9017
  // compile time, but it is unfortunately divulged as a side effect of
9018
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
9019
  // instead of "sizeof T", invoking the operator. To make the two values
9020
  // different, so that passing the latter will be rejected by the initialize
9021
  // function, we add an arbitrary amount of dead weight.
9022
  uint8_t dead_weight[123000000];  // 123 MB.
9023
#endif  // !defined(WUFFS_IMPLEMENTATION)
9024
9025
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
9026
  initialize(
9027
      size_t sizeof_star_self,
9028
      uint64_t wuffs_version,
9029
      uint32_t options) {
9030
    return wuffs_deflate__decoder__initialize(
9031
        this, sizeof_star_self, wuffs_version, options);
9032
  }
9033
9034
  inline wuffs_base__io_transformer*
9035
  upcast_as__wuffs_base__io_transformer() {
9036
    return (wuffs_base__io_transformer*)this;
9037
  }
9038
9039
  inline wuffs_base__empty_struct
9040
  add_history(
9041
      wuffs_base__slice_u8 a_hist) {
9042
    return wuffs_deflate__decoder__add_history(this, a_hist);
9043
  }
9044
9045
  inline uint64_t
9046
  get_quirk(
9047
      uint32_t a_key) const {
9048
    return wuffs_deflate__decoder__get_quirk(this, a_key);
9049
  }
9050
9051
  inline wuffs_base__status
9052
  set_quirk(
9053
      uint32_t a_key,
9054
      uint64_t a_value) {
9055
    return wuffs_deflate__decoder__set_quirk(this, a_key, a_value);
9056
  }
9057
9058
  inline wuffs_base__optional_u63
9059
  dst_history_retain_length() const {
9060
    return wuffs_deflate__decoder__dst_history_retain_length(this);
9061
  }
9062
9063
  inline wuffs_base__range_ii_u64
9064
  workbuf_len() const {
9065
    return wuffs_deflate__decoder__workbuf_len(this);
9066
  }
9067
9068
  inline wuffs_base__status
9069
  transform_io(
9070
      wuffs_base__io_buffer* a_dst,
9071
      wuffs_base__io_buffer* a_src,
9072
      wuffs_base__slice_u8 a_workbuf) {
9073
    return wuffs_deflate__decoder__transform_io(this, a_dst, a_src, a_workbuf);
9074
  }
9075
9076
#endif  // __cplusplus
9077
};  // struct wuffs_deflate__decoder__struct
9078
9079
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
9080
9081
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__DEFLATE) || defined(WUFFS_NONMONOLITHIC)
9082
9083
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ETC2) || defined(WUFFS_NONMONOLITHIC)
9084
9085
// ---------------- Status Codes
9086
9087
extern const char wuffs_etc2__error__bad_header[];
9088
extern const char wuffs_etc2__error__truncated_input[];
9089
extern const char wuffs_etc2__error__unsupported_etc2_file[];
9090
9091
// ---------------- Public Consts
9092
9093
#define WUFFS_ETC2__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u
9094
9095
// ---------------- Struct Declarations
9096
9097
typedef struct wuffs_etc2__decoder__struct wuffs_etc2__decoder;
9098
9099
#ifdef __cplusplus
9100
extern "C" {
9101
#endif
9102
9103
// ---------------- Public Initializer Prototypes
9104
9105
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
9106
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
9107
//
9108
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
9109
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
9110
9111
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
9112
wuffs_etc2__decoder__initialize(
9113
    wuffs_etc2__decoder* self,
9114
    size_t sizeof_star_self,
9115
    uint64_t wuffs_version,
9116
    uint32_t options);
9117
9118
size_t
9119
sizeof__wuffs_etc2__decoder(void);
9120
9121
// ---------------- Allocs
9122
9123
// These functions allocate and initialize Wuffs structs. They return NULL if
9124
// memory allocation fails. If they return non-NULL, there is no need to call
9125
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
9126
// calling free on the returned pointer. That pointer is effectively a C++
9127
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
9128
9129
wuffs_etc2__decoder*
9130
wuffs_etc2__decoder__alloc(void);
9131
9132
static inline wuffs_base__image_decoder*
9133
wuffs_etc2__decoder__alloc_as__wuffs_base__image_decoder(void) {
9134
  return (wuffs_base__image_decoder*)(wuffs_etc2__decoder__alloc());
9135
}
9136
9137
// ---------------- Upcasts
9138
9139
static inline wuffs_base__image_decoder*
9140
wuffs_etc2__decoder__upcast_as__wuffs_base__image_decoder(
9141
    wuffs_etc2__decoder* p) {
9142
  return (wuffs_base__image_decoder*)p;
9143
}
9144
9145
// ---------------- Public Function Prototypes
9146
9147
WUFFS_BASE__GENERATED_C_CODE
9148
WUFFS_BASE__MAYBE_STATIC uint64_t
9149
wuffs_etc2__decoder__get_quirk(
9150
    const wuffs_etc2__decoder* self,
9151
    uint32_t a_key);
9152
9153
WUFFS_BASE__GENERATED_C_CODE
9154
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
9155
wuffs_etc2__decoder__set_quirk(
9156
    wuffs_etc2__decoder* self,
9157
    uint32_t a_key,
9158
    uint64_t a_value);
9159
9160
WUFFS_BASE__GENERATED_C_CODE
9161
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
9162
wuffs_etc2__decoder__decode_image_config(
9163
    wuffs_etc2__decoder* self,
9164
    wuffs_base__image_config* a_dst,
9165
    wuffs_base__io_buffer* a_src);
9166
9167
WUFFS_BASE__GENERATED_C_CODE
9168
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
9169
wuffs_etc2__decoder__decode_frame_config(
9170
    wuffs_etc2__decoder* self,
9171
    wuffs_base__frame_config* a_dst,
9172
    wuffs_base__io_buffer* a_src);
9173
9174
WUFFS_BASE__GENERATED_C_CODE
9175
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
9176
wuffs_etc2__decoder__decode_frame(
9177
    wuffs_etc2__decoder* self,
9178
    wuffs_base__pixel_buffer* a_dst,
9179
    wuffs_base__io_buffer* a_src,
9180
    wuffs_base__pixel_blend a_blend,
9181
    wuffs_base__slice_u8 a_workbuf,
9182
    wuffs_base__decode_frame_options* a_opts);
9183
9184
WUFFS_BASE__GENERATED_C_CODE
9185
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
9186
wuffs_etc2__decoder__frame_dirty_rect(
9187
    const wuffs_etc2__decoder* self);
9188
9189
WUFFS_BASE__GENERATED_C_CODE
9190
WUFFS_BASE__MAYBE_STATIC uint32_t
9191
wuffs_etc2__decoder__num_animation_loops(
9192
    const wuffs_etc2__decoder* self);
9193
9194
WUFFS_BASE__GENERATED_C_CODE
9195
WUFFS_BASE__MAYBE_STATIC uint64_t
9196
wuffs_etc2__decoder__num_decoded_frame_configs(
9197
    const wuffs_etc2__decoder* self);
9198
9199
WUFFS_BASE__GENERATED_C_CODE
9200
WUFFS_BASE__MAYBE_STATIC uint64_t
9201
wuffs_etc2__decoder__num_decoded_frames(
9202
    const wuffs_etc2__decoder* self);
9203
9204
WUFFS_BASE__GENERATED_C_CODE
9205
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
9206
wuffs_etc2__decoder__restart_frame(
9207
    wuffs_etc2__decoder* self,
9208
    uint64_t a_index,
9209
    uint64_t a_io_position);
9210
9211
WUFFS_BASE__GENERATED_C_CODE
9212
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
9213
wuffs_etc2__decoder__set_report_metadata(
9214
    wuffs_etc2__decoder* self,
9215
    uint32_t a_fourcc,
9216
    bool a_report);
9217
9218
WUFFS_BASE__GENERATED_C_CODE
9219
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
9220
wuffs_etc2__decoder__tell_me_more(
9221
    wuffs_etc2__decoder* self,
9222
    wuffs_base__io_buffer* a_dst,
9223
    wuffs_base__more_information* a_minfo,
9224
    wuffs_base__io_buffer* a_src);
9225
9226
WUFFS_BASE__GENERATED_C_CODE
9227
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
9228
wuffs_etc2__decoder__workbuf_len(
9229
    const wuffs_etc2__decoder* self);
9230
9231
#ifdef __cplusplus
9232
}  // extern "C"
9233
#endif
9234
9235
// ---------------- Struct Definitions
9236
9237
// These structs' fields, and the sizeof them, are private implementation
9238
// details that aren't guaranteed to be stable across Wuffs versions.
9239
//
9240
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
9241
9242
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
9243
9244
struct wuffs_etc2__decoder__struct {
9245
  // Do not access the private_impl's or private_data's fields directly. There
9246
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
9247
  // the wuffs_foo__bar__baz functions.
9248
  //
9249
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
9250
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
9251
9252
  struct {
9253
    uint32_t magic;
9254
    uint32_t active_coroutine;
9255
    wuffs_base__vtable vtable_for__wuffs_base__image_decoder;
9256
    wuffs_base__vtable null_vtable;
9257
9258
    uint32_t f_pixfmt;
9259
    uint32_t f_width;
9260
    uint32_t f_height;
9261
    uint8_t f_call_sequence;
9262
    bool f_srgb;
9263
    uint32_t f_num_buffered_blocks;
9264
    uint32_t f_dst_x;
9265
    uint32_t f_dst_y;
9266
    wuffs_base__pixel_swizzler f_swizzler;
9267
9268
    uint32_t p_decode_image_config;
9269
    uint32_t p_do_decode_image_config;
9270
    uint32_t p_decode_frame_config;
9271
    uint32_t p_do_decode_frame_config;
9272
    uint32_t p_decode_frame;
9273
    uint32_t p_do_decode_frame;
9274
    uint32_t p_from_src_to_colors;
9275
  } private_impl;
9276
9277
  struct {
9278
    uint64_t f_alphas[64];
9279
    uint64_t f_colors[64];
9280
    uint8_t f_buffer[4096];
9281
9282
    struct {
9283
      uint16_t v_rounded_up_width;
9284
      uint16_t v_rounded_up_height;
9285
      uint64_t scratch;
9286
    } s_do_decode_image_config;
9287
    struct {
9288
      uint32_t v_remaining;
9289
    } s_do_decode_frame;
9290
    struct {
9291
      uint32_t v_bi;
9292
      uint64_t scratch;
9293
    } s_from_src_to_colors;
9294
  } private_data;
9295
9296
#ifdef __cplusplus
9297
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
9298
  using unique_ptr = std::unique_ptr<wuffs_etc2__decoder, wuffs_unique_ptr_deleter>;
9299
9300
  // On failure, the alloc_etc functions return nullptr. They don't throw.
9301
9302
  static inline unique_ptr
9303
  alloc() {
9304
    return unique_ptr(wuffs_etc2__decoder__alloc());
9305
  }
9306
9307
  static inline wuffs_base__image_decoder::unique_ptr
9308
  alloc_as__wuffs_base__image_decoder() {
9309
    return wuffs_base__image_decoder::unique_ptr(
9310
        wuffs_etc2__decoder__alloc_as__wuffs_base__image_decoder());
9311
  }
9312
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
9313
9314
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
9315
  // Disallow constructing or copying an object via standard C++ mechanisms,
9316
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
9317
  // size and field layout is not part of the public, stable, memory-safe API.
9318
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
9319
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
9320
  // their first argument) rather than tweaking bar.private_impl.qux fields.
9321
  //
9322
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
9323
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
9324
  // order to provide convenience methods. These forward on "this", so that you
9325
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
9326
  wuffs_etc2__decoder__struct() = delete;
9327
  wuffs_etc2__decoder__struct(const wuffs_etc2__decoder__struct&) = delete;
9328
  wuffs_etc2__decoder__struct& operator=(
9329
      const wuffs_etc2__decoder__struct&) = delete;
9330
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
9331
9332
#if !defined(WUFFS_IMPLEMENTATION)
9333
  // As above, the size of the struct is not part of the public API, and unless
9334
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
9335
  // allocated, not stack allocated. Its size is not intended to be known at
9336
  // compile time, but it is unfortunately divulged as a side effect of
9337
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
9338
  // instead of "sizeof T", invoking the operator. To make the two values
9339
  // different, so that passing the latter will be rejected by the initialize
9340
  // function, we add an arbitrary amount of dead weight.
9341
  uint8_t dead_weight[123000000];  // 123 MB.
9342
#endif  // !defined(WUFFS_IMPLEMENTATION)
9343
9344
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
9345
  initialize(
9346
      size_t sizeof_star_self,
9347
      uint64_t wuffs_version,
9348
      uint32_t options) {
9349
    return wuffs_etc2__decoder__initialize(
9350
        this, sizeof_star_self, wuffs_version, options);
9351
  }
9352
9353
  inline wuffs_base__image_decoder*
9354
  upcast_as__wuffs_base__image_decoder() {
9355
    return (wuffs_base__image_decoder*)this;
9356
  }
9357
9358
  inline uint64_t
9359
  get_quirk(
9360
      uint32_t a_key) const {
9361
    return wuffs_etc2__decoder__get_quirk(this, a_key);
9362
  }
9363
9364
  inline wuffs_base__status
9365
  set_quirk(
9366
      uint32_t a_key,
9367
      uint64_t a_value) {
9368
    return wuffs_etc2__decoder__set_quirk(this, a_key, a_value);
9369
  }
9370
9371
  inline wuffs_base__status
9372
  decode_image_config(
9373
      wuffs_base__image_config* a_dst,
9374
      wuffs_base__io_buffer* a_src) {
9375
    return wuffs_etc2__decoder__decode_image_config(this, a_dst, a_src);
9376
  }
9377
9378
  inline wuffs_base__status
9379
  decode_frame_config(
9380
      wuffs_base__frame_config* a_dst,
9381
      wuffs_base__io_buffer* a_src) {
9382
    return wuffs_etc2__decoder__decode_frame_config(this, a_dst, a_src);
9383
  }
9384
9385
  inline wuffs_base__status
9386
  decode_frame(
9387
      wuffs_base__pixel_buffer* a_dst,
9388
      wuffs_base__io_buffer* a_src,
9389
      wuffs_base__pixel_blend a_blend,
9390
      wuffs_base__slice_u8 a_workbuf,
9391
      wuffs_base__decode_frame_options* a_opts) {
9392
    return wuffs_etc2__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts);
9393
  }
9394
9395
  inline wuffs_base__rect_ie_u32
9396
  frame_dirty_rect() const {
9397
    return wuffs_etc2__decoder__frame_dirty_rect(this);
9398
  }
9399
9400
  inline uint32_t
9401
  num_animation_loops() const {
9402
    return wuffs_etc2__decoder__num_animation_loops(this);
9403
  }
9404
9405
  inline uint64_t
9406
  num_decoded_frame_configs() const {
9407
    return wuffs_etc2__decoder__num_decoded_frame_configs(this);
9408
  }
9409
9410
  inline uint64_t
9411
  num_decoded_frames() const {
9412
    return wuffs_etc2__decoder__num_decoded_frames(this);
9413
  }
9414
9415
  inline wuffs_base__status
9416
  restart_frame(
9417
      uint64_t a_index,
9418
      uint64_t a_io_position) {
9419
    return wuffs_etc2__decoder__restart_frame(this, a_index, a_io_position);
9420
  }
9421
9422
  inline wuffs_base__empty_struct
9423
  set_report_metadata(
9424
      uint32_t a_fourcc,
9425
      bool a_report) {
9426
    return wuffs_etc2__decoder__set_report_metadata(this, a_fourcc, a_report);
9427
  }
9428
9429
  inline wuffs_base__status
9430
  tell_me_more(
9431
      wuffs_base__io_buffer* a_dst,
9432
      wuffs_base__more_information* a_minfo,
9433
      wuffs_base__io_buffer* a_src) {
9434
    return wuffs_etc2__decoder__tell_me_more(this, a_dst, a_minfo, a_src);
9435
  }
9436
9437
  inline wuffs_base__range_ii_u64
9438
  workbuf_len() const {
9439
    return wuffs_etc2__decoder__workbuf_len(this);
9440
  }
9441
9442
#endif  // __cplusplus
9443
};  // struct wuffs_etc2__decoder__struct
9444
9445
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
9446
9447
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ETC2) || defined(WUFFS_NONMONOLITHIC)
9448
9449
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GIF) || defined(WUFFS_NONMONOLITHIC)
9450
9451
// ---------------- Status Codes
9452
9453
extern const char wuffs_gif__error__bad_lzw_code[];
9454
extern const char wuffs_gif__error__bad_extension_label[];
9455
extern const char wuffs_gif__error__bad_frame_size[];
9456
extern const char wuffs_gif__error__bad_graphic_control[];
9457
extern const char wuffs_gif__error__bad_header[];
9458
extern const char wuffs_gif__error__bad_literal_width[];
9459
extern const char wuffs_gif__error__bad_palette[];
9460
extern const char wuffs_gif__error__truncated_input[];
9461
9462
// ---------------- Public Consts
9463
9464
#define WUFFS_GIF__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u
9465
9466
#define WUFFS_GIF__QUIRK_DELAY_NUM_DECODED_FRAMES 983928832u
9467
9468
#define WUFFS_GIF__QUIRK_FIRST_FRAME_LOCAL_PALETTE_MEANS_BLACK_BACKGROUND 983928833u
9469
9470
#define WUFFS_GIF__QUIRK_HONOR_BACKGROUND_COLOR 983928834u
9471
9472
#define WUFFS_GIF__QUIRK_IGNORE_TOO_MUCH_PIXEL_DATA 983928835u
9473
9474
#define WUFFS_GIF__QUIRK_IMAGE_BOUNDS_ARE_STRICT 983928836u
9475
9476
#define WUFFS_GIF__QUIRK_REJECT_EMPTY_FRAME 983928837u
9477
9478
#define WUFFS_GIF__QUIRK_REJECT_EMPTY_PALETTE 983928838u
9479
9480
// ---------------- Struct Declarations
9481
9482
typedef struct wuffs_gif__decoder__struct wuffs_gif__decoder;
9483
9484
#ifdef __cplusplus
9485
extern "C" {
9486
#endif
9487
9488
// ---------------- Public Initializer Prototypes
9489
9490
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
9491
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
9492
//
9493
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
9494
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
9495
9496
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
9497
wuffs_gif__decoder__initialize(
9498
    wuffs_gif__decoder* self,
9499
    size_t sizeof_star_self,
9500
    uint64_t wuffs_version,
9501
    uint32_t options);
9502
9503
size_t
9504
sizeof__wuffs_gif__decoder(void);
9505
9506
// ---------------- Allocs
9507
9508
// These functions allocate and initialize Wuffs structs. They return NULL if
9509
// memory allocation fails. If they return non-NULL, there is no need to call
9510
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
9511
// calling free on the returned pointer. That pointer is effectively a C++
9512
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
9513
9514
wuffs_gif__decoder*
9515
wuffs_gif__decoder__alloc(void);
9516
9517
static inline wuffs_base__image_decoder*
9518
wuffs_gif__decoder__alloc_as__wuffs_base__image_decoder(void) {
9519
  return (wuffs_base__image_decoder*)(wuffs_gif__decoder__alloc());
9520
}
9521
9522
// ---------------- Upcasts
9523
9524
static inline wuffs_base__image_decoder*
9525
wuffs_gif__decoder__upcast_as__wuffs_base__image_decoder(
9526
    wuffs_gif__decoder* p) {
9527
  return (wuffs_base__image_decoder*)p;
9528
}
9529
9530
// ---------------- Public Function Prototypes
9531
9532
WUFFS_BASE__GENERATED_C_CODE
9533
WUFFS_BASE__MAYBE_STATIC uint64_t
9534
wuffs_gif__decoder__get_quirk(
9535
    const wuffs_gif__decoder* self,
9536
    uint32_t a_key);
9537
9538
WUFFS_BASE__GENERATED_C_CODE
9539
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
9540
wuffs_gif__decoder__set_quirk(
9541
    wuffs_gif__decoder* self,
9542
    uint32_t a_key,
9543
    uint64_t a_value);
9544
9545
WUFFS_BASE__GENERATED_C_CODE
9546
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
9547
wuffs_gif__decoder__decode_image_config(
9548
    wuffs_gif__decoder* self,
9549
    wuffs_base__image_config* a_dst,
9550
    wuffs_base__io_buffer* a_src);
9551
9552
WUFFS_BASE__GENERATED_C_CODE
9553
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
9554
wuffs_gif__decoder__set_report_metadata(
9555
    wuffs_gif__decoder* self,
9556
    uint32_t a_fourcc,
9557
    bool a_report);
9558
9559
WUFFS_BASE__GENERATED_C_CODE
9560
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
9561
wuffs_gif__decoder__tell_me_more(
9562
    wuffs_gif__decoder* self,
9563
    wuffs_base__io_buffer* a_dst,
9564
    wuffs_base__more_information* a_minfo,
9565
    wuffs_base__io_buffer* a_src);
9566
9567
WUFFS_BASE__GENERATED_C_CODE
9568
WUFFS_BASE__MAYBE_STATIC uint32_t
9569
wuffs_gif__decoder__num_animation_loops(
9570
    const wuffs_gif__decoder* self);
9571
9572
WUFFS_BASE__GENERATED_C_CODE
9573
WUFFS_BASE__MAYBE_STATIC uint64_t
9574
wuffs_gif__decoder__num_decoded_frame_configs(
9575
    const wuffs_gif__decoder* self);
9576
9577
WUFFS_BASE__GENERATED_C_CODE
9578
WUFFS_BASE__MAYBE_STATIC uint64_t
9579
wuffs_gif__decoder__num_decoded_frames(
9580
    const wuffs_gif__decoder* self);
9581
9582
WUFFS_BASE__GENERATED_C_CODE
9583
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
9584
wuffs_gif__decoder__frame_dirty_rect(
9585
    const wuffs_gif__decoder* self);
9586
9587
WUFFS_BASE__GENERATED_C_CODE
9588
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
9589
wuffs_gif__decoder__workbuf_len(
9590
    const wuffs_gif__decoder* self);
9591
9592
WUFFS_BASE__GENERATED_C_CODE
9593
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
9594
wuffs_gif__decoder__restart_frame(
9595
    wuffs_gif__decoder* self,
9596
    uint64_t a_index,
9597
    uint64_t a_io_position);
9598
9599
WUFFS_BASE__GENERATED_C_CODE
9600
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
9601
wuffs_gif__decoder__decode_frame_config(
9602
    wuffs_gif__decoder* self,
9603
    wuffs_base__frame_config* a_dst,
9604
    wuffs_base__io_buffer* a_src);
9605
9606
WUFFS_BASE__GENERATED_C_CODE
9607
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
9608
wuffs_gif__decoder__decode_frame(
9609
    wuffs_gif__decoder* self,
9610
    wuffs_base__pixel_buffer* a_dst,
9611
    wuffs_base__io_buffer* a_src,
9612
    wuffs_base__pixel_blend a_blend,
9613
    wuffs_base__slice_u8 a_workbuf,
9614
    wuffs_base__decode_frame_options* a_opts);
9615
9616
#ifdef __cplusplus
9617
}  // extern "C"
9618
#endif
9619
9620
// ---------------- Struct Definitions
9621
9622
// These structs' fields, and the sizeof them, are private implementation
9623
// details that aren't guaranteed to be stable across Wuffs versions.
9624
//
9625
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
9626
9627
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
9628
9629
struct wuffs_gif__decoder__struct {
9630
  // Do not access the private_impl's or private_data's fields directly. There
9631
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
9632
  // the wuffs_foo__bar__baz functions.
9633
  //
9634
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
9635
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
9636
9637
  struct {
9638
    uint32_t magic;
9639
    uint32_t active_coroutine;
9640
    wuffs_base__vtable vtable_for__wuffs_base__image_decoder;
9641
    wuffs_base__vtable null_vtable;
9642
9643
    uint32_t f_width;
9644
    uint32_t f_height;
9645
    uint8_t f_call_sequence;
9646
    bool f_report_metadata_iccp;
9647
    bool f_report_metadata_xmp;
9648
    uint32_t f_metadata_fourcc;
9649
    uint64_t f_metadata_io_position;
9650
    bool f_quirks[7];
9651
    bool f_delayed_num_decoded_frames;
9652
    bool f_seen_header;
9653
    bool f_ignored_but_affects_benchmarks;
9654
    bool f_has_global_palette;
9655
    uint8_t f_interlace;
9656
    bool f_seen_num_animation_loops_value;
9657
    uint32_t f_num_animation_loops_value;
9658
    uint32_t f_background_color_u32_argb_premul;
9659
    uint32_t f_black_color_u32_argb_premul;
9660
    bool f_gc_has_transparent_index;
9661
    uint8_t f_gc_transparent_index;
9662
    uint8_t f_gc_disposal;
9663
    uint64_t f_gc_duration;
9664
    uint64_t f_frame_config_io_position;
9665
    uint64_t f_num_decoded_frame_configs_value;
9666
    uint64_t f_num_decoded_frames_value;
9667
    uint32_t f_frame_rect_x0;
9668
    uint32_t f_frame_rect_y0;
9669
    uint32_t f_frame_rect_x1;
9670
    uint32_t f_frame_rect_y1;
9671
    uint32_t f_dst_x;
9672
    uint32_t f_dst_y;
9673
    uint32_t f_dirty_max_excl_y;
9674
    uint64_t f_compressed_ri;
9675
    uint64_t f_compressed_wi;
9676
    wuffs_base__pixel_swizzler f_swizzler;
9677
    uint32_t f_lzw_pending_literal_width_plus_one;
9678
    uint32_t f_lzw_literal_width;
9679
    uint32_t f_lzw_clear_code;
9680
    uint32_t f_lzw_end_code;
9681
    uint32_t f_lzw_save_code;
9682
    uint32_t f_lzw_prev_code;
9683
    uint32_t f_lzw_width;
9684
    uint32_t f_lzw_bits;
9685
    uint32_t f_lzw_n_bits;
9686
    uint32_t f_lzw_output_ri;
9687
    uint32_t f_lzw_output_wi;
9688
    uint32_t f_lzw_read_from_return_value;
9689
    uint16_t f_lzw_prefixes[4096];
9690
9691
    uint32_t p_decode_image_config;
9692
    uint32_t p_do_decode_image_config;
9693
    uint32_t p_tell_me_more;
9694
    uint32_t p_do_tell_me_more;
9695
    uint32_t p_decode_frame_config;
9696
    uint32_t p_do_decode_frame_config;
9697
    uint32_t p_skip_frame;
9698
    uint32_t p_decode_frame;
9699
    uint32_t p_do_decode_frame;
9700
    uint32_t p_decode_up_to_id_part1;
9701
    uint32_t p_decode_header;
9702
    uint32_t p_decode_lsd;
9703
    uint32_t p_decode_extension;
9704
    uint32_t p_skip_blocks;
9705
    uint32_t p_decode_ae;
9706
    uint32_t p_decode_gc;
9707
    uint32_t p_decode_id_part0;
9708
    uint32_t p_decode_id_part1;
9709
    uint32_t p_decode_id_part2;
9710
  } private_impl;
9711
9712
  struct {
9713
    uint8_t f_compressed[4096];
9714
    uint8_t f_palettes[2][1024];
9715
    uint8_t f_dst_palette[1024];
9716
    uint8_t f_lzw_suffixes[4096][8];
9717
    uint16_t f_lzw_lm1s[4096];
9718
    uint8_t f_lzw_output[8199];
9719
9720
    struct {
9721
      uint32_t v_background_color;
9722
    } s_do_decode_frame_config;
9723
    struct {
9724
      uint64_t scratch;
9725
    } s_skip_frame;
9726
    struct {
9727
      uint64_t scratch;
9728
    } s_decode_header;
9729
    struct {
9730
      uint8_t v_flags;
9731
      uint8_t v_background_color_index;
9732
      uint32_t v_num_palette_entries;
9733
      uint32_t v_i;
9734
      uint64_t scratch;
9735
    } s_decode_lsd;
9736
    struct {
9737
      uint64_t scratch;
9738
    } s_skip_blocks;
9739
    struct {
9740
      uint8_t v_block_size;
9741
      bool v_is_animexts;
9742
      bool v_is_netscape;
9743
      bool v_is_iccp;
9744
      bool v_is_xmp;
9745
      uint64_t scratch;
9746
    } s_decode_ae;
9747
    struct {
9748
      uint64_t scratch;
9749
    } s_decode_gc;
9750
    struct {
9751
      uint64_t scratch;
9752
    } s_decode_id_part0;
9753
    struct {
9754
      uint8_t v_which_palette;
9755
      uint32_t v_num_palette_entries;
9756
      uint32_t v_i;
9757
      uint64_t scratch;
9758
    } s_decode_id_part1;
9759
    struct {
9760
      uint64_t v_block_size;
9761
      bool v_need_block_size;
9762
      uint64_t scratch;
9763
    } s_decode_id_part2;
9764
  } private_data;
9765
9766
#ifdef __cplusplus
9767
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
9768
  using unique_ptr = std::unique_ptr<wuffs_gif__decoder, wuffs_unique_ptr_deleter>;
9769
9770
  // On failure, the alloc_etc functions return nullptr. They don't throw.
9771
9772
  static inline unique_ptr
9773
  alloc() {
9774
    return unique_ptr(wuffs_gif__decoder__alloc());
9775
  }
9776
9777
  static inline wuffs_base__image_decoder::unique_ptr
9778
  alloc_as__wuffs_base__image_decoder() {
9779
    return wuffs_base__image_decoder::unique_ptr(
9780
        wuffs_gif__decoder__alloc_as__wuffs_base__image_decoder());
9781
  }
9782
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
9783
9784
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
9785
  // Disallow constructing or copying an object via standard C++ mechanisms,
9786
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
9787
  // size and field layout is not part of the public, stable, memory-safe API.
9788
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
9789
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
9790
  // their first argument) rather than tweaking bar.private_impl.qux fields.
9791
  //
9792
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
9793
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
9794
  // order to provide convenience methods. These forward on "this", so that you
9795
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
9796
  wuffs_gif__decoder__struct() = delete;
9797
  wuffs_gif__decoder__struct(const wuffs_gif__decoder__struct&) = delete;
9798
  wuffs_gif__decoder__struct& operator=(
9799
      const wuffs_gif__decoder__struct&) = delete;
9800
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
9801
9802
#if !defined(WUFFS_IMPLEMENTATION)
9803
  // As above, the size of the struct is not part of the public API, and unless
9804
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
9805
  // allocated, not stack allocated. Its size is not intended to be known at
9806
  // compile time, but it is unfortunately divulged as a side effect of
9807
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
9808
  // instead of "sizeof T", invoking the operator. To make the two values
9809
  // different, so that passing the latter will be rejected by the initialize
9810
  // function, we add an arbitrary amount of dead weight.
9811
  uint8_t dead_weight[123000000];  // 123 MB.
9812
#endif  // !defined(WUFFS_IMPLEMENTATION)
9813
9814
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
9815
  initialize(
9816
      size_t sizeof_star_self,
9817
      uint64_t wuffs_version,
9818
      uint32_t options) {
9819
    return wuffs_gif__decoder__initialize(
9820
        this, sizeof_star_self, wuffs_version, options);
9821
  }
9822
9823
  inline wuffs_base__image_decoder*
9824
  upcast_as__wuffs_base__image_decoder() {
9825
    return (wuffs_base__image_decoder*)this;
9826
  }
9827
9828
  inline uint64_t
9829
  get_quirk(
9830
      uint32_t a_key) const {
9831
    return wuffs_gif__decoder__get_quirk(this, a_key);
9832
  }
9833
9834
  inline wuffs_base__status
9835
  set_quirk(
9836
      uint32_t a_key,
9837
      uint64_t a_value) {
9838
    return wuffs_gif__decoder__set_quirk(this, a_key, a_value);
9839
  }
9840
9841
  inline wuffs_base__status
9842
  decode_image_config(
9843
      wuffs_base__image_config* a_dst,
9844
      wuffs_base__io_buffer* a_src) {
9845
    return wuffs_gif__decoder__decode_image_config(this, a_dst, a_src);
9846
  }
9847
9848
  inline wuffs_base__empty_struct
9849
  set_report_metadata(
9850
      uint32_t a_fourcc,
9851
      bool a_report) {
9852
    return wuffs_gif__decoder__set_report_metadata(this, a_fourcc, a_report);
9853
  }
9854
9855
  inline wuffs_base__status
9856
  tell_me_more(
9857
      wuffs_base__io_buffer* a_dst,
9858
      wuffs_base__more_information* a_minfo,
9859
      wuffs_base__io_buffer* a_src) {
9860
    return wuffs_gif__decoder__tell_me_more(this, a_dst, a_minfo, a_src);
9861
  }
9862
9863
  inline uint32_t
9864
  num_animation_loops() const {
9865
    return wuffs_gif__decoder__num_animation_loops(this);
9866
  }
9867
9868
  inline uint64_t
9869
  num_decoded_frame_configs() const {
9870
    return wuffs_gif__decoder__num_decoded_frame_configs(this);
9871
  }
9872
9873
  inline uint64_t
9874
  num_decoded_frames() const {
9875
    return wuffs_gif__decoder__num_decoded_frames(this);
9876
  }
9877
9878
  inline wuffs_base__rect_ie_u32
9879
  frame_dirty_rect() const {
9880
    return wuffs_gif__decoder__frame_dirty_rect(this);
9881
  }
9882
9883
  inline wuffs_base__range_ii_u64
9884
  workbuf_len() const {
9885
    return wuffs_gif__decoder__workbuf_len(this);
9886
  }
9887
9888
  inline wuffs_base__status
9889
  restart_frame(
9890
      uint64_t a_index,
9891
      uint64_t a_io_position) {
9892
    return wuffs_gif__decoder__restart_frame(this, a_index, a_io_position);
9893
  }
9894
9895
  inline wuffs_base__status
9896
  decode_frame_config(
9897
      wuffs_base__frame_config* a_dst,
9898
      wuffs_base__io_buffer* a_src) {
9899
    return wuffs_gif__decoder__decode_frame_config(this, a_dst, a_src);
9900
  }
9901
9902
  inline wuffs_base__status
9903
  decode_frame(
9904
      wuffs_base__pixel_buffer* a_dst,
9905
      wuffs_base__io_buffer* a_src,
9906
      wuffs_base__pixel_blend a_blend,
9907
      wuffs_base__slice_u8 a_workbuf,
9908
      wuffs_base__decode_frame_options* a_opts) {
9909
    return wuffs_gif__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts);
9910
  }
9911
9912
#endif  // __cplusplus
9913
};  // struct wuffs_gif__decoder__struct
9914
9915
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
9916
9917
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GIF) || defined(WUFFS_NONMONOLITHIC)
9918
9919
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GZIP) || defined(WUFFS_NONMONOLITHIC)
9920
9921
// ---------------- Status Codes
9922
9923
extern const char wuffs_gzip__error__bad_checksum[];
9924
extern const char wuffs_gzip__error__bad_compression_method[];
9925
extern const char wuffs_gzip__error__bad_encoding_flags[];
9926
extern const char wuffs_gzip__error__bad_header[];
9927
extern const char wuffs_gzip__error__truncated_input[];
9928
9929
// ---------------- Public Consts
9930
9931
#define WUFFS_GZIP__DECODER_DST_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0u
9932
9933
#define WUFFS_GZIP__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 1u
9934
9935
// ---------------- Struct Declarations
9936
9937
typedef struct wuffs_gzip__decoder__struct wuffs_gzip__decoder;
9938
9939
#ifdef __cplusplus
9940
extern "C" {
9941
#endif
9942
9943
// ---------------- Public Initializer Prototypes
9944
9945
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
9946
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
9947
//
9948
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
9949
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
9950
9951
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
9952
wuffs_gzip__decoder__initialize(
9953
    wuffs_gzip__decoder* self,
9954
    size_t sizeof_star_self,
9955
    uint64_t wuffs_version,
9956
    uint32_t options);
9957
9958
size_t
9959
sizeof__wuffs_gzip__decoder(void);
9960
9961
// ---------------- Allocs
9962
9963
// These functions allocate and initialize Wuffs structs. They return NULL if
9964
// memory allocation fails. If they return non-NULL, there is no need to call
9965
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
9966
// calling free on the returned pointer. That pointer is effectively a C++
9967
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
9968
9969
wuffs_gzip__decoder*
9970
wuffs_gzip__decoder__alloc(void);
9971
9972
static inline wuffs_base__io_transformer*
9973
wuffs_gzip__decoder__alloc_as__wuffs_base__io_transformer(void) {
9974
  return (wuffs_base__io_transformer*)(wuffs_gzip__decoder__alloc());
9975
}
9976
9977
// ---------------- Upcasts
9978
9979
static inline wuffs_base__io_transformer*
9980
wuffs_gzip__decoder__upcast_as__wuffs_base__io_transformer(
9981
    wuffs_gzip__decoder* p) {
9982
  return (wuffs_base__io_transformer*)p;
9983
}
9984
9985
// ---------------- Public Function Prototypes
9986
9987
WUFFS_BASE__GENERATED_C_CODE
9988
WUFFS_BASE__MAYBE_STATIC uint64_t
9989
wuffs_gzip__decoder__get_quirk(
9990
    const wuffs_gzip__decoder* self,
9991
    uint32_t a_key);
9992
9993
WUFFS_BASE__GENERATED_C_CODE
9994
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
9995
wuffs_gzip__decoder__set_quirk(
9996
    wuffs_gzip__decoder* self,
9997
    uint32_t a_key,
9998
    uint64_t a_value);
9999
10000
WUFFS_BASE__GENERATED_C_CODE
10001
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
10002
wuffs_gzip__decoder__dst_history_retain_length(
10003
    const wuffs_gzip__decoder* self);
10004
10005
WUFFS_BASE__GENERATED_C_CODE
10006
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
10007
wuffs_gzip__decoder__workbuf_len(
10008
    const wuffs_gzip__decoder* self);
10009
10010
WUFFS_BASE__GENERATED_C_CODE
10011
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
10012
wuffs_gzip__decoder__transform_io(
10013
    wuffs_gzip__decoder* self,
10014
    wuffs_base__io_buffer* a_dst,
10015
    wuffs_base__io_buffer* a_src,
10016
    wuffs_base__slice_u8 a_workbuf);
10017
10018
#ifdef __cplusplus
10019
}  // extern "C"
10020
#endif
10021
10022
// ---------------- Struct Definitions
10023
10024
// These structs' fields, and the sizeof them, are private implementation
10025
// details that aren't guaranteed to be stable across Wuffs versions.
10026
//
10027
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
10028
10029
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
10030
10031
struct wuffs_gzip__decoder__struct {
10032
  // Do not access the private_impl's or private_data's fields directly. There
10033
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
10034
  // the wuffs_foo__bar__baz functions.
10035
  //
10036
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
10037
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
10038
10039
  struct {
10040
    uint32_t magic;
10041
    uint32_t active_coroutine;
10042
    wuffs_base__vtable vtable_for__wuffs_base__io_transformer;
10043
    wuffs_base__vtable null_vtable;
10044
10045
    bool f_ignore_checksum;
10046
10047
    uint32_t p_transform_io;
10048
    uint32_t p_do_transform_io;
10049
  } private_impl;
10050
10051
  struct {
10052
    wuffs_crc32__ieee_hasher f_checksum;
10053
    wuffs_deflate__decoder f_flate;
10054
10055
    struct {
10056
      uint8_t v_flags;
10057
      uint32_t v_checksum_have;
10058
      uint32_t v_decoded_length_have;
10059
      uint32_t v_checksum_want;
10060
      uint64_t scratch;
10061
    } s_do_transform_io;
10062
  } private_data;
10063
10064
#ifdef __cplusplus
10065
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
10066
  using unique_ptr = std::unique_ptr<wuffs_gzip__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_gzip__decoder__alloc());
10073
  }
10074
10075
  static inline wuffs_base__io_transformer::unique_ptr
10076
  alloc_as__wuffs_base__io_transformer() {
10077
    return wuffs_base__io_transformer::unique_ptr(
10078
        wuffs_gzip__decoder__alloc_as__wuffs_base__io_transformer());
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_gzip__decoder__struct() = delete;
10095
  wuffs_gzip__decoder__struct(const wuffs_gzip__decoder__struct&) = delete;
10096
  wuffs_gzip__decoder__struct& operator=(
10097
      const wuffs_gzip__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_gzip__decoder__initialize(
10118
        this, sizeof_star_self, wuffs_version, options);
10119
  }
10120
10121
  inline wuffs_base__io_transformer*
10122
  upcast_as__wuffs_base__io_transformer() {
10123
    return (wuffs_base__io_transformer*)this;
10124
  }
10125
10126
  inline uint64_t
10127
  get_quirk(
10128
      uint32_t a_key) const {
10129
    return wuffs_gzip__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_gzip__decoder__set_quirk(this, a_key, a_value);
10137
  }
10138
10139
  inline wuffs_base__optional_u63
10140
  dst_history_retain_length() const {
10141
    return wuffs_gzip__decoder__dst_history_retain_length(this);
10142
  }
10143
10144
  inline wuffs_base__range_ii_u64
10145
  workbuf_len() const {
10146
    return wuffs_gzip__decoder__workbuf_len(this);
10147
  }
10148
10149
  inline wuffs_base__status
10150
  transform_io(
10151
      wuffs_base__io_buffer* a_dst,
10152
      wuffs_base__io_buffer* a_src,
10153
      wuffs_base__slice_u8 a_workbuf) {
10154
    return wuffs_gzip__decoder__transform_io(this, a_dst, a_src, a_workbuf);
10155
  }
10156
10157
#endif  // __cplusplus
10158
};  // struct wuffs_gzip__decoder__struct
10159
10160
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
10161
10162
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GZIP) || defined(WUFFS_NONMONOLITHIC)
10163
10164
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JPEG) || defined(WUFFS_NONMONOLITHIC)
10165
10166
// ---------------- Status Codes
10167
10168
extern const char wuffs_jpeg__error__bad_dht_marker[];
10169
extern const char wuffs_jpeg__error__bad_dqt_marker[];
10170
extern const char wuffs_jpeg__error__bad_dri_marker[];
10171
extern const char wuffs_jpeg__error__bad_sof_marker[];
10172
extern const char wuffs_jpeg__error__bad_sos_marker[];
10173
extern const char wuffs_jpeg__error__bad_header[];
10174
extern const char wuffs_jpeg__error__bad_marker[];
10175
extern const char wuffs_jpeg__error__bad_scan_count[];
10176
extern const char wuffs_jpeg__error__missing_huffman_table[];
10177
extern const char wuffs_jpeg__error__missing_quantization_table[];
10178
extern const char wuffs_jpeg__error__rejected_progressive_jpeg[];
10179
extern const char wuffs_jpeg__error__short_sos_bitstream[];
10180
extern const char wuffs_jpeg__error__truncated_input[];
10181
extern const char wuffs_jpeg__error__unsupported_arithmetic_coding[];
10182
extern const char wuffs_jpeg__error__unsupported_color_model[];
10183
extern const char wuffs_jpeg__error__unsupported_fractional_sampling[];
10184
extern const char wuffs_jpeg__error__unsupported_hierarchical_coding[];
10185
extern const char wuffs_jpeg__error__unsupported_implicit_height[];
10186
extern const char wuffs_jpeg__error__unsupported_lossless_coding[];
10187
extern const char wuffs_jpeg__error__unsupported_marker[];
10188
extern const char wuffs_jpeg__error__unsupported_precision_12_bits[];
10189
extern const char wuffs_jpeg__error__unsupported_precision_16_bits[];
10190
extern const char wuffs_jpeg__error__unsupported_precision[];
10191
extern const char wuffs_jpeg__error__unsupported_scan_count[];
10192
10193
// ---------------- Public Consts
10194
10195
#define WUFFS_JPEG__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 51552191232u
10196
10197
#define WUFFS_JPEG__QUIRK_REJECT_PROGRESSIVE_JPEGS 1162824704u
10198
10199
// ---------------- Struct Declarations
10200
10201
typedef struct wuffs_jpeg__decoder__struct wuffs_jpeg__decoder;
10202
10203
#ifdef __cplusplus
10204
extern "C" {
10205
#endif
10206
10207
// ---------------- Public Initializer Prototypes
10208
10209
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
10210
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
10211
//
10212
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
10213
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
10214
10215
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
10216
wuffs_jpeg__decoder__initialize(
10217
    wuffs_jpeg__decoder* self,
10218
    size_t sizeof_star_self,
10219
    uint64_t wuffs_version,
10220
    uint32_t options);
10221
10222
size_t
10223
sizeof__wuffs_jpeg__decoder(void);
10224
10225
// ---------------- Allocs
10226
10227
// These functions allocate and initialize Wuffs structs. They return NULL if
10228
// memory allocation fails. If they return non-NULL, there is no need to call
10229
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
10230
// calling free on the returned pointer. That pointer is effectively a C++
10231
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
10232
10233
wuffs_jpeg__decoder*
10234
wuffs_jpeg__decoder__alloc(void);
10235
10236
static inline wuffs_base__image_decoder*
10237
wuffs_jpeg__decoder__alloc_as__wuffs_base__image_decoder(void) {
10238
  return (wuffs_base__image_decoder*)(wuffs_jpeg__decoder__alloc());
10239
}
10240
10241
// ---------------- Upcasts
10242
10243
static inline wuffs_base__image_decoder*
10244
wuffs_jpeg__decoder__upcast_as__wuffs_base__image_decoder(
10245
    wuffs_jpeg__decoder* p) {
10246
  return (wuffs_base__image_decoder*)p;
10247
}
10248
10249
// ---------------- Public Function Prototypes
10250
10251
WUFFS_BASE__GENERATED_C_CODE
10252
WUFFS_BASE__MAYBE_STATIC uint64_t
10253
wuffs_jpeg__decoder__get_quirk(
10254
    const wuffs_jpeg__decoder* self,
10255
    uint32_t a_key);
10256
10257
WUFFS_BASE__GENERATED_C_CODE
10258
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
10259
wuffs_jpeg__decoder__set_quirk(
10260
    wuffs_jpeg__decoder* self,
10261
    uint32_t a_key,
10262
    uint64_t a_value);
10263
10264
WUFFS_BASE__GENERATED_C_CODE
10265
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
10266
wuffs_jpeg__decoder__decode_image_config(
10267
    wuffs_jpeg__decoder* self,
10268
    wuffs_base__image_config* a_dst,
10269
    wuffs_base__io_buffer* a_src);
10270
10271
WUFFS_BASE__GENERATED_C_CODE
10272
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
10273
wuffs_jpeg__decoder__decode_frame_config(
10274
    wuffs_jpeg__decoder* self,
10275
    wuffs_base__frame_config* a_dst,
10276
    wuffs_base__io_buffer* a_src);
10277
10278
WUFFS_BASE__GENERATED_C_CODE
10279
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
10280
wuffs_jpeg__decoder__decode_frame(
10281
    wuffs_jpeg__decoder* self,
10282
    wuffs_base__pixel_buffer* a_dst,
10283
    wuffs_base__io_buffer* a_src,
10284
    wuffs_base__pixel_blend a_blend,
10285
    wuffs_base__slice_u8 a_workbuf,
10286
    wuffs_base__decode_frame_options* a_opts);
10287
10288
WUFFS_BASE__GENERATED_C_CODE
10289
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
10290
wuffs_jpeg__decoder__frame_dirty_rect(
10291
    const wuffs_jpeg__decoder* self);
10292
10293
WUFFS_BASE__GENERATED_C_CODE
10294
WUFFS_BASE__MAYBE_STATIC uint32_t
10295
wuffs_jpeg__decoder__num_animation_loops(
10296
    const wuffs_jpeg__decoder* self);
10297
10298
WUFFS_BASE__GENERATED_C_CODE
10299
WUFFS_BASE__MAYBE_STATIC uint64_t
10300
wuffs_jpeg__decoder__num_decoded_frame_configs(
10301
    const wuffs_jpeg__decoder* self);
10302
10303
WUFFS_BASE__GENERATED_C_CODE
10304
WUFFS_BASE__MAYBE_STATIC uint64_t
10305
wuffs_jpeg__decoder__num_decoded_frames(
10306
    const wuffs_jpeg__decoder* self);
10307
10308
WUFFS_BASE__GENERATED_C_CODE
10309
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
10310
wuffs_jpeg__decoder__restart_frame(
10311
    wuffs_jpeg__decoder* self,
10312
    uint64_t a_index,
10313
    uint64_t a_io_position);
10314
10315
WUFFS_BASE__GENERATED_C_CODE
10316
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
10317
wuffs_jpeg__decoder__set_report_metadata(
10318
    wuffs_jpeg__decoder* self,
10319
    uint32_t a_fourcc,
10320
    bool a_report);
10321
10322
WUFFS_BASE__GENERATED_C_CODE
10323
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
10324
wuffs_jpeg__decoder__tell_me_more(
10325
    wuffs_jpeg__decoder* self,
10326
    wuffs_base__io_buffer* a_dst,
10327
    wuffs_base__more_information* a_minfo,
10328
    wuffs_base__io_buffer* a_src);
10329
10330
WUFFS_BASE__GENERATED_C_CODE
10331
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
10332
wuffs_jpeg__decoder__workbuf_len(
10333
    const wuffs_jpeg__decoder* self);
10334
10335
#ifdef __cplusplus
10336
}  // extern "C"
10337
#endif
10338
10339
// ---------------- Struct Definitions
10340
10341
// These structs' fields, and the sizeof them, are private implementation
10342
// details that aren't guaranteed to be stable across Wuffs versions.
10343
//
10344
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
10345
10346
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
10347
10348
struct wuffs_jpeg__decoder__struct {
10349
  // Do not access the private_impl's or private_data's fields directly. There
10350
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
10351
  // the wuffs_foo__bar__baz functions.
10352
  //
10353
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
10354
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
10355
10356
  struct {
10357
    uint32_t magic;
10358
    uint32_t active_coroutine;
10359
    wuffs_base__vtable vtable_for__wuffs_base__image_decoder;
10360
    wuffs_base__vtable null_vtable;
10361
10362
    uint32_t f_width;
10363
    uint32_t f_height;
10364
    uint32_t f_width_in_mcus;
10365
    uint32_t f_height_in_mcus;
10366
    uint8_t f_call_sequence;
10367
    bool f_test_only_interrupt_decode_mcu;
10368
    bool f_is_jfif;
10369
    uint8_t f_is_adobe;
10370
    bool f_is_rgb_or_cmyk;
10371
    uint8_t f_sof_marker;
10372
    uint8_t f_next_restart_marker;
10373
    uint8_t f_max_incl_components_h;
10374
    uint8_t f_max_incl_components_v;
10375
    uint32_t f_num_components;
10376
    uint8_t f_components_c[4];
10377
    uint8_t f_components_h[4];
10378
    uint8_t f_components_v[4];
10379
    uint8_t f_components_tq[4];
10380
    uint32_t f_components_workbuf_widths[4];
10381
    uint32_t f_components_workbuf_heights[4];
10382
    uint64_t f_components_workbuf_offsets[9];
10383
    uint32_t f_scan_count;
10384
    uint32_t f_scan_num_components;
10385
    uint8_t f_scan_comps_cselector[4];
10386
    uint8_t f_scan_comps_td[4];
10387
    uint8_t f_scan_comps_ta[4];
10388
    uint8_t f_scan_ss;
10389
    uint8_t f_scan_se;
10390
    uint8_t f_scan_ah;
10391
    uint8_t f_scan_al;
10392
    uint32_t f_scan_width_in_mcus;
10393
    uint32_t f_scan_height_in_mcus;
10394
    uint8_t f_scan_comps_bx_offset[16];
10395
    uint8_t f_scan_comps_by_offset[16];
10396
    uint32_t f_mcu_num_blocks;
10397
    uint32_t f_mcu_current_block;
10398
    uint32_t f_mcu_zig_index;
10399
    uint8_t f_mcu_blocks_sselector[16];
10400
    uint64_t f_mcu_blocks_offset[10];
10401
    uint32_t f_mcu_blocks_mx_mul[10];
10402
    uint32_t f_mcu_blocks_my_mul[10];
10403
    uint8_t f_mcu_blocks_dc_hselector[10];
10404
    uint8_t f_mcu_blocks_ac_hselector[10];
10405
    uint16_t f_mcu_previous_dc_values[4];
10406
    uint8_t f_block_smoothing_lowest_scan_al[4][10];
10407
    uint16_t f_block_smoothing_dc_values[5][5];
10408
    uint32_t f_block_smoothing_mx_max_incl;
10409
    uint32_t f_block_smoothing_my_max_incl;
10410
    uint16_t f_restart_interval;
10411
    uint16_t f_saved_restart_interval;
10412
    uint16_t f_restarts_remaining;
10413
    uint16_t f_eob_run;
10414
    uint64_t f_frame_config_io_position;
10415
    uint32_t f_payload_length;
10416
    bool f_seen_dqt[4];
10417
    bool f_saved_seen_dqt[4];
10418
    bool f_seen_dht[8];
10419
    uint64_t f_bitstream_bits;
10420
    uint32_t f_bitstream_n_bits;
10421
    uint32_t f_bitstream_ri;
10422
    uint32_t f_bitstream_wi;
10423
    bool f_bitstream_is_closed;
10424
    bool f_expect_multiple_scans;
10425
    bool f_use_lower_quality;
10426
    bool f_reject_progressive_jpegs;
10427
    bool f_swizzle_immediately;
10428
    wuffs_base__status f_swizzle_immediately_status;
10429
    uint32_t f_swizzle_immediately_b_offsets[10];
10430
    uint32_t f_swizzle_immediately_c_offsets[5];
10431
    uint32_t f_bitstream_padding;
10432
    uint16_t f_quant_tables[4][64];
10433
    uint16_t f_saved_quant_tables[4][64];
10434
    uint8_t f_huff_tables_symbols[8][256];
10435
    uint32_t f_huff_tables_slow[8][16];
10436
    uint16_t f_huff_tables_fast[8][256];
10437
    wuffs_base__pixel_swizzler f_swizzler;
10438
10439
    wuffs_base__empty_struct (*choosy_decode_idct)(
10440
        wuffs_jpeg__decoder* self,
10441
        wuffs_base__slice_u8 a_dst_buffer,
10442
        uint64_t a_dst_stride,
10443
        uint32_t a_q);
10444
    uint32_t p_decode_image_config;
10445
    uint32_t p_do_decode_image_config;
10446
    uint32_t p_decode_dqt;
10447
    uint32_t p_decode_dri;
10448
    uint32_t p_decode_appn;
10449
    uint32_t p_decode_sof;
10450
    uint32_t p_decode_frame_config;
10451
    uint32_t p_do_decode_frame_config;
10452
    uint32_t p_decode_frame;
10453
    uint32_t p_do_decode_frame;
10454
    uint32_t p_decode_dht;
10455
    uint32_t p_decode_sos;
10456
    uint32_t p_prepare_scan;
10457
    wuffs_base__empty_struct (*choosy_load_mcu_blocks_for_single_component)(
10458
        wuffs_jpeg__decoder* self,
10459
        uint32_t a_mx,
10460
        uint32_t a_my,
10461
        wuffs_base__slice_u8 a_workbuf,
10462
        uint32_t a_csel);
10463
    uint32_t p_skip_past_the_next_restart_marker;
10464
    uint32_t (*choosy_decode_mcu)(
10465
        wuffs_jpeg__decoder* self,
10466
        wuffs_base__pixel_buffer* a_dst,
10467
        wuffs_base__slice_u8 a_workbuf,
10468
        uint32_t a_mx,
10469
        uint32_t a_my);
10470
  } private_impl;
10471
10472
  struct {
10473
    uint8_t f_bitstream_buffer[2048];
10474
    uint16_t f_mcu_blocks[10][64];
10475
    uint8_t f_swizzle_immediately_buffer[640];
10476
    uint8_t f_swizzle_ycck_scratch_buffer_2k[2048];
10477
    uint8_t f_dht_temp_counts[16];
10478
    uint8_t f_dht_temp_bit_lengths[256];
10479
    uint16_t f_dht_temp_bit_strings[256];
10480
    uint8_t f_dst_palette[1024];
10481
10482
    struct {
10483
      uint8_t v_marker;
10484
      uint64_t scratch;
10485
    } s_do_decode_image_config;
10486
    struct {
10487
      uint8_t v_q;
10488
      uint32_t v_i;
10489
    } s_decode_dqt;
10490
    struct {
10491
      uint64_t scratch;
10492
    } s_decode_dri;
10493
    struct {
10494
      uint64_t scratch;
10495
    } s_decode_appn;
10496
    struct {
10497
      uint32_t v_i;
10498
      uint64_t scratch;
10499
    } s_decode_sof;
10500
    struct {
10501
      uint8_t v_marker;
10502
      uint64_t scratch;
10503
    } s_do_decode_frame;
10504
    struct {
10505
      uint8_t v_tc4_th;
10506
      uint32_t v_total_count;
10507
      uint32_t v_i;
10508
    } s_decode_dht;
10509
    struct {
10510
      uint32_t v_my;
10511
      uint32_t v_mx;
10512
    } s_decode_sos;
10513
    struct {
10514
      uint32_t v_i;
10515
      uint64_t scratch;
10516
    } s_prepare_scan;
10517
  } private_data;
10518
10519
#ifdef __cplusplus
10520
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
10521
  using unique_ptr = std::unique_ptr<wuffs_jpeg__decoder, wuffs_unique_ptr_deleter>;
10522
10523
  // On failure, the alloc_etc functions return nullptr. They don't throw.
10524
10525
  static inline unique_ptr
10526
  alloc() {
10527
    return unique_ptr(wuffs_jpeg__decoder__alloc());
10528
  }
10529
10530
  static inline wuffs_base__image_decoder::unique_ptr
10531
  alloc_as__wuffs_base__image_decoder() {
10532
    return wuffs_base__image_decoder::unique_ptr(
10533
        wuffs_jpeg__decoder__alloc_as__wuffs_base__image_decoder());
10534
  }
10535
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
10536
10537
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
10538
  // Disallow constructing or copying an object via standard C++ mechanisms,
10539
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
10540
  // size and field layout is not part of the public, stable, memory-safe API.
10541
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
10542
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
10543
  // their first argument) rather than tweaking bar.private_impl.qux fields.
10544
  //
10545
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
10546
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
10547
  // order to provide convenience methods. These forward on "this", so that you
10548
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
10549
  wuffs_jpeg__decoder__struct() = delete;
10550
  wuffs_jpeg__decoder__struct(const wuffs_jpeg__decoder__struct&) = delete;
10551
  wuffs_jpeg__decoder__struct& operator=(
10552
      const wuffs_jpeg__decoder__struct&) = delete;
10553
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
10554
10555
#if !defined(WUFFS_IMPLEMENTATION)
10556
  // As above, the size of the struct is not part of the public API, and unless
10557
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
10558
  // allocated, not stack allocated. Its size is not intended to be known at
10559
  // compile time, but it is unfortunately divulged as a side effect of
10560
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
10561
  // instead of "sizeof T", invoking the operator. To make the two values
10562
  // different, so that passing the latter will be rejected by the initialize
10563
  // function, we add an arbitrary amount of dead weight.
10564
  uint8_t dead_weight[123000000];  // 123 MB.
10565
#endif  // !defined(WUFFS_IMPLEMENTATION)
10566
10567
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
10568
  initialize(
10569
      size_t sizeof_star_self,
10570
      uint64_t wuffs_version,
10571
      uint32_t options) {
10572
    return wuffs_jpeg__decoder__initialize(
10573
        this, sizeof_star_self, wuffs_version, options);
10574
  }
10575
10576
  inline wuffs_base__image_decoder*
10577
  upcast_as__wuffs_base__image_decoder() {
10578
    return (wuffs_base__image_decoder*)this;
10579
  }
10580
10581
  inline uint64_t
10582
  get_quirk(
10583
      uint32_t a_key) const {
10584
    return wuffs_jpeg__decoder__get_quirk(this, a_key);
10585
  }
10586
10587
  inline wuffs_base__status
10588
  set_quirk(
10589
      uint32_t a_key,
10590
      uint64_t a_value) {
10591
    return wuffs_jpeg__decoder__set_quirk(this, a_key, a_value);
10592
  }
10593
10594
  inline wuffs_base__status
10595
  decode_image_config(
10596
      wuffs_base__image_config* a_dst,
10597
      wuffs_base__io_buffer* a_src) {
10598
    return wuffs_jpeg__decoder__decode_image_config(this, a_dst, a_src);
10599
  }
10600
10601
  inline wuffs_base__status
10602
  decode_frame_config(
10603
      wuffs_base__frame_config* a_dst,
10604
      wuffs_base__io_buffer* a_src) {
10605
    return wuffs_jpeg__decoder__decode_frame_config(this, a_dst, a_src);
10606
  }
10607
10608
  inline wuffs_base__status
10609
  decode_frame(
10610
      wuffs_base__pixel_buffer* a_dst,
10611
      wuffs_base__io_buffer* a_src,
10612
      wuffs_base__pixel_blend a_blend,
10613
      wuffs_base__slice_u8 a_workbuf,
10614
      wuffs_base__decode_frame_options* a_opts) {
10615
    return wuffs_jpeg__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts);
10616
  }
10617
10618
  inline wuffs_base__rect_ie_u32
10619
  frame_dirty_rect() const {
10620
    return wuffs_jpeg__decoder__frame_dirty_rect(this);
10621
  }
10622
10623
  inline uint32_t
10624
  num_animation_loops() const {
10625
    return wuffs_jpeg__decoder__num_animation_loops(this);
10626
  }
10627
10628
  inline uint64_t
10629
  num_decoded_frame_configs() const {
10630
    return wuffs_jpeg__decoder__num_decoded_frame_configs(this);
10631
  }
10632
10633
  inline uint64_t
10634
  num_decoded_frames() const {
10635
    return wuffs_jpeg__decoder__num_decoded_frames(this);
10636
  }
10637
10638
  inline wuffs_base__status
10639
  restart_frame(
10640
      uint64_t a_index,
10641
      uint64_t a_io_position) {
10642
    return wuffs_jpeg__decoder__restart_frame(this, a_index, a_io_position);
10643
  }
10644
10645
  inline wuffs_base__empty_struct
10646
  set_report_metadata(
10647
      uint32_t a_fourcc,
10648
      bool a_report) {
10649
    return wuffs_jpeg__decoder__set_report_metadata(this, a_fourcc, a_report);
10650
  }
10651
10652
  inline wuffs_base__status
10653
  tell_me_more(
10654
      wuffs_base__io_buffer* a_dst,
10655
      wuffs_base__more_information* a_minfo,
10656
      wuffs_base__io_buffer* a_src) {
10657
    return wuffs_jpeg__decoder__tell_me_more(this, a_dst, a_minfo, a_src);
10658
  }
10659
10660
  inline wuffs_base__range_ii_u64
10661
  workbuf_len() const {
10662
    return wuffs_jpeg__decoder__workbuf_len(this);
10663
  }
10664
10665
#endif  // __cplusplus
10666
};  // struct wuffs_jpeg__decoder__struct
10667
10668
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
10669
10670
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JPEG) || defined(WUFFS_NONMONOLITHIC)
10671
10672
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JSON) || defined(WUFFS_NONMONOLITHIC)
10673
10674
// ---------------- Status Codes
10675
10676
extern const char wuffs_json__error__bad_c0_control_code[];
10677
extern const char wuffs_json__error__bad_utf_8[];
10678
extern const char wuffs_json__error__bad_backslash_escape[];
10679
extern const char wuffs_json__error__bad_input[];
10680
extern const char wuffs_json__error__bad_new_line_in_a_string[];
10681
extern const char wuffs_json__error__bad_quirk_combination[];
10682
extern const char wuffs_json__error__unsupported_number_length[];
10683
extern const char wuffs_json__error__unsupported_recursion_depth[];
10684
10685
// ---------------- Public Consts
10686
10687
#define WUFFS_JSON__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u
10688
10689
#define WUFFS_JSON__DECODER_DEPTH_MAX_INCL 1024u
10690
10691
#define WUFFS_JSON__DECODER_DST_TOKEN_BUFFER_LENGTH_MIN_INCL 1u
10692
10693
#define WUFFS_JSON__DECODER_SRC_IO_BUFFER_LENGTH_MIN_INCL 100u
10694
10695
#define WUFFS_JSON__QUIRK_ALLOW_ASCII_CONTROL_CODES 1167656960u
10696
10697
#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_A 1167656961u
10698
10699
#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_CAPITAL_U 1167656962u
10700
10701
#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_E 1167656963u
10702
10703
#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_NEW_LINE 1167656964u
10704
10705
#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_QUESTION_MARK 1167656965u
10706
10707
#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_SINGLE_QUOTE 1167656966u
10708
10709
#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_V 1167656967u
10710
10711
#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_X_AS_CODE_POINTS 1167656969u
10712
10713
#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_ZERO 1167656970u
10714
10715
#define WUFFS_JSON__QUIRK_ALLOW_COMMENT_BLOCK 1167656971u
10716
10717
#define WUFFS_JSON__QUIRK_ALLOW_COMMENT_LINE 1167656972u
10718
10719
#define WUFFS_JSON__QUIRK_ALLOW_EXTRA_COMMA 1167656973u
10720
10721
#define WUFFS_JSON__QUIRK_ALLOW_INF_NAN_NUMBERS 1167656974u
10722
10723
#define WUFFS_JSON__QUIRK_ALLOW_LEADING_ASCII_RECORD_SEPARATOR 1167656975u
10724
10725
#define WUFFS_JSON__QUIRK_ALLOW_LEADING_UNICODE_BYTE_ORDER_MARK 1167656976u
10726
10727
#define WUFFS_JSON__QUIRK_ALLOW_TRAILING_FILLER 1167656977u
10728
10729
#define WUFFS_JSON__QUIRK_EXPECT_TRAILING_NEW_LINE_OR_EOF 1167656978u
10730
10731
#define WUFFS_JSON__QUIRK_JSON_POINTER_ALLOW_TILDE_N_TILDE_R_TILDE_T 1167656979u
10732
10733
#define WUFFS_JSON__QUIRK_REPLACE_INVALID_UNICODE 1167656980u
10734
10735
// ---------------- Struct Declarations
10736
10737
typedef struct wuffs_json__decoder__struct wuffs_json__decoder;
10738
10739
#ifdef __cplusplus
10740
extern "C" {
10741
#endif
10742
10743
// ---------------- Public Initializer Prototypes
10744
10745
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
10746
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
10747
//
10748
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
10749
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
10750
10751
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
10752
wuffs_json__decoder__initialize(
10753
    wuffs_json__decoder* self,
10754
    size_t sizeof_star_self,
10755
    uint64_t wuffs_version,
10756
    uint32_t options);
10757
10758
size_t
10759
sizeof__wuffs_json__decoder(void);
10760
10761
// ---------------- Allocs
10762
10763
// These functions allocate and initialize Wuffs structs. They return NULL if
10764
// memory allocation fails. If they return non-NULL, there is no need to call
10765
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
10766
// calling free on the returned pointer. That pointer is effectively a C++
10767
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
10768
10769
wuffs_json__decoder*
10770
wuffs_json__decoder__alloc(void);
10771
10772
static inline wuffs_base__token_decoder*
10773
wuffs_json__decoder__alloc_as__wuffs_base__token_decoder(void) {
10774
  return (wuffs_base__token_decoder*)(wuffs_json__decoder__alloc());
10775
}
10776
10777
// ---------------- Upcasts
10778
10779
static inline wuffs_base__token_decoder*
10780
wuffs_json__decoder__upcast_as__wuffs_base__token_decoder(
10781
    wuffs_json__decoder* p) {
10782
  return (wuffs_base__token_decoder*)p;
10783
}
10784
10785
// ---------------- Public Function Prototypes
10786
10787
WUFFS_BASE__GENERATED_C_CODE
10788
WUFFS_BASE__MAYBE_STATIC uint64_t
10789
wuffs_json__decoder__get_quirk(
10790
    const wuffs_json__decoder* self,
10791
    uint32_t a_key);
10792
10793
WUFFS_BASE__GENERATED_C_CODE
10794
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
10795
wuffs_json__decoder__set_quirk(
10796
    wuffs_json__decoder* self,
10797
    uint32_t a_key,
10798
    uint64_t a_value);
10799
10800
WUFFS_BASE__GENERATED_C_CODE
10801
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
10802
wuffs_json__decoder__workbuf_len(
10803
    const wuffs_json__decoder* self);
10804
10805
WUFFS_BASE__GENERATED_C_CODE
10806
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
10807
wuffs_json__decoder__decode_tokens(
10808
    wuffs_json__decoder* self,
10809
    wuffs_base__token_buffer* a_dst,
10810
    wuffs_base__io_buffer* a_src,
10811
    wuffs_base__slice_u8 a_workbuf);
10812
10813
#ifdef __cplusplus
10814
}  // extern "C"
10815
#endif
10816
10817
// ---------------- Struct Definitions
10818
10819
// These structs' fields, and the sizeof them, are private implementation
10820
// details that aren't guaranteed to be stable across Wuffs versions.
10821
//
10822
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
10823
10824
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
10825
10826
struct wuffs_json__decoder__struct {
10827
  // Do not access the private_impl's or private_data's fields directly. There
10828
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
10829
  // the wuffs_foo__bar__baz functions.
10830
  //
10831
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
10832
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
10833
10834
  struct {
10835
    uint32_t magic;
10836
    uint32_t active_coroutine;
10837
    wuffs_base__vtable vtable_for__wuffs_base__token_decoder;
10838
    wuffs_base__vtable null_vtable;
10839
10840
    bool f_quirks[21];
10841
    bool f_allow_leading_ars;
10842
    bool f_allow_leading_ubom;
10843
    bool f_end_of_data;
10844
    uint8_t f_trailer_stop;
10845
    uint8_t f_comment_type;
10846
10847
    uint32_t p_decode_tokens;
10848
    uint32_t p_decode_leading;
10849
    uint32_t p_decode_comment;
10850
    uint32_t p_decode_inf_nan;
10851
    uint32_t p_decode_trailer;
10852
  } private_impl;
10853
10854
  struct {
10855
    uint32_t f_stack[32];
10856
10857
    struct {
10858
      uint32_t v_depth;
10859
      uint32_t v_expect;
10860
      uint32_t v_expect_after_value;
10861
    } s_decode_tokens;
10862
  } private_data;
10863
10864
#ifdef __cplusplus
10865
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
10866
  using unique_ptr = std::unique_ptr<wuffs_json__decoder, wuffs_unique_ptr_deleter>;
10867
10868
  // On failure, the alloc_etc functions return nullptr. They don't throw.
10869
10870
  static inline unique_ptr
10871
  alloc() {
10872
    return unique_ptr(wuffs_json__decoder__alloc());
10873
  }
10874
10875
  static inline wuffs_base__token_decoder::unique_ptr
10876
  alloc_as__wuffs_base__token_decoder() {
10877
    return wuffs_base__token_decoder::unique_ptr(
10878
        wuffs_json__decoder__alloc_as__wuffs_base__token_decoder());
10879
  }
10880
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
10881
10882
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
10883
  // Disallow constructing or copying an object via standard C++ mechanisms,
10884
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
10885
  // size and field layout is not part of the public, stable, memory-safe API.
10886
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
10887
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
10888
  // their first argument) rather than tweaking bar.private_impl.qux fields.
10889
  //
10890
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
10891
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
10892
  // order to provide convenience methods. These forward on "this", so that you
10893
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
10894
  wuffs_json__decoder__struct() = delete;
10895
  wuffs_json__decoder__struct(const wuffs_json__decoder__struct&) = delete;
10896
  wuffs_json__decoder__struct& operator=(
10897
      const wuffs_json__decoder__struct&) = delete;
10898
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
10899
10900
#if !defined(WUFFS_IMPLEMENTATION)
10901
  // As above, the size of the struct is not part of the public API, and unless
10902
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
10903
  // allocated, not stack allocated. Its size is not intended to be known at
10904
  // compile time, but it is unfortunately divulged as a side effect of
10905
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
10906
  // instead of "sizeof T", invoking the operator. To make the two values
10907
  // different, so that passing the latter will be rejected by the initialize
10908
  // function, we add an arbitrary amount of dead weight.
10909
  uint8_t dead_weight[123000000];  // 123 MB.
10910
#endif  // !defined(WUFFS_IMPLEMENTATION)
10911
10912
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
10913
  initialize(
10914
      size_t sizeof_star_self,
10915
      uint64_t wuffs_version,
10916
      uint32_t options) {
10917
    return wuffs_json__decoder__initialize(
10918
        this, sizeof_star_self, wuffs_version, options);
10919
  }
10920
10921
  inline wuffs_base__token_decoder*
10922
  upcast_as__wuffs_base__token_decoder() {
10923
    return (wuffs_base__token_decoder*)this;
10924
  }
10925
10926
  inline uint64_t
10927
  get_quirk(
10928
      uint32_t a_key) const {
10929
    return wuffs_json__decoder__get_quirk(this, a_key);
10930
  }
10931
10932
  inline wuffs_base__status
10933
  set_quirk(
10934
      uint32_t a_key,
10935
      uint64_t a_value) {
10936
    return wuffs_json__decoder__set_quirk(this, a_key, a_value);
10937
  }
10938
10939
  inline wuffs_base__range_ii_u64
10940
  workbuf_len() const {
10941
    return wuffs_json__decoder__workbuf_len(this);
10942
  }
10943
10944
  inline wuffs_base__status
10945
  decode_tokens(
10946
      wuffs_base__token_buffer* a_dst,
10947
      wuffs_base__io_buffer* a_src,
10948
      wuffs_base__slice_u8 a_workbuf) {
10949
    return wuffs_json__decoder__decode_tokens(this, a_dst, a_src, a_workbuf);
10950
  }
10951
10952
#endif  // __cplusplus
10953
};  // struct wuffs_json__decoder__struct
10954
10955
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
10956
10957
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JSON) || defined(WUFFS_NONMONOLITHIC)
10958
10959
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZMA) || defined(WUFFS_NONMONOLITHIC)
10960
10961
// ---------------- Status Codes
10962
10963
extern const char wuffs_lzma__error__bad_lzma2_header[];
10964
extern const char wuffs_lzma__error__bad_bitstream_trailer[];
10965
extern const char wuffs_lzma__error__bad_code[];
10966
extern const char wuffs_lzma__error__bad_decoded_length[];
10967
extern const char wuffs_lzma__error__bad_distance[];
10968
extern const char wuffs_lzma__error__bad_header[];
10969
extern const char wuffs_lzma__error__truncated_input[];
10970
extern const char wuffs_lzma__error__unsupported_decoded_length[];
10971
extern const char wuffs_lzma__error__unsupported_properties[];
10972
10973
// ---------------- Public Consts
10974
10975
#define WUFFS_LZMA__DECODER_DST_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0u
10976
10977
#define WUFFS_LZMA__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 4294967568u
10978
10979
#define WUFFS_LZMA__QUIRK_ALLOW_NON_ZERO_INITIAL_BYTE 1290294272u
10980
10981
#define WUFFS_LZMA__QUIRK_FORMAT_EXTENSION 1290294273u
10982
10983
// ---------------- Struct Declarations
10984
10985
typedef struct wuffs_lzma__decoder__struct wuffs_lzma__decoder;
10986
10987
#ifdef __cplusplus
10988
extern "C" {
10989
#endif
10990
10991
// ---------------- Public Initializer Prototypes
10992
10993
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
10994
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
10995
//
10996
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
10997
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
10998
10999
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
11000
wuffs_lzma__decoder__initialize(
11001
    wuffs_lzma__decoder* self,
11002
    size_t sizeof_star_self,
11003
    uint64_t wuffs_version,
11004
    uint32_t options);
11005
11006
size_t
11007
sizeof__wuffs_lzma__decoder(void);
11008
11009
// ---------------- Allocs
11010
11011
// These functions allocate and initialize Wuffs structs. They return NULL if
11012
// memory allocation fails. If they return non-NULL, there is no need to call
11013
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
11014
// calling free on the returned pointer. That pointer is effectively a C++
11015
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
11016
11017
wuffs_lzma__decoder*
11018
wuffs_lzma__decoder__alloc(void);
11019
11020
static inline wuffs_base__io_transformer*
11021
wuffs_lzma__decoder__alloc_as__wuffs_base__io_transformer(void) {
11022
  return (wuffs_base__io_transformer*)(wuffs_lzma__decoder__alloc());
11023
}
11024
11025
// ---------------- Upcasts
11026
11027
static inline wuffs_base__io_transformer*
11028
wuffs_lzma__decoder__upcast_as__wuffs_base__io_transformer(
11029
    wuffs_lzma__decoder* p) {
11030
  return (wuffs_base__io_transformer*)p;
11031
}
11032
11033
// ---------------- Public Function Prototypes
11034
11035
WUFFS_BASE__GENERATED_C_CODE
11036
WUFFS_BASE__MAYBE_STATIC uint64_t
11037
wuffs_lzma__decoder__get_quirk(
11038
    const wuffs_lzma__decoder* self,
11039
    uint32_t a_key);
11040
11041
WUFFS_BASE__GENERATED_C_CODE
11042
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
11043
wuffs_lzma__decoder__set_quirk(
11044
    wuffs_lzma__decoder* self,
11045
    uint32_t a_key,
11046
    uint64_t a_value);
11047
11048
WUFFS_BASE__GENERATED_C_CODE
11049
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
11050
wuffs_lzma__decoder__dst_history_retain_length(
11051
    const wuffs_lzma__decoder* self);
11052
11053
WUFFS_BASE__GENERATED_C_CODE
11054
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
11055
wuffs_lzma__decoder__workbuf_len(
11056
    const wuffs_lzma__decoder* self);
11057
11058
WUFFS_BASE__GENERATED_C_CODE
11059
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
11060
wuffs_lzma__decoder__transform_io(
11061
    wuffs_lzma__decoder* self,
11062
    wuffs_base__io_buffer* a_dst,
11063
    wuffs_base__io_buffer* a_src,
11064
    wuffs_base__slice_u8 a_workbuf);
11065
11066
#ifdef __cplusplus
11067
}  // extern "C"
11068
#endif
11069
11070
// ---------------- Struct Definitions
11071
11072
// These structs' fields, and the sizeof them, are private implementation
11073
// details that aren't guaranteed to be stable across Wuffs versions.
11074
//
11075
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
11076
11077
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
11078
11079
struct wuffs_lzma__decoder__struct {
11080
  // Do not access the private_impl's or private_data's fields directly. There
11081
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
11082
  // the wuffs_foo__bar__baz functions.
11083
  //
11084
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
11085
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
11086
11087
  struct {
11088
    uint32_t magic;
11089
    uint32_t active_coroutine;
11090
    wuffs_base__vtable vtable_for__wuffs_base__io_transformer;
11091
    wuffs_base__vtable null_vtable;
11092
11093
    uint32_t f_lc;
11094
    uint32_t f_lp;
11095
    uint32_t f_pb;
11096
    uint32_t f_format_extension;
11097
    uint32_t f_dict_size;
11098
    uint32_t f_dict_workbuf_index;
11099
    uint32_t f_dict_seen;
11100
    uint64_t f_decoded_length;
11101
    uint64_t f_lzma2_encoded_length_have;
11102
    uint64_t f_lzma2_encoded_length_want;
11103
    bool f_lzma2_need_prob_reset;
11104
    bool f_lzma2_need_properties;
11105
    bool f_lzma2_need_dict_reset;
11106
    bool f_prev_lzma2_chunk_was_uncompressed;
11107
    bool f_allow_non_zero_initial_byte;
11108
    bool f_end_of_chunk;
11109
    uint8_t f_stashed_bytes[2];
11110
    uint32_t f_stashed_bits;
11111
    uint32_t f_stashed_range;
11112
    uint32_t f_stashed_state;
11113
    uint32_t f_stashed_rep0;
11114
    uint32_t f_stashed_rep1;
11115
    uint32_t f_stashed_rep2;
11116
    uint32_t f_stashed_rep3;
11117
    uint64_t f_stashed_pos;
11118
    uint64_t f_stashed_pos_end;
11119
11120
    uint32_t p_decode_bitstream_slow;
11121
    uint32_t p_transform_io;
11122
    uint32_t p_do_transform_io;
11123
    uint32_t p_decode_bitstream;
11124
    uint32_t p_update_stashed_bytes;
11125
    uint32_t p_decode_optional_end_of_stream;
11126
  } private_impl;
11127
11128
  struct {
11129
    uint16_t f_probs_ao00[192];
11130
    uint16_t f_probs_ao20[12];
11131
    uint16_t f_probs_ao40[12];
11132
    uint16_t f_probs_ao41[192];
11133
    uint16_t f_probs_ao60[12];
11134
    uint16_t f_probs_ao63[12];
11135
    uint16_t f_probs_match_len_low[16][8];
11136
    uint16_t f_probs_match_len_mid[16][8];
11137
    uint16_t f_probs_match_len_high[1][256];
11138
    uint16_t f_probs_longrep_len_low[16][8];
11139
    uint16_t f_probs_longrep_len_mid[16][8];
11140
    uint16_t f_probs_longrep_len_high[1][256];
11141
    uint16_t f_probs_slot[4][64];
11142
    uint16_t f_probs_small_dist[128];
11143
    uint16_t f_probs_large_dist[16];
11144
    uint16_t f_probs_lit[16][768];
11145
11146
    struct {
11147
      uint32_t v_bits;
11148
      uint32_t v_range;
11149
      uint32_t v_state;
11150
      uint32_t v_rep0;
11151
      uint32_t v_rep1;
11152
      uint32_t v_rep2;
11153
      uint32_t v_rep3;
11154
      uint32_t v_rep;
11155
      uint64_t v_pos;
11156
      uint64_t v_pos_end;
11157
      uint32_t v_lc;
11158
      uint64_t v_lp_mask;
11159
      uint64_t v_pb_mask;
11160
      uint32_t v_tree_node;
11161
      uint8_t v_prev_byte;
11162
      uint32_t v_match_byte;
11163
      uint32_t v_len_state;
11164
      uint32_t v_slot;
11165
      uint32_t v_len;
11166
      uint32_t v_lanl_offset;
11167
      uint32_t v_num_extra_bits;
11168
      uint32_t v_dist_extra_bits;
11169
      uint32_t v_i;
11170
      uint32_t v_index_lit;
11171
      uint32_t v_index_len;
11172
      uint32_t v_index_small_dist_base;
11173
      uint32_t v_index_small_dist_extra;
11174
      uint32_t v_index_large_dist;
11175
      uint32_t v_dist;
11176
      uint64_t scratch;
11177
    } s_decode_bitstream_slow;
11178
    struct {
11179
      uint8_t v_header_byte;
11180
      uint32_t v_length;
11181
      uint64_t scratch;
11182
    } s_do_transform_io;
11183
  } private_data;
11184
11185
#ifdef __cplusplus
11186
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
11187
  using unique_ptr = std::unique_ptr<wuffs_lzma__decoder, wuffs_unique_ptr_deleter>;
11188
11189
  // On failure, the alloc_etc functions return nullptr. They don't throw.
11190
11191
  static inline unique_ptr
11192
  alloc() {
11193
    return unique_ptr(wuffs_lzma__decoder__alloc());
11194
  }
11195
11196
  static inline wuffs_base__io_transformer::unique_ptr
11197
  alloc_as__wuffs_base__io_transformer() {
11198
    return wuffs_base__io_transformer::unique_ptr(
11199
        wuffs_lzma__decoder__alloc_as__wuffs_base__io_transformer());
11200
  }
11201
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
11202
11203
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
11204
  // Disallow constructing or copying an object via standard C++ mechanisms,
11205
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
11206
  // size and field layout is not part of the public, stable, memory-safe API.
11207
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
11208
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
11209
  // their first argument) rather than tweaking bar.private_impl.qux fields.
11210
  //
11211
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
11212
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
11213
  // order to provide convenience methods. These forward on "this", so that you
11214
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
11215
  wuffs_lzma__decoder__struct() = delete;
11216
  wuffs_lzma__decoder__struct(const wuffs_lzma__decoder__struct&) = delete;
11217
  wuffs_lzma__decoder__struct& operator=(
11218
      const wuffs_lzma__decoder__struct&) = delete;
11219
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
11220
11221
#if !defined(WUFFS_IMPLEMENTATION)
11222
  // As above, the size of the struct is not part of the public API, and unless
11223
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
11224
  // allocated, not stack allocated. Its size is not intended to be known at
11225
  // compile time, but it is unfortunately divulged as a side effect of
11226
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
11227
  // instead of "sizeof T", invoking the operator. To make the two values
11228
  // different, so that passing the latter will be rejected by the initialize
11229
  // function, we add an arbitrary amount of dead weight.
11230
  uint8_t dead_weight[123000000];  // 123 MB.
11231
#endif  // !defined(WUFFS_IMPLEMENTATION)
11232
11233
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
11234
  initialize(
11235
      size_t sizeof_star_self,
11236
      uint64_t wuffs_version,
11237
      uint32_t options) {
11238
    return wuffs_lzma__decoder__initialize(
11239
        this, sizeof_star_self, wuffs_version, options);
11240
  }
11241
11242
  inline wuffs_base__io_transformer*
11243
  upcast_as__wuffs_base__io_transformer() {
11244
    return (wuffs_base__io_transformer*)this;
11245
  }
11246
11247
  inline uint64_t
11248
  get_quirk(
11249
      uint32_t a_key) const {
11250
    return wuffs_lzma__decoder__get_quirk(this, a_key);
11251
  }
11252
11253
  inline wuffs_base__status
11254
  set_quirk(
11255
      uint32_t a_key,
11256
      uint64_t a_value) {
11257
    return wuffs_lzma__decoder__set_quirk(this, a_key, a_value);
11258
  }
11259
11260
  inline wuffs_base__optional_u63
11261
  dst_history_retain_length() const {
11262
    return wuffs_lzma__decoder__dst_history_retain_length(this);
11263
  }
11264
11265
  inline wuffs_base__range_ii_u64
11266
  workbuf_len() const {
11267
    return wuffs_lzma__decoder__workbuf_len(this);
11268
  }
11269
11270
  inline wuffs_base__status
11271
  transform_io(
11272
      wuffs_base__io_buffer* a_dst,
11273
      wuffs_base__io_buffer* a_src,
11274
      wuffs_base__slice_u8 a_workbuf) {
11275
    return wuffs_lzma__decoder__transform_io(this, a_dst, a_src, a_workbuf);
11276
  }
11277
11278
#endif  // __cplusplus
11279
};  // struct wuffs_lzma__decoder__struct
11280
11281
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
11282
11283
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZMA) || defined(WUFFS_NONMONOLITHIC)
11284
11285
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZIP) || defined(WUFFS_NONMONOLITHIC)
11286
11287
// ---------------- Status Codes
11288
11289
extern const char wuffs_lzip__error__bad_checksum[];
11290
extern const char wuffs_lzip__error__bad_footer[];
11291
extern const char wuffs_lzip__error__bad_header[];
11292
extern const char wuffs_lzip__error__truncated_input[];
11293
11294
// ---------------- Public Consts
11295
11296
#define WUFFS_LZIP__DECODER_DST_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0u
11297
11298
#define WUFFS_LZIP__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 4294967568u
11299
11300
// ---------------- Struct Declarations
11301
11302
typedef struct wuffs_lzip__decoder__struct wuffs_lzip__decoder;
11303
11304
#ifdef __cplusplus
11305
extern "C" {
11306
#endif
11307
11308
// ---------------- Public Initializer Prototypes
11309
11310
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
11311
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
11312
//
11313
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
11314
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
11315
11316
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
11317
wuffs_lzip__decoder__initialize(
11318
    wuffs_lzip__decoder* self,
11319
    size_t sizeof_star_self,
11320
    uint64_t wuffs_version,
11321
    uint32_t options);
11322
11323
size_t
11324
sizeof__wuffs_lzip__decoder(void);
11325
11326
// ---------------- Allocs
11327
11328
// These functions allocate and initialize Wuffs structs. They return NULL if
11329
// memory allocation fails. If they return non-NULL, there is no need to call
11330
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
11331
// calling free on the returned pointer. That pointer is effectively a C++
11332
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
11333
11334
wuffs_lzip__decoder*
11335
wuffs_lzip__decoder__alloc(void);
11336
11337
static inline wuffs_base__io_transformer*
11338
wuffs_lzip__decoder__alloc_as__wuffs_base__io_transformer(void) {
11339
  return (wuffs_base__io_transformer*)(wuffs_lzip__decoder__alloc());
11340
}
11341
11342
// ---------------- Upcasts
11343
11344
static inline wuffs_base__io_transformer*
11345
wuffs_lzip__decoder__upcast_as__wuffs_base__io_transformer(
11346
    wuffs_lzip__decoder* p) {
11347
  return (wuffs_base__io_transformer*)p;
11348
}
11349
11350
// ---------------- Public Function Prototypes
11351
11352
WUFFS_BASE__GENERATED_C_CODE
11353
WUFFS_BASE__MAYBE_STATIC uint64_t
11354
wuffs_lzip__decoder__get_quirk(
11355
    const wuffs_lzip__decoder* self,
11356
    uint32_t a_key);
11357
11358
WUFFS_BASE__GENERATED_C_CODE
11359
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
11360
wuffs_lzip__decoder__set_quirk(
11361
    wuffs_lzip__decoder* self,
11362
    uint32_t a_key,
11363
    uint64_t a_value);
11364
11365
WUFFS_BASE__GENERATED_C_CODE
11366
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
11367
wuffs_lzip__decoder__dst_history_retain_length(
11368
    const wuffs_lzip__decoder* self);
11369
11370
WUFFS_BASE__GENERATED_C_CODE
11371
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
11372
wuffs_lzip__decoder__workbuf_len(
11373
    const wuffs_lzip__decoder* self);
11374
11375
WUFFS_BASE__GENERATED_C_CODE
11376
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
11377
wuffs_lzip__decoder__transform_io(
11378
    wuffs_lzip__decoder* self,
11379
    wuffs_base__io_buffer* a_dst,
11380
    wuffs_base__io_buffer* a_src,
11381
    wuffs_base__slice_u8 a_workbuf);
11382
11383
#ifdef __cplusplus
11384
}  // extern "C"
11385
#endif
11386
11387
// ---------------- Struct Definitions
11388
11389
// These structs' fields, and the sizeof them, are private implementation
11390
// details that aren't guaranteed to be stable across Wuffs versions.
11391
//
11392
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
11393
11394
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
11395
11396
struct wuffs_lzip__decoder__struct {
11397
  // Do not access the private_impl's or private_data's fields directly. There
11398
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
11399
  // the wuffs_foo__bar__baz functions.
11400
  //
11401
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
11402
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
11403
11404
  struct {
11405
    uint32_t magic;
11406
    uint32_t active_coroutine;
11407
    wuffs_base__vtable vtable_for__wuffs_base__io_transformer;
11408
    wuffs_base__vtable null_vtable;
11409
11410
    bool f_ignore_checksum;
11411
    uint64_t f_dsize_have;
11412
    uint64_t f_ssize_have;
11413
11414
    uint32_t p_transform_io;
11415
    uint32_t p_do_transform_io;
11416
  } private_impl;
11417
11418
  struct {
11419
    wuffs_crc32__ieee_hasher f_crc32;
11420
    wuffs_lzma__decoder f_lzma;
11421
11422
    struct {
11423
      uint64_t scratch;
11424
    } s_do_transform_io;
11425
  } private_data;
11426
11427
#ifdef __cplusplus
11428
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
11429
  using unique_ptr = std::unique_ptr<wuffs_lzip__decoder, wuffs_unique_ptr_deleter>;
11430
11431
  // On failure, the alloc_etc functions return nullptr. They don't throw.
11432
11433
  static inline unique_ptr
11434
  alloc() {
11435
    return unique_ptr(wuffs_lzip__decoder__alloc());
11436
  }
11437
11438
  static inline wuffs_base__io_transformer::unique_ptr
11439
  alloc_as__wuffs_base__io_transformer() {
11440
    return wuffs_base__io_transformer::unique_ptr(
11441
        wuffs_lzip__decoder__alloc_as__wuffs_base__io_transformer());
11442
  }
11443
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
11444
11445
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
11446
  // Disallow constructing or copying an object via standard C++ mechanisms,
11447
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
11448
  // size and field layout is not part of the public, stable, memory-safe API.
11449
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
11450
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
11451
  // their first argument) rather than tweaking bar.private_impl.qux fields.
11452
  //
11453
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
11454
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
11455
  // order to provide convenience methods. These forward on "this", so that you
11456
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
11457
  wuffs_lzip__decoder__struct() = delete;
11458
  wuffs_lzip__decoder__struct(const wuffs_lzip__decoder__struct&) = delete;
11459
  wuffs_lzip__decoder__struct& operator=(
11460
      const wuffs_lzip__decoder__struct&) = delete;
11461
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
11462
11463
#if !defined(WUFFS_IMPLEMENTATION)
11464
  // As above, the size of the struct is not part of the public API, and unless
11465
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
11466
  // allocated, not stack allocated. Its size is not intended to be known at
11467
  // compile time, but it is unfortunately divulged as a side effect of
11468
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
11469
  // instead of "sizeof T", invoking the operator. To make the two values
11470
  // different, so that passing the latter will be rejected by the initialize
11471
  // function, we add an arbitrary amount of dead weight.
11472
  uint8_t dead_weight[123000000];  // 123 MB.
11473
#endif  // !defined(WUFFS_IMPLEMENTATION)
11474
11475
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
11476
  initialize(
11477
      size_t sizeof_star_self,
11478
      uint64_t wuffs_version,
11479
      uint32_t options) {
11480
    return wuffs_lzip__decoder__initialize(
11481
        this, sizeof_star_self, wuffs_version, options);
11482
  }
11483
11484
  inline wuffs_base__io_transformer*
11485
  upcast_as__wuffs_base__io_transformer() {
11486
    return (wuffs_base__io_transformer*)this;
11487
  }
11488
11489
  inline uint64_t
11490
  get_quirk(
11491
      uint32_t a_key) const {
11492
    return wuffs_lzip__decoder__get_quirk(this, a_key);
11493
  }
11494
11495
  inline wuffs_base__status
11496
  set_quirk(
11497
      uint32_t a_key,
11498
      uint64_t a_value) {
11499
    return wuffs_lzip__decoder__set_quirk(this, a_key, a_value);
11500
  }
11501
11502
  inline wuffs_base__optional_u63
11503
  dst_history_retain_length() const {
11504
    return wuffs_lzip__decoder__dst_history_retain_length(this);
11505
  }
11506
11507
  inline wuffs_base__range_ii_u64
11508
  workbuf_len() const {
11509
    return wuffs_lzip__decoder__workbuf_len(this);
11510
  }
11511
11512
  inline wuffs_base__status
11513
  transform_io(
11514
      wuffs_base__io_buffer* a_dst,
11515
      wuffs_base__io_buffer* a_src,
11516
      wuffs_base__slice_u8 a_workbuf) {
11517
    return wuffs_lzip__decoder__transform_io(this, a_dst, a_src, a_workbuf);
11518
  }
11519
11520
#endif  // __cplusplus
11521
};  // struct wuffs_lzip__decoder__struct
11522
11523
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
11524
11525
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZIP) || defined(WUFFS_NONMONOLITHIC)
11526
11527
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZW) || defined(WUFFS_NONMONOLITHIC)
11528
11529
// ---------------- Status Codes
11530
11531
extern const char wuffs_lzw__error__bad_code[];
11532
extern const char wuffs_lzw__error__truncated_input[];
11533
11534
// ---------------- Public Consts
11535
11536
#define WUFFS_LZW__DECODER_DST_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0u
11537
11538
#define WUFFS_LZW__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u
11539
11540
#define WUFFS_LZW__QUIRK_LITERAL_WIDTH_PLUS_ONE 1290672128u
11541
11542
// ---------------- Struct Declarations
11543
11544
typedef struct wuffs_lzw__decoder__struct wuffs_lzw__decoder;
11545
11546
#ifdef __cplusplus
11547
extern "C" {
11548
#endif
11549
11550
// ---------------- Public Initializer Prototypes
11551
11552
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
11553
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
11554
//
11555
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
11556
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
11557
11558
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
11559
wuffs_lzw__decoder__initialize(
11560
    wuffs_lzw__decoder* self,
11561
    size_t sizeof_star_self,
11562
    uint64_t wuffs_version,
11563
    uint32_t options);
11564
11565
size_t
11566
sizeof__wuffs_lzw__decoder(void);
11567
11568
// ---------------- Allocs
11569
11570
// These functions allocate and initialize Wuffs structs. They return NULL if
11571
// memory allocation fails. If they return non-NULL, there is no need to call
11572
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
11573
// calling free on the returned pointer. That pointer is effectively a C++
11574
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
11575
11576
wuffs_lzw__decoder*
11577
wuffs_lzw__decoder__alloc(void);
11578
11579
static inline wuffs_base__io_transformer*
11580
wuffs_lzw__decoder__alloc_as__wuffs_base__io_transformer(void) {
11581
  return (wuffs_base__io_transformer*)(wuffs_lzw__decoder__alloc());
11582
}
11583
11584
// ---------------- Upcasts
11585
11586
static inline wuffs_base__io_transformer*
11587
wuffs_lzw__decoder__upcast_as__wuffs_base__io_transformer(
11588
    wuffs_lzw__decoder* p) {
11589
  return (wuffs_base__io_transformer*)p;
11590
}
11591
11592
// ---------------- Public Function Prototypes
11593
11594
WUFFS_BASE__GENERATED_C_CODE
11595
WUFFS_BASE__MAYBE_STATIC uint64_t
11596
wuffs_lzw__decoder__get_quirk(
11597
    const wuffs_lzw__decoder* self,
11598
    uint32_t a_key);
11599
11600
WUFFS_BASE__GENERATED_C_CODE
11601
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
11602
wuffs_lzw__decoder__set_quirk(
11603
    wuffs_lzw__decoder* self,
11604
    uint32_t a_key,
11605
    uint64_t a_value);
11606
11607
WUFFS_BASE__GENERATED_C_CODE
11608
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
11609
wuffs_lzw__decoder__dst_history_retain_length(
11610
    const wuffs_lzw__decoder* self);
11611
11612
WUFFS_BASE__GENERATED_C_CODE
11613
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
11614
wuffs_lzw__decoder__workbuf_len(
11615
    const wuffs_lzw__decoder* self);
11616
11617
WUFFS_BASE__GENERATED_C_CODE
11618
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
11619
wuffs_lzw__decoder__transform_io(
11620
    wuffs_lzw__decoder* self,
11621
    wuffs_base__io_buffer* a_dst,
11622
    wuffs_base__io_buffer* a_src,
11623
    wuffs_base__slice_u8 a_workbuf);
11624
11625
WUFFS_BASE__GENERATED_C_CODE
11626
WUFFS_BASE__MAYBE_STATIC wuffs_base__slice_u8
11627
wuffs_lzw__decoder__flush(
11628
    wuffs_lzw__decoder* self);
11629
11630
#ifdef __cplusplus
11631
}  // extern "C"
11632
#endif
11633
11634
// ---------------- Struct Definitions
11635
11636
// These structs' fields, and the sizeof them, are private implementation
11637
// details that aren't guaranteed to be stable across Wuffs versions.
11638
//
11639
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
11640
11641
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
11642
11643
struct wuffs_lzw__decoder__struct {
11644
  // Do not access the private_impl's or private_data's fields directly. There
11645
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
11646
  // the wuffs_foo__bar__baz functions.
11647
  //
11648
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
11649
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
11650
11651
  struct {
11652
    uint32_t magic;
11653
    uint32_t active_coroutine;
11654
    wuffs_base__vtable vtable_for__wuffs_base__io_transformer;
11655
    wuffs_base__vtable null_vtable;
11656
11657
    uint32_t f_pending_literal_width_plus_one;
11658
    uint32_t f_literal_width;
11659
    uint32_t f_clear_code;
11660
    uint32_t f_end_code;
11661
    uint32_t f_save_code;
11662
    uint32_t f_prev_code;
11663
    uint32_t f_width;
11664
    uint32_t f_bits;
11665
    uint32_t f_n_bits;
11666
    uint32_t f_output_ri;
11667
    uint32_t f_output_wi;
11668
    uint32_t f_read_from_return_value;
11669
    uint16_t f_prefixes[4096];
11670
11671
    uint32_t p_transform_io;
11672
    uint32_t p_write_to;
11673
  } private_impl;
11674
11675
  struct {
11676
    uint8_t f_suffixes[4096][8];
11677
    uint16_t f_lm1s[4096];
11678
    uint8_t f_output[8199];
11679
  } private_data;
11680
11681
#ifdef __cplusplus
11682
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
11683
  using unique_ptr = std::unique_ptr<wuffs_lzw__decoder, wuffs_unique_ptr_deleter>;
11684
11685
  // On failure, the alloc_etc functions return nullptr. They don't throw.
11686
11687
  static inline unique_ptr
11688
  alloc() {
11689
    return unique_ptr(wuffs_lzw__decoder__alloc());
11690
  }
11691
11692
  static inline wuffs_base__io_transformer::unique_ptr
11693
  alloc_as__wuffs_base__io_transformer() {
11694
    return wuffs_base__io_transformer::unique_ptr(
11695
        wuffs_lzw__decoder__alloc_as__wuffs_base__io_transformer());
11696
  }
11697
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
11698
11699
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
11700
  // Disallow constructing or copying an object via standard C++ mechanisms,
11701
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
11702
  // size and field layout is not part of the public, stable, memory-safe API.
11703
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
11704
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
11705
  // their first argument) rather than tweaking bar.private_impl.qux fields.
11706
  //
11707
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
11708
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
11709
  // order to provide convenience methods. These forward on "this", so that you
11710
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
11711
  wuffs_lzw__decoder__struct() = delete;
11712
  wuffs_lzw__decoder__struct(const wuffs_lzw__decoder__struct&) = delete;
11713
  wuffs_lzw__decoder__struct& operator=(
11714
      const wuffs_lzw__decoder__struct&) = delete;
11715
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
11716
11717
#if !defined(WUFFS_IMPLEMENTATION)
11718
  // As above, the size of the struct is not part of the public API, and unless
11719
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
11720
  // allocated, not stack allocated. Its size is not intended to be known at
11721
  // compile time, but it is unfortunately divulged as a side effect of
11722
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
11723
  // instead of "sizeof T", invoking the operator. To make the two values
11724
  // different, so that passing the latter will be rejected by the initialize
11725
  // function, we add an arbitrary amount of dead weight.
11726
  uint8_t dead_weight[123000000];  // 123 MB.
11727
#endif  // !defined(WUFFS_IMPLEMENTATION)
11728
11729
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
11730
  initialize(
11731
      size_t sizeof_star_self,
11732
      uint64_t wuffs_version,
11733
      uint32_t options) {
11734
    return wuffs_lzw__decoder__initialize(
11735
        this, sizeof_star_self, wuffs_version, options);
11736
  }
11737
11738
  inline wuffs_base__io_transformer*
11739
  upcast_as__wuffs_base__io_transformer() {
11740
    return (wuffs_base__io_transformer*)this;
11741
  }
11742
11743
  inline uint64_t
11744
  get_quirk(
11745
      uint32_t a_key) const {
11746
    return wuffs_lzw__decoder__get_quirk(this, a_key);
11747
  }
11748
11749
  inline wuffs_base__status
11750
  set_quirk(
11751
      uint32_t a_key,
11752
      uint64_t a_value) {
11753
    return wuffs_lzw__decoder__set_quirk(this, a_key, a_value);
11754
  }
11755
11756
  inline wuffs_base__optional_u63
11757
  dst_history_retain_length() const {
11758
    return wuffs_lzw__decoder__dst_history_retain_length(this);
11759
  }
11760
11761
  inline wuffs_base__range_ii_u64
11762
  workbuf_len() const {
11763
    return wuffs_lzw__decoder__workbuf_len(this);
11764
  }
11765
11766
  inline wuffs_base__status
11767
  transform_io(
11768
      wuffs_base__io_buffer* a_dst,
11769
      wuffs_base__io_buffer* a_src,
11770
      wuffs_base__slice_u8 a_workbuf) {
11771
    return wuffs_lzw__decoder__transform_io(this, a_dst, a_src, a_workbuf);
11772
  }
11773
11774
  inline wuffs_base__slice_u8
11775
  flush() {
11776
    return wuffs_lzw__decoder__flush(this);
11777
  }
11778
11779
#endif  // __cplusplus
11780
};  // struct wuffs_lzw__decoder__struct
11781
11782
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
11783
11784
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZW) || defined(WUFFS_NONMONOLITHIC)
11785
11786
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NETPBM) || defined(WUFFS_NONMONOLITHIC)
11787
11788
// ---------------- Status Codes
11789
11790
extern const char wuffs_netpbm__error__bad_header[];
11791
extern const char wuffs_netpbm__error__truncated_input[];
11792
extern const char wuffs_netpbm__error__unsupported_netpbm_file[];
11793
11794
// ---------------- Public Consts
11795
11796
#define WUFFS_NETPBM__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u
11797
11798
// ---------------- Struct Declarations
11799
11800
typedef struct wuffs_netpbm__decoder__struct wuffs_netpbm__decoder;
11801
11802
#ifdef __cplusplus
11803
extern "C" {
11804
#endif
11805
11806
// ---------------- Public Initializer Prototypes
11807
11808
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
11809
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
11810
//
11811
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
11812
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
11813
11814
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
11815
wuffs_netpbm__decoder__initialize(
11816
    wuffs_netpbm__decoder* self,
11817
    size_t sizeof_star_self,
11818
    uint64_t wuffs_version,
11819
    uint32_t options);
11820
11821
size_t
11822
sizeof__wuffs_netpbm__decoder(void);
11823
11824
// ---------------- Allocs
11825
11826
// These functions allocate and initialize Wuffs structs. They return NULL if
11827
// memory allocation fails. If they return non-NULL, there is no need to call
11828
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
11829
// calling free on the returned pointer. That pointer is effectively a C++
11830
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
11831
11832
wuffs_netpbm__decoder*
11833
wuffs_netpbm__decoder__alloc(void);
11834
11835
static inline wuffs_base__image_decoder*
11836
wuffs_netpbm__decoder__alloc_as__wuffs_base__image_decoder(void) {
11837
  return (wuffs_base__image_decoder*)(wuffs_netpbm__decoder__alloc());
11838
}
11839
11840
// ---------------- Upcasts
11841
11842
static inline wuffs_base__image_decoder*
11843
wuffs_netpbm__decoder__upcast_as__wuffs_base__image_decoder(
11844
    wuffs_netpbm__decoder* p) {
11845
  return (wuffs_base__image_decoder*)p;
11846
}
11847
11848
// ---------------- Public Function Prototypes
11849
11850
WUFFS_BASE__GENERATED_C_CODE
11851
WUFFS_BASE__MAYBE_STATIC uint64_t
11852
wuffs_netpbm__decoder__get_quirk(
11853
    const wuffs_netpbm__decoder* self,
11854
    uint32_t a_key);
11855
11856
WUFFS_BASE__GENERATED_C_CODE
11857
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
11858
wuffs_netpbm__decoder__set_quirk(
11859
    wuffs_netpbm__decoder* self,
11860
    uint32_t a_key,
11861
    uint64_t a_value);
11862
11863
WUFFS_BASE__GENERATED_C_CODE
11864
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
11865
wuffs_netpbm__decoder__decode_image_config(
11866
    wuffs_netpbm__decoder* self,
11867
    wuffs_base__image_config* a_dst,
11868
    wuffs_base__io_buffer* a_src);
11869
11870
WUFFS_BASE__GENERATED_C_CODE
11871
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
11872
wuffs_netpbm__decoder__decode_frame_config(
11873
    wuffs_netpbm__decoder* self,
11874
    wuffs_base__frame_config* a_dst,
11875
    wuffs_base__io_buffer* a_src);
11876
11877
WUFFS_BASE__GENERATED_C_CODE
11878
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
11879
wuffs_netpbm__decoder__decode_frame(
11880
    wuffs_netpbm__decoder* self,
11881
    wuffs_base__pixel_buffer* a_dst,
11882
    wuffs_base__io_buffer* a_src,
11883
    wuffs_base__pixel_blend a_blend,
11884
    wuffs_base__slice_u8 a_workbuf,
11885
    wuffs_base__decode_frame_options* a_opts);
11886
11887
WUFFS_BASE__GENERATED_C_CODE
11888
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
11889
wuffs_netpbm__decoder__frame_dirty_rect(
11890
    const wuffs_netpbm__decoder* self);
11891
11892
WUFFS_BASE__GENERATED_C_CODE
11893
WUFFS_BASE__MAYBE_STATIC uint32_t
11894
wuffs_netpbm__decoder__num_animation_loops(
11895
    const wuffs_netpbm__decoder* self);
11896
11897
WUFFS_BASE__GENERATED_C_CODE
11898
WUFFS_BASE__MAYBE_STATIC uint64_t
11899
wuffs_netpbm__decoder__num_decoded_frame_configs(
11900
    const wuffs_netpbm__decoder* self);
11901
11902
WUFFS_BASE__GENERATED_C_CODE
11903
WUFFS_BASE__MAYBE_STATIC uint64_t
11904
wuffs_netpbm__decoder__num_decoded_frames(
11905
    const wuffs_netpbm__decoder* self);
11906
11907
WUFFS_BASE__GENERATED_C_CODE
11908
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
11909
wuffs_netpbm__decoder__restart_frame(
11910
    wuffs_netpbm__decoder* self,
11911
    uint64_t a_index,
11912
    uint64_t a_io_position);
11913
11914
WUFFS_BASE__GENERATED_C_CODE
11915
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
11916
wuffs_netpbm__decoder__set_report_metadata(
11917
    wuffs_netpbm__decoder* self,
11918
    uint32_t a_fourcc,
11919
    bool a_report);
11920
11921
WUFFS_BASE__GENERATED_C_CODE
11922
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
11923
wuffs_netpbm__decoder__tell_me_more(
11924
    wuffs_netpbm__decoder* self,
11925
    wuffs_base__io_buffer* a_dst,
11926
    wuffs_base__more_information* a_minfo,
11927
    wuffs_base__io_buffer* a_src);
11928
11929
WUFFS_BASE__GENERATED_C_CODE
11930
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
11931
wuffs_netpbm__decoder__workbuf_len(
11932
    const wuffs_netpbm__decoder* self);
11933
11934
#ifdef __cplusplus
11935
}  // extern "C"
11936
#endif
11937
11938
// ---------------- Struct Definitions
11939
11940
// These structs' fields, and the sizeof them, are private implementation
11941
// details that aren't guaranteed to be stable across Wuffs versions.
11942
//
11943
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
11944
11945
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
11946
11947
struct wuffs_netpbm__decoder__struct {
11948
  // Do not access the private_impl's or private_data's fields directly. There
11949
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
11950
  // the wuffs_foo__bar__baz functions.
11951
  //
11952
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
11953
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
11954
11955
  struct {
11956
    uint32_t magic;
11957
    uint32_t active_coroutine;
11958
    wuffs_base__vtable vtable_for__wuffs_base__image_decoder;
11959
    wuffs_base__vtable null_vtable;
11960
11961
    uint32_t f_pixfmt;
11962
    uint32_t f_width;
11963
    uint32_t f_height;
11964
    uint32_t f_max_value;
11965
    uint8_t f_call_sequence;
11966
    uint64_t f_frame_config_io_position;
11967
    uint32_t f_dst_x;
11968
    uint32_t f_dst_y;
11969
    wuffs_base__pixel_swizzler f_swizzler;
11970
11971
    uint32_t p_decode_image_config;
11972
    uint32_t p_do_decode_image_config;
11973
    uint32_t p_decode_frame_config;
11974
    uint32_t p_do_decode_frame_config;
11975
    uint32_t p_decode_frame;
11976
    uint32_t p_do_decode_frame;
11977
  } private_impl;
11978
11979
  struct {
11980
    uint8_t f_buffer[8];
11981
  } private_data;
11982
11983
#ifdef __cplusplus
11984
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
11985
  using unique_ptr = std::unique_ptr<wuffs_netpbm__decoder, wuffs_unique_ptr_deleter>;
11986
11987
  // On failure, the alloc_etc functions return nullptr. They don't throw.
11988
11989
  static inline unique_ptr
11990
  alloc() {
11991
    return unique_ptr(wuffs_netpbm__decoder__alloc());
11992
  }
11993
11994
  static inline wuffs_base__image_decoder::unique_ptr
11995
  alloc_as__wuffs_base__image_decoder() {
11996
    return wuffs_base__image_decoder::unique_ptr(
11997
        wuffs_netpbm__decoder__alloc_as__wuffs_base__image_decoder());
11998
  }
11999
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
12000
12001
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
12002
  // Disallow constructing or copying an object via standard C++ mechanisms,
12003
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
12004
  // size and field layout is not part of the public, stable, memory-safe API.
12005
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
12006
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
12007
  // their first argument) rather than tweaking bar.private_impl.qux fields.
12008
  //
12009
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
12010
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
12011
  // order to provide convenience methods. These forward on "this", so that you
12012
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
12013
  wuffs_netpbm__decoder__struct() = delete;
12014
  wuffs_netpbm__decoder__struct(const wuffs_netpbm__decoder__struct&) = delete;
12015
  wuffs_netpbm__decoder__struct& operator=(
12016
      const wuffs_netpbm__decoder__struct&) = delete;
12017
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
12018
12019
#if !defined(WUFFS_IMPLEMENTATION)
12020
  // As above, the size of the struct is not part of the public API, and unless
12021
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
12022
  // allocated, not stack allocated. Its size is not intended to be known at
12023
  // compile time, but it is unfortunately divulged as a side effect of
12024
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
12025
  // instead of "sizeof T", invoking the operator. To make the two values
12026
  // different, so that passing the latter will be rejected by the initialize
12027
  // function, we add an arbitrary amount of dead weight.
12028
  uint8_t dead_weight[123000000];  // 123 MB.
12029
#endif  // !defined(WUFFS_IMPLEMENTATION)
12030
12031
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
12032
  initialize(
12033
      size_t sizeof_star_self,
12034
      uint64_t wuffs_version,
12035
      uint32_t options) {
12036
    return wuffs_netpbm__decoder__initialize(
12037
        this, sizeof_star_self, wuffs_version, options);
12038
  }
12039
12040
  inline wuffs_base__image_decoder*
12041
  upcast_as__wuffs_base__image_decoder() {
12042
    return (wuffs_base__image_decoder*)this;
12043
  }
12044
12045
  inline uint64_t
12046
  get_quirk(
12047
      uint32_t a_key) const {
12048
    return wuffs_netpbm__decoder__get_quirk(this, a_key);
12049
  }
12050
12051
  inline wuffs_base__status
12052
  set_quirk(
12053
      uint32_t a_key,
12054
      uint64_t a_value) {
12055
    return wuffs_netpbm__decoder__set_quirk(this, a_key, a_value);
12056
  }
12057
12058
  inline wuffs_base__status
12059
  decode_image_config(
12060
      wuffs_base__image_config* a_dst,
12061
      wuffs_base__io_buffer* a_src) {
12062
    return wuffs_netpbm__decoder__decode_image_config(this, a_dst, a_src);
12063
  }
12064
12065
  inline wuffs_base__status
12066
  decode_frame_config(
12067
      wuffs_base__frame_config* a_dst,
12068
      wuffs_base__io_buffer* a_src) {
12069
    return wuffs_netpbm__decoder__decode_frame_config(this, a_dst, a_src);
12070
  }
12071
12072
  inline wuffs_base__status
12073
  decode_frame(
12074
      wuffs_base__pixel_buffer* a_dst,
12075
      wuffs_base__io_buffer* a_src,
12076
      wuffs_base__pixel_blend a_blend,
12077
      wuffs_base__slice_u8 a_workbuf,
12078
      wuffs_base__decode_frame_options* a_opts) {
12079
    return wuffs_netpbm__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts);
12080
  }
12081
12082
  inline wuffs_base__rect_ie_u32
12083
  frame_dirty_rect() const {
12084
    return wuffs_netpbm__decoder__frame_dirty_rect(this);
12085
  }
12086
12087
  inline uint32_t
12088
  num_animation_loops() const {
12089
    return wuffs_netpbm__decoder__num_animation_loops(this);
12090
  }
12091
12092
  inline uint64_t
12093
  num_decoded_frame_configs() const {
12094
    return wuffs_netpbm__decoder__num_decoded_frame_configs(this);
12095
  }
12096
12097
  inline uint64_t
12098
  num_decoded_frames() const {
12099
    return wuffs_netpbm__decoder__num_decoded_frames(this);
12100
  }
12101
12102
  inline wuffs_base__status
12103
  restart_frame(
12104
      uint64_t a_index,
12105
      uint64_t a_io_position) {
12106
    return wuffs_netpbm__decoder__restart_frame(this, a_index, a_io_position);
12107
  }
12108
12109
  inline wuffs_base__empty_struct
12110
  set_report_metadata(
12111
      uint32_t a_fourcc,
12112
      bool a_report) {
12113
    return wuffs_netpbm__decoder__set_report_metadata(this, a_fourcc, a_report);
12114
  }
12115
12116
  inline wuffs_base__status
12117
  tell_me_more(
12118
      wuffs_base__io_buffer* a_dst,
12119
      wuffs_base__more_information* a_minfo,
12120
      wuffs_base__io_buffer* a_src) {
12121
    return wuffs_netpbm__decoder__tell_me_more(this, a_dst, a_minfo, a_src);
12122
  }
12123
12124
  inline wuffs_base__range_ii_u64
12125
  workbuf_len() const {
12126
    return wuffs_netpbm__decoder__workbuf_len(this);
12127
  }
12128
12129
#endif  // __cplusplus
12130
};  // struct wuffs_netpbm__decoder__struct
12131
12132
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
12133
12134
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NETPBM) || defined(WUFFS_NONMONOLITHIC)
12135
12136
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NIE) || defined(WUFFS_NONMONOLITHIC)
12137
12138
// ---------------- Status Codes
12139
12140
extern const char wuffs_nie__error__bad_header[];
12141
extern const char wuffs_nie__error__truncated_input[];
12142
extern const char wuffs_nie__error__unsupported_nie_file[];
12143
12144
// ---------------- Public Consts
12145
12146
#define WUFFS_NIE__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u
12147
12148
// ---------------- Struct Declarations
12149
12150
typedef struct wuffs_nie__decoder__struct wuffs_nie__decoder;
12151
12152
#ifdef __cplusplus
12153
extern "C" {
12154
#endif
12155
12156
// ---------------- Public Initializer Prototypes
12157
12158
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
12159
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
12160
//
12161
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
12162
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
12163
12164
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
12165
wuffs_nie__decoder__initialize(
12166
    wuffs_nie__decoder* self,
12167
    size_t sizeof_star_self,
12168
    uint64_t wuffs_version,
12169
    uint32_t options);
12170
12171
size_t
12172
sizeof__wuffs_nie__decoder(void);
12173
12174
// ---------------- Allocs
12175
12176
// These functions allocate and initialize Wuffs structs. They return NULL if
12177
// memory allocation fails. If they return non-NULL, there is no need to call
12178
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
12179
// calling free on the returned pointer. That pointer is effectively a C++
12180
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
12181
12182
wuffs_nie__decoder*
12183
wuffs_nie__decoder__alloc(void);
12184
12185
static inline wuffs_base__image_decoder*
12186
wuffs_nie__decoder__alloc_as__wuffs_base__image_decoder(void) {
12187
  return (wuffs_base__image_decoder*)(wuffs_nie__decoder__alloc());
12188
}
12189
12190
// ---------------- Upcasts
12191
12192
static inline wuffs_base__image_decoder*
12193
wuffs_nie__decoder__upcast_as__wuffs_base__image_decoder(
12194
    wuffs_nie__decoder* p) {
12195
  return (wuffs_base__image_decoder*)p;
12196
}
12197
12198
// ---------------- Public Function Prototypes
12199
12200
WUFFS_BASE__GENERATED_C_CODE
12201
WUFFS_BASE__MAYBE_STATIC uint64_t
12202
wuffs_nie__decoder__get_quirk(
12203
    const wuffs_nie__decoder* self,
12204
    uint32_t a_key);
12205
12206
WUFFS_BASE__GENERATED_C_CODE
12207
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
12208
wuffs_nie__decoder__set_quirk(
12209
    wuffs_nie__decoder* self,
12210
    uint32_t a_key,
12211
    uint64_t a_value);
12212
12213
WUFFS_BASE__GENERATED_C_CODE
12214
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
12215
wuffs_nie__decoder__decode_image_config(
12216
    wuffs_nie__decoder* self,
12217
    wuffs_base__image_config* a_dst,
12218
    wuffs_base__io_buffer* a_src);
12219
12220
WUFFS_BASE__GENERATED_C_CODE
12221
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
12222
wuffs_nie__decoder__decode_frame_config(
12223
    wuffs_nie__decoder* self,
12224
    wuffs_base__frame_config* a_dst,
12225
    wuffs_base__io_buffer* a_src);
12226
12227
WUFFS_BASE__GENERATED_C_CODE
12228
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
12229
wuffs_nie__decoder__decode_frame(
12230
    wuffs_nie__decoder* self,
12231
    wuffs_base__pixel_buffer* a_dst,
12232
    wuffs_base__io_buffer* a_src,
12233
    wuffs_base__pixel_blend a_blend,
12234
    wuffs_base__slice_u8 a_workbuf,
12235
    wuffs_base__decode_frame_options* a_opts);
12236
12237
WUFFS_BASE__GENERATED_C_CODE
12238
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
12239
wuffs_nie__decoder__frame_dirty_rect(
12240
    const wuffs_nie__decoder* self);
12241
12242
WUFFS_BASE__GENERATED_C_CODE
12243
WUFFS_BASE__MAYBE_STATIC uint32_t
12244
wuffs_nie__decoder__num_animation_loops(
12245
    const wuffs_nie__decoder* self);
12246
12247
WUFFS_BASE__GENERATED_C_CODE
12248
WUFFS_BASE__MAYBE_STATIC uint64_t
12249
wuffs_nie__decoder__num_decoded_frame_configs(
12250
    const wuffs_nie__decoder* self);
12251
12252
WUFFS_BASE__GENERATED_C_CODE
12253
WUFFS_BASE__MAYBE_STATIC uint64_t
12254
wuffs_nie__decoder__num_decoded_frames(
12255
    const wuffs_nie__decoder* self);
12256
12257
WUFFS_BASE__GENERATED_C_CODE
12258
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
12259
wuffs_nie__decoder__restart_frame(
12260
    wuffs_nie__decoder* self,
12261
    uint64_t a_index,
12262
    uint64_t a_io_position);
12263
12264
WUFFS_BASE__GENERATED_C_CODE
12265
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
12266
wuffs_nie__decoder__set_report_metadata(
12267
    wuffs_nie__decoder* self,
12268
    uint32_t a_fourcc,
12269
    bool a_report);
12270
12271
WUFFS_BASE__GENERATED_C_CODE
12272
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
12273
wuffs_nie__decoder__tell_me_more(
12274
    wuffs_nie__decoder* self,
12275
    wuffs_base__io_buffer* a_dst,
12276
    wuffs_base__more_information* a_minfo,
12277
    wuffs_base__io_buffer* a_src);
12278
12279
WUFFS_BASE__GENERATED_C_CODE
12280
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
12281
wuffs_nie__decoder__workbuf_len(
12282
    const wuffs_nie__decoder* self);
12283
12284
#ifdef __cplusplus
12285
}  // extern "C"
12286
#endif
12287
12288
// ---------------- Struct Definitions
12289
12290
// These structs' fields, and the sizeof them, are private implementation
12291
// details that aren't guaranteed to be stable across Wuffs versions.
12292
//
12293
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
12294
12295
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
12296
12297
struct wuffs_nie__decoder__struct {
12298
  // Do not access the private_impl's or private_data's fields directly. There
12299
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
12300
  // the wuffs_foo__bar__baz functions.
12301
  //
12302
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
12303
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
12304
12305
  struct {
12306
    uint32_t magic;
12307
    uint32_t active_coroutine;
12308
    wuffs_base__vtable vtable_for__wuffs_base__image_decoder;
12309
    wuffs_base__vtable null_vtable;
12310
12311
    uint32_t f_pixfmt;
12312
    uint32_t f_width;
12313
    uint32_t f_height;
12314
    uint8_t f_call_sequence;
12315
    uint32_t f_dst_x;
12316
    uint32_t f_dst_y;
12317
    wuffs_base__pixel_swizzler f_swizzler;
12318
12319
    uint32_t p_decode_image_config;
12320
    uint32_t p_do_decode_image_config;
12321
    uint32_t p_decode_frame_config;
12322
    uint32_t p_do_decode_frame_config;
12323
    uint32_t p_decode_frame;
12324
    uint32_t p_do_decode_frame;
12325
  } private_impl;
12326
12327
  struct {
12328
    struct {
12329
      uint64_t scratch;
12330
    } s_do_decode_image_config;
12331
  } private_data;
12332
12333
#ifdef __cplusplus
12334
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
12335
  using unique_ptr = std::unique_ptr<wuffs_nie__decoder, wuffs_unique_ptr_deleter>;
12336
12337
  // On failure, the alloc_etc functions return nullptr. They don't throw.
12338
12339
  static inline unique_ptr
12340
  alloc() {
12341
    return unique_ptr(wuffs_nie__decoder__alloc());
12342
  }
12343
12344
  static inline wuffs_base__image_decoder::unique_ptr
12345
  alloc_as__wuffs_base__image_decoder() {
12346
    return wuffs_base__image_decoder::unique_ptr(
12347
        wuffs_nie__decoder__alloc_as__wuffs_base__image_decoder());
12348
  }
12349
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
12350
12351
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
12352
  // Disallow constructing or copying an object via standard C++ mechanisms,
12353
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
12354
  // size and field layout is not part of the public, stable, memory-safe API.
12355
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
12356
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
12357
  // their first argument) rather than tweaking bar.private_impl.qux fields.
12358
  //
12359
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
12360
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
12361
  // order to provide convenience methods. These forward on "this", so that you
12362
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
12363
  wuffs_nie__decoder__struct() = delete;
12364
  wuffs_nie__decoder__struct(const wuffs_nie__decoder__struct&) = delete;
12365
  wuffs_nie__decoder__struct& operator=(
12366
      const wuffs_nie__decoder__struct&) = delete;
12367
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
12368
12369
#if !defined(WUFFS_IMPLEMENTATION)
12370
  // As above, the size of the struct is not part of the public API, and unless
12371
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
12372
  // allocated, not stack allocated. Its size is not intended to be known at
12373
  // compile time, but it is unfortunately divulged as a side effect of
12374
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
12375
  // instead of "sizeof T", invoking the operator. To make the two values
12376
  // different, so that passing the latter will be rejected by the initialize
12377
  // function, we add an arbitrary amount of dead weight.
12378
  uint8_t dead_weight[123000000];  // 123 MB.
12379
#endif  // !defined(WUFFS_IMPLEMENTATION)
12380
12381
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
12382
  initialize(
12383
      size_t sizeof_star_self,
12384
      uint64_t wuffs_version,
12385
      uint32_t options) {
12386
    return wuffs_nie__decoder__initialize(
12387
        this, sizeof_star_self, wuffs_version, options);
12388
  }
12389
12390
  inline wuffs_base__image_decoder*
12391
  upcast_as__wuffs_base__image_decoder() {
12392
    return (wuffs_base__image_decoder*)this;
12393
  }
12394
12395
  inline uint64_t
12396
  get_quirk(
12397
      uint32_t a_key) const {
12398
    return wuffs_nie__decoder__get_quirk(this, a_key);
12399
  }
12400
12401
  inline wuffs_base__status
12402
  set_quirk(
12403
      uint32_t a_key,
12404
      uint64_t a_value) {
12405
    return wuffs_nie__decoder__set_quirk(this, a_key, a_value);
12406
  }
12407
12408
  inline wuffs_base__status
12409
  decode_image_config(
12410
      wuffs_base__image_config* a_dst,
12411
      wuffs_base__io_buffer* a_src) {
12412
    return wuffs_nie__decoder__decode_image_config(this, a_dst, a_src);
12413
  }
12414
12415
  inline wuffs_base__status
12416
  decode_frame_config(
12417
      wuffs_base__frame_config* a_dst,
12418
      wuffs_base__io_buffer* a_src) {
12419
    return wuffs_nie__decoder__decode_frame_config(this, a_dst, a_src);
12420
  }
12421
12422
  inline wuffs_base__status
12423
  decode_frame(
12424
      wuffs_base__pixel_buffer* a_dst,
12425
      wuffs_base__io_buffer* a_src,
12426
      wuffs_base__pixel_blend a_blend,
12427
      wuffs_base__slice_u8 a_workbuf,
12428
      wuffs_base__decode_frame_options* a_opts) {
12429
    return wuffs_nie__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts);
12430
  }
12431
12432
  inline wuffs_base__rect_ie_u32
12433
  frame_dirty_rect() const {
12434
    return wuffs_nie__decoder__frame_dirty_rect(this);
12435
  }
12436
12437
  inline uint32_t
12438
  num_animation_loops() const {
12439
    return wuffs_nie__decoder__num_animation_loops(this);
12440
  }
12441
12442
  inline uint64_t
12443
  num_decoded_frame_configs() const {
12444
    return wuffs_nie__decoder__num_decoded_frame_configs(this);
12445
  }
12446
12447
  inline uint64_t
12448
  num_decoded_frames() const {
12449
    return wuffs_nie__decoder__num_decoded_frames(this);
12450
  }
12451
12452
  inline wuffs_base__status
12453
  restart_frame(
12454
      uint64_t a_index,
12455
      uint64_t a_io_position) {
12456
    return wuffs_nie__decoder__restart_frame(this, a_index, a_io_position);
12457
  }
12458
12459
  inline wuffs_base__empty_struct
12460
  set_report_metadata(
12461
      uint32_t a_fourcc,
12462
      bool a_report) {
12463
    return wuffs_nie__decoder__set_report_metadata(this, a_fourcc, a_report);
12464
  }
12465
12466
  inline wuffs_base__status
12467
  tell_me_more(
12468
      wuffs_base__io_buffer* a_dst,
12469
      wuffs_base__more_information* a_minfo,
12470
      wuffs_base__io_buffer* a_src) {
12471
    return wuffs_nie__decoder__tell_me_more(this, a_dst, a_minfo, a_src);
12472
  }
12473
12474
  inline wuffs_base__range_ii_u64
12475
  workbuf_len() const {
12476
    return wuffs_nie__decoder__workbuf_len(this);
12477
  }
12478
12479
#endif  // __cplusplus
12480
};  // struct wuffs_nie__decoder__struct
12481
12482
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
12483
12484
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NIE) || defined(WUFFS_NONMONOLITHIC)
12485
12486
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ZLIB) || defined(WUFFS_NONMONOLITHIC)
12487
12488
// ---------------- Status Codes
12489
12490
extern const char wuffs_zlib__note__dictionary_required[];
12491
extern const char wuffs_zlib__error__bad_checksum[];
12492
extern const char wuffs_zlib__error__bad_compression_method[];
12493
extern const char wuffs_zlib__error__bad_compression_window_size[];
12494
extern const char wuffs_zlib__error__bad_parity_check[];
12495
extern const char wuffs_zlib__error__incorrect_dictionary[];
12496
extern const char wuffs_zlib__error__truncated_input[];
12497
12498
// ---------------- Public Consts
12499
12500
#define WUFFS_ZLIB__QUIRK_JUST_RAW_DEFLATE 2056083456u
12501
12502
#define WUFFS_ZLIB__DECODER_DST_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0u
12503
12504
#define WUFFS_ZLIB__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 1u
12505
12506
// ---------------- Struct Declarations
12507
12508
typedef struct wuffs_zlib__decoder__struct wuffs_zlib__decoder;
12509
12510
#ifdef __cplusplus
12511
extern "C" {
12512
#endif
12513
12514
// ---------------- Public Initializer Prototypes
12515
12516
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
12517
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
12518
//
12519
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
12520
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
12521
12522
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
12523
wuffs_zlib__decoder__initialize(
12524
    wuffs_zlib__decoder* self,
12525
    size_t sizeof_star_self,
12526
    uint64_t wuffs_version,
12527
    uint32_t options);
12528
12529
size_t
12530
sizeof__wuffs_zlib__decoder(void);
12531
12532
// ---------------- Allocs
12533
12534
// These functions allocate and initialize Wuffs structs. They return NULL if
12535
// memory allocation fails. If they return non-NULL, there is no need to call
12536
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
12537
// calling free on the returned pointer. That pointer is effectively a C++
12538
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
12539
12540
wuffs_zlib__decoder*
12541
wuffs_zlib__decoder__alloc(void);
12542
12543
static inline wuffs_base__io_transformer*
12544
0
wuffs_zlib__decoder__alloc_as__wuffs_base__io_transformer(void) {
12545
0
  return (wuffs_base__io_transformer*)(wuffs_zlib__decoder__alloc());
12546
0
}
12547
12548
// ---------------- Upcasts
12549
12550
static inline wuffs_base__io_transformer*
12551
wuffs_zlib__decoder__upcast_as__wuffs_base__io_transformer(
12552
0
    wuffs_zlib__decoder* p) {
12553
0
  return (wuffs_base__io_transformer*)p;
12554
0
}
12555
12556
// ---------------- Public Function Prototypes
12557
12558
WUFFS_BASE__GENERATED_C_CODE
12559
WUFFS_BASE__MAYBE_STATIC uint32_t
12560
wuffs_zlib__decoder__dictionary_id(
12561
    const wuffs_zlib__decoder* self);
12562
12563
WUFFS_BASE__GENERATED_C_CODE
12564
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
12565
wuffs_zlib__decoder__add_dictionary(
12566
    wuffs_zlib__decoder* self,
12567
    wuffs_base__slice_u8 a_dict);
12568
12569
WUFFS_BASE__GENERATED_C_CODE
12570
WUFFS_BASE__MAYBE_STATIC uint64_t
12571
wuffs_zlib__decoder__get_quirk(
12572
    const wuffs_zlib__decoder* self,
12573
    uint32_t a_key);
12574
12575
WUFFS_BASE__GENERATED_C_CODE
12576
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
12577
wuffs_zlib__decoder__set_quirk(
12578
    wuffs_zlib__decoder* self,
12579
    uint32_t a_key,
12580
    uint64_t a_value);
12581
12582
WUFFS_BASE__GENERATED_C_CODE
12583
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
12584
wuffs_zlib__decoder__dst_history_retain_length(
12585
    const wuffs_zlib__decoder* self);
12586
12587
WUFFS_BASE__GENERATED_C_CODE
12588
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
12589
wuffs_zlib__decoder__workbuf_len(
12590
    const wuffs_zlib__decoder* self);
12591
12592
WUFFS_BASE__GENERATED_C_CODE
12593
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
12594
wuffs_zlib__decoder__transform_io(
12595
    wuffs_zlib__decoder* self,
12596
    wuffs_base__io_buffer* a_dst,
12597
    wuffs_base__io_buffer* a_src,
12598
    wuffs_base__slice_u8 a_workbuf);
12599
12600
#ifdef __cplusplus
12601
}  // extern "C"
12602
#endif
12603
12604
// ---------------- Struct Definitions
12605
12606
// These structs' fields, and the sizeof them, are private implementation
12607
// details that aren't guaranteed to be stable across Wuffs versions.
12608
//
12609
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
12610
12611
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
12612
12613
struct wuffs_zlib__decoder__struct {
12614
  // Do not access the private_impl's or private_data's fields directly. There
12615
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
12616
  // the wuffs_foo__bar__baz functions.
12617
  //
12618
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
12619
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
12620
12621
  struct {
12622
    uint32_t magic;
12623
    uint32_t active_coroutine;
12624
    wuffs_base__vtable vtable_for__wuffs_base__io_transformer;
12625
    wuffs_base__vtable null_vtable;
12626
12627
    bool f_bad_call_sequence;
12628
    bool f_header_complete;
12629
    bool f_got_dictionary;
12630
    bool f_want_dictionary;
12631
    bool f_quirks[1];
12632
    bool f_ignore_checksum;
12633
    uint32_t f_dict_id_have;
12634
    uint32_t f_dict_id_want;
12635
12636
    uint32_t p_transform_io;
12637
    uint32_t p_do_transform_io;
12638
  } private_impl;
12639
12640
  struct {
12641
    wuffs_adler32__hasher f_checksum;
12642
    wuffs_adler32__hasher f_dict_id_hasher;
12643
    wuffs_deflate__decoder f_flate;
12644
12645
    struct {
12646
      uint32_t v_checksum_have;
12647
      uint64_t scratch;
12648
    } s_do_transform_io;
12649
  } private_data;
12650
12651
#ifdef __cplusplus
12652
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
12653
  using unique_ptr = std::unique_ptr<wuffs_zlib__decoder, wuffs_unique_ptr_deleter>;
12654
12655
  // On failure, the alloc_etc functions return nullptr. They don't throw.
12656
12657
  static inline unique_ptr
12658
  alloc() {
12659
    return unique_ptr(wuffs_zlib__decoder__alloc());
12660
  }
12661
12662
  static inline wuffs_base__io_transformer::unique_ptr
12663
  alloc_as__wuffs_base__io_transformer() {
12664
    return wuffs_base__io_transformer::unique_ptr(
12665
        wuffs_zlib__decoder__alloc_as__wuffs_base__io_transformer());
12666
  }
12667
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
12668
12669
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
12670
  // Disallow constructing or copying an object via standard C++ mechanisms,
12671
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
12672
  // size and field layout is not part of the public, stable, memory-safe API.
12673
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
12674
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
12675
  // their first argument) rather than tweaking bar.private_impl.qux fields.
12676
  //
12677
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
12678
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
12679
  // order to provide convenience methods. These forward on "this", so that you
12680
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
12681
  wuffs_zlib__decoder__struct() = delete;
12682
  wuffs_zlib__decoder__struct(const wuffs_zlib__decoder__struct&) = delete;
12683
  wuffs_zlib__decoder__struct& operator=(
12684
      const wuffs_zlib__decoder__struct&) = delete;
12685
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
12686
12687
#if !defined(WUFFS_IMPLEMENTATION)
12688
  // As above, the size of the struct is not part of the public API, and unless
12689
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
12690
  // allocated, not stack allocated. Its size is not intended to be known at
12691
  // compile time, but it is unfortunately divulged as a side effect of
12692
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
12693
  // instead of "sizeof T", invoking the operator. To make the two values
12694
  // different, so that passing the latter will be rejected by the initialize
12695
  // function, we add an arbitrary amount of dead weight.
12696
  uint8_t dead_weight[123000000];  // 123 MB.
12697
#endif  // !defined(WUFFS_IMPLEMENTATION)
12698
12699
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
12700
  initialize(
12701
      size_t sizeof_star_self,
12702
      uint64_t wuffs_version,
12703
      uint32_t options) {
12704
    return wuffs_zlib__decoder__initialize(
12705
        this, sizeof_star_self, wuffs_version, options);
12706
  }
12707
12708
  inline wuffs_base__io_transformer*
12709
  upcast_as__wuffs_base__io_transformer() {
12710
    return (wuffs_base__io_transformer*)this;
12711
  }
12712
12713
  inline uint32_t
12714
  dictionary_id() const {
12715
    return wuffs_zlib__decoder__dictionary_id(this);
12716
  }
12717
12718
  inline wuffs_base__empty_struct
12719
  add_dictionary(
12720
      wuffs_base__slice_u8 a_dict) {
12721
    return wuffs_zlib__decoder__add_dictionary(this, a_dict);
12722
  }
12723
12724
  inline uint64_t
12725
  get_quirk(
12726
      uint32_t a_key) const {
12727
    return wuffs_zlib__decoder__get_quirk(this, a_key);
12728
  }
12729
12730
  inline wuffs_base__status
12731
  set_quirk(
12732
      uint32_t a_key,
12733
      uint64_t a_value) {
12734
    return wuffs_zlib__decoder__set_quirk(this, a_key, a_value);
12735
  }
12736
12737
  inline wuffs_base__optional_u63
12738
  dst_history_retain_length() const {
12739
    return wuffs_zlib__decoder__dst_history_retain_length(this);
12740
  }
12741
12742
  inline wuffs_base__range_ii_u64
12743
  workbuf_len() const {
12744
    return wuffs_zlib__decoder__workbuf_len(this);
12745
  }
12746
12747
  inline wuffs_base__status
12748
  transform_io(
12749
      wuffs_base__io_buffer* a_dst,
12750
      wuffs_base__io_buffer* a_src,
12751
      wuffs_base__slice_u8 a_workbuf) {
12752
    return wuffs_zlib__decoder__transform_io(this, a_dst, a_src, a_workbuf);
12753
  }
12754
12755
#endif  // __cplusplus
12756
};  // struct wuffs_zlib__decoder__struct
12757
12758
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
12759
12760
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ZLIB) || defined(WUFFS_NONMONOLITHIC)
12761
12762
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__PNG) || defined(WUFFS_NONMONOLITHIC)
12763
12764
// ---------------- Status Codes
12765
12766
extern const char wuffs_png__error__bad_animation_sequence_number[];
12767
extern const char wuffs_png__error__bad_checksum[];
12768
extern const char wuffs_png__error__bad_chunk[];
12769
extern const char wuffs_png__error__bad_filter[];
12770
extern const char wuffs_png__error__bad_header[];
12771
extern const char wuffs_png__error__bad_text_chunk_not_latin_1[];
12772
extern const char wuffs_png__error__missing_palette[];
12773
extern const char wuffs_png__error__truncated_input[];
12774
extern const char wuffs_png__error__unsupported_cgbi_extension[];
12775
extern const char wuffs_png__error__unsupported_png_compression_method[];
12776
extern const char wuffs_png__error__unsupported_png_file[];
12777
12778
// ---------------- Public Consts
12779
12780
#define WUFFS_PNG__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 2251799562027015u
12781
12782
#define WUFFS_PNG__DECODER_SRC_IO_BUFFER_LENGTH_MIN_INCL 8u
12783
12784
// ---------------- Struct Declarations
12785
12786
typedef struct wuffs_png__decoder__struct wuffs_png__decoder;
12787
12788
#ifdef __cplusplus
12789
extern "C" {
12790
#endif
12791
12792
// ---------------- Public Initializer Prototypes
12793
12794
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
12795
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
12796
//
12797
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
12798
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
12799
12800
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
12801
wuffs_png__decoder__initialize(
12802
    wuffs_png__decoder* self,
12803
    size_t sizeof_star_self,
12804
    uint64_t wuffs_version,
12805
    uint32_t options);
12806
12807
size_t
12808
sizeof__wuffs_png__decoder(void);
12809
12810
// ---------------- Allocs
12811
12812
// These functions allocate and initialize Wuffs structs. They return NULL if
12813
// memory allocation fails. If they return non-NULL, there is no need to call
12814
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
12815
// calling free on the returned pointer. That pointer is effectively a C++
12816
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
12817
12818
wuffs_png__decoder*
12819
wuffs_png__decoder__alloc(void);
12820
12821
static inline wuffs_base__image_decoder*
12822
0
wuffs_png__decoder__alloc_as__wuffs_base__image_decoder(void) {
12823
0
  return (wuffs_base__image_decoder*)(wuffs_png__decoder__alloc());
12824
0
}
12825
12826
// ---------------- Upcasts
12827
12828
static inline wuffs_base__image_decoder*
12829
wuffs_png__decoder__upcast_as__wuffs_base__image_decoder(
12830
5.73k
    wuffs_png__decoder* p) {
12831
5.73k
  return (wuffs_base__image_decoder*)p;
12832
5.73k
}
12833
12834
// ---------------- Public Function Prototypes
12835
12836
WUFFS_BASE__GENERATED_C_CODE
12837
WUFFS_BASE__MAYBE_STATIC uint64_t
12838
wuffs_png__decoder__get_quirk(
12839
    const wuffs_png__decoder* self,
12840
    uint32_t a_key);
12841
12842
WUFFS_BASE__GENERATED_C_CODE
12843
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
12844
wuffs_png__decoder__set_quirk(
12845
    wuffs_png__decoder* self,
12846
    uint32_t a_key,
12847
    uint64_t a_value);
12848
12849
WUFFS_BASE__GENERATED_C_CODE
12850
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
12851
wuffs_png__decoder__decode_image_config(
12852
    wuffs_png__decoder* self,
12853
    wuffs_base__image_config* a_dst,
12854
    wuffs_base__io_buffer* a_src);
12855
12856
WUFFS_BASE__GENERATED_C_CODE
12857
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
12858
wuffs_png__decoder__decode_frame_config(
12859
    wuffs_png__decoder* self,
12860
    wuffs_base__frame_config* a_dst,
12861
    wuffs_base__io_buffer* a_src);
12862
12863
WUFFS_BASE__GENERATED_C_CODE
12864
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
12865
wuffs_png__decoder__decode_frame(
12866
    wuffs_png__decoder* self,
12867
    wuffs_base__pixel_buffer* a_dst,
12868
    wuffs_base__io_buffer* a_src,
12869
    wuffs_base__pixel_blend a_blend,
12870
    wuffs_base__slice_u8 a_workbuf,
12871
    wuffs_base__decode_frame_options* a_opts);
12872
12873
WUFFS_BASE__GENERATED_C_CODE
12874
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
12875
wuffs_png__decoder__frame_dirty_rect(
12876
    const wuffs_png__decoder* self);
12877
12878
WUFFS_BASE__GENERATED_C_CODE
12879
WUFFS_BASE__MAYBE_STATIC uint32_t
12880
wuffs_png__decoder__num_animation_loops(
12881
    const wuffs_png__decoder* self);
12882
12883
WUFFS_BASE__GENERATED_C_CODE
12884
WUFFS_BASE__MAYBE_STATIC uint64_t
12885
wuffs_png__decoder__num_decoded_frame_configs(
12886
    const wuffs_png__decoder* self);
12887
12888
WUFFS_BASE__GENERATED_C_CODE
12889
WUFFS_BASE__MAYBE_STATIC uint64_t
12890
wuffs_png__decoder__num_decoded_frames(
12891
    const wuffs_png__decoder* self);
12892
12893
WUFFS_BASE__GENERATED_C_CODE
12894
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
12895
wuffs_png__decoder__restart_frame(
12896
    wuffs_png__decoder* self,
12897
    uint64_t a_index,
12898
    uint64_t a_io_position);
12899
12900
WUFFS_BASE__GENERATED_C_CODE
12901
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
12902
wuffs_png__decoder__set_report_metadata(
12903
    wuffs_png__decoder* self,
12904
    uint32_t a_fourcc,
12905
    bool a_report);
12906
12907
WUFFS_BASE__GENERATED_C_CODE
12908
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
12909
wuffs_png__decoder__tell_me_more(
12910
    wuffs_png__decoder* self,
12911
    wuffs_base__io_buffer* a_dst,
12912
    wuffs_base__more_information* a_minfo,
12913
    wuffs_base__io_buffer* a_src);
12914
12915
WUFFS_BASE__GENERATED_C_CODE
12916
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
12917
wuffs_png__decoder__workbuf_len(
12918
    const wuffs_png__decoder* self);
12919
12920
#ifdef __cplusplus
12921
}  // extern "C"
12922
#endif
12923
12924
// ---------------- Struct Definitions
12925
12926
// These structs' fields, and the sizeof them, are private implementation
12927
// details that aren't guaranteed to be stable across Wuffs versions.
12928
//
12929
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
12930
12931
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
12932
12933
struct wuffs_png__decoder__struct {
12934
  // Do not access the private_impl's or private_data's fields directly. There
12935
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
12936
  // the wuffs_foo__bar__baz functions.
12937
  //
12938
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
12939
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
12940
12941
  struct {
12942
    uint32_t magic;
12943
    uint32_t active_coroutine;
12944
    wuffs_base__vtable vtable_for__wuffs_base__image_decoder;
12945
    wuffs_base__vtable null_vtable;
12946
12947
    uint32_t f_width;
12948
    uint32_t f_height;
12949
    uint64_t f_pass_bytes_per_row;
12950
    uint64_t f_workbuf_wi;
12951
    uint64_t f_workbuf_hist_pos_base;
12952
    uint64_t f_overall_workbuf_length;
12953
    uint64_t f_pass_workbuf_length;
12954
    uint8_t f_call_sequence;
12955
    bool f_report_metadata_chrm;
12956
    bool f_report_metadata_exif;
12957
    bool f_report_metadata_gama;
12958
    bool f_report_metadata_iccp;
12959
    bool f_report_metadata_kvp;
12960
    bool f_report_metadata_srgb;
12961
    bool f_ignore_checksum;
12962
    uint8_t f_depth;
12963
    uint8_t f_color_type;
12964
    uint8_t f_filter_distance;
12965
    uint8_t f_interlace_pass;
12966
    bool f_seen_actl;
12967
    bool f_seen_chrm;
12968
    bool f_seen_fctl;
12969
    bool f_seen_exif;
12970
    bool f_seen_gama;
12971
    bool f_seen_iccp;
12972
    bool f_seen_idat;
12973
    bool f_seen_ihdr;
12974
    bool f_seen_plte;
12975
    bool f_seen_srgb;
12976
    bool f_seen_trns;
12977
    bool f_metadata_is_zlib_compressed;
12978
    bool f_zlib_is_dirty;
12979
    uint32_t f_chunk_type;
12980
    uint8_t f_chunk_type_array[4];
12981
    uint32_t f_chunk_length;
12982
    uint64_t f_remap_transparency;
12983
    uint32_t f_dst_pixfmt;
12984
    uint32_t f_src_pixfmt;
12985
    uint32_t f_num_animation_frames_value;
12986
    uint32_t f_num_animation_loops_value;
12987
    uint32_t f_num_decoded_frame_configs_value;
12988
    uint32_t f_num_decoded_frames_value;
12989
    uint32_t f_frame_rect_x0;
12990
    uint32_t f_frame_rect_y0;
12991
    uint32_t f_frame_rect_x1;
12992
    uint32_t f_frame_rect_y1;
12993
    uint32_t f_first_rect_x0;
12994
    uint32_t f_first_rect_y0;
12995
    uint32_t f_first_rect_x1;
12996
    uint32_t f_first_rect_y1;
12997
    uint64_t f_frame_config_io_position;
12998
    uint64_t f_first_config_io_position;
12999
    uint64_t f_frame_duration;
13000
    uint64_t f_first_duration;
13001
    uint8_t f_frame_disposal;
13002
    uint8_t f_first_disposal;
13003
    bool f_frame_overwrite_instead_of_blend;
13004
    bool f_first_overwrite_instead_of_blend;
13005
    uint32_t f_next_animation_seq_num;
13006
    uint32_t f_metadata_flavor;
13007
    uint32_t f_metadata_fourcc;
13008
    uint64_t f_metadata_x;
13009
    uint64_t f_metadata_y;
13010
    uint64_t f_metadata_z;
13011
    uint32_t f_ztxt_ri;
13012
    uint32_t f_ztxt_wi;
13013
    uint64_t f_ztxt_hist_pos;
13014
    wuffs_base__pixel_swizzler f_swizzler;
13015
13016
    wuffs_base__empty_struct (*choosy_filter_1)(
13017
        wuffs_png__decoder* self,
13018
        wuffs_base__slice_u8 a_curr);
13019
    wuffs_base__empty_struct (*choosy_filter_3)(
13020
        wuffs_png__decoder* self,
13021
        wuffs_base__slice_u8 a_curr,
13022
        wuffs_base__slice_u8 a_prev);
13023
    wuffs_base__empty_struct (*choosy_filter_4)(
13024
        wuffs_png__decoder* self,
13025
        wuffs_base__slice_u8 a_curr,
13026
        wuffs_base__slice_u8 a_prev);
13027
    uint32_t p_decode_image_config;
13028
    uint32_t p_do_decode_image_config;
13029
    uint32_t p_decode_ihdr;
13030
    uint32_t p_decode_other_chunk;
13031
    uint32_t p_decode_actl;
13032
    uint32_t p_decode_chrm;
13033
    uint32_t p_decode_fctl;
13034
    uint32_t p_decode_gama;
13035
    uint32_t p_decode_iccp;
13036
    uint32_t p_decode_plte;
13037
    uint32_t p_decode_srgb;
13038
    uint32_t p_decode_trns;
13039
    uint32_t p_decode_frame_config;
13040
    uint32_t p_do_decode_frame_config;
13041
    uint32_t p_skip_frame;
13042
    uint32_t p_decode_frame;
13043
    uint32_t p_do_decode_frame;
13044
    uint32_t p_decode_pass;
13045
    uint32_t p_tell_me_more;
13046
    uint32_t p_do_tell_me_more;
13047
    wuffs_base__status (*choosy_filter_and_swizzle)(
13048
        wuffs_png__decoder* self,
13049
        wuffs_base__pixel_buffer* a_dst,
13050
        wuffs_base__slice_u8 a_workbuf);
13051
  } private_impl;
13052
13053
  struct {
13054
    wuffs_crc32__ieee_hasher f_crc32;
13055
    wuffs_zlib__decoder f_zlib;
13056
    uint8_t f_dst_palette[1024];
13057
    uint8_t f_src_palette[1024];
13058
13059
    struct {
13060
      uint32_t v_checksum_have;
13061
      uint64_t scratch;
13062
    } s_do_decode_image_config;
13063
    struct {
13064
      uint64_t scratch;
13065
    } s_decode_ihdr;
13066
    struct {
13067
      uint64_t scratch;
13068
    } s_decode_other_chunk;
13069
    struct {
13070
      uint64_t scratch;
13071
    } s_decode_actl;
13072
    struct {
13073
      uint64_t scratch;
13074
    } s_decode_chrm;
13075
    struct {
13076
      uint32_t v_x0;
13077
      uint32_t v_x1;
13078
      uint32_t v_y1;
13079
      uint64_t scratch;
13080
    } s_decode_fctl;
13081
    struct {
13082
      uint64_t scratch;
13083
    } s_decode_gama;
13084
    struct {
13085
      uint32_t v_num_entries;
13086
      uint32_t v_i;
13087
      uint64_t scratch;
13088
    } s_decode_plte;
13089
    struct {
13090
      uint32_t v_i;
13091
      uint32_t v_n;
13092
      uint64_t scratch;
13093
    } s_decode_trns;
13094
    struct {
13095
      uint64_t scratch;
13096
    } s_do_decode_frame_config;
13097
    struct {
13098
      uint64_t scratch;
13099
    } s_skip_frame;
13100
    struct {
13101
      uint64_t scratch;
13102
    } s_do_decode_frame;
13103
    struct {
13104
      uint64_t scratch;
13105
    } s_decode_pass;
13106
    struct {
13107
      wuffs_base__status v_zlib_status;
13108
      uint64_t scratch;
13109
    } s_do_tell_me_more;
13110
  } private_data;
13111
13112
#ifdef __cplusplus
13113
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
13114
  using unique_ptr = std::unique_ptr<wuffs_png__decoder, wuffs_unique_ptr_deleter>;
13115
13116
  // On failure, the alloc_etc functions return nullptr. They don't throw.
13117
13118
  static inline unique_ptr
13119
  alloc() {
13120
    return unique_ptr(wuffs_png__decoder__alloc());
13121
  }
13122
13123
  static inline wuffs_base__image_decoder::unique_ptr
13124
  alloc_as__wuffs_base__image_decoder() {
13125
    return wuffs_base__image_decoder::unique_ptr(
13126
        wuffs_png__decoder__alloc_as__wuffs_base__image_decoder());
13127
  }
13128
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
13129
13130
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
13131
  // Disallow constructing or copying an object via standard C++ mechanisms,
13132
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
13133
  // size and field layout is not part of the public, stable, memory-safe API.
13134
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
13135
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
13136
  // their first argument) rather than tweaking bar.private_impl.qux fields.
13137
  //
13138
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
13139
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
13140
  // order to provide convenience methods. These forward on "this", so that you
13141
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
13142
  wuffs_png__decoder__struct() = delete;
13143
  wuffs_png__decoder__struct(const wuffs_png__decoder__struct&) = delete;
13144
  wuffs_png__decoder__struct& operator=(
13145
      const wuffs_png__decoder__struct&) = delete;
13146
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
13147
13148
#if !defined(WUFFS_IMPLEMENTATION)
13149
  // As above, the size of the struct is not part of the public API, and unless
13150
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
13151
  // allocated, not stack allocated. Its size is not intended to be known at
13152
  // compile time, but it is unfortunately divulged as a side effect of
13153
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
13154
  // instead of "sizeof T", invoking the operator. To make the two values
13155
  // different, so that passing the latter will be rejected by the initialize
13156
  // function, we add an arbitrary amount of dead weight.
13157
  uint8_t dead_weight[123000000];  // 123 MB.
13158
#endif  // !defined(WUFFS_IMPLEMENTATION)
13159
13160
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
13161
  initialize(
13162
      size_t sizeof_star_self,
13163
      uint64_t wuffs_version,
13164
      uint32_t options) {
13165
    return wuffs_png__decoder__initialize(
13166
        this, sizeof_star_self, wuffs_version, options);
13167
  }
13168
13169
  inline wuffs_base__image_decoder*
13170
  upcast_as__wuffs_base__image_decoder() {
13171
    return (wuffs_base__image_decoder*)this;
13172
  }
13173
13174
  inline uint64_t
13175
  get_quirk(
13176
      uint32_t a_key) const {
13177
    return wuffs_png__decoder__get_quirk(this, a_key);
13178
  }
13179
13180
  inline wuffs_base__status
13181
  set_quirk(
13182
      uint32_t a_key,
13183
      uint64_t a_value) {
13184
    return wuffs_png__decoder__set_quirk(this, a_key, a_value);
13185
  }
13186
13187
  inline wuffs_base__status
13188
  decode_image_config(
13189
      wuffs_base__image_config* a_dst,
13190
      wuffs_base__io_buffer* a_src) {
13191
    return wuffs_png__decoder__decode_image_config(this, a_dst, a_src);
13192
  }
13193
13194
  inline wuffs_base__status
13195
  decode_frame_config(
13196
      wuffs_base__frame_config* a_dst,
13197
      wuffs_base__io_buffer* a_src) {
13198
    return wuffs_png__decoder__decode_frame_config(this, a_dst, a_src);
13199
  }
13200
13201
  inline wuffs_base__status
13202
  decode_frame(
13203
      wuffs_base__pixel_buffer* a_dst,
13204
      wuffs_base__io_buffer* a_src,
13205
      wuffs_base__pixel_blend a_blend,
13206
      wuffs_base__slice_u8 a_workbuf,
13207
      wuffs_base__decode_frame_options* a_opts) {
13208
    return wuffs_png__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts);
13209
  }
13210
13211
  inline wuffs_base__rect_ie_u32
13212
  frame_dirty_rect() const {
13213
    return wuffs_png__decoder__frame_dirty_rect(this);
13214
  }
13215
13216
  inline uint32_t
13217
  num_animation_loops() const {
13218
    return wuffs_png__decoder__num_animation_loops(this);
13219
  }
13220
13221
  inline uint64_t
13222
  num_decoded_frame_configs() const {
13223
    return wuffs_png__decoder__num_decoded_frame_configs(this);
13224
  }
13225
13226
  inline uint64_t
13227
  num_decoded_frames() const {
13228
    return wuffs_png__decoder__num_decoded_frames(this);
13229
  }
13230
13231
  inline wuffs_base__status
13232
  restart_frame(
13233
      uint64_t a_index,
13234
      uint64_t a_io_position) {
13235
    return wuffs_png__decoder__restart_frame(this, a_index, a_io_position);
13236
  }
13237
13238
  inline wuffs_base__empty_struct
13239
  set_report_metadata(
13240
      uint32_t a_fourcc,
13241
      bool a_report) {
13242
    return wuffs_png__decoder__set_report_metadata(this, a_fourcc, a_report);
13243
  }
13244
13245
  inline wuffs_base__status
13246
  tell_me_more(
13247
      wuffs_base__io_buffer* a_dst,
13248
      wuffs_base__more_information* a_minfo,
13249
      wuffs_base__io_buffer* a_src) {
13250
    return wuffs_png__decoder__tell_me_more(this, a_dst, a_minfo, a_src);
13251
  }
13252
13253
  inline wuffs_base__range_ii_u64
13254
  workbuf_len() const {
13255
    return wuffs_png__decoder__workbuf_len(this);
13256
  }
13257
13258
#endif  // __cplusplus
13259
};  // struct wuffs_png__decoder__struct
13260
13261
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
13262
13263
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__PNG) || defined(WUFFS_NONMONOLITHIC)
13264
13265
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__QOI) || defined(WUFFS_NONMONOLITHIC)
13266
13267
// ---------------- Status Codes
13268
13269
extern const char wuffs_qoi__error__bad_footer[];
13270
extern const char wuffs_qoi__error__bad_header[];
13271
extern const char wuffs_qoi__error__truncated_input[];
13272
13273
// ---------------- Public Consts
13274
13275
#define WUFFS_QOI__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u
13276
13277
// ---------------- Struct Declarations
13278
13279
typedef struct wuffs_qoi__decoder__struct wuffs_qoi__decoder;
13280
13281
#ifdef __cplusplus
13282
extern "C" {
13283
#endif
13284
13285
// ---------------- Public Initializer Prototypes
13286
13287
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
13288
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
13289
//
13290
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
13291
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
13292
13293
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
13294
wuffs_qoi__decoder__initialize(
13295
    wuffs_qoi__decoder* self,
13296
    size_t sizeof_star_self,
13297
    uint64_t wuffs_version,
13298
    uint32_t options);
13299
13300
size_t
13301
sizeof__wuffs_qoi__decoder(void);
13302
13303
// ---------------- Allocs
13304
13305
// These functions allocate and initialize Wuffs structs. They return NULL if
13306
// memory allocation fails. If they return non-NULL, there is no need to call
13307
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
13308
// calling free on the returned pointer. That pointer is effectively a C++
13309
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
13310
13311
wuffs_qoi__decoder*
13312
wuffs_qoi__decoder__alloc(void);
13313
13314
static inline wuffs_base__image_decoder*
13315
wuffs_qoi__decoder__alloc_as__wuffs_base__image_decoder(void) {
13316
  return (wuffs_base__image_decoder*)(wuffs_qoi__decoder__alloc());
13317
}
13318
13319
// ---------------- Upcasts
13320
13321
static inline wuffs_base__image_decoder*
13322
wuffs_qoi__decoder__upcast_as__wuffs_base__image_decoder(
13323
    wuffs_qoi__decoder* p) {
13324
  return (wuffs_base__image_decoder*)p;
13325
}
13326
13327
// ---------------- Public Function Prototypes
13328
13329
WUFFS_BASE__GENERATED_C_CODE
13330
WUFFS_BASE__MAYBE_STATIC uint64_t
13331
wuffs_qoi__decoder__get_quirk(
13332
    const wuffs_qoi__decoder* self,
13333
    uint32_t a_key);
13334
13335
WUFFS_BASE__GENERATED_C_CODE
13336
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
13337
wuffs_qoi__decoder__set_quirk(
13338
    wuffs_qoi__decoder* self,
13339
    uint32_t a_key,
13340
    uint64_t a_value);
13341
13342
WUFFS_BASE__GENERATED_C_CODE
13343
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
13344
wuffs_qoi__decoder__decode_image_config(
13345
    wuffs_qoi__decoder* self,
13346
    wuffs_base__image_config* a_dst,
13347
    wuffs_base__io_buffer* a_src);
13348
13349
WUFFS_BASE__GENERATED_C_CODE
13350
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
13351
wuffs_qoi__decoder__decode_frame_config(
13352
    wuffs_qoi__decoder* self,
13353
    wuffs_base__frame_config* a_dst,
13354
    wuffs_base__io_buffer* a_src);
13355
13356
WUFFS_BASE__GENERATED_C_CODE
13357
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
13358
wuffs_qoi__decoder__decode_frame(
13359
    wuffs_qoi__decoder* self,
13360
    wuffs_base__pixel_buffer* a_dst,
13361
    wuffs_base__io_buffer* a_src,
13362
    wuffs_base__pixel_blend a_blend,
13363
    wuffs_base__slice_u8 a_workbuf,
13364
    wuffs_base__decode_frame_options* a_opts);
13365
13366
WUFFS_BASE__GENERATED_C_CODE
13367
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
13368
wuffs_qoi__decoder__frame_dirty_rect(
13369
    const wuffs_qoi__decoder* self);
13370
13371
WUFFS_BASE__GENERATED_C_CODE
13372
WUFFS_BASE__MAYBE_STATIC uint32_t
13373
wuffs_qoi__decoder__num_animation_loops(
13374
    const wuffs_qoi__decoder* self);
13375
13376
WUFFS_BASE__GENERATED_C_CODE
13377
WUFFS_BASE__MAYBE_STATIC uint64_t
13378
wuffs_qoi__decoder__num_decoded_frame_configs(
13379
    const wuffs_qoi__decoder* self);
13380
13381
WUFFS_BASE__GENERATED_C_CODE
13382
WUFFS_BASE__MAYBE_STATIC uint64_t
13383
wuffs_qoi__decoder__num_decoded_frames(
13384
    const wuffs_qoi__decoder* self);
13385
13386
WUFFS_BASE__GENERATED_C_CODE
13387
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
13388
wuffs_qoi__decoder__restart_frame(
13389
    wuffs_qoi__decoder* self,
13390
    uint64_t a_index,
13391
    uint64_t a_io_position);
13392
13393
WUFFS_BASE__GENERATED_C_CODE
13394
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
13395
wuffs_qoi__decoder__set_report_metadata(
13396
    wuffs_qoi__decoder* self,
13397
    uint32_t a_fourcc,
13398
    bool a_report);
13399
13400
WUFFS_BASE__GENERATED_C_CODE
13401
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
13402
wuffs_qoi__decoder__tell_me_more(
13403
    wuffs_qoi__decoder* self,
13404
    wuffs_base__io_buffer* a_dst,
13405
    wuffs_base__more_information* a_minfo,
13406
    wuffs_base__io_buffer* a_src);
13407
13408
WUFFS_BASE__GENERATED_C_CODE
13409
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
13410
wuffs_qoi__decoder__workbuf_len(
13411
    const wuffs_qoi__decoder* self);
13412
13413
#ifdef __cplusplus
13414
}  // extern "C"
13415
#endif
13416
13417
// ---------------- Struct Definitions
13418
13419
// These structs' fields, and the sizeof them, are private implementation
13420
// details that aren't guaranteed to be stable across Wuffs versions.
13421
//
13422
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
13423
13424
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
13425
13426
struct wuffs_qoi__decoder__struct {
13427
  // Do not access the private_impl's or private_data's fields directly. There
13428
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
13429
  // the wuffs_foo__bar__baz functions.
13430
  //
13431
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
13432
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
13433
13434
  struct {
13435
    uint32_t magic;
13436
    uint32_t active_coroutine;
13437
    wuffs_base__vtable vtable_for__wuffs_base__image_decoder;
13438
    wuffs_base__vtable null_vtable;
13439
13440
    uint32_t f_pixfmt;
13441
    uint32_t f_width;
13442
    uint32_t f_height;
13443
    uint64_t f_remaining_pixels_times_4;
13444
    uint8_t f_call_sequence;
13445
    uint32_t f_buffer_index;
13446
    uint32_t f_dst_x;
13447
    uint32_t f_dst_y;
13448
    wuffs_base__pixel_swizzler f_swizzler;
13449
13450
    uint32_t p_decode_image_config;
13451
    uint32_t p_do_decode_image_config;
13452
    uint32_t p_decode_frame_config;
13453
    uint32_t p_do_decode_frame_config;
13454
    uint32_t p_decode_frame;
13455
    uint32_t p_do_decode_frame;
13456
    uint32_t p_from_src_to_buffer;
13457
  } private_impl;
13458
13459
  struct {
13460
    uint8_t f_pixel[4];
13461
    uint8_t f_cache[256];
13462
    uint8_t f_buffer[8196];
13463
13464
    struct {
13465
      uint64_t scratch;
13466
    } s_do_decode_image_config;
13467
    struct {
13468
      uint64_t scratch;
13469
    } s_do_decode_frame;
13470
    struct {
13471
      uint8_t v_dg;
13472
      uint32_t v_bi;
13473
      uint32_t v_bk;
13474
    } s_from_src_to_buffer;
13475
  } private_data;
13476
13477
#ifdef __cplusplus
13478
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
13479
  using unique_ptr = std::unique_ptr<wuffs_qoi__decoder, wuffs_unique_ptr_deleter>;
13480
13481
  // On failure, the alloc_etc functions return nullptr. They don't throw.
13482
13483
  static inline unique_ptr
13484
  alloc() {
13485
    return unique_ptr(wuffs_qoi__decoder__alloc());
13486
  }
13487
13488
  static inline wuffs_base__image_decoder::unique_ptr
13489
  alloc_as__wuffs_base__image_decoder() {
13490
    return wuffs_base__image_decoder::unique_ptr(
13491
        wuffs_qoi__decoder__alloc_as__wuffs_base__image_decoder());
13492
  }
13493
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
13494
13495
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
13496
  // Disallow constructing or copying an object via standard C++ mechanisms,
13497
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
13498
  // size and field layout is not part of the public, stable, memory-safe API.
13499
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
13500
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
13501
  // their first argument) rather than tweaking bar.private_impl.qux fields.
13502
  //
13503
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
13504
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
13505
  // order to provide convenience methods. These forward on "this", so that you
13506
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
13507
  wuffs_qoi__decoder__struct() = delete;
13508
  wuffs_qoi__decoder__struct(const wuffs_qoi__decoder__struct&) = delete;
13509
  wuffs_qoi__decoder__struct& operator=(
13510
      const wuffs_qoi__decoder__struct&) = delete;
13511
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
13512
13513
#if !defined(WUFFS_IMPLEMENTATION)
13514
  // As above, the size of the struct is not part of the public API, and unless
13515
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
13516
  // allocated, not stack allocated. Its size is not intended to be known at
13517
  // compile time, but it is unfortunately divulged as a side effect of
13518
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
13519
  // instead of "sizeof T", invoking the operator. To make the two values
13520
  // different, so that passing the latter will be rejected by the initialize
13521
  // function, we add an arbitrary amount of dead weight.
13522
  uint8_t dead_weight[123000000];  // 123 MB.
13523
#endif  // !defined(WUFFS_IMPLEMENTATION)
13524
13525
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
13526
  initialize(
13527
      size_t sizeof_star_self,
13528
      uint64_t wuffs_version,
13529
      uint32_t options) {
13530
    return wuffs_qoi__decoder__initialize(
13531
        this, sizeof_star_self, wuffs_version, options);
13532
  }
13533
13534
  inline wuffs_base__image_decoder*
13535
  upcast_as__wuffs_base__image_decoder() {
13536
    return (wuffs_base__image_decoder*)this;
13537
  }
13538
13539
  inline uint64_t
13540
  get_quirk(
13541
      uint32_t a_key) const {
13542
    return wuffs_qoi__decoder__get_quirk(this, a_key);
13543
  }
13544
13545
  inline wuffs_base__status
13546
  set_quirk(
13547
      uint32_t a_key,
13548
      uint64_t a_value) {
13549
    return wuffs_qoi__decoder__set_quirk(this, a_key, a_value);
13550
  }
13551
13552
  inline wuffs_base__status
13553
  decode_image_config(
13554
      wuffs_base__image_config* a_dst,
13555
      wuffs_base__io_buffer* a_src) {
13556
    return wuffs_qoi__decoder__decode_image_config(this, a_dst, a_src);
13557
  }
13558
13559
  inline wuffs_base__status
13560
  decode_frame_config(
13561
      wuffs_base__frame_config* a_dst,
13562
      wuffs_base__io_buffer* a_src) {
13563
    return wuffs_qoi__decoder__decode_frame_config(this, a_dst, a_src);
13564
  }
13565
13566
  inline wuffs_base__status
13567
  decode_frame(
13568
      wuffs_base__pixel_buffer* a_dst,
13569
      wuffs_base__io_buffer* a_src,
13570
      wuffs_base__pixel_blend a_blend,
13571
      wuffs_base__slice_u8 a_workbuf,
13572
      wuffs_base__decode_frame_options* a_opts) {
13573
    return wuffs_qoi__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts);
13574
  }
13575
13576
  inline wuffs_base__rect_ie_u32
13577
  frame_dirty_rect() const {
13578
    return wuffs_qoi__decoder__frame_dirty_rect(this);
13579
  }
13580
13581
  inline uint32_t
13582
  num_animation_loops() const {
13583
    return wuffs_qoi__decoder__num_animation_loops(this);
13584
  }
13585
13586
  inline uint64_t
13587
  num_decoded_frame_configs() const {
13588
    return wuffs_qoi__decoder__num_decoded_frame_configs(this);
13589
  }
13590
13591
  inline uint64_t
13592
  num_decoded_frames() const {
13593
    return wuffs_qoi__decoder__num_decoded_frames(this);
13594
  }
13595
13596
  inline wuffs_base__status
13597
  restart_frame(
13598
      uint64_t a_index,
13599
      uint64_t a_io_position) {
13600
    return wuffs_qoi__decoder__restart_frame(this, a_index, a_io_position);
13601
  }
13602
13603
  inline wuffs_base__empty_struct
13604
  set_report_metadata(
13605
      uint32_t a_fourcc,
13606
      bool a_report) {
13607
    return wuffs_qoi__decoder__set_report_metadata(this, a_fourcc, a_report);
13608
  }
13609
13610
  inline wuffs_base__status
13611
  tell_me_more(
13612
      wuffs_base__io_buffer* a_dst,
13613
      wuffs_base__more_information* a_minfo,
13614
      wuffs_base__io_buffer* a_src) {
13615
    return wuffs_qoi__decoder__tell_me_more(this, a_dst, a_minfo, a_src);
13616
  }
13617
13618
  inline wuffs_base__range_ii_u64
13619
  workbuf_len() const {
13620
    return wuffs_qoi__decoder__workbuf_len(this);
13621
  }
13622
13623
#endif  // __cplusplus
13624
};  // struct wuffs_qoi__decoder__struct
13625
13626
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
13627
13628
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__QOI) || defined(WUFFS_NONMONOLITHIC)
13629
13630
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__SHA256) || defined(WUFFS_NONMONOLITHIC)
13631
13632
// ---------------- Status Codes
13633
13634
// ---------------- Public Consts
13635
13636
// ---------------- Struct Declarations
13637
13638
typedef struct wuffs_sha256__hasher__struct wuffs_sha256__hasher;
13639
13640
#ifdef __cplusplus
13641
extern "C" {
13642
#endif
13643
13644
// ---------------- Public Initializer Prototypes
13645
13646
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
13647
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
13648
//
13649
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
13650
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
13651
13652
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
13653
wuffs_sha256__hasher__initialize(
13654
    wuffs_sha256__hasher* self,
13655
    size_t sizeof_star_self,
13656
    uint64_t wuffs_version,
13657
    uint32_t options);
13658
13659
size_t
13660
sizeof__wuffs_sha256__hasher(void);
13661
13662
// ---------------- Allocs
13663
13664
// These functions allocate and initialize Wuffs structs. They return NULL if
13665
// memory allocation fails. If they return non-NULL, there is no need to call
13666
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
13667
// calling free on the returned pointer. That pointer is effectively a C++
13668
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
13669
13670
wuffs_sha256__hasher*
13671
wuffs_sha256__hasher__alloc(void);
13672
13673
static inline wuffs_base__hasher_bitvec256*
13674
wuffs_sha256__hasher__alloc_as__wuffs_base__hasher_bitvec256(void) {
13675
  return (wuffs_base__hasher_bitvec256*)(wuffs_sha256__hasher__alloc());
13676
}
13677
13678
// ---------------- Upcasts
13679
13680
static inline wuffs_base__hasher_bitvec256*
13681
wuffs_sha256__hasher__upcast_as__wuffs_base__hasher_bitvec256(
13682
    wuffs_sha256__hasher* p) {
13683
  return (wuffs_base__hasher_bitvec256*)p;
13684
}
13685
13686
// ---------------- Public Function Prototypes
13687
13688
WUFFS_BASE__GENERATED_C_CODE
13689
WUFFS_BASE__MAYBE_STATIC uint64_t
13690
wuffs_sha256__hasher__get_quirk(
13691
    const wuffs_sha256__hasher* self,
13692
    uint32_t a_key);
13693
13694
WUFFS_BASE__GENERATED_C_CODE
13695
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
13696
wuffs_sha256__hasher__set_quirk(
13697
    wuffs_sha256__hasher* self,
13698
    uint32_t a_key,
13699
    uint64_t a_value);
13700
13701
WUFFS_BASE__GENERATED_C_CODE
13702
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
13703
wuffs_sha256__hasher__update(
13704
    wuffs_sha256__hasher* self,
13705
    wuffs_base__slice_u8 a_x);
13706
13707
WUFFS_BASE__GENERATED_C_CODE
13708
WUFFS_BASE__MAYBE_STATIC wuffs_base__bitvec256
13709
wuffs_sha256__hasher__update_bitvec256(
13710
    wuffs_sha256__hasher* self,
13711
    wuffs_base__slice_u8 a_x);
13712
13713
WUFFS_BASE__GENERATED_C_CODE
13714
WUFFS_BASE__MAYBE_STATIC wuffs_base__bitvec256
13715
wuffs_sha256__hasher__checksum_bitvec256(
13716
    const wuffs_sha256__hasher* self);
13717
13718
#ifdef __cplusplus
13719
}  // extern "C"
13720
#endif
13721
13722
// ---------------- Struct Definitions
13723
13724
// These structs' fields, and the sizeof them, are private implementation
13725
// details that aren't guaranteed to be stable across Wuffs versions.
13726
//
13727
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
13728
13729
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
13730
13731
struct wuffs_sha256__hasher__struct {
13732
  // Do not access the private_impl's or private_data's fields directly. There
13733
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
13734
  // the wuffs_foo__bar__baz functions.
13735
  //
13736
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
13737
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
13738
13739
  struct {
13740
    uint32_t magic;
13741
    uint32_t active_coroutine;
13742
    wuffs_base__vtable vtable_for__wuffs_base__hasher_bitvec256;
13743
    wuffs_base__vtable null_vtable;
13744
13745
    uint64_t f_length_modulo_u64;
13746
    bool f_length_overflows_u64;
13747
    uint8_t f_padding0;
13748
    uint8_t f_padding1;
13749
    uint8_t f_padding2;
13750
    uint32_t f_buf_len;
13751
    uint8_t f_buf_data[64];
13752
    uint32_t f_h0;
13753
    uint32_t f_h1;
13754
    uint32_t f_h2;
13755
    uint32_t f_h3;
13756
    uint32_t f_h4;
13757
    uint32_t f_h5;
13758
    uint32_t f_h6;
13759
    uint32_t f_h7;
13760
  } private_impl;
13761
13762
#ifdef __cplusplus
13763
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
13764
  using unique_ptr = std::unique_ptr<wuffs_sha256__hasher, wuffs_unique_ptr_deleter>;
13765
13766
  // On failure, the alloc_etc functions return nullptr. They don't throw.
13767
13768
  static inline unique_ptr
13769
  alloc() {
13770
    return unique_ptr(wuffs_sha256__hasher__alloc());
13771
  }
13772
13773
  static inline wuffs_base__hasher_bitvec256::unique_ptr
13774
  alloc_as__wuffs_base__hasher_bitvec256() {
13775
    return wuffs_base__hasher_bitvec256::unique_ptr(
13776
        wuffs_sha256__hasher__alloc_as__wuffs_base__hasher_bitvec256());
13777
  }
13778
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
13779
13780
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
13781
  // Disallow constructing or copying an object via standard C++ mechanisms,
13782
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
13783
  // size and field layout is not part of the public, stable, memory-safe API.
13784
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
13785
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
13786
  // their first argument) rather than tweaking bar.private_impl.qux fields.
13787
  //
13788
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
13789
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
13790
  // order to provide convenience methods. These forward on "this", so that you
13791
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
13792
  wuffs_sha256__hasher__struct() = delete;
13793
  wuffs_sha256__hasher__struct(const wuffs_sha256__hasher__struct&) = delete;
13794
  wuffs_sha256__hasher__struct& operator=(
13795
      const wuffs_sha256__hasher__struct&) = delete;
13796
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
13797
13798
#if !defined(WUFFS_IMPLEMENTATION)
13799
  // As above, the size of the struct is not part of the public API, and unless
13800
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
13801
  // allocated, not stack allocated. Its size is not intended to be known at
13802
  // compile time, but it is unfortunately divulged as a side effect of
13803
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
13804
  // instead of "sizeof T", invoking the operator. To make the two values
13805
  // different, so that passing the latter will be rejected by the initialize
13806
  // function, we add an arbitrary amount of dead weight.
13807
  uint8_t dead_weight[123000000];  // 123 MB.
13808
#endif  // !defined(WUFFS_IMPLEMENTATION)
13809
13810
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
13811
  initialize(
13812
      size_t sizeof_star_self,
13813
      uint64_t wuffs_version,
13814
      uint32_t options) {
13815
    return wuffs_sha256__hasher__initialize(
13816
        this, sizeof_star_self, wuffs_version, options);
13817
  }
13818
13819
  inline wuffs_base__hasher_bitvec256*
13820
  upcast_as__wuffs_base__hasher_bitvec256() {
13821
    return (wuffs_base__hasher_bitvec256*)this;
13822
  }
13823
13824
  inline uint64_t
13825
  get_quirk(
13826
      uint32_t a_key) const {
13827
    return wuffs_sha256__hasher__get_quirk(this, a_key);
13828
  }
13829
13830
  inline wuffs_base__status
13831
  set_quirk(
13832
      uint32_t a_key,
13833
      uint64_t a_value) {
13834
    return wuffs_sha256__hasher__set_quirk(this, a_key, a_value);
13835
  }
13836
13837
  inline wuffs_base__empty_struct
13838
  update(
13839
      wuffs_base__slice_u8 a_x) {
13840
    return wuffs_sha256__hasher__update(this, a_x);
13841
  }
13842
13843
  inline wuffs_base__bitvec256
13844
  update_bitvec256(
13845
      wuffs_base__slice_u8 a_x) {
13846
    return wuffs_sha256__hasher__update_bitvec256(this, a_x);
13847
  }
13848
13849
  inline wuffs_base__bitvec256
13850
  checksum_bitvec256() const {
13851
    return wuffs_sha256__hasher__checksum_bitvec256(this);
13852
  }
13853
13854
#endif  // __cplusplus
13855
};  // struct wuffs_sha256__hasher__struct
13856
13857
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
13858
13859
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__SHA256) || defined(WUFFS_NONMONOLITHIC)
13860
13861
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__TARGA) || defined(WUFFS_NONMONOLITHIC)
13862
13863
// ---------------- Status Codes
13864
13865
extern const char wuffs_targa__error__bad_header[];
13866
extern const char wuffs_targa__error__bad_run_length_encoding[];
13867
extern const char wuffs_targa__error__truncated_input[];
13868
extern const char wuffs_targa__error__unsupported_targa_file[];
13869
13870
// ---------------- Public Consts
13871
13872
#define WUFFS_TARGA__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u
13873
13874
// ---------------- Struct Declarations
13875
13876
typedef struct wuffs_targa__decoder__struct wuffs_targa__decoder;
13877
13878
#ifdef __cplusplus
13879
extern "C" {
13880
#endif
13881
13882
// ---------------- Public Initializer Prototypes
13883
13884
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
13885
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
13886
//
13887
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
13888
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
13889
13890
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
13891
wuffs_targa__decoder__initialize(
13892
    wuffs_targa__decoder* self,
13893
    size_t sizeof_star_self,
13894
    uint64_t wuffs_version,
13895
    uint32_t options);
13896
13897
size_t
13898
sizeof__wuffs_targa__decoder(void);
13899
13900
// ---------------- Allocs
13901
13902
// These functions allocate and initialize Wuffs structs. They return NULL if
13903
// memory allocation fails. If they return non-NULL, there is no need to call
13904
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
13905
// calling free on the returned pointer. That pointer is effectively a C++
13906
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
13907
13908
wuffs_targa__decoder*
13909
wuffs_targa__decoder__alloc(void);
13910
13911
static inline wuffs_base__image_decoder*
13912
wuffs_targa__decoder__alloc_as__wuffs_base__image_decoder(void) {
13913
  return (wuffs_base__image_decoder*)(wuffs_targa__decoder__alloc());
13914
}
13915
13916
// ---------------- Upcasts
13917
13918
static inline wuffs_base__image_decoder*
13919
wuffs_targa__decoder__upcast_as__wuffs_base__image_decoder(
13920
    wuffs_targa__decoder* p) {
13921
  return (wuffs_base__image_decoder*)p;
13922
}
13923
13924
// ---------------- Public Function Prototypes
13925
13926
WUFFS_BASE__GENERATED_C_CODE
13927
WUFFS_BASE__MAYBE_STATIC uint64_t
13928
wuffs_targa__decoder__get_quirk(
13929
    const wuffs_targa__decoder* self,
13930
    uint32_t a_key);
13931
13932
WUFFS_BASE__GENERATED_C_CODE
13933
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
13934
wuffs_targa__decoder__set_quirk(
13935
    wuffs_targa__decoder* self,
13936
    uint32_t a_key,
13937
    uint64_t a_value);
13938
13939
WUFFS_BASE__GENERATED_C_CODE
13940
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
13941
wuffs_targa__decoder__decode_image_config(
13942
    wuffs_targa__decoder* self,
13943
    wuffs_base__image_config* a_dst,
13944
    wuffs_base__io_buffer* a_src);
13945
13946
WUFFS_BASE__GENERATED_C_CODE
13947
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
13948
wuffs_targa__decoder__decode_frame_config(
13949
    wuffs_targa__decoder* self,
13950
    wuffs_base__frame_config* a_dst,
13951
    wuffs_base__io_buffer* a_src);
13952
13953
WUFFS_BASE__GENERATED_C_CODE
13954
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
13955
wuffs_targa__decoder__decode_frame(
13956
    wuffs_targa__decoder* self,
13957
    wuffs_base__pixel_buffer* a_dst,
13958
    wuffs_base__io_buffer* a_src,
13959
    wuffs_base__pixel_blend a_blend,
13960
    wuffs_base__slice_u8 a_workbuf,
13961
    wuffs_base__decode_frame_options* a_opts);
13962
13963
WUFFS_BASE__GENERATED_C_CODE
13964
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
13965
wuffs_targa__decoder__frame_dirty_rect(
13966
    const wuffs_targa__decoder* self);
13967
13968
WUFFS_BASE__GENERATED_C_CODE
13969
WUFFS_BASE__MAYBE_STATIC uint32_t
13970
wuffs_targa__decoder__num_animation_loops(
13971
    const wuffs_targa__decoder* self);
13972
13973
WUFFS_BASE__GENERATED_C_CODE
13974
WUFFS_BASE__MAYBE_STATIC uint64_t
13975
wuffs_targa__decoder__num_decoded_frame_configs(
13976
    const wuffs_targa__decoder* self);
13977
13978
WUFFS_BASE__GENERATED_C_CODE
13979
WUFFS_BASE__MAYBE_STATIC uint64_t
13980
wuffs_targa__decoder__num_decoded_frames(
13981
    const wuffs_targa__decoder* self);
13982
13983
WUFFS_BASE__GENERATED_C_CODE
13984
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
13985
wuffs_targa__decoder__restart_frame(
13986
    wuffs_targa__decoder* self,
13987
    uint64_t a_index,
13988
    uint64_t a_io_position);
13989
13990
WUFFS_BASE__GENERATED_C_CODE
13991
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
13992
wuffs_targa__decoder__set_report_metadata(
13993
    wuffs_targa__decoder* self,
13994
    uint32_t a_fourcc,
13995
    bool a_report);
13996
13997
WUFFS_BASE__GENERATED_C_CODE
13998
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
13999
wuffs_targa__decoder__tell_me_more(
14000
    wuffs_targa__decoder* self,
14001
    wuffs_base__io_buffer* a_dst,
14002
    wuffs_base__more_information* a_minfo,
14003
    wuffs_base__io_buffer* a_src);
14004
14005
WUFFS_BASE__GENERATED_C_CODE
14006
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
14007
wuffs_targa__decoder__workbuf_len(
14008
    const wuffs_targa__decoder* self);
14009
14010
#ifdef __cplusplus
14011
}  // extern "C"
14012
#endif
14013
14014
// ---------------- Struct Definitions
14015
14016
// These structs' fields, and the sizeof them, are private implementation
14017
// details that aren't guaranteed to be stable across Wuffs versions.
14018
//
14019
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
14020
14021
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
14022
14023
struct wuffs_targa__decoder__struct {
14024
  // Do not access the private_impl's or private_data's fields directly. There
14025
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
14026
  // the wuffs_foo__bar__baz functions.
14027
  //
14028
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
14029
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
14030
14031
  struct {
14032
    uint32_t magic;
14033
    uint32_t active_coroutine;
14034
    wuffs_base__vtable vtable_for__wuffs_base__image_decoder;
14035
    wuffs_base__vtable null_vtable;
14036
14037
    uint32_t f_width;
14038
    uint32_t f_height;
14039
    uint8_t f_call_sequence;
14040
    uint8_t f_header_id_length;
14041
    uint8_t f_header_color_map_type;
14042
    uint8_t f_header_image_type;
14043
    uint16_t f_header_color_map_first_entry_index;
14044
    uint16_t f_header_color_map_length;
14045
    uint8_t f_header_color_map_entry_size;
14046
    uint8_t f_header_pixel_depth;
14047
    uint8_t f_header_image_descriptor;
14048
    bool f_opaque;
14049
    uint32_t f_scratch_bytes_per_pixel;
14050
    uint32_t f_src_bytes_per_pixel;
14051
    uint32_t f_src_pixfmt;
14052
    uint64_t f_frame_config_io_position;
14053
    wuffs_base__pixel_swizzler f_swizzler;
14054
14055
    uint32_t p_decode_image_config;
14056
    uint32_t p_do_decode_image_config;
14057
    uint32_t p_decode_frame_config;
14058
    uint32_t p_do_decode_frame_config;
14059
    uint32_t p_decode_frame;
14060
    uint32_t p_do_decode_frame;
14061
  } private_impl;
14062
14063
  struct {
14064
    uint8_t f_dst_palette[1024];
14065
    uint8_t f_src_palette[1024];
14066
    uint8_t f_scratch[4];
14067
14068
    struct {
14069
      uint32_t v_i;
14070
      uint64_t scratch;
14071
    } s_do_decode_image_config;
14072
    struct {
14073
      uint64_t v_dst_bytes_per_pixel;
14074
      uint32_t v_dst_x;
14075
      uint32_t v_dst_y;
14076
      uint64_t v_mark;
14077
      uint32_t v_num_pixels32;
14078
      uint32_t v_lit_length;
14079
      uint32_t v_run_length;
14080
      uint64_t v_num_dst_bytes;
14081
      uint64_t scratch;
14082
    } s_do_decode_frame;
14083
  } private_data;
14084
14085
#ifdef __cplusplus
14086
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
14087
  using unique_ptr = std::unique_ptr<wuffs_targa__decoder, wuffs_unique_ptr_deleter>;
14088
14089
  // On failure, the alloc_etc functions return nullptr. They don't throw.
14090
14091
  static inline unique_ptr
14092
  alloc() {
14093
    return unique_ptr(wuffs_targa__decoder__alloc());
14094
  }
14095
14096
  static inline wuffs_base__image_decoder::unique_ptr
14097
  alloc_as__wuffs_base__image_decoder() {
14098
    return wuffs_base__image_decoder::unique_ptr(
14099
        wuffs_targa__decoder__alloc_as__wuffs_base__image_decoder());
14100
  }
14101
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
14102
14103
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
14104
  // Disallow constructing or copying an object via standard C++ mechanisms,
14105
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
14106
  // size and field layout is not part of the public, stable, memory-safe API.
14107
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
14108
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
14109
  // their first argument) rather than tweaking bar.private_impl.qux fields.
14110
  //
14111
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
14112
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
14113
  // order to provide convenience methods. These forward on "this", so that you
14114
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
14115
  wuffs_targa__decoder__struct() = delete;
14116
  wuffs_targa__decoder__struct(const wuffs_targa__decoder__struct&) = delete;
14117
  wuffs_targa__decoder__struct& operator=(
14118
      const wuffs_targa__decoder__struct&) = delete;
14119
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
14120
14121
#if !defined(WUFFS_IMPLEMENTATION)
14122
  // As above, the size of the struct is not part of the public API, and unless
14123
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
14124
  // allocated, not stack allocated. Its size is not intended to be known at
14125
  // compile time, but it is unfortunately divulged as a side effect of
14126
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
14127
  // instead of "sizeof T", invoking the operator. To make the two values
14128
  // different, so that passing the latter will be rejected by the initialize
14129
  // function, we add an arbitrary amount of dead weight.
14130
  uint8_t dead_weight[123000000];  // 123 MB.
14131
#endif  // !defined(WUFFS_IMPLEMENTATION)
14132
14133
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
14134
  initialize(
14135
      size_t sizeof_star_self,
14136
      uint64_t wuffs_version,
14137
      uint32_t options) {
14138
    return wuffs_targa__decoder__initialize(
14139
        this, sizeof_star_self, wuffs_version, options);
14140
  }
14141
14142
  inline wuffs_base__image_decoder*
14143
  upcast_as__wuffs_base__image_decoder() {
14144
    return (wuffs_base__image_decoder*)this;
14145
  }
14146
14147
  inline uint64_t
14148
  get_quirk(
14149
      uint32_t a_key) const {
14150
    return wuffs_targa__decoder__get_quirk(this, a_key);
14151
  }
14152
14153
  inline wuffs_base__status
14154
  set_quirk(
14155
      uint32_t a_key,
14156
      uint64_t a_value) {
14157
    return wuffs_targa__decoder__set_quirk(this, a_key, a_value);
14158
  }
14159
14160
  inline wuffs_base__status
14161
  decode_image_config(
14162
      wuffs_base__image_config* a_dst,
14163
      wuffs_base__io_buffer* a_src) {
14164
    return wuffs_targa__decoder__decode_image_config(this, a_dst, a_src);
14165
  }
14166
14167
  inline wuffs_base__status
14168
  decode_frame_config(
14169
      wuffs_base__frame_config* a_dst,
14170
      wuffs_base__io_buffer* a_src) {
14171
    return wuffs_targa__decoder__decode_frame_config(this, a_dst, a_src);
14172
  }
14173
14174
  inline wuffs_base__status
14175
  decode_frame(
14176
      wuffs_base__pixel_buffer* a_dst,
14177
      wuffs_base__io_buffer* a_src,
14178
      wuffs_base__pixel_blend a_blend,
14179
      wuffs_base__slice_u8 a_workbuf,
14180
      wuffs_base__decode_frame_options* a_opts) {
14181
    return wuffs_targa__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts);
14182
  }
14183
14184
  inline wuffs_base__rect_ie_u32
14185
  frame_dirty_rect() const {
14186
    return wuffs_targa__decoder__frame_dirty_rect(this);
14187
  }
14188
14189
  inline uint32_t
14190
  num_animation_loops() const {
14191
    return wuffs_targa__decoder__num_animation_loops(this);
14192
  }
14193
14194
  inline uint64_t
14195
  num_decoded_frame_configs() const {
14196
    return wuffs_targa__decoder__num_decoded_frame_configs(this);
14197
  }
14198
14199
  inline uint64_t
14200
  num_decoded_frames() const {
14201
    return wuffs_targa__decoder__num_decoded_frames(this);
14202
  }
14203
14204
  inline wuffs_base__status
14205
  restart_frame(
14206
      uint64_t a_index,
14207
      uint64_t a_io_position) {
14208
    return wuffs_targa__decoder__restart_frame(this, a_index, a_io_position);
14209
  }
14210
14211
  inline wuffs_base__empty_struct
14212
  set_report_metadata(
14213
      uint32_t a_fourcc,
14214
      bool a_report) {
14215
    return wuffs_targa__decoder__set_report_metadata(this, a_fourcc, a_report);
14216
  }
14217
14218
  inline wuffs_base__status
14219
  tell_me_more(
14220
      wuffs_base__io_buffer* a_dst,
14221
      wuffs_base__more_information* a_minfo,
14222
      wuffs_base__io_buffer* a_src) {
14223
    return wuffs_targa__decoder__tell_me_more(this, a_dst, a_minfo, a_src);
14224
  }
14225
14226
  inline wuffs_base__range_ii_u64
14227
  workbuf_len() const {
14228
    return wuffs_targa__decoder__workbuf_len(this);
14229
  }
14230
14231
#endif  // __cplusplus
14232
};  // struct wuffs_targa__decoder__struct
14233
14234
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
14235
14236
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__TARGA) || defined(WUFFS_NONMONOLITHIC)
14237
14238
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__THUMBHASH) || defined(WUFFS_NONMONOLITHIC)
14239
14240
// ---------------- Status Codes
14241
14242
extern const char wuffs_thumbhash__error__bad_header[];
14243
extern const char wuffs_thumbhash__error__truncated_input[];
14244
14245
// ---------------- Public Consts
14246
14247
#define WUFFS_THUMBHASH__QUIRK_JUST_RAW_THUMBHASH 1712283648u
14248
14249
#define WUFFS_THUMBHASH__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u
14250
14251
// ---------------- Struct Declarations
14252
14253
typedef struct wuffs_thumbhash__decoder__struct wuffs_thumbhash__decoder;
14254
14255
#ifdef __cplusplus
14256
extern "C" {
14257
#endif
14258
14259
// ---------------- Public Initializer Prototypes
14260
14261
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
14262
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
14263
//
14264
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
14265
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
14266
14267
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
14268
wuffs_thumbhash__decoder__initialize(
14269
    wuffs_thumbhash__decoder* self,
14270
    size_t sizeof_star_self,
14271
    uint64_t wuffs_version,
14272
    uint32_t options);
14273
14274
size_t
14275
sizeof__wuffs_thumbhash__decoder(void);
14276
14277
// ---------------- Allocs
14278
14279
// These functions allocate and initialize Wuffs structs. They return NULL if
14280
// memory allocation fails. If they return non-NULL, there is no need to call
14281
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
14282
// calling free on the returned pointer. That pointer is effectively a C++
14283
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
14284
14285
wuffs_thumbhash__decoder*
14286
wuffs_thumbhash__decoder__alloc(void);
14287
14288
static inline wuffs_base__image_decoder*
14289
wuffs_thumbhash__decoder__alloc_as__wuffs_base__image_decoder(void) {
14290
  return (wuffs_base__image_decoder*)(wuffs_thumbhash__decoder__alloc());
14291
}
14292
14293
// ---------------- Upcasts
14294
14295
static inline wuffs_base__image_decoder*
14296
wuffs_thumbhash__decoder__upcast_as__wuffs_base__image_decoder(
14297
    wuffs_thumbhash__decoder* p) {
14298
  return (wuffs_base__image_decoder*)p;
14299
}
14300
14301
// ---------------- Public Function Prototypes
14302
14303
WUFFS_BASE__GENERATED_C_CODE
14304
WUFFS_BASE__MAYBE_STATIC uint64_t
14305
wuffs_thumbhash__decoder__get_quirk(
14306
    const wuffs_thumbhash__decoder* self,
14307
    uint32_t a_key);
14308
14309
WUFFS_BASE__GENERATED_C_CODE
14310
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
14311
wuffs_thumbhash__decoder__set_quirk(
14312
    wuffs_thumbhash__decoder* self,
14313
    uint32_t a_key,
14314
    uint64_t a_value);
14315
14316
WUFFS_BASE__GENERATED_C_CODE
14317
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
14318
wuffs_thumbhash__decoder__decode_image_config(
14319
    wuffs_thumbhash__decoder* self,
14320
    wuffs_base__image_config* a_dst,
14321
    wuffs_base__io_buffer* a_src);
14322
14323
WUFFS_BASE__GENERATED_C_CODE
14324
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
14325
wuffs_thumbhash__decoder__decode_frame_config(
14326
    wuffs_thumbhash__decoder* self,
14327
    wuffs_base__frame_config* a_dst,
14328
    wuffs_base__io_buffer* a_src);
14329
14330
WUFFS_BASE__GENERATED_C_CODE
14331
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
14332
wuffs_thumbhash__decoder__decode_frame(
14333
    wuffs_thumbhash__decoder* self,
14334
    wuffs_base__pixel_buffer* a_dst,
14335
    wuffs_base__io_buffer* a_src,
14336
    wuffs_base__pixel_blend a_blend,
14337
    wuffs_base__slice_u8 a_workbuf,
14338
    wuffs_base__decode_frame_options* a_opts);
14339
14340
WUFFS_BASE__GENERATED_C_CODE
14341
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
14342
wuffs_thumbhash__decoder__frame_dirty_rect(
14343
    const wuffs_thumbhash__decoder* self);
14344
14345
WUFFS_BASE__GENERATED_C_CODE
14346
WUFFS_BASE__MAYBE_STATIC uint32_t
14347
wuffs_thumbhash__decoder__num_animation_loops(
14348
    const wuffs_thumbhash__decoder* self);
14349
14350
WUFFS_BASE__GENERATED_C_CODE
14351
WUFFS_BASE__MAYBE_STATIC uint64_t
14352
wuffs_thumbhash__decoder__num_decoded_frame_configs(
14353
    const wuffs_thumbhash__decoder* self);
14354
14355
WUFFS_BASE__GENERATED_C_CODE
14356
WUFFS_BASE__MAYBE_STATIC uint64_t
14357
wuffs_thumbhash__decoder__num_decoded_frames(
14358
    const wuffs_thumbhash__decoder* self);
14359
14360
WUFFS_BASE__GENERATED_C_CODE
14361
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
14362
wuffs_thumbhash__decoder__restart_frame(
14363
    wuffs_thumbhash__decoder* self,
14364
    uint64_t a_index,
14365
    uint64_t a_io_position);
14366
14367
WUFFS_BASE__GENERATED_C_CODE
14368
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
14369
wuffs_thumbhash__decoder__set_report_metadata(
14370
    wuffs_thumbhash__decoder* self,
14371
    uint32_t a_fourcc,
14372
    bool a_report);
14373
14374
WUFFS_BASE__GENERATED_C_CODE
14375
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
14376
wuffs_thumbhash__decoder__tell_me_more(
14377
    wuffs_thumbhash__decoder* self,
14378
    wuffs_base__io_buffer* a_dst,
14379
    wuffs_base__more_information* a_minfo,
14380
    wuffs_base__io_buffer* a_src);
14381
14382
WUFFS_BASE__GENERATED_C_CODE
14383
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
14384
wuffs_thumbhash__decoder__workbuf_len(
14385
    const wuffs_thumbhash__decoder* self);
14386
14387
#ifdef __cplusplus
14388
}  // extern "C"
14389
#endif
14390
14391
// ---------------- Struct Definitions
14392
14393
// These structs' fields, and the sizeof them, are private implementation
14394
// details that aren't guaranteed to be stable across Wuffs versions.
14395
//
14396
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
14397
14398
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
14399
14400
struct wuffs_thumbhash__decoder__struct {
14401
  // Do not access the private_impl's or private_data's fields directly. There
14402
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
14403
  // the wuffs_foo__bar__baz functions.
14404
  //
14405
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
14406
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
14407
14408
  struct {
14409
    uint32_t magic;
14410
    uint32_t active_coroutine;
14411
    wuffs_base__vtable vtable_for__wuffs_base__image_decoder;
14412
    wuffs_base__vtable null_vtable;
14413
14414
    uint32_t f_pixfmt;
14415
    uint8_t f_w_dimension_code;
14416
    uint8_t f_h_dimension_code;
14417
    uint8_t f_call_sequence;
14418
    uint8_t f_frame_config_io_position;
14419
    uint64_t f_l_dc;
14420
    uint64_t f_p_dc;
14421
    uint64_t f_q_dc;
14422
    uint64_t f_a_dc;
14423
    bool f_quirk_just_raw_thumbhash;
14424
    uint8_t f_l_scale;
14425
    uint8_t f_p_scale;
14426
    uint8_t f_q_scale;
14427
    uint8_t f_a_scale;
14428
    uint8_t f_has_alpha;
14429
    uint8_t f_l_count;
14430
    uint8_t f_is_landscape;
14431
    uint32_t f_lx;
14432
    uint32_t f_ly;
14433
    wuffs_base__pixel_swizzler f_swizzler;
14434
14435
    uint32_t p_decode_image_config;
14436
    uint32_t p_do_decode_image_config;
14437
    uint32_t p_decode_frame_config;
14438
    uint32_t p_do_decode_frame_config;
14439
    uint32_t p_decode_frame;
14440
    uint32_t p_do_decode_frame;
14441
    uint32_t p_from_src_to_coeffs;
14442
  } private_impl;
14443
14444
  struct {
14445
    uint32_t f_lac[32];
14446
    uint32_t f_pac[8];
14447
    uint32_t f_qac[8];
14448
    uint32_t f_aac[16];
14449
    uint8_t f_pixels[32][128];
14450
14451
    struct {
14452
      uint64_t scratch;
14453
    } s_do_decode_image_config;
14454
    struct {
14455
      uint32_t v_cy;
14456
      uint32_t v_cx;
14457
      uint32_t v_i;
14458
      bool v_has_bits;
14459
    } s_from_src_to_coeffs;
14460
  } private_data;
14461
14462
#ifdef __cplusplus
14463
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
14464
  using unique_ptr = std::unique_ptr<wuffs_thumbhash__decoder, wuffs_unique_ptr_deleter>;
14465
14466
  // On failure, the alloc_etc functions return nullptr. They don't throw.
14467
14468
  static inline unique_ptr
14469
  alloc() {
14470
    return unique_ptr(wuffs_thumbhash__decoder__alloc());
14471
  }
14472
14473
  static inline wuffs_base__image_decoder::unique_ptr
14474
  alloc_as__wuffs_base__image_decoder() {
14475
    return wuffs_base__image_decoder::unique_ptr(
14476
        wuffs_thumbhash__decoder__alloc_as__wuffs_base__image_decoder());
14477
  }
14478
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
14479
14480
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
14481
  // Disallow constructing or copying an object via standard C++ mechanisms,
14482
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
14483
  // size and field layout is not part of the public, stable, memory-safe API.
14484
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
14485
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
14486
  // their first argument) rather than tweaking bar.private_impl.qux fields.
14487
  //
14488
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
14489
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
14490
  // order to provide convenience methods. These forward on "this", so that you
14491
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
14492
  wuffs_thumbhash__decoder__struct() = delete;
14493
  wuffs_thumbhash__decoder__struct(const wuffs_thumbhash__decoder__struct&) = delete;
14494
  wuffs_thumbhash__decoder__struct& operator=(
14495
      const wuffs_thumbhash__decoder__struct&) = delete;
14496
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
14497
14498
#if !defined(WUFFS_IMPLEMENTATION)
14499
  // As above, the size of the struct is not part of the public API, and unless
14500
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
14501
  // allocated, not stack allocated. Its size is not intended to be known at
14502
  // compile time, but it is unfortunately divulged as a side effect of
14503
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
14504
  // instead of "sizeof T", invoking the operator. To make the two values
14505
  // different, so that passing the latter will be rejected by the initialize
14506
  // function, we add an arbitrary amount of dead weight.
14507
  uint8_t dead_weight[123000000];  // 123 MB.
14508
#endif  // !defined(WUFFS_IMPLEMENTATION)
14509
14510
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
14511
  initialize(
14512
      size_t sizeof_star_self,
14513
      uint64_t wuffs_version,
14514
      uint32_t options) {
14515
    return wuffs_thumbhash__decoder__initialize(
14516
        this, sizeof_star_self, wuffs_version, options);
14517
  }
14518
14519
  inline wuffs_base__image_decoder*
14520
  upcast_as__wuffs_base__image_decoder() {
14521
    return (wuffs_base__image_decoder*)this;
14522
  }
14523
14524
  inline uint64_t
14525
  get_quirk(
14526
      uint32_t a_key) const {
14527
    return wuffs_thumbhash__decoder__get_quirk(this, a_key);
14528
  }
14529
14530
  inline wuffs_base__status
14531
  set_quirk(
14532
      uint32_t a_key,
14533
      uint64_t a_value) {
14534
    return wuffs_thumbhash__decoder__set_quirk(this, a_key, a_value);
14535
  }
14536
14537
  inline wuffs_base__status
14538
  decode_image_config(
14539
      wuffs_base__image_config* a_dst,
14540
      wuffs_base__io_buffer* a_src) {
14541
    return wuffs_thumbhash__decoder__decode_image_config(this, a_dst, a_src);
14542
  }
14543
14544
  inline wuffs_base__status
14545
  decode_frame_config(
14546
      wuffs_base__frame_config* a_dst,
14547
      wuffs_base__io_buffer* a_src) {
14548
    return wuffs_thumbhash__decoder__decode_frame_config(this, a_dst, a_src);
14549
  }
14550
14551
  inline wuffs_base__status
14552
  decode_frame(
14553
      wuffs_base__pixel_buffer* a_dst,
14554
      wuffs_base__io_buffer* a_src,
14555
      wuffs_base__pixel_blend a_blend,
14556
      wuffs_base__slice_u8 a_workbuf,
14557
      wuffs_base__decode_frame_options* a_opts) {
14558
    return wuffs_thumbhash__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts);
14559
  }
14560
14561
  inline wuffs_base__rect_ie_u32
14562
  frame_dirty_rect() const {
14563
    return wuffs_thumbhash__decoder__frame_dirty_rect(this);
14564
  }
14565
14566
  inline uint32_t
14567
  num_animation_loops() const {
14568
    return wuffs_thumbhash__decoder__num_animation_loops(this);
14569
  }
14570
14571
  inline uint64_t
14572
  num_decoded_frame_configs() const {
14573
    return wuffs_thumbhash__decoder__num_decoded_frame_configs(this);
14574
  }
14575
14576
  inline uint64_t
14577
  num_decoded_frames() const {
14578
    return wuffs_thumbhash__decoder__num_decoded_frames(this);
14579
  }
14580
14581
  inline wuffs_base__status
14582
  restart_frame(
14583
      uint64_t a_index,
14584
      uint64_t a_io_position) {
14585
    return wuffs_thumbhash__decoder__restart_frame(this, a_index, a_io_position);
14586
  }
14587
14588
  inline wuffs_base__empty_struct
14589
  set_report_metadata(
14590
      uint32_t a_fourcc,
14591
      bool a_report) {
14592
    return wuffs_thumbhash__decoder__set_report_metadata(this, a_fourcc, a_report);
14593
  }
14594
14595
  inline wuffs_base__status
14596
  tell_me_more(
14597
      wuffs_base__io_buffer* a_dst,
14598
      wuffs_base__more_information* a_minfo,
14599
      wuffs_base__io_buffer* a_src) {
14600
    return wuffs_thumbhash__decoder__tell_me_more(this, a_dst, a_minfo, a_src);
14601
  }
14602
14603
  inline wuffs_base__range_ii_u64
14604
  workbuf_len() const {
14605
    return wuffs_thumbhash__decoder__workbuf_len(this);
14606
  }
14607
14608
#endif  // __cplusplus
14609
};  // struct wuffs_thumbhash__decoder__struct
14610
14611
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
14612
14613
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__THUMBHASH) || defined(WUFFS_NONMONOLITHIC)
14614
14615
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__VP8) || defined(WUFFS_NONMONOLITHIC)
14616
14617
// ---------------- Status Codes
14618
14619
extern const char wuffs_vp8__error__bad_header[];
14620
extern const char wuffs_vp8__error__truncated_input[];
14621
extern const char wuffs_vp8__error__unsupported_vp8_file[];
14622
14623
// ---------------- Public Consts
14624
14625
#define WUFFS_VP8__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u
14626
14627
// ---------------- Struct Declarations
14628
14629
typedef struct wuffs_vp8__decoder__struct wuffs_vp8__decoder;
14630
14631
#ifdef __cplusplus
14632
extern "C" {
14633
#endif
14634
14635
// ---------------- Public Initializer Prototypes
14636
14637
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
14638
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
14639
//
14640
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
14641
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
14642
14643
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
14644
wuffs_vp8__decoder__initialize(
14645
    wuffs_vp8__decoder* self,
14646
    size_t sizeof_star_self,
14647
    uint64_t wuffs_version,
14648
    uint32_t options);
14649
14650
size_t
14651
sizeof__wuffs_vp8__decoder(void);
14652
14653
// ---------------- Allocs
14654
14655
// These functions allocate and initialize Wuffs structs. They return NULL if
14656
// memory allocation fails. If they return non-NULL, there is no need to call
14657
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
14658
// calling free on the returned pointer. That pointer is effectively a C++
14659
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
14660
14661
wuffs_vp8__decoder*
14662
wuffs_vp8__decoder__alloc(void);
14663
14664
static inline wuffs_base__image_decoder*
14665
wuffs_vp8__decoder__alloc_as__wuffs_base__image_decoder(void) {
14666
  return (wuffs_base__image_decoder*)(wuffs_vp8__decoder__alloc());
14667
}
14668
14669
// ---------------- Upcasts
14670
14671
static inline wuffs_base__image_decoder*
14672
wuffs_vp8__decoder__upcast_as__wuffs_base__image_decoder(
14673
    wuffs_vp8__decoder* p) {
14674
  return (wuffs_base__image_decoder*)p;
14675
}
14676
14677
// ---------------- Public Function Prototypes
14678
14679
WUFFS_BASE__GENERATED_C_CODE
14680
WUFFS_BASE__MAYBE_STATIC uint64_t
14681
wuffs_vp8__decoder__get_quirk(
14682
    const wuffs_vp8__decoder* self,
14683
    uint32_t a_key);
14684
14685
WUFFS_BASE__GENERATED_C_CODE
14686
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
14687
wuffs_vp8__decoder__set_quirk(
14688
    wuffs_vp8__decoder* self,
14689
    uint32_t a_key,
14690
    uint64_t a_value);
14691
14692
WUFFS_BASE__GENERATED_C_CODE
14693
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
14694
wuffs_vp8__decoder__decode_image_config(
14695
    wuffs_vp8__decoder* self,
14696
    wuffs_base__image_config* a_dst,
14697
    wuffs_base__io_buffer* a_src);
14698
14699
WUFFS_BASE__GENERATED_C_CODE
14700
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
14701
wuffs_vp8__decoder__decode_frame_config(
14702
    wuffs_vp8__decoder* self,
14703
    wuffs_base__frame_config* a_dst,
14704
    wuffs_base__io_buffer* a_src);
14705
14706
WUFFS_BASE__GENERATED_C_CODE
14707
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
14708
wuffs_vp8__decoder__decode_frame(
14709
    wuffs_vp8__decoder* self,
14710
    wuffs_base__pixel_buffer* a_dst,
14711
    wuffs_base__io_buffer* a_src,
14712
    wuffs_base__pixel_blend a_blend,
14713
    wuffs_base__slice_u8 a_workbuf,
14714
    wuffs_base__decode_frame_options* a_opts);
14715
14716
WUFFS_BASE__GENERATED_C_CODE
14717
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
14718
wuffs_vp8__decoder__frame_dirty_rect(
14719
    const wuffs_vp8__decoder* self);
14720
14721
WUFFS_BASE__GENERATED_C_CODE
14722
WUFFS_BASE__MAYBE_STATIC uint32_t
14723
wuffs_vp8__decoder__num_animation_loops(
14724
    const wuffs_vp8__decoder* self);
14725
14726
WUFFS_BASE__GENERATED_C_CODE
14727
WUFFS_BASE__MAYBE_STATIC uint64_t
14728
wuffs_vp8__decoder__num_decoded_frame_configs(
14729
    const wuffs_vp8__decoder* self);
14730
14731
WUFFS_BASE__GENERATED_C_CODE
14732
WUFFS_BASE__MAYBE_STATIC uint64_t
14733
wuffs_vp8__decoder__num_decoded_frames(
14734
    const wuffs_vp8__decoder* self);
14735
14736
WUFFS_BASE__GENERATED_C_CODE
14737
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
14738
wuffs_vp8__decoder__restart_frame(
14739
    wuffs_vp8__decoder* self,
14740
    uint64_t a_index,
14741
    uint64_t a_io_position);
14742
14743
WUFFS_BASE__GENERATED_C_CODE
14744
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
14745
wuffs_vp8__decoder__set_report_metadata(
14746
    wuffs_vp8__decoder* self,
14747
    uint32_t a_fourcc,
14748
    bool a_report);
14749
14750
WUFFS_BASE__GENERATED_C_CODE
14751
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
14752
wuffs_vp8__decoder__tell_me_more(
14753
    wuffs_vp8__decoder* self,
14754
    wuffs_base__io_buffer* a_dst,
14755
    wuffs_base__more_information* a_minfo,
14756
    wuffs_base__io_buffer* a_src);
14757
14758
WUFFS_BASE__GENERATED_C_CODE
14759
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
14760
wuffs_vp8__decoder__workbuf_len(
14761
    const wuffs_vp8__decoder* self);
14762
14763
#ifdef __cplusplus
14764
}  // extern "C"
14765
#endif
14766
14767
// ---------------- Struct Definitions
14768
14769
// These structs' fields, and the sizeof them, are private implementation
14770
// details that aren't guaranteed to be stable across Wuffs versions.
14771
//
14772
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
14773
14774
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
14775
14776
struct wuffs_vp8__decoder__struct {
14777
  // Do not access the private_impl's or private_data's fields directly. There
14778
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
14779
  // the wuffs_foo__bar__baz functions.
14780
  //
14781
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
14782
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
14783
14784
  struct {
14785
    uint32_t magic;
14786
    uint32_t active_coroutine;
14787
    wuffs_base__vtable vtable_for__wuffs_base__image_decoder;
14788
    wuffs_base__vtable null_vtable;
14789
14790
    uint32_t f_width;
14791
    uint32_t f_height;
14792
    uint8_t f_call_sequence;
14793
    uint64_t f_frame_config_io_position;
14794
    uint32_t f_dst_x;
14795
    uint32_t f_dst_y;
14796
    wuffs_base__pixel_swizzler f_swizzler;
14797
14798
    uint32_t p_decode_image_config;
14799
    uint32_t p_do_decode_image_config;
14800
    uint32_t p_decode_frame_config;
14801
    uint32_t p_do_decode_frame_config;
14802
    uint32_t p_decode_frame;
14803
    uint32_t p_do_decode_frame;
14804
  } private_impl;
14805
14806
  struct {
14807
    struct {
14808
      uint64_t scratch;
14809
    } s_do_decode_image_config;
14810
  } private_data;
14811
14812
#ifdef __cplusplus
14813
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
14814
  using unique_ptr = std::unique_ptr<wuffs_vp8__decoder, wuffs_unique_ptr_deleter>;
14815
14816
  // On failure, the alloc_etc functions return nullptr. They don't throw.
14817
14818
  static inline unique_ptr
14819
  alloc() {
14820
    return unique_ptr(wuffs_vp8__decoder__alloc());
14821
  }
14822
14823
  static inline wuffs_base__image_decoder::unique_ptr
14824
  alloc_as__wuffs_base__image_decoder() {
14825
    return wuffs_base__image_decoder::unique_ptr(
14826
        wuffs_vp8__decoder__alloc_as__wuffs_base__image_decoder());
14827
  }
14828
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
14829
14830
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
14831
  // Disallow constructing or copying an object via standard C++ mechanisms,
14832
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
14833
  // size and field layout is not part of the public, stable, memory-safe API.
14834
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
14835
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
14836
  // their first argument) rather than tweaking bar.private_impl.qux fields.
14837
  //
14838
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
14839
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
14840
  // order to provide convenience methods. These forward on "this", so that you
14841
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
14842
  wuffs_vp8__decoder__struct() = delete;
14843
  wuffs_vp8__decoder__struct(const wuffs_vp8__decoder__struct&) = delete;
14844
  wuffs_vp8__decoder__struct& operator=(
14845
      const wuffs_vp8__decoder__struct&) = delete;
14846
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
14847
14848
#if !defined(WUFFS_IMPLEMENTATION)
14849
  // As above, the size of the struct is not part of the public API, and unless
14850
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
14851
  // allocated, not stack allocated. Its size is not intended to be known at
14852
  // compile time, but it is unfortunately divulged as a side effect of
14853
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
14854
  // instead of "sizeof T", invoking the operator. To make the two values
14855
  // different, so that passing the latter will be rejected by the initialize
14856
  // function, we add an arbitrary amount of dead weight.
14857
  uint8_t dead_weight[123000000];  // 123 MB.
14858
#endif  // !defined(WUFFS_IMPLEMENTATION)
14859
14860
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
14861
  initialize(
14862
      size_t sizeof_star_self,
14863
      uint64_t wuffs_version,
14864
      uint32_t options) {
14865
    return wuffs_vp8__decoder__initialize(
14866
        this, sizeof_star_self, wuffs_version, options);
14867
  }
14868
14869
  inline wuffs_base__image_decoder*
14870
  upcast_as__wuffs_base__image_decoder() {
14871
    return (wuffs_base__image_decoder*)this;
14872
  }
14873
14874
  inline uint64_t
14875
  get_quirk(
14876
      uint32_t a_key) const {
14877
    return wuffs_vp8__decoder__get_quirk(this, a_key);
14878
  }
14879
14880
  inline wuffs_base__status
14881
  set_quirk(
14882
      uint32_t a_key,
14883
      uint64_t a_value) {
14884
    return wuffs_vp8__decoder__set_quirk(this, a_key, a_value);
14885
  }
14886
14887
  inline wuffs_base__status
14888
  decode_image_config(
14889
      wuffs_base__image_config* a_dst,
14890
      wuffs_base__io_buffer* a_src) {
14891
    return wuffs_vp8__decoder__decode_image_config(this, a_dst, a_src);
14892
  }
14893
14894
  inline wuffs_base__status
14895
  decode_frame_config(
14896
      wuffs_base__frame_config* a_dst,
14897
      wuffs_base__io_buffer* a_src) {
14898
    return wuffs_vp8__decoder__decode_frame_config(this, a_dst, a_src);
14899
  }
14900
14901
  inline wuffs_base__status
14902
  decode_frame(
14903
      wuffs_base__pixel_buffer* a_dst,
14904
      wuffs_base__io_buffer* a_src,
14905
      wuffs_base__pixel_blend a_blend,
14906
      wuffs_base__slice_u8 a_workbuf,
14907
      wuffs_base__decode_frame_options* a_opts) {
14908
    return wuffs_vp8__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts);
14909
  }
14910
14911
  inline wuffs_base__rect_ie_u32
14912
  frame_dirty_rect() const {
14913
    return wuffs_vp8__decoder__frame_dirty_rect(this);
14914
  }
14915
14916
  inline uint32_t
14917
  num_animation_loops() const {
14918
    return wuffs_vp8__decoder__num_animation_loops(this);
14919
  }
14920
14921
  inline uint64_t
14922
  num_decoded_frame_configs() const {
14923
    return wuffs_vp8__decoder__num_decoded_frame_configs(this);
14924
  }
14925
14926
  inline uint64_t
14927
  num_decoded_frames() const {
14928
    return wuffs_vp8__decoder__num_decoded_frames(this);
14929
  }
14930
14931
  inline wuffs_base__status
14932
  restart_frame(
14933
      uint64_t a_index,
14934
      uint64_t a_io_position) {
14935
    return wuffs_vp8__decoder__restart_frame(this, a_index, a_io_position);
14936
  }
14937
14938
  inline wuffs_base__empty_struct
14939
  set_report_metadata(
14940
      uint32_t a_fourcc,
14941
      bool a_report) {
14942
    return wuffs_vp8__decoder__set_report_metadata(this, a_fourcc, a_report);
14943
  }
14944
14945
  inline wuffs_base__status
14946
  tell_me_more(
14947
      wuffs_base__io_buffer* a_dst,
14948
      wuffs_base__more_information* a_minfo,
14949
      wuffs_base__io_buffer* a_src) {
14950
    return wuffs_vp8__decoder__tell_me_more(this, a_dst, a_minfo, a_src);
14951
  }
14952
14953
  inline wuffs_base__range_ii_u64
14954
  workbuf_len() const {
14955
    return wuffs_vp8__decoder__workbuf_len(this);
14956
  }
14957
14958
#endif  // __cplusplus
14959
};  // struct wuffs_vp8__decoder__struct
14960
14961
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
14962
14963
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__VP8) || defined(WUFFS_NONMONOLITHIC)
14964
14965
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WBMP) || defined(WUFFS_NONMONOLITHIC)
14966
14967
// ---------------- Status Codes
14968
14969
extern const char wuffs_wbmp__error__bad_header[];
14970
extern const char wuffs_wbmp__error__truncated_input[];
14971
14972
// ---------------- Public Consts
14973
14974
#define WUFFS_WBMP__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u
14975
14976
// ---------------- Struct Declarations
14977
14978
typedef struct wuffs_wbmp__decoder__struct wuffs_wbmp__decoder;
14979
14980
#ifdef __cplusplus
14981
extern "C" {
14982
#endif
14983
14984
// ---------------- Public Initializer Prototypes
14985
14986
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
14987
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
14988
//
14989
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
14990
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
14991
14992
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
14993
wuffs_wbmp__decoder__initialize(
14994
    wuffs_wbmp__decoder* self,
14995
    size_t sizeof_star_self,
14996
    uint64_t wuffs_version,
14997
    uint32_t options);
14998
14999
size_t
15000
sizeof__wuffs_wbmp__decoder(void);
15001
15002
// ---------------- Allocs
15003
15004
// These functions allocate and initialize Wuffs structs. They return NULL if
15005
// memory allocation fails. If they return non-NULL, there is no need to call
15006
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
15007
// calling free on the returned pointer. That pointer is effectively a C++
15008
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
15009
15010
wuffs_wbmp__decoder*
15011
wuffs_wbmp__decoder__alloc(void);
15012
15013
static inline wuffs_base__image_decoder*
15014
wuffs_wbmp__decoder__alloc_as__wuffs_base__image_decoder(void) {
15015
  return (wuffs_base__image_decoder*)(wuffs_wbmp__decoder__alloc());
15016
}
15017
15018
// ---------------- Upcasts
15019
15020
static inline wuffs_base__image_decoder*
15021
wuffs_wbmp__decoder__upcast_as__wuffs_base__image_decoder(
15022
    wuffs_wbmp__decoder* p) {
15023
  return (wuffs_base__image_decoder*)p;
15024
}
15025
15026
// ---------------- Public Function Prototypes
15027
15028
WUFFS_BASE__GENERATED_C_CODE
15029
WUFFS_BASE__MAYBE_STATIC uint64_t
15030
wuffs_wbmp__decoder__get_quirk(
15031
    const wuffs_wbmp__decoder* self,
15032
    uint32_t a_key);
15033
15034
WUFFS_BASE__GENERATED_C_CODE
15035
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
15036
wuffs_wbmp__decoder__set_quirk(
15037
    wuffs_wbmp__decoder* self,
15038
    uint32_t a_key,
15039
    uint64_t a_value);
15040
15041
WUFFS_BASE__GENERATED_C_CODE
15042
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
15043
wuffs_wbmp__decoder__decode_image_config(
15044
    wuffs_wbmp__decoder* self,
15045
    wuffs_base__image_config* a_dst,
15046
    wuffs_base__io_buffer* a_src);
15047
15048
WUFFS_BASE__GENERATED_C_CODE
15049
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
15050
wuffs_wbmp__decoder__decode_frame_config(
15051
    wuffs_wbmp__decoder* self,
15052
    wuffs_base__frame_config* a_dst,
15053
    wuffs_base__io_buffer* a_src);
15054
15055
WUFFS_BASE__GENERATED_C_CODE
15056
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
15057
wuffs_wbmp__decoder__decode_frame(
15058
    wuffs_wbmp__decoder* self,
15059
    wuffs_base__pixel_buffer* a_dst,
15060
    wuffs_base__io_buffer* a_src,
15061
    wuffs_base__pixel_blend a_blend,
15062
    wuffs_base__slice_u8 a_workbuf,
15063
    wuffs_base__decode_frame_options* a_opts);
15064
15065
WUFFS_BASE__GENERATED_C_CODE
15066
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
15067
wuffs_wbmp__decoder__frame_dirty_rect(
15068
    const wuffs_wbmp__decoder* self);
15069
15070
WUFFS_BASE__GENERATED_C_CODE
15071
WUFFS_BASE__MAYBE_STATIC uint32_t
15072
wuffs_wbmp__decoder__num_animation_loops(
15073
    const wuffs_wbmp__decoder* self);
15074
15075
WUFFS_BASE__GENERATED_C_CODE
15076
WUFFS_BASE__MAYBE_STATIC uint64_t
15077
wuffs_wbmp__decoder__num_decoded_frame_configs(
15078
    const wuffs_wbmp__decoder* self);
15079
15080
WUFFS_BASE__GENERATED_C_CODE
15081
WUFFS_BASE__MAYBE_STATIC uint64_t
15082
wuffs_wbmp__decoder__num_decoded_frames(
15083
    const wuffs_wbmp__decoder* self);
15084
15085
WUFFS_BASE__GENERATED_C_CODE
15086
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
15087
wuffs_wbmp__decoder__restart_frame(
15088
    wuffs_wbmp__decoder* self,
15089
    uint64_t a_index,
15090
    uint64_t a_io_position);
15091
15092
WUFFS_BASE__GENERATED_C_CODE
15093
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
15094
wuffs_wbmp__decoder__set_report_metadata(
15095
    wuffs_wbmp__decoder* self,
15096
    uint32_t a_fourcc,
15097
    bool a_report);
15098
15099
WUFFS_BASE__GENERATED_C_CODE
15100
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
15101
wuffs_wbmp__decoder__tell_me_more(
15102
    wuffs_wbmp__decoder* self,
15103
    wuffs_base__io_buffer* a_dst,
15104
    wuffs_base__more_information* a_minfo,
15105
    wuffs_base__io_buffer* a_src);
15106
15107
WUFFS_BASE__GENERATED_C_CODE
15108
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
15109
wuffs_wbmp__decoder__workbuf_len(
15110
    const wuffs_wbmp__decoder* self);
15111
15112
#ifdef __cplusplus
15113
}  // extern "C"
15114
#endif
15115
15116
// ---------------- Struct Definitions
15117
15118
// These structs' fields, and the sizeof them, are private implementation
15119
// details that aren't guaranteed to be stable across Wuffs versions.
15120
//
15121
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
15122
15123
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
15124
15125
struct wuffs_wbmp__decoder__struct {
15126
  // Do not access the private_impl's or private_data's fields directly. There
15127
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
15128
  // the wuffs_foo__bar__baz functions.
15129
  //
15130
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
15131
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
15132
15133
  struct {
15134
    uint32_t magic;
15135
    uint32_t active_coroutine;
15136
    wuffs_base__vtable vtable_for__wuffs_base__image_decoder;
15137
    wuffs_base__vtable null_vtable;
15138
15139
    uint32_t f_width;
15140
    uint32_t f_height;
15141
    uint8_t f_call_sequence;
15142
    uint64_t f_frame_config_io_position;
15143
    wuffs_base__pixel_swizzler f_swizzler;
15144
15145
    uint32_t p_decode_image_config;
15146
    uint32_t p_do_decode_image_config;
15147
    uint32_t p_decode_frame_config;
15148
    uint32_t p_do_decode_frame_config;
15149
    uint32_t p_decode_frame;
15150
    uint32_t p_do_decode_frame;
15151
  } private_impl;
15152
15153
  struct {
15154
    struct {
15155
      uint32_t v_i;
15156
      uint32_t v_p;
15157
    } s_do_decode_image_config;
15158
    struct {
15159
      uint64_t v_dst_bytes_per_pixel;
15160
      uint32_t v_dst_x;
15161
      uint32_t v_dst_y;
15162
      uint8_t v_src[1];
15163
      uint8_t v_c8;
15164
    } s_do_decode_frame;
15165
  } private_data;
15166
15167
#ifdef __cplusplus
15168
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
15169
  using unique_ptr = std::unique_ptr<wuffs_wbmp__decoder, wuffs_unique_ptr_deleter>;
15170
15171
  // On failure, the alloc_etc functions return nullptr. They don't throw.
15172
15173
  static inline unique_ptr
15174
  alloc() {
15175
    return unique_ptr(wuffs_wbmp__decoder__alloc());
15176
  }
15177
15178
  static inline wuffs_base__image_decoder::unique_ptr
15179
  alloc_as__wuffs_base__image_decoder() {
15180
    return wuffs_base__image_decoder::unique_ptr(
15181
        wuffs_wbmp__decoder__alloc_as__wuffs_base__image_decoder());
15182
  }
15183
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
15184
15185
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
15186
  // Disallow constructing or copying an object via standard C++ mechanisms,
15187
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
15188
  // size and field layout is not part of the public, stable, memory-safe API.
15189
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
15190
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
15191
  // their first argument) rather than tweaking bar.private_impl.qux fields.
15192
  //
15193
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
15194
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
15195
  // order to provide convenience methods. These forward on "this", so that you
15196
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
15197
  wuffs_wbmp__decoder__struct() = delete;
15198
  wuffs_wbmp__decoder__struct(const wuffs_wbmp__decoder__struct&) = delete;
15199
  wuffs_wbmp__decoder__struct& operator=(
15200
      const wuffs_wbmp__decoder__struct&) = delete;
15201
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
15202
15203
#if !defined(WUFFS_IMPLEMENTATION)
15204
  // As above, the size of the struct is not part of the public API, and unless
15205
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
15206
  // allocated, not stack allocated. Its size is not intended to be known at
15207
  // compile time, but it is unfortunately divulged as a side effect of
15208
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
15209
  // instead of "sizeof T", invoking the operator. To make the two values
15210
  // different, so that passing the latter will be rejected by the initialize
15211
  // function, we add an arbitrary amount of dead weight.
15212
  uint8_t dead_weight[123000000];  // 123 MB.
15213
#endif  // !defined(WUFFS_IMPLEMENTATION)
15214
15215
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
15216
  initialize(
15217
      size_t sizeof_star_self,
15218
      uint64_t wuffs_version,
15219
      uint32_t options) {
15220
    return wuffs_wbmp__decoder__initialize(
15221
        this, sizeof_star_self, wuffs_version, options);
15222
  }
15223
15224
  inline wuffs_base__image_decoder*
15225
  upcast_as__wuffs_base__image_decoder() {
15226
    return (wuffs_base__image_decoder*)this;
15227
  }
15228
15229
  inline uint64_t
15230
  get_quirk(
15231
      uint32_t a_key) const {
15232
    return wuffs_wbmp__decoder__get_quirk(this, a_key);
15233
  }
15234
15235
  inline wuffs_base__status
15236
  set_quirk(
15237
      uint32_t a_key,
15238
      uint64_t a_value) {
15239
    return wuffs_wbmp__decoder__set_quirk(this, a_key, a_value);
15240
  }
15241
15242
  inline wuffs_base__status
15243
  decode_image_config(
15244
      wuffs_base__image_config* a_dst,
15245
      wuffs_base__io_buffer* a_src) {
15246
    return wuffs_wbmp__decoder__decode_image_config(this, a_dst, a_src);
15247
  }
15248
15249
  inline wuffs_base__status
15250
  decode_frame_config(
15251
      wuffs_base__frame_config* a_dst,
15252
      wuffs_base__io_buffer* a_src) {
15253
    return wuffs_wbmp__decoder__decode_frame_config(this, a_dst, a_src);
15254
  }
15255
15256
  inline wuffs_base__status
15257
  decode_frame(
15258
      wuffs_base__pixel_buffer* a_dst,
15259
      wuffs_base__io_buffer* a_src,
15260
      wuffs_base__pixel_blend a_blend,
15261
      wuffs_base__slice_u8 a_workbuf,
15262
      wuffs_base__decode_frame_options* a_opts) {
15263
    return wuffs_wbmp__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts);
15264
  }
15265
15266
  inline wuffs_base__rect_ie_u32
15267
  frame_dirty_rect() const {
15268
    return wuffs_wbmp__decoder__frame_dirty_rect(this);
15269
  }
15270
15271
  inline uint32_t
15272
  num_animation_loops() const {
15273
    return wuffs_wbmp__decoder__num_animation_loops(this);
15274
  }
15275
15276
  inline uint64_t
15277
  num_decoded_frame_configs() const {
15278
    return wuffs_wbmp__decoder__num_decoded_frame_configs(this);
15279
  }
15280
15281
  inline uint64_t
15282
  num_decoded_frames() const {
15283
    return wuffs_wbmp__decoder__num_decoded_frames(this);
15284
  }
15285
15286
  inline wuffs_base__status
15287
  restart_frame(
15288
      uint64_t a_index,
15289
      uint64_t a_io_position) {
15290
    return wuffs_wbmp__decoder__restart_frame(this, a_index, a_io_position);
15291
  }
15292
15293
  inline wuffs_base__empty_struct
15294
  set_report_metadata(
15295
      uint32_t a_fourcc,
15296
      bool a_report) {
15297
    return wuffs_wbmp__decoder__set_report_metadata(this, a_fourcc, a_report);
15298
  }
15299
15300
  inline wuffs_base__status
15301
  tell_me_more(
15302
      wuffs_base__io_buffer* a_dst,
15303
      wuffs_base__more_information* a_minfo,
15304
      wuffs_base__io_buffer* a_src) {
15305
    return wuffs_wbmp__decoder__tell_me_more(this, a_dst, a_minfo, a_src);
15306
  }
15307
15308
  inline wuffs_base__range_ii_u64
15309
  workbuf_len() const {
15310
    return wuffs_wbmp__decoder__workbuf_len(this);
15311
  }
15312
15313
#endif  // __cplusplus
15314
};  // struct wuffs_wbmp__decoder__struct
15315
15316
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
15317
15318
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WBMP) || defined(WUFFS_NONMONOLITHIC)
15319
15320
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WEBP) || defined(WUFFS_NONMONOLITHIC)
15321
15322
// ---------------- Status Codes
15323
15324
extern const char wuffs_webp__error__bad_huffman_code_over_subscribed[];
15325
extern const char wuffs_webp__error__bad_huffman_code_under_subscribed[];
15326
extern const char wuffs_webp__error__bad_huffman_code[];
15327
extern const char wuffs_webp__error__bad_back_reference[];
15328
extern const char wuffs_webp__error__bad_color_cache[];
15329
extern const char wuffs_webp__error__bad_header[];
15330
extern const char wuffs_webp__error__bad_transform[];
15331
extern const char wuffs_webp__error__short_chunk[];
15332
extern const char wuffs_webp__error__truncated_input[];
15333
extern const char wuffs_webp__error__unsupported_number_of_huffman_groups[];
15334
extern const char wuffs_webp__error__unsupported_transform_after_color_indexing_transform[];
15335
extern const char wuffs_webp__error__unsupported_webp_file[];
15336
15337
// ---------------- Public Consts
15338
15339
#define WUFFS_WEBP__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u
15340
15341
// ---------------- Struct Declarations
15342
15343
typedef struct wuffs_webp__decoder__struct wuffs_webp__decoder;
15344
15345
#ifdef __cplusplus
15346
extern "C" {
15347
#endif
15348
15349
// ---------------- Public Initializer Prototypes
15350
15351
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
15352
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
15353
//
15354
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
15355
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
15356
15357
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
15358
wuffs_webp__decoder__initialize(
15359
    wuffs_webp__decoder* self,
15360
    size_t sizeof_star_self,
15361
    uint64_t wuffs_version,
15362
    uint32_t options);
15363
15364
size_t
15365
sizeof__wuffs_webp__decoder(void);
15366
15367
// ---------------- Allocs
15368
15369
// These functions allocate and initialize Wuffs structs. They return NULL if
15370
// memory allocation fails. If they return non-NULL, there is no need to call
15371
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
15372
// calling free on the returned pointer. That pointer is effectively a C++
15373
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
15374
15375
wuffs_webp__decoder*
15376
wuffs_webp__decoder__alloc(void);
15377
15378
static inline wuffs_base__image_decoder*
15379
wuffs_webp__decoder__alloc_as__wuffs_base__image_decoder(void) {
15380
  return (wuffs_base__image_decoder*)(wuffs_webp__decoder__alloc());
15381
}
15382
15383
// ---------------- Upcasts
15384
15385
static inline wuffs_base__image_decoder*
15386
wuffs_webp__decoder__upcast_as__wuffs_base__image_decoder(
15387
    wuffs_webp__decoder* p) {
15388
  return (wuffs_base__image_decoder*)p;
15389
}
15390
15391
// ---------------- Public Function Prototypes
15392
15393
WUFFS_BASE__GENERATED_C_CODE
15394
WUFFS_BASE__MAYBE_STATIC uint64_t
15395
wuffs_webp__decoder__get_quirk(
15396
    const wuffs_webp__decoder* self,
15397
    uint32_t a_key);
15398
15399
WUFFS_BASE__GENERATED_C_CODE
15400
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
15401
wuffs_webp__decoder__set_quirk(
15402
    wuffs_webp__decoder* self,
15403
    uint32_t a_key,
15404
    uint64_t a_value);
15405
15406
WUFFS_BASE__GENERATED_C_CODE
15407
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
15408
wuffs_webp__decoder__decode_image_config(
15409
    wuffs_webp__decoder* self,
15410
    wuffs_base__image_config* a_dst,
15411
    wuffs_base__io_buffer* a_src);
15412
15413
WUFFS_BASE__GENERATED_C_CODE
15414
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
15415
wuffs_webp__decoder__decode_frame_config(
15416
    wuffs_webp__decoder* self,
15417
    wuffs_base__frame_config* a_dst,
15418
    wuffs_base__io_buffer* a_src);
15419
15420
WUFFS_BASE__GENERATED_C_CODE
15421
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
15422
wuffs_webp__decoder__decode_frame(
15423
    wuffs_webp__decoder* self,
15424
    wuffs_base__pixel_buffer* a_dst,
15425
    wuffs_base__io_buffer* a_src,
15426
    wuffs_base__pixel_blend a_blend,
15427
    wuffs_base__slice_u8 a_workbuf,
15428
    wuffs_base__decode_frame_options* a_opts);
15429
15430
WUFFS_BASE__GENERATED_C_CODE
15431
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
15432
wuffs_webp__decoder__frame_dirty_rect(
15433
    const wuffs_webp__decoder* self);
15434
15435
WUFFS_BASE__GENERATED_C_CODE
15436
WUFFS_BASE__MAYBE_STATIC uint32_t
15437
wuffs_webp__decoder__num_animation_loops(
15438
    const wuffs_webp__decoder* self);
15439
15440
WUFFS_BASE__GENERATED_C_CODE
15441
WUFFS_BASE__MAYBE_STATIC uint64_t
15442
wuffs_webp__decoder__num_decoded_frame_configs(
15443
    const wuffs_webp__decoder* self);
15444
15445
WUFFS_BASE__GENERATED_C_CODE
15446
WUFFS_BASE__MAYBE_STATIC uint64_t
15447
wuffs_webp__decoder__num_decoded_frames(
15448
    const wuffs_webp__decoder* self);
15449
15450
WUFFS_BASE__GENERATED_C_CODE
15451
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
15452
wuffs_webp__decoder__restart_frame(
15453
    wuffs_webp__decoder* self,
15454
    uint64_t a_index,
15455
    uint64_t a_io_position);
15456
15457
WUFFS_BASE__GENERATED_C_CODE
15458
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
15459
wuffs_webp__decoder__set_report_metadata(
15460
    wuffs_webp__decoder* self,
15461
    uint32_t a_fourcc,
15462
    bool a_report);
15463
15464
WUFFS_BASE__GENERATED_C_CODE
15465
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
15466
wuffs_webp__decoder__tell_me_more(
15467
    wuffs_webp__decoder* self,
15468
    wuffs_base__io_buffer* a_dst,
15469
    wuffs_base__more_information* a_minfo,
15470
    wuffs_base__io_buffer* a_src);
15471
15472
WUFFS_BASE__GENERATED_C_CODE
15473
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
15474
wuffs_webp__decoder__workbuf_len(
15475
    const wuffs_webp__decoder* self);
15476
15477
#ifdef __cplusplus
15478
}  // extern "C"
15479
#endif
15480
15481
// ---------------- Struct Definitions
15482
15483
// These structs' fields, and the sizeof them, are private implementation
15484
// details that aren't guaranteed to be stable across Wuffs versions.
15485
//
15486
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
15487
15488
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
15489
15490
struct wuffs_webp__decoder__struct {
15491
  // Do not access the private_impl's or private_data's fields directly. There
15492
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
15493
  // the wuffs_foo__bar__baz functions.
15494
  //
15495
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
15496
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
15497
15498
  struct {
15499
    uint32_t magic;
15500
    uint32_t active_coroutine;
15501
    wuffs_base__vtable vtable_for__wuffs_base__image_decoder;
15502
    wuffs_base__vtable null_vtable;
15503
15504
    uint32_t f_pixfmt;
15505
    uint32_t f_width;
15506
    uint32_t f_height;
15507
    uint8_t f_call_sequence;
15508
    uint8_t f_code_length_code_lengths[19];
15509
    bool f_sub_chunk_has_padding;
15510
    bool f_is_vp8_lossy;
15511
    uint64_t f_frame_config_io_position;
15512
    uint32_t f_riff_chunk_length;
15513
    uint32_t f_sub_chunk_length;
15514
    uint32_t f_bits;
15515
    uint32_t f_n_bits;
15516
    bool f_seen_transform[4];
15517
    uint8_t f_transform_type[4];
15518
    uint8_t f_transform_tile_size_log2[4];
15519
    uint32_t f_n_transforms;
15520
    uint32_t f_color_cache_bits;
15521
    uint32_t f_overall_color_cache_bits;
15522
    uint32_t f_overall_tile_size_log2;
15523
    uint32_t f_overall_n_huffman_groups;
15524
    uint32_t f_ht_n_symbols;
15525
    uint32_t f_ht_code_lengths_remaining;
15526
    uint32_t f_color_indexing_palette_size;
15527
    uint32_t f_color_indexing_width;
15528
    uint32_t f_workbuf_offset_for_transform[4];
15529
    uint32_t f_workbuf_offset_for_color_indexing;
15530
    wuffs_base__pixel_swizzler f_swizzler;
15531
15532
    uint32_t p_decode_huffman_groups;
15533
    uint32_t p_decode_huffman_tree;
15534
    uint32_t p_decode_huffman_tree_simple;
15535
    uint32_t p_decode_code_length_code_lengths;
15536
    uint32_t p_build_code_lengths;
15537
    uint32_t p_decode_pixels_slow;
15538
    uint32_t p_decode_image_config;
15539
    uint32_t p_do_decode_image_config;
15540
    uint32_t p_do_decode_image_config_limited;
15541
    uint32_t p_do_decode_image_config_limited_vp8l;
15542
    uint32_t p_decode_frame_config;
15543
    uint32_t p_do_decode_frame_config;
15544
    uint32_t p_decode_frame;
15545
    uint32_t p_do_decode_frame;
15546
    uint32_t p_decode_transform;
15547
    uint32_t p_decode_color_cache_parameters;
15548
    uint32_t p_decode_hg_table;
15549
    uint32_t p_decode_pixels;
15550
  } private_impl;
15551
15552
  struct {
15553
    wuffs_vp8__decoder f_vp8;
15554
    uint8_t f_palette[1024];
15555
    uint32_t f_color_cache[2048];
15556
    uint16_t f_codes[2328];
15557
    uint16_t f_code_lengths[2328];
15558
    uint16_t f_code_lengths_huffman_nodes[37];
15559
    uint16_t f_huffman_nodes[256][6267];
15560
15561
    struct {
15562
      uint32_t v_hg;
15563
      uint32_t v_ht;
15564
    } s_decode_huffman_groups;
15565
    struct {
15566
      uint32_t v_use_second_symbol;
15567
      uint32_t v_first_symbol_n_bits;
15568
      uint32_t v_symbol0;
15569
      uint32_t v_base_offset;
15570
    } s_decode_huffman_tree_simple;
15571
    struct {
15572
      uint32_t v_n_codes;
15573
      uint32_t v_i;
15574
    } s_decode_code_length_code_lengths;
15575
    struct {
15576
      uint32_t v_length_n_bits;
15577
      uint16_t v_prev_code_length;
15578
      uint32_t v_s;
15579
      uint32_t v_s_max;
15580
      uint16_t v_node;
15581
      uint16_t v_repeat_value;
15582
      uint32_t v_repeat_n_bits;
15583
    } s_build_code_lengths;
15584
    struct {
15585
      uint64_t v_p;
15586
      uint64_t v_p_max;
15587
      uint32_t v_tile_size_log2;
15588
      uint32_t v_width_in_tiles;
15589
      uint32_t v_x;
15590
      uint32_t v_y;
15591
      uint32_t v_hg;
15592
      uint16_t v_node;
15593
      uint32_t v_color;
15594
      uint32_t v_back_ref_len_n_bits;
15595
      uint32_t v_back_ref_len_minus_1;
15596
      uint32_t v_back_ref_dist_n_bits;
15597
      uint32_t v_back_ref_dist_premap_minus_1;
15598
      uint64_t v_color_cache_p;
15599
    } s_decode_pixels_slow;
15600
    struct {
15601
      uint64_t scratch;
15602
    } s_do_decode_image_config;
15603
    struct {
15604
      uint64_t scratch;
15605
    } s_do_decode_image_config_limited;
15606
    struct {
15607
      uint64_t scratch;
15608
    } s_do_decode_image_config_limited_vp8l;
15609
    struct {
15610
      uint32_t v_width;
15611
    } s_do_decode_frame;
15612
    struct {
15613
      uint32_t v_transform_type;
15614
      uint32_t v_tile_size_log2;
15615
    } s_decode_transform;
15616
    struct {
15617
      uint32_t v_tile_size_log2;
15618
    } s_decode_hg_table;
15619
  } private_data;
15620
15621
#ifdef __cplusplus
15622
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
15623
  using unique_ptr = std::unique_ptr<wuffs_webp__decoder, wuffs_unique_ptr_deleter>;
15624
15625
  // On failure, the alloc_etc functions return nullptr. They don't throw.
15626
15627
  static inline unique_ptr
15628
  alloc() {
15629
    return unique_ptr(wuffs_webp__decoder__alloc());
15630
  }
15631
15632
  static inline wuffs_base__image_decoder::unique_ptr
15633
  alloc_as__wuffs_base__image_decoder() {
15634
    return wuffs_base__image_decoder::unique_ptr(
15635
        wuffs_webp__decoder__alloc_as__wuffs_base__image_decoder());
15636
  }
15637
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
15638
15639
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
15640
  // Disallow constructing or copying an object via standard C++ mechanisms,
15641
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
15642
  // size and field layout is not part of the public, stable, memory-safe API.
15643
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
15644
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
15645
  // their first argument) rather than tweaking bar.private_impl.qux fields.
15646
  //
15647
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
15648
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
15649
  // order to provide convenience methods. These forward on "this", so that you
15650
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
15651
  wuffs_webp__decoder__struct() = delete;
15652
  wuffs_webp__decoder__struct(const wuffs_webp__decoder__struct&) = delete;
15653
  wuffs_webp__decoder__struct& operator=(
15654
      const wuffs_webp__decoder__struct&) = delete;
15655
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
15656
15657
#if !defined(WUFFS_IMPLEMENTATION)
15658
  // As above, the size of the struct is not part of the public API, and unless
15659
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
15660
  // allocated, not stack allocated. Its size is not intended to be known at
15661
  // compile time, but it is unfortunately divulged as a side effect of
15662
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
15663
  // instead of "sizeof T", invoking the operator. To make the two values
15664
  // different, so that passing the latter will be rejected by the initialize
15665
  // function, we add an arbitrary amount of dead weight.
15666
  uint8_t dead_weight[123000000];  // 123 MB.
15667
#endif  // !defined(WUFFS_IMPLEMENTATION)
15668
15669
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
15670
  initialize(
15671
      size_t sizeof_star_self,
15672
      uint64_t wuffs_version,
15673
      uint32_t options) {
15674
    return wuffs_webp__decoder__initialize(
15675
        this, sizeof_star_self, wuffs_version, options);
15676
  }
15677
15678
  inline wuffs_base__image_decoder*
15679
  upcast_as__wuffs_base__image_decoder() {
15680
    return (wuffs_base__image_decoder*)this;
15681
  }
15682
15683
  inline uint64_t
15684
  get_quirk(
15685
      uint32_t a_key) const {
15686
    return wuffs_webp__decoder__get_quirk(this, a_key);
15687
  }
15688
15689
  inline wuffs_base__status
15690
  set_quirk(
15691
      uint32_t a_key,
15692
      uint64_t a_value) {
15693
    return wuffs_webp__decoder__set_quirk(this, a_key, a_value);
15694
  }
15695
15696
  inline wuffs_base__status
15697
  decode_image_config(
15698
      wuffs_base__image_config* a_dst,
15699
      wuffs_base__io_buffer* a_src) {
15700
    return wuffs_webp__decoder__decode_image_config(this, a_dst, a_src);
15701
  }
15702
15703
  inline wuffs_base__status
15704
  decode_frame_config(
15705
      wuffs_base__frame_config* a_dst,
15706
      wuffs_base__io_buffer* a_src) {
15707
    return wuffs_webp__decoder__decode_frame_config(this, a_dst, a_src);
15708
  }
15709
15710
  inline wuffs_base__status
15711
  decode_frame(
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
    return wuffs_webp__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts);
15718
  }
15719
15720
  inline wuffs_base__rect_ie_u32
15721
  frame_dirty_rect() const {
15722
    return wuffs_webp__decoder__frame_dirty_rect(this);
15723
  }
15724
15725
  inline uint32_t
15726
  num_animation_loops() const {
15727
    return wuffs_webp__decoder__num_animation_loops(this);
15728
  }
15729
15730
  inline uint64_t
15731
  num_decoded_frame_configs() const {
15732
    return wuffs_webp__decoder__num_decoded_frame_configs(this);
15733
  }
15734
15735
  inline uint64_t
15736
  num_decoded_frames() const {
15737
    return wuffs_webp__decoder__num_decoded_frames(this);
15738
  }
15739
15740
  inline wuffs_base__status
15741
  restart_frame(
15742
      uint64_t a_index,
15743
      uint64_t a_io_position) {
15744
    return wuffs_webp__decoder__restart_frame(this, a_index, a_io_position);
15745
  }
15746
15747
  inline wuffs_base__empty_struct
15748
  set_report_metadata(
15749
      uint32_t a_fourcc,
15750
      bool a_report) {
15751
    return wuffs_webp__decoder__set_report_metadata(this, a_fourcc, a_report);
15752
  }
15753
15754
  inline wuffs_base__status
15755
  tell_me_more(
15756
      wuffs_base__io_buffer* a_dst,
15757
      wuffs_base__more_information* a_minfo,
15758
      wuffs_base__io_buffer* a_src) {
15759
    return wuffs_webp__decoder__tell_me_more(this, a_dst, a_minfo, a_src);
15760
  }
15761
15762
  inline wuffs_base__range_ii_u64
15763
  workbuf_len() const {
15764
    return wuffs_webp__decoder__workbuf_len(this);
15765
  }
15766
15767
#endif  // __cplusplus
15768
};  // struct wuffs_webp__decoder__struct
15769
15770
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
15771
15772
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WEBP) || defined(WUFFS_NONMONOLITHIC)
15773
15774
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH32) || defined(WUFFS_NONMONOLITHIC)
15775
15776
// ---------------- Status Codes
15777
15778
// ---------------- Public Consts
15779
15780
// ---------------- Struct Declarations
15781
15782
typedef struct wuffs_xxhash32__hasher__struct wuffs_xxhash32__hasher;
15783
15784
#ifdef __cplusplus
15785
extern "C" {
15786
#endif
15787
15788
// ---------------- Public Initializer Prototypes
15789
15790
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
15791
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
15792
//
15793
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
15794
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
15795
15796
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
15797
wuffs_xxhash32__hasher__initialize(
15798
    wuffs_xxhash32__hasher* self,
15799
    size_t sizeof_star_self,
15800
    uint64_t wuffs_version,
15801
    uint32_t options);
15802
15803
size_t
15804
sizeof__wuffs_xxhash32__hasher(void);
15805
15806
// ---------------- Allocs
15807
15808
// These functions allocate and initialize Wuffs structs. They return NULL if
15809
// memory allocation fails. If they return non-NULL, there is no need to call
15810
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
15811
// calling free on the returned pointer. That pointer is effectively a C++
15812
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
15813
15814
wuffs_xxhash32__hasher*
15815
wuffs_xxhash32__hasher__alloc(void);
15816
15817
static inline wuffs_base__hasher_u32*
15818
wuffs_xxhash32__hasher__alloc_as__wuffs_base__hasher_u32(void) {
15819
  return (wuffs_base__hasher_u32*)(wuffs_xxhash32__hasher__alloc());
15820
}
15821
15822
// ---------------- Upcasts
15823
15824
static inline wuffs_base__hasher_u32*
15825
wuffs_xxhash32__hasher__upcast_as__wuffs_base__hasher_u32(
15826
    wuffs_xxhash32__hasher* p) {
15827
  return (wuffs_base__hasher_u32*)p;
15828
}
15829
15830
// ---------------- Public Function Prototypes
15831
15832
WUFFS_BASE__GENERATED_C_CODE
15833
WUFFS_BASE__MAYBE_STATIC uint64_t
15834
wuffs_xxhash32__hasher__get_quirk(
15835
    const wuffs_xxhash32__hasher* self,
15836
    uint32_t a_key);
15837
15838
WUFFS_BASE__GENERATED_C_CODE
15839
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
15840
wuffs_xxhash32__hasher__set_quirk(
15841
    wuffs_xxhash32__hasher* self,
15842
    uint32_t a_key,
15843
    uint64_t a_value);
15844
15845
WUFFS_BASE__GENERATED_C_CODE
15846
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
15847
wuffs_xxhash32__hasher__update(
15848
    wuffs_xxhash32__hasher* self,
15849
    wuffs_base__slice_u8 a_x);
15850
15851
WUFFS_BASE__GENERATED_C_CODE
15852
WUFFS_BASE__MAYBE_STATIC uint32_t
15853
wuffs_xxhash32__hasher__update_u32(
15854
    wuffs_xxhash32__hasher* self,
15855
    wuffs_base__slice_u8 a_x);
15856
15857
WUFFS_BASE__GENERATED_C_CODE
15858
WUFFS_BASE__MAYBE_STATIC uint32_t
15859
wuffs_xxhash32__hasher__checksum_u32(
15860
    const wuffs_xxhash32__hasher* self);
15861
15862
#ifdef __cplusplus
15863
}  // extern "C"
15864
#endif
15865
15866
// ---------------- Struct Definitions
15867
15868
// These structs' fields, and the sizeof them, are private implementation
15869
// details that aren't guaranteed to be stable across Wuffs versions.
15870
//
15871
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
15872
15873
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
15874
15875
struct wuffs_xxhash32__hasher__struct {
15876
  // Do not access the private_impl's or private_data's fields directly. There
15877
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
15878
  // the wuffs_foo__bar__baz functions.
15879
  //
15880
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
15881
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
15882
15883
  struct {
15884
    uint32_t magic;
15885
    uint32_t active_coroutine;
15886
    wuffs_base__vtable vtable_for__wuffs_base__hasher_u32;
15887
    wuffs_base__vtable null_vtable;
15888
15889
    uint32_t f_length_modulo_u32;
15890
    bool f_length_overflows_u32;
15891
    uint8_t f_padding0;
15892
    uint8_t f_padding1;
15893
    uint8_t f_buf_len;
15894
    uint8_t f_buf_data[16];
15895
    uint32_t f_v0;
15896
    uint32_t f_v1;
15897
    uint32_t f_v2;
15898
    uint32_t f_v3;
15899
  } private_impl;
15900
15901
#ifdef __cplusplus
15902
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
15903
  using unique_ptr = std::unique_ptr<wuffs_xxhash32__hasher, wuffs_unique_ptr_deleter>;
15904
15905
  // On failure, the alloc_etc functions return nullptr. They don't throw.
15906
15907
  static inline unique_ptr
15908
  alloc() {
15909
    return unique_ptr(wuffs_xxhash32__hasher__alloc());
15910
  }
15911
15912
  static inline wuffs_base__hasher_u32::unique_ptr
15913
  alloc_as__wuffs_base__hasher_u32() {
15914
    return wuffs_base__hasher_u32::unique_ptr(
15915
        wuffs_xxhash32__hasher__alloc_as__wuffs_base__hasher_u32());
15916
  }
15917
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
15918
15919
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
15920
  // Disallow constructing or copying an object via standard C++ mechanisms,
15921
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
15922
  // size and field layout is not part of the public, stable, memory-safe API.
15923
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
15924
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
15925
  // their first argument) rather than tweaking bar.private_impl.qux fields.
15926
  //
15927
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
15928
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
15929
  // order to provide convenience methods. These forward on "this", so that you
15930
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
15931
  wuffs_xxhash32__hasher__struct() = delete;
15932
  wuffs_xxhash32__hasher__struct(const wuffs_xxhash32__hasher__struct&) = delete;
15933
  wuffs_xxhash32__hasher__struct& operator=(
15934
      const wuffs_xxhash32__hasher__struct&) = delete;
15935
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
15936
15937
#if !defined(WUFFS_IMPLEMENTATION)
15938
  // As above, the size of the struct is not part of the public API, and unless
15939
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
15940
  // allocated, not stack allocated. Its size is not intended to be known at
15941
  // compile time, but it is unfortunately divulged as a side effect of
15942
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
15943
  // instead of "sizeof T", invoking the operator. To make the two values
15944
  // different, so that passing the latter will be rejected by the initialize
15945
  // function, we add an arbitrary amount of dead weight.
15946
  uint8_t dead_weight[123000000];  // 123 MB.
15947
#endif  // !defined(WUFFS_IMPLEMENTATION)
15948
15949
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
15950
  initialize(
15951
      size_t sizeof_star_self,
15952
      uint64_t wuffs_version,
15953
      uint32_t options) {
15954
    return wuffs_xxhash32__hasher__initialize(
15955
        this, sizeof_star_self, wuffs_version, options);
15956
  }
15957
15958
  inline wuffs_base__hasher_u32*
15959
  upcast_as__wuffs_base__hasher_u32() {
15960
    return (wuffs_base__hasher_u32*)this;
15961
  }
15962
15963
  inline uint64_t
15964
  get_quirk(
15965
      uint32_t a_key) const {
15966
    return wuffs_xxhash32__hasher__get_quirk(this, a_key);
15967
  }
15968
15969
  inline wuffs_base__status
15970
  set_quirk(
15971
      uint32_t a_key,
15972
      uint64_t a_value) {
15973
    return wuffs_xxhash32__hasher__set_quirk(this, a_key, a_value);
15974
  }
15975
15976
  inline wuffs_base__empty_struct
15977
  update(
15978
      wuffs_base__slice_u8 a_x) {
15979
    return wuffs_xxhash32__hasher__update(this, a_x);
15980
  }
15981
15982
  inline uint32_t
15983
  update_u32(
15984
      wuffs_base__slice_u8 a_x) {
15985
    return wuffs_xxhash32__hasher__update_u32(this, a_x);
15986
  }
15987
15988
  inline uint32_t
15989
  checksum_u32() const {
15990
    return wuffs_xxhash32__hasher__checksum_u32(this);
15991
  }
15992
15993
#endif  // __cplusplus
15994
};  // struct wuffs_xxhash32__hasher__struct
15995
15996
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
15997
15998
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH32) || defined(WUFFS_NONMONOLITHIC)
15999
16000
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH64) || defined(WUFFS_NONMONOLITHIC)
16001
16002
// ---------------- Status Codes
16003
16004
// ---------------- Public Consts
16005
16006
// ---------------- Struct Declarations
16007
16008
typedef struct wuffs_xxhash64__hasher__struct wuffs_xxhash64__hasher;
16009
16010
#ifdef __cplusplus
16011
extern "C" {
16012
#endif
16013
16014
// ---------------- Public Initializer Prototypes
16015
16016
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
16017
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
16018
//
16019
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
16020
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
16021
16022
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
16023
wuffs_xxhash64__hasher__initialize(
16024
    wuffs_xxhash64__hasher* self,
16025
    size_t sizeof_star_self,
16026
    uint64_t wuffs_version,
16027
    uint32_t options);
16028
16029
size_t
16030
sizeof__wuffs_xxhash64__hasher(void);
16031
16032
// ---------------- Allocs
16033
16034
// These functions allocate and initialize Wuffs structs. They return NULL if
16035
// memory allocation fails. If they return non-NULL, there is no need to call
16036
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
16037
// calling free on the returned pointer. That pointer is effectively a C++
16038
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
16039
16040
wuffs_xxhash64__hasher*
16041
wuffs_xxhash64__hasher__alloc(void);
16042
16043
static inline wuffs_base__hasher_u64*
16044
wuffs_xxhash64__hasher__alloc_as__wuffs_base__hasher_u64(void) {
16045
  return (wuffs_base__hasher_u64*)(wuffs_xxhash64__hasher__alloc());
16046
}
16047
16048
// ---------------- Upcasts
16049
16050
static inline wuffs_base__hasher_u64*
16051
wuffs_xxhash64__hasher__upcast_as__wuffs_base__hasher_u64(
16052
    wuffs_xxhash64__hasher* p) {
16053
  return (wuffs_base__hasher_u64*)p;
16054
}
16055
16056
// ---------------- Public Function Prototypes
16057
16058
WUFFS_BASE__GENERATED_C_CODE
16059
WUFFS_BASE__MAYBE_STATIC uint64_t
16060
wuffs_xxhash64__hasher__get_quirk(
16061
    const wuffs_xxhash64__hasher* self,
16062
    uint32_t a_key);
16063
16064
WUFFS_BASE__GENERATED_C_CODE
16065
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
16066
wuffs_xxhash64__hasher__set_quirk(
16067
    wuffs_xxhash64__hasher* self,
16068
    uint32_t a_key,
16069
    uint64_t a_value);
16070
16071
WUFFS_BASE__GENERATED_C_CODE
16072
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
16073
wuffs_xxhash64__hasher__update(
16074
    wuffs_xxhash64__hasher* self,
16075
    wuffs_base__slice_u8 a_x);
16076
16077
WUFFS_BASE__GENERATED_C_CODE
16078
WUFFS_BASE__MAYBE_STATIC uint64_t
16079
wuffs_xxhash64__hasher__update_u64(
16080
    wuffs_xxhash64__hasher* self,
16081
    wuffs_base__slice_u8 a_x);
16082
16083
WUFFS_BASE__GENERATED_C_CODE
16084
WUFFS_BASE__MAYBE_STATIC uint64_t
16085
wuffs_xxhash64__hasher__checksum_u64(
16086
    const wuffs_xxhash64__hasher* self);
16087
16088
#ifdef __cplusplus
16089
}  // extern "C"
16090
#endif
16091
16092
// ---------------- Struct Definitions
16093
16094
// These structs' fields, and the sizeof them, are private implementation
16095
// details that aren't guaranteed to be stable across Wuffs versions.
16096
//
16097
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
16098
16099
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
16100
16101
struct wuffs_xxhash64__hasher__struct {
16102
  // Do not access the private_impl's or private_data's fields directly. There
16103
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
16104
  // the wuffs_foo__bar__baz functions.
16105
  //
16106
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
16107
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
16108
16109
  struct {
16110
    uint32_t magic;
16111
    uint32_t active_coroutine;
16112
    wuffs_base__vtable vtable_for__wuffs_base__hasher_u64;
16113
    wuffs_base__vtable null_vtable;
16114
16115
    uint64_t f_length_modulo_u64;
16116
    bool f_length_overflows_u64;
16117
    uint8_t f_padding0;
16118
    uint8_t f_padding1;
16119
    uint8_t f_padding2;
16120
    uint32_t f_buf_len;
16121
    uint8_t f_buf_data[32];
16122
    uint64_t f_v0;
16123
    uint64_t f_v1;
16124
    uint64_t f_v2;
16125
    uint64_t f_v3;
16126
  } private_impl;
16127
16128
#ifdef __cplusplus
16129
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
16130
  using unique_ptr = std::unique_ptr<wuffs_xxhash64__hasher, wuffs_unique_ptr_deleter>;
16131
16132
  // On failure, the alloc_etc functions return nullptr. They don't throw.
16133
16134
  static inline unique_ptr
16135
  alloc() {
16136
    return unique_ptr(wuffs_xxhash64__hasher__alloc());
16137
  }
16138
16139
  static inline wuffs_base__hasher_u64::unique_ptr
16140
  alloc_as__wuffs_base__hasher_u64() {
16141
    return wuffs_base__hasher_u64::unique_ptr(
16142
        wuffs_xxhash64__hasher__alloc_as__wuffs_base__hasher_u64());
16143
  }
16144
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
16145
16146
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
16147
  // Disallow constructing or copying an object via standard C++ mechanisms,
16148
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
16149
  // size and field layout is not part of the public, stable, memory-safe API.
16150
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
16151
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
16152
  // their first argument) rather than tweaking bar.private_impl.qux fields.
16153
  //
16154
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
16155
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
16156
  // order to provide convenience methods. These forward on "this", so that you
16157
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
16158
  wuffs_xxhash64__hasher__struct() = delete;
16159
  wuffs_xxhash64__hasher__struct(const wuffs_xxhash64__hasher__struct&) = delete;
16160
  wuffs_xxhash64__hasher__struct& operator=(
16161
      const wuffs_xxhash64__hasher__struct&) = delete;
16162
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
16163
16164
#if !defined(WUFFS_IMPLEMENTATION)
16165
  // As above, the size of the struct is not part of the public API, and unless
16166
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
16167
  // allocated, not stack allocated. Its size is not intended to be known at
16168
  // compile time, but it is unfortunately divulged as a side effect of
16169
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
16170
  // instead of "sizeof T", invoking the operator. To make the two values
16171
  // different, so that passing the latter will be rejected by the initialize
16172
  // function, we add an arbitrary amount of dead weight.
16173
  uint8_t dead_weight[123000000];  // 123 MB.
16174
#endif  // !defined(WUFFS_IMPLEMENTATION)
16175
16176
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
16177
  initialize(
16178
      size_t sizeof_star_self,
16179
      uint64_t wuffs_version,
16180
      uint32_t options) {
16181
    return wuffs_xxhash64__hasher__initialize(
16182
        this, sizeof_star_self, wuffs_version, options);
16183
  }
16184
16185
  inline wuffs_base__hasher_u64*
16186
  upcast_as__wuffs_base__hasher_u64() {
16187
    return (wuffs_base__hasher_u64*)this;
16188
  }
16189
16190
  inline uint64_t
16191
  get_quirk(
16192
      uint32_t a_key) const {
16193
    return wuffs_xxhash64__hasher__get_quirk(this, a_key);
16194
  }
16195
16196
  inline wuffs_base__status
16197
  set_quirk(
16198
      uint32_t a_key,
16199
      uint64_t a_value) {
16200
    return wuffs_xxhash64__hasher__set_quirk(this, a_key, a_value);
16201
  }
16202
16203
  inline wuffs_base__empty_struct
16204
  update(
16205
      wuffs_base__slice_u8 a_x) {
16206
    return wuffs_xxhash64__hasher__update(this, a_x);
16207
  }
16208
16209
  inline uint64_t
16210
  update_u64(
16211
      wuffs_base__slice_u8 a_x) {
16212
    return wuffs_xxhash64__hasher__update_u64(this, a_x);
16213
  }
16214
16215
  inline uint64_t
16216
  checksum_u64() const {
16217
    return wuffs_xxhash64__hasher__checksum_u64(this);
16218
  }
16219
16220
#endif  // __cplusplus
16221
};  // struct wuffs_xxhash64__hasher__struct
16222
16223
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
16224
16225
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH64) || defined(WUFFS_NONMONOLITHIC)
16226
16227
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XZ) || defined(WUFFS_NONMONOLITHIC)
16228
16229
// ---------------- Status Codes
16230
16231
extern const char wuffs_xz__error__bad_bcj_offset[];
16232
extern const char wuffs_xz__error__bad_block_header[];
16233
extern const char wuffs_xz__error__bad_checksum[];
16234
extern const char wuffs_xz__error__bad_filter[];
16235
extern const char wuffs_xz__error__bad_footer[];
16236
extern const char wuffs_xz__error__bad_header[];
16237
extern const char wuffs_xz__error__bad_header_concatenated_stream[];
16238
extern const char wuffs_xz__error__bad_index[];
16239
extern const char wuffs_xz__error__bad_padding[];
16240
extern const char wuffs_xz__error__truncated_input[];
16241
extern const char wuffs_xz__error__unsupported_checksum_algorithm[];
16242
extern const char wuffs_xz__error__unsupported_filter[];
16243
extern const char wuffs_xz__error__unsupported_filter_combination[];
16244
16245
// ---------------- Public Consts
16246
16247
#define WUFFS_XZ__QUIRK_DECODE_STANDALONE_CONCATENATED_STREAMS 1963655168u
16248
16249
#define WUFFS_XZ__DECODER_DST_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0u
16250
16251
#define WUFFS_XZ__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 4294967568u
16252
16253
// ---------------- Struct Declarations
16254
16255
typedef struct wuffs_xz__decoder__struct wuffs_xz__decoder;
16256
16257
#ifdef __cplusplus
16258
extern "C" {
16259
#endif
16260
16261
// ---------------- Public Initializer Prototypes
16262
16263
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
16264
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
16265
//
16266
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
16267
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
16268
16269
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
16270
wuffs_xz__decoder__initialize(
16271
    wuffs_xz__decoder* self,
16272
    size_t sizeof_star_self,
16273
    uint64_t wuffs_version,
16274
    uint32_t options);
16275
16276
size_t
16277
sizeof__wuffs_xz__decoder(void);
16278
16279
// ---------------- Allocs
16280
16281
// These functions allocate and initialize Wuffs structs. They return NULL if
16282
// memory allocation fails. If they return non-NULL, there is no need to call
16283
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
16284
// calling free on the returned pointer. That pointer is effectively a C++
16285
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
16286
16287
wuffs_xz__decoder*
16288
wuffs_xz__decoder__alloc(void);
16289
16290
static inline wuffs_base__io_transformer*
16291
wuffs_xz__decoder__alloc_as__wuffs_base__io_transformer(void) {
16292
  return (wuffs_base__io_transformer*)(wuffs_xz__decoder__alloc());
16293
}
16294
16295
// ---------------- Upcasts
16296
16297
static inline wuffs_base__io_transformer*
16298
wuffs_xz__decoder__upcast_as__wuffs_base__io_transformer(
16299
    wuffs_xz__decoder* p) {
16300
  return (wuffs_base__io_transformer*)p;
16301
}
16302
16303
// ---------------- Public Function Prototypes
16304
16305
WUFFS_BASE__GENERATED_C_CODE
16306
WUFFS_BASE__MAYBE_STATIC uint64_t
16307
wuffs_xz__decoder__get_quirk(
16308
    const wuffs_xz__decoder* self,
16309
    uint32_t a_key);
16310
16311
WUFFS_BASE__GENERATED_C_CODE
16312
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
16313
wuffs_xz__decoder__set_quirk(
16314
    wuffs_xz__decoder* self,
16315
    uint32_t a_key,
16316
    uint64_t a_value);
16317
16318
WUFFS_BASE__GENERATED_C_CODE
16319
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
16320
wuffs_xz__decoder__dst_history_retain_length(
16321
    const wuffs_xz__decoder* self);
16322
16323
WUFFS_BASE__GENERATED_C_CODE
16324
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
16325
wuffs_xz__decoder__workbuf_len(
16326
    const wuffs_xz__decoder* self);
16327
16328
WUFFS_BASE__GENERATED_C_CODE
16329
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
16330
wuffs_xz__decoder__transform_io(
16331
    wuffs_xz__decoder* self,
16332
    wuffs_base__io_buffer* a_dst,
16333
    wuffs_base__io_buffer* a_src,
16334
    wuffs_base__slice_u8 a_workbuf);
16335
16336
#ifdef __cplusplus
16337
}  // extern "C"
16338
#endif
16339
16340
// ---------------- Struct Definitions
16341
16342
// These structs' fields, and the sizeof them, are private implementation
16343
// details that aren't guaranteed to be stable across Wuffs versions.
16344
//
16345
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
16346
16347
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
16348
16349
struct wuffs_xz__decoder__struct {
16350
  // Do not access the private_impl's or private_data's fields directly. There
16351
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
16352
  // the wuffs_foo__bar__baz functions.
16353
  //
16354
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
16355
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
16356
16357
  struct {
16358
    uint32_t magic;
16359
    uint32_t active_coroutine;
16360
    wuffs_base__vtable vtable_for__wuffs_base__io_transformer;
16361
    wuffs_base__vtable null_vtable;
16362
16363
    uint32_t f_filters[3];
16364
    uint32_t f_num_non_final_filters;
16365
    uint8_t f_checksummer;
16366
    bool f_ignore_checksum;
16367
    bool f_standalone_format;
16368
    bool f_lzma_needs_reset;
16369
    bool f_block_has_compressed_size;
16370
    bool f_block_has_uncompressed_size;
16371
    uint8_t f_bcj_undo_index;
16372
    uint32_t f_bcj_pos;
16373
    uint32_t f_bcj_x86_prev_mask;
16374
    uint64_t f_block_compressed_size;
16375
    uint64_t f_block_uncompressed_size;
16376
    uint64_t f_compressed_size_for_index;
16377
    uint32_t f_verification_have_hashed_sizes[2];
16378
    uint32_t f_verification_want_hashed_sizes[2];
16379
    uint64_t f_verification_have_total_sizes[2];
16380
    uint64_t f_verification_want_total_sizes[2];
16381
    uint64_t f_num_actual_blocks;
16382
    uint64_t f_num_index_blocks;
16383
    uint64_t f_index_block_compressed_size;
16384
    uint64_t f_index_block_uncompressed_size;
16385
    uint64_t f_backwards_size;
16386
    bool f_started_verify_index;
16387
    uint16_t f_flags;
16388
16389
    uint8_t (*choosy_apply_non_final_filters)(
16390
        wuffs_xz__decoder* self,
16391
        wuffs_base__slice_u8 a_dst_slice);
16392
    uint32_t p_transform_io;
16393
    uint32_t p_do_transform_io;
16394
    uint32_t p_decode_block_header_with_padding;
16395
    uint32_t p_decode_block_header_sans_padding;
16396
    uint32_t p_verify_index;
16397
    uint32_t p_verify_footer;
16398
  } private_impl;
16399
16400
  struct {
16401
    uint8_t f_filter_data[3][256];
16402
    wuffs_crc32__ieee_hasher f_crc32;
16403
    wuffs_crc64__ecma_hasher f_crc64;
16404
    wuffs_sha256__hasher f_sha256;
16405
    wuffs_lzma__decoder f_lzma;
16406
16407
    struct {
16408
      uint32_t v_checksum32_have;
16409
      uint32_t v_checksum32_want;
16410
      wuffs_base__bitvec256 v_checksum256_have;
16411
      uint64_t v_compressed_size;
16412
      uint64_t v_uncompressed_size;
16413
      uint64_t scratch;
16414
    } s_do_transform_io;
16415
    struct {
16416
      uint64_t v_padded_size_have;
16417
      uint64_t v_padded_size_want;
16418
    } s_decode_block_header_with_padding;
16419
    struct {
16420
      uint8_t v_flags;
16421
      uint8_t v_filter_id;
16422
      uint32_t v_shift;
16423
      uint32_t v_f;
16424
      uint64_t scratch;
16425
    } s_decode_block_header_sans_padding;
16426
    struct {
16427
      uint32_t v_shift;
16428
    } s_verify_index;
16429
    struct {
16430
      uint64_t scratch;
16431
    } s_verify_footer;
16432
  } private_data;
16433
16434
#ifdef __cplusplus
16435
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
16436
  using unique_ptr = std::unique_ptr<wuffs_xz__decoder, wuffs_unique_ptr_deleter>;
16437
16438
  // On failure, the alloc_etc functions return nullptr. They don't throw.
16439
16440
  static inline unique_ptr
16441
  alloc() {
16442
    return unique_ptr(wuffs_xz__decoder__alloc());
16443
  }
16444
16445
  static inline wuffs_base__io_transformer::unique_ptr
16446
  alloc_as__wuffs_base__io_transformer() {
16447
    return wuffs_base__io_transformer::unique_ptr(
16448
        wuffs_xz__decoder__alloc_as__wuffs_base__io_transformer());
16449
  }
16450
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
16451
16452
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
16453
  // Disallow constructing or copying an object via standard C++ mechanisms,
16454
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
16455
  // size and field layout is not part of the public, stable, memory-safe API.
16456
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
16457
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
16458
  // their first argument) rather than tweaking bar.private_impl.qux fields.
16459
  //
16460
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
16461
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
16462
  // order to provide convenience methods. These forward on "this", so that you
16463
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
16464
  wuffs_xz__decoder__struct() = delete;
16465
  wuffs_xz__decoder__struct(const wuffs_xz__decoder__struct&) = delete;
16466
  wuffs_xz__decoder__struct& operator=(
16467
      const wuffs_xz__decoder__struct&) = delete;
16468
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
16469
16470
#if !defined(WUFFS_IMPLEMENTATION)
16471
  // As above, the size of the struct is not part of the public API, and unless
16472
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
16473
  // allocated, not stack allocated. Its size is not intended to be known at
16474
  // compile time, but it is unfortunately divulged as a side effect of
16475
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
16476
  // instead of "sizeof T", invoking the operator. To make the two values
16477
  // different, so that passing the latter will be rejected by the initialize
16478
  // function, we add an arbitrary amount of dead weight.
16479
  uint8_t dead_weight[123000000];  // 123 MB.
16480
#endif  // !defined(WUFFS_IMPLEMENTATION)
16481
16482
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
16483
  initialize(
16484
      size_t sizeof_star_self,
16485
      uint64_t wuffs_version,
16486
      uint32_t options) {
16487
    return wuffs_xz__decoder__initialize(
16488
        this, sizeof_star_self, wuffs_version, options);
16489
  }
16490
16491
  inline wuffs_base__io_transformer*
16492
  upcast_as__wuffs_base__io_transformer() {
16493
    return (wuffs_base__io_transformer*)this;
16494
  }
16495
16496
  inline uint64_t
16497
  get_quirk(
16498
      uint32_t a_key) const {
16499
    return wuffs_xz__decoder__get_quirk(this, a_key);
16500
  }
16501
16502
  inline wuffs_base__status
16503
  set_quirk(
16504
      uint32_t a_key,
16505
      uint64_t a_value) {
16506
    return wuffs_xz__decoder__set_quirk(this, a_key, a_value);
16507
  }
16508
16509
  inline wuffs_base__optional_u63
16510
  dst_history_retain_length() const {
16511
    return wuffs_xz__decoder__dst_history_retain_length(this);
16512
  }
16513
16514
  inline wuffs_base__range_ii_u64
16515
  workbuf_len() const {
16516
    return wuffs_xz__decoder__workbuf_len(this);
16517
  }
16518
16519
  inline wuffs_base__status
16520
  transform_io(
16521
      wuffs_base__io_buffer* a_dst,
16522
      wuffs_base__io_buffer* a_src,
16523
      wuffs_base__slice_u8 a_workbuf) {
16524
    return wuffs_xz__decoder__transform_io(this, a_dst, a_src, a_workbuf);
16525
  }
16526
16527
#endif  // __cplusplus
16528
};  // struct wuffs_xz__decoder__struct
16529
16530
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
16531
16532
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XZ) || defined(WUFFS_NONMONOLITHIC)
16533
16534
#if defined(__cplusplus) && defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
16535
16536
// ---------------- Auxiliary - Base
16537
16538
// Auxiliary code is discussed at
16539
// https://github.com/google/wuffs/blob/main/doc/note/auxiliary-code.md
16540
16541
#include <stdio.h>
16542
16543
#include <string>
16544
#include <utility>
16545
16546
namespace wuffs_aux {
16547
16548
using IOBuffer = wuffs_base__io_buffer;
16549
16550
// MemOwner represents ownership of some memory. Dynamically allocated memory
16551
// (e.g. from malloc or new) is typically paired with free or delete, invoked
16552
// when the std::unique_ptr is destroyed. Statically allocated memory might use
16553
// MemOwner(nullptr, &free), even if that statically allocated memory is not
16554
// nullptr, since calling free(nullptr) is a no-op.
16555
using MemOwner = std::unique_ptr<void, decltype(&free)>;
16556
16557
using QuirkKeyValuePair = std::pair<uint32_t, uint64_t>;
16558
16559
namespace sync_io {
16560
16561
// --------
16562
16563
// DynIOBuffer is an IOBuffer that is backed by a dynamically sized byte array.
16564
// It owns that backing array and will free it in its destructor.
16565
//
16566
// The array size can be explicitly extended (by calling the grow method) but,
16567
// unlike a C++ std::vector, there is no implicit extension (e.g. by calling
16568
// std::vector::insert) and its maximum size is capped by the max_incl
16569
// constructor argument.
16570
//
16571
// It contains an IOBuffer-typed field whose reader side provides access to
16572
// previously written bytes and whose writer side provides access to the
16573
// allocated but not-yet-written-to slack space. For Go programmers, this slack
16574
// space is roughly analogous to the s[len(s):cap(s)] space of a slice s.
16575
class DynIOBuffer {
16576
 public:
16577
  enum GrowResult {
16578
    OK = 0,
16579
    FailedMaxInclExceeded = 1,
16580
    FailedOutOfMemory = 2,
16581
  };
16582
16583
  // m_buf holds the dynamically sized byte array and its read/write indexes:
16584
  //  - m_buf.meta.wi  is roughly analogous to a Go slice's length.
16585
  //  - m_buf.data.len is roughly analogous to a Go slice's capacity. It is
16586
  //    also equal to the m_buf.data.ptr malloc/realloc size.
16587
  //
16588
  // Users should not modify the m_buf.data.ptr or m_buf.data.len fields (as
16589
  // they are conceptually private to this class), but they can modify the
16590
  // bytes referenced by that pointer-length pair (e.g. compactions).
16591
  IOBuffer m_buf;
16592
16593
  // m_max_incl is an inclusive upper bound on the backing array size.
16594
  const uint64_t m_max_incl;
16595
16596
  // Constructor and destructor.
16597
  explicit DynIOBuffer(uint64_t max_incl);
16598
  ~DynIOBuffer();
16599
16600
  // Drop frees the byte array and resets m_buf. The DynIOBuffer can still be
16601
  // used after a drop call. It just restarts from zero.
16602
  void drop();
16603
16604
  // grow ensures that the byte array size is at least min_incl and at most
16605
  // max_incl. It returns FailedMaxInclExceeded if that would require
16606
  // allocating more than max_incl bytes, including the case where (min_incl >
16607
  // max_incl). It returns FailedOutOfMemory if memory allocation failed.
16608
  GrowResult grow(uint64_t min_incl);
16609
16610
 private:
16611
  // Delete the copy and assign constructors.
16612
  DynIOBuffer(const DynIOBuffer&) = delete;
16613
  DynIOBuffer& operator=(const DynIOBuffer&) = delete;
16614
16615
  static uint64_t round_up(uint64_t min_incl, uint64_t max_incl);
16616
};
16617
16618
// --------
16619
16620
class Input {
16621
 public:
16622
  virtual ~Input();
16623
16624
  virtual IOBuffer* BringsItsOwnIOBuffer();
16625
  virtual std::string CopyIn(IOBuffer* dst) = 0;
16626
};
16627
16628
// --------
16629
16630
// FileInput is an Input that reads from a file source.
16631
//
16632
// It does not take responsibility for closing the file when done.
16633
class FileInput : public Input {
16634
 public:
16635
  FileInput(FILE* f);
16636
16637
  virtual std::string CopyIn(IOBuffer* dst);
16638
16639
 private:
16640
  FILE* m_f;
16641
16642
  // Delete the copy and assign constructors.
16643
  FileInput(const FileInput&) = delete;
16644
  FileInput& operator=(const FileInput&) = delete;
16645
};
16646
16647
// --------
16648
16649
// MemoryInput is an Input that reads from an in-memory source.
16650
//
16651
// It does not take responsibility for freeing the memory when done.
16652
class MemoryInput : public Input {
16653
 public:
16654
  MemoryInput(const char* ptr, size_t len);
16655
  MemoryInput(const uint8_t* ptr, size_t len);
16656
16657
  virtual IOBuffer* BringsItsOwnIOBuffer();
16658
  virtual std::string CopyIn(IOBuffer* dst);
16659
16660
 private:
16661
  IOBuffer m_io;
16662
16663
  // Delete the copy and assign constructors.
16664
  MemoryInput(const MemoryInput&) = delete;
16665
  MemoryInput& operator=(const MemoryInput&) = delete;
16666
};
16667
16668
// --------
16669
16670
}  // namespace sync_io
16671
16672
}  // namespace wuffs_aux
16673
16674
// ---------------- Auxiliary - CBOR
16675
16676
namespace wuffs_aux {
16677
16678
struct DecodeCborResult {
16679
  DecodeCborResult(std::string&& error_message0, uint64_t cursor_position0);
16680
16681
  std::string error_message;
16682
  uint64_t cursor_position;
16683
};
16684
16685
class DecodeCborCallbacks {
16686
 public:
16687
  virtual ~DecodeCborCallbacks();
16688
16689
  // AppendXxx are called for leaf nodes: literals, numbers, strings, etc.
16690
16691
  virtual std::string AppendNull() = 0;
16692
  virtual std::string AppendUndefined() = 0;
16693
  virtual std::string AppendBool(bool val) = 0;
16694
  virtual std::string AppendF64(double val) = 0;
16695
  virtual std::string AppendI64(int64_t val) = 0;
16696
  virtual std::string AppendU64(uint64_t val) = 0;
16697
  virtual std::string AppendByteString(std::string&& val) = 0;
16698
  virtual std::string AppendTextString(std::string&& val) = 0;
16699
  virtual std::string AppendMinus1MinusX(uint64_t val) = 0;
16700
  virtual std::string AppendCborSimpleValue(uint8_t val) = 0;
16701
  virtual std::string AppendCborTag(uint64_t val) = 0;
16702
16703
  // Push and Pop are called for container nodes: CBOR arrays (lists) and CBOR
16704
  // maps (dictionaries).
16705
  //
16706
  // The flags bits combine exactly one of:
16707
  //  - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_NONE
16708
  //  - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_LIST
16709
  //  - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_DICT
16710
  // and exactly one of:
16711
  //  - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_NONE
16712
  //  - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_LIST
16713
  //  - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_DICT
16714
16715
  virtual std::string Push(uint32_t flags) = 0;
16716
  virtual std::string Pop(uint32_t flags) = 0;
16717
16718
  // Done is always the last Callback method called by DecodeCbor, whether or
16719
  // not parsing the input as CBOR encountered an error. Even when successful,
16720
  // trailing data may remain in input and buffer.
16721
  //
16722
  // Do not keep a reference to buffer or buffer.data.ptr after Done returns,
16723
  // as DecodeCbor may then de-allocate the backing array.
16724
  //
16725
  // The default Done implementation is a no-op.
16726
  virtual void  //
16727
  Done(DecodeCborResult& result, sync_io::Input& input, IOBuffer& buffer);
16728
};
16729
16730
// The FooArgBar types add structure to Foo's optional arguments. They wrap
16731
// inner representations for several reasons:
16732
//  - It provides a home for the DefaultValue static method, for Foo callers
16733
//    that want to override some but not all optional arguments.
16734
//  - It provides the "Bar" name at Foo call sites, which can help self-
16735
//    document Foo calls with many arguemnts.
16736
//  - It provides some type safety against accidentally transposing or omitting
16737
//    adjacent fundamentally-numeric-typed optional arguments.
16738
16739
// DecodeCborArgQuirks wraps an optional argument to DecodeCbor.
16740
struct DecodeCborArgQuirks {
16741
  explicit DecodeCborArgQuirks(const QuirkKeyValuePair* ptr0,
16742
                               const size_t len0);
16743
16744
  // DefaultValue returns an empty slice.
16745
  static DecodeCborArgQuirks DefaultValue();
16746
16747
  const QuirkKeyValuePair* ptr;
16748
  const size_t len;
16749
};
16750
16751
// DecodeCbor calls callbacks based on the CBOR-formatted data in input.
16752
//
16753
// On success, the returned error_message is empty and cursor_position counts
16754
// the number of bytes consumed. On failure, error_message is non-empty and
16755
// cursor_position is the location of the error. That error may be a content
16756
// error (invalid CBOR) or an input error (e.g. network failure).
16757
DecodeCborResult  //
16758
DecodeCbor(DecodeCborCallbacks& callbacks,
16759
           sync_io::Input& input,
16760
           DecodeCborArgQuirks quirks = DecodeCborArgQuirks::DefaultValue());
16761
16762
}  // namespace wuffs_aux
16763
16764
// ---------------- Auxiliary - Image
16765
16766
namespace wuffs_aux {
16767
16768
struct DecodeImageResult {
16769
  DecodeImageResult(MemOwner&& pixbuf_mem_owner0,
16770
                    wuffs_base__pixel_buffer pixbuf0,
16771
                    std::string&& error_message0);
16772
  DecodeImageResult(std::string&& error_message0);
16773
16774
  MemOwner pixbuf_mem_owner;
16775
  wuffs_base__pixel_buffer pixbuf;
16776
  std::string error_message;
16777
};
16778
16779
// DecodeImageCallbacks are the callbacks given to DecodeImage. They are always
16780
// called in this order:
16781
//  1. SelectDecoder
16782
//  2. HandleMetadata
16783
//  3. SelectPixfmt
16784
//  4. AllocPixbuf
16785
//  5. AllocWorkbuf
16786
//  6. Done
16787
//
16788
// It may return early - the third callback might not be invoked if the second
16789
// one fails - but the final callback (Done) is always invoked.
16790
class DecodeImageCallbacks {
16791
 public:
16792
  // AllocPixbufResult holds a memory allocation (the result of malloc or new,
16793
  // a statically allocated pointer, etc), or an error message. The memory is
16794
  // de-allocated when mem_owner goes out of scope and is destroyed.
16795
  struct AllocPixbufResult {
16796
    AllocPixbufResult(MemOwner&& mem_owner0, wuffs_base__pixel_buffer pixbuf0);
16797
    AllocPixbufResult(std::string&& error_message0);
16798
16799
    MemOwner mem_owner;
16800
    wuffs_base__pixel_buffer pixbuf;
16801
    std::string error_message;
16802
  };
16803
16804
  // AllocWorkbufResult holds a memory allocation (the result of malloc or new,
16805
  // a statically allocated pointer, etc), or an error message. The memory is
16806
  // de-allocated when mem_owner goes out of scope and is destroyed.
16807
  struct AllocWorkbufResult {
16808
    AllocWorkbufResult(MemOwner&& mem_owner0, wuffs_base__slice_u8 workbuf0);
16809
    AllocWorkbufResult(std::string&& error_message0);
16810
16811
    MemOwner mem_owner;
16812
    wuffs_base__slice_u8 workbuf;
16813
    std::string error_message;
16814
  };
16815
16816
  virtual ~DecodeImageCallbacks();
16817
16818
  // SelectDecoder returns the image decoder for the input data's file format.
16819
  // Returning a nullptr means failure (DecodeImage_UnsupportedImageFormat).
16820
  //
16821
  // Common formats will have a FourCC value in the range [1 ..= 0x7FFF_FFFF],
16822
  // such as WUFFS_BASE__FOURCC__JPEG. A zero FourCC value means that Wuffs'
16823
  // standard library did not recognize the image format but if SelectDecoder
16824
  // was overridden, it may examine the input data's starting bytes and still
16825
  // provide its own image decoder, e.g. for an exotic image file format that's
16826
  // not in Wuffs' standard library. The prefix_etc fields have the same
16827
  // meaning as wuffs_base__magic_number_guess_fourcc arguments. SelectDecoder
16828
  // implementations should not modify prefix_data's contents.
16829
  //
16830
  // SelectDecoder might be called more than once, since some image file
16831
  // formats can wrap others. For example, a nominal BMP file can actually
16832
  // contain a JPEG or a PNG.
16833
  //
16834
  // The default SelectDecoder accepts the FOURCC codes listed below. For
16835
  // modular builds (i.e. when #define'ing WUFFS_CONFIG__MODULES), acceptance
16836
  // of the FOO file format is optional (for each value of FOO) and depends on
16837
  // the corresponding module to be enabled at compile time (i.e. #define'ing
16838
  // WUFFS_CONFIG__MODULE__FOO).
16839
  //
16840
  //  - WUFFS_BASE__FOURCC__BMP
16841
  //  - WUFFS_BASE__FOURCC__ETC2
16842
  //  - WUFFS_BASE__FOURCC__GIF
16843
  //  - WUFFS_BASE__FOURCC__JPEG
16844
  //  - WUFFS_BASE__FOURCC__NIE
16845
  //  - WUFFS_BASE__FOURCC__NPBM
16846
  //  - WUFFS_BASE__FOURCC__PNG
16847
  //  - WUFFS_BASE__FOURCC__QOI
16848
  //  - WUFFS_BASE__FOURCC__TARGA
16849
  //  - WUFFS_BASE__FOURCC__TH
16850
  //  - WUFFS_BASE__FOURCC__WBMP
16851
  //  - WUFFS_BASE__FOURCC__WEBP
16852
  //
16853
  // The FOOBAR in WUFFS_BASE__FOURCC__FOBA is limited to four characters, but
16854
  // the FOOBAR in the corresponding WUFFS_CONFIG__MODULE__FOOBAR macro might
16855
  // be fuller and longer. For example, NPBM / NETPBM or TH / THUMBHASH.
16856
  virtual wuffs_base__image_decoder::unique_ptr  //
16857
  SelectDecoder(uint32_t fourcc,
16858
                wuffs_base__slice_u8 prefix_data,
16859
                bool prefix_closed);
16860
16861
  // HandleMetadata acknowledges image metadata. minfo.flavor will be one of:
16862
  //  - WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA_RAW_PASSTHROUGH
16863
  //  - WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA_PARSED
16864
  // If it is METADATA_RAW_PASSTHROUGH then raw contains the metadata bytes.
16865
  // Those bytes should not be retained beyond the the HandleMetadata call.
16866
  //
16867
  // minfo.metadata__fourcc() will typically match one of the
16868
  // DecodeImageArgFlags bits. For example, if (REPORT_METADATA_CHRM |
16869
  // REPORT_METADATA_GAMA) was passed to DecodeImage then the metadata FourCC
16870
  // will be either WUFFS_BASE__FOURCC__CHRM or WUFFS_BASE__FOURCC__GAMA.
16871
  //
16872
  // It returns an error message, or an empty string on success.
16873
  virtual std::string  //
16874
  HandleMetadata(const wuffs_base__more_information& minfo,
16875
                 wuffs_base__slice_u8 raw);
16876
16877
  // SelectPixfmt returns the destination pixel format for AllocPixbuf. It
16878
  // should return wuffs_base__make_pixel_format(etc) called with one of:
16879
  //  - WUFFS_BASE__PIXEL_FORMAT__Y
16880
  //  - WUFFS_BASE__PIXEL_FORMAT__BGR_565
16881
  //  - WUFFS_BASE__PIXEL_FORMAT__BGR
16882
  //  - WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL
16883
  //  - WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE
16884
  //  - WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL
16885
  //  - WUFFS_BASE__PIXEL_FORMAT__RGB
16886
  //  - WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL
16887
  //  - WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL
16888
  // or return image_config.pixcfg.pixel_format(). The latter means to use the
16889
  // image file's natural pixel format. For example, GIF images' natural pixel
16890
  // format is an indexed one.
16891
  //
16892
  // Returning otherwise means failure (DecodeImage_UnsupportedPixelFormat).
16893
  //
16894
  // The default SelectPixfmt implementation returns
16895
  // wuffs_base__make_pixel_format(WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL) which
16896
  // is 4 bytes per pixel (8 bits per channel ร— 4 channels).
16897
  virtual wuffs_base__pixel_format  //
16898
  SelectPixfmt(const wuffs_base__image_config& image_config);
16899
16900
  // AllocPixbuf allocates the pixel buffer.
16901
  //
16902
  // allow_uninitialized_memory will be true if a valid background_color was
16903
  // passed to DecodeImage, since the pixel buffer's contents will be
16904
  // overwritten with that color after AllocPixbuf returns.
16905
  //
16906
  // The default AllocPixbuf implementation allocates either uninitialized or
16907
  // zeroed memory. Zeroed memory typically corresponds to filling with opaque
16908
  // black or transparent black, depending on the pixel format.
16909
  virtual AllocPixbufResult  //
16910
  AllocPixbuf(const wuffs_base__image_config& image_config,
16911
              bool allow_uninitialized_memory);
16912
16913
  // AllocWorkbuf allocates the work buffer. The allocated buffer's length
16914
  // should be at least len_range.min_incl, but larger allocations (up to
16915
  // len_range.max_incl) may have better performance (by using more memory).
16916
  //
16917
  // The default AllocWorkbuf implementation allocates len_range.max_incl bytes
16918
  // of either uninitialized or zeroed memory.
16919
  virtual AllocWorkbufResult  //
16920
  AllocWorkbuf(wuffs_base__range_ii_u64 len_range,
16921
               bool allow_uninitialized_memory);
16922
16923
  // Done is always the last Callback method called by DecodeImage, whether or
16924
  // not parsing the input encountered an error. Even when successful, trailing
16925
  // data may remain in input and buffer.
16926
  //
16927
  // The image_decoder is the one returned by SelectDecoder (if SelectDecoder
16928
  // was successful), or a no-op unique_ptr otherwise. Like any unique_ptr,
16929
  // ownership moves to the Done implementation.
16930
  //
16931
  // Do not keep a reference to buffer or buffer.data.ptr after Done returns,
16932
  // as DecodeImage may then de-allocate the backing array.
16933
  //
16934
  // The default Done implementation is a no-op, other than running the
16935
  // image_decoder unique_ptr destructor.
16936
  virtual void  //
16937
  Done(DecodeImageResult& result,
16938
       sync_io::Input& input,
16939
       IOBuffer& buffer,
16940
       wuffs_base__image_decoder::unique_ptr image_decoder);
16941
};
16942
16943
extern const char DecodeImage_BufferIsTooShort[];
16944
extern const char DecodeImage_MaxInclDimensionExceeded[];
16945
extern const char DecodeImage_MaxInclMetadataLengthExceeded[];
16946
extern const char DecodeImage_OutOfMemory[];
16947
extern const char DecodeImage_UnexpectedEndOfFile[];
16948
extern const char DecodeImage_UnsupportedImageFormat[];
16949
extern const char DecodeImage_UnsupportedMetadata[];
16950
extern const char DecodeImage_UnsupportedPixelBlend[];
16951
extern const char DecodeImage_UnsupportedPixelConfiguration[];
16952
extern const char DecodeImage_UnsupportedPixelFormat[];
16953
16954
// The FooArgBar types add structure to Foo's optional arguments. They wrap
16955
// inner representations for several reasons:
16956
//  - It provides a home for the DefaultValue static method, for Foo callers
16957
//    that want to override some but not all optional arguments.
16958
//  - It provides the "Bar" name at Foo call sites, which can help self-
16959
//    document Foo calls with many arguemnts.
16960
//  - It provides some type safety against accidentally transposing or omitting
16961
//    adjacent fundamentally-numeric-typed optional arguments.
16962
16963
// DecodeImageArgQuirks wraps an optional argument to DecodeImage.
16964
struct DecodeImageArgQuirks {
16965
  explicit DecodeImageArgQuirks(const QuirkKeyValuePair* ptr0,
16966
                                const size_t len0);
16967
16968
  // DefaultValue returns an empty slice.
16969
  static DecodeImageArgQuirks DefaultValue();
16970
16971
  const QuirkKeyValuePair* ptr;
16972
  const size_t len;
16973
};
16974
16975
// DecodeImageArgFlags wraps an optional argument to DecodeImage.
16976
struct DecodeImageArgFlags {
16977
  explicit DecodeImageArgFlags(uint64_t repr0);
16978
16979
  // DefaultValue returns 0.
16980
  static DecodeImageArgFlags DefaultValue();
16981
16982
  // TODO: support all of the REPORT_METADATA_FOO flags, not just CHRM, EXIF,
16983
  // GAMA, ICCP, KVP, SRGB and XMP.
16984
16985
  // Background Color.
16986
  static constexpr uint64_t REPORT_METADATA_BGCL = 0x0001;
16987
  // Primary Chromaticities and White Point.
16988
  static constexpr uint64_t REPORT_METADATA_CHRM = 0x0002;
16989
  // Exchangeable Image File Format.
16990
  static constexpr uint64_t REPORT_METADATA_EXIF = 0x0004;
16991
  // Gamma Correction.
16992
  static constexpr uint64_t REPORT_METADATA_GAMA = 0x0008;
16993
  // International Color Consortium Profile.
16994
  static constexpr uint64_t REPORT_METADATA_ICCP = 0x0010;
16995
  // Key-Value Pair.
16996
  //
16997
  // For PNG files, this includes iTXt, tEXt and zTXt chunks. In the
16998
  // HandleMetadata callback, the raw argument contains UTF-8 strings.
16999
  static constexpr uint64_t REPORT_METADATA_KVP = 0x0020;
17000
  // Modification Time.
17001
  static constexpr uint64_t REPORT_METADATA_MTIM = 0x0040;
17002
  // Offset (2-Dimensional).
17003
  static constexpr uint64_t REPORT_METADATA_OFS2 = 0x0080;
17004
  // Physical Dimensions.
17005
  static constexpr uint64_t REPORT_METADATA_PHYD = 0x0100;
17006
  // Standard Red Green Blue (Rendering Intent).
17007
  static constexpr uint64_t REPORT_METADATA_SRGB = 0x0200;
17008
  // Extensible Metadata Platform.
17009
  static constexpr uint64_t REPORT_METADATA_XMP = 0x0400;
17010
17011
  uint64_t repr;
17012
};
17013
17014
// DecodeImageArgPixelBlend wraps an optional argument to DecodeImage.
17015
struct DecodeImageArgPixelBlend {
17016
  explicit DecodeImageArgPixelBlend(wuffs_base__pixel_blend repr0);
17017
17018
  // DefaultValue returns WUFFS_BASE__PIXEL_BLEND__SRC.
17019
  static DecodeImageArgPixelBlend DefaultValue();
17020
17021
  wuffs_base__pixel_blend repr;
17022
};
17023
17024
// DecodeImageArgBackgroundColor wraps an optional argument to DecodeImage.
17025
struct DecodeImageArgBackgroundColor {
17026
  explicit DecodeImageArgBackgroundColor(
17027
      wuffs_base__color_u32_argb_premul repr0);
17028
17029
  // DefaultValue returns 1, an invalid wuffs_base__color_u32_argb_premul.
17030
  static DecodeImageArgBackgroundColor DefaultValue();
17031
17032
  wuffs_base__color_u32_argb_premul repr;
17033
};
17034
17035
// DecodeImageArgMaxInclDimension wraps an optional argument to DecodeImage.
17036
struct DecodeImageArgMaxInclDimension {
17037
  explicit DecodeImageArgMaxInclDimension(uint32_t repr0);
17038
17039
  // DefaultValue returns 1048575 = 0x000F_FFFF, more than 1 million pixels.
17040
  static DecodeImageArgMaxInclDimension DefaultValue();
17041
17042
  uint32_t repr;
17043
};
17044
17045
// DecodeImageArgMaxInclMetadataLength wraps an optional argument to
17046
// DecodeImage.
17047
struct DecodeImageArgMaxInclMetadataLength {
17048
  explicit DecodeImageArgMaxInclMetadataLength(uint64_t repr0);
17049
17050
  // DefaultValue returns 16777215 = 0x00FF_FFFF, one less than 16 MiB.
17051
  static DecodeImageArgMaxInclMetadataLength DefaultValue();
17052
17053
  uint64_t repr;
17054
};
17055
17056
// DecodeImage decodes the image data in input. A variety of image file formats
17057
// can be decoded, depending on what callbacks.SelectDecoder returns.
17058
//
17059
// For animated formats, only the first frame is returned, since the API is
17060
// simpler for synchronous I/O and having DecodeImage only return when
17061
// completely done, but rendering animation often involves handling other
17062
// events in between animation frames. To decode multiple frames of animated
17063
// images, or for asynchronous I/O (e.g. when decoding an image streamed over
17064
// the network), use Wuffs' lower level C API instead of its higher level,
17065
// simplified C++ API (the wuffs_aux API).
17066
//
17067
// The DecodeImageResult's fields depend on whether decoding succeeded:
17068
//  - On total success, the error_message is empty and pixbuf.pixcfg.is_valid()
17069
//    is true.
17070
//  - On partial success (e.g. the input file was truncated but we are still
17071
//    able to decode some of the pixels), error_message is non-empty but
17072
//    pixbuf.pixcfg.is_valid() is still true. It is up to the caller whether to
17073
//    accept or reject partial success.
17074
//  - On failure, the error_message is non_empty and pixbuf.pixcfg.is_valid()
17075
//    is false.
17076
//
17077
// The callbacks allocate the pixel buffer memory and work buffer memory. On
17078
// success, pixel buffer memory ownership is passed to the DecodeImage caller
17079
// as the returned pixbuf_mem_owner. Regardless of success or failure, the work
17080
// buffer memory is deleted.
17081
//
17082
// The pixel_blend (one of the constants listed below) determines how to
17083
// composite the decoded image over the pixel buffer's original pixels (as
17084
// returned by callbacks.AllocPixbuf):
17085
//  - WUFFS_BASE__PIXEL_BLEND__SRC
17086
//  - WUFFS_BASE__PIXEL_BLEND__SRC_OVER
17087
//
17088
// The background_color is used to fill the pixel buffer after
17089
// callbacks.AllocPixbuf returns, if it is valid in the
17090
// wuffs_base__color_u32_argb_premul__is_valid sense. The default value,
17091
// 0x0000_0001, is not valid since its Blue channel value (0x01) is greater
17092
// than its Alpha channel value (0x00). A valid background_color will typically
17093
// be overwritten when pixel_blend is WUFFS_BASE__PIXEL_BLEND__SRC, but might
17094
// still be visible on partial (not total) success or when pixel_blend is
17095
// WUFFS_BASE__PIXEL_BLEND__SRC_OVER and the decoded image is not fully opaque.
17096
//
17097
// Decoding fails (with DecodeImage_MaxInclDimensionExceeded) if the image's
17098
// width or height is greater than max_incl_dimension or if any opted-in (via
17099
// flags bits) metadata is longer than max_incl_metadata_length.
17100
DecodeImageResult  //
17101
DecodeImage(DecodeImageCallbacks& callbacks,
17102
            sync_io::Input& input,
17103
            DecodeImageArgQuirks quirks = DecodeImageArgQuirks::DefaultValue(),
17104
            DecodeImageArgFlags flags = DecodeImageArgFlags::DefaultValue(),
17105
            DecodeImageArgPixelBlend pixel_blend =
17106
                DecodeImageArgPixelBlend::DefaultValue(),
17107
            DecodeImageArgBackgroundColor background_color =
17108
                DecodeImageArgBackgroundColor::DefaultValue(),
17109
            DecodeImageArgMaxInclDimension max_incl_dimension =
17110
                DecodeImageArgMaxInclDimension::DefaultValue(),
17111
            DecodeImageArgMaxInclMetadataLength max_incl_metadata_length =
17112
                DecodeImageArgMaxInclMetadataLength::DefaultValue());
17113
17114
}  // namespace wuffs_aux
17115
17116
// ---------------- Auxiliary - JSON
17117
17118
namespace wuffs_aux {
17119
17120
struct DecodeJsonResult {
17121
  DecodeJsonResult(std::string&& error_message0, uint64_t cursor_position0);
17122
17123
  std::string error_message;
17124
  uint64_t cursor_position;
17125
};
17126
17127
class DecodeJsonCallbacks {
17128
 public:
17129
  virtual ~DecodeJsonCallbacks();
17130
17131
  // AppendXxx are called for leaf nodes: literals, numbers and strings. For
17132
  // strings, the Callbacks implementation is responsible for tracking map keys
17133
  // versus other values.
17134
17135
  virtual std::string AppendNull() = 0;
17136
  virtual std::string AppendBool(bool val) = 0;
17137
  virtual std::string AppendF64(double val) = 0;
17138
  virtual std::string AppendI64(int64_t val) = 0;
17139
  virtual std::string AppendTextString(std::string&& val) = 0;
17140
17141
  // Push and Pop are called for container nodes: JSON arrays (lists) and JSON
17142
  // objects (dictionaries).
17143
  //
17144
  // The flags bits combine exactly one of:
17145
  //  - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_NONE
17146
  //  - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_LIST
17147
  //  - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_DICT
17148
  // and exactly one of:
17149
  //  - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_NONE
17150
  //  - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_LIST
17151
  //  - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_DICT
17152
17153
  virtual std::string Push(uint32_t flags) = 0;
17154
  virtual std::string Pop(uint32_t flags) = 0;
17155
17156
  // Done is always the last Callback method called by DecodeJson, whether or
17157
  // not parsing the input as JSON encountered an error. Even when successful,
17158
  // trailing data may remain in input and buffer. See "Unintuitive JSON
17159
  // Parsing" (https://nullprogram.com/blog/2019/12/28/) which discusses JSON
17160
  // parsing and when it stops.
17161
  //
17162
  // Do not keep a reference to buffer or buffer.data.ptr after Done returns,
17163
  // as DecodeJson may then de-allocate the backing array.
17164
  //
17165
  // The default Done implementation is a no-op.
17166
  virtual void  //
17167
  Done(DecodeJsonResult& result, sync_io::Input& input, IOBuffer& buffer);
17168
};
17169
17170
extern const char DecodeJson_BadJsonPointer[];
17171
extern const char DecodeJson_NoMatch[];
17172
17173
// The FooArgBar types add structure to Foo's optional arguments. They wrap
17174
// inner representations for several reasons:
17175
//  - It provides a home for the DefaultValue static method, for Foo callers
17176
//    that want to override some but not all optional arguments.
17177
//  - It provides the "Bar" name at Foo call sites, which can help self-
17178
//    document Foo calls with many arguemnts.
17179
//  - It provides some type safety against accidentally transposing or omitting
17180
//    adjacent fundamentally-numeric-typed optional arguments.
17181
17182
// DecodeJsonArgQuirks wraps an optional argument to DecodeJson.
17183
struct DecodeJsonArgQuirks {
17184
  explicit DecodeJsonArgQuirks(const QuirkKeyValuePair* ptr0,
17185
                               const size_t len0);
17186
17187
  // DefaultValue returns an empty slice.
17188
  static DecodeJsonArgQuirks DefaultValue();
17189
17190
  const QuirkKeyValuePair* ptr;
17191
  const size_t len;
17192
};
17193
17194
// DecodeJsonArgJsonPointer wraps an optional argument to DecodeJson.
17195
struct DecodeJsonArgJsonPointer {
17196
  explicit DecodeJsonArgJsonPointer(std::string repr0);
17197
17198
  // DefaultValue returns an empty string.
17199
  static DecodeJsonArgJsonPointer DefaultValue();
17200
17201
  std::string repr;
17202
};
17203
17204
// DecodeJson calls callbacks based on the JSON-formatted data in input.
17205
//
17206
// On success, the returned error_message is empty and cursor_position counts
17207
// the number of bytes consumed. On failure, error_message is non-empty and
17208
// cursor_position is the location of the error. That error may be a content
17209
// error (invalid JSON) or an input error (e.g. network failure).
17210
//
17211
// json_pointer is a query in the JSON Pointer (RFC 6901) syntax. The callbacks
17212
// run for the input's sub-node that matches the query. DecodeJson_NoMatch is
17213
// returned if no matching sub-node was found. The empty query matches the
17214
// input's root node, consistent with JSON Pointer semantics.
17215
//
17216
// The JSON Pointer implementation is greedy: duplicate keys are not rejected
17217
// but only the first match for each '/'-separated fragment is followed.
17218
DecodeJsonResult  //
17219
DecodeJson(DecodeJsonCallbacks& callbacks,
17220
           sync_io::Input& input,
17221
           DecodeJsonArgQuirks quirks = DecodeJsonArgQuirks::DefaultValue(),
17222
           DecodeJsonArgJsonPointer json_pointer =
17223
               DecodeJsonArgJsonPointer::DefaultValue());
17224
17225
}  // namespace wuffs_aux
17226
17227
#endif  // defined(__cplusplus) && defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
17228
17229
// ---------------- Wuffs' reimplementation of the STB API.
17230
//
17231
// This is a drop-in replacement of that third-party library.
17232
//
17233
// Disabled by default, unless you #define the
17234
// WUFFS_CONFIG__ENABLE_DROP_IN_REPLACEMENT__STB macro beforehand.
17235
//
17236
// For API docs, see https://github.com/nothings/stb
17237
17238
#if defined(WUFFS_CONFIG__ENABLE_DROP_IN_REPLACEMENT__STB)
17239
17240
#ifdef __cplusplus
17241
extern "C" {
17242
#endif
17243
17244
#if defined(WUFFS_CONFIG__STATIC_FUNCTIONS) || defined(STB_IMAGE_STATIC)
17245
#define WUFFS_DROP_IN__STB__MAYBE_STATIC static
17246
#else
17247
#define WUFFS_DROP_IN__STB__MAYBE_STATIC
17248
#endif
17249
17250
enum {
17251
  STBI_default = 0,
17252
  STBI_grey = 1,
17253
  STBI_grey_alpha = 2,
17254
  STBI_rgb = 3,
17255
  STBI_rgb_alpha = 4
17256
};
17257
17258
typedef unsigned char stbi_uc;
17259
typedef unsigned short stbi_us;
17260
17261
typedef struct {
17262
  int (*read)(void* user, char* data, int size);
17263
  void (*skip)(void* user, int n);
17264
  int (*eof)(void* user);
17265
} stbi_io_callbacks;
17266
17267
// --------
17268
17269
WUFFS_DROP_IN__STB__MAYBE_STATIC int  //
17270
stbi_info_from_memory(                //
17271
    stbi_uc const* buffer,            //
17272
    int len,                          //
17273
    int* x,                           //
17274
    int* y,                           //
17275
    int* comp);
17276
17277
WUFFS_DROP_IN__STB__MAYBE_STATIC stbi_uc*  //
17278
stbi_load_from_memory(                     //
17279
    stbi_uc const* buffer,                 //
17280
    int len,                               //
17281
    int* x,                                //
17282
    int* y,                                //
17283
    int* channels_in_file,                 //
17284
    int desired_channels);
17285
17286
WUFFS_DROP_IN__STB__MAYBE_STATIC int  //
17287
stbi_info_from_callbacks(             //
17288
    stbi_io_callbacks const* clbk,    //
17289
    void* user,                       //
17290
    int* x,                           //
17291
    int* y,                           //
17292
    int* comp);
17293
17294
WUFFS_DROP_IN__STB__MAYBE_STATIC stbi_uc*  //
17295
stbi_load_from_callbacks(                  //
17296
    stbi_io_callbacks const* clbk,         //
17297
    void* user,                            //
17298
    int* x,                                //
17299
    int* y,                                //
17300
    int* channels_in_file,                 //
17301
    int desired_channels);
17302
17303
// --------
17304
17305
#if !defined(STBI_NO_STDIO)
17306
17307
WUFFS_DROP_IN__STB__MAYBE_STATIC int  //
17308
stbi_info(                            //
17309
    char const* filename,             //
17310
    int* x,                           //
17311
    int* y,                           //
17312
    int* comp);
17313
17314
WUFFS_DROP_IN__STB__MAYBE_STATIC stbi_uc*  //
17315
stbi_load(                                 //
17316
    char const* filename,                  //
17317
    int* x,                                //
17318
    int* y,                                //
17319
    int* channels_in_file,                 //
17320
    int desired_channels);
17321
17322
WUFFS_DROP_IN__STB__MAYBE_STATIC int  //
17323
stbi_info_from_file(                  //
17324
    FILE* f,                          //
17325
    int* x,                           //
17326
    int* y,                           //
17327
    int* comp);
17328
17329
WUFFS_DROP_IN__STB__MAYBE_STATIC stbi_uc*  //
17330
stbi_load_from_file(                       //
17331
    FILE* f,                               //
17332
    int* x,                                //
17333
    int* y,                                //
17334
    int* channels_in_file,                 //
17335
    int desired_channels);
17336
17337
#endif  // !defined(STBI_NO_STDIO)
17338
17339
// --------
17340
17341
WUFFS_DROP_IN__STB__MAYBE_STATIC void  //
17342
stbi_image_free(                       //
17343
    void* retval_from_stbi_load);
17344
17345
WUFFS_DROP_IN__STB__MAYBE_STATIC const char*  //
17346
stbi_failure_reason(void);
17347
17348
#ifdef __cplusplus
17349
}
17350
#endif
17351
17352
#endif  // defined (WUFFS_CONFIG__ENABLE_DROP_IN_REPLACEMENT__STB)
17353
17354
// โ€ผ WUFFS C HEADER ENDS HERE.
17355
#ifdef WUFFS_IMPLEMENTATION
17356
17357
#ifdef __cplusplus
17358
extern "C" {
17359
#endif
17360
17361
// ---------------- Fundamentals
17362
17363
// WUFFS_BASE__MAGIC is a magic number to check that initializers are called.
17364
// It's not foolproof, given C doesn't automatically zero memory before use,
17365
// but it should catch 99.99% of cases.
17366
//
17367
// Its (non-zero) value is arbitrary, based on md5sum("wuffs").
17368
340k
#define WUFFS_BASE__MAGIC ((uint32_t)0x3CCB6C71)
17369
17370
// WUFFS_BASE__DISABLED is a magic number to indicate that a non-recoverable
17371
// error was previously encountered.
17372
//
17373
// Its (non-zero) value is arbitrary, based on md5sum("disabled").
17374
13.4k
#define WUFFS_BASE__DISABLED ((uint32_t)0x075AE3D2)
17375
17376
// Use switch cases for coroutine suspension points, similar to the technique
17377
// in https://www.chiark.greenend.org.uk/~sgtatham/coroutines.html
17378
//
17379
// The implicit fallthrough is intentional.
17380
//
17381
// We use trivial macros instead of an explicit assignment and case statement
17382
// so that clang-format doesn't get confused by the unusual "case"s.
17383
110k
#define WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0 case 0:;
17384
#define WUFFS_BASE__COROUTINE_SUSPENSION_POINT(n) \
17385
505k
  coro_susp_point = n;                            \
17386
529k
  case n:;
17387
17388
#define WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(n) \
17389
101k
  if (!status.repr) {                                           \
17390
17.9k
    goto ok;                                                    \
17391
83.4k
  } else if (*status.repr != '$') {                             \
17392
10.7k
    goto exit;                                                  \
17393
10.7k
  }                                                             \
17394
72.7k
  coro_susp_point = n;                                          \
17395
72.7k
  goto suspend;                                                 \
17396
72.7k
  case n:;
17397
17398
// The "defined(__clang__)" isn't redundant. While vanilla clang defines
17399
// __GNUC__, clang-cl (which mimics MSVC's cl.exe) does not.
17400
#if defined(__GNUC__) || defined(__clang__)
17401
114k
#define WUFFS_BASE__LIKELY(expr) (__builtin_expect(!!(expr), 1))
17402
327k
#define WUFFS_BASE__UNLIKELY(expr) (__builtin_expect(!!(expr), 0))
17403
#else
17404
#define WUFFS_BASE__LIKELY(expr) (expr)
17405
#define WUFFS_BASE__UNLIKELY(expr) (expr)
17406
#endif
17407
17408
// --------
17409
17410
static inline wuffs_base__empty_struct  //
17411
23.7k
wuffs_private_impl__ignore_status(wuffs_base__status z) {
17412
23.7k
  return wuffs_base__make_empty_struct();
17413
23.7k
}
17414
17415
static inline wuffs_base__status  //
17416
0
wuffs_private_impl__status__ensure_not_a_suspension(wuffs_base__status z) {
17417
0
  if (z.repr && (*z.repr == '$')) {
17418
0
    z.repr = wuffs_base__error__cannot_return_a_suspension;
17419
0
  }
17420
0
  return z;
17421
0
}
17422
17423
// --------
17424
17425
// wuffs_private_impl__iterate_total_advance returns the exclusive
17426
// pointer-offset at which iteration should stop. The overall slice has length
17427
// total_len, each iteration's sub-slice has length iter_len and are placed
17428
// iter_advance apart.
17429
//
17430
// The iter_advance may not be larger than iter_len. The iter_advance may be
17431
// smaller than iter_len, in which case the sub-slices will overlap.
17432
//
17433
// The return value r satisfies ((0 <= r) && (r <= total_len)).
17434
//
17435
// For example, if total_len = 15, iter_len = 5 and iter_advance = 3, there are
17436
// four iterations at offsets 0, 3, 6 and 9. This function returns 12.
17437
//
17438
// 0123456789012345
17439
// [....]
17440
//    [....]
17441
//       [....]
17442
//          [....]
17443
//             $
17444
// 0123456789012345
17445
//
17446
// For example, if total_len = 15, iter_len = 5 and iter_advance = 5, there are
17447
// three iterations at offsets 0, 5 and 10. This function returns 15.
17448
//
17449
// 0123456789012345
17450
// [....]
17451
//      [....]
17452
//           [....]
17453
//                $
17454
// 0123456789012345
17455
static inline size_t  //
17456
wuffs_private_impl__iterate_total_advance(size_t total_len,
17457
                                          size_t iter_len,
17458
11.4k
                                          size_t iter_advance) {
17459
11.4k
  if (total_len >= iter_len) {
17460
2.88k
    size_t n = total_len - iter_len;
17461
2.88k
    return ((n / iter_advance) * iter_advance) + iter_advance;
17462
2.88k
  }
17463
8.54k
  return 0;
17464
11.4k
}
17465
17466
// ---------------- Numeric Types
17467
17468
extern const uint8_t wuffs_private_impl__low_bits_mask__u8[8];
17469
extern const uint16_t wuffs_private_impl__low_bits_mask__u16[16];
17470
extern const uint32_t wuffs_private_impl__low_bits_mask__u32[32];
17471
extern const uint64_t wuffs_private_impl__low_bits_mask__u64[64];
17472
17473
#define WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U8(n) \
17474
  (wuffs_private_impl__low_bits_mask__u8[n])
17475
#define WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U16(n) \
17476
  (wuffs_private_impl__low_bits_mask__u16[n])
17477
#define WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(n) \
17478
212k
  (wuffs_private_impl__low_bits_mask__u32[n])
17479
#define WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U64(n) \
17480
8.45M
  (wuffs_private_impl__low_bits_mask__u64[n])
17481
17482
// --------
17483
17484
static inline void  //
17485
0
wuffs_private_impl__u8__sat_add_indirect(uint8_t* x, uint8_t y) {
17486
0
  *x = wuffs_base__u8__sat_add(*x, y);
17487
0
}
17488
17489
static inline void  //
17490
0
wuffs_private_impl__u8__sat_sub_indirect(uint8_t* x, uint8_t y) {
17491
0
  *x = wuffs_base__u8__sat_sub(*x, y);
17492
0
}
17493
17494
static inline void  //
17495
0
wuffs_private_impl__u16__sat_add_indirect(uint16_t* x, uint16_t y) {
17496
0
  *x = wuffs_base__u16__sat_add(*x, y);
17497
0
}
17498
17499
static inline void  //
17500
0
wuffs_private_impl__u16__sat_sub_indirect(uint16_t* x, uint16_t y) {
17501
0
  *x = wuffs_base__u16__sat_sub(*x, y);
17502
0
}
17503
17504
static inline void  //
17505
9.39k
wuffs_private_impl__u32__sat_add_indirect(uint32_t* x, uint32_t y) {
17506
9.39k
  *x = wuffs_base__u32__sat_add(*x, y);
17507
9.39k
}
17508
17509
static inline void  //
17510
21.3k
wuffs_private_impl__u32__sat_sub_indirect(uint32_t* x, uint32_t y) {
17511
21.3k
  *x = wuffs_base__u32__sat_sub(*x, y);
17512
21.3k
}
17513
17514
static inline void  //
17515
37.7k
wuffs_private_impl__u64__sat_add_indirect(uint64_t* x, uint64_t y) {
17516
37.7k
  *x = wuffs_base__u64__sat_add(*x, y);
17517
37.7k
}
17518
17519
static inline void  //
17520
0
wuffs_private_impl__u64__sat_sub_indirect(uint64_t* x, uint64_t y) {
17521
0
  *x = wuffs_base__u64__sat_sub(*x, y);
17522
0
}
17523
17524
// ---------------- Numeric Types (Utility)
17525
17526
#define wuffs_base__utility__i64_divide(a, b) \
17527
  ((uint64_t)(((int64_t)(a)) / ((int64_t)(b))))
17528
17529
#define wuffs_base__utility__sign_extend_convert_u8_u32(a) \
17530
  ((uint32_t)(int32_t)(int8_t)(a))
17531
17532
#define wuffs_base__utility__sign_extend_convert_u8_u64(a) \
17533
  ((uint64_t)(int64_t)(int8_t)(a))
17534
17535
#define wuffs_base__utility__sign_extend_convert_u16_u32(a) \
17536
  ((uint32_t)(int32_t)(int16_t)(a))
17537
17538
#define wuffs_base__utility__sign_extend_convert_u16_u64(a) \
17539
  ((uint64_t)(int64_t)(int16_t)(a))
17540
17541
#define wuffs_base__utility__sign_extend_convert_u32_u64(a) \
17542
  ((uint64_t)(int64_t)(int32_t)(a))
17543
17544
#define wuffs_base__utility__sign_extend_rshift_u32(a, n) \
17545
  ((uint32_t)(((int32_t)(a)) >> (n)))
17546
17547
#define wuffs_base__utility__sign_extend_rshift_u64(a, n) \
17548
  ((uint64_t)(((int64_t)(a)) >> (n)))
17549
17550
#define wuffs_base__utility__make_bitvec256(e00, e01, e02, e03) \
17551
0
  wuffs_base__make_bitvec256(e00, e01, e02, e03)
17552
17553
#define wuffs_base__utility__make_optional_u63(h, v) \
17554
0
  wuffs_base__make_optional_u63(h, v)
17555
17556
// ---------------- Slices and Tables
17557
17558
// This function basically returns (ptr + len), except that that expression is
17559
// Undefined Behavior in C (but not C++) when ptr is NULL, even if len is zero.
17560
//
17561
// Precondition: (ptr != NULL) || (len == 0).
17562
static inline const uint8_t*  //
17563
1.18M
wuffs_private_impl__ptr_u8_plus_len(const uint8_t* ptr, size_t len) {
17564
1.18M
  return ptr ? (ptr + len) : NULL;
17565
1.18M
}
17566
17567
// --------
17568
17569
// wuffs_private_impl__slice_u8__prefix returns up to the first up_to bytes of
17570
// s.
17571
static inline wuffs_base__slice_u8  //
17572
0
wuffs_private_impl__slice_u8__prefix(wuffs_base__slice_u8 s, uint64_t up_to) {
17573
0
  if (((uint64_t)(s.len)) > up_to) {
17574
0
    s.len = ((size_t)up_to);
17575
0
  }
17576
0
  return s;
17577
0
}
17578
17579
// wuffs_private_impl__slice_u8__suffix returns up to the last up_to bytes of
17580
// s.
17581
static inline wuffs_base__slice_u8  //
17582
620
wuffs_private_impl__slice_u8__suffix(wuffs_base__slice_u8 s, uint64_t up_to) {
17583
620
  if (((uint64_t)(s.len)) > up_to) {
17584
609
    s.ptr += ((uint64_t)(s.len)) - up_to;
17585
609
    s.len = ((size_t)up_to);
17586
609
  }
17587
620
  return s;
17588
620
}
17589
17590
// wuffs_private_impl__slice_u8__copy_from_slice calls memmove(dst.ptr,
17591
// src.ptr, len) where len is the minimum of dst.len and src.len.
17592
//
17593
// Passing a wuffs_base__slice_u8 with all fields NULL or zero (a valid, empty
17594
// slice) is valid and results in a no-op.
17595
static inline uint64_t  //
17596
wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__slice_u8 dst,
17597
34.4k
                                              wuffs_base__slice_u8 src) {
17598
34.4k
  size_t len = dst.len < src.len ? dst.len : src.len;
17599
34.4k
  if (len > 0) {
17600
28.2k
    memmove(dst.ptr, src.ptr, len);
17601
28.2k
  }
17602
34.4k
  return len;
17603
34.4k
}
17604
17605
static inline wuffs_base__empty_struct  //
17606
wuffs_private_impl__bulk_load_host_endian(void* ptr,
17607
                                          size_t len,
17608
0
                                          wuffs_base__slice_u8 src) {
17609
0
  if (len && (len <= src.len)) {
17610
0
    memmove(ptr, src.ptr, len);
17611
0
  }
17612
0
  return wuffs_base__make_empty_struct();
17613
0
}
17614
17615
static inline wuffs_base__empty_struct  //
17616
0
wuffs_private_impl__bulk_memset(void* ptr, size_t len, uint8_t byte_value) {
17617
0
  if (len) {
17618
0
    memset(ptr, byte_value, len);
17619
0
  }
17620
0
  return wuffs_base__make_empty_struct();
17621
0
}
17622
17623
static inline wuffs_base__empty_struct  //
17624
wuffs_private_impl__bulk_save_host_endian(void* ptr,
17625
                                          size_t len,
17626
0
                                          wuffs_base__slice_u8 dst) {
17627
0
  if (len && (len <= dst.len)) {
17628
0
    memmove(dst.ptr, ptr, len);
17629
0
  }
17630
0
  return wuffs_base__make_empty_struct();
17631
0
}
17632
17633
// --------
17634
17635
static inline wuffs_base__slice_u8  //
17636
2.35M
wuffs_private_impl__table_u8__row_u32(wuffs_base__table_u8 t, uint32_t y) {
17637
2.35M
  if (t.ptr && (y < t.height)) {
17638
2.35M
    return wuffs_base__make_slice_u8(t.ptr + (t.stride * y), t.width);
17639
2.35M
  }
17640
0
  return wuffs_base__empty_slice_u8();
17641
2.35M
}
17642
17643
// ---------------- Slices and Tables (Utility)
17644
17645
32.7k
#define wuffs_base__utility__empty_slice_u8 wuffs_base__empty_slice_u8
17646
17647
// ---------------- Ranges and Rects
17648
17649
static inline uint32_t  //
17650
wuffs_private_impl__range_ii_u32__get_min_incl(
17651
0
    const wuffs_base__range_ii_u32* r) {
17652
0
  return r->min_incl;
17653
0
}
17654
17655
static inline uint32_t  //
17656
wuffs_private_impl__range_ii_u32__get_max_incl(
17657
0
    const wuffs_base__range_ii_u32* r) {
17658
0
  return r->max_incl;
17659
0
}
17660
17661
static inline uint32_t  //
17662
wuffs_private_impl__range_ie_u32__get_min_incl(
17663
0
    const wuffs_base__range_ie_u32* r) {
17664
0
  return r->min_incl;
17665
0
}
17666
17667
static inline uint32_t  //
17668
wuffs_private_impl__range_ie_u32__get_max_excl(
17669
0
    const wuffs_base__range_ie_u32* r) {
17670
0
  return r->max_excl;
17671
0
}
17672
17673
static inline uint64_t  //
17674
wuffs_private_impl__range_ii_u64__get_min_incl(
17675
0
    const wuffs_base__range_ii_u64* r) {
17676
0
  return r->min_incl;
17677
0
}
17678
17679
static inline uint64_t  //
17680
wuffs_private_impl__range_ii_u64__get_max_incl(
17681
0
    const wuffs_base__range_ii_u64* r) {
17682
0
  return r->max_incl;
17683
0
}
17684
17685
static inline uint64_t  //
17686
wuffs_private_impl__range_ie_u64__get_min_incl(
17687
0
    const wuffs_base__range_ie_u64* r) {
17688
0
  return r->min_incl;
17689
0
}
17690
17691
static inline uint64_t  //
17692
wuffs_private_impl__range_ie_u64__get_max_excl(
17693
0
    const wuffs_base__range_ie_u64* r) {
17694
0
  return r->max_excl;
17695
0
}
17696
17697
// ---------------- Ranges and Rects (Utility)
17698
17699
#define wuffs_base__utility__empty_range_ii_u32 wuffs_base__empty_range_ii_u32
17700
#define wuffs_base__utility__empty_range_ie_u32 wuffs_base__empty_range_ie_u32
17701
0
#define wuffs_base__utility__empty_range_ii_u64 wuffs_base__empty_range_ii_u64
17702
#define wuffs_base__utility__empty_range_ie_u64 wuffs_base__empty_range_ie_u64
17703
#define wuffs_base__utility__empty_rect_ii_u32 wuffs_base__empty_rect_ii_u32
17704
0
#define wuffs_base__utility__empty_rect_ie_u32 wuffs_base__empty_rect_ie_u32
17705
#define wuffs_base__utility__make_range_ii_u32 wuffs_base__make_range_ii_u32
17706
#define wuffs_base__utility__make_range_ie_u32 wuffs_base__make_range_ie_u32
17707
4.03k
#define wuffs_base__utility__make_range_ii_u64 wuffs_base__make_range_ii_u64
17708
#define wuffs_base__utility__make_range_ie_u64 wuffs_base__make_range_ie_u64
17709
#define wuffs_base__utility__make_rect_ii_u32 wuffs_base__make_rect_ii_u32
17710
13.0k
#define wuffs_base__utility__make_rect_ie_u32 wuffs_base__make_rect_ie_u32
17711
17712
// ---------------- I/O
17713
17714
static inline uint64_t  //
17715
59.1k
wuffs_private_impl__io__count_since(uint64_t mark, uint64_t index) {
17716
59.1k
  if (index >= mark) {
17717
59.1k
    return index - mark;
17718
59.1k
  }
17719
0
  return 0;
17720
59.1k
}
17721
17722
// TODO: drop the "const" in "const uint8_t* ptr". Some though required about
17723
// the base.io_reader.since method returning a mutable "slice base.u8".
17724
#if defined(__GNUC__)
17725
#pragma GCC diagnostic push
17726
#pragma GCC diagnostic ignored "-Wcast-qual"
17727
#endif
17728
static inline wuffs_base__slice_u8  //
17729
wuffs_private_impl__io__since(uint64_t mark,
17730
                              uint64_t index,
17731
63.2k
                              const uint8_t* ptr) {
17732
63.2k
  if (index >= mark) {
17733
63.2k
    return wuffs_base__make_slice_u8(((uint8_t*)ptr) + mark,
17734
63.2k
                                     ((size_t)(index - mark)));
17735
63.2k
  }
17736
0
  return wuffs_base__empty_slice_u8();
17737
63.2k
}
17738
#if defined(__GNUC__)
17739
#pragma GCC diagnostic pop
17740
#endif
17741
17742
// --------
17743
17744
static inline void  //
17745
wuffs_private_impl__io_reader__limit(const uint8_t** ptr_io2_r,
17746
                                     const uint8_t* iop_r,
17747
21.3k
                                     uint64_t limit) {
17748
21.3k
  if (((uint64_t)(*ptr_io2_r - iop_r)) > limit) {
17749
13.7k
    *ptr_io2_r = iop_r + limit;
17750
13.7k
  }
17751
21.3k
}
17752
17753
static inline uint32_t  //
17754
wuffs_private_impl__io_reader__limited_copy_u32_to_slice(
17755
    const uint8_t** ptr_iop_r,
17756
    const uint8_t* io2_r,
17757
    uint32_t length,
17758
0
    wuffs_base__slice_u8 dst) {
17759
0
  const uint8_t* iop_r = *ptr_iop_r;
17760
0
  size_t n = dst.len;
17761
0
  if (n > length) {
17762
0
    n = length;
17763
0
  }
17764
0
  if (n > ((size_t)(io2_r - iop_r))) {
17765
0
    n = (size_t)(io2_r - iop_r);
17766
0
  }
17767
0
  if (n > 0) {
17768
0
    memmove(dst.ptr, iop_r, n);
17769
0
    *ptr_iop_r += n;
17770
0
  }
17771
0
  return (uint32_t)(n);
17772
0
}
17773
17774
// wuffs_private_impl__io_reader__match7 returns whether the io_reader's
17775
// upcoming bytes start with the given prefix (up to 7 bytes long). It is
17776
// peek-like, not read-like, in that there are no side-effects.
17777
//
17778
// The low 3 bits of a hold the prefix length, n.
17779
//
17780
// The high 56 bits of a hold the prefix itself, in little-endian order. The
17781
// first prefix byte is in bits 8..=15, the second prefix byte is in bits
17782
// 16..=23, etc. The high (8 * (7 - n)) bits are ignored.
17783
//
17784
// There are three possible return values:
17785
//  - 0 means success.
17786
//  - 1 means inconclusive, equivalent to "$short read".
17787
//  - 2 means failure.
17788
static inline uint32_t  //
17789
wuffs_private_impl__io_reader__match7(const uint8_t* iop_r,
17790
                                      const uint8_t* io2_r,
17791
                                      wuffs_base__io_buffer* r,
17792
0
                                      uint64_t a) {
17793
0
  uint32_t n = a & 7;
17794
0
  a >>= 8;
17795
0
  if ((io2_r - iop_r) >= 8) {
17796
0
    uint64_t x = wuffs_base__peek_u64le__no_bounds_check(iop_r);
17797
0
    uint32_t shift = 8 * (8 - n);
17798
0
    return ((a << shift) == (x << shift)) ? 0 : 2;
17799
0
  }
17800
0
  for (; n > 0; n--) {
17801
0
    if (iop_r >= io2_r) {
17802
0
      return (r && r->meta.closed) ? 2 : 1;
17803
0
    } else if (*iop_r != ((uint8_t)(a))) {
17804
0
      return 2;
17805
0
    }
17806
0
    iop_r++;
17807
0
    a >>= 8;
17808
0
  }
17809
0
  return 0;
17810
0
}
17811
17812
static inline wuffs_base__io_buffer*  //
17813
wuffs_private_impl__io_reader__set(wuffs_base__io_buffer* b,
17814
                                   const uint8_t** ptr_iop_r,
17815
                                   const uint8_t** ptr_io0_r,
17816
                                   const uint8_t** ptr_io1_r,
17817
                                   const uint8_t** ptr_io2_r,
17818
                                   wuffs_base__slice_u8 data,
17819
0
                                   uint64_t history_position) {
17820
0
  b->data = data;
17821
0
  b->meta.wi = data.len;
17822
0
  b->meta.ri = 0;
17823
0
  b->meta.pos = history_position;
17824
0
  b->meta.closed = false;
17825
0
17826
0
  *ptr_iop_r = data.ptr;
17827
0
  *ptr_io0_r = data.ptr;
17828
0
  *ptr_io1_r = data.ptr;
17829
0
  *ptr_io2_r = data.ptr + data.len;
17830
0
17831
0
  return b;
17832
0
}
17833
17834
// --------
17835
17836
static inline uint64_t  //
17837
wuffs_private_impl__io_writer__copy_from_slice(uint8_t** ptr_iop_w,
17838
                                               uint8_t* io2_w,
17839
0
                                               wuffs_base__slice_u8 src) {
17840
0
  uint8_t* iop_w = *ptr_iop_w;
17841
0
  size_t n = src.len;
17842
0
  if (n > ((size_t)(io2_w - iop_w))) {
17843
0
    n = (size_t)(io2_w - iop_w);
17844
0
  }
17845
0
  if (n > 0) {
17846
0
    memmove(iop_w, src.ptr, n);
17847
0
    *ptr_iop_w += n;
17848
0
  }
17849
0
  return (uint64_t)(n);
17850
0
}
17851
17852
static inline void  //
17853
wuffs_private_impl__io_writer__limit(uint8_t** ptr_io2_w,
17854
                                     uint8_t* iop_w,
17855
0
                                     uint64_t limit) {
17856
0
  if (((uint64_t)(*ptr_io2_w - iop_w)) > limit) {
17857
0
    *ptr_io2_w = iop_w + limit;
17858
0
  }
17859
0
}
17860
17861
static inline uint32_t  //
17862
wuffs_private_impl__io_writer__limited_copy_u32_from_history(
17863
    uint8_t** ptr_iop_w,
17864
    uint8_t* io0_w,
17865
    uint8_t* io2_w,
17866
    uint32_t length,
17867
46.2k
    uint32_t distance) {
17868
46.2k
  if (!distance) {
17869
0
    return 0;
17870
0
  }
17871
46.2k
  uint8_t* p = *ptr_iop_w;
17872
46.2k
  if ((size_t)(p - io0_w) < (size_t)(distance)) {
17873
0
    return 0;
17874
0
  }
17875
46.2k
  uint8_t* q = p - distance;
17876
46.2k
  size_t n = (size_t)(io2_w - p);
17877
46.2k
  if ((size_t)(length) > n) {
17878
4.85k
    length = (uint32_t)(n);
17879
41.4k
  } else {
17880
41.4k
    n = (size_t)(length);
17881
41.4k
  }
17882
  // TODO: unrolling by 3 seems best for the std/deflate benchmarks, but that
17883
  // is mostly because 3 is the minimum length for the deflate format. This
17884
  // function implementation shouldn't overfit to that one format. Perhaps the
17885
  // limited_copy_u32_from_history Wuffs method should also take an unroll hint
17886
  // argument, and the cgen can look if that argument is the constant
17887
  // expression '3'.
17888
  //
17889
  // See also wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast
17890
  // below.
17891
2.55M
  for (; n >= 3; n -= 3) {
17892
2.51M
    *p++ = *q++;
17893
2.51M
    *p++ = *q++;
17894
2.51M
    *p++ = *q++;
17895
2.51M
  }
17896
68.3k
  for (; n; n--) {
17897
22.0k
    *p++ = *q++;
17898
22.0k
  }
17899
46.2k
  *ptr_iop_w = p;
17900
46.2k
  return length;
17901
46.2k
}
17902
17903
// wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast is like
17904
// the wuffs_private_impl__io_writer__limited_copy_u32_from_history function
17905
// above, but has stronger pre-conditions.
17906
//
17907
// The caller needs to prove that:
17908
//  - length   >= 1
17909
//  - length   <= (io2_w      - *ptr_iop_w)
17910
//  - distance >= 1
17911
//  - distance <= (*ptr_iop_w - io0_w)
17912
static inline uint32_t  //
17913
wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast(
17914
    uint8_t** ptr_iop_w,
17915
    uint8_t* io0_w,
17916
    uint8_t* io2_w,
17917
    uint32_t length,
17918
3.95M
    uint32_t distance) {
17919
3.95M
  uint8_t* p = *ptr_iop_w;
17920
3.95M
  uint8_t* q = p - distance;
17921
3.95M
  uint32_t n = length;
17922
342M
  for (; n >= 3; n -= 3) {
17923
338M
    *p++ = *q++;
17924
338M
    *p++ = *q++;
17925
338M
    *p++ = *q++;
17926
338M
  }
17927
3.96M
  for (; n; n--) {
17928
13.2k
    *p++ = *q++;
17929
13.2k
  }
17930
3.95M
  *ptr_iop_w = p;
17931
3.95M
  return length;
17932
3.95M
}
17933
17934
// wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast_return_cusp
17935
// is like the
17936
// wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast function,
17937
// but also returns the cusp: a byte pair (as a u16le) being the last byte of
17938
// and next byte after the copied history.
17939
//
17940
// For example, if history was [10, 11, 12, 13, 14, 15, 16, 17, 18] then:
17941
//  - copying l=3, d=8 produces [11, 12, 13] and the cusp is (13, 14).
17942
//  - copying l=3, d=2 produces [17, 18, 17] and the cusp is (17, 18).
17943
//
17944
// The caller needs to prove that:
17945
//  - length   >= 1
17946
//  - length   <= (io2_w      - *ptr_iop_w)
17947
//  - distance >= 1
17948
//  - distance <= (*ptr_iop_w - io0_w)
17949
static inline uint32_t  //
17950
wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast_return_cusp(
17951
    uint8_t** ptr_iop_w,
17952
    uint8_t* io0_w,
17953
    uint8_t* io2_w,
17954
    uint32_t length,
17955
0
    uint32_t distance) {
17956
0
  uint8_t* p = *ptr_iop_w;
17957
0
  uint8_t* q = p - distance;
17958
0
  uint32_t n = length;
17959
0
  for (; n >= 3; n -= 3) {
17960
0
    *p++ = *q++;
17961
0
    *p++ = *q++;
17962
0
    *p++ = *q++;
17963
0
  }
17964
0
  for (; n; n--) {
17965
0
    *p++ = *q++;
17966
0
  }
17967
0
  *ptr_iop_w = p;
17968
0
  return (uint32_t)wuffs_base__peek_u16le__no_bounds_check(q - 1);
17969
0
}
17970
17971
// wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast
17972
// copies the previous byte (the one immediately before *ptr_iop_w), copying 8
17973
// byte chunks at a time. Each chunk contains 8 repetitions of the same byte.
17974
//
17975
// In terms of number of bytes copied, length is rounded up to a multiple of 8.
17976
// As a special case, a zero length rounds up to 8 (even though 0 is already a
17977
// multiple of 8), since there is always at least one 8 byte chunk copied.
17978
//
17979
// In terms of advancing *ptr_iop_w, length is not rounded up.
17980
//
17981
// The caller needs to prove that:
17982
//  - length       >= 1
17983
//  - (length + 8) <= (io2_w      - *ptr_iop_w)
17984
//  - distance     == 1
17985
//  - distance     <= (*ptr_iop_w - io0_w)
17986
static inline uint32_t  //
17987
wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast(
17988
    uint8_t** ptr_iop_w,
17989
    uint8_t* io0_w,
17990
    uint8_t* io2_w,
17991
    uint32_t length,
17992
2.84M
    uint32_t distance) {
17993
2.84M
  uint8_t* p = *ptr_iop_w;
17994
2.84M
  uint64_t x = p[-1];
17995
2.84M
  x |= x << 8;
17996
2.84M
  x |= x << 16;
17997
2.84M
  x |= x << 32;
17998
2.84M
  uint32_t n = length;
17999
89.6M
  while (1) {
18000
89.6M
    wuffs_base__poke_u64le__no_bounds_check(p, x);
18001
89.6M
    if (n <= 8) {
18002
2.84M
      p += n;
18003
2.84M
      break;
18004
2.84M
    }
18005
86.8M
    p += 8;
18006
86.8M
    n -= 8;
18007
86.8M
  }
18008
2.84M
  *ptr_iop_w = p;
18009
2.84M
  return length;
18010
2.84M
}
18011
18012
// wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast_return_cusp
18013
// copies the previous byte (the one immediately before *ptr_iop_w), copying 8
18014
// byte chunks at a time. Each chunk contains 8 repetitions of the same byte.
18015
// It also returns the cusp: a byte pair (as a u16le) being the last byte of
18016
// and next byte after the copied history.
18017
//
18018
// In terms of number of bytes copied, length is rounded up to a multiple of 8.
18019
// As a special case, a zero length rounds up to 8 (even though 0 is already a
18020
// multiple of 8), since there is always at least one 8 byte chunk copied.
18021
//
18022
// In terms of advancing *ptr_iop_w, length is not rounded up.
18023
//
18024
// The caller needs to prove that:
18025
//  - length       >= 1
18026
//  - (length + 8) <= (io2_w      - *ptr_iop_w)
18027
//  - distance     == 1
18028
//  - distance     <= (*ptr_iop_w - io0_w)
18029
static inline uint32_t  //
18030
wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast_return_cusp(
18031
    uint8_t** ptr_iop_w,
18032
    uint8_t* io0_w,
18033
    uint8_t* io2_w,
18034
    uint32_t length,
18035
0
    uint32_t distance) {
18036
0
  uint8_t* p = *ptr_iop_w;
18037
0
  uint8_t* q = p - distance;
18038
0
  uint64_t x = p[-1];
18039
0
  x |= x << 8;
18040
0
  x |= x << 16;
18041
0
  x |= x << 32;
18042
0
  uint32_t n = length;
18043
0
  while (1) {
18044
0
    wuffs_base__poke_u64le__no_bounds_check(p, x);
18045
0
    if (n <= 8) {
18046
0
      p += n;
18047
0
      q += n;
18048
0
      break;
18049
0
    }
18050
0
    p += 8;
18051
0
    q += 8;
18052
0
    n -= 8;
18053
0
  }
18054
0
  *ptr_iop_w = p;
18055
0
  return (uint32_t)wuffs_base__peek_u16le__no_bounds_check(q - 1);
18056
0
}
18057
18058
// wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast
18059
// is like the
18060
// wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast function
18061
// above, but copies 8 byte chunks at a time.
18062
//
18063
// In terms of number of bytes copied, length is rounded up to a multiple of 8.
18064
// As a special case, a zero length rounds up to 8 (even though 0 is already a
18065
// multiple of 8), since there is always at least one 8 byte chunk copied.
18066
//
18067
// In terms of advancing *ptr_iop_w, length is not rounded up.
18068
//
18069
// The caller needs to prove that:
18070
//  - length       >= 1
18071
//  - (length + 8) <= (io2_w      - *ptr_iop_w)
18072
//  - distance     >= 8
18073
//  - distance     <= (*ptr_iop_w - io0_w)
18074
static inline uint32_t  //
18075
wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast(
18076
    uint8_t** ptr_iop_w,
18077
    uint8_t* io0_w,
18078
    uint8_t* io2_w,
18079
    uint32_t length,
18080
935k
    uint32_t distance) {
18081
935k
  uint8_t* p = *ptr_iop_w;
18082
935k
  uint8_t* q = p - distance;
18083
935k
  uint32_t n = length;
18084
3.72M
  while (1) {
18085
3.72M
    memcpy(p, q, 8);
18086
3.72M
    if (n <= 8) {
18087
935k
      p += n;
18088
935k
      break;
18089
935k
    }
18090
2.79M
    p += 8;
18091
2.79M
    q += 8;
18092
2.79M
    n -= 8;
18093
2.79M
  }
18094
935k
  *ptr_iop_w = p;
18095
935k
  return length;
18096
935k
}
18097
18098
// wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast_return_cusp
18099
// is like the
18100
// wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast function
18101
// above, but copies 8 byte chunks at a time. It also returns the cusp: a byte
18102
// pair (as a u16le) being the last byte of and next byte after the copied
18103
// history.
18104
//
18105
// In terms of number of bytes copied, length is rounded up to a multiple of 8.
18106
// As a special case, a zero length rounds up to 8 (even though 0 is already a
18107
// multiple of 8), since there is always at least one 8 byte chunk copied.
18108
//
18109
// In terms of advancing *ptr_iop_w, length is not rounded up.
18110
//
18111
// The caller needs to prove that:
18112
//  - length       >= 1
18113
//  - (length + 8) <= (io2_w      - *ptr_iop_w)
18114
//  - distance     >= 8
18115
//  - distance     <= (*ptr_iop_w - io0_w)
18116
static inline uint32_t  //
18117
wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast_return_cusp(
18118
    uint8_t** ptr_iop_w,
18119
    uint8_t* io0_w,
18120
    uint8_t* io2_w,
18121
    uint32_t length,
18122
0
    uint32_t distance) {
18123
0
  uint8_t* p = *ptr_iop_w;
18124
0
  uint8_t* q = p - distance;
18125
0
  uint32_t n = length;
18126
0
  while (1) {
18127
0
    memcpy(p, q, 8);
18128
0
    if (n <= 8) {
18129
0
      p += n;
18130
0
      q += n;
18131
0
      break;
18132
0
    }
18133
0
    p += 8;
18134
0
    q += 8;
18135
0
    n -= 8;
18136
0
  }
18137
0
  *ptr_iop_w = p;
18138
0
  return (uint32_t)wuffs_base__peek_u16le__no_bounds_check(q - 1);
18139
0
}
18140
18141
static inline uint32_t  //
18142
wuffs_private_impl__io_writer__limited_copy_u32_from_reader(
18143
    uint8_t** ptr_iop_w,
18144
    uint8_t* io2_w,
18145
    uint32_t length,
18146
    const uint8_t** ptr_iop_r,
18147
1.51k
    const uint8_t* io2_r) {
18148
1.51k
  uint8_t* iop_w = *ptr_iop_w;
18149
1.51k
  size_t n = length;
18150
1.51k
  if (n > ((size_t)(io2_w - iop_w))) {
18151
466
    n = (size_t)(io2_w - iop_w);
18152
466
  }
18153
1.51k
  const uint8_t* iop_r = *ptr_iop_r;
18154
1.51k
  if (n > ((size_t)(io2_r - iop_r))) {
18155
469
    n = (size_t)(io2_r - iop_r);
18156
469
  }
18157
1.51k
  if (n > 0) {
18158
313
    memmove(iop_w, iop_r, n);
18159
313
    *ptr_iop_w += n;
18160
313
    *ptr_iop_r += n;
18161
313
  }
18162
1.51k
  return (uint32_t)(n);
18163
1.51k
}
18164
18165
static inline uint32_t  //
18166
wuffs_private_impl__io_writer__limited_copy_u32_from_slice(
18167
    uint8_t** ptr_iop_w,
18168
    uint8_t* io2_w,
18169
    uint32_t length,
18170
205k
    wuffs_base__slice_u8 src) {
18171
205k
  uint8_t* iop_w = *ptr_iop_w;
18172
205k
  size_t n = src.len;
18173
205k
  if (n > length) {
18174
205k
    n = length;
18175
205k
  }
18176
205k
  if (n > ((size_t)(io2_w - iop_w))) {
18177
81
    n = (size_t)(io2_w - iop_w);
18178
81
  }
18179
205k
  if (n > 0) {
18180
205k
    memmove(iop_w, src.ptr, n);
18181
205k
    *ptr_iop_w += n;
18182
205k
  }
18183
205k
  return (uint32_t)(n);
18184
205k
}
18185
18186
static inline wuffs_base__io_buffer*  //
18187
wuffs_private_impl__io_writer__set(wuffs_base__io_buffer* b,
18188
                                   uint8_t** ptr_iop_w,
18189
                                   uint8_t** ptr_io0_w,
18190
                                   uint8_t** ptr_io1_w,
18191
                                   uint8_t** ptr_io2_w,
18192
                                   wuffs_base__slice_u8 data,
18193
21.3k
                                   uint64_t history_position) {
18194
21.3k
  b->data = data;
18195
21.3k
  b->meta.wi = 0;
18196
21.3k
  b->meta.ri = 0;
18197
21.3k
  b->meta.pos = history_position;
18198
21.3k
  b->meta.closed = false;
18199
18200
21.3k
  *ptr_iop_w = data.ptr;
18201
21.3k
  *ptr_io0_w = data.ptr;
18202
21.3k
  *ptr_io1_w = data.ptr;
18203
21.3k
  *ptr_io2_w = data.ptr + data.len;
18204
18205
21.3k
  return b;
18206
21.3k
}
18207
18208
// ---------------- I/O (Utility)
18209
18210
#define wuffs_base__utility__empty_io_reader wuffs_base__empty_io_reader
18211
#define wuffs_base__utility__empty_io_writer wuffs_base__empty_io_writer
18212
18213
// ---------------- Tokens
18214
18215
// ---------------- Tokens (Utility)
18216
18217
// ---------------- Memory Allocation
18218
18219
// ---------------- Images
18220
18221
WUFFS_BASE__MAYBE_STATIC uint64_t  //
18222
wuffs_base__pixel_swizzler__limited_swizzle_u32_interleaved_from_reader(
18223
    const wuffs_base__pixel_swizzler* p,
18224
    uint32_t up_to_num_pixels,
18225
    wuffs_base__slice_u8 dst,
18226
    wuffs_base__slice_u8 dst_palette,
18227
    const uint8_t** ptr_iop_r,
18228
    const uint8_t* io2_r);
18229
18230
WUFFS_BASE__MAYBE_STATIC uint64_t  //
18231
wuffs_base__pixel_swizzler__swizzle_interleaved_from_reader(
18232
    const wuffs_base__pixel_swizzler* p,
18233
    wuffs_base__slice_u8 dst,
18234
    wuffs_base__slice_u8 dst_palette,
18235
    const uint8_t** ptr_iop_r,
18236
    const uint8_t* io2_r);
18237
18238
WUFFS_BASE__MAYBE_STATIC uint64_t  //
18239
wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(
18240
    const wuffs_base__pixel_swizzler* p,
18241
    wuffs_base__slice_u8 dst,
18242
    wuffs_base__slice_u8 dst_palette,
18243
    uint64_t num_pixels);
18244
18245
WUFFS_BASE__MAYBE_STATIC wuffs_base__status  //
18246
wuffs_base__pixel_swizzler__swizzle_ycck(
18247
    const wuffs_base__pixel_swizzler* p,
18248
    wuffs_base__pixel_buffer* dst,
18249
    wuffs_base__slice_u8 dst_palette,
18250
    uint32_t x_min_incl,
18251
    uint32_t x_max_excl,
18252
    uint32_t y_min_incl,
18253
    uint32_t y_max_excl,
18254
    wuffs_base__slice_u8 src0,
18255
    wuffs_base__slice_u8 src1,
18256
    wuffs_base__slice_u8 src2,
18257
    wuffs_base__slice_u8 src3,
18258
    uint32_t width0,
18259
    uint32_t width1,
18260
    uint32_t width2,
18261
    uint32_t width3,
18262
    uint32_t height0,
18263
    uint32_t height1,
18264
    uint32_t height2,
18265
    uint32_t height3,
18266
    uint32_t stride0,
18267
    uint32_t stride1,
18268
    uint32_t stride2,
18269
    uint32_t stride3,
18270
    uint8_t h0,
18271
    uint8_t h1,
18272
    uint8_t h2,
18273
    uint8_t h3,
18274
    uint8_t v0,
18275
    uint8_t v1,
18276
    uint8_t v2,
18277
    uint8_t v3,
18278
    bool is_rgb_or_cmyk,
18279
    bool triangle_filter_for_2to1,
18280
    wuffs_base__slice_u8 scratch_buffer_2k);
18281
18282
// ---------------- Images (Utility)
18283
18284
12.7k
#define wuffs_base__utility__make_pixel_format wuffs_base__make_pixel_format
18285
18286
// ---------------- String Conversions
18287
18288
// ---------------- Unicode and UTF-8
18289
18290
// ----------------
18291
18292
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \
18293
    defined(WUFFS_CONFIG__MODULE__BASE__CORE)
18294
18295
const uint8_t wuffs_private_impl__low_bits_mask__u8[8] = {
18296
    0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F,
18297
};
18298
18299
const uint16_t wuffs_private_impl__low_bits_mask__u16[16] = {
18300
    0x0000, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F, 0x003F, 0x007F,
18301
    0x00FF, 0x01FF, 0x03FF, 0x07FF, 0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF,
18302
};
18303
18304
const uint32_t wuffs_private_impl__low_bits_mask__u32[32] = {
18305
    0x00000000, 0x00000001, 0x00000003, 0x00000007, 0x0000000F, 0x0000001F,
18306
    0x0000003F, 0x0000007F, 0x000000FF, 0x000001FF, 0x000003FF, 0x000007FF,
18307
    0x00000FFF, 0x00001FFF, 0x00003FFF, 0x00007FFF, 0x0000FFFF, 0x0001FFFF,
18308
    0x0003FFFF, 0x0007FFFF, 0x000FFFFF, 0x001FFFFF, 0x003FFFFF, 0x007FFFFF,
18309
    0x00FFFFFF, 0x01FFFFFF, 0x03FFFFFF, 0x07FFFFFF, 0x0FFFFFFF, 0x1FFFFFFF,
18310
    0x3FFFFFFF, 0x7FFFFFFF,
18311
};
18312
18313
const uint64_t wuffs_private_impl__low_bits_mask__u64[64] = {
18314
    0x0000000000000000, 0x0000000000000001, 0x0000000000000003,
18315
    0x0000000000000007, 0x000000000000000F, 0x000000000000001F,
18316
    0x000000000000003F, 0x000000000000007F, 0x00000000000000FF,
18317
    0x00000000000001FF, 0x00000000000003FF, 0x00000000000007FF,
18318
    0x0000000000000FFF, 0x0000000000001FFF, 0x0000000000003FFF,
18319
    0x0000000000007FFF, 0x000000000000FFFF, 0x000000000001FFFF,
18320
    0x000000000003FFFF, 0x000000000007FFFF, 0x00000000000FFFFF,
18321
    0x00000000001FFFFF, 0x00000000003FFFFF, 0x00000000007FFFFF,
18322
    0x0000000000FFFFFF, 0x0000000001FFFFFF, 0x0000000003FFFFFF,
18323
    0x0000000007FFFFFF, 0x000000000FFFFFFF, 0x000000001FFFFFFF,
18324
    0x000000003FFFFFFF, 0x000000007FFFFFFF, 0x00000000FFFFFFFF,
18325
    0x00000001FFFFFFFF, 0x00000003FFFFFFFF, 0x00000007FFFFFFFF,
18326
    0x0000000FFFFFFFFF, 0x0000001FFFFFFFFF, 0x0000003FFFFFFFFF,
18327
    0x0000007FFFFFFFFF, 0x000000FFFFFFFFFF, 0x000001FFFFFFFFFF,
18328
    0x000003FFFFFFFFFF, 0x000007FFFFFFFFFF, 0x00000FFFFFFFFFFF,
18329
    0x00001FFFFFFFFFFF, 0x00003FFFFFFFFFFF, 0x00007FFFFFFFFFFF,
18330
    0x0000FFFFFFFFFFFF, 0x0001FFFFFFFFFFFF, 0x0003FFFFFFFFFFFF,
18331
    0x0007FFFFFFFFFFFF, 0x000FFFFFFFFFFFFF, 0x001FFFFFFFFFFFFF,
18332
    0x003FFFFFFFFFFFFF, 0x007FFFFFFFFFFFFF, 0x00FFFFFFFFFFFFFF,
18333
    0x01FFFFFFFFFFFFFF, 0x03FFFFFFFFFFFFFF, 0x07FFFFFFFFFFFFFF,
18334
    0x0FFFFFFFFFFFFFFF, 0x1FFFFFFFFFFFFFFF, 0x3FFFFFFFFFFFFFFF,
18335
    0x7FFFFFFFFFFFFFFF,
18336
};
18337
18338
const uint32_t wuffs_private_impl__pixel_format__bits_per_channel[16] = {
18339
    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
18340
    0x08, 0x0A, 0x0C, 0x10, 0x18, 0x20, 0x30, 0x40,
18341
};
18342
18343
const char wuffs_base__note__i_o_redirect[] = "@base: I/O redirect";
18344
const char wuffs_base__note__end_of_data[] = "@base: end of data";
18345
const char wuffs_base__note__metadata_reported[] = "@base: metadata reported";
18346
const char wuffs_base__suspension__even_more_information[] = "$base: even more information";
18347
const char wuffs_base__suspension__mispositioned_read[] = "$base: mispositioned read";
18348
const char wuffs_base__suspension__mispositioned_write[] = "$base: mispositioned write";
18349
const char wuffs_base__suspension__short_read[] = "$base: short read";
18350
const char wuffs_base__suspension__short_workbuf[] = "$base: short workbuf";
18351
const char wuffs_base__suspension__short_write[] = "$base: short write";
18352
const char wuffs_base__error__bad_i_o_position[] = "#base: bad I/O position";
18353
const char wuffs_base__error__bad_argument_length_too_short[] = "#base: bad argument (length too short)";
18354
const char wuffs_base__error__bad_argument[] = "#base: bad argument";
18355
const char wuffs_base__error__bad_call_sequence[] = "#base: bad call sequence";
18356
const char wuffs_base__error__bad_data[] = "#base: bad data";
18357
const char wuffs_base__error__bad_receiver[] = "#base: bad receiver";
18358
const char wuffs_base__error__bad_restart[] = "#base: bad restart";
18359
const char wuffs_base__error__bad_sizeof_receiver[] = "#base: bad sizeof receiver";
18360
const char wuffs_base__error__bad_vtable[] = "#base: bad vtable";
18361
const char wuffs_base__error__bad_workbuf_length[] = "#base: bad workbuf length";
18362
const char wuffs_base__error__bad_wuffs_version[] = "#base: bad wuffs version";
18363
const char wuffs_base__error__cannot_return_a_suspension[] = "#base: cannot return a suspension";
18364
const char wuffs_base__error__disabled_by_wuffs_config_dst_pixel_format_enable_allowlist[] = "#base: disabled by WUFFS_CONFIG__DST_PIXEL_FORMAT__ENABLE_ALLOWLIST";
18365
const char wuffs_base__error__disabled_by_previous_error[] = "#base: disabled by previous error";
18366
const char wuffs_base__error__initialize_falsely_claimed_already_zeroed[] = "#base: initialize falsely claimed already zeroed";
18367
const char wuffs_base__error__initialize_not_called[] = "#base: initialize not called";
18368
const char wuffs_base__error__insufficient_history[] = "#base: insufficient history";
18369
const char wuffs_base__error__interleaved_coroutine_calls[] = "#base: interleaved coroutine calls";
18370
const char wuffs_base__error__no_more_information[] = "#base: no more information";
18371
const char wuffs_base__error__not_enough_data[] = "#base: not enough data";
18372
const char wuffs_base__error__out_of_bounds[] = "#base: out of bounds";
18373
const char wuffs_base__error__unsupported_image_dimension[] = "#base: unsupported image dimension";
18374
const char wuffs_base__error__unsupported_method[] = "#base: unsupported method";
18375
const char wuffs_base__error__unsupported_option[] = "#base: unsupported option";
18376
const char wuffs_base__error__unsupported_pixel_swizzler_option[] = "#base: unsupported pixel swizzler option";
18377
const char wuffs_base__error__too_much_data[] = "#base: too much data";
18378
18379
const char wuffs_base__hasher_u32__vtable_name[] = "{vtable}wuffs_base__hasher_u32";
18380
const char wuffs_base__hasher_u64__vtable_name[] = "{vtable}wuffs_base__hasher_u64";
18381
const char wuffs_base__hasher_bitvec256__vtable_name[] = "{vtable}wuffs_base__hasher_bitvec256";
18382
const char wuffs_base__image_decoder__vtable_name[] = "{vtable}wuffs_base__image_decoder";
18383
const char wuffs_base__io_transformer__vtable_name[] = "{vtable}wuffs_base__io_transformer";
18384
const char wuffs_base__token_decoder__vtable_name[] = "{vtable}wuffs_base__token_decoder";
18385
18386
#endif  // !defined(WUFFS_CONFIG__MODULES) ||
18387
        // defined(WUFFS_CONFIG__MODULE__BASE)  ||
18388
        // defined(WUFFS_CONFIG__MODULE__BASE__CORE)
18389
18390
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \
18391
    defined(WUFFS_CONFIG__MODULE__BASE__INTERFACES)
18392
18393
// ---------------- Interface Definitions.
18394
18395
WUFFS_BASE__GENERATED_C_CODE
18396
WUFFS_BASE__MAYBE_STATIC uint32_t
18397
wuffs_base__hasher_u32__checksum_u32(
18398
0
    const wuffs_base__hasher_u32* self) {
18399
0
  if (!self) {
18400
0
    return 0;
18401
0
  }
18402
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
18403
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
18404
0
    return 0;
18405
0
  }
18406
18407
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
18408
0
  int i;
18409
0
  for (i = 0; i < 63; i++) {
18410
0
    if (v->vtable_name == wuffs_base__hasher_u32__vtable_name) {
18411
0
      const wuffs_base__hasher_u32__func_ptrs* func_ptrs =
18412
0
          (const wuffs_base__hasher_u32__func_ptrs*)(v->function_pointers);
18413
0
      return (*func_ptrs->checksum_u32)(self);
18414
0
    } else if (v->vtable_name == NULL) {
18415
0
      break;
18416
0
    }
18417
0
    v++;
18418
0
  }
18419
18420
0
  return 0;
18421
0
}
18422
18423
WUFFS_BASE__GENERATED_C_CODE
18424
WUFFS_BASE__MAYBE_STATIC uint64_t
18425
wuffs_base__hasher_u32__get_quirk(
18426
    const wuffs_base__hasher_u32* self,
18427
0
    uint32_t a_key) {
18428
0
  if (!self) {
18429
0
    return 0;
18430
0
  }
18431
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
18432
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
18433
0
    return 0;
18434
0
  }
18435
18436
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
18437
0
  int i;
18438
0
  for (i = 0; i < 63; i++) {
18439
0
    if (v->vtable_name == wuffs_base__hasher_u32__vtable_name) {
18440
0
      const wuffs_base__hasher_u32__func_ptrs* func_ptrs =
18441
0
          (const wuffs_base__hasher_u32__func_ptrs*)(v->function_pointers);
18442
0
      return (*func_ptrs->get_quirk)(self, a_key);
18443
0
    } else if (v->vtable_name == NULL) {
18444
0
      break;
18445
0
    }
18446
0
    v++;
18447
0
  }
18448
18449
0
  return 0;
18450
0
}
18451
18452
WUFFS_BASE__GENERATED_C_CODE
18453
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
18454
wuffs_base__hasher_u32__set_quirk(
18455
    wuffs_base__hasher_u32* self,
18456
    uint32_t a_key,
18457
0
    uint64_t a_value) {
18458
0
  if (!self) {
18459
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
18460
0
  }
18461
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
18462
0
    return wuffs_base__make_status(
18463
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
18464
0
            ? wuffs_base__error__disabled_by_previous_error
18465
0
            : wuffs_base__error__initialize_not_called);
18466
0
  }
18467
18468
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
18469
0
  int i;
18470
0
  for (i = 0; i < 63; i++) {
18471
0
    if (v->vtable_name == wuffs_base__hasher_u32__vtable_name) {
18472
0
      const wuffs_base__hasher_u32__func_ptrs* func_ptrs =
18473
0
          (const wuffs_base__hasher_u32__func_ptrs*)(v->function_pointers);
18474
0
      return (*func_ptrs->set_quirk)(self, a_key, a_value);
18475
0
    } else if (v->vtable_name == NULL) {
18476
0
      break;
18477
0
    }
18478
0
    v++;
18479
0
  }
18480
18481
0
  return wuffs_base__make_status(wuffs_base__error__bad_vtable);
18482
0
}
18483
18484
WUFFS_BASE__GENERATED_C_CODE
18485
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
18486
wuffs_base__hasher_u32__update(
18487
    wuffs_base__hasher_u32* self,
18488
0
    wuffs_base__slice_u8 a_x) {
18489
0
  if (!self) {
18490
0
    return wuffs_base__make_empty_struct();
18491
0
  }
18492
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
18493
0
    return wuffs_base__make_empty_struct();
18494
0
  }
18495
18496
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
18497
0
  int i;
18498
0
  for (i = 0; i < 63; i++) {
18499
0
    if (v->vtable_name == wuffs_base__hasher_u32__vtable_name) {
18500
0
      const wuffs_base__hasher_u32__func_ptrs* func_ptrs =
18501
0
          (const wuffs_base__hasher_u32__func_ptrs*)(v->function_pointers);
18502
0
      return (*func_ptrs->update)(self, a_x);
18503
0
    } else if (v->vtable_name == NULL) {
18504
0
      break;
18505
0
    }
18506
0
    v++;
18507
0
  }
18508
18509
0
  return wuffs_base__make_empty_struct();
18510
0
}
18511
18512
WUFFS_BASE__GENERATED_C_CODE
18513
WUFFS_BASE__MAYBE_STATIC uint32_t
18514
wuffs_base__hasher_u32__update_u32(
18515
    wuffs_base__hasher_u32* self,
18516
0
    wuffs_base__slice_u8 a_x) {
18517
0
  if (!self) {
18518
0
    return 0;
18519
0
  }
18520
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
18521
0
    return 0;
18522
0
  }
18523
18524
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
18525
0
  int i;
18526
0
  for (i = 0; i < 63; i++) {
18527
0
    if (v->vtable_name == wuffs_base__hasher_u32__vtable_name) {
18528
0
      const wuffs_base__hasher_u32__func_ptrs* func_ptrs =
18529
0
          (const wuffs_base__hasher_u32__func_ptrs*)(v->function_pointers);
18530
0
      return (*func_ptrs->update_u32)(self, a_x);
18531
0
    } else if (v->vtable_name == NULL) {
18532
0
      break;
18533
0
    }
18534
0
    v++;
18535
0
  }
18536
18537
0
  return 0;
18538
0
}
18539
18540
// --------
18541
18542
WUFFS_BASE__GENERATED_C_CODE
18543
WUFFS_BASE__MAYBE_STATIC uint64_t
18544
wuffs_base__hasher_u64__checksum_u64(
18545
0
    const wuffs_base__hasher_u64* self) {
18546
0
  if (!self) {
18547
0
    return 0;
18548
0
  }
18549
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
18550
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
18551
0
    return 0;
18552
0
  }
18553
18554
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
18555
0
  int i;
18556
0
  for (i = 0; i < 63; i++) {
18557
0
    if (v->vtable_name == wuffs_base__hasher_u64__vtable_name) {
18558
0
      const wuffs_base__hasher_u64__func_ptrs* func_ptrs =
18559
0
          (const wuffs_base__hasher_u64__func_ptrs*)(v->function_pointers);
18560
0
      return (*func_ptrs->checksum_u64)(self);
18561
0
    } else if (v->vtable_name == NULL) {
18562
0
      break;
18563
0
    }
18564
0
    v++;
18565
0
  }
18566
18567
0
  return 0;
18568
0
}
18569
18570
WUFFS_BASE__GENERATED_C_CODE
18571
WUFFS_BASE__MAYBE_STATIC uint64_t
18572
wuffs_base__hasher_u64__get_quirk(
18573
    const wuffs_base__hasher_u64* self,
18574
0
    uint32_t a_key) {
18575
0
  if (!self) {
18576
0
    return 0;
18577
0
  }
18578
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
18579
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
18580
0
    return 0;
18581
0
  }
18582
18583
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
18584
0
  int i;
18585
0
  for (i = 0; i < 63; i++) {
18586
0
    if (v->vtable_name == wuffs_base__hasher_u64__vtable_name) {
18587
0
      const wuffs_base__hasher_u64__func_ptrs* func_ptrs =
18588
0
          (const wuffs_base__hasher_u64__func_ptrs*)(v->function_pointers);
18589
0
      return (*func_ptrs->get_quirk)(self, a_key);
18590
0
    } else if (v->vtable_name == NULL) {
18591
0
      break;
18592
0
    }
18593
0
    v++;
18594
0
  }
18595
18596
0
  return 0;
18597
0
}
18598
18599
WUFFS_BASE__GENERATED_C_CODE
18600
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
18601
wuffs_base__hasher_u64__set_quirk(
18602
    wuffs_base__hasher_u64* self,
18603
    uint32_t a_key,
18604
0
    uint64_t a_value) {
18605
0
  if (!self) {
18606
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
18607
0
  }
18608
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
18609
0
    return wuffs_base__make_status(
18610
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
18611
0
            ? wuffs_base__error__disabled_by_previous_error
18612
0
            : wuffs_base__error__initialize_not_called);
18613
0
  }
18614
18615
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
18616
0
  int i;
18617
0
  for (i = 0; i < 63; i++) {
18618
0
    if (v->vtable_name == wuffs_base__hasher_u64__vtable_name) {
18619
0
      const wuffs_base__hasher_u64__func_ptrs* func_ptrs =
18620
0
          (const wuffs_base__hasher_u64__func_ptrs*)(v->function_pointers);
18621
0
      return (*func_ptrs->set_quirk)(self, a_key, a_value);
18622
0
    } else if (v->vtable_name == NULL) {
18623
0
      break;
18624
0
    }
18625
0
    v++;
18626
0
  }
18627
18628
0
  return wuffs_base__make_status(wuffs_base__error__bad_vtable);
18629
0
}
18630
18631
WUFFS_BASE__GENERATED_C_CODE
18632
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
18633
wuffs_base__hasher_u64__update(
18634
    wuffs_base__hasher_u64* self,
18635
0
    wuffs_base__slice_u8 a_x) {
18636
0
  if (!self) {
18637
0
    return wuffs_base__make_empty_struct();
18638
0
  }
18639
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
18640
0
    return wuffs_base__make_empty_struct();
18641
0
  }
18642
18643
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
18644
0
  int i;
18645
0
  for (i = 0; i < 63; i++) {
18646
0
    if (v->vtable_name == wuffs_base__hasher_u64__vtable_name) {
18647
0
      const wuffs_base__hasher_u64__func_ptrs* func_ptrs =
18648
0
          (const wuffs_base__hasher_u64__func_ptrs*)(v->function_pointers);
18649
0
      return (*func_ptrs->update)(self, a_x);
18650
0
    } else if (v->vtable_name == NULL) {
18651
0
      break;
18652
0
    }
18653
0
    v++;
18654
0
  }
18655
18656
0
  return wuffs_base__make_empty_struct();
18657
0
}
18658
18659
WUFFS_BASE__GENERATED_C_CODE
18660
WUFFS_BASE__MAYBE_STATIC uint64_t
18661
wuffs_base__hasher_u64__update_u64(
18662
    wuffs_base__hasher_u64* self,
18663
0
    wuffs_base__slice_u8 a_x) {
18664
0
  if (!self) {
18665
0
    return 0;
18666
0
  }
18667
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
18668
0
    return 0;
18669
0
  }
18670
18671
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
18672
0
  int i;
18673
0
  for (i = 0; i < 63; i++) {
18674
0
    if (v->vtable_name == wuffs_base__hasher_u64__vtable_name) {
18675
0
      const wuffs_base__hasher_u64__func_ptrs* func_ptrs =
18676
0
          (const wuffs_base__hasher_u64__func_ptrs*)(v->function_pointers);
18677
0
      return (*func_ptrs->update_u64)(self, a_x);
18678
0
    } else if (v->vtable_name == NULL) {
18679
0
      break;
18680
0
    }
18681
0
    v++;
18682
0
  }
18683
18684
0
  return 0;
18685
0
}
18686
18687
// --------
18688
18689
WUFFS_BASE__GENERATED_C_CODE
18690
WUFFS_BASE__MAYBE_STATIC wuffs_base__bitvec256
18691
wuffs_base__hasher_bitvec256__checksum_bitvec256(
18692
0
    const wuffs_base__hasher_bitvec256* self) {
18693
0
  if (!self) {
18694
0
    return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u);
18695
0
  }
18696
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
18697
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
18698
0
    return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u);
18699
0
  }
18700
18701
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
18702
0
  int i;
18703
0
  for (i = 0; i < 63; i++) {
18704
0
    if (v->vtable_name == wuffs_base__hasher_bitvec256__vtable_name) {
18705
0
      const wuffs_base__hasher_bitvec256__func_ptrs* func_ptrs =
18706
0
          (const wuffs_base__hasher_bitvec256__func_ptrs*)(v->function_pointers);
18707
0
      return (*func_ptrs->checksum_bitvec256)(self);
18708
0
    } else if (v->vtable_name == NULL) {
18709
0
      break;
18710
0
    }
18711
0
    v++;
18712
0
  }
18713
18714
0
  return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u);
18715
0
}
18716
18717
WUFFS_BASE__GENERATED_C_CODE
18718
WUFFS_BASE__MAYBE_STATIC uint64_t
18719
wuffs_base__hasher_bitvec256__get_quirk(
18720
    const wuffs_base__hasher_bitvec256* self,
18721
0
    uint32_t a_key) {
18722
0
  if (!self) {
18723
0
    return 0;
18724
0
  }
18725
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
18726
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
18727
0
    return 0;
18728
0
  }
18729
18730
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
18731
0
  int i;
18732
0
  for (i = 0; i < 63; i++) {
18733
0
    if (v->vtable_name == wuffs_base__hasher_bitvec256__vtable_name) {
18734
0
      const wuffs_base__hasher_bitvec256__func_ptrs* func_ptrs =
18735
0
          (const wuffs_base__hasher_bitvec256__func_ptrs*)(v->function_pointers);
18736
0
      return (*func_ptrs->get_quirk)(self, a_key);
18737
0
    } else if (v->vtable_name == NULL) {
18738
0
      break;
18739
0
    }
18740
0
    v++;
18741
0
  }
18742
18743
0
  return 0;
18744
0
}
18745
18746
WUFFS_BASE__GENERATED_C_CODE
18747
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
18748
wuffs_base__hasher_bitvec256__set_quirk(
18749
    wuffs_base__hasher_bitvec256* self,
18750
    uint32_t a_key,
18751
0
    uint64_t a_value) {
18752
0
  if (!self) {
18753
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
18754
0
  }
18755
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
18756
0
    return wuffs_base__make_status(
18757
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
18758
0
            ? wuffs_base__error__disabled_by_previous_error
18759
0
            : wuffs_base__error__initialize_not_called);
18760
0
  }
18761
18762
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
18763
0
  int i;
18764
0
  for (i = 0; i < 63; i++) {
18765
0
    if (v->vtable_name == wuffs_base__hasher_bitvec256__vtable_name) {
18766
0
      const wuffs_base__hasher_bitvec256__func_ptrs* func_ptrs =
18767
0
          (const wuffs_base__hasher_bitvec256__func_ptrs*)(v->function_pointers);
18768
0
      return (*func_ptrs->set_quirk)(self, a_key, a_value);
18769
0
    } else if (v->vtable_name == NULL) {
18770
0
      break;
18771
0
    }
18772
0
    v++;
18773
0
  }
18774
18775
0
  return wuffs_base__make_status(wuffs_base__error__bad_vtable);
18776
0
}
18777
18778
WUFFS_BASE__GENERATED_C_CODE
18779
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
18780
wuffs_base__hasher_bitvec256__update(
18781
    wuffs_base__hasher_bitvec256* self,
18782
0
    wuffs_base__slice_u8 a_x) {
18783
0
  if (!self) {
18784
0
    return wuffs_base__make_empty_struct();
18785
0
  }
18786
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
18787
0
    return wuffs_base__make_empty_struct();
18788
0
  }
18789
18790
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
18791
0
  int i;
18792
0
  for (i = 0; i < 63; i++) {
18793
0
    if (v->vtable_name == wuffs_base__hasher_bitvec256__vtable_name) {
18794
0
      const wuffs_base__hasher_bitvec256__func_ptrs* func_ptrs =
18795
0
          (const wuffs_base__hasher_bitvec256__func_ptrs*)(v->function_pointers);
18796
0
      return (*func_ptrs->update)(self, a_x);
18797
0
    } else if (v->vtable_name == NULL) {
18798
0
      break;
18799
0
    }
18800
0
    v++;
18801
0
  }
18802
18803
0
  return wuffs_base__make_empty_struct();
18804
0
}
18805
18806
WUFFS_BASE__GENERATED_C_CODE
18807
WUFFS_BASE__MAYBE_STATIC wuffs_base__bitvec256
18808
wuffs_base__hasher_bitvec256__update_bitvec256(
18809
    wuffs_base__hasher_bitvec256* self,
18810
0
    wuffs_base__slice_u8 a_x) {
18811
0
  if (!self) {
18812
0
    return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u);
18813
0
  }
18814
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
18815
0
    return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u);
18816
0
  }
18817
18818
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
18819
0
  int i;
18820
0
  for (i = 0; i < 63; i++) {
18821
0
    if (v->vtable_name == wuffs_base__hasher_bitvec256__vtable_name) {
18822
0
      const wuffs_base__hasher_bitvec256__func_ptrs* func_ptrs =
18823
0
          (const wuffs_base__hasher_bitvec256__func_ptrs*)(v->function_pointers);
18824
0
      return (*func_ptrs->update_bitvec256)(self, a_x);
18825
0
    } else if (v->vtable_name == NULL) {
18826
0
      break;
18827
0
    }
18828
0
    v++;
18829
0
  }
18830
18831
0
  return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u);
18832
0
}
18833
18834
// --------
18835
18836
WUFFS_BASE__GENERATED_C_CODE
18837
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
18838
wuffs_base__image_decoder__decode_frame(
18839
    wuffs_base__image_decoder* self,
18840
    wuffs_base__pixel_buffer* a_dst,
18841
    wuffs_base__io_buffer* a_src,
18842
    wuffs_base__pixel_blend a_blend,
18843
    wuffs_base__slice_u8 a_workbuf,
18844
6.52k
    wuffs_base__decode_frame_options* a_opts) {
18845
6.52k
  if (!self) {
18846
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
18847
0
  }
18848
6.52k
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
18849
0
    return wuffs_base__make_status(
18850
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
18851
0
            ? wuffs_base__error__disabled_by_previous_error
18852
0
            : wuffs_base__error__initialize_not_called);
18853
0
  }
18854
18855
6.52k
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
18856
6.52k
  int i;
18857
6.52k
  for (i = 0; i < 63; i++) {
18858
6.52k
    if (v->vtable_name == wuffs_base__image_decoder__vtable_name) {
18859
6.52k
      const wuffs_base__image_decoder__func_ptrs* func_ptrs =
18860
6.52k
          (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers);
18861
6.52k
      return (*func_ptrs->decode_frame)(self, a_dst, a_src, a_blend, a_workbuf, a_opts);
18862
6.52k
    } else if (v->vtable_name == NULL) {
18863
0
      break;
18864
0
    }
18865
0
    v++;
18866
0
  }
18867
18868
0
  return wuffs_base__make_status(wuffs_base__error__bad_vtable);
18869
6.52k
}
18870
18871
WUFFS_BASE__GENERATED_C_CODE
18872
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
18873
wuffs_base__image_decoder__decode_frame_config(
18874
    wuffs_base__image_decoder* self,
18875
    wuffs_base__frame_config* a_dst,
18876
6.90k
    wuffs_base__io_buffer* a_src) {
18877
6.90k
  if (!self) {
18878
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
18879
0
  }
18880
6.90k
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
18881
0
    return wuffs_base__make_status(
18882
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
18883
0
            ? wuffs_base__error__disabled_by_previous_error
18884
0
            : wuffs_base__error__initialize_not_called);
18885
0
  }
18886
18887
6.90k
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
18888
6.90k
  int i;
18889
6.90k
  for (i = 0; i < 63; i++) {
18890
6.90k
    if (v->vtable_name == wuffs_base__image_decoder__vtable_name) {
18891
6.90k
      const wuffs_base__image_decoder__func_ptrs* func_ptrs =
18892
6.90k
          (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers);
18893
6.90k
      return (*func_ptrs->decode_frame_config)(self, a_dst, a_src);
18894
6.90k
    } else if (v->vtable_name == NULL) {
18895
0
      break;
18896
0
    }
18897
0
    v++;
18898
0
  }
18899
18900
0
  return wuffs_base__make_status(wuffs_base__error__bad_vtable);
18901
6.90k
}
18902
18903
WUFFS_BASE__GENERATED_C_CODE
18904
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
18905
wuffs_base__image_decoder__decode_image_config(
18906
    wuffs_base__image_decoder* self,
18907
    wuffs_base__image_config* a_dst,
18908
5.73k
    wuffs_base__io_buffer* a_src) {
18909
5.73k
  if (!self) {
18910
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
18911
0
  }
18912
5.73k
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
18913
0
    return wuffs_base__make_status(
18914
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
18915
0
            ? wuffs_base__error__disabled_by_previous_error
18916
0
            : wuffs_base__error__initialize_not_called);
18917
0
  }
18918
18919
5.73k
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
18920
5.73k
  int i;
18921
5.73k
  for (i = 0; i < 63; i++) {
18922
5.73k
    if (v->vtable_name == wuffs_base__image_decoder__vtable_name) {
18923
5.73k
      const wuffs_base__image_decoder__func_ptrs* func_ptrs =
18924
5.73k
          (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers);
18925
5.73k
      return (*func_ptrs->decode_image_config)(self, a_dst, a_src);
18926
5.73k
    } else if (v->vtable_name == NULL) {
18927
0
      break;
18928
0
    }
18929
0
    v++;
18930
0
  }
18931
18932
0
  return wuffs_base__make_status(wuffs_base__error__bad_vtable);
18933
5.73k
}
18934
18935
WUFFS_BASE__GENERATED_C_CODE
18936
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
18937
wuffs_base__image_decoder__frame_dirty_rect(
18938
6.52k
    const wuffs_base__image_decoder* self) {
18939
6.52k
  if (!self) {
18940
0
    return wuffs_base__utility__empty_rect_ie_u32();
18941
0
  }
18942
6.52k
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
18943
6.52k
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
18944
0
    return wuffs_base__utility__empty_rect_ie_u32();
18945
0
  }
18946
18947
6.52k
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
18948
6.52k
  int i;
18949
6.52k
  for (i = 0; i < 63; i++) {
18950
6.52k
    if (v->vtable_name == wuffs_base__image_decoder__vtable_name) {
18951
6.52k
      const wuffs_base__image_decoder__func_ptrs* func_ptrs =
18952
6.52k
          (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers);
18953
6.52k
      return (*func_ptrs->frame_dirty_rect)(self);
18954
6.52k
    } else if (v->vtable_name == NULL) {
18955
0
      break;
18956
0
    }
18957
0
    v++;
18958
0
  }
18959
18960
0
  return wuffs_base__utility__empty_rect_ie_u32();
18961
6.52k
}
18962
18963
WUFFS_BASE__GENERATED_C_CODE
18964
WUFFS_BASE__MAYBE_STATIC uint64_t
18965
wuffs_base__image_decoder__get_quirk(
18966
    const wuffs_base__image_decoder* self,
18967
0
    uint32_t a_key) {
18968
0
  if (!self) {
18969
0
    return 0;
18970
0
  }
18971
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
18972
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
18973
0
    return 0;
18974
0
  }
18975
18976
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
18977
0
  int i;
18978
0
  for (i = 0; i < 63; i++) {
18979
0
    if (v->vtable_name == wuffs_base__image_decoder__vtable_name) {
18980
0
      const wuffs_base__image_decoder__func_ptrs* func_ptrs =
18981
0
          (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers);
18982
0
      return (*func_ptrs->get_quirk)(self, a_key);
18983
0
    } else if (v->vtable_name == NULL) {
18984
0
      break;
18985
0
    }
18986
0
    v++;
18987
0
  }
18988
18989
0
  return 0;
18990
0
}
18991
18992
WUFFS_BASE__GENERATED_C_CODE
18993
WUFFS_BASE__MAYBE_STATIC uint32_t
18994
wuffs_base__image_decoder__num_animation_loops(
18995
0
    const wuffs_base__image_decoder* self) {
18996
0
  if (!self) {
18997
0
    return 0;
18998
0
  }
18999
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
19000
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
19001
0
    return 0;
19002
0
  }
19003
19004
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19005
0
  int i;
19006
0
  for (i = 0; i < 63; i++) {
19007
0
    if (v->vtable_name == wuffs_base__image_decoder__vtable_name) {
19008
0
      const wuffs_base__image_decoder__func_ptrs* func_ptrs =
19009
0
          (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers);
19010
0
      return (*func_ptrs->num_animation_loops)(self);
19011
0
    } else if (v->vtable_name == NULL) {
19012
0
      break;
19013
0
    }
19014
0
    v++;
19015
0
  }
19016
19017
0
  return 0;
19018
0
}
19019
19020
WUFFS_BASE__GENERATED_C_CODE
19021
WUFFS_BASE__MAYBE_STATIC uint64_t
19022
wuffs_base__image_decoder__num_decoded_frame_configs(
19023
0
    const wuffs_base__image_decoder* self) {
19024
0
  if (!self) {
19025
0
    return 0;
19026
0
  }
19027
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
19028
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
19029
0
    return 0;
19030
0
  }
19031
19032
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19033
0
  int i;
19034
0
  for (i = 0; i < 63; i++) {
19035
0
    if (v->vtable_name == wuffs_base__image_decoder__vtable_name) {
19036
0
      const wuffs_base__image_decoder__func_ptrs* func_ptrs =
19037
0
          (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers);
19038
0
      return (*func_ptrs->num_decoded_frame_configs)(self);
19039
0
    } else if (v->vtable_name == NULL) {
19040
0
      break;
19041
0
    }
19042
0
    v++;
19043
0
  }
19044
19045
0
  return 0;
19046
0
}
19047
19048
WUFFS_BASE__GENERATED_C_CODE
19049
WUFFS_BASE__MAYBE_STATIC uint64_t
19050
wuffs_base__image_decoder__num_decoded_frames(
19051
0
    const wuffs_base__image_decoder* self) {
19052
0
  if (!self) {
19053
0
    return 0;
19054
0
  }
19055
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
19056
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
19057
0
    return 0;
19058
0
  }
19059
19060
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19061
0
  int i;
19062
0
  for (i = 0; i < 63; i++) {
19063
0
    if (v->vtable_name == wuffs_base__image_decoder__vtable_name) {
19064
0
      const wuffs_base__image_decoder__func_ptrs* func_ptrs =
19065
0
          (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers);
19066
0
      return (*func_ptrs->num_decoded_frames)(self);
19067
0
    } else if (v->vtable_name == NULL) {
19068
0
      break;
19069
0
    }
19070
0
    v++;
19071
0
  }
19072
19073
0
  return 0;
19074
0
}
19075
19076
WUFFS_BASE__GENERATED_C_CODE
19077
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
19078
wuffs_base__image_decoder__restart_frame(
19079
    wuffs_base__image_decoder* self,
19080
    uint64_t a_index,
19081
0
    uint64_t a_io_position) {
19082
0
  if (!self) {
19083
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
19084
0
  }
19085
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
19086
0
    return wuffs_base__make_status(
19087
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
19088
0
            ? wuffs_base__error__disabled_by_previous_error
19089
0
            : wuffs_base__error__initialize_not_called);
19090
0
  }
19091
19092
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19093
0
  int i;
19094
0
  for (i = 0; i < 63; i++) {
19095
0
    if (v->vtable_name == wuffs_base__image_decoder__vtable_name) {
19096
0
      const wuffs_base__image_decoder__func_ptrs* func_ptrs =
19097
0
          (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers);
19098
0
      return (*func_ptrs->restart_frame)(self, a_index, a_io_position);
19099
0
    } else if (v->vtable_name == NULL) {
19100
0
      break;
19101
0
    }
19102
0
    v++;
19103
0
  }
19104
19105
0
  return wuffs_base__make_status(wuffs_base__error__bad_vtable);
19106
0
}
19107
19108
WUFFS_BASE__GENERATED_C_CODE
19109
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
19110
wuffs_base__image_decoder__set_quirk(
19111
    wuffs_base__image_decoder* self,
19112
    uint32_t a_key,
19113
0
    uint64_t a_value) {
19114
0
  if (!self) {
19115
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
19116
0
  }
19117
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
19118
0
    return wuffs_base__make_status(
19119
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
19120
0
            ? wuffs_base__error__disabled_by_previous_error
19121
0
            : wuffs_base__error__initialize_not_called);
19122
0
  }
19123
19124
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19125
0
  int i;
19126
0
  for (i = 0; i < 63; i++) {
19127
0
    if (v->vtable_name == wuffs_base__image_decoder__vtable_name) {
19128
0
      const wuffs_base__image_decoder__func_ptrs* func_ptrs =
19129
0
          (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers);
19130
0
      return (*func_ptrs->set_quirk)(self, a_key, a_value);
19131
0
    } else if (v->vtable_name == NULL) {
19132
0
      break;
19133
0
    }
19134
0
    v++;
19135
0
  }
19136
19137
0
  return wuffs_base__make_status(wuffs_base__error__bad_vtable);
19138
0
}
19139
19140
WUFFS_BASE__GENERATED_C_CODE
19141
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
19142
wuffs_base__image_decoder__set_report_metadata(
19143
    wuffs_base__image_decoder* self,
19144
    uint32_t a_fourcc,
19145
0
    bool a_report) {
19146
0
  if (!self) {
19147
0
    return wuffs_base__make_empty_struct();
19148
0
  }
19149
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
19150
0
    return wuffs_base__make_empty_struct();
19151
0
  }
19152
19153
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19154
0
  int i;
19155
0
  for (i = 0; i < 63; i++) {
19156
0
    if (v->vtable_name == wuffs_base__image_decoder__vtable_name) {
19157
0
      const wuffs_base__image_decoder__func_ptrs* func_ptrs =
19158
0
          (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers);
19159
0
      return (*func_ptrs->set_report_metadata)(self, a_fourcc, a_report);
19160
0
    } else if (v->vtable_name == NULL) {
19161
0
      break;
19162
0
    }
19163
0
    v++;
19164
0
  }
19165
19166
0
  return wuffs_base__make_empty_struct();
19167
0
}
19168
19169
WUFFS_BASE__GENERATED_C_CODE
19170
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
19171
wuffs_base__image_decoder__tell_me_more(
19172
    wuffs_base__image_decoder* self,
19173
    wuffs_base__io_buffer* a_dst,
19174
    wuffs_base__more_information* a_minfo,
19175
0
    wuffs_base__io_buffer* a_src) {
19176
0
  if (!self) {
19177
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
19178
0
  }
19179
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
19180
0
    return wuffs_base__make_status(
19181
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
19182
0
            ? wuffs_base__error__disabled_by_previous_error
19183
0
            : wuffs_base__error__initialize_not_called);
19184
0
  }
19185
19186
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19187
0
  int i;
19188
0
  for (i = 0; i < 63; i++) {
19189
0
    if (v->vtable_name == wuffs_base__image_decoder__vtable_name) {
19190
0
      const wuffs_base__image_decoder__func_ptrs* func_ptrs =
19191
0
          (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers);
19192
0
      return (*func_ptrs->tell_me_more)(self, a_dst, a_minfo, a_src);
19193
0
    } else if (v->vtable_name == NULL) {
19194
0
      break;
19195
0
    }
19196
0
    v++;
19197
0
  }
19198
19199
0
  return wuffs_base__make_status(wuffs_base__error__bad_vtable);
19200
0
}
19201
19202
WUFFS_BASE__GENERATED_C_CODE
19203
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
19204
wuffs_base__image_decoder__workbuf_len(
19205
4.03k
    const wuffs_base__image_decoder* self) {
19206
4.03k
  if (!self) {
19207
0
    return wuffs_base__utility__empty_range_ii_u64();
19208
0
  }
19209
4.03k
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
19210
4.03k
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
19211
0
    return wuffs_base__utility__empty_range_ii_u64();
19212
0
  }
19213
19214
4.03k
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19215
4.03k
  int i;
19216
4.03k
  for (i = 0; i < 63; i++) {
19217
4.03k
    if (v->vtable_name == wuffs_base__image_decoder__vtable_name) {
19218
4.03k
      const wuffs_base__image_decoder__func_ptrs* func_ptrs =
19219
4.03k
          (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers);
19220
4.03k
      return (*func_ptrs->workbuf_len)(self);
19221
4.03k
    } else if (v->vtable_name == NULL) {
19222
0
      break;
19223
0
    }
19224
0
    v++;
19225
0
  }
19226
19227
0
  return wuffs_base__utility__empty_range_ii_u64();
19228
4.03k
}
19229
19230
// --------
19231
19232
WUFFS_BASE__GENERATED_C_CODE
19233
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
19234
wuffs_base__io_transformer__dst_history_retain_length(
19235
0
    const wuffs_base__io_transformer* self) {
19236
0
  if (!self) {
19237
0
    return wuffs_base__utility__make_optional_u63(false, 0u);
19238
0
  }
19239
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
19240
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
19241
0
    return wuffs_base__utility__make_optional_u63(false, 0u);
19242
0
  }
19243
19244
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19245
0
  int i;
19246
0
  for (i = 0; i < 63; i++) {
19247
0
    if (v->vtable_name == wuffs_base__io_transformer__vtable_name) {
19248
0
      const wuffs_base__io_transformer__func_ptrs* func_ptrs =
19249
0
          (const wuffs_base__io_transformer__func_ptrs*)(v->function_pointers);
19250
0
      return (*func_ptrs->dst_history_retain_length)(self);
19251
0
    } else if (v->vtable_name == NULL) {
19252
0
      break;
19253
0
    }
19254
0
    v++;
19255
0
  }
19256
19257
0
  return wuffs_base__utility__make_optional_u63(false, 0u);
19258
0
}
19259
19260
WUFFS_BASE__GENERATED_C_CODE
19261
WUFFS_BASE__MAYBE_STATIC uint64_t
19262
wuffs_base__io_transformer__get_quirk(
19263
    const wuffs_base__io_transformer* self,
19264
0
    uint32_t a_key) {
19265
0
  if (!self) {
19266
0
    return 0;
19267
0
  }
19268
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
19269
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
19270
0
    return 0;
19271
0
  }
19272
19273
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19274
0
  int i;
19275
0
  for (i = 0; i < 63; i++) {
19276
0
    if (v->vtable_name == wuffs_base__io_transformer__vtable_name) {
19277
0
      const wuffs_base__io_transformer__func_ptrs* func_ptrs =
19278
0
          (const wuffs_base__io_transformer__func_ptrs*)(v->function_pointers);
19279
0
      return (*func_ptrs->get_quirk)(self, a_key);
19280
0
    } else if (v->vtable_name == NULL) {
19281
0
      break;
19282
0
    }
19283
0
    v++;
19284
0
  }
19285
19286
0
  return 0;
19287
0
}
19288
19289
WUFFS_BASE__GENERATED_C_CODE
19290
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
19291
wuffs_base__io_transformer__set_quirk(
19292
    wuffs_base__io_transformer* self,
19293
    uint32_t a_key,
19294
0
    uint64_t a_value) {
19295
0
  if (!self) {
19296
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
19297
0
  }
19298
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
19299
0
    return wuffs_base__make_status(
19300
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
19301
0
            ? wuffs_base__error__disabled_by_previous_error
19302
0
            : wuffs_base__error__initialize_not_called);
19303
0
  }
19304
19305
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19306
0
  int i;
19307
0
  for (i = 0; i < 63; i++) {
19308
0
    if (v->vtable_name == wuffs_base__io_transformer__vtable_name) {
19309
0
      const wuffs_base__io_transformer__func_ptrs* func_ptrs =
19310
0
          (const wuffs_base__io_transformer__func_ptrs*)(v->function_pointers);
19311
0
      return (*func_ptrs->set_quirk)(self, a_key, a_value);
19312
0
    } else if (v->vtable_name == NULL) {
19313
0
      break;
19314
0
    }
19315
0
    v++;
19316
0
  }
19317
19318
0
  return wuffs_base__make_status(wuffs_base__error__bad_vtable);
19319
0
}
19320
19321
WUFFS_BASE__GENERATED_C_CODE
19322
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
19323
wuffs_base__io_transformer__transform_io(
19324
    wuffs_base__io_transformer* self,
19325
    wuffs_base__io_buffer* a_dst,
19326
    wuffs_base__io_buffer* a_src,
19327
0
    wuffs_base__slice_u8 a_workbuf) {
19328
0
  if (!self) {
19329
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
19330
0
  }
19331
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
19332
0
    return wuffs_base__make_status(
19333
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
19334
0
            ? wuffs_base__error__disabled_by_previous_error
19335
0
            : wuffs_base__error__initialize_not_called);
19336
0
  }
19337
19338
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19339
0
  int i;
19340
0
  for (i = 0; i < 63; i++) {
19341
0
    if (v->vtable_name == wuffs_base__io_transformer__vtable_name) {
19342
0
      const wuffs_base__io_transformer__func_ptrs* func_ptrs =
19343
0
          (const wuffs_base__io_transformer__func_ptrs*)(v->function_pointers);
19344
0
      return (*func_ptrs->transform_io)(self, a_dst, a_src, a_workbuf);
19345
0
    } else if (v->vtable_name == NULL) {
19346
0
      break;
19347
0
    }
19348
0
    v++;
19349
0
  }
19350
19351
0
  return wuffs_base__make_status(wuffs_base__error__bad_vtable);
19352
0
}
19353
19354
WUFFS_BASE__GENERATED_C_CODE
19355
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
19356
wuffs_base__io_transformer__workbuf_len(
19357
0
    const wuffs_base__io_transformer* self) {
19358
0
  if (!self) {
19359
0
    return wuffs_base__utility__empty_range_ii_u64();
19360
0
  }
19361
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
19362
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
19363
0
    return wuffs_base__utility__empty_range_ii_u64();
19364
0
  }
19365
19366
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19367
0
  int i;
19368
0
  for (i = 0; i < 63; i++) {
19369
0
    if (v->vtable_name == wuffs_base__io_transformer__vtable_name) {
19370
0
      const wuffs_base__io_transformer__func_ptrs* func_ptrs =
19371
0
          (const wuffs_base__io_transformer__func_ptrs*)(v->function_pointers);
19372
0
      return (*func_ptrs->workbuf_len)(self);
19373
0
    } else if (v->vtable_name == NULL) {
19374
0
      break;
19375
0
    }
19376
0
    v++;
19377
0
  }
19378
19379
0
  return wuffs_base__utility__empty_range_ii_u64();
19380
0
}
19381
19382
// --------
19383
19384
WUFFS_BASE__GENERATED_C_CODE
19385
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
19386
wuffs_base__token_decoder__decode_tokens(
19387
    wuffs_base__token_decoder* self,
19388
    wuffs_base__token_buffer* a_dst,
19389
    wuffs_base__io_buffer* a_src,
19390
0
    wuffs_base__slice_u8 a_workbuf) {
19391
0
  if (!self) {
19392
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
19393
0
  }
19394
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
19395
0
    return wuffs_base__make_status(
19396
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
19397
0
            ? wuffs_base__error__disabled_by_previous_error
19398
0
            : wuffs_base__error__initialize_not_called);
19399
0
  }
19400
19401
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19402
0
  int i;
19403
0
  for (i = 0; i < 63; i++) {
19404
0
    if (v->vtable_name == wuffs_base__token_decoder__vtable_name) {
19405
0
      const wuffs_base__token_decoder__func_ptrs* func_ptrs =
19406
0
          (const wuffs_base__token_decoder__func_ptrs*)(v->function_pointers);
19407
0
      return (*func_ptrs->decode_tokens)(self, a_dst, a_src, a_workbuf);
19408
0
    } else if (v->vtable_name == NULL) {
19409
0
      break;
19410
0
    }
19411
0
    v++;
19412
0
  }
19413
19414
0
  return wuffs_base__make_status(wuffs_base__error__bad_vtable);
19415
0
}
19416
19417
WUFFS_BASE__GENERATED_C_CODE
19418
WUFFS_BASE__MAYBE_STATIC uint64_t
19419
wuffs_base__token_decoder__get_quirk(
19420
    const wuffs_base__token_decoder* self,
19421
0
    uint32_t a_key) {
19422
0
  if (!self) {
19423
0
    return 0;
19424
0
  }
19425
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
19426
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
19427
0
    return 0;
19428
0
  }
19429
19430
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19431
0
  int i;
19432
0
  for (i = 0; i < 63; i++) {
19433
0
    if (v->vtable_name == wuffs_base__token_decoder__vtable_name) {
19434
0
      const wuffs_base__token_decoder__func_ptrs* func_ptrs =
19435
0
          (const wuffs_base__token_decoder__func_ptrs*)(v->function_pointers);
19436
0
      return (*func_ptrs->get_quirk)(self, a_key);
19437
0
    } else if (v->vtable_name == NULL) {
19438
0
      break;
19439
0
    }
19440
0
    v++;
19441
0
  }
19442
19443
0
  return 0;
19444
0
}
19445
19446
WUFFS_BASE__GENERATED_C_CODE
19447
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
19448
wuffs_base__token_decoder__set_quirk(
19449
    wuffs_base__token_decoder* self,
19450
    uint32_t a_key,
19451
0
    uint64_t a_value) {
19452
0
  if (!self) {
19453
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
19454
0
  }
19455
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
19456
0
    return wuffs_base__make_status(
19457
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
19458
0
            ? wuffs_base__error__disabled_by_previous_error
19459
0
            : wuffs_base__error__initialize_not_called);
19460
0
  }
19461
19462
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19463
0
  int i;
19464
0
  for (i = 0; i < 63; i++) {
19465
0
    if (v->vtable_name == wuffs_base__token_decoder__vtable_name) {
19466
0
      const wuffs_base__token_decoder__func_ptrs* func_ptrs =
19467
0
          (const wuffs_base__token_decoder__func_ptrs*)(v->function_pointers);
19468
0
      return (*func_ptrs->set_quirk)(self, a_key, a_value);
19469
0
    } else if (v->vtable_name == NULL) {
19470
0
      break;
19471
0
    }
19472
0
    v++;
19473
0
  }
19474
19475
0
  return wuffs_base__make_status(wuffs_base__error__bad_vtable);
19476
0
}
19477
19478
WUFFS_BASE__GENERATED_C_CODE
19479
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
19480
wuffs_base__token_decoder__workbuf_len(
19481
0
    const wuffs_base__token_decoder* self) {
19482
0
  if (!self) {
19483
0
    return wuffs_base__utility__empty_range_ii_u64();
19484
0
  }
19485
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
19486
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
19487
0
    return wuffs_base__utility__empty_range_ii_u64();
19488
0
  }
19489
19490
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19491
0
  int i;
19492
0
  for (i = 0; i < 63; i++) {
19493
0
    if (v->vtable_name == wuffs_base__token_decoder__vtable_name) {
19494
0
      const wuffs_base__token_decoder__func_ptrs* func_ptrs =
19495
0
          (const wuffs_base__token_decoder__func_ptrs*)(v->function_pointers);
19496
0
      return (*func_ptrs->workbuf_len)(self);
19497
0
    } else if (v->vtable_name == NULL) {
19498
0
      break;
19499
0
    }
19500
0
    v++;
19501
0
  }
19502
19503
0
  return wuffs_base__utility__empty_range_ii_u64();
19504
0
}
19505
19506
#endif  // !defined(WUFFS_CONFIG__MODULES) ||
19507
        // defined(WUFFS_CONFIG__MODULE__BASE) ||
19508
        // defined(WUFFS_CONFIG__MODULE__BASE__INTERFACES)
19509
19510
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \
19511
    defined(WUFFS_CONFIG__MODULE__BASE__FLOATCONV)
19512
19513
// ---------------- IEEE 754 Floating Point
19514
19515
// The etc__hpd_left_shift and etc__powers_of_5 tables were printed by
19516
// script/print-hpd-left-shift.go. That script has an optional -comments flag,
19517
// whose output is not copied here, which prints further detail.
19518
//
19519
// These tables are used in
19520
// wuffs_private_impl__high_prec_dec__lshift_num_new_digits.
19521
19522
// wuffs_private_impl__hpd_left_shift[i] encodes the number of new digits
19523
// created after multiplying a positive integer by (1 << i): the additional
19524
// length in the decimal representation. For example, shifting "234" by 3
19525
// (equivalent to multiplying by 8) will produce "1872". Going from a 3-length
19526
// string to a 4-length string means that 1 new digit was added (and existing
19527
// digits may have changed).
19528
//
19529
// Shifting by i can add either N or N-1 new digits, depending on whether the
19530
// original positive integer compares >= or < to the i'th power of 5 (as 10
19531
// equals 2 * 5). Comparison is lexicographic, not numerical.
19532
//
19533
// For example, shifting by 4 (i.e. multiplying by 16) can add 1 or 2 new
19534
// digits, depending on a lexicographic comparison to (5 ** 4), i.e. "625":
19535
//  - ("1"      << 4) is "16",       which adds 1 new digit.
19536
//  - ("5678"   << 4) is "90848",    which adds 1 new digit.
19537
//  - ("624"    << 4) is "9984",     which adds 1 new digit.
19538
//  - ("62498"  << 4) is "999968",   which adds 1 new digit.
19539
//  - ("625"    << 4) is "10000",    which adds 2 new digits.
19540
//  - ("625001" << 4) is "10000016", which adds 2 new digits.
19541
//  - ("7008"   << 4) is "112128",   which adds 2 new digits.
19542
//  - ("99"     << 4) is "1584",     which adds 2 new digits.
19543
//
19544
// Thus, when i is 4, N is 2 and (5 ** i) is "625". This etc__hpd_left_shift
19545
// array encodes this as:
19546
//  - etc__hpd_left_shift[4] is 0x1006 = (2 << 11) | 0x0006.
19547
//  - etc__hpd_left_shift[5] is 0x1009 = (? << 11) | 0x0009.
19548
// where the ? isn't relevant for i == 4.
19549
//
19550
// The high 5 bits of etc__hpd_left_shift[i] is N, the higher of the two
19551
// possible number of new digits. The low 11 bits are an offset into the
19552
// etc__powers_of_5 array (of length 0x051C, so offsets fit in 11 bits). When i
19553
// is 4, its offset and the next one is 6 and 9, and etc__powers_of_5[6 .. 9]
19554
// is the string "\x06\x02\x05", so the relevant power of 5 is "625".
19555
//
19556
// Thanks to Ken Thompson for the original idea.
19557
static const uint16_t wuffs_private_impl__hpd_left_shift[65] = {
19558
    0x0000, 0x0800, 0x0801, 0x0803, 0x1006, 0x1009, 0x100D, 0x1812, 0x1817,
19559
    0x181D, 0x2024, 0x202B, 0x2033, 0x203C, 0x2846, 0x2850, 0x285B, 0x3067,
19560
    0x3073, 0x3080, 0x388E, 0x389C, 0x38AB, 0x38BB, 0x40CC, 0x40DD, 0x40EF,
19561
    0x4902, 0x4915, 0x4929, 0x513E, 0x5153, 0x5169, 0x5180, 0x5998, 0x59B0,
19562
    0x59C9, 0x61E3, 0x61FD, 0x6218, 0x6A34, 0x6A50, 0x6A6D, 0x6A8B, 0x72AA,
19563
    0x72C9, 0x72E9, 0x7B0A, 0x7B2B, 0x7B4D, 0x8370, 0x8393, 0x83B7, 0x83DC,
19564
    0x8C02, 0x8C28, 0x8C4F, 0x9477, 0x949F, 0x94C8, 0x9CF2, 0x051C, 0x051C,
19565
    0x051C, 0x051C,
19566
};
19567
19568
// wuffs_private_impl__powers_of_5 contains the powers of 5, concatenated
19569
// together: "5", "25", "125", "625", "3125", etc.
19570
static const uint8_t wuffs_private_impl__powers_of_5[0x051C] = {
19571
    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,
19572
    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,
19573
    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,
19574
    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,
19575
    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,
19576
    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,
19577
    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,
19578
    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,
19579
    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,
19580
    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,
19581
    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,
19582
    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,
19583
    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,
19584
    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,
19585
    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,
19586
    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,
19587
    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,
19588
    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,
19589
    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,
19590
    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,
19591
    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,
19592
    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,
19593
    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,
19594
    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,
19595
    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,
19596
    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,
19597
    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,
19598
    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,
19599
    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,
19600
    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,
19601
    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,
19602
    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,
19603
    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,
19604
    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,
19605
    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,
19606
    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,
19607
    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,
19608
    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,
19609
    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,
19610
    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,
19611
    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,
19612
    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,
19613
    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,
19614
    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,
19615
    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,
19616
    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,
19617
    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,
19618
    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,
19619
    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,
19620
    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,
19621
    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,
19622
    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,
19623
    6, 9, 1, 4, 0, 6, 2, 5,
19624
};
19625
19626
// --------
19627
19628
// wuffs_private_impl__powers_of_10 contains truncated approximations to the
19629
// powers of 10, ranging from 1e-307 to 1e+288 inclusive, as 596 pairs of
19630
// uint64_t values (a 128-bit mantissa).
19631
//
19632
// There's also an implicit third column (implied by a linear formula involving
19633
// the base-10 exponent) that is the base-2 exponent, biased by a magic
19634
// constant. That constant (1214 or 0x04BE) equals 1023 + 191. 1023 is the bias
19635
// for IEEE 754 double-precision floating point. 191 is ((3 * 64) - 1) and
19636
// wuffs_private_impl__parse_number_f64_eisel_lemire works with
19637
// multiples-of-64-bit mantissas.
19638
//
19639
// For example, the third row holds the approximation to 1e-305:
19640
//   0xE0B62E29_29ABA83C_331ACDAB_FE94DE87 * (2 ** (0x0049 - 0x04BE))
19641
//
19642
// Similarly, 1e+4 is approximated by:
19643
//   0x9C400000_00000000_00000000_00000000 * (2 ** (0x044C - 0x04BE))
19644
//
19645
// Similarly, 1e+68 is approximated by:
19646
//   0xED63A231_D4C4FB27_4CA7AAA8_63EE4BDD * (2 ** (0x0520 - 0x04BE))
19647
//
19648
// This table was generated by by script/print-mpb-powers-of-10.go
19649
static const uint64_t wuffs_private_impl__powers_of_10[596][2] = {
19650
    {0xA5D3B6D479F8E056, 0x8FD0C16206306BAB},  // 1e-307
19651
    {0x8F48A4899877186C, 0xB3C4F1BA87BC8696},  // 1e-306
19652
    {0x331ACDABFE94DE87, 0xE0B62E2929ABA83C},  // 1e-305
19653
    {0x9FF0C08B7F1D0B14, 0x8C71DCD9BA0B4925},  // 1e-304
19654
    {0x07ECF0AE5EE44DD9, 0xAF8E5410288E1B6F},  // 1e-303
19655
    {0xC9E82CD9F69D6150, 0xDB71E91432B1A24A},  // 1e-302
19656
    {0xBE311C083A225CD2, 0x892731AC9FAF056E},  // 1e-301
19657
    {0x6DBD630A48AAF406, 0xAB70FE17C79AC6CA},  // 1e-300
19658
    {0x092CBBCCDAD5B108, 0xD64D3D9DB981787D},  // 1e-299
19659
    {0x25BBF56008C58EA5, 0x85F0468293F0EB4E},  // 1e-298
19660
    {0xAF2AF2B80AF6F24E, 0xA76C582338ED2621},  // 1e-297
19661
    {0x1AF5AF660DB4AEE1, 0xD1476E2C07286FAA},  // 1e-296
19662
    {0x50D98D9FC890ED4D, 0x82CCA4DB847945CA},  // 1e-295
19663
    {0xE50FF107BAB528A0, 0xA37FCE126597973C},  // 1e-294
19664
    {0x1E53ED49A96272C8, 0xCC5FC196FEFD7D0C},  // 1e-293
19665
    {0x25E8E89C13BB0F7A, 0xFF77B1FCBEBCDC4F},  // 1e-292
19666
    {0x77B191618C54E9AC, 0x9FAACF3DF73609B1},  // 1e-291
19667
    {0xD59DF5B9EF6A2417, 0xC795830D75038C1D},  // 1e-290
19668
    {0x4B0573286B44AD1D, 0xF97AE3D0D2446F25},  // 1e-289
19669
    {0x4EE367F9430AEC32, 0x9BECCE62836AC577},  // 1e-288
19670
    {0x229C41F793CDA73F, 0xC2E801FB244576D5},  // 1e-287
19671
    {0x6B43527578C1110F, 0xF3A20279ED56D48A},  // 1e-286
19672
    {0x830A13896B78AAA9, 0x9845418C345644D6},  // 1e-285
19673
    {0x23CC986BC656D553, 0xBE5691EF416BD60C},  // 1e-284
19674
    {0x2CBFBE86B7EC8AA8, 0xEDEC366B11C6CB8F},  // 1e-283
19675
    {0x7BF7D71432F3D6A9, 0x94B3A202EB1C3F39},  // 1e-282
19676
    {0xDAF5CCD93FB0CC53, 0xB9E08A83A5E34F07},  // 1e-281
19677
    {0xD1B3400F8F9CFF68, 0xE858AD248F5C22C9},  // 1e-280
19678
    {0x23100809B9C21FA1, 0x91376C36D99995BE},  // 1e-279
19679
    {0xABD40A0C2832A78A, 0xB58547448FFFFB2D},  // 1e-278
19680
    {0x16C90C8F323F516C, 0xE2E69915B3FFF9F9},  // 1e-277
19681
    {0xAE3DA7D97F6792E3, 0x8DD01FAD907FFC3B},  // 1e-276
19682
    {0x99CD11CFDF41779C, 0xB1442798F49FFB4A},  // 1e-275
19683
    {0x40405643D711D583, 0xDD95317F31C7FA1D},  // 1e-274
19684
    {0x482835EA666B2572, 0x8A7D3EEF7F1CFC52},  // 1e-273
19685
    {0xDA3243650005EECF, 0xAD1C8EAB5EE43B66},  // 1e-272
19686
    {0x90BED43E40076A82, 0xD863B256369D4A40},  // 1e-271
19687
    {0x5A7744A6E804A291, 0x873E4F75E2224E68},  // 1e-270
19688
    {0x711515D0A205CB36, 0xA90DE3535AAAE202},  // 1e-269
19689
    {0x0D5A5B44CA873E03, 0xD3515C2831559A83},  // 1e-268
19690
    {0xE858790AFE9486C2, 0x8412D9991ED58091},  // 1e-267
19691
    {0x626E974DBE39A872, 0xA5178FFF668AE0B6},  // 1e-266
19692
    {0xFB0A3D212DC8128F, 0xCE5D73FF402D98E3},  // 1e-265
19693
    {0x7CE66634BC9D0B99, 0x80FA687F881C7F8E},  // 1e-264
19694
    {0x1C1FFFC1EBC44E80, 0xA139029F6A239F72},  // 1e-263
19695
    {0xA327FFB266B56220, 0xC987434744AC874E},  // 1e-262
19696
    {0x4BF1FF9F0062BAA8, 0xFBE9141915D7A922},  // 1e-261
19697
    {0x6F773FC3603DB4A9, 0x9D71AC8FADA6C9B5},  // 1e-260
19698
    {0xCB550FB4384D21D3, 0xC4CE17B399107C22},  // 1e-259
19699
    {0x7E2A53A146606A48, 0xF6019DA07F549B2B},  // 1e-258
19700
    {0x2EDA7444CBFC426D, 0x99C102844F94E0FB},  // 1e-257
19701
    {0xFA911155FEFB5308, 0xC0314325637A1939},  // 1e-256
19702
    {0x793555AB7EBA27CA, 0xF03D93EEBC589F88},  // 1e-255
19703
    {0x4BC1558B2F3458DE, 0x96267C7535B763B5},  // 1e-254
19704
    {0x9EB1AAEDFB016F16, 0xBBB01B9283253CA2},  // 1e-253
19705
    {0x465E15A979C1CADC, 0xEA9C227723EE8BCB},  // 1e-252
19706
    {0x0BFACD89EC191EC9, 0x92A1958A7675175F},  // 1e-251
19707
    {0xCEF980EC671F667B, 0xB749FAED14125D36},  // 1e-250
19708
    {0x82B7E12780E7401A, 0xE51C79A85916F484},  // 1e-249
19709
    {0xD1B2ECB8B0908810, 0x8F31CC0937AE58D2},  // 1e-248
19710
    {0x861FA7E6DCB4AA15, 0xB2FE3F0B8599EF07},  // 1e-247
19711
    {0x67A791E093E1D49A, 0xDFBDCECE67006AC9},  // 1e-246
19712
    {0xE0C8BB2C5C6D24E0, 0x8BD6A141006042BD},  // 1e-245
19713
    {0x58FAE9F773886E18, 0xAECC49914078536D},  // 1e-244
19714
    {0xAF39A475506A899E, 0xDA7F5BF590966848},  // 1e-243
19715
    {0x6D8406C952429603, 0x888F99797A5E012D},  // 1e-242
19716
    {0xC8E5087BA6D33B83, 0xAAB37FD7D8F58178},  // 1e-241
19717
    {0xFB1E4A9A90880A64, 0xD5605FCDCF32E1D6},  // 1e-240
19718
    {0x5CF2EEA09A55067F, 0x855C3BE0A17FCD26},  // 1e-239
19719
    {0xF42FAA48C0EA481E, 0xA6B34AD8C9DFC06F},  // 1e-238
19720
    {0xF13B94DAF124DA26, 0xD0601D8EFC57B08B},  // 1e-237
19721
    {0x76C53D08D6B70858, 0x823C12795DB6CE57},  // 1e-236
19722
    {0x54768C4B0C64CA6E, 0xA2CB1717B52481ED},  // 1e-235
19723
    {0xA9942F5DCF7DFD09, 0xCB7DDCDDA26DA268},  // 1e-234
19724
    {0xD3F93B35435D7C4C, 0xFE5D54150B090B02},  // 1e-233
19725
    {0xC47BC5014A1A6DAF, 0x9EFA548D26E5A6E1},  // 1e-232
19726
    {0x359AB6419CA1091B, 0xC6B8E9B0709F109A},  // 1e-231
19727
    {0xC30163D203C94B62, 0xF867241C8CC6D4C0},  // 1e-230
19728
    {0x79E0DE63425DCF1D, 0x9B407691D7FC44F8},  // 1e-229
19729
    {0x985915FC12F542E4, 0xC21094364DFB5636},  // 1e-228
19730
    {0x3E6F5B7B17B2939D, 0xF294B943E17A2BC4},  // 1e-227
19731
    {0xA705992CEECF9C42, 0x979CF3CA6CEC5B5A},  // 1e-226
19732
    {0x50C6FF782A838353, 0xBD8430BD08277231},  // 1e-225
19733
    {0xA4F8BF5635246428, 0xECE53CEC4A314EBD},  // 1e-224
19734
    {0x871B7795E136BE99, 0x940F4613AE5ED136},  // 1e-223
19735
    {0x28E2557B59846E3F, 0xB913179899F68584},  // 1e-222
19736
    {0x331AEADA2FE589CF, 0xE757DD7EC07426E5},  // 1e-221
19737
    {0x3FF0D2C85DEF7621, 0x9096EA6F3848984F},  // 1e-220
19738
    {0x0FED077A756B53A9, 0xB4BCA50B065ABE63},  // 1e-219
19739
    {0xD3E8495912C62894, 0xE1EBCE4DC7F16DFB},  // 1e-218
19740
    {0x64712DD7ABBBD95C, 0x8D3360F09CF6E4BD},  // 1e-217
19741
    {0xBD8D794D96AACFB3, 0xB080392CC4349DEC},  // 1e-216
19742
    {0xECF0D7A0FC5583A0, 0xDCA04777F541C567},  // 1e-215
19743
    {0xF41686C49DB57244, 0x89E42CAAF9491B60},  // 1e-214
19744
    {0x311C2875C522CED5, 0xAC5D37D5B79B6239},  // 1e-213
19745
    {0x7D633293366B828B, 0xD77485CB25823AC7},  // 1e-212
19746
    {0xAE5DFF9C02033197, 0x86A8D39EF77164BC},  // 1e-211
19747
    {0xD9F57F830283FDFC, 0xA8530886B54DBDEB},  // 1e-210
19748
    {0xD072DF63C324FD7B, 0xD267CAA862A12D66},  // 1e-209
19749
    {0x4247CB9E59F71E6D, 0x8380DEA93DA4BC60},  // 1e-208
19750
    {0x52D9BE85F074E608, 0xA46116538D0DEB78},  // 1e-207
19751
    {0x67902E276C921F8B, 0xCD795BE870516656},  // 1e-206
19752
    {0x00BA1CD8A3DB53B6, 0x806BD9714632DFF6},  // 1e-205
19753
    {0x80E8A40ECCD228A4, 0xA086CFCD97BF97F3},  // 1e-204
19754
    {0x6122CD128006B2CD, 0xC8A883C0FDAF7DF0},  // 1e-203
19755
    {0x796B805720085F81, 0xFAD2A4B13D1B5D6C},  // 1e-202
19756
    {0xCBE3303674053BB0, 0x9CC3A6EEC6311A63},  // 1e-201
19757
    {0xBEDBFC4411068A9C, 0xC3F490AA77BD60FC},  // 1e-200
19758
    {0xEE92FB5515482D44, 0xF4F1B4D515ACB93B},  // 1e-199
19759
    {0x751BDD152D4D1C4A, 0x991711052D8BF3C5},  // 1e-198
19760
    {0xD262D45A78A0635D, 0xBF5CD54678EEF0B6},  // 1e-197
19761
    {0x86FB897116C87C34, 0xEF340A98172AACE4},  // 1e-196
19762
    {0xD45D35E6AE3D4DA0, 0x9580869F0E7AAC0E},  // 1e-195
19763
    {0x8974836059CCA109, 0xBAE0A846D2195712},  // 1e-194
19764
    {0x2BD1A438703FC94B, 0xE998D258869FACD7},  // 1e-193
19765
    {0x7B6306A34627DDCF, 0x91FF83775423CC06},  // 1e-192
19766
    {0x1A3BC84C17B1D542, 0xB67F6455292CBF08},  // 1e-191
19767
    {0x20CABA5F1D9E4A93, 0xE41F3D6A7377EECA},  // 1e-190
19768
    {0x547EB47B7282EE9C, 0x8E938662882AF53E},  // 1e-189
19769
    {0xE99E619A4F23AA43, 0xB23867FB2A35B28D},  // 1e-188
19770
    {0x6405FA00E2EC94D4, 0xDEC681F9F4C31F31},  // 1e-187
19771
    {0xDE83BC408DD3DD04, 0x8B3C113C38F9F37E},  // 1e-186
19772
    {0x9624AB50B148D445, 0xAE0B158B4738705E},  // 1e-185
19773
    {0x3BADD624DD9B0957, 0xD98DDAEE19068C76},  // 1e-184
19774
    {0xE54CA5D70A80E5D6, 0x87F8A8D4CFA417C9},  // 1e-183
19775
    {0x5E9FCF4CCD211F4C, 0xA9F6D30A038D1DBC},  // 1e-182
19776
    {0x7647C3200069671F, 0xD47487CC8470652B},  // 1e-181
19777
    {0x29ECD9F40041E073, 0x84C8D4DFD2C63F3B},  // 1e-180
19778
    {0xF468107100525890, 0xA5FB0A17C777CF09},  // 1e-179
19779
    {0x7182148D4066EEB4, 0xCF79CC9DB955C2CC},  // 1e-178
19780
    {0xC6F14CD848405530, 0x81AC1FE293D599BF},  // 1e-177
19781
    {0xB8ADA00E5A506A7C, 0xA21727DB38CB002F},  // 1e-176
19782
    {0xA6D90811F0E4851C, 0xCA9CF1D206FDC03B},  // 1e-175
19783
    {0x908F4A166D1DA663, 0xFD442E4688BD304A},  // 1e-174
19784
    {0x9A598E4E043287FE, 0x9E4A9CEC15763E2E},  // 1e-173
19785
    {0x40EFF1E1853F29FD, 0xC5DD44271AD3CDBA},  // 1e-172
19786
    {0xD12BEE59E68EF47C, 0xF7549530E188C128},  // 1e-171
19787
    {0x82BB74F8301958CE, 0x9A94DD3E8CF578B9},  // 1e-170
19788
    {0xE36A52363C1FAF01, 0xC13A148E3032D6E7},  // 1e-169
19789
    {0xDC44E6C3CB279AC1, 0xF18899B1BC3F8CA1},  // 1e-168
19790
    {0x29AB103A5EF8C0B9, 0x96F5600F15A7B7E5},  // 1e-167
19791
    {0x7415D448F6B6F0E7, 0xBCB2B812DB11A5DE},  // 1e-166
19792
    {0x111B495B3464AD21, 0xEBDF661791D60F56},  // 1e-165
19793
    {0xCAB10DD900BEEC34, 0x936B9FCEBB25C995},  // 1e-164
19794
    {0x3D5D514F40EEA742, 0xB84687C269EF3BFB},  // 1e-163
19795
    {0x0CB4A5A3112A5112, 0xE65829B3046B0AFA},  // 1e-162
19796
    {0x47F0E785EABA72AB, 0x8FF71A0FE2C2E6DC},  // 1e-161
19797
    {0x59ED216765690F56, 0xB3F4E093DB73A093},  // 1e-160
19798
    {0x306869C13EC3532C, 0xE0F218B8D25088B8},  // 1e-159
19799
    {0x1E414218C73A13FB, 0x8C974F7383725573},  // 1e-158
19800
    {0xE5D1929EF90898FA, 0xAFBD2350644EEACF},  // 1e-157
19801
    {0xDF45F746B74ABF39, 0xDBAC6C247D62A583},  // 1e-156
19802
    {0x6B8BBA8C328EB783, 0x894BC396CE5DA772},  // 1e-155
19803
    {0x066EA92F3F326564, 0xAB9EB47C81F5114F},  // 1e-154
19804
    {0xC80A537B0EFEFEBD, 0xD686619BA27255A2},  // 1e-153
19805
    {0xBD06742CE95F5F36, 0x8613FD0145877585},  // 1e-152
19806
    {0x2C48113823B73704, 0xA798FC4196E952E7},  // 1e-151
19807
    {0xF75A15862CA504C5, 0xD17F3B51FCA3A7A0},  // 1e-150
19808
    {0x9A984D73DBE722FB, 0x82EF85133DE648C4},  // 1e-149
19809
    {0xC13E60D0D2E0EBBA, 0xA3AB66580D5FDAF5},  // 1e-148
19810
    {0x318DF905079926A8, 0xCC963FEE10B7D1B3},  // 1e-147
19811
    {0xFDF17746497F7052, 0xFFBBCFE994E5C61F},  // 1e-146
19812
    {0xFEB6EA8BEDEFA633, 0x9FD561F1FD0F9BD3},  // 1e-145
19813
    {0xFE64A52EE96B8FC0, 0xC7CABA6E7C5382C8},  // 1e-144
19814
    {0x3DFDCE7AA3C673B0, 0xF9BD690A1B68637B},  // 1e-143
19815
    {0x06BEA10CA65C084E, 0x9C1661A651213E2D},  // 1e-142
19816
    {0x486E494FCFF30A62, 0xC31BFA0FE5698DB8},  // 1e-141
19817
    {0x5A89DBA3C3EFCCFA, 0xF3E2F893DEC3F126},  // 1e-140
19818
    {0xF89629465A75E01C, 0x986DDB5C6B3A76B7},  // 1e-139
19819
    {0xF6BBB397F1135823, 0xBE89523386091465},  // 1e-138
19820
    {0x746AA07DED582E2C, 0xEE2BA6C0678B597F},  // 1e-137
19821
    {0xA8C2A44EB4571CDC, 0x94DB483840B717EF},  // 1e-136
19822
    {0x92F34D62616CE413, 0xBA121A4650E4DDEB},  // 1e-135
19823
    {0x77B020BAF9C81D17, 0xE896A0D7E51E1566},  // 1e-134
19824
    {0x0ACE1474DC1D122E, 0x915E2486EF32CD60},  // 1e-133
19825
    {0x0D819992132456BA, 0xB5B5ADA8AAFF80B8},  // 1e-132
19826
    {0x10E1FFF697ED6C69, 0xE3231912D5BF60E6},  // 1e-131
19827
    {0xCA8D3FFA1EF463C1, 0x8DF5EFABC5979C8F},  // 1e-130
19828
    {0xBD308FF8A6B17CB2, 0xB1736B96B6FD83B3},  // 1e-129
19829
    {0xAC7CB3F6D05DDBDE, 0xDDD0467C64BCE4A0},  // 1e-128
19830
    {0x6BCDF07A423AA96B, 0x8AA22C0DBEF60EE4},  // 1e-127
19831
    {0x86C16C98D2C953C6, 0xAD4AB7112EB3929D},  // 1e-126
19832
    {0xE871C7BF077BA8B7, 0xD89D64D57A607744},  // 1e-125
19833
    {0x11471CD764AD4972, 0x87625F056C7C4A8B},  // 1e-124
19834
    {0xD598E40D3DD89BCF, 0xA93AF6C6C79B5D2D},  // 1e-123
19835
    {0x4AFF1D108D4EC2C3, 0xD389B47879823479},  // 1e-122
19836
    {0xCEDF722A585139BA, 0x843610CB4BF160CB},  // 1e-121
19837
    {0xC2974EB4EE658828, 0xA54394FE1EEDB8FE},  // 1e-120
19838
    {0x733D226229FEEA32, 0xCE947A3DA6A9273E},  // 1e-119
19839
    {0x0806357D5A3F525F, 0x811CCC668829B887},  // 1e-118
19840
    {0xCA07C2DCB0CF26F7, 0xA163FF802A3426A8},  // 1e-117
19841
    {0xFC89B393DD02F0B5, 0xC9BCFF6034C13052},  // 1e-116
19842
    {0xBBAC2078D443ACE2, 0xFC2C3F3841F17C67},  // 1e-115
19843
    {0xD54B944B84AA4C0D, 0x9D9BA7832936EDC0},  // 1e-114
19844
    {0x0A9E795E65D4DF11, 0xC5029163F384A931},  // 1e-113
19845
    {0x4D4617B5FF4A16D5, 0xF64335BCF065D37D},  // 1e-112
19846
    {0x504BCED1BF8E4E45, 0x99EA0196163FA42E},  // 1e-111
19847
    {0xE45EC2862F71E1D6, 0xC06481FB9BCF8D39},  // 1e-110
19848
    {0x5D767327BB4E5A4C, 0xF07DA27A82C37088},  // 1e-109
19849
    {0x3A6A07F8D510F86F, 0x964E858C91BA2655},  // 1e-108
19850
    {0x890489F70A55368B, 0xBBE226EFB628AFEA},  // 1e-107
19851
    {0x2B45AC74CCEA842E, 0xEADAB0ABA3B2DBE5},  // 1e-106
19852
    {0x3B0B8BC90012929D, 0x92C8AE6B464FC96F},  // 1e-105
19853
    {0x09CE6EBB40173744, 0xB77ADA0617E3BBCB},  // 1e-104
19854
    {0xCC420A6A101D0515, 0xE55990879DDCAABD},  // 1e-103
19855
    {0x9FA946824A12232D, 0x8F57FA54C2A9EAB6},  // 1e-102
19856
    {0x47939822DC96ABF9, 0xB32DF8E9F3546564},  // 1e-101
19857
    {0x59787E2B93BC56F7, 0xDFF9772470297EBD},  // 1e-100
19858
    {0x57EB4EDB3C55B65A, 0x8BFBEA76C619EF36},  // 1e-99
19859
    {0xEDE622920B6B23F1, 0xAEFAE51477A06B03},  // 1e-98
19860
    {0xE95FAB368E45ECED, 0xDAB99E59958885C4},  // 1e-97
19861
    {0x11DBCB0218EBB414, 0x88B402F7FD75539B},  // 1e-96
19862
    {0xD652BDC29F26A119, 0xAAE103B5FCD2A881},  // 1e-95
19863
    {0x4BE76D3346F0495F, 0xD59944A37C0752A2},  // 1e-94
19864
    {0x6F70A4400C562DDB, 0x857FCAE62D8493A5},  // 1e-93
19865
    {0xCB4CCD500F6BB952, 0xA6DFBD9FB8E5B88E},  // 1e-92
19866
    {0x7E2000A41346A7A7, 0xD097AD07A71F26B2},  // 1e-91
19867
    {0x8ED400668C0C28C8, 0x825ECC24C873782F},  // 1e-90
19868
    {0x728900802F0F32FA, 0xA2F67F2DFA90563B},  // 1e-89
19869
    {0x4F2B40A03AD2FFB9, 0xCBB41EF979346BCA},  // 1e-88
19870
    {0xE2F610C84987BFA8, 0xFEA126B7D78186BC},  // 1e-87
19871
    {0x0DD9CA7D2DF4D7C9, 0x9F24B832E6B0F436},  // 1e-86
19872
    {0x91503D1C79720DBB, 0xC6EDE63FA05D3143},  // 1e-85
19873
    {0x75A44C6397CE912A, 0xF8A95FCF88747D94},  // 1e-84
19874
    {0xC986AFBE3EE11ABA, 0x9B69DBE1B548CE7C},  // 1e-83
19875
    {0xFBE85BADCE996168, 0xC24452DA229B021B},  // 1e-82
19876
    {0xFAE27299423FB9C3, 0xF2D56790AB41C2A2},  // 1e-81
19877
    {0xDCCD879FC967D41A, 0x97C560BA6B0919A5},  // 1e-80
19878
    {0x5400E987BBC1C920, 0xBDB6B8E905CB600F},  // 1e-79
19879
    {0x290123E9AAB23B68, 0xED246723473E3813},  // 1e-78
19880
    {0xF9A0B6720AAF6521, 0x9436C0760C86E30B},  // 1e-77
19881
    {0xF808E40E8D5B3E69, 0xB94470938FA89BCE},  // 1e-76
19882
    {0xB60B1D1230B20E04, 0xE7958CB87392C2C2},  // 1e-75
19883
    {0xB1C6F22B5E6F48C2, 0x90BD77F3483BB9B9},  // 1e-74
19884
    {0x1E38AEB6360B1AF3, 0xB4ECD5F01A4AA828},  // 1e-73
19885
    {0x25C6DA63C38DE1B0, 0xE2280B6C20DD5232},  // 1e-72
19886
    {0x579C487E5A38AD0E, 0x8D590723948A535F},  // 1e-71
19887
    {0x2D835A9DF0C6D851, 0xB0AF48EC79ACE837},  // 1e-70
19888
    {0xF8E431456CF88E65, 0xDCDB1B2798182244},  // 1e-69
19889
    {0x1B8E9ECB641B58FF, 0x8A08F0F8BF0F156B},  // 1e-68
19890
    {0xE272467E3D222F3F, 0xAC8B2D36EED2DAC5},  // 1e-67
19891
    {0x5B0ED81DCC6ABB0F, 0xD7ADF884AA879177},  // 1e-66
19892
    {0x98E947129FC2B4E9, 0x86CCBB52EA94BAEA},  // 1e-65
19893
    {0x3F2398D747B36224, 0xA87FEA27A539E9A5},  // 1e-64
19894
    {0x8EEC7F0D19A03AAD, 0xD29FE4B18E88640E},  // 1e-63
19895
    {0x1953CF68300424AC, 0x83A3EEEEF9153E89},  // 1e-62
19896
    {0x5FA8C3423C052DD7, 0xA48CEAAAB75A8E2B},  // 1e-61
19897
    {0x3792F412CB06794D, 0xCDB02555653131B6},  // 1e-60
19898
    {0xE2BBD88BBEE40BD0, 0x808E17555F3EBF11},  // 1e-59
19899
    {0x5B6ACEAEAE9D0EC4, 0xA0B19D2AB70E6ED6},  // 1e-58
19900
    {0xF245825A5A445275, 0xC8DE047564D20A8B},  // 1e-57
19901
    {0xEED6E2F0F0D56712, 0xFB158592BE068D2E},  // 1e-56
19902
    {0x55464DD69685606B, 0x9CED737BB6C4183D},  // 1e-55
19903
    {0xAA97E14C3C26B886, 0xC428D05AA4751E4C},  // 1e-54
19904
    {0xD53DD99F4B3066A8, 0xF53304714D9265DF},  // 1e-53
19905
    {0xE546A8038EFE4029, 0x993FE2C6D07B7FAB},  // 1e-52
19906
    {0xDE98520472BDD033, 0xBF8FDB78849A5F96},  // 1e-51
19907
    {0x963E66858F6D4440, 0xEF73D256A5C0F77C},  // 1e-50
19908
    {0xDDE7001379A44AA8, 0x95A8637627989AAD},  // 1e-49
19909
    {0x5560C018580D5D52, 0xBB127C53B17EC159},  // 1e-48
19910
    {0xAAB8F01E6E10B4A6, 0xE9D71B689DDE71AF},  // 1e-47
19911
    {0xCAB3961304CA70E8, 0x9226712162AB070D},  // 1e-46
19912
    {0x3D607B97C5FD0D22, 0xB6B00D69BB55C8D1},  // 1e-45
19913
    {0x8CB89A7DB77C506A, 0xE45C10C42A2B3B05},  // 1e-44
19914
    {0x77F3608E92ADB242, 0x8EB98A7A9A5B04E3},  // 1e-43
19915
    {0x55F038B237591ED3, 0xB267ED1940F1C61C},  // 1e-42
19916
    {0x6B6C46DEC52F6688, 0xDF01E85F912E37A3},  // 1e-41
19917
    {0x2323AC4B3B3DA015, 0x8B61313BBABCE2C6},  // 1e-40
19918
    {0xABEC975E0A0D081A, 0xAE397D8AA96C1B77},  // 1e-39
19919
    {0x96E7BD358C904A21, 0xD9C7DCED53C72255},  // 1e-38
19920
    {0x7E50D64177DA2E54, 0x881CEA14545C7575},  // 1e-37
19921
    {0xDDE50BD1D5D0B9E9, 0xAA242499697392D2},  // 1e-36
19922
    {0x955E4EC64B44E864, 0xD4AD2DBFC3D07787},  // 1e-35
19923
    {0xBD5AF13BEF0B113E, 0x84EC3C97DA624AB4},  // 1e-34
19924
    {0xECB1AD8AEACDD58E, 0xA6274BBDD0FADD61},  // 1e-33
19925
    {0x67DE18EDA5814AF2, 0xCFB11EAD453994BA},  // 1e-32
19926
    {0x80EACF948770CED7, 0x81CEB32C4B43FCF4},  // 1e-31
19927
    {0xA1258379A94D028D, 0xA2425FF75E14FC31},  // 1e-30
19928
    {0x096EE45813A04330, 0xCAD2F7F5359A3B3E},  // 1e-29
19929
    {0x8BCA9D6E188853FC, 0xFD87B5F28300CA0D},  // 1e-28
19930
    {0x775EA264CF55347D, 0x9E74D1B791E07E48},  // 1e-27
19931
    {0x95364AFE032A819D, 0xC612062576589DDA},  // 1e-26
19932
    {0x3A83DDBD83F52204, 0xF79687AED3EEC551},  // 1e-25
19933
    {0xC4926A9672793542, 0x9ABE14CD44753B52},  // 1e-24
19934
    {0x75B7053C0F178293, 0xC16D9A0095928A27},  // 1e-23
19935
    {0x5324C68B12DD6338, 0xF1C90080BAF72CB1},  // 1e-22
19936
    {0xD3F6FC16EBCA5E03, 0x971DA05074DA7BEE},  // 1e-21
19937
    {0x88F4BB1CA6BCF584, 0xBCE5086492111AEA},  // 1e-20
19938
    {0x2B31E9E3D06C32E5, 0xEC1E4A7DB69561A5},  // 1e-19
19939
    {0x3AFF322E62439FCF, 0x9392EE8E921D5D07},  // 1e-18
19940
    {0x09BEFEB9FAD487C2, 0xB877AA3236A4B449},  // 1e-17
19941
    {0x4C2EBE687989A9B3, 0xE69594BEC44DE15B},  // 1e-16
19942
    {0x0F9D37014BF60A10, 0x901D7CF73AB0ACD9},  // 1e-15
19943
    {0x538484C19EF38C94, 0xB424DC35095CD80F},  // 1e-14
19944
    {0x2865A5F206B06FB9, 0xE12E13424BB40E13},  // 1e-13
19945
    {0xF93F87B7442E45D3, 0x8CBCCC096F5088CB},  // 1e-12
19946
    {0xF78F69A51539D748, 0xAFEBFF0BCB24AAFE},  // 1e-11
19947
    {0xB573440E5A884D1B, 0xDBE6FECEBDEDD5BE},  // 1e-10
19948
    {0x31680A88F8953030, 0x89705F4136B4A597},  // 1e-9
19949
    {0xFDC20D2B36BA7C3D, 0xABCC77118461CEFC},  // 1e-8
19950
    {0x3D32907604691B4C, 0xD6BF94D5E57A42BC},  // 1e-7
19951
    {0xA63F9A49C2C1B10F, 0x8637BD05AF6C69B5},  // 1e-6
19952
    {0x0FCF80DC33721D53, 0xA7C5AC471B478423},  // 1e-5
19953
    {0xD3C36113404EA4A8, 0xD1B71758E219652B},  // 1e-4
19954
    {0x645A1CAC083126E9, 0x83126E978D4FDF3B},  // 1e-3
19955
    {0x3D70A3D70A3D70A3, 0xA3D70A3D70A3D70A},  // 1e-2
19956
    {0xCCCCCCCCCCCCCCCC, 0xCCCCCCCCCCCCCCCC},  // 1e-1
19957
    {0x0000000000000000, 0x8000000000000000},  // 1e0
19958
    {0x0000000000000000, 0xA000000000000000},  // 1e1
19959
    {0x0000000000000000, 0xC800000000000000},  // 1e2
19960
    {0x0000000000000000, 0xFA00000000000000},  // 1e3
19961
    {0x0000000000000000, 0x9C40000000000000},  // 1e4
19962
    {0x0000000000000000, 0xC350000000000000},  // 1e5
19963
    {0x0000000000000000, 0xF424000000000000},  // 1e6
19964
    {0x0000000000000000, 0x9896800000000000},  // 1e7
19965
    {0x0000000000000000, 0xBEBC200000000000},  // 1e8
19966
    {0x0000000000000000, 0xEE6B280000000000},  // 1e9
19967
    {0x0000000000000000, 0x9502F90000000000},  // 1e10
19968
    {0x0000000000000000, 0xBA43B74000000000},  // 1e11
19969
    {0x0000000000000000, 0xE8D4A51000000000},  // 1e12
19970
    {0x0000000000000000, 0x9184E72A00000000},  // 1e13
19971
    {0x0000000000000000, 0xB5E620F480000000},  // 1e14
19972
    {0x0000000000000000, 0xE35FA931A0000000},  // 1e15
19973
    {0x0000000000000000, 0x8E1BC9BF04000000},  // 1e16
19974
    {0x0000000000000000, 0xB1A2BC2EC5000000},  // 1e17
19975
    {0x0000000000000000, 0xDE0B6B3A76400000},  // 1e18
19976
    {0x0000000000000000, 0x8AC7230489E80000},  // 1e19
19977
    {0x0000000000000000, 0xAD78EBC5AC620000},  // 1e20
19978
    {0x0000000000000000, 0xD8D726B7177A8000},  // 1e21
19979
    {0x0000000000000000, 0x878678326EAC9000},  // 1e22
19980
    {0x0000000000000000, 0xA968163F0A57B400},  // 1e23
19981
    {0x0000000000000000, 0xD3C21BCECCEDA100},  // 1e24
19982
    {0x0000000000000000, 0x84595161401484A0},  // 1e25
19983
    {0x0000000000000000, 0xA56FA5B99019A5C8},  // 1e26
19984
    {0x0000000000000000, 0xCECB8F27F4200F3A},  // 1e27
19985
    {0x4000000000000000, 0x813F3978F8940984},  // 1e28
19986
    {0x5000000000000000, 0xA18F07D736B90BE5},  // 1e29
19987
    {0xA400000000000000, 0xC9F2C9CD04674EDE},  // 1e30
19988
    {0x4D00000000000000, 0xFC6F7C4045812296},  // 1e31
19989
    {0xF020000000000000, 0x9DC5ADA82B70B59D},  // 1e32
19990
    {0x6C28000000000000, 0xC5371912364CE305},  // 1e33
19991
    {0xC732000000000000, 0xF684DF56C3E01BC6},  // 1e34
19992
    {0x3C7F400000000000, 0x9A130B963A6C115C},  // 1e35
19993
    {0x4B9F100000000000, 0xC097CE7BC90715B3},  // 1e36
19994
    {0x1E86D40000000000, 0xF0BDC21ABB48DB20},  // 1e37
19995
    {0x1314448000000000, 0x96769950B50D88F4},  // 1e38
19996
    {0x17D955A000000000, 0xBC143FA4E250EB31},  // 1e39
19997
    {0x5DCFAB0800000000, 0xEB194F8E1AE525FD},  // 1e40
19998
    {0x5AA1CAE500000000, 0x92EFD1B8D0CF37BE},  // 1e41
19999
    {0xF14A3D9E40000000, 0xB7ABC627050305AD},  // 1e42
20000
    {0x6D9CCD05D0000000, 0xE596B7B0C643C719},  // 1e43
20001
    {0xE4820023A2000000, 0x8F7E32CE7BEA5C6F},  // 1e44
20002
    {0xDDA2802C8A800000, 0xB35DBF821AE4F38B},  // 1e45
20003
    {0xD50B2037AD200000, 0xE0352F62A19E306E},  // 1e46
20004
    {0x4526F422CC340000, 0x8C213D9DA502DE45},  // 1e47
20005
    {0x9670B12B7F410000, 0xAF298D050E4395D6},  // 1e48
20006
    {0x3C0CDD765F114000, 0xDAF3F04651D47B4C},  // 1e49
20007
    {0xA5880A69FB6AC800, 0x88D8762BF324CD0F},  // 1e50
20008
    {0x8EEA0D047A457A00, 0xAB0E93B6EFEE0053},  // 1e51
20009
    {0x72A4904598D6D880, 0xD5D238A4ABE98068},  // 1e52
20010
    {0x47A6DA2B7F864750, 0x85A36366EB71F041},  // 1e53
20011
    {0x999090B65F67D924, 0xA70C3C40A64E6C51},  // 1e54
20012
    {0xFFF4B4E3F741CF6D, 0xD0CF4B50CFE20765},  // 1e55
20013
    {0xBFF8F10E7A8921A4, 0x82818F1281ED449F},  // 1e56
20014
    {0xAFF72D52192B6A0D, 0xA321F2D7226895C7},  // 1e57
20015
    {0x9BF4F8A69F764490, 0xCBEA6F8CEB02BB39},  // 1e58
20016
    {0x02F236D04753D5B4, 0xFEE50B7025C36A08},  // 1e59
20017
    {0x01D762422C946590, 0x9F4F2726179A2245},  // 1e60
20018
    {0x424D3AD2B7B97EF5, 0xC722F0EF9D80AAD6},  // 1e61
20019
    {0xD2E0898765A7DEB2, 0xF8EBAD2B84E0D58B},  // 1e62
20020
    {0x63CC55F49F88EB2F, 0x9B934C3B330C8577},  // 1e63
20021
    {0x3CBF6B71C76B25FB, 0xC2781F49FFCFA6D5},  // 1e64
20022
    {0x8BEF464E3945EF7A, 0xF316271C7FC3908A},  // 1e65
20023
    {0x97758BF0E3CBB5AC, 0x97EDD871CFDA3A56},  // 1e66
20024
    {0x3D52EEED1CBEA317, 0xBDE94E8E43D0C8EC},  // 1e67
20025
    {0x4CA7AAA863EE4BDD, 0xED63A231D4C4FB27},  // 1e68
20026
    {0x8FE8CAA93E74EF6A, 0x945E455F24FB1CF8},  // 1e69
20027
    {0xB3E2FD538E122B44, 0xB975D6B6EE39E436},  // 1e70
20028
    {0x60DBBCA87196B616, 0xE7D34C64A9C85D44},  // 1e71
20029
    {0xBC8955E946FE31CD, 0x90E40FBEEA1D3A4A},  // 1e72
20030
    {0x6BABAB6398BDBE41, 0xB51D13AEA4A488DD},  // 1e73
20031
    {0xC696963C7EED2DD1, 0xE264589A4DCDAB14},  // 1e74
20032
    {0xFC1E1DE5CF543CA2, 0x8D7EB76070A08AEC},  // 1e75
20033
    {0x3B25A55F43294BCB, 0xB0DE65388CC8ADA8},  // 1e76
20034
    {0x49EF0EB713F39EBE, 0xDD15FE86AFFAD912},  // 1e77
20035
    {0x6E3569326C784337, 0x8A2DBF142DFCC7AB},  // 1e78
20036
    {0x49C2C37F07965404, 0xACB92ED9397BF996},  // 1e79
20037
    {0xDC33745EC97BE906, 0xD7E77A8F87DAF7FB},  // 1e80
20038
    {0x69A028BB3DED71A3, 0x86F0AC99B4E8DAFD},  // 1e81
20039
    {0xC40832EA0D68CE0C, 0xA8ACD7C0222311BC},  // 1e82
20040
    {0xF50A3FA490C30190, 0xD2D80DB02AABD62B},  // 1e83
20041
    {0x792667C6DA79E0FA, 0x83C7088E1AAB65DB},  // 1e84
20042
    {0x577001B891185938, 0xA4B8CAB1A1563F52},  // 1e85
20043
    {0xED4C0226B55E6F86, 0xCDE6FD5E09ABCF26},  // 1e86
20044
    {0x544F8158315B05B4, 0x80B05E5AC60B6178},  // 1e87
20045
    {0x696361AE3DB1C721, 0xA0DC75F1778E39D6},  // 1e88
20046
    {0x03BC3A19CD1E38E9, 0xC913936DD571C84C},  // 1e89
20047
    {0x04AB48A04065C723, 0xFB5878494ACE3A5F},  // 1e90
20048
    {0x62EB0D64283F9C76, 0x9D174B2DCEC0E47B},  // 1e91
20049
    {0x3BA5D0BD324F8394, 0xC45D1DF942711D9A},  // 1e92
20050
    {0xCA8F44EC7EE36479, 0xF5746577930D6500},  // 1e93
20051
    {0x7E998B13CF4E1ECB, 0x9968BF6ABBE85F20},  // 1e94
20052
    {0x9E3FEDD8C321A67E, 0xBFC2EF456AE276E8},  // 1e95
20053
    {0xC5CFE94EF3EA101E, 0xEFB3AB16C59B14A2},  // 1e96
20054
    {0xBBA1F1D158724A12, 0x95D04AEE3B80ECE5},  // 1e97
20055
    {0x2A8A6E45AE8EDC97, 0xBB445DA9CA61281F},  // 1e98
20056
    {0xF52D09D71A3293BD, 0xEA1575143CF97226},  // 1e99
20057
    {0x593C2626705F9C56, 0x924D692CA61BE758},  // 1e100
20058
    {0x6F8B2FB00C77836C, 0xB6E0C377CFA2E12E},  // 1e101
20059
    {0x0B6DFB9C0F956447, 0xE498F455C38B997A},  // 1e102
20060
    {0x4724BD4189BD5EAC, 0x8EDF98B59A373FEC},  // 1e103
20061
    {0x58EDEC91EC2CB657, 0xB2977EE300C50FE7},  // 1e104
20062
    {0x2F2967B66737E3ED, 0xDF3D5E9BC0F653E1},  // 1e105
20063
    {0xBD79E0D20082EE74, 0x8B865B215899F46C},  // 1e106
20064
    {0xECD8590680A3AA11, 0xAE67F1E9AEC07187},  // 1e107
20065
    {0xE80E6F4820CC9495, 0xDA01EE641A708DE9},  // 1e108
20066
    {0x3109058D147FDCDD, 0x884134FE908658B2},  // 1e109
20067
    {0xBD4B46F0599FD415, 0xAA51823E34A7EEDE},  // 1e110
20068
    {0x6C9E18AC7007C91A, 0xD4E5E2CDC1D1EA96},  // 1e111
20069
    {0x03E2CF6BC604DDB0, 0x850FADC09923329E},  // 1e112
20070
    {0x84DB8346B786151C, 0xA6539930BF6BFF45},  // 1e113
20071
    {0xE612641865679A63, 0xCFE87F7CEF46FF16},  // 1e114
20072
    {0x4FCB7E8F3F60C07E, 0x81F14FAE158C5F6E},  // 1e115
20073
    {0xE3BE5E330F38F09D, 0xA26DA3999AEF7749},  // 1e116
20074
    {0x5CADF5BFD3072CC5, 0xCB090C8001AB551C},  // 1e117
20075
    {0x73D9732FC7C8F7F6, 0xFDCB4FA002162A63},  // 1e118
20076
    {0x2867E7FDDCDD9AFA, 0x9E9F11C4014DDA7E},  // 1e119
20077
    {0xB281E1FD541501B8, 0xC646D63501A1511D},  // 1e120
20078
    {0x1F225A7CA91A4226, 0xF7D88BC24209A565},  // 1e121
20079
    {0x3375788DE9B06958, 0x9AE757596946075F},  // 1e122
20080
    {0x0052D6B1641C83AE, 0xC1A12D2FC3978937},  // 1e123
20081
    {0xC0678C5DBD23A49A, 0xF209787BB47D6B84},  // 1e124
20082
    {0xF840B7BA963646E0, 0x9745EB4D50CE6332},  // 1e125
20083
    {0xB650E5A93BC3D898, 0xBD176620A501FBFF},  // 1e126
20084
    {0xA3E51F138AB4CEBE, 0xEC5D3FA8CE427AFF},  // 1e127
20085
    {0xC66F336C36B10137, 0x93BA47C980E98CDF},  // 1e128
20086
    {0xB80B0047445D4184, 0xB8A8D9BBE123F017},  // 1e129
20087
    {0xA60DC059157491E5, 0xE6D3102AD96CEC1D},  // 1e130
20088
    {0x87C89837AD68DB2F, 0x9043EA1AC7E41392},  // 1e131
20089
    {0x29BABE4598C311FB, 0xB454E4A179DD1877},  // 1e132
20090
    {0xF4296DD6FEF3D67A, 0xE16A1DC9D8545E94},  // 1e133
20091
    {0x1899E4A65F58660C, 0x8CE2529E2734BB1D},  // 1e134
20092
    {0x5EC05DCFF72E7F8F, 0xB01AE745B101E9E4},  // 1e135
20093
    {0x76707543F4FA1F73, 0xDC21A1171D42645D},  // 1e136
20094
    {0x6A06494A791C53A8, 0x899504AE72497EBA},  // 1e137
20095
    {0x0487DB9D17636892, 0xABFA45DA0EDBDE69},  // 1e138
20096
    {0x45A9D2845D3C42B6, 0xD6F8D7509292D603},  // 1e139
20097
    {0x0B8A2392BA45A9B2, 0x865B86925B9BC5C2},  // 1e140
20098
    {0x8E6CAC7768D7141E, 0xA7F26836F282B732},  // 1e141
20099
    {0x3207D795430CD926, 0xD1EF0244AF2364FF},  // 1e142
20100
    {0x7F44E6BD49E807B8, 0x8335616AED761F1F},  // 1e143
20101
    {0x5F16206C9C6209A6, 0xA402B9C5A8D3A6E7},  // 1e144
20102
    {0x36DBA887C37A8C0F, 0xCD036837130890A1},  // 1e145
20103
    {0xC2494954DA2C9789, 0x802221226BE55A64},  // 1e146
20104
    {0xF2DB9BAA10B7BD6C, 0xA02AA96B06DEB0FD},  // 1e147
20105
    {0x6F92829494E5ACC7, 0xC83553C5C8965D3D},  // 1e148
20106
    {0xCB772339BA1F17F9, 0xFA42A8B73ABBF48C},  // 1e149
20107
    {0xFF2A760414536EFB, 0x9C69A97284B578D7},  // 1e150
20108
    {0xFEF5138519684ABA, 0xC38413CF25E2D70D},  // 1e151
20109
    {0x7EB258665FC25D69, 0xF46518C2EF5B8CD1},  // 1e152
20110
    {0xEF2F773FFBD97A61, 0x98BF2F79D5993802},  // 1e153
20111
    {0xAAFB550FFACFD8FA, 0xBEEEFB584AFF8603},  // 1e154
20112
    {0x95BA2A53F983CF38, 0xEEAABA2E5DBF6784},  // 1e155
20113
    {0xDD945A747BF26183, 0x952AB45CFA97A0B2},  // 1e156
20114
    {0x94F971119AEEF9E4, 0xBA756174393D88DF},  // 1e157
20115
    {0x7A37CD5601AAB85D, 0xE912B9D1478CEB17},  // 1e158
20116
    {0xAC62E055C10AB33A, 0x91ABB422CCB812EE},  // 1e159
20117
    {0x577B986B314D6009, 0xB616A12B7FE617AA},  // 1e160
20118
    {0xED5A7E85FDA0B80B, 0xE39C49765FDF9D94},  // 1e161
20119
    {0x14588F13BE847307, 0x8E41ADE9FBEBC27D},  // 1e162
20120
    {0x596EB2D8AE258FC8, 0xB1D219647AE6B31C},  // 1e163
20121
    {0x6FCA5F8ED9AEF3BB, 0xDE469FBD99A05FE3},  // 1e164
20122
    {0x25DE7BB9480D5854, 0x8AEC23D680043BEE},  // 1e165
20123
    {0xAF561AA79A10AE6A, 0xADA72CCC20054AE9},  // 1e166
20124
    {0x1B2BA1518094DA04, 0xD910F7FF28069DA4},  // 1e167
20125
    {0x90FB44D2F05D0842, 0x87AA9AFF79042286},  // 1e168
20126
    {0x353A1607AC744A53, 0xA99541BF57452B28},  // 1e169
20127
    {0x42889B8997915CE8, 0xD3FA922F2D1675F2},  // 1e170
20128
    {0x69956135FEBADA11, 0x847C9B5D7C2E09B7},  // 1e171
20129
    {0x43FAB9837E699095, 0xA59BC234DB398C25},  // 1e172
20130
    {0x94F967E45E03F4BB, 0xCF02B2C21207EF2E},  // 1e173
20131
    {0x1D1BE0EEBAC278F5, 0x8161AFB94B44F57D},  // 1e174
20132
    {0x6462D92A69731732, 0xA1BA1BA79E1632DC},  // 1e175
20133
    {0x7D7B8F7503CFDCFE, 0xCA28A291859BBF93},  // 1e176
20134
    {0x5CDA735244C3D43E, 0xFCB2CB35E702AF78},  // 1e177
20135
    {0x3A0888136AFA64A7, 0x9DEFBF01B061ADAB},  // 1e178
20136
    {0x088AAA1845B8FDD0, 0xC56BAEC21C7A1916},  // 1e179
20137
    {0x8AAD549E57273D45, 0xF6C69A72A3989F5B},  // 1e180
20138
    {0x36AC54E2F678864B, 0x9A3C2087A63F6399},  // 1e181
20139
    {0x84576A1BB416A7DD, 0xC0CB28A98FCF3C7F},  // 1e182
20140
    {0x656D44A2A11C51D5, 0xF0FDF2D3F3C30B9F},  // 1e183
20141
    {0x9F644AE5A4B1B325, 0x969EB7C47859E743},  // 1e184
20142
    {0x873D5D9F0DDE1FEE, 0xBC4665B596706114},  // 1e185
20143
    {0xA90CB506D155A7EA, 0xEB57FF22FC0C7959},  // 1e186
20144
    {0x09A7F12442D588F2, 0x9316FF75DD87CBD8},  // 1e187
20145
    {0x0C11ED6D538AEB2F, 0xB7DCBF5354E9BECE},  // 1e188
20146
    {0x8F1668C8A86DA5FA, 0xE5D3EF282A242E81},  // 1e189
20147
    {0xF96E017D694487BC, 0x8FA475791A569D10},  // 1e190
20148
    {0x37C981DCC395A9AC, 0xB38D92D760EC4455},  // 1e191
20149
    {0x85BBE253F47B1417, 0xE070F78D3927556A},  // 1e192
20150
    {0x93956D7478CCEC8E, 0x8C469AB843B89562},  // 1e193
20151
    {0x387AC8D1970027B2, 0xAF58416654A6BABB},  // 1e194
20152
    {0x06997B05FCC0319E, 0xDB2E51BFE9D0696A},  // 1e195
20153
    {0x441FECE3BDF81F03, 0x88FCF317F22241E2},  // 1e196
20154
    {0xD527E81CAD7626C3, 0xAB3C2FDDEEAAD25A},  // 1e197
20155
    {0x8A71E223D8D3B074, 0xD60B3BD56A5586F1},  // 1e198
20156
    {0xF6872D5667844E49, 0x85C7056562757456},  // 1e199
20157
    {0xB428F8AC016561DB, 0xA738C6BEBB12D16C},  // 1e200
20158
    {0xE13336D701BEBA52, 0xD106F86E69D785C7},  // 1e201
20159
    {0xECC0024661173473, 0x82A45B450226B39C},  // 1e202
20160
    {0x27F002D7F95D0190, 0xA34D721642B06084},  // 1e203
20161
    {0x31EC038DF7B441F4, 0xCC20CE9BD35C78A5},  // 1e204
20162
    {0x7E67047175A15271, 0xFF290242C83396CE},  // 1e205
20163
    {0x0F0062C6E984D386, 0x9F79A169BD203E41},  // 1e206
20164
    {0x52C07B78A3E60868, 0xC75809C42C684DD1},  // 1e207
20165
    {0xA7709A56CCDF8A82, 0xF92E0C3537826145},  // 1e208
20166
    {0x88A66076400BB691, 0x9BBCC7A142B17CCB},  // 1e209
20167
    {0x6ACFF893D00EA435, 0xC2ABF989935DDBFE},  // 1e210
20168
    {0x0583F6B8C4124D43, 0xF356F7EBF83552FE},  // 1e211
20169
    {0xC3727A337A8B704A, 0x98165AF37B2153DE},  // 1e212
20170
    {0x744F18C0592E4C5C, 0xBE1BF1B059E9A8D6},  // 1e213
20171
    {0x1162DEF06F79DF73, 0xEDA2EE1C7064130C},  // 1e214
20172
    {0x8ADDCB5645AC2BA8, 0x9485D4D1C63E8BE7},  // 1e215
20173
    {0x6D953E2BD7173692, 0xB9A74A0637CE2EE1},  // 1e216
20174
    {0xC8FA8DB6CCDD0437, 0xE8111C87C5C1BA99},  // 1e217
20175
    {0x1D9C9892400A22A2, 0x910AB1D4DB9914A0},  // 1e218
20176
    {0x2503BEB6D00CAB4B, 0xB54D5E4A127F59C8},  // 1e219
20177
    {0x2E44AE64840FD61D, 0xE2A0B5DC971F303A},  // 1e220
20178
    {0x5CEAECFED289E5D2, 0x8DA471A9DE737E24},  // 1e221
20179
    {0x7425A83E872C5F47, 0xB10D8E1456105DAD},  // 1e222
20180
    {0xD12F124E28F77719, 0xDD50F1996B947518},  // 1e223
20181
    {0x82BD6B70D99AAA6F, 0x8A5296FFE33CC92F},  // 1e224
20182
    {0x636CC64D1001550B, 0xACE73CBFDC0BFB7B},  // 1e225
20183
    {0x3C47F7E05401AA4E, 0xD8210BEFD30EFA5A},  // 1e226
20184
    {0x65ACFAEC34810A71, 0x8714A775E3E95C78},  // 1e227
20185
    {0x7F1839A741A14D0D, 0xA8D9D1535CE3B396},  // 1e228
20186
    {0x1EDE48111209A050, 0xD31045A8341CA07C},  // 1e229
20187
    {0x934AED0AAB460432, 0x83EA2B892091E44D},  // 1e230
20188
    {0xF81DA84D5617853F, 0xA4E4B66B68B65D60},  // 1e231
20189
    {0x36251260AB9D668E, 0xCE1DE40642E3F4B9},  // 1e232
20190
    {0xC1D72B7C6B426019, 0x80D2AE83E9CE78F3},  // 1e233
20191
    {0xB24CF65B8612F81F, 0xA1075A24E4421730},  // 1e234
20192
    {0xDEE033F26797B627, 0xC94930AE1D529CFC},  // 1e235
20193
    {0x169840EF017DA3B1, 0xFB9B7CD9A4A7443C},  // 1e236
20194
    {0x8E1F289560EE864E, 0x9D412E0806E88AA5},  // 1e237
20195
    {0xF1A6F2BAB92A27E2, 0xC491798A08A2AD4E},  // 1e238
20196
    {0xAE10AF696774B1DB, 0xF5B5D7EC8ACB58A2},  // 1e239
20197
    {0xACCA6DA1E0A8EF29, 0x9991A6F3D6BF1765},  // 1e240
20198
    {0x17FD090A58D32AF3, 0xBFF610B0CC6EDD3F},  // 1e241
20199
    {0xDDFC4B4CEF07F5B0, 0xEFF394DCFF8A948E},  // 1e242
20200
    {0x4ABDAF101564F98E, 0x95F83D0A1FB69CD9},  // 1e243
20201
    {0x9D6D1AD41ABE37F1, 0xBB764C4CA7A4440F},  // 1e244
20202
    {0x84C86189216DC5ED, 0xEA53DF5FD18D5513},  // 1e245
20203
    {0x32FD3CF5B4E49BB4, 0x92746B9BE2F8552C},  // 1e246
20204
    {0x3FBC8C33221DC2A1, 0xB7118682DBB66A77},  // 1e247
20205
    {0x0FABAF3FEAA5334A, 0xE4D5E82392A40515},  // 1e248
20206
    {0x29CB4D87F2A7400E, 0x8F05B1163BA6832D},  // 1e249
20207
    {0x743E20E9EF511012, 0xB2C71D5BCA9023F8},  // 1e250
20208
    {0x914DA9246B255416, 0xDF78E4B2BD342CF6},  // 1e251
20209
    {0x1AD089B6C2F7548E, 0x8BAB8EEFB6409C1A},  // 1e252
20210
    {0xA184AC2473B529B1, 0xAE9672ABA3D0C320},  // 1e253
20211
    {0xC9E5D72D90A2741E, 0xDA3C0F568CC4F3E8},  // 1e254
20212
    {0x7E2FA67C7A658892, 0x8865899617FB1871},  // 1e255
20213
    {0xDDBB901B98FEEAB7, 0xAA7EEBFB9DF9DE8D},  // 1e256
20214
    {0x552A74227F3EA565, 0xD51EA6FA85785631},  // 1e257
20215
    {0xD53A88958F87275F, 0x8533285C936B35DE},  // 1e258
20216
    {0x8A892ABAF368F137, 0xA67FF273B8460356},  // 1e259
20217
    {0x2D2B7569B0432D85, 0xD01FEF10A657842C},  // 1e260
20218
    {0x9C3B29620E29FC73, 0x8213F56A67F6B29B},  // 1e261
20219
    {0x8349F3BA91B47B8F, 0xA298F2C501F45F42},  // 1e262
20220
    {0x241C70A936219A73, 0xCB3F2F7642717713},  // 1e263
20221
    {0xED238CD383AA0110, 0xFE0EFB53D30DD4D7},  // 1e264
20222
    {0xF4363804324A40AA, 0x9EC95D1463E8A506},  // 1e265
20223
    {0xB143C6053EDCD0D5, 0xC67BB4597CE2CE48},  // 1e266
20224
    {0xDD94B7868E94050A, 0xF81AA16FDC1B81DA},  // 1e267
20225
    {0xCA7CF2B4191C8326, 0x9B10A4E5E9913128},  // 1e268
20226
    {0xFD1C2F611F63A3F0, 0xC1D4CE1F63F57D72},  // 1e269
20227
    {0xBC633B39673C8CEC, 0xF24A01A73CF2DCCF},  // 1e270
20228
    {0xD5BE0503E085D813, 0x976E41088617CA01},  // 1e271
20229
    {0x4B2D8644D8A74E18, 0xBD49D14AA79DBC82},  // 1e272
20230
    {0xDDF8E7D60ED1219E, 0xEC9C459D51852BA2},  // 1e273
20231
    {0xCABB90E5C942B503, 0x93E1AB8252F33B45},  // 1e274
20232
    {0x3D6A751F3B936243, 0xB8DA1662E7B00A17},  // 1e275
20233
    {0x0CC512670A783AD4, 0xE7109BFBA19C0C9D},  // 1e276
20234
    {0x27FB2B80668B24C5, 0x906A617D450187E2},  // 1e277
20235
    {0xB1F9F660802DEDF6, 0xB484F9DC9641E9DA},  // 1e278
20236
    {0x5E7873F8A0396973, 0xE1A63853BBD26451},  // 1e279
20237
    {0xDB0B487B6423E1E8, 0x8D07E33455637EB2},  // 1e280
20238
    {0x91CE1A9A3D2CDA62, 0xB049DC016ABC5E5F},  // 1e281
20239
    {0x7641A140CC7810FB, 0xDC5C5301C56B75F7},  // 1e282
20240
    {0xA9E904C87FCB0A9D, 0x89B9B3E11B6329BA},  // 1e283
20241
    {0x546345FA9FBDCD44, 0xAC2820D9623BF429},  // 1e284
20242
    {0xA97C177947AD4095, 0xD732290FBACAF133},  // 1e285
20243
    {0x49ED8EABCCCC485D, 0x867F59A9D4BED6C0},  // 1e286
20244
    {0x5C68F256BFFF5A74, 0xA81F301449EE8C70},  // 1e287
20245
    {0x73832EEC6FFF3111, 0xD226FC195C6A2F8C},  // 1e288
20246
};
20247
20248
// wuffs_private_impl__f64_powers_of_10 holds powers of 10 that can be exactly
20249
// represented by a float64 (what C calls a double).
20250
static const double wuffs_private_impl__f64_powers_of_10[23] = {
20251
    1e0,  1e1,  1e2,  1e3,  1e4,  1e5,  1e6,  1e7,  1e8,  1e9,  1e10, 1e11,
20252
    1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19, 1e20, 1e21, 1e22,
20253
};
20254
20255
// ---------------- IEEE 754 Floating Point
20256
20257
WUFFS_BASE__MAYBE_STATIC wuffs_base__lossy_value_u16  //
20258
0
wuffs_base__ieee_754_bit_representation__from_f64_to_u16_truncate(double f) {
20259
0
  uint64_t u = 0;
20260
0
  if (sizeof(uint64_t) == sizeof(double)) {
20261
0
    memcpy(&u, &f, sizeof(uint64_t));
20262
0
  }
20263
0
  uint16_t neg = ((uint16_t)((u >> 63) << 15));
20264
0
  u &= 0x7FFFFFFFFFFFFFFF;
20265
0
  uint64_t exp = u >> 52;
20266
0
  uint64_t man = u & 0x000FFFFFFFFFFFFF;
20267
20268
0
  if (exp == 0x7FF) {
20269
0
    if (man == 0) {  // Infinity.
20270
0
      wuffs_base__lossy_value_u16 ret;
20271
0
      ret.value = neg | 0x7C00;
20272
0
      ret.lossy = false;
20273
0
      return ret;
20274
0
    }
20275
    // NaN. Shift the 52 mantissa bits to 10 mantissa bits, keeping the most
20276
    // significant mantissa bit (quiet vs signaling NaNs). Also set the low 9
20277
    // bits of ret.value so that the 10-bit mantissa is non-zero.
20278
0
    wuffs_base__lossy_value_u16 ret;
20279
0
    ret.value = neg | 0x7DFF | ((uint16_t)(man >> 42));
20280
0
    ret.lossy = false;
20281
0
    return ret;
20282
20283
0
  } else if (exp > 0x40E) {  // Truncate to the largest finite f16.
20284
0
    wuffs_base__lossy_value_u16 ret;
20285
0
    ret.value = neg | 0x7BFF;
20286
0
    ret.lossy = true;
20287
0
    return ret;
20288
20289
0
  } else if (exp <= 0x3E6) {  // Truncate to zero.
20290
0
    wuffs_base__lossy_value_u16 ret;
20291
0
    ret.value = neg;
20292
0
    ret.lossy = (u != 0);
20293
0
    return ret;
20294
20295
0
  } else if (exp <= 0x3F0) {  // Normal f64, subnormal f16.
20296
    // Convert from a 53-bit mantissa (after realizing the implicit bit) to a
20297
    // 10-bit mantissa and then adjust for the exponent.
20298
0
    man |= 0x0010000000000000;
20299
0
    uint32_t shift = ((uint32_t)(1051 - exp));  // 1051 = 0x3F0 + 53 - 10.
20300
0
    uint64_t shifted_man = man >> shift;
20301
0
    wuffs_base__lossy_value_u16 ret;
20302
0
    ret.value = neg | ((uint16_t)shifted_man);
20303
0
    ret.lossy = (shifted_man << shift) != man;
20304
0
    return ret;
20305
0
  }
20306
20307
  // Normal f64, normal f16.
20308
20309
  // Re-bias from 1023 to 15 and shift above f16's 10 mantissa bits.
20310
0
  exp = (exp - 1008) << 10;  // 1008 = 1023 - 15 = 0x3FF - 0xF.
20311
20312
  // Convert from a 52-bit mantissa (excluding the implicit bit) to a 10-bit
20313
  // mantissa (again excluding the implicit bit). We lose some information if
20314
  // any of the bottom 42 bits are non-zero.
20315
0
  wuffs_base__lossy_value_u16 ret;
20316
0
  ret.value = neg | ((uint16_t)exp) | ((uint16_t)(man >> 42));
20317
0
  ret.lossy = (man << 22) != 0;
20318
0
  return ret;
20319
0
}
20320
20321
WUFFS_BASE__MAYBE_STATIC wuffs_base__lossy_value_u32  //
20322
0
wuffs_base__ieee_754_bit_representation__from_f64_to_u32_truncate(double f) {
20323
0
  uint64_t u = 0;
20324
0
  if (sizeof(uint64_t) == sizeof(double)) {
20325
0
    memcpy(&u, &f, sizeof(uint64_t));
20326
0
  }
20327
0
  uint32_t neg = ((uint32_t)(u >> 63)) << 31;
20328
0
  u &= 0x7FFFFFFFFFFFFFFF;
20329
0
  uint64_t exp = u >> 52;
20330
0
  uint64_t man = u & 0x000FFFFFFFFFFFFF;
20331
20332
0
  if (exp == 0x7FF) {
20333
0
    if (man == 0) {  // Infinity.
20334
0
      wuffs_base__lossy_value_u32 ret;
20335
0
      ret.value = neg | 0x7F800000;
20336
0
      ret.lossy = false;
20337
0
      return ret;
20338
0
    }
20339
    // NaN. Shift the 52 mantissa bits to 23 mantissa bits, keeping the most
20340
    // significant mantissa bit (quiet vs signaling NaNs). Also set the low 22
20341
    // bits of ret.value so that the 23-bit mantissa is non-zero.
20342
0
    wuffs_base__lossy_value_u32 ret;
20343
0
    ret.value = neg | 0x7FBFFFFF | ((uint32_t)(man >> 29));
20344
0
    ret.lossy = false;
20345
0
    return ret;
20346
20347
0
  } else if (exp > 0x47E) {  // Truncate to the largest finite f32.
20348
0
    wuffs_base__lossy_value_u32 ret;
20349
0
    ret.value = neg | 0x7F7FFFFF;
20350
0
    ret.lossy = true;
20351
0
    return ret;
20352
20353
0
  } else if (exp <= 0x369) {  // Truncate to zero.
20354
0
    wuffs_base__lossy_value_u32 ret;
20355
0
    ret.value = neg;
20356
0
    ret.lossy = (u != 0);
20357
0
    return ret;
20358
20359
0
  } else if (exp <= 0x380) {  // Normal f64, subnormal f32.
20360
    // Convert from a 53-bit mantissa (after realizing the implicit bit) to a
20361
    // 23-bit mantissa and then adjust for the exponent.
20362
0
    man |= 0x0010000000000000;
20363
0
    uint32_t shift = ((uint32_t)(926 - exp));  // 926 = 0x380 + 53 - 23.
20364
0
    uint64_t shifted_man = man >> shift;
20365
0
    wuffs_base__lossy_value_u32 ret;
20366
0
    ret.value = neg | ((uint32_t)shifted_man);
20367
0
    ret.lossy = (shifted_man << shift) != man;
20368
0
    return ret;
20369
0
  }
20370
20371
  // Normal f64, normal f32.
20372
20373
  // Re-bias from 1023 to 127 and shift above f32's 23 mantissa bits.
20374
0
  exp = (exp - 896) << 23;  // 896 = 1023 - 127 = 0x3FF - 0x7F.
20375
20376
  // Convert from a 52-bit mantissa (excluding the implicit bit) to a 23-bit
20377
  // mantissa (again excluding the implicit bit). We lose some information if
20378
  // any of the bottom 29 bits are non-zero.
20379
0
  wuffs_base__lossy_value_u32 ret;
20380
0
  ret.value = neg | ((uint32_t)exp) | ((uint32_t)(man >> 29));
20381
0
  ret.lossy = (man << 35) != 0;
20382
0
  return ret;
20383
0
}
20384
20385
// --------
20386
20387
0
#define WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE 2047
20388
0
#define WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION 800
20389
20390
// WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL is the largest N such that
20391
// ((10 << N) < (1 << 64)).
20392
0
#define WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL 60
20393
20394
// wuffs_private_impl__high_prec_dec (abbreviated as HPD) is a fixed precision
20395
// floating point decimal number, augmented with ยฑinfinity values, but it
20396
// cannot represent NaN (Not a Number).
20397
//
20398
// "High precision" means that the mantissa holds 800 decimal digits. 800 is
20399
// WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION.
20400
//
20401
// An HPD isn't for general purpose arithmetic, only for conversions to and
20402
// from IEEE 754 double-precision floating point, where the largest and
20403
// smallest positive, finite values are approximately 1.8e+308 and 4.9e-324.
20404
// HPD exponents above +2047 mean infinity, below -2047 mean zero. The ยฑ2047
20405
// bounds are further away from zero than ยฑ(324 + 800), where 800 and 2047 is
20406
// WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION and
20407
// WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE.
20408
//
20409
// digits[.. num_digits] are the number's digits in big-endian order. The
20410
// uint8_t values are in the range [0 ..= 9], not ['0' ..= '9'], where e.g. '7'
20411
// is the ASCII value 0x37.
20412
//
20413
// decimal_point is the index (within digits) of the decimal point. It may be
20414
// negative or be larger than num_digits, in which case the explicit digits are
20415
// padded with implicit zeroes.
20416
//
20417
// For example, if num_digits is 3 and digits is "\x07\x08\x09":
20418
//  - A decimal_point of -2 means ".00789"
20419
//  - A decimal_point of -1 means ".0789"
20420
//  - A decimal_point of +0 means ".789"
20421
//  - A decimal_point of +1 means "7.89"
20422
//  - A decimal_point of +2 means "78.9"
20423
//  - A decimal_point of +3 means "789."
20424
//  - A decimal_point of +4 means "7890."
20425
//  - A decimal_point of +5 means "78900."
20426
//
20427
// As above, a decimal_point higher than +2047 means that the overall value is
20428
// infinity, lower than -2047 means zero.
20429
//
20430
// negative is a sign bit. An HPD can distinguish positive and negative zero.
20431
//
20432
// truncated is whether there are more than
20433
// WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION digits, and at least one of those
20434
// extra digits are non-zero. The existence of long-tail digits can affect
20435
// rounding.
20436
//
20437
// The "all fields are zero" value is valid, and represents the number +0.
20438
typedef struct wuffs_private_impl__high_prec_dec__struct {
20439
  uint32_t num_digits;
20440
  int32_t decimal_point;
20441
  bool negative;
20442
  bool truncated;
20443
  uint8_t digits[WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION];
20444
} wuffs_private_impl__high_prec_dec;
20445
20446
// wuffs_private_impl__high_prec_dec__trim trims trailing zeroes from the
20447
// h->digits[.. h->num_digits] slice. They have no benefit, since we explicitly
20448
// track h->decimal_point.
20449
//
20450
// Preconditions:
20451
//  - h is non-NULL.
20452
static inline void  //
20453
0
wuffs_private_impl__high_prec_dec__trim(wuffs_private_impl__high_prec_dec* h) {
20454
0
  while ((h->num_digits > 0) && (h->digits[h->num_digits - 1] == 0)) {
20455
0
    h->num_digits--;
20456
0
  }
20457
0
}
20458
20459
// wuffs_private_impl__high_prec_dec__assign sets h to represent the number x.
20460
//
20461
// Preconditions:
20462
//  - h is non-NULL.
20463
static void  //
20464
wuffs_private_impl__high_prec_dec__assign(wuffs_private_impl__high_prec_dec* h,
20465
                                          uint64_t x,
20466
0
                                          bool negative) {
20467
0
  uint32_t n = 0;
20468
20469
  // Set h->digits.
20470
0
  if (x > 0) {
20471
    // Calculate the digits, working right-to-left. After we determine n (how
20472
    // many digits there are), copy from buf to h->digits.
20473
    //
20474
    // UINT64_MAX, 18446744073709551615, is 20 digits long. It can be faster to
20475
    // copy a constant number of bytes than a variable number (20 instead of
20476
    // n). Make buf large enough (and start writing to it from the middle) so
20477
    // that can we always copy 20 bytes: the slice buf[(20-n) .. (40-n)].
20478
0
    uint8_t buf[40] = {0};
20479
0
    uint8_t* ptr = &buf[20];
20480
0
    do {
20481
0
      uint64_t remaining = x / 10;
20482
0
      x -= remaining * 10;
20483
0
      ptr--;
20484
0
      *ptr = (uint8_t)x;
20485
0
      n++;
20486
0
      x = remaining;
20487
0
    } while (x > 0);
20488
0
    memcpy(h->digits, ptr, 20);
20489
0
  }
20490
20491
  // Set h's other fields.
20492
0
  h->num_digits = n;
20493
0
  h->decimal_point = (int32_t)n;
20494
0
  h->negative = negative;
20495
0
  h->truncated = false;
20496
0
  wuffs_private_impl__high_prec_dec__trim(h);
20497
0
}
20498
20499
static wuffs_base__status  //
20500
wuffs_private_impl__high_prec_dec__parse(wuffs_private_impl__high_prec_dec* h,
20501
                                         wuffs_base__slice_u8 s,
20502
0
                                         uint32_t options) {
20503
0
  if (!h) {
20504
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
20505
0
  }
20506
0
  h->num_digits = 0;
20507
0
  h->decimal_point = 0;
20508
0
  h->negative = false;
20509
0
  h->truncated = false;
20510
20511
0
  uint8_t* p = s.ptr;
20512
0
  uint8_t* q = s.ptr + s.len;
20513
20514
0
  if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) {
20515
0
    for (;; p++) {
20516
0
      if (p >= q) {
20517
0
        return wuffs_base__make_status(wuffs_base__error__bad_argument);
20518
0
      } else if (*p != '_') {
20519
0
        break;
20520
0
      }
20521
0
    }
20522
0
  }
20523
20524
  // Parse sign.
20525
0
  do {
20526
0
    if (*p == '+') {
20527
0
      p++;
20528
0
    } else if (*p == '-') {
20529
0
      h->negative = true;
20530
0
      p++;
20531
0
    } else {
20532
0
      break;
20533
0
    }
20534
0
    if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) {
20535
0
      for (;; p++) {
20536
0
        if (p >= q) {
20537
0
          return wuffs_base__make_status(wuffs_base__error__bad_argument);
20538
0
        } else if (*p != '_') {
20539
0
          break;
20540
0
        }
20541
0
      }
20542
0
    }
20543
0
  } while (0);
20544
20545
  // Parse digits, up to (and including) a '.', 'E' or 'e'. Examples for each
20546
  // limb in this if-else chain:
20547
  //  - "0.789"
20548
  //  - "1002.789"
20549
  //  - ".789"
20550
  //  - Other (invalid input).
20551
0
  uint32_t nd = 0;
20552
0
  int32_t dp = 0;
20553
0
  bool no_digits_before_separator = false;
20554
0
  if (('0' == *p) &&
20555
0
      !(options &
20556
0
        WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_MULTIPLE_LEADING_ZEROES)) {
20557
0
    p++;
20558
0
    for (;; p++) {
20559
0
      if (p >= q) {
20560
0
        goto after_all;
20561
0
      } else if (*p ==
20562
0
                 ((options &
20563
0
                   WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA)
20564
0
                      ? ','
20565
0
                      : '.')) {
20566
0
        p++;
20567
0
        goto after_sep;
20568
0
      } else if ((*p == 'E') || (*p == 'e')) {
20569
0
        p++;
20570
0
        goto after_exp;
20571
0
      } else if ((*p != '_') ||
20572
0
                 !(options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) {
20573
0
        return wuffs_base__make_status(wuffs_base__error__bad_argument);
20574
0
      }
20575
0
    }
20576
20577
0
  } else if (('0' <= *p) && (*p <= '9')) {
20578
0
    if (*p == '0') {
20579
0
      for (; (p < q) && (*p == '0'); p++) {
20580
0
      }
20581
0
    } else {
20582
0
      h->digits[nd++] = (uint8_t)(*p - '0');
20583
0
      dp = (int32_t)nd;
20584
0
      p++;
20585
0
    }
20586
20587
0
    for (;; p++) {
20588
0
      if (p >= q) {
20589
0
        goto after_all;
20590
0
      } else if (('0' <= *p) && (*p <= '9')) {
20591
0
        if (nd < WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION) {
20592
0
          h->digits[nd++] = (uint8_t)(*p - '0');
20593
0
          dp = (int32_t)nd;
20594
0
        } else if ('0' != *p) {
20595
          // Long-tail non-zeroes set the truncated bit.
20596
0
          h->truncated = true;
20597
0
        }
20598
0
      } else if (*p ==
20599
0
                 ((options &
20600
0
                   WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA)
20601
0
                      ? ','
20602
0
                      : '.')) {
20603
0
        p++;
20604
0
        goto after_sep;
20605
0
      } else if ((*p == 'E') || (*p == 'e')) {
20606
0
        p++;
20607
0
        goto after_exp;
20608
0
      } else if ((*p != '_') ||
20609
0
                 !(options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) {
20610
0
        return wuffs_base__make_status(wuffs_base__error__bad_argument);
20611
0
      }
20612
0
    }
20613
20614
0
  } else if (*p == ((options &
20615
0
                     WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA)
20616
0
                        ? ','
20617
0
                        : '.')) {
20618
0
    p++;
20619
0
    no_digits_before_separator = true;
20620
20621
0
  } else {
20622
0
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
20623
0
  }
20624
20625
0
after_sep:
20626
0
  for (;; p++) {
20627
0
    if (p >= q) {
20628
0
      goto after_all;
20629
0
    } else if ('0' == *p) {
20630
0
      if (nd == 0) {
20631
        // Track leading zeroes implicitly.
20632
0
        dp--;
20633
0
      } else if (nd < WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION) {
20634
0
        h->digits[nd++] = (uint8_t)(*p - '0');
20635
0
      }
20636
0
    } else if (('0' < *p) && (*p <= '9')) {
20637
0
      if (nd < WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION) {
20638
0
        h->digits[nd++] = (uint8_t)(*p - '0');
20639
0
      } else {
20640
        // Long-tail non-zeroes set the truncated bit.
20641
0
        h->truncated = true;
20642
0
      }
20643
0
    } else if ((*p == 'E') || (*p == 'e')) {
20644
0
      p++;
20645
0
      goto after_exp;
20646
0
    } else if ((*p != '_') ||
20647
0
               !(options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) {
20648
0
      return wuffs_base__make_status(wuffs_base__error__bad_argument);
20649
0
    }
20650
0
  }
20651
20652
0
after_exp:
20653
0
  do {
20654
0
    if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) {
20655
0
      for (;; p++) {
20656
0
        if (p >= q) {
20657
0
          return wuffs_base__make_status(wuffs_base__error__bad_argument);
20658
0
        } else if (*p != '_') {
20659
0
          break;
20660
0
        }
20661
0
      }
20662
0
    }
20663
20664
0
    int32_t exp_sign = +1;
20665
0
    if (*p == '+') {
20666
0
      p++;
20667
0
    } else if (*p == '-') {
20668
0
      exp_sign = -1;
20669
0
      p++;
20670
0
    }
20671
20672
0
    int32_t exp = 0;
20673
0
    const int32_t exp_large = WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE +
20674
0
                              WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION;
20675
0
    bool saw_exp_digits = false;
20676
0
    for (; p < q; p++) {
20677
0
      if ((*p == '_') &&
20678
0
          (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) {
20679
        // No-op.
20680
0
      } else if (('0' <= *p) && (*p <= '9')) {
20681
0
        saw_exp_digits = true;
20682
0
        if (exp < exp_large) {
20683
0
          exp = (10 * exp) + ((int32_t)(*p - '0'));
20684
0
        }
20685
0
      } else {
20686
0
        break;
20687
0
      }
20688
0
    }
20689
0
    if (!saw_exp_digits) {
20690
0
      return wuffs_base__make_status(wuffs_base__error__bad_argument);
20691
0
    }
20692
0
    dp += exp_sign * exp;
20693
0
  } while (0);
20694
20695
0
after_all:
20696
0
  if (p != q) {
20697
0
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
20698
0
  }
20699
0
  h->num_digits = nd;
20700
0
  if (nd == 0) {
20701
0
    if (no_digits_before_separator) {
20702
0
      return wuffs_base__make_status(wuffs_base__error__bad_argument);
20703
0
    }
20704
0
    h->decimal_point = 0;
20705
0
  } else if (dp < -WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE) {
20706
0
    h->decimal_point = -WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE - 1;
20707
0
  } else if (dp > +WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE) {
20708
0
    h->decimal_point = +WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE + 1;
20709
0
  } else {
20710
0
    h->decimal_point = dp;
20711
0
  }
20712
0
  wuffs_private_impl__high_prec_dec__trim(h);
20713
0
  return wuffs_base__make_status(NULL);
20714
0
}
20715
20716
// --------
20717
20718
// wuffs_private_impl__high_prec_dec__lshift_num_new_digits returns the number
20719
// of additional decimal digits when left-shifting by shift.
20720
//
20721
// See below for preconditions.
20722
static uint32_t  //
20723
wuffs_private_impl__high_prec_dec__lshift_num_new_digits(
20724
    wuffs_private_impl__high_prec_dec* h,
20725
0
    uint32_t shift) {
20726
  // Masking with 0x3F should be unnecessary (assuming the preconditions) but
20727
  // it's cheap and ensures that we don't overflow the
20728
  // wuffs_private_impl__hpd_left_shift array.
20729
0
  shift &= 63;
20730
20731
0
  uint32_t x_a = wuffs_private_impl__hpd_left_shift[shift];
20732
0
  uint32_t x_b = wuffs_private_impl__hpd_left_shift[shift + 1];
20733
0
  uint32_t num_new_digits = x_a >> 11;
20734
0
  uint32_t pow5_a = 0x7FF & x_a;
20735
0
  uint32_t pow5_b = 0x7FF & x_b;
20736
20737
0
  const uint8_t* pow5 = &wuffs_private_impl__powers_of_5[pow5_a];
20738
0
  uint32_t i = 0;
20739
0
  uint32_t n = pow5_b - pow5_a;
20740
0
  for (; i < n; i++) {
20741
0
    if (i >= h->num_digits) {
20742
0
      return num_new_digits - 1;
20743
0
    } else if (h->digits[i] == pow5[i]) {
20744
0
      continue;
20745
0
    } else if (h->digits[i] < pow5[i]) {
20746
0
      return num_new_digits - 1;
20747
0
    } else {
20748
0
      return num_new_digits;
20749
0
    }
20750
0
  }
20751
0
  return num_new_digits;
20752
0
}
20753
20754
// --------
20755
20756
// wuffs_private_impl__high_prec_dec__rounded_integer returns the integral
20757
// (non-fractional) part of h, provided that it is 18 or fewer decimal digits.
20758
// For 19 or more digits, it returns UINT64_MAX. Note that:
20759
//  - (1 << 53) is    9007199254740992, which has 16 decimal digits.
20760
//  - (1 << 56) is   72057594037927936, which has 17 decimal digits.
20761
//  - (1 << 59) is  576460752303423488, which has 18 decimal digits.
20762
//  - (1 << 63) is 9223372036854775808, which has 19 decimal digits.
20763
// and that IEEE 754 double precision has 52 mantissa bits.
20764
//
20765
// That integral part is rounded-to-even: rounding 7.5 or 8.5 both give 8.
20766
//
20767
// h's negative bit is ignored: rounding -8.6 returns 9.
20768
//
20769
// See below for preconditions.
20770
static uint64_t  //
20771
wuffs_private_impl__high_prec_dec__rounded_integer(
20772
0
    wuffs_private_impl__high_prec_dec* h) {
20773
0
  if ((h->num_digits == 0) || (h->decimal_point < 0)) {
20774
0
    return 0;
20775
0
  } else if (h->decimal_point > 18) {
20776
0
    return UINT64_MAX;
20777
0
  }
20778
20779
0
  uint32_t dp = (uint32_t)(h->decimal_point);
20780
0
  uint64_t n = 0;
20781
0
  uint32_t i = 0;
20782
0
  for (; i < dp; i++) {
20783
0
    n = (10 * n) + ((i < h->num_digits) ? h->digits[i] : 0);
20784
0
  }
20785
20786
0
  bool round_up = false;
20787
0
  if (dp < h->num_digits) {
20788
0
    round_up = h->digits[dp] >= 5;
20789
0
    if ((h->digits[dp] == 5) && (dp + 1 == h->num_digits)) {
20790
      // We are exactly halfway. If we're truncated, round up, otherwise round
20791
      // to even.
20792
0
      round_up = h->truncated ||  //
20793
0
                 ((dp > 0) && (1 & h->digits[dp - 1]));
20794
0
    }
20795
0
  }
20796
0
  if (round_up) {
20797
0
    n++;
20798
0
  }
20799
20800
0
  return n;
20801
0
}
20802
20803
// wuffs_private_impl__high_prec_dec__small_xshift shifts h's number (where 'x'
20804
// is 'l' or 'r' for left or right) by a small shift value.
20805
//
20806
// Preconditions:
20807
//  - h is non-NULL.
20808
//  - h->decimal_point is "not extreme".
20809
//  - shift is non-zero.
20810
//  - shift is "a small shift".
20811
//
20812
// "Not extreme" means within ยฑWUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE.
20813
//
20814
// "A small shift" means not more than
20815
// WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL.
20816
//
20817
// wuffs_private_impl__high_prec_dec__rounded_integer and
20818
// wuffs_private_impl__high_prec_dec__lshift_num_new_digits have the same
20819
// preconditions.
20820
//
20821
// wuffs_private_impl__high_prec_dec__lshift keeps the first two preconditions
20822
// but not the last two. Its shift argument is signed and does not need to be
20823
// "small": zero is a no-op, positive means left shift and negative means right
20824
// shift.
20825
20826
static void  //
20827
wuffs_private_impl__high_prec_dec__small_lshift(
20828
    wuffs_private_impl__high_prec_dec* h,
20829
0
    uint32_t shift) {
20830
0
  if (h->num_digits == 0) {
20831
0
    return;
20832
0
  }
20833
0
  uint32_t num_new_digits =
20834
0
      wuffs_private_impl__high_prec_dec__lshift_num_new_digits(h, shift);
20835
0
  uint32_t rx = h->num_digits - 1;                   // Read  index.
20836
0
  uint32_t wx = h->num_digits - 1 + num_new_digits;  // Write index.
20837
0
  uint64_t n = 0;
20838
20839
  // Repeat: pick up a digit, put down a digit, right to left.
20840
0
  while (((int32_t)rx) >= 0) {
20841
0
    n += ((uint64_t)(h->digits[rx])) << shift;
20842
0
    uint64_t quo = n / 10;
20843
0
    uint64_t rem = n - (10 * quo);
20844
0
    if (wx < WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION) {
20845
0
      h->digits[wx] = (uint8_t)rem;
20846
0
    } else if (rem > 0) {
20847
0
      h->truncated = true;
20848
0
    }
20849
0
    n = quo;
20850
0
    wx--;
20851
0
    rx--;
20852
0
  }
20853
20854
  // Put down leading digits, right to left.
20855
0
  while (n > 0) {
20856
0
    uint64_t quo = n / 10;
20857
0
    uint64_t rem = n - (10 * quo);
20858
0
    if (wx < WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION) {
20859
0
      h->digits[wx] = (uint8_t)rem;
20860
0
    } else if (rem > 0) {
20861
0
      h->truncated = true;
20862
0
    }
20863
0
    n = quo;
20864
0
    wx--;
20865
0
  }
20866
20867
  // Finish.
20868
0
  h->num_digits += num_new_digits;
20869
0
  if (h->num_digits > WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION) {
20870
0
    h->num_digits = WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION;
20871
0
  }
20872
0
  h->decimal_point += (int32_t)num_new_digits;
20873
0
  wuffs_private_impl__high_prec_dec__trim(h);
20874
0
}
20875
20876
static void  //
20877
wuffs_private_impl__high_prec_dec__small_rshift(
20878
    wuffs_private_impl__high_prec_dec* h,
20879
0
    uint32_t shift) {
20880
0
  uint32_t rx = 0;  // Read  index.
20881
0
  uint32_t wx = 0;  // Write index.
20882
0
  uint64_t n = 0;
20883
20884
  // Pick up enough leading digits to cover the first shift.
20885
0
  while ((n >> shift) == 0) {
20886
0
    if (rx < h->num_digits) {
20887
      // Read a digit.
20888
0
      n = (10 * n) + h->digits[rx++];
20889
0
    } else if (n == 0) {
20890
      // h's number used to be zero and remains zero.
20891
0
      return;
20892
0
    } else {
20893
      // Read sufficient implicit trailing zeroes.
20894
0
      while ((n >> shift) == 0) {
20895
0
        n = 10 * n;
20896
0
        rx++;
20897
0
      }
20898
0
      break;
20899
0
    }
20900
0
  }
20901
0
  h->decimal_point -= ((int32_t)(rx - 1));
20902
0
  if (h->decimal_point < -WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE) {
20903
    // After the shift, h's number is effectively zero.
20904
0
    h->num_digits = 0;
20905
0
    h->decimal_point = 0;
20906
0
    h->truncated = false;
20907
0
    return;
20908
0
  }
20909
20910
  // Repeat: pick up a digit, put down a digit, left to right.
20911
0
  uint64_t mask = (((uint64_t)(1)) << shift) - 1;
20912
0
  while (rx < h->num_digits) {
20913
0
    uint8_t new_digit = ((uint8_t)(n >> shift));
20914
0
    n = (10 * (n & mask)) + h->digits[rx++];
20915
0
    h->digits[wx++] = new_digit;
20916
0
  }
20917
20918
  // Put down trailing digits, left to right.
20919
0
  while (n > 0) {
20920
0
    uint8_t new_digit = ((uint8_t)(n >> shift));
20921
0
    n = 10 * (n & mask);
20922
0
    if (wx < WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION) {
20923
0
      h->digits[wx++] = new_digit;
20924
0
    } else if (new_digit > 0) {
20925
0
      h->truncated = true;
20926
0
    }
20927
0
  }
20928
20929
  // Finish.
20930
0
  h->num_digits = wx;
20931
0
  wuffs_private_impl__high_prec_dec__trim(h);
20932
0
}
20933
20934
static void  //
20935
wuffs_private_impl__high_prec_dec__lshift(wuffs_private_impl__high_prec_dec* h,
20936
0
                                          int32_t shift) {
20937
0
  if (shift > 0) {
20938
0
    while (shift > +WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL) {
20939
0
      wuffs_private_impl__high_prec_dec__small_lshift(
20940
0
          h, WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL);
20941
0
      shift -= WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL;
20942
0
    }
20943
0
    wuffs_private_impl__high_prec_dec__small_lshift(h, ((uint32_t)(+shift)));
20944
0
  } else if (shift < 0) {
20945
0
    while (shift < -WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL) {
20946
0
      wuffs_private_impl__high_prec_dec__small_rshift(
20947
0
          h, WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL);
20948
0
      shift += WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL;
20949
0
    }
20950
0
    wuffs_private_impl__high_prec_dec__small_rshift(h, ((uint32_t)(-shift)));
20951
0
  }
20952
0
}
20953
20954
// --------
20955
20956
// wuffs_private_impl__high_prec_dec__round_etc rounds h's number. For those
20957
// functions that take an n argument, rounding produces at most n digits (which
20958
// is not necessarily at most n decimal places). Negative n values are ignored,
20959
// as well as any n greater than or equal to h's number of digits. The
20960
// etc__round_just_enough function implicitly chooses an n to implement
20961
// WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION.
20962
//
20963
// Preconditions:
20964
//  - h is non-NULL.
20965
//  - h->decimal_point is "not extreme".
20966
//
20967
// "Not extreme" means within ยฑWUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE.
20968
20969
static void  //
20970
wuffs_private_impl__high_prec_dec__round_down(
20971
    wuffs_private_impl__high_prec_dec* h,
20972
0
    int32_t n) {
20973
0
  if ((n < 0) || (h->num_digits <= (uint32_t)n)) {
20974
0
    return;
20975
0
  }
20976
0
  h->num_digits = (uint32_t)(n);
20977
0
  wuffs_private_impl__high_prec_dec__trim(h);
20978
0
}
20979
20980
static void  //
20981
wuffs_private_impl__high_prec_dec__round_up(
20982
    wuffs_private_impl__high_prec_dec* h,
20983
0
    int32_t n) {
20984
0
  if ((n < 0) || (h->num_digits <= (uint32_t)n)) {
20985
0
    return;
20986
0
  }
20987
20988
0
  for (n--; n >= 0; n--) {
20989
0
    if (h->digits[n] < 9) {
20990
0
      h->digits[n]++;
20991
0
      h->num_digits = (uint32_t)(n + 1);
20992
0
      return;
20993
0
    }
20994
0
  }
20995
20996
  // The number is all 9s. Change to a single 1 and adjust the decimal point.
20997
0
  h->digits[0] = 1;
20998
0
  h->num_digits = 1;
20999
0
  h->decimal_point++;
21000
0
}
21001
21002
static void  //
21003
wuffs_private_impl__high_prec_dec__round_nearest(
21004
    wuffs_private_impl__high_prec_dec* h,
21005
0
    int32_t n) {
21006
0
  if ((n < 0) || (h->num_digits <= (uint32_t)n)) {
21007
0
    return;
21008
0
  }
21009
0
  bool up = h->digits[n] >= 5;
21010
0
  if ((h->digits[n] == 5) && ((n + 1) == ((int32_t)(h->num_digits)))) {
21011
0
    up = h->truncated ||  //
21012
0
         ((n > 0) && ((h->digits[n - 1] & 1) != 0));
21013
0
  }
21014
21015
0
  if (up) {
21016
0
    wuffs_private_impl__high_prec_dec__round_up(h, n);
21017
0
  } else {
21018
0
    wuffs_private_impl__high_prec_dec__round_down(h, n);
21019
0
  }
21020
0
}
21021
21022
static void  //
21023
wuffs_private_impl__high_prec_dec__round_just_enough(
21024
    wuffs_private_impl__high_prec_dec* h,
21025
    int32_t exp2,
21026
0
    uint64_t mantissa) {
21027
  // The magic numbers 52 and 53 in this function are because IEEE 754 double
21028
  // precision has 52 mantissa bits.
21029
  //
21030
  // Let f be the floating point number represented by exp2 and mantissa (and
21031
  // also the number in h): the number (mantissa * (2 ** (exp2 - 52))).
21032
  //
21033
  // If f is zero or a small integer, we can return early.
21034
0
  if ((mantissa == 0) ||
21035
0
      ((exp2 < 53) && (h->decimal_point >= ((int32_t)(h->num_digits))))) {
21036
0
    return;
21037
0
  }
21038
21039
  // The smallest normal f has an exp2 of -1022 and a mantissa of (1 << 52).
21040
  // Subnormal numbers have the same exp2 but a smaller mantissa.
21041
0
  static const int32_t min_incl_normal_exp2 = -1022;
21042
0
  static const uint64_t min_incl_normal_mantissa = 0x0010000000000000ul;
21043
21044
  // Compute lower and upper bounds such that any number between them (possibly
21045
  // inclusive) will round to f. First, the lower bound. Our number f is:
21046
  //   ((mantissa + 0)         * (2 ** (  exp2 - 52)))
21047
  //
21048
  // The next lowest floating point number is:
21049
  //   ((mantissa - 1)         * (2 ** (  exp2 - 52)))
21050
  // unless (mantissa - 1) drops the (1 << 52) bit and exp2 is not the
21051
  // min_incl_normal_exp2. Either way, call it:
21052
  //   ((l_mantissa)           * (2 ** (l_exp2 - 52)))
21053
  //
21054
  // The lower bound is halfway between them (noting that 52 became 53):
21055
  //   (((2 * l_mantissa) + 1) * (2 ** (l_exp2 - 53)))
21056
0
  int32_t l_exp2 = exp2;
21057
0
  uint64_t l_mantissa = mantissa - 1;
21058
0
  if ((exp2 > min_incl_normal_exp2) && (mantissa <= min_incl_normal_mantissa)) {
21059
0
    l_exp2 = exp2 - 1;
21060
0
    l_mantissa = (2 * mantissa) - 1;
21061
0
  }
21062
0
  wuffs_private_impl__high_prec_dec lower;
21063
0
  wuffs_private_impl__high_prec_dec__assign(&lower, (2 * l_mantissa) + 1,
21064
0
                                            false);
21065
0
  wuffs_private_impl__high_prec_dec__lshift(&lower, l_exp2 - 53);
21066
21067
  // Next, the upper bound. Our number f is:
21068
  //   ((mantissa + 0)       * (2 ** (exp2 - 52)))
21069
  //
21070
  // The next highest floating point number is:
21071
  //   ((mantissa + 1)       * (2 ** (exp2 - 52)))
21072
  //
21073
  // The upper bound is halfway between them (noting that 52 became 53):
21074
  //   (((2 * mantissa) + 1) * (2 ** (exp2 - 53)))
21075
0
  wuffs_private_impl__high_prec_dec upper;
21076
0
  wuffs_private_impl__high_prec_dec__assign(&upper, (2 * mantissa) + 1, false);
21077
0
  wuffs_private_impl__high_prec_dec__lshift(&upper, exp2 - 53);
21078
21079
  // The lower and upper bounds are possible outputs only if the original
21080
  // mantissa is even, so that IEEE round-to-even would round to the original
21081
  // mantissa and not its neighbors.
21082
0
  bool inclusive = (mantissa & 1) == 0;
21083
21084
  // As we walk the digits, we want to know whether rounding up would fall
21085
  // within the upper bound. This is tracked by upper_delta:
21086
  //  - When -1, the digits of h and upper are the same so far.
21087
  //  - When +0, we saw a difference of 1 between h and upper on a previous
21088
  //    digit and subsequently only 9s for h and 0s for upper. Thus, rounding
21089
  //    up may fall outside of the bound if !inclusive.
21090
  //  - When +1, the difference is greater than 1 and we know that rounding up
21091
  //    falls within the bound.
21092
  //
21093
  // This is a state machine with three states. The numerical value for each
21094
  // state (-1, +0 or +1) isn't important, other than their order.
21095
0
  int upper_delta = -1;
21096
21097
  // We can now figure out the shortest number of digits required. Walk the
21098
  // digits until h has distinguished itself from lower or upper.
21099
  //
21100
  // The zi and zd variables are indexes and digits, for z in l (lower), h (the
21101
  // number) and u (upper).
21102
  //
21103
  // The lower, h and upper numbers may have their decimal points at different
21104
  // places. In this case, upper is the longest, so we iterate ui starting from
21105
  // 0 and iterate li and hi starting from either 0 or -1.
21106
0
  int32_t ui = 0;
21107
0
  for (;; ui++) {
21108
    // Calculate hd, the middle number's digit.
21109
0
    int32_t hi = ui - upper.decimal_point + h->decimal_point;
21110
0
    if (hi >= ((int32_t)(h->num_digits))) {
21111
0
      break;
21112
0
    }
21113
0
    uint8_t hd = (((uint32_t)hi) < h->num_digits) ? h->digits[hi] : 0;
21114
21115
    // Calculate ld, the lower bound's digit.
21116
0
    int32_t li = ui - upper.decimal_point + lower.decimal_point;
21117
0
    uint8_t ld = (((uint32_t)li) < lower.num_digits) ? lower.digits[li] : 0;
21118
21119
    // We can round down (truncate) if lower has a different digit than h or if
21120
    // lower is inclusive and is exactly the result of rounding down (i.e. we
21121
    // have reached the final digit of lower).
21122
0
    bool can_round_down =
21123
0
        (ld != hd) ||  //
21124
0
        (inclusive && ((li + 1) == ((int32_t)(lower.num_digits))));
21125
21126
    // Calculate ud, the upper bound's digit, and update upper_delta.
21127
0
    uint8_t ud = (((uint32_t)ui) < upper.num_digits) ? upper.digits[ui] : 0;
21128
0
    if (upper_delta < 0) {
21129
0
      if ((hd + 1) < ud) {
21130
        // For example:
21131
        // h     = 12345???
21132
        // upper = 12347???
21133
0
        upper_delta = +1;
21134
0
      } else if (hd != ud) {
21135
        // For example:
21136
        // h     = 12345???
21137
        // upper = 12346???
21138
0
        upper_delta = +0;
21139
0
      }
21140
0
    } else if (upper_delta == 0) {
21141
0
      if ((hd != 9) || (ud != 0)) {
21142
        // For example:
21143
        // h     = 1234598?
21144
        // upper = 1234600?
21145
0
        upper_delta = +1;
21146
0
      }
21147
0
    }
21148
21149
    // We can round up if upper has a different digit than h and either upper
21150
    // is inclusive or upper is bigger than the result of rounding up.
21151
0
    bool can_round_up =
21152
0
        (upper_delta > 0) ||    //
21153
0
        ((upper_delta == 0) &&  //
21154
0
         (inclusive || ((ui + 1) < ((int32_t)(upper.num_digits)))));
21155
21156
    // If we can round either way, round to nearest. If we can round only one
21157
    // way, do it. If we can't round, continue the loop.
21158
0
    if (can_round_down) {
21159
0
      if (can_round_up) {
21160
0
        wuffs_private_impl__high_prec_dec__round_nearest(h, hi + 1);
21161
0
        return;
21162
0
      } else {
21163
0
        wuffs_private_impl__high_prec_dec__round_down(h, hi + 1);
21164
0
        return;
21165
0
      }
21166
0
    } else {
21167
0
      if (can_round_up) {
21168
0
        wuffs_private_impl__high_prec_dec__round_up(h, hi + 1);
21169
0
        return;
21170
0
      }
21171
0
    }
21172
0
  }
21173
0
}
21174
21175
// --------
21176
21177
// wuffs_private_impl__parse_number_f64_eisel_lemire produces the IEEE 754
21178
// double-precision value for an exact mantissa and base-10 exponent. For
21179
// example:
21180
//  - when parsing "12345.678e+02", man is 12345678 and exp10 is -1.
21181
//  - when parsing "-12", man is 12 and exp10 is 0. Processing the leading
21182
//    minus sign is the responsibility of the caller, not this function.
21183
//
21184
// On success, it returns a non-negative int64_t such that the low 63 bits hold
21185
// the 11-bit exponent and 52-bit mantissa.
21186
//
21187
// On failure, it returns a negative value.
21188
//
21189
// The algorithm is based on an original idea by Michael Eisel that was refined
21190
// by Daniel Lemire. See
21191
// https://lemire.me/blog/2020/03/10/fast-float-parsing-in-practice/
21192
// and
21193
// https://nigeltao.github.io/blog/2020/eisel-lemire.html
21194
//
21195
// Preconditions:
21196
//  - man is non-zero.
21197
//  - exp10 is in the range [-307 ..= 288], the same range of the
21198
//    wuffs_private_impl__powers_of_10 array.
21199
//
21200
// The exp10 range (and the fact that man is in the range [1 ..= UINT64_MAX],
21201
// approximately [1 ..= 1.85e+19]) means that (man * (10 ** exp10)) is in the
21202
// range [1e-307 ..= 1.85e+307]. This is entirely within the range of normal
21203
// (neither subnormal nor non-finite) f64 values: DBL_MIN and DBL_MAX are
21204
// approximately 2.23eโ€“308 and 1.80e+308.
21205
static int64_t  //
21206
0
wuffs_private_impl__parse_number_f64_eisel_lemire(uint64_t man, int32_t exp10) {
21207
  // Look up the (possibly truncated) base-2 representation of (10 ** exp10).
21208
  // The look-up table was constructed so that it is already normalized: the
21209
  // table entry's mantissa's MSB (most significant bit) is on.
21210
0
  const uint64_t* po10 = &wuffs_private_impl__powers_of_10[exp10 + 307][0];
21211
21212
  // Normalize the man argument. The (man != 0) precondition means that a
21213
  // non-zero bit exists.
21214
0
  uint32_t clz = wuffs_base__count_leading_zeroes_u64(man);
21215
0
  man <<= clz;
21216
21217
  // Calculate the return value's base-2 exponent. We might tweak it by ยฑ1
21218
  // later, but its initial value comes from a linear scaling of exp10,
21219
  // converting from power-of-10 to power-of-2, and adjusting by clz.
21220
  //
21221
  // The magic constants are:
21222
  //  - 1087 = 1023 + 64. The 1023 is the f64 exponent bias. The 64 is because
21223
  //    the look-up table uses 64-bit mantissas.
21224
  //  - 217706 is such that the ratio 217706 / 65536 โ‰ˆ 3.321930 is close enough
21225
  //    (over the practical range of exp10) to log(10) / log(2) โ‰ˆ 3.321928.
21226
  //  - 65536 = 1<<16 is arbitrary but a power of 2, so division is a shift.
21227
  //
21228
  // Equality of the linearly-scaled value and the actual power-of-2, over the
21229
  // range of exp10 arguments that this function accepts, is confirmed by
21230
  // script/print-mpb-powers-of-10.go
21231
0
  uint64_t ret_exp2 =
21232
0
      ((uint64_t)(((217706 * exp10) >> 16) + 1087)) - ((uint64_t)clz);
21233
21234
  // Multiply the two mantissas. Normalization means that both mantissas are at
21235
  // least (1<<63), so the 128-bit product must be at least (1<<126). The high
21236
  // 64 bits of the product, x_hi, must therefore be at least (1<<62).
21237
  //
21238
  // As a consequence, x_hi has either 0 or 1 leading zeroes. Shifting x_hi
21239
  // right by either 9 or 10 bits (depending on x_hi's MSB) will therefore
21240
  // leave the top 10 MSBs (bits 54 ..= 63) off and the 11th MSB (bit 53) on.
21241
0
  wuffs_base__multiply_u64__output x = wuffs_base__multiply_u64(man, po10[1]);
21242
0
  uint64_t x_hi = x.hi;
21243
0
  uint64_t x_lo = x.lo;
21244
21245
  // Before we shift right by at least 9 bits, recall that the look-up table
21246
  // entry was possibly truncated. We have so far only calculated a lower bound
21247
  // for the product (man * e), where e is (10 ** exp10). The upper bound would
21248
  // add a further (man * 1) to the 128-bit product, which overflows the lower
21249
  // 64-bit limb if ((x_lo + man) < man).
21250
  //
21251
  // If overflow occurs, that adds 1 to x_hi. Since we're about to shift right
21252
  // by at least 9 bits, that carried 1 can be ignored unless the higher 64-bit
21253
  // limb's low 9 bits are all on.
21254
  //
21255
  // For example, parsing "9999999999999999999" will take the if-true branch
21256
  // here, since:
21257
  //  - x_hi = 0x4563918244F3FFFF
21258
  //  - x_lo = 0x8000000000000000
21259
  //  - man  = 0x8AC7230489E7FFFF
21260
0
  if (((x_hi & 0x1FF) == 0x1FF) && ((x_lo + man) < man)) {
21261
    // Refine our calculation of (man * e). Before, our approximation of e used
21262
    // a "low resolution" 64-bit mantissa. Now use a "high resolution" 128-bit
21263
    // mantissa. We've already calculated x = (man * bits_0_to_63_incl_of_e).
21264
    // Now calculate y = (man * bits_64_to_127_incl_of_e).
21265
0
    wuffs_base__multiply_u64__output y = wuffs_base__multiply_u64(man, po10[0]);
21266
0
    uint64_t y_hi = y.hi;
21267
0
    uint64_t y_lo = y.lo;
21268
21269
    // Merge the 128-bit x and 128-bit y, which overlap by 64 bits, to
21270
    // calculate the 192-bit product of the 64-bit man by the 128-bit e.
21271
    // As we exit this if-block, we only care about the high 128 bits
21272
    // (merged_hi and merged_lo) of that 192-bit product.
21273
    //
21274
    // For example, parsing "1.234e-45" will take the if-true branch here,
21275
    // since:
21276
    //  - x_hi = 0x70B7E3696DB29FFF
21277
    //  - x_lo = 0xE040000000000000
21278
    //  - y_hi = 0x33718BBEAB0E0D7A
21279
    //  - y_lo = 0xA880000000000000
21280
0
    uint64_t merged_hi = x_hi;
21281
0
    uint64_t merged_lo = x_lo + y_hi;
21282
0
    if (merged_lo < x_lo) {
21283
0
      merged_hi++;  // Carry the overflow bit.
21284
0
    }
21285
21286
    // The "high resolution" approximation of e is still a lower bound. Once
21287
    // again, see if the upper bound is large enough to produce a different
21288
    // result. This time, if it does, give up instead of reaching for an even
21289
    // more precise approximation to e.
21290
    //
21291
    // This three-part check is similar to the two-part check that guarded the
21292
    // if block that we're now in, but it has an extra term for the middle 64
21293
    // bits (checking that adding 1 to merged_lo would overflow).
21294
    //
21295
    // For example, parsing "5.9604644775390625e-8" will take the if-true
21296
    // branch here, since:
21297
    //  - merged_hi = 0x7FFFFFFFFFFFFFFF
21298
    //  - merged_lo = 0xFFFFFFFFFFFFFFFF
21299
    //  - y_lo      = 0x4DB3FFC120988200
21300
    //  - man       = 0xD3C21BCECCEDA100
21301
0
    if (((merged_hi & 0x1FF) == 0x1FF) && ((merged_lo + 1) == 0) &&
21302
0
        (y_lo + man < man)) {
21303
0
      return -1;
21304
0
    }
21305
21306
    // Replace the 128-bit x with merged.
21307
0
    x_hi = merged_hi;
21308
0
    x_lo = merged_lo;
21309
0
  }
21310
21311
  // As mentioned above, shifting x_hi right by either 9 or 10 bits will leave
21312
  // the top 10 MSBs (bits 54 ..= 63) off and the 11th MSB (bit 53) on. If the
21313
  // MSB (before shifting) was on, adjust ret_exp2 for the larger shift.
21314
  //
21315
  // Having bit 53 on (and higher bits off) means that ret_mantissa is a 54-bit
21316
  // number.
21317
0
  uint64_t msb = x_hi >> 63;
21318
0
  uint64_t ret_mantissa = x_hi >> (msb + 9);
21319
0
  ret_exp2 -= 1 ^ msb;
21320
21321
  // IEEE 754 rounds to-nearest with ties rounded to-even. Rounding to-even can
21322
  // be tricky. If we're half-way between two exactly representable numbers
21323
  // (x's low 73 bits are zero and the next 2 bits that matter are "01"), give
21324
  // up instead of trying to pick the winner.
21325
  //
21326
  // Technically, we could tighten the condition by changing "73" to "73 or 74,
21327
  // depending on msb", but a flat "73" is simpler.
21328
  //
21329
  // For example, parsing "1e+23" will take the if-true branch here, since:
21330
  //  - x_hi          = 0x54B40B1F852BDA00
21331
  //  - ret_mantissa  = 0x002A5A058FC295ED
21332
0
  if ((x_lo == 0) && ((x_hi & 0x1FF) == 0) && ((ret_mantissa & 3) == 1)) {
21333
0
    return -1;
21334
0
  }
21335
21336
  // If we're not halfway then it's rounding to-nearest. Starting with a 54-bit
21337
  // number, carry the lowest bit (bit 0) up if it's on. Regardless of whether
21338
  // it was on or off, shifting right by one then produces a 53-bit number. If
21339
  // carrying up overflowed, shift again.
21340
0
  ret_mantissa += ret_mantissa & 1;
21341
0
  ret_mantissa >>= 1;
21342
  // This if block is equivalent to (but benchmarks slightly faster than) the
21343
  // following branchless form:
21344
  //    uint64_t overflow_adjustment = ret_mantissa >> 53;
21345
  //    ret_mantissa >>= overflow_adjustment;
21346
  //    ret_exp2 += overflow_adjustment;
21347
  //
21348
  // For example, parsing "7.2057594037927933e+16" will take the if-true
21349
  // branch here, since:
21350
  //  - x_hi          = 0x7FFFFFFFFFFFFE80
21351
  //  - ret_mantissa  = 0x0020000000000000
21352
0
  if ((ret_mantissa >> 53) > 0) {
21353
0
    ret_mantissa >>= 1;
21354
0
    ret_exp2++;
21355
0
  }
21356
21357
  // Starting with a 53-bit number, IEEE 754 double-precision normal numbers
21358
  // have an implicit mantissa bit. Mask that away and keep the low 52 bits.
21359
0
  ret_mantissa &= 0x000FFFFFFFFFFFFF;
21360
21361
  // Pack the bits and return.
21362
0
  return ((int64_t)(ret_mantissa | (ret_exp2 << 52)));
21363
0
}
21364
21365
// --------
21366
21367
static wuffs_base__result_f64  //
21368
wuffs_private_impl__parse_number_f64_special(wuffs_base__slice_u8 s,
21369
0
                                             uint32_t options) {
21370
0
  do {
21371
0
    if (options & WUFFS_BASE__PARSE_NUMBER_FXX__REJECT_INF_AND_NAN) {
21372
0
      goto fail;
21373
0
    }
21374
21375
0
    uint8_t* p = s.ptr;
21376
0
    uint8_t* q = s.ptr + s.len;
21377
21378
0
    for (; (p < q) && (*p == '_'); p++) {
21379
0
    }
21380
0
    if (p >= q) {
21381
0
      goto fail;
21382
0
    }
21383
21384
    // Parse sign.
21385
0
    bool negative = false;
21386
0
    do {
21387
0
      if (*p == '+') {
21388
0
        p++;
21389
0
      } else if (*p == '-') {
21390
0
        negative = true;
21391
0
        p++;
21392
0
      } else {
21393
0
        break;
21394
0
      }
21395
0
      for (; (p < q) && (*p == '_'); p++) {
21396
0
      }
21397
0
    } while (0);
21398
0
    if (p >= q) {
21399
0
      goto fail;
21400
0
    }
21401
21402
0
    bool nan = false;
21403
0
    switch (p[0]) {
21404
0
      case 'I':
21405
0
      case 'i':
21406
0
        if (((q - p) < 3) ||                     //
21407
0
            ((p[1] != 'N') && (p[1] != 'n')) ||  //
21408
0
            ((p[2] != 'F') && (p[2] != 'f'))) {
21409
0
          goto fail;
21410
0
        }
21411
0
        p += 3;
21412
21413
0
        if ((p >= q) || (*p == '_')) {
21414
0
          break;
21415
0
        } else if (((q - p) < 5) ||                     //
21416
0
                   ((p[0] != 'I') && (p[0] != 'i')) ||  //
21417
0
                   ((p[1] != 'N') && (p[1] != 'n')) ||  //
21418
0
                   ((p[2] != 'I') && (p[2] != 'i')) ||  //
21419
0
                   ((p[3] != 'T') && (p[3] != 't')) ||  //
21420
0
                   ((p[4] != 'Y') && (p[4] != 'y'))) {
21421
0
          goto fail;
21422
0
        }
21423
0
        p += 5;
21424
21425
0
        if ((p >= q) || (*p == '_')) {
21426
0
          break;
21427
0
        }
21428
0
        goto fail;
21429
21430
0
      case 'N':
21431
0
      case 'n':
21432
0
        if (((q - p) < 3) ||                     //
21433
0
            ((p[1] != 'A') && (p[1] != 'a')) ||  //
21434
0
            ((p[2] != 'N') && (p[2] != 'n'))) {
21435
0
          goto fail;
21436
0
        }
21437
0
        p += 3;
21438
21439
0
        if ((p >= q) || (*p == '_')) {
21440
0
          nan = true;
21441
0
          break;
21442
0
        }
21443
0
        goto fail;
21444
21445
0
      default:
21446
0
        goto fail;
21447
0
    }
21448
21449
    // Finish.
21450
0
    for (; (p < q) && (*p == '_'); p++) {
21451
0
    }
21452
0
    if (p != q) {
21453
0
      goto fail;
21454
0
    }
21455
0
    wuffs_base__result_f64 ret;
21456
0
    ret.status.repr = NULL;
21457
0
    ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64(
21458
0
        (nan ? 0x7FFFFFFFFFFFFFFF : 0x7FF0000000000000) |
21459
0
        (negative ? 0x8000000000000000 : 0));
21460
0
    return ret;
21461
0
  } while (0);
21462
21463
0
fail:
21464
0
  do {
21465
0
    wuffs_base__result_f64 ret;
21466
0
    ret.status.repr = wuffs_base__error__bad_argument;
21467
0
    ret.value = 0;
21468
0
    return ret;
21469
0
  } while (0);
21470
0
}
21471
21472
WUFFS_BASE__MAYBE_STATIC wuffs_base__result_f64  //
21473
wuffs_private_impl__high_prec_dec__to_f64(wuffs_private_impl__high_prec_dec* h,
21474
0
                                          uint32_t options) {
21475
0
  do {
21476
    // powers converts decimal powers of 10 to binary powers of 2. For example,
21477
    // (10000 >> 13) is 1. It stops before the elements exceed 60, also known
21478
    // as WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL.
21479
    //
21480
    // This rounds down (1<<13 is a lower bound for 1e4). Adding 1 to the array
21481
    // element value rounds up (1<<14 is an upper bound for 1e4) while staying
21482
    // at or below WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL.
21483
    //
21484
    // When starting in the range [1e+1 .. 1e+2] (i.e. h->decimal_point == +2),
21485
    // powers[2] == 6 and so:
21486
    //  - Right shifting by 6+0 produces the range [10/64 .. 100/64] =
21487
    //    [0.156250 .. 1.56250]. The resultant h->decimal_point is +0 or +1.
21488
    //  - Right shifting by 6+1 produces the range [10/128 .. 100/128] =
21489
    //    [0.078125 .. 0.78125]. The resultant h->decimal_point is -1 or -0.
21490
    //
21491
    // When starting in the range [1e-3 .. 1e-2] (i.e. h->decimal_point == -2),
21492
    // powers[2] == 6 and so:
21493
    //  - Left shifting by 6+0 produces the range [0.001*64 .. 0.01*64] =
21494
    //    [0.064 .. 0.64]. The resultant h->decimal_point is -1 or -0.
21495
    //  - Left shifting by 6+1 produces the range [0.001*128 .. 0.01*128] =
21496
    //    [0.128 .. 1.28]. The resultant h->decimal_point is +0 or +1.
21497
    //
21498
    // Thus, when targeting h->decimal_point being +0 or +1, use (powers[n]+0)
21499
    // when right shifting but (powers[n]+1) when left shifting.
21500
0
    static const uint32_t num_powers = 19;
21501
0
    static const uint8_t powers[19] = {
21502
0
        0,  3,  6,  9,  13, 16, 19, 23, 26, 29,  //
21503
0
        33, 36, 39, 43, 46, 49, 53, 56, 59,      //
21504
0
    };
21505
21506
    // Handle zero and obvious extremes. The largest and smallest positive
21507
    // finite f64 values are approximately 1.8e+308 and 4.9e-324.
21508
0
    if ((h->num_digits == 0) || (h->decimal_point < -326)) {
21509
0
      goto zero;
21510
0
    } else if (h->decimal_point > 310) {
21511
0
      goto infinity;
21512
0
    }
21513
21514
    // Try the fast Eisel-Lemire algorithm again. Calculating the (man, exp10)
21515
    // pair from the high_prec_dec h is more correct but slower than the
21516
    // approach taken in wuffs_base__parse_number_f64. The latter is optimized
21517
    // for the common cases (e.g. assuming no underscores or a leading '+'
21518
    // sign) rather than the full set of cases allowed by the Wuffs API.
21519
    //
21520
    // When we have 19 or fewer mantissa digits, run Eisel-Lemire once (trying
21521
    // for an exact result). When we have more than 19 mantissa digits, run it
21522
    // twice to get a lower and upper bound. We still have an exact result
21523
    // (within f64's rounding margin) if both bounds are equal (and valid).
21524
0
    uint32_t i_max = h->num_digits;
21525
0
    if (i_max > 19) {
21526
0
      i_max = 19;
21527
0
    }
21528
0
    int32_t exp10 = h->decimal_point - ((int32_t)i_max);
21529
0
    if ((-307 <= exp10) && (exp10 <= 288)) {
21530
0
      uint64_t man = 0;
21531
0
      uint32_t i;
21532
0
      for (i = 0; i < i_max; i++) {
21533
0
        man = (10 * man) + h->digits[i];
21534
0
      }
21535
0
      while (man != 0) {  // The 'while' is just an 'if' that we can 'break'.
21536
0
        int64_t r0 =
21537
0
            wuffs_private_impl__parse_number_f64_eisel_lemire(man + 0, exp10);
21538
0
        if (r0 < 0) {
21539
0
          break;
21540
0
        } else if (h->num_digits > 19) {
21541
0
          int64_t r1 =
21542
0
              wuffs_private_impl__parse_number_f64_eisel_lemire(man + 1, exp10);
21543
0
          if (r1 != r0) {
21544
0
            break;
21545
0
          }
21546
0
        }
21547
0
        wuffs_base__result_f64 ret;
21548
0
        ret.status.repr = NULL;
21549
0
        ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64(
21550
0
            ((uint64_t)r0) | (((uint64_t)(h->negative)) << 63));
21551
0
        return ret;
21552
0
      }
21553
0
    }
21554
21555
    // When Eisel-Lemire fails, fall back to Simple Decimal Conversion. See
21556
    // https://nigeltao.github.io/blog/2020/parse-number-f64-simple.html
21557
    //
21558
    // Scale by powers of 2 until we're in the range [0.1 .. 10]. Equivalently,
21559
    // that h->decimal_point is +0 or +1.
21560
    //
21561
    // First we shift right while at or above 10...
21562
0
    const int32_t f64_bias = -1023;
21563
0
    int32_t exp2 = 0;
21564
0
    while (h->decimal_point > 1) {
21565
0
      uint32_t n = (uint32_t)(+h->decimal_point);
21566
0
      uint32_t shift = (n < num_powers)
21567
0
                           ? powers[n]
21568
0
                           : WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL;
21569
21570
0
      wuffs_private_impl__high_prec_dec__small_rshift(h, shift);
21571
0
      if (h->decimal_point < -WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE) {
21572
0
        goto zero;
21573
0
      }
21574
0
      exp2 += (int32_t)shift;
21575
0
    }
21576
    // ...then we shift left while below 0.1.
21577
0
    while (h->decimal_point < 0) {
21578
0
      uint32_t shift;
21579
0
      uint32_t n = (uint32_t)(-h->decimal_point);
21580
0
      shift = (n < num_powers)
21581
                  // The +1 is per "when targeting h->decimal_point being +0 or
21582
                  // +1... when left shifting" in the powers comment above.
21583
0
                  ? (powers[n] + 1u)
21584
0
                  : WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL;
21585
21586
0
      wuffs_private_impl__high_prec_dec__small_lshift(h, shift);
21587
0
      if (h->decimal_point > +WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE) {
21588
0
        goto infinity;
21589
0
      }
21590
0
      exp2 -= (int32_t)shift;
21591
0
    }
21592
21593
    // To get from "in the range [0.1 .. 10]" to "in the range [1 .. 2]" (which
21594
    // will give us our exponent in base-2), the mantissa's first 3 digits will
21595
    // determine the final left shift, equal to 52 (the number of explicit f64
21596
    // bits) plus an additional adjustment.
21597
0
    int man3 = (100 * h->digits[0]) +
21598
0
               ((h->num_digits > 1) ? (10 * h->digits[1]) : 0) +
21599
0
               ((h->num_digits > 2) ? h->digits[2] : 0);
21600
0
    int32_t additional_lshift = 0;
21601
0
    if (h->decimal_point == 0) {  // The value is in [0.1 .. 1].
21602
0
      if (man3 < 125) {
21603
0
        additional_lshift = +4;
21604
0
      } else if (man3 < 250) {
21605
0
        additional_lshift = +3;
21606
0
      } else if (man3 < 500) {
21607
0
        additional_lshift = +2;
21608
0
      } else {
21609
0
        additional_lshift = +1;
21610
0
      }
21611
0
    } else {  // The value is in [1 .. 10].
21612
0
      if (man3 < 200) {
21613
0
        additional_lshift = -0;
21614
0
      } else if (man3 < 400) {
21615
0
        additional_lshift = -1;
21616
0
      } else if (man3 < 800) {
21617
0
        additional_lshift = -2;
21618
0
      } else {
21619
0
        additional_lshift = -3;
21620
0
      }
21621
0
    }
21622
0
    exp2 -= additional_lshift;
21623
0
    uint32_t final_lshift = (uint32_t)(52 + additional_lshift);
21624
21625
    // The minimum normal exponent is (f64_bias + 1).
21626
0
    while ((f64_bias + 1) > exp2) {
21627
0
      uint32_t n = (uint32_t)((f64_bias + 1) - exp2);
21628
0
      if (n > WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL) {
21629
0
        n = WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL;
21630
0
      }
21631
0
      wuffs_private_impl__high_prec_dec__small_rshift(h, n);
21632
0
      exp2 += (int32_t)n;
21633
0
    }
21634
21635
    // Check for overflow.
21636
0
    if ((exp2 - f64_bias) >= 0x07FF) {  // (1 << 11) - 1.
21637
0
      goto infinity;
21638
0
    }
21639
21640
    // Extract 53 bits for the mantissa (in base-2).
21641
0
    wuffs_private_impl__high_prec_dec__small_lshift(h, final_lshift);
21642
0
    uint64_t man2 = wuffs_private_impl__high_prec_dec__rounded_integer(h);
21643
21644
    // Rounding might have added one bit. If so, shift and re-check overflow.
21645
0
    if ((man2 >> 53) != 0) {
21646
0
      man2 >>= 1;
21647
0
      exp2++;
21648
0
      if ((exp2 - f64_bias) >= 0x07FF) {  // (1 << 11) - 1.
21649
0
        goto infinity;
21650
0
      }
21651
0
    }
21652
21653
    // Handle subnormal numbers.
21654
0
    if ((man2 >> 52) == 0) {
21655
0
      exp2 = f64_bias;
21656
0
    }
21657
21658
    // Pack the bits and return.
21659
0
    uint64_t exp2_bits =
21660
0
        (uint64_t)((exp2 - f64_bias) & 0x07FF);              // (1 << 11) - 1.
21661
0
    uint64_t bits = (man2 & 0x000FFFFFFFFFFFFF) |            // (1 << 52) - 1.
21662
0
                    (exp2_bits << 52) |                      //
21663
0
                    (h->negative ? 0x8000000000000000 : 0);  // (1 << 63).
21664
21665
0
    wuffs_base__result_f64 ret;
21666
0
    ret.status.repr = NULL;
21667
0
    ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64(bits);
21668
0
    return ret;
21669
0
  } while (0);
21670
21671
0
zero:
21672
0
  do {
21673
0
    uint64_t bits = h->negative ? 0x8000000000000000 : 0;
21674
21675
0
    wuffs_base__result_f64 ret;
21676
0
    ret.status.repr = NULL;
21677
0
    ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64(bits);
21678
0
    return ret;
21679
0
  } while (0);
21680
21681
0
infinity:
21682
0
  do {
21683
0
    if (options & WUFFS_BASE__PARSE_NUMBER_FXX__REJECT_INF_AND_NAN) {
21684
0
      wuffs_base__result_f64 ret;
21685
0
      ret.status.repr = wuffs_base__error__bad_argument;
21686
0
      ret.value = 0;
21687
0
      return ret;
21688
0
    }
21689
21690
0
    uint64_t bits = h->negative ? 0xFFF0000000000000 : 0x7FF0000000000000;
21691
21692
0
    wuffs_base__result_f64 ret;
21693
0
    ret.status.repr = NULL;
21694
0
    ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64(bits);
21695
0
    return ret;
21696
0
  } while (0);
21697
0
}
21698
21699
static inline bool  //
21700
0
wuffs_private_impl__is_decimal_digit(uint8_t c) {
21701
0
  return ('0' <= c) && (c <= '9');
21702
0
}
21703
21704
WUFFS_BASE__MAYBE_STATIC wuffs_base__result_f64  //
21705
0
wuffs_base__parse_number_f64(wuffs_base__slice_u8 s, uint32_t options) {
21706
  // In practice, almost all "dd.ddddEยฑxxx" numbers can be represented
21707
  // losslessly by a uint64_t mantissa "dddddd" and an int32_t base-10
21708
  // exponent, adjusting "xxx" for the position (if present) of the decimal
21709
  // separator '.' or ','.
21710
  //
21711
  // This (u64 man, i32 exp10) data structure is superficially similar to the
21712
  // "Do It Yourself Floating Point" type from Loitsch (โ€ ), but the exponent
21713
  // here is base-10, not base-2.
21714
  //
21715
  // If s's number fits in a (man, exp10), parse that pair with the
21716
  // Eisel-Lemire algorithm. If not, or if Eisel-Lemire fails, parsing s with
21717
  // the fallback algorithm is slower but comprehensive.
21718
  //
21719
  // โ€  "Printing Floating-Point Numbers Quickly and Accurately with Integers"
21720
  // (https://www.cs.tufts.edu/~nr/cs257/archive/florian-loitsch/printf.pdf).
21721
  // Florian Loitsch is also the primary contributor to
21722
  // https://github.com/google/double-conversion
21723
0
  do {
21724
    // Calculating that (man, exp10) pair needs to stay within s's bounds.
21725
    // Provided that s isn't extremely long, work on a NUL-terminated copy of
21726
    // s's contents. The NUL byte isn't a valid part of "ยฑdd.ddddEยฑxxx".
21727
    //
21728
    // As the pointer p walks the contents, it's faster to repeatedly check "is
21729
    // *p a valid digit" than "is p within bounds and *p a valid digit".
21730
0
    if (s.len >= 256) {
21731
0
      goto fallback;
21732
0
    }
21733
0
    uint8_t z[256];
21734
0
    memcpy(&z[0], s.ptr, s.len);
21735
0
    z[s.len] = 0;
21736
0
    const uint8_t* p = &z[0];
21737
21738
    // Look for a leading minus sign. Technically, we could also look for an
21739
    // optional plus sign, but the "script/process-json-numbers.c with -p"
21740
    // benchmark is noticably slower if we do. It's optional and, in practice,
21741
    // usually absent. Let the fallback catch it.
21742
0
    bool negative = (*p == '-');
21743
0
    if (negative) {
21744
0
      p++;
21745
0
    }
21746
21747
    // After walking "dd.dddd", comparing p later with p now will produce the
21748
    // number of "d"s and "."s.
21749
0
    const uint8_t* const start_of_digits_ptr = p;
21750
21751
    // Walk the "d"s before a '.', 'E', NUL byte, etc. If it starts with '0',
21752
    // it must be a single '0'. If it starts with a non-zero decimal digit, it
21753
    // can be a sequence of decimal digits.
21754
    //
21755
    // Update the man variable during the walk. It's OK if man overflows now.
21756
    // We'll detect that later.
21757
0
    uint64_t man;
21758
0
    if (*p == '0') {
21759
0
      man = 0;
21760
0
      p++;
21761
0
      if (wuffs_private_impl__is_decimal_digit(*p)) {
21762
0
        goto fallback;
21763
0
      }
21764
0
    } else if (wuffs_private_impl__is_decimal_digit(*p)) {
21765
0
      man = ((uint8_t)(*p - '0'));
21766
0
      p++;
21767
0
      for (; wuffs_private_impl__is_decimal_digit(*p); p++) {
21768
0
        man = (10 * man) + ((uint8_t)(*p - '0'));
21769
0
      }
21770
0
    } else {
21771
0
      goto fallback;
21772
0
    }
21773
21774
    // Walk the "d"s after the optional decimal separator ('.' or ','),
21775
    // updating the man and exp10 variables.
21776
0
    int32_t exp10 = 0;
21777
0
    if (*p ==
21778
0
        ((options & WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA)
21779
0
             ? ','
21780
0
             : '.')) {
21781
0
      p++;
21782
0
      const uint8_t* first_after_separator_ptr = p;
21783
0
      if (!wuffs_private_impl__is_decimal_digit(*p)) {
21784
0
        goto fallback;
21785
0
      }
21786
0
      man = (10 * man) + ((uint8_t)(*p - '0'));
21787
0
      p++;
21788
0
      for (; wuffs_private_impl__is_decimal_digit(*p); p++) {
21789
0
        man = (10 * man) + ((uint8_t)(*p - '0'));
21790
0
      }
21791
0
      exp10 = ((int32_t)(first_after_separator_ptr - p));
21792
0
    }
21793
21794
    // Count the number of digits:
21795
    //  - for an input of "314159",  digit_count is 6.
21796
    //  - for an input of "3.14159", digit_count is 7.
21797
    //
21798
    // This is off-by-one if there is a decimal separator. That's OK for now.
21799
    // We'll correct for that later. The "script/process-json-numbers.c with
21800
    // -p" benchmark is noticably slower if we try to correct for that now.
21801
0
    uint32_t digit_count = (uint32_t)(p - start_of_digits_ptr);
21802
21803
    // Update exp10 for the optional exponent, starting with 'E' or 'e'.
21804
0
    if ((*p | 0x20) == 'e') {
21805
0
      p++;
21806
0
      int32_t exp_sign = +1;
21807
0
      if (*p == '-') {
21808
0
        p++;
21809
0
        exp_sign = -1;
21810
0
      } else if (*p == '+') {
21811
0
        p++;
21812
0
      }
21813
0
      if (!wuffs_private_impl__is_decimal_digit(*p)) {
21814
0
        goto fallback;
21815
0
      }
21816
0
      int32_t exp_num = ((uint8_t)(*p - '0'));
21817
0
      p++;
21818
      // The rest of the exp_num walking has a peculiar control flow but, once
21819
      // again, the "script/process-json-numbers.c with -p" benchmark is
21820
      // sensitive to alternative formulations.
21821
0
      if (wuffs_private_impl__is_decimal_digit(*p)) {
21822
0
        exp_num = (10 * exp_num) + ((uint8_t)(*p - '0'));
21823
0
        p++;
21824
0
      }
21825
0
      if (wuffs_private_impl__is_decimal_digit(*p)) {
21826
0
        exp_num = (10 * exp_num) + ((uint8_t)(*p - '0'));
21827
0
        p++;
21828
0
      }
21829
0
      while (wuffs_private_impl__is_decimal_digit(*p)) {
21830
0
        if (exp_num > 0x1000000) {
21831
0
          goto fallback;
21832
0
        }
21833
0
        exp_num = (10 * exp_num) + ((uint8_t)(*p - '0'));
21834
0
        p++;
21835
0
      }
21836
0
      exp10 += exp_sign * exp_num;
21837
0
    }
21838
21839
    // The Wuffs API is that the original slice has no trailing data. It also
21840
    // allows underscores, which we don't catch here but the fallback should.
21841
0
    if (p != &z[s.len]) {
21842
0
      goto fallback;
21843
0
    }
21844
21845
    // Check that the uint64_t typed man variable has not overflowed, based on
21846
    // digit_count.
21847
    //
21848
    // For reference:
21849
    //   - (1 << 63) is  9223372036854775808, which has 19 decimal digits.
21850
    //   - (1 << 64) is 18446744073709551616, which has 20 decimal digits.
21851
    //   - 19 nines,  9999999999999999999, is  0x8AC7230489E7FFFF, which has 64
21852
    //     bits and 16 hexadecimal digits.
21853
    //   - 20 nines, 99999999999999999999, is 0x56BC75E2D630FFFFF, which has 67
21854
    //     bits and 17 hexadecimal digits.
21855
0
    if (digit_count > 19) {
21856
      // Even if we have more than 19 pseudo-digits, it's not yet definitely an
21857
      // overflow. Recall that digit_count might be off-by-one (too large) if
21858
      // there's a decimal separator. It will also over-report the number of
21859
      // meaningful digits if the input looks something like "0.000dddExxx".
21860
      //
21861
      // We adjust by the number of leading '0's and '.'s and re-compare to 19.
21862
      // Once again, technically, we could skip ','s too, but that perturbs the
21863
      // "script/process-json-numbers.c with -p" benchmark.
21864
0
      const uint8_t* q = start_of_digits_ptr;
21865
0
      for (; (*q == '0') || (*q == '.'); q++) {
21866
0
      }
21867
0
      digit_count -= (uint32_t)(q - start_of_digits_ptr);
21868
0
      if (digit_count > 19) {
21869
0
        goto fallback;
21870
0
      }
21871
0
    }
21872
21873
    // The wuffs_private_impl__parse_number_f64_eisel_lemire preconditions
21874
    // include that exp10 is in the range [-307 ..= 288].
21875
0
    if ((exp10 < -307) || (288 < exp10)) {
21876
0
      goto fallback;
21877
0
    }
21878
21879
    // If both man and (10 ** exp10) are exactly representable by a double, we
21880
    // don't need to run the Eisel-Lemire algorithm.
21881
0
    if ((-22 <= exp10) && (exp10 <= 22) && ((man >> 53) == 0)) {
21882
0
      double d = (double)man;
21883
0
      if (exp10 >= 0) {
21884
0
        d *= wuffs_private_impl__f64_powers_of_10[+exp10];
21885
0
      } else {
21886
0
        d /= wuffs_private_impl__f64_powers_of_10[-exp10];
21887
0
      }
21888
0
      wuffs_base__result_f64 ret;
21889
0
      ret.status.repr = NULL;
21890
0
      ret.value = negative ? -d : +d;
21891
0
      return ret;
21892
0
    }
21893
21894
    // The wuffs_private_impl__parse_number_f64_eisel_lemire preconditions
21895
    // include that man is non-zero. Parsing "0" should be caught by the "If
21896
    // both man and (10 ** exp10)" above, but "0e99" might not.
21897
0
    if (man == 0) {
21898
0
      goto fallback;
21899
0
    }
21900
21901
    // Our man and exp10 are in range. Run the Eisel-Lemire algorithm.
21902
0
    int64_t r = wuffs_private_impl__parse_number_f64_eisel_lemire(man, exp10);
21903
0
    if (r < 0) {
21904
0
      goto fallback;
21905
0
    }
21906
0
    wuffs_base__result_f64 ret;
21907
0
    ret.status.repr = NULL;
21908
0
    ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64(
21909
0
        ((uint64_t)r) | (((uint64_t)negative) << 63));
21910
0
    return ret;
21911
0
  } while (0);
21912
21913
0
fallback:
21914
0
  do {
21915
0
    wuffs_private_impl__high_prec_dec h;
21916
0
    wuffs_base__status status =
21917
0
        wuffs_private_impl__high_prec_dec__parse(&h, s, options);
21918
0
    if (status.repr) {
21919
0
      return wuffs_private_impl__parse_number_f64_special(s, options);
21920
0
    }
21921
0
    return wuffs_private_impl__high_prec_dec__to_f64(&h, options);
21922
0
  } while (0);
21923
0
}
21924
21925
// --------
21926
21927
static inline size_t  //
21928
wuffs_private_impl__render_inf(wuffs_base__slice_u8 dst,
21929
                               bool neg,
21930
0
                               uint32_t options) {
21931
0
  if (neg) {
21932
0
    if (dst.len < 4) {
21933
0
      return 0;
21934
0
    }
21935
0
    wuffs_base__poke_u32le__no_bounds_check(dst.ptr, 0x666E492D);  // '-Inf'le.
21936
0
    return 4;
21937
0
  }
21938
21939
0
  if (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN) {
21940
0
    if (dst.len < 4) {
21941
0
      return 0;
21942
0
    }
21943
0
    wuffs_base__poke_u32le__no_bounds_check(dst.ptr, 0x666E492B);  // '+Inf'le.
21944
0
    return 4;
21945
0
  }
21946
21947
0
  if (dst.len < 3) {
21948
0
    return 0;
21949
0
  }
21950
0
  wuffs_base__poke_u24le__no_bounds_check(dst.ptr, 0x666E49);  // 'Inf'le.
21951
0
  return 3;
21952
0
}
21953
21954
static inline size_t  //
21955
0
wuffs_private_impl__render_nan(wuffs_base__slice_u8 dst) {
21956
0
  if (dst.len < 3) {
21957
0
    return 0;
21958
0
  }
21959
0
  wuffs_base__poke_u24le__no_bounds_check(dst.ptr, 0x4E614E);  // 'NaN'le.
21960
0
  return 3;
21961
0
}
21962
21963
static size_t  //
21964
wuffs_private_impl__high_prec_dec__render_exponent_absent(
21965
    wuffs_base__slice_u8 dst,
21966
    wuffs_private_impl__high_prec_dec* h,
21967
    uint32_t precision,
21968
0
    uint32_t options) {
21969
0
  size_t n = (h->negative ||
21970
0
              (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN))
21971
0
                 ? 1
21972
0
                 : 0;
21973
0
  if (h->decimal_point <= 0) {
21974
0
    n += 1;
21975
0
  } else {
21976
0
    n += (size_t)(h->decimal_point);
21977
0
  }
21978
0
  if (precision > 0) {
21979
0
    n += precision + 1;  // +1 for the '.'.
21980
0
  }
21981
21982
  // Don't modify dst if the formatted number won't fit.
21983
0
  if (n > dst.len) {
21984
0
    return 0;
21985
0
  }
21986
21987
  // Align-left or align-right.
21988
0
  uint8_t* ptr = (options & WUFFS_BASE__RENDER_NUMBER_XXX__ALIGN_RIGHT)
21989
0
                     ? &dst.ptr[dst.len - n]
21990
0
                     : &dst.ptr[0];
21991
21992
  // Leading "ยฑ".
21993
0
  if (h->negative) {
21994
0
    *ptr++ = '-';
21995
0
  } else if (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN) {
21996
0
    *ptr++ = '+';
21997
0
  }
21998
21999
  // Integral digits.
22000
0
  if (h->decimal_point <= 0) {
22001
0
    *ptr++ = '0';
22002
0
  } else {
22003
0
    uint32_t m =
22004
0
        wuffs_base__u32__min(h->num_digits, (uint32_t)(h->decimal_point));
22005
0
    uint32_t i = 0;
22006
0
    for (; i < m; i++) {
22007
0
      *ptr++ = (uint8_t)('0' | h->digits[i]);
22008
0
    }
22009
0
    for (; i < (uint32_t)(h->decimal_point); i++) {
22010
0
      *ptr++ = '0';
22011
0
    }
22012
0
  }
22013
22014
  // Separator and then fractional digits.
22015
0
  if (precision > 0) {
22016
0
    *ptr++ =
22017
0
        (options & WUFFS_BASE__RENDER_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA)
22018
0
            ? ','
22019
0
            : '.';
22020
0
    uint32_t i = 0;
22021
0
    for (; i < precision; i++) {
22022
0
      uint32_t j = ((uint32_t)(h->decimal_point)) + i;
22023
0
      *ptr++ = (uint8_t)('0' | ((j < h->num_digits) ? h->digits[j] : 0));
22024
0
    }
22025
0
  }
22026
22027
0
  return n;
22028
0
}
22029
22030
static size_t  //
22031
wuffs_private_impl__high_prec_dec__render_exponent_present(
22032
    wuffs_base__slice_u8 dst,
22033
    wuffs_private_impl__high_prec_dec* h,
22034
    uint32_t precision,
22035
0
    uint32_t options) {
22036
0
  int32_t exp = 0;
22037
0
  if (h->num_digits > 0) {
22038
0
    exp = h->decimal_point - 1;
22039
0
  }
22040
0
  bool negative_exp = exp < 0;
22041
0
  if (negative_exp) {
22042
0
    exp = -exp;
22043
0
  }
22044
22045
0
  size_t n = (h->negative ||
22046
0
              (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN))
22047
0
                 ? 4
22048
0
                 : 3;  // Mininum 3 bytes: first digit and then "eยฑ".
22049
0
  if (precision > 0) {
22050
0
    n += precision + 1;  // +1 for the '.'.
22051
0
  }
22052
0
  n += (exp < 100) ? 2 : 3;
22053
22054
  // Don't modify dst if the formatted number won't fit.
22055
0
  if (n > dst.len) {
22056
0
    return 0;
22057
0
  }
22058
22059
  // Align-left or align-right.
22060
0
  uint8_t* ptr = (options & WUFFS_BASE__RENDER_NUMBER_XXX__ALIGN_RIGHT)
22061
0
                     ? &dst.ptr[dst.len - n]
22062
0
                     : &dst.ptr[0];
22063
22064
  // Leading "ยฑ".
22065
0
  if (h->negative) {
22066
0
    *ptr++ = '-';
22067
0
  } else if (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN) {
22068
0
    *ptr++ = '+';
22069
0
  }
22070
22071
  // Integral digit.
22072
0
  if (h->num_digits > 0) {
22073
0
    *ptr++ = (uint8_t)('0' | h->digits[0]);
22074
0
  } else {
22075
0
    *ptr++ = '0';
22076
0
  }
22077
22078
  // Separator and then fractional digits.
22079
0
  if (precision > 0) {
22080
0
    *ptr++ =
22081
0
        (options & WUFFS_BASE__RENDER_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA)
22082
0
            ? ','
22083
0
            : '.';
22084
0
    uint32_t i = 1;
22085
0
    uint32_t j = wuffs_base__u32__min(h->num_digits, precision + 1);
22086
0
    for (; i < j; i++) {
22087
0
      *ptr++ = (uint8_t)('0' | h->digits[i]);
22088
0
    }
22089
0
    for (; i <= precision; i++) {
22090
0
      *ptr++ = '0';
22091
0
    }
22092
0
  }
22093
22094
  // Exponent: "eยฑ" and then 2 or 3 digits.
22095
0
  *ptr++ = 'e';
22096
0
  *ptr++ = negative_exp ? '-' : '+';
22097
0
  if (exp < 10) {
22098
0
    *ptr++ = '0';
22099
0
    *ptr++ = (uint8_t)('0' | exp);
22100
0
  } else if (exp < 100) {
22101
0
    *ptr++ = (uint8_t)('0' | (exp / 10));
22102
0
    *ptr++ = (uint8_t)('0' | (exp % 10));
22103
0
  } else {
22104
0
    int32_t e = exp / 100;
22105
0
    exp -= e * 100;
22106
0
    *ptr++ = (uint8_t)('0' | e);
22107
0
    *ptr++ = (uint8_t)('0' | (exp / 10));
22108
0
    *ptr++ = (uint8_t)('0' | (exp % 10));
22109
0
  }
22110
22111
0
  return n;
22112
0
}
22113
22114
WUFFS_BASE__MAYBE_STATIC size_t  //
22115
wuffs_base__render_number_f64(wuffs_base__slice_u8 dst,
22116
                              double x,
22117
                              uint32_t precision,
22118
0
                              uint32_t options) {
22119
  // Decompose x (64 bits) into negativity (1 bit), base-2 exponent (11 bits
22120
  // with a -1023 bias) and mantissa (52 bits).
22121
0
  uint64_t bits = wuffs_base__ieee_754_bit_representation__from_f64_to_u64(x);
22122
0
  bool neg = (bits >> 63) != 0;
22123
0
  int32_t exp2 = ((int32_t)(bits >> 52)) & 0x7FF;
22124
0
  uint64_t man = bits & 0x000FFFFFFFFFFFFFul;
22125
22126
  // Apply the exponent bias and set the implicit top bit of the mantissa,
22127
  // unless x is subnormal. Also take care of Inf and NaN.
22128
0
  if (exp2 == 0x7FF) {
22129
0
    if (man != 0) {
22130
0
      return wuffs_private_impl__render_nan(dst);
22131
0
    }
22132
0
    return wuffs_private_impl__render_inf(dst, neg, options);
22133
0
  } else if (exp2 == 0) {
22134
0
    exp2 = -1022;
22135
0
  } else {
22136
0
    exp2 -= 1023;
22137
0
    man |= 0x0010000000000000ul;
22138
0
  }
22139
22140
  // Ensure that precision isn't too large.
22141
0
  if (precision > 4095) {
22142
0
    precision = 4095;
22143
0
  }
22144
22145
  // Convert from the (neg, exp2, man) tuple to an HPD.
22146
0
  wuffs_private_impl__high_prec_dec h;
22147
0
  wuffs_private_impl__high_prec_dec__assign(&h, man, neg);
22148
0
  if (h.num_digits > 0) {
22149
0
    wuffs_private_impl__high_prec_dec__lshift(&h,
22150
0
                                              exp2 - 52);  // 52 mantissa bits.
22151
0
  }
22152
22153
  // Handle the "%e" and "%f" formats.
22154
0
  switch (options & (WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_ABSENT |
22155
0
                     WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_PRESENT)) {
22156
0
    case WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_ABSENT:  // The "%"f" format.
22157
0
      if (options & WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION) {
22158
0
        wuffs_private_impl__high_prec_dec__round_just_enough(&h, exp2, man);
22159
0
        int32_t p = ((int32_t)(h.num_digits)) - h.decimal_point;
22160
0
        precision = ((uint32_t)(wuffs_base__i32__max(0, p)));
22161
0
      } else {
22162
0
        wuffs_private_impl__high_prec_dec__round_nearest(
22163
0
            &h, ((int32_t)precision) + h.decimal_point);
22164
0
      }
22165
0
      return wuffs_private_impl__high_prec_dec__render_exponent_absent(
22166
0
          dst, &h, precision, options);
22167
22168
0
    case WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_PRESENT:  // The "%e" format.
22169
0
      if (options & WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION) {
22170
0
        wuffs_private_impl__high_prec_dec__round_just_enough(&h, exp2, man);
22171
0
        precision = (h.num_digits > 0) ? (h.num_digits - 1) : 0;
22172
0
      } else {
22173
0
        wuffs_private_impl__high_prec_dec__round_nearest(
22174
0
            &h, ((int32_t)precision) + 1);
22175
0
      }
22176
0
      return wuffs_private_impl__high_prec_dec__render_exponent_present(
22177
0
          dst, &h, precision, options);
22178
0
  }
22179
22180
  // We have the "%g" format and so precision means the number of significant
22181
  // digits, not the number of digits after the decimal separator. Perform
22182
  // rounding and determine whether to use "%e" or "%f".
22183
0
  int32_t e_threshold = 0;
22184
0
  if (options & WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION) {
22185
0
    wuffs_private_impl__high_prec_dec__round_just_enough(&h, exp2, man);
22186
0
    precision = h.num_digits;
22187
0
    e_threshold = 6;
22188
0
  } else {
22189
0
    if (precision == 0) {
22190
0
      precision = 1;
22191
0
    }
22192
0
    wuffs_private_impl__high_prec_dec__round_nearest(&h, ((int32_t)precision));
22193
0
    e_threshold = ((int32_t)precision);
22194
0
    int32_t nd = ((int32_t)(h.num_digits));
22195
0
    if ((e_threshold > nd) && (nd >= h.decimal_point)) {
22196
0
      e_threshold = nd;
22197
0
    }
22198
0
  }
22199
22200
  // Use the "%e" format if the exponent is large.
22201
0
  int32_t e = h.decimal_point - 1;
22202
0
  if ((e < -4) || (e_threshold <= e)) {
22203
0
    uint32_t p = wuffs_base__u32__min(precision, h.num_digits);
22204
0
    return wuffs_private_impl__high_prec_dec__render_exponent_present(
22205
0
        dst, &h, (p > 0) ? (p - 1) : 0, options);
22206
0
  }
22207
22208
  // Use the "%f" format otherwise.
22209
0
  int32_t p = ((int32_t)precision);
22210
0
  if (p > h.decimal_point) {
22211
0
    p = ((int32_t)(h.num_digits));
22212
0
  }
22213
0
  precision = ((uint32_t)(wuffs_base__i32__max(0, p - h.decimal_point)));
22214
0
  return wuffs_private_impl__high_prec_dec__render_exponent_absent(
22215
0
      dst, &h, precision, options);
22216
0
}
22217
22218
#endif  // !defined(WUFFS_CONFIG__MODULES) ||
22219
        // defined(WUFFS_CONFIG__MODULE__BASE) ||
22220
        // defined(WUFFS_CONFIG__MODULE__BASE__FLOATCONV)
22221
22222
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \
22223
    defined(WUFFS_CONFIG__MODULE__BASE__INTCONV)
22224
22225
// ---------------- Integer
22226
22227
// wuffs_base__parse_number__foo_digits entries are 0x00 for invalid digits,
22228
// and (0x80 | v) for valid digits, where v is the 4 bit value.
22229
22230
static const uint8_t wuffs_base__parse_number__decimal_digits[256] = {
22231
    // 0     1     2     3     4     5     6     7
22232
    // 8     9     A     B     C     D     E     F
22233
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x00 ..= 0x07.
22234
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x08 ..= 0x0F.
22235
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x10 ..= 0x17.
22236
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x18 ..= 0x1F.
22237
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x20 ..= 0x27.
22238
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x28 ..= 0x2F.
22239
    0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,  // 0x30 ..= 0x37. '0'-'7'.
22240
    0x88, 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x38 ..= 0x3F. '8'-'9'.
22241
22242
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x40 ..= 0x47.
22243
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x48 ..= 0x4F.
22244
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x50 ..= 0x57.
22245
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x58 ..= 0x5F.
22246
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x60 ..= 0x67.
22247
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x68 ..= 0x6F.
22248
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x70 ..= 0x77.
22249
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x78 ..= 0x7F.
22250
22251
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x80 ..= 0x87.
22252
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x88 ..= 0x8F.
22253
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x90 ..= 0x97.
22254
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x98 ..= 0x9F.
22255
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xA0 ..= 0xA7.
22256
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xA8 ..= 0xAF.
22257
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xB0 ..= 0xB7.
22258
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xB8 ..= 0xBF.
22259
22260
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xC0 ..= 0xC7.
22261
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xC8 ..= 0xCF.
22262
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xD0 ..= 0xD7.
22263
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xD8 ..= 0xDF.
22264
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xE0 ..= 0xE7.
22265
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xE8 ..= 0xEF.
22266
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xF0 ..= 0xF7.
22267
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xF8 ..= 0xFF.
22268
    // 0     1     2     3     4     5     6     7
22269
    // 8     9     A     B     C     D     E     F
22270
};
22271
22272
static const uint8_t wuffs_base__parse_number__hexadecimal_digits[256] = {
22273
    // 0     1     2     3     4     5     6     7
22274
    // 8     9     A     B     C     D     E     F
22275
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x00 ..= 0x07.
22276
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x08 ..= 0x0F.
22277
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x10 ..= 0x17.
22278
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x18 ..= 0x1F.
22279
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x20 ..= 0x27.
22280
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x28 ..= 0x2F.
22281
    0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,  // 0x30 ..= 0x37. '0'-'7'.
22282
    0x88, 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x38 ..= 0x3F. '8'-'9'.
22283
22284
    0x00, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x00,  // 0x40 ..= 0x47. 'A'-'F'.
22285
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x48 ..= 0x4F.
22286
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x50 ..= 0x57.
22287
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x58 ..= 0x5F.
22288
    0x00, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x00,  // 0x60 ..= 0x67. 'a'-'f'.
22289
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x68 ..= 0x6F.
22290
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x70 ..= 0x77.
22291
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x78 ..= 0x7F.
22292
22293
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x80 ..= 0x87.
22294
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x88 ..= 0x8F.
22295
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x90 ..= 0x97.
22296
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x98 ..= 0x9F.
22297
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xA0 ..= 0xA7.
22298
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xA8 ..= 0xAF.
22299
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xB0 ..= 0xB7.
22300
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xB8 ..= 0xBF.
22301
22302
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xC0 ..= 0xC7.
22303
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xC8 ..= 0xCF.
22304
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xD0 ..= 0xD7.
22305
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xD8 ..= 0xDF.
22306
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xE0 ..= 0xE7.
22307
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xE8 ..= 0xEF.
22308
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xF0 ..= 0xF7.
22309
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xF8 ..= 0xFF.
22310
    // 0     1     2     3     4     5     6     7
22311
    // 8     9     A     B     C     D     E     F
22312
};
22313
22314
static const uint8_t wuffs_private_impl__encode_base16[16] = {
22315
    0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,  // 0x00 ..= 0x07.
22316
    0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46,  // 0x08 ..= 0x0F.
22317
};
22318
22319
// --------
22320
22321
WUFFS_BASE__MAYBE_STATIC wuffs_base__result_i64  //
22322
0
wuffs_base__parse_number_i64(wuffs_base__slice_u8 s, uint32_t options) {
22323
0
  uint8_t* p = s.ptr;
22324
0
  uint8_t* q = s.ptr + s.len;
22325
22326
0
  if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) {
22327
0
    for (; (p < q) && (*p == '_'); p++) {
22328
0
    }
22329
0
  }
22330
22331
0
  bool negative = false;
22332
0
  if (p >= q) {
22333
0
    goto fail_bad_argument;
22334
0
  } else if (*p == '-') {
22335
0
    p++;
22336
0
    negative = true;
22337
0
  } else if (*p == '+') {
22338
0
    p++;
22339
0
  }
22340
22341
0
  do {
22342
0
    wuffs_base__result_u64 r = wuffs_base__parse_number_u64(
22343
0
        wuffs_base__make_slice_u8(p, (size_t)(q - p)), options);
22344
0
    if (r.status.repr != NULL) {
22345
0
      wuffs_base__result_i64 ret;
22346
0
      ret.status.repr = r.status.repr;
22347
0
      ret.value = 0;
22348
0
      return ret;
22349
0
    } else if (negative) {
22350
0
      if (r.value < 0x8000000000000000) {
22351
0
        wuffs_base__result_i64 ret;
22352
0
        ret.status.repr = NULL;
22353
0
        ret.value = -(int64_t)(r.value);
22354
0
        return ret;
22355
0
      } else if (r.value == 0x8000000000000000) {
22356
0
        wuffs_base__result_i64 ret;
22357
0
        ret.status.repr = NULL;
22358
0
        ret.value = INT64_MIN;
22359
0
        return ret;
22360
0
      }
22361
0
      goto fail_out_of_bounds;
22362
0
    } else if (r.value > 0x7FFFFFFFFFFFFFFF) {
22363
0
      goto fail_out_of_bounds;
22364
0
    } else {
22365
0
      wuffs_base__result_i64 ret;
22366
0
      ret.status.repr = NULL;
22367
0
      ret.value = +(int64_t)(r.value);
22368
0
      return ret;
22369
0
    }
22370
0
  } while (0);
22371
22372
0
fail_bad_argument:
22373
0
  do {
22374
0
    wuffs_base__result_i64 ret;
22375
0
    ret.status.repr = wuffs_base__error__bad_argument;
22376
0
    ret.value = 0;
22377
0
    return ret;
22378
0
  } while (0);
22379
22380
0
fail_out_of_bounds:
22381
0
  do {
22382
0
    wuffs_base__result_i64 ret;
22383
0
    ret.status.repr = wuffs_base__error__out_of_bounds;
22384
0
    ret.value = 0;
22385
0
    return ret;
22386
0
  } while (0);
22387
0
}
22388
22389
WUFFS_BASE__MAYBE_STATIC wuffs_base__result_u64  //
22390
0
wuffs_base__parse_number_u64(wuffs_base__slice_u8 s, uint32_t options) {
22391
0
  uint8_t* p = s.ptr;
22392
0
  uint8_t* q = s.ptr + s.len;
22393
22394
0
  if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) {
22395
0
    for (; (p < q) && (*p == '_'); p++) {
22396
0
    }
22397
0
  }
22398
22399
0
  if (p >= q) {
22400
0
    goto fail_bad_argument;
22401
22402
0
  } else if (*p == '0') {
22403
0
    p++;
22404
0
    if (p >= q) {
22405
0
      goto ok_zero;
22406
0
    }
22407
0
    if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) {
22408
0
      if (*p == '_') {
22409
0
        p++;
22410
0
        for (; p < q; p++) {
22411
0
          if (*p != '_') {
22412
0
            if (options &
22413
0
                WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_MULTIPLE_LEADING_ZEROES) {
22414
0
              goto decimal;
22415
0
            }
22416
0
            goto fail_bad_argument;
22417
0
          }
22418
0
        }
22419
0
        goto ok_zero;
22420
0
      }
22421
0
    }
22422
22423
0
    if ((*p == 'x') || (*p == 'X')) {
22424
0
      p++;
22425
0
      if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) {
22426
0
        for (; (p < q) && (*p == '_'); p++) {
22427
0
        }
22428
0
      }
22429
0
      if (p < q) {
22430
0
        goto hexadecimal;
22431
0
      }
22432
22433
0
    } else if ((*p == 'd') || (*p == 'D')) {
22434
0
      p++;
22435
0
      if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) {
22436
0
        for (; (p < q) && (*p == '_'); p++) {
22437
0
        }
22438
0
      }
22439
0
      if (p < q) {
22440
0
        goto decimal;
22441
0
      }
22442
0
    }
22443
22444
0
    if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_MULTIPLE_LEADING_ZEROES) {
22445
0
      goto decimal;
22446
0
    }
22447
0
    goto fail_bad_argument;
22448
0
  }
22449
22450
0
decimal:
22451
0
  do {
22452
0
    uint64_t v = wuffs_base__parse_number__decimal_digits[*p++];
22453
0
    if (v == 0) {
22454
0
      goto fail_bad_argument;
22455
0
    }
22456
0
    v &= 0x0F;
22457
22458
    // UINT64_MAX is 18446744073709551615, which is ((10 * max10) + max1).
22459
0
    const uint64_t max10 = 1844674407370955161u;
22460
0
    const uint8_t max1 = 5;
22461
22462
0
    for (; p < q; p++) {
22463
0
      if ((*p == '_') &&
22464
0
          (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) {
22465
0
        continue;
22466
0
      }
22467
0
      uint8_t digit = wuffs_base__parse_number__decimal_digits[*p];
22468
0
      if (digit == 0) {
22469
0
        goto fail_bad_argument;
22470
0
      }
22471
0
      digit &= 0x0F;
22472
0
      if ((v > max10) || ((v == max10) && (digit > max1))) {
22473
0
        goto fail_out_of_bounds;
22474
0
      }
22475
0
      v = (10 * v) + ((uint64_t)(digit));
22476
0
    }
22477
22478
0
    wuffs_base__result_u64 ret;
22479
0
    ret.status.repr = NULL;
22480
0
    ret.value = v;
22481
0
    return ret;
22482
0
  } while (0);
22483
22484
0
hexadecimal:
22485
0
  do {
22486
0
    uint64_t v = wuffs_base__parse_number__hexadecimal_digits[*p++];
22487
0
    if (v == 0) {
22488
0
      goto fail_bad_argument;
22489
0
    }
22490
0
    v &= 0x0F;
22491
22492
0
    for (; p < q; p++) {
22493
0
      if ((*p == '_') &&
22494
0
          (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) {
22495
0
        continue;
22496
0
      }
22497
0
      uint8_t digit = wuffs_base__parse_number__hexadecimal_digits[*p];
22498
0
      if (digit == 0) {
22499
0
        goto fail_bad_argument;
22500
0
      }
22501
0
      digit &= 0x0F;
22502
0
      if ((v >> 60) != 0) {
22503
0
        goto fail_out_of_bounds;
22504
0
      }
22505
0
      v = (v << 4) | ((uint64_t)(digit));
22506
0
    }
22507
22508
0
    wuffs_base__result_u64 ret;
22509
0
    ret.status.repr = NULL;
22510
0
    ret.value = v;
22511
0
    return ret;
22512
0
  } while (0);
22513
22514
0
ok_zero:
22515
0
  do {
22516
0
    wuffs_base__result_u64 ret;
22517
0
    ret.status.repr = NULL;
22518
0
    ret.value = 0;
22519
0
    return ret;
22520
0
  } while (0);
22521
22522
0
fail_bad_argument:
22523
0
  do {
22524
0
    wuffs_base__result_u64 ret;
22525
0
    ret.status.repr = wuffs_base__error__bad_argument;
22526
0
    ret.value = 0;
22527
0
    return ret;
22528
0
  } while (0);
22529
22530
0
fail_out_of_bounds:
22531
0
  do {
22532
0
    wuffs_base__result_u64 ret;
22533
0
    ret.status.repr = wuffs_base__error__out_of_bounds;
22534
0
    ret.value = 0;
22535
0
    return ret;
22536
0
  } while (0);
22537
0
}
22538
22539
// --------
22540
22541
// wuffs_base__render_number__first_hundred contains the decimal encodings of
22542
// the first one hundred numbers [0 ..= 99].
22543
static const uint8_t wuffs_base__render_number__first_hundred[200] = {
22544
    '0', '0', '0', '1', '0', '2', '0', '3', '0', '4',  //
22545
    '0', '5', '0', '6', '0', '7', '0', '8', '0', '9',  //
22546
    '1', '0', '1', '1', '1', '2', '1', '3', '1', '4',  //
22547
    '1', '5', '1', '6', '1', '7', '1', '8', '1', '9',  //
22548
    '2', '0', '2', '1', '2', '2', '2', '3', '2', '4',  //
22549
    '2', '5', '2', '6', '2', '7', '2', '8', '2', '9',  //
22550
    '3', '0', '3', '1', '3', '2', '3', '3', '3', '4',  //
22551
    '3', '5', '3', '6', '3', '7', '3', '8', '3', '9',  //
22552
    '4', '0', '4', '1', '4', '2', '4', '3', '4', '4',  //
22553
    '4', '5', '4', '6', '4', '7', '4', '8', '4', '9',  //
22554
    '5', '0', '5', '1', '5', '2', '5', '3', '5', '4',  //
22555
    '5', '5', '5', '6', '5', '7', '5', '8', '5', '9',  //
22556
    '6', '0', '6', '1', '6', '2', '6', '3', '6', '4',  //
22557
    '6', '5', '6', '6', '6', '7', '6', '8', '6', '9',  //
22558
    '7', '0', '7', '1', '7', '2', '7', '3', '7', '4',  //
22559
    '7', '5', '7', '6', '7', '7', '7', '8', '7', '9',  //
22560
    '8', '0', '8', '1', '8', '2', '8', '3', '8', '4',  //
22561
    '8', '5', '8', '6', '8', '7', '8', '8', '8', '9',  //
22562
    '9', '0', '9', '1', '9', '2', '9', '3', '9', '4',  //
22563
    '9', '5', '9', '6', '9', '7', '9', '8', '9', '9',  //
22564
};
22565
22566
static size_t  //
22567
wuffs_private_impl__render_number_u64(wuffs_base__slice_u8 dst,
22568
                                      uint64_t x,
22569
                                      uint32_t options,
22570
0
                                      bool neg) {
22571
0
  uint8_t buf[WUFFS_BASE__U64__BYTE_LENGTH__MAX_INCL];
22572
0
  uint8_t* ptr = &buf[0] + sizeof(buf);
22573
22574
0
  while (x >= 100) {
22575
0
    size_t index = ((size_t)((x % 100) * 2));
22576
0
    x /= 100;
22577
0
    uint8_t s0 = wuffs_base__render_number__first_hundred[index + 0];
22578
0
    uint8_t s1 = wuffs_base__render_number__first_hundred[index + 1];
22579
0
    ptr -= 2;
22580
0
    ptr[0] = s0;
22581
0
    ptr[1] = s1;
22582
0
  }
22583
22584
0
  if (x < 10) {
22585
0
    ptr -= 1;
22586
0
    ptr[0] = (uint8_t)('0' + x);
22587
0
  } else {
22588
0
    size_t index = ((size_t)(x * 2));
22589
0
    uint8_t s0 = wuffs_base__render_number__first_hundred[index + 0];
22590
0
    uint8_t s1 = wuffs_base__render_number__first_hundred[index + 1];
22591
0
    ptr -= 2;
22592
0
    ptr[0] = s0;
22593
0
    ptr[1] = s1;
22594
0
  }
22595
22596
0
  if (neg) {
22597
0
    ptr -= 1;
22598
0
    ptr[0] = '-';
22599
0
  } else if (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN) {
22600
0
    ptr -= 1;
22601
0
    ptr[0] = '+';
22602
0
  }
22603
22604
0
  size_t n = sizeof(buf) - ((size_t)(ptr - &buf[0]));
22605
0
  if (n > dst.len) {
22606
0
    return 0;
22607
0
  }
22608
0
  memcpy(dst.ptr + ((options & WUFFS_BASE__RENDER_NUMBER_XXX__ALIGN_RIGHT)
22609
0
                        ? (dst.len - n)
22610
0
                        : 0),
22611
0
         ptr, n);
22612
0
  return n;
22613
0
}
22614
22615
WUFFS_BASE__MAYBE_STATIC size_t  //
22616
wuffs_base__render_number_i64(wuffs_base__slice_u8 dst,
22617
                              int64_t x,
22618
0
                              uint32_t options) {
22619
0
  uint64_t u = (uint64_t)x;
22620
0
  bool neg = x < 0;
22621
0
  if (neg) {
22622
0
    u = 1 + ~u;
22623
0
  }
22624
0
  return wuffs_private_impl__render_number_u64(dst, u, options, neg);
22625
0
}
22626
22627
WUFFS_BASE__MAYBE_STATIC size_t  //
22628
wuffs_base__render_number_u64(wuffs_base__slice_u8 dst,
22629
                              uint64_t x,
22630
0
                              uint32_t options) {
22631
0
  return wuffs_private_impl__render_number_u64(dst, x, options, false);
22632
0
}
22633
22634
// ---------------- Base-16
22635
22636
WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output  //
22637
wuffs_base__base_16__decode2(wuffs_base__slice_u8 dst,
22638
                             wuffs_base__slice_u8 src,
22639
                             bool src_closed,
22640
0
                             uint32_t options) {
22641
0
  wuffs_base__transform__output o;
22642
0
  size_t src_len2 = src.len / 2;
22643
0
  size_t len;
22644
0
  if (dst.len < src_len2) {
22645
0
    len = dst.len;
22646
0
    o.status.repr = wuffs_base__suspension__short_write;
22647
0
  } else {
22648
0
    len = src_len2;
22649
0
    if (!src_closed) {
22650
0
      o.status.repr = wuffs_base__suspension__short_read;
22651
0
    } else if (src.len & 1) {
22652
0
      o.status.repr = wuffs_base__error__bad_data;
22653
0
    } else {
22654
0
      o.status.repr = NULL;
22655
0
    }
22656
0
  }
22657
22658
0
  uint8_t* d = dst.ptr;
22659
0
  uint8_t* s = src.ptr;
22660
0
  size_t n = len;
22661
22662
0
  while (n--) {
22663
0
    *d = (uint8_t)((wuffs_base__parse_number__hexadecimal_digits[s[0]] << 4) |
22664
0
                   (wuffs_base__parse_number__hexadecimal_digits[s[1]] & 0x0F));
22665
0
    d += 1;
22666
0
    s += 2;
22667
0
  }
22668
22669
0
  o.num_dst = len;
22670
0
  o.num_src = len * 2;
22671
0
  return o;
22672
0
}
22673
22674
WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output  //
22675
wuffs_base__base_16__decode4(wuffs_base__slice_u8 dst,
22676
                             wuffs_base__slice_u8 src,
22677
                             bool src_closed,
22678
0
                             uint32_t options) {
22679
0
  wuffs_base__transform__output o;
22680
0
  size_t src_len4 = src.len / 4;
22681
0
  size_t len = dst.len < src_len4 ? dst.len : src_len4;
22682
0
  if (dst.len < src_len4) {
22683
0
    len = dst.len;
22684
0
    o.status.repr = wuffs_base__suspension__short_write;
22685
0
  } else {
22686
0
    len = src_len4;
22687
0
    if (!src_closed) {
22688
0
      o.status.repr = wuffs_base__suspension__short_read;
22689
0
    } else if (src.len & 1) {
22690
0
      o.status.repr = wuffs_base__error__bad_data;
22691
0
    } else {
22692
0
      o.status.repr = NULL;
22693
0
    }
22694
0
  }
22695
22696
0
  uint8_t* d = dst.ptr;
22697
0
  uint8_t* s = src.ptr;
22698
0
  size_t n = len;
22699
22700
0
  while (n--) {
22701
0
    *d = (uint8_t)((wuffs_base__parse_number__hexadecimal_digits[s[2]] << 4) |
22702
0
                   (wuffs_base__parse_number__hexadecimal_digits[s[3]] & 0x0F));
22703
0
    d += 1;
22704
0
    s += 4;
22705
0
  }
22706
22707
0
  o.num_dst = len;
22708
0
  o.num_src = len * 4;
22709
0
  return o;
22710
0
}
22711
22712
WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output  //
22713
wuffs_base__base_16__encode2(wuffs_base__slice_u8 dst,
22714
                             wuffs_base__slice_u8 src,
22715
                             bool src_closed,
22716
0
                             uint32_t options) {
22717
0
  wuffs_base__transform__output o;
22718
0
  size_t dst_len2 = dst.len / 2;
22719
0
  size_t len;
22720
0
  if (dst_len2 < src.len) {
22721
0
    len = dst_len2;
22722
0
    o.status.repr = wuffs_base__suspension__short_write;
22723
0
  } else {
22724
0
    len = src.len;
22725
0
    if (!src_closed) {
22726
0
      o.status.repr = wuffs_base__suspension__short_read;
22727
0
    } else {
22728
0
      o.status.repr = NULL;
22729
0
    }
22730
0
  }
22731
22732
0
  uint8_t* d = dst.ptr;
22733
0
  uint8_t* s = src.ptr;
22734
0
  size_t n = len;
22735
22736
0
  while (n--) {
22737
0
    uint8_t c = *s;
22738
0
    d[0] = wuffs_private_impl__encode_base16[c >> 4];
22739
0
    d[1] = wuffs_private_impl__encode_base16[c & 0x0F];
22740
0
    d += 2;
22741
0
    s += 1;
22742
0
  }
22743
22744
0
  o.num_dst = len * 2;
22745
0
  o.num_src = len;
22746
0
  return o;
22747
0
}
22748
22749
WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output  //
22750
wuffs_base__base_16__encode4(wuffs_base__slice_u8 dst,
22751
                             wuffs_base__slice_u8 src,
22752
                             bool src_closed,
22753
0
                             uint32_t options) {
22754
0
  wuffs_base__transform__output o;
22755
0
  size_t dst_len4 = dst.len / 4;
22756
0
  size_t len;
22757
0
  if (dst_len4 < src.len) {
22758
0
    len = dst_len4;
22759
0
    o.status.repr = wuffs_base__suspension__short_write;
22760
0
  } else {
22761
0
    len = src.len;
22762
0
    if (!src_closed) {
22763
0
      o.status.repr = wuffs_base__suspension__short_read;
22764
0
    } else {
22765
0
      o.status.repr = NULL;
22766
0
    }
22767
0
  }
22768
22769
0
  uint8_t* d = dst.ptr;
22770
0
  uint8_t* s = src.ptr;
22771
0
  size_t n = len;
22772
22773
0
  while (n--) {
22774
0
    uint8_t c = *s;
22775
0
    d[0] = '\\';
22776
0
    d[1] = 'x';
22777
0
    d[2] = wuffs_private_impl__encode_base16[c >> 4];
22778
0
    d[3] = wuffs_private_impl__encode_base16[c & 0x0F];
22779
0
    d += 4;
22780
0
    s += 1;
22781
0
  }
22782
22783
0
  o.num_dst = len * 4;
22784
0
  o.num_src = len;
22785
0
  return o;
22786
0
}
22787
22788
// ---------------- Base-64
22789
22790
// The two base-64 alphabets, std and url, differ only in the last two codes.
22791
//  - std: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
22792
//  - url: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"
22793
22794
static const uint8_t wuffs_base__base_64__decode_std[256] = {
22795
    // 0     1     2     3     4     5     6     7
22796
    // 8     9     A     B     C     D     E     F
22797
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x00 ..= 0x07.
22798
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x08 ..= 0x0F.
22799
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x10 ..= 0x17.
22800
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x18 ..= 0x1F.
22801
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x20 ..= 0x27.
22802
    0x80, 0x80, 0x80, 0x3E, 0x80, 0x80, 0x80, 0x3F,  // 0x28 ..= 0x2F.
22803
    0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B,  // 0x30 ..= 0x37.
22804
    0x3C, 0x3D, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x38 ..= 0x3F.
22805
22806
    0x80, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,  // 0x40 ..= 0x47.
22807
    0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E,  // 0x48 ..= 0x4F.
22808
    0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,  // 0x50 ..= 0x57.
22809
    0x17, 0x18, 0x19, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x58 ..= 0x5F.
22810
    0x80, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20,  // 0x60 ..= 0x67.
22811
    0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,  // 0x68 ..= 0x6F.
22812
    0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30,  // 0x70 ..= 0x77.
22813
    0x31, 0x32, 0x33, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x78 ..= 0x7F.
22814
22815
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x80 ..= 0x87.
22816
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x88 ..= 0x8F.
22817
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x90 ..= 0x97.
22818
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x98 ..= 0x9F.
22819
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xA0 ..= 0xA7.
22820
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xA8 ..= 0xAF.
22821
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xB0 ..= 0xB7.
22822
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xB8 ..= 0xBF.
22823
22824
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xC0 ..= 0xC7.
22825
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xC8 ..= 0xCF.
22826
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xD0 ..= 0xD7.
22827
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xD8 ..= 0xDF.
22828
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xE0 ..= 0xE7.
22829
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xE8 ..= 0xEF.
22830
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xF0 ..= 0xF7.
22831
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xF8 ..= 0xFF.
22832
    // 0     1     2     3     4     5     6     7
22833
    // 8     9     A     B     C     D     E     F
22834
};
22835
22836
static const uint8_t wuffs_base__base_64__decode_url[256] = {
22837
    // 0     1     2     3     4     5     6     7
22838
    // 8     9     A     B     C     D     E     F
22839
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x00 ..= 0x07.
22840
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x08 ..= 0x0F.
22841
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x10 ..= 0x17.
22842
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x18 ..= 0x1F.
22843
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x20 ..= 0x27.
22844
    0x80, 0x80, 0x80, 0x80, 0x80, 0x3E, 0x80, 0x80,  // 0x28 ..= 0x2F.
22845
    0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B,  // 0x30 ..= 0x37.
22846
    0x3C, 0x3D, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x38 ..= 0x3F.
22847
22848
    0x80, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,  // 0x40 ..= 0x47.
22849
    0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E,  // 0x48 ..= 0x4F.
22850
    0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,  // 0x50 ..= 0x57.
22851
    0x17, 0x18, 0x19, 0x80, 0x80, 0x80, 0x80, 0x3F,  // 0x58 ..= 0x5F.
22852
    0x80, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20,  // 0x60 ..= 0x67.
22853
    0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,  // 0x68 ..= 0x6F.
22854
    0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30,  // 0x70 ..= 0x77.
22855
    0x31, 0x32, 0x33, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x78 ..= 0x7F.
22856
22857
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x80 ..= 0x87.
22858
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x88 ..= 0x8F.
22859
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x90 ..= 0x97.
22860
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x98 ..= 0x9F.
22861
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xA0 ..= 0xA7.
22862
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xA8 ..= 0xAF.
22863
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xB0 ..= 0xB7.
22864
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xB8 ..= 0xBF.
22865
22866
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xC0 ..= 0xC7.
22867
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xC8 ..= 0xCF.
22868
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xD0 ..= 0xD7.
22869
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xD8 ..= 0xDF.
22870
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xE0 ..= 0xE7.
22871
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xE8 ..= 0xEF.
22872
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xF0 ..= 0xF7.
22873
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xF8 ..= 0xFF.
22874
    // 0     1     2     3     4     5     6     7
22875
    // 8     9     A     B     C     D     E     F
22876
};
22877
22878
static const uint8_t wuffs_base__base_64__encode_std[64] = {
22879
    // 0     1     2     3     4     5     6     7
22880
    // 8     9     A     B     C     D     E     F
22881
    0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,  // 0x00 ..= 0x07.
22882
    0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50,  // 0x08 ..= 0x0F.
22883
    0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,  // 0x10 ..= 0x17.
22884
    0x59, 0x5A, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,  // 0x18 ..= 0x1F.
22885
    0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E,  // 0x20 ..= 0x27.
22886
    0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,  // 0x28 ..= 0x2F.
22887
    0x77, 0x78, 0x79, 0x7A, 0x30, 0x31, 0x32, 0x33,  // 0x30 ..= 0x37.
22888
    0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2B, 0x2F,  // 0x38 ..= 0x3F.
22889
};
22890
22891
static const uint8_t wuffs_base__base_64__encode_url[64] = {
22892
    // 0     1     2     3     4     5     6     7
22893
    // 8     9     A     B     C     D     E     F
22894
    0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,  // 0x00 ..= 0x07.
22895
    0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50,  // 0x08 ..= 0x0F.
22896
    0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,  // 0x10 ..= 0x17.
22897
    0x59, 0x5A, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,  // 0x18 ..= 0x1F.
22898
    0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E,  // 0x20 ..= 0x27.
22899
    0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,  // 0x28 ..= 0x2F.
22900
    0x77, 0x78, 0x79, 0x7A, 0x30, 0x31, 0x32, 0x33,  // 0x30 ..= 0x37.
22901
    0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2D, 0x5F,  // 0x38 ..= 0x3F.
22902
};
22903
22904
// --------
22905
22906
WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output  //
22907
wuffs_base__base_64__decode(wuffs_base__slice_u8 dst,
22908
                            wuffs_base__slice_u8 src,
22909
                            bool src_closed,
22910
0
                            uint32_t options) {
22911
0
  const uint8_t* alphabet = (options & WUFFS_BASE__BASE_64__URL_ALPHABET)
22912
0
                                ? wuffs_base__base_64__decode_url
22913
0
                                : wuffs_base__base_64__decode_std;
22914
0
  wuffs_base__transform__output o;
22915
0
  uint8_t* d_ptr = dst.ptr;
22916
0
  size_t d_len = dst.len;
22917
0
  const uint8_t* s_ptr = src.ptr;
22918
0
  size_t s_len = src.len;
22919
0
  bool pad = false;
22920
22921
0
  while (s_len >= 4) {
22922
0
    uint32_t s = wuffs_base__peek_u32le__no_bounds_check(s_ptr);
22923
0
    uint32_t s0 = alphabet[0xFF & (s >> 0)];
22924
0
    uint32_t s1 = alphabet[0xFF & (s >> 8)];
22925
0
    uint32_t s2 = alphabet[0xFF & (s >> 16)];
22926
0
    uint32_t s3 = alphabet[0xFF & (s >> 24)];
22927
22928
0
    if (((s0 | s1 | s2 | s3) & 0xC0) != 0) {
22929
0
      if (s_len > 4) {
22930
0
        o.status.repr = wuffs_base__error__bad_data;
22931
0
        goto done;
22932
0
      } else if (!src_closed) {
22933
0
        o.status.repr = wuffs_base__suspension__short_read;
22934
0
        goto done;
22935
0
      } else if ((options & WUFFS_BASE__BASE_64__DECODE_ALLOW_PADDING) &&
22936
0
                 (s_ptr[3] == '=')) {
22937
0
        pad = true;
22938
0
        if (s_ptr[2] == '=') {
22939
0
          goto src2;
22940
0
        }
22941
0
        goto src3;
22942
0
      }
22943
0
      o.status.repr = wuffs_base__error__bad_data;
22944
0
      goto done;
22945
0
    }
22946
22947
0
    if (d_len < 3) {
22948
0
      o.status.repr = wuffs_base__suspension__short_write;
22949
0
      goto done;
22950
0
    }
22951
22952
0
    s_ptr += 4;
22953
0
    s_len -= 4;
22954
0
    s = (s0 << 18) | (s1 << 12) | (s2 << 6) | (s3 << 0);
22955
0
    *d_ptr++ = (uint8_t)(s >> 16);
22956
0
    *d_ptr++ = (uint8_t)(s >> 8);
22957
0
    *d_ptr++ = (uint8_t)(s >> 0);
22958
0
    d_len -= 3;
22959
0
  }
22960
22961
0
  if (!src_closed) {
22962
0
    o.status.repr = wuffs_base__suspension__short_read;
22963
0
    goto done;
22964
0
  }
22965
22966
0
  if (s_len == 0) {
22967
0
    o.status.repr = NULL;
22968
0
    goto done;
22969
0
  } else if (s_len == 1) {
22970
0
    o.status.repr = wuffs_base__error__bad_data;
22971
0
    goto done;
22972
0
  } else if (s_len == 2) {
22973
0
    goto src2;
22974
0
  }
22975
22976
0
src3:
22977
0
  do {
22978
0
    uint32_t s = wuffs_base__peek_u24le__no_bounds_check(s_ptr);
22979
0
    uint32_t s0 = alphabet[0xFF & (s >> 0)];
22980
0
    uint32_t s1 = alphabet[0xFF & (s >> 8)];
22981
0
    uint32_t s2 = alphabet[0xFF & (s >> 16)];
22982
0
    if ((s0 & 0xC0) || (s1 & 0xC0) || (s2 & 0xC3)) {
22983
0
      o.status.repr = wuffs_base__error__bad_data;
22984
0
      goto done;
22985
0
    }
22986
0
    if (d_len < 2) {
22987
0
      o.status.repr = wuffs_base__suspension__short_write;
22988
0
      goto done;
22989
0
    }
22990
0
    s_ptr += pad ? 4 : 3;
22991
0
    s = (s0 << 18) | (s1 << 12) | (s2 << 6);
22992
0
    *d_ptr++ = (uint8_t)(s >> 16);
22993
0
    *d_ptr++ = (uint8_t)(s >> 8);
22994
0
    o.status.repr = NULL;
22995
0
    goto done;
22996
0
  } while (0);
22997
22998
0
src2:
22999
0
  do {
23000
0
    uint32_t s = wuffs_base__peek_u16le__no_bounds_check(s_ptr);
23001
0
    uint32_t s0 = alphabet[0xFF & (s >> 0)];
23002
0
    uint32_t s1 = alphabet[0xFF & (s >> 8)];
23003
0
    if ((s0 & 0xC0) || (s1 & 0xCF)) {
23004
0
      o.status.repr = wuffs_base__error__bad_data;
23005
0
      goto done;
23006
0
    }
23007
0
    if (d_len < 1) {
23008
0
      o.status.repr = wuffs_base__suspension__short_write;
23009
0
      goto done;
23010
0
    }
23011
0
    s_ptr += pad ? 4 : 2;
23012
0
    s = (s0 << 18) | (s1 << 12);
23013
0
    *d_ptr++ = (uint8_t)(s >> 16);
23014
0
    o.status.repr = NULL;
23015
0
    goto done;
23016
0
  } while (0);
23017
23018
0
done:
23019
0
  o.num_dst = (size_t)(d_ptr - dst.ptr);
23020
0
  o.num_src = (size_t)(s_ptr - src.ptr);
23021
0
  return o;
23022
0
}
23023
23024
WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output  //
23025
wuffs_base__base_64__encode(wuffs_base__slice_u8 dst,
23026
                            wuffs_base__slice_u8 src,
23027
                            bool src_closed,
23028
0
                            uint32_t options) {
23029
0
  const uint8_t* alphabet = (options & WUFFS_BASE__BASE_64__URL_ALPHABET)
23030
0
                                ? wuffs_base__base_64__encode_url
23031
0
                                : wuffs_base__base_64__encode_std;
23032
0
  wuffs_base__transform__output o;
23033
0
  uint8_t* d_ptr = dst.ptr;
23034
0
  size_t d_len = dst.len;
23035
0
  const uint8_t* s_ptr = src.ptr;
23036
0
  size_t s_len = src.len;
23037
23038
0
  do {
23039
0
    while (s_len >= 3) {
23040
0
      if (d_len < 4) {
23041
0
        o.status.repr = wuffs_base__suspension__short_write;
23042
0
        goto done;
23043
0
      }
23044
0
      uint32_t s = wuffs_base__peek_u24be__no_bounds_check(s_ptr);
23045
0
      s_ptr += 3;
23046
0
      s_len -= 3;
23047
0
      *d_ptr++ = alphabet[0x3F & (s >> 18)];
23048
0
      *d_ptr++ = alphabet[0x3F & (s >> 12)];
23049
0
      *d_ptr++ = alphabet[0x3F & (s >> 6)];
23050
0
      *d_ptr++ = alphabet[0x3F & (s >> 0)];
23051
0
      d_len -= 4;
23052
0
    }
23053
23054
0
    if (!src_closed) {
23055
0
      o.status.repr = wuffs_base__suspension__short_read;
23056
0
      goto done;
23057
0
    }
23058
23059
0
    if (s_len == 2) {
23060
0
      if (d_len <
23061
0
          ((options & WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING) ? 4 : 3)) {
23062
0
        o.status.repr = wuffs_base__suspension__short_write;
23063
0
        goto done;
23064
0
      }
23065
0
      uint32_t s = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(s_ptr)))
23066
0
                   << 8;
23067
0
      s_ptr += 2;
23068
0
      *d_ptr++ = alphabet[0x3F & (s >> 18)];
23069
0
      *d_ptr++ = alphabet[0x3F & (s >> 12)];
23070
0
      *d_ptr++ = alphabet[0x3F & (s >> 6)];
23071
0
      if (options & WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING) {
23072
0
        *d_ptr++ = '=';
23073
0
      }
23074
0
      o.status.repr = NULL;
23075
0
      goto done;
23076
23077
0
    } else if (s_len == 1) {
23078
0
      if (d_len <
23079
0
          ((options & WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING) ? 4 : 2)) {
23080
0
        o.status.repr = wuffs_base__suspension__short_write;
23081
0
        goto done;
23082
0
      }
23083
0
      uint32_t s = ((uint32_t)(wuffs_base__peek_u8__no_bounds_check(s_ptr)))
23084
0
                   << 16;
23085
0
      s_ptr += 1;
23086
0
      *d_ptr++ = alphabet[0x3F & (s >> 18)];
23087
0
      *d_ptr++ = alphabet[0x3F & (s >> 12)];
23088
0
      if (options & WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING) {
23089
0
        *d_ptr++ = '=';
23090
0
        *d_ptr++ = '=';
23091
0
      }
23092
0
      o.status.repr = NULL;
23093
0
      goto done;
23094
23095
0
    } else {
23096
0
      o.status.repr = NULL;
23097
0
      goto done;
23098
0
    }
23099
0
  } while (0);
23100
23101
0
done:
23102
0
  o.num_dst = (size_t)(d_ptr - dst.ptr);
23103
0
  o.num_src = (size_t)(s_ptr - src.ptr);
23104
0
  return o;
23105
0
}
23106
23107
#endif  // !defined(WUFFS_CONFIG__MODULES) ||
23108
        // defined(WUFFS_CONFIG__MODULE__BASE) ||
23109
        // defined(WUFFS_CONFIG__MODULE__BASE__INTCONV)
23110
23111
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \
23112
    defined(WUFFS_CONFIG__MODULE__BASE__MAGIC)
23113
23114
// ---------------- Magic Numbers
23115
23116
// ICO doesn't start with a magic identifier. Instead, see if the opening bytes
23117
// are plausibly ICO.
23118
//
23119
// Callers should have already verified that (prefix_data.len >= 2) and the
23120
// first two bytes are 0x00.
23121
//
23122
// See:
23123
//  - https://docs.fileformat.com/image/ico/
23124
static int32_t  //
23125
wuffs_base__magic_number_guess_fourcc__maybe_ico(
23126
    wuffs_base__slice_u8 prefix_data,
23127
0
    bool prefix_closed) {
23128
  // Allow-list for the Image Type field.
23129
0
  if (prefix_data.len < 4) {
23130
0
    return prefix_closed ? 0 : -1;
23131
0
  } else if (prefix_data.ptr[3] != 0) {
23132
0
    return 0;
23133
0
  }
23134
0
  switch (prefix_data.ptr[2]) {
23135
0
    case 0x01:  // ICO
23136
0
    case 0x02:  // CUR
23137
0
      break;
23138
0
    default:
23139
0
      return 0;
23140
0
  }
23141
23142
  // The Number Of Images should be positive.
23143
0
  if (prefix_data.len < 6) {
23144
0
    return prefix_closed ? 0 : -1;
23145
0
  } else if ((prefix_data.ptr[4] == 0) && (prefix_data.ptr[5] == 0)) {
23146
0
    return 0;
23147
0
  }
23148
23149
  // The first ICONDIRENTRY's fourth byte should be zero.
23150
0
  if (prefix_data.len < 10) {
23151
0
    return prefix_closed ? 0 : -1;
23152
0
  } else if (prefix_data.ptr[9] != 0) {
23153
0
    return 0;
23154
0
  }
23155
23156
  // TODO: have a separate FourCC for CUR?
23157
0
  return 0x49434F20;  // 'ICO 'be
23158
0
}
23159
23160
// TGA doesn't start with a magic identifier. Instead, see if the opening bytes
23161
// are plausibly TGA.
23162
//
23163
// Callers should have already verified that (prefix_data.len >= 2) and the
23164
// second byte (prefix_data.ptr[1], the Color Map Type byte), is either 0x00 or
23165
// 0x01.
23166
//
23167
// See:
23168
//  - https://docs.fileformat.com/image/tga/
23169
//  - https://www.dca.fee.unicamp.br/~martino/disciplinas/ea978/tgaffs.pdf
23170
static int32_t  //
23171
wuffs_base__magic_number_guess_fourcc__maybe_tga(
23172
    wuffs_base__slice_u8 prefix_data,
23173
0
    bool prefix_closed) {
23174
  // Allow-list for the Image Type field.
23175
0
  if (prefix_data.len < 3) {
23176
0
    return prefix_closed ? 0 : -1;
23177
0
  }
23178
0
  switch (prefix_data.ptr[2]) {
23179
0
    case 0x01:
23180
0
    case 0x02:
23181
0
    case 0x03:
23182
0
    case 0x09:
23183
0
    case 0x0A:
23184
0
    case 0x0B:
23185
0
      break;
23186
0
    default:
23187
      // TODO: 0x20 and 0x21 are invalid, according to the spec, but are
23188
      // apparently unofficial extensions.
23189
0
      return 0;
23190
0
  }
23191
23192
  // Allow-list for the Color Map Entry Size field (if the Color Map Type field
23193
  // is non-zero) or else all the Color Map fields should be zero.
23194
0
  if (prefix_data.len < 8) {
23195
0
    return prefix_closed ? 0 : -1;
23196
0
  } else if (prefix_data.ptr[1] != 0x00) {
23197
0
    switch (prefix_data.ptr[7]) {
23198
0
      case 0x0F:
23199
0
      case 0x10:
23200
0
      case 0x18:
23201
0
      case 0x20:
23202
0
        break;
23203
0
      default:
23204
0
        return 0;
23205
0
    }
23206
0
  } else if ((prefix_data.ptr[3] | prefix_data.ptr[4] | prefix_data.ptr[5] |
23207
0
              prefix_data.ptr[6] | prefix_data.ptr[7]) != 0x00) {
23208
0
    return 0;
23209
0
  }
23210
23211
  // Allow-list for the Pixel Depth field.
23212
0
  if (prefix_data.len < 17) {
23213
0
    return prefix_closed ? 0 : -1;
23214
0
  }
23215
0
  switch (prefix_data.ptr[16]) {
23216
0
    case 0x01:
23217
0
    case 0x08:
23218
0
    case 0x0F:
23219
0
    case 0x10:
23220
0
    case 0x18:
23221
0
    case 0x20:
23222
0
      break;
23223
0
    default:
23224
0
      return 0;
23225
0
  }
23226
23227
0
  return 0x54474120;  // 'TGA 'be
23228
0
}
23229
23230
WUFFS_BASE__MAYBE_STATIC int32_t  //
23231
wuffs_base__magic_number_guess_fourcc(wuffs_base__slice_u8 prefix_data,
23232
0
                                      bool prefix_closed) {
23233
  // This is similar to (but different from):
23234
  //  - the magic/Magdir tables under https://github.com/file/file
23235
  //  - the MIME Sniffing algorithm at https://mimesniff.spec.whatwg.org/
23236
23237
  // table holds the 'magic numbers' (which are actually variable length
23238
  // strings). The strings may contain NUL bytes, so the "const char* magic"
23239
  // value starts with the length-minus-1 of the 'magic number'.
23240
  //
23241
  // Keep it sorted by magic[1], then magic[0] descending (prioritizing longer
23242
  // matches) and finally by magic[2:]. When multiple entries match, the
23243
  // longest one wins.
23244
  //
23245
  // The fourcc field might be negated, in which case there's further
23246
  // specialization (see ยง below).
23247
0
  static struct {
23248
0
    int32_t fourcc;
23249
0
    const char* magic;
23250
0
  } table[] = {
23251
0
      {-0x30302020, "\x01\x00\x00"},                  // '00  'be
23252
0
      {+0x41425852, "\x03\x03\x00\x08\x00"},          // ABXR
23253
0
      {+0x475A2020, "\x02\x1F\x8B\x08"},              // GZ
23254
0
      {+0x5A535444, "\x03\x28\xB5\x2F\xFD"},          // ZSTD
23255
0
      {+0x584D4C20, "\x05\x3C\x3F\x78\x6D\x6C\x20"},  // XML
23256
0
      {+0x41425853, "\x03\x41\x42\x58\x00"},          // ABXS
23257
0
      {+0x425A3220, "\x02\x42\x5A\x68"},              // BZ2
23258
0
      {+0x424D5020, "\x01\x42\x4D"},                  // BMP
23259
0
      {+0x47494620, "\x03\x47\x49\x46\x38"},          // GIF
23260
0
      {+0x54494646, "\x03\x49\x49\x2A\x00"},          // TIFF (little-endian)
23261
0
      {+0x4C5A4950, "\x04\x4C\x5A\x49\x50\x01"},      // LZIP
23262
0
      {+0x54494646, "\x03\x4D\x4D\x00\x2A"},          // TIFF (big-endian)
23263
0
      {+0x45544332, "\x03\x50\x4B\x4D\x20"},          // ETC2 (*.pkm)
23264
0
      {+0x4E50424D, "\x02\x50\x35\x0A"},              // NPBM (P5; *.pgm)
23265
0
      {+0x4E50424D, "\x02\x50\x36\x0A"},              // NPBM (P6; *.ppm)
23266
0
      {-0x52494646, "\x03\x52\x49\x46\x46"},          // RIFF
23267
0
      {+0x4C5A4D41, "\x04\x5D\x00\x10\x00\x00"},      // LZMA
23268
0
      {+0x4C5A4D41, "\x02\x5D\x00\x00"},              // LZMA
23269
0
      {+0x4E494520, "\x02\x6E\xC3\xAF"},              // NIE
23270
0
      {+0x514F4920, "\x03\x71\x6F\x69\x66"},          // QOI
23271
0
      {+0x5A4C4942, "\x01\x78\x9C"},                  // ZLIB
23272
0
      {+0x504E4720, "\x03\x89\x50\x4E\x47"},          // PNG
23273
0
      {+0x54482020, "\x02\xC3\xBE\xFE"},              // TH
23274
0
      {+0x585A2020, "\x04\xFD\x37\x7A\x58\x5A"},      // XZ
23275
0
      {+0x4A504547, "\x01\xFF\xD8"},                  // JPEG
23276
0
  };
23277
0
  static const size_t table_len = sizeof(table) / sizeof(table[0]);
23278
23279
0
  if (prefix_data.len == 0) {
23280
0
    return prefix_closed ? 0 : -1;
23281
0
  }
23282
0
  uint8_t pre_first_byte = prefix_data.ptr[0];
23283
23284
0
  int32_t fourcc = 0;
23285
0
  size_t i;
23286
0
  for (i = 0; i < table_len; i++) {
23287
0
    uint8_t mag_first_byte = ((uint8_t)(table[i].magic[1]));
23288
0
    if (pre_first_byte < mag_first_byte) {
23289
0
      break;
23290
0
    } else if (pre_first_byte > mag_first_byte) {
23291
0
      continue;
23292
0
    }
23293
0
    fourcc = table[i].fourcc;
23294
23295
0
    uint8_t mag_remaining_len = ((uint8_t)(table[i].magic[0]));
23296
0
    if (mag_remaining_len == 0) {
23297
0
      goto match;
23298
0
    }
23299
23300
0
    const char* mag_remaining_ptr = table[i].magic + 2;
23301
0
    uint8_t* pre_remaining_ptr = prefix_data.ptr + 1;
23302
0
    size_t pre_remaining_len = prefix_data.len - 1;
23303
0
    if (pre_remaining_len < mag_remaining_len) {
23304
0
      if (!memcmp(pre_remaining_ptr, mag_remaining_ptr, pre_remaining_len)) {
23305
0
        return prefix_closed ? 0 : -1;
23306
0
      }
23307
0
    } else {
23308
0
      if (!memcmp(pre_remaining_ptr, mag_remaining_ptr, mag_remaining_len)) {
23309
0
        goto match;
23310
0
      }
23311
0
    }
23312
0
  }
23313
23314
0
  if (prefix_data.len < 2) {
23315
0
    return prefix_closed ? 0 : -1;
23316
0
  } else if ((prefix_data.ptr[1] == 0x00) || (prefix_data.ptr[1] == 0x01)) {
23317
0
    return wuffs_base__magic_number_guess_fourcc__maybe_tga(prefix_data,
23318
0
                                                            prefix_closed);
23319
0
  }
23320
23321
0
  return 0;
23322
23323
0
match:
23324
  // Negative FourCC values (see ยง above) are further specialized.
23325
0
  if (fourcc < 0) {
23326
0
    fourcc = -fourcc;
23327
23328
0
    if (fourcc == 0x52494646) {  // 'RIFF'be
23329
0
      if (prefix_data.len < 12) {
23330
0
        return prefix_closed ? 0 : -1;
23331
0
      }
23332
0
      uint32_t x = wuffs_base__peek_u32be__no_bounds_check(prefix_data.ptr + 8);
23333
0
      if (x == 0x57454250) {  // 'WEBP'be
23334
0
        return 0x57454250;    // 'WEBP'be
23335
0
      }
23336
23337
0
    } else if (fourcc == 0x30302020) {  // '00  'be
23338
      // Binary data starting with multiple 0x00 NUL bytes is quite common.
23339
      // Unfortunately, some file formats also don't start with a magic
23340
      // identifier, so we have to use heuristics (where the order matters, the
23341
      // same as /usr/bin/file's magic/Magdir tables) as best we can. Maybe
23342
      // it's TGA, ICO/CUR, etc. Maybe it's something else.
23343
0
      int32_t tga = wuffs_base__magic_number_guess_fourcc__maybe_tga(
23344
0
          prefix_data, prefix_closed);
23345
0
      if (tga != 0) {
23346
0
        return tga;
23347
0
      }
23348
0
      int32_t ico = wuffs_base__magic_number_guess_fourcc__maybe_ico(
23349
0
          prefix_data, prefix_closed);
23350
0
      if (ico != 0) {
23351
0
        return ico;
23352
0
      }
23353
0
      if (prefix_data.len < 4) {
23354
0
        return prefix_closed ? 0 : -1;
23355
0
      } else if ((prefix_data.ptr[2] != 0x00) &&
23356
0
                 ((prefix_data.ptr[2] >= 0x80) ||
23357
0
                  (prefix_data.ptr[3] != 0x00))) {
23358
        // Roughly speaking, this could be a non-degenerate (non-0-width and
23359
        // non-0-height) WBMP image.
23360
0
        return 0x57424D50;  // 'WBMP'be
23361
0
      }
23362
0
      return 0;
23363
0
    }
23364
0
  }
23365
0
  return fourcc;
23366
0
}
23367
23368
#endif  // !defined(WUFFS_CONFIG__MODULES) ||
23369
        // defined(WUFFS_CONFIG__MODULE__BASE) ||
23370
        // defined(WUFFS_CONFIG__MODULE__BASE__MAGIC)
23371
23372
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \
23373
    defined(WUFFS_CONFIG__MODULE__BASE__PIXCONV)
23374
23375
// ---------------- Pixel Swizzler
23376
23377
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
23378
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
23379
static uint64_t  //
23380
wuffs_private_impl__swizzle_bgrw__bgr__x86_sse42(uint8_t* dst_ptr,
23381
                                                 size_t dst_len,
23382
                                                 uint8_t* dst_palette_ptr,
23383
                                                 size_t dst_palette_len,
23384
                                                 const uint8_t* src_ptr,
23385
                                                 size_t src_len);
23386
23387
static uint64_t  //
23388
wuffs_private_impl__swizzle_bgrw__rgb__x86_sse42(uint8_t* dst_ptr,
23389
                                                 size_t dst_len,
23390
                                                 uint8_t* dst_palette_ptr,
23391
                                                 size_t dst_palette_len,
23392
                                                 const uint8_t* src_ptr,
23393
                                                 size_t src_len);
23394
23395
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
23396
static uint64_t  //
23397
wuffs_private_impl__swizzle_swap_rgbx_bgrx__x86_sse42(uint8_t* dst_ptr,
23398
                                                      size_t dst_len,
23399
                                                      uint8_t* dst_palette_ptr,
23400
                                                      size_t dst_palette_len,
23401
                                                      const uint8_t* src_ptr,
23402
                                                      size_t src_len);
23403
23404
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
23405
static uint64_t  //
23406
wuffs_private_impl__swizzle_xxxx__y__x86_sse42(uint8_t* dst_ptr,
23407
                                               size_t dst_len,
23408
                                               uint8_t* dst_palette_ptr,
23409
                                               size_t dst_palette_len,
23410
                                               const uint8_t* src_ptr,
23411
                                               size_t src_len);
23412
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
23413
23414
// --------
23415
23416
static inline uint32_t  //
23417
58.9M
wuffs_private_impl__swap_u32_argb_abgr(uint32_t u) {
23418
58.9M
  uint32_t o = u & 0xFF00FF00ul;
23419
58.9M
  uint32_t r = u & 0x00FF0000ul;
23420
58.9M
  uint32_t b = u & 0x000000FFul;
23421
58.9M
  return o | (r >> 16) | (b << 16);
23422
58.9M
}
23423
23424
static inline uint64_t  //
23425
0
wuffs_private_impl__swap_u64_argb_abgr(uint64_t u) {
23426
0
  uint64_t o = u & 0xFFFF0000FFFF0000ull;
23427
0
  uint64_t r = u & 0x0000FFFF00000000ull;
23428
0
  uint64_t b = u & 0x000000000000FFFFull;
23429
0
  return o | (r >> 32) | (b << 32);
23430
0
}
23431
23432
static inline uint32_t  //
23433
0
wuffs_private_impl__color_u64__as__color_u32__swap_u32_argb_abgr(uint64_t c) {
23434
0
  uint32_t a = ((uint32_t)(0xFF & (c >> 56)));
23435
0
  uint32_t r = ((uint32_t)(0xFF & (c >> 40)));
23436
0
  uint32_t g = ((uint32_t)(0xFF & (c >> 24)));
23437
0
  uint32_t b = ((uint32_t)(0xFF & (c >> 8)));
23438
0
  return (a << 24) | (b << 16) | (g << 8) | (r << 0);
23439
0
}
23440
23441
// --------
23442
23443
WUFFS_BASE__MAYBE_STATIC wuffs_base__color_u32_argb_premul  //
23444
wuffs_base__pixel_buffer__color_u32_at(const wuffs_base__pixel_buffer* pb,
23445
                                       uint32_t x,
23446
0
                                       uint32_t y) {
23447
0
  if (!pb || (x >= pb->pixcfg.private_impl.width) ||
23448
0
      (y >= pb->pixcfg.private_impl.height)) {
23449
0
    return 0;
23450
0
  }
23451
23452
0
  if (wuffs_base__pixel_format__is_planar(&pb->pixcfg.private_impl.pixfmt)) {
23453
    // TODO: support planar formats.
23454
0
    return 0;
23455
0
  }
23456
23457
0
  size_t stride = pb->private_impl.planes[0].stride;
23458
0
  const uint8_t* row = pb->private_impl.planes[0].ptr + (stride * ((size_t)y));
23459
23460
0
  switch (pb->pixcfg.private_impl.pixfmt.repr) {
23461
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
23462
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
23463
0
      return wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x)));
23464
23465
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL:
23466
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY: {
23467
0
      uint8_t* palette = pb->private_impl.planes[3].ptr;
23468
0
      return wuffs_base__peek_u32le__no_bounds_check(palette +
23469
0
                                                     (4 * ((size_t)row[x])));
23470
0
    }
23471
23472
      // Common formats above. Rarer formats below.
23473
23474
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
23475
0
      return 0xFF000000 | (0x00010101 * ((uint32_t)(row[x])));
23476
0
    case WUFFS_BASE__PIXEL_FORMAT__Y_16LE:
23477
0
      return 0xFF000000 | (0x00010101 * ((uint32_t)(row[(2 * x) + 1])));
23478
0
    case WUFFS_BASE__PIXEL_FORMAT__Y_16BE:
23479
0
      return 0xFF000000 | (0x00010101 * ((uint32_t)(row[(2 * x) + 0])));
23480
0
    case WUFFS_BASE__PIXEL_FORMAT__YA_NONPREMUL:
23481
0
      return wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(
23482
0
          (((uint32_t)(row[(2 * x) + 1])) << 24) |
23483
0
          (((uint32_t)(row[(2 * x) + 0])) * 0x00010101));
23484
23485
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: {
23486
0
      uint8_t* palette = pb->private_impl.planes[3].ptr;
23487
0
      return wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(
23488
0
          wuffs_base__peek_u32le__no_bounds_check(palette +
23489
0
                                                  (4 * ((size_t)row[x]))));
23490
0
    }
23491
23492
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
23493
0
      return wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul(
23494
0
          wuffs_base__peek_u16le__no_bounds_check(row + (2 * ((size_t)x))));
23495
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
23496
0
      return 0xFF000000 |
23497
0
             wuffs_base__peek_u24le__no_bounds_check(row + (3 * ((size_t)x)));
23498
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
23499
0
      return wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(
23500
0
          wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x))));
23501
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
23502
0
      return wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul(
23503
0
          wuffs_base__peek_u64le__no_bounds_check(row + (8 * ((size_t)x))));
23504
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRX:
23505
0
      return 0xFF000000 |
23506
0
             wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x)));
23507
23508
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
23509
0
      return 0xFF000000 |
23510
0
             wuffs_base__peek_u24be__no_bounds_check(row + (3 * ((size_t)x)));
23511
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
23512
0
      return wuffs_private_impl__swap_u32_argb_abgr(
23513
0
          wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(
23514
0
              wuffs_base__peek_u32le__no_bounds_check(row +
23515
0
                                                      (4 * ((size_t)x)))));
23516
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
23517
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
23518
0
      return wuffs_private_impl__swap_u32_argb_abgr(
23519
0
          wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x))));
23520
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBX:
23521
0
      return wuffs_private_impl__swap_u32_argb_abgr(
23522
0
          0xFF000000 |
23523
0
          wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x))));
23524
23525
0
    default:
23526
      // TODO: support more formats.
23527
0
      break;
23528
0
  }
23529
23530
0
  return 0;
23531
0
}
23532
23533
// --------
23534
23535
WUFFS_BASE__MAYBE_STATIC wuffs_base__status  //
23536
wuffs_base__pixel_buffer__set_color_u32_at(
23537
    wuffs_base__pixel_buffer* pb,
23538
    uint32_t x,
23539
    uint32_t y,
23540
0
    wuffs_base__color_u32_argb_premul color) {
23541
0
  if (!pb) {
23542
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
23543
0
  }
23544
0
  if ((x >= pb->pixcfg.private_impl.width) ||
23545
0
      (y >= pb->pixcfg.private_impl.height)) {
23546
0
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
23547
0
  }
23548
23549
0
  if (wuffs_base__pixel_format__is_planar(&pb->pixcfg.private_impl.pixfmt)) {
23550
    // TODO: support planar formats.
23551
0
    return wuffs_base__make_status(wuffs_base__error__unsupported_option);
23552
0
  }
23553
23554
0
  size_t stride = pb->private_impl.planes[0].stride;
23555
0
  uint8_t* row = pb->private_impl.planes[0].ptr + (stride * ((size_t)y));
23556
23557
0
  switch (pb->pixcfg.private_impl.pixfmt.repr) {
23558
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
23559
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRX:
23560
0
      wuffs_base__poke_u32le__no_bounds_check(row + (4 * ((size_t)x)), color);
23561
0
      break;
23562
23563
      // Common formats above. Rarer formats below.
23564
23565
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
23566
0
      wuffs_base__poke_u8__no_bounds_check(
23567
0
          row + ((size_t)x),
23568
0
          wuffs_base__color_u32_argb_premul__as__color_u8_gray(color));
23569
0
      break;
23570
0
    case WUFFS_BASE__PIXEL_FORMAT__Y_16LE:
23571
0
      wuffs_base__poke_u16le__no_bounds_check(
23572
0
          row + (2 * ((size_t)x)),
23573
0
          wuffs_base__color_u32_argb_premul__as__color_u16_gray(color));
23574
0
      break;
23575
0
    case WUFFS_BASE__PIXEL_FORMAT__Y_16BE:
23576
0
      wuffs_base__poke_u16be__no_bounds_check(
23577
0
          row + (2 * ((size_t)x)),
23578
0
          wuffs_base__color_u32_argb_premul__as__color_u16_gray(color));
23579
0
      break;
23580
0
    case WUFFS_BASE__PIXEL_FORMAT__YA_NONPREMUL:
23581
0
      wuffs_base__poke_u16le__no_bounds_check(
23582
0
          row + (2 * ((size_t)x)),
23583
0
          wuffs_base__color_u32_argb_premul__as__color_u16_alpha_gray_nonpremul(
23584
0
              color));
23585
0
      break;
23586
23587
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL:
23588
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL:
23589
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY:
23590
0
      wuffs_base__poke_u8__no_bounds_check(
23591
0
          row + ((size_t)x), wuffs_base__pixel_palette__closest_element(
23592
0
                                 wuffs_base__pixel_buffer__palette(pb),
23593
0
                                 pb->pixcfg.private_impl.pixfmt, color));
23594
0
      break;
23595
23596
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
23597
0
      wuffs_base__poke_u16le__no_bounds_check(
23598
0
          row + (2 * ((size_t)x)),
23599
0
          wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(color));
23600
0
      break;
23601
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
23602
0
      wuffs_base__poke_u24le__no_bounds_check(row + (3 * ((size_t)x)), color);
23603
0
      break;
23604
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
23605
0
      wuffs_base__poke_u32le__no_bounds_check(
23606
0
          row + (4 * ((size_t)x)),
23607
0
          wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul(
23608
0
              color));
23609
0
      break;
23610
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
23611
0
      wuffs_base__poke_u64le__no_bounds_check(
23612
0
          row + (8 * ((size_t)x)),
23613
0
          wuffs_base__color_u32_argb_premul__as__color_u64_argb_nonpremul(
23614
0
              color));
23615
0
      break;
23616
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
23617
0
      wuffs_base__poke_u32le__no_bounds_check(
23618
0
          row + (4 * ((size_t)x)), (color >> 31) ? (color | 0xFF000000) : 0);
23619
0
      break;
23620
23621
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
23622
0
      wuffs_base__poke_u24le__no_bounds_check(
23623
0
          row + (3 * ((size_t)x)),
23624
0
          wuffs_private_impl__swap_u32_argb_abgr(color));
23625
0
      break;
23626
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
23627
0
      wuffs_base__poke_u32le__no_bounds_check(
23628
0
          row + (4 * ((size_t)x)),
23629
0
          wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul(
23630
0
              wuffs_private_impl__swap_u32_argb_abgr(color)));
23631
0
      break;
23632
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
23633
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBX:
23634
0
      wuffs_base__poke_u32le__no_bounds_check(
23635
0
          row + (4 * ((size_t)x)),
23636
0
          wuffs_private_impl__swap_u32_argb_abgr(color));
23637
0
      break;
23638
23639
0
    default:
23640
      // TODO: support more formats.
23641
0
      return wuffs_base__make_status(wuffs_base__error__unsupported_option);
23642
0
  }
23643
23644
0
  return wuffs_base__make_status(NULL);
23645
0
}
23646
23647
// --------
23648
23649
static inline void  //
23650
wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xx(
23651
    wuffs_base__pixel_buffer* pb,
23652
    wuffs_base__rect_ie_u32 rect,
23653
0
    uint16_t color) {
23654
0
  size_t stride = pb->private_impl.planes[0].stride;
23655
0
  uint32_t width = wuffs_base__rect_ie_u32__width(&rect);
23656
0
  if ((stride == (2 * ((uint64_t)width))) && (rect.min_incl_x == 0)) {
23657
0
    uint8_t* ptr =
23658
0
        pb->private_impl.planes[0].ptr + (stride * ((size_t)rect.min_incl_y));
23659
0
    uint32_t height = wuffs_base__rect_ie_u32__height(&rect);
23660
0
    size_t n;
23661
0
    for (n = ((size_t)width) * ((size_t)height); n > 0; n--) {
23662
0
      wuffs_base__poke_u16le__no_bounds_check(ptr, color);
23663
0
      ptr += 2;
23664
0
    }
23665
0
    return;
23666
0
  }
23667
23668
0
  uint32_t y;
23669
0
  for (y = rect.min_incl_y; y < rect.max_excl_y; y++) {
23670
0
    uint8_t* ptr = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)) +
23671
0
                   (2 * ((size_t)rect.min_incl_x));
23672
0
    uint32_t n;
23673
0
    for (n = width; n > 0; n--) {
23674
0
      wuffs_base__poke_u16le__no_bounds_check(ptr, color);
23675
0
      ptr += 2;
23676
0
    }
23677
0
  }
23678
0
}
23679
23680
static inline void  //
23681
wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxx(
23682
    wuffs_base__pixel_buffer* pb,
23683
    wuffs_base__rect_ie_u32 rect,
23684
0
    uint32_t color) {
23685
0
  size_t stride = pb->private_impl.planes[0].stride;
23686
0
  uint32_t width = wuffs_base__rect_ie_u32__width(&rect);
23687
0
  if ((stride == (3 * ((uint64_t)width))) && (rect.min_incl_x == 0)) {
23688
0
    uint8_t* ptr =
23689
0
        pb->private_impl.planes[0].ptr + (stride * ((size_t)rect.min_incl_y));
23690
0
    uint32_t height = wuffs_base__rect_ie_u32__height(&rect);
23691
0
    size_t n;
23692
0
    for (n = ((size_t)width) * ((size_t)height); n > 0; n--) {
23693
0
      wuffs_base__poke_u24le__no_bounds_check(ptr, color);
23694
0
      ptr += 3;
23695
0
    }
23696
0
    return;
23697
0
  }
23698
23699
0
  uint32_t y;
23700
0
  for (y = rect.min_incl_y; y < rect.max_excl_y; y++) {
23701
0
    uint8_t* ptr = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)) +
23702
0
                   (3 * ((size_t)rect.min_incl_x));
23703
0
    uint32_t n;
23704
0
    for (n = width; n > 0; n--) {
23705
0
      wuffs_base__poke_u24le__no_bounds_check(ptr, color);
23706
0
      ptr += 3;
23707
0
    }
23708
0
  }
23709
0
}
23710
23711
static inline void  //
23712
wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxxx(
23713
    wuffs_base__pixel_buffer* pb,
23714
    wuffs_base__rect_ie_u32 rect,
23715
0
    uint32_t color) {
23716
0
  size_t stride = pb->private_impl.planes[0].stride;
23717
0
  uint32_t width = wuffs_base__rect_ie_u32__width(&rect);
23718
0
  if ((stride == (4 * ((uint64_t)width))) && (rect.min_incl_x == 0)) {
23719
0
    uint8_t* ptr =
23720
0
        pb->private_impl.planes[0].ptr + (stride * ((size_t)rect.min_incl_y));
23721
0
    uint32_t height = wuffs_base__rect_ie_u32__height(&rect);
23722
0
    size_t n;
23723
0
    for (n = ((size_t)width) * ((size_t)height); n > 0; n--) {
23724
0
      wuffs_base__poke_u32le__no_bounds_check(ptr, color);
23725
0
      ptr += 4;
23726
0
    }
23727
0
    return;
23728
0
  }
23729
23730
0
  uint32_t y;
23731
0
  for (y = rect.min_incl_y; y < rect.max_excl_y; y++) {
23732
0
    uint8_t* ptr = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)) +
23733
0
                   (4 * ((size_t)rect.min_incl_x));
23734
0
    uint32_t n;
23735
0
    for (n = width; n > 0; n--) {
23736
0
      wuffs_base__poke_u32le__no_bounds_check(ptr, color);
23737
0
      ptr += 4;
23738
0
    }
23739
0
  }
23740
0
}
23741
23742
static inline void  //
23743
wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxxxxxxx(
23744
    wuffs_base__pixel_buffer* pb,
23745
    wuffs_base__rect_ie_u32 rect,
23746
0
    uint64_t color) {
23747
0
  size_t stride = pb->private_impl.planes[0].stride;
23748
0
  uint32_t width = wuffs_base__rect_ie_u32__width(&rect);
23749
0
  if ((stride == (8 * ((uint64_t)width))) && (rect.min_incl_x == 0)) {
23750
0
    uint8_t* ptr =
23751
0
        pb->private_impl.planes[0].ptr + (stride * ((size_t)rect.min_incl_y));
23752
0
    uint32_t height = wuffs_base__rect_ie_u32__height(&rect);
23753
0
    size_t n;
23754
0
    for (n = ((size_t)width) * ((size_t)height); n > 0; n--) {
23755
0
      wuffs_base__poke_u64le__no_bounds_check(ptr, color);
23756
0
      ptr += 8;
23757
0
    }
23758
0
    return;
23759
0
  }
23760
23761
0
  uint32_t y;
23762
0
  for (y = rect.min_incl_y; y < rect.max_excl_y; y++) {
23763
0
    uint8_t* ptr = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)) +
23764
0
                   (8 * ((size_t)rect.min_incl_x));
23765
0
    uint32_t n;
23766
0
    for (n = width; n > 0; n--) {
23767
0
      wuffs_base__poke_u64le__no_bounds_check(ptr, color);
23768
0
      ptr += 8;
23769
0
    }
23770
0
  }
23771
0
}
23772
23773
WUFFS_BASE__MAYBE_STATIC wuffs_base__status  //
23774
wuffs_base__pixel_buffer__set_color_u32_fill_rect(
23775
    wuffs_base__pixel_buffer* pb,
23776
    wuffs_base__rect_ie_u32 rect,
23777
0
    wuffs_base__color_u32_argb_premul color) {
23778
0
  if (!pb) {
23779
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
23780
0
  } else if (wuffs_base__rect_ie_u32__is_empty(&rect)) {
23781
0
    return wuffs_base__make_status(NULL);
23782
0
  }
23783
0
  wuffs_base__rect_ie_u32 bounds =
23784
0
      wuffs_base__pixel_config__bounds(&pb->pixcfg);
23785
0
  if (!wuffs_base__rect_ie_u32__contains_rect(&bounds, rect)) {
23786
0
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
23787
0
  }
23788
23789
0
  if (wuffs_base__pixel_format__is_planar(&pb->pixcfg.private_impl.pixfmt)) {
23790
    // TODO: support planar formats.
23791
0
    return wuffs_base__make_status(wuffs_base__error__unsupported_option);
23792
0
  }
23793
23794
0
  switch (pb->pixcfg.private_impl.pixfmt.repr) {
23795
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
23796
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRX:
23797
0
      wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxxx(pb, rect,
23798
0
                                                                      color);
23799
0
      return wuffs_base__make_status(NULL);
23800
23801
      // Common formats above. Rarer formats below.
23802
23803
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
23804
0
      wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xx(
23805
0
          pb, rect,
23806
0
          wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(color));
23807
0
      return wuffs_base__make_status(NULL);
23808
23809
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
23810
0
      wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxx(pb, rect,
23811
0
                                                                     color);
23812
0
      return wuffs_base__make_status(NULL);
23813
23814
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
23815
0
      wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxxx(
23816
0
          pb, rect,
23817
0
          wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul(
23818
0
              color));
23819
0
      return wuffs_base__make_status(NULL);
23820
23821
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
23822
0
      wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxxxxxxx(
23823
0
          pb, rect,
23824
0
          wuffs_base__color_u32_argb_premul__as__color_u64_argb_nonpremul(
23825
0
              color));
23826
0
      return wuffs_base__make_status(NULL);
23827
23828
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
23829
0
      wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxxx(
23830
0
          pb, rect,
23831
0
          wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul(
23832
0
              wuffs_private_impl__swap_u32_argb_abgr(color)));
23833
0
      return wuffs_base__make_status(NULL);
23834
23835
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
23836
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBX:
23837
0
      wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxxx(
23838
0
          pb, rect, wuffs_private_impl__swap_u32_argb_abgr(color));
23839
0
      return wuffs_base__make_status(NULL);
23840
0
  }
23841
23842
0
  uint32_t y;
23843
0
  for (y = rect.min_incl_y; y < rect.max_excl_y; y++) {
23844
0
    uint32_t x;
23845
0
    for (x = rect.min_incl_x; x < rect.max_excl_x; x++) {
23846
0
      wuffs_base__pixel_buffer__set_color_u32_at(pb, x, y, color);
23847
0
    }
23848
0
  }
23849
0
  return wuffs_base__make_status(NULL);
23850
0
}
23851
23852
WUFFS_BASE__MAYBE_STATIC bool  //
23853
0
wuffs_base__pixel_buffer__is_opaque(const wuffs_base__pixel_buffer* pb) {
23854
0
  if (!pb) {
23855
0
    return false;
23856
0
  } else if (wuffs_base__pixel_format__transparency(
23857
0
                 &pb->pixcfg.private_impl.pixfmt) ==
23858
0
             WUFFS_BASE__PIXEL_ALPHA_TRANSPARENCY__OPAQUE) {
23859
0
    return true;
23860
0
  }
23861
23862
0
  uint32_t w = pb->pixcfg.private_impl.width;
23863
0
  uint32_t h = pb->pixcfg.private_impl.height;
23864
0
  if ((w <= 0) || (h <= 0)) {
23865
0
    return true;
23866
0
  }
23867
0
  const wuffs_base__table_u8* p = &pb->private_impl.planes[0];
23868
23869
0
  switch (pb->pixcfg.private_impl.pixfmt.repr) {
23870
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
23871
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
23872
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
23873
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
23874
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
23875
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: {
23876
0
      for (uint32_t y = 0; y < h; y++) {
23877
0
        const uint8_t* row = p->ptr + (p->stride * (size_t)y);
23878
0
        for (uint32_t x = 0; x < w; x++) {
23879
0
          if (row[(4 * (size_t)x) + 3] != 0xFF) {
23880
0
            return false;
23881
0
          }
23882
0
        }
23883
0
      }
23884
0
      return true;
23885
0
    }
23886
23887
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: {
23888
0
      for (uint32_t y = 0; y < h; y++) {
23889
0
        const uint8_t* row = p->ptr + (p->stride * (size_t)y);
23890
0
        for (uint32_t x = 0; x < w; x++) {
23891
0
          if ((row[(8 * (size_t)x) + 6] != 0xFF) ||
23892
0
              (row[(8 * (size_t)x) + 7] != 0xFF)) {
23893
0
            return false;
23894
0
          }
23895
0
        }
23896
0
      }
23897
0
      return true;
23898
0
    }
23899
23900
0
    case WUFFS_BASE__PIXEL_FORMAT__YA_NONPREMUL: {
23901
0
      for (uint32_t y = 0; y < h; y++) {
23902
0
        const uint8_t* row = p->ptr + (p->stride * (size_t)y);
23903
0
        for (uint32_t x = 0; x < w; x++) {
23904
0
          if (row[(2 * (size_t)x) + 1] != 0xFF) {
23905
0
            return false;
23906
0
          }
23907
0
        }
23908
0
      }
23909
0
      return true;
23910
0
    }
23911
23912
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL:
23913
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY:
23914
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: {
23915
0
      const uint8_t* palette = pb->private_impl.planes[3].ptr;
23916
0
      for (uint32_t i = 0; true; i++) {
23917
0
        if (i >= 256) {
23918
0
          return true;
23919
0
        } else if (palette[(4 * (size_t)i) + 3] != 0xFF) {
23920
0
          break;
23921
0
        }
23922
0
      }
23923
23924
0
      for (uint32_t y = 0; y < h; y++) {
23925
0
        const uint8_t* row = p->ptr + (p->stride * (size_t)y);
23926
0
        for (uint32_t x = 0; x < w; x++) {
23927
0
          if (palette[(4 * (size_t)row[x]) + 3] != 0xFF) {
23928
0
            return false;
23929
0
          }
23930
0
        }
23931
0
      }
23932
23933
0
      return true;
23934
0
    }
23935
23936
0
    default:
23937
0
      break;
23938
0
  }
23939
0
  return false;
23940
0
}
23941
23942
// --------
23943
23944
WUFFS_BASE__MAYBE_STATIC uint8_t  //
23945
wuffs_base__pixel_palette__closest_element(
23946
    wuffs_base__slice_u8 palette_slice,
23947
    wuffs_base__pixel_format palette_format,
23948
0
    wuffs_base__color_u32_argb_premul c) {
23949
0
  size_t n = palette_slice.len / 4;
23950
0
  if (n > (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) {
23951
0
    n = (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4);
23952
0
  }
23953
0
  size_t best_index = 0;
23954
0
  uint64_t best_score = 0xFFFFFFFFFFFFFFFF;
23955
23956
  // Work in 16-bit color.
23957
0
  uint32_t ca = 0x101 * (0xFF & (c >> 24));
23958
0
  uint32_t cr = 0x101 * (0xFF & (c >> 16));
23959
0
  uint32_t cg = 0x101 * (0xFF & (c >> 8));
23960
0
  uint32_t cb = 0x101 * (0xFF & (c >> 0));
23961
23962
0
  switch (palette_format.repr) {
23963
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL:
23964
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL:
23965
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY: {
23966
0
      bool nonpremul = palette_format.repr ==
23967
0
                       WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL;
23968
23969
0
      size_t i;
23970
0
      for (i = 0; i < n; i++) {
23971
        // Work in 16-bit color.
23972
0
        uint32_t pb = 0x101 * ((uint32_t)(palette_slice.ptr[(4 * i) + 0]));
23973
0
        uint32_t pg = 0x101 * ((uint32_t)(palette_slice.ptr[(4 * i) + 1]));
23974
0
        uint32_t pr = 0x101 * ((uint32_t)(palette_slice.ptr[(4 * i) + 2]));
23975
0
        uint32_t pa = 0x101 * ((uint32_t)(palette_slice.ptr[(4 * i) + 3]));
23976
23977
        // Convert to premultiplied alpha.
23978
0
        if (nonpremul && (pa != 0xFFFF)) {
23979
0
          pb = (pb * pa) / 0xFFFF;
23980
0
          pg = (pg * pa) / 0xFFFF;
23981
0
          pr = (pr * pa) / 0xFFFF;
23982
0
        }
23983
23984
        // These deltas are conceptually int32_t (signed) but after squaring,
23985
        // it's equivalent to work in uint32_t (unsigned).
23986
0
        pb -= cb;
23987
0
        pg -= cg;
23988
0
        pr -= cr;
23989
0
        pa -= ca;
23990
0
        uint64_t score = ((uint64_t)(pb * pb)) + ((uint64_t)(pg * pg)) +
23991
0
                         ((uint64_t)(pr * pr)) + ((uint64_t)(pa * pa));
23992
0
        if (best_score > score) {
23993
0
          best_score = score;
23994
0
          best_index = i;
23995
0
        }
23996
0
      }
23997
0
      break;
23998
0
    }
23999
0
  }
24000
24001
0
  return (uint8_t)best_index;
24002
0
}
24003
24004
// --------
24005
24006
static inline uint32_t  //
24007
wuffs_private_impl__composite_nonpremul_nonpremul_u32_axxx(
24008
    uint32_t dst_nonpremul,
24009
0
    uint32_t src_nonpremul) {
24010
  // Extract 16-bit color components.
24011
  //
24012
  // If the destination is transparent then SRC_OVER is equivalent to SRC: just
24013
  // return src_nonpremul. This isn't just an optimization (skipping the rest
24014
  // of the function's computation). It also preserves the nonpremul
24015
  // distinction between e.g. transparent red and transparent blue that would
24016
  // otherwise be lost by converting from nonpremul to premul and back.
24017
0
  uint32_t da = 0x101 * (0xFF & (dst_nonpremul >> 24));
24018
0
  if (da == 0) {
24019
0
    return src_nonpremul;
24020
0
  }
24021
0
  uint32_t dr = 0x101 * (0xFF & (dst_nonpremul >> 16));
24022
0
  uint32_t dg = 0x101 * (0xFF & (dst_nonpremul >> 8));
24023
0
  uint32_t db = 0x101 * (0xFF & (dst_nonpremul >> 0));
24024
0
  uint32_t sa = 0x101 * (0xFF & (src_nonpremul >> 24));
24025
0
  uint32_t sr = 0x101 * (0xFF & (src_nonpremul >> 16));
24026
0
  uint32_t sg = 0x101 * (0xFF & (src_nonpremul >> 8));
24027
0
  uint32_t sb = 0x101 * (0xFF & (src_nonpremul >> 0));
24028
24029
  // Convert dst from nonpremul to premul.
24030
0
  dr = (dr * da) / 0xFFFF;
24031
0
  dg = (dg * da) / 0xFFFF;
24032
0
  db = (db * da) / 0xFFFF;
24033
24034
  // Calculate the inverse of the src-alpha: how much of the dst to keep.
24035
0
  uint32_t ia = 0xFFFF - sa;
24036
24037
  // Composite src (nonpremul) over dst (premul).
24038
0
  da = sa + ((da * ia) / 0xFFFF);
24039
0
  dr = ((sr * sa) + (dr * ia)) / 0xFFFF;
24040
0
  dg = ((sg * sa) + (dg * ia)) / 0xFFFF;
24041
0
  db = ((sb * sa) + (db * ia)) / 0xFFFF;
24042
24043
  // Convert dst from premul to nonpremul.
24044
0
  if (da != 0) {
24045
0
    dr = (dr * 0xFFFF) / da;
24046
0
    dg = (dg * 0xFFFF) / da;
24047
0
    db = (db * 0xFFFF) / da;
24048
0
  }
24049
24050
  // Convert from 16-bit color to 8-bit color.
24051
0
  da >>= 8;
24052
0
  dr >>= 8;
24053
0
  dg >>= 8;
24054
0
  db >>= 8;
24055
24056
  // Combine components.
24057
0
  return (db << 0) | (dg << 8) | (dr << 16) | (da << 24);
24058
0
}
24059
24060
static inline uint64_t  //
24061
wuffs_private_impl__composite_nonpremul_nonpremul_u64_axxx(
24062
    uint64_t dst_nonpremul,
24063
0
    uint64_t src_nonpremul) {
24064
  // Extract components.
24065
  //
24066
  // If the destination is transparent then SRC_OVER is equivalent to SRC: just
24067
  // return src_nonpremul. This isn't just an optimization (skipping the rest
24068
  // of the function's computation). It also preserves the nonpremul
24069
  // distinction between e.g. transparent red and transparent blue that would
24070
  // otherwise be lost by converting from nonpremul to premul and back.
24071
0
  uint64_t da = 0xFFFF & (dst_nonpremul >> 48);
24072
0
  if (da == 0) {
24073
0
    return src_nonpremul;
24074
0
  }
24075
0
  uint64_t dr = 0xFFFF & (dst_nonpremul >> 32);
24076
0
  uint64_t dg = 0xFFFF & (dst_nonpremul >> 16);
24077
0
  uint64_t db = 0xFFFF & (dst_nonpremul >> 0);
24078
0
  uint64_t sa = 0xFFFF & (src_nonpremul >> 48);
24079
0
  uint64_t sr = 0xFFFF & (src_nonpremul >> 32);
24080
0
  uint64_t sg = 0xFFFF & (src_nonpremul >> 16);
24081
0
  uint64_t sb = 0xFFFF & (src_nonpremul >> 0);
24082
24083
  // Convert dst from nonpremul to premul.
24084
0
  dr = (dr * da) / 0xFFFF;
24085
0
  dg = (dg * da) / 0xFFFF;
24086
0
  db = (db * da) / 0xFFFF;
24087
24088
  // Calculate the inverse of the src-alpha: how much of the dst to keep.
24089
0
  uint64_t ia = 0xFFFF - sa;
24090
24091
  // Composite src (nonpremul) over dst (premul).
24092
0
  da = sa + ((da * ia) / 0xFFFF);
24093
0
  dr = ((sr * sa) + (dr * ia)) / 0xFFFF;
24094
0
  dg = ((sg * sa) + (dg * ia)) / 0xFFFF;
24095
0
  db = ((sb * sa) + (db * ia)) / 0xFFFF;
24096
24097
  // Convert dst from premul to nonpremul.
24098
0
  if (da != 0) {
24099
0
    dr = (dr * 0xFFFF) / da;
24100
0
    dg = (dg * 0xFFFF) / da;
24101
0
    db = (db * 0xFFFF) / da;
24102
0
  }
24103
24104
  // Combine components.
24105
0
  return (db << 0) | (dg << 16) | (dr << 32) | (da << 48);
24106
0
}
24107
24108
static inline uint32_t  //
24109
wuffs_private_impl__composite_nonpremul_premul_u32_axxx(uint32_t dst_nonpremul,
24110
0
                                                        uint32_t src_premul) {
24111
  // Extract 16-bit color components.
24112
0
  uint32_t da = 0x101 * (0xFF & (dst_nonpremul >> 24));
24113
0
  uint32_t dr = 0x101 * (0xFF & (dst_nonpremul >> 16));
24114
0
  uint32_t dg = 0x101 * (0xFF & (dst_nonpremul >> 8));
24115
0
  uint32_t db = 0x101 * (0xFF & (dst_nonpremul >> 0));
24116
0
  uint32_t sa = 0x101 * (0xFF & (src_premul >> 24));
24117
0
  uint32_t sr = 0x101 * (0xFF & (src_premul >> 16));
24118
0
  uint32_t sg = 0x101 * (0xFF & (src_premul >> 8));
24119
0
  uint32_t sb = 0x101 * (0xFF & (src_premul >> 0));
24120
24121
  // Convert dst from nonpremul to premul.
24122
0
  dr = (dr * da) / 0xFFFF;
24123
0
  dg = (dg * da) / 0xFFFF;
24124
0
  db = (db * da) / 0xFFFF;
24125
24126
  // Calculate the inverse of the src-alpha: how much of the dst to keep.
24127
0
  uint32_t ia = 0xFFFF - sa;
24128
24129
  // Composite src (premul) over dst (premul).
24130
0
  da = sa + ((da * ia) / 0xFFFF);
24131
0
  dr = sr + ((dr * ia) / 0xFFFF);
24132
0
  dg = sg + ((dg * ia) / 0xFFFF);
24133
0
  db = sb + ((db * ia) / 0xFFFF);
24134
24135
  // Convert dst from premul to nonpremul.
24136
0
  if (da != 0) {
24137
0
    dr = (dr * 0xFFFF) / da;
24138
0
    dg = (dg * 0xFFFF) / da;
24139
0
    db = (db * 0xFFFF) / da;
24140
0
  }
24141
24142
  // Convert from 16-bit color to 8-bit color.
24143
0
  da >>= 8;
24144
0
  dr >>= 8;
24145
0
  dg >>= 8;
24146
0
  db >>= 8;
24147
24148
  // Combine components.
24149
0
  return (db << 0) | (dg << 8) | (dr << 16) | (da << 24);
24150
0
}
24151
24152
static inline uint64_t  //
24153
wuffs_private_impl__composite_nonpremul_premul_u64_axxx(uint64_t dst_nonpremul,
24154
0
                                                        uint64_t src_premul) {
24155
  // Extract components.
24156
0
  uint64_t da = 0xFFFF & (dst_nonpremul >> 48);
24157
0
  uint64_t dr = 0xFFFF & (dst_nonpremul >> 32);
24158
0
  uint64_t dg = 0xFFFF & (dst_nonpremul >> 16);
24159
0
  uint64_t db = 0xFFFF & (dst_nonpremul >> 0);
24160
0
  uint64_t sa = 0xFFFF & (src_premul >> 48);
24161
0
  uint64_t sr = 0xFFFF & (src_premul >> 32);
24162
0
  uint64_t sg = 0xFFFF & (src_premul >> 16);
24163
0
  uint64_t sb = 0xFFFF & (src_premul >> 0);
24164
24165
  // Convert dst from nonpremul to premul.
24166
0
  dr = (dr * da) / 0xFFFF;
24167
0
  dg = (dg * da) / 0xFFFF;
24168
0
  db = (db * da) / 0xFFFF;
24169
24170
  // Calculate the inverse of the src-alpha: how much of the dst to keep.
24171
0
  uint64_t ia = 0xFFFF - sa;
24172
24173
  // Composite src (premul) over dst (premul).
24174
0
  da = sa + ((da * ia) / 0xFFFF);
24175
0
  dr = sr + ((dr * ia) / 0xFFFF);
24176
0
  dg = sg + ((dg * ia) / 0xFFFF);
24177
0
  db = sb + ((db * ia) / 0xFFFF);
24178
24179
  // Convert dst from premul to nonpremul.
24180
0
  if (da != 0) {
24181
0
    dr = (dr * 0xFFFF) / da;
24182
0
    dg = (dg * 0xFFFF) / da;
24183
0
    db = (db * 0xFFFF) / da;
24184
0
  }
24185
24186
  // Combine components.
24187
0
  return (db << 0) | (dg << 16) | (dr << 32) | (da << 48);
24188
0
}
24189
24190
static inline uint32_t  //
24191
wuffs_private_impl__composite_premul_nonpremul_u32_axxx(
24192
    uint32_t dst_premul,
24193
0
    uint32_t src_nonpremul) {
24194
  // Extract 16-bit color components.
24195
0
  uint32_t da = 0x101 * (0xFF & (dst_premul >> 24));
24196
0
  uint32_t dr = 0x101 * (0xFF & (dst_premul >> 16));
24197
0
  uint32_t dg = 0x101 * (0xFF & (dst_premul >> 8));
24198
0
  uint32_t db = 0x101 * (0xFF & (dst_premul >> 0));
24199
0
  uint32_t sa = 0x101 * (0xFF & (src_nonpremul >> 24));
24200
0
  uint32_t sr = 0x101 * (0xFF & (src_nonpremul >> 16));
24201
0
  uint32_t sg = 0x101 * (0xFF & (src_nonpremul >> 8));
24202
0
  uint32_t sb = 0x101 * (0xFF & (src_nonpremul >> 0));
24203
24204
  // Calculate the inverse of the src-alpha: how much of the dst to keep.
24205
0
  uint32_t ia = 0xFFFF - sa;
24206
24207
  // Composite src (nonpremul) over dst (premul).
24208
0
  da = sa + ((da * ia) / 0xFFFF);
24209
0
  dr = ((sr * sa) + (dr * ia)) / 0xFFFF;
24210
0
  dg = ((sg * sa) + (dg * ia)) / 0xFFFF;
24211
0
  db = ((sb * sa) + (db * ia)) / 0xFFFF;
24212
24213
  // Convert from 16-bit color to 8-bit color.
24214
0
  da >>= 8;
24215
0
  dr >>= 8;
24216
0
  dg >>= 8;
24217
0
  db >>= 8;
24218
24219
  // Combine components.
24220
0
  return (db << 0) | (dg << 8) | (dr << 16) | (da << 24);
24221
0
}
24222
24223
static inline uint64_t  //
24224
wuffs_private_impl__composite_premul_nonpremul_u64_axxx(
24225
    uint64_t dst_premul,
24226
0
    uint64_t src_nonpremul) {
24227
  // Extract components.
24228
0
  uint64_t da = 0xFFFF & (dst_premul >> 48);
24229
0
  uint64_t dr = 0xFFFF & (dst_premul >> 32);
24230
0
  uint64_t dg = 0xFFFF & (dst_premul >> 16);
24231
0
  uint64_t db = 0xFFFF & (dst_premul >> 0);
24232
0
  uint64_t sa = 0xFFFF & (src_nonpremul >> 48);
24233
0
  uint64_t sr = 0xFFFF & (src_nonpremul >> 32);
24234
0
  uint64_t sg = 0xFFFF & (src_nonpremul >> 16);
24235
0
  uint64_t sb = 0xFFFF & (src_nonpremul >> 0);
24236
24237
  // Calculate the inverse of the src-alpha: how much of the dst to keep.
24238
0
  uint64_t ia = 0xFFFF - sa;
24239
24240
  // Composite src (nonpremul) over dst (premul).
24241
0
  da = sa + ((da * ia) / 0xFFFF);
24242
0
  dr = ((sr * sa) + (dr * ia)) / 0xFFFF;
24243
0
  dg = ((sg * sa) + (dg * ia)) / 0xFFFF;
24244
0
  db = ((sb * sa) + (db * ia)) / 0xFFFF;
24245
24246
  // Combine components.
24247
0
  return (db << 0) | (dg << 16) | (dr << 32) | (da << 48);
24248
0
}
24249
24250
static inline uint32_t  //
24251
wuffs_private_impl__composite_premul_premul_u32_axxx(uint32_t dst_premul,
24252
0
                                                     uint32_t src_premul) {
24253
  // Extract 16-bit color components.
24254
0
  uint32_t da = 0x101 * (0xFF & (dst_premul >> 24));
24255
0
  uint32_t dr = 0x101 * (0xFF & (dst_premul >> 16));
24256
0
  uint32_t dg = 0x101 * (0xFF & (dst_premul >> 8));
24257
0
  uint32_t db = 0x101 * (0xFF & (dst_premul >> 0));
24258
0
  uint32_t sa = 0x101 * (0xFF & (src_premul >> 24));
24259
0
  uint32_t sr = 0x101 * (0xFF & (src_premul >> 16));
24260
0
  uint32_t sg = 0x101 * (0xFF & (src_premul >> 8));
24261
0
  uint32_t sb = 0x101 * (0xFF & (src_premul >> 0));
24262
24263
  // Calculate the inverse of the src-alpha: how much of the dst to keep.
24264
0
  uint32_t ia = 0xFFFF - sa;
24265
24266
  // Composite src (premul) over dst (premul).
24267
0
  da = sa + ((da * ia) / 0xFFFF);
24268
0
  dr = sr + ((dr * ia) / 0xFFFF);
24269
0
  dg = sg + ((dg * ia) / 0xFFFF);
24270
0
  db = sb + ((db * ia) / 0xFFFF);
24271
24272
  // Convert from 16-bit color to 8-bit color.
24273
0
  da >>= 8;
24274
0
  dr >>= 8;
24275
0
  dg >>= 8;
24276
0
  db >>= 8;
24277
24278
  // Combine components.
24279
0
  return (db << 0) | (dg << 8) | (dr << 16) | (da << 24);
24280
0
}
24281
24282
// --------
24283
24284
static uint64_t  //
24285
wuffs_private_impl__swizzle_squash_align4_bgr_565_8888(uint8_t* dst_ptr,
24286
                                                       size_t dst_len,
24287
                                                       const uint8_t* src_ptr,
24288
                                                       size_t src_len,
24289
0
                                                       bool nonpremul) {
24290
0
  size_t len = (dst_len < src_len ? dst_len : src_len) / 4;
24291
0
  uint8_t* d = dst_ptr;
24292
0
  const uint8_t* s = src_ptr;
24293
24294
0
  size_t n = len;
24295
0
  while (n--) {
24296
0
    uint32_t argb = wuffs_base__peek_u32le__no_bounds_check(s);
24297
0
    if (nonpremul) {
24298
0
      argb =
24299
0
          wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(argb);
24300
0
    }
24301
0
    uint32_t b5 = 0x1F & (argb >> (8 - 5));
24302
0
    uint32_t g6 = 0x3F & (argb >> (16 - 6));
24303
0
    uint32_t r5 = 0x1F & (argb >> (24 - 5));
24304
0
    uint32_t alpha = argb & 0xFF000000;
24305
0
    wuffs_base__poke_u32le__no_bounds_check(
24306
0
        d, alpha | (r5 << 11) | (g6 << 5) | (b5 << 0));
24307
0
    s += 4;
24308
0
    d += 4;
24309
0
  }
24310
0
  return len;
24311
0
}
24312
24313
// --------
24314
24315
static uint64_t  //
24316
wuffs_private_impl__swizzle_squash_align4_y_8888(uint8_t* dst_ptr,
24317
                                                 size_t dst_len,
24318
                                                 const uint8_t* src_ptr,
24319
                                                 size_t src_len,
24320
0
                                                 bool nonpremul) {
24321
0
  size_t len = (dst_len < src_len ? dst_len : src_len) / 4;
24322
0
  uint8_t* d = dst_ptr;
24323
0
  const uint8_t* s = src_ptr;
24324
24325
0
  size_t n = len;
24326
0
  while (n--) {
24327
0
    uint32_t argb = wuffs_base__peek_u32le__no_bounds_check(s);
24328
0
    if (nonpremul) {
24329
0
      argb =
24330
0
          wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(argb);
24331
0
    }
24332
0
    uint32_t s0 = wuffs_base__color_u32_argb_premul__as__color_u8_gray(argb);
24333
0
    wuffs_base__poke_u32le__no_bounds_check(
24334
0
        d, (argb & 0xFF000000) | (s0 * 0x010101));
24335
0
    s += 4;
24336
0
    d += 4;
24337
0
  }
24338
0
  return len;
24339
0
}
24340
24341
// --------
24342
24343
static uint64_t  //
24344
wuffs_private_impl__swizzle_swap_rgb_bgr(uint8_t* dst_ptr,
24345
                                         size_t dst_len,
24346
                                         uint8_t* dst_palette_ptr,
24347
                                         size_t dst_palette_len,
24348
                                         const uint8_t* src_ptr,
24349
7.42M
                                         size_t src_len) {
24350
7.42M
  size_t len = (dst_len < src_len ? dst_len : src_len) / 3;
24351
7.42M
  uint8_t* d = dst_ptr;
24352
7.42M
  const uint8_t* s = src_ptr;
24353
24354
7.42M
  size_t n = len;
24355
15.0M
  while (n--) {
24356
7.63M
    uint8_t s0 = s[0];
24357
7.63M
    uint8_t s1 = s[1];
24358
7.63M
    uint8_t s2 = s[2];
24359
7.63M
    d[0] = s2;
24360
7.63M
    d[1] = s1;
24361
7.63M
    d[2] = s0;
24362
7.63M
    s += 3;
24363
7.63M
    d += 3;
24364
7.63M
  }
24365
7.42M
  return len;
24366
7.42M
}
24367
24368
// โ€ผ WUFFS MULTI-FILE SECTION +x86_sse42
24369
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
24370
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
24371
static uint64_t  //
24372
wuffs_private_impl__swizzle_swap_rgbx_bgrx__x86_sse42(uint8_t* dst_ptr,
24373
                                                      size_t dst_len,
24374
                                                      uint8_t* dst_palette_ptr,
24375
                                                      size_t dst_palette_len,
24376
                                                      const uint8_t* src_ptr,
24377
46.7M
                                                      size_t src_len) {
24378
46.7M
  size_t len = (dst_len < src_len ? dst_len : src_len) / 4;
24379
46.7M
  uint8_t* d = dst_ptr;
24380
46.7M
  const uint8_t* s = src_ptr;
24381
46.7M
  size_t n = len;
24382
24383
46.7M
  __m128i shuffle = _mm_set_epi8(+0x0F, +0x0C, +0x0D, +0x0E,  //
24384
46.7M
                                 +0x0B, +0x08, +0x09, +0x0A,  //
24385
46.7M
                                 +0x07, +0x04, +0x05, +0x06,  //
24386
46.7M
                                 +0x03, +0x00, +0x01, +0x02);
24387
24388
59.8M
  while (n >= 4) {
24389
13.1M
    __m128i x;
24390
13.1M
    x = _mm_lddqu_si128((const __m128i*)(const void*)s);
24391
13.1M
    x = _mm_shuffle_epi8(x, shuffle);
24392
13.1M
    _mm_storeu_si128((__m128i*)(void*)d, x);
24393
24394
13.1M
    s += 4 * 4;
24395
13.1M
    d += 4 * 4;
24396
13.1M
    n -= 4;
24397
13.1M
  }
24398
24399
93.4M
  while (n--) {
24400
46.6M
    uint8_t s0 = s[0];
24401
46.6M
    uint8_t s1 = s[1];
24402
46.6M
    uint8_t s2 = s[2];
24403
46.6M
    uint8_t s3 = s[3];
24404
46.6M
    d[0] = s2;
24405
46.6M
    d[1] = s1;
24406
46.6M
    d[2] = s0;
24407
46.6M
    d[3] = s3;
24408
46.6M
    s += 4;
24409
46.6M
    d += 4;
24410
46.6M
  }
24411
46.7M
  return len;
24412
46.7M
}
24413
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
24414
// โ€ผ WUFFS MULTI-FILE SECTION -x86_sse42
24415
24416
static uint64_t  //
24417
wuffs_private_impl__swizzle_swap_rgbx_bgrx(uint8_t* dst_ptr,
24418
                                           size_t dst_len,
24419
                                           uint8_t* dst_palette_ptr,
24420
                                           size_t dst_palette_len,
24421
                                           const uint8_t* src_ptr,
24422
0
                                           size_t src_len) {
24423
0
  size_t len = (dst_len < src_len ? dst_len : src_len) / 4;
24424
0
  uint8_t* d = dst_ptr;
24425
0
  const uint8_t* s = src_ptr;
24426
24427
0
  size_t n = len;
24428
0
  while (n--) {
24429
0
    uint8_t s0 = s[0];
24430
0
    uint8_t s1 = s[1];
24431
0
    uint8_t s2 = s[2];
24432
0
    uint8_t s3 = s[3];
24433
0
    d[0] = s2;
24434
0
    d[1] = s1;
24435
0
    d[2] = s0;
24436
0
    d[3] = s3;
24437
0
    s += 4;
24438
0
    d += 4;
24439
0
  }
24440
0
  return len;
24441
0
}
24442
24443
// --------
24444
24445
static uint64_t  //
24446
wuffs_private_impl__swizzle_copy_1_1(uint8_t* dst_ptr,
24447
                                     size_t dst_len,
24448
                                     uint8_t* dst_palette_ptr,
24449
                                     size_t dst_palette_len,
24450
                                     const uint8_t* src_ptr,
24451
25.5M
                                     size_t src_len) {
24452
25.5M
  size_t len = (dst_len < src_len) ? dst_len : src_len;
24453
25.5M
  if (len > 0) {
24454
25.5M
    memmove(dst_ptr, src_ptr, len);
24455
25.5M
  }
24456
25.5M
  return len;
24457
25.5M
}
24458
24459
static uint64_t  //
24460
wuffs_private_impl__swizzle_copy_2_2(uint8_t* dst_ptr,
24461
                                     size_t dst_len,
24462
                                     uint8_t* dst_palette_ptr,
24463
                                     size_t dst_palette_len,
24464
                                     const uint8_t* src_ptr,
24465
2.88M
                                     size_t src_len) {
24466
2.88M
  size_t dst_len2 = dst_len / 2;
24467
2.88M
  size_t src_len2 = src_len / 2;
24468
2.88M
  size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2;
24469
2.88M
  if (len > 0) {
24470
2.88M
    memmove(dst_ptr, src_ptr, len * 2);
24471
2.88M
  }
24472
2.88M
  return len;
24473
2.88M
}
24474
24475
static uint64_t  //
24476
wuffs_private_impl__swizzle_copy_3_3(uint8_t* dst_ptr,
24477
                                     size_t dst_len,
24478
                                     uint8_t* dst_palette_ptr,
24479
                                     size_t dst_palette_len,
24480
                                     const uint8_t* src_ptr,
24481
0
                                     size_t src_len) {
24482
0
  size_t dst_len3 = dst_len / 3;
24483
0
  size_t src_len3 = src_len / 3;
24484
0
  size_t len = (dst_len3 < src_len3) ? dst_len3 : src_len3;
24485
0
  if (len > 0) {
24486
0
    memmove(dst_ptr, src_ptr, len * 3);
24487
0
  }
24488
0
  return len;
24489
0
}
24490
24491
static uint64_t  //
24492
wuffs_private_impl__swizzle_copy_4_4(uint8_t* dst_ptr,
24493
                                     size_t dst_len,
24494
                                     uint8_t* dst_palette_ptr,
24495
                                     size_t dst_palette_len,
24496
                                     const uint8_t* src_ptr,
24497
3.72M
                                     size_t src_len) {
24498
3.72M
  size_t dst_len4 = dst_len / 4;
24499
3.72M
  size_t src_len4 = src_len / 4;
24500
3.72M
  size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
24501
3.72M
  if (len > 0) {
24502
3.72M
    memmove(dst_ptr, src_ptr, len * 4);
24503
3.72M
  }
24504
3.72M
  return len;
24505
3.72M
}
24506
24507
static uint64_t  //
24508
wuffs_private_impl__swizzle_copy_8_8(uint8_t* dst_ptr,
24509
                                     size_t dst_len,
24510
                                     uint8_t* dst_palette_ptr,
24511
                                     size_t dst_palette_len,
24512
                                     const uint8_t* src_ptr,
24513
15.0M
                                     size_t src_len) {
24514
15.0M
  size_t dst_len8 = dst_len / 8;
24515
15.0M
  size_t src_len8 = src_len / 8;
24516
15.0M
  size_t len = (dst_len8 < src_len8) ? dst_len8 : src_len8;
24517
15.0M
  if (len > 0) {
24518
15.0M
    memmove(dst_ptr, src_ptr, len * 8);
24519
15.0M
  }
24520
15.0M
  return len;
24521
15.0M
}
24522
24523
// --------
24524
24525
static uint64_t  //
24526
wuffs_private_impl__swizzle_bgr_565__bgr(uint8_t* dst_ptr,
24527
                                         size_t dst_len,
24528
                                         uint8_t* dst_palette_ptr,
24529
                                         size_t dst_palette_len,
24530
                                         const uint8_t* src_ptr,
24531
0
                                         size_t src_len) {
24532
0
  size_t dst_len2 = dst_len / 2;
24533
0
  size_t src_len3 = src_len / 3;
24534
0
  size_t len = (dst_len2 < src_len3) ? dst_len2 : src_len3;
24535
0
  uint8_t* d = dst_ptr;
24536
0
  const uint8_t* s = src_ptr;
24537
0
  size_t n = len;
24538
24539
  // TODO: unroll.
24540
24541
0
  while (n >= 1) {
24542
0
    uint32_t b5 = (uint32_t)(s[0] >> 3);
24543
0
    uint32_t g6 = (uint32_t)(s[1] >> 2);
24544
0
    uint32_t r5 = (uint32_t)(s[2] >> 3);
24545
0
    uint32_t rgb_565 = (r5 << 11) | (g6 << 5) | (b5 << 0);
24546
0
    wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565);
24547
24548
0
    s += 1 * 3;
24549
0
    d += 1 * 2;
24550
0
    n -= 1;
24551
0
  }
24552
24553
0
  return len;
24554
0
}
24555
24556
static uint64_t  //
24557
wuffs_private_impl__swizzle_bgr_565__bgrx(uint8_t* dst_ptr,
24558
                                          size_t dst_len,
24559
                                          uint8_t* dst_palette_ptr,
24560
                                          size_t dst_palette_len,
24561
                                          const uint8_t* src_ptr,
24562
0
                                          size_t src_len) {
24563
0
  size_t dst_len2 = dst_len / 2;
24564
0
  size_t src_len4 = src_len / 4;
24565
0
  size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4;
24566
0
  uint8_t* d = dst_ptr;
24567
0
  const uint8_t* s = src_ptr;
24568
0
  size_t n = len;
24569
24570
  // TODO: unroll.
24571
24572
0
  while (n >= 1) {
24573
0
    uint32_t b5 = (uint32_t)(s[0] >> 3);
24574
0
    uint32_t g6 = (uint32_t)(s[1] >> 2);
24575
0
    uint32_t r5 = (uint32_t)(s[2] >> 3);
24576
0
    uint32_t rgb_565 = (r5 << 11) | (g6 << 5) | (b5 << 0);
24577
0
    wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565);
24578
24579
0
    s += 1 * 4;
24580
0
    d += 1 * 2;
24581
0
    n -= 1;
24582
0
  }
24583
24584
0
  return len;
24585
0
}
24586
24587
static uint64_t  //
24588
wuffs_private_impl__swizzle_bgr_565__bgra_nonpremul__src(
24589
    uint8_t* dst_ptr,
24590
    size_t dst_len,
24591
    uint8_t* dst_palette_ptr,
24592
    size_t dst_palette_len,
24593
    const uint8_t* src_ptr,
24594
0
    size_t src_len) {
24595
0
  size_t dst_len2 = dst_len / 2;
24596
0
  size_t src_len4 = src_len / 4;
24597
0
  size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4;
24598
0
  uint8_t* d = dst_ptr;
24599
0
  const uint8_t* s = src_ptr;
24600
0
  size_t n = len;
24601
24602
  // TODO: unroll.
24603
24604
0
  while (n >= 1) {
24605
0
    wuffs_base__poke_u16le__no_bounds_check(
24606
0
        d + (0 * 2),
24607
0
        wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(
24608
0
            wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(
24609
0
                wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))));
24610
24611
0
    s += 1 * 4;
24612
0
    d += 1 * 2;
24613
0
    n -= 1;
24614
0
  }
24615
24616
0
  return len;
24617
0
}
24618
24619
static uint64_t  //
24620
wuffs_private_impl__swizzle_bgr_565__bgra_nonpremul_4x16le__src(
24621
    uint8_t* dst_ptr,
24622
    size_t dst_len,
24623
    uint8_t* dst_palette_ptr,
24624
    size_t dst_palette_len,
24625
    const uint8_t* src_ptr,
24626
0
    size_t src_len) {
24627
0
  size_t dst_len2 = dst_len / 2;
24628
0
  size_t src_len8 = src_len / 8;
24629
0
  size_t len = (dst_len2 < src_len8) ? dst_len2 : src_len8;
24630
0
  uint8_t* d = dst_ptr;
24631
0
  const uint8_t* s = src_ptr;
24632
0
  size_t n = len;
24633
24634
  // TODO: unroll.
24635
24636
0
  while (n >= 1) {
24637
0
    wuffs_base__poke_u16le__no_bounds_check(
24638
0
        d + (0 * 2),
24639
0
        wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(
24640
0
            wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul(
24641
0
                wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)))));
24642
24643
0
    s += 1 * 8;
24644
0
    d += 1 * 2;
24645
0
    n -= 1;
24646
0
  }
24647
24648
0
  return len;
24649
0
}
24650
24651
static uint64_t  //
24652
wuffs_private_impl__swizzle_bgr_565__bgra_nonpremul__src_over(
24653
    uint8_t* dst_ptr,
24654
    size_t dst_len,
24655
    uint8_t* dst_palette_ptr,
24656
    size_t dst_palette_len,
24657
    const uint8_t* src_ptr,
24658
0
    size_t src_len) {
24659
0
  size_t dst_len2 = dst_len / 2;
24660
0
  size_t src_len4 = src_len / 4;
24661
0
  size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4;
24662
0
  uint8_t* d = dst_ptr;
24663
0
  const uint8_t* s = src_ptr;
24664
0
  size_t n = len;
24665
24666
  // TODO: unroll.
24667
24668
0
  while (n >= 1) {
24669
    // Extract 16-bit color components.
24670
0
    uint32_t sa = 0x101 * ((uint32_t)s[3]);
24671
0
    uint32_t sr = 0x101 * ((uint32_t)s[2]);
24672
0
    uint32_t sg = 0x101 * ((uint32_t)s[1]);
24673
0
    uint32_t sb = 0x101 * ((uint32_t)s[0]);
24674
24675
    // Convert from 565 color to 16-bit color.
24676
0
    uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2));
24677
0
    uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11);
24678
0
    uint32_t dr = (0x8421 * old_r5) >> 4;
24679
0
    uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5);
24680
0
    uint32_t dg = (0x1041 * old_g6) >> 2;
24681
0
    uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0);
24682
0
    uint32_t db = (0x8421 * old_b5) >> 4;
24683
24684
    // Calculate the inverse of the src-alpha: how much of the dst to keep.
24685
0
    uint32_t ia = 0xFFFF - sa;
24686
24687
    // Composite src (nonpremul) over dst (premul).
24688
0
    dr = ((sr * sa) + (dr * ia)) / 0xFFFF;
24689
0
    dg = ((sg * sa) + (dg * ia)) / 0xFFFF;
24690
0
    db = ((sb * sa) + (db * ia)) / 0xFFFF;
24691
24692
    // Convert from 16-bit color to 565 color and combine the components.
24693
0
    uint32_t new_r5 = 0x1F & (dr >> 11);
24694
0
    uint32_t new_g6 = 0x3F & (dg >> 10);
24695
0
    uint32_t new_b5 = 0x1F & (db >> 11);
24696
0
    uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0);
24697
0
    wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565);
24698
24699
0
    s += 1 * 4;
24700
0
    d += 1 * 2;
24701
0
    n -= 1;
24702
0
  }
24703
24704
0
  return len;
24705
0
}
24706
24707
static uint64_t  //
24708
wuffs_private_impl__swizzle_bgr_565__bgra_nonpremul_4x16le__src_over(
24709
    uint8_t* dst_ptr,
24710
    size_t dst_len,
24711
    uint8_t* dst_palette_ptr,
24712
    size_t dst_palette_len,
24713
    const uint8_t* src_ptr,
24714
0
    size_t src_len) {
24715
0
  size_t dst_len2 = dst_len / 2;
24716
0
  size_t src_len8 = src_len / 8;
24717
0
  size_t len = (dst_len2 < src_len8) ? dst_len2 : src_len8;
24718
0
  uint8_t* d = dst_ptr;
24719
0
  const uint8_t* s = src_ptr;
24720
0
  size_t n = len;
24721
24722
  // TODO: unroll.
24723
24724
0
  while (n >= 1) {
24725
    // Extract 16-bit color components.
24726
0
    uint32_t sa = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 6));
24727
0
    uint32_t sr = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 4));
24728
0
    uint32_t sg = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 2));
24729
0
    uint32_t sb = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 0));
24730
24731
    // Convert from 565 color to 16-bit color.
24732
0
    uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2));
24733
0
    uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11);
24734
0
    uint32_t dr = (0x8421 * old_r5) >> 4;
24735
0
    uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5);
24736
0
    uint32_t dg = (0x1041 * old_g6) >> 2;
24737
0
    uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0);
24738
0
    uint32_t db = (0x8421 * old_b5) >> 4;
24739
24740
    // Calculate the inverse of the src-alpha: how much of the dst to keep.
24741
0
    uint32_t ia = 0xFFFF - sa;
24742
24743
    // Composite src (nonpremul) over dst (premul).
24744
0
    dr = ((sr * sa) + (dr * ia)) / 0xFFFF;
24745
0
    dg = ((sg * sa) + (dg * ia)) / 0xFFFF;
24746
0
    db = ((sb * sa) + (db * ia)) / 0xFFFF;
24747
24748
    // Convert from 16-bit color to 565 color and combine the components.
24749
0
    uint32_t new_r5 = 0x1F & (dr >> 11);
24750
0
    uint32_t new_g6 = 0x3F & (dg >> 10);
24751
0
    uint32_t new_b5 = 0x1F & (db >> 11);
24752
0
    uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0);
24753
0
    wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565);
24754
24755
0
    s += 1 * 8;
24756
0
    d += 1 * 2;
24757
0
    n -= 1;
24758
0
  }
24759
24760
0
  return len;
24761
0
}
24762
24763
static uint64_t  //
24764
wuffs_private_impl__swizzle_bgr_565__bgra_premul__src(uint8_t* dst_ptr,
24765
                                                      size_t dst_len,
24766
                                                      uint8_t* dst_palette_ptr,
24767
                                                      size_t dst_palette_len,
24768
                                                      const uint8_t* src_ptr,
24769
0
                                                      size_t src_len) {
24770
0
  size_t dst_len2 = dst_len / 2;
24771
0
  size_t src_len4 = src_len / 4;
24772
0
  size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4;
24773
0
  uint8_t* d = dst_ptr;
24774
0
  const uint8_t* s = src_ptr;
24775
0
  size_t n = len;
24776
24777
  // TODO: unroll.
24778
24779
0
  while (n >= 1) {
24780
0
    wuffs_base__poke_u16le__no_bounds_check(
24781
0
        d + (0 * 2), wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(
24782
0
                         wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))));
24783
24784
0
    s += 1 * 4;
24785
0
    d += 1 * 2;
24786
0
    n -= 1;
24787
0
  }
24788
24789
0
  return len;
24790
0
}
24791
24792
static uint64_t  //
24793
wuffs_private_impl__swizzle_bgr_565__bgra_premul__src_over(
24794
    uint8_t* dst_ptr,
24795
    size_t dst_len,
24796
    uint8_t* dst_palette_ptr,
24797
    size_t dst_palette_len,
24798
    const uint8_t* src_ptr,
24799
0
    size_t src_len) {
24800
0
  size_t dst_len2 = dst_len / 2;
24801
0
  size_t src_len4 = src_len / 4;
24802
0
  size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4;
24803
0
  uint8_t* d = dst_ptr;
24804
0
  const uint8_t* s = src_ptr;
24805
0
  size_t n = len;
24806
24807
  // TODO: unroll.
24808
24809
0
  while (n >= 1) {
24810
    // Extract 16-bit color components.
24811
0
    uint32_t sa = 0x101 * ((uint32_t)s[3]);
24812
0
    uint32_t sr = 0x101 * ((uint32_t)s[2]);
24813
0
    uint32_t sg = 0x101 * ((uint32_t)s[1]);
24814
0
    uint32_t sb = 0x101 * ((uint32_t)s[0]);
24815
24816
    // Convert from 565 color to 16-bit color.
24817
0
    uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2));
24818
0
    uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11);
24819
0
    uint32_t dr = (0x8421 * old_r5) >> 4;
24820
0
    uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5);
24821
0
    uint32_t dg = (0x1041 * old_g6) >> 2;
24822
0
    uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0);
24823
0
    uint32_t db = (0x8421 * old_b5) >> 4;
24824
24825
    // Calculate the inverse of the src-alpha: how much of the dst to keep.
24826
0
    uint32_t ia = 0xFFFF - sa;
24827
24828
    // Composite src (premul) over dst (premul).
24829
0
    dr = sr + ((dr * ia) / 0xFFFF);
24830
0
    dg = sg + ((dg * ia) / 0xFFFF);
24831
0
    db = sb + ((db * ia) / 0xFFFF);
24832
24833
    // Convert from 16-bit color to 565 color and combine the components.
24834
0
    uint32_t new_r5 = 0x1F & (dr >> 11);
24835
0
    uint32_t new_g6 = 0x3F & (dg >> 10);
24836
0
    uint32_t new_b5 = 0x1F & (db >> 11);
24837
0
    uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0);
24838
0
    wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565);
24839
24840
0
    s += 1 * 4;
24841
0
    d += 1 * 2;
24842
0
    n -= 1;
24843
0
  }
24844
24845
0
  return len;
24846
0
}
24847
24848
static uint64_t  //
24849
wuffs_private_impl__swizzle_bgr_565__rgb(uint8_t* dst_ptr,
24850
                                         size_t dst_len,
24851
                                         uint8_t* dst_palette_ptr,
24852
                                         size_t dst_palette_len,
24853
                                         const uint8_t* src_ptr,
24854
0
                                         size_t src_len) {
24855
0
  size_t dst_len2 = dst_len / 2;
24856
0
  size_t src_len3 = src_len / 3;
24857
0
  size_t len = (dst_len2 < src_len3) ? dst_len2 : src_len3;
24858
0
  uint8_t* d = dst_ptr;
24859
0
  const uint8_t* s = src_ptr;
24860
0
  size_t n = len;
24861
24862
  // TODO: unroll.
24863
24864
0
  while (n >= 1) {
24865
0
    uint32_t r5 = (uint32_t)(s[0] >> 3);
24866
0
    uint32_t g6 = (uint32_t)(s[1] >> 2);
24867
0
    uint32_t b5 = (uint32_t)(s[2] >> 3);
24868
0
    uint32_t rgb_565 = (r5 << 11) | (g6 << 5) | (b5 << 0);
24869
0
    wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565);
24870
24871
0
    s += 1 * 3;
24872
0
    d += 1 * 2;
24873
0
    n -= 1;
24874
0
  }
24875
24876
0
  return len;
24877
0
}
24878
24879
static uint64_t  //
24880
wuffs_private_impl__swizzle_bgr_565__rgba_nonpremul__src(
24881
    uint8_t* dst_ptr,
24882
    size_t dst_len,
24883
    uint8_t* dst_palette_ptr,
24884
    size_t dst_palette_len,
24885
    const uint8_t* src_ptr,
24886
0
    size_t src_len) {
24887
0
  size_t dst_len2 = dst_len / 2;
24888
0
  size_t src_len4 = src_len / 4;
24889
0
  size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4;
24890
0
  uint8_t* d = dst_ptr;
24891
0
  const uint8_t* s = src_ptr;
24892
0
  size_t n = len;
24893
24894
  // TODO: unroll.
24895
24896
0
  while (n >= 1) {
24897
0
    wuffs_base__poke_u16le__no_bounds_check(
24898
0
        d + (0 * 2),
24899
0
        wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(
24900
0
            wuffs_private_impl__swap_u32_argb_abgr(
24901
0
                wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(
24902
0
                    wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))))));
24903
24904
0
    s += 1 * 4;
24905
0
    d += 1 * 2;
24906
0
    n -= 1;
24907
0
  }
24908
24909
0
  return len;
24910
0
}
24911
24912
static uint64_t  //
24913
wuffs_private_impl__swizzle_bgr_565__rgba_nonpremul__src_over(
24914
    uint8_t* dst_ptr,
24915
    size_t dst_len,
24916
    uint8_t* dst_palette_ptr,
24917
    size_t dst_palette_len,
24918
    const uint8_t* src_ptr,
24919
0
    size_t src_len) {
24920
0
  size_t dst_len2 = dst_len / 2;
24921
0
  size_t src_len4 = src_len / 4;
24922
0
  size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4;
24923
0
  uint8_t* d = dst_ptr;
24924
0
  const uint8_t* s = src_ptr;
24925
0
  size_t n = len;
24926
24927
  // TODO: unroll.
24928
24929
0
  while (n >= 1) {
24930
    // Extract 16-bit color components.
24931
0
    uint32_t sa = 0x101 * ((uint32_t)s[3]);
24932
0
    uint32_t sb = 0x101 * ((uint32_t)s[2]);
24933
0
    uint32_t sg = 0x101 * ((uint32_t)s[1]);
24934
0
    uint32_t sr = 0x101 * ((uint32_t)s[0]);
24935
24936
    // Convert from 565 color to 16-bit color.
24937
0
    uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2));
24938
0
    uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11);
24939
0
    uint32_t dr = (0x8421 * old_r5) >> 4;
24940
0
    uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5);
24941
0
    uint32_t dg = (0x1041 * old_g6) >> 2;
24942
0
    uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0);
24943
0
    uint32_t db = (0x8421 * old_b5) >> 4;
24944
24945
    // Calculate the inverse of the src-alpha: how much of the dst to keep.
24946
0
    uint32_t ia = 0xFFFF - sa;
24947
24948
    // Composite src (nonpremul) over dst (premul).
24949
0
    dr = ((sr * sa) + (dr * ia)) / 0xFFFF;
24950
0
    dg = ((sg * sa) + (dg * ia)) / 0xFFFF;
24951
0
    db = ((sb * sa) + (db * ia)) / 0xFFFF;
24952
24953
    // Convert from 16-bit color to 565 color and combine the components.
24954
0
    uint32_t new_r5 = 0x1F & (dr >> 11);
24955
0
    uint32_t new_g6 = 0x3F & (dg >> 10);
24956
0
    uint32_t new_b5 = 0x1F & (db >> 11);
24957
0
    uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0);
24958
0
    wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565);
24959
24960
0
    s += 1 * 4;
24961
0
    d += 1 * 2;
24962
0
    n -= 1;
24963
0
  }
24964
24965
0
  return len;
24966
0
}
24967
24968
static uint64_t  //
24969
wuffs_private_impl__swizzle_bgr_565__rgba_premul__src(uint8_t* dst_ptr,
24970
                                                      size_t dst_len,
24971
                                                      uint8_t* dst_palette_ptr,
24972
                                                      size_t dst_palette_len,
24973
                                                      const uint8_t* src_ptr,
24974
0
                                                      size_t src_len) {
24975
0
  size_t dst_len2 = dst_len / 2;
24976
0
  size_t src_len4 = src_len / 4;
24977
0
  size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4;
24978
0
  uint8_t* d = dst_ptr;
24979
0
  const uint8_t* s = src_ptr;
24980
0
  size_t n = len;
24981
24982
  // TODO: unroll.
24983
24984
0
  while (n >= 1) {
24985
0
    wuffs_base__poke_u16le__no_bounds_check(
24986
0
        d + (0 * 2),
24987
0
        wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(
24988
0
            wuffs_private_impl__swap_u32_argb_abgr(
24989
0
                wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))));
24990
24991
0
    s += 1 * 4;
24992
0
    d += 1 * 2;
24993
0
    n -= 1;
24994
0
  }
24995
24996
0
  return len;
24997
0
}
24998
24999
static uint64_t  //
25000
wuffs_private_impl__swizzle_bgr_565__rgba_premul__src_over(
25001
    uint8_t* dst_ptr,
25002
    size_t dst_len,
25003
    uint8_t* dst_palette_ptr,
25004
    size_t dst_palette_len,
25005
    const uint8_t* src_ptr,
25006
0
    size_t src_len) {
25007
0
  size_t dst_len2 = dst_len / 2;
25008
0
  size_t src_len4 = src_len / 4;
25009
0
  size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4;
25010
0
  uint8_t* d = dst_ptr;
25011
0
  const uint8_t* s = src_ptr;
25012
0
  size_t n = len;
25013
25014
  // TODO: unroll.
25015
25016
0
  while (n >= 1) {
25017
    // Extract 16-bit color components.
25018
0
    uint32_t sa = 0x101 * ((uint32_t)s[3]);
25019
0
    uint32_t sb = 0x101 * ((uint32_t)s[2]);
25020
0
    uint32_t sg = 0x101 * ((uint32_t)s[1]);
25021
0
    uint32_t sr = 0x101 * ((uint32_t)s[0]);
25022
25023
    // Convert from 565 color to 16-bit color.
25024
0
    uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2));
25025
0
    uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11);
25026
0
    uint32_t dr = (0x8421 * old_r5) >> 4;
25027
0
    uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5);
25028
0
    uint32_t dg = (0x1041 * old_g6) >> 2;
25029
0
    uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0);
25030
0
    uint32_t db = (0x8421 * old_b5) >> 4;
25031
25032
    // Calculate the inverse of the src-alpha: how much of the dst to keep.
25033
0
    uint32_t ia = 0xFFFF - sa;
25034
25035
    // Composite src (premul) over dst (premul).
25036
0
    dr = sr + ((dr * ia) / 0xFFFF);
25037
0
    dg = sg + ((dg * ia) / 0xFFFF);
25038
0
    db = sb + ((db * ia) / 0xFFFF);
25039
25040
    // Convert from 16-bit color to 565 color and combine the components.
25041
0
    uint32_t new_r5 = 0x1F & (dr >> 11);
25042
0
    uint32_t new_g6 = 0x3F & (dg >> 10);
25043
0
    uint32_t new_b5 = 0x1F & (db >> 11);
25044
0
    uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0);
25045
0
    wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565);
25046
25047
0
    s += 1 * 4;
25048
0
    d += 1 * 2;
25049
0
    n -= 1;
25050
0
  }
25051
25052
0
  return len;
25053
0
}
25054
25055
static uint64_t  //
25056
wuffs_private_impl__swizzle_bgr_565__y(uint8_t* dst_ptr,
25057
                                       size_t dst_len,
25058
                                       uint8_t* dst_palette_ptr,
25059
                                       size_t dst_palette_len,
25060
                                       const uint8_t* src_ptr,
25061
0
                                       size_t src_len) {
25062
0
  size_t dst_len2 = dst_len / 2;
25063
0
  size_t len = (dst_len2 < src_len) ? dst_len2 : src_len;
25064
0
  uint8_t* d = dst_ptr;
25065
0
  const uint8_t* s = src_ptr;
25066
0
  size_t n = len;
25067
25068
  // TODO: unroll.
25069
25070
0
  while (n >= 1) {
25071
0
    uint32_t y5 = (uint32_t)(s[0] >> 3);
25072
0
    uint32_t y6 = (uint32_t)(s[0] >> 2);
25073
0
    uint32_t rgb_565 = (y5 << 11) | (y6 << 5) | (y5 << 0);
25074
0
    wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565);
25075
25076
0
    s += 1 * 1;
25077
0
    d += 1 * 2;
25078
0
    n -= 1;
25079
0
  }
25080
25081
0
  return len;
25082
0
}
25083
25084
static uint64_t  //
25085
wuffs_private_impl__swizzle_bgr_565__y_16be(uint8_t* dst_ptr,
25086
                                            size_t dst_len,
25087
                                            uint8_t* dst_palette_ptr,
25088
                                            size_t dst_palette_len,
25089
                                            const uint8_t* src_ptr,
25090
0
                                            size_t src_len) {
25091
0
  size_t dst_len2 = dst_len / 2;
25092
0
  size_t src_len2 = src_len / 2;
25093
0
  size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2;
25094
0
  uint8_t* d = dst_ptr;
25095
0
  const uint8_t* s = src_ptr;
25096
0
  size_t n = len;
25097
25098
  // TODO: unroll.
25099
25100
0
  while (n >= 1) {
25101
0
    uint32_t y5 = (uint32_t)(s[0] >> 3);
25102
0
    uint32_t y6 = (uint32_t)(s[0] >> 2);
25103
0
    uint32_t rgb_565 = (y5 << 11) | (y6 << 5) | (y5 << 0);
25104
0
    wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565);
25105
25106
0
    s += 1 * 2;
25107
0
    d += 1 * 2;
25108
0
    n -= 1;
25109
0
  }
25110
25111
0
  return len;
25112
0
}
25113
25114
static uint64_t  //
25115
wuffs_private_impl__swizzle_bgr_565__ya_nonpremul__src(uint8_t* dst_ptr,
25116
                                                       size_t dst_len,
25117
                                                       uint8_t* dst_palette_ptr,
25118
                                                       size_t dst_palette_len,
25119
                                                       const uint8_t* src_ptr,
25120
0
                                                       size_t src_len) {
25121
0
  size_t dst_len2 = dst_len / 2;
25122
0
  size_t src_len2 = src_len / 2;
25123
0
  size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2;
25124
0
  uint8_t* d = dst_ptr;
25125
0
  const uint8_t* s = src_ptr;
25126
0
  size_t n = len;
25127
25128
  // TODO: unroll.
25129
25130
0
  while (n >= 1) {
25131
0
    uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101);
25132
25133
0
    wuffs_base__poke_u16le__no_bounds_check(
25134
0
        d + (0 * 2),
25135
0
        wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(
25136
0
            wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(
25137
0
                s0)));
25138
25139
0
    s += 1 * 2;
25140
0
    d += 1 * 2;
25141
0
    n -= 1;
25142
0
  }
25143
25144
0
  return len;
25145
0
}
25146
25147
static uint64_t  //
25148
wuffs_private_impl__swizzle_bgr_565__ya_nonpremul__src_over(
25149
    uint8_t* dst_ptr,
25150
    size_t dst_len,
25151
    uint8_t* dst_palette_ptr,
25152
    size_t dst_palette_len,
25153
    const uint8_t* src_ptr,
25154
0
    size_t src_len) {
25155
0
  size_t dst_len2 = dst_len / 2;
25156
0
  size_t src_len2 = src_len / 2;
25157
0
  size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2;
25158
0
  uint8_t* d = dst_ptr;
25159
0
  const uint8_t* s = src_ptr;
25160
0
  size_t n = len;
25161
25162
  // TODO: unroll.
25163
25164
0
  while (n >= 1) {
25165
    // Extract 16-bit color components.
25166
0
    uint32_t sa = 0x101 * ((uint32_t)s[1]);
25167
0
    uint32_t sy = 0x101 * ((uint32_t)s[0]);
25168
25169
    // Convert from 565 color to 16-bit color.
25170
0
    uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2));
25171
0
    uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11);
25172
0
    uint32_t dr = (0x8421 * old_r5) >> 4;
25173
0
    uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5);
25174
0
    uint32_t dg = (0x1041 * old_g6) >> 2;
25175
0
    uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0);
25176
0
    uint32_t db = (0x8421 * old_b5) >> 4;
25177
25178
    // Calculate the inverse of the src-alpha: how much of the dst to keep.
25179
0
    uint32_t ia = 0xFFFF - sa;
25180
25181
    // Composite src (nonpremul) over dst (premul).
25182
0
    dr = ((sy * sa) + (dr * ia)) / 0xFFFF;
25183
0
    dg = ((sy * sa) + (dg * ia)) / 0xFFFF;
25184
0
    db = ((sy * sa) + (db * ia)) / 0xFFFF;
25185
25186
    // Convert from 16-bit color to 565 color and combine the components.
25187
0
    uint32_t new_r5 = 0x1F & (dr >> 11);
25188
0
    uint32_t new_g6 = 0x3F & (dg >> 10);
25189
0
    uint32_t new_b5 = 0x1F & (db >> 11);
25190
0
    uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0);
25191
0
    wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565);
25192
25193
0
    s += 1 * 2;
25194
0
    d += 1 * 2;
25195
0
    n -= 1;
25196
0
  }
25197
25198
0
  return len;
25199
0
}
25200
25201
static uint64_t  //
25202
wuffs_private_impl__swizzle_bgr_565__index__src(uint8_t* dst_ptr,
25203
                                                size_t dst_len,
25204
                                                uint8_t* dst_palette_ptr,
25205
                                                size_t dst_palette_len,
25206
                                                const uint8_t* src_ptr,
25207
0
                                                size_t src_len) {
25208
0
  if (dst_palette_len !=
25209
0
      WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
25210
0
    return 0;
25211
0
  }
25212
0
  size_t dst_len2 = dst_len / 2;
25213
0
  size_t len = (dst_len2 < src_len) ? dst_len2 : src_len;
25214
0
  uint8_t* d = dst_ptr;
25215
0
  const uint8_t* s = src_ptr;
25216
0
  size_t n = len;
25217
25218
0
  const size_t loop_unroll_count = 4;
25219
25220
0
  while (n >= loop_unroll_count) {
25221
0
    wuffs_base__poke_u16le__no_bounds_check(
25222
0
        d + (0 * 2), wuffs_base__peek_u16le__no_bounds_check(
25223
0
                         dst_palette_ptr + ((size_t)s[0] * 4)));
25224
0
    wuffs_base__poke_u16le__no_bounds_check(
25225
0
        d + (1 * 2), wuffs_base__peek_u16le__no_bounds_check(
25226
0
                         dst_palette_ptr + ((size_t)s[1] * 4)));
25227
0
    wuffs_base__poke_u16le__no_bounds_check(
25228
0
        d + (2 * 2), wuffs_base__peek_u16le__no_bounds_check(
25229
0
                         dst_palette_ptr + ((size_t)s[2] * 4)));
25230
0
    wuffs_base__poke_u16le__no_bounds_check(
25231
0
        d + (3 * 2), wuffs_base__peek_u16le__no_bounds_check(
25232
0
                         dst_palette_ptr + ((size_t)s[3] * 4)));
25233
25234
0
    s += loop_unroll_count * 1;
25235
0
    d += loop_unroll_count * 2;
25236
0
    n -= loop_unroll_count;
25237
0
  }
25238
25239
0
  while (n >= 1) {
25240
0
    wuffs_base__poke_u16le__no_bounds_check(
25241
0
        d + (0 * 2), wuffs_base__peek_u16le__no_bounds_check(
25242
0
                         dst_palette_ptr + ((size_t)s[0] * 4)));
25243
25244
0
    s += 1 * 1;
25245
0
    d += 1 * 2;
25246
0
    n -= 1;
25247
0
  }
25248
25249
0
  return len;
25250
0
}
25251
25252
static uint64_t  //
25253
wuffs_private_impl__swizzle_bgr_565__index_bgra_nonpremul__src_over(
25254
    uint8_t* dst_ptr,
25255
    size_t dst_len,
25256
    uint8_t* dst_palette_ptr,
25257
    size_t dst_palette_len,
25258
    const uint8_t* src_ptr,
25259
0
    size_t src_len) {
25260
0
  if (dst_palette_len !=
25261
0
      WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
25262
0
    return 0;
25263
0
  }
25264
0
  size_t dst_len2 = dst_len / 2;
25265
0
  size_t len = (dst_len2 < src_len) ? dst_len2 : src_len;
25266
0
  uint8_t* d = dst_ptr;
25267
0
  const uint8_t* s = src_ptr;
25268
0
  size_t n = len;
25269
25270
  // TODO: unroll.
25271
25272
0
  while (n >= 1) {
25273
0
    uint32_t d0 = wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul(
25274
0
        wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2)));
25275
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
25276
0
                                                          ((size_t)s[0] * 4));
25277
0
    wuffs_base__poke_u16le__no_bounds_check(
25278
0
        d + (0 * 2),
25279
0
        wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(
25280
0
            wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0)));
25281
25282
0
    s += 1 * 1;
25283
0
    d += 1 * 2;
25284
0
    n -= 1;
25285
0
  }
25286
25287
0
  return len;
25288
0
}
25289
25290
static uint64_t  //
25291
wuffs_private_impl__swizzle_bgr_565__index_binary_alpha__src_over(
25292
    uint8_t* dst_ptr,
25293
    size_t dst_len,
25294
    uint8_t* dst_palette_ptr,
25295
    size_t dst_palette_len,
25296
    const uint8_t* src_ptr,
25297
0
    size_t src_len) {
25298
0
  if (dst_palette_len !=
25299
0
      WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
25300
0
    return 0;
25301
0
  }
25302
0
  size_t dst_len2 = dst_len / 2;
25303
0
  size_t len = (dst_len2 < src_len) ? dst_len2 : src_len;
25304
0
  uint8_t* d = dst_ptr;
25305
0
  const uint8_t* s = src_ptr;
25306
0
  size_t n = len;
25307
25308
  // TODO: unroll.
25309
25310
0
  while (n >= 1) {
25311
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
25312
0
                                                          ((size_t)s[0] * 4));
25313
0
    if (s0) {
25314
0
      wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)s0);
25315
0
    }
25316
25317
0
    s += 1 * 1;
25318
0
    d += 1 * 2;
25319
0
    n -= 1;
25320
0
  }
25321
25322
0
  return len;
25323
0
}
25324
25325
// --------
25326
25327
static uint64_t  //
25328
wuffs_private_impl__swizzle_bgr__bgr_565(uint8_t* dst_ptr,
25329
                                         size_t dst_len,
25330
                                         uint8_t* dst_palette_ptr,
25331
                                         size_t dst_palette_len,
25332
                                         const uint8_t* src_ptr,
25333
0
                                         size_t src_len) {
25334
0
  size_t dst_len3 = dst_len / 3;
25335
0
  size_t src_len2 = src_len / 2;
25336
0
  size_t len = (dst_len3 < src_len2) ? dst_len3 : src_len2;
25337
0
  uint8_t* d = dst_ptr;
25338
0
  const uint8_t* s = src_ptr;
25339
0
  size_t n = len;
25340
25341
  // TODO: unroll.
25342
25343
0
  while (n >= 1) {
25344
0
    uint32_t s0 = wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul(
25345
0
        wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2)));
25346
0
    wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0);
25347
25348
0
    s += 1 * 2;
25349
0
    d += 1 * 3;
25350
0
    n -= 1;
25351
0
  }
25352
25353
0
  return len;
25354
0
}
25355
25356
static uint64_t  //
25357
wuffs_private_impl__swizzle_bgr__bgra_nonpremul__src(uint8_t* dst_ptr,
25358
                                                     size_t dst_len,
25359
                                                     uint8_t* dst_palette_ptr,
25360
                                                     size_t dst_palette_len,
25361
                                                     const uint8_t* src_ptr,
25362
0
                                                     size_t src_len) {
25363
0
  size_t dst_len3 = dst_len / 3;
25364
0
  size_t src_len4 = src_len / 4;
25365
0
  size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4;
25366
0
  uint8_t* d = dst_ptr;
25367
0
  const uint8_t* s = src_ptr;
25368
0
  size_t n = len;
25369
25370
  // TODO: unroll.
25371
25372
0
  while (n >= 1) {
25373
0
    uint32_t s0 =
25374
0
        wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(
25375
0
            wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
25376
0
    wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0);
25377
25378
0
    s += 1 * 4;
25379
0
    d += 1 * 3;
25380
0
    n -= 1;
25381
0
  }
25382
25383
0
  return len;
25384
0
}
25385
25386
static uint64_t  //
25387
wuffs_private_impl__swizzle_bgr__bgra_nonpremul_4x16le__src(
25388
    uint8_t* dst_ptr,
25389
    size_t dst_len,
25390
    uint8_t* dst_palette_ptr,
25391
    size_t dst_palette_len,
25392
    const uint8_t* src_ptr,
25393
0
    size_t src_len) {
25394
0
  size_t dst_len3 = dst_len / 3;
25395
0
  size_t src_len8 = src_len / 8;
25396
0
  size_t len = (dst_len3 < src_len8) ? dst_len3 : src_len8;
25397
0
  uint8_t* d = dst_ptr;
25398
0
  const uint8_t* s = src_ptr;
25399
0
  size_t n = len;
25400
25401
  // TODO: unroll.
25402
25403
0
  while (n >= 1) {
25404
0
    uint32_t s0 =
25405
0
        wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul(
25406
0
            wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)));
25407
0
    wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0);
25408
25409
0
    s += 1 * 8;
25410
0
    d += 1 * 3;
25411
0
    n -= 1;
25412
0
  }
25413
25414
0
  return len;
25415
0
}
25416
25417
static uint64_t  //
25418
wuffs_private_impl__swizzle_bgr__bgra_nonpremul__src_over(
25419
    uint8_t* dst_ptr,
25420
    size_t dst_len,
25421
    uint8_t* dst_palette_ptr,
25422
    size_t dst_palette_len,
25423
    const uint8_t* src_ptr,
25424
0
    size_t src_len) {
25425
0
  size_t dst_len3 = dst_len / 3;
25426
0
  size_t src_len4 = src_len / 4;
25427
0
  size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4;
25428
0
  uint8_t* d = dst_ptr;
25429
0
  const uint8_t* s = src_ptr;
25430
0
  size_t n = len;
25431
25432
  // TODO: unroll.
25433
25434
0
  while (n >= 1) {
25435
    // Extract 16-bit color components.
25436
0
    uint32_t dr = 0x101 * ((uint32_t)d[2]);
25437
0
    uint32_t dg = 0x101 * ((uint32_t)d[1]);
25438
0
    uint32_t db = 0x101 * ((uint32_t)d[0]);
25439
0
    uint32_t sa = 0x101 * ((uint32_t)s[3]);
25440
0
    uint32_t sr = 0x101 * ((uint32_t)s[2]);
25441
0
    uint32_t sg = 0x101 * ((uint32_t)s[1]);
25442
0
    uint32_t sb = 0x101 * ((uint32_t)s[0]);
25443
25444
    // Calculate the inverse of the src-alpha: how much of the dst to keep.
25445
0
    uint32_t ia = 0xFFFF - sa;
25446
25447
    // Composite src (nonpremul) over dst (premul).
25448
0
    dr = ((sr * sa) + (dr * ia)) / 0xFFFF;
25449
0
    dg = ((sg * sa) + (dg * ia)) / 0xFFFF;
25450
0
    db = ((sb * sa) + (db * ia)) / 0xFFFF;
25451
25452
    // Convert from 16-bit color to 8-bit color.
25453
0
    d[0] = (uint8_t)(db >> 8);
25454
0
    d[1] = (uint8_t)(dg >> 8);
25455
0
    d[2] = (uint8_t)(dr >> 8);
25456
25457
0
    s += 1 * 4;
25458
0
    d += 1 * 3;
25459
0
    n -= 1;
25460
0
  }
25461
25462
0
  return len;
25463
0
}
25464
25465
static uint64_t  //
25466
wuffs_private_impl__swizzle_bgr__bgra_nonpremul_4x16le__src_over(
25467
    uint8_t* dst_ptr,
25468
    size_t dst_len,
25469
    uint8_t* dst_palette_ptr,
25470
    size_t dst_palette_len,
25471
    const uint8_t* src_ptr,
25472
0
    size_t src_len) {
25473
0
  size_t dst_len3 = dst_len / 3;
25474
0
  size_t src_len8 = src_len / 8;
25475
0
  size_t len = (dst_len3 < src_len8) ? dst_len3 : src_len8;
25476
0
  uint8_t* d = dst_ptr;
25477
0
  const uint8_t* s = src_ptr;
25478
0
  size_t n = len;
25479
25480
  // TODO: unroll.
25481
25482
0
  while (n >= 1) {
25483
    // Extract 16-bit color components.
25484
0
    uint32_t dr = 0x101 * ((uint32_t)d[2]);
25485
0
    uint32_t dg = 0x101 * ((uint32_t)d[1]);
25486
0
    uint32_t db = 0x101 * ((uint32_t)d[0]);
25487
0
    uint32_t sa = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 6));
25488
0
    uint32_t sr = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 4));
25489
0
    uint32_t sg = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 2));
25490
0
    uint32_t sb = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 0));
25491
25492
    // Calculate the inverse of the src-alpha: how much of the dst to keep.
25493
0
    uint32_t ia = 0xFFFF - sa;
25494
25495
    // Composite src (nonpremul) over dst (premul).
25496
0
    dr = ((sr * sa) + (dr * ia)) / 0xFFFF;
25497
0
    dg = ((sg * sa) + (dg * ia)) / 0xFFFF;
25498
0
    db = ((sb * sa) + (db * ia)) / 0xFFFF;
25499
25500
    // Convert from 16-bit color to 8-bit color.
25501
0
    d[0] = (uint8_t)(db >> 8);
25502
0
    d[1] = (uint8_t)(dg >> 8);
25503
0
    d[2] = (uint8_t)(dr >> 8);
25504
25505
0
    s += 1 * 8;
25506
0
    d += 1 * 3;
25507
0
    n -= 1;
25508
0
  }
25509
25510
0
  return len;
25511
0
}
25512
25513
static uint64_t  //
25514
wuffs_private_impl__swizzle_bgr__bgra_premul__src(uint8_t* dst_ptr,
25515
                                                  size_t dst_len,
25516
                                                  uint8_t* dst_palette_ptr,
25517
                                                  size_t dst_palette_len,
25518
                                                  const uint8_t* src_ptr,
25519
0
                                                  size_t src_len) {
25520
0
  size_t dst_len3 = dst_len / 3;
25521
0
  size_t src_len4 = src_len / 4;
25522
0
  size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4;
25523
0
  uint8_t* d = dst_ptr;
25524
0
  const uint8_t* s = src_ptr;
25525
0
  size_t n = len;
25526
25527
0
  while (n >= 1) {
25528
0
    uint8_t s0 = s[0];
25529
0
    uint8_t s1 = s[1];
25530
0
    uint8_t s2 = s[2];
25531
0
    d[0] = s0;
25532
0
    d[1] = s1;
25533
0
    d[2] = s2;
25534
25535
0
    s += 1 * 4;
25536
0
    d += 1 * 3;
25537
0
    n -= 1;
25538
0
  }
25539
25540
0
  return len;
25541
0
}
25542
25543
static uint64_t  //
25544
wuffs_private_impl__swizzle_bgr__bgra_premul__src_over(uint8_t* dst_ptr,
25545
                                                       size_t dst_len,
25546
                                                       uint8_t* dst_palette_ptr,
25547
                                                       size_t dst_palette_len,
25548
                                                       const uint8_t* src_ptr,
25549
0
                                                       size_t src_len) {
25550
0
  size_t dst_len3 = dst_len / 3;
25551
0
  size_t src_len4 = src_len / 4;
25552
0
  size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4;
25553
0
  uint8_t* d = dst_ptr;
25554
0
  const uint8_t* s = src_ptr;
25555
0
  size_t n = len;
25556
25557
0
  while (n >= 1) {
25558
    // Extract 16-bit color components.
25559
0
    uint32_t dr = 0x101 * ((uint32_t)d[2]);
25560
0
    uint32_t dg = 0x101 * ((uint32_t)d[1]);
25561
0
    uint32_t db = 0x101 * ((uint32_t)d[0]);
25562
0
    uint32_t sa = 0x101 * ((uint32_t)s[3]);
25563
0
    uint32_t sr = 0x101 * ((uint32_t)s[2]);
25564
0
    uint32_t sg = 0x101 * ((uint32_t)s[1]);
25565
0
    uint32_t sb = 0x101 * ((uint32_t)s[0]);
25566
25567
    // Calculate the inverse of the src-alpha: how much of the dst to keep.
25568
0
    uint32_t ia = 0xFFFF - sa;
25569
25570
    // Composite src (premul) over dst (premul).
25571
0
    dr = sr + ((dr * ia) / 0xFFFF);
25572
0
    dg = sg + ((dg * ia) / 0xFFFF);
25573
0
    db = sb + ((db * ia) / 0xFFFF);
25574
25575
    // Convert from 16-bit color to 8-bit color.
25576
0
    d[0] = (uint8_t)(db >> 8);
25577
0
    d[1] = (uint8_t)(dg >> 8);
25578
0
    d[2] = (uint8_t)(dr >> 8);
25579
25580
0
    s += 1 * 4;
25581
0
    d += 1 * 3;
25582
0
    n -= 1;
25583
0
  }
25584
25585
0
  return len;
25586
0
}
25587
25588
static uint64_t  //
25589
wuffs_private_impl__swizzle_bgr__rgba_nonpremul__src(uint8_t* dst_ptr,
25590
                                                     size_t dst_len,
25591
                                                     uint8_t* dst_palette_ptr,
25592
                                                     size_t dst_palette_len,
25593
                                                     const uint8_t* src_ptr,
25594
0
                                                     size_t src_len) {
25595
0
  size_t dst_len3 = dst_len / 3;
25596
0
  size_t src_len4 = src_len / 4;
25597
0
  size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4;
25598
0
  uint8_t* d = dst_ptr;
25599
0
  const uint8_t* s = src_ptr;
25600
0
  size_t n = len;
25601
25602
  // TODO: unroll.
25603
25604
0
  while (n >= 1) {
25605
0
    uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr(
25606
0
        wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(
25607
0
            wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))));
25608
0
    wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0);
25609
25610
0
    s += 1 * 4;
25611
0
    d += 1 * 3;
25612
0
    n -= 1;
25613
0
  }
25614
25615
0
  return len;
25616
0
}
25617
25618
static uint64_t  //
25619
wuffs_private_impl__swizzle_bgr__rgba_nonpremul_4x16le__src(
25620
    uint8_t* dst_ptr,
25621
    size_t dst_len,
25622
    uint8_t* dst_palette_ptr,
25623
    size_t dst_palette_len,
25624
    const uint8_t* src_ptr,
25625
0
    size_t src_len) {
25626
0
  size_t dst_len3 = dst_len / 3;
25627
0
  size_t src_len8 = src_len / 8;
25628
0
  size_t len = (dst_len3 < src_len8) ? dst_len3 : src_len8;
25629
0
  uint8_t* d = dst_ptr;
25630
0
  const uint8_t* s = src_ptr;
25631
0
  size_t n = len;
25632
25633
  // TODO: unroll.
25634
25635
0
  while (n >= 1) {
25636
0
    uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr(
25637
0
        wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul(
25638
0
            wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8))));
25639
0
    wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0);
25640
25641
0
    s += 1 * 8;
25642
0
    d += 1 * 3;
25643
0
    n -= 1;
25644
0
  }
25645
25646
0
  return len;
25647
0
}
25648
25649
static uint64_t  //
25650
wuffs_private_impl__swizzle_bgr__rgba_nonpremul__src_over(
25651
    uint8_t* dst_ptr,
25652
    size_t dst_len,
25653
    uint8_t* dst_palette_ptr,
25654
    size_t dst_palette_len,
25655
    const uint8_t* src_ptr,
25656
0
    size_t src_len) {
25657
0
  size_t dst_len3 = dst_len / 3;
25658
0
  size_t src_len4 = src_len / 4;
25659
0
  size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4;
25660
0
  uint8_t* d = dst_ptr;
25661
0
  const uint8_t* s = src_ptr;
25662
0
  size_t n = len;
25663
25664
  // TODO: unroll.
25665
25666
0
  while (n >= 1) {
25667
    // Extract 16-bit color components.
25668
0
    uint32_t dr = 0x101 * ((uint32_t)d[2]);
25669
0
    uint32_t dg = 0x101 * ((uint32_t)d[1]);
25670
0
    uint32_t db = 0x101 * ((uint32_t)d[0]);
25671
0
    uint32_t sa = 0x101 * ((uint32_t)s[3]);
25672
0
    uint32_t sb = 0x101 * ((uint32_t)s[2]);
25673
0
    uint32_t sg = 0x101 * ((uint32_t)s[1]);
25674
0
    uint32_t sr = 0x101 * ((uint32_t)s[0]);
25675
25676
    // Calculate the inverse of the src-alpha: how much of the dst to keep.
25677
0
    uint32_t ia = 0xFFFF - sa;
25678
25679
    // Composite src (nonpremul) over dst (premul).
25680
0
    dr = ((sr * sa) + (dr * ia)) / 0xFFFF;
25681
0
    dg = ((sg * sa) + (dg * ia)) / 0xFFFF;
25682
0
    db = ((sb * sa) + (db * ia)) / 0xFFFF;
25683
25684
    // Convert from 16-bit color to 8-bit color.
25685
0
    d[0] = (uint8_t)(db >> 8);
25686
0
    d[1] = (uint8_t)(dg >> 8);
25687
0
    d[2] = (uint8_t)(dr >> 8);
25688
25689
0
    s += 1 * 4;
25690
0
    d += 1 * 3;
25691
0
    n -= 1;
25692
0
  }
25693
25694
0
  return len;
25695
0
}
25696
25697
static uint64_t  //
25698
wuffs_private_impl__swizzle_bgr__rgba_nonpremul_4x16le__src_over(
25699
    uint8_t* dst_ptr,
25700
    size_t dst_len,
25701
    uint8_t* dst_palette_ptr,
25702
    size_t dst_palette_len,
25703
    const uint8_t* src_ptr,
25704
0
    size_t src_len) {
25705
0
  size_t dst_len3 = dst_len / 3;
25706
0
  size_t src_len8 = src_len / 8;
25707
0
  size_t len = (dst_len3 < src_len8) ? dst_len3 : src_len8;
25708
0
  uint8_t* d = dst_ptr;
25709
0
  const uint8_t* s = src_ptr;
25710
0
  size_t n = len;
25711
25712
  // TODO: unroll.
25713
25714
0
  while (n >= 1) {
25715
    // Extract 16-bit color components.
25716
0
    uint32_t dr = 0x101 * ((uint32_t)d[2]);
25717
0
    uint32_t dg = 0x101 * ((uint32_t)d[1]);
25718
0
    uint32_t db = 0x101 * ((uint32_t)d[0]);
25719
0
    uint32_t sa = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 6));
25720
0
    uint32_t sb = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 4));
25721
0
    uint32_t sg = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 2));
25722
0
    uint32_t sr = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 0));
25723
25724
    // Calculate the inverse of the src-alpha: how much of the dst to keep.
25725
0
    uint32_t ia = 0xFFFF - sa;
25726
25727
    // Composite src (nonpremul) over dst (premul).
25728
0
    dr = ((sr * sa) + (dr * ia)) / 0xFFFF;
25729
0
    dg = ((sg * sa) + (dg * ia)) / 0xFFFF;
25730
0
    db = ((sb * sa) + (db * ia)) / 0xFFFF;
25731
25732
    // Convert from 16-bit color to 8-bit color.
25733
0
    d[0] = (uint8_t)(db >> 8);
25734
0
    d[1] = (uint8_t)(dg >> 8);
25735
0
    d[2] = (uint8_t)(dr >> 8);
25736
25737
0
    s += 1 * 8;
25738
0
    d += 1 * 3;
25739
0
    n -= 1;
25740
0
  }
25741
25742
0
  return len;
25743
0
}
25744
25745
static uint64_t  //
25746
wuffs_private_impl__swizzle_bgr__rgba_premul__src(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_len3 = dst_len / 3;
25753
0
  size_t src_len4 = src_len / 4;
25754
0
  size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4;
25755
0
  uint8_t* d = dst_ptr;
25756
0
  const uint8_t* s = src_ptr;
25757
0
  size_t n = len;
25758
25759
0
  while (n >= 1) {
25760
0
    uint8_t s0 = s[0];
25761
0
    uint8_t s1 = s[1];
25762
0
    uint8_t s2 = s[2];
25763
0
    d[0] = s2;
25764
0
    d[1] = s1;
25765
0
    d[2] = s0;
25766
25767
0
    s += 1 * 4;
25768
0
    d += 1 * 3;
25769
0
    n -= 1;
25770
0
  }
25771
25772
0
  return len;
25773
0
}
25774
25775
static uint64_t  //
25776
wuffs_private_impl__swizzle_bgr__rgba_premul__src_over(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_len3 = dst_len / 3;
25783
0
  size_t src_len4 = src_len / 4;
25784
0
  size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4;
25785
0
  uint8_t* d = dst_ptr;
25786
0
  const uint8_t* s = src_ptr;
25787
0
  size_t n = len;
25788
25789
0
  while (n >= 1) {
25790
    // Extract 16-bit color components.
25791
0
    uint32_t dr = 0x101 * ((uint32_t)d[2]);
25792
0
    uint32_t dg = 0x101 * ((uint32_t)d[1]);
25793
0
    uint32_t db = 0x101 * ((uint32_t)d[0]);
25794
0
    uint32_t sa = 0x101 * ((uint32_t)s[3]);
25795
0
    uint32_t sb = 0x101 * ((uint32_t)s[2]);
25796
0
    uint32_t sg = 0x101 * ((uint32_t)s[1]);
25797
0
    uint32_t sr = 0x101 * ((uint32_t)s[0]);
25798
25799
    // Calculate the inverse of the src-alpha: how much of the dst to keep.
25800
0
    uint32_t ia = 0xFFFF - sa;
25801
25802
    // Composite src (premul) over dst (premul).
25803
0
    dr = sr + ((dr * ia) / 0xFFFF);
25804
0
    dg = sg + ((dg * ia) / 0xFFFF);
25805
0
    db = sb + ((db * ia) / 0xFFFF);
25806
25807
    // Convert from 16-bit color to 8-bit color.
25808
0
    d[0] = (uint8_t)(db >> 8);
25809
0
    d[1] = (uint8_t)(dg >> 8);
25810
0
    d[2] = (uint8_t)(dr >> 8);
25811
25812
0
    s += 1 * 4;
25813
0
    d += 1 * 3;
25814
0
    n -= 1;
25815
0
  }
25816
25817
0
  return len;
25818
0
}
25819
25820
static uint64_t  //
25821
wuffs_private_impl__swizzle_bgr__rgbx(uint8_t* dst_ptr,
25822
                                      size_t dst_len,
25823
                                      uint8_t* dst_palette_ptr,
25824
                                      size_t dst_palette_len,
25825
                                      const uint8_t* src_ptr,
25826
0
                                      size_t src_len) {
25827
0
  size_t dst_len3 = dst_len / 3;
25828
0
  size_t src_len4 = src_len / 4;
25829
0
  size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4;
25830
0
  uint8_t* d = dst_ptr;
25831
0
  const uint8_t* s = src_ptr;
25832
0
  size_t n = len;
25833
25834
  // TODO: unroll.
25835
25836
0
  while (n >= 1) {
25837
0
    uint8_t b0 = s[0];
25838
0
    uint8_t b1 = s[1];
25839
0
    uint8_t b2 = s[2];
25840
0
    d[0] = b2;
25841
0
    d[1] = b1;
25842
0
    d[2] = b0;
25843
25844
0
    s += 1 * 4;
25845
0
    d += 1 * 3;
25846
0
    n -= 1;
25847
0
  }
25848
25849
0
  return len;
25850
0
}
25851
25852
// --------
25853
25854
static uint64_t  //
25855
wuffs_private_impl__swizzle_bgra_nonpremul__bgra_nonpremul__src_over(
25856
    uint8_t* dst_ptr,
25857
    size_t dst_len,
25858
    uint8_t* dst_palette_ptr,
25859
    size_t dst_palette_len,
25860
    const uint8_t* src_ptr,
25861
0
    size_t src_len) {
25862
0
  size_t dst_len4 = dst_len / 4;
25863
0
  size_t src_len4 = src_len / 4;
25864
0
  size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
25865
0
  uint8_t* d = dst_ptr;
25866
0
  const uint8_t* s = src_ptr;
25867
0
  size_t n = len;
25868
25869
0
  while (n >= 1) {
25870
0
    uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4));
25871
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4));
25872
0
    wuffs_base__poke_u32le__no_bounds_check(
25873
0
        d + (0 * 4),
25874
0
        wuffs_private_impl__composite_nonpremul_nonpremul_u32_axxx(d0, s0));
25875
25876
0
    s += 1 * 4;
25877
0
    d += 1 * 4;
25878
0
    n -= 1;
25879
0
  }
25880
25881
0
  return len;
25882
0
}
25883
25884
static uint64_t  //
25885
wuffs_private_impl__swizzle_bgra_nonpremul__bgra_nonpremul_4x16le__src(
25886
    uint8_t* dst_ptr,
25887
    size_t dst_len,
25888
    uint8_t* dst_palette_ptr,
25889
    size_t dst_palette_len,
25890
    const uint8_t* src_ptr,
25891
0
    size_t src_len) {
25892
0
  size_t dst_len4 = dst_len / 4;
25893
0
  size_t src_len8 = src_len / 8;
25894
0
  size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8;
25895
0
  uint8_t* d = dst_ptr;
25896
0
  const uint8_t* s = src_ptr;
25897
25898
0
  size_t n = len;
25899
0
  while (n >= 1) {
25900
0
    wuffs_base__poke_u32le__no_bounds_check(
25901
0
        d + (0 * 4), wuffs_base__color_u64__as__color_u32(
25902
0
                         wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8))));
25903
25904
0
    s += 1 * 8;
25905
0
    d += 1 * 4;
25906
0
    n -= 1;
25907
0
  }
25908
0
  return len;
25909
0
}
25910
25911
static uint64_t  //
25912
wuffs_private_impl__swizzle_bgra_nonpremul__bgra_nonpremul_4x16le__src_over(
25913
    uint8_t* dst_ptr,
25914
    size_t dst_len,
25915
    uint8_t* dst_palette_ptr,
25916
    size_t dst_palette_len,
25917
    const uint8_t* src_ptr,
25918
0
    size_t src_len) {
25919
0
  size_t dst_len4 = dst_len / 4;
25920
0
  size_t src_len8 = src_len / 8;
25921
0
  size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8;
25922
0
  uint8_t* d = dst_ptr;
25923
0
  const uint8_t* s = src_ptr;
25924
0
  size_t n = len;
25925
25926
0
  while (n >= 1) {
25927
0
    uint64_t d0 = wuffs_base__color_u32__as__color_u64(
25928
0
        wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)));
25929
0
    uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8));
25930
0
    wuffs_base__poke_u32le__no_bounds_check(
25931
0
        d + (0 * 4),
25932
0
        wuffs_base__color_u64__as__color_u32(
25933
0
            wuffs_private_impl__composite_nonpremul_nonpremul_u64_axxx(d0,
25934
0
                                                                       s0)));
25935
25936
0
    s += 1 * 8;
25937
0
    d += 1 * 4;
25938
0
    n -= 1;
25939
0
  }
25940
25941
0
  return len;
25942
0
}
25943
25944
static uint64_t  //
25945
wuffs_private_impl__swizzle_bgra_nonpremul__bgra_premul__src(
25946
    uint8_t* dst_ptr,
25947
    size_t dst_len,
25948
    uint8_t* dst_palette_ptr,
25949
    size_t dst_palette_len,
25950
    const uint8_t* src_ptr,
25951
0
    size_t src_len) {
25952
0
  size_t dst_len4 = dst_len / 4;
25953
0
  size_t src_len4 = src_len / 4;
25954
0
  size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
25955
0
  uint8_t* d = dst_ptr;
25956
0
  const uint8_t* s = src_ptr;
25957
0
  size_t n = len;
25958
25959
0
  while (n >= 1) {
25960
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4));
25961
0
    wuffs_base__poke_u32le__no_bounds_check(
25962
0
        d + (0 * 4),
25963
0
        wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul(s0));
25964
25965
0
    s += 1 * 4;
25966
0
    d += 1 * 4;
25967
0
    n -= 1;
25968
0
  }
25969
25970
0
  return len;
25971
0
}
25972
25973
static uint64_t  //
25974
wuffs_private_impl__swizzle_bgra_nonpremul__bgra_premul__src_over(
25975
    uint8_t* dst_ptr,
25976
    size_t dst_len,
25977
    uint8_t* dst_palette_ptr,
25978
    size_t dst_palette_len,
25979
    const uint8_t* src_ptr,
25980
0
    size_t src_len) {
25981
0
  size_t dst_len4 = dst_len / 4;
25982
0
  size_t src_len4 = src_len / 4;
25983
0
  size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
25984
0
  uint8_t* d = dst_ptr;
25985
0
  const uint8_t* s = src_ptr;
25986
0
  size_t n = len;
25987
25988
0
  while (n >= 1) {
25989
0
    uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4));
25990
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4));
25991
0
    wuffs_base__poke_u32le__no_bounds_check(
25992
0
        d + (0 * 4),
25993
0
        wuffs_private_impl__composite_nonpremul_premul_u32_axxx(d0, s0));
25994
25995
0
    s += 1 * 4;
25996
0
    d += 1 * 4;
25997
0
    n -= 1;
25998
0
  }
25999
26000
0
  return len;
26001
0
}
26002
26003
static uint64_t  //
26004
wuffs_private_impl__swizzle_bgra_nonpremul__index_bgra_nonpremul__src_over(
26005
    uint8_t* dst_ptr,
26006
    size_t dst_len,
26007
    uint8_t* dst_palette_ptr,
26008
    size_t dst_palette_len,
26009
    const uint8_t* src_ptr,
26010
0
    size_t src_len) {
26011
0
  if (dst_palette_len !=
26012
0
      WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
26013
0
    return 0;
26014
0
  }
26015
0
  size_t dst_len4 = dst_len / 4;
26016
0
  size_t len = (dst_len4 < src_len) ? dst_len4 : src_len;
26017
0
  uint8_t* d = dst_ptr;
26018
0
  const uint8_t* s = src_ptr;
26019
0
  size_t n = len;
26020
26021
  // TODO: unroll.
26022
26023
0
  while (n >= 1) {
26024
0
    uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4));
26025
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
26026
0
                                                          ((size_t)s[0] * 4));
26027
0
    wuffs_base__poke_u32le__no_bounds_check(
26028
0
        d + (0 * 4),
26029
0
        wuffs_private_impl__composite_nonpremul_nonpremul_u32_axxx(d0, s0));
26030
26031
0
    s += 1 * 1;
26032
0
    d += 1 * 4;
26033
0
    n -= 1;
26034
0
  }
26035
26036
0
  return len;
26037
0
}
26038
26039
static uint64_t  //
26040
wuffs_private_impl__swizzle_bgra_nonpremul__rgba_nonpremul__src_over(
26041
    uint8_t* dst_ptr,
26042
    size_t dst_len,
26043
    uint8_t* dst_palette_ptr,
26044
    size_t dst_palette_len,
26045
    const uint8_t* src_ptr,
26046
0
    size_t src_len) {
26047
0
  size_t dst_len4 = dst_len / 4;
26048
0
  size_t src_len4 = src_len / 4;
26049
0
  size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
26050
0
  uint8_t* d = dst_ptr;
26051
0
  const uint8_t* s = src_ptr;
26052
0
  size_t n = len;
26053
26054
0
  while (n >= 1) {
26055
0
    uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4));
26056
0
    uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr(
26057
0
        wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
26058
0
    wuffs_base__poke_u32le__no_bounds_check(
26059
0
        d + (0 * 4),
26060
0
        wuffs_private_impl__composite_nonpremul_nonpremul_u32_axxx(d0, s0));
26061
26062
0
    s += 1 * 4;
26063
0
    d += 1 * 4;
26064
0
    n -= 1;
26065
0
  }
26066
26067
0
  return len;
26068
0
}
26069
26070
static uint64_t  //
26071
wuffs_private_impl__swizzle_bgra_nonpremul__rgba_premul__src(
26072
    uint8_t* dst_ptr,
26073
    size_t dst_len,
26074
    uint8_t* dst_palette_ptr,
26075
    size_t dst_palette_len,
26076
    const uint8_t* src_ptr,
26077
0
    size_t src_len) {
26078
0
  size_t dst_len4 = dst_len / 4;
26079
0
  size_t src_len4 = src_len / 4;
26080
0
  size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
26081
0
  uint8_t* d = dst_ptr;
26082
0
  const uint8_t* s = src_ptr;
26083
0
  size_t n = len;
26084
26085
0
  while (n >= 1) {
26086
0
    uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr(
26087
0
        wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
26088
0
    wuffs_base__poke_u32le__no_bounds_check(
26089
0
        d + (0 * 4),
26090
0
        wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul(s0));
26091
26092
0
    s += 1 * 4;
26093
0
    d += 1 * 4;
26094
0
    n -= 1;
26095
0
  }
26096
26097
0
  return len;
26098
0
}
26099
26100
static uint64_t  //
26101
wuffs_private_impl__swizzle_bgra_nonpremul__rgba_premul__src_over(
26102
    uint8_t* dst_ptr,
26103
    size_t dst_len,
26104
    uint8_t* dst_palette_ptr,
26105
    size_t dst_palette_len,
26106
    const uint8_t* src_ptr,
26107
0
    size_t src_len) {
26108
0
  size_t dst_len4 = dst_len / 4;
26109
0
  size_t src_len4 = src_len / 4;
26110
0
  size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
26111
0
  uint8_t* d = dst_ptr;
26112
0
  const uint8_t* s = src_ptr;
26113
0
  size_t n = len;
26114
26115
0
  while (n >= 1) {
26116
0
    uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4));
26117
0
    uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr(
26118
0
        wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
26119
0
    wuffs_base__poke_u32le__no_bounds_check(
26120
0
        d + (0 * 4),
26121
0
        wuffs_private_impl__composite_nonpremul_premul_u32_axxx(d0, s0));
26122
26123
0
    s += 1 * 4;
26124
0
    d += 1 * 4;
26125
0
    n -= 1;
26126
0
  }
26127
26128
0
  return len;
26129
0
}
26130
26131
static uint64_t  //
26132
wuffs_private_impl__swizzle_bgra_nonpremul__ya_nonpremul__src(
26133
    uint8_t* dst_ptr,
26134
    size_t dst_len,
26135
    uint8_t* dst_palette_ptr,
26136
    size_t dst_palette_len,
26137
    const uint8_t* src_ptr,
26138
0
    size_t src_len) {
26139
0
  size_t dst_len4 = dst_len / 4;
26140
0
  size_t src_len2 = src_len / 2;
26141
0
  size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2;
26142
0
  uint8_t* d = dst_ptr;
26143
0
  const uint8_t* s = src_ptr;
26144
0
  size_t n = len;
26145
26146
  // TODO: unroll.
26147
26148
0
  while (n >= 1) {
26149
0
    uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101);
26150
0
    wuffs_base__poke_u32le__no_bounds_check(d + (0 * 4), s0);
26151
26152
0
    s += 1 * 2;
26153
0
    d += 1 * 4;
26154
0
    n -= 1;
26155
0
  }
26156
26157
0
  return len;
26158
0
}
26159
26160
static uint64_t  //
26161
wuffs_private_impl__swizzle_bgra_nonpremul__ya_nonpremul__src_over(
26162
    uint8_t* dst_ptr,
26163
    size_t dst_len,
26164
    uint8_t* dst_palette_ptr,
26165
    size_t dst_palette_len,
26166
    const uint8_t* src_ptr,
26167
0
    size_t src_len) {
26168
0
  size_t dst_len4 = dst_len / 4;
26169
0
  size_t src_len2 = src_len / 2;
26170
0
  size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2;
26171
0
  uint8_t* d = dst_ptr;
26172
0
  const uint8_t* s = src_ptr;
26173
0
  size_t n = len;
26174
26175
  // TODO: unroll.
26176
26177
0
  while (n >= 1) {
26178
0
    uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4));
26179
0
    uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101);
26180
0
    wuffs_base__poke_u32le__no_bounds_check(
26181
0
        d + (0 * 4),
26182
0
        wuffs_private_impl__composite_nonpremul_nonpremul_u32_axxx(d0, s0));
26183
26184
0
    s += 1 * 2;
26185
0
    d += 1 * 4;
26186
0
    n -= 1;
26187
0
  }
26188
26189
0
  return len;
26190
0
}
26191
26192
// --------
26193
26194
static uint64_t  //
26195
wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_nonpremul__src(
26196
    uint8_t* dst_ptr,
26197
    size_t dst_len,
26198
    uint8_t* dst_palette_ptr,
26199
    size_t dst_palette_len,
26200
    const uint8_t* src_ptr,
26201
0
    size_t src_len) {
26202
0
  size_t dst_len8 = dst_len / 8;
26203
0
  size_t src_len4 = src_len / 4;
26204
0
  size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4;
26205
0
  uint8_t* d = dst_ptr;
26206
0
  const uint8_t* s = src_ptr;
26207
26208
0
  size_t n = len;
26209
0
  while (n >= 1) {
26210
0
    uint8_t s0 = s[0];
26211
0
    uint8_t s1 = s[1];
26212
0
    uint8_t s2 = s[2];
26213
0
    uint8_t s3 = s[3];
26214
0
    d[0] = s0;
26215
0
    d[1] = s0;
26216
0
    d[2] = s1;
26217
0
    d[3] = s1;
26218
0
    d[4] = s2;
26219
0
    d[5] = s2;
26220
0
    d[6] = s3;
26221
0
    d[7] = s3;
26222
26223
0
    s += 1 * 4;
26224
0
    d += 1 * 8;
26225
0
    n -= 1;
26226
0
  }
26227
0
  return len;
26228
0
}
26229
26230
static uint64_t  //
26231
wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_nonpremul__src_over(
26232
    uint8_t* dst_ptr,
26233
    size_t dst_len,
26234
    uint8_t* dst_palette_ptr,
26235
    size_t dst_palette_len,
26236
    const uint8_t* src_ptr,
26237
0
    size_t src_len) {
26238
0
  size_t dst_len8 = dst_len / 8;
26239
0
  size_t src_len4 = src_len / 4;
26240
0
  size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4;
26241
0
  uint8_t* d = dst_ptr;
26242
0
  const uint8_t* s = src_ptr;
26243
26244
0
  size_t n = len;
26245
0
  while (n >= 1) {
26246
0
    uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8));
26247
0
    uint64_t s0 = wuffs_base__color_u32__as__color_u64(
26248
0
        wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
26249
0
    wuffs_base__poke_u64le__no_bounds_check(
26250
0
        d + (0 * 8),
26251
0
        wuffs_private_impl__composite_nonpremul_nonpremul_u64_axxx(d0, s0));
26252
26253
0
    s += 1 * 4;
26254
0
    d += 1 * 8;
26255
0
    n -= 1;
26256
0
  }
26257
0
  return len;
26258
0
}
26259
26260
static uint64_t  //
26261
wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_nonpremul_4x16le__src_over(
26262
    uint8_t* dst_ptr,
26263
    size_t dst_len,
26264
    uint8_t* dst_palette_ptr,
26265
    size_t dst_palette_len,
26266
    const uint8_t* src_ptr,
26267
0
    size_t src_len) {
26268
0
  size_t dst_len8 = dst_len / 8;
26269
0
  size_t src_len8 = src_len / 8;
26270
0
  size_t len = (dst_len8 < src_len8) ? dst_len8 : src_len8;
26271
0
  uint8_t* d = dst_ptr;
26272
0
  const uint8_t* s = src_ptr;
26273
26274
0
  size_t n = len;
26275
0
  while (n >= 1) {
26276
0
    uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8));
26277
0
    uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8));
26278
0
    wuffs_base__poke_u64le__no_bounds_check(
26279
0
        d + (0 * 8),
26280
0
        wuffs_private_impl__composite_nonpremul_nonpremul_u64_axxx(d0, s0));
26281
26282
0
    s += 1 * 8;
26283
0
    d += 1 * 8;
26284
0
    n -= 1;
26285
0
  }
26286
0
  return len;
26287
0
}
26288
26289
static uint64_t  //
26290
wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_premul__src(
26291
    uint8_t* dst_ptr,
26292
    size_t dst_len,
26293
    uint8_t* dst_palette_ptr,
26294
    size_t dst_palette_len,
26295
    const uint8_t* src_ptr,
26296
0
    size_t src_len) {
26297
0
  size_t dst_len8 = dst_len / 8;
26298
0
  size_t src_len4 = src_len / 4;
26299
0
  size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4;
26300
0
  uint8_t* d = dst_ptr;
26301
0
  const uint8_t* s = src_ptr;
26302
26303
0
  size_t n = len;
26304
0
  while (n >= 1) {
26305
0
    uint64_t s0 = wuffs_base__color_u32__as__color_u64(
26306
0
        wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul(
26307
0
            wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))));
26308
0
    wuffs_base__poke_u64le__no_bounds_check(d + (0 * 8), s0);
26309
26310
0
    s += 1 * 4;
26311
0
    d += 1 * 8;
26312
0
    n -= 1;
26313
0
  }
26314
0
  return len;
26315
0
}
26316
26317
static uint64_t  //
26318
wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_premul__src_over(
26319
    uint8_t* dst_ptr,
26320
    size_t dst_len,
26321
    uint8_t* dst_palette_ptr,
26322
    size_t dst_palette_len,
26323
    const uint8_t* src_ptr,
26324
0
    size_t src_len) {
26325
0
  size_t dst_len8 = dst_len / 8;
26326
0
  size_t src_len4 = src_len / 4;
26327
0
  size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4;
26328
0
  uint8_t* d = dst_ptr;
26329
0
  const uint8_t* s = src_ptr;
26330
26331
0
  size_t n = len;
26332
0
  while (n >= 1) {
26333
0
    uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8));
26334
0
    uint64_t s0 = wuffs_base__color_u32__as__color_u64(
26335
0
        wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
26336
0
    wuffs_base__poke_u64le__no_bounds_check(
26337
0
        d + (0 * 8),
26338
0
        wuffs_private_impl__composite_nonpremul_premul_u64_axxx(d0, s0));
26339
26340
0
    s += 1 * 4;
26341
0
    d += 1 * 8;
26342
0
    n -= 1;
26343
0
  }
26344
0
  return len;
26345
0
}
26346
26347
static uint64_t  //
26348
wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__index_bgra_nonpremul__src_over(
26349
    uint8_t* dst_ptr,
26350
    size_t dst_len,
26351
    uint8_t* dst_palette_ptr,
26352
    size_t dst_palette_len,
26353
    const uint8_t* src_ptr,
26354
0
    size_t src_len) {
26355
0
  if (dst_palette_len !=
26356
0
      WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
26357
0
    return 0;
26358
0
  }
26359
0
  size_t dst_len8 = dst_len / 8;
26360
0
  size_t len = (dst_len8 < src_len) ? dst_len8 : src_len;
26361
0
  uint8_t* d = dst_ptr;
26362
0
  const uint8_t* s = src_ptr;
26363
0
  size_t n = len;
26364
26365
0
  while (n >= 1) {
26366
0
    uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8));
26367
0
    uint64_t s0 = wuffs_base__color_u32__as__color_u64(
26368
0
        wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
26369
0
                                                ((size_t)s[0] * 4)));
26370
0
    wuffs_base__poke_u64le__no_bounds_check(
26371
0
        d + (0 * 8),
26372
0
        wuffs_private_impl__composite_nonpremul_nonpremul_u64_axxx(d0, s0));
26373
26374
0
    s += 1 * 1;
26375
0
    d += 1 * 8;
26376
0
    n -= 1;
26377
0
  }
26378
26379
0
  return len;
26380
0
}
26381
26382
static uint64_t  //
26383
wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__rgba_nonpremul__src(
26384
    uint8_t* dst_ptr,
26385
    size_t dst_len,
26386
    uint8_t* dst_palette_ptr,
26387
    size_t dst_palette_len,
26388
    const uint8_t* src_ptr,
26389
0
    size_t src_len) {
26390
0
  size_t dst_len8 = dst_len / 8;
26391
0
  size_t src_len4 = src_len / 4;
26392
0
  size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4;
26393
0
  uint8_t* d = dst_ptr;
26394
0
  const uint8_t* s = src_ptr;
26395
26396
0
  size_t n = len;
26397
0
  while (n >= 1) {
26398
0
    uint8_t s0 = s[0];
26399
0
    uint8_t s1 = s[1];
26400
0
    uint8_t s2 = s[2];
26401
0
    uint8_t s3 = s[3];
26402
0
    d[0] = s2;
26403
0
    d[1] = s2;
26404
0
    d[2] = s1;
26405
0
    d[3] = s1;
26406
0
    d[4] = s0;
26407
0
    d[5] = s0;
26408
0
    d[6] = s3;
26409
0
    d[7] = s3;
26410
26411
0
    s += 1 * 4;
26412
0
    d += 1 * 8;
26413
0
    n -= 1;
26414
0
  }
26415
0
  return len;
26416
0
}
26417
26418
static uint64_t  //
26419
wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__rgba_nonpremul__src_over(
26420
    uint8_t* dst_ptr,
26421
    size_t dst_len,
26422
    uint8_t* dst_palette_ptr,
26423
    size_t dst_palette_len,
26424
    const uint8_t* src_ptr,
26425
0
    size_t src_len) {
26426
0
  size_t dst_len8 = dst_len / 8;
26427
0
  size_t src_len4 = src_len / 4;
26428
0
  size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4;
26429
0
  uint8_t* d = dst_ptr;
26430
0
  const uint8_t* s = src_ptr;
26431
26432
0
  size_t n = len;
26433
0
  while (n >= 1) {
26434
0
    uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8));
26435
0
    uint64_t s0 = wuffs_base__color_u32__as__color_u64(
26436
0
        wuffs_private_impl__swap_u32_argb_abgr(
26437
0
            wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))));
26438
0
    wuffs_base__poke_u64le__no_bounds_check(
26439
0
        d + (0 * 8),
26440
0
        wuffs_private_impl__composite_nonpremul_nonpremul_u64_axxx(d0, s0));
26441
26442
0
    s += 1 * 4;
26443
0
    d += 1 * 8;
26444
0
    n -= 1;
26445
0
  }
26446
0
  return len;
26447
0
}
26448
26449
static uint64_t  //
26450
wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__rgba_premul__src(
26451
    uint8_t* dst_ptr,
26452
    size_t dst_len,
26453
    uint8_t* dst_palette_ptr,
26454
    size_t dst_palette_len,
26455
    const uint8_t* src_ptr,
26456
0
    size_t src_len) {
26457
0
  size_t dst_len8 = dst_len / 8;
26458
0
  size_t src_len4 = src_len / 4;
26459
0
  size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4;
26460
0
  uint8_t* d = dst_ptr;
26461
0
  const uint8_t* s = src_ptr;
26462
26463
0
  size_t n = len;
26464
0
  while (n >= 1) {
26465
0
    uint64_t s0 = wuffs_base__color_u32__as__color_u64(
26466
0
        wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul(
26467
0
            wuffs_private_impl__swap_u32_argb_abgr(
26468
0
                wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))));
26469
0
    wuffs_base__poke_u64le__no_bounds_check(d + (0 * 8), s0);
26470
26471
0
    s += 1 * 4;
26472
0
    d += 1 * 8;
26473
0
    n -= 1;
26474
0
  }
26475
0
  return len;
26476
0
}
26477
26478
static uint64_t  //
26479
wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__rgba_premul__src_over(
26480
    uint8_t* dst_ptr,
26481
    size_t dst_len,
26482
    uint8_t* dst_palette_ptr,
26483
    size_t dst_palette_len,
26484
    const uint8_t* src_ptr,
26485
0
    size_t src_len) {
26486
0
  size_t dst_len8 = dst_len / 8;
26487
0
  size_t src_len4 = src_len / 4;
26488
0
  size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4;
26489
0
  uint8_t* d = dst_ptr;
26490
0
  const uint8_t* s = src_ptr;
26491
26492
0
  size_t n = len;
26493
0
  while (n >= 1) {
26494
0
    uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8));
26495
0
    uint64_t s0 = wuffs_base__color_u32__as__color_u64(
26496
0
        wuffs_private_impl__swap_u32_argb_abgr(
26497
0
            wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))));
26498
0
    wuffs_base__poke_u64le__no_bounds_check(
26499
0
        d + (0 * 8),
26500
0
        wuffs_private_impl__composite_nonpremul_premul_u64_axxx(d0, s0));
26501
26502
0
    s += 1 * 4;
26503
0
    d += 1 * 8;
26504
0
    n -= 1;
26505
0
  }
26506
0
  return len;
26507
0
}
26508
26509
static uint64_t  //
26510
wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__ya_nonpremul__src(
26511
    uint8_t* dst_ptr,
26512
    size_t dst_len,
26513
    uint8_t* dst_palette_ptr,
26514
    size_t dst_palette_len,
26515
    const uint8_t* src_ptr,
26516
0
    size_t src_len) {
26517
0
  size_t dst_len8 = dst_len / 8;
26518
0
  size_t src_len2 = src_len / 2;
26519
0
  size_t len = (dst_len8 < src_len2) ? dst_len8 : src_len2;
26520
0
  uint8_t* d = dst_ptr;
26521
0
  const uint8_t* s = src_ptr;
26522
26523
0
  size_t n = len;
26524
0
  while (n >= 1) {
26525
0
    uint64_t s0 = ((uint64_t)(s[1]) * 0x0101000000000000) |
26526
0
                  ((uint64_t)(s[0]) * 0x0000010101010101);
26527
0
    wuffs_base__poke_u64le__no_bounds_check(d + (0 * 8), s0);
26528
26529
0
    s += 1 * 2;
26530
0
    d += 1 * 8;
26531
0
    n -= 1;
26532
0
  }
26533
0
  return len;
26534
0
}
26535
26536
static uint64_t  //
26537
wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__ya_nonpremul__src_over(
26538
    uint8_t* dst_ptr,
26539
    size_t dst_len,
26540
    uint8_t* dst_palette_ptr,
26541
    size_t dst_palette_len,
26542
    const uint8_t* src_ptr,
26543
0
    size_t src_len) {
26544
0
  size_t dst_len8 = dst_len / 8;
26545
0
  size_t src_len2 = src_len / 2;
26546
0
  size_t len = (dst_len8 < src_len2) ? dst_len8 : src_len2;
26547
0
  uint8_t* d = dst_ptr;
26548
0
  const uint8_t* s = src_ptr;
26549
26550
0
  size_t n = len;
26551
0
  while (n >= 1) {
26552
0
    uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8));
26553
0
    uint64_t s0 = ((uint64_t)(s[1]) * 0x0101000000000000) |
26554
0
                  ((uint64_t)(s[0]) * 0x0000010101010101);
26555
0
    wuffs_base__poke_u64le__no_bounds_check(
26556
0
        d + (0 * 8),
26557
0
        wuffs_private_impl__composite_nonpremul_nonpremul_u64_axxx(d0, s0));
26558
26559
0
    s += 1 * 2;
26560
0
    d += 1 * 8;
26561
0
    n -= 1;
26562
0
  }
26563
0
  return len;
26564
0
}
26565
26566
// --------
26567
26568
static uint64_t  //
26569
wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul__src(
26570
    uint8_t* dst_ptr,
26571
    size_t dst_len,
26572
    uint8_t* dst_palette_ptr,
26573
    size_t dst_palette_len,
26574
    const uint8_t* src_ptr,
26575
5.58M
    size_t src_len) {
26576
5.58M
  size_t dst_len4 = dst_len / 4;
26577
5.58M
  size_t src_len4 = src_len / 4;
26578
5.58M
  size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
26579
5.58M
  uint8_t* d = dst_ptr;
26580
5.58M
  const uint8_t* s = src_ptr;
26581
5.58M
  size_t n = len;
26582
26583
  // TODO: unroll.
26584
26585
11.2M
  while (n >= 1) {
26586
5.61M
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4));
26587
5.61M
    wuffs_base__poke_u32le__no_bounds_check(
26588
5.61M
        d + (0 * 4),
26589
5.61M
        wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(s0));
26590
26591
5.61M
    s += 1 * 4;
26592
5.61M
    d += 1 * 4;
26593
5.61M
    n -= 1;
26594
5.61M
  }
26595
26596
5.58M
  return len;
26597
5.58M
}
26598
26599
static uint64_t  //
26600
wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul_4x16le__src(
26601
    uint8_t* dst_ptr,
26602
    size_t dst_len,
26603
    uint8_t* dst_palette_ptr,
26604
    size_t dst_palette_len,
26605
    const uint8_t* src_ptr,
26606
17.3M
    size_t src_len) {
26607
17.3M
  size_t dst_len4 = dst_len / 4;
26608
17.3M
  size_t src_len8 = src_len / 8;
26609
17.3M
  size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8;
26610
17.3M
  uint8_t* d = dst_ptr;
26611
17.3M
  const uint8_t* s = src_ptr;
26612
17.3M
  size_t n = len;
26613
26614
  // TODO: unroll.
26615
26616
34.7M
  while (n >= 1) {
26617
17.3M
    uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8));
26618
17.3M
    wuffs_base__poke_u32le__no_bounds_check(
26619
17.3M
        d + (0 * 4),
26620
17.3M
        wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul(s0));
26621
26622
17.3M
    s += 1 * 8;
26623
17.3M
    d += 1 * 4;
26624
17.3M
    n -= 1;
26625
17.3M
  }
26626
26627
17.3M
  return len;
26628
17.3M
}
26629
26630
static uint64_t  //
26631
wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul__src_over(
26632
    uint8_t* dst_ptr,
26633
    size_t dst_len,
26634
    uint8_t* dst_palette_ptr,
26635
    size_t dst_palette_len,
26636
    const uint8_t* src_ptr,
26637
0
    size_t src_len) {
26638
0
  size_t dst_len4 = dst_len / 4;
26639
0
  size_t src_len4 = src_len / 4;
26640
0
  size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
26641
0
  uint8_t* d = dst_ptr;
26642
0
  const uint8_t* s = src_ptr;
26643
0
  size_t n = len;
26644
26645
  // TODO: unroll.
26646
26647
0
  while (n >= 1) {
26648
0
    uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4));
26649
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4));
26650
0
    wuffs_base__poke_u32le__no_bounds_check(
26651
0
        d + (0 * 4),
26652
0
        wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0));
26653
26654
0
    s += 1 * 4;
26655
0
    d += 1 * 4;
26656
0
    n -= 1;
26657
0
  }
26658
26659
0
  return len;
26660
0
}
26661
26662
static uint64_t  //
26663
wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul_4x16le__src_over(
26664
    uint8_t* dst_ptr,
26665
    size_t dst_len,
26666
    uint8_t* dst_palette_ptr,
26667
    size_t dst_palette_len,
26668
    const uint8_t* src_ptr,
26669
0
    size_t src_len) {
26670
0
  size_t dst_len4 = dst_len / 4;
26671
0
  size_t src_len8 = src_len / 8;
26672
0
  size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8;
26673
0
  uint8_t* d = dst_ptr;
26674
0
  const uint8_t* s = src_ptr;
26675
0
  size_t n = len;
26676
26677
  // TODO: unroll.
26678
26679
0
  while (n >= 1) {
26680
0
    uint64_t d0 = wuffs_base__color_u32__as__color_u64(
26681
0
        wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)));
26682
0
    uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8));
26683
0
    wuffs_base__poke_u32le__no_bounds_check(
26684
0
        d + (0 * 4),
26685
0
        wuffs_base__color_u64__as__color_u32(
26686
0
            wuffs_private_impl__composite_premul_nonpremul_u64_axxx(d0, s0)));
26687
26688
0
    s += 1 * 8;
26689
0
    d += 1 * 4;
26690
0
    n -= 1;
26691
0
  }
26692
26693
0
  return len;
26694
0
}
26695
26696
static uint64_t  //
26697
wuffs_private_impl__swizzle_bgra_premul__bgra_premul__src_over(
26698
    uint8_t* dst_ptr,
26699
    size_t dst_len,
26700
    uint8_t* dst_palette_ptr,
26701
    size_t dst_palette_len,
26702
    const uint8_t* src_ptr,
26703
0
    size_t src_len) {
26704
0
  size_t dst_len4 = dst_len / 4;
26705
0
  size_t src_len4 = src_len / 4;
26706
0
  size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
26707
0
  uint8_t* d = dst_ptr;
26708
0
  const uint8_t* s = src_ptr;
26709
0
  size_t n = len;
26710
26711
  // TODO: unroll.
26712
26713
0
  while (n >= 1) {
26714
0
    uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4));
26715
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4));
26716
0
    wuffs_base__poke_u32le__no_bounds_check(
26717
0
        d + (0 * 4),
26718
0
        wuffs_private_impl__composite_premul_premul_u32_axxx(d0, s0));
26719
26720
0
    s += 1 * 4;
26721
0
    d += 1 * 4;
26722
0
    n -= 1;
26723
0
  }
26724
26725
0
  return len;
26726
0
}
26727
26728
static uint64_t  //
26729
wuffs_private_impl__swizzle_bgra_premul__index_bgra_nonpremul__src_over(
26730
    uint8_t* dst_ptr,
26731
    size_t dst_len,
26732
    uint8_t* dst_palette_ptr,
26733
    size_t dst_palette_len,
26734
    const uint8_t* src_ptr,
26735
0
    size_t src_len) {
26736
0
  if (dst_palette_len !=
26737
0
      WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
26738
0
    return 0;
26739
0
  }
26740
0
  size_t dst_len4 = dst_len / 4;
26741
0
  size_t len = (dst_len4 < src_len) ? dst_len4 : src_len;
26742
0
  uint8_t* d = dst_ptr;
26743
0
  const uint8_t* s = src_ptr;
26744
0
  size_t n = len;
26745
26746
  // TODO: unroll.
26747
26748
0
  while (n >= 1) {
26749
0
    uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4));
26750
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
26751
0
                                                          ((size_t)s[0] * 4));
26752
0
    wuffs_base__poke_u32le__no_bounds_check(
26753
0
        d + (0 * 4),
26754
0
        wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0));
26755
26756
0
    s += 1 * 1;
26757
0
    d += 1 * 4;
26758
0
    n -= 1;
26759
0
  }
26760
26761
0
  return len;
26762
0
}
26763
26764
static uint64_t  //
26765
wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul__src(
26766
    uint8_t* dst_ptr,
26767
    size_t dst_len,
26768
    uint8_t* dst_palette_ptr,
26769
    size_t dst_palette_len,
26770
    const uint8_t* src_ptr,
26771
24.2M
    size_t src_len) {
26772
24.2M
  size_t dst_len4 = dst_len / 4;
26773
24.2M
  size_t src_len4 = src_len / 4;
26774
24.2M
  size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
26775
24.2M
  uint8_t* d = dst_ptr;
26776
24.2M
  const uint8_t* s = src_ptr;
26777
24.2M
  size_t n = len;
26778
26779
  // TODO: unroll.
26780
26781
83.2M
  while (n >= 1) {
26782
58.9M
    uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr(
26783
58.9M
        wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
26784
58.9M
    wuffs_base__poke_u32le__no_bounds_check(
26785
58.9M
        d + (0 * 4),
26786
58.9M
        wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(s0));
26787
26788
58.9M
    s += 1 * 4;
26789
58.9M
    d += 1 * 4;
26790
58.9M
    n -= 1;
26791
58.9M
  }
26792
26793
24.2M
  return len;
26794
24.2M
}
26795
26796
static uint64_t  //
26797
wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul__src_over(
26798
    uint8_t* dst_ptr,
26799
    size_t dst_len,
26800
    uint8_t* dst_palette_ptr,
26801
    size_t dst_palette_len,
26802
    const uint8_t* src_ptr,
26803
0
    size_t src_len) {
26804
0
  size_t dst_len4 = dst_len / 4;
26805
0
  size_t src_len4 = src_len / 4;
26806
0
  size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
26807
0
  uint8_t* d = dst_ptr;
26808
0
  const uint8_t* s = src_ptr;
26809
0
  size_t n = len;
26810
26811
  // TODO: unroll.
26812
26813
0
  while (n >= 1) {
26814
0
    uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4));
26815
0
    uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr(
26816
0
        wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
26817
0
    wuffs_base__poke_u32le__no_bounds_check(
26818
0
        d + (0 * 4),
26819
0
        wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0));
26820
26821
0
    s += 1 * 4;
26822
0
    d += 1 * 4;
26823
0
    n -= 1;
26824
0
  }
26825
26826
0
  return len;
26827
0
}
26828
26829
static uint64_t  //
26830
wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul_4x16le__src(
26831
    uint8_t* dst_ptr,
26832
    size_t dst_len,
26833
    uint8_t* dst_palette_ptr,
26834
    size_t dst_palette_len,
26835
    const uint8_t* src_ptr,
26836
0
    size_t src_len) {
26837
0
  size_t dst_len4 = dst_len / 4;
26838
0
  size_t src_len8 = src_len / 8;
26839
0
  size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8;
26840
0
  uint8_t* d = dst_ptr;
26841
0
  const uint8_t* s = src_ptr;
26842
0
  size_t n = len;
26843
26844
  // TODO: unroll.
26845
26846
0
  while (n >= 1) {
26847
0
    uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8));
26848
0
    wuffs_base__poke_u32le__no_bounds_check(
26849
0
        d + (0 * 4),
26850
0
        wuffs_private_impl__swap_u32_argb_abgr(
26851
0
            wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul(
26852
0
                s0)));
26853
26854
0
    s += 1 * 8;
26855
0
    d += 1 * 4;
26856
0
    n -= 1;
26857
0
  }
26858
26859
0
  return len;
26860
0
}
26861
26862
static uint64_t  //
26863
wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul_4x16le__src_over(
26864
    uint8_t* dst_ptr,
26865
    size_t dst_len,
26866
    uint8_t* dst_palette_ptr,
26867
    size_t dst_palette_len,
26868
    const uint8_t* src_ptr,
26869
0
    size_t src_len) {
26870
0
  size_t dst_len4 = dst_len / 4;
26871
0
  size_t src_len8 = src_len / 8;
26872
0
  size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8;
26873
0
  uint8_t* d = dst_ptr;
26874
0
  const uint8_t* s = src_ptr;
26875
0
  size_t n = len;
26876
26877
  // TODO: unroll.
26878
26879
0
  while (n >= 1) {
26880
0
    uint64_t d0 = wuffs_base__color_u32__as__color_u64(
26881
0
        wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)));
26882
0
    uint64_t s0 = wuffs_private_impl__swap_u64_argb_abgr(
26883
0
        wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)));
26884
0
    wuffs_base__poke_u32le__no_bounds_check(
26885
0
        d + (0 * 4),
26886
0
        wuffs_base__color_u64__as__color_u32(
26887
0
            wuffs_private_impl__composite_premul_nonpremul_u64_axxx(d0, s0)));
26888
26889
0
    s += 1 * 8;
26890
0
    d += 1 * 4;
26891
0
    n -= 1;
26892
0
  }
26893
26894
0
  return len;
26895
0
}
26896
26897
static uint64_t  //
26898
wuffs_private_impl__swizzle_bgra_premul__rgba_premul__src_over(
26899
    uint8_t* dst_ptr,
26900
    size_t dst_len,
26901
    uint8_t* dst_palette_ptr,
26902
    size_t dst_palette_len,
26903
    const uint8_t* src_ptr,
26904
0
    size_t src_len) {
26905
0
  size_t dst_len4 = dst_len / 4;
26906
0
  size_t src_len4 = src_len / 4;
26907
0
  size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
26908
0
  uint8_t* d = dst_ptr;
26909
0
  const uint8_t* s = src_ptr;
26910
0
  size_t n = len;
26911
26912
0
  while (n >= 1) {
26913
0
    uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4));
26914
0
    uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr(
26915
0
        wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
26916
0
    wuffs_base__poke_u32le__no_bounds_check(
26917
0
        d + (0 * 4),
26918
0
        wuffs_private_impl__composite_premul_premul_u32_axxx(d0, s0));
26919
26920
0
    s += 1 * 4;
26921
0
    d += 1 * 4;
26922
0
    n -= 1;
26923
0
  }
26924
26925
0
  return len;
26926
0
}
26927
26928
static uint64_t  //
26929
wuffs_private_impl__swizzle_bgra_premul__ya_nonpremul__src(
26930
    uint8_t* dst_ptr,
26931
    size_t dst_len,
26932
    uint8_t* dst_palette_ptr,
26933
    size_t dst_palette_len,
26934
    const uint8_t* src_ptr,
26935
3.08M
    size_t src_len) {
26936
3.08M
  size_t dst_len4 = dst_len / 4;
26937
3.08M
  size_t src_len2 = src_len / 2;
26938
3.08M
  size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2;
26939
3.08M
  uint8_t* d = dst_ptr;
26940
3.08M
  const uint8_t* s = src_ptr;
26941
3.08M
  size_t n = len;
26942
26943
  // TODO: unroll.
26944
26945
6.16M
  while (n >= 1) {
26946
3.08M
    uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101);
26947
3.08M
    wuffs_base__poke_u32le__no_bounds_check(
26948
3.08M
        d + (0 * 4),
26949
3.08M
        wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(s0));
26950
26951
3.08M
    s += 1 * 2;
26952
3.08M
    d += 1 * 4;
26953
3.08M
    n -= 1;
26954
3.08M
  }
26955
26956
3.08M
  return len;
26957
3.08M
}
26958
26959
static uint64_t  //
26960
wuffs_private_impl__swizzle_bgra_premul__ya_nonpremul__src_over(
26961
    uint8_t* dst_ptr,
26962
    size_t dst_len,
26963
    uint8_t* dst_palette_ptr,
26964
    size_t dst_palette_len,
26965
    const uint8_t* src_ptr,
26966
0
    size_t src_len) {
26967
0
  size_t dst_len4 = dst_len / 4;
26968
0
  size_t src_len2 = src_len / 2;
26969
0
  size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2;
26970
0
  uint8_t* d = dst_ptr;
26971
0
  const uint8_t* s = src_ptr;
26972
0
  size_t n = len;
26973
26974
  // TODO: unroll.
26975
26976
0
  while (n >= 1) {
26977
0
    uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4));
26978
0
    uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101);
26979
0
    wuffs_base__poke_u32le__no_bounds_check(
26980
0
        d + (0 * 4),
26981
0
        wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0));
26982
26983
0
    s += 1 * 2;
26984
0
    d += 1 * 4;
26985
0
    n -= 1;
26986
0
  }
26987
26988
0
  return len;
26989
0
}
26990
26991
// --------
26992
26993
static uint64_t  //
26994
wuffs_private_impl__swizzle_bgrw__bgr(uint8_t* dst_ptr,
26995
                                      size_t dst_len,
26996
                                      uint8_t* dst_palette_ptr,
26997
                                      size_t dst_palette_len,
26998
                                      const uint8_t* src_ptr,
26999
0
                                      size_t src_len) {
27000
0
  size_t dst_len4 = dst_len / 4;
27001
0
  size_t src_len3 = src_len / 3;
27002
0
  size_t len = (dst_len4 < src_len3) ? dst_len4 : src_len3;
27003
0
  uint8_t* d = dst_ptr;
27004
0
  const uint8_t* s = src_ptr;
27005
0
  size_t n = len;
27006
27007
  // TODO: unroll.
27008
27009
0
  while (n >= 1) {
27010
0
    wuffs_base__poke_u32le__no_bounds_check(
27011
0
        d + (0 * 4),
27012
0
        0xFF000000 | wuffs_base__peek_u24le__no_bounds_check(s + (0 * 3)));
27013
27014
0
    s += 1 * 3;
27015
0
    d += 1 * 4;
27016
0
    n -= 1;
27017
0
  }
27018
27019
0
  return len;
27020
0
}
27021
27022
static uint64_t  //
27023
wuffs_private_impl__swizzle_bgrw__bgr_565(uint8_t* dst_ptr,
27024
                                          size_t dst_len,
27025
                                          uint8_t* dst_palette_ptr,
27026
                                          size_t dst_palette_len,
27027
                                          const uint8_t* src_ptr,
27028
0
                                          size_t src_len) {
27029
0
  size_t dst_len4 = dst_len / 4;
27030
0
  size_t src_len2 = src_len / 2;
27031
0
  size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2;
27032
0
  uint8_t* d = dst_ptr;
27033
0
  const uint8_t* s = src_ptr;
27034
0
  size_t n = len;
27035
27036
  // TODO: unroll.
27037
27038
0
  while (n >= 1) {
27039
0
    wuffs_base__poke_u32le__no_bounds_check(
27040
0
        d + (0 * 4), wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul(
27041
0
                         wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2))));
27042
27043
0
    s += 1 * 2;
27044
0
    d += 1 * 4;
27045
0
    n -= 1;
27046
0
  }
27047
27048
0
  return len;
27049
0
}
27050
27051
static uint64_t  //
27052
wuffs_private_impl__swizzle_bgrw__bgrx(uint8_t* dst_ptr,
27053
                                       size_t dst_len,
27054
                                       uint8_t* dst_palette_ptr,
27055
                                       size_t dst_palette_len,
27056
                                       const uint8_t* src_ptr,
27057
0
                                       size_t src_len) {
27058
0
  size_t dst_len4 = dst_len / 4;
27059
0
  size_t src_len4 = src_len / 4;
27060
0
  size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
27061
0
  uint8_t* d = dst_ptr;
27062
0
  const uint8_t* s = src_ptr;
27063
0
  size_t n = len;
27064
27065
  // TODO: unroll.
27066
27067
0
  while (n >= 1) {
27068
0
    wuffs_base__poke_u32le__no_bounds_check(
27069
0
        d + (0 * 4),
27070
0
        0xFF000000 | wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
27071
27072
0
    s += 1 * 4;
27073
0
    d += 1 * 4;
27074
0
    n -= 1;
27075
0
  }
27076
27077
0
  return len;
27078
0
}
27079
27080
// โ€ผ WUFFS MULTI-FILE SECTION +x86_sse42
27081
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
27082
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
27083
static uint64_t  //
27084
wuffs_private_impl__swizzle_bgrw__bgr__x86_sse42(uint8_t* dst_ptr,
27085
                                                 size_t dst_len,
27086
                                                 uint8_t* dst_palette_ptr,
27087
                                                 size_t dst_palette_len,
27088
                                                 const uint8_t* src_ptr,
27089
0
                                                 size_t src_len) {
27090
0
  size_t dst_len4 = dst_len / 4;
27091
0
  size_t src_len3 = src_len / 3;
27092
0
  size_t len = (dst_len4 < src_len3) ? dst_len4 : src_len3;
27093
0
  uint8_t* d = dst_ptr;
27094
0
  const uint8_t* s = src_ptr;
27095
0
  size_t n = len;
27096
27097
0
  __m128i shuffle = _mm_set_epi8(+0x00, +0x0B, +0x0A, +0x09,  //
27098
0
                                 +0x00, +0x08, +0x07, +0x06,  //
27099
0
                                 +0x00, +0x05, +0x04, +0x03,  //
27100
0
                                 +0x00, +0x02, +0x01, +0x00);
27101
0
  __m128i or_ff = _mm_set_epi8(-0x01, +0x00, +0x00, +0x00,  //
27102
0
                               -0x01, +0x00, +0x00, +0x00,  //
27103
0
                               -0x01, +0x00, +0x00, +0x00,  //
27104
0
                               -0x01, +0x00, +0x00, +0x00);
27105
27106
0
  while (n >= 6) {
27107
0
    __m128i x;
27108
0
    x = _mm_lddqu_si128((const __m128i*)(const void*)s);
27109
0
    x = _mm_shuffle_epi8(x, shuffle);
27110
0
    x = _mm_or_si128(x, or_ff);
27111
0
    _mm_storeu_si128((__m128i*)(void*)d, x);
27112
27113
0
    s += 4 * 3;
27114
0
    d += 4 * 4;
27115
0
    n -= 4;
27116
0
  }
27117
27118
0
  while (n >= 1) {
27119
0
    uint8_t b0 = s[0];
27120
0
    uint8_t b1 = s[1];
27121
0
    uint8_t b2 = s[2];
27122
0
    d[0] = b0;
27123
0
    d[1] = b1;
27124
0
    d[2] = b2;
27125
0
    d[3] = 0xFF;
27126
27127
0
    s += 1 * 3;
27128
0
    d += 1 * 4;
27129
0
    n -= 1;
27130
0
  }
27131
27132
0
  return len;
27133
0
}
27134
27135
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
27136
static uint64_t  //
27137
wuffs_private_impl__swizzle_bgrw__rgb__x86_sse42(uint8_t* dst_ptr,
27138
                                                 size_t dst_len,
27139
                                                 uint8_t* dst_palette_ptr,
27140
                                                 size_t dst_palette_len,
27141
                                                 const uint8_t* src_ptr,
27142
5.72M
                                                 size_t src_len) {
27143
5.72M
  size_t dst_len4 = dst_len / 4;
27144
5.72M
  size_t src_len3 = src_len / 3;
27145
5.72M
  size_t len = (dst_len4 < src_len3) ? dst_len4 : src_len3;
27146
5.72M
  uint8_t* d = dst_ptr;
27147
5.72M
  const uint8_t* s = src_ptr;
27148
5.72M
  size_t n = len;
27149
27150
5.72M
  __m128i shuffle = _mm_set_epi8(+0x00, +0x09, +0x0A, +0x0B,  //
27151
5.72M
                                 +0x00, +0x06, +0x07, +0x08,  //
27152
5.72M
                                 +0x00, +0x03, +0x04, +0x05,  //
27153
5.72M
                                 +0x00, +0x00, +0x01, +0x02);
27154
5.72M
  __m128i or_ff = _mm_set_epi8(-0x01, +0x00, +0x00, +0x00,  //
27155
5.72M
                               -0x01, +0x00, +0x00, +0x00,  //
27156
5.72M
                               -0x01, +0x00, +0x00, +0x00,  //
27157
5.72M
                               -0x01, +0x00, +0x00, +0x00);
27158
27159
7.35M
  while (n >= 6) {
27160
1.62M
    __m128i x;
27161
1.62M
    x = _mm_lddqu_si128((const __m128i*)(const void*)s);
27162
1.62M
    x = _mm_shuffle_epi8(x, shuffle);
27163
1.62M
    x = _mm_or_si128(x, or_ff);
27164
1.62M
    _mm_storeu_si128((__m128i*)(void*)d, x);
27165
27166
1.62M
    s += 4 * 3;
27167
1.62M
    d += 4 * 4;
27168
1.62M
    n -= 4;
27169
1.62M
  }
27170
27171
11.5M
  while (n >= 1) {
27172
5.82M
    uint8_t b0 = s[0];
27173
5.82M
    uint8_t b1 = s[1];
27174
5.82M
    uint8_t b2 = s[2];
27175
5.82M
    d[0] = b2;
27176
5.82M
    d[1] = b1;
27177
5.82M
    d[2] = b0;
27178
5.82M
    d[3] = 0xFF;
27179
27180
5.82M
    s += 1 * 3;
27181
5.82M
    d += 1 * 4;
27182
5.82M
    n -= 1;
27183
5.82M
  }
27184
27185
5.72M
  return len;
27186
5.72M
}
27187
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
27188
// โ€ผ WUFFS MULTI-FILE SECTION -x86_sse42
27189
27190
static uint64_t  //
27191
wuffs_private_impl__swizzle_bgrw__rgb(uint8_t* dst_ptr,
27192
                                      size_t dst_len,
27193
                                      uint8_t* dst_palette_ptr,
27194
                                      size_t dst_palette_len,
27195
                                      const uint8_t* src_ptr,
27196
0
                                      size_t src_len) {
27197
0
  size_t dst_len4 = dst_len / 4;
27198
0
  size_t src_len3 = src_len / 3;
27199
0
  size_t len = (dst_len4 < src_len3) ? dst_len4 : src_len3;
27200
0
  uint8_t* d = dst_ptr;
27201
0
  const uint8_t* s = src_ptr;
27202
0
  size_t n = len;
27203
27204
0
  while (n >= 1) {
27205
0
    uint8_t b0 = s[0];
27206
0
    uint8_t b1 = s[1];
27207
0
    uint8_t b2 = s[2];
27208
0
    d[0] = b2;
27209
0
    d[1] = b1;
27210
0
    d[2] = b0;
27211
0
    d[3] = 0xFF;
27212
27213
0
    s += 1 * 3;
27214
0
    d += 1 * 4;
27215
0
    n -= 1;
27216
0
  }
27217
27218
0
  return len;
27219
0
}
27220
27221
static uint64_t  //
27222
wuffs_private_impl__swizzle_bgrw__rgbx(uint8_t* dst_ptr,
27223
                                       size_t dst_len,
27224
                                       uint8_t* dst_palette_ptr,
27225
                                       size_t dst_palette_len,
27226
                                       const uint8_t* src_ptr,
27227
0
                                       size_t src_len) {
27228
0
  size_t dst_len4 = dst_len / 4;
27229
0
  size_t src_len4 = src_len / 4;
27230
0
  size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
27231
0
  uint8_t* d = dst_ptr;
27232
0
  const uint8_t* s = src_ptr;
27233
0
  size_t n = len;
27234
27235
  // TODO: unroll.
27236
27237
0
  while (n >= 1) {
27238
0
    uint8_t b0 = s[0];
27239
0
    uint8_t b1 = s[1];
27240
0
    uint8_t b2 = s[2];
27241
0
    d[0] = b2;
27242
0
    d[1] = b1;
27243
0
    d[2] = b0;
27244
0
    d[3] = 0xFF;
27245
27246
0
    s += 1 * 4;
27247
0
    d += 1 * 4;
27248
0
    n -= 1;
27249
0
  }
27250
27251
0
  return len;
27252
0
}
27253
27254
// --------
27255
27256
static uint64_t  //
27257
wuffs_private_impl__swizzle_bgrw_4x16le__bgr(uint8_t* dst_ptr,
27258
                                             size_t dst_len,
27259
                                             uint8_t* dst_palette_ptr,
27260
                                             size_t dst_palette_len,
27261
                                             const uint8_t* src_ptr,
27262
0
                                             size_t src_len) {
27263
0
  size_t dst_len8 = dst_len / 8;
27264
0
  size_t src_len3 = src_len / 3;
27265
0
  size_t len = (dst_len8 < src_len3) ? dst_len8 : src_len3;
27266
0
  uint8_t* d = dst_ptr;
27267
0
  const uint8_t* s = src_ptr;
27268
0
  size_t n = len;
27269
27270
0
  while (n >= 1) {
27271
0
    uint8_t s0 = s[0];
27272
0
    uint8_t s1 = s[1];
27273
0
    uint8_t s2 = s[2];
27274
0
    d[0] = s0;
27275
0
    d[1] = s0;
27276
0
    d[2] = s1;
27277
0
    d[3] = s1;
27278
0
    d[4] = s2;
27279
0
    d[5] = s2;
27280
0
    d[6] = 0xFF;
27281
0
    d[7] = 0xFF;
27282
27283
0
    s += 1 * 3;
27284
0
    d += 1 * 8;
27285
0
    n -= 1;
27286
0
  }
27287
27288
0
  return len;
27289
0
}
27290
27291
static uint64_t  //
27292
wuffs_private_impl__swizzle_bgrw_4x16le__bgr_565(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
0
                                                 size_t src_len) {
27298
0
  size_t dst_len8 = dst_len / 8;
27299
0
  size_t src_len2 = src_len / 2;
27300
0
  size_t len = (dst_len8 < src_len2) ? dst_len8 : src_len2;
27301
0
  uint8_t* d = dst_ptr;
27302
0
  const uint8_t* s = src_ptr;
27303
0
  size_t n = len;
27304
27305
0
  while (n >= 1) {
27306
0
    wuffs_base__poke_u64le__no_bounds_check(
27307
0
        d + (0 * 8),
27308
0
        wuffs_base__color_u32__as__color_u64(
27309
0
            wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul(
27310
0
                wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2)))));
27311
27312
0
    s += 1 * 2;
27313
0
    d += 1 * 8;
27314
0
    n -= 1;
27315
0
  }
27316
27317
0
  return len;
27318
0
}
27319
27320
static uint64_t  //
27321
wuffs_private_impl__swizzle_bgrw_4x16le__bgrx(uint8_t* dst_ptr,
27322
                                              size_t dst_len,
27323
                                              uint8_t* dst_palette_ptr,
27324
                                              size_t dst_palette_len,
27325
                                              const uint8_t* src_ptr,
27326
0
                                              size_t src_len) {
27327
0
  size_t dst_len8 = dst_len / 8;
27328
0
  size_t src_len4 = src_len / 4;
27329
0
  size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4;
27330
0
  uint8_t* d = dst_ptr;
27331
0
  const uint8_t* s = src_ptr;
27332
0
  size_t n = len;
27333
27334
0
  while (n >= 1) {
27335
0
    uint8_t s0 = s[0];
27336
0
    uint8_t s1 = s[1];
27337
0
    uint8_t s2 = s[2];
27338
0
    d[0] = s0;
27339
0
    d[1] = s0;
27340
0
    d[2] = s1;
27341
0
    d[3] = s1;
27342
0
    d[4] = s2;
27343
0
    d[5] = s2;
27344
0
    d[6] = 0xFF;
27345
0
    d[7] = 0xFF;
27346
27347
0
    s += 1 * 4;
27348
0
    d += 1 * 8;
27349
0
    n -= 1;
27350
0
  }
27351
27352
0
  return len;
27353
0
}
27354
27355
static uint64_t  //
27356
wuffs_private_impl__swizzle_bgrw_4x16le__rgb(uint8_t* dst_ptr,
27357
                                             size_t dst_len,
27358
                                             uint8_t* dst_palette_ptr,
27359
                                             size_t dst_palette_len,
27360
                                             const uint8_t* src_ptr,
27361
0
                                             size_t src_len) {
27362
0
  size_t dst_len8 = dst_len / 8;
27363
0
  size_t src_len3 = src_len / 3;
27364
0
  size_t len = (dst_len8 < src_len3) ? dst_len8 : src_len3;
27365
0
  uint8_t* d = dst_ptr;
27366
0
  const uint8_t* s = src_ptr;
27367
0
  size_t n = len;
27368
27369
0
  while (n >= 1) {
27370
0
    uint8_t s0 = s[0];
27371
0
    uint8_t s1 = s[1];
27372
0
    uint8_t s2 = s[2];
27373
0
    d[0] = s2;
27374
0
    d[1] = s2;
27375
0
    d[2] = s1;
27376
0
    d[3] = s1;
27377
0
    d[4] = s0;
27378
0
    d[5] = s0;
27379
0
    d[6] = 0xFF;
27380
0
    d[7] = 0xFF;
27381
27382
0
    s += 1 * 3;
27383
0
    d += 1 * 8;
27384
0
    n -= 1;
27385
0
  }
27386
27387
0
  return len;
27388
0
}
27389
27390
// --------
27391
27392
static uint64_t  //
27393
wuffs_private_impl__swizzle_rgb__bgr_565(uint8_t* dst_ptr,
27394
                                         size_t dst_len,
27395
                                         uint8_t* dst_palette_ptr,
27396
                                         size_t dst_palette_len,
27397
                                         const uint8_t* src_ptr,
27398
0
                                         size_t src_len) {
27399
0
  size_t dst_len3 = dst_len / 3;
27400
0
  size_t src_len2 = src_len / 2;
27401
0
  size_t len = (dst_len3 < src_len2) ? dst_len3 : src_len2;
27402
0
  uint8_t* d = dst_ptr;
27403
0
  const uint8_t* s = src_ptr;
27404
0
  size_t n = len;
27405
27406
  // TODO: unroll.
27407
27408
0
  while (n >= 1) {
27409
0
    wuffs_base__poke_u24le__no_bounds_check(
27410
0
        d + (0 * 3),
27411
0
        wuffs_private_impl__swap_u32_argb_abgr(
27412
0
            wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul(
27413
0
                wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2)))));
27414
27415
0
    s += 1 * 2;
27416
0
    d += 1 * 3;
27417
0
    n -= 1;
27418
0
  }
27419
27420
0
  return len;
27421
0
}
27422
27423
// --------
27424
27425
static uint64_t  //
27426
wuffs_private_impl__swizzle_rgba_nonpremul__bgra_nonpremul_4x16le__src(
27427
    uint8_t* dst_ptr,
27428
    size_t dst_len,
27429
    uint8_t* dst_palette_ptr,
27430
    size_t dst_palette_len,
27431
    const uint8_t* src_ptr,
27432
0
    size_t src_len) {
27433
0
  size_t dst_len4 = dst_len / 4;
27434
0
  size_t src_len8 = src_len / 8;
27435
0
  size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8;
27436
0
  uint8_t* d = dst_ptr;
27437
0
  const uint8_t* s = src_ptr;
27438
27439
0
  size_t n = len;
27440
0
  while (n >= 1) {
27441
0
    wuffs_base__poke_u32le__no_bounds_check(
27442
0
        d + (0 * 4),
27443
0
        wuffs_private_impl__color_u64__as__color_u32__swap_u32_argb_abgr(
27444
0
            wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8))));
27445
27446
0
    s += 1 * 8;
27447
0
    d += 1 * 4;
27448
0
    n -= 1;
27449
0
  }
27450
0
  return len;
27451
0
}
27452
27453
static uint64_t  //
27454
wuffs_private_impl__swizzle_rgba_nonpremul__bgra_nonpremul_4x16le__src_over(
27455
    uint8_t* dst_ptr,
27456
    size_t dst_len,
27457
    uint8_t* dst_palette_ptr,
27458
    size_t dst_palette_len,
27459
    const uint8_t* src_ptr,
27460
0
    size_t src_len) {
27461
0
  size_t dst_len4 = dst_len / 4;
27462
0
  size_t src_len8 = src_len / 8;
27463
0
  size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8;
27464
0
  uint8_t* d = dst_ptr;
27465
0
  const uint8_t* s = src_ptr;
27466
0
  size_t n = len;
27467
27468
0
  while (n >= 1) {
27469
0
    uint64_t d0 = wuffs_base__color_u32__as__color_u64(
27470
0
        wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)));
27471
0
    uint64_t s0 = wuffs_private_impl__swap_u64_argb_abgr(
27472
0
        wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)));
27473
0
    wuffs_base__poke_u32le__no_bounds_check(
27474
0
        d + (0 * 4),
27475
0
        wuffs_base__color_u64__as__color_u32(
27476
0
            wuffs_private_impl__composite_nonpremul_nonpremul_u64_axxx(d0,
27477
0
                                                                       s0)));
27478
27479
0
    s += 1 * 8;
27480
0
    d += 1 * 4;
27481
0
    n -= 1;
27482
0
  }
27483
27484
0
  return len;
27485
0
}
27486
27487
// --------
27488
27489
static uint64_t  //
27490
wuffs_private_impl__swizzle_rgbw__bgr_565(uint8_t* dst_ptr,
27491
                                          size_t dst_len,
27492
                                          uint8_t* dst_palette_ptr,
27493
                                          size_t dst_palette_len,
27494
                                          const uint8_t* src_ptr,
27495
0
                                          size_t src_len) {
27496
0
  size_t dst_len4 = dst_len / 4;
27497
0
  size_t src_len2 = src_len / 2;
27498
0
  size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2;
27499
0
  uint8_t* d = dst_ptr;
27500
0
  const uint8_t* s = src_ptr;
27501
0
  size_t n = len;
27502
27503
  // TODO: unroll.
27504
27505
0
  while (n >= 1) {
27506
0
    wuffs_base__poke_u32le__no_bounds_check(
27507
0
        d + (0 * 4),
27508
0
        wuffs_private_impl__swap_u32_argb_abgr(
27509
0
            wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul(
27510
0
                wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2)))));
27511
27512
0
    s += 1 * 2;
27513
0
    d += 1 * 4;
27514
0
    n -= 1;
27515
0
  }
27516
27517
0
  return len;
27518
0
}
27519
27520
// --------
27521
27522
static uint64_t  //
27523
wuffs_private_impl__swizzle_xxx__index__src(uint8_t* dst_ptr,
27524
                                            size_t dst_len,
27525
                                            uint8_t* dst_palette_ptr,
27526
                                            size_t dst_palette_len,
27527
                                            const uint8_t* src_ptr,
27528
0
                                            size_t src_len) {
27529
0
  if (dst_palette_len !=
27530
0
      WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
27531
0
    return 0;
27532
0
  }
27533
0
  size_t dst_len3 = dst_len / 3;
27534
0
  size_t len = (dst_len3 < src_len) ? dst_len3 : src_len;
27535
0
  uint8_t* d = dst_ptr;
27536
0
  const uint8_t* s = src_ptr;
27537
0
  size_t n = len;
27538
27539
0
  const size_t loop_unroll_count = 4;
27540
27541
  // The comparison in the while condition is ">", not ">=", because with
27542
  // ">=", the last 4-byte store could write past the end of the dst slice.
27543
  //
27544
  // Each 4-byte store writes one too many bytes, but a subsequent store
27545
  // will overwrite that with the correct byte. There is always another
27546
  // store, whether a 4-byte store in this loop or a 1-byte store in the
27547
  // next loop.
27548
0
  while (n > loop_unroll_count) {
27549
0
    wuffs_base__poke_u32le__no_bounds_check(
27550
0
        d + (0 * 3), wuffs_base__peek_u32le__no_bounds_check(
27551
0
                         dst_palette_ptr + ((size_t)s[0] * 4)));
27552
0
    wuffs_base__poke_u32le__no_bounds_check(
27553
0
        d + (1 * 3), wuffs_base__peek_u32le__no_bounds_check(
27554
0
                         dst_palette_ptr + ((size_t)s[1] * 4)));
27555
0
    wuffs_base__poke_u32le__no_bounds_check(
27556
0
        d + (2 * 3), wuffs_base__peek_u32le__no_bounds_check(
27557
0
                         dst_palette_ptr + ((size_t)s[2] * 4)));
27558
0
    wuffs_base__poke_u32le__no_bounds_check(
27559
0
        d + (3 * 3), wuffs_base__peek_u32le__no_bounds_check(
27560
0
                         dst_palette_ptr + ((size_t)s[3] * 4)));
27561
27562
0
    s += loop_unroll_count * 1;
27563
0
    d += loop_unroll_count * 3;
27564
0
    n -= loop_unroll_count;
27565
0
  }
27566
27567
0
  while (n >= 1) {
27568
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
27569
0
                                                          ((size_t)s[0] * 4));
27570
0
    wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0);
27571
27572
0
    s += 1 * 1;
27573
0
    d += 1 * 3;
27574
0
    n -= 1;
27575
0
  }
27576
27577
0
  return len;
27578
0
}
27579
27580
static uint64_t  //
27581
wuffs_private_impl__swizzle_xxx__index_bgra_nonpremul__src_over(
27582
    uint8_t* dst_ptr,
27583
    size_t dst_len,
27584
    uint8_t* dst_palette_ptr,
27585
    size_t dst_palette_len,
27586
    const uint8_t* src_ptr,
27587
0
    size_t src_len) {
27588
0
  if (dst_palette_len !=
27589
0
      WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
27590
0
    return 0;
27591
0
  }
27592
0
  size_t dst_len3 = dst_len / 3;
27593
0
  size_t len = (dst_len3 < src_len) ? dst_len3 : src_len;
27594
0
  uint8_t* d = dst_ptr;
27595
0
  const uint8_t* s = src_ptr;
27596
0
  size_t n = len;
27597
27598
  // TODO: unroll.
27599
27600
0
  while (n >= 1) {
27601
0
    uint32_t d0 =
27602
0
        wuffs_base__peek_u24le__no_bounds_check(d + (0 * 3)) | 0xFF000000;
27603
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
27604
0
                                                          ((size_t)s[0] * 4));
27605
0
    wuffs_base__poke_u24le__no_bounds_check(
27606
0
        d + (0 * 3),
27607
0
        wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0));
27608
27609
0
    s += 1 * 1;
27610
0
    d += 1 * 3;
27611
0
    n -= 1;
27612
0
  }
27613
27614
0
  return len;
27615
0
}
27616
27617
static uint64_t  //
27618
wuffs_private_impl__swizzle_xxx__index_binary_alpha__src_over(
27619
    uint8_t* dst_ptr,
27620
    size_t dst_len,
27621
    uint8_t* dst_palette_ptr,
27622
    size_t dst_palette_len,
27623
    const uint8_t* src_ptr,
27624
0
    size_t src_len) {
27625
0
  if (dst_palette_len !=
27626
0
      WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
27627
0
    return 0;
27628
0
  }
27629
0
  size_t dst_len3 = dst_len / 3;
27630
0
  size_t len = (dst_len3 < src_len) ? dst_len3 : src_len;
27631
0
  uint8_t* d = dst_ptr;
27632
0
  const uint8_t* s = src_ptr;
27633
0
  size_t n = len;
27634
27635
0
  const size_t loop_unroll_count = 4;
27636
27637
0
  while (n >= loop_unroll_count) {
27638
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
27639
0
                                                          ((size_t)s[0] * 4));
27640
0
    if (s0) {
27641
0
      wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0);
27642
0
    }
27643
0
    uint32_t s1 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
27644
0
                                                          ((size_t)s[1] * 4));
27645
0
    if (s1) {
27646
0
      wuffs_base__poke_u24le__no_bounds_check(d + (1 * 3), s1);
27647
0
    }
27648
0
    uint32_t s2 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
27649
0
                                                          ((size_t)s[2] * 4));
27650
0
    if (s2) {
27651
0
      wuffs_base__poke_u24le__no_bounds_check(d + (2 * 3), s2);
27652
0
    }
27653
0
    uint32_t s3 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
27654
0
                                                          ((size_t)s[3] * 4));
27655
0
    if (s3) {
27656
0
      wuffs_base__poke_u24le__no_bounds_check(d + (3 * 3), s3);
27657
0
    }
27658
27659
0
    s += loop_unroll_count * 1;
27660
0
    d += loop_unroll_count * 3;
27661
0
    n -= loop_unroll_count;
27662
0
  }
27663
27664
0
  while (n >= 1) {
27665
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
27666
0
                                                          ((size_t)s[0] * 4));
27667
0
    if (s0) {
27668
0
      wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0);
27669
0
    }
27670
27671
0
    s += 1 * 1;
27672
0
    d += 1 * 3;
27673
0
    n -= 1;
27674
0
  }
27675
27676
0
  return len;
27677
0
}
27678
27679
static uint64_t  //
27680
wuffs_private_impl__swizzle_xxx__xxxx(uint8_t* dst_ptr,
27681
                                      size_t dst_len,
27682
                                      uint8_t* dst_palette_ptr,
27683
                                      size_t dst_palette_len,
27684
                                      const uint8_t* src_ptr,
27685
0
                                      size_t src_len) {
27686
0
  size_t dst_len3 = dst_len / 3;
27687
0
  size_t src_len4 = src_len / 4;
27688
0
  size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4;
27689
0
  uint8_t* d = dst_ptr;
27690
0
  const uint8_t* s = src_ptr;
27691
0
  size_t n = len;
27692
27693
  // TODO: unroll.
27694
27695
0
  while (n >= 1) {
27696
0
    wuffs_base__poke_u24le__no_bounds_check(
27697
0
        d + (0 * 3), wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
27698
27699
0
    s += 1 * 4;
27700
0
    d += 1 * 3;
27701
0
    n -= 1;
27702
0
  }
27703
27704
0
  return len;
27705
0
}
27706
27707
static uint64_t  //
27708
wuffs_private_impl__swizzle_xxx__y(uint8_t* dst_ptr,
27709
                                   size_t dst_len,
27710
                                   uint8_t* dst_palette_ptr,
27711
                                   size_t dst_palette_len,
27712
                                   const uint8_t* src_ptr,
27713
0
                                   size_t src_len) {
27714
0
  size_t dst_len3 = dst_len / 3;
27715
0
  size_t len = (dst_len3 < src_len) ? dst_len3 : src_len;
27716
0
  uint8_t* d = dst_ptr;
27717
0
  const uint8_t* s = src_ptr;
27718
0
  size_t n = len;
27719
27720
  // TODO: unroll.
27721
27722
0
  while (n >= 1) {
27723
0
    uint8_t s0 = s[0];
27724
0
    d[0] = s0;
27725
0
    d[1] = s0;
27726
0
    d[2] = s0;
27727
27728
0
    s += 1 * 1;
27729
0
    d += 1 * 3;
27730
0
    n -= 1;
27731
0
  }
27732
27733
0
  return len;
27734
0
}
27735
27736
static uint64_t  //
27737
wuffs_private_impl__swizzle_xxx__y_16be(uint8_t* dst_ptr,
27738
                                        size_t dst_len,
27739
                                        uint8_t* dst_palette_ptr,
27740
                                        size_t dst_palette_len,
27741
                                        const uint8_t* src_ptr,
27742
0
                                        size_t src_len) {
27743
0
  size_t dst_len3 = dst_len / 3;
27744
0
  size_t src_len2 = src_len / 2;
27745
0
  size_t len = (dst_len3 < src_len2) ? dst_len3 : src_len2;
27746
0
  uint8_t* d = dst_ptr;
27747
0
  const uint8_t* s = src_ptr;
27748
0
  size_t n = len;
27749
27750
  // TODO: unroll.
27751
27752
0
  while (n >= 1) {
27753
0
    uint8_t s0 = s[0];
27754
0
    d[0] = s0;
27755
0
    d[1] = s0;
27756
0
    d[2] = s0;
27757
27758
0
    s += 1 * 2;
27759
0
    d += 1 * 3;
27760
0
    n -= 1;
27761
0
  }
27762
27763
0
  return len;
27764
0
}
27765
27766
static uint64_t  //
27767
wuffs_private_impl__swizzle_xxx__ya_nonpremul__src(uint8_t* dst_ptr,
27768
                                                   size_t dst_len,
27769
                                                   uint8_t* dst_palette_ptr,
27770
                                                   size_t dst_palette_len,
27771
                                                   const uint8_t* src_ptr,
27772
0
                                                   size_t src_len) {
27773
0
  size_t dst_len3 = dst_len / 3;
27774
0
  size_t src_len2 = src_len / 2;
27775
0
  size_t len = (dst_len3 < src_len2) ? dst_len3 : src_len2;
27776
0
  uint8_t* d = dst_ptr;
27777
0
  const uint8_t* s = src_ptr;
27778
0
  size_t n = len;
27779
27780
  // TODO: unroll.
27781
27782
0
  while (n >= 1) {
27783
0
    uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101);
27784
0
    wuffs_base__poke_u24le__no_bounds_check(
27785
0
        d + (0 * 3),
27786
0
        wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(s0));
27787
27788
0
    s += 1 * 2;
27789
0
    d += 1 * 3;
27790
0
    n -= 1;
27791
0
  }
27792
27793
0
  return len;
27794
0
}
27795
27796
static uint64_t  //
27797
wuffs_private_impl__swizzle_xxx__ya_nonpremul__src_over(
27798
    uint8_t* dst_ptr,
27799
    size_t dst_len,
27800
    uint8_t* dst_palette_ptr,
27801
    size_t dst_palette_len,
27802
    const uint8_t* src_ptr,
27803
0
    size_t src_len) {
27804
0
  size_t dst_len3 = dst_len / 3;
27805
0
  size_t src_len2 = src_len / 2;
27806
0
  size_t len = (dst_len3 < src_len2) ? dst_len3 : src_len2;
27807
0
  uint8_t* d = dst_ptr;
27808
0
  const uint8_t* s = src_ptr;
27809
0
  size_t n = len;
27810
27811
  // TODO: unroll.
27812
27813
0
  while (n >= 1) {
27814
0
    uint32_t d0 =
27815
0
        wuffs_base__peek_u24le__no_bounds_check(d + (0 * 3)) | 0xFF000000;
27816
0
    uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101);
27817
0
    wuffs_base__poke_u24le__no_bounds_check(
27818
0
        d + (0 * 3),
27819
0
        wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0));
27820
27821
0
    s += 1 * 2;
27822
0
    d += 1 * 3;
27823
0
    n -= 1;
27824
0
  }
27825
27826
0
  return len;
27827
0
}
27828
27829
// --------
27830
27831
static uint64_t  //
27832
wuffs_private_impl__swizzle_xxxx__index__src(uint8_t* dst_ptr,
27833
                                             size_t dst_len,
27834
                                             uint8_t* dst_palette_ptr,
27835
                                             size_t dst_palette_len,
27836
                                             const uint8_t* src_ptr,
27837
918k
                                             size_t src_len) {
27838
918k
  if (dst_palette_len !=
27839
918k
      WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
27840
0
    return 0;
27841
0
  }
27842
918k
  size_t dst_len4 = dst_len / 4;
27843
918k
  size_t len = (dst_len4 < src_len) ? dst_len4 : src_len;
27844
918k
  uint8_t* d = dst_ptr;
27845
918k
  const uint8_t* s = src_ptr;
27846
918k
  size_t n = len;
27847
27848
918k
  const size_t loop_unroll_count = 4;
27849
27850
3.67M
  while (n >= loop_unroll_count) {
27851
2.76M
    wuffs_base__poke_u32le__no_bounds_check(
27852
2.76M
        d + (0 * 4), wuffs_base__peek_u32le__no_bounds_check(
27853
2.76M
                         dst_palette_ptr + ((size_t)s[0] * 4)));
27854
2.76M
    wuffs_base__poke_u32le__no_bounds_check(
27855
2.76M
        d + (1 * 4), wuffs_base__peek_u32le__no_bounds_check(
27856
2.76M
                         dst_palette_ptr + ((size_t)s[1] * 4)));
27857
2.76M
    wuffs_base__poke_u32le__no_bounds_check(
27858
2.76M
        d + (2 * 4), wuffs_base__peek_u32le__no_bounds_check(
27859
2.76M
                         dst_palette_ptr + ((size_t)s[2] * 4)));
27860
2.76M
    wuffs_base__poke_u32le__no_bounds_check(
27861
2.76M
        d + (3 * 4), wuffs_base__peek_u32le__no_bounds_check(
27862
2.76M
                         dst_palette_ptr + ((size_t)s[3] * 4)));
27863
27864
2.76M
    s += loop_unroll_count * 1;
27865
2.76M
    d += loop_unroll_count * 4;
27866
2.76M
    n -= loop_unroll_count;
27867
2.76M
  }
27868
27869
1.86M
  while (n >= 1) {
27870
947k
    wuffs_base__poke_u32le__no_bounds_check(
27871
947k
        d + (0 * 4), wuffs_base__peek_u32le__no_bounds_check(
27872
947k
                         dst_palette_ptr + ((size_t)s[0] * 4)));
27873
27874
947k
    s += 1 * 1;
27875
947k
    d += 1 * 4;
27876
947k
    n -= 1;
27877
947k
  }
27878
27879
918k
  return len;
27880
918k
}
27881
27882
static uint64_t  //
27883
wuffs_private_impl__swizzle_xxxx__index_binary_alpha__src_over(
27884
    uint8_t* dst_ptr,
27885
    size_t dst_len,
27886
    uint8_t* dst_palette_ptr,
27887
    size_t dst_palette_len,
27888
    const uint8_t* src_ptr,
27889
0
    size_t src_len) {
27890
0
  if (dst_palette_len !=
27891
0
      WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
27892
0
    return 0;
27893
0
  }
27894
0
  size_t dst_len4 = dst_len / 4;
27895
0
  size_t len = (dst_len4 < src_len) ? dst_len4 : src_len;
27896
0
  uint8_t* d = dst_ptr;
27897
0
  const uint8_t* s = src_ptr;
27898
0
  size_t n = len;
27899
27900
0
  const size_t loop_unroll_count = 4;
27901
27902
0
  while (n >= loop_unroll_count) {
27903
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
27904
0
                                                          ((size_t)s[0] * 4));
27905
0
    if (s0) {
27906
0
      wuffs_base__poke_u32le__no_bounds_check(d + (0 * 4), s0);
27907
0
    }
27908
0
    uint32_t s1 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
27909
0
                                                          ((size_t)s[1] * 4));
27910
0
    if (s1) {
27911
0
      wuffs_base__poke_u32le__no_bounds_check(d + (1 * 4), s1);
27912
0
    }
27913
0
    uint32_t s2 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
27914
0
                                                          ((size_t)s[2] * 4));
27915
0
    if (s2) {
27916
0
      wuffs_base__poke_u32le__no_bounds_check(d + (2 * 4), s2);
27917
0
    }
27918
0
    uint32_t s3 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
27919
0
                                                          ((size_t)s[3] * 4));
27920
0
    if (s3) {
27921
0
      wuffs_base__poke_u32le__no_bounds_check(d + (3 * 4), s3);
27922
0
    }
27923
27924
0
    s += loop_unroll_count * 1;
27925
0
    d += loop_unroll_count * 4;
27926
0
    n -= loop_unroll_count;
27927
0
  }
27928
27929
0
  while (n >= 1) {
27930
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
27931
0
                                                          ((size_t)s[0] * 4));
27932
0
    if (s0) {
27933
0
      wuffs_base__poke_u32le__no_bounds_check(d + (0 * 4), s0);
27934
0
    }
27935
27936
0
    s += 1 * 1;
27937
0
    d += 1 * 4;
27938
0
    n -= 1;
27939
0
  }
27940
27941
0
  return len;
27942
0
}
27943
27944
// โ€ผ WUFFS MULTI-FILE SECTION +x86_sse42
27945
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
27946
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
27947
static uint64_t  //
27948
wuffs_private_impl__swizzle_xxxx__y__x86_sse42(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
11.2M
                                               size_t src_len) {
27954
11.2M
  size_t dst_len4 = dst_len / 4;
27955
11.2M
  size_t len = (dst_len4 < src_len) ? dst_len4 : src_len;
27956
11.2M
  uint8_t* d = dst_ptr;
27957
11.2M
  const uint8_t* s = src_ptr;
27958
11.2M
  size_t n = len;
27959
27960
11.2M
  __m128i shuffle = _mm_set_epi8(+0x03, +0x03, +0x03, +0x03,  //
27961
11.2M
                                 +0x02, +0x02, +0x02, +0x02,  //
27962
11.2M
                                 +0x01, +0x01, +0x01, +0x01,  //
27963
11.2M
                                 +0x00, +0x00, +0x00, +0x00);
27964
11.2M
  __m128i or_ff = _mm_set_epi8(-0x01, +0x00, +0x00, +0x00,  //
27965
11.2M
                               -0x01, +0x00, +0x00, +0x00,  //
27966
11.2M
                               -0x01, +0x00, +0x00, +0x00,  //
27967
11.2M
                               -0x01, +0x00, +0x00, +0x00);
27968
27969
12.1M
  while (n >= 4) {
27970
879k
    __m128i x;
27971
879k
    x = _mm_cvtsi32_si128((int)(wuffs_base__peek_u32le__no_bounds_check(s)));
27972
879k
    x = _mm_shuffle_epi8(x, shuffle);
27973
879k
    x = _mm_or_si128(x, or_ff);
27974
879k
    _mm_storeu_si128((__m128i*)(void*)d, x);
27975
27976
879k
    s += 4 * 1;
27977
879k
    d += 4 * 4;
27978
879k
    n -= 4;
27979
879k
  }
27980
27981
22.5M
  while (n >= 1) {
27982
11.2M
    wuffs_base__poke_u32le__no_bounds_check(
27983
11.2M
        d + (0 * 4), 0xFF000000 | (0x010101 * (uint32_t)s[0]));
27984
27985
11.2M
    s += 1 * 1;
27986
11.2M
    d += 1 * 4;
27987
11.2M
    n -= 1;
27988
11.2M
  }
27989
27990
11.2M
  return len;
27991
11.2M
}
27992
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
27993
// โ€ผ WUFFS MULTI-FILE SECTION -x86_sse42
27994
27995
static uint64_t  //
27996
wuffs_private_impl__swizzle_xxxx__y(uint8_t* dst_ptr,
27997
                                    size_t dst_len,
27998
                                    uint8_t* dst_palette_ptr,
27999
                                    size_t dst_palette_len,
28000
                                    const uint8_t* src_ptr,
28001
0
                                    size_t src_len) {
28002
0
  size_t dst_len4 = dst_len / 4;
28003
0
  size_t len = (dst_len4 < src_len) ? dst_len4 : src_len;
28004
0
  uint8_t* d = dst_ptr;
28005
0
  const uint8_t* s = src_ptr;
28006
0
  size_t n = len;
28007
28008
0
  while (n >= 1) {
28009
0
    wuffs_base__poke_u32le__no_bounds_check(
28010
0
        d + (0 * 4), 0xFF000000 | (0x010101 * (uint32_t)s[0]));
28011
28012
0
    s += 1 * 1;
28013
0
    d += 1 * 4;
28014
0
    n -= 1;
28015
0
  }
28016
28017
0
  return len;
28018
0
}
28019
28020
static uint64_t  //
28021
wuffs_private_impl__swizzle_xxxx__y_16be(uint8_t* dst_ptr,
28022
                                         size_t dst_len,
28023
                                         uint8_t* dst_palette_ptr,
28024
                                         size_t dst_palette_len,
28025
                                         const uint8_t* src_ptr,
28026
211k
                                         size_t src_len) {
28027
211k
  size_t dst_len4 = dst_len / 4;
28028
211k
  size_t src_len2 = src_len / 2;
28029
211k
  size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2;
28030
211k
  uint8_t* d = dst_ptr;
28031
211k
  const uint8_t* s = src_ptr;
28032
211k
  size_t n = len;
28033
28034
946k
  while (n >= 1) {
28035
735k
    wuffs_base__poke_u32le__no_bounds_check(
28036
735k
        d + (0 * 4), 0xFF000000 | (0x010101 * (uint32_t)s[0]));
28037
28038
735k
    s += 1 * 2;
28039
735k
    d += 1 * 4;
28040
735k
    n -= 1;
28041
735k
  }
28042
28043
211k
  return len;
28044
211k
}
28045
28046
// --------
28047
28048
static uint64_t  //
28049
wuffs_private_impl__swizzle_xxxxxxxx__index__src(uint8_t* dst_ptr,
28050
                                                 size_t dst_len,
28051
                                                 uint8_t* dst_palette_ptr,
28052
                                                 size_t dst_palette_len,
28053
                                                 const uint8_t* src_ptr,
28054
0
                                                 size_t src_len) {
28055
0
  if (dst_palette_len !=
28056
0
      WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
28057
0
    return 0;
28058
0
  }
28059
0
  size_t dst_len8 = dst_len / 8;
28060
0
  size_t len = (dst_len8 < src_len) ? dst_len8 : src_len;
28061
0
  uint8_t* d = dst_ptr;
28062
0
  const uint8_t* s = src_ptr;
28063
0
  size_t n = len;
28064
28065
0
  while (n >= 1) {
28066
0
    wuffs_base__poke_u64le__no_bounds_check(
28067
0
        d + (0 * 8), wuffs_base__color_u32__as__color_u64(
28068
0
                         wuffs_base__peek_u32le__no_bounds_check(
28069
0
                             dst_palette_ptr + ((size_t)s[0] * 4))));
28070
28071
0
    s += 1 * 1;
28072
0
    d += 1 * 8;
28073
0
    n -= 1;
28074
0
  }
28075
28076
0
  return len;
28077
0
}
28078
28079
static uint64_t  //
28080
wuffs_private_impl__swizzle_xxxxxxxx__index_binary_alpha__src_over(
28081
    uint8_t* dst_ptr,
28082
    size_t dst_len,
28083
    uint8_t* dst_palette_ptr,
28084
    size_t dst_palette_len,
28085
    const uint8_t* src_ptr,
28086
0
    size_t src_len) {
28087
0
  if (dst_palette_len !=
28088
0
      WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
28089
0
    return 0;
28090
0
  }
28091
0
  size_t dst_len8 = dst_len / 8;
28092
0
  size_t len = (dst_len8 < src_len) ? dst_len8 : src_len;
28093
0
  uint8_t* d = dst_ptr;
28094
0
  const uint8_t* s = src_ptr;
28095
0
  size_t n = len;
28096
28097
0
  while (n >= 1) {
28098
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
28099
0
                                                          ((size_t)s[0] * 4));
28100
0
    if (s0) {
28101
0
      wuffs_base__poke_u64le__no_bounds_check(
28102
0
          d + (0 * 8), wuffs_base__color_u32__as__color_u64(s0));
28103
0
    }
28104
28105
0
    s += 1 * 1;
28106
0
    d += 1 * 8;
28107
0
    n -= 1;
28108
0
  }
28109
28110
0
  return len;
28111
0
}
28112
28113
static uint64_t  //
28114
wuffs_private_impl__swizzle_xxxxxxxx__y(uint8_t* dst_ptr,
28115
                                        size_t dst_len,
28116
                                        uint8_t* dst_palette_ptr,
28117
                                        size_t dst_palette_len,
28118
                                        const uint8_t* src_ptr,
28119
0
                                        size_t src_len) {
28120
0
  size_t dst_len8 = dst_len / 8;
28121
0
  size_t len = (dst_len8 < src_len) ? dst_len8 : src_len;
28122
0
  uint8_t* d = dst_ptr;
28123
0
  const uint8_t* s = src_ptr;
28124
0
  size_t n = len;
28125
28126
0
  while (n >= 1) {
28127
0
    wuffs_base__poke_u64le__no_bounds_check(
28128
0
        d + (0 * 8), 0xFFFF000000000000 | (0x010101010101 * (uint64_t)s[0]));
28129
28130
0
    s += 1 * 1;
28131
0
    d += 1 * 8;
28132
0
    n -= 1;
28133
0
  }
28134
28135
0
  return len;
28136
0
}
28137
28138
static uint64_t  //
28139
wuffs_private_impl__swizzle_xxxxxxxx__y_16be(uint8_t* dst_ptr,
28140
                                             size_t dst_len,
28141
                                             uint8_t* dst_palette_ptr,
28142
                                             size_t dst_palette_len,
28143
                                             const uint8_t* src_ptr,
28144
0
                                             size_t src_len) {
28145
0
  size_t dst_len8 = dst_len / 8;
28146
0
  size_t src_len2 = src_len / 2;
28147
0
  size_t len = (dst_len8 < src_len2) ? dst_len8 : src_len2;
28148
0
  uint8_t* d = dst_ptr;
28149
0
  const uint8_t* s = src_ptr;
28150
0
  size_t n = len;
28151
28152
0
  while (n >= 1) {
28153
0
    uint64_t s0 =
28154
0
        ((uint64_t)(wuffs_base__peek_u16be__no_bounds_check(s + (0 * 2))));
28155
0
    wuffs_base__poke_u64le__no_bounds_check(
28156
0
        d + (0 * 8), 0xFFFF000000000000 | (0x000100010001 * s0));
28157
28158
0
    s += 1 * 2;
28159
0
    d += 1 * 8;
28160
0
    n -= 1;
28161
0
  }
28162
28163
0
  return len;
28164
0
}
28165
28166
// --------
28167
28168
static uint64_t  //
28169
wuffs_private_impl__swizzle_y__bgr(uint8_t* dst_ptr,
28170
                                   size_t dst_len,
28171
                                   uint8_t* dst_palette_ptr,
28172
                                   size_t dst_palette_len,
28173
                                   const uint8_t* src_ptr,
28174
0
                                   size_t src_len) {
28175
0
  size_t src_len3 = src_len / 3;
28176
0
  size_t len = (dst_len < src_len3) ? dst_len : src_len3;
28177
0
  uint8_t* d = dst_ptr;
28178
0
  const uint8_t* s = src_ptr;
28179
0
  size_t n = len;
28180
28181
  // TODO: unroll.
28182
28183
0
  while (n >= 1) {
28184
0
    uint32_t s0 =
28185
0
        0xFF000000 | wuffs_base__peek_u24le__no_bounds_check(s + (0 * 3));
28186
0
    d[0] = wuffs_base__color_u32_argb_premul__as__color_u8_gray(s0);
28187
28188
0
    s += 1 * 3;
28189
0
    d += 1 * 1;
28190
0
    n -= 1;
28191
0
  }
28192
28193
0
  return len;
28194
0
}
28195
28196
static uint64_t  //
28197
wuffs_private_impl__swizzle_y__bgr_565(uint8_t* dst_ptr,
28198
                                       size_t dst_len,
28199
                                       uint8_t* dst_palette_ptr,
28200
                                       size_t dst_palette_len,
28201
                                       const uint8_t* src_ptr,
28202
0
                                       size_t src_len) {
28203
0
  size_t src_len2 = src_len / 2;
28204
0
  size_t len = (dst_len < src_len2) ? dst_len : src_len2;
28205
0
  uint8_t* d = dst_ptr;
28206
0
  const uint8_t* s = src_ptr;
28207
0
  size_t n = len;
28208
28209
  // TODO: unroll.
28210
28211
0
  while (n >= 1) {
28212
0
    uint32_t s0 = wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul(
28213
0
        wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2)));
28214
0
    d[0] = wuffs_base__color_u32_argb_premul__as__color_u8_gray(s0);
28215
28216
0
    s += 1 * 2;
28217
0
    d += 1 * 1;
28218
0
    n -= 1;
28219
0
  }
28220
28221
0
  return len;
28222
0
}
28223
28224
static uint64_t  //
28225
wuffs_private_impl__swizzle_y__bgra_nonpremul__src(uint8_t* dst_ptr,
28226
                                                   size_t dst_len,
28227
                                                   uint8_t* dst_palette_ptr,
28228
                                                   size_t dst_palette_len,
28229
                                                   const uint8_t* src_ptr,
28230
0
                                                   size_t src_len) {
28231
0
  size_t src_len4 = src_len / 4;
28232
0
  size_t len = (dst_len < src_len4) ? dst_len : src_len4;
28233
0
  uint8_t* d = dst_ptr;
28234
0
  const uint8_t* s = src_ptr;
28235
0
  size_t n = len;
28236
28237
  // TODO: unroll.
28238
28239
0
  while (n >= 1) {
28240
0
    uint32_t s0 =
28241
0
        wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(
28242
0
            wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
28243
0
    d[0] = wuffs_base__color_u32_argb_premul__as__color_u8_gray(s0);
28244
28245
0
    s += 1 * 4;
28246
0
    d += 1 * 1;
28247
0
    n -= 1;
28248
0
  }
28249
28250
0
  return len;
28251
0
}
28252
28253
static uint64_t  //
28254
wuffs_private_impl__swizzle_y__bgra_nonpremul__src_over(
28255
    uint8_t* dst_ptr,
28256
    size_t dst_len,
28257
    uint8_t* dst_palette_ptr,
28258
    size_t dst_palette_len,
28259
    const uint8_t* src_ptr,
28260
0
    size_t src_len) {
28261
0
  size_t src_len4 = src_len / 4;
28262
0
  size_t len = (dst_len < src_len4) ? dst_len : src_len4;
28263
0
  uint8_t* d = dst_ptr;
28264
0
  const uint8_t* s = src_ptr;
28265
0
  size_t n = len;
28266
28267
  // TODO: unroll.
28268
28269
0
  while (n >= 1) {
28270
0
    uint32_t d0 = 0xFF000000 | (0x00010101 * ((uint32_t)(d[0])));
28271
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4));
28272
0
    d[0] = wuffs_base__color_u32_argb_premul__as__color_u8_gray(
28273
0
        wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0));
28274
28275
0
    s += 1 * 4;
28276
0
    d += 1 * 1;
28277
0
    n -= 1;
28278
0
  }
28279
28280
0
  return len;
28281
0
}
28282
28283
static uint64_t  //
28284
wuffs_private_impl__swizzle_y__bgra_nonpremul_4x16le__src(
28285
    uint8_t* dst_ptr,
28286
    size_t dst_len,
28287
    uint8_t* dst_palette_ptr,
28288
    size_t dst_palette_len,
28289
    const uint8_t* src_ptr,
28290
0
    size_t src_len) {
28291
0
  size_t src_len8 = src_len / 8;
28292
0
  size_t len = (dst_len < src_len8) ? dst_len : src_len8;
28293
0
  uint8_t* d = dst_ptr;
28294
0
  const uint8_t* s = src_ptr;
28295
0
  size_t n = len;
28296
28297
  // TODO: unroll.
28298
28299
0
  while (n >= 1) {
28300
0
    d[0] = wuffs_base__color_u64_argb_nonpremul__as__color_u8_gray(
28301
0
        wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)));
28302
28303
0
    s += 1 * 8;
28304
0
    d += 1 * 1;
28305
0
    n -= 1;
28306
0
  }
28307
28308
0
  return len;
28309
0
}
28310
28311
static uint64_t  //
28312
wuffs_private_impl__swizzle_y__bgra_nonpremul_4x16le__src_over(
28313
    uint8_t* dst_ptr,
28314
    size_t dst_len,
28315
    uint8_t* dst_palette_ptr,
28316
    size_t dst_palette_len,
28317
    const uint8_t* src_ptr,
28318
0
    size_t src_len) {
28319
0
  size_t src_len8 = src_len / 8;
28320
0
  size_t len = (dst_len < src_len8) ? dst_len : src_len8;
28321
0
  uint8_t* d = dst_ptr;
28322
0
  const uint8_t* s = src_ptr;
28323
0
  size_t n = len;
28324
28325
  // TODO: unroll.
28326
28327
0
  while (n >= 1) {
28328
    // Extract 16-bit color components.
28329
0
    uint32_t dr = 0x101 * ((uint32_t)d[0]);
28330
0
    uint32_t dg = 0x101 * ((uint32_t)d[0]);
28331
0
    uint32_t db = 0x101 * ((uint32_t)d[0]);
28332
0
    uint32_t sa = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 6));
28333
0
    uint32_t sr = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 4));
28334
0
    uint32_t sg = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 2));
28335
0
    uint32_t sb = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 0));
28336
28337
    // Calculate the inverse of the src-alpha: how much of the dst to keep.
28338
0
    uint32_t ia = 0xFFFF - sa;
28339
28340
    // Composite src (nonpremul) over dst (premul).
28341
0
    dr = ((sr * sa) + (dr * ia)) / 0xFFFF;
28342
0
    dg = ((sg * sa) + (dg * ia)) / 0xFFFF;
28343
0
    db = ((sb * sa) + (db * ia)) / 0xFFFF;
28344
28345
    // Convert to 16-bit color to 8-bit gray.
28346
0
    uint32_t weighted_average =
28347
0
        (19595 * dr) + (38470 * dg) + (7471 * db) + 32768;
28348
0
    d[0] = (uint8_t)(weighted_average >> 24);
28349
28350
0
    s += 1 * 8;
28351
0
    d += 1 * 1;
28352
0
    n -= 1;
28353
0
  }
28354
28355
0
  return len;
28356
0
}
28357
28358
static uint64_t  //
28359
wuffs_private_impl__swizzle_y__bgra_premul__src(uint8_t* dst_ptr,
28360
                                                size_t dst_len,
28361
                                                uint8_t* dst_palette_ptr,
28362
                                                size_t dst_palette_len,
28363
                                                const uint8_t* src_ptr,
28364
0
                                                size_t src_len) {
28365
0
  size_t src_len4 = src_len / 4;
28366
0
  size_t len = (dst_len < src_len4) ? dst_len : src_len4;
28367
0
  uint8_t* d = dst_ptr;
28368
0
  const uint8_t* s = src_ptr;
28369
0
  size_t n = len;
28370
28371
  // TODO: unroll.
28372
28373
0
  while (n >= 1) {
28374
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4));
28375
0
    d[0] = wuffs_base__color_u32_argb_premul__as__color_u8_gray(s0);
28376
28377
0
    s += 1 * 4;
28378
0
    d += 1 * 1;
28379
0
    n -= 1;
28380
0
  }
28381
28382
0
  return len;
28383
0
}
28384
28385
static uint64_t  //
28386
wuffs_private_impl__swizzle_y__bgra_premul__src_over(uint8_t* dst_ptr,
28387
                                                     size_t dst_len,
28388
                                                     uint8_t* dst_palette_ptr,
28389
                                                     size_t dst_palette_len,
28390
                                                     const uint8_t* src_ptr,
28391
0
                                                     size_t src_len) {
28392
0
  size_t src_len4 = src_len / 4;
28393
0
  size_t len = (dst_len < src_len4) ? dst_len : src_len4;
28394
0
  uint8_t* d = dst_ptr;
28395
0
  const uint8_t* s = src_ptr;
28396
0
  size_t n = len;
28397
28398
  // TODO: unroll.
28399
28400
0
  while (n >= 1) {
28401
    // Extract 16-bit color components.
28402
0
    uint32_t dr = 0x101 * ((uint32_t)d[0]);
28403
0
    uint32_t dg = 0x101 * ((uint32_t)d[0]);
28404
0
    uint32_t db = 0x101 * ((uint32_t)d[0]);
28405
0
    uint32_t sa = 0x101 * ((uint32_t)s[3]);
28406
0
    uint32_t sr = 0x101 * ((uint32_t)s[2]);
28407
0
    uint32_t sg = 0x101 * ((uint32_t)s[1]);
28408
0
    uint32_t sb = 0x101 * ((uint32_t)s[0]);
28409
28410
    // Calculate the inverse of the src-alpha: how much of the dst to keep.
28411
0
    uint32_t ia = 0xFFFF - sa;
28412
28413
    // Composite src (premul) over dst (premul).
28414
0
    dr = sr + ((dr * ia) / 0xFFFF);
28415
0
    dg = sg + ((dg * ia) / 0xFFFF);
28416
0
    db = sb + ((db * ia) / 0xFFFF);
28417
28418
    // Convert to 16-bit color to 8-bit gray.
28419
0
    uint32_t weighted_average =
28420
0
        (19595 * dr) + (38470 * dg) + (7471 * db) + 32768;
28421
0
    d[0] = (uint8_t)(weighted_average >> 24);
28422
28423
0
    s += 1 * 4;
28424
0
    d += 1 * 1;
28425
0
    n -= 1;
28426
0
  }
28427
28428
0
  return len;
28429
0
}
28430
28431
static uint64_t  //
28432
wuffs_private_impl__swizzle_y__bgrx(uint8_t* dst_ptr,
28433
                                    size_t dst_len,
28434
                                    uint8_t* dst_palette_ptr,
28435
                                    size_t dst_palette_len,
28436
                                    const uint8_t* src_ptr,
28437
0
                                    size_t src_len) {
28438
0
  size_t src_len4 = src_len / 4;
28439
0
  size_t len = (dst_len < src_len4) ? dst_len : src_len4;
28440
0
  uint8_t* d = dst_ptr;
28441
0
  const uint8_t* s = src_ptr;
28442
0
  size_t n = len;
28443
28444
  // TODO: unroll.
28445
28446
0
  while (n >= 1) {
28447
0
    uint32_t s0 =
28448
0
        0xFF000000 | wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4));
28449
0
    d[0] = wuffs_base__color_u32_argb_premul__as__color_u8_gray(s0);
28450
28451
0
    s += 1 * 4;
28452
0
    d += 1 * 1;
28453
0
    n -= 1;
28454
0
  }
28455
28456
0
  return len;
28457
0
}
28458
28459
static uint64_t  //
28460
wuffs_private_impl__swizzle_y__rgb(uint8_t* dst_ptr,
28461
                                   size_t dst_len,
28462
                                   uint8_t* dst_palette_ptr,
28463
                                   size_t dst_palette_len,
28464
                                   const uint8_t* src_ptr,
28465
0
                                   size_t src_len) {
28466
0
  size_t src_len3 = src_len / 3;
28467
0
  size_t len = (dst_len < src_len3) ? dst_len : src_len3;
28468
0
  uint8_t* d = dst_ptr;
28469
0
  const uint8_t* s = src_ptr;
28470
0
  size_t n = len;
28471
28472
  // TODO: unroll.
28473
28474
0
  while (n >= 1) {
28475
0
    uint32_t s0 =
28476
0
        0xFF000000 | wuffs_base__peek_u24be__no_bounds_check(s + (0 * 3));
28477
0
    d[0] = wuffs_base__color_u32_argb_premul__as__color_u8_gray(s0);
28478
28479
0
    s += 1 * 3;
28480
0
    d += 1 * 1;
28481
0
    n -= 1;
28482
0
  }
28483
28484
0
  return len;
28485
0
}
28486
28487
static uint64_t  //
28488
wuffs_private_impl__swizzle_y__rgba_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 src_len4 = src_len / 4;
28495
0
  size_t len = (dst_len < src_len4) ? dst_len : src_len4;
28496
0
  uint8_t* d = dst_ptr;
28497
0
  const uint8_t* s = src_ptr;
28498
0
  size_t n = len;
28499
28500
  // TODO: unroll.
28501
28502
0
  while (n >= 1) {
28503
0
    uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr(
28504
0
        wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(
28505
0
            wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))));
28506
0
    d[0] = wuffs_base__color_u32_argb_premul__as__color_u8_gray(s0);
28507
28508
0
    s += 1 * 4;
28509
0
    d += 1 * 1;
28510
0
    n -= 1;
28511
0
  }
28512
28513
0
  return len;
28514
0
}
28515
28516
static uint64_t  //
28517
wuffs_private_impl__swizzle_y__rgba_nonpremul__src_over(
28518
    uint8_t* dst_ptr,
28519
    size_t dst_len,
28520
    uint8_t* dst_palette_ptr,
28521
    size_t dst_palette_len,
28522
    const uint8_t* src_ptr,
28523
0
    size_t src_len) {
28524
0
  size_t src_len4 = src_len / 4;
28525
0
  size_t len = (dst_len < src_len4) ? dst_len : src_len4;
28526
0
  uint8_t* d = dst_ptr;
28527
0
  const uint8_t* s = src_ptr;
28528
0
  size_t n = len;
28529
28530
  // TODO: unroll.
28531
28532
0
  while (n >= 1) {
28533
0
    uint32_t d0 = 0xFF000000 | (0x00010101 * ((uint32_t)(d[0])));
28534
0
    uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr(
28535
0
        wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
28536
0
    d[0] = wuffs_base__color_u32_argb_premul__as__color_u8_gray(
28537
0
        wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0));
28538
28539
0
    s += 1 * 4;
28540
0
    d += 1 * 1;
28541
0
    n -= 1;
28542
0
  }
28543
28544
0
  return len;
28545
0
}
28546
28547
static uint64_t  //
28548
wuffs_private_impl__swizzle_y__rgba_premul__src(uint8_t* dst_ptr,
28549
                                                size_t dst_len,
28550
                                                uint8_t* dst_palette_ptr,
28551
                                                size_t dst_palette_len,
28552
                                                const uint8_t* src_ptr,
28553
0
                                                size_t src_len) {
28554
0
  size_t src_len4 = src_len / 4;
28555
0
  size_t len = (dst_len < src_len4) ? dst_len : src_len4;
28556
0
  uint8_t* d = dst_ptr;
28557
0
  const uint8_t* s = src_ptr;
28558
0
  size_t n = len;
28559
28560
  // TODO: unroll.
28561
28562
0
  while (n >= 1) {
28563
0
    uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr(
28564
0
        wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
28565
0
    d[0] = wuffs_base__color_u32_argb_premul__as__color_u8_gray(s0);
28566
28567
0
    s += 1 * 4;
28568
0
    d += 1 * 1;
28569
0
    n -= 1;
28570
0
  }
28571
28572
0
  return len;
28573
0
}
28574
28575
static uint64_t  //
28576
wuffs_private_impl__swizzle_y__rgba_premul__src_over(uint8_t* dst_ptr,
28577
                                                     size_t dst_len,
28578
                                                     uint8_t* dst_palette_ptr,
28579
                                                     size_t dst_palette_len,
28580
                                                     const uint8_t* src_ptr,
28581
0
                                                     size_t src_len) {
28582
0
  size_t src_len4 = src_len / 4;
28583
0
  size_t len = (dst_len < src_len4) ? dst_len : src_len4;
28584
0
  uint8_t* d = dst_ptr;
28585
0
  const uint8_t* s = src_ptr;
28586
0
  size_t n = len;
28587
28588
  // TODO: unroll.
28589
28590
0
  while (n >= 1) {
28591
0
    uint32_t d0 = 0xFF000000 | (0x00010101 * ((uint32_t)(d[0])));
28592
0
    uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr(
28593
0
        wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
28594
0
    d[0] = wuffs_base__color_u32_argb_premul__as__color_u8_gray(
28595
0
        wuffs_private_impl__composite_premul_premul_u32_axxx(d0, s0));
28596
28597
0
    s += 1 * 4;
28598
0
    d += 1 * 1;
28599
0
    n -= 1;
28600
0
  }
28601
28602
0
  return len;
28603
0
}
28604
28605
static uint64_t  //
28606
wuffs_private_impl__swizzle_y__y_16be(uint8_t* dst_ptr,
28607
                                      size_t dst_len,
28608
                                      uint8_t* dst_palette_ptr,
28609
                                      size_t dst_palette_len,
28610
                                      const uint8_t* src_ptr,
28611
0
                                      size_t src_len) {
28612
0
  size_t src_len2 = src_len / 2;
28613
0
  size_t len = (dst_len < src_len2) ? dst_len : src_len2;
28614
0
  uint8_t* d = dst_ptr;
28615
0
  const uint8_t* s = src_ptr;
28616
0
  size_t n = len;
28617
28618
  // TODO: unroll.
28619
28620
0
  while (n >= 1) {
28621
0
    d[0] = s[0];
28622
28623
0
    s += 1 * 2;
28624
0
    d += 1 * 1;
28625
0
    n -= 1;
28626
0
  }
28627
28628
0
  return len;
28629
0
}
28630
28631
static uint64_t  //
28632
wuffs_private_impl__swizzle_y__ya_nonpremul__src(uint8_t* dst_ptr,
28633
                                                 size_t dst_len,
28634
                                                 uint8_t* dst_palette_ptr,
28635
                                                 size_t dst_palette_len,
28636
                                                 const uint8_t* src_ptr,
28637
0
                                                 size_t src_len) {
28638
0
  size_t src_len2 = src_len / 2;
28639
0
  size_t len = (dst_len < src_len2) ? dst_len : src_len2;
28640
0
  uint8_t* d = dst_ptr;
28641
0
  const uint8_t* s = src_ptr;
28642
0
  size_t n = len;
28643
28644
  // TODO: unroll.
28645
28646
0
  while (n >= 1) {
28647
0
    uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101);
28648
0
    d[0] = (uint8_t)
28649
0
        wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(s0);
28650
28651
0
    s += 1 * 2;
28652
0
    d += 1 * 1;
28653
0
    n -= 1;
28654
0
  }
28655
28656
0
  return len;
28657
0
}
28658
28659
static uint64_t  //
28660
wuffs_private_impl__swizzle_y__ya_nonpremul__src_over(uint8_t* dst_ptr,
28661
                                                      size_t dst_len,
28662
                                                      uint8_t* dst_palette_ptr,
28663
                                                      size_t dst_palette_len,
28664
                                                      const uint8_t* src_ptr,
28665
0
                                                      size_t src_len) {
28666
0
  size_t src_len2 = src_len / 2;
28667
0
  size_t len = (dst_len < src_len2) ? dst_len : src_len2;
28668
0
  uint8_t* d = dst_ptr;
28669
0
  const uint8_t* s = src_ptr;
28670
0
  size_t n = len;
28671
28672
  // TODO: unroll.
28673
28674
0
  while (n >= 1) {
28675
0
    uint32_t d0 = 0xFF000000 | ((uint32_t)(d[0]) * 0x010101);
28676
0
    uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101);
28677
0
    d[0] = (uint8_t)wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0,
28678
0
                                                                            s0);
28679
28680
0
    s += 1 * 2;
28681
0
    d += 1 * 1;
28682
0
    n -= 1;
28683
0
  }
28684
28685
0
  return len;
28686
0
}
28687
28688
static uint64_t  //
28689
wuffs_private_impl__swizzle_y__index__src(uint8_t* dst_ptr,
28690
                                          size_t dst_len,
28691
                                          uint8_t* dst_palette_ptr,
28692
                                          size_t dst_palette_len,
28693
                                          const uint8_t* src_ptr,
28694
0
                                          size_t src_len) {
28695
0
  if (dst_palette_len !=
28696
0
      WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
28697
0
    return 0;
28698
0
  }
28699
0
  size_t len = (dst_len < src_len) ? dst_len : src_len;
28700
0
  uint8_t* d = dst_ptr;
28701
0
  const uint8_t* s = src_ptr;
28702
0
  size_t n = len;
28703
28704
  // TODO: unroll.
28705
28706
0
  while (n >= 1) {
28707
0
    d[0] = dst_palette_ptr[(size_t)s[0] * 4];
28708
28709
0
    s += 1 * 1;
28710
0
    d += 1 * 1;
28711
0
    n -= 1;
28712
0
  }
28713
28714
0
  return len;
28715
0
}
28716
28717
static uint64_t  //
28718
wuffs_private_impl__swizzle_y__index_bgra_nonpremul__src_over(
28719
    uint8_t* dst_ptr,
28720
    size_t dst_len,
28721
    uint8_t* dst_palette_ptr,
28722
    size_t dst_palette_len,
28723
    const uint8_t* src_ptr,
28724
0
    size_t src_len) {
28725
0
  if (dst_palette_len !=
28726
0
      WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
28727
0
    return 0;
28728
0
  }
28729
0
  size_t len = (dst_len < src_len) ? dst_len : src_len;
28730
0
  uint8_t* d = dst_ptr;
28731
0
  const uint8_t* s = src_ptr;
28732
0
  size_t n = len;
28733
28734
  // TODO: unroll.
28735
28736
0
  while (n >= 1) {
28737
0
    uint32_t d0 = 0xFF000000 | (0x00010101 * ((uint32_t)(d[0])));
28738
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
28739
0
                                                          ((size_t)s[0] * 4));
28740
0
    d[0] = wuffs_base__color_u32_argb_premul__as__color_u8_gray(
28741
0
        wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0));
28742
28743
0
    s += 1 * 1;
28744
0
    d += 1 * 1;
28745
0
    n -= 1;
28746
0
  }
28747
28748
0
  return len;
28749
0
}
28750
28751
static uint64_t  //
28752
wuffs_private_impl__swizzle_y__index_binary_alpha__src_over(
28753
    uint8_t* dst_ptr,
28754
    size_t dst_len,
28755
    uint8_t* dst_palette_ptr,
28756
    size_t dst_palette_len,
28757
    const uint8_t* src_ptr,
28758
0
    size_t src_len) {
28759
0
  if (dst_palette_len !=
28760
0
      WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
28761
0
    return 0;
28762
0
  }
28763
0
  size_t len = (dst_len < src_len) ? dst_len : src_len;
28764
0
  uint8_t* d = dst_ptr;
28765
0
  const uint8_t* s = src_ptr;
28766
0
  size_t n = len;
28767
28768
  // TODO: unroll.
28769
28770
0
  while (n >= 1) {
28771
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
28772
0
                                                          ((size_t)s[0] * 4));
28773
0
    if (s0) {
28774
0
      d[0] = (uint8_t)s0;
28775
0
    }
28776
28777
0
    s += 1 * 1;
28778
0
    d += 1 * 1;
28779
0
    n -= 1;
28780
0
  }
28781
28782
0
  return len;
28783
0
}
28784
28785
// --------
28786
28787
static uint64_t  //
28788
wuffs_private_impl__swizzle_y_16le__y_16be(uint8_t* dst_ptr,
28789
                                           size_t dst_len,
28790
                                           uint8_t* dst_palette_ptr,
28791
                                           size_t dst_palette_len,
28792
                                           const uint8_t* src_ptr,
28793
415k
                                           size_t src_len) {
28794
415k
  size_t dst_len2 = dst_len / 2;
28795
415k
  size_t src_len2 = src_len / 2;
28796
415k
  size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2;
28797
415k
  uint8_t* d = dst_ptr;
28798
415k
  const uint8_t* s = src_ptr;
28799
415k
  size_t n = len;
28800
28801
1.69M
  while (n >= 1) {
28802
1.28M
    uint8_t s0 = s[0];
28803
1.28M
    uint8_t s1 = s[1];
28804
1.28M
    d[0] = s1;
28805
1.28M
    d[1] = s0;
28806
28807
1.28M
    s += 1 * 2;
28808
1.28M
    d += 1 * 2;
28809
1.28M
    n -= 1;
28810
1.28M
  }
28811
28812
415k
  return len;
28813
415k
}
28814
28815
// --------
28816
28817
static uint64_t  //
28818
wuffs_private_impl__swizzle_ya_nonpremul__ya_nonpremul__src_over(
28819
    uint8_t* dst_ptr,
28820
    size_t dst_len,
28821
    uint8_t* dst_palette_ptr,
28822
    size_t dst_palette_len,
28823
    const uint8_t* src_ptr,
28824
0
    size_t src_len) {
28825
0
  size_t dst_len2 = dst_len / 2;
28826
0
  size_t src_len2 = src_len / 2;
28827
0
  size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2;
28828
0
  uint8_t* d = dst_ptr;
28829
0
  const uint8_t* s = src_ptr;
28830
0
  size_t n = len;
28831
28832
0
  while (n >= 1) {
28833
0
    uint32_t d0 = ((uint32_t)(d[1]) << 24) | ((uint32_t)(d[0]) * 0x010101);
28834
0
    uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101);
28835
0
    uint32_t c0 =
28836
0
        wuffs_private_impl__composite_nonpremul_nonpremul_u32_axxx(d0, s0);
28837
0
    wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)(c0 >> 16));
28838
28839
0
    s += 1 * 2;
28840
0
    d += 1 * 2;
28841
0
    n -= 1;
28842
0
  }
28843
28844
0
  return len;
28845
0
}
28846
28847
// --------
28848
28849
static uint64_t  //
28850
wuffs_private_impl__swizzle_transparent_black_src(
28851
    uint8_t* dst_ptr,
28852
    size_t dst_len,
28853
    uint8_t* dst_palette_ptr,
28854
    size_t dst_palette_len,
28855
    uint64_t num_pixels,
28856
0
    uint32_t dst_pixfmt_bytes_per_pixel) {
28857
0
  uint64_t n = ((uint64_t)dst_len) / dst_pixfmt_bytes_per_pixel;
28858
0
  if (n > num_pixels) {
28859
0
    n = num_pixels;
28860
0
  }
28861
0
  memset(dst_ptr, 0, ((size_t)(n * dst_pixfmt_bytes_per_pixel)));
28862
0
  return n;
28863
0
}
28864
28865
static uint64_t  //
28866
wuffs_private_impl__swizzle_transparent_black_src_over(
28867
    uint8_t* dst_ptr,
28868
    size_t dst_len,
28869
    uint8_t* dst_palette_ptr,
28870
    size_t dst_palette_len,
28871
    uint64_t num_pixels,
28872
0
    uint32_t dst_pixfmt_bytes_per_pixel) {
28873
0
  uint64_t n = ((uint64_t)dst_len) / dst_pixfmt_bytes_per_pixel;
28874
0
  if (n > num_pixels) {
28875
0
    n = num_pixels;
28876
0
  }
28877
0
  return n;
28878
0
}
28879
28880
// --------
28881
28882
static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func  //
28883
wuffs_private_impl__pixel_swizzler__prepare__y(
28884
    wuffs_base__pixel_swizzler* p,
28885
    wuffs_base__pixel_format dst_pixfmt,
28886
    wuffs_base__slice_u8 dst_palette,
28887
    wuffs_base__slice_u8 src_palette,
28888
1.38k
    wuffs_base__pixel_blend blend) {
28889
1.38k
  switch (dst_pixfmt.repr) {
28890
709
    case WUFFS_BASE__PIXEL_FORMAT__Y:
28891
709
      return wuffs_private_impl__swizzle_copy_1_1;
28892
28893
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
28894
0
      return wuffs_private_impl__swizzle_bgr_565__y;
28895
28896
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
28897
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
28898
0
      return wuffs_private_impl__swizzle_xxx__y;
28899
28900
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
28901
671
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
28902
671
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
28903
671
    case WUFFS_BASE__PIXEL_FORMAT__BGRX:
28904
671
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
28905
671
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
28906
671
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
28907
671
    case WUFFS_BASE__PIXEL_FORMAT__RGBX:
28908
671
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
28909
671
      if (wuffs_base__cpu_arch__have_x86_sse42()) {
28910
671
        return wuffs_private_impl__swizzle_xxxx__y__x86_sse42;
28911
671
      }
28912
0
#endif
28913
0
      return wuffs_private_impl__swizzle_xxxx__y;
28914
28915
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
28916
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE:
28917
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL_4X16LE:
28918
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL_4X16LE:
28919
0
      return wuffs_private_impl__swizzle_xxxxxxxx__y;
28920
1.38k
  }
28921
0
  return NULL;
28922
1.38k
}
28923
28924
static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func  //
28925
wuffs_private_impl__pixel_swizzler__prepare__y_16be(
28926
    wuffs_base__pixel_swizzler* p,
28927
    wuffs_base__pixel_format dst_pixfmt,
28928
    wuffs_base__slice_u8 dst_palette,
28929
    wuffs_base__slice_u8 src_palette,
28930
184
    wuffs_base__pixel_blend blend) {
28931
184
  switch (dst_pixfmt.repr) {
28932
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
28933
0
      return wuffs_private_impl__swizzle_y__y_16be;
28934
28935
93
    case WUFFS_BASE__PIXEL_FORMAT__Y_16LE:
28936
93
      return wuffs_private_impl__swizzle_y_16le__y_16be;
28937
28938
0
    case WUFFS_BASE__PIXEL_FORMAT__Y_16BE:
28939
0
      return wuffs_private_impl__swizzle_copy_2_2;
28940
28941
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
28942
0
      return wuffs_private_impl__swizzle_bgr_565__y_16be;
28943
28944
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
28945
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
28946
0
      return wuffs_private_impl__swizzle_xxx__y_16be;
28947
28948
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
28949
91
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
28950
91
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
28951
91
    case WUFFS_BASE__PIXEL_FORMAT__BGRX:
28952
91
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
28953
91
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
28954
91
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
28955
91
    case WUFFS_BASE__PIXEL_FORMAT__RGBX:
28956
91
      return wuffs_private_impl__swizzle_xxxx__y_16be;
28957
28958
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
28959
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE:
28960
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL_4X16LE:
28961
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL_4X16LE:
28962
0
      return wuffs_private_impl__swizzle_xxxxxxxx__y_16be;
28963
184
  }
28964
0
  return NULL;
28965
184
}
28966
28967
static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func  //
28968
wuffs_private_impl__pixel_swizzler__prepare__ya_nonpremul(
28969
    wuffs_base__pixel_swizzler* p,
28970
    wuffs_base__pixel_format dst_pixfmt,
28971
    wuffs_base__slice_u8 dst_palette,
28972
    wuffs_base__slice_u8 src_palette,
28973
115
    wuffs_base__pixel_blend blend) {
28974
115
  switch (dst_pixfmt.repr) {
28975
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
28976
0
      switch (blend) {
28977
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
28978
0
          return wuffs_private_impl__swizzle_y__ya_nonpremul__src;
28979
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
28980
0
          return wuffs_private_impl__swizzle_y__ya_nonpremul__src_over;
28981
0
      }
28982
0
      return NULL;
28983
28984
53
    case WUFFS_BASE__PIXEL_FORMAT__YA_NONPREMUL:
28985
53
      switch (blend) {
28986
53
        case WUFFS_BASE__PIXEL_BLEND__SRC:
28987
53
          return wuffs_private_impl__swizzle_copy_2_2;
28988
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
28989
0
          return wuffs_private_impl__swizzle_ya_nonpremul__ya_nonpremul__src_over;
28990
53
      }
28991
0
      return NULL;
28992
28993
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
28994
0
      switch (blend) {
28995
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
28996
0
          return wuffs_private_impl__swizzle_bgr_565__ya_nonpremul__src;
28997
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
28998
0
          return wuffs_private_impl__swizzle_bgr_565__ya_nonpremul__src_over;
28999
0
      }
29000
0
      return NULL;
29001
29002
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
29003
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
29004
0
      switch (blend) {
29005
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29006
0
          return wuffs_private_impl__swizzle_xxx__ya_nonpremul__src;
29007
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29008
0
          return wuffs_private_impl__swizzle_xxx__ya_nonpremul__src_over;
29009
0
      }
29010
0
      return NULL;
29011
29012
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
29013
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
29014
0
      switch (blend) {
29015
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29016
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__ya_nonpremul__src;
29017
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29018
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__ya_nonpremul__src_over;
29019
0
      }
29020
0
      return NULL;
29021
29022
62
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
29023
62
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
29024
62
      switch (blend) {
29025
62
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29026
62
          return wuffs_private_impl__swizzle_bgra_premul__ya_nonpremul__src;
29027
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29028
0
          return wuffs_private_impl__swizzle_bgra_premul__ya_nonpremul__src_over;
29029
62
      }
29030
0
      return NULL;
29031
29032
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
29033
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL_4X16LE:
29034
0
      switch (blend) {
29035
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29036
0
          return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__ya_nonpremul__src;
29037
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29038
0
          return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__ya_nonpremul__src_over;
29039
0
      }
29040
0
      return NULL;
29041
115
  }
29042
0
  return NULL;
29043
115
}
29044
29045
static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func  //
29046
wuffs_private_impl__pixel_swizzler__prepare__indexed__bgra_nonpremul(
29047
    wuffs_base__pixel_swizzler* p,
29048
    wuffs_base__pixel_format dst_pixfmt,
29049
    wuffs_base__slice_u8 dst_palette,
29050
    wuffs_base__slice_u8 src_palette,
29051
250
    wuffs_base__pixel_blend blend) {
29052
250
  switch (dst_pixfmt.repr) {
29053
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
29054
0
      switch (blend) {
29055
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29056
0
          if (wuffs_private_impl__swizzle_squash_align4_y_8888(
29057
0
                  dst_palette.ptr, dst_palette.len, src_palette.ptr,
29058
0
                  src_palette.len, true) !=
29059
0
              (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) {
29060
0
            return NULL;
29061
0
          }
29062
0
          return wuffs_private_impl__swizzle_y__index__src;
29063
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29064
0
          if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette,
29065
0
                                                            src_palette) !=
29066
0
              WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
29067
0
            return NULL;
29068
0
          }
29069
0
          return wuffs_private_impl__swizzle_y__index_bgra_nonpremul__src_over;
29070
0
      }
29071
0
      return NULL;
29072
29073
137
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL:
29074
137
      if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette,
29075
137
                                                        src_palette) !=
29076
137
          WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
29077
0
        return NULL;
29078
0
      }
29079
137
      switch (blend) {
29080
137
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29081
137
          return wuffs_private_impl__swizzle_copy_1_1;
29082
137
      }
29083
0
      return NULL;
29084
29085
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
29086
0
      switch (blend) {
29087
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29088
0
          if (wuffs_private_impl__swizzle_squash_align4_bgr_565_8888(
29089
0
                  dst_palette.ptr, dst_palette.len, src_palette.ptr,
29090
0
                  src_palette.len, true) !=
29091
0
              (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) {
29092
0
            return NULL;
29093
0
          }
29094
0
          return wuffs_private_impl__swizzle_bgr_565__index__src;
29095
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29096
0
          if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette,
29097
0
                                                            src_palette) !=
29098
0
              WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
29099
0
            return NULL;
29100
0
          }
29101
0
          return wuffs_private_impl__swizzle_bgr_565__index_bgra_nonpremul__src_over;
29102
0
      }
29103
0
      return NULL;
29104
29105
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
29106
0
      switch (blend) {
29107
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29108
0
          if (wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul__src(
29109
0
                  dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr,
29110
0
                  src_palette.len) !=
29111
0
              (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) {
29112
0
            return NULL;
29113
0
          }
29114
0
          return wuffs_private_impl__swizzle_xxx__index__src;
29115
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29116
0
          if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette,
29117
0
                                                            src_palette) !=
29118
0
              WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
29119
0
            return NULL;
29120
0
          }
29121
0
          return wuffs_private_impl__swizzle_xxx__index_bgra_nonpremul__src_over;
29122
0
      }
29123
0
      return NULL;
29124
29125
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
29126
0
      if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette,
29127
0
                                                        src_palette) !=
29128
0
          WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
29129
0
        return NULL;
29130
0
      }
29131
0
      switch (blend) {
29132
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29133
0
          return wuffs_private_impl__swizzle_xxxx__index__src;
29134
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29135
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__index_bgra_nonpremul__src_over;
29136
0
      }
29137
0
      return NULL;
29138
29139
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
29140
0
      if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette,
29141
0
                                                        src_palette) !=
29142
0
          WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
29143
0
        return NULL;
29144
0
      }
29145
0
      switch (blend) {
29146
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29147
0
          return wuffs_private_impl__swizzle_xxxxxxxx__index__src;
29148
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29149
0
          return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__index_bgra_nonpremul__src_over;
29150
0
      }
29151
0
      return NULL;
29152
29153
113
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
29154
113
      switch (blend) {
29155
113
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29156
113
          if (wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul__src(
29157
113
                  dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr,
29158
113
                  src_palette.len) !=
29159
113
              (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) {
29160
0
            return NULL;
29161
0
          }
29162
113
          return wuffs_private_impl__swizzle_xxxx__index__src;
29163
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29164
0
          if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette,
29165
0
                                                            src_palette) !=
29166
0
              WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
29167
0
            return NULL;
29168
0
          }
29169
0
          return wuffs_private_impl__swizzle_bgra_premul__index_bgra_nonpremul__src_over;
29170
113
      }
29171
0
      return NULL;
29172
29173
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
29174
0
      switch (blend) {
29175
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29176
0
          if (wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul__src(
29177
0
                  dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr,
29178
0
                  src_palette.len) !=
29179
0
              (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) {
29180
0
            return NULL;
29181
0
          }
29182
0
          return wuffs_private_impl__swizzle_xxx__index__src;
29183
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29184
0
          if (wuffs_private_impl__swizzle_swap_rgbx_bgrx(
29185
0
                  dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr,
29186
0
                  src_palette.len) !=
29187
0
              (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) {
29188
0
            return NULL;
29189
0
          }
29190
0
          return wuffs_private_impl__swizzle_xxx__index_bgra_nonpremul__src_over;
29191
0
      }
29192
0
      return NULL;
29193
29194
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
29195
0
      if (wuffs_private_impl__swizzle_swap_rgbx_bgrx(
29196
0
              dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr,
29197
0
              src_palette.len) !=
29198
0
          (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) {
29199
0
        return NULL;
29200
0
      }
29201
0
      switch (blend) {
29202
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29203
0
          return wuffs_private_impl__swizzle_xxxx__index__src;
29204
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29205
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__index_bgra_nonpremul__src_over;
29206
0
      }
29207
0
      return NULL;
29208
29209
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
29210
0
      switch (blend) {
29211
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29212
0
          if (wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul__src(
29213
0
                  dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr,
29214
0
                  src_palette.len) !=
29215
0
              (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) {
29216
0
            return NULL;
29217
0
          }
29218
0
          return wuffs_private_impl__swizzle_xxxx__index__src;
29219
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29220
0
          if (wuffs_private_impl__swizzle_swap_rgbx_bgrx(
29221
0
                  dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr,
29222
0
                  src_palette.len) !=
29223
0
              (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) {
29224
0
            return NULL;
29225
0
          }
29226
0
          return wuffs_private_impl__swizzle_bgra_premul__index_bgra_nonpremul__src_over;
29227
0
      }
29228
0
      return NULL;
29229
29230
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBX:
29231
      // TODO.
29232
0
      break;
29233
250
  }
29234
0
  return NULL;
29235
250
}
29236
29237
static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func  //
29238
wuffs_private_impl__pixel_swizzler__prepare__indexed__bgra_binary(
29239
    wuffs_base__pixel_swizzler* p,
29240
    wuffs_base__pixel_format dst_pixfmt,
29241
    wuffs_base__slice_u8 dst_palette,
29242
    wuffs_base__slice_u8 src_palette,
29243
1.01k
    wuffs_base__pixel_blend blend) {
29244
1.01k
  switch (dst_pixfmt.repr) {
29245
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
29246
0
      if (wuffs_private_impl__swizzle_squash_align4_y_8888(
29247
0
              dst_palette.ptr, dst_palette.len, src_palette.ptr,
29248
0
              src_palette.len, false) !=
29249
0
          (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) {
29250
0
        return NULL;
29251
0
      }
29252
0
      switch (blend) {
29253
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29254
0
          return wuffs_private_impl__swizzle_y__index__src;
29255
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29256
0
          return wuffs_private_impl__swizzle_y__index_binary_alpha__src_over;
29257
0
      }
29258
0
      return NULL;
29259
29260
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL:
29261
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL:
29262
417
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY:
29263
417
      if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette,
29264
417
                                                        src_palette) !=
29265
417
          WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
29266
0
        return NULL;
29267
0
      }
29268
417
      switch (blend) {
29269
417
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29270
417
          return wuffs_private_impl__swizzle_copy_1_1;
29271
417
      }
29272
0
      return NULL;
29273
29274
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
29275
0
      if (wuffs_private_impl__swizzle_squash_align4_bgr_565_8888(
29276
0
              dst_palette.ptr, dst_palette.len, src_palette.ptr,
29277
0
              src_palette.len, false) !=
29278
0
          (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) {
29279
0
        return NULL;
29280
0
      }
29281
0
      switch (blend) {
29282
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29283
0
          return wuffs_private_impl__swizzle_bgr_565__index__src;
29284
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29285
0
          return wuffs_private_impl__swizzle_bgr_565__index_binary_alpha__src_over;
29286
0
      }
29287
0
      return NULL;
29288
29289
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
29290
0
      if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette,
29291
0
                                                        src_palette) !=
29292
0
          WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
29293
0
        return NULL;
29294
0
      }
29295
0
      switch (blend) {
29296
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29297
0
          return wuffs_private_impl__swizzle_xxx__index__src;
29298
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29299
0
          return wuffs_private_impl__swizzle_xxx__index_binary_alpha__src_over;
29300
0
      }
29301
0
      return NULL;
29302
29303
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
29304
598
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
29305
598
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
29306
598
      if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette,
29307
598
                                                        src_palette) !=
29308
598
          WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
29309
0
        return NULL;
29310
0
      }
29311
598
      switch (blend) {
29312
598
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29313
598
          return wuffs_private_impl__swizzle_xxxx__index__src;
29314
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29315
0
          return wuffs_private_impl__swizzle_xxxx__index_binary_alpha__src_over;
29316
598
      }
29317
0
      return NULL;
29318
29319
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
29320
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE:
29321
0
      if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette,
29322
0
                                                        src_palette) !=
29323
0
          WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
29324
0
        return NULL;
29325
0
      }
29326
0
      switch (blend) {
29327
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29328
0
          return wuffs_private_impl__swizzle_xxxxxxxx__index__src;
29329
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29330
0
          return wuffs_private_impl__swizzle_xxxxxxxx__index_binary_alpha__src_over;
29331
0
      }
29332
0
      return NULL;
29333
29334
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
29335
0
      if (wuffs_private_impl__swizzle_swap_rgbx_bgrx(
29336
0
              dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr,
29337
0
              src_palette.len) !=
29338
0
          (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) {
29339
0
        return NULL;
29340
0
      }
29341
0
      switch (blend) {
29342
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29343
0
          return wuffs_private_impl__swizzle_xxx__index__src;
29344
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29345
0
          return wuffs_private_impl__swizzle_xxx__index_binary_alpha__src_over;
29346
0
      }
29347
0
      return NULL;
29348
29349
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
29350
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
29351
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
29352
0
      if (wuffs_private_impl__swizzle_swap_rgbx_bgrx(
29353
0
              dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr,
29354
0
              src_palette.len) !=
29355
0
          (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) {
29356
0
        return NULL;
29357
0
      }
29358
0
      switch (blend) {
29359
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29360
0
          return wuffs_private_impl__swizzle_xxxx__index__src;
29361
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29362
0
          return wuffs_private_impl__swizzle_xxxx__index_binary_alpha__src_over;
29363
0
      }
29364
0
      return NULL;
29365
1.01k
  }
29366
0
  return NULL;
29367
1.01k
}
29368
29369
static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func  //
29370
wuffs_private_impl__pixel_swizzler__prepare__bgr_565(
29371
    wuffs_base__pixel_swizzler* p,
29372
    wuffs_base__pixel_format dst_pixfmt,
29373
    wuffs_base__slice_u8 dst_palette,
29374
    wuffs_base__slice_u8 src_palette,
29375
0
    wuffs_base__pixel_blend blend) {
29376
0
  switch (dst_pixfmt.repr) {
29377
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
29378
0
      return wuffs_private_impl__swizzle_y__bgr_565;
29379
29380
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
29381
0
      return wuffs_private_impl__swizzle_copy_2_2;
29382
29383
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
29384
0
      return wuffs_private_impl__swizzle_bgr__bgr_565;
29385
29386
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
29387
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
29388
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
29389
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRX:
29390
0
      return wuffs_private_impl__swizzle_bgrw__bgr_565;
29391
29392
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
29393
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE:
29394
0
      return wuffs_private_impl__swizzle_bgrw_4x16le__bgr_565;
29395
29396
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
29397
0
      return wuffs_private_impl__swizzle_rgb__bgr_565;
29398
29399
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
29400
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
29401
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
29402
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBX:
29403
0
      return wuffs_private_impl__swizzle_rgbw__bgr_565;
29404
0
  }
29405
0
  return NULL;
29406
0
}
29407
29408
static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func  //
29409
wuffs_private_impl__pixel_swizzler__prepare__bgr(
29410
    wuffs_base__pixel_swizzler* p,
29411
    wuffs_base__pixel_format dst_pixfmt,
29412
    wuffs_base__slice_u8 dst_palette,
29413
    wuffs_base__slice_u8 src_palette,
29414
0
    wuffs_base__pixel_blend blend) {
29415
0
  switch (dst_pixfmt.repr) {
29416
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
29417
0
      return wuffs_private_impl__swizzle_y__bgr;
29418
29419
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
29420
0
      return wuffs_private_impl__swizzle_bgr_565__bgr;
29421
29422
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
29423
0
      return wuffs_private_impl__swizzle_copy_3_3;
29424
29425
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
29426
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
29427
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
29428
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRX:
29429
0
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
29430
0
      if (wuffs_base__cpu_arch__have_x86_sse42()) {
29431
0
        return wuffs_private_impl__swizzle_bgrw__bgr__x86_sse42;
29432
0
      }
29433
0
#endif
29434
0
      return wuffs_private_impl__swizzle_bgrw__bgr;
29435
29436
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
29437
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE:
29438
0
      return wuffs_private_impl__swizzle_bgrw_4x16le__bgr;
29439
29440
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
29441
0
      return wuffs_private_impl__swizzle_swap_rgb_bgr;
29442
29443
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
29444
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
29445
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
29446
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBX:
29447
0
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
29448
0
      if (wuffs_base__cpu_arch__have_x86_sse42()) {
29449
0
        return wuffs_private_impl__swizzle_bgrw__rgb__x86_sse42;
29450
0
      }
29451
0
#endif
29452
0
      return wuffs_private_impl__swizzle_bgrw__rgb;
29453
0
  }
29454
0
  return NULL;
29455
0
}
29456
29457
static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func  //
29458
wuffs_private_impl__pixel_swizzler__prepare__bgra_nonpremul(
29459
    wuffs_base__pixel_swizzler* p,
29460
    wuffs_base__pixel_format dst_pixfmt,
29461
    wuffs_base__slice_u8 dst_palette,
29462
    wuffs_base__slice_u8 src_palette,
29463
150
    wuffs_base__pixel_blend blend) {
29464
150
  switch (dst_pixfmt.repr) {
29465
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
29466
0
      switch (blend) {
29467
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29468
0
          return wuffs_private_impl__swizzle_y__bgra_nonpremul__src;
29469
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29470
0
          return wuffs_private_impl__swizzle_y__bgra_nonpremul__src_over;
29471
0
      }
29472
0
      return NULL;
29473
29474
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
29475
0
      switch (blend) {
29476
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29477
0
          return wuffs_private_impl__swizzle_bgr_565__bgra_nonpremul__src;
29478
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29479
0
          return wuffs_private_impl__swizzle_bgr_565__bgra_nonpremul__src_over;
29480
0
      }
29481
0
      return NULL;
29482
29483
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
29484
0
      switch (blend) {
29485
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29486
0
          return wuffs_private_impl__swizzle_bgr__bgra_nonpremul__src;
29487
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29488
0
          return wuffs_private_impl__swizzle_bgr__bgra_nonpremul__src_over;
29489
0
      }
29490
0
      return NULL;
29491
29492
67
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
29493
67
      switch (blend) {
29494
67
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29495
67
          return wuffs_private_impl__swizzle_copy_4_4;
29496
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29497
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__bgra_nonpremul__src_over;
29498
67
      }
29499
0
      return NULL;
29500
29501
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
29502
0
      switch (blend) {
29503
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29504
0
          return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_nonpremul__src;
29505
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29506
0
          return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_nonpremul__src_over;
29507
0
      }
29508
0
      return NULL;
29509
29510
83
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
29511
83
      switch (blend) {
29512
83
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29513
83
          return wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul__src;
29514
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29515
0
          return wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul__src_over;
29516
83
      }
29517
0
      return NULL;
29518
29519
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
29520
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRX:
29521
      // TODO.
29522
0
      break;
29523
29524
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
29525
0
      switch (blend) {
29526
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29527
0
          return wuffs_private_impl__swizzle_bgr__rgba_nonpremul__src;
29528
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29529
0
          return wuffs_private_impl__swizzle_bgr__rgba_nonpremul__src_over;
29530
0
      }
29531
0
      return NULL;
29532
29533
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
29534
0
      switch (blend) {
29535
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29536
0
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
29537
0
          if (wuffs_base__cpu_arch__have_x86_sse42()) {
29538
0
            return wuffs_private_impl__swizzle_swap_rgbx_bgrx__x86_sse42;
29539
0
          }
29540
0
#endif
29541
0
          return wuffs_private_impl__swizzle_swap_rgbx_bgrx;
29542
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29543
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__rgba_nonpremul__src_over;
29544
0
      }
29545
0
      return NULL;
29546
29547
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
29548
0
      switch (blend) {
29549
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29550
0
          return wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul__src;
29551
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29552
0
          return wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul__src_over;
29553
0
      }
29554
0
      return NULL;
29555
29556
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
29557
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBX:
29558
      // TODO.
29559
0
      break;
29560
150
  }
29561
0
  return NULL;
29562
150
}
29563
29564
static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func  //
29565
wuffs_private_impl__pixel_swizzler__prepare__bgra_nonpremul_4x16le(
29566
    wuffs_base__pixel_swizzler* p,
29567
    wuffs_base__pixel_format dst_pixfmt,
29568
    wuffs_base__slice_u8 dst_palette,
29569
    wuffs_base__slice_u8 src_palette,
29570
532
    wuffs_base__pixel_blend blend) {
29571
532
  switch (dst_pixfmt.repr) {
29572
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
29573
0
      switch (blend) {
29574
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29575
0
          return wuffs_private_impl__swizzle_y__bgra_nonpremul_4x16le__src;
29576
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29577
0
          return wuffs_private_impl__swizzle_y__bgra_nonpremul_4x16le__src_over;
29578
0
      }
29579
0
      return NULL;
29580
29581
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
29582
0
      switch (blend) {
29583
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29584
0
          return wuffs_private_impl__swizzle_bgr_565__bgra_nonpremul_4x16le__src;
29585
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29586
0
          return wuffs_private_impl__swizzle_bgr_565__bgra_nonpremul_4x16le__src_over;
29587
0
      }
29588
0
      return NULL;
29589
29590
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
29591
0
      switch (blend) {
29592
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29593
0
          return wuffs_private_impl__swizzle_bgr__bgra_nonpremul_4x16le__src;
29594
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29595
0
          return wuffs_private_impl__swizzle_bgr__bgra_nonpremul_4x16le__src_over;
29596
0
      }
29597
0
      return NULL;
29598
29599
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
29600
0
      switch (blend) {
29601
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29602
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__bgra_nonpremul_4x16le__src;
29603
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29604
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__bgra_nonpremul_4x16le__src_over;
29605
0
      }
29606
0
      return NULL;
29607
29608
254
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
29609
254
      switch (blend) {
29610
254
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29611
254
          return wuffs_private_impl__swizzle_copy_8_8;
29612
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29613
0
          return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_nonpremul_4x16le__src_over;
29614
254
      }
29615
0
      return NULL;
29616
29617
278
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
29618
278
      switch (blend) {
29619
278
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29620
278
          return wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul_4x16le__src;
29621
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29622
0
          return wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul_4x16le__src_over;
29623
278
      }
29624
0
      return NULL;
29625
29626
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
29627
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRX:
29628
      // TODO.
29629
0
      break;
29630
29631
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
29632
0
      switch (blend) {
29633
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29634
0
          return wuffs_private_impl__swizzle_bgr__rgba_nonpremul_4x16le__src;
29635
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29636
0
          return wuffs_private_impl__swizzle_bgr__rgba_nonpremul_4x16le__src_over;
29637
0
      }
29638
0
      return NULL;
29639
29640
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
29641
0
      switch (blend) {
29642
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29643
0
          return wuffs_private_impl__swizzle_rgba_nonpremul__bgra_nonpremul_4x16le__src;
29644
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29645
0
          return wuffs_private_impl__swizzle_rgba_nonpremul__bgra_nonpremul_4x16le__src_over;
29646
0
      }
29647
0
      break;
29648
29649
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
29650
0
      switch (blend) {
29651
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29652
0
          return wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul_4x16le__src;
29653
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29654
0
          return wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul_4x16le__src_over;
29655
0
      }
29656
0
      return NULL;
29657
29658
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
29659
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBX:
29660
      // TODO.
29661
0
      break;
29662
532
  }
29663
0
  return NULL;
29664
532
}
29665
29666
static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func  //
29667
wuffs_private_impl__pixel_swizzler__prepare__bgra_premul(
29668
    wuffs_base__pixel_swizzler* p,
29669
    wuffs_base__pixel_format dst_pixfmt,
29670
    wuffs_base__slice_u8 dst_palette,
29671
    wuffs_base__slice_u8 src_palette,
29672
0
    wuffs_base__pixel_blend blend) {
29673
0
  switch (dst_pixfmt.repr) {
29674
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
29675
0
      switch (blend) {
29676
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29677
0
          return wuffs_private_impl__swizzle_y__bgra_premul__src;
29678
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29679
0
          return wuffs_private_impl__swizzle_y__bgra_premul__src_over;
29680
0
      }
29681
0
      return NULL;
29682
29683
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
29684
0
      switch (blend) {
29685
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29686
0
          return wuffs_private_impl__swizzle_bgr_565__bgra_premul__src;
29687
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29688
0
          return wuffs_private_impl__swizzle_bgr_565__bgra_premul__src_over;
29689
0
      }
29690
0
      return NULL;
29691
29692
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
29693
0
      switch (blend) {
29694
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29695
0
          return wuffs_private_impl__swizzle_bgr__bgra_premul__src;
29696
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29697
0
          return wuffs_private_impl__swizzle_bgr__bgra_premul__src_over;
29698
0
      }
29699
0
      return NULL;
29700
29701
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
29702
0
      switch (blend) {
29703
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29704
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__bgra_premul__src;
29705
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29706
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__bgra_premul__src_over;
29707
0
      }
29708
0
      return NULL;
29709
29710
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
29711
0
      switch (blend) {
29712
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29713
0
          return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_premul__src;
29714
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29715
0
          return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_premul__src_over;
29716
0
      }
29717
0
      return NULL;
29718
29719
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
29720
0
      switch (blend) {
29721
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29722
0
          return wuffs_private_impl__swizzle_copy_4_4;
29723
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29724
0
          return wuffs_private_impl__swizzle_bgra_premul__bgra_premul__src_over;
29725
0
      }
29726
0
      return NULL;
29727
29728
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
29729
0
      switch (blend) {
29730
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29731
0
          return wuffs_private_impl__swizzle_bgr__rgba_premul__src;
29732
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29733
0
          return wuffs_private_impl__swizzle_bgr__rgba_premul__src_over;
29734
0
      }
29735
0
      return NULL;
29736
29737
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
29738
0
      switch (blend) {
29739
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29740
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__rgba_premul__src;
29741
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29742
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__rgba_premul__src_over;
29743
0
      }
29744
0
      return NULL;
29745
29746
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
29747
0
      switch (blend) {
29748
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29749
0
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
29750
0
          if (wuffs_base__cpu_arch__have_x86_sse42()) {
29751
0
            return wuffs_private_impl__swizzle_swap_rgbx_bgrx__x86_sse42;
29752
0
          }
29753
0
#endif
29754
0
          return wuffs_private_impl__swizzle_swap_rgbx_bgrx;
29755
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29756
0
          return wuffs_private_impl__swizzle_bgra_premul__rgba_premul__src_over;
29757
0
      }
29758
0
      return NULL;
29759
0
  }
29760
0
  return NULL;
29761
0
}
29762
29763
static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func  //
29764
wuffs_private_impl__pixel_swizzler__prepare__bgra_binary(
29765
    wuffs_base__pixel_swizzler* p,
29766
    wuffs_base__pixel_format dst_pixfmt,
29767
    wuffs_base__slice_u8 dst_palette,
29768
    wuffs_base__slice_u8 src_palette,
29769
0
    wuffs_base__pixel_blend blend) {
29770
0
  switch (dst_pixfmt.repr) {
29771
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
29772
0
      switch (blend) {
29773
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29774
0
          return wuffs_private_impl__swizzle_y__bgra_premul__src;
29775
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29776
0
          return wuffs_private_impl__swizzle_y__bgra_premul__src_over;
29777
0
      }
29778
0
      return NULL;
29779
29780
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
29781
0
      switch (blend) {
29782
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29783
0
          return wuffs_private_impl__swizzle_bgr_565__bgra_premul__src;
29784
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29785
0
          return wuffs_private_impl__swizzle_bgr_565__bgra_premul__src_over;
29786
0
      }
29787
0
      return NULL;
29788
29789
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
29790
0
      switch (blend) {
29791
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29792
0
          return wuffs_private_impl__swizzle_bgr__bgra_premul__src;
29793
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29794
0
          return wuffs_private_impl__swizzle_bgr__bgra_premul__src_over;
29795
0
      }
29796
0
      return NULL;
29797
29798
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
29799
0
      switch (blend) {
29800
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29801
0
          return wuffs_private_impl__swizzle_copy_4_4;
29802
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29803
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__bgra_premul__src_over;
29804
0
      }
29805
0
      return NULL;
29806
29807
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
29808
0
      switch (blend) {
29809
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29810
0
          return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_premul__src;
29811
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29812
0
          return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_premul__src_over;
29813
0
      }
29814
0
      return NULL;
29815
29816
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
29817
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
29818
0
      switch (blend) {
29819
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29820
0
          return wuffs_private_impl__swizzle_copy_4_4;
29821
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29822
0
          return wuffs_private_impl__swizzle_bgra_premul__bgra_premul__src_over;
29823
0
      }
29824
0
      return NULL;
29825
29826
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
29827
0
      switch (blend) {
29828
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29829
0
          return wuffs_private_impl__swizzle_bgr__rgba_premul__src;
29830
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29831
0
          return wuffs_private_impl__swizzle_bgr__rgba_premul__src_over;
29832
0
      }
29833
0
      return NULL;
29834
29835
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
29836
0
      switch (blend) {
29837
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29838
0
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
29839
0
          if (wuffs_base__cpu_arch__have_x86_sse42()) {
29840
0
            return wuffs_private_impl__swizzle_swap_rgbx_bgrx__x86_sse42;
29841
0
          }
29842
0
#endif
29843
0
          return wuffs_private_impl__swizzle_swap_rgbx_bgrx;
29844
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29845
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__rgba_premul__src_over;
29846
0
      }
29847
0
      return NULL;
29848
29849
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
29850
0
      switch (blend) {
29851
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29852
0
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
29853
0
          if (wuffs_base__cpu_arch__have_x86_sse42()) {
29854
0
            return wuffs_private_impl__swizzle_swap_rgbx_bgrx__x86_sse42;
29855
0
          }
29856
0
#endif
29857
0
          return wuffs_private_impl__swizzle_swap_rgbx_bgrx;
29858
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29859
0
          return wuffs_private_impl__swizzle_bgra_premul__rgba_premul__src_over;
29860
0
      }
29861
0
      return NULL;
29862
0
  }
29863
0
  return NULL;
29864
0
}
29865
29866
static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func  //
29867
wuffs_private_impl__pixel_swizzler__prepare__bgrx(
29868
    wuffs_base__pixel_swizzler* p,
29869
    wuffs_base__pixel_format dst_pixfmt,
29870
    wuffs_base__slice_u8 dst_palette,
29871
    wuffs_base__slice_u8 src_palette,
29872
0
    wuffs_base__pixel_blend blend) {
29873
0
  switch (dst_pixfmt.repr) {
29874
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
29875
0
      return wuffs_private_impl__swizzle_y__bgrx;
29876
29877
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
29878
0
      return wuffs_private_impl__swizzle_bgr_565__bgrx;
29879
29880
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
29881
0
      return wuffs_private_impl__swizzle_xxx__xxxx;
29882
29883
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
29884
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
29885
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
29886
0
      return wuffs_private_impl__swizzle_bgrw__bgrx;
29887
29888
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
29889
0
      return wuffs_private_impl__swizzle_bgrw_4x16le__bgrx;
29890
29891
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRX:
29892
0
      return wuffs_private_impl__swizzle_copy_4_4;
29893
29894
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
29895
0
      return wuffs_private_impl__swizzle_bgr__rgbx;
29896
29897
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
29898
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
29899
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
29900
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBX:
29901
0
      return wuffs_private_impl__swizzle_bgrw__rgbx;
29902
0
  }
29903
0
  return NULL;
29904
0
}
29905
29906
static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func  //
29907
wuffs_private_impl__pixel_swizzler__prepare__rgb(
29908
    wuffs_base__pixel_swizzler* p,
29909
    wuffs_base__pixel_format dst_pixfmt,
29910
    wuffs_base__slice_u8 dst_palette,
29911
    wuffs_base__slice_u8 src_palette,
29912
1.12k
    wuffs_base__pixel_blend blend) {
29913
1.12k
  switch (dst_pixfmt.repr) {
29914
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
29915
0
      return wuffs_private_impl__swizzle_y__rgb;
29916
29917
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
29918
0
      return wuffs_private_impl__swizzle_bgr_565__rgb;
29919
29920
528
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
29921
528
      return wuffs_private_impl__swizzle_swap_rgb_bgr;
29922
29923
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
29924
595
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
29925
595
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
29926
595
    case WUFFS_BASE__PIXEL_FORMAT__BGRX:
29927
595
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
29928
595
      if (wuffs_base__cpu_arch__have_x86_sse42()) {
29929
595
        return wuffs_private_impl__swizzle_bgrw__rgb__x86_sse42;
29930
595
      }
29931
0
#endif
29932
0
      return wuffs_private_impl__swizzle_bgrw__rgb;
29933
29934
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
29935
0
      return wuffs_private_impl__swizzle_bgrw_4x16le__rgb;
29936
29937
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
29938
0
      return wuffs_private_impl__swizzle_copy_3_3;
29939
29940
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
29941
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
29942
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
29943
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBX:
29944
0
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
29945
0
      if (wuffs_base__cpu_arch__have_x86_sse42()) {
29946
0
        return wuffs_private_impl__swizzle_bgrw__bgr__x86_sse42;
29947
0
      }
29948
0
#endif
29949
0
      return wuffs_private_impl__swizzle_bgrw__bgr;
29950
1.12k
  }
29951
0
  return NULL;
29952
1.12k
}
29953
29954
static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func  //
29955
wuffs_private_impl__pixel_swizzler__prepare__rgba_nonpremul(
29956
    wuffs_base__pixel_swizzler* p,
29957
    wuffs_base__pixel_format dst_pixfmt,
29958
    wuffs_base__slice_u8 dst_palette,
29959
    wuffs_base__slice_u8 src_palette,
29960
1.50k
    wuffs_base__pixel_blend blend) {
29961
1.50k
  switch (dst_pixfmt.repr) {
29962
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
29963
0
      switch (blend) {
29964
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29965
0
          return wuffs_private_impl__swizzle_y__rgba_nonpremul__src;
29966
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29967
0
          return wuffs_private_impl__swizzle_y__rgba_nonpremul__src_over;
29968
0
      }
29969
0
      return NULL;
29970
29971
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
29972
0
      switch (blend) {
29973
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29974
0
          return wuffs_private_impl__swizzle_bgr_565__rgba_nonpremul__src;
29975
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29976
0
          return wuffs_private_impl__swizzle_bgr_565__rgba_nonpremul__src_over;
29977
0
      }
29978
0
      return NULL;
29979
29980
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
29981
0
      switch (blend) {
29982
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29983
0
          return wuffs_private_impl__swizzle_bgr__rgba_nonpremul__src;
29984
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29985
0
          return wuffs_private_impl__swizzle_bgr__rgba_nonpremul__src_over;
29986
0
      }
29987
0
      return NULL;
29988
29989
729
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
29990
729
      switch (blend) {
29991
729
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29992
729
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
29993
729
          if (wuffs_base__cpu_arch__have_x86_sse42()) {
29994
729
            return wuffs_private_impl__swizzle_swap_rgbx_bgrx__x86_sse42;
29995
729
          }
29996
0
#endif
29997
0
          return wuffs_private_impl__swizzle_swap_rgbx_bgrx;
29998
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29999
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__rgba_nonpremul__src_over;
30000
729
      }
30001
0
      return NULL;
30002
30003
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
30004
0
      switch (blend) {
30005
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30006
0
          return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__rgba_nonpremul__src;
30007
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30008
0
          return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__rgba_nonpremul__src_over;
30009
0
      }
30010
0
      return NULL;
30011
30012
776
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
30013
776
      switch (blend) {
30014
776
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30015
776
          return wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul__src;
30016
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30017
0
          return wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul__src_over;
30018
776
      }
30019
0
      return NULL;
30020
30021
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
30022
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRX:
30023
      // TODO.
30024
0
      break;
30025
30026
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
30027
0
      switch (blend) {
30028
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30029
0
          return wuffs_private_impl__swizzle_bgr__bgra_nonpremul__src;
30030
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30031
0
          return wuffs_private_impl__swizzle_bgr__bgra_nonpremul__src_over;
30032
0
      }
30033
0
      return NULL;
30034
30035
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
30036
0
      switch (blend) {
30037
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30038
0
          return wuffs_private_impl__swizzle_copy_4_4;
30039
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30040
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__bgra_nonpremul__src_over;
30041
0
      }
30042
0
      return NULL;
30043
30044
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
30045
0
      switch (blend) {
30046
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30047
0
          return wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul__src;
30048
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30049
0
          return wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul__src_over;
30050
0
      }
30051
0
      return NULL;
30052
30053
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
30054
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBX:
30055
      // TODO.
30056
0
      break;
30057
1.50k
  }
30058
0
  return NULL;
30059
1.50k
}
30060
30061
static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func  //
30062
wuffs_private_impl__pixel_swizzler__prepare__rgba_premul(
30063
    wuffs_base__pixel_swizzler* p,
30064
    wuffs_base__pixel_format dst_pixfmt,
30065
    wuffs_base__slice_u8 dst_palette,
30066
    wuffs_base__slice_u8 src_palette,
30067
0
    wuffs_base__pixel_blend blend) {
30068
0
  switch (dst_pixfmt.repr) {
30069
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
30070
0
      switch (blend) {
30071
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30072
0
          return wuffs_private_impl__swizzle_y__rgba_premul__src;
30073
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30074
0
          return wuffs_private_impl__swizzle_y__rgba_premul__src_over;
30075
0
      }
30076
0
      return NULL;
30077
30078
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
30079
0
      switch (blend) {
30080
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30081
0
          return wuffs_private_impl__swizzle_bgr_565__rgba_premul__src;
30082
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30083
0
          return wuffs_private_impl__swizzle_bgr_565__rgba_premul__src_over;
30084
0
      }
30085
0
      return NULL;
30086
30087
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
30088
0
      switch (blend) {
30089
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30090
0
          return wuffs_private_impl__swizzle_bgr__rgba_premul__src;
30091
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30092
0
          return wuffs_private_impl__swizzle_bgr__rgba_premul__src_over;
30093
0
      }
30094
0
      return NULL;
30095
30096
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
30097
0
      switch (blend) {
30098
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30099
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__rgba_premul__src;
30100
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30101
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__rgba_premul__src_over;
30102
0
      }
30103
0
      return NULL;
30104
30105
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
30106
0
      switch (blend) {
30107
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30108
0
          return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__rgba_premul__src;
30109
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30110
0
          return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__rgba_premul__src_over;
30111
0
      }
30112
0
      return NULL;
30113
30114
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
30115
0
      switch (blend) {
30116
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30117
0
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
30118
0
          if (wuffs_base__cpu_arch__have_x86_sse42()) {
30119
0
            return wuffs_private_impl__swizzle_swap_rgbx_bgrx__x86_sse42;
30120
0
          }
30121
0
#endif
30122
0
          return wuffs_private_impl__swizzle_swap_rgbx_bgrx;
30123
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30124
0
          return wuffs_private_impl__swizzle_bgra_premul__rgba_premul__src_over;
30125
0
      }
30126
0
      return NULL;
30127
30128
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
30129
0
      switch (blend) {
30130
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30131
0
          return wuffs_private_impl__swizzle_bgr__bgra_premul__src;
30132
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30133
0
          return wuffs_private_impl__swizzle_bgr__bgra_premul__src_over;
30134
0
      }
30135
0
      return NULL;
30136
30137
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
30138
0
      switch (blend) {
30139
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30140
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__bgra_premul__src;
30141
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30142
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__bgra_premul__src_over;
30143
0
      }
30144
0
      return NULL;
30145
30146
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
30147
0
      switch (blend) {
30148
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30149
0
          return wuffs_private_impl__swizzle_copy_4_4;
30150
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30151
0
          return wuffs_private_impl__swizzle_bgra_premul__bgra_premul__src_over;
30152
0
      }
30153
0
      return NULL;
30154
0
  }
30155
0
  return NULL;
30156
0
}
30157
30158
// --------
30159
30160
WUFFS_BASE__MAYBE_STATIC wuffs_base__status  //
30161
wuffs_base__pixel_swizzler__prepare(wuffs_base__pixel_swizzler* p,
30162
                                    wuffs_base__pixel_format dst_pixfmt,
30163
                                    wuffs_base__slice_u8 dst_palette,
30164
                                    wuffs_base__pixel_format src_pixfmt,
30165
                                    wuffs_base__slice_u8 src_palette,
30166
6.25k
                                    wuffs_base__pixel_blend blend) {
30167
6.25k
  if (!p) {
30168
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
30169
0
  }
30170
6.25k
  p->private_impl.func = NULL;
30171
6.25k
  p->private_impl.transparent_black_func = NULL;
30172
6.25k
  p->private_impl.dst_pixfmt_bytes_per_pixel = 0;
30173
6.25k
  p->private_impl.src_pixfmt_bytes_per_pixel = 0;
30174
30175
  // ----
30176
30177
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ENABLE_ALLOWLIST)
30178
  switch (dst_pixfmt.repr) {
30179
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_Y)
30180
    case WUFFS_BASE__PIXEL_FORMAT__Y:
30181
      break;
30182
#endif
30183
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGR_565)
30184
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
30185
      break;
30186
#endif
30187
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGR)
30188
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
30189
      break;
30190
#endif
30191
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGRA_NONPREMUL)
30192
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
30193
      break;
30194
#endif
30195
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGRA_NONPREMUL_4X16LE)
30196
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
30197
      break;
30198
#endif
30199
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGRA_PREMUL)
30200
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
30201
      break;
30202
#endif
30203
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_RGB)
30204
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
30205
      break;
30206
#endif
30207
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_RGBA_NONPREMUL)
30208
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
30209
      break;
30210
#endif
30211
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_RGBA_PREMUL)
30212
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
30213
      break;
30214
#endif
30215
    default:
30216
      return wuffs_base__make_status(
30217
          wuffs_base__error__disabled_by_wuffs_config_dst_pixel_format_enable_allowlist);
30218
  }
30219
#endif  // defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ENABLE_ALLOWLIST)
30220
30221
  // ----
30222
30223
6.25k
  wuffs_base__pixel_swizzler__func func = NULL;
30224
6.25k
  wuffs_base__pixel_swizzler__transparent_black_func transparent_black_func =
30225
6.25k
      NULL;
30226
30227
6.25k
  uint32_t dst_pixfmt_bits_per_pixel =
30228
6.25k
      wuffs_base__pixel_format__bits_per_pixel(&dst_pixfmt);
30229
6.25k
  if ((dst_pixfmt_bits_per_pixel == 0) ||
30230
6.25k
      ((dst_pixfmt_bits_per_pixel & 7) != 0)) {
30231
0
    return wuffs_base__make_status(
30232
0
        wuffs_base__error__unsupported_pixel_swizzler_option);
30233
0
  }
30234
30235
6.25k
  uint32_t src_pixfmt_bits_per_pixel =
30236
6.25k
      wuffs_base__pixel_format__bits_per_pixel(&src_pixfmt);
30237
6.25k
  if ((src_pixfmt_bits_per_pixel == 0) ||
30238
6.25k
      ((src_pixfmt_bits_per_pixel & 7) != 0)) {
30239
0
    return wuffs_base__make_status(
30240
0
        wuffs_base__error__unsupported_pixel_swizzler_option);
30241
0
  }
30242
30243
  // TODO: support many more formats.
30244
30245
6.25k
  switch (blend) {
30246
6.25k
    case WUFFS_BASE__PIXEL_BLEND__SRC:
30247
6.25k
      transparent_black_func =
30248
6.25k
          wuffs_private_impl__swizzle_transparent_black_src;
30249
6.25k
      break;
30250
30251
0
    case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30252
0
      transparent_black_func =
30253
0
          wuffs_private_impl__swizzle_transparent_black_src_over;
30254
0
      break;
30255
6.25k
  }
30256
30257
6.25k
  switch (src_pixfmt.repr) {
30258
1.38k
    case WUFFS_BASE__PIXEL_FORMAT__Y:
30259
1.38k
      func = wuffs_private_impl__pixel_swizzler__prepare__y(
30260
1.38k
          p, dst_pixfmt, dst_palette, src_palette, blend);
30261
1.38k
      break;
30262
30263
184
    case WUFFS_BASE__PIXEL_FORMAT__Y_16BE:
30264
184
      func = wuffs_private_impl__pixel_swizzler__prepare__y_16be(
30265
184
          p, dst_pixfmt, dst_palette, src_palette, blend);
30266
184
      break;
30267
30268
115
    case WUFFS_BASE__PIXEL_FORMAT__YA_NONPREMUL:
30269
115
      func = wuffs_private_impl__pixel_swizzler__prepare__ya_nonpremul(
30270
115
          p, dst_pixfmt, dst_palette, src_palette, blend);
30271
115
      break;
30272
30273
250
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL:
30274
250
      func =
30275
250
          wuffs_private_impl__pixel_swizzler__prepare__indexed__bgra_nonpremul(
30276
250
              p, dst_pixfmt, dst_palette, src_palette, blend);
30277
250
      break;
30278
30279
1.01k
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY:
30280
1.01k
      func = wuffs_private_impl__pixel_swizzler__prepare__indexed__bgra_binary(
30281
1.01k
          p, dst_pixfmt, dst_palette, src_palette, blend);
30282
1.01k
      break;
30283
30284
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
30285
0
      func = wuffs_private_impl__pixel_swizzler__prepare__bgr_565(
30286
0
          p, dst_pixfmt, dst_palette, src_palette, blend);
30287
0
      break;
30288
30289
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
30290
0
      func = wuffs_private_impl__pixel_swizzler__prepare__bgr(
30291
0
          p, dst_pixfmt, dst_palette, src_palette, blend);
30292
0
      break;
30293
30294
150
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
30295
150
      func = wuffs_private_impl__pixel_swizzler__prepare__bgra_nonpremul(
30296
150
          p, dst_pixfmt, dst_palette, src_palette, blend);
30297
150
      break;
30298
30299
532
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
30300
532
      func = wuffs_private_impl__pixel_swizzler__prepare__bgra_nonpremul_4x16le(
30301
532
          p, dst_pixfmt, dst_palette, src_palette, blend);
30302
532
      break;
30303
30304
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
30305
0
      func = wuffs_private_impl__pixel_swizzler__prepare__bgra_premul(
30306
0
          p, dst_pixfmt, dst_palette, src_palette, blend);
30307
0
      break;
30308
30309
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
30310
0
      func = wuffs_private_impl__pixel_swizzler__prepare__bgra_binary(
30311
0
          p, dst_pixfmt, dst_palette, src_palette, blend);
30312
0
      break;
30313
30314
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRX:
30315
0
      func = wuffs_private_impl__pixel_swizzler__prepare__bgrx(
30316
0
          p, dst_pixfmt, dst_palette, src_palette, blend);
30317
0
      break;
30318
30319
1.12k
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
30320
1.12k
      func = wuffs_private_impl__pixel_swizzler__prepare__rgb(
30321
1.12k
          p, dst_pixfmt, dst_palette, src_palette, blend);
30322
1.12k
      break;
30323
30324
1.50k
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
30325
1.50k
      func = wuffs_private_impl__pixel_swizzler__prepare__rgba_nonpremul(
30326
1.50k
          p, dst_pixfmt, dst_palette, src_palette, blend);
30327
1.50k
      break;
30328
30329
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
30330
0
      func = wuffs_private_impl__pixel_swizzler__prepare__rgba_premul(
30331
0
          p, dst_pixfmt, dst_palette, src_palette, blend);
30332
0
      break;
30333
6.25k
  }
30334
30335
6.25k
  p->private_impl.func = func;
30336
6.25k
  p->private_impl.transparent_black_func = transparent_black_func;
30337
6.25k
  p->private_impl.dst_pixfmt_bytes_per_pixel = dst_pixfmt_bits_per_pixel / 8;
30338
6.25k
  p->private_impl.src_pixfmt_bytes_per_pixel = src_pixfmt_bits_per_pixel / 8;
30339
6.25k
  return wuffs_base__make_status(
30340
6.25k
      func ? NULL : wuffs_base__error__unsupported_pixel_swizzler_option);
30341
6.25k
}
30342
30343
WUFFS_BASE__MAYBE_STATIC uint64_t  //
30344
wuffs_base__pixel_swizzler__limited_swizzle_u32_interleaved_from_reader(
30345
    const wuffs_base__pixel_swizzler* p,
30346
    uint32_t up_to_num_pixels,
30347
    wuffs_base__slice_u8 dst,
30348
    wuffs_base__slice_u8 dst_palette,
30349
    const uint8_t** ptr_iop_r,
30350
0
    const uint8_t* io2_r) {
30351
0
  if (p && p->private_impl.func) {
30352
0
    const uint8_t* iop_r = *ptr_iop_r;
30353
0
    uint64_t src_len = wuffs_base__u64__min(
30354
0
        ((uint64_t)up_to_num_pixels) *
30355
0
            ((uint64_t)p->private_impl.src_pixfmt_bytes_per_pixel),
30356
0
        ((uint64_t)(io2_r - iop_r)));
30357
0
    uint64_t n =
30358
0
        (*p->private_impl.func)(dst.ptr, dst.len, dst_palette.ptr,
30359
0
                                dst_palette.len, iop_r, (size_t)src_len);
30360
0
    *ptr_iop_r += n * p->private_impl.src_pixfmt_bytes_per_pixel;
30361
0
    return n;
30362
0
  }
30363
0
  return 0;
30364
0
}
30365
30366
WUFFS_BASE__MAYBE_STATIC uint64_t  //
30367
wuffs_base__pixel_swizzler__swizzle_interleaved_from_reader(
30368
    const wuffs_base__pixel_swizzler* p,
30369
    wuffs_base__slice_u8 dst,
30370
    wuffs_base__slice_u8 dst_palette,
30371
    const uint8_t** ptr_iop_r,
30372
0
    const uint8_t* io2_r) {
30373
0
  if (p && p->private_impl.func) {
30374
0
    const uint8_t* iop_r = *ptr_iop_r;
30375
0
    uint64_t src_len = ((uint64_t)(io2_r - iop_r));
30376
0
    uint64_t n =
30377
0
        (*p->private_impl.func)(dst.ptr, dst.len, dst_palette.ptr,
30378
0
                                dst_palette.len, iop_r, (size_t)src_len);
30379
0
    *ptr_iop_r += n * p->private_impl.src_pixfmt_bytes_per_pixel;
30380
0
    return n;
30381
0
  }
30382
0
  return 0;
30383
0
}
30384
30385
WUFFS_BASE__MAYBE_STATIC uint64_t  //
30386
wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(
30387
    const wuffs_base__pixel_swizzler* p,
30388
    wuffs_base__slice_u8 dst,
30389
    wuffs_base__slice_u8 dst_palette,
30390
170M
    wuffs_base__slice_u8 src) {
30391
170M
  if (p && p->private_impl.func) {
30392
170M
    return (*p->private_impl.func)(dst.ptr, dst.len, dst_palette.ptr,
30393
170M
                                   dst_palette.len, src.ptr, src.len);
30394
170M
  }
30395
0
  return 0;
30396
170M
}
30397
30398
WUFFS_BASE__MAYBE_STATIC uint64_t  //
30399
wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(
30400
    const wuffs_base__pixel_swizzler* p,
30401
    wuffs_base__slice_u8 dst,
30402
    wuffs_base__slice_u8 dst_palette,
30403
0
    uint64_t num_pixels) {
30404
0
  if (p && p->private_impl.transparent_black_func) {
30405
0
    return (*p->private_impl.transparent_black_func)(
30406
0
        dst.ptr, dst.len, dst_palette.ptr, dst_palette.len, num_pixels,
30407
0
        p->private_impl.dst_pixfmt_bytes_per_pixel);
30408
0
  }
30409
0
  return 0;
30410
0
}
30411
30412
// --------
30413
30414
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
30415
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2")
30416
static void  //
30417
wuffs_private_impl__swizzle_ycc__convert_3_bgrx_x86_avx2(
30418
    wuffs_base__pixel_buffer* dst,
30419
    uint32_t x,
30420
    uint32_t x_end,
30421
    uint32_t y,
30422
    const uint8_t* up0,
30423
    const uint8_t* up1,
30424
    const uint8_t* up2);
30425
30426
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2")
30427
static void  //
30428
wuffs_private_impl__swizzle_ycc__convert_3_rgbx_x86_avx2(
30429
    wuffs_base__pixel_buffer* dst,
30430
    uint32_t x,
30431
    uint32_t x_end,
30432
    uint32_t y,
30433
    const uint8_t* up0,
30434
    const uint8_t* up1,
30435
    const uint8_t* up2);
30436
30437
#if defined(__GNUC__) && !defined(__clang__)
30438
// No-op.
30439
#else
30440
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2")
30441
static const uint8_t*  //
30442
wuffs_private_impl__swizzle_ycc__upsample_inv_h2v2_triangle_x86_avx2(
30443
    uint8_t* dst_ptr,
30444
    const uint8_t* src_ptr_major,
30445
    const uint8_t* src_ptr_minor,
30446
    size_t src_len,
30447
    uint32_t h1v2_bias_ignored,
30448
    bool first_column,
30449
    bool last_column);
30450
#endif
30451
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
30452
30453
// --------
30454
30455
static inline uint32_t  //
30456
wuffs_private_impl__u32__max_of_4(uint32_t a,
30457
                                  uint32_t b,
30458
                                  uint32_t c,
30459
0
                                  uint32_t d) {
30460
0
  return wuffs_base__u32__max(     //
30461
0
      wuffs_base__u32__max(a, b),  //
30462
0
      wuffs_base__u32__max(c, d));
30463
0
}
30464
30465
static inline uint32_t  //
30466
wuffs_private_impl__u32__min_of_5(uint32_t a,
30467
                                  uint32_t b,
30468
                                  uint32_t c,
30469
                                  uint32_t d,
30470
0
                                  uint32_t e) {
30471
0
  return wuffs_base__u32__min(          //
30472
0
      wuffs_base__u32__min(             //
30473
0
          wuffs_base__u32__min(a, b),   //
30474
0
          wuffs_base__u32__min(c, d)),  //
30475
0
      e);
30476
0
}
30477
30478
// --------
30479
30480
typedef void (*wuffs_private_impl__swizzle_ycc__convert_4_func)(
30481
    wuffs_base__pixel_buffer* dst,
30482
    uint32_t x,
30483
    uint32_t x_end,
30484
    uint32_t y,
30485
    const uint8_t* up0,
30486
    const uint8_t* up1,
30487
    const uint8_t* up2,
30488
    const uint8_t* up3);
30489
30490
static void  //
30491
wuffs_private_impl__swizzle_cmyk__convert_4_general(
30492
    wuffs_base__pixel_buffer* dst,
30493
    uint32_t x,
30494
    uint32_t x_end,
30495
    uint32_t y,
30496
    const uint8_t* up0,
30497
    const uint8_t* up1,
30498
    const uint8_t* up2,
30499
0
    const uint8_t* up3) {
30500
0
  for (; x < x_end; x++) {
30501
    // It's called CMYK but, but for Adobe CMYK JPEG images in practice, it's
30502
    // RGBW: 0xFFu means no ink instead of full ink. Note that a double
30503
    // inversion is a no-op, so inversions might be implicit in the code below.
30504
0
    uint32_t r = ((uint32_t)(*up0++));
30505
0
    uint32_t g = ((uint32_t)(*up1++));
30506
0
    uint32_t b = ((uint32_t)(*up2++));
30507
0
    uint32_t w = ((uint32_t)(*up3++));
30508
0
    r = ((r * w) + 0x7Fu) / 0xFFu;
30509
0
    g = ((g * w) + 0x7Fu) / 0xFFu;
30510
0
    b = ((b * w) + 0x7Fu) / 0xFFu;
30511
0
    wuffs_base__pixel_buffer__set_color_u32_at(
30512
0
        dst, x, y, 0xFF000000u | (r << 16u) | (g << 8u) | (b << 0u));
30513
0
  }
30514
0
}
30515
30516
static void  //
30517
wuffs_private_impl__swizzle_ycck__convert_4_general(
30518
    wuffs_base__pixel_buffer* dst,
30519
    uint32_t x,
30520
    uint32_t x_end,
30521
    uint32_t y,
30522
    const uint8_t* up0,
30523
    const uint8_t* up1,
30524
    const uint8_t* up2,
30525
0
    const uint8_t* up3) {
30526
0
  for (; x < x_end; x++) {
30527
    // We invert once again: 0xFFu means no ink instead of full ink.
30528
0
    uint32_t color =                           //
30529
0
        wuffs_base__color_ycc__as__color_u32(  //
30530
0
            *up0++, *up1++, *up2++);
30531
0
    uint32_t r = 0xFFu - (0xFFu & (color >> 16u));
30532
0
    uint32_t g = 0xFFu - (0xFFu & (color >> 8u));
30533
0
    uint32_t b = 0xFFu - (0xFFu & (color >> 0u));
30534
0
    uint32_t w = ((uint32_t)(*up3++));
30535
0
    r = ((r * w) + 0x7Fu) / 0xFFu;
30536
0
    g = ((g * w) + 0x7Fu) / 0xFFu;
30537
0
    b = ((b * w) + 0x7Fu) / 0xFFu;
30538
0
    wuffs_base__pixel_buffer__set_color_u32_at(
30539
0
        dst, x, y, 0xFF000000u | (r << 16u) | (g << 8u) | (b << 0u));
30540
0
  }
30541
0
}
30542
30543
// --------
30544
30545
typedef void (*wuffs_private_impl__swizzle_ycc__convert_3_func)(
30546
    wuffs_base__pixel_buffer* dst,
30547
    uint32_t x,
30548
    uint32_t x_end,
30549
    uint32_t y,
30550
    const uint8_t* up0,
30551
    const uint8_t* up1,
30552
    const uint8_t* up2);
30553
30554
static void  //
30555
wuffs_private_impl__swizzle_rgb__convert_3_general(
30556
    wuffs_base__pixel_buffer* dst,
30557
    uint32_t x,
30558
    uint32_t x_end,
30559
    uint32_t y,
30560
    const uint8_t* up0,
30561
    const uint8_t* up1,
30562
0
    const uint8_t* up2) {
30563
0
  for (; x < x_end; x++) {
30564
0
    uint32_t color = 0xFF000000u |                    //
30565
0
                     (((uint32_t)(*up0++)) << 16u) |  //
30566
0
                     (((uint32_t)(*up1++)) << 8u) |   //
30567
0
                     (((uint32_t)(*up2++)) << 0u);
30568
0
    wuffs_base__pixel_buffer__set_color_u32_at(dst, x, y, color);
30569
0
  }
30570
0
}
30571
30572
static void  //
30573
wuffs_private_impl__swizzle_ycc__convert_3_general(
30574
    wuffs_base__pixel_buffer* dst,
30575
    uint32_t x,
30576
    uint32_t x_end,
30577
    uint32_t y,
30578
    const uint8_t* up0,
30579
    const uint8_t* up1,
30580
0
    const uint8_t* up2) {
30581
0
  for (; x < x_end; x++) {
30582
0
    uint32_t color =                           //
30583
0
        wuffs_base__color_ycc__as__color_u32(  //
30584
0
            *up0++, *up1++, *up2++);
30585
0
    wuffs_base__pixel_buffer__set_color_u32_at(dst, x, y, color);
30586
0
  }
30587
0
}
30588
30589
static void  //
30590
wuffs_private_impl__swizzle_ycc__convert_3_bgrx(wuffs_base__pixel_buffer* dst,
30591
                                                uint32_t x,
30592
                                                uint32_t x_end,
30593
                                                uint32_t y,
30594
                                                const uint8_t* up0,
30595
                                                const uint8_t* up1,
30596
0
                                                const uint8_t* up2) {
30597
0
  size_t dst_stride = dst->private_impl.planes[0].stride;
30598
0
  uint8_t* dst_iter = dst->private_impl.planes[0].ptr +
30599
0
                      (dst_stride * ((size_t)y)) + (4u * ((size_t)x));
30600
30601
0
  for (; x < x_end; x++) {
30602
0
    uint32_t color =                           //
30603
0
        wuffs_base__color_ycc__as__color_u32(  //
30604
0
            *up0++, *up1++, *up2++);
30605
0
    wuffs_base__poke_u32le__no_bounds_check(dst_iter, color);
30606
0
    dst_iter += 4u;
30607
0
  }
30608
0
}
30609
30610
static void  //
30611
wuffs_private_impl__swizzle_ycc__convert_3_rgbx(wuffs_base__pixel_buffer* dst,
30612
                                                uint32_t x,
30613
                                                uint32_t x_end,
30614
                                                uint32_t y,
30615
                                                const uint8_t* up0,
30616
                                                const uint8_t* up1,
30617
0
                                                const uint8_t* up2) {
30618
0
  size_t dst_stride = dst->private_impl.planes[0].stride;
30619
0
  uint8_t* dst_iter = dst->private_impl.planes[0].ptr +
30620
0
                      (dst_stride * ((size_t)y)) + (4u * ((size_t)x));
30621
30622
0
  for (; x < x_end; x++) {
30623
0
    uint32_t color =                                //
30624
0
        wuffs_base__color_ycc__as__color_u32_abgr(  //
30625
0
            *up0++, *up1++, *up2++);
30626
0
    wuffs_base__poke_u32le__no_bounds_check(dst_iter, color);
30627
0
    dst_iter += 4u;
30628
0
  }
30629
0
}
30630
30631
// --------
30632
30633
// wuffs_private_impl__swizzle_ycc__upsample_func upsamples to a destination
30634
// slice at least 480 (YCCK) or 672 (YCC) bytes long and whose src_len
30635
// (multiplied by 1, 2, 3 or 4) is positive but no more than that. This 480 or
30636
// 672 length is just under 1/4 or 1/3 of the scratch_buffer_2k slice length.
30637
// Both (480 * 4) = 1920 and (672 * 3) = 2016 are less than 2048.
30638
//
30639
// 480 and 672 are nice round numbers because a JPEG MCU is 1, 2, 3 or 4 blocks
30640
// wide and each block is 8 pixels wide. We have:
30641
//   480 = 1 * 8 * 60,   672 = 1 * 8 * 84
30642
//   480 = 2 * 8 * 30,   672 = 2 * 8 * 42
30643
//   480 = 3 * 8 * 20,   672 = 3 * 8 * 28
30644
//   480 = 4 * 8 * 15,   672 = 4 * 8 * 21
30645
//
30646
// Box filters are equivalent to nearest neighbor upsampling. These ignore the
30647
// src_ptr_minor, h1v2_bias, first_column and last_column arguments.
30648
//
30649
// Triangle filters use a 3:1 ratio (in 1 dimension), or 9:3:3:1 (in 2
30650
// dimensions), which is higher quality (less blocky) but also higher
30651
// computational effort.
30652
//
30653
// In theory, we could use triangle filters for any (inv_h, inv_v) combination.
30654
// In practice, matching libjpeg-turbo, we only implement it for the common
30655
// chroma subsampling ratios (YCC420, YCC422 or YCC440), corresponding to an
30656
// (inv_h, inv_v) pair of (2, 2), (2, 1) or (1, 2).
30657
typedef const uint8_t* (*wuffs_private_impl__swizzle_ycc__upsample_func)(
30658
    uint8_t* dst_ptr,
30659
    const uint8_t* src_ptr_major,  // Nearest row.
30660
    const uint8_t* src_ptr_minor,  // Adjacent row, alternating above or below.
30661
    size_t src_len,
30662
    uint32_t h1v2_bias,
30663
    bool first_column,
30664
    bool last_column);
30665
30666
static const uint8_t*  //
30667
wuffs_private_impl__swizzle_ycc__upsample_inv_h1vn_box(
30668
    uint8_t* dst_ptr,
30669
    const uint8_t* src_ptr_major,
30670
    const uint8_t* src_ptr_minor_ignored,
30671
    size_t src_len,
30672
    uint32_t h1v2_bias_ignored,
30673
    bool first_column_ignored,
30674
0
    bool last_column_ignored) {
30675
0
  return src_ptr_major;
30676
0
}
30677
30678
static const uint8_t*  //
30679
wuffs_private_impl__swizzle_ycc__upsample_inv_h2vn_box(
30680
    uint8_t* dst_ptr,
30681
    const uint8_t* src_ptr_major,
30682
    const uint8_t* src_ptr_minor_ignored,
30683
    size_t src_len,
30684
    uint32_t h1v2_bias_ignored,
30685
    bool first_column_ignored,
30686
0
    bool last_column_ignored) {
30687
0
  uint8_t* dp = dst_ptr;
30688
0
  const uint8_t* sp = src_ptr_major;
30689
0
  while (src_len--) {
30690
0
    uint8_t sv = *sp++;
30691
0
    *dp++ = sv;
30692
0
    *dp++ = sv;
30693
0
  }
30694
0
  return dst_ptr;
30695
0
}
30696
30697
static const uint8_t*  //
30698
wuffs_private_impl__swizzle_ycc__upsample_inv_h3vn_box(
30699
    uint8_t* dst_ptr,
30700
    const uint8_t* src_ptr_major,
30701
    const uint8_t* src_ptr_minor_ignored,
30702
    size_t src_len,
30703
    uint32_t h1v2_bias_ignored,
30704
    bool first_column_ignored,
30705
0
    bool last_column_ignored) {
30706
0
  uint8_t* dp = dst_ptr;
30707
0
  const uint8_t* sp = src_ptr_major;
30708
0
  while (src_len--) {
30709
0
    uint8_t sv = *sp++;
30710
0
    *dp++ = sv;
30711
0
    *dp++ = sv;
30712
0
    *dp++ = sv;
30713
0
  }
30714
0
  return dst_ptr;
30715
0
}
30716
30717
static const uint8_t*  //
30718
wuffs_private_impl__swizzle_ycc__upsample_inv_h4vn_box(
30719
    uint8_t* dst_ptr,
30720
    const uint8_t* src_ptr_major,
30721
    const uint8_t* src_ptr_minor_ignored,
30722
    size_t src_len,
30723
    uint32_t h1v2_bias_ignored,
30724
    bool first_column_ignored,
30725
0
    bool last_column_ignored) {
30726
0
  uint8_t* dp = dst_ptr;
30727
0
  const uint8_t* sp = src_ptr_major;
30728
0
  while (src_len--) {
30729
0
    uint8_t sv = *sp++;
30730
0
    *dp++ = sv;
30731
0
    *dp++ = sv;
30732
0
    *dp++ = sv;
30733
0
    *dp++ = sv;
30734
0
  }
30735
0
  return dst_ptr;
30736
0
}
30737
30738
static const uint8_t*  //
30739
wuffs_private_impl__swizzle_ycc__upsample_inv_h1v2_triangle(
30740
    uint8_t* dst_ptr,
30741
    const uint8_t* src_ptr_major,
30742
    const uint8_t* src_ptr_minor,
30743
    size_t src_len,
30744
    uint32_t h1v2_bias,
30745
    bool first_column,
30746
0
    bool last_column) {
30747
0
  uint8_t* dp = dst_ptr;
30748
0
  const uint8_t* sp_major = src_ptr_major;
30749
0
  const uint8_t* sp_minor = src_ptr_minor;
30750
0
  while (src_len--) {
30751
0
    *dp++ = (uint8_t)(((3u * ((uint32_t)(*sp_major++))) +  //
30752
0
                       (1u * ((uint32_t)(*sp_minor++))) +  //
30753
0
                       h1v2_bias) >>
30754
0
                      2u);
30755
0
  }
30756
0
  return dst_ptr;
30757
0
}
30758
30759
static const uint8_t*  //
30760
wuffs_private_impl__swizzle_ycc__upsample_inv_h2v1_triangle(
30761
    uint8_t* dst_ptr,
30762
    const uint8_t* src_ptr_major,
30763
    const uint8_t* src_ptr_minor,
30764
    size_t src_len,
30765
    uint32_t h1v2_bias_ignored,
30766
    bool first_column,
30767
0
    bool last_column) {
30768
0
  uint8_t* dp = dst_ptr;
30769
0
  const uint8_t* sp = src_ptr_major;
30770
30771
0
  if (first_column) {
30772
0
    src_len--;
30773
0
    if ((src_len <= 0u) && last_column) {
30774
0
      uint8_t sv = *sp++;
30775
0
      *dp++ = sv;
30776
0
      *dp++ = sv;
30777
0
      return dst_ptr;
30778
0
    }
30779
0
    uint32_t svp1 = sp[+1];
30780
0
    uint8_t sv = *sp++;
30781
0
    *dp++ = sv;
30782
0
    *dp++ = (uint8_t)(((3u * (uint32_t)sv) + svp1 + 2u) >> 2u);
30783
0
    if (src_len <= 0u) {
30784
0
      return dst_ptr;
30785
0
    }
30786
0
  }
30787
30788
0
  if (last_column) {
30789
0
    src_len--;
30790
0
  }
30791
30792
0
  for (; src_len > 0u; src_len--) {
30793
0
    uint32_t svm1 = sp[-1];
30794
0
    uint32_t svp1 = sp[+1];
30795
0
    uint32_t sv3 = 3u * (uint32_t)(*sp++);
30796
0
    *dp++ = (uint8_t)((sv3 + svm1 + 1u) >> 2u);
30797
0
    *dp++ = (uint8_t)((sv3 + svp1 + 2u) >> 2u);
30798
0
  }
30799
30800
0
  if (last_column) {
30801
0
    uint32_t svm1 = sp[-1];
30802
0
    uint8_t sv = *sp++;
30803
0
    *dp++ = (uint8_t)(((3u * (uint32_t)sv) + svm1 + 1u) >> 2u);
30804
0
    *dp++ = sv;
30805
0
  }
30806
30807
0
  return dst_ptr;
30808
0
}
30809
30810
static const uint8_t*  //
30811
wuffs_private_impl__swizzle_ycc__upsample_inv_h2v2_triangle(
30812
    uint8_t* dst_ptr,
30813
    const uint8_t* src_ptr_major,
30814
    const uint8_t* src_ptr_minor,
30815
    size_t src_len,
30816
    uint32_t h1v2_bias_ignored,
30817
    bool first_column,
30818
0
    bool last_column) {
30819
0
  uint8_t* dp = dst_ptr;
30820
0
  const uint8_t* sp_major = src_ptr_major;
30821
0
  const uint8_t* sp_minor = src_ptr_minor;
30822
30823
0
  if (first_column) {
30824
0
    src_len--;
30825
0
    if ((src_len <= 0u) && last_column) {
30826
0
      uint32_t sv = (12u * ((uint32_t)(*sp_major++))) +  //
30827
0
                    (4u * ((uint32_t)(*sp_minor++)));
30828
0
      *dp++ = (uint8_t)((sv + 8u) >> 4u);
30829
0
      *dp++ = (uint8_t)((sv + 7u) >> 4u);
30830
0
      return dst_ptr;
30831
0
    }
30832
30833
0
    uint32_t sv_major_m1 = sp_major[-0];  // Clamp offset to zero.
30834
0
    uint32_t sv_minor_m1 = sp_minor[-0];  // Clamp offset to zero.
30835
0
    uint32_t sv_major_p1 = sp_major[+1];
30836
0
    uint32_t sv_minor_p1 = sp_minor[+1];
30837
30838
0
    uint32_t sv = (9u * ((uint32_t)(*sp_major++))) +  //
30839
0
                  (3u * ((uint32_t)(*sp_minor++)));
30840
0
    *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u);
30841
0
    *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u);
30842
0
    if (src_len <= 0u) {
30843
0
      return dst_ptr;
30844
0
    }
30845
0
  }
30846
30847
0
  if (last_column) {
30848
0
    src_len--;
30849
0
  }
30850
30851
0
  for (; src_len > 0u; src_len--) {
30852
0
    uint32_t sv_major_m1 = sp_major[-1];
30853
0
    uint32_t sv_minor_m1 = sp_minor[-1];
30854
0
    uint32_t sv_major_p1 = sp_major[+1];
30855
0
    uint32_t sv_minor_p1 = sp_minor[+1];
30856
30857
0
    uint32_t sv = (9u * ((uint32_t)(*sp_major++))) +  //
30858
0
                  (3u * ((uint32_t)(*sp_minor++)));
30859
0
    *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u);
30860
0
    *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u);
30861
0
  }
30862
30863
0
  if (last_column) {
30864
0
    uint32_t sv_major_m1 = sp_major[-1];
30865
0
    uint32_t sv_minor_m1 = sp_minor[-1];
30866
0
    uint32_t sv_major_p1 = sp_major[+0];  // Clamp offset to zero.
30867
0
    uint32_t sv_minor_p1 = sp_minor[+0];  // Clamp offset to zero.
30868
30869
0
    uint32_t sv = (9u * ((uint32_t)(*sp_major++))) +  //
30870
0
                  (3u * ((uint32_t)(*sp_minor++)));
30871
0
    *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u);
30872
0
    *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u);
30873
0
  }
30874
30875
0
  return dst_ptr;
30876
0
}
30877
30878
// wuffs_private_impl__swizzle_ycc__upsample_funcs is indexed by inv_h and then
30879
// inv_v.
30880
static const wuffs_private_impl__swizzle_ycc__upsample_func
30881
    wuffs_private_impl__swizzle_ycc__upsample_funcs[4][4] = {
30882
        {
30883
            wuffs_private_impl__swizzle_ycc__upsample_inv_h1vn_box,
30884
            wuffs_private_impl__swizzle_ycc__upsample_inv_h1vn_box,
30885
            wuffs_private_impl__swizzle_ycc__upsample_inv_h1vn_box,
30886
            wuffs_private_impl__swizzle_ycc__upsample_inv_h1vn_box,
30887
        },
30888
        {
30889
            wuffs_private_impl__swizzle_ycc__upsample_inv_h2vn_box,
30890
            wuffs_private_impl__swizzle_ycc__upsample_inv_h2vn_box,
30891
            wuffs_private_impl__swizzle_ycc__upsample_inv_h2vn_box,
30892
            wuffs_private_impl__swizzle_ycc__upsample_inv_h2vn_box,
30893
        },
30894
        {
30895
            wuffs_private_impl__swizzle_ycc__upsample_inv_h3vn_box,
30896
            wuffs_private_impl__swizzle_ycc__upsample_inv_h3vn_box,
30897
            wuffs_private_impl__swizzle_ycc__upsample_inv_h3vn_box,
30898
            wuffs_private_impl__swizzle_ycc__upsample_inv_h3vn_box,
30899
        },
30900
        {
30901
            wuffs_private_impl__swizzle_ycc__upsample_inv_h4vn_box,
30902
            wuffs_private_impl__swizzle_ycc__upsample_inv_h4vn_box,
30903
            wuffs_private_impl__swizzle_ycc__upsample_inv_h4vn_box,
30904
            wuffs_private_impl__swizzle_ycc__upsample_inv_h4vn_box,
30905
        },
30906
};
30907
30908
static inline uint32_t  //
30909
wuffs_private_impl__swizzle_has_triangle_upsampler(uint32_t inv_h,
30910
0
                                                   uint32_t inv_v) {
30911
0
  if (inv_h == 1u) {
30912
0
    return inv_v == 2u;
30913
0
  } else if (inv_h == 2u) {
30914
0
    return (inv_v == 1u) || (inv_v == 2u);
30915
0
  }
30916
0
  return false;
30917
0
}
30918
30919
// --------
30920
30921
// All of the wuffs_private_impl__swizzle_ycc__etc functions have
30922
// preconditions. See all of the checks made in
30923
// wuffs_base__pixel_swizzler__swizzle_ycck before calling these functions. For
30924
// example, (width > 0) is a precondition, but there are many more.
30925
30926
static void  //
30927
wuffs_private_impl__swizzle_ycck__general__triangle_filter_edge_row(
30928
    wuffs_base__pixel_buffer* dst,
30929
    uint32_t width,
30930
    uint32_t y,
30931
    const uint8_t* src_ptr0,
30932
    const uint8_t* src_ptr1,
30933
    const uint8_t* src_ptr2,
30934
    const uint8_t* src_ptr3,
30935
    uint32_t stride0,
30936
    uint32_t stride1,
30937
    uint32_t stride2,
30938
    uint32_t stride3,
30939
    uint32_t inv_h0,
30940
    uint32_t inv_h1,
30941
    uint32_t inv_h2,
30942
    uint32_t inv_h3,
30943
    uint32_t inv_v0,
30944
    uint32_t inv_v1,
30945
    uint32_t inv_v2,
30946
    uint32_t inv_v3,
30947
    uint32_t half_width_for_2to1,
30948
    uint32_t h1v2_bias,
30949
    uint8_t* scratch_buffer_2k_ptr,
30950
    wuffs_private_impl__swizzle_ycc__upsample_func upfunc0,
30951
    wuffs_private_impl__swizzle_ycc__upsample_func upfunc1,
30952
    wuffs_private_impl__swizzle_ycc__upsample_func upfunc2,
30953
    wuffs_private_impl__swizzle_ycc__upsample_func upfunc3,
30954
0
    wuffs_private_impl__swizzle_ycc__convert_4_func conv4func) {
30955
0
  const uint8_t* src0 = src_ptr0 + ((y / inv_v0) * (size_t)stride0);
30956
0
  const uint8_t* src1 = src_ptr1 + ((y / inv_v1) * (size_t)stride1);
30957
0
  const uint8_t* src2 = src_ptr2 + ((y / inv_v2) * (size_t)stride2);
30958
0
  const uint8_t* src3 = src_ptr3 + ((y / inv_v3) * (size_t)stride3);
30959
0
  uint32_t total_src_len0 = 0u;
30960
0
  uint32_t total_src_len1 = 0u;
30961
0
  uint32_t total_src_len2 = 0u;
30962
0
  uint32_t total_src_len3 = 0u;
30963
30964
0
  uint32_t x = 0u;
30965
0
  while (x < width) {
30966
0
    bool first_column = x == 0u;
30967
0
    uint32_t end = x + 480u;
30968
0
    if (end > width) {
30969
0
      end = width;
30970
0
    }
30971
30972
0
    uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0;
30973
0
    uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1;
30974
0
    uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2;
30975
0
    uint32_t src_len3 = ((end - x) + inv_h3 - 1u) / inv_h3;
30976
0
    total_src_len0 += src_len0;
30977
0
    total_src_len1 += src_len1;
30978
0
    total_src_len2 += src_len2;
30979
0
    total_src_len3 += src_len3;
30980
30981
0
    const uint8_t* src_ptr_x0 = src0 + (x / inv_h0);
30982
0
    const uint8_t* up0 = (*upfunc0)(          //
30983
0
        scratch_buffer_2k_ptr + (0u * 480u),  //
30984
0
        src_ptr_x0,                           //
30985
0
        src_ptr_x0,                           //
30986
0
        src_len0,                             //
30987
0
        h1v2_bias,                            //
30988
0
        first_column,                         //
30989
0
        (total_src_len0 >= half_width_for_2to1));
30990
30991
0
    const uint8_t* src_ptr_x1 = src1 + (x / inv_h1);
30992
0
    const uint8_t* up1 = (*upfunc1)(          //
30993
0
        scratch_buffer_2k_ptr + (1u * 480u),  //
30994
0
        src_ptr_x1,                           //
30995
0
        src_ptr_x1,                           //
30996
0
        src_len1,                             //
30997
0
        h1v2_bias,                            //
30998
0
        first_column,                         //
30999
0
        (total_src_len1 >= half_width_for_2to1));
31000
31001
0
    const uint8_t* src_ptr_x2 = src2 + (x / inv_h2);
31002
0
    const uint8_t* up2 = (*upfunc2)(          //
31003
0
        scratch_buffer_2k_ptr + (2u * 480u),  //
31004
0
        src_ptr_x2,                           //
31005
0
        src_ptr_x2,                           //
31006
0
        src_len2,                             //
31007
0
        h1v2_bias,                            //
31008
0
        first_column,                         //
31009
0
        (total_src_len2 >= half_width_for_2to1));
31010
31011
0
    const uint8_t* src_ptr_x3 = src3 + (x / inv_h3);
31012
0
    const uint8_t* up3 = (*upfunc3)(          //
31013
0
        scratch_buffer_2k_ptr + (3u * 480u),  //
31014
0
        src_ptr_x3,                           //
31015
0
        src_ptr_x3,                           //
31016
0
        src_len3,                             //
31017
0
        h1v2_bias,                            //
31018
0
        first_column,                         //
31019
0
        (total_src_len3 >= half_width_for_2to1));
31020
31021
0
    (*conv4func)(dst, x, end, y, up0, up1, up2, up3);
31022
0
    x = end;
31023
0
  }
31024
0
}
31025
31026
static void  //
31027
wuffs_private_impl__swizzle_ycck__general__triangle_filter(
31028
    wuffs_base__pixel_buffer* dst,
31029
    uint32_t x_min_incl,
31030
    uint32_t x_max_excl,
31031
    uint32_t y_min_incl,
31032
    uint32_t y_max_excl,
31033
    const uint8_t* src_ptr0,
31034
    const uint8_t* src_ptr1,
31035
    const uint8_t* src_ptr2,
31036
    const uint8_t* src_ptr3,
31037
    uint32_t stride0,
31038
    uint32_t stride1,
31039
    uint32_t stride2,
31040
    uint32_t stride3,
31041
    uint32_t inv_h0,
31042
    uint32_t inv_h1,
31043
    uint32_t inv_h2,
31044
    uint32_t inv_h3,
31045
    uint32_t inv_v0,
31046
    uint32_t inv_v1,
31047
    uint32_t inv_v2,
31048
    uint32_t inv_v3,
31049
    uint32_t half_width_for_2to1,
31050
    uint32_t half_height_for_2to1,
31051
    uint8_t* scratch_buffer_2k_ptr,
31052
    wuffs_private_impl__swizzle_ycc__upsample_func (*upfuncs)[4][4],
31053
0
    wuffs_private_impl__swizzle_ycc__convert_4_func conv4func) {
31054
0
  if ((x_min_incl != 0) || (y_min_incl != 0)) {
31055
0
    return;
31056
0
  }
31057
31058
0
  wuffs_private_impl__swizzle_ycc__upsample_func upfunc0 =
31059
0
      (*upfuncs)[(inv_h0 - 1u) & 3u][(inv_v0 - 1u) & 3u];
31060
0
  wuffs_private_impl__swizzle_ycc__upsample_func upfunc1 =
31061
0
      (*upfuncs)[(inv_h1 - 1u) & 3u][(inv_v1 - 1u) & 3u];
31062
0
  wuffs_private_impl__swizzle_ycc__upsample_func upfunc2 =
31063
0
      (*upfuncs)[(inv_h2 - 1u) & 3u][(inv_v2 - 1u) & 3u];
31064
0
  wuffs_private_impl__swizzle_ycc__upsample_func upfunc3 =
31065
0
      (*upfuncs)[(inv_h3 - 1u) & 3u][(inv_v3 - 1u) & 3u];
31066
31067
  // First row.
31068
0
  uint32_t h1v2_bias = 1u;
31069
0
  wuffs_private_impl__swizzle_ycck__general__triangle_filter_edge_row(
31070
0
      dst, x_max_excl, 0u,                     //
31071
0
      src_ptr0, src_ptr1, src_ptr2, src_ptr3,  //
31072
0
      stride0, stride1, stride2, stride3,      //
31073
0
      inv_h0, inv_h1, inv_h2, inv_h3,          //
31074
0
      inv_v0, inv_v1, inv_v2, inv_v3,          //
31075
0
      half_width_for_2to1,                     //
31076
0
      h1v2_bias,                               //
31077
0
      scratch_buffer_2k_ptr,                   //
31078
0
      upfunc0, upfunc1, upfunc2, upfunc3, conv4func);
31079
0
  h1v2_bias = 2u;
31080
31081
  // Middle rows.
31082
0
  bool last_row = y_max_excl == 2u * half_height_for_2to1;
31083
0
  uint32_t middle_y_max_excl = last_row ? (y_max_excl - 1u) : y_max_excl;
31084
0
  uint32_t y;
31085
0
  for (y = 1u; y < middle_y_max_excl; y++) {
31086
0
    const uint8_t* src0_major = src_ptr0 + ((y / inv_v0) * (size_t)stride0);
31087
0
    const uint8_t* src0_minor =
31088
0
        (inv_v0 != 2u)
31089
0
            ? src0_major
31090
0
            : ((y & 1u) ? (src0_major + stride0) : (src0_major - stride0));
31091
0
    const uint8_t* src1_major = src_ptr1 + ((y / inv_v1) * (size_t)stride1);
31092
0
    const uint8_t* src1_minor =
31093
0
        (inv_v1 != 2u)
31094
0
            ? src1_major
31095
0
            : ((y & 1u) ? (src1_major + stride1) : (src1_major - stride1));
31096
0
    const uint8_t* src2_major = src_ptr2 + ((y / inv_v2) * (size_t)stride2);
31097
0
    const uint8_t* src2_minor =
31098
0
        (inv_v2 != 2u)
31099
0
            ? src2_major
31100
0
            : ((y & 1u) ? (src2_major + stride2) : (src2_major - stride2));
31101
0
    const uint8_t* src3_major = src_ptr3 + ((y / inv_v3) * (size_t)stride3);
31102
0
    const uint8_t* src3_minor =
31103
0
        (inv_v3 != 2u)
31104
0
            ? src3_major
31105
0
            : ((y & 1u) ? (src3_major + stride3) : (src3_major - stride3));
31106
0
    uint32_t total_src_len0 = 0u;
31107
0
    uint32_t total_src_len1 = 0u;
31108
0
    uint32_t total_src_len2 = 0u;
31109
0
    uint32_t total_src_len3 = 0u;
31110
31111
0
    uint32_t x = 0u;
31112
0
    while (x < x_max_excl) {
31113
0
      bool first_column = x == 0u;
31114
0
      uint32_t end = x + 480u;
31115
0
      if (end > x_max_excl) {
31116
0
        end = x_max_excl;
31117
0
      }
31118
31119
0
      uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0;
31120
0
      uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1;
31121
0
      uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2;
31122
0
      uint32_t src_len3 = ((end - x) + inv_h3 - 1u) / inv_h3;
31123
0
      total_src_len0 += src_len0;
31124
0
      total_src_len1 += src_len1;
31125
0
      total_src_len2 += src_len2;
31126
0
      total_src_len3 += src_len3;
31127
31128
0
      const uint8_t* up0 = (*upfunc0)(          //
31129
0
          scratch_buffer_2k_ptr + (0u * 480u),  //
31130
0
          src0_major + (x / inv_h0),            //
31131
0
          src0_minor + (x / inv_h0),            //
31132
0
          src_len0,                             //
31133
0
          h1v2_bias,                            //
31134
0
          first_column,                         //
31135
0
          (total_src_len0 >= half_width_for_2to1));
31136
31137
0
      const uint8_t* up1 = (*upfunc1)(          //
31138
0
          scratch_buffer_2k_ptr + (1u * 480u),  //
31139
0
          src1_major + (x / inv_h1),            //
31140
0
          src1_minor + (x / inv_h1),            //
31141
0
          src_len1,                             //
31142
0
          h1v2_bias,                            //
31143
0
          first_column,                         //
31144
0
          (total_src_len1 >= half_width_for_2to1));
31145
31146
0
      const uint8_t* up2 = (*upfunc2)(          //
31147
0
          scratch_buffer_2k_ptr + (2u * 480u),  //
31148
0
          src2_major + (x / inv_h2),            //
31149
0
          src2_minor + (x / inv_h2),            //
31150
0
          src_len2,                             //
31151
0
          h1v2_bias,                            //
31152
0
          first_column,                         //
31153
0
          (total_src_len2 >= half_width_for_2to1));
31154
31155
0
      const uint8_t* up3 = (*upfunc3)(          //
31156
0
          scratch_buffer_2k_ptr + (3u * 480u),  //
31157
0
          src3_major + (x / inv_h3),            //
31158
0
          src3_minor + (x / inv_h3),            //
31159
0
          src_len3,                             //
31160
0
          h1v2_bias,                            //
31161
0
          first_column,                         //
31162
0
          (total_src_len3 >= half_width_for_2to1));
31163
31164
0
      (*conv4func)(dst, x, end, y, up0, up1, up2, up3);
31165
0
      x = end;
31166
0
    }
31167
31168
0
    h1v2_bias ^= 3u;
31169
0
  }
31170
31171
  // Last row.
31172
0
  if (middle_y_max_excl != y_max_excl) {
31173
0
    wuffs_private_impl__swizzle_ycck__general__triangle_filter_edge_row(
31174
0
        dst, x_max_excl, middle_y_max_excl,      //
31175
0
        src_ptr0, src_ptr1, src_ptr2, src_ptr3,  //
31176
0
        stride0, stride1, stride2, stride3,      //
31177
0
        inv_h0, inv_h1, inv_h2, inv_h3,          //
31178
0
        inv_v0, inv_v1, inv_v2, inv_v3,          //
31179
0
        half_width_for_2to1,                     //
31180
0
        h1v2_bias,                               //
31181
0
        scratch_buffer_2k_ptr,                   //
31182
0
        upfunc0, upfunc1, upfunc2, upfunc3, conv4func);
31183
0
  }
31184
0
}
31185
31186
static void  //
31187
wuffs_private_impl__swizzle_ycc__general__triangle_filter_edge_row(
31188
    wuffs_base__pixel_buffer* dst,
31189
    uint32_t width,
31190
    uint32_t y,
31191
    const uint8_t* src_ptr0,
31192
    const uint8_t* src_ptr1,
31193
    const uint8_t* src_ptr2,
31194
    uint32_t stride0,
31195
    uint32_t stride1,
31196
    uint32_t stride2,
31197
    uint32_t inv_h0,
31198
    uint32_t inv_h1,
31199
    uint32_t inv_h2,
31200
    uint32_t inv_v0,
31201
    uint32_t inv_v1,
31202
    uint32_t inv_v2,
31203
    uint32_t half_width_for_2to1,
31204
    uint32_t h1v2_bias,
31205
    uint8_t* scratch_buffer_2k_ptr,
31206
    wuffs_private_impl__swizzle_ycc__upsample_func upfunc0,
31207
    wuffs_private_impl__swizzle_ycc__upsample_func upfunc1,
31208
    wuffs_private_impl__swizzle_ycc__upsample_func upfunc2,
31209
0
    wuffs_private_impl__swizzle_ycc__convert_3_func conv3func) {
31210
0
  const uint8_t* src0 = src_ptr0 + ((y / inv_v0) * (size_t)stride0);
31211
0
  const uint8_t* src1 = src_ptr1 + ((y / inv_v1) * (size_t)stride1);
31212
0
  const uint8_t* src2 = src_ptr2 + ((y / inv_v2) * (size_t)stride2);
31213
0
  uint32_t total_src_len0 = 0u;
31214
0
  uint32_t total_src_len1 = 0u;
31215
0
  uint32_t total_src_len2 = 0u;
31216
31217
0
  uint32_t x = 0u;
31218
0
  while (x < width) {
31219
0
    bool first_column = x == 0u;
31220
0
    uint32_t end = x + 672u;
31221
0
    if (end > width) {
31222
0
      end = width;
31223
0
    }
31224
31225
0
    uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0;
31226
0
    uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1;
31227
0
    uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2;
31228
0
    total_src_len0 += src_len0;
31229
0
    total_src_len1 += src_len1;
31230
0
    total_src_len2 += src_len2;
31231
31232
0
    const uint8_t* src_ptr_x0 = src0 + (x / inv_h0);
31233
0
    const uint8_t* up0 = (*upfunc0)(          //
31234
0
        scratch_buffer_2k_ptr + (0u * 672u),  //
31235
0
        src_ptr_x0,                           //
31236
0
        src_ptr_x0,                           //
31237
0
        src_len0,                             //
31238
0
        h1v2_bias,                            //
31239
0
        first_column,                         //
31240
0
        (total_src_len0 >= half_width_for_2to1));
31241
31242
0
    const uint8_t* src_ptr_x1 = src1 + (x / inv_h1);
31243
0
    const uint8_t* up1 = (*upfunc1)(          //
31244
0
        scratch_buffer_2k_ptr + (1u * 672u),  //
31245
0
        src_ptr_x1,                           //
31246
0
        src_ptr_x1,                           //
31247
0
        src_len1,                             //
31248
0
        h1v2_bias,                            //
31249
0
        first_column,                         //
31250
0
        (total_src_len1 >= half_width_for_2to1));
31251
31252
0
    const uint8_t* src_ptr_x2 = src2 + (x / inv_h2);
31253
0
    const uint8_t* up2 = (*upfunc2)(          //
31254
0
        scratch_buffer_2k_ptr + (2u * 672u),  //
31255
0
        src_ptr_x2,                           //
31256
0
        src_ptr_x2,                           //
31257
0
        src_len2,                             //
31258
0
        h1v2_bias,                            //
31259
0
        first_column,                         //
31260
0
        (total_src_len2 >= half_width_for_2to1));
31261
31262
0
    (*conv3func)(dst, x, end, y, up0, up1, up2);
31263
0
    x = end;
31264
0
  }
31265
0
}
31266
31267
static void  //
31268
wuffs_private_impl__swizzle_ycc__general__triangle_filter(
31269
    wuffs_base__pixel_buffer* dst,
31270
    uint32_t x_min_incl,
31271
    uint32_t x_max_excl,
31272
    uint32_t y_min_incl,
31273
    uint32_t y_max_excl,
31274
    const uint8_t* src_ptr0,
31275
    const uint8_t* src_ptr1,
31276
    const uint8_t* src_ptr2,
31277
    uint32_t stride0,
31278
    uint32_t stride1,
31279
    uint32_t stride2,
31280
    uint32_t inv_h0,
31281
    uint32_t inv_h1,
31282
    uint32_t inv_h2,
31283
    uint32_t inv_v0,
31284
    uint32_t inv_v1,
31285
    uint32_t inv_v2,
31286
    uint32_t half_width_for_2to1,
31287
    uint32_t half_height_for_2to1,
31288
    uint8_t* scratch_buffer_2k_ptr,
31289
    wuffs_private_impl__swizzle_ycc__upsample_func (*upfuncs)[4][4],
31290
0
    wuffs_private_impl__swizzle_ycc__convert_3_func conv3func) {
31291
0
  if ((x_min_incl != 0) || (y_min_incl != 0)) {
31292
0
    return;
31293
0
  }
31294
31295
0
  wuffs_private_impl__swizzle_ycc__upsample_func upfunc0 =
31296
0
      (*upfuncs)[(inv_h0 - 1u) & 3u][(inv_v0 - 1u) & 3u];
31297
0
  wuffs_private_impl__swizzle_ycc__upsample_func upfunc1 =
31298
0
      (*upfuncs)[(inv_h1 - 1u) & 3u][(inv_v1 - 1u) & 3u];
31299
0
  wuffs_private_impl__swizzle_ycc__upsample_func upfunc2 =
31300
0
      (*upfuncs)[(inv_h2 - 1u) & 3u][(inv_v2 - 1u) & 3u];
31301
31302
  // First row.
31303
0
  uint32_t h1v2_bias = 1u;
31304
0
  wuffs_private_impl__swizzle_ycc__general__triangle_filter_edge_row(
31305
0
      dst, x_max_excl, 0u,           //
31306
0
      src_ptr0, src_ptr1, src_ptr2,  //
31307
0
      stride0, stride1, stride2,     //
31308
0
      inv_h0, inv_h1, inv_h2,        //
31309
0
      inv_v0, inv_v1, inv_v2,        //
31310
0
      half_width_for_2to1,           //
31311
0
      h1v2_bias,                     //
31312
0
      scratch_buffer_2k_ptr,         //
31313
0
      upfunc0, upfunc1, upfunc2, conv3func);
31314
0
  h1v2_bias = 2u;
31315
31316
  // Middle rows.
31317
0
  bool last_row = y_max_excl == 2u * half_height_for_2to1;
31318
0
  uint32_t middle_y_max_excl = last_row ? (y_max_excl - 1u) : y_max_excl;
31319
0
  uint32_t y;
31320
0
  for (y = 1u; y < middle_y_max_excl; y++) {
31321
0
    const uint8_t* src0_major = src_ptr0 + ((y / inv_v0) * (size_t)stride0);
31322
0
    const uint8_t* src0_minor =
31323
0
        (inv_v0 != 2u)
31324
0
            ? src0_major
31325
0
            : ((y & 1u) ? (src0_major + stride0) : (src0_major - stride0));
31326
0
    const uint8_t* src1_major = src_ptr1 + ((y / inv_v1) * (size_t)stride1);
31327
0
    const uint8_t* src1_minor =
31328
0
        (inv_v1 != 2u)
31329
0
            ? src1_major
31330
0
            : ((y & 1u) ? (src1_major + stride1) : (src1_major - stride1));
31331
0
    const uint8_t* src2_major = src_ptr2 + ((y / inv_v2) * (size_t)stride2);
31332
0
    const uint8_t* src2_minor =
31333
0
        (inv_v2 != 2u)
31334
0
            ? src2_major
31335
0
            : ((y & 1u) ? (src2_major + stride2) : (src2_major - stride2));
31336
0
    uint32_t total_src_len0 = 0u;
31337
0
    uint32_t total_src_len1 = 0u;
31338
0
    uint32_t total_src_len2 = 0u;
31339
31340
0
    uint32_t x = 0u;
31341
0
    while (x < x_max_excl) {
31342
0
      bool first_column = x == 0u;
31343
0
      uint32_t end = x + 672u;
31344
0
      if (end > x_max_excl) {
31345
0
        end = x_max_excl;
31346
0
      }
31347
31348
0
      uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0;
31349
0
      uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1;
31350
0
      uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2;
31351
0
      total_src_len0 += src_len0;
31352
0
      total_src_len1 += src_len1;
31353
0
      total_src_len2 += src_len2;
31354
31355
0
      const uint8_t* up0 = (*upfunc0)(          //
31356
0
          scratch_buffer_2k_ptr + (0u * 672u),  //
31357
0
          src0_major + (x / inv_h0),            //
31358
0
          src0_minor + (x / inv_h0),            //
31359
0
          src_len0,                             //
31360
0
          h1v2_bias,                            //
31361
0
          first_column,                         //
31362
0
          (total_src_len0 >= half_width_for_2to1));
31363
31364
0
      const uint8_t* up1 = (*upfunc1)(          //
31365
0
          scratch_buffer_2k_ptr + (1u * 672u),  //
31366
0
          src1_major + (x / inv_h1),            //
31367
0
          src1_minor + (x / inv_h1),            //
31368
0
          src_len1,                             //
31369
0
          h1v2_bias,                            //
31370
0
          first_column,                         //
31371
0
          (total_src_len1 >= half_width_for_2to1));
31372
31373
0
      const uint8_t* up2 = (*upfunc2)(          //
31374
0
          scratch_buffer_2k_ptr + (2u * 672u),  //
31375
0
          src2_major + (x / inv_h2),            //
31376
0
          src2_minor + (x / inv_h2),            //
31377
0
          src_len2,                             //
31378
0
          h1v2_bias,                            //
31379
0
          first_column,                         //
31380
0
          (total_src_len2 >= half_width_for_2to1));
31381
31382
0
      (*conv3func)(dst, x, end, y, up0, up1, up2);
31383
0
      x = end;
31384
0
    }
31385
31386
0
    h1v2_bias ^= 3u;
31387
0
  }
31388
31389
  // Last row.
31390
0
  if (middle_y_max_excl != y_max_excl) {
31391
0
    wuffs_private_impl__swizzle_ycc__general__triangle_filter_edge_row(
31392
0
        dst, x_max_excl, middle_y_max_excl,  //
31393
0
        src_ptr0, src_ptr1, src_ptr2,        //
31394
0
        stride0, stride1, stride2,           //
31395
0
        inv_h0, inv_h1, inv_h2,              //
31396
0
        inv_v0, inv_v1, inv_v2,              //
31397
0
        half_width_for_2to1,                 //
31398
0
        h1v2_bias,                           //
31399
0
        scratch_buffer_2k_ptr,               //
31400
0
        upfunc0, upfunc1, upfunc2, conv3func);
31401
0
  }
31402
0
}
31403
31404
static void  //
31405
wuffs_private_impl__swizzle_ycc__general__box_filter(
31406
    wuffs_base__pixel_buffer* dst,
31407
    uint32_t x_min_incl,
31408
    uint32_t x_max_excl,
31409
    uint32_t y_min_incl,
31410
    uint32_t y_max_excl,
31411
    const uint8_t* src_ptr0,
31412
    const uint8_t* src_ptr1,
31413
    const uint8_t* src_ptr2,
31414
    uint32_t stride0,
31415
    uint32_t stride1,
31416
    uint32_t stride2,
31417
    uint32_t inv_h0,
31418
    uint32_t inv_h1,
31419
    uint32_t inv_h2,
31420
    uint32_t inv_v0,
31421
    uint32_t inv_v1,
31422
    uint32_t inv_v2,
31423
    uint32_t half_width_for_2to1,
31424
    uint32_t half_height_for_2to1,
31425
    uint8_t* scratch_buffer_2k_ptr,
31426
    wuffs_private_impl__swizzle_ycc__upsample_func (*upfuncs)[4][4],
31427
0
    wuffs_private_impl__swizzle_ycc__convert_3_func conv3func) {
31428
0
  wuffs_private_impl__swizzle_ycc__upsample_func upfunc0 =
31429
0
      (*upfuncs)[(inv_h0 - 1u) & 3u][(inv_v0 - 1u) & 3u];
31430
0
  wuffs_private_impl__swizzle_ycc__upsample_func upfunc1 =
31431
0
      (*upfuncs)[(inv_h1 - 1u) & 3u][(inv_v1 - 1u) & 3u];
31432
0
  wuffs_private_impl__swizzle_ycc__upsample_func upfunc2 =
31433
0
      (*upfuncs)[(inv_h2 - 1u) & 3u][(inv_v2 - 1u) & 3u];
31434
31435
0
  uint32_t y;
31436
0
  for (y = y_min_incl; y < y_max_excl; y++) {
31437
0
    const uint8_t* src0_major =
31438
0
        src_ptr0 + (((y - y_min_incl) / inv_v0) * (size_t)stride0);
31439
0
    const uint8_t* src1_major =
31440
0
        src_ptr1 + (((y - y_min_incl) / inv_v1) * (size_t)stride1);
31441
0
    const uint8_t* src2_major =
31442
0
        src_ptr2 + (((y - y_min_incl) / inv_v2) * (size_t)stride2);
31443
31444
0
    uint32_t x = x_min_incl;
31445
0
    while (x < x_max_excl) {
31446
0
      uint32_t end = x + 672u;
31447
0
      if (end > x_max_excl) {
31448
0
        end = x_max_excl;
31449
0
      }
31450
31451
0
      uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0;
31452
0
      uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1;
31453
0
      uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2;
31454
31455
0
      const uint8_t* up0 = (*upfunc0)(               //
31456
0
          scratch_buffer_2k_ptr + (0u * 672u),       //
31457
0
          src0_major + ((x - x_min_incl) / inv_h0),  //
31458
0
          src0_major + ((x - x_min_incl) / inv_h0),  //
31459
0
          src_len0,                                  //
31460
0
          0u, false, false);
31461
31462
0
      const uint8_t* up1 = (*upfunc1)(               //
31463
0
          scratch_buffer_2k_ptr + (1u * 672u),       //
31464
0
          src1_major + ((x - x_min_incl) / inv_h1),  //
31465
0
          src1_major + ((x - x_min_incl) / inv_h1),  //
31466
0
          src_len1,                                  //
31467
0
          0u, false, false);
31468
31469
0
      const uint8_t* up2 = (*upfunc2)(               //
31470
0
          scratch_buffer_2k_ptr + (2u * 672u),       //
31471
0
          src2_major + ((x - x_min_incl) / inv_h2),  //
31472
0
          src2_major + ((x - x_min_incl) / inv_h2),  //
31473
0
          src_len2,                                  //
31474
0
          0u, false, false);
31475
31476
0
      (*conv3func)(dst, x, end, y, up0, up1, up2);
31477
0
      x = end;
31478
0
    }
31479
0
  }
31480
0
}
31481
31482
static void  //
31483
wuffs_private_impl__swizzle_ycck__general__box_filter(
31484
    wuffs_base__pixel_buffer* dst,
31485
    uint32_t x_min_incl,
31486
    uint32_t x_max_excl,
31487
    uint32_t y_min_incl,
31488
    uint32_t y_max_excl,
31489
    const uint8_t* src_ptr0,
31490
    const uint8_t* src_ptr1,
31491
    const uint8_t* src_ptr2,
31492
    const uint8_t* src_ptr3,
31493
    uint32_t stride0,
31494
    uint32_t stride1,
31495
    uint32_t stride2,
31496
    uint32_t stride3,
31497
    uint32_t inv_h0,
31498
    uint32_t inv_h1,
31499
    uint32_t inv_h2,
31500
    uint32_t inv_h3,
31501
    uint32_t inv_v0,
31502
    uint32_t inv_v1,
31503
    uint32_t inv_v2,
31504
    uint32_t inv_v3,
31505
    uint32_t half_width_for_2to1,
31506
    uint32_t half_height_for_2to1,
31507
    uint8_t* scratch_buffer_2k_ptr,
31508
    wuffs_private_impl__swizzle_ycc__upsample_func (*upfuncs)[4][4],
31509
0
    wuffs_private_impl__swizzle_ycc__convert_4_func conv4func) {
31510
0
  wuffs_private_impl__swizzle_ycc__upsample_func upfunc0 =
31511
0
      (*upfuncs)[(inv_h0 - 1u) & 3u][(inv_v0 - 1u) & 3u];
31512
0
  wuffs_private_impl__swizzle_ycc__upsample_func upfunc1 =
31513
0
      (*upfuncs)[(inv_h1 - 1u) & 3u][(inv_v1 - 1u) & 3u];
31514
0
  wuffs_private_impl__swizzle_ycc__upsample_func upfunc2 =
31515
0
      (*upfuncs)[(inv_h2 - 1u) & 3u][(inv_v2 - 1u) & 3u];
31516
0
  wuffs_private_impl__swizzle_ycc__upsample_func upfunc3 =
31517
0
      (*upfuncs)[(inv_h3 - 1u) & 3u][(inv_v3 - 1u) & 3u];
31518
31519
0
  uint32_t y;
31520
0
  for (y = y_min_incl; y < y_max_excl; y++) {
31521
0
    const uint8_t* src0_major =
31522
0
        src_ptr0 + (((y - y_min_incl) / inv_v0) * (size_t)stride0);
31523
0
    const uint8_t* src1_major =
31524
0
        src_ptr1 + (((y - y_min_incl) / inv_v1) * (size_t)stride1);
31525
0
    const uint8_t* src2_major =
31526
0
        src_ptr2 + (((y - y_min_incl) / inv_v2) * (size_t)stride2);
31527
0
    const uint8_t* src3_major =
31528
0
        src_ptr3 + (((y - y_min_incl) / inv_v3) * (size_t)stride3);
31529
31530
0
    uint32_t x = x_min_incl;
31531
0
    while (x < x_max_excl) {
31532
0
      uint32_t end = x + 480u;
31533
0
      if (end > x_max_excl) {
31534
0
        end = x_max_excl;
31535
0
      }
31536
31537
0
      uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0;
31538
0
      uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1;
31539
0
      uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2;
31540
0
      uint32_t src_len3 = ((end - x) + inv_h3 - 1u) / inv_h3;
31541
31542
0
      const uint8_t* up0 = (*upfunc0)(               //
31543
0
          scratch_buffer_2k_ptr + (0u * 480u),       //
31544
0
          src0_major + ((x - x_min_incl) / inv_h0),  //
31545
0
          src0_major + ((x - x_min_incl) / inv_h0),  //
31546
0
          src_len0,                                  //
31547
0
          0u, false, false);
31548
31549
0
      const uint8_t* up1 = (*upfunc1)(               //
31550
0
          scratch_buffer_2k_ptr + (1u * 480u),       //
31551
0
          src1_major + ((x - x_min_incl) / inv_h1),  //
31552
0
          src1_major + ((x - x_min_incl) / inv_h1),  //
31553
0
          src_len1,                                  //
31554
0
          0u, false, false);
31555
31556
0
      const uint8_t* up2 = (*upfunc2)(               //
31557
0
          scratch_buffer_2k_ptr + (2u * 480u),       //
31558
0
          src2_major + ((x - x_min_incl) / inv_h2),  //
31559
0
          src2_major + ((x - x_min_incl) / inv_h2),  //
31560
0
          src_len2,                                  //
31561
0
          0u, false, false);
31562
31563
0
      const uint8_t* up3 = (*upfunc3)(               //
31564
0
          scratch_buffer_2k_ptr + (3u * 480u),       //
31565
0
          src3_major + ((x - x_min_incl) / inv_h3),  //
31566
0
          src3_major + ((x - x_min_incl) / inv_h3),  //
31567
0
          src_len3,                                  //
31568
0
          0u, false, false);
31569
31570
0
      (*conv4func)(dst, x, end, y, up0, up1, up2, up3);
31571
0
      x = end;
31572
0
    }
31573
0
  }
31574
0
}
31575
31576
// --------
31577
31578
// wuffs_private_impl__swizzle_flattened_length is like
31579
// wuffs_base__table__flattened_length but returns uint64_t (not size_t) and
31580
// also accounts for subsampling.
31581
static uint64_t  //
31582
wuffs_private_impl__swizzle_flattened_length(uint32_t width,
31583
                                             uint32_t height,
31584
                                             uint32_t stride,
31585
                                             uint32_t inv_h,
31586
0
                                             uint32_t inv_v) {
31587
0
  uint64_t scaled_width = (((uint64_t)width) + (inv_h - 1u)) / inv_h;
31588
0
  uint64_t scaled_height = (((uint64_t)height) + (inv_v - 1u)) / inv_v;
31589
0
  if (scaled_height <= 0u) {
31590
0
    return 0u;
31591
0
  }
31592
0
  return ((scaled_height - 1u) * stride) + scaled_width;
31593
0
}
31594
31595
WUFFS_BASE__MAYBE_STATIC wuffs_base__status  //
31596
wuffs_base__pixel_swizzler__swizzle_ycck(
31597
    const wuffs_base__pixel_swizzler* p,
31598
    wuffs_base__pixel_buffer* dst,
31599
    wuffs_base__slice_u8 dst_palette,
31600
    uint32_t x_min_incl,
31601
    uint32_t x_max_excl,
31602
    uint32_t y_min_incl,
31603
    uint32_t y_max_excl,
31604
    wuffs_base__slice_u8 src0,
31605
    wuffs_base__slice_u8 src1,
31606
    wuffs_base__slice_u8 src2,
31607
    wuffs_base__slice_u8 src3,
31608
    uint32_t width0,
31609
    uint32_t width1,
31610
    uint32_t width2,
31611
    uint32_t width3,
31612
    uint32_t height0,
31613
    uint32_t height1,
31614
    uint32_t height2,
31615
    uint32_t height3,
31616
    uint32_t stride0,
31617
    uint32_t stride1,
31618
    uint32_t stride2,
31619
    uint32_t stride3,
31620
    uint8_t h0,
31621
    uint8_t h1,
31622
    uint8_t h2,
31623
    uint8_t h3,
31624
    uint8_t v0,
31625
    uint8_t v1,
31626
    uint8_t v2,
31627
    uint8_t v3,
31628
    bool is_rgb_or_cmyk,
31629
    bool triangle_filter_for_2to1,
31630
0
    wuffs_base__slice_u8 scratch_buffer_2k) {
31631
0
  if (!p) {
31632
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
31633
0
  } else if (!dst ||                             //
31634
0
             (x_min_incl > x_max_excl) ||        //
31635
0
             (x_max_excl > 0xFFFFu) ||           //
31636
0
             (y_min_incl > y_max_excl) ||        //
31637
0
             (y_max_excl > 0xFFFFu) ||           //
31638
0
             (4u <= ((unsigned int)h0 - 1u)) ||  //
31639
0
             (4u <= ((unsigned int)h1 - 1u)) ||  //
31640
0
             (4u <= ((unsigned int)h2 - 1u)) ||  //
31641
0
             (4u <= ((unsigned int)v0 - 1u)) ||  //
31642
0
             (4u <= ((unsigned int)v1 - 1u)) ||  //
31643
0
             (4u <= ((unsigned int)v2 - 1u)) ||  //
31644
0
             (triangle_filter_for_2to1 && ((x_min_incl | y_min_incl) > 0u)) ||
31645
0
             (scratch_buffer_2k.len < 2048u)) {
31646
0
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
31647
0
  }
31648
0
  if ((h3 != 0u) || (v3 != 0u)) {
31649
0
    if ((4u <= ((unsigned int)h3 - 1u)) ||  //
31650
0
        (4u <= ((unsigned int)v3 - 1u))) {
31651
0
      return wuffs_base__make_status(wuffs_base__error__bad_argument);
31652
0
    }
31653
0
  }
31654
31655
0
  uint32_t max_incl_h = wuffs_private_impl__u32__max_of_4(h0, h1, h2, h3);
31656
0
  uint32_t max_incl_v = wuffs_private_impl__u32__max_of_4(v0, v1, v2, v3);
31657
31658
  // Calculate the inverse h and v ratios.
31659
  //
31660
  // It also canonicalizes (h=2 and max_incl_h=4) as equivalent to (h=1 and
31661
  // max_incl_h=2). In both cases, the inv_h value is 2.
31662
0
  uint32_t inv_h0 = max_incl_h / h0;
31663
0
  uint32_t inv_h1 = max_incl_h / h1;
31664
0
  uint32_t inv_h2 = max_incl_h / h2;
31665
0
  uint32_t inv_h3 = h3 ? (max_incl_h / h3) : 0u;
31666
0
  uint32_t inv_v0 = max_incl_v / v0;
31667
0
  uint32_t inv_v1 = max_incl_v / v1;
31668
0
  uint32_t inv_v2 = max_incl_v / v2;
31669
0
  uint32_t inv_v3 = v3 ? (max_incl_v / v3) : 0u;
31670
31671
0
  if (x_min_incl != 0) {
31672
0
    if ((x_min_incl % inv_h0) || (x_min_incl % inv_h1) ||
31673
0
        (x_min_incl % inv_h2) || (inv_h3 && (x_min_incl % inv_h3))) {
31674
0
      return wuffs_base__make_status(wuffs_base__error__bad_argument);
31675
0
    }
31676
0
  }
31677
0
  if (y_min_incl != 0) {
31678
0
    if ((y_min_incl % inv_v0) || (y_min_incl % inv_v1) ||
31679
0
        (y_min_incl % inv_v2) || (inv_v3 && (y_min_incl % inv_v3))) {
31680
0
      return wuffs_base__make_status(wuffs_base__error__bad_argument);
31681
0
    }
31682
0
  }
31683
31684
0
  uint32_t half_width_for_2to1 = ((x_max_excl - x_min_incl) + 1u) / 2u;
31685
0
  if (inv_h0 == 2) {
31686
0
    half_width_for_2to1 = wuffs_base__u32__min(half_width_for_2to1, width0);
31687
0
  }
31688
0
  if (inv_h1 == 2) {
31689
0
    half_width_for_2to1 = wuffs_base__u32__min(half_width_for_2to1, width1);
31690
0
  }
31691
0
  if (inv_h2 == 2) {
31692
0
    half_width_for_2to1 = wuffs_base__u32__min(half_width_for_2to1, width2);
31693
0
  }
31694
0
  if (inv_h3 == 2) {
31695
0
    half_width_for_2to1 = wuffs_base__u32__min(half_width_for_2to1, width3);
31696
0
  }
31697
31698
0
  uint32_t half_height_for_2to1 = ((y_max_excl - y_min_incl) + 1u) / 2u;
31699
0
  if (inv_v0 == 2) {
31700
0
    half_height_for_2to1 = wuffs_base__u32__min(half_height_for_2to1, height0);
31701
0
  }
31702
0
  if (inv_v1 == 2) {
31703
0
    half_height_for_2to1 = wuffs_base__u32__min(half_height_for_2to1, height1);
31704
0
  }
31705
0
  if (inv_v2 == 2) {
31706
0
    half_height_for_2to1 = wuffs_base__u32__min(half_height_for_2to1, height2);
31707
0
  }
31708
0
  if (inv_v3 == 2) {
31709
0
    half_height_for_2to1 = wuffs_base__u32__min(half_height_for_2to1, height3);
31710
0
  }
31711
31712
0
  x_max_excl = wuffs_base__u32__min(                   //
31713
0
      wuffs_base__pixel_config__width(&dst->pixcfg),   //
31714
0
      x_min_incl + wuffs_private_impl__u32__min_of_5(  //
31715
0
                       x_max_excl - x_min_incl,        //
31716
0
                       width0 * inv_h0,                //
31717
0
                       width1 * inv_h1,                //
31718
0
                       width2 * inv_h2,                //
31719
0
                       inv_h3 ? (width3 * inv_h3) : 0xFFFFFFFF));
31720
0
  y_max_excl = wuffs_base__u32__min(                   //
31721
0
      wuffs_base__pixel_config__height(&dst->pixcfg),  //
31722
0
      y_min_incl + wuffs_private_impl__u32__min_of_5(  //
31723
0
                       y_max_excl - y_min_incl,        //
31724
0
                       height0 * inv_v0,               //
31725
0
                       height1 * inv_v1,               //
31726
0
                       height2 * inv_v2,               //
31727
0
                       inv_v3 ? (height3 * inv_v3) : 0xFFFFFFFF));
31728
31729
0
  if ((x_min_incl >= x_max_excl) || (y_min_incl >= y_max_excl)) {
31730
0
    return wuffs_base__make_status(NULL);
31731
0
  }
31732
0
  uint32_t width = x_max_excl - x_min_incl;
31733
0
  uint32_t height = y_max_excl - y_min_incl;
31734
31735
0
  if (((h0 * inv_h0) != max_incl_h) ||  //
31736
0
      ((h1 * inv_h1) != max_incl_h) ||  //
31737
0
      ((h2 * inv_h2) != max_incl_h) ||  //
31738
0
      ((v0 * inv_v0) != max_incl_v) ||  //
31739
0
      ((v1 * inv_v1) != max_incl_v) ||  //
31740
0
      ((v2 * inv_v2) != max_incl_v) ||  //
31741
0
      (src0.len < wuffs_private_impl__swizzle_flattened_length(
31742
0
                      width, height, stride0, inv_h0, inv_v0)) ||
31743
0
      (src1.len < wuffs_private_impl__swizzle_flattened_length(
31744
0
                      width, height, stride1, inv_h1, inv_v1)) ||
31745
0
      (src2.len < wuffs_private_impl__swizzle_flattened_length(
31746
0
                      width, height, stride2, inv_h2, inv_v2))) {
31747
0
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
31748
0
  }
31749
0
  if ((h3 != 0u) || (v3 != 0u)) {
31750
0
    if (((h3 * inv_h3) != max_incl_h) ||  //
31751
0
        ((v3 * inv_v3) != max_incl_v) ||  //
31752
0
        (src3.len < wuffs_private_impl__swizzle_flattened_length(
31753
0
                        width, height, stride3, inv_h3, inv_v3))) {
31754
0
      return wuffs_base__make_status(wuffs_base__error__bad_argument);
31755
0
    }
31756
0
  }
31757
31758
0
  if (wuffs_base__pixel_format__is_planar(&dst->pixcfg.private_impl.pixfmt)) {
31759
    // TODO: see wuffs_base__pixel_buffer__set_color_u32_at's TODO.
31760
0
    return wuffs_base__make_status(
31761
0
        wuffs_base__error__unsupported_pixel_swizzler_option);
31762
0
  }
31763
31764
  // ----
31765
31766
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ENABLE_ALLOWLIST)
31767
  switch (dst->pixcfg.private_impl.pixfmt.repr) {
31768
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_Y)
31769
    case WUFFS_BASE__PIXEL_FORMAT__Y:
31770
      break;
31771
#endif
31772
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGR_565)
31773
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
31774
      break;
31775
#endif
31776
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGR)
31777
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
31778
      break;
31779
#endif
31780
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGRA_NONPREMUL)
31781
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
31782
      break;
31783
#endif
31784
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGRA_NONPREMUL_4X16LE)
31785
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
31786
      break;
31787
#endif
31788
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGRA_PREMUL)
31789
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
31790
      break;
31791
#endif
31792
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_RGB)
31793
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
31794
      break;
31795
#endif
31796
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_RGBA_NONPREMUL)
31797
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
31798
      break;
31799
#endif
31800
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_RGBA_PREMUL)
31801
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
31802
      break;
31803
#endif
31804
    default:
31805
      return wuffs_base__make_status(
31806
          wuffs_base__error__disabled_by_wuffs_config_dst_pixel_format_enable_allowlist);
31807
  }
31808
#else   // defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ENABLE_ALLOWLIST)
31809
0
  switch (dst->pixcfg.private_impl.pixfmt.repr) {
31810
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
31811
0
    case WUFFS_BASE__PIXEL_FORMAT__Y_16LE:
31812
0
    case WUFFS_BASE__PIXEL_FORMAT__Y_16BE:
31813
0
    case WUFFS_BASE__PIXEL_FORMAT__YA_NONPREMUL:
31814
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL:
31815
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL:
31816
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY:
31817
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
31818
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
31819
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
31820
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
31821
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
31822
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRX:
31823
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
31824
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
31825
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
31826
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBX:
31827
0
      break;
31828
31829
0
    default:
31830
      // TODO: see wuffs_base__pixel_buffer__set_color_u32_at's TODO.
31831
0
      return wuffs_base__make_status(
31832
0
          wuffs_base__error__unsupported_pixel_swizzler_option);
31833
0
  }
31834
0
#endif  // defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ENABLE_ALLOWLIST)
31835
31836
  // ----
31837
31838
0
  wuffs_private_impl__swizzle_ycc__convert_3_func conv3func = NULL;
31839
31840
0
  if (is_rgb_or_cmyk) {
31841
0
    conv3func = &wuffs_private_impl__swizzle_rgb__convert_3_general;
31842
0
  } else {
31843
0
    switch (dst->pixcfg.private_impl.pixfmt.repr) {
31844
0
      case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
31845
0
      case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
31846
0
      case WUFFS_BASE__PIXEL_FORMAT__BGRX:
31847
0
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
31848
0
        if (wuffs_base__cpu_arch__have_x86_avx2()) {
31849
0
          conv3func = &wuffs_private_impl__swizzle_ycc__convert_3_bgrx_x86_avx2;
31850
0
          break;
31851
0
        }
31852
0
#endif
31853
0
        conv3func = &wuffs_private_impl__swizzle_ycc__convert_3_bgrx;
31854
0
        break;
31855
0
      case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
31856
0
      case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
31857
0
      case WUFFS_BASE__PIXEL_FORMAT__RGBX:
31858
0
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
31859
0
        if (wuffs_base__cpu_arch__have_x86_avx2()) {
31860
0
          conv3func = &wuffs_private_impl__swizzle_ycc__convert_3_rgbx_x86_avx2;
31861
0
          break;
31862
0
        }
31863
0
#endif
31864
0
        conv3func = &wuffs_private_impl__swizzle_ycc__convert_3_rgbx;
31865
0
        break;
31866
0
      default:
31867
0
        conv3func = &wuffs_private_impl__swizzle_ycc__convert_3_general;
31868
0
        break;
31869
0
    }
31870
0
  }
31871
31872
0
  void (*func3)(wuffs_base__pixel_buffer * dst,  //
31873
0
                uint32_t x_min_incl,             //
31874
0
                uint32_t x_max_excl,             //
31875
0
                uint32_t y_min_incl,             //
31876
0
                uint32_t y_max_excl,             //
31877
0
                const uint8_t* src_ptr0,         //
31878
0
                const uint8_t* src_ptr1,         //
31879
0
                const uint8_t* src_ptr2,         //
31880
0
                uint32_t stride0,                //
31881
0
                uint32_t stride1,                //
31882
0
                uint32_t stride2,                //
31883
0
                uint32_t inv_h0,                 //
31884
0
                uint32_t inv_h1,                 //
31885
0
                uint32_t inv_h2,                 //
31886
0
                uint32_t inv_v0,                 //
31887
0
                uint32_t inv_v1,                 //
31888
0
                uint32_t inv_v2,                 //
31889
0
                uint32_t half_width_for_2to1,    //
31890
0
                uint32_t half_height_for_2to1,   //
31891
0
                uint8_t* scratch_buffer_2k_ptr,  //
31892
0
                wuffs_private_impl__swizzle_ycc__upsample_func(*upfuncs)[4][4],
31893
0
                wuffs_private_impl__swizzle_ycc__convert_3_func conv3func) =
31894
0
      &wuffs_private_impl__swizzle_ycc__general__box_filter;
31895
31896
0
  void (*func4)(wuffs_base__pixel_buffer * dst,  //
31897
0
                uint32_t x_min_incl,             //
31898
0
                uint32_t x_max_excl,             //
31899
0
                uint32_t y_min_incl,             //
31900
0
                uint32_t y_max_excl,             //
31901
0
                const uint8_t* src_ptr0,         //
31902
0
                const uint8_t* src_ptr1,         //
31903
0
                const uint8_t* src_ptr2,         //
31904
0
                const uint8_t* src_ptr3,         //
31905
0
                uint32_t stride0,                //
31906
0
                uint32_t stride1,                //
31907
0
                uint32_t stride2,                //
31908
0
                uint32_t stride3,                //
31909
0
                uint32_t inv_h0,                 //
31910
0
                uint32_t inv_h1,                 //
31911
0
                uint32_t inv_h2,                 //
31912
0
                uint32_t inv_h3,                 //
31913
0
                uint32_t inv_v0,                 //
31914
0
                uint32_t inv_v1,                 //
31915
0
                uint32_t inv_v2,                 //
31916
0
                uint32_t inv_v3,                 //
31917
0
                uint32_t half_width_for_2to1,    //
31918
0
                uint32_t half_height_for_2to1,   //
31919
0
                uint8_t* scratch_buffer_2k_ptr,  //
31920
0
                wuffs_private_impl__swizzle_ycc__upsample_func(*upfuncs)[4][4],
31921
0
                wuffs_private_impl__swizzle_ycc__convert_4_func conv4func) =
31922
0
      &wuffs_private_impl__swizzle_ycck__general__box_filter;
31923
31924
0
  wuffs_private_impl__swizzle_ycc__upsample_func upfuncs[4][4];
31925
0
  memcpy(&upfuncs, &wuffs_private_impl__swizzle_ycc__upsample_funcs,
31926
0
         sizeof upfuncs);
31927
31928
0
  if (triangle_filter_for_2to1 &&
31929
0
      (wuffs_private_impl__swizzle_has_triangle_upsampler(inv_h0, inv_v0) ||
31930
0
       wuffs_private_impl__swizzle_has_triangle_upsampler(inv_h1, inv_v1) ||
31931
0
       wuffs_private_impl__swizzle_has_triangle_upsampler(inv_h2, inv_v2) ||
31932
0
       wuffs_private_impl__swizzle_has_triangle_upsampler(inv_h3, inv_v3))) {
31933
0
    func3 = &wuffs_private_impl__swizzle_ycc__general__triangle_filter;
31934
0
    func4 = &wuffs_private_impl__swizzle_ycck__general__triangle_filter;
31935
31936
0
    upfuncs[0][1] = wuffs_private_impl__swizzle_ycc__upsample_inv_h1v2_triangle;
31937
0
    upfuncs[1][0] = wuffs_private_impl__swizzle_ycc__upsample_inv_h2v1_triangle;
31938
0
    upfuncs[1][1] = wuffs_private_impl__swizzle_ycc__upsample_inv_h2v2_triangle;
31939
31940
0
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
31941
#if defined(__GNUC__) && !defined(__clang__)
31942
    // Don't use our AVX2 implementation for GCC (but do use it for clang). For
31943
    // some unknown reason, GCC performs noticably better on the non-SIMD
31944
    // version. Possibly because GCC's auto-vectorizer is smarter (just with
31945
    // SSE2, not AVX2) than our hand-written code, but that's just a guess.
31946
    //
31947
    // See commits 51bc60ef9298cb2efc1b29a9681191f66d49820d and
31948
    // cd769a0cdf1b5affee13f6089b995f3d39569cb4 for benchmark numbers.
31949
    //
31950
    // See also https://godbolt.org/z/MbhbPGEz4 for Debian Bullseye's clang 11
31951
    // versus gcc 10, where only gcc auto-vectorizes, although later clang
31952
    // versions will also auto-vectorize.
31953
#else
31954
0
    if (wuffs_base__cpu_arch__have_x86_avx2()) {
31955
0
      upfuncs[1][1] =
31956
0
          wuffs_private_impl__swizzle_ycc__upsample_inv_h2v2_triangle_x86_avx2;
31957
0
    }
31958
0
#endif
31959
0
#endif
31960
0
  }
31961
31962
0
  if ((h3 != 0u) || (v3 != 0u)) {
31963
0
    wuffs_private_impl__swizzle_ycc__convert_4_func conv4func =
31964
0
        is_rgb_or_cmyk ? &wuffs_private_impl__swizzle_cmyk__convert_4_general
31965
0
                       : &wuffs_private_impl__swizzle_ycck__convert_4_general;
31966
0
    (*func4)(                                                 //
31967
0
        dst, x_min_incl, x_max_excl, y_min_incl, y_max_excl,  //
31968
0
        src0.ptr, src1.ptr, src2.ptr, src3.ptr,               //
31969
0
        stride0, stride1, stride2, stride3,                   //
31970
0
        inv_h0, inv_h1, inv_h2, inv_h3,                       //
31971
0
        inv_v0, inv_v1, inv_v2, inv_v3,                       //
31972
0
        half_width_for_2to1, half_height_for_2to1,            //
31973
0
        scratch_buffer_2k.ptr, &upfuncs, conv4func);
31974
31975
0
  } else {
31976
0
    (*func3)(                                                 //
31977
0
        dst, x_min_incl, x_max_excl, y_min_incl, y_max_excl,  //
31978
0
        src0.ptr, src1.ptr, src2.ptr,                         //
31979
0
        stride0, stride1, stride2,                            //
31980
0
        inv_h0, inv_h1, inv_h2,                               //
31981
0
        inv_v0, inv_v1, inv_v2,                               //
31982
0
        half_width_for_2to1, half_height_for_2to1,            //
31983
0
        scratch_buffer_2k.ptr, &upfuncs, conv3func);
31984
0
  }
31985
31986
0
  return wuffs_base__make_status(NULL);
31987
0
}
31988
31989
// --------
31990
31991
// โ€ผ WUFFS MULTI-FILE SECTION +x86_avx2
31992
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
31993
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2")
31994
static void  //
31995
wuffs_private_impl__swizzle_ycc__convert_3_bgrx_x86_avx2(
31996
    wuffs_base__pixel_buffer* dst,
31997
    uint32_t x,
31998
    uint32_t x_end,
31999
    uint32_t y,
32000
    const uint8_t* up0,
32001
    const uint8_t* up1,
32002
0
    const uint8_t* up2) {
32003
0
  if ((x + 32u) > x_end) {
32004
0
    wuffs_private_impl__swizzle_ycc__convert_3_bgrx(  //
32005
0
        dst, x, x_end, y, up0, up1, up2);
32006
0
    return;
32007
0
  }
32008
32009
0
  size_t dst_stride = dst->private_impl.planes[0].stride;
32010
0
  uint8_t* dst_iter = dst->private_impl.planes[0].ptr +
32011
0
                      (dst_stride * ((size_t)y)) + (4u * ((size_t)x));
32012
32013
  // u0001 = u16x16 [0x0001 .. 0x0001]
32014
  // u00FF = u16x16 [0x00FF .. 0x00FF]
32015
  // uFF80 = u16x16 [0xFF80 .. 0xFF80]
32016
  // uFFFF = u16x16 [0xFFFF .. 0xFFFF]
32017
0
  const __m256i u0001 = _mm256_set1_epi16(+0x0001);
32018
0
  const __m256i u00FF = _mm256_set1_epi16(+0x00FF);
32019
0
  const __m256i uFF80 = _mm256_set1_epi16(-0x0080);
32020
0
  const __m256i uFFFF = _mm256_set1_epi16(-0x0001);
32021
32022
  // p8000_p0000 = u16x16 [0x8000 0x0000 .. 0x8000 0x0000]
32023
0
  const __m256i p8000_p0000 = _mm256_set_epi16(  //
32024
0
      +0x0000, -0x8000, +0x0000, -0x8000,        //
32025
0
      +0x0000, -0x8000, +0x0000, -0x8000,        //
32026
0
      +0x0000, -0x8000, +0x0000, -0x8000,        //
32027
0
      +0x0000, -0x8000, +0x0000, -0x8000);
32028
32029
  // Per wuffs_base__color_ycc__as__color_u32, the formulae:
32030
  //
32031
  //  R = Y                + 1.40200 * Cr
32032
  //  G = Y - 0.34414 * Cb - 0.71414 * Cr
32033
  //  B = Y + 1.77200 * Cb
32034
  //
32035
  // When scaled by 1<<16:
32036
  //
32037
  //  0.34414 becomes 0x0581A =  22554.
32038
  //  0.71414 becomes 0x0B6D2 =  46802.
32039
  //  1.40200 becomes 0x166E9 =  91881.
32040
  //  1.77200 becomes 0x1C5A2 = 116130.
32041
  //
32042
  // Separate the integer and fractional parts, since we work with signed
32043
  // 16-bit SIMD lanes. The fractional parts range from -0.5 .. +0.5 (as
32044
  // floating-point) which is from -0x8000 .. +0x8000 (as fixed-point).
32045
  //
32046
  //  -0x3A5E = -0x20000 + 0x1C5A2     The B:Cb factor.
32047
  //  +0x66E9 = -0x10000 + 0x166E9     The R:Cr factor.
32048
  //  -0x581A = +0x00000 - 0x0581A     The G:Cb factor.
32049
  //  +0x492E = +0x10000 - 0x0B6D2     The G:Cr factor.
32050
0
  const __m256i m3A5E = _mm256_set1_epi16(-0x3A5E);
32051
0
  const __m256i p66E9 = _mm256_set1_epi16(+0x66E9);
32052
0
  const __m256i m581A_p492E = _mm256_set_epi16(  //
32053
0
      +0x492E, -0x581A, +0x492E, -0x581A,        //
32054
0
      +0x492E, -0x581A, +0x492E, -0x581A,        //
32055
0
      +0x492E, -0x581A, +0x492E, -0x581A,        //
32056
0
      +0x492E, -0x581A, +0x492E, -0x581A);
32057
32058
0
  while (x < x_end) {
32059
    // Load chroma values in even and odd columns (the high 8 bits of each
32060
    // u16x16 element are zero) and then subtract 0x0080.
32061
    //
32062
    // cb_all = u8x32  [cb.00 cb.01 cb.02 cb.03 .. cb.1C cb.1D cb.1E cb.1F]
32063
    // cb_eve = i16x16 [cb.00-0x80  cb.02-0x80  .. cb.1C-0x80  cb.1E-0x80 ]
32064
    // cb_odd = i16x16 [cb.01-0x80  cb.03-0x80  .. cb.1D-0x80  cb.1F-0x80 ]
32065
    //
32066
    // Ditto for the cr_xxx Chroma-Red values.
32067
0
    __m256i cb_all = _mm256_lddqu_si256((const __m256i*)(const void*)up1);
32068
0
    __m256i cr_all = _mm256_lddqu_si256((const __m256i*)(const void*)up2);
32069
0
    __m256i cb_eve = _mm256_add_epi16(uFF80, _mm256_and_si256(cb_all, u00FF));
32070
0
    __m256i cr_eve = _mm256_add_epi16(uFF80, _mm256_and_si256(cr_all, u00FF));
32071
0
    __m256i cb_odd = _mm256_add_epi16(uFF80, _mm256_srli_epi16(cb_all, 8));
32072
0
    __m256i cr_odd = _mm256_add_epi16(uFF80, _mm256_srli_epi16(cr_all, 8));
32073
32074
    // ----
32075
32076
    // Calculate:
32077
    //
32078
    //  B-Y = (+1.77200 * Cb)                 as floating-point
32079
    //  R-Y = (+1.40200 * Cr)                 as floating-point
32080
    //
32081
    //  B-Y = ((0x2_0000 - 0x3A5E) * Cb)      as fixed-point
32082
    //  R-Y = ((0x1_0000 + 0x66E9) * Cr)      as fixed-point
32083
    //
32084
    //  B-Y = ((-0x3A5E * Cb) + ("2.0" * Cb))
32085
    //  R-Y = ((+0x66E9 * Cr) + ("1.0" * Cr))
32086
32087
    // Multiply by m3A5E or p66E9, taking the high 16 bits. There's also a
32088
    // doubling (add x to itself), adding-of-1 and halving (shift right by 1).
32089
    // That makes multiply-and-take-high round to nearest (instead of down).
32090
0
    __m256i tmp_by_eve = _mm256_srai_epi16(
32091
0
        _mm256_add_epi16(
32092
0
            _mm256_mulhi_epi16(_mm256_add_epi16(cb_eve, cb_eve), m3A5E), u0001),
32093
0
        1);
32094
0
    __m256i tmp_by_odd = _mm256_srai_epi16(
32095
0
        _mm256_add_epi16(
32096
0
            _mm256_mulhi_epi16(_mm256_add_epi16(cb_odd, cb_odd), m3A5E), u0001),
32097
0
        1);
32098
0
    __m256i tmp_ry_eve = _mm256_srai_epi16(
32099
0
        _mm256_add_epi16(
32100
0
            _mm256_mulhi_epi16(_mm256_add_epi16(cr_eve, cr_eve), p66E9), u0001),
32101
0
        1);
32102
0
    __m256i tmp_ry_odd = _mm256_srai_epi16(
32103
0
        _mm256_add_epi16(
32104
0
            _mm256_mulhi_epi16(_mm256_add_epi16(cr_odd, cr_odd), p66E9), u0001),
32105
0
        1);
32106
32107
    // Add (2 * Cb) and (1 * Cr).
32108
0
    __m256i by_eve =
32109
0
        _mm256_add_epi16(tmp_by_eve, _mm256_add_epi16(cb_eve, cb_eve));
32110
0
    __m256i by_odd =
32111
0
        _mm256_add_epi16(tmp_by_odd, _mm256_add_epi16(cb_odd, cb_odd));
32112
0
    __m256i ry_eve = _mm256_add_epi16(tmp_ry_eve, cr_eve);
32113
0
    __m256i ry_odd = _mm256_add_epi16(tmp_ry_odd, cr_odd);
32114
32115
    // ----
32116
32117
    // Calculate:
32118
    //
32119
    //  G-Y = (-0.34414 * Cb) +
32120
    //        (-0.71414 * Cr)                 as floating-point
32121
    //
32122
    //  G-Y = ((+0x0_0000 - 0x581A) * Cb) +
32123
    //        ((-0x1_0000 + 0x492E) * Cr)     as fixed-point
32124
    //
32125
    //  G-Y =  (-0x581A * Cb) +
32126
    //         (+0x492E * Cr) - ("1.0" * Cr)
32127
32128
    // Multiply-add to get ((-0x581A * Cb) + (+0x492E * Cr)).
32129
0
    __m256i tmp0_gy_eve_lo = _mm256_madd_epi16(  //
32130
0
        _mm256_unpacklo_epi16(cb_eve, cr_eve), m581A_p492E);
32131
0
    __m256i tmp0_gy_eve_hi = _mm256_madd_epi16(  //
32132
0
        _mm256_unpackhi_epi16(cb_eve, cr_eve), m581A_p492E);
32133
0
    __m256i tmp0_gy_odd_lo = _mm256_madd_epi16(  //
32134
0
        _mm256_unpacklo_epi16(cb_odd, cr_odd), m581A_p492E);
32135
0
    __m256i tmp0_gy_odd_hi = _mm256_madd_epi16(  //
32136
0
        _mm256_unpackhi_epi16(cb_odd, cr_odd), m581A_p492E);
32137
32138
    // Divide the i32x8 vectors by (1 << 16), rounding to nearest.
32139
0
    __m256i tmp1_gy_eve_lo =
32140
0
        _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_eve_lo, p8000_p0000), 16);
32141
0
    __m256i tmp1_gy_eve_hi =
32142
0
        _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_eve_hi, p8000_p0000), 16);
32143
0
    __m256i tmp1_gy_odd_lo =
32144
0
        _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_odd_lo, p8000_p0000), 16);
32145
0
    __m256i tmp1_gy_odd_hi =
32146
0
        _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_odd_hi, p8000_p0000), 16);
32147
32148
    // Pack the ((-0x581A * Cb) + (+0x492E * Cr)) as i16x16 and subtract Cr.
32149
0
    __m256i gy_eve = _mm256_sub_epi16(
32150
0
        _mm256_packs_epi32(tmp1_gy_eve_lo, tmp1_gy_eve_hi), cr_eve);
32151
0
    __m256i gy_odd = _mm256_sub_epi16(
32152
0
        _mm256_packs_epi32(tmp1_gy_odd_lo, tmp1_gy_odd_hi), cr_odd);
32153
32154
    // ----
32155
32156
    // Add Y to (B-Y), (G-Y) and (R-Y) to produce B, G and R.
32157
    //
32158
    // For the resultant packed_x_xxx vectors, only elements 0 ..= 7 and 16 ..=
32159
    // 23 of the 32-element vectors matter (since we'll unpacklo but not
32160
    // unpackhi them). Let โ€ฆ denote 8 ignored consecutive u8 values and let %
32161
    // denote 0xFF. We'll end this section with:
32162
    //
32163
    // packed_b_eve = u8x32 [b00 b02 .. b0C b0E  โ€ฆ  b10 b12 .. b1C b1E  โ€ฆ]
32164
    // packed_b_odd = u8x32 [b01 b03 .. b0D b0F  โ€ฆ  b11 b13 .. b1D b1F  โ€ฆ]
32165
    // packed_g_eve = u8x32 [g00 g02 .. g0C g0E  โ€ฆ  g10 g12 .. g1C g1E  โ€ฆ]
32166
    // packed_g_odd = u8x32 [g01 g03 .. g0D g0F  โ€ฆ  g11 g13 .. g1D g1F  โ€ฆ]
32167
    // packed_r_eve = u8x32 [r00 r02 .. r0C r0E  โ€ฆ  r10 r12 .. r1C r1E  โ€ฆ]
32168
    // packed_r_odd = u8x32 [r01 r03 .. r0D r0F  โ€ฆ  r11 r13 .. r1D r1F  โ€ฆ]
32169
    // uFFFF        = u8x32 [  %   % ..   %   %  โ€ฆ    %   % ..   %   %  โ€ฆ]
32170
32171
0
    __m256i yy_all = _mm256_lddqu_si256((const __m256i*)(const void*)up0);
32172
0
    __m256i yy_eve = _mm256_and_si256(yy_all, u00FF);
32173
0
    __m256i yy_odd = _mm256_srli_epi16(yy_all, 8);
32174
32175
0
    __m256i loose_b_eve = _mm256_add_epi16(by_eve, yy_eve);
32176
0
    __m256i loose_b_odd = _mm256_add_epi16(by_odd, yy_odd);
32177
0
    __m256i packed_b_eve = _mm256_packus_epi16(loose_b_eve, loose_b_eve);
32178
0
    __m256i packed_b_odd = _mm256_packus_epi16(loose_b_odd, loose_b_odd);
32179
32180
0
    __m256i loose_g_eve = _mm256_add_epi16(gy_eve, yy_eve);
32181
0
    __m256i loose_g_odd = _mm256_add_epi16(gy_odd, yy_odd);
32182
0
    __m256i packed_g_eve = _mm256_packus_epi16(loose_g_eve, loose_g_eve);
32183
0
    __m256i packed_g_odd = _mm256_packus_epi16(loose_g_odd, loose_g_odd);
32184
32185
0
    __m256i loose_r_eve = _mm256_add_epi16(ry_eve, yy_eve);
32186
0
    __m256i loose_r_odd = _mm256_add_epi16(ry_odd, yy_odd);
32187
0
    __m256i packed_r_eve = _mm256_packus_epi16(loose_r_eve, loose_r_eve);
32188
0
    __m256i packed_r_odd = _mm256_packus_epi16(loose_r_odd, loose_r_odd);
32189
32190
    // ----
32191
32192
    // Mix those values (unpacking in 8, 16 and then 32 bit units) to get the
32193
    // desired BGRX/RGBX order.
32194
    //
32195
    // From here onwards, all of our __m256i registers are u8x32.
32196
32197
    // mix00 = [b00 g00 b02 g02 .. b0E g0E b10 g10 .. b1C g1C b1E g1E]
32198
    // mix01 = [b01 g01 b03 g03 .. b0F g0F b11 g11 .. b1D g1D b1F g1F]
32199
    // mix02 = [r00   % r02   % .. r0E   % r10   % .. r1C   % r1E   %]
32200
    // mix03 = [r01   % r03   % .. r0F   % r11   % .. r1D   % r1F   %]
32201
    //
32202
    // See also ยง below.
32203
0
    __m256i mix00 = _mm256_unpacklo_epi8(packed_b_eve, packed_g_eve);
32204
0
    __m256i mix01 = _mm256_unpacklo_epi8(packed_b_odd, packed_g_odd);
32205
0
    __m256i mix02 = _mm256_unpacklo_epi8(packed_r_eve, uFFFF);
32206
0
    __m256i mix03 = _mm256_unpacklo_epi8(packed_r_odd, uFFFF);
32207
32208
    // mix10 = [b00 g00 r00 %  b02 g02 r02 %  b04 g04 r04 %  b06 g06 r06 %
32209
    //          b10 g10 r10 %  b12 g12 r12 %  b14 g14 r14 %  b16 g16 r16 %]
32210
    // mix11 = [b01 g01 r01 %  b03 g03 r03 %  b05 g05 r05 %  b07 g07 r07 %
32211
    //          b11 g11 r11 %  b13 g13 r13 %  b15 g15 r15 %  b17 g17 r17 %]
32212
    // mix12 = [b08 g08 r08 %  b0A g0A r0A %  b0C g0C r0C %  b0E g0E r0E %
32213
    //          b18 g18 r18 %  b1A g1A r1A %  b1C g1C r1C %  b1E g1E r1E %]
32214
    // mix13 = [b09 g09 r09 %  b0B g0B r0B %  b0D g0D r0D %  b0F g0F r0F %
32215
    //          b19 g19 r19 %  b1B g1B r1B %  b1D g1D r1D %  b1F g1F r1F %]
32216
0
    __m256i mix10 = _mm256_unpacklo_epi16(mix00, mix02);
32217
0
    __m256i mix11 = _mm256_unpacklo_epi16(mix01, mix03);
32218
0
    __m256i mix12 = _mm256_unpackhi_epi16(mix00, mix02);
32219
0
    __m256i mix13 = _mm256_unpackhi_epi16(mix01, mix03);
32220
32221
    // mix20 = [b00 g00 r00 %  b01 g01 r01 %  b02 g02 r02 %  b03 g03 r03 %
32222
    //          b10 g10 r10 %  b11 g11 r11 %  b12 g12 r12 %  b13 g13 r13 %]
32223
    // mix21 = [b04 g04 r04 %  b05 g05 r05 %  b06 g06 r06 %  b07 g07 r07 %
32224
    //          b14 g14 r14 %  b15 g15 r15 %  b16 g16 r16 %  b17 g17 r17 %]
32225
    // mix22 = [b08 g08 r08 %  b09 g09 r09 %  b0A g0A r0A %  b0B g0B r0B %
32226
    //          b18 g18 r18 %  b19 g19 r19 %  b1A g1A r1A %  b1B g1B r1B %]
32227
    // mix23 = [b0C g0C r0C %  b0D g0D r0D %  b0E g0E r0E %  b0F g0F r0F %
32228
    //          b1C g1C r1C %  b1D g1D r1D %  b1E g1E r1E %  b1F g1F r1F %]
32229
0
    __m256i mix20 = _mm256_unpacklo_epi32(mix10, mix11);
32230
0
    __m256i mix21 = _mm256_unpackhi_epi32(mix10, mix11);
32231
0
    __m256i mix22 = _mm256_unpacklo_epi32(mix12, mix13);
32232
0
    __m256i mix23 = _mm256_unpackhi_epi32(mix12, mix13);
32233
32234
    // mix30 = [b00 g00 r00 %  b01 g01 r01 %  b02 g02 r02 %  b03 g03 r03 %
32235
    //          b04 g04 r04 %  b05 g05 r05 %  b06 g06 r06 %  b07 g07 r07 %]
32236
    // mix31 = [b08 g08 r08 %  b09 g09 r09 %  b0A g0A r0A %  b0B g0B r0B %
32237
    //          b0C g0C r0C %  b0D g0D r0D %  b0E g0E r0E %  b0F g0F r0F %]
32238
    // mix32 = [b10 g10 r10 %  b11 g11 r11 %  b12 g12 r12 %  b13 g13 r13 %
32239
    //          b14 g14 r14 %  b15 g15 r15 %  b16 g16 r16 %  b17 g17 r17 %]
32240
    // mix33 = [b18 g18 r18 %  b19 g19 r19 %  b1A g1A r1A %  b1B g1B r1B %
32241
    //          b1C g1C r1C %  b1D g1D r1D %  b1E g1E r1E %  b1F g1F r1F %]
32242
0
    __m256i mix30 = _mm256_permute2x128_si256(mix20, mix21, 0x20);
32243
0
    __m256i mix31 = _mm256_permute2x128_si256(mix22, mix23, 0x20);
32244
0
    __m256i mix32 = _mm256_permute2x128_si256(mix20, mix21, 0x31);
32245
0
    __m256i mix33 = _mm256_permute2x128_si256(mix22, mix23, 0x31);
32246
32247
    // Write out four u8x32 SIMD registers (128 bytes, 32 BGRX/RGBX pixels).
32248
0
    _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x00), mix30);
32249
0
    _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x20), mix31);
32250
0
    _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x40), mix32);
32251
0
    _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x60), mix33);
32252
32253
    // Advance by up to 32 pixels. The first iteration might be smaller than 32
32254
    // so that all of the remaining steps are exactly 32.
32255
0
    uint32_t n = 32u - (31u & (x - x_end));
32256
0
    dst_iter += 4u * n;
32257
0
    up0 += n;
32258
0
    up1 += n;
32259
0
    up2 += n;
32260
0
    x += n;
32261
0
  }
32262
0
}
32263
32264
// The rgbx flavor (below) is exactly the same as the bgrx flavor (above)
32265
// except for the lines marked with a ยง and that comments were stripped.
32266
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2")
32267
static void  //
32268
wuffs_private_impl__swizzle_ycc__convert_3_rgbx_x86_avx2(
32269
    wuffs_base__pixel_buffer* dst,
32270
    uint32_t x,
32271
    uint32_t x_end,
32272
    uint32_t y,
32273
    const uint8_t* up0,
32274
    const uint8_t* up1,
32275
0
    const uint8_t* up2) {
32276
0
  if ((x + 32u) > x_end) {
32277
0
    wuffs_private_impl__swizzle_ycc__convert_3_bgrx(  //
32278
0
        dst, x, x_end, y, up0, up1, up2);
32279
0
    return;
32280
0
  }
32281
32282
0
  size_t dst_stride = dst->private_impl.planes[0].stride;
32283
0
  uint8_t* dst_iter = dst->private_impl.planes[0].ptr +
32284
0
                      (dst_stride * ((size_t)y)) + (4u * ((size_t)x));
32285
32286
0
  const __m256i u0001 = _mm256_set1_epi16(+0x0001);
32287
0
  const __m256i u00FF = _mm256_set1_epi16(+0x00FF);
32288
0
  const __m256i uFF80 = _mm256_set1_epi16(-0x0080);
32289
0
  const __m256i uFFFF = _mm256_set1_epi16(-0x0001);
32290
32291
0
  const __m256i p8000_p0000 = _mm256_set_epi16(  //
32292
0
      +0x0000, -0x8000, +0x0000, -0x8000,        //
32293
0
      +0x0000, -0x8000, +0x0000, -0x8000,        //
32294
0
      +0x0000, -0x8000, +0x0000, -0x8000,        //
32295
0
      +0x0000, -0x8000, +0x0000, -0x8000);
32296
32297
0
  const __m256i m3A5E = _mm256_set1_epi16(-0x3A5E);
32298
0
  const __m256i p66E9 = _mm256_set1_epi16(+0x66E9);
32299
0
  const __m256i m581A_p492E = _mm256_set_epi16(  //
32300
0
      +0x492E, -0x581A, +0x492E, -0x581A,        //
32301
0
      +0x492E, -0x581A, +0x492E, -0x581A,        //
32302
0
      +0x492E, -0x581A, +0x492E, -0x581A,        //
32303
0
      +0x492E, -0x581A, +0x492E, -0x581A);
32304
32305
0
  while (x < x_end) {
32306
0
    __m256i cb_all = _mm256_lddqu_si256((const __m256i*)(const void*)up1);
32307
0
    __m256i cr_all = _mm256_lddqu_si256((const __m256i*)(const void*)up2);
32308
0
    __m256i cb_eve = _mm256_add_epi16(uFF80, _mm256_and_si256(cb_all, u00FF));
32309
0
    __m256i cr_eve = _mm256_add_epi16(uFF80, _mm256_and_si256(cr_all, u00FF));
32310
0
    __m256i cb_odd = _mm256_add_epi16(uFF80, _mm256_srli_epi16(cb_all, 8));
32311
0
    __m256i cr_odd = _mm256_add_epi16(uFF80, _mm256_srli_epi16(cr_all, 8));
32312
32313
0
    __m256i tmp_by_eve = _mm256_srai_epi16(
32314
0
        _mm256_add_epi16(
32315
0
            _mm256_mulhi_epi16(_mm256_add_epi16(cb_eve, cb_eve), m3A5E), u0001),
32316
0
        1);
32317
0
    __m256i tmp_by_odd = _mm256_srai_epi16(
32318
0
        _mm256_add_epi16(
32319
0
            _mm256_mulhi_epi16(_mm256_add_epi16(cb_odd, cb_odd), m3A5E), u0001),
32320
0
        1);
32321
0
    __m256i tmp_ry_eve = _mm256_srai_epi16(
32322
0
        _mm256_add_epi16(
32323
0
            _mm256_mulhi_epi16(_mm256_add_epi16(cr_eve, cr_eve), p66E9), u0001),
32324
0
        1);
32325
0
    __m256i tmp_ry_odd = _mm256_srai_epi16(
32326
0
        _mm256_add_epi16(
32327
0
            _mm256_mulhi_epi16(_mm256_add_epi16(cr_odd, cr_odd), p66E9), u0001),
32328
0
        1);
32329
32330
0
    __m256i by_eve =
32331
0
        _mm256_add_epi16(tmp_by_eve, _mm256_add_epi16(cb_eve, cb_eve));
32332
0
    __m256i by_odd =
32333
0
        _mm256_add_epi16(tmp_by_odd, _mm256_add_epi16(cb_odd, cb_odd));
32334
0
    __m256i ry_eve = _mm256_add_epi16(tmp_ry_eve, cr_eve);
32335
0
    __m256i ry_odd = _mm256_add_epi16(tmp_ry_odd, cr_odd);
32336
32337
0
    __m256i tmp0_gy_eve_lo = _mm256_madd_epi16(  //
32338
0
        _mm256_unpacklo_epi16(cb_eve, cr_eve), m581A_p492E);
32339
0
    __m256i tmp0_gy_eve_hi = _mm256_madd_epi16(  //
32340
0
        _mm256_unpackhi_epi16(cb_eve, cr_eve), m581A_p492E);
32341
0
    __m256i tmp0_gy_odd_lo = _mm256_madd_epi16(  //
32342
0
        _mm256_unpacklo_epi16(cb_odd, cr_odd), m581A_p492E);
32343
0
    __m256i tmp0_gy_odd_hi = _mm256_madd_epi16(  //
32344
0
        _mm256_unpackhi_epi16(cb_odd, cr_odd), m581A_p492E);
32345
32346
0
    __m256i tmp1_gy_eve_lo =
32347
0
        _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_eve_lo, p8000_p0000), 16);
32348
0
    __m256i tmp1_gy_eve_hi =
32349
0
        _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_eve_hi, p8000_p0000), 16);
32350
0
    __m256i tmp1_gy_odd_lo =
32351
0
        _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_odd_lo, p8000_p0000), 16);
32352
0
    __m256i tmp1_gy_odd_hi =
32353
0
        _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_odd_hi, p8000_p0000), 16);
32354
32355
0
    __m256i gy_eve = _mm256_sub_epi16(
32356
0
        _mm256_packs_epi32(tmp1_gy_eve_lo, tmp1_gy_eve_hi), cr_eve);
32357
0
    __m256i gy_odd = _mm256_sub_epi16(
32358
0
        _mm256_packs_epi32(tmp1_gy_odd_lo, tmp1_gy_odd_hi), cr_odd);
32359
32360
0
    __m256i yy_all = _mm256_lddqu_si256((const __m256i*)(const void*)up0);
32361
0
    __m256i yy_eve = _mm256_and_si256(yy_all, u00FF);
32362
0
    __m256i yy_odd = _mm256_srli_epi16(yy_all, 8);
32363
32364
0
    __m256i loose_b_eve = _mm256_add_epi16(by_eve, yy_eve);
32365
0
    __m256i loose_b_odd = _mm256_add_epi16(by_odd, yy_odd);
32366
0
    __m256i packed_b_eve = _mm256_packus_epi16(loose_b_eve, loose_b_eve);
32367
0
    __m256i packed_b_odd = _mm256_packus_epi16(loose_b_odd, loose_b_odd);
32368
32369
0
    __m256i loose_g_eve = _mm256_add_epi16(gy_eve, yy_eve);
32370
0
    __m256i loose_g_odd = _mm256_add_epi16(gy_odd, yy_odd);
32371
0
    __m256i packed_g_eve = _mm256_packus_epi16(loose_g_eve, loose_g_eve);
32372
0
    __m256i packed_g_odd = _mm256_packus_epi16(loose_g_odd, loose_g_odd);
32373
32374
0
    __m256i loose_r_eve = _mm256_add_epi16(ry_eve, yy_eve);
32375
0
    __m256i loose_r_odd = _mm256_add_epi16(ry_odd, yy_odd);
32376
0
    __m256i packed_r_eve = _mm256_packus_epi16(loose_r_eve, loose_r_eve);
32377
0
    __m256i packed_r_odd = _mm256_packus_epi16(loose_r_odd, loose_r_odd);
32378
32379
    // ยง Note the swapped B and R channels.
32380
0
    __m256i mix00 = _mm256_unpacklo_epi8(packed_r_eve, packed_g_eve);
32381
0
    __m256i mix01 = _mm256_unpacklo_epi8(packed_r_odd, packed_g_odd);
32382
0
    __m256i mix02 = _mm256_unpacklo_epi8(packed_b_eve, uFFFF);
32383
0
    __m256i mix03 = _mm256_unpacklo_epi8(packed_b_odd, uFFFF);
32384
32385
0
    __m256i mix10 = _mm256_unpacklo_epi16(mix00, mix02);
32386
0
    __m256i mix11 = _mm256_unpacklo_epi16(mix01, mix03);
32387
0
    __m256i mix12 = _mm256_unpackhi_epi16(mix00, mix02);
32388
0
    __m256i mix13 = _mm256_unpackhi_epi16(mix01, mix03);
32389
32390
0
    __m256i mix20 = _mm256_unpacklo_epi32(mix10, mix11);
32391
0
    __m256i mix21 = _mm256_unpackhi_epi32(mix10, mix11);
32392
0
    __m256i mix22 = _mm256_unpacklo_epi32(mix12, mix13);
32393
0
    __m256i mix23 = _mm256_unpackhi_epi32(mix12, mix13);
32394
32395
0
    __m256i mix30 = _mm256_permute2x128_si256(mix20, mix21, 0x20);
32396
0
    __m256i mix31 = _mm256_permute2x128_si256(mix22, mix23, 0x20);
32397
0
    __m256i mix32 = _mm256_permute2x128_si256(mix20, mix21, 0x31);
32398
0
    __m256i mix33 = _mm256_permute2x128_si256(mix22, mix23, 0x31);
32399
32400
0
    _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x00), mix30);
32401
0
    _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x20), mix31);
32402
0
    _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x40), mix32);
32403
0
    _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x60), mix33);
32404
32405
0
    uint32_t n = 32u - (31u & (x - x_end));
32406
0
    dst_iter += 4u * n;
32407
0
    up0 += n;
32408
0
    up1 += n;
32409
0
    up2 += n;
32410
0
    x += n;
32411
0
  }
32412
0
}
32413
32414
#if defined(__GNUC__) && !defined(__clang__)
32415
// No-op.
32416
#else
32417
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2")
32418
static const uint8_t*  //
32419
wuffs_private_impl__swizzle_ycc__upsample_inv_h2v2_triangle_x86_avx2(
32420
    uint8_t* dst_ptr,
32421
    const uint8_t* src_ptr_major,
32422
    const uint8_t* src_ptr_minor,
32423
    size_t src_len,
32424
    uint32_t h1v2_bias_ignored,
32425
    bool first_column,
32426
0
    bool last_column) {
32427
0
  uint8_t* dp = dst_ptr;
32428
0
  const uint8_t* sp_major = src_ptr_major;
32429
0
  const uint8_t* sp_minor = src_ptr_minor;
32430
32431
0
  if (first_column) {
32432
0
    src_len--;
32433
0
    if ((src_len <= 0u) && last_column) {
32434
0
      uint32_t sv = (12u * ((uint32_t)(*sp_major++))) +  //
32435
0
                    (4u * ((uint32_t)(*sp_minor++)));
32436
0
      *dp++ = (uint8_t)((sv + 8u) >> 4u);
32437
0
      *dp++ = (uint8_t)((sv + 7u) >> 4u);
32438
0
      return dst_ptr;
32439
0
    }
32440
32441
0
    uint32_t sv_major_m1 = sp_major[-0];  // Clamp offset to zero.
32442
0
    uint32_t sv_minor_m1 = sp_minor[-0];  // Clamp offset to zero.
32443
0
    uint32_t sv_major_p1 = sp_major[+1];
32444
0
    uint32_t sv_minor_p1 = sp_minor[+1];
32445
32446
0
    uint32_t sv = (9u * ((uint32_t)(*sp_major++))) +  //
32447
0
                  (3u * ((uint32_t)(*sp_minor++)));
32448
0
    *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u);
32449
0
    *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u);
32450
0
    if (src_len <= 0u) {
32451
0
      return dst_ptr;
32452
0
    }
32453
0
  }
32454
32455
0
  if (last_column) {
32456
0
    src_len--;
32457
0
  }
32458
32459
0
  if (src_len < 32) {
32460
    // This fallback is the same as the non-SIMD-capable code path.
32461
0
    for (; src_len > 0u; src_len--) {
32462
0
      uint32_t sv_major_m1 = sp_major[-1];
32463
0
      uint32_t sv_minor_m1 = sp_minor[-1];
32464
0
      uint32_t sv_major_p1 = sp_major[+1];
32465
0
      uint32_t sv_minor_p1 = sp_minor[+1];
32466
32467
0
      uint32_t sv = (9u * ((uint32_t)(*sp_major++))) +  //
32468
0
                    (3u * ((uint32_t)(*sp_minor++)));
32469
0
      *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u);
32470
0
      *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u);
32471
0
    }
32472
32473
0
  } else {
32474
0
    while (src_len > 0u) {
32475
      // Load 1+32+1 samples (six u8x32 vectors) from the major (jxx) and minor
32476
      // (nxx) rows.
32477
      //
32478
      // major_p0 = [j00 j01 j02 j03 .. j28 j29 j30 j31]   // p0 = "plus  0"
32479
      // minor_p0 = [n00 n01 n02 n03 .. n28 n29 n30 n31]   // p0 = "plus  0"
32480
      // major_m1 = [jm1 j00 j01 j02 .. j27 j28 j29 j30]   // m1 = "minus 1"
32481
      // minor_m1 = [nm1 n00 n01 n02 .. n27 n28 n29 n30]   // m1 = "minus 1"
32482
      // major_p1 = [j01 j02 j03 j04 .. j29 j30 j31 j32]   // p1 = "plus  1"
32483
      // minor_p1 = [n01 n02 n03 n04 .. n29 n30 n31 n32]   // p1 = "plus  1"
32484
0
      __m256i major_p0 =
32485
0
          _mm256_lddqu_si256((const __m256i*)(const void*)(sp_major + 0));
32486
0
      __m256i minor_p0 =
32487
0
          _mm256_lddqu_si256((const __m256i*)(const void*)(sp_minor + 0));
32488
0
      __m256i major_m1 =
32489
0
          _mm256_lddqu_si256((const __m256i*)(const void*)(sp_major - 1));
32490
0
      __m256i minor_m1 =
32491
0
          _mm256_lddqu_si256((const __m256i*)(const void*)(sp_minor - 1));
32492
0
      __m256i major_p1 =
32493
0
          _mm256_lddqu_si256((const __m256i*)(const void*)(sp_major + 1));
32494
0
      __m256i minor_p1 =
32495
0
          _mm256_lddqu_si256((const __m256i*)(const void*)(sp_minor + 1));
32496
32497
      // Unpack, staying with u8x32 vectors.
32498
      //
32499
      // step1_p0_lo = [j00 n00 j01 n01 .. j07 n07  j16 n16 j17 n17 .. j23 n23]
32500
      // step1_p0_hi = [j08 n08 j09 n09 .. j15 n15  j24 n24 j25 n25 .. j31 n31]
32501
      // step1_m1_lo = [jm1 nm1 j00 n00 .. j06 n06  j15 n15 j16 n16 .. j22 n22]
32502
      // step1_m1_hi = [j07 n07 j08 n08 .. j14 n14  j23 n23 j24 n24 .. j30 n30]
32503
      // step1_p1_lo = [j01 n01 j02 n02 .. j08 n08  j17 n17 j18 n18 .. j24 n24]
32504
      // step1_p1_hi = [j09 n09 j10 n10 .. j16 n16  j25 n25 j26 n26 .. j32 n32]
32505
0
      __m256i step1_p0_lo = _mm256_unpacklo_epi8(major_p0, minor_p0);
32506
0
      __m256i step1_p0_hi = _mm256_unpackhi_epi8(major_p0, minor_p0);
32507
0
      __m256i step1_m1_lo = _mm256_unpacklo_epi8(major_m1, minor_m1);
32508
0
      __m256i step1_m1_hi = _mm256_unpackhi_epi8(major_m1, minor_m1);
32509
0
      __m256i step1_p1_lo = _mm256_unpacklo_epi8(major_p1, minor_p1);
32510
0
      __m256i step1_p1_hi = _mm256_unpackhi_epi8(major_p1, minor_p1);
32511
32512
      // Multiply-add to get u16x16 vectors.
32513
      //
32514
      // step2_p0_lo = [9*j00+3*n00 9*j01+3*n01 .. 9*j23+3*n23]
32515
      // step2_p0_hi = [9*j08+3*n08 9*j09+3*n09 .. 9*j31+3*n31]
32516
      // step2_m1_lo = [3*jm1+1*nm1 3*j00+1*n00 .. 3*j22+1*n22]
32517
      // step2_m1_hi = [3*j07+1*n07 3*j08+1*n08 .. 3*j30+1*n30]
32518
      // step2_p1_lo = [3*j01+1*n01 3*j02+1*n02 .. 3*j24+1*n24]
32519
      // step2_p1_hi = [3*j09+1*n09 3*j10+1*n10 .. 3*j32+1*n32]
32520
0
      const __m256i k0309 = _mm256_set1_epi16(0x0309);
32521
0
      const __m256i k0103 = _mm256_set1_epi16(0x0103);
32522
0
      __m256i step2_p0_lo = _mm256_maddubs_epi16(step1_p0_lo, k0309);
32523
0
      __m256i step2_p0_hi = _mm256_maddubs_epi16(step1_p0_hi, k0309);
32524
0
      __m256i step2_m1_lo = _mm256_maddubs_epi16(step1_m1_lo, k0103);
32525
0
      __m256i step2_m1_hi = _mm256_maddubs_epi16(step1_m1_hi, k0103);
32526
0
      __m256i step2_p1_lo = _mm256_maddubs_epi16(step1_p1_lo, k0103);
32527
0
      __m256i step2_p1_hi = _mm256_maddubs_epi16(step1_p1_hi, k0103);
32528
32529
      // Compute the weighted sums of (p0, m1) and (p0, p1). For example:
32530
      //
32531
      // step3_m1_lo[00] = ((9*j00) + (3*n00) + (3*jm1) + (1*nm1)) as u16
32532
      // step3_p1_hi[15] = ((9*j31) + (3*n31) + (3*j32) + (1*n32)) as u16
32533
0
      __m256i step3_m1_lo = _mm256_add_epi16(step2_p0_lo, step2_m1_lo);
32534
0
      __m256i step3_m1_hi = _mm256_add_epi16(step2_p0_hi, step2_m1_hi);
32535
0
      __m256i step3_p1_lo = _mm256_add_epi16(step2_p0_lo, step2_p1_lo);
32536
0
      __m256i step3_p1_hi = _mm256_add_epi16(step2_p0_hi, step2_p1_hi);
32537
32538
      // Bias by 8 (on the left) or 7 (on the right) and then divide by 16
32539
      // (which is 9+3+3+1) to get a weighted average. On the left (m1), shift
32540
      // the u16 right value by 4. On the right (p1), shift right by 4 and then
32541
      // shift left by 8 so that, when still in the u16x16 little-endian
32542
      // interpretation, we have:
32543
      //  - m1_element =  (etcetera + 8) >> 4
32544
      //  - p1_element = ((etcetera + 7) >> 4) << 8
32545
      //
32546
      // step4_m1_lo = [0x00?? 0x00?? ... 0x00?? 0x00??]
32547
      // step4_p1_lo = [0x??00 0x??00 ... 0x??00 0x??00]
32548
      // step4_m1_hi = [0x00?? 0x00?? ... 0x00?? 0x00??]
32549
      // step4_p1_hi = [0x??00 0x??00 ... 0x??00 0x??00]
32550
0
      __m256i step4_m1_lo = _mm256_srli_epi16(
32551
0
          _mm256_add_epi16(step3_m1_lo, _mm256_set1_epi16(8)), 4);
32552
0
      __m256i step4_p1_lo = _mm256_slli_epi16(
32553
0
          _mm256_srli_epi16(_mm256_add_epi16(step3_p1_lo, _mm256_set1_epi16(7)),
32554
0
                            4),
32555
0
          8);
32556
0
      __m256i step4_m1_hi = _mm256_srli_epi16(
32557
0
          _mm256_add_epi16(step3_m1_hi, _mm256_set1_epi16(8)), 4);
32558
0
      __m256i step4_p1_hi = _mm256_slli_epi16(
32559
0
          _mm256_srli_epi16(_mm256_add_epi16(step3_p1_hi, _mm256_set1_epi16(7)),
32560
0
                            4),
32561
0
          8);
32562
32563
      // Bitwise-or two "0x00"-rich u16x16 vectors to get a u8x32 vector. Do
32564
      // that twice. Once for the low columns and once for the high columns.
32565
      //
32566
      // In terms of jxx (major row) or nxx (minor row) source samples:
32567
      //  - low  columns means ( 0 ..  8; 16 .. 24).
32568
      //  - high columns means ( 8 .. 16; 24 .. 32).
32569
      //
32570
      // In terms of dxx destination samples (there are twice as many):
32571
      //  - low  columns means ( 0 .. 16; 32 .. 48).
32572
      //  - high columns means (16 .. 32; 48 .. 64).
32573
      //
32574
      // step5_lo = [d00 d01 .. d14 d15  d32 d33 .. d46 d47]
32575
      // step5_hi = [d16 d17 .. d30 d31  d48 d49 .. d62 d63]
32576
      //
32577
      // The d00, d02 ... d62 even elements come from (p0, m1) weighted sums.
32578
      // The d01, d03 ... d63 odd  elements come from (p0, p1) weighted sums.
32579
0
      __m256i step5_lo = _mm256_or_si256(step4_m1_lo, step4_p1_lo);
32580
0
      __m256i step5_hi = _mm256_or_si256(step4_m1_hi, step4_p1_hi);
32581
32582
      // Permute and store.
32583
      //
32584
      // step6_00_31 = [d00 d01 .. d14 d15  d16 d17 .. d30 d31]
32585
      // step6_32_63 = [d32 d33 .. d46 d47  d48 d49 .. d62 d63]
32586
0
      __m256i step6_00_31 = _mm256_permute2x128_si256(step5_lo, step5_hi, 0x20);
32587
0
      __m256i step6_32_63 = _mm256_permute2x128_si256(step5_lo, step5_hi, 0x31);
32588
0
      _mm256_storeu_si256((__m256i*)(void*)(dp + 0x00), step6_00_31);
32589
0
      _mm256_storeu_si256((__m256i*)(void*)(dp + 0x20), step6_32_63);
32590
32591
      // Advance by up to 32 source samples (64 destination samples). The first
32592
      // iteration might be smaller than 32 so that all of the remaining steps
32593
      // are exactly 32.
32594
0
      size_t n = 32u - (31u & (0u - src_len));
32595
0
      dp += 2u * n;
32596
0
      sp_major += n;
32597
0
      sp_minor += n;
32598
0
      src_len -= n;
32599
0
    }
32600
0
  }
32601
32602
0
  if (last_column) {
32603
0
    uint32_t sv_major_m1 = sp_major[-1];
32604
0
    uint32_t sv_minor_m1 = sp_minor[-1];
32605
0
    uint32_t sv_major_p1 = sp_major[+0];  // Clamp offset to zero.
32606
0
    uint32_t sv_minor_p1 = sp_minor[+0];  // Clamp offset to zero.
32607
32608
0
    uint32_t sv = (9u * ((uint32_t)(*sp_major++))) +  //
32609
0
                  (3u * ((uint32_t)(*sp_minor++)));
32610
0
    *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u);
32611
0
    *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u);
32612
0
  }
32613
32614
0
  return dst_ptr;
32615
0
}
32616
#endif
32617
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
32618
// โ€ผ WUFFS MULTI-FILE SECTION -x86_avx2
32619
32620
#endif  // !defined(WUFFS_CONFIG__MODULES) ||
32621
        // defined(WUFFS_CONFIG__MODULE__BASE) ||
32622
        // defined(WUFFS_CONFIG__MODULE__BASE__PIXCONV)
32623
32624
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \
32625
    defined(WUFFS_CONFIG__MODULE__BASE__UTF8)
32626
32627
// ---------------- Unicode and UTF-8
32628
32629
WUFFS_BASE__MAYBE_STATIC size_t  //
32630
0
wuffs_base__utf_8__encode(wuffs_base__slice_u8 dst, uint32_t code_point) {
32631
0
  if (code_point <= 0x7F) {
32632
0
    if (dst.len >= 1) {
32633
0
      dst.ptr[0] = (uint8_t)(code_point);
32634
0
      return 1;
32635
0
    }
32636
32637
0
  } else if (code_point <= 0x07FF) {
32638
0
    if (dst.len >= 2) {
32639
0
      dst.ptr[0] = (uint8_t)(0xC0 | ((code_point >> 6)));
32640
0
      dst.ptr[1] = (uint8_t)(0x80 | ((code_point >> 0) & 0x3F));
32641
0
      return 2;
32642
0
    }
32643
32644
0
  } else if (code_point <= 0xFFFF) {
32645
0
    if ((dst.len >= 3) && ((code_point < 0xD800) || (0xDFFF < code_point))) {
32646
0
      dst.ptr[0] = (uint8_t)(0xE0 | ((code_point >> 12)));
32647
0
      dst.ptr[1] = (uint8_t)(0x80 | ((code_point >> 6) & 0x3F));
32648
0
      dst.ptr[2] = (uint8_t)(0x80 | ((code_point >> 0) & 0x3F));
32649
0
      return 3;
32650
0
    }
32651
32652
0
  } else if (code_point <= 0x10FFFF) {
32653
0
    if (dst.len >= 4) {
32654
0
      dst.ptr[0] = (uint8_t)(0xF0 | ((code_point >> 18)));
32655
0
      dst.ptr[1] = (uint8_t)(0x80 | ((code_point >> 12) & 0x3F));
32656
0
      dst.ptr[2] = (uint8_t)(0x80 | ((code_point >> 6) & 0x3F));
32657
0
      dst.ptr[3] = (uint8_t)(0x80 | ((code_point >> 0) & 0x3F));
32658
0
      return 4;
32659
0
    }
32660
0
  }
32661
32662
0
  return 0;
32663
0
}
32664
32665
// wuffs_base__utf_8__byte_length_minus_1 is the byte length (minus 1) of a
32666
// UTF-8 encoded code point, based on the encoding's initial byte.
32667
//  - 0x00 is 1-byte UTF-8 (ASCII).
32668
//  - 0x01 is the start of 2-byte UTF-8.
32669
//  - 0x02 is the start of 3-byte UTF-8.
32670
//  - 0x03 is the start of 4-byte UTF-8.
32671
//  - 0x40 is a UTF-8 tail byte.
32672
//  - 0x80 is invalid UTF-8.
32673
//
32674
// RFC 3629 (UTF-8) gives this grammar for valid UTF-8:
32675
//    UTF8-1      = %x00-7F
32676
//    UTF8-2      = %xC2-DF UTF8-tail
32677
//    UTF8-3      = %xE0 %xA0-BF UTF8-tail / %xE1-EC 2( UTF8-tail ) /
32678
//                  %xED %x80-9F UTF8-tail / %xEE-EF 2( UTF8-tail )
32679
//    UTF8-4      = %xF0 %x90-BF 2( UTF8-tail ) / %xF1-F3 3( UTF8-tail ) /
32680
//                  %xF4 %x80-8F 2( UTF8-tail )
32681
//    UTF8-tail   = %x80-BF
32682
static const uint8_t wuffs_base__utf_8__byte_length_minus_1[256] = {
32683
    // 0     1     2     3     4     5     6     7
32684
    // 8     9     A     B     C     D     E     F
32685
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x00 ..= 0x07.
32686
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x08 ..= 0x0F.
32687
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x10 ..= 0x17.
32688
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x18 ..= 0x1F.
32689
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x20 ..= 0x27.
32690
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x28 ..= 0x2F.
32691
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x30 ..= 0x37.
32692
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x38 ..= 0x3F.
32693
32694
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x40 ..= 0x47.
32695
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x48 ..= 0x4F.
32696
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x50 ..= 0x57.
32697
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x58 ..= 0x5F.
32698
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x60 ..= 0x67.
32699
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x68 ..= 0x6F.
32700
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x70 ..= 0x77.
32701
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x78 ..= 0x7F.
32702
32703
    0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,  // 0x80 ..= 0x87.
32704
    0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,  // 0x88 ..= 0x8F.
32705
    0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,  // 0x90 ..= 0x97.
32706
    0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,  // 0x98 ..= 0x9F.
32707
    0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,  // 0xA0 ..= 0xA7.
32708
    0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,  // 0xA8 ..= 0xAF.
32709
    0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,  // 0xB0 ..= 0xB7.
32710
    0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,  // 0xB8 ..= 0xBF.
32711
32712
    0x80, 0x80, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,  // 0xC0 ..= 0xC7.
32713
    0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,  // 0xC8 ..= 0xCF.
32714
    0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,  // 0xD0 ..= 0xD7.
32715
    0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,  // 0xD8 ..= 0xDF.
32716
    0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,  // 0xE0 ..= 0xE7.
32717
    0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,  // 0xE8 ..= 0xEF.
32718
    0x03, 0x03, 0x03, 0x03, 0x03, 0x80, 0x80, 0x80,  // 0xF0 ..= 0xF7.
32719
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xF8 ..= 0xFF.
32720
    // 0     1     2     3     4     5     6     7
32721
    // 8     9     A     B     C     D     E     F
32722
};
32723
32724
WUFFS_BASE__MAYBE_STATIC wuffs_base__utf_8__next__output  //
32725
0
wuffs_base__utf_8__next(const uint8_t* s_ptr, size_t s_len) {
32726
0
  if (s_len == 0) {
32727
0
    return wuffs_base__make_utf_8__next__output(0, 0);
32728
0
  }
32729
0
  uint32_t c = s_ptr[0];
32730
0
  switch (wuffs_base__utf_8__byte_length_minus_1[c & 0xFF]) {
32731
0
    case 0:
32732
0
      return wuffs_base__make_utf_8__next__output(c, 1);
32733
32734
0
    case 1:
32735
0
      if (s_len < 2) {
32736
0
        break;
32737
0
      }
32738
0
      c = wuffs_base__peek_u16le__no_bounds_check(s_ptr);
32739
0
      if ((c & 0xC000) != 0x8000) {
32740
0
        break;
32741
0
      }
32742
0
      c = (0x0007C0 & (c << 6)) | (0x00003F & (c >> 8));
32743
0
      return wuffs_base__make_utf_8__next__output(c, 2);
32744
32745
0
    case 2:
32746
0
      if (s_len < 3) {
32747
0
        break;
32748
0
      }
32749
0
      c = wuffs_base__peek_u24le__no_bounds_check(s_ptr);
32750
0
      if ((c & 0xC0C000) != 0x808000) {
32751
0
        break;
32752
0
      }
32753
0
      c = (0x00F000 & (c << 12)) | (0x000FC0 & (c >> 2)) |
32754
0
          (0x00003F & (c >> 16));
32755
0
      if ((c <= 0x07FF) || ((0xD800 <= c) && (c <= 0xDFFF))) {
32756
0
        break;
32757
0
      }
32758
0
      return wuffs_base__make_utf_8__next__output(c, 3);
32759
32760
0
    case 3:
32761
0
      if (s_len < 4) {
32762
0
        break;
32763
0
      }
32764
0
      c = wuffs_base__peek_u32le__no_bounds_check(s_ptr);
32765
0
      if ((c & 0xC0C0C000) != 0x80808000) {
32766
0
        break;
32767
0
      }
32768
0
      c = (0x1C0000 & (c << 18)) | (0x03F000 & (c << 4)) |
32769
0
          (0x000FC0 & (c >> 10)) | (0x00003F & (c >> 24));
32770
0
      if ((c <= 0xFFFF) || (0x110000 <= c)) {
32771
0
        break;
32772
0
      }
32773
0
      return wuffs_base__make_utf_8__next__output(c, 4);
32774
0
  }
32775
32776
0
  return wuffs_base__make_utf_8__next__output(
32777
0
      WUFFS_BASE__UNICODE_REPLACEMENT_CHARACTER, 1);
32778
0
}
32779
32780
WUFFS_BASE__MAYBE_STATIC wuffs_base__utf_8__next__output  //
32781
0
wuffs_base__utf_8__next_from_end(const uint8_t* s_ptr, size_t s_len) {
32782
0
  if (s_len == 0) {
32783
0
    return wuffs_base__make_utf_8__next__output(0, 0);
32784
0
  }
32785
0
  const uint8_t* ptr = &s_ptr[s_len - 1];
32786
0
  if (*ptr < 0x80) {
32787
0
    return wuffs_base__make_utf_8__next__output(*ptr, 1);
32788
32789
0
  } else if (*ptr < 0xC0) {
32790
0
    const uint8_t* too_far = &s_ptr[(s_len > 4) ? (s_len - 4) : 0];
32791
0
    uint32_t n = 1;
32792
0
    while (ptr != too_far) {
32793
0
      ptr--;
32794
0
      n++;
32795
0
      if (*ptr < 0x80) {
32796
0
        break;
32797
0
      } else if (*ptr < 0xC0) {
32798
0
        continue;
32799
0
      }
32800
0
      wuffs_base__utf_8__next__output o = wuffs_base__utf_8__next(ptr, n);
32801
0
      if (o.byte_length != n) {
32802
0
        break;
32803
0
      }
32804
0
      return o;
32805
0
    }
32806
0
  }
32807
32808
0
  return wuffs_base__make_utf_8__next__output(
32809
0
      WUFFS_BASE__UNICODE_REPLACEMENT_CHARACTER, 1);
32810
0
}
32811
32812
WUFFS_BASE__MAYBE_STATIC size_t  //
32813
0
wuffs_base__utf_8__longest_valid_prefix(const uint8_t* s_ptr, size_t s_len) {
32814
  // TODO: possibly optimize the all-ASCII case (4 or 8 bytes at a time).
32815
  //
32816
  // TODO: possibly optimize this by manually inlining the
32817
  // wuffs_base__utf_8__next calls.
32818
0
  size_t original_len = s_len;
32819
0
  while (s_len > 0) {
32820
0
    wuffs_base__utf_8__next__output o = wuffs_base__utf_8__next(s_ptr, s_len);
32821
0
    if ((o.code_point > 0x7F) && (o.byte_length == 1)) {
32822
0
      break;
32823
0
    }
32824
0
    s_ptr += o.byte_length;
32825
0
    s_len -= o.byte_length;
32826
0
  }
32827
0
  return original_len - s_len;
32828
0
}
32829
32830
WUFFS_BASE__MAYBE_STATIC size_t  //
32831
0
wuffs_base__ascii__longest_valid_prefix(const uint8_t* s_ptr, size_t s_len) {
32832
  // TODO: possibly optimize this by checking 4 or 8 bytes at a time.
32833
0
  const uint8_t* original_ptr = s_ptr;
32834
0
  const uint8_t* p = s_ptr;
32835
0
  const uint8_t* q = s_ptr + s_len;
32836
0
  for (; (p != q) && ((*p & 0x80) == 0); p++) {
32837
0
  }
32838
0
  return (size_t)(p - original_ptr);
32839
0
}
32840
32841
#endif  // !defined(WUFFS_CONFIG__MODULES) ||
32842
        // defined(WUFFS_CONFIG__MODULE__BASE) ||
32843
        // defined(WUFFS_CONFIG__MODULE__BASE__UTF8)
32844
32845
#ifdef __cplusplus
32846
}  // extern "C"
32847
#endif
32848
32849
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ADLER32)
32850
32851
// ---------------- Status Codes Implementations
32852
32853
// ---------------- Private Consts
32854
32855
// ---------------- Private Initializer Prototypes
32856
32857
// ---------------- Private Function Prototypes
32858
32859
WUFFS_BASE__GENERATED_C_CODE
32860
static wuffs_base__empty_struct
32861
wuffs_adler32__hasher__up(
32862
    wuffs_adler32__hasher* self,
32863
    wuffs_base__slice_u8 a_x);
32864
32865
WUFFS_BASE__GENERATED_C_CODE
32866
static wuffs_base__empty_struct
32867
wuffs_adler32__hasher__up__choosy_default(
32868
    wuffs_adler32__hasher* self,
32869
    wuffs_base__slice_u8 a_x);
32870
32871
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
32872
WUFFS_BASE__GENERATED_C_CODE
32873
static wuffs_base__empty_struct
32874
wuffs_adler32__hasher__up_arm_neon(
32875
    wuffs_adler32__hasher* self,
32876
    wuffs_base__slice_u8 a_x);
32877
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
32878
32879
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
32880
WUFFS_BASE__GENERATED_C_CODE
32881
static wuffs_base__empty_struct
32882
wuffs_adler32__hasher__up_x86_sse42(
32883
    wuffs_adler32__hasher* self,
32884
    wuffs_base__slice_u8 a_x);
32885
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
32886
32887
// ---------------- VTables
32888
32889
const wuffs_base__hasher_u32__func_ptrs
32890
wuffs_adler32__hasher__func_ptrs_for__wuffs_base__hasher_u32 = {
32891
  (uint32_t(*)(const void*))(&wuffs_adler32__hasher__checksum_u32),
32892
  (uint64_t(*)(const void*,
32893
      uint32_t))(&wuffs_adler32__hasher__get_quirk),
32894
  (wuffs_base__status(*)(void*,
32895
      uint32_t,
32896
      uint64_t))(&wuffs_adler32__hasher__set_quirk),
32897
  (wuffs_base__empty_struct(*)(void*,
32898
      wuffs_base__slice_u8))(&wuffs_adler32__hasher__update),
32899
  (uint32_t(*)(void*,
32900
      wuffs_base__slice_u8))(&wuffs_adler32__hasher__update_u32),
32901
};
32902
32903
// ---------------- Initializer Implementations
32904
32905
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
32906
wuffs_adler32__hasher__initialize(
32907
    wuffs_adler32__hasher* self,
32908
    size_t sizeof_star_self,
32909
    uint64_t wuffs_version,
32910
15.9k
    uint32_t options){
32911
15.9k
  if (!self) {
32912
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
32913
0
  }
32914
15.9k
  if (sizeof(*self) != sizeof_star_self) {
32915
0
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
32916
0
  }
32917
15.9k
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
32918
15.9k
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
32919
0
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
32920
0
  }
32921
32922
15.9k
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
32923
    // The whole point of this if-check is to detect an uninitialized *self.
32924
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
32925
#if !defined(__clang__) && defined(__GNUC__)
32926
#pragma GCC diagnostic push
32927
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
32928
#endif
32929
5.79k
    if (self->private_impl.magic != 0) {
32930
0
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
32931
0
    }
32932
#if !defined(__clang__) && defined(__GNUC__)
32933
#pragma GCC diagnostic pop
32934
#endif
32935
10.1k
  } else {
32936
10.1k
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
32937
0
      memset(self, 0, sizeof(*self));
32938
0
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
32939
10.1k
    } else {
32940
10.1k
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
32941
10.1k
    }
32942
10.1k
  }
32943
32944
15.9k
  self->private_impl.choosy_up = &wuffs_adler32__hasher__up__choosy_default;
32945
32946
15.9k
  self->private_impl.magic = WUFFS_BASE__MAGIC;
32947
15.9k
  self->private_impl.vtable_for__wuffs_base__hasher_u32.vtable_name =
32948
15.9k
      wuffs_base__hasher_u32__vtable_name;
32949
15.9k
  self->private_impl.vtable_for__wuffs_base__hasher_u32.function_pointers =
32950
15.9k
      (const void*)(&wuffs_adler32__hasher__func_ptrs_for__wuffs_base__hasher_u32);
32951
15.9k
  return wuffs_base__make_status(NULL);
32952
15.9k
}
32953
32954
wuffs_adler32__hasher*
32955
0
wuffs_adler32__hasher__alloc(void) {
32956
0
  wuffs_adler32__hasher* x =
32957
0
      (wuffs_adler32__hasher*)(calloc(1, sizeof(wuffs_adler32__hasher)));
32958
0
  if (!x) {
32959
0
    return NULL;
32960
0
  }
32961
0
  if (wuffs_adler32__hasher__initialize(
32962
0
      x, sizeof(wuffs_adler32__hasher), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
32963
0
    free(x);
32964
0
    return NULL;
32965
0
  }
32966
0
  return x;
32967
0
}
32968
32969
size_t
32970
0
sizeof__wuffs_adler32__hasher(void) {
32971
0
  return sizeof(wuffs_adler32__hasher);
32972
0
}
32973
32974
// ---------------- Function Implementations
32975
32976
// -------- func adler32.hasher.get_quirk
32977
32978
WUFFS_BASE__GENERATED_C_CODE
32979
WUFFS_BASE__MAYBE_STATIC uint64_t
32980
wuffs_adler32__hasher__get_quirk(
32981
    const wuffs_adler32__hasher* self,
32982
0
    uint32_t a_key) {
32983
0
  if (!self) {
32984
0
    return 0;
32985
0
  }
32986
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
32987
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
32988
0
    return 0;
32989
0
  }
32990
32991
0
  return 0u;
32992
0
}
32993
32994
// -------- func adler32.hasher.set_quirk
32995
32996
WUFFS_BASE__GENERATED_C_CODE
32997
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
32998
wuffs_adler32__hasher__set_quirk(
32999
    wuffs_adler32__hasher* self,
33000
    uint32_t a_key,
33001
0
    uint64_t a_value) {
33002
0
  if (!self) {
33003
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
33004
0
  }
33005
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
33006
0
    return wuffs_base__make_status(
33007
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
33008
0
        ? wuffs_base__error__disabled_by_previous_error
33009
0
        : wuffs_base__error__initialize_not_called);
33010
0
  }
33011
33012
0
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
33013
0
}
33014
33015
// -------- func adler32.hasher.update
33016
33017
WUFFS_BASE__GENERATED_C_CODE
33018
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
33019
wuffs_adler32__hasher__update(
33020
    wuffs_adler32__hasher* self,
33021
19.1k
    wuffs_base__slice_u8 a_x) {
33022
19.1k
  if (!self) {
33023
0
    return wuffs_base__make_empty_struct();
33024
0
  }
33025
19.1k
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
33026
0
    return wuffs_base__make_empty_struct();
33027
0
  }
33028
33029
19.1k
  if ( ! self->private_impl.f_started) {
33030
5.56k
    self->private_impl.f_started = true;
33031
5.56k
    self->private_impl.f_state = 1u;
33032
5.56k
    self->private_impl.choosy_up = (
33033
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
33034
        wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_adler32__hasher__up_arm_neon :
33035
#endif
33036
5.56k
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
33037
5.56k
        wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_adler32__hasher__up_x86_sse42 :
33038
5.56k
#endif
33039
5.56k
        self->private_impl.choosy_up);
33040
5.56k
  }
33041
19.1k
  wuffs_adler32__hasher__up(self, a_x);
33042
19.1k
  return wuffs_base__make_empty_struct();
33043
19.1k
}
33044
33045
// -------- func adler32.hasher.update_u32
33046
33047
WUFFS_BASE__GENERATED_C_CODE
33048
WUFFS_BASE__MAYBE_STATIC uint32_t
33049
wuffs_adler32__hasher__update_u32(
33050
    wuffs_adler32__hasher* self,
33051
19.1k
    wuffs_base__slice_u8 a_x) {
33052
19.1k
  if (!self) {
33053
0
    return 0;
33054
0
  }
33055
19.1k
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
33056
0
    return 0;
33057
0
  }
33058
33059
19.1k
  wuffs_adler32__hasher__update(self, a_x);
33060
19.1k
  return self->private_impl.f_state;
33061
19.1k
}
33062
33063
// -------- func adler32.hasher.up
33064
33065
WUFFS_BASE__GENERATED_C_CODE
33066
static wuffs_base__empty_struct
33067
wuffs_adler32__hasher__up(
33068
    wuffs_adler32__hasher* self,
33069
19.1k
    wuffs_base__slice_u8 a_x) {
33070
19.1k
  return (*self->private_impl.choosy_up)(self, a_x);
33071
19.1k
}
33072
33073
WUFFS_BASE__GENERATED_C_CODE
33074
static wuffs_base__empty_struct
33075
wuffs_adler32__hasher__up__choosy_default(
33076
    wuffs_adler32__hasher* self,
33077
0
    wuffs_base__slice_u8 a_x) {
33078
0
  uint32_t v_s1 = 0;
33079
0
  uint32_t v_s2 = 0;
33080
0
  wuffs_base__slice_u8 v_remaining = {0};
33081
0
  wuffs_base__slice_u8 v_p = {0};
33082
33083
0
  v_s1 = ((self->private_impl.f_state) & 0xFFFFu);
33084
0
  v_s2 = ((self->private_impl.f_state) >> (32u - 16u));
33085
0
  while (((uint64_t)(a_x.len)) > 0u) {
33086
0
    v_remaining = wuffs_base__slice_u8__subslice_j(a_x, 0u);
33087
0
    if (((uint64_t)(a_x.len)) > 5552u) {
33088
0
      v_remaining = wuffs_base__slice_u8__subslice_i(a_x, 5552u);
33089
0
      a_x = wuffs_base__slice_u8__subslice_j(a_x, 5552u);
33090
0
    }
33091
0
    {
33092
0
      wuffs_base__slice_u8 i_slice_p = a_x;
33093
0
      v_p.ptr = i_slice_p.ptr;
33094
0
      v_p.len = 1;
33095
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));
33096
0
      while (v_p.ptr < i_end0_p) {
33097
0
        v_s1 += ((uint32_t)(v_p.ptr[0u]));
33098
0
        v_s2 += v_s1;
33099
0
        v_p.ptr += 1;
33100
0
        v_s1 += ((uint32_t)(v_p.ptr[0u]));
33101
0
        v_s2 += v_s1;
33102
0
        v_p.ptr += 1;
33103
0
        v_s1 += ((uint32_t)(v_p.ptr[0u]));
33104
0
        v_s2 += v_s1;
33105
0
        v_p.ptr += 1;
33106
0
        v_s1 += ((uint32_t)(v_p.ptr[0u]));
33107
0
        v_s2 += v_s1;
33108
0
        v_p.ptr += 1;
33109
0
        v_s1 += ((uint32_t)(v_p.ptr[0u]));
33110
0
        v_s2 += v_s1;
33111
0
        v_p.ptr += 1;
33112
0
        v_s1 += ((uint32_t)(v_p.ptr[0u]));
33113
0
        v_s2 += v_s1;
33114
0
        v_p.ptr += 1;
33115
0
        v_s1 += ((uint32_t)(v_p.ptr[0u]));
33116
0
        v_s2 += v_s1;
33117
0
        v_p.ptr += 1;
33118
0
        v_s1 += ((uint32_t)(v_p.ptr[0u]));
33119
0
        v_s2 += v_s1;
33120
0
        v_p.ptr += 1;
33121
0
      }
33122
0
      v_p.len = 1;
33123
0
      const uint8_t* i_end1_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len);
33124
0
      while (v_p.ptr < i_end1_p) {
33125
0
        v_s1 += ((uint32_t)(v_p.ptr[0u]));
33126
0
        v_s2 += v_s1;
33127
0
        v_p.ptr += 1;
33128
0
      }
33129
0
      v_p.len = 0;
33130
0
    }
33131
0
    v_s1 %= 65521u;
33132
0
    v_s2 %= 65521u;
33133
0
    a_x = v_remaining;
33134
0
  }
33135
0
  self->private_impl.f_state = (((v_s2 & 65535u) << 16u) | (v_s1 & 65535u));
33136
0
  return wuffs_base__make_empty_struct();
33137
0
}
33138
33139
// -------- func adler32.hasher.checksum_u32
33140
33141
WUFFS_BASE__GENERATED_C_CODE
33142
WUFFS_BASE__MAYBE_STATIC uint32_t
33143
wuffs_adler32__hasher__checksum_u32(
33144
0
    const wuffs_adler32__hasher* self) {
33145
0
  if (!self) {
33146
0
    return 0;
33147
0
  }
33148
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
33149
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
33150
0
    return 0;
33151
0
  }
33152
33153
0
  return self->private_impl.f_state;
33154
0
}
33155
33156
// โ€ผ WUFFS MULTI-FILE SECTION +arm_neon
33157
// -------- func adler32.hasher.up_arm_neon
33158
33159
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
33160
WUFFS_BASE__GENERATED_C_CODE
33161
static wuffs_base__empty_struct
33162
wuffs_adler32__hasher__up_arm_neon(
33163
    wuffs_adler32__hasher* self,
33164
    wuffs_base__slice_u8 a_x) {
33165
  uint32_t v_s1 = 0;
33166
  uint32_t v_s2 = 0;
33167
  wuffs_base__slice_u8 v_remaining = {0};
33168
  wuffs_base__slice_u8 v_p = {0};
33169
  uint8x16_t v_p__left = {0};
33170
  uint8x16_t v_p_right = {0};
33171
  uint32x4_t v_v1 = {0};
33172
  uint32x4_t v_v2 = {0};
33173
  uint16x8_t v_col0 = {0};
33174
  uint16x8_t v_col1 = {0};
33175
  uint16x8_t v_col2 = {0};
33176
  uint16x8_t v_col3 = {0};
33177
  uint32x2_t v_sum1 = {0};
33178
  uint32x2_t v_sum2 = {0};
33179
  uint32x2_t v_sum12 = {0};
33180
  uint32_t v_num_iterate_bytes = 0;
33181
  uint64_t v_tail_index = 0;
33182
33183
  v_s1 = ((self->private_impl.f_state) & 0xFFFFu);
33184
  v_s2 = ((self->private_impl.f_state) >> (32u - 16u));
33185
  while ((((uint64_t)(a_x.len)) > 0u) && ((15u & ((uint32_t)(0xFFFu & (uintptr_t)(a_x.ptr)))) != 0u)) {
33186
    v_s1 += ((uint32_t)(a_x.ptr[0u]));
33187
    v_s2 += v_s1;
33188
    a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u);
33189
  }
33190
  v_s1 %= 65521u;
33191
  v_s2 %= 65521u;
33192
  while (((uint64_t)(a_x.len)) > 0u) {
33193
    v_remaining = wuffs_base__slice_u8__subslice_j(a_x, 0u);
33194
    if (((uint64_t)(a_x.len)) > 5536u) {
33195
      v_remaining = wuffs_base__slice_u8__subslice_i(a_x, 5536u);
33196
      a_x = wuffs_base__slice_u8__subslice_j(a_x, 5536u);
33197
    }
33198
    v_num_iterate_bytes = ((uint32_t)((((uint64_t)(a_x.len)) & 4294967264u)));
33199
    v_s2 += ((uint32_t)(v_s1 * v_num_iterate_bytes));
33200
    v_v1 = vdupq_n_u32(0u);
33201
    v_v2 = vdupq_n_u32(0u);
33202
    v_col0 = vdupq_n_u16(0u);
33203
    v_col1 = vdupq_n_u16(0u);
33204
    v_col2 = vdupq_n_u16(0u);
33205
    v_col3 = vdupq_n_u16(0u);
33206
    {
33207
      wuffs_base__slice_u8 i_slice_p = a_x;
33208
      v_p.ptr = i_slice_p.ptr;
33209
      v_p.len = 32;
33210
      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));
33211
      while (v_p.ptr < i_end0_p) {
33212
        v_p__left = vld1q_u8(v_p.ptr);
33213
        v_p_right = vld1q_u8(v_p.ptr + 16u);
33214
        v_v2 = vaddq_u32(v_v2, v_v1);
33215
        v_v1 = vpadalq_u16(v_v1, vpadalq_u8(vpaddlq_u8(v_p__left), v_p_right));
33216
        v_col0 = vaddw_u8(v_col0, vget_low_u8(v_p__left));
33217
        v_col1 = vaddw_u8(v_col1, vget_high_u8(v_p__left));
33218
        v_col2 = vaddw_u8(v_col2, vget_low_u8(v_p_right));
33219
        v_col3 = vaddw_u8(v_col3, vget_high_u8(v_p_right));
33220
        v_p.ptr += 32;
33221
      }
33222
      v_p.len = 0;
33223
    }
33224
    v_v2 = vshlq_n_u32(v_v2, 5u);
33225
    v_v2 = vmlal_u16(v_v2, vget_low_u16(v_col0), ((uint16x4_t){32u, 31u, 30u, 29u}));
33226
    v_v2 = vmlal_u16(v_v2, vget_high_u16(v_col0), ((uint16x4_t){28u, 27u, 26u, 25u}));
33227
    v_v2 = vmlal_u16(v_v2, vget_low_u16(v_col1), ((uint16x4_t){24u, 23u, 22u, 21u}));
33228
    v_v2 = vmlal_u16(v_v2, vget_high_u16(v_col1), ((uint16x4_t){20u, 19u, 18u, 17u}));
33229
    v_v2 = vmlal_u16(v_v2, vget_low_u16(v_col2), ((uint16x4_t){16u, 15u, 14u, 13u}));
33230
    v_v2 = vmlal_u16(v_v2, vget_high_u16(v_col2), ((uint16x4_t){12u, 11u, 10u, 9u}));
33231
    v_v2 = vmlal_u16(v_v2, vget_low_u16(v_col3), ((uint16x4_t){8u, 7u, 6u, 5u}));
33232
    v_v2 = vmlal_u16(v_v2, vget_high_u16(v_col3), ((uint16x4_t){4u, 3u, 2u, 1u}));
33233
    v_sum1 = vpadd_u32(vget_low_u32(v_v1), vget_high_u32(v_v1));
33234
    v_sum2 = vpadd_u32(vget_low_u32(v_v2), vget_high_u32(v_v2));
33235
    v_sum12 = vpadd_u32(v_sum1, v_sum2);
33236
    v_s1 += vget_lane_u32(v_sum12, 0u);
33237
    v_s2 += vget_lane_u32(v_sum12, 1u);
33238
    v_tail_index = (((uint64_t)(a_x.len)) & 18446744073709551584u);
33239
    if (v_tail_index < ((uint64_t)(a_x.len))) {
33240
      {
33241
        wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, v_tail_index);
33242
        v_p.ptr = i_slice_p.ptr;
33243
        v_p.len = 1;
33244
        const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len);
33245
        while (v_p.ptr < i_end0_p) {
33246
          v_s1 += ((uint32_t)(v_p.ptr[0u]));
33247
          v_s2 += v_s1;
33248
          v_p.ptr += 1;
33249
        }
33250
        v_p.len = 0;
33251
      }
33252
    }
33253
    v_s1 %= 65521u;
33254
    v_s2 %= 65521u;
33255
    a_x = v_remaining;
33256
  }
33257
  self->private_impl.f_state = (((v_s2 & 65535u) << 16u) | (v_s1 & 65535u));
33258
  return wuffs_base__make_empty_struct();
33259
}
33260
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
33261
// โ€ผ WUFFS MULTI-FILE SECTION -arm_neon
33262
33263
// โ€ผ WUFFS MULTI-FILE SECTION +x86_sse42
33264
// -------- func adler32.hasher.up_x86_sse42
33265
33266
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
33267
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
33268
WUFFS_BASE__GENERATED_C_CODE
33269
static wuffs_base__empty_struct
33270
wuffs_adler32__hasher__up_x86_sse42(
33271
    wuffs_adler32__hasher* self,
33272
19.1k
    wuffs_base__slice_u8 a_x) {
33273
19.1k
  uint32_t v_s1 = 0;
33274
19.1k
  uint32_t v_s2 = 0;
33275
19.1k
  wuffs_base__slice_u8 v_remaining = {0};
33276
19.1k
  wuffs_base__slice_u8 v_p = {0};
33277
19.1k
  __m128i v_zeroes = {0};
33278
19.1k
  __m128i v_ones = {0};
33279
19.1k
  __m128i v_weights__left = {0};
33280
19.1k
  __m128i v_weights_right = {0};
33281
19.1k
  __m128i v_q__left = {0};
33282
19.1k
  __m128i v_q_right = {0};
33283
19.1k
  __m128i v_v1 = {0};
33284
19.1k
  __m128i v_v2 = {0};
33285
19.1k
  __m128i v_v2j = {0};
33286
19.1k
  __m128i v_v2k = {0};
33287
19.1k
  uint32_t v_num_iterate_bytes = 0;
33288
19.1k
  uint64_t v_tail_index = 0;
33289
33290
19.1k
  v_zeroes = _mm_set1_epi16((int16_t)(0u));
33291
19.1k
  v_ones = _mm_set1_epi16((int16_t)(1u));
33292
19.1k
  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));
33293
19.1k
  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));
33294
19.1k
  v_s1 = ((self->private_impl.f_state) & 0xFFFFu);
33295
19.1k
  v_s2 = ((self->private_impl.f_state) >> (32u - 16u));
33296
349k
  while (((uint64_t)(a_x.len)) > 0u) {
33297
330k
    v_remaining = wuffs_base__slice_u8__subslice_j(a_x, 0u);
33298
330k
    if (((uint64_t)(a_x.len)) > 5536u) {
33299
317k
      v_remaining = wuffs_base__slice_u8__subslice_i(a_x, 5536u);
33300
317k
      a_x = wuffs_base__slice_u8__subslice_j(a_x, 5536u);
33301
317k
    }
33302
330k
    v_num_iterate_bytes = ((uint32_t)((((uint64_t)(a_x.len)) & 4294967264u)));
33303
330k
    v_s2 += ((uint32_t)(v_s1 * v_num_iterate_bytes));
33304
330k
    v_v1 = _mm_setzero_si128();
33305
330k
    v_v2j = _mm_setzero_si128();
33306
330k
    v_v2k = _mm_setzero_si128();
33307
330k
    {
33308
330k
      wuffs_base__slice_u8 i_slice_p = a_x;
33309
330k
      v_p.ptr = i_slice_p.ptr;
33310
330k
      v_p.len = 32;
33311
330k
      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));
33312
55.6M
      while (v_p.ptr < i_end0_p) {
33313
55.3M
        v_q__left = _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr));
33314
55.3M
        v_q_right = _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 16u));
33315
55.3M
        v_v2j = _mm_add_epi32(v_v2j, v_v1);
33316
55.3M
        v_v1 = _mm_add_epi32(v_v1, _mm_sad_epu8(v_q__left, v_zeroes));
33317
55.3M
        v_v1 = _mm_add_epi32(v_v1, _mm_sad_epu8(v_q_right, v_zeroes));
33318
55.3M
        v_v2k = _mm_add_epi32(v_v2k, _mm_madd_epi16(v_ones, _mm_maddubs_epi16(v_q__left, v_weights__left)));
33319
55.3M
        v_v2k = _mm_add_epi32(v_v2k, _mm_madd_epi16(v_ones, _mm_maddubs_epi16(v_q_right, v_weights_right)));
33320
55.3M
        v_p.ptr += 32;
33321
55.3M
      }
33322
330k
      v_p.len = 0;
33323
330k
    }
33324
330k
    v_v1 = _mm_add_epi32(v_v1, _mm_shuffle_epi32(v_v1, (int32_t)(177u)));
33325
330k
    v_v1 = _mm_add_epi32(v_v1, _mm_shuffle_epi32(v_v1, (int32_t)(78u)));
33326
330k
    v_s1 += ((uint32_t)(_mm_cvtsi128_si32(v_v1)));
33327
330k
    v_v2 = _mm_add_epi32(v_v2k, _mm_slli_epi32(v_v2j, (int32_t)(5u)));
33328
330k
    v_v2 = _mm_add_epi32(v_v2, _mm_shuffle_epi32(v_v2, (int32_t)(177u)));
33329
330k
    v_v2 = _mm_add_epi32(v_v2, _mm_shuffle_epi32(v_v2, (int32_t)(78u)));
33330
330k
    v_s2 += ((uint32_t)(_mm_cvtsi128_si32(v_v2)));
33331
330k
    v_tail_index = (((uint64_t)(a_x.len)) & 18446744073709551584u);
33332
330k
    if (v_tail_index < ((uint64_t)(a_x.len))) {
33333
12.2k
      {
33334
12.2k
        wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, v_tail_index);
33335
12.2k
        v_p.ptr = i_slice_p.ptr;
33336
12.2k
        v_p.len = 1;
33337
12.2k
        const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len);
33338
145k
        while (v_p.ptr < i_end0_p) {
33339
133k
          v_s1 += ((uint32_t)(v_p.ptr[0u]));
33340
133k
          v_s2 += v_s1;
33341
133k
          v_p.ptr += 1;
33342
133k
        }
33343
12.2k
        v_p.len = 0;
33344
12.2k
      }
33345
12.2k
    }
33346
330k
    v_s1 %= 65521u;
33347
330k
    v_s2 %= 65521u;
33348
330k
    a_x = v_remaining;
33349
330k
  }
33350
19.1k
  self->private_impl.f_state = (((v_s2 & 65535u) << 16u) | (v_s1 & 65535u));
33351
19.1k
  return wuffs_base__make_empty_struct();
33352
19.1k
}
33353
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
33354
// โ€ผ WUFFS MULTI-FILE SECTION -x86_sse42
33355
33356
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ADLER32)
33357
33358
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BMP)
33359
33360
// ---------------- Status Codes Implementations
33361
33362
const char wuffs_bmp__error__bad_header[] = "#bmp: bad header";
33363
const char wuffs_bmp__error__bad_rle_compression[] = "#bmp: bad RLE compression";
33364
const char wuffs_bmp__error__truncated_input[] = "#bmp: truncated input";
33365
const char wuffs_bmp__error__unsupported_bmp_file[] = "#bmp: unsupported BMP file";
33366
const char wuffs_bmp__note__internal_note_short_read[] = "@bmp: internal note: short read";
33367
33368
// ---------------- Private Consts
33369
33370
#define WUFFS_BMP__COMPRESSION_NONE 0u
33371
33372
#define WUFFS_BMP__COMPRESSION_RLE8 1u
33373
33374
#define WUFFS_BMP__COMPRESSION_RLE4 2u
33375
33376
#define WUFFS_BMP__COMPRESSION_BITFIELDS 3u
33377
33378
#define WUFFS_BMP__COMPRESSION_JPEG 4u
33379
33380
#define WUFFS_BMP__COMPRESSION_PNG 5u
33381
33382
#define WUFFS_BMP__COMPRESSION_ALPHABITFIELDS 6u
33383
33384
#define WUFFS_BMP__COMPRESSION_LOW_BIT_DEPTH 256u
33385
33386
#define WUFFS_BMP__RLE_STATE_NEUTRAL 0u
33387
33388
#define WUFFS_BMP__RLE_STATE_RUN 1u
33389
33390
#define WUFFS_BMP__RLE_STATE_ESCAPE 2u
33391
33392
#define WUFFS_BMP__RLE_STATE_LITERAL 3u
33393
33394
#define WUFFS_BMP__RLE_STATE_DELTA_X 4u
33395
33396
#define WUFFS_BMP__RLE_STATE_DELTA_Y 5u
33397
33398
// ---------------- Private Initializer Prototypes
33399
33400
// ---------------- Private Function Prototypes
33401
33402
WUFFS_BASE__GENERATED_C_CODE
33403
static wuffs_base__status
33404
wuffs_bmp__decoder__do_decode_image_config(
33405
    wuffs_bmp__decoder* self,
33406
    wuffs_base__image_config* a_dst,
33407
    wuffs_base__io_buffer* a_src);
33408
33409
WUFFS_BASE__GENERATED_C_CODE
33410
static wuffs_base__status
33411
wuffs_bmp__decoder__do_decode_frame_config(
33412
    wuffs_bmp__decoder* self,
33413
    wuffs_base__frame_config* a_dst,
33414
    wuffs_base__io_buffer* a_src);
33415
33416
WUFFS_BASE__GENERATED_C_CODE
33417
static wuffs_base__status
33418
wuffs_bmp__decoder__do_decode_frame(
33419
    wuffs_bmp__decoder* self,
33420
    wuffs_base__pixel_buffer* a_dst,
33421
    wuffs_base__io_buffer* a_src,
33422
    wuffs_base__pixel_blend a_blend,
33423
    wuffs_base__slice_u8 a_workbuf,
33424
    wuffs_base__decode_frame_options* a_opts);
33425
33426
WUFFS_BASE__GENERATED_C_CODE
33427
static wuffs_base__status
33428
wuffs_bmp__decoder__swizzle_none(
33429
    wuffs_bmp__decoder* self,
33430
    wuffs_base__pixel_buffer* a_dst,
33431
    wuffs_base__io_buffer* a_src);
33432
33433
WUFFS_BASE__GENERATED_C_CODE
33434
static wuffs_base__status
33435
wuffs_bmp__decoder__swizzle_rle(
33436
    wuffs_bmp__decoder* self,
33437
    wuffs_base__pixel_buffer* a_dst,
33438
    wuffs_base__io_buffer* a_src);
33439
33440
WUFFS_BASE__GENERATED_C_CODE
33441
static wuffs_base__status
33442
wuffs_bmp__decoder__swizzle_bitfields(
33443
    wuffs_bmp__decoder* self,
33444
    wuffs_base__pixel_buffer* a_dst,
33445
    wuffs_base__io_buffer* a_src);
33446
33447
WUFFS_BASE__GENERATED_C_CODE
33448
static wuffs_base__status
33449
wuffs_bmp__decoder__swizzle_low_bit_depth(
33450
    wuffs_bmp__decoder* self,
33451
    wuffs_base__pixel_buffer* a_dst,
33452
    wuffs_base__io_buffer* a_src);
33453
33454
WUFFS_BASE__GENERATED_C_CODE
33455
static wuffs_base__status
33456
wuffs_bmp__decoder__do_tell_me_more(
33457
    wuffs_bmp__decoder* self,
33458
    wuffs_base__io_buffer* a_dst,
33459
    wuffs_base__more_information* a_minfo,
33460
    wuffs_base__io_buffer* a_src);
33461
33462
WUFFS_BASE__GENERATED_C_CODE
33463
static wuffs_base__status
33464
wuffs_bmp__decoder__read_palette(
33465
    wuffs_bmp__decoder* self,
33466
    wuffs_base__io_buffer* a_src);
33467
33468
WUFFS_BASE__GENERATED_C_CODE
33469
static wuffs_base__status
33470
wuffs_bmp__decoder__process_masks(
33471
    wuffs_bmp__decoder* self);
33472
33473
// ---------------- VTables
33474
33475
const wuffs_base__image_decoder__func_ptrs
33476
wuffs_bmp__decoder__func_ptrs_for__wuffs_base__image_decoder = {
33477
  (wuffs_base__status(*)(void*,
33478
      wuffs_base__pixel_buffer*,
33479
      wuffs_base__io_buffer*,
33480
      wuffs_base__pixel_blend,
33481
      wuffs_base__slice_u8,
33482
      wuffs_base__decode_frame_options*))(&wuffs_bmp__decoder__decode_frame),
33483
  (wuffs_base__status(*)(void*,
33484
      wuffs_base__frame_config*,
33485
      wuffs_base__io_buffer*))(&wuffs_bmp__decoder__decode_frame_config),
33486
  (wuffs_base__status(*)(void*,
33487
      wuffs_base__image_config*,
33488
      wuffs_base__io_buffer*))(&wuffs_bmp__decoder__decode_image_config),
33489
  (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_bmp__decoder__frame_dirty_rect),
33490
  (uint64_t(*)(const void*,
33491
      uint32_t))(&wuffs_bmp__decoder__get_quirk),
33492
  (uint32_t(*)(const void*))(&wuffs_bmp__decoder__num_animation_loops),
33493
  (uint64_t(*)(const void*))(&wuffs_bmp__decoder__num_decoded_frame_configs),
33494
  (uint64_t(*)(const void*))(&wuffs_bmp__decoder__num_decoded_frames),
33495
  (wuffs_base__status(*)(void*,
33496
      uint64_t,
33497
      uint64_t))(&wuffs_bmp__decoder__restart_frame),
33498
  (wuffs_base__status(*)(void*,
33499
      uint32_t,
33500
      uint64_t))(&wuffs_bmp__decoder__set_quirk),
33501
  (wuffs_base__empty_struct(*)(void*,
33502
      uint32_t,
33503
      bool))(&wuffs_bmp__decoder__set_report_metadata),
33504
  (wuffs_base__status(*)(void*,
33505
      wuffs_base__io_buffer*,
33506
      wuffs_base__more_information*,
33507
      wuffs_base__io_buffer*))(&wuffs_bmp__decoder__tell_me_more),
33508
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_bmp__decoder__workbuf_len),
33509
};
33510
33511
// ---------------- Initializer Implementations
33512
33513
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
33514
wuffs_bmp__decoder__initialize(
33515
    wuffs_bmp__decoder* self,
33516
    size_t sizeof_star_self,
33517
    uint64_t wuffs_version,
33518
    uint32_t options){
33519
  if (!self) {
33520
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
33521
  }
33522
  if (sizeof(*self) != sizeof_star_self) {
33523
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
33524
  }
33525
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
33526
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
33527
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
33528
  }
33529
33530
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
33531
    // The whole point of this if-check is to detect an uninitialized *self.
33532
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
33533
#if !defined(__clang__) && defined(__GNUC__)
33534
#pragma GCC diagnostic push
33535
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
33536
#endif
33537
    if (self->private_impl.magic != 0) {
33538
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
33539
    }
33540
#if !defined(__clang__) && defined(__GNUC__)
33541
#pragma GCC diagnostic pop
33542
#endif
33543
  } else {
33544
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
33545
      memset(self, 0, sizeof(*self));
33546
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
33547
    } else {
33548
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
33549
    }
33550
  }
33551
33552
  self->private_impl.magic = WUFFS_BASE__MAGIC;
33553
  self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name =
33554
      wuffs_base__image_decoder__vtable_name;
33555
  self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers =
33556
      (const void*)(&wuffs_bmp__decoder__func_ptrs_for__wuffs_base__image_decoder);
33557
  return wuffs_base__make_status(NULL);
33558
}
33559
33560
wuffs_bmp__decoder*
33561
wuffs_bmp__decoder__alloc(void) {
33562
  wuffs_bmp__decoder* x =
33563
      (wuffs_bmp__decoder*)(calloc(1, sizeof(wuffs_bmp__decoder)));
33564
  if (!x) {
33565
    return NULL;
33566
  }
33567
  if (wuffs_bmp__decoder__initialize(
33568
      x, sizeof(wuffs_bmp__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
33569
    free(x);
33570
    return NULL;
33571
  }
33572
  return x;
33573
}
33574
33575
size_t
33576
sizeof__wuffs_bmp__decoder(void) {
33577
  return sizeof(wuffs_bmp__decoder);
33578
}
33579
33580
// ---------------- Function Implementations
33581
33582
// -------- func bmp.decoder.get_quirk
33583
33584
WUFFS_BASE__GENERATED_C_CODE
33585
WUFFS_BASE__MAYBE_STATIC uint64_t
33586
wuffs_bmp__decoder__get_quirk(
33587
    const wuffs_bmp__decoder* self,
33588
    uint32_t a_key) {
33589
  if (!self) {
33590
    return 0;
33591
  }
33592
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
33593
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
33594
    return 0;
33595
  }
33596
33597
  return 0u;
33598
}
33599
33600
// -------- func bmp.decoder.set_quirk
33601
33602
WUFFS_BASE__GENERATED_C_CODE
33603
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
33604
wuffs_bmp__decoder__set_quirk(
33605
    wuffs_bmp__decoder* self,
33606
    uint32_t a_key,
33607
    uint64_t a_value) {
33608
  if (!self) {
33609
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
33610
  }
33611
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
33612
    return wuffs_base__make_status(
33613
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
33614
        ? wuffs_base__error__disabled_by_previous_error
33615
        : wuffs_base__error__initialize_not_called);
33616
  }
33617
33618
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
33619
}
33620
33621
// -------- func bmp.decoder.decode_image_config
33622
33623
WUFFS_BASE__GENERATED_C_CODE
33624
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
33625
wuffs_bmp__decoder__decode_image_config(
33626
    wuffs_bmp__decoder* self,
33627
    wuffs_base__image_config* a_dst,
33628
    wuffs_base__io_buffer* a_src) {
33629
  if (!self) {
33630
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
33631
  }
33632
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
33633
    return wuffs_base__make_status(
33634
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
33635
        ? wuffs_base__error__disabled_by_previous_error
33636
        : wuffs_base__error__initialize_not_called);
33637
  }
33638
  if (!a_src) {
33639
    self->private_impl.magic = WUFFS_BASE__DISABLED;
33640
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
33641
  }
33642
  if ((self->private_impl.active_coroutine != 0) &&
33643
      (self->private_impl.active_coroutine != 1)) {
33644
    self->private_impl.magic = WUFFS_BASE__DISABLED;
33645
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
33646
  }
33647
  self->private_impl.active_coroutine = 0;
33648
  wuffs_base__status status = wuffs_base__make_status(NULL);
33649
33650
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
33651
33652
  uint32_t coro_susp_point = self->private_impl.p_decode_image_config;
33653
  switch (coro_susp_point) {
33654
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
33655
33656
    while (true) {
33657
      {
33658
        wuffs_base__status t_0 = wuffs_bmp__decoder__do_decode_image_config(self, a_dst, a_src);
33659
        v_status = t_0;
33660
      }
33661
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
33662
        status = wuffs_base__make_status(wuffs_bmp__error__truncated_input);
33663
        goto exit;
33664
      }
33665
      status = v_status;
33666
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
33667
    }
33668
33669
    ok:
33670
    self->private_impl.p_decode_image_config = 0;
33671
    goto exit;
33672
  }
33673
33674
  goto suspend;
33675
  suspend:
33676
  self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
33677
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
33678
33679
  goto exit;
33680
  exit:
33681
  if (wuffs_base__status__is_error(&status)) {
33682
    self->private_impl.magic = WUFFS_BASE__DISABLED;
33683
  }
33684
  return status;
33685
}
33686
33687
// -------- func bmp.decoder.do_decode_image_config
33688
33689
WUFFS_BASE__GENERATED_C_CODE
33690
static wuffs_base__status
33691
wuffs_bmp__decoder__do_decode_image_config(
33692
    wuffs_bmp__decoder* self,
33693
    wuffs_base__image_config* a_dst,
33694
    wuffs_base__io_buffer* a_src) {
33695
  wuffs_base__status status = wuffs_base__make_status(NULL);
33696
33697
  uint32_t v_magic = 0;
33698
  uint32_t v_width = 0;
33699
  uint32_t v_height = 0;
33700
  uint32_t v_planes = 0;
33701
  uint32_t v_n = 0;
33702
  uint32_t v_dst_pixfmt = 0;
33703
  uint32_t v_byte_width = 0;
33704
33705
  const uint8_t* iop_a_src = NULL;
33706
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
33707
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
33708
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
33709
  if (a_src && a_src->data.ptr) {
33710
    io0_a_src = a_src->data.ptr;
33711
    io1_a_src = io0_a_src + a_src->meta.ri;
33712
    iop_a_src = io1_a_src;
33713
    io2_a_src = io0_a_src + a_src->meta.wi;
33714
  }
33715
33716
  uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config;
33717
  switch (coro_susp_point) {
33718
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
33719
33720
    if ((self->private_impl.f_call_sequence != 0u) || (self->private_impl.f_io_redirect_fourcc == 1u)) {
33721
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
33722
      goto exit;
33723
    } else if (self->private_impl.f_io_redirect_fourcc != 0u) {
33724
      status = wuffs_base__make_status(wuffs_base__note__i_o_redirect);
33725
      goto ok;
33726
    }
33727
    {
33728
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
33729
      uint32_t t_0;
33730
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
33731
        t_0 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
33732
        iop_a_src += 2;
33733
      } else {
33734
        self->private_data.s_do_decode_image_config.scratch = 0;
33735
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
33736
        while (true) {
33737
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
33738
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
33739
            goto suspend;
33740
          }
33741
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
33742
          uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
33743
          *scratch <<= 8;
33744
          *scratch >>= 8;
33745
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
33746
          if (num_bits_0 == 8) {
33747
            t_0 = ((uint32_t)(*scratch));
33748
            break;
33749
          }
33750
          num_bits_0 += 8u;
33751
          *scratch |= ((uint64_t)(num_bits_0)) << 56;
33752
        }
33753
      }
33754
      v_magic = t_0;
33755
    }
33756
    if (v_magic != 19778u) {
33757
      status = wuffs_base__make_status(wuffs_bmp__error__bad_header);
33758
      goto exit;
33759
    }
33760
    self->private_data.s_do_decode_image_config.scratch = 8u;
33761
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
33762
    if (self->private_data.s_do_decode_image_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
33763
      self->private_data.s_do_decode_image_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
33764
      iop_a_src = io2_a_src;
33765
      status = wuffs_base__make_status(wuffs_base__suspension__short_read);
33766
      goto suspend;
33767
    }
33768
    iop_a_src += self->private_data.s_do_decode_image_config.scratch;
33769
    {
33770
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
33771
      uint32_t t_1;
33772
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
33773
        t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
33774
        iop_a_src += 4;
33775
      } else {
33776
        self->private_data.s_do_decode_image_config.scratch = 0;
33777
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
33778
        while (true) {
33779
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
33780
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
33781
            goto suspend;
33782
          }
33783
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
33784
          uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
33785
          *scratch <<= 8;
33786
          *scratch >>= 8;
33787
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
33788
          if (num_bits_1 == 24) {
33789
            t_1 = ((uint32_t)(*scratch));
33790
            break;
33791
          }
33792
          num_bits_1 += 8u;
33793
          *scratch |= ((uint64_t)(num_bits_1)) << 56;
33794
        }
33795
      }
33796
      self->private_impl.f_padding = t_1;
33797
    }
33798
    if (self->private_impl.f_padding < 14u) {
33799
      status = wuffs_base__make_status(wuffs_bmp__error__bad_header);
33800
      goto exit;
33801
    }
33802
    self->private_impl.f_padding -= 14u;
33803
    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))));
33804
    {
33805
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
33806
      uint32_t t_2;
33807
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
33808
        t_2 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
33809
        iop_a_src += 4;
33810
      } else {
33811
        self->private_data.s_do_decode_image_config.scratch = 0;
33812
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
33813
        while (true) {
33814
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
33815
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
33816
            goto suspend;
33817
          }
33818
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
33819
          uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56));
33820
          *scratch <<= 8;
33821
          *scratch >>= 8;
33822
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2;
33823
          if (num_bits_2 == 24) {
33824
            t_2 = ((uint32_t)(*scratch));
33825
            break;
33826
          }
33827
          num_bits_2 += 8u;
33828
          *scratch |= ((uint64_t)(num_bits_2)) << 56;
33829
        }
33830
      }
33831
      self->private_impl.f_bitmap_info_len = t_2;
33832
    }
33833
    if (self->private_impl.f_padding < self->private_impl.f_bitmap_info_len) {
33834
      status = wuffs_base__make_status(wuffs_bmp__error__bad_header);
33835
      goto exit;
33836
    }
33837
    self->private_impl.f_padding -= self->private_impl.f_bitmap_info_len;
33838
    if (self->private_impl.f_bitmap_info_len == 12u) {
33839
      {
33840
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
33841
        uint32_t t_3;
33842
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
33843
          t_3 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
33844
          iop_a_src += 2;
33845
        } else {
33846
          self->private_data.s_do_decode_image_config.scratch = 0;
33847
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
33848
          while (true) {
33849
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
33850
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
33851
              goto suspend;
33852
            }
33853
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
33854
            uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56));
33855
            *scratch <<= 8;
33856
            *scratch >>= 8;
33857
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3;
33858
            if (num_bits_3 == 8) {
33859
              t_3 = ((uint32_t)(*scratch));
33860
              break;
33861
            }
33862
            num_bits_3 += 8u;
33863
            *scratch |= ((uint64_t)(num_bits_3)) << 56;
33864
          }
33865
        }
33866
        self->private_impl.f_width = t_3;
33867
      }
33868
      {
33869
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
33870
        uint32_t t_4;
33871
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
33872
          t_4 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
33873
          iop_a_src += 2;
33874
        } else {
33875
          self->private_data.s_do_decode_image_config.scratch = 0;
33876
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11);
33877
          while (true) {
33878
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
33879
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
33880
              goto suspend;
33881
            }
33882
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
33883
            uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56));
33884
            *scratch <<= 8;
33885
            *scratch >>= 8;
33886
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4;
33887
            if (num_bits_4 == 8) {
33888
              t_4 = ((uint32_t)(*scratch));
33889
              break;
33890
            }
33891
            num_bits_4 += 8u;
33892
            *scratch |= ((uint64_t)(num_bits_4)) << 56;
33893
          }
33894
        }
33895
        self->private_impl.f_height = t_4;
33896
      }
33897
      {
33898
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12);
33899
        uint32_t t_5;
33900
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
33901
          t_5 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
33902
          iop_a_src += 2;
33903
        } else {
33904
          self->private_data.s_do_decode_image_config.scratch = 0;
33905
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13);
33906
          while (true) {
33907
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
33908
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
33909
              goto suspend;
33910
            }
33911
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
33912
            uint32_t num_bits_5 = ((uint32_t)(*scratch >> 56));
33913
            *scratch <<= 8;
33914
            *scratch >>= 8;
33915
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_5;
33916
            if (num_bits_5 == 8) {
33917
              t_5 = ((uint32_t)(*scratch));
33918
              break;
33919
            }
33920
            num_bits_5 += 8u;
33921
            *scratch |= ((uint64_t)(num_bits_5)) << 56;
33922
          }
33923
        }
33924
        v_planes = t_5;
33925
      }
33926
      if (v_planes != 1u) {
33927
        status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file);
33928
        goto exit;
33929
      }
33930
      {
33931
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14);
33932
        uint32_t t_6;
33933
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
33934
          t_6 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
33935
          iop_a_src += 2;
33936
        } else {
33937
          self->private_data.s_do_decode_image_config.scratch = 0;
33938
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15);
33939
          while (true) {
33940
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
33941
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
33942
              goto suspend;
33943
            }
33944
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
33945
            uint32_t num_bits_6 = ((uint32_t)(*scratch >> 56));
33946
            *scratch <<= 8;
33947
            *scratch >>= 8;
33948
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_6;
33949
            if (num_bits_6 == 8) {
33950
              t_6 = ((uint32_t)(*scratch));
33951
              break;
33952
            }
33953
            num_bits_6 += 8u;
33954
            *scratch |= ((uint64_t)(num_bits_6)) << 56;
33955
          }
33956
        }
33957
        self->private_impl.f_bits_per_pixel = t_6;
33958
      }
33959
    } else if (self->private_impl.f_bitmap_info_len == 16u) {
33960
      {
33961
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16);
33962
        uint32_t t_7;
33963
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
33964
          t_7 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
33965
          iop_a_src += 4;
33966
        } else {
33967
          self->private_data.s_do_decode_image_config.scratch = 0;
33968
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(17);
33969
          while (true) {
33970
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
33971
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
33972
              goto suspend;
33973
            }
33974
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
33975
            uint32_t num_bits_7 = ((uint32_t)(*scratch >> 56));
33976
            *scratch <<= 8;
33977
            *scratch >>= 8;
33978
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_7;
33979
            if (num_bits_7 == 24) {
33980
              t_7 = ((uint32_t)(*scratch));
33981
              break;
33982
            }
33983
            num_bits_7 += 8u;
33984
            *scratch |= ((uint64_t)(num_bits_7)) << 56;
33985
          }
33986
        }
33987
        v_width = t_7;
33988
      }
33989
      if (v_width > 2147483647u) {
33990
        status = wuffs_base__make_status(wuffs_bmp__error__bad_header);
33991
        goto exit;
33992
      } else if (v_width > 16777215u) {
33993
        status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension);
33994
        goto exit;
33995
      }
33996
      self->private_impl.f_width = v_width;
33997
      {
33998
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(18);
33999
        uint32_t t_8;
34000
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
34001
          t_8 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
34002
          iop_a_src += 4;
34003
        } else {
34004
          self->private_data.s_do_decode_image_config.scratch = 0;
34005
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(19);
34006
          while (true) {
34007
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
34008
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
34009
              goto suspend;
34010
            }
34011
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
34012
            uint32_t num_bits_8 = ((uint32_t)(*scratch >> 56));
34013
            *scratch <<= 8;
34014
            *scratch >>= 8;
34015
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_8;
34016
            if (num_bits_8 == 24) {
34017
              t_8 = ((uint32_t)(*scratch));
34018
              break;
34019
            }
34020
            num_bits_8 += 8u;
34021
            *scratch |= ((uint64_t)(num_bits_8)) << 56;
34022
          }
34023
        }
34024
        v_height = t_8;
34025
      }
34026
      if (v_height > 2147483647u) {
34027
        status = wuffs_base__make_status(wuffs_bmp__error__bad_header);
34028
        goto exit;
34029
      } else if (v_height > 16777215u) {
34030
        status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension);
34031
        goto exit;
34032
      }
34033
      self->private_impl.f_height = v_height;
34034
      {
34035
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(20);
34036
        uint32_t t_9;
34037
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
34038
          t_9 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
34039
          iop_a_src += 2;
34040
        } else {
34041
          self->private_data.s_do_decode_image_config.scratch = 0;
34042
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(21);
34043
          while (true) {
34044
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
34045
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
34046
              goto suspend;
34047
            }
34048
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
34049
            uint32_t num_bits_9 = ((uint32_t)(*scratch >> 56));
34050
            *scratch <<= 8;
34051
            *scratch >>= 8;
34052
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_9;
34053
            if (num_bits_9 == 8) {
34054
              t_9 = ((uint32_t)(*scratch));
34055
              break;
34056
            }
34057
            num_bits_9 += 8u;
34058
            *scratch |= ((uint64_t)(num_bits_9)) << 56;
34059
          }
34060
        }
34061
        v_planes = t_9;
34062
      }
34063
      if (v_planes != 1u) {
34064
        status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file);
34065
        goto exit;
34066
      }
34067
      {
34068
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(22);
34069
        uint32_t t_10;
34070
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
34071
          t_10 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
34072
          iop_a_src += 2;
34073
        } else {
34074
          self->private_data.s_do_decode_image_config.scratch = 0;
34075
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(23);
34076
          while (true) {
34077
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
34078
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
34079
              goto suspend;
34080
            }
34081
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
34082
            uint32_t num_bits_10 = ((uint32_t)(*scratch >> 56));
34083
            *scratch <<= 8;
34084
            *scratch >>= 8;
34085
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_10;
34086
            if (num_bits_10 == 8) {
34087
              t_10 = ((uint32_t)(*scratch));
34088
              break;
34089
            }
34090
            num_bits_10 += 8u;
34091
            *scratch |= ((uint64_t)(num_bits_10)) << 56;
34092
          }
34093
        }
34094
        self->private_impl.f_bits_per_pixel = t_10;
34095
      }
34096
    } else {
34097
      {
34098
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(24);
34099
        uint32_t t_11;
34100
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
34101
          t_11 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
34102
          iop_a_src += 4;
34103
        } else {
34104
          self->private_data.s_do_decode_image_config.scratch = 0;
34105
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(25);
34106
          while (true) {
34107
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
34108
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
34109
              goto suspend;
34110
            }
34111
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
34112
            uint32_t num_bits_11 = ((uint32_t)(*scratch >> 56));
34113
            *scratch <<= 8;
34114
            *scratch >>= 8;
34115
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_11;
34116
            if (num_bits_11 == 24) {
34117
              t_11 = ((uint32_t)(*scratch));
34118
              break;
34119
            }
34120
            num_bits_11 += 8u;
34121
            *scratch |= ((uint64_t)(num_bits_11)) << 56;
34122
          }
34123
        }
34124
        v_width = t_11;
34125
      }
34126
      if (v_width > 2147483647u) {
34127
        status = wuffs_base__make_status(wuffs_bmp__error__bad_header);
34128
        goto exit;
34129
      } else if (v_width > 16777215u) {
34130
        status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension);
34131
        goto exit;
34132
      }
34133
      self->private_impl.f_width = v_width;
34134
      {
34135
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(26);
34136
        uint32_t t_12;
34137
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
34138
          t_12 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
34139
          iop_a_src += 4;
34140
        } else {
34141
          self->private_data.s_do_decode_image_config.scratch = 0;
34142
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(27);
34143
          while (true) {
34144
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
34145
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
34146
              goto suspend;
34147
            }
34148
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
34149
            uint32_t num_bits_12 = ((uint32_t)(*scratch >> 56));
34150
            *scratch <<= 8;
34151
            *scratch >>= 8;
34152
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_12;
34153
            if (num_bits_12 == 24) {
34154
              t_12 = ((uint32_t)(*scratch));
34155
              break;
34156
            }
34157
            num_bits_12 += 8u;
34158
            *scratch |= ((uint64_t)(num_bits_12)) << 56;
34159
          }
34160
        }
34161
        v_height = t_12;
34162
      }
34163
      if (v_height == 2147483648u) {
34164
        status = wuffs_base__make_status(wuffs_bmp__error__bad_header);
34165
        goto exit;
34166
      } else if (v_height > 2147483648u) {
34167
        v_height = ((uint32_t)(0u - v_height));
34168
        if (v_height > 16777215u) {
34169
          status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension);
34170
          goto exit;
34171
        }
34172
        self->private_impl.f_height = v_height;
34173
        self->private_impl.f_top_down = true;
34174
      } else if (v_height > 16777215u) {
34175
        status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension);
34176
        goto exit;
34177
      } else {
34178
        self->private_impl.f_height = v_height;
34179
      }
34180
      {
34181
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(28);
34182
        uint32_t t_13;
34183
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
34184
          t_13 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
34185
          iop_a_src += 2;
34186
        } else {
34187
          self->private_data.s_do_decode_image_config.scratch = 0;
34188
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(29);
34189
          while (true) {
34190
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
34191
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
34192
              goto suspend;
34193
            }
34194
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
34195
            uint32_t num_bits_13 = ((uint32_t)(*scratch >> 56));
34196
            *scratch <<= 8;
34197
            *scratch >>= 8;
34198
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_13;
34199
            if (num_bits_13 == 8) {
34200
              t_13 = ((uint32_t)(*scratch));
34201
              break;
34202
            }
34203
            num_bits_13 += 8u;
34204
            *scratch |= ((uint64_t)(num_bits_13)) << 56;
34205
          }
34206
        }
34207
        v_planes = t_13;
34208
      }
34209
      if (v_planes != 1u) {
34210
        status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file);
34211
        goto exit;
34212
      }
34213
      {
34214
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(30);
34215
        uint32_t t_14;
34216
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
34217
          t_14 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
34218
          iop_a_src += 2;
34219
        } else {
34220
          self->private_data.s_do_decode_image_config.scratch = 0;
34221
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(31);
34222
          while (true) {
34223
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
34224
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
34225
              goto suspend;
34226
            }
34227
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
34228
            uint32_t num_bits_14 = ((uint32_t)(*scratch >> 56));
34229
            *scratch <<= 8;
34230
            *scratch >>= 8;
34231
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_14;
34232
            if (num_bits_14 == 8) {
34233
              t_14 = ((uint32_t)(*scratch));
34234
              break;
34235
            }
34236
            num_bits_14 += 8u;
34237
            *scratch |= ((uint64_t)(num_bits_14)) << 56;
34238
          }
34239
        }
34240
        self->private_impl.f_bits_per_pixel = t_14;
34241
      }
34242
      {
34243
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(32);
34244
        uint32_t t_15;
34245
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
34246
          t_15 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
34247
          iop_a_src += 4;
34248
        } else {
34249
          self->private_data.s_do_decode_image_config.scratch = 0;
34250
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(33);
34251
          while (true) {
34252
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
34253
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
34254
              goto suspend;
34255
            }
34256
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
34257
            uint32_t num_bits_15 = ((uint32_t)(*scratch >> 56));
34258
            *scratch <<= 8;
34259
            *scratch >>= 8;
34260
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_15;
34261
            if (num_bits_15 == 24) {
34262
              t_15 = ((uint32_t)(*scratch));
34263
              break;
34264
            }
34265
            num_bits_15 += 8u;
34266
            *scratch |= ((uint64_t)(num_bits_15)) << 56;
34267
          }
34268
        }
34269
        self->private_impl.f_compression = t_15;
34270
      }
34271
      if (self->private_impl.f_bits_per_pixel == 0u) {
34272
        if (self->private_impl.f_compression == 4u) {
34273
          self->private_impl.f_io_redirect_fourcc = 1246774599u;
34274
          status = wuffs_base__make_status(wuffs_base__note__i_o_redirect);
34275
          goto ok;
34276
        } else if (self->private_impl.f_compression == 5u) {
34277
          self->private_impl.f_io_redirect_fourcc = 1347307296u;
34278
          status = wuffs_base__make_status(wuffs_base__note__i_o_redirect);
34279
          goto ok;
34280
        }
34281
        status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file);
34282
        goto exit;
34283
      }
34284
      self->private_data.s_do_decode_image_config.scratch = 20u;
34285
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(34);
34286
      if (self->private_data.s_do_decode_image_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
34287
        self->private_data.s_do_decode_image_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
34288
        iop_a_src = io2_a_src;
34289
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
34290
        goto suspend;
34291
      }
34292
      iop_a_src += self->private_data.s_do_decode_image_config.scratch;
34293
      if (self->private_impl.f_bitmap_info_len == 40u) {
34294
        if (self->private_impl.f_bits_per_pixel >= 16u) {
34295
          if (self->private_impl.f_padding >= 16u) {
34296
            self->private_impl.f_bitmap_info_len = 56u;
34297
            self->private_impl.f_padding -= 16u;
34298
          } else if (self->private_impl.f_padding >= 12u) {
34299
            self->private_impl.f_bitmap_info_len = 52u;
34300
            self->private_impl.f_padding -= 12u;
34301
          }
34302
        }
34303
      } else if ((self->private_impl.f_bitmap_info_len != 52u) &&
34304
          (self->private_impl.f_bitmap_info_len != 56u) &&
34305
          (self->private_impl.f_bitmap_info_len != 64u) &&
34306
          (self->private_impl.f_bitmap_info_len != 108u) &&
34307
          (self->private_impl.f_bitmap_info_len != 124u)) {
34308
        status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file);
34309
        goto exit;
34310
      }
34311
      if (self->private_impl.f_compression == 6u) {
34312
        self->private_impl.f_compression = 3u;
34313
      }
34314
      if (self->private_impl.f_compression == 3u) {
34315
        if (self->private_impl.f_bitmap_info_len >= 52u) {
34316
          {
34317
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(35);
34318
            uint32_t t_16;
34319
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
34320
              t_16 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
34321
              iop_a_src += 4;
34322
            } else {
34323
              self->private_data.s_do_decode_image_config.scratch = 0;
34324
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(36);
34325
              while (true) {
34326
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
34327
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
34328
                  goto suspend;
34329
                }
34330
                uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
34331
                uint32_t num_bits_16 = ((uint32_t)(*scratch >> 56));
34332
                *scratch <<= 8;
34333
                *scratch >>= 8;
34334
                *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_16;
34335
                if (num_bits_16 == 24) {
34336
                  t_16 = ((uint32_t)(*scratch));
34337
                  break;
34338
                }
34339
                num_bits_16 += 8u;
34340
                *scratch |= ((uint64_t)(num_bits_16)) << 56;
34341
              }
34342
            }
34343
            self->private_impl.f_channel_masks[2u] = t_16;
34344
          }
34345
          {
34346
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(37);
34347
            uint32_t t_17;
34348
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
34349
              t_17 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
34350
              iop_a_src += 4;
34351
            } else {
34352
              self->private_data.s_do_decode_image_config.scratch = 0;
34353
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(38);
34354
              while (true) {
34355
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
34356
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
34357
                  goto suspend;
34358
                }
34359
                uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
34360
                uint32_t num_bits_17 = ((uint32_t)(*scratch >> 56));
34361
                *scratch <<= 8;
34362
                *scratch >>= 8;
34363
                *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_17;
34364
                if (num_bits_17 == 24) {
34365
                  t_17 = ((uint32_t)(*scratch));
34366
                  break;
34367
                }
34368
                num_bits_17 += 8u;
34369
                *scratch |= ((uint64_t)(num_bits_17)) << 56;
34370
              }
34371
            }
34372
            self->private_impl.f_channel_masks[1u] = t_17;
34373
          }
34374
          {
34375
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(39);
34376
            uint32_t t_18;
34377
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
34378
              t_18 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
34379
              iop_a_src += 4;
34380
            } else {
34381
              self->private_data.s_do_decode_image_config.scratch = 0;
34382
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(40);
34383
              while (true) {
34384
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
34385
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
34386
                  goto suspend;
34387
                }
34388
                uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
34389
                uint32_t num_bits_18 = ((uint32_t)(*scratch >> 56));
34390
                *scratch <<= 8;
34391
                *scratch >>= 8;
34392
                *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_18;
34393
                if (num_bits_18 == 24) {
34394
                  t_18 = ((uint32_t)(*scratch));
34395
                  break;
34396
                }
34397
                num_bits_18 += 8u;
34398
                *scratch |= ((uint64_t)(num_bits_18)) << 56;
34399
              }
34400
            }
34401
            self->private_impl.f_channel_masks[0u] = t_18;
34402
          }
34403
          if (self->private_impl.f_bitmap_info_len >= 56u) {
34404
            {
34405
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(41);
34406
              uint32_t t_19;
34407
              if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
34408
                t_19 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
34409
                iop_a_src += 4;
34410
              } else {
34411
                self->private_data.s_do_decode_image_config.scratch = 0;
34412
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT(42);
34413
                while (true) {
34414
                  if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
34415
                    status = wuffs_base__make_status(wuffs_base__suspension__short_read);
34416
                    goto suspend;
34417
                  }
34418
                  uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
34419
                  uint32_t num_bits_19 = ((uint32_t)(*scratch >> 56));
34420
                  *scratch <<= 8;
34421
                  *scratch >>= 8;
34422
                  *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_19;
34423
                  if (num_bits_19 == 24) {
34424
                    t_19 = ((uint32_t)(*scratch));
34425
                    break;
34426
                  }
34427
                  num_bits_19 += 8u;
34428
                  *scratch |= ((uint64_t)(num_bits_19)) << 56;
34429
                }
34430
              }
34431
              self->private_impl.f_channel_masks[3u] = t_19;
34432
            }
34433
            self->private_data.s_do_decode_image_config.scratch = ((uint32_t)(self->private_impl.f_bitmap_info_len - 56u));
34434
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(43);
34435
            if (self->private_data.s_do_decode_image_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
34436
              self->private_data.s_do_decode_image_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
34437
              iop_a_src = io2_a_src;
34438
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
34439
              goto suspend;
34440
            }
34441
            iop_a_src += self->private_data.s_do_decode_image_config.scratch;
34442
          }
34443
          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)) {
34444
            if (self->private_impl.f_bits_per_pixel == 24u) {
34445
              self->private_impl.f_compression = 0u;
34446
            } else if (self->private_impl.f_bits_per_pixel == 32u) {
34447
              if ((self->private_impl.f_channel_masks[3u] == 0u) || (self->private_impl.f_channel_masks[3u] == 4278190080u)) {
34448
                self->private_impl.f_compression = 0u;
34449
              }
34450
            }
34451
          }
34452
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(44);
34453
          status = wuffs_bmp__decoder__process_masks(self);
34454
          if (status.repr) {
34455
            goto suspend;
34456
          }
34457
        }
34458
      } else if (self->private_impl.f_bitmap_info_len >= 40u) {
34459
        v_n = (self->private_impl.f_bitmap_info_len - 40u);
34460
        self->private_data.s_do_decode_image_config.scratch = v_n;
34461
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(45);
34462
        if (self->private_data.s_do_decode_image_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
34463
          self->private_data.s_do_decode_image_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
34464
          iop_a_src = io2_a_src;
34465
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
34466
          goto suspend;
34467
        }
34468
        iop_a_src += self->private_data.s_do_decode_image_config.scratch;
34469
      } else {
34470
        status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file);
34471
        goto exit;
34472
      }
34473
    }
34474
    if (self->private_impl.f_compression != 3u) {
34475
      if (self->private_impl.f_bits_per_pixel < 16u) {
34476
        if (a_src) {
34477
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
34478
        }
34479
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(46);
34480
        status = wuffs_bmp__decoder__read_palette(self, a_src);
34481
        if (a_src) {
34482
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
34483
        }
34484
        if (status.repr) {
34485
          goto suspend;
34486
        }
34487
      }
34488
    }
34489
    if (self->private_impl.f_compression == 0u) {
34490
      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)) {
34491
        self->private_impl.f_src_pixfmt = 2198077448u;
34492
        self->private_impl.f_compression = 256u;
34493
      } else if (self->private_impl.f_bits_per_pixel == 8u) {
34494
        self->private_impl.f_src_pixfmt = 2198077448u;
34495
      } else if (self->private_impl.f_bits_per_pixel == 16u) {
34496
        self->private_impl.f_compression = 3u;
34497
        self->private_impl.f_channel_masks[0u] = 31u;
34498
        self->private_impl.f_channel_masks[1u] = 992u;
34499
        self->private_impl.f_channel_masks[2u] = 31744u;
34500
        self->private_impl.f_channel_masks[3u] = 0u;
34501
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(47);
34502
        status = wuffs_bmp__decoder__process_masks(self);
34503
        if (status.repr) {
34504
          goto suspend;
34505
        }
34506
        self->private_impl.f_src_pixfmt = 2164308923u;
34507
      } else if (self->private_impl.f_bits_per_pixel == 24u) {
34508
        self->private_impl.f_src_pixfmt = 2147485832u;
34509
      } else if (self->private_impl.f_bits_per_pixel == 32u) {
34510
        if (self->private_impl.f_channel_masks[3u] == 0u) {
34511
          self->private_impl.f_src_pixfmt = 2415954056u;
34512
        } else {
34513
          self->private_impl.f_src_pixfmt = 2164295816u;
34514
        }
34515
      } else {
34516
        status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file);
34517
        goto exit;
34518
      }
34519
    } else if (self->private_impl.f_compression == 1u) {
34520
      if (self->private_impl.f_bits_per_pixel == 8u) {
34521
        self->private_impl.f_src_pixfmt = 2198077448u;
34522
      } else {
34523
        status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file);
34524
        goto exit;
34525
      }
34526
    } else if (self->private_impl.f_compression == 2u) {
34527
      if (self->private_impl.f_bits_per_pixel == 4u) {
34528
        self->private_impl.f_src_pixfmt = 2198077448u;
34529
      } else {
34530
        status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file);
34531
        goto exit;
34532
      }
34533
    } else if (self->private_impl.f_compression == 3u) {
34534
      if ((self->private_impl.f_bits_per_pixel == 16u) || (self->private_impl.f_bits_per_pixel == 32u)) {
34535
        self->private_impl.f_src_pixfmt = 2164308923u;
34536
      } else {
34537
        status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file);
34538
        goto exit;
34539
      }
34540
    } else {
34541
      status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file);
34542
      goto exit;
34543
    }
34544
    if (((self->private_impl.f_bitmap_info_len < 40u) || (self->private_impl.f_bitmap_info_len == 64u)) &&
34545
        (self->private_impl.f_bits_per_pixel != 1u) &&
34546
        (self->private_impl.f_bits_per_pixel != 4u) &&
34547
        (self->private_impl.f_bits_per_pixel != 8u) &&
34548
        (self->private_impl.f_bits_per_pixel != 24u)) {
34549
      status = wuffs_base__make_status(wuffs_bmp__error__bad_header);
34550
      goto exit;
34551
    }
34552
    if (self->private_impl.f_bits_per_pixel == 1u) {
34553
      v_byte_width = ((self->private_impl.f_width >> 3u) + (((self->private_impl.f_width & 7u) + 7u) >> 3u));
34554
      self->private_impl.f_pad_per_row = ((4u - (v_byte_width & 3u)) & 3u);
34555
    } else if (self->private_impl.f_bits_per_pixel == 2u) {
34556
      v_byte_width = ((self->private_impl.f_width >> 2u) + (((self->private_impl.f_width & 3u) + 3u) >> 2u));
34557
      self->private_impl.f_pad_per_row = ((4u - (v_byte_width & 3u)) & 3u);
34558
    } else if (self->private_impl.f_bits_per_pixel == 4u) {
34559
      v_byte_width = ((self->private_impl.f_width >> 1u) + (self->private_impl.f_width & 1u));
34560
      self->private_impl.f_pad_per_row = ((4u - (v_byte_width & 3u)) & 3u);
34561
    } else if (self->private_impl.f_bits_per_pixel == 8u) {
34562
      self->private_impl.f_pad_per_row = ((4u - (self->private_impl.f_width & 3u)) & 3u);
34563
    } else if (self->private_impl.f_bits_per_pixel == 16u) {
34564
      self->private_impl.f_pad_per_row = ((self->private_impl.f_width & 1u) * 2u);
34565
    } else if (self->private_impl.f_bits_per_pixel == 24u) {
34566
      self->private_impl.f_pad_per_row = (self->private_impl.f_width & 3u);
34567
    } else if (self->private_impl.f_bits_per_pixel == 32u) {
34568
      self->private_impl.f_pad_per_row = 0u;
34569
    }
34570
    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)));
34571
    if (a_dst != NULL) {
34572
      v_dst_pixfmt = 2164295816u;
34573
      if ((self->private_impl.f_channel_num_bits[0u] > 8u) ||
34574
          (self->private_impl.f_channel_num_bits[1u] > 8u) ||
34575
          (self->private_impl.f_channel_num_bits[2u] > 8u) ||
34576
          (self->private_impl.f_channel_num_bits[3u] > 8u)) {
34577
        v_dst_pixfmt = 2164308923u;
34578
      } 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))) {
34579
        v_dst_pixfmt = 2415954056u;
34580
      }
34581
      wuffs_base__image_config__set(
34582
          a_dst,
34583
          v_dst_pixfmt,
34584
          0u,
34585
          self->private_impl.f_width,
34586
          self->private_impl.f_height,
34587
          self->private_impl.f_frame_config_io_position,
34588
          (self->private_impl.f_channel_masks[3u] == 0u));
34589
    }
34590
    self->private_impl.f_call_sequence = 32u;
34591
34592
    ok:
34593
    self->private_impl.p_do_decode_image_config = 0;
34594
    goto exit;
34595
  }
34596
34597
  goto suspend;
34598
  suspend:
34599
  self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
34600
34601
  goto exit;
34602
  exit:
34603
  if (a_src && a_src->data.ptr) {
34604
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
34605
  }
34606
34607
  return status;
34608
}
34609
34610
// -------- func bmp.decoder.decode_frame_config
34611
34612
WUFFS_BASE__GENERATED_C_CODE
34613
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
34614
wuffs_bmp__decoder__decode_frame_config(
34615
    wuffs_bmp__decoder* self,
34616
    wuffs_base__frame_config* a_dst,
34617
    wuffs_base__io_buffer* a_src) {
34618
  if (!self) {
34619
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
34620
  }
34621
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
34622
    return wuffs_base__make_status(
34623
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
34624
        ? wuffs_base__error__disabled_by_previous_error
34625
        : wuffs_base__error__initialize_not_called);
34626
  }
34627
  if (!a_src) {
34628
    self->private_impl.magic = WUFFS_BASE__DISABLED;
34629
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
34630
  }
34631
  if ((self->private_impl.active_coroutine != 0) &&
34632
      (self->private_impl.active_coroutine != 2)) {
34633
    self->private_impl.magic = WUFFS_BASE__DISABLED;
34634
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
34635
  }
34636
  self->private_impl.active_coroutine = 0;
34637
  wuffs_base__status status = wuffs_base__make_status(NULL);
34638
34639
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
34640
34641
  uint32_t coro_susp_point = self->private_impl.p_decode_frame_config;
34642
  switch (coro_susp_point) {
34643
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
34644
34645
    while (true) {
34646
      {
34647
        wuffs_base__status t_0 = wuffs_bmp__decoder__do_decode_frame_config(self, a_dst, a_src);
34648
        v_status = t_0;
34649
      }
34650
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
34651
        status = wuffs_base__make_status(wuffs_bmp__error__truncated_input);
34652
        goto exit;
34653
      }
34654
      status = v_status;
34655
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
34656
    }
34657
34658
    ok:
34659
    self->private_impl.p_decode_frame_config = 0;
34660
    goto exit;
34661
  }
34662
34663
  goto suspend;
34664
  suspend:
34665
  self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
34666
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0;
34667
34668
  goto exit;
34669
  exit:
34670
  if (wuffs_base__status__is_error(&status)) {
34671
    self->private_impl.magic = WUFFS_BASE__DISABLED;
34672
  }
34673
  return status;
34674
}
34675
34676
// -------- func bmp.decoder.do_decode_frame_config
34677
34678
WUFFS_BASE__GENERATED_C_CODE
34679
static wuffs_base__status
34680
wuffs_bmp__decoder__do_decode_frame_config(
34681
    wuffs_bmp__decoder* self,
34682
    wuffs_base__frame_config* a_dst,
34683
    wuffs_base__io_buffer* a_src) {
34684
  wuffs_base__status status = wuffs_base__make_status(NULL);
34685
34686
  wuffs_base__pixel_format v_pixfmt = {0};
34687
34688
  const uint8_t* iop_a_src = NULL;
34689
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
34690
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
34691
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
34692
  if (a_src && a_src->data.ptr) {
34693
    io0_a_src = a_src->data.ptr;
34694
    io1_a_src = io0_a_src + a_src->meta.ri;
34695
    iop_a_src = io1_a_src;
34696
    io2_a_src = io0_a_src + a_src->meta.wi;
34697
  }
34698
34699
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config;
34700
  switch (coro_susp_point) {
34701
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
34702
34703
    if (self->private_impl.f_call_sequence == 32u) {
34704
    } else if (self->private_impl.f_call_sequence < 32u) {
34705
      if (a_src) {
34706
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
34707
      }
34708
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
34709
      status = wuffs_bmp__decoder__do_decode_image_config(self, NULL, a_src);
34710
      if (a_src) {
34711
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
34712
      }
34713
      if (status.repr) {
34714
        goto suspend;
34715
      }
34716
    } else if (self->private_impl.f_call_sequence == 40u) {
34717
      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)))) {
34718
        status = wuffs_base__make_status(wuffs_base__error__bad_restart);
34719
        goto exit;
34720
      }
34721
    } else if (self->private_impl.f_call_sequence == 64u) {
34722
      self->private_impl.f_call_sequence = 96u;
34723
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
34724
      goto ok;
34725
    } else {
34726
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
34727
      goto ok;
34728
    }
34729
    if (a_dst != NULL) {
34730
      v_pixfmt = wuffs_base__utility__make_pixel_format(self->private_impl.f_src_pixfmt);
34731
      wuffs_base__frame_config__set(
34732
          a_dst,
34733
          wuffs_base__utility__make_rect_ie_u32(
34734
          0u,
34735
          0u,
34736
          self->private_impl.f_width,
34737
          self->private_impl.f_height),
34738
          ((wuffs_base__flicks)(0u)),
34739
          0u,
34740
          self->private_impl.f_frame_config_io_position,
34741
          0u,
34742
          true,
34743
          false,
34744
          wuffs_base__pixel_format__default_background_color(&v_pixfmt));
34745
    }
34746
    self->private_impl.f_call_sequence = 64u;
34747
34748
    ok:
34749
    self->private_impl.p_do_decode_frame_config = 0;
34750
    goto exit;
34751
  }
34752
34753
  goto suspend;
34754
  suspend:
34755
  self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
34756
34757
  goto exit;
34758
  exit:
34759
  if (a_src && a_src->data.ptr) {
34760
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
34761
  }
34762
34763
  return status;
34764
}
34765
34766
// -------- func bmp.decoder.decode_frame
34767
34768
WUFFS_BASE__GENERATED_C_CODE
34769
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
34770
wuffs_bmp__decoder__decode_frame(
34771
    wuffs_bmp__decoder* self,
34772
    wuffs_base__pixel_buffer* a_dst,
34773
    wuffs_base__io_buffer* a_src,
34774
    wuffs_base__pixel_blend a_blend,
34775
    wuffs_base__slice_u8 a_workbuf,
34776
    wuffs_base__decode_frame_options* a_opts) {
34777
  if (!self) {
34778
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
34779
  }
34780
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
34781
    return wuffs_base__make_status(
34782
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
34783
        ? wuffs_base__error__disabled_by_previous_error
34784
        : wuffs_base__error__initialize_not_called);
34785
  }
34786
  if (!a_dst || !a_src) {
34787
    self->private_impl.magic = WUFFS_BASE__DISABLED;
34788
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
34789
  }
34790
  if ((self->private_impl.active_coroutine != 0) &&
34791
      (self->private_impl.active_coroutine != 3)) {
34792
    self->private_impl.magic = WUFFS_BASE__DISABLED;
34793
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
34794
  }
34795
  self->private_impl.active_coroutine = 0;
34796
  wuffs_base__status status = wuffs_base__make_status(NULL);
34797
34798
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
34799
34800
  uint32_t coro_susp_point = self->private_impl.p_decode_frame;
34801
  switch (coro_susp_point) {
34802
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
34803
34804
    while (true) {
34805
      {
34806
        wuffs_base__status t_0 = wuffs_bmp__decoder__do_decode_frame(self,
34807
            a_dst,
34808
            a_src,
34809
            a_blend,
34810
            a_workbuf,
34811
            a_opts);
34812
        v_status = t_0;
34813
      }
34814
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
34815
        status = wuffs_base__make_status(wuffs_bmp__error__truncated_input);
34816
        goto exit;
34817
      }
34818
      status = v_status;
34819
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
34820
    }
34821
34822
    ok:
34823
    self->private_impl.p_decode_frame = 0;
34824
    goto exit;
34825
  }
34826
34827
  goto suspend;
34828
  suspend:
34829
  self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
34830
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0;
34831
34832
  goto exit;
34833
  exit:
34834
  if (wuffs_base__status__is_error(&status)) {
34835
    self->private_impl.magic = WUFFS_BASE__DISABLED;
34836
  }
34837
  return status;
34838
}
34839
34840
// -------- func bmp.decoder.do_decode_frame
34841
34842
WUFFS_BASE__GENERATED_C_CODE
34843
static wuffs_base__status
34844
wuffs_bmp__decoder__do_decode_frame(
34845
    wuffs_bmp__decoder* self,
34846
    wuffs_base__pixel_buffer* a_dst,
34847
    wuffs_base__io_buffer* a_src,
34848
    wuffs_base__pixel_blend a_blend,
34849
    wuffs_base__slice_u8 a_workbuf,
34850
    wuffs_base__decode_frame_options* a_opts) {
34851
  wuffs_base__status status = wuffs_base__make_status(NULL);
34852
34853
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
34854
34855
  const uint8_t* iop_a_src = NULL;
34856
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
34857
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
34858
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
34859
  if (a_src && a_src->data.ptr) {
34860
    io0_a_src = a_src->data.ptr;
34861
    io1_a_src = io0_a_src + a_src->meta.ri;
34862
    iop_a_src = io1_a_src;
34863
    io2_a_src = io0_a_src + a_src->meta.wi;
34864
  }
34865
34866
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame;
34867
  switch (coro_susp_point) {
34868
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
34869
34870
    if (self->private_impl.f_call_sequence == 64u) {
34871
    } else if (self->private_impl.f_call_sequence < 64u) {
34872
      if (a_src) {
34873
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
34874
      }
34875
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
34876
      status = wuffs_bmp__decoder__do_decode_frame_config(self, NULL, a_src);
34877
      if (a_src) {
34878
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
34879
      }
34880
      if (status.repr) {
34881
        goto suspend;
34882
      }
34883
    } else {
34884
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
34885
      goto ok;
34886
    }
34887
    self->private_data.s_do_decode_frame.scratch = self->private_impl.f_padding;
34888
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
34889
    if (self->private_data.s_do_decode_frame.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
34890
      self->private_data.s_do_decode_frame.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
34891
      iop_a_src = io2_a_src;
34892
      status = wuffs_base__make_status(wuffs_base__suspension__short_read);
34893
      goto suspend;
34894
    }
34895
    iop_a_src += self->private_data.s_do_decode_frame.scratch;
34896
    if ((self->private_impl.f_width > 0u) && (self->private_impl.f_height > 0u)) {
34897
      self->private_impl.f_dst_x = 0u;
34898
      if (self->private_impl.f_top_down) {
34899
        self->private_impl.f_dst_y = 0u;
34900
        self->private_impl.f_dst_y_inc = 1u;
34901
      } else {
34902
        self->private_impl.f_dst_y = ((uint32_t)(self->private_impl.f_height - 1u));
34903
        self->private_impl.f_dst_y_inc = 4294967295u;
34904
      }
34905
      v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler,
34906
          wuffs_base__pixel_buffer__pixel_format(a_dst),
34907
          wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_scratch, 1024, 2048)),
34908
          wuffs_base__utility__make_pixel_format(self->private_impl.f_src_pixfmt),
34909
          wuffs_base__make_slice_u8(self->private_data.f_src_palette, 1024),
34910
          a_blend);
34911
      if ( ! wuffs_base__status__is_ok(&v_status)) {
34912
        status = v_status;
34913
        if (wuffs_base__status__is_error(&status)) {
34914
          goto exit;
34915
        } else if (wuffs_base__status__is_suspension(&status)) {
34916
          status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
34917
          goto exit;
34918
        }
34919
        goto ok;
34920
      }
34921
      while (true) {
34922
        if (self->private_impl.f_compression == 0u) {
34923
          if (a_src) {
34924
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
34925
          }
34926
          v_status = wuffs_bmp__decoder__swizzle_none(self, a_dst, a_src);
34927
          if (a_src) {
34928
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
34929
          }
34930
        } else if (self->private_impl.f_compression < 3u) {
34931
          if (a_src) {
34932
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
34933
          }
34934
          v_status = wuffs_bmp__decoder__swizzle_rle(self, a_dst, a_src);
34935
          if (a_src) {
34936
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
34937
          }
34938
        } else if (self->private_impl.f_compression == 3u) {
34939
          if (a_src) {
34940
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
34941
          }
34942
          v_status = wuffs_bmp__decoder__swizzle_bitfields(self, a_dst, a_src);
34943
          if (a_src) {
34944
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
34945
          }
34946
        } else {
34947
          if (a_src) {
34948
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
34949
          }
34950
          v_status = wuffs_bmp__decoder__swizzle_low_bit_depth(self, a_dst, a_src);
34951
          if (a_src) {
34952
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
34953
          }
34954
        }
34955
        if (wuffs_base__status__is_ok(&v_status)) {
34956
          break;
34957
        } else if (v_status.repr != wuffs_bmp__note__internal_note_short_read) {
34958
          status = v_status;
34959
          if (wuffs_base__status__is_error(&status)) {
34960
            goto exit;
34961
          } else if (wuffs_base__status__is_suspension(&status)) {
34962
            status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
34963
            goto exit;
34964
          }
34965
          goto ok;
34966
        }
34967
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
34968
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3);
34969
      }
34970
      self->private_data.s_do_decode_frame.scratch = self->private_impl.f_pending_pad;
34971
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
34972
      if (self->private_data.s_do_decode_frame.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
34973
        self->private_data.s_do_decode_frame.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
34974
        iop_a_src = io2_a_src;
34975
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
34976
        goto suspend;
34977
      }
34978
      iop_a_src += self->private_data.s_do_decode_frame.scratch;
34979
      self->private_impl.f_pending_pad = 0u;
34980
    }
34981
    self->private_impl.f_call_sequence = 96u;
34982
34983
    ok:
34984
    self->private_impl.p_do_decode_frame = 0;
34985
    goto exit;
34986
  }
34987
34988
  goto suspend;
34989
  suspend:
34990
  self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
34991
34992
  goto exit;
34993
  exit:
34994
  if (a_src && a_src->data.ptr) {
34995
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
34996
  }
34997
34998
  return status;
34999
}
35000
35001
// -------- func bmp.decoder.swizzle_none
35002
35003
WUFFS_BASE__GENERATED_C_CODE
35004
static wuffs_base__status
35005
wuffs_bmp__decoder__swizzle_none(
35006
    wuffs_bmp__decoder* self,
35007
    wuffs_base__pixel_buffer* a_dst,
35008
    wuffs_base__io_buffer* a_src) {
35009
  wuffs_base__status status = wuffs_base__make_status(NULL);
35010
35011
  wuffs_base__pixel_format v_dst_pixfmt = {0};
35012
  uint32_t v_dst_bits_per_pixel = 0;
35013
  uint32_t v_dst_bytes_per_pixel = 0;
35014
  uint64_t v_dst_bytes_per_row = 0;
35015
  uint32_t v_src_bytes_per_pixel = 0;
35016
  wuffs_base__slice_u8 v_dst_palette = {0};
35017
  wuffs_base__table_u8 v_tab = {0};
35018
  wuffs_base__slice_u8 v_dst = {0};
35019
  uint64_t v_i = 0;
35020
  uint64_t v_j = 0;
35021
  uint64_t v_n = 0;
35022
35023
  const uint8_t* iop_a_src = NULL;
35024
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
35025
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
35026
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
35027
  if (a_src && a_src->data.ptr) {
35028
    io0_a_src = a_src->data.ptr;
35029
    io1_a_src = io0_a_src + a_src->meta.ri;
35030
    iop_a_src = io1_a_src;
35031
    io2_a_src = io0_a_src + a_src->meta.wi;
35032
  }
35033
35034
  v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
35035
  v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
35036
  if ((v_dst_bits_per_pixel & 7u) != 0u) {
35037
    status = wuffs_base__make_status(wuffs_base__error__unsupported_option);
35038
    goto exit;
35039
  }
35040
  v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u);
35041
  v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel)));
35042
  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));
35043
  v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
35044
  label__outer__continue:;
35045
  while (true) {
35046
    while (self->private_impl.f_pending_pad > 0u) {
35047
      if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
35048
        status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read);
35049
        goto ok;
35050
      }
35051
      self->private_impl.f_pending_pad -= 1u;
35052
      iop_a_src += 1u;
35053
    }
35054
    while (true) {
35055
      if (self->private_impl.f_dst_x == self->private_impl.f_width) {
35056
        self->private_impl.f_dst_x = 0u;
35057
        self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc;
35058
        if (self->private_impl.f_dst_y >= self->private_impl.f_height) {
35059
          if (self->private_impl.f_height > 0u) {
35060
            self->private_impl.f_pending_pad = self->private_impl.f_pad_per_row;
35061
          }
35062
          goto label__outer__break;
35063
        } else if (self->private_impl.f_pad_per_row != 0u) {
35064
          self->private_impl.f_pending_pad = self->private_impl.f_pad_per_row;
35065
          goto label__outer__continue;
35066
        }
35067
      }
35068
      v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y);
35069
      if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) {
35070
        v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row);
35071
      }
35072
      v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel)));
35073
      if (v_i >= ((uint64_t)(v_dst.len))) {
35074
        if (self->private_impl.f_bits_per_pixel > 32u) {
35075
          status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file);
35076
          goto exit;
35077
        }
35078
        v_src_bytes_per_pixel = (self->private_impl.f_bits_per_pixel / 8u);
35079
        if (v_src_bytes_per_pixel == 0u) {
35080
          status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file);
35081
          goto exit;
35082
        }
35083
        v_n = (((uint64_t)(io2_a_src - iop_a_src)) / ((uint64_t)(v_src_bytes_per_pixel)));
35084
        v_n = wuffs_base__u64__min(v_n, ((uint64_t)(((uint32_t)(self->private_impl.f_width - self->private_impl.f_dst_x)))));
35085
        v_j = v_n;
35086
        while (v_j >= 8u) {
35087
          if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 8u)))) {
35088
            iop_a_src += (v_src_bytes_per_pixel * 8u);
35089
          }
35090
          v_j -= 8u;
35091
        }
35092
        while (v_j > 0u) {
35093
          if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 1u)))) {
35094
            iop_a_src += (v_src_bytes_per_pixel * 1u);
35095
          }
35096
          v_j -= 1u;
35097
        }
35098
      } else {
35099
        v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_reader(
35100
            &self->private_impl.f_swizzler,
35101
            wuffs_base__slice_u8__subslice_i(v_dst, v_i),
35102
            v_dst_palette,
35103
            &iop_a_src,
35104
            io2_a_src);
35105
      }
35106
      if (v_n == 0u) {
35107
        status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read);
35108
        goto ok;
35109
      }
35110
      wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n)));
35111
    }
35112
  }
35113
  label__outer__break:;
35114
  status = wuffs_base__make_status(NULL);
35115
  goto ok;
35116
35117
  ok:
35118
  goto exit;
35119
  exit:
35120
  if (a_src && a_src->data.ptr) {
35121
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
35122
  }
35123
35124
  return status;
35125
}
35126
35127
// -------- func bmp.decoder.swizzle_rle
35128
35129
WUFFS_BASE__GENERATED_C_CODE
35130
static wuffs_base__status
35131
wuffs_bmp__decoder__swizzle_rle(
35132
    wuffs_bmp__decoder* self,
35133
    wuffs_base__pixel_buffer* a_dst,
35134
    wuffs_base__io_buffer* a_src) {
35135
  wuffs_base__status status = wuffs_base__make_status(NULL);
35136
35137
  wuffs_base__pixel_format v_dst_pixfmt = {0};
35138
  uint32_t v_dst_bits_per_pixel = 0;
35139
  uint32_t v_dst_bytes_per_pixel = 0;
35140
  uint64_t v_dst_bytes_per_row = 0;
35141
  wuffs_base__slice_u8 v_dst_palette = {0};
35142
  wuffs_base__table_u8 v_tab = {0};
35143
  wuffs_base__slice_u8 v_row = {0};
35144
  wuffs_base__slice_u8 v_dst = {0};
35145
  uint64_t v_i = 0;
35146
  uint64_t v_n = 0;
35147
  uint32_t v_p0 = 0;
35148
  uint8_t v_code = 0;
35149
  uint8_t v_indexes[2] = {0};
35150
  uint32_t v_rle_state = 0;
35151
  uint32_t v_chunk_bits = 0;
35152
  uint32_t v_chunk_count = 0;
35153
35154
  const uint8_t* iop_a_src = NULL;
35155
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
35156
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
35157
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
35158
  if (a_src && a_src->data.ptr) {
35159
    io0_a_src = a_src->data.ptr;
35160
    io1_a_src = io0_a_src + a_src->meta.ri;
35161
    iop_a_src = io1_a_src;
35162
    io2_a_src = io0_a_src + a_src->meta.wi;
35163
  }
35164
35165
  v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
35166
  v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
35167
  if ((v_dst_bits_per_pixel & 7u) != 0u) {
35168
    status = wuffs_base__make_status(wuffs_base__error__unsupported_option);
35169
    goto exit;
35170
  }
35171
  v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u);
35172
  v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel)));
35173
  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));
35174
  v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
35175
  v_rle_state = self->private_impl.f_rle_state;
35176
  label__outer__continue:;
35177
  while (true) {
35178
    v_row = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y);
35179
    if (v_dst_bytes_per_row < ((uint64_t)(v_row.len))) {
35180
      v_row = wuffs_base__slice_u8__subslice_j(v_row, v_dst_bytes_per_row);
35181
    }
35182
    label__middle__continue:;
35183
    while (true) {
35184
      v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel)));
35185
      if (v_i <= ((uint64_t)(v_row.len))) {
35186
        v_dst = wuffs_base__slice_u8__subslice_i(v_row, v_i);
35187
      } else {
35188
        v_dst = wuffs_base__utility__empty_slice_u8();
35189
      }
35190
      while (true) {
35191
        if (v_rle_state == 0u) {
35192
          if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) {
35193
            break;
35194
          }
35195
          v_code = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
35196
          iop_a_src += 1u;
35197
          if (v_code == 0u) {
35198
            v_rle_state = 2u;
35199
            continue;
35200
          }
35201
          self->private_impl.f_rle_length = ((uint32_t)(v_code));
35202
          v_rle_state = 1u;
35203
          continue;
35204
        } else if (v_rle_state == 1u) {
35205
          if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) {
35206
            break;
35207
          }
35208
          v_code = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
35209
          iop_a_src += 1u;
35210
          if (self->private_impl.f_bits_per_pixel == 8u) {
35211
            v_p0 = 0u;
35212
            while (v_p0 < self->private_impl.f_rle_length) {
35213
              self->private_data.f_scratch[v_p0] = v_code;
35214
              v_p0 += 1u;
35215
            }
35216
          } else {
35217
            v_indexes[0u] = ((uint8_t)(((uint8_t)(v_code >> 4u))));
35218
            v_indexes[1u] = ((uint8_t)(v_code & 15u));
35219
            v_p0 = 0u;
35220
            while (v_p0 < self->private_impl.f_rle_length) {
35221
              self->private_data.f_scratch[(v_p0 + 0u)] = v_indexes[0u];
35222
              self->private_data.f_scratch[(v_p0 + 1u)] = v_indexes[1u];
35223
              v_p0 += 2u;
35224
            }
35225
          }
35226
          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));
35227
          wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, self->private_impl.f_rle_length);
35228
          v_rle_state = 0u;
35229
          goto label__middle__continue;
35230
        } else if (v_rle_state == 2u) {
35231
          if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) {
35232
            break;
35233
          }
35234
          v_code = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
35235
          iop_a_src += 1u;
35236
          if (v_code < 2u) {
35237
            if ((self->private_impl.f_dst_y >= self->private_impl.f_height) && (v_code == 0u)) {
35238
              status = wuffs_base__make_status(wuffs_bmp__error__bad_rle_compression);
35239
              goto exit;
35240
            }
35241
            wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(&self->private_impl.f_swizzler, v_dst, v_dst_palette, 18446744073709551615u);
35242
            self->private_impl.f_dst_x = 0u;
35243
            self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc;
35244
            if (v_code > 0u) {
35245
              goto label__outer__break;
35246
            }
35247
            v_rle_state = 0u;
35248
            goto label__outer__continue;
35249
          } else if (v_code == 2u) {
35250
            v_rle_state = 4u;
35251
            continue;
35252
          }
35253
          self->private_impl.f_rle_length = ((uint32_t)(v_code));
35254
          self->private_impl.f_rle_padded = ((self->private_impl.f_bits_per_pixel == 8u) && (((uint8_t)(v_code & 1u)) != 0u));
35255
          v_rle_state = 3u;
35256
          continue;
35257
        } else if (v_rle_state == 3u) {
35258
          if (self->private_impl.f_bits_per_pixel == 8u) {
35259
            v_n = wuffs_base__pixel_swizzler__limited_swizzle_u32_interleaved_from_reader(
35260
                &self->private_impl.f_swizzler,
35261
                self->private_impl.f_rle_length,
35262
                v_dst,
35263
                v_dst_palette,
35264
                &iop_a_src,
35265
                io2_a_src);
35266
            wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n)));
35267
            wuffs_private_impl__u32__sat_sub_indirect(&self->private_impl.f_rle_length, ((uint32_t)(v_n)));
35268
          } else {
35269
            v_chunk_count = ((self->private_impl.f_rle_length + 3u) / 4u);
35270
            v_p0 = 0u;
35271
            while ((v_chunk_count > 0u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 2u)) {
35272
              v_chunk_bits = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src)));
35273
              iop_a_src += 2u;
35274
              self->private_data.f_scratch[(v_p0 + 0u)] = ((uint8_t)((15u & (v_chunk_bits >> 12u))));
35275
              self->private_data.f_scratch[(v_p0 + 1u)] = ((uint8_t)((15u & (v_chunk_bits >> 8u))));
35276
              self->private_data.f_scratch[(v_p0 + 2u)] = ((uint8_t)((15u & (v_chunk_bits >> 4u))));
35277
              self->private_data.f_scratch[(v_p0 + 3u)] = ((uint8_t)((15u & (v_chunk_bits >> 0u))));
35278
              v_p0 = ((v_p0 & 255u) + 4u);
35279
              v_chunk_count -= 1u;
35280
            }
35281
            v_p0 = wuffs_base__u32__min(v_p0, self->private_impl.f_rle_length);
35282
            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));
35283
            wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, v_p0);
35284
            wuffs_private_impl__u32__sat_sub_indirect(&self->private_impl.f_rle_length, v_p0);
35285
          }
35286
          if (self->private_impl.f_rle_length > 0u) {
35287
            break;
35288
          }
35289
          if (self->private_impl.f_rle_padded) {
35290
            if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) {
35291
              break;
35292
            }
35293
            iop_a_src += 1u;
35294
            self->private_impl.f_rle_padded = false;
35295
          }
35296
          v_rle_state = 0u;
35297
          goto label__middle__continue;
35298
        } else if (v_rle_state == 4u) {
35299
          if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) {
35300
            break;
35301
          }
35302
          self->private_impl.f_rle_delta_x = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
35303
          iop_a_src += 1u;
35304
          v_rle_state = 5u;
35305
          continue;
35306
        }
35307
        if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) {
35308
          break;
35309
        }
35310
        v_code = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
35311
        iop_a_src += 1u;
35312
        if (self->private_impl.f_rle_delta_x > 0u) {
35313
          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)));
35314
          wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(self->private_impl.f_rle_delta_x)));
35315
          self->private_impl.f_rle_delta_x = 0u;
35316
          if (self->private_impl.f_dst_x > self->private_impl.f_width) {
35317
            status = wuffs_base__make_status(wuffs_bmp__error__bad_rle_compression);
35318
            goto exit;
35319
          }
35320
        }
35321
        if (v_code > 0u) {
35322
#if defined(__GNUC__)
35323
#pragma GCC diagnostic push
35324
#pragma GCC diagnostic ignored "-Wconversion"
35325
#endif
35326
          v_code -= 1u;
35327
#if defined(__GNUC__)
35328
#pragma GCC diagnostic pop
35329
#endif
35330
          while (true) {
35331
            self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc;
35332
            if (self->private_impl.f_dst_y >= self->private_impl.f_height) {
35333
              status = wuffs_base__make_status(wuffs_bmp__error__bad_rle_compression);
35334
              goto exit;
35335
            }
35336
            v_row = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y);
35337
            if (v_dst_bytes_per_row < ((uint64_t)(v_row.len))) {
35338
              v_row = wuffs_base__slice_u8__subslice_j(v_row, v_dst_bytes_per_row);
35339
            }
35340
            if (v_code <= 0u) {
35341
              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)));
35342
              break;
35343
            }
35344
            wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(&self->private_impl.f_swizzler, v_row, v_dst_palette, 18446744073709551615u);
35345
#if defined(__GNUC__)
35346
#pragma GCC diagnostic push
35347
#pragma GCC diagnostic ignored "-Wconversion"
35348
#endif
35349
            v_code -= 1u;
35350
#if defined(__GNUC__)
35351
#pragma GCC diagnostic pop
35352
#endif
35353
          }
35354
        }
35355
        v_rle_state = 0u;
35356
        goto label__middle__continue;
35357
      }
35358
      self->private_impl.f_rle_state = v_rle_state;
35359
      status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read);
35360
      goto ok;
35361
    }
35362
  }
35363
  label__outer__break:;
35364
  while (self->private_impl.f_dst_y < self->private_impl.f_height) {
35365
    v_row = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y);
35366
    if (v_dst_bytes_per_row < ((uint64_t)(v_row.len))) {
35367
      v_row = wuffs_base__slice_u8__subslice_j(v_row, v_dst_bytes_per_row);
35368
    }
35369
    wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(&self->private_impl.f_swizzler, v_row, v_dst_palette, 18446744073709551615u);
35370
    self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc;
35371
  }
35372
  status = wuffs_base__make_status(NULL);
35373
  goto ok;
35374
35375
  ok:
35376
  goto exit;
35377
  exit:
35378
  if (a_src && a_src->data.ptr) {
35379
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
35380
  }
35381
35382
  return status;
35383
}
35384
35385
// -------- func bmp.decoder.swizzle_bitfields
35386
35387
WUFFS_BASE__GENERATED_C_CODE
35388
static wuffs_base__status
35389
wuffs_bmp__decoder__swizzle_bitfields(
35390
    wuffs_bmp__decoder* self,
35391
    wuffs_base__pixel_buffer* a_dst,
35392
    wuffs_base__io_buffer* a_src) {
35393
  wuffs_base__status status = wuffs_base__make_status(NULL);
35394
35395
  wuffs_base__pixel_format v_dst_pixfmt = {0};
35396
  uint32_t v_dst_bits_per_pixel = 0;
35397
  uint32_t v_dst_bytes_per_pixel = 0;
35398
  uint64_t v_dst_bytes_per_row = 0;
35399
  wuffs_base__slice_u8 v_dst_palette = {0};
35400
  wuffs_base__table_u8 v_tab = {0};
35401
  wuffs_base__slice_u8 v_dst = {0};
35402
  uint64_t v_i = 0;
35403
  uint64_t v_n = 0;
35404
  uint32_t v_p0 = 0;
35405
  uint32_t v_p1 = 0;
35406
  uint32_t v_p1_temp = 0;
35407
  uint32_t v_num_bits = 0;
35408
  uint32_t v_c = 0;
35409
  uint32_t v_c32 = 0;
35410
  uint32_t v_channel = 0;
35411
35412
  const uint8_t* iop_a_src = NULL;
35413
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
35414
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
35415
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
35416
  if (a_src && a_src->data.ptr) {
35417
    io0_a_src = a_src->data.ptr;
35418
    io1_a_src = io0_a_src + a_src->meta.ri;
35419
    iop_a_src = io1_a_src;
35420
    io2_a_src = io0_a_src + a_src->meta.wi;
35421
  }
35422
35423
  v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
35424
  v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
35425
  if ((v_dst_bits_per_pixel & 7u) != 0u) {
35426
    status = wuffs_base__make_status(wuffs_base__error__unsupported_option);
35427
    goto exit;
35428
  }
35429
  v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u);
35430
  v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel)));
35431
  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));
35432
  v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
35433
  label__outer__continue:;
35434
  while (true) {
35435
    while (self->private_impl.f_pending_pad > 0u) {
35436
      if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
35437
        status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read);
35438
        goto ok;
35439
      }
35440
      self->private_impl.f_pending_pad -= 1u;
35441
      iop_a_src += 1u;
35442
    }
35443
    while (true) {
35444
      if (self->private_impl.f_dst_x == self->private_impl.f_width) {
35445
        self->private_impl.f_dst_x = 0u;
35446
        self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc;
35447
        if (self->private_impl.f_dst_y >= self->private_impl.f_height) {
35448
          if (self->private_impl.f_height > 0u) {
35449
            self->private_impl.f_pending_pad = self->private_impl.f_pad_per_row;
35450
          }
35451
          goto label__outer__break;
35452
        } else if (self->private_impl.f_pad_per_row != 0u) {
35453
          self->private_impl.f_pending_pad = self->private_impl.f_pad_per_row;
35454
          goto label__outer__continue;
35455
        }
35456
      }
35457
      v_p1_temp = ((uint32_t)(self->private_impl.f_width - self->private_impl.f_dst_x));
35458
      v_p1 = wuffs_base__u32__min(v_p1_temp, 256u);
35459
      v_p0 = 0u;
35460
      while (v_p0 < v_p1) {
35461
        if (self->private_impl.f_bits_per_pixel == 16u) {
35462
          if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) {
35463
            break;
35464
          }
35465
          v_c32 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
35466
          iop_a_src += 2u;
35467
        } else {
35468
          if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) {
35469
            break;
35470
          }
35471
          v_c32 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
35472
          iop_a_src += 4u;
35473
        }
35474
        v_channel = 0u;
35475
        while (v_channel < 4u) {
35476
          if (self->private_impl.f_channel_num_bits[v_channel] == 0u) {
35477
            self->private_data.f_scratch[((8u * v_p0) + (2u * v_channel) + 0u)] = 255u;
35478
            self->private_data.f_scratch[((8u * v_p0) + (2u * v_channel) + 1u)] = 255u;
35479
          } else {
35480
            v_c = ((v_c32 & self->private_impl.f_channel_masks[v_channel]) >> self->private_impl.f_channel_shifts[v_channel]);
35481
            v_num_bits = ((uint32_t)(self->private_impl.f_channel_num_bits[v_channel]));
35482
            while (v_num_bits < 16u) {
35483
              v_c |= ((uint32_t)(v_c << v_num_bits));
35484
              v_num_bits *= 2u;
35485
            }
35486
            v_c >>= (v_num_bits - 16u);
35487
            self->private_data.f_scratch[((8u * v_p0) + (2u * v_channel) + 0u)] = ((uint8_t)((v_c >> 0u)));
35488
            self->private_data.f_scratch[((8u * v_p0) + (2u * v_channel) + 1u)] = ((uint8_t)((v_c >> 8u)));
35489
          }
35490
          v_channel += 1u;
35491
        }
35492
        v_p0 += 1u;
35493
      }
35494
      v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y);
35495
      if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) {
35496
        v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row);
35497
      }
35498
      v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel)));
35499
      if (v_i >= ((uint64_t)(v_dst.len))) {
35500
        v_n = ((uint64_t)(v_p0));
35501
      } else {
35502
        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)));
35503
      }
35504
      if (v_n == 0u) {
35505
        status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read);
35506
        goto ok;
35507
      }
35508
      wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n)));
35509
    }
35510
  }
35511
  label__outer__break:;
35512
  status = wuffs_base__make_status(NULL);
35513
  goto ok;
35514
35515
  ok:
35516
  goto exit;
35517
  exit:
35518
  if (a_src && a_src->data.ptr) {
35519
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
35520
  }
35521
35522
  return status;
35523
}
35524
35525
// -------- func bmp.decoder.swizzle_low_bit_depth
35526
35527
WUFFS_BASE__GENERATED_C_CODE
35528
static wuffs_base__status
35529
wuffs_bmp__decoder__swizzle_low_bit_depth(
35530
    wuffs_bmp__decoder* self,
35531
    wuffs_base__pixel_buffer* 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_dst_pixfmt = {0};
35536
  uint32_t v_dst_bits_per_pixel = 0;
35537
  uint32_t v_dst_bytes_per_pixel = 0;
35538
  uint64_t v_dst_bytes_per_row = 0;
35539
  wuffs_base__slice_u8 v_dst_palette = {0};
35540
  wuffs_base__table_u8 v_tab = {0};
35541
  wuffs_base__slice_u8 v_dst = {0};
35542
  uint64_t v_i = 0;
35543
  uint64_t v_n = 0;
35544
  uint32_t v_p0 = 0;
35545
  uint32_t v_chunk_bits = 0;
35546
  uint32_t v_chunk_count = 0;
35547
  uint32_t v_pixels_per_chunk = 0;
35548
35549
  const uint8_t* iop_a_src = NULL;
35550
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
35551
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
35552
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
35553
  if (a_src && a_src->data.ptr) {
35554
    io0_a_src = a_src->data.ptr;
35555
    io1_a_src = io0_a_src + a_src->meta.ri;
35556
    iop_a_src = io1_a_src;
35557
    io2_a_src = io0_a_src + a_src->meta.wi;
35558
  }
35559
35560
  v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
35561
  v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
35562
  if ((v_dst_bits_per_pixel & 7u) != 0u) {
35563
    status = wuffs_base__make_status(wuffs_base__error__unsupported_option);
35564
    goto exit;
35565
  }
35566
  v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u);
35567
  v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel)));
35568
  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));
35569
  v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
35570
  while (true) {
35571
    if (self->private_impl.f_dst_x == self->private_impl.f_width) {
35572
      self->private_impl.f_dst_x = 0u;
35573
      self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc;
35574
      if (self->private_impl.f_dst_y >= self->private_impl.f_height) {
35575
        break;
35576
      }
35577
    }
35578
    v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y);
35579
    if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) {
35580
      v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row);
35581
    }
35582
    v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel)));
35583
    if (v_i >= ((uint64_t)(v_dst.len))) {
35584
      if (self->private_impl.f_bits_per_pixel == 1u) {
35585
        v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 31u) / 32u);
35586
        v_pixels_per_chunk = 32u;
35587
      } else if (self->private_impl.f_bits_per_pixel == 2u) {
35588
        v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 15u) / 16u);
35589
        v_pixels_per_chunk = 16u;
35590
      } else {
35591
        v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 7u) / 8u);
35592
        v_pixels_per_chunk = 8u;
35593
      }
35594
      while ((v_chunk_count >= 64u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 256u)) {
35595
        iop_a_src += 256u;
35596
        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))));
35597
        v_chunk_count -= 64u;
35598
      }
35599
      while ((v_chunk_count >= 8u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 32u)) {
35600
        iop_a_src += 32u;
35601
        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))));
35602
        v_chunk_count -= 8u;
35603
      }
35604
      while (v_chunk_count > 0u) {
35605
        if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) {
35606
          status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read);
35607
          goto ok;
35608
        }
35609
        iop_a_src += 4u;
35610
        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))));
35611
        v_chunk_count -= 1u;
35612
      }
35613
      continue;
35614
    }
35615
    v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_i);
35616
    v_p0 = 0u;
35617
    if (self->private_impl.f_bits_per_pixel == 1u) {
35618
      v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 31u) / 32u);
35619
      v_chunk_count = wuffs_base__u32__min(v_chunk_count, 16u);
35620
      while ((v_chunk_count > 0u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 4u)) {
35621
        v_chunk_bits = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
35622
        iop_a_src += 4u;
35623
        self->private_data.f_scratch[(v_p0 + 0u)] = ((uint8_t)((1u & (v_chunk_bits >> 31u))));
35624
        self->private_data.f_scratch[(v_p0 + 1u)] = ((uint8_t)((1u & (v_chunk_bits >> 30u))));
35625
        self->private_data.f_scratch[(v_p0 + 2u)] = ((uint8_t)((1u & (v_chunk_bits >> 29u))));
35626
        self->private_data.f_scratch[(v_p0 + 3u)] = ((uint8_t)((1u & (v_chunk_bits >> 28u))));
35627
        self->private_data.f_scratch[(v_p0 + 4u)] = ((uint8_t)((1u & (v_chunk_bits >> 27u))));
35628
        self->private_data.f_scratch[(v_p0 + 5u)] = ((uint8_t)((1u & (v_chunk_bits >> 26u))));
35629
        self->private_data.f_scratch[(v_p0 + 6u)] = ((uint8_t)((1u & (v_chunk_bits >> 25u))));
35630
        self->private_data.f_scratch[(v_p0 + 7u)] = ((uint8_t)((1u & (v_chunk_bits >> 24u))));
35631
        self->private_data.f_scratch[(v_p0 + 8u)] = ((uint8_t)((1u & (v_chunk_bits >> 23u))));
35632
        self->private_data.f_scratch[(v_p0 + 9u)] = ((uint8_t)((1u & (v_chunk_bits >> 22u))));
35633
        self->private_data.f_scratch[(v_p0 + 10u)] = ((uint8_t)((1u & (v_chunk_bits >> 21u))));
35634
        self->private_data.f_scratch[(v_p0 + 11u)] = ((uint8_t)((1u & (v_chunk_bits >> 20u))));
35635
        self->private_data.f_scratch[(v_p0 + 12u)] = ((uint8_t)((1u & (v_chunk_bits >> 19u))));
35636
        self->private_data.f_scratch[(v_p0 + 13u)] = ((uint8_t)((1u & (v_chunk_bits >> 18u))));
35637
        self->private_data.f_scratch[(v_p0 + 14u)] = ((uint8_t)((1u & (v_chunk_bits >> 17u))));
35638
        self->private_data.f_scratch[(v_p0 + 15u)] = ((uint8_t)((1u & (v_chunk_bits >> 16u))));
35639
        self->private_data.f_scratch[(v_p0 + 16u)] = ((uint8_t)((1u & (v_chunk_bits >> 15u))));
35640
        self->private_data.f_scratch[(v_p0 + 17u)] = ((uint8_t)((1u & (v_chunk_bits >> 14u))));
35641
        self->private_data.f_scratch[(v_p0 + 18u)] = ((uint8_t)((1u & (v_chunk_bits >> 13u))));
35642
        self->private_data.f_scratch[(v_p0 + 19u)] = ((uint8_t)((1u & (v_chunk_bits >> 12u))));
35643
        self->private_data.f_scratch[(v_p0 + 20u)] = ((uint8_t)((1u & (v_chunk_bits >> 11u))));
35644
        self->private_data.f_scratch[(v_p0 + 21u)] = ((uint8_t)((1u & (v_chunk_bits >> 10u))));
35645
        self->private_data.f_scratch[(v_p0 + 22u)] = ((uint8_t)((1u & (v_chunk_bits >> 9u))));
35646
        self->private_data.f_scratch[(v_p0 + 23u)] = ((uint8_t)((1u & (v_chunk_bits >> 8u))));
35647
        self->private_data.f_scratch[(v_p0 + 24u)] = ((uint8_t)((1u & (v_chunk_bits >> 7u))));
35648
        self->private_data.f_scratch[(v_p0 + 25u)] = ((uint8_t)((1u & (v_chunk_bits >> 6u))));
35649
        self->private_data.f_scratch[(v_p0 + 26u)] = ((uint8_t)((1u & (v_chunk_bits >> 5u))));
35650
        self->private_data.f_scratch[(v_p0 + 27u)] = ((uint8_t)((1u & (v_chunk_bits >> 4u))));
35651
        self->private_data.f_scratch[(v_p0 + 28u)] = ((uint8_t)((1u & (v_chunk_bits >> 3u))));
35652
        self->private_data.f_scratch[(v_p0 + 29u)] = ((uint8_t)((1u & (v_chunk_bits >> 2u))));
35653
        self->private_data.f_scratch[(v_p0 + 30u)] = ((uint8_t)((1u & (v_chunk_bits >> 1u))));
35654
        self->private_data.f_scratch[(v_p0 + 31u)] = ((uint8_t)((1u & (v_chunk_bits >> 0u))));
35655
        v_p0 = ((v_p0 & 511u) + 32u);
35656
        v_chunk_count -= 1u;
35657
      }
35658
    } else if (self->private_impl.f_bits_per_pixel == 2u) {
35659
      v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 15u) / 16u);
35660
      v_chunk_count = wuffs_base__u32__min(v_chunk_count, 32u);
35661
      while ((v_chunk_count > 0u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 4u)) {
35662
        v_chunk_bits = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
35663
        iop_a_src += 4u;
35664
        self->private_data.f_scratch[(v_p0 + 0u)] = ((uint8_t)((3u & (v_chunk_bits >> 30u))));
35665
        self->private_data.f_scratch[(v_p0 + 1u)] = ((uint8_t)((3u & (v_chunk_bits >> 28u))));
35666
        self->private_data.f_scratch[(v_p0 + 2u)] = ((uint8_t)((3u & (v_chunk_bits >> 26u))));
35667
        self->private_data.f_scratch[(v_p0 + 3u)] = ((uint8_t)((3u & (v_chunk_bits >> 24u))));
35668
        self->private_data.f_scratch[(v_p0 + 4u)] = ((uint8_t)((3u & (v_chunk_bits >> 22u))));
35669
        self->private_data.f_scratch[(v_p0 + 5u)] = ((uint8_t)((3u & (v_chunk_bits >> 20u))));
35670
        self->private_data.f_scratch[(v_p0 + 6u)] = ((uint8_t)((3u & (v_chunk_bits >> 18u))));
35671
        self->private_data.f_scratch[(v_p0 + 7u)] = ((uint8_t)((3u & (v_chunk_bits >> 16u))));
35672
        self->private_data.f_scratch[(v_p0 + 8u)] = ((uint8_t)((3u & (v_chunk_bits >> 14u))));
35673
        self->private_data.f_scratch[(v_p0 + 9u)] = ((uint8_t)((3u & (v_chunk_bits >> 12u))));
35674
        self->private_data.f_scratch[(v_p0 + 10u)] = ((uint8_t)((3u & (v_chunk_bits >> 10u))));
35675
        self->private_data.f_scratch[(v_p0 + 11u)] = ((uint8_t)((3u & (v_chunk_bits >> 8u))));
35676
        self->private_data.f_scratch[(v_p0 + 12u)] = ((uint8_t)((3u & (v_chunk_bits >> 6u))));
35677
        self->private_data.f_scratch[(v_p0 + 13u)] = ((uint8_t)((3u & (v_chunk_bits >> 4u))));
35678
        self->private_data.f_scratch[(v_p0 + 14u)] = ((uint8_t)((3u & (v_chunk_bits >> 2u))));
35679
        self->private_data.f_scratch[(v_p0 + 15u)] = ((uint8_t)((3u & (v_chunk_bits >> 0u))));
35680
        v_p0 = ((v_p0 & 511u) + 16u);
35681
        v_chunk_count -= 1u;
35682
      }
35683
    } else {
35684
      v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 7u) / 8u);
35685
      v_chunk_count = wuffs_base__u32__min(v_chunk_count, 64u);
35686
      while ((v_chunk_count > 0u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 4u)) {
35687
        v_chunk_bits = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
35688
        iop_a_src += 4u;
35689
        self->private_data.f_scratch[(v_p0 + 0u)] = ((uint8_t)((15u & (v_chunk_bits >> 28u))));
35690
        self->private_data.f_scratch[(v_p0 + 1u)] = ((uint8_t)((15u & (v_chunk_bits >> 24u))));
35691
        self->private_data.f_scratch[(v_p0 + 2u)] = ((uint8_t)((15u & (v_chunk_bits >> 20u))));
35692
        self->private_data.f_scratch[(v_p0 + 3u)] = ((uint8_t)((15u & (v_chunk_bits >> 16u))));
35693
        self->private_data.f_scratch[(v_p0 + 4u)] = ((uint8_t)((15u & (v_chunk_bits >> 12u))));
35694
        self->private_data.f_scratch[(v_p0 + 5u)] = ((uint8_t)((15u & (v_chunk_bits >> 8u))));
35695
        self->private_data.f_scratch[(v_p0 + 6u)] = ((uint8_t)((15u & (v_chunk_bits >> 4u))));
35696
        self->private_data.f_scratch[(v_p0 + 7u)] = ((uint8_t)((15u & (v_chunk_bits >> 0u))));
35697
        v_p0 = ((v_p0 & 511u) + 8u);
35698
        v_chunk_count -= 1u;
35699
      }
35700
    }
35701
    v_p0 = wuffs_base__u32__min(v_p0, wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x));
35702
    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));
35703
    if (v_n == 0u) {
35704
      status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read);
35705
      goto ok;
35706
    }
35707
    wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n)));
35708
  }
35709
  status = wuffs_base__make_status(NULL);
35710
  goto ok;
35711
35712
  ok:
35713
  goto exit;
35714
  exit:
35715
  if (a_src && a_src->data.ptr) {
35716
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
35717
  }
35718
35719
  return status;
35720
}
35721
35722
// -------- func bmp.decoder.frame_dirty_rect
35723
35724
WUFFS_BASE__GENERATED_C_CODE
35725
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
35726
wuffs_bmp__decoder__frame_dirty_rect(
35727
    const wuffs_bmp__decoder* self) {
35728
  if (!self) {
35729
    return wuffs_base__utility__empty_rect_ie_u32();
35730
  }
35731
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
35732
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
35733
    return wuffs_base__utility__empty_rect_ie_u32();
35734
  }
35735
35736
  return wuffs_base__utility__make_rect_ie_u32(
35737
      0u,
35738
      0u,
35739
      self->private_impl.f_width,
35740
      self->private_impl.f_height);
35741
}
35742
35743
// -------- func bmp.decoder.num_animation_loops
35744
35745
WUFFS_BASE__GENERATED_C_CODE
35746
WUFFS_BASE__MAYBE_STATIC uint32_t
35747
wuffs_bmp__decoder__num_animation_loops(
35748
    const wuffs_bmp__decoder* self) {
35749
  if (!self) {
35750
    return 0;
35751
  }
35752
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
35753
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
35754
    return 0;
35755
  }
35756
35757
  return 0u;
35758
}
35759
35760
// -------- func bmp.decoder.num_decoded_frame_configs
35761
35762
WUFFS_BASE__GENERATED_C_CODE
35763
WUFFS_BASE__MAYBE_STATIC uint64_t
35764
wuffs_bmp__decoder__num_decoded_frame_configs(
35765
    const wuffs_bmp__decoder* self) {
35766
  if (!self) {
35767
    return 0;
35768
  }
35769
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
35770
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
35771
    return 0;
35772
  }
35773
35774
  if (self->private_impl.f_call_sequence > 32u) {
35775
    return 1u;
35776
  }
35777
  return 0u;
35778
}
35779
35780
// -------- func bmp.decoder.num_decoded_frames
35781
35782
WUFFS_BASE__GENERATED_C_CODE
35783
WUFFS_BASE__MAYBE_STATIC uint64_t
35784
wuffs_bmp__decoder__num_decoded_frames(
35785
    const wuffs_bmp__decoder* self) {
35786
  if (!self) {
35787
    return 0;
35788
  }
35789
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
35790
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
35791
    return 0;
35792
  }
35793
35794
  if (self->private_impl.f_call_sequence > 64u) {
35795
    return 1u;
35796
  }
35797
  return 0u;
35798
}
35799
35800
// -------- func bmp.decoder.restart_frame
35801
35802
WUFFS_BASE__GENERATED_C_CODE
35803
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
35804
wuffs_bmp__decoder__restart_frame(
35805
    wuffs_bmp__decoder* self,
35806
    uint64_t a_index,
35807
    uint64_t a_io_position) {
35808
  if (!self) {
35809
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
35810
  }
35811
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
35812
    return wuffs_base__make_status(
35813
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
35814
        ? wuffs_base__error__disabled_by_previous_error
35815
        : wuffs_base__error__initialize_not_called);
35816
  }
35817
35818
  if (self->private_impl.f_call_sequence < 32u) {
35819
    return wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
35820
  }
35821
  if (a_index != 0u) {
35822
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
35823
  }
35824
  self->private_impl.f_call_sequence = 40u;
35825
  self->private_impl.f_frame_config_io_position = a_io_position;
35826
  return wuffs_base__make_status(NULL);
35827
}
35828
35829
// -------- func bmp.decoder.set_report_metadata
35830
35831
WUFFS_BASE__GENERATED_C_CODE
35832
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
35833
wuffs_bmp__decoder__set_report_metadata(
35834
    wuffs_bmp__decoder* self,
35835
    uint32_t a_fourcc,
35836
    bool a_report) {
35837
  return wuffs_base__make_empty_struct();
35838
}
35839
35840
// -------- func bmp.decoder.tell_me_more
35841
35842
WUFFS_BASE__GENERATED_C_CODE
35843
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
35844
wuffs_bmp__decoder__tell_me_more(
35845
    wuffs_bmp__decoder* self,
35846
    wuffs_base__io_buffer* a_dst,
35847
    wuffs_base__more_information* a_minfo,
35848
    wuffs_base__io_buffer* a_src) {
35849
  if (!self) {
35850
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
35851
  }
35852
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
35853
    return wuffs_base__make_status(
35854
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
35855
        ? wuffs_base__error__disabled_by_previous_error
35856
        : wuffs_base__error__initialize_not_called);
35857
  }
35858
  if (!a_dst || !a_src) {
35859
    self->private_impl.magic = WUFFS_BASE__DISABLED;
35860
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
35861
  }
35862
  if ((self->private_impl.active_coroutine != 0) &&
35863
      (self->private_impl.active_coroutine != 4)) {
35864
    self->private_impl.magic = WUFFS_BASE__DISABLED;
35865
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
35866
  }
35867
  self->private_impl.active_coroutine = 0;
35868
  wuffs_base__status status = wuffs_base__make_status(NULL);
35869
35870
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
35871
35872
  uint32_t coro_susp_point = self->private_impl.p_tell_me_more;
35873
  switch (coro_susp_point) {
35874
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
35875
35876
    while (true) {
35877
      {
35878
        wuffs_base__status t_0 = wuffs_bmp__decoder__do_tell_me_more(self, a_dst, a_minfo, a_src);
35879
        v_status = t_0;
35880
      }
35881
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
35882
        status = wuffs_base__make_status(wuffs_bmp__error__truncated_input);
35883
        goto exit;
35884
      }
35885
      status = v_status;
35886
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
35887
    }
35888
35889
    ok:
35890
    self->private_impl.p_tell_me_more = 0;
35891
    goto exit;
35892
  }
35893
35894
  goto suspend;
35895
  suspend:
35896
  self->private_impl.p_tell_me_more = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
35897
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 4 : 0;
35898
35899
  goto exit;
35900
  exit:
35901
  if (wuffs_base__status__is_error(&status)) {
35902
    self->private_impl.magic = WUFFS_BASE__DISABLED;
35903
  }
35904
  return status;
35905
}
35906
35907
// -------- func bmp.decoder.do_tell_me_more
35908
35909
WUFFS_BASE__GENERATED_C_CODE
35910
static wuffs_base__status
35911
wuffs_bmp__decoder__do_tell_me_more(
35912
    wuffs_bmp__decoder* self,
35913
    wuffs_base__io_buffer* a_dst,
35914
    wuffs_base__more_information* a_minfo,
35915
    wuffs_base__io_buffer* a_src) {
35916
  wuffs_base__status status = wuffs_base__make_status(NULL);
35917
35918
  if (self->private_impl.f_io_redirect_fourcc <= 1u) {
35919
    status = wuffs_base__make_status(wuffs_base__error__no_more_information);
35920
    goto exit;
35921
  }
35922
  if (a_minfo != NULL) {
35923
    wuffs_base__more_information__set(a_minfo,
35924
        1u,
35925
        self->private_impl.f_io_redirect_fourcc,
35926
        0u,
35927
        self->private_impl.f_io_redirect_pos,
35928
        18446744073709551615u);
35929
  }
35930
  self->private_impl.f_io_redirect_fourcc = 1u;
35931
35932
  goto ok;
35933
  ok:
35934
  goto exit;
35935
  exit:
35936
  return status;
35937
}
35938
35939
// -------- func bmp.decoder.workbuf_len
35940
35941
WUFFS_BASE__GENERATED_C_CODE
35942
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
35943
wuffs_bmp__decoder__workbuf_len(
35944
    const wuffs_bmp__decoder* self) {
35945
  if (!self) {
35946
    return wuffs_base__utility__empty_range_ii_u64();
35947
  }
35948
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
35949
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
35950
    return wuffs_base__utility__empty_range_ii_u64();
35951
  }
35952
35953
  return wuffs_base__utility__make_range_ii_u64(0u, 0u);
35954
}
35955
35956
// -------- func bmp.decoder.read_palette
35957
35958
WUFFS_BASE__GENERATED_C_CODE
35959
static wuffs_base__status
35960
wuffs_bmp__decoder__read_palette(
35961
    wuffs_bmp__decoder* self,
35962
    wuffs_base__io_buffer* a_src) {
35963
  wuffs_base__status status = wuffs_base__make_status(NULL);
35964
35965
  uint32_t v_i = 0;
35966
  uint32_t v_argb = 0;
35967
35968
  const uint8_t* iop_a_src = NULL;
35969
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
35970
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
35971
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
35972
  if (a_src && a_src->data.ptr) {
35973
    io0_a_src = a_src->data.ptr;
35974
    io1_a_src = io0_a_src + a_src->meta.ri;
35975
    iop_a_src = io1_a_src;
35976
    io2_a_src = io0_a_src + a_src->meta.wi;
35977
  }
35978
35979
  uint32_t coro_susp_point = self->private_impl.p_read_palette;
35980
  if (coro_susp_point) {
35981
    v_i = self->private_data.s_read_palette.v_i;
35982
  }
35983
  switch (coro_susp_point) {
35984
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
35985
35986
    if (self->private_impl.f_bitmap_info_len == 12u) {
35987
      while ((v_i < 256u) && (self->private_impl.f_padding >= 3u)) {
35988
        self->private_impl.f_padding -= 3u;
35989
        {
35990
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
35991
          uint32_t t_0;
35992
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) {
35993
            t_0 = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src)));
35994
            iop_a_src += 3;
35995
          } else {
35996
            self->private_data.s_read_palette.scratch = 0;
35997
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
35998
            while (true) {
35999
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
36000
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
36001
                goto suspend;
36002
              }
36003
              uint64_t* scratch = &self->private_data.s_read_palette.scratch;
36004
              uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
36005
              *scratch <<= 8;
36006
              *scratch >>= 8;
36007
              *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
36008
              if (num_bits_0 == 16) {
36009
                t_0 = ((uint32_t)(*scratch));
36010
                break;
36011
              }
36012
              num_bits_0 += 8u;
36013
              *scratch |= ((uint64_t)(num_bits_0)) << 56;
36014
            }
36015
          }
36016
          v_argb = t_0;
36017
        }
36018
        v_argb |= 4278190080u;
36019
        self->private_data.f_src_palette[((4u * v_i) + 0u)] = ((uint8_t)((v_argb >> 0u)));
36020
        self->private_data.f_src_palette[((4u * v_i) + 1u)] = ((uint8_t)((v_argb >> 8u)));
36021
        self->private_data.f_src_palette[((4u * v_i) + 2u)] = ((uint8_t)((v_argb >> 16u)));
36022
        self->private_data.f_src_palette[((4u * v_i) + 3u)] = ((uint8_t)((v_argb >> 24u)));
36023
        v_i += 1u;
36024
      }
36025
    } else {
36026
      while ((v_i < 256u) && (self->private_impl.f_padding >= 4u)) {
36027
        self->private_impl.f_padding -= 4u;
36028
        {
36029
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
36030
          uint32_t t_1;
36031
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
36032
            t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
36033
            iop_a_src += 4;
36034
          } else {
36035
            self->private_data.s_read_palette.scratch = 0;
36036
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
36037
            while (true) {
36038
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
36039
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
36040
                goto suspend;
36041
              }
36042
              uint64_t* scratch = &self->private_data.s_read_palette.scratch;
36043
              uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
36044
              *scratch <<= 8;
36045
              *scratch >>= 8;
36046
              *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
36047
              if (num_bits_1 == 24) {
36048
                t_1 = ((uint32_t)(*scratch));
36049
                break;
36050
              }
36051
              num_bits_1 += 8u;
36052
              *scratch |= ((uint64_t)(num_bits_1)) << 56;
36053
            }
36054
          }
36055
          v_argb = t_1;
36056
        }
36057
        v_argb |= 4278190080u;
36058
        self->private_data.f_src_palette[((4u * v_i) + 0u)] = ((uint8_t)((v_argb >> 0u)));
36059
        self->private_data.f_src_palette[((4u * v_i) + 1u)] = ((uint8_t)((v_argb >> 8u)));
36060
        self->private_data.f_src_palette[((4u * v_i) + 2u)] = ((uint8_t)((v_argb >> 16u)));
36061
        self->private_data.f_src_palette[((4u * v_i) + 3u)] = ((uint8_t)((v_argb >> 24u)));
36062
        v_i += 1u;
36063
      }
36064
    }
36065
    while (v_i < 256u) {
36066
      self->private_data.f_src_palette[((4u * v_i) + 0u)] = 0u;
36067
      self->private_data.f_src_palette[((4u * v_i) + 1u)] = 0u;
36068
      self->private_data.f_src_palette[((4u * v_i) + 2u)] = 0u;
36069
      self->private_data.f_src_palette[((4u * v_i) + 3u)] = 255u;
36070
      v_i += 1u;
36071
    }
36072
36073
    goto ok;
36074
    ok:
36075
    self->private_impl.p_read_palette = 0;
36076
    goto exit;
36077
  }
36078
36079
  goto suspend;
36080
  suspend:
36081
  self->private_impl.p_read_palette = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
36082
  self->private_data.s_read_palette.v_i = v_i;
36083
36084
  goto exit;
36085
  exit:
36086
  if (a_src && a_src->data.ptr) {
36087
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
36088
  }
36089
36090
  return status;
36091
}
36092
36093
// -------- func bmp.decoder.process_masks
36094
36095
WUFFS_BASE__GENERATED_C_CODE
36096
static wuffs_base__status
36097
wuffs_bmp__decoder__process_masks(
36098
    wuffs_bmp__decoder* self) {
36099
  wuffs_base__status status = wuffs_base__make_status(NULL);
36100
36101
  uint32_t v_i = 0;
36102
  uint32_t v_mask = 0;
36103
  uint32_t v_n = 0;
36104
36105
  while (v_i < 4u) {
36106
    v_mask = self->private_impl.f_channel_masks[v_i];
36107
    if (v_mask != 0u) {
36108
      v_n = 0u;
36109
      while ((v_mask & 1u) == 0u) {
36110
        v_n += 1u;
36111
        v_mask >>= 1u;
36112
      }
36113
      self->private_impl.f_channel_shifts[v_i] = ((uint8_t)((v_n & 31u)));
36114
      v_n = 0u;
36115
      while ((v_mask & 1u) == 1u) {
36116
        v_n += 1u;
36117
        v_mask >>= 1u;
36118
      }
36119
      if ((v_mask != 0u) || (v_n > 32u)) {
36120
        status = wuffs_base__make_status(wuffs_bmp__error__bad_header);
36121
        goto exit;
36122
      }
36123
      self->private_impl.f_channel_num_bits[v_i] = ((uint8_t)(v_n));
36124
    } else if (v_i != 3u) {
36125
      status = wuffs_base__make_status(wuffs_bmp__error__bad_header);
36126
      goto exit;
36127
    }
36128
    v_i += 1u;
36129
  }
36130
36131
  goto ok;
36132
  ok:
36133
  goto exit;
36134
  exit:
36135
  return status;
36136
}
36137
36138
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BMP)
36139
36140
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BZIP2)
36141
36142
// ---------------- Status Codes Implementations
36143
36144
const char wuffs_bzip2__error__bad_huffman_code_over_subscribed[] = "#bzip2: bad Huffman code (over-subscribed)";
36145
const char wuffs_bzip2__error__bad_huffman_code_under_subscribed[] = "#bzip2: bad Huffman code (under-subscribed)";
36146
const char wuffs_bzip2__error__bad_block_header[] = "#bzip2: bad block header";
36147
const char wuffs_bzip2__error__bad_block_length[] = "#bzip2: bad block length";
36148
const char wuffs_bzip2__error__bad_checksum[] = "#bzip2: bad checksum";
36149
const char wuffs_bzip2__error__bad_header[] = "#bzip2: bad header";
36150
const char wuffs_bzip2__error__bad_number_of_sections[] = "#bzip2: bad number of sections";
36151
const char wuffs_bzip2__error__truncated_input[] = "#bzip2: truncated input";
36152
const char wuffs_bzip2__error__unsupported_block_randomization[] = "#bzip2: unsupported block randomization";
36153
const char wuffs_bzip2__error__internal_error_inconsistent_huffman_decoder_state[] = "#bzip2: internal error: inconsistent Huffman decoder state";
36154
36155
// ---------------- Private Consts
36156
36157
static const uint8_t
36158
WUFFS_BZIP2__CLAMP_TO_5[8] WUFFS_BASE__POTENTIALLY_UNUSED = {
36159
  0u, 1u, 2u, 3u, 4u, 5u, 5u, 5u,
36160
};
36161
36162
static const uint32_t
36163
WUFFS_BZIP2__REV_CRC32_TABLE[256] WUFFS_BASE__POTENTIALLY_UNUSED = {
36164
  0u, 79764919u, 159529838u, 222504665u, 319059676u, 398814059u, 445009330u, 507990021u,
36165
  638119352u, 583659535u, 797628118u, 726387553u, 890018660u, 835552979u, 1015980042u, 944750013u,
36166
  1276238704u, 1221641927u, 1167319070u, 1095957929u, 1595256236u, 1540665371u, 1452775106u, 1381403509u,
36167
  1780037320u, 1859660671u, 1671105958u, 1733955601u, 2031960084u, 2111593891u, 1889500026u, 1952343757u,
36168
  2552477408u, 2632100695u, 2443283854u, 2506133561u, 2334638140u, 2414271883u, 2191915858u, 2254759653u,
36169
  3190512472u, 3135915759u, 3081330742u, 3009969537u, 2905550212u, 2850959411u, 2762807018u, 2691435357u,
36170
  3560074640u, 3505614887u, 3719321342u, 3648080713u, 3342211916u, 3287746299u, 3467911202u, 3396681109u,
36171
  4063920168u, 4143685023u, 4223187782u, 4286162673u, 3779000052u, 3858754371u, 3904687514u, 3967668269u,
36172
  881225847u, 809987520u, 1023691545u, 969234094u, 662832811u, 591600412u, 771767749u, 717299826u,
36173
  311336399u, 374308984u, 453813921u, 533576470u, 25881363u, 88864420u, 134795389u, 214552010u,
36174
  2023205639u, 2086057648u, 1897238633u, 1976864222u, 1804852699u, 1867694188u, 1645340341u, 1724971778u,
36175
  1587496639u, 1516133128u, 1461550545u, 1406951526u, 1302016099u, 1230646740u, 1142491917u, 1087903418u,
36176
  2896545431u, 2825181984u, 2770861561u, 2716262478u, 3215044683u, 3143675388u, 3055782693u, 3001194130u,
36177
  2326604591u, 2389456536u, 2200899649u, 2280525302u, 2578013683u, 2640855108u, 2418763421u, 2498394922u,
36178
  3769900519u, 3832873040u, 3912640137u, 3992402750u, 4088425275u, 4151408268u, 4197601365u, 4277358050u,
36179
  3334271071u, 3263032808u, 3476998961u, 3422541446u, 3585640067u, 3514407732u, 3694837229u, 3640369242u,
36180
  1762451694u, 1842216281u, 1619975040u, 1682949687u, 2047383090u, 2127137669u, 1938468188u, 2001449195u,
36181
  1325665622u, 1271206113u, 1183200824u, 1111960463u, 1543535498u, 1489069629u, 1434599652u, 1363369299u,
36182
  622672798u, 568075817u, 748617968u, 677256519u, 907627842u, 853037301u, 1067152940u, 995781531u,
36183
  51762726u, 131386257u, 177728840u, 240578815u, 269590778u, 349224269u, 429104020u, 491947555u,
36184
  4046411278u, 4126034873u, 4172115296u, 4234965207u, 3794477266u, 3874110821u, 3953728444u, 4016571915u,
36185
  3609705398u, 3555108353u, 3735388376u, 3664026991u, 3290680682u, 3236090077u, 3449943556u, 3378572211u,
36186
  3174993278u, 3120533705u, 3032266256u, 2961025959u, 2923101090u, 2868635157u, 2813903052u, 2742672763u,
36187
  2604032198u, 2683796849u, 2461293480u, 2524268063u, 2284983834u, 2364738477u, 2175806836u, 2238787779u,
36188
  1569362073u, 1498123566u, 1409854455u, 1355396672u, 1317987909u, 1246755826u, 1192025387u, 1137557660u,
36189
  2072149281u, 2135122070u, 1912620623u, 1992383480u, 1753615357u, 1816598090u, 1627664531u, 1707420964u,
36190
  295390185u, 358241886u, 404320391u, 483945776u, 43990325u, 106832002u, 186451547u, 266083308u,
36191
  932423249u, 861060070u, 1041341759u, 986742920u, 613929101u, 542559546u, 756411363u, 701822548u,
36192
  3316196985u, 3244833742u, 3425377559u, 3370778784u, 3601682597u, 3530312978u, 3744426955u, 3689838204u,
36193
  3819031489u, 3881883254u, 3928223919u, 4007849240u, 4037393693u, 4100235434u, 4180117107u, 4259748804u,
36194
  2310601993u, 2373574846u, 2151335527u, 2231098320u, 2596047829u, 2659030626u, 2470359227u, 2550115596u,
36195
  2947551409u, 2876312838u, 2788305887u, 2733848168u, 3165939309u, 3094707162u, 3040238851u, 2985771188u,
36196
};
36197
36198
// ---------------- Private Initializer Prototypes
36199
36200
// ---------------- Private Function Prototypes
36201
36202
WUFFS_BASE__GENERATED_C_CODE
36203
static wuffs_base__status
36204
wuffs_bzip2__decoder__do_transform_io(
36205
    wuffs_bzip2__decoder* self,
36206
    wuffs_base__io_buffer* a_dst,
36207
    wuffs_base__io_buffer* a_src,
36208
    wuffs_base__slice_u8 a_workbuf);
36209
36210
WUFFS_BASE__GENERATED_C_CODE
36211
static wuffs_base__status
36212
wuffs_bzip2__decoder__prepare_block(
36213
    wuffs_bzip2__decoder* self,
36214
    wuffs_base__io_buffer* a_src);
36215
36216
WUFFS_BASE__GENERATED_C_CODE
36217
static wuffs_base__status
36218
wuffs_bzip2__decoder__read_code_lengths(
36219
    wuffs_bzip2__decoder* self,
36220
    wuffs_base__io_buffer* a_src);
36221
36222
WUFFS_BASE__GENERATED_C_CODE
36223
static wuffs_base__status
36224
wuffs_bzip2__decoder__build_huffman_tree(
36225
    wuffs_bzip2__decoder* self,
36226
    uint32_t a_which);
36227
36228
WUFFS_BASE__GENERATED_C_CODE
36229
static wuffs_base__empty_struct
36230
wuffs_bzip2__decoder__build_huffman_table(
36231
    wuffs_bzip2__decoder* self,
36232
    uint32_t a_which);
36233
36234
WUFFS_BASE__GENERATED_C_CODE
36235
static wuffs_base__empty_struct
36236
wuffs_bzip2__decoder__invert_bwt(
36237
    wuffs_bzip2__decoder* self);
36238
36239
WUFFS_BASE__GENERATED_C_CODE
36240
static wuffs_base__empty_struct
36241
wuffs_bzip2__decoder__flush_fast(
36242
    wuffs_bzip2__decoder* self,
36243
    wuffs_base__io_buffer* a_dst);
36244
36245
WUFFS_BASE__GENERATED_C_CODE
36246
static wuffs_base__status
36247
wuffs_bzip2__decoder__flush_slow(
36248
    wuffs_bzip2__decoder* self,
36249
    wuffs_base__io_buffer* a_dst);
36250
36251
WUFFS_BASE__GENERATED_C_CODE
36252
static wuffs_base__status
36253
wuffs_bzip2__decoder__decode_huffman_fast(
36254
    wuffs_bzip2__decoder* self,
36255
    wuffs_base__io_buffer* a_src);
36256
36257
WUFFS_BASE__GENERATED_C_CODE
36258
static wuffs_base__status
36259
wuffs_bzip2__decoder__decode_huffman_slow(
36260
    wuffs_bzip2__decoder* self,
36261
    wuffs_base__io_buffer* a_src);
36262
36263
// ---------------- VTables
36264
36265
const wuffs_base__io_transformer__func_ptrs
36266
wuffs_bzip2__decoder__func_ptrs_for__wuffs_base__io_transformer = {
36267
  (wuffs_base__optional_u63(*)(const void*))(&wuffs_bzip2__decoder__dst_history_retain_length),
36268
  (uint64_t(*)(const void*,
36269
      uint32_t))(&wuffs_bzip2__decoder__get_quirk),
36270
  (wuffs_base__status(*)(void*,
36271
      uint32_t,
36272
      uint64_t))(&wuffs_bzip2__decoder__set_quirk),
36273
  (wuffs_base__status(*)(void*,
36274
      wuffs_base__io_buffer*,
36275
      wuffs_base__io_buffer*,
36276
      wuffs_base__slice_u8))(&wuffs_bzip2__decoder__transform_io),
36277
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_bzip2__decoder__workbuf_len),
36278
};
36279
36280
// ---------------- Initializer Implementations
36281
36282
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
36283
wuffs_bzip2__decoder__initialize(
36284
    wuffs_bzip2__decoder* self,
36285
    size_t sizeof_star_self,
36286
    uint64_t wuffs_version,
36287
    uint32_t options){
36288
  if (!self) {
36289
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
36290
  }
36291
  if (sizeof(*self) != sizeof_star_self) {
36292
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
36293
  }
36294
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
36295
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
36296
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
36297
  }
36298
36299
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
36300
    // The whole point of this if-check is to detect an uninitialized *self.
36301
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
36302
#if !defined(__clang__) && defined(__GNUC__)
36303
#pragma GCC diagnostic push
36304
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
36305
#endif
36306
    if (self->private_impl.magic != 0) {
36307
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
36308
    }
36309
#if !defined(__clang__) && defined(__GNUC__)
36310
#pragma GCC diagnostic pop
36311
#endif
36312
  } else {
36313
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
36314
      memset(self, 0, sizeof(*self));
36315
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
36316
    } else {
36317
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
36318
    }
36319
  }
36320
36321
  self->private_impl.magic = WUFFS_BASE__MAGIC;
36322
  self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name =
36323
      wuffs_base__io_transformer__vtable_name;
36324
  self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers =
36325
      (const void*)(&wuffs_bzip2__decoder__func_ptrs_for__wuffs_base__io_transformer);
36326
  return wuffs_base__make_status(NULL);
36327
}
36328
36329
wuffs_bzip2__decoder*
36330
wuffs_bzip2__decoder__alloc(void) {
36331
  wuffs_bzip2__decoder* x =
36332
      (wuffs_bzip2__decoder*)(calloc(1, sizeof(wuffs_bzip2__decoder)));
36333
  if (!x) {
36334
    return NULL;
36335
  }
36336
  if (wuffs_bzip2__decoder__initialize(
36337
      x, sizeof(wuffs_bzip2__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
36338
    free(x);
36339
    return NULL;
36340
  }
36341
  return x;
36342
}
36343
36344
size_t
36345
sizeof__wuffs_bzip2__decoder(void) {
36346
  return sizeof(wuffs_bzip2__decoder);
36347
}
36348
36349
// ---------------- Function Implementations
36350
36351
// -------- func bzip2.decoder.get_quirk
36352
36353
WUFFS_BASE__GENERATED_C_CODE
36354
WUFFS_BASE__MAYBE_STATIC uint64_t
36355
wuffs_bzip2__decoder__get_quirk(
36356
    const wuffs_bzip2__decoder* self,
36357
    uint32_t a_key) {
36358
  if (!self) {
36359
    return 0;
36360
  }
36361
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
36362
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
36363
    return 0;
36364
  }
36365
36366
  if ((a_key == 1u) && self->private_impl.f_ignore_checksum) {
36367
    return 1u;
36368
  }
36369
  return 0u;
36370
}
36371
36372
// -------- func bzip2.decoder.set_quirk
36373
36374
WUFFS_BASE__GENERATED_C_CODE
36375
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
36376
wuffs_bzip2__decoder__set_quirk(
36377
    wuffs_bzip2__decoder* self,
36378
    uint32_t a_key,
36379
    uint64_t a_value) {
36380
  if (!self) {
36381
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
36382
  }
36383
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
36384
    return wuffs_base__make_status(
36385
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
36386
        ? wuffs_base__error__disabled_by_previous_error
36387
        : wuffs_base__error__initialize_not_called);
36388
  }
36389
36390
  if (a_key == 1u) {
36391
    self->private_impl.f_ignore_checksum = (a_value > 0u);
36392
    return wuffs_base__make_status(NULL);
36393
  }
36394
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
36395
}
36396
36397
// -------- func bzip2.decoder.dst_history_retain_length
36398
36399
WUFFS_BASE__GENERATED_C_CODE
36400
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
36401
wuffs_bzip2__decoder__dst_history_retain_length(
36402
    const wuffs_bzip2__decoder* self) {
36403
  if (!self) {
36404
    return wuffs_base__utility__make_optional_u63(false, 0u);
36405
  }
36406
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
36407
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
36408
    return wuffs_base__utility__make_optional_u63(false, 0u);
36409
  }
36410
36411
  return wuffs_base__utility__make_optional_u63(true, 0u);
36412
}
36413
36414
// -------- func bzip2.decoder.workbuf_len
36415
36416
WUFFS_BASE__GENERATED_C_CODE
36417
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
36418
wuffs_bzip2__decoder__workbuf_len(
36419
    const wuffs_bzip2__decoder* self) {
36420
  if (!self) {
36421
    return wuffs_base__utility__empty_range_ii_u64();
36422
  }
36423
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
36424
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
36425
    return wuffs_base__utility__empty_range_ii_u64();
36426
  }
36427
36428
  return wuffs_base__utility__make_range_ii_u64(0u, 0u);
36429
}
36430
36431
// -------- func bzip2.decoder.transform_io
36432
36433
WUFFS_BASE__GENERATED_C_CODE
36434
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
36435
wuffs_bzip2__decoder__transform_io(
36436
    wuffs_bzip2__decoder* self,
36437
    wuffs_base__io_buffer* a_dst,
36438
    wuffs_base__io_buffer* a_src,
36439
    wuffs_base__slice_u8 a_workbuf) {
36440
  if (!self) {
36441
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
36442
  }
36443
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
36444
    return wuffs_base__make_status(
36445
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
36446
        ? wuffs_base__error__disabled_by_previous_error
36447
        : wuffs_base__error__initialize_not_called);
36448
  }
36449
  if (!a_dst || !a_src) {
36450
    self->private_impl.magic = WUFFS_BASE__DISABLED;
36451
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
36452
  }
36453
  if ((self->private_impl.active_coroutine != 0) &&
36454
      (self->private_impl.active_coroutine != 1)) {
36455
    self->private_impl.magic = WUFFS_BASE__DISABLED;
36456
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
36457
  }
36458
  self->private_impl.active_coroutine = 0;
36459
  wuffs_base__status status = wuffs_base__make_status(NULL);
36460
36461
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
36462
36463
  uint32_t coro_susp_point = self->private_impl.p_transform_io;
36464
  switch (coro_susp_point) {
36465
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
36466
36467
    while (true) {
36468
      {
36469
        wuffs_base__status t_0 = wuffs_bzip2__decoder__do_transform_io(self, a_dst, a_src, a_workbuf);
36470
        v_status = t_0;
36471
      }
36472
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
36473
        status = wuffs_base__make_status(wuffs_bzip2__error__truncated_input);
36474
        goto exit;
36475
      }
36476
      status = v_status;
36477
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
36478
    }
36479
36480
    ok:
36481
    self->private_impl.p_transform_io = 0;
36482
    goto exit;
36483
  }
36484
36485
  goto suspend;
36486
  suspend:
36487
  self->private_impl.p_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
36488
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
36489
36490
  goto exit;
36491
  exit:
36492
  if (wuffs_base__status__is_error(&status)) {
36493
    self->private_impl.magic = WUFFS_BASE__DISABLED;
36494
  }
36495
  return status;
36496
}
36497
36498
// -------- func bzip2.decoder.do_transform_io
36499
36500
WUFFS_BASE__GENERATED_C_CODE
36501
static wuffs_base__status
36502
wuffs_bzip2__decoder__do_transform_io(
36503
    wuffs_bzip2__decoder* self,
36504
    wuffs_base__io_buffer* a_dst,
36505
    wuffs_base__io_buffer* a_src,
36506
    wuffs_base__slice_u8 a_workbuf) {
36507
  wuffs_base__status status = wuffs_base__make_status(NULL);
36508
36509
  uint8_t v_c8 = 0;
36510
  uint32_t v_i = 0;
36511
  uint64_t v_tag = 0;
36512
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
36513
  uint32_t v_final_checksum_want = 0;
36514
36515
  const uint8_t* iop_a_src = NULL;
36516
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
36517
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
36518
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
36519
  if (a_src && a_src->data.ptr) {
36520
    io0_a_src = a_src->data.ptr;
36521
    io1_a_src = io0_a_src + a_src->meta.ri;
36522
    iop_a_src = io1_a_src;
36523
    io2_a_src = io0_a_src + a_src->meta.wi;
36524
  }
36525
36526
  uint32_t coro_susp_point = self->private_impl.p_do_transform_io;
36527
  if (coro_susp_point) {
36528
    v_i = self->private_data.s_do_transform_io.v_i;
36529
    v_tag = self->private_data.s_do_transform_io.v_tag;
36530
    v_final_checksum_want = self->private_data.s_do_transform_io.v_final_checksum_want;
36531
  }
36532
  switch (coro_susp_point) {
36533
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
36534
36535
    {
36536
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
36537
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
36538
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
36539
        goto suspend;
36540
      }
36541
      uint8_t t_0 = *iop_a_src++;
36542
      v_c8 = t_0;
36543
    }
36544
    if (v_c8 != 66u) {
36545
      status = wuffs_base__make_status(wuffs_bzip2__error__bad_header);
36546
      goto exit;
36547
    }
36548
    {
36549
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
36550
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
36551
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
36552
        goto suspend;
36553
      }
36554
      uint8_t t_1 = *iop_a_src++;
36555
      v_c8 = t_1;
36556
    }
36557
    if (v_c8 != 90u) {
36558
      status = wuffs_base__make_status(wuffs_bzip2__error__bad_header);
36559
      goto exit;
36560
    }
36561
    {
36562
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
36563
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
36564
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
36565
        goto suspend;
36566
      }
36567
      uint8_t t_2 = *iop_a_src++;
36568
      v_c8 = t_2;
36569
    }
36570
    if (v_c8 != 104u) {
36571
      status = wuffs_base__make_status(wuffs_bzip2__error__bad_header);
36572
      goto exit;
36573
    }
36574
    {
36575
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
36576
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
36577
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
36578
        goto suspend;
36579
      }
36580
      uint8_t t_3 = *iop_a_src++;
36581
      v_c8 = t_3;
36582
    }
36583
    if ((v_c8 < 49u) || (57u < v_c8)) {
36584
      status = wuffs_base__make_status(wuffs_bzip2__error__bad_header);
36585
      goto exit;
36586
    }
36587
    self->private_impl.f_max_incl_block_size = (((uint32_t)(((uint8_t)(v_c8 - 48u)))) * 100000u);
36588
    while (true) {
36589
      v_tag = 0u;
36590
      v_i = 0u;
36591
      while (v_i < 48u) {
36592
        if (self->private_impl.f_n_bits <= 0u) {
36593
          {
36594
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
36595
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
36596
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
36597
              goto suspend;
36598
            }
36599
            uint8_t t_4 = *iop_a_src++;
36600
            v_c8 = t_4;
36601
          }
36602
          self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u);
36603
          self->private_impl.f_n_bits = 8u;
36604
        }
36605
        v_tag <<= 1u;
36606
        v_tag |= ((uint64_t)((self->private_impl.f_bits >> 31u)));
36607
        self->private_impl.f_bits <<= 1u;
36608
        self->private_impl.f_n_bits -= 1u;
36609
        v_i += 1u;
36610
      }
36611
      if (v_tag == 25779555029136u) {
36612
        break;
36613
      } else if (v_tag != 54156738319193u) {
36614
        status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header);
36615
        goto exit;
36616
      }
36617
      if (a_src) {
36618
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
36619
      }
36620
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
36621
      status = wuffs_bzip2__decoder__prepare_block(self, a_src);
36622
      if (a_src) {
36623
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
36624
      }
36625
      if (status.repr) {
36626
        goto suspend;
36627
      }
36628
      self->private_impl.f_block_size = 0u;
36629
      self->private_impl.f_decode_huffman_finished = false;
36630
      self->private_impl.f_decode_huffman_which = WUFFS_BZIP2__CLAMP_TO_5[((uint8_t)(self->private_data.f_huffman_selectors[0u] & 7u))];
36631
      self->private_impl.f_decode_huffman_ticks = 50u;
36632
      self->private_impl.f_decode_huffman_section = 0u;
36633
      self->private_impl.f_decode_huffman_run_shift = 0u;
36634
      while ( ! self->private_impl.f_decode_huffman_finished) {
36635
        if (a_src) {
36636
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
36637
        }
36638
        v_status = wuffs_bzip2__decoder__decode_huffman_fast(self, a_src);
36639
        if (a_src) {
36640
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
36641
        }
36642
        if (wuffs_base__status__is_error(&v_status)) {
36643
          status = v_status;
36644
          goto exit;
36645
        } else if (self->private_impl.f_decode_huffman_finished) {
36646
          break;
36647
        }
36648
        if (a_src) {
36649
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
36650
        }
36651
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
36652
        status = wuffs_bzip2__decoder__decode_huffman_slow(self, a_src);
36653
        if (a_src) {
36654
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
36655
        }
36656
        if (status.repr) {
36657
          goto suspend;
36658
        }
36659
      }
36660
      wuffs_bzip2__decoder__invert_bwt(self);
36661
      self->private_impl.f_block_checksum_have = 4294967295u;
36662
      if (self->private_impl.f_original_pointer >= self->private_impl.f_block_size) {
36663
        status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length);
36664
        goto exit;
36665
      }
36666
      self->private_impl.f_flush_pointer = (self->private_data.f_bwt[self->private_impl.f_original_pointer] >> 12u);
36667
      self->private_impl.f_flush_repeat_count = 0u;
36668
      self->private_impl.f_flush_prev = 0u;
36669
      while (self->private_impl.f_block_size > 0u) {
36670
        wuffs_bzip2__decoder__flush_fast(self, a_dst);
36671
        if (self->private_impl.f_block_size <= 0u) {
36672
          break;
36673
        }
36674
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
36675
        status = wuffs_bzip2__decoder__flush_slow(self, a_dst);
36676
        if (status.repr) {
36677
          goto suspend;
36678
        }
36679
      }
36680
      self->private_impl.f_block_checksum_have ^= 4294967295u;
36681
      if ( ! self->private_impl.f_ignore_checksum && (self->private_impl.f_block_checksum_have != self->private_impl.f_block_checksum_want)) {
36682
        status = wuffs_base__make_status(wuffs_bzip2__error__bad_checksum);
36683
        goto exit;
36684
      }
36685
      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))));
36686
    }
36687
    v_final_checksum_want = 0u;
36688
    v_i = 0u;
36689
    while (v_i < 32u) {
36690
      if (self->private_impl.f_n_bits <= 0u) {
36691
        {
36692
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
36693
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
36694
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
36695
            goto suspend;
36696
          }
36697
          uint8_t t_5 = *iop_a_src++;
36698
          v_c8 = t_5;
36699
        }
36700
        self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u);
36701
        self->private_impl.f_n_bits = 8u;
36702
      }
36703
      v_final_checksum_want <<= 1u;
36704
      v_final_checksum_want |= (self->private_impl.f_bits >> 31u);
36705
      self->private_impl.f_bits <<= 1u;
36706
      self->private_impl.f_n_bits -= 1u;
36707
      v_i += 1u;
36708
    }
36709
    if ( ! self->private_impl.f_ignore_checksum && (self->private_impl.f_final_checksum_have != v_final_checksum_want)) {
36710
      status = wuffs_base__make_status(wuffs_bzip2__error__bad_checksum);
36711
      goto exit;
36712
    }
36713
36714
    goto ok;
36715
    ok:
36716
    self->private_impl.p_do_transform_io = 0;
36717
    goto exit;
36718
  }
36719
36720
  goto suspend;
36721
  suspend:
36722
  self->private_impl.p_do_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
36723
  self->private_data.s_do_transform_io.v_i = v_i;
36724
  self->private_data.s_do_transform_io.v_tag = v_tag;
36725
  self->private_data.s_do_transform_io.v_final_checksum_want = v_final_checksum_want;
36726
36727
  goto exit;
36728
  exit:
36729
  if (a_src && a_src->data.ptr) {
36730
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
36731
  }
36732
36733
  return status;
36734
}
36735
36736
// -------- func bzip2.decoder.prepare_block
36737
36738
WUFFS_BASE__GENERATED_C_CODE
36739
static wuffs_base__status
36740
wuffs_bzip2__decoder__prepare_block(
36741
    wuffs_bzip2__decoder* self,
36742
    wuffs_base__io_buffer* a_src) {
36743
  wuffs_base__status status = wuffs_base__make_status(NULL);
36744
36745
  uint8_t v_c8 = 0;
36746
  uint32_t v_i = 0;
36747
  uint32_t v_j = 0;
36748
  uint32_t v_selector = 0;
36749
  uint32_t v_sel_ff = 0;
36750
  uint8_t v_movee = 0;
36751
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
36752
36753
  const uint8_t* iop_a_src = NULL;
36754
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
36755
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
36756
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
36757
  if (a_src && a_src->data.ptr) {
36758
    io0_a_src = a_src->data.ptr;
36759
    io1_a_src = io0_a_src + a_src->meta.ri;
36760
    iop_a_src = io1_a_src;
36761
    io2_a_src = io0_a_src + a_src->meta.wi;
36762
  }
36763
36764
  uint32_t coro_susp_point = self->private_impl.p_prepare_block;
36765
  if (coro_susp_point) {
36766
    v_i = self->private_data.s_prepare_block.v_i;
36767
    v_selector = self->private_data.s_prepare_block.v_selector;
36768
  }
36769
  switch (coro_susp_point) {
36770
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
36771
36772
    self->private_impl.f_block_checksum_want = 0u;
36773
    v_i = 0u;
36774
    while (v_i < 32u) {
36775
      if (self->private_impl.f_n_bits <= 0u) {
36776
        {
36777
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
36778
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
36779
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
36780
            goto suspend;
36781
          }
36782
          uint8_t t_0 = *iop_a_src++;
36783
          v_c8 = t_0;
36784
        }
36785
        self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u);
36786
        self->private_impl.f_n_bits = 8u;
36787
      }
36788
      self->private_impl.f_block_checksum_want <<= 1u;
36789
      self->private_impl.f_block_checksum_want |= (self->private_impl.f_bits >> 31u);
36790
      self->private_impl.f_bits <<= 1u;
36791
      self->private_impl.f_n_bits -= 1u;
36792
      v_i += 1u;
36793
    }
36794
    if (self->private_impl.f_n_bits <= 0u) {
36795
      {
36796
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
36797
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
36798
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
36799
          goto suspend;
36800
        }
36801
        uint8_t t_1 = *iop_a_src++;
36802
        v_c8 = t_1;
36803
      }
36804
      self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u);
36805
      self->private_impl.f_n_bits = 8u;
36806
    }
36807
    if ((self->private_impl.f_bits >> 31u) != 0u) {
36808
      status = wuffs_base__make_status(wuffs_bzip2__error__unsupported_block_randomization);
36809
      goto exit;
36810
    }
36811
    self->private_impl.f_bits <<= 1u;
36812
    self->private_impl.f_n_bits -= 1u;
36813
    self->private_impl.f_original_pointer = 0u;
36814
    v_i = 0u;
36815
    while (v_i < 24u) {
36816
      if (self->private_impl.f_n_bits <= 0u) {
36817
        {
36818
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
36819
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
36820
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
36821
            goto suspend;
36822
          }
36823
          uint8_t t_2 = *iop_a_src++;
36824
          v_c8 = t_2;
36825
        }
36826
        self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u);
36827
        self->private_impl.f_n_bits = 8u;
36828
      }
36829
      self->private_impl.f_original_pointer <<= 1u;
36830
      self->private_impl.f_original_pointer |= (self->private_impl.f_bits >> 31u);
36831
      self->private_impl.f_bits <<= 1u;
36832
      self->private_impl.f_n_bits -= 1u;
36833
      v_i += 1u;
36834
    }
36835
    v_i = 0u;
36836
    while (v_i < 256u) {
36837
      self->private_data.f_presence[v_i] = 0u;
36838
      v_i += 1u;
36839
    }
36840
    v_i = 0u;
36841
    while (v_i < 256u) {
36842
      if (self->private_impl.f_n_bits <= 0u) {
36843
        {
36844
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
36845
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
36846
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
36847
            goto suspend;
36848
          }
36849
          uint8_t t_3 = *iop_a_src++;
36850
          v_c8 = t_3;
36851
        }
36852
        self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u);
36853
        self->private_impl.f_n_bits = 8u;
36854
      }
36855
      if ((self->private_impl.f_bits >> 31u) != 0u) {
36856
        self->private_data.f_presence[v_i] = 1u;
36857
      }
36858
      self->private_impl.f_bits <<= 1u;
36859
      self->private_impl.f_n_bits -= 1u;
36860
      v_i += 16u;
36861
    }
36862
    self->private_data.f_scratch = 0u;
36863
    v_i = 0u;
36864
    while (v_i < 256u) {
36865
      if (self->private_data.f_presence[v_i] == 0u) {
36866
        v_i += 16u;
36867
        continue;
36868
      }
36869
      while (true) {
36870
        if (self->private_impl.f_n_bits <= 0u) {
36871
          {
36872
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
36873
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
36874
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
36875
              goto suspend;
36876
            }
36877
            uint8_t t_4 = *iop_a_src++;
36878
            v_c8 = t_4;
36879
          }
36880
          self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u);
36881
          self->private_impl.f_n_bits = 8u;
36882
        }
36883
        self->private_data.f_scratch += (self->private_impl.f_bits >> 31u);
36884
        self->private_data.f_presence[(v_i & 255u)] = ((uint8_t)((self->private_impl.f_bits >> 31u)));
36885
        self->private_impl.f_bits <<= 1u;
36886
        self->private_impl.f_n_bits -= 1u;
36887
        v_i += 1u;
36888
        if ((v_i & 15u) == 0u) {
36889
          break;
36890
        }
36891
      }
36892
    }
36893
    if ((self->private_data.f_scratch < 1u) || (256u < self->private_data.f_scratch)) {
36894
      status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header);
36895
      goto exit;
36896
    }
36897
    self->private_impl.f_num_symbols = (self->private_data.f_scratch + 2u);
36898
    self->private_data.f_scratch = 0u;
36899
    v_i = 0u;
36900
    while (v_i < 3u) {
36901
      if (self->private_impl.f_n_bits <= 0u) {
36902
        {
36903
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
36904
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
36905
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
36906
            goto suspend;
36907
          }
36908
          uint8_t t_5 = *iop_a_src++;
36909
          v_c8 = t_5;
36910
        }
36911
        self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u);
36912
        self->private_impl.f_n_bits = 8u;
36913
      }
36914
      self->private_data.f_scratch <<= 1u;
36915
      self->private_data.f_scratch |= (self->private_impl.f_bits >> 31u);
36916
      self->private_impl.f_bits <<= 1u;
36917
      self->private_impl.f_n_bits -= 1u;
36918
      v_i += 1u;
36919
    }
36920
    if ((self->private_data.f_scratch < 2u) || (6u < self->private_data.f_scratch)) {
36921
      status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header);
36922
      goto exit;
36923
    }
36924
    self->private_impl.f_num_huffman_codes = self->private_data.f_scratch;
36925
    self->private_data.f_scratch = 0u;
36926
    v_i = 0u;
36927
    while (v_i < 15u) {
36928
      if (self->private_impl.f_n_bits <= 0u) {
36929
        {
36930
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
36931
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
36932
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
36933
            goto suspend;
36934
          }
36935
          uint8_t t_6 = *iop_a_src++;
36936
          v_c8 = t_6;
36937
        }
36938
        self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u);
36939
        self->private_impl.f_n_bits = 8u;
36940
      }
36941
      self->private_data.f_scratch <<= 1u;
36942
      self->private_data.f_scratch |= (self->private_impl.f_bits >> 31u);
36943
      self->private_impl.f_bits <<= 1u;
36944
      self->private_impl.f_n_bits -= 1u;
36945
      v_i += 1u;
36946
    }
36947
    if ((self->private_data.f_scratch < 1u) || (18001u < self->private_data.f_scratch)) {
36948
      status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header);
36949
      goto exit;
36950
    }
36951
    self->private_impl.f_num_sections = self->private_data.f_scratch;
36952
    v_i = 0u;
36953
    while (v_i < self->private_impl.f_num_huffman_codes) {
36954
      self->private_data.f_mtft[v_i] = ((uint8_t)(v_i));
36955
      v_i += 1u;
36956
    }
36957
    v_i = 0u;
36958
    while (v_i < self->private_impl.f_num_sections) {
36959
      v_selector = 0u;
36960
      while (true) {
36961
        if (self->private_impl.f_n_bits <= 0u) {
36962
          {
36963
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
36964
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
36965
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
36966
              goto suspend;
36967
            }
36968
            uint8_t t_7 = *iop_a_src++;
36969
            v_c8 = t_7;
36970
          }
36971
          self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u);
36972
          self->private_impl.f_n_bits = 8u;
36973
        }
36974
        if ((self->private_impl.f_bits >> 31u) == 0u) {
36975
          self->private_impl.f_bits <<= 1u;
36976
          self->private_impl.f_n_bits -= 1u;
36977
          break;
36978
        }
36979
        self->private_impl.f_bits <<= 1u;
36980
        self->private_impl.f_n_bits -= 1u;
36981
        v_selector += 1u;
36982
        if (v_selector >= self->private_impl.f_num_huffman_codes) {
36983
          status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header);
36984
          goto exit;
36985
        }
36986
      }
36987
      if (v_selector == 0u) {
36988
        self->private_data.f_huffman_selectors[v_i] = self->private_data.f_mtft[0u];
36989
      } else {
36990
        v_sel_ff = (v_selector & 255u);
36991
        v_movee = self->private_data.f_mtft[v_sel_ff];
36992
        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));
36993
        self->private_data.f_mtft[0u] = v_movee;
36994
        self->private_data.f_huffman_selectors[v_i] = v_movee;
36995
      }
36996
      v_i += 1u;
36997
    }
36998
    v_i = 0u;
36999
    while (v_i < self->private_impl.f_num_huffman_codes) {
37000
      if (a_src) {
37001
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
37002
      }
37003
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
37004
      status = wuffs_bzip2__decoder__read_code_lengths(self, a_src);
37005
      if (a_src) {
37006
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
37007
      }
37008
      if (status.repr) {
37009
        goto suspend;
37010
      }
37011
      v_status = wuffs_bzip2__decoder__build_huffman_tree(self, v_i);
37012
      if (wuffs_base__status__is_error(&v_status)) {
37013
        status = v_status;
37014
        goto exit;
37015
      }
37016
      wuffs_bzip2__decoder__build_huffman_table(self, v_i);
37017
      v_i += 1u;
37018
    }
37019
    v_i = 0u;
37020
    v_j = 0u;
37021
    while (v_i < 256u) {
37022
      if (self->private_data.f_presence[v_i] != 0u) {
37023
        self->private_data.f_mtft[(v_j & 255u)] = ((uint8_t)(v_i));
37024
        v_j += 1u;
37025
      }
37026
      v_i += 1u;
37027
    }
37028
    v_i = 0u;
37029
    while (v_i < 256u) {
37030
      self->private_data.f_letter_counts[v_i] = 0u;
37031
      v_i += 1u;
37032
    }
37033
37034
    goto ok;
37035
    ok:
37036
    self->private_impl.p_prepare_block = 0;
37037
    goto exit;
37038
  }
37039
37040
  goto suspend;
37041
  suspend:
37042
  self->private_impl.p_prepare_block = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
37043
  self->private_data.s_prepare_block.v_i = v_i;
37044
  self->private_data.s_prepare_block.v_selector = v_selector;
37045
37046
  goto exit;
37047
  exit:
37048
  if (a_src && a_src->data.ptr) {
37049
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
37050
  }
37051
37052
  return status;
37053
}
37054
37055
// -------- func bzip2.decoder.read_code_lengths
37056
37057
WUFFS_BASE__GENERATED_C_CODE
37058
static wuffs_base__status
37059
wuffs_bzip2__decoder__read_code_lengths(
37060
    wuffs_bzip2__decoder* self,
37061
    wuffs_base__io_buffer* a_src) {
37062
  wuffs_base__status status = wuffs_base__make_status(NULL);
37063
37064
  uint8_t v_c8 = 0;
37065
  uint32_t v_i = 0;
37066
  uint32_t v_code_length = 0;
37067
37068
  const uint8_t* iop_a_src = NULL;
37069
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
37070
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
37071
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
37072
  if (a_src && a_src->data.ptr) {
37073
    io0_a_src = a_src->data.ptr;
37074
    io1_a_src = io0_a_src + a_src->meta.ri;
37075
    iop_a_src = io1_a_src;
37076
    io2_a_src = io0_a_src + a_src->meta.wi;
37077
  }
37078
37079
  uint32_t coro_susp_point = self->private_impl.p_read_code_lengths;
37080
  if (coro_susp_point) {
37081
    v_i = self->private_data.s_read_code_lengths.v_i;
37082
    v_code_length = self->private_data.s_read_code_lengths.v_code_length;
37083
  }
37084
  switch (coro_susp_point) {
37085
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
37086
37087
    self->private_impl.f_code_lengths_bitmask = 0u;
37088
    v_i = 0u;
37089
    while (v_i < 5u) {
37090
      if (self->private_impl.f_n_bits <= 0u) {
37091
        {
37092
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
37093
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
37094
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
37095
            goto suspend;
37096
          }
37097
          uint8_t t_0 = *iop_a_src++;
37098
          v_c8 = t_0;
37099
        }
37100
        self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u);
37101
        self->private_impl.f_n_bits = 8u;
37102
      }
37103
      v_code_length <<= 1u;
37104
      v_code_length |= (self->private_impl.f_bits >> 31u);
37105
      self->private_impl.f_bits <<= 1u;
37106
      self->private_impl.f_n_bits -= 1u;
37107
      v_i += 1u;
37108
    }
37109
    v_i = 0u;
37110
    while (v_i < self->private_impl.f_num_symbols) {
37111
      while (true) {
37112
        if ((v_code_length < 1u) || (20u < v_code_length)) {
37113
          status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header);
37114
          goto exit;
37115
        }
37116
        if (self->private_impl.f_n_bits <= 0u) {
37117
          {
37118
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
37119
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
37120
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
37121
              goto suspend;
37122
            }
37123
            uint8_t t_1 = *iop_a_src++;
37124
            v_c8 = t_1;
37125
          }
37126
          self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u);
37127
          self->private_impl.f_n_bits = 8u;
37128
        }
37129
        if ((self->private_impl.f_bits >> 31u) == 0u) {
37130
          self->private_impl.f_bits <<= 1u;
37131
          self->private_impl.f_n_bits -= 1u;
37132
          break;
37133
        }
37134
        self->private_impl.f_bits <<= 1u;
37135
        self->private_impl.f_n_bits -= 1u;
37136
        if (self->private_impl.f_n_bits <= 0u) {
37137
          {
37138
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
37139
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
37140
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
37141
              goto suspend;
37142
            }
37143
            uint8_t t_2 = *iop_a_src++;
37144
            v_c8 = t_2;
37145
          }
37146
          self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u);
37147
          self->private_impl.f_n_bits = 8u;
37148
        }
37149
        if ((self->private_impl.f_bits >> 31u) == 0u) {
37150
          v_code_length += 1u;
37151
        } else {
37152
          v_code_length -= 1u;
37153
        }
37154
        self->private_impl.f_bits <<= 1u;
37155
        self->private_impl.f_n_bits -= 1u;
37156
      }
37157
      self->private_impl.f_code_lengths_bitmask |= (((uint32_t)(1u)) << (v_code_length & 31u));
37158
      self->private_data.f_bwt[v_i] = v_code_length;
37159
      v_i += 1u;
37160
    }
37161
37162
    goto ok;
37163
    ok:
37164
    self->private_impl.p_read_code_lengths = 0;
37165
    goto exit;
37166
  }
37167
37168
  goto suspend;
37169
  suspend:
37170
  self->private_impl.p_read_code_lengths = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
37171
  self->private_data.s_read_code_lengths.v_i = v_i;
37172
  self->private_data.s_read_code_lengths.v_code_length = v_code_length;
37173
37174
  goto exit;
37175
  exit:
37176
  if (a_src && a_src->data.ptr) {
37177
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
37178
  }
37179
37180
  return status;
37181
}
37182
37183
// -------- func bzip2.decoder.build_huffman_tree
37184
37185
WUFFS_BASE__GENERATED_C_CODE
37186
static wuffs_base__status
37187
wuffs_bzip2__decoder__build_huffman_tree(
37188
    wuffs_bzip2__decoder* self,
37189
    uint32_t a_which) {
37190
  uint32_t v_code_length = 0;
37191
  uint32_t v_symbol_index = 0;
37192
  uint32_t v_num_branch_nodes = 0;
37193
  uint32_t v_stack_height = 0;
37194
  uint32_t v_stack_values[21] = {0};
37195
  uint32_t v_node_index = 0;
37196
  uint16_t v_leaf_value = 0;
37197
37198
  self->private_data.f_huffman_trees[a_which][0u][0u] = 0u;
37199
  self->private_data.f_huffman_trees[a_which][0u][1u] = 0u;
37200
  v_num_branch_nodes = 1u;
37201
  v_stack_height = 1u;
37202
  v_stack_values[0u] = 0u;
37203
  v_code_length = 1u;
37204
  while (v_code_length <= 20u) {
37205
    if ((self->private_impl.f_code_lengths_bitmask & (((uint32_t)(1u)) << v_code_length)) == 0u) {
37206
      v_code_length += 1u;
37207
      continue;
37208
    }
37209
    v_symbol_index = 0u;
37210
    while (v_symbol_index < self->private_impl.f_num_symbols) {
37211
      if (self->private_data.f_bwt[v_symbol_index] != v_code_length) {
37212
        v_symbol_index += 1u;
37213
        continue;
37214
      }
37215
      while (true) {
37216
        if (v_stack_height <= 0u) {
37217
          return wuffs_base__make_status(wuffs_bzip2__error__bad_huffman_code_over_subscribed);
37218
        } else if (v_stack_height >= v_code_length) {
37219
          break;
37220
        }
37221
        v_node_index = v_stack_values[(v_stack_height - 1u)];
37222
        if (self->private_data.f_huffman_trees[a_which][v_node_index][0u] == 0u) {
37223
          self->private_data.f_huffman_trees[a_which][v_node_index][0u] = ((uint16_t)(v_num_branch_nodes));
37224
        } else {
37225
          self->private_data.f_huffman_trees[a_which][v_node_index][1u] = ((uint16_t)(v_num_branch_nodes));
37226
        }
37227
        if (v_num_branch_nodes >= 257u) {
37228
          return wuffs_base__make_status(wuffs_bzip2__error__bad_huffman_code_under_subscribed);
37229
        }
37230
        v_stack_values[v_stack_height] = v_num_branch_nodes;
37231
        self->private_data.f_huffman_trees[a_which][v_num_branch_nodes][0u] = 0u;
37232
        self->private_data.f_huffman_trees[a_which][v_num_branch_nodes][1u] = 0u;
37233
        v_num_branch_nodes += 1u;
37234
        v_stack_height += 1u;
37235
      }
37236
      v_node_index = v_stack_values[(v_stack_height - 1u)];
37237
      if (v_symbol_index < 2u) {
37238
        v_leaf_value = ((uint16_t)((769u + v_symbol_index)));
37239
      } else if ((v_symbol_index + 1u) < self->private_impl.f_num_symbols) {
37240
        v_leaf_value = ((uint16_t)((511u + v_symbol_index)));
37241
      } else {
37242
        v_leaf_value = 768u;
37243
      }
37244
      if (self->private_data.f_huffman_trees[a_which][v_node_index][0u] == 0u) {
37245
        self->private_data.f_huffman_trees[a_which][v_node_index][0u] = v_leaf_value;
37246
      } else {
37247
        self->private_data.f_huffman_trees[a_which][v_node_index][1u] = v_leaf_value;
37248
        v_stack_height -= 1u;
37249
        while (v_stack_height > 0u) {
37250
          v_node_index = v_stack_values[(v_stack_height - 1u)];
37251
          if (self->private_data.f_huffman_trees[a_which][v_node_index][1u] == 0u) {
37252
            break;
37253
          }
37254
          v_stack_height -= 1u;
37255
        }
37256
      }
37257
      v_symbol_index += 1u;
37258
    }
37259
    v_code_length += 1u;
37260
  }
37261
  if (v_stack_height != 0u) {
37262
    return wuffs_base__make_status(wuffs_bzip2__error__bad_huffman_code_under_subscribed);
37263
  }
37264
  return wuffs_base__make_status(NULL);
37265
}
37266
37267
// -------- func bzip2.decoder.build_huffman_table
37268
37269
WUFFS_BASE__GENERATED_C_CODE
37270
static wuffs_base__empty_struct
37271
wuffs_bzip2__decoder__build_huffman_table(
37272
    wuffs_bzip2__decoder* self,
37273
    uint32_t a_which) {
37274
  uint32_t v_i = 0;
37275
  uint32_t v_bits = 0;
37276
  uint16_t v_n_bits = 0;
37277
  uint16_t v_child = 0;
37278
37279
  while (v_i < 256u) {
37280
    v_bits = (v_i << 24u);
37281
    v_n_bits = 0u;
37282
    v_child = 0u;
37283
    while ((v_child < 257u) && (v_n_bits < 8u)) {
37284
      v_child = self->private_data.f_huffman_trees[a_which][v_child][(v_bits >> 31u)];
37285
      v_bits <<= 1u;
37286
#if defined(__GNUC__)
37287
#pragma GCC diagnostic push
37288
#pragma GCC diagnostic ignored "-Wconversion"
37289
#endif
37290
      v_n_bits += 1u;
37291
#if defined(__GNUC__)
37292
#pragma GCC diagnostic pop
37293
#endif
37294
    }
37295
    self->private_data.f_huffman_tables[a_which][v_i] = ((uint16_t)(((uint16_t)(v_child | ((uint16_t)(v_n_bits << 12u))))));
37296
    v_i += 1u;
37297
  }
37298
  return wuffs_base__make_empty_struct();
37299
}
37300
37301
// -------- func bzip2.decoder.invert_bwt
37302
37303
WUFFS_BASE__GENERATED_C_CODE
37304
static wuffs_base__empty_struct
37305
wuffs_bzip2__decoder__invert_bwt(
37306
    wuffs_bzip2__decoder* self) {
37307
  uint32_t v_i = 0;
37308
  uint32_t v_letter = 0;
37309
  uint32_t v_sum = 0;
37310
  uint32_t v_old_sum = 0;
37311
37312
  v_sum = 0u;
37313
  v_i = 0u;
37314
  while (v_i < 256u) {
37315
    v_old_sum = v_sum;
37316
    v_sum += self->private_data.f_letter_counts[v_i];
37317
    self->private_data.f_letter_counts[v_i] = v_old_sum;
37318
    v_i += 1u;
37319
  }
37320
  v_i = 0u;
37321
  while (v_i < self->private_impl.f_block_size) {
37322
    v_letter = (self->private_data.f_bwt[v_i] & 255u);
37323
    self->private_data.f_bwt[(self->private_data.f_letter_counts[v_letter] & 1048575u)] |= (v_i << 12u);
37324
    self->private_data.f_letter_counts[v_letter] += 1u;
37325
    v_i += 1u;
37326
  }
37327
  return wuffs_base__make_empty_struct();
37328
}
37329
37330
// -------- func bzip2.decoder.flush_fast
37331
37332
WUFFS_BASE__GENERATED_C_CODE
37333
static wuffs_base__empty_struct
37334
wuffs_bzip2__decoder__flush_fast(
37335
    wuffs_bzip2__decoder* self,
37336
    wuffs_base__io_buffer* a_dst) {
37337
  uint32_t v_flush_pointer = 0;
37338
  uint32_t v_flush_repeat_count = 0;
37339
  uint8_t v_flush_prev = 0;
37340
  uint32_t v_block_checksum_have = 0;
37341
  uint32_t v_block_size = 0;
37342
  uint32_t v_entry = 0;
37343
  uint8_t v_curr = 0;
37344
37345
  uint8_t* iop_a_dst = NULL;
37346
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
37347
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
37348
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
37349
  if (a_dst && a_dst->data.ptr) {
37350
    io0_a_dst = a_dst->data.ptr;
37351
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
37352
    iop_a_dst = io1_a_dst;
37353
    io2_a_dst = io0_a_dst + a_dst->data.len;
37354
    if (a_dst->meta.closed) {
37355
      io2_a_dst = iop_a_dst;
37356
    }
37357
  }
37358
37359
  v_flush_pointer = self->private_impl.f_flush_pointer;
37360
  v_flush_repeat_count = self->private_impl.f_flush_repeat_count;
37361
  v_flush_prev = self->private_impl.f_flush_prev;
37362
  v_block_checksum_have = self->private_impl.f_block_checksum_have;
37363
  v_block_size = self->private_impl.f_block_size;
37364
  while ((v_block_size > 0u) && (((uint64_t)(io2_a_dst - iop_a_dst)) >= 255u)) {
37365
    if (v_flush_repeat_count < 4u) {
37366
      v_entry = self->private_data.f_bwt[v_flush_pointer];
37367
      v_curr = ((uint8_t)(v_entry));
37368
      v_flush_pointer = (v_entry >> 12u);
37369
      if (v_curr == v_flush_prev) {
37370
        v_flush_repeat_count += 1u;
37371
      } else {
37372
        v_flush_repeat_count = 1u;
37373
      }
37374
      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)));
37375
      (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, v_curr), iop_a_dst += 1);
37376
      v_flush_prev = v_curr;
37377
      v_block_size -= 1u;
37378
    } else {
37379
      v_entry = self->private_data.f_bwt[v_flush_pointer];
37380
      v_curr = ((uint8_t)(v_entry));
37381
      v_flush_pointer = (v_entry >> 12u);
37382
      v_flush_repeat_count = ((uint32_t)(v_curr));
37383
      while (v_flush_repeat_count > 0u) {
37384
        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)));
37385
        if (((uint64_t)(io2_a_dst - iop_a_dst)) > 0u) {
37386
          (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, v_flush_prev), iop_a_dst += 1);
37387
        }
37388
        v_flush_repeat_count -= 1u;
37389
      }
37390
      v_flush_repeat_count = 0u;
37391
      v_flush_prev = v_curr;
37392
      v_block_size -= 1u;
37393
    }
37394
  }
37395
  self->private_impl.f_flush_pointer = v_flush_pointer;
37396
  self->private_impl.f_flush_repeat_count = v_flush_repeat_count;
37397
  self->private_impl.f_flush_prev = v_flush_prev;
37398
  self->private_impl.f_block_checksum_have = v_block_checksum_have;
37399
  if (v_block_size <= 900000u) {
37400
    self->private_impl.f_block_size = v_block_size;
37401
  }
37402
  if (a_dst && a_dst->data.ptr) {
37403
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
37404
  }
37405
37406
  return wuffs_base__make_empty_struct();
37407
}
37408
37409
// -------- func bzip2.decoder.flush_slow
37410
37411
WUFFS_BASE__GENERATED_C_CODE
37412
static wuffs_base__status
37413
wuffs_bzip2__decoder__flush_slow(
37414
    wuffs_bzip2__decoder* self,
37415
    wuffs_base__io_buffer* a_dst) {
37416
  wuffs_base__status status = wuffs_base__make_status(NULL);
37417
37418
  uint32_t v_flush_pointer = 0;
37419
  uint32_t v_flush_repeat_count = 0;
37420
  uint8_t v_flush_prev = 0;
37421
  uint32_t v_block_checksum_have = 0;
37422
  uint32_t v_block_size = 0;
37423
  uint32_t v_entry = 0;
37424
  uint8_t v_curr = 0;
37425
37426
  uint8_t* iop_a_dst = NULL;
37427
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
37428
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
37429
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
37430
  if (a_dst && a_dst->data.ptr) {
37431
    io0_a_dst = a_dst->data.ptr;
37432
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
37433
    iop_a_dst = io1_a_dst;
37434
    io2_a_dst = io0_a_dst + a_dst->data.len;
37435
    if (a_dst->meta.closed) {
37436
      io2_a_dst = iop_a_dst;
37437
    }
37438
  }
37439
37440
  uint32_t coro_susp_point = self->private_impl.p_flush_slow;
37441
  if (coro_susp_point) {
37442
    v_flush_pointer = self->private_data.s_flush_slow.v_flush_pointer;
37443
    v_flush_repeat_count = self->private_data.s_flush_slow.v_flush_repeat_count;
37444
    v_flush_prev = self->private_data.s_flush_slow.v_flush_prev;
37445
    v_block_checksum_have = self->private_data.s_flush_slow.v_block_checksum_have;
37446
    v_block_size = self->private_data.s_flush_slow.v_block_size;
37447
    v_curr = self->private_data.s_flush_slow.v_curr;
37448
  }
37449
  switch (coro_susp_point) {
37450
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
37451
37452
    v_flush_pointer = self->private_impl.f_flush_pointer;
37453
    v_flush_repeat_count = self->private_impl.f_flush_repeat_count;
37454
    v_flush_prev = self->private_impl.f_flush_prev;
37455
    v_block_checksum_have = self->private_impl.f_block_checksum_have;
37456
    v_block_size = self->private_impl.f_block_size;
37457
    while ((v_block_size > 0u) &&  ! (self->private_impl.p_flush_slow != 0)) {
37458
      if (v_flush_repeat_count < 4u) {
37459
        v_entry = self->private_data.f_bwt[v_flush_pointer];
37460
        v_curr = ((uint8_t)(v_entry));
37461
        v_flush_pointer = (v_entry >> 12u);
37462
        if (v_curr == v_flush_prev) {
37463
          v_flush_repeat_count += 1u;
37464
        } else {
37465
          v_flush_repeat_count = 1u;
37466
        }
37467
        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)));
37468
        self->private_data.s_flush_slow.scratch = v_curr;
37469
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
37470
        if (iop_a_dst == io2_a_dst) {
37471
          status = wuffs_base__make_status(wuffs_base__suspension__short_write);
37472
          goto suspend;
37473
        }
37474
        *iop_a_dst++ = ((uint8_t)(self->private_data.s_flush_slow.scratch));
37475
        v_flush_prev = v_curr;
37476
        v_block_size -= 1u;
37477
      } else {
37478
        v_entry = self->private_data.f_bwt[v_flush_pointer];
37479
        v_curr = ((uint8_t)(v_entry));
37480
        v_flush_pointer = (v_entry >> 12u);
37481
        v_flush_repeat_count = ((uint32_t)(v_curr));
37482
        while (v_flush_repeat_count > 0u) {
37483
          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)));
37484
          self->private_data.s_flush_slow.scratch = v_flush_prev;
37485
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
37486
          if (iop_a_dst == io2_a_dst) {
37487
            status = wuffs_base__make_status(wuffs_base__suspension__short_write);
37488
            goto suspend;
37489
          }
37490
          *iop_a_dst++ = ((uint8_t)(self->private_data.s_flush_slow.scratch));
37491
          v_flush_repeat_count -= 1u;
37492
        }
37493
        v_flush_repeat_count = 0u;
37494
        v_flush_prev = v_curr;
37495
        v_block_size -= 1u;
37496
      }
37497
    }
37498
    self->private_impl.f_flush_pointer = v_flush_pointer;
37499
    self->private_impl.f_flush_repeat_count = v_flush_repeat_count;
37500
    self->private_impl.f_flush_prev = v_flush_prev;
37501
    self->private_impl.f_block_checksum_have = v_block_checksum_have;
37502
    if (v_block_size <= 900000u) {
37503
      self->private_impl.f_block_size = v_block_size;
37504
    }
37505
37506
    goto ok;
37507
    ok:
37508
    self->private_impl.p_flush_slow = 0;
37509
    goto exit;
37510
  }
37511
37512
  goto suspend;
37513
  suspend:
37514
  self->private_impl.p_flush_slow = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
37515
  self->private_data.s_flush_slow.v_flush_pointer = v_flush_pointer;
37516
  self->private_data.s_flush_slow.v_flush_repeat_count = v_flush_repeat_count;
37517
  self->private_data.s_flush_slow.v_flush_prev = v_flush_prev;
37518
  self->private_data.s_flush_slow.v_block_checksum_have = v_block_checksum_have;
37519
  self->private_data.s_flush_slow.v_block_size = v_block_size;
37520
  self->private_data.s_flush_slow.v_curr = v_curr;
37521
37522
  goto exit;
37523
  exit:
37524
  if (a_dst && a_dst->data.ptr) {
37525
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
37526
  }
37527
37528
  return status;
37529
}
37530
37531
// -------- func bzip2.decoder.decode_huffman_fast
37532
37533
WUFFS_BASE__GENERATED_C_CODE
37534
static wuffs_base__status
37535
wuffs_bzip2__decoder__decode_huffman_fast(
37536
    wuffs_bzip2__decoder* self,
37537
    wuffs_base__io_buffer* a_src) {
37538
  wuffs_base__status status = wuffs_base__make_status(NULL);
37539
37540
  uint32_t v_bits = 0;
37541
  uint32_t v_n_bits = 0;
37542
  uint32_t v_block_size = 0;
37543
  uint8_t v_which = 0;
37544
  uint32_t v_ticks = 0;
37545
  uint32_t v_section = 0;
37546
  uint32_t v_run_shift = 0;
37547
  uint16_t v_table_entry = 0;
37548
  uint16_t v_child = 0;
37549
  uint32_t v_child_ff = 0;
37550
  uint32_t v_i = 0;
37551
  uint32_t v_j = 0;
37552
  uint32_t v_output = 0;
37553
  uint32_t v_run = 0;
37554
  uint32_t v_mtft0 = 0;
37555
37556
  const uint8_t* iop_a_src = NULL;
37557
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
37558
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
37559
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
37560
  if (a_src && a_src->data.ptr) {
37561
    io0_a_src = a_src->data.ptr;
37562
    io1_a_src = io0_a_src + a_src->meta.ri;
37563
    iop_a_src = io1_a_src;
37564
    io2_a_src = io0_a_src + a_src->meta.wi;
37565
  }
37566
37567
  v_bits = self->private_impl.f_bits;
37568
  v_n_bits = self->private_impl.f_n_bits;
37569
  v_block_size = self->private_impl.f_block_size;
37570
  v_which = self->private_impl.f_decode_huffman_which;
37571
  v_ticks = self->private_impl.f_decode_huffman_ticks;
37572
  v_section = self->private_impl.f_decode_huffman_section;
37573
  v_run_shift = self->private_impl.f_decode_huffman_run_shift;
37574
  while (((uint64_t)(io2_a_src - iop_a_src)) >= 4u) {
37575
    if (v_ticks > 0u) {
37576
      v_ticks -= 1u;
37577
    } else {
37578
      v_ticks = 49u;
37579
      v_section += 1u;
37580
      if (v_section >= self->private_impl.f_num_sections) {
37581
        status = wuffs_base__make_status(wuffs_bzip2__error__bad_number_of_sections);
37582
        goto exit;
37583
      }
37584
      v_which = WUFFS_BZIP2__CLAMP_TO_5[((uint8_t)(self->private_data.f_huffman_selectors[(v_section & 32767u)] & 7u))];
37585
    }
37586
    v_bits |= (wuffs_base__peek_u32be__no_bounds_check(iop_a_src) >> v_n_bits);
37587
    iop_a_src += ((31u - v_n_bits) >> 3u);
37588
    v_n_bits |= 24u;
37589
    v_table_entry = self->private_data.f_huffman_tables[v_which][(v_bits >> 24u)];
37590
    v_bits <<= ((uint16_t)(v_table_entry >> 12u));
37591
    v_n_bits -= ((uint32_t)(((uint16_t)(v_table_entry >> 12u))));
37592
    v_child = ((uint16_t)(v_table_entry & 1023u));
37593
    while (v_child < 257u) {
37594
      v_child = self->private_data.f_huffman_trees[v_which][v_child][(v_bits >> 31u)];
37595
      v_bits <<= 1u;
37596
      if (v_n_bits <= 0u) {
37597
        status = wuffs_base__make_status(wuffs_bzip2__error__internal_error_inconsistent_huffman_decoder_state);
37598
        goto exit;
37599
      }
37600
      v_n_bits -= 1u;
37601
    }
37602
    if (v_child < 768u) {
37603
      v_child_ff = ((uint32_t)(((uint16_t)(v_child & 255u))));
37604
      v_output = ((uint32_t)(self->private_data.f_mtft[v_child_ff]));
37605
      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));
37606
      self->private_data.f_mtft[0u] = ((uint8_t)(v_output));
37607
      self->private_data.f_letter_counts[v_output] += 1u;
37608
      self->private_data.f_bwt[v_block_size] = v_output;
37609
      if (v_block_size >= self->private_impl.f_max_incl_block_size) {
37610
        status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length);
37611
        goto exit;
37612
      }
37613
      v_block_size += 1u;
37614
      v_run_shift = 0u;
37615
      continue;
37616
    } else if (v_child == 768u) {
37617
      self->private_impl.f_decode_huffman_finished = true;
37618
      break;
37619
    }
37620
    if (v_run_shift >= 23u) {
37621
      status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length);
37622
      goto exit;
37623
    }
37624
    v_run = ((((uint32_t)(v_child)) & 3u) << v_run_shift);
37625
    v_run_shift += 1u;
37626
    v_i = v_block_size;
37627
    v_j = (v_run + v_block_size);
37628
    if (v_j > self->private_impl.f_max_incl_block_size) {
37629
      status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length);
37630
      goto exit;
37631
    }
37632
    v_block_size = v_j;
37633
    v_mtft0 = ((uint32_t)(self->private_data.f_mtft[0u]));
37634
    self->private_data.f_letter_counts[v_mtft0] += v_run;
37635
    while (v_i < v_j) {
37636
      self->private_data.f_bwt[v_i] = v_mtft0;
37637
      v_i += 1u;
37638
    }
37639
  }
37640
  self->private_impl.f_bits = v_bits;
37641
  self->private_impl.f_n_bits = v_n_bits;
37642
  self->private_impl.f_block_size = v_block_size;
37643
  self->private_impl.f_decode_huffman_which = v_which;
37644
  self->private_impl.f_decode_huffman_ticks = v_ticks;
37645
  self->private_impl.f_decode_huffman_section = v_section;
37646
  self->private_impl.f_decode_huffman_run_shift = v_run_shift;
37647
  status = wuffs_base__make_status(NULL);
37648
  goto ok;
37649
37650
  ok:
37651
  goto exit;
37652
  exit:
37653
  if (a_src && a_src->data.ptr) {
37654
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
37655
  }
37656
37657
  return status;
37658
}
37659
37660
// -------- func bzip2.decoder.decode_huffman_slow
37661
37662
WUFFS_BASE__GENERATED_C_CODE
37663
static wuffs_base__status
37664
wuffs_bzip2__decoder__decode_huffman_slow(
37665
    wuffs_bzip2__decoder* self,
37666
    wuffs_base__io_buffer* a_src) {
37667
  wuffs_base__status status = wuffs_base__make_status(NULL);
37668
37669
  uint8_t v_c8 = 0;
37670
  uint32_t v_node_index = 0;
37671
  uint16_t v_child = 0;
37672
  uint32_t v_child_ff = 0;
37673
  uint32_t v_i = 0;
37674
  uint32_t v_j = 0;
37675
  uint32_t v_output = 0;
37676
  uint32_t v_run = 0;
37677
  uint32_t v_mtft0 = 0;
37678
37679
  const uint8_t* iop_a_src = NULL;
37680
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
37681
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
37682
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
37683
  if (a_src && a_src->data.ptr) {
37684
    io0_a_src = a_src->data.ptr;
37685
    io1_a_src = io0_a_src + a_src->meta.ri;
37686
    iop_a_src = io1_a_src;
37687
    io2_a_src = io0_a_src + a_src->meta.wi;
37688
  }
37689
37690
  uint32_t coro_susp_point = self->private_impl.p_decode_huffman_slow;
37691
  if (coro_susp_point) {
37692
    v_node_index = self->private_data.s_decode_huffman_slow.v_node_index;
37693
  }
37694
  switch (coro_susp_point) {
37695
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
37696
37697
    while ( ! (self->private_impl.p_decode_huffman_slow != 0)) {
37698
      if (self->private_impl.f_decode_huffman_ticks > 0u) {
37699
        self->private_impl.f_decode_huffman_ticks -= 1u;
37700
      } else {
37701
        self->private_impl.f_decode_huffman_ticks = 49u;
37702
        self->private_impl.f_decode_huffman_section += 1u;
37703
        if (self->private_impl.f_decode_huffman_section >= self->private_impl.f_num_sections) {
37704
          status = wuffs_base__make_status(wuffs_bzip2__error__bad_number_of_sections);
37705
          goto exit;
37706
        }
37707
        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))];
37708
      }
37709
      v_node_index = 0u;
37710
      while (true) {
37711
        if (self->private_impl.f_n_bits <= 0u) {
37712
          {
37713
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
37714
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
37715
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
37716
              goto suspend;
37717
            }
37718
            uint8_t t_0 = *iop_a_src++;
37719
            v_c8 = t_0;
37720
          }
37721
          self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u);
37722
          self->private_impl.f_n_bits = 8u;
37723
        }
37724
        v_child = self->private_data.f_huffman_trees[self->private_impl.f_decode_huffman_which][v_node_index][(self->private_impl.f_bits >> 31u)];
37725
        self->private_impl.f_bits <<= 1u;
37726
        self->private_impl.f_n_bits -= 1u;
37727
        if (v_child < 257u) {
37728
          v_node_index = ((uint32_t)(v_child));
37729
          continue;
37730
        } else if (v_child < 768u) {
37731
          v_child_ff = ((uint32_t)(((uint16_t)(v_child & 255u))));
37732
          v_output = ((uint32_t)(self->private_data.f_mtft[v_child_ff]));
37733
          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));
37734
          self->private_data.f_mtft[0u] = ((uint8_t)(v_output));
37735
          self->private_data.f_letter_counts[v_output] += 1u;
37736
          self->private_data.f_bwt[self->private_impl.f_block_size] = v_output;
37737
          if (self->private_impl.f_block_size >= self->private_impl.f_max_incl_block_size) {
37738
            status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length);
37739
            goto exit;
37740
          }
37741
          self->private_impl.f_block_size += 1u;
37742
          self->private_impl.f_decode_huffman_run_shift = 0u;
37743
          break;
37744
        } else if (v_child == 768u) {
37745
          self->private_impl.f_decode_huffman_finished = true;
37746
          goto label__outer__break;
37747
        }
37748
        if (self->private_impl.f_decode_huffman_run_shift >= 23u) {
37749
          status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length);
37750
          goto exit;
37751
        }
37752
        v_run = ((((uint32_t)(v_child)) & 3u) << self->private_impl.f_decode_huffman_run_shift);
37753
        self->private_impl.f_decode_huffman_run_shift += 1u;
37754
        v_i = self->private_impl.f_block_size;
37755
        v_j = (v_run + self->private_impl.f_block_size);
37756
        if (v_j > self->private_impl.f_max_incl_block_size) {
37757
          status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length);
37758
          goto exit;
37759
        }
37760
        self->private_impl.f_block_size = v_j;
37761
        v_mtft0 = ((uint32_t)(self->private_data.f_mtft[0u]));
37762
        self->private_data.f_letter_counts[v_mtft0] += v_run;
37763
        while (v_i < v_j) {
37764
          self->private_data.f_bwt[v_i] = v_mtft0;
37765
          v_i += 1u;
37766
        }
37767
        break;
37768
      }
37769
    }
37770
    label__outer__break:;
37771
37772
    goto ok;
37773
    ok:
37774
    self->private_impl.p_decode_huffman_slow = 0;
37775
    goto exit;
37776
  }
37777
37778
  goto suspend;
37779
  suspend:
37780
  self->private_impl.p_decode_huffman_slow = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
37781
  self->private_data.s_decode_huffman_slow.v_node_index = v_node_index;
37782
37783
  goto exit;
37784
  exit:
37785
  if (a_src && a_src->data.ptr) {
37786
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
37787
  }
37788
37789
  return status;
37790
}
37791
37792
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BZIP2)
37793
37794
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CBOR)
37795
37796
// ---------------- Status Codes Implementations
37797
37798
const char wuffs_cbor__error__bad_input[] = "#cbor: bad input";
37799
const char wuffs_cbor__error__unsupported_recursion_depth[] = "#cbor: unsupported recursion depth";
37800
const char wuffs_cbor__error__internal_error_inconsistent_i_o[] = "#cbor: internal error: inconsistent I/O";
37801
const char wuffs_cbor__error__internal_error_inconsistent_token_length[] = "#cbor: internal error: inconsistent token length";
37802
37803
// ---------------- Private Consts
37804
37805
static const uint32_t
37806
WUFFS_CBOR__LITERALS[4] WUFFS_BASE__POTENTIALLY_UNUSED = {
37807
  8388612u, 8388616u, 8388610u, 8388609u,
37808
};
37809
37810
static const uint8_t
37811
WUFFS_CBOR__TOKEN_LENGTHS[32] WUFFS_BASE__POTENTIALLY_UNUSED = {
37812
  1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u,
37813
  1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u,
37814
  1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u,
37815
  2u, 3u, 5u, 9u, 0u, 0u, 0u, 1u,
37816
};
37817
37818
// ---------------- Private Initializer Prototypes
37819
37820
// ---------------- Private Function Prototypes
37821
37822
// ---------------- VTables
37823
37824
const wuffs_base__token_decoder__func_ptrs
37825
wuffs_cbor__decoder__func_ptrs_for__wuffs_base__token_decoder = {
37826
  (wuffs_base__status(*)(void*,
37827
      wuffs_base__token_buffer*,
37828
      wuffs_base__io_buffer*,
37829
      wuffs_base__slice_u8))(&wuffs_cbor__decoder__decode_tokens),
37830
  (uint64_t(*)(const void*,
37831
      uint32_t))(&wuffs_cbor__decoder__get_quirk),
37832
  (wuffs_base__status(*)(void*,
37833
      uint32_t,
37834
      uint64_t))(&wuffs_cbor__decoder__set_quirk),
37835
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_cbor__decoder__workbuf_len),
37836
};
37837
37838
// ---------------- Initializer Implementations
37839
37840
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
37841
wuffs_cbor__decoder__initialize(
37842
    wuffs_cbor__decoder* self,
37843
    size_t sizeof_star_self,
37844
    uint64_t wuffs_version,
37845
    uint32_t options){
37846
  if (!self) {
37847
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
37848
  }
37849
  if (sizeof(*self) != sizeof_star_self) {
37850
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
37851
  }
37852
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
37853
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
37854
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
37855
  }
37856
37857
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
37858
    // The whole point of this if-check is to detect an uninitialized *self.
37859
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
37860
#if !defined(__clang__) && defined(__GNUC__)
37861
#pragma GCC diagnostic push
37862
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
37863
#endif
37864
    if (self->private_impl.magic != 0) {
37865
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
37866
    }
37867
#if !defined(__clang__) && defined(__GNUC__)
37868
#pragma GCC diagnostic pop
37869
#endif
37870
  } else {
37871
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
37872
      memset(self, 0, sizeof(*self));
37873
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
37874
    } else {
37875
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
37876
    }
37877
  }
37878
37879
  self->private_impl.magic = WUFFS_BASE__MAGIC;
37880
  self->private_impl.vtable_for__wuffs_base__token_decoder.vtable_name =
37881
      wuffs_base__token_decoder__vtable_name;
37882
  self->private_impl.vtable_for__wuffs_base__token_decoder.function_pointers =
37883
      (const void*)(&wuffs_cbor__decoder__func_ptrs_for__wuffs_base__token_decoder);
37884
  return wuffs_base__make_status(NULL);
37885
}
37886
37887
wuffs_cbor__decoder*
37888
wuffs_cbor__decoder__alloc(void) {
37889
  wuffs_cbor__decoder* x =
37890
      (wuffs_cbor__decoder*)(calloc(1, sizeof(wuffs_cbor__decoder)));
37891
  if (!x) {
37892
    return NULL;
37893
  }
37894
  if (wuffs_cbor__decoder__initialize(
37895
      x, sizeof(wuffs_cbor__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
37896
    free(x);
37897
    return NULL;
37898
  }
37899
  return x;
37900
}
37901
37902
size_t
37903
sizeof__wuffs_cbor__decoder(void) {
37904
  return sizeof(wuffs_cbor__decoder);
37905
}
37906
37907
// ---------------- Function Implementations
37908
37909
// -------- func cbor.decoder.get_quirk
37910
37911
WUFFS_BASE__GENERATED_C_CODE
37912
WUFFS_BASE__MAYBE_STATIC uint64_t
37913
wuffs_cbor__decoder__get_quirk(
37914
    const wuffs_cbor__decoder* self,
37915
    uint32_t a_key) {
37916
  if (!self) {
37917
    return 0;
37918
  }
37919
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
37920
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
37921
    return 0;
37922
  }
37923
37924
  return 0u;
37925
}
37926
37927
// -------- func cbor.decoder.set_quirk
37928
37929
WUFFS_BASE__GENERATED_C_CODE
37930
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
37931
wuffs_cbor__decoder__set_quirk(
37932
    wuffs_cbor__decoder* self,
37933
    uint32_t a_key,
37934
    uint64_t a_value) {
37935
  if (!self) {
37936
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
37937
  }
37938
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
37939
    return wuffs_base__make_status(
37940
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
37941
        ? wuffs_base__error__disabled_by_previous_error
37942
        : wuffs_base__error__initialize_not_called);
37943
  }
37944
37945
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
37946
}
37947
37948
// -------- func cbor.decoder.workbuf_len
37949
37950
WUFFS_BASE__GENERATED_C_CODE
37951
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
37952
wuffs_cbor__decoder__workbuf_len(
37953
    const wuffs_cbor__decoder* self) {
37954
  if (!self) {
37955
    return wuffs_base__utility__empty_range_ii_u64();
37956
  }
37957
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
37958
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
37959
    return wuffs_base__utility__empty_range_ii_u64();
37960
  }
37961
37962
  return wuffs_base__utility__empty_range_ii_u64();
37963
}
37964
37965
// -------- func cbor.decoder.decode_tokens
37966
37967
WUFFS_BASE__GENERATED_C_CODE
37968
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
37969
wuffs_cbor__decoder__decode_tokens(
37970
    wuffs_cbor__decoder* self,
37971
    wuffs_base__token_buffer* a_dst,
37972
    wuffs_base__io_buffer* a_src,
37973
    wuffs_base__slice_u8 a_workbuf) {
37974
  if (!self) {
37975
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
37976
  }
37977
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
37978
    return wuffs_base__make_status(
37979
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
37980
        ? wuffs_base__error__disabled_by_previous_error
37981
        : wuffs_base__error__initialize_not_called);
37982
  }
37983
  if (!a_dst || !a_src) {
37984
    self->private_impl.magic = WUFFS_BASE__DISABLED;
37985
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
37986
  }
37987
  if ((self->private_impl.active_coroutine != 0) &&
37988
      (self->private_impl.active_coroutine != 1)) {
37989
    self->private_impl.magic = WUFFS_BASE__DISABLED;
37990
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
37991
  }
37992
  self->private_impl.active_coroutine = 0;
37993
  wuffs_base__status status = wuffs_base__make_status(NULL);
37994
37995
  uint64_t v_string_length = 0;
37996
  uint64_t v_n64 = 0;
37997
  uint32_t v_depth = 0;
37998
  uint32_t v_stack_byte = 0;
37999
  uint32_t v_stack_bit = 0;
38000
  uint32_t v_stack_val = 0;
38001
  uint32_t v_token_length = 0;
38002
  uint32_t v_vminor = 0;
38003
  uint32_t v_vminor_alt = 0;
38004
  uint32_t v_continued = 0;
38005
  uint8_t v_c8 = 0;
38006
  uint8_t v_c_major = 0;
38007
  uint8_t v_c_minor = 0;
38008
  bool v_tagged = false;
38009
  uint8_t v_indefinite_string_major_type = 0;
38010
38011
  wuffs_base__token* iop_a_dst = NULL;
38012
  wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
38013
  wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
38014
  wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
38015
  if (a_dst && a_dst->data.ptr) {
38016
    io0_a_dst = a_dst->data.ptr;
38017
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
38018
    iop_a_dst = io1_a_dst;
38019
    io2_a_dst = io0_a_dst + a_dst->data.len;
38020
    if (a_dst->meta.closed) {
38021
      io2_a_dst = iop_a_dst;
38022
    }
38023
  }
38024
  const uint8_t* iop_a_src = NULL;
38025
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
38026
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
38027
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
38028
  if (a_src && a_src->data.ptr) {
38029
    io0_a_src = a_src->data.ptr;
38030
    io1_a_src = io0_a_src + a_src->meta.ri;
38031
    iop_a_src = io1_a_src;
38032
    io2_a_src = io0_a_src + a_src->meta.wi;
38033
  }
38034
38035
  uint32_t coro_susp_point = self->private_impl.p_decode_tokens;
38036
  if (coro_susp_point) {
38037
    v_string_length = self->private_data.s_decode_tokens.v_string_length;
38038
    v_depth = self->private_data.s_decode_tokens.v_depth;
38039
    v_tagged = self->private_data.s_decode_tokens.v_tagged;
38040
    v_indefinite_string_major_type = self->private_data.s_decode_tokens.v_indefinite_string_major_type;
38041
  }
38042
  switch (coro_susp_point) {
38043
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
38044
38045
    if (self->private_impl.f_end_of_data) {
38046
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
38047
      goto ok;
38048
    }
38049
    label__outer__continue:;
38050
    while (true) {
38051
      while (true) {
38052
        do {
38053
          if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 1u) {
38054
            status = wuffs_base__make_status(wuffs_base__suspension__short_write);
38055
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
38056
            goto label__outer__continue;
38057
          }
38058
          if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
38059
            if (a_src && a_src->meta.closed) {
38060
              status = wuffs_base__make_status(wuffs_cbor__error__bad_input);
38061
              goto exit;
38062
            }
38063
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
38064
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2);
38065
            goto label__outer__continue;
38066
          }
38067
          v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
38068
          if ((v_indefinite_string_major_type != 0u) && (v_indefinite_string_major_type != ((uint8_t)(v_c8 >> 5u)))) {
38069
            if (v_c8 != 255u) {
38070
              status = wuffs_base__make_status(wuffs_cbor__error__bad_input);
38071
              goto exit;
38072
            }
38073
            v_vminor = 4194560u;
38074
            if (v_indefinite_string_major_type == 3u) {
38075
              v_vminor |= 19u;
38076
            }
38077
            v_indefinite_string_major_type = 0u;
38078
            iop_a_src += 1u;
38079
            *iop_a_dst++ = wuffs_base__make_token(
38080
                (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
38081
                (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
38082
            goto label__goto_parsed_a_leaf_value__break;
38083
          }
38084
          iop_a_src += 1u;
38085
          v_c_major = ((uint8_t)(((uint8_t)(v_c8 >> 5u))));
38086
          v_c_minor = ((uint8_t)(v_c8 & 31u));
38087
          if (v_c_minor < 24u) {
38088
            v_string_length = ((uint64_t)(v_c_minor));
38089
          } else {
38090
            while (true) {
38091
              if (v_c_minor == 24u) {
38092
                if (((uint64_t)(io2_a_src - iop_a_src)) >= 1u) {
38093
                  v_string_length = ((uint64_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src)));
38094
                  iop_a_src += 1u;
38095
                  break;
38096
                }
38097
              } else if (v_c_minor == 25u) {
38098
                if (((uint64_t)(io2_a_src - iop_a_src)) >= 2u) {
38099
                  v_string_length = ((uint64_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src)));
38100
                  iop_a_src += 2u;
38101
                  break;
38102
                }
38103
              } else if (v_c_minor == 26u) {
38104
                if (((uint64_t)(io2_a_src - iop_a_src)) >= 4u) {
38105
                  v_string_length = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src)));
38106
                  iop_a_src += 4u;
38107
                  break;
38108
                }
38109
              } else if (v_c_minor == 27u) {
38110
                if (((uint64_t)(io2_a_src - iop_a_src)) >= 8u) {
38111
                  v_string_length = wuffs_base__peek_u64be__no_bounds_check(iop_a_src);
38112
                  iop_a_src += 8u;
38113
                  break;
38114
                }
38115
              } else {
38116
                v_string_length = 0u;
38117
                break;
38118
              }
38119
              if (iop_a_src > io1_a_src) {
38120
                iop_a_src--;
38121
                if (a_src && a_src->meta.closed) {
38122
                  status = wuffs_base__make_status(wuffs_cbor__error__bad_input);
38123
                  goto exit;
38124
                }
38125
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
38126
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3);
38127
                goto label__outer__continue;
38128
              }
38129
              status = wuffs_base__make_status(wuffs_cbor__error__internal_error_inconsistent_i_o);
38130
              goto exit;
38131
            }
38132
          }
38133
          if (v_c_major == 0u) {
38134
            if (v_c_minor < 26u) {
38135
              *iop_a_dst++ = wuffs_base__make_token(
38136
                  (((uint64_t)((14680064u | ((uint32_t)((v_string_length & 65535u)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
38137
                  (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
38138
              goto label__goto_parsed_a_leaf_value__break;
38139
            } else if (v_c_minor < 28u) {
38140
              *iop_a_dst++ = wuffs_base__make_token(
38141
                  (((uint64_t)((14680064u | ((uint32_t)((v_string_length >> 46u)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
38142
                  (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
38143
                  (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
38144
              *iop_a_dst++ = wuffs_base__make_token(
38145
                  (~(v_string_length & 70368744177663u) << WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT) |
38146
                  (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
38147
              goto label__goto_parsed_a_leaf_value__break;
38148
            }
38149
          } else if (v_c_major == 1u) {
38150
            if (v_c_minor < 26u) {
38151
              *iop_a_dst++ = wuffs_base__make_token(
38152
                  (((uint64_t)((12582912u | (2097151u - ((uint32_t)((v_string_length & 65535u))))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
38153
                  (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
38154
              goto label__goto_parsed_a_leaf_value__break;
38155
            } else if (v_c_minor < 28u) {
38156
              if (v_string_length < 9223372036854775808u) {
38157
                *iop_a_dst++ = wuffs_base__make_token(
38158
                    (((uint64_t)((12582912u | (2097151u - ((uint32_t)((v_string_length >> 46u))))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
38159
                    (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
38160
                    (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
38161
                *iop_a_dst++ = wuffs_base__make_token(
38162
                    (~((18446744073709551615u - v_string_length) & 70368744177663u) << WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT) |
38163
                    (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
38164
              } else {
38165
                *iop_a_dst++ = wuffs_base__make_token(
38166
                    (((uint64_t)(731642u)) << WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT) |
38167
                    (((uint64_t)(16777216u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
38168
                    (((uint64_t)(9u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
38169
              }
38170
              goto label__goto_parsed_a_leaf_value__break;
38171
            }
38172
          } else if (v_c_major == 2u) {
38173
            if (v_c_minor < 28u) {
38174
              if (v_string_length == 0u) {
38175
                *iop_a_dst++ = wuffs_base__make_token(
38176
                    (((uint64_t)(4194560u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
38177
                    (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
38178
                goto label__goto_parsed_a_leaf_value__break;
38179
              }
38180
              *iop_a_dst++ = wuffs_base__make_token(
38181
                  (((uint64_t)(4194560u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
38182
                  (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
38183
                  (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
38184
            } else if (v_c_minor == 31u) {
38185
              if (v_indefinite_string_major_type != 0u) {
38186
                break;
38187
              }
38188
              v_indefinite_string_major_type = 2u;
38189
              *iop_a_dst++ = wuffs_base__make_token(
38190
                  (((uint64_t)(4194560u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
38191
                  (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
38192
                  (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
38193
              goto label__outer__continue;
38194
            } else {
38195
              break;
38196
            }
38197
            while (true) {
38198
              if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
38199
                status = wuffs_base__make_status(wuffs_base__suspension__short_write);
38200
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4);
38201
                continue;
38202
              }
38203
              v_n64 = wuffs_base__u64__min(v_string_length, ((uint64_t)(io2_a_src - iop_a_src)));
38204
              v_token_length = ((uint32_t)((v_n64 & 65535u)));
38205
              if (v_n64 > 65535u) {
38206
                v_token_length = 65535u;
38207
              } else if (v_token_length <= 0u) {
38208
                if (a_src && a_src->meta.closed) {
38209
                  status = wuffs_base__make_status(wuffs_cbor__error__bad_input);
38210
                  goto exit;
38211
                }
38212
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
38213
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5);
38214
                continue;
38215
              }
38216
              if (((uint64_t)(io2_a_src - iop_a_src)) < ((uint64_t)(v_token_length))) {
38217
                status = wuffs_base__make_status(wuffs_cbor__error__internal_error_inconsistent_token_length);
38218
                goto exit;
38219
              }
38220
              v_string_length -= ((uint64_t)(v_token_length));
38221
              v_continued = 0u;
38222
              if ((v_string_length > 0u) || (v_indefinite_string_major_type > 0u)) {
38223
                v_continued = 1u;
38224
              }
38225
              iop_a_src += v_token_length;
38226
              *iop_a_dst++ = wuffs_base__make_token(
38227
                  (((uint64_t)(4194816u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
38228
                  (((uint64_t)(v_continued)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
38229
                  (((uint64_t)(v_token_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
38230
              if (v_string_length > 0u) {
38231
                continue;
38232
              } else if (v_indefinite_string_major_type > 0u) {
38233
                goto label__outer__continue;
38234
              }
38235
              goto label__goto_parsed_a_leaf_value__break;
38236
            }
38237
          } else if (v_c_major == 3u) {
38238
            if (v_c_minor < 28u) {
38239
              if (v_string_length == 0u) {
38240
                *iop_a_dst++ = wuffs_base__make_token(
38241
                    (((uint64_t)(4194579u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
38242
                    (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
38243
                goto label__goto_parsed_a_leaf_value__break;
38244
              }
38245
              *iop_a_dst++ = wuffs_base__make_token(
38246
                  (((uint64_t)(4194579u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
38247
                  (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
38248
                  (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
38249
            } else if (v_c_minor == 31u) {
38250
              if (v_indefinite_string_major_type != 0u) {
38251
                break;
38252
              }
38253
              v_indefinite_string_major_type = 3u;
38254
              *iop_a_dst++ = wuffs_base__make_token(
38255
                  (((uint64_t)(4194579u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
38256
                  (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
38257
                  (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
38258
              goto label__outer__continue;
38259
            } else {
38260
              break;
38261
            }
38262
            while (true) {
38263
              if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
38264
                status = wuffs_base__make_status(wuffs_base__suspension__short_write);
38265
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6);
38266
                continue;
38267
              }
38268
              v_n64 = wuffs_base__u64__min(v_string_length, 65535u);
38269
              v_n64 = ((uint64_t)(wuffs_base__utf_8__longest_valid_prefix(iop_a_src,
38270
                  ((size_t)(wuffs_base__u64__min(((uint64_t)(io2_a_src - iop_a_src)), v_n64))))));
38271
              v_token_length = ((uint32_t)((v_n64 & 65535u)));
38272
              if (v_token_length <= 0u) {
38273
                if ((a_src && a_src->meta.closed) || (((uint64_t)(io2_a_src - iop_a_src)) >= 4u)) {
38274
                  status = wuffs_base__make_status(wuffs_cbor__error__bad_input);
38275
                  goto exit;
38276
                }
38277
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
38278
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7);
38279
                continue;
38280
              }
38281
              if (((uint64_t)(io2_a_src - iop_a_src)) < ((uint64_t)(v_token_length))) {
38282
                status = wuffs_base__make_status(wuffs_cbor__error__internal_error_inconsistent_token_length);
38283
                goto exit;
38284
              }
38285
              v_string_length -= ((uint64_t)(v_token_length));
38286
              v_continued = 0u;
38287
              if ((v_string_length > 0u) || (v_indefinite_string_major_type > 0u)) {
38288
                v_continued = 1u;
38289
              }
38290
              iop_a_src += v_token_length;
38291
              *iop_a_dst++ = wuffs_base__make_token(
38292
                  (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
38293
                  (((uint64_t)(v_continued)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
38294
                  (((uint64_t)(v_token_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
38295
              if (v_string_length > 0u) {
38296
                continue;
38297
              } else if (v_indefinite_string_major_type > 0u) {
38298
                goto label__outer__continue;
38299
              }
38300
              goto label__goto_parsed_a_leaf_value__break;
38301
            }
38302
          } else if (v_c_major == 4u) {
38303
            if (WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor] == 0u) {
38304
              break;
38305
            } else if (v_depth >= 1024u) {
38306
              v_token_length = ((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor]));
38307
              while ((v_token_length > 0u) && (iop_a_src > io1_a_src)) {
38308
                iop_a_src--;
38309
                v_token_length -= 1u;
38310
              }
38311
              status = wuffs_base__make_status(wuffs_cbor__error__unsupported_recursion_depth);
38312
              goto exit;
38313
            }
38314
            v_vminor = 2105361u;
38315
            v_vminor_alt = 2101282u;
38316
            if (v_depth > 0u) {
38317
              v_stack_byte = ((v_depth - 1u) / 16u);
38318
              v_stack_bit = (((v_depth - 1u) & 15u) * 2u);
38319
              if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) {
38320
                v_vminor = 2105377u;
38321
                v_vminor_alt = 2105378u;
38322
              } else {
38323
                v_vminor = 2105409u;
38324
                v_vminor_alt = 2113570u;
38325
              }
38326
            }
38327
            *iop_a_dst++ = wuffs_base__make_token(
38328
                (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
38329
                (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
38330
            if (v_c_minor == 0u) {
38331
              *iop_a_dst++ = wuffs_base__make_token(
38332
                  (((uint64_t)(v_vminor_alt)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
38333
                  (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
38334
              goto label__goto_parsed_a_leaf_value__break;
38335
            }
38336
            v_stack_byte = (v_depth / 16u);
38337
            v_stack_bit = ((v_depth & 15u) * 2u);
38338
            self->private_data.f_stack[v_stack_byte] &= (4294967295u ^ (((uint32_t)(3u)) << v_stack_bit));
38339
            self->private_data.f_container_num_remaining[v_depth] = v_string_length;
38340
            v_depth += 1u;
38341
            v_tagged = false;
38342
            goto label__outer__continue;
38343
          } else if (v_c_major == 5u) {
38344
            if (WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor] == 0u) {
38345
              break;
38346
            } else if (v_depth >= 1024u) {
38347
              v_token_length = ((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor]));
38348
              while ((v_token_length > 0u) && (iop_a_src > io1_a_src)) {
38349
                iop_a_src--;
38350
                v_token_length -= 1u;
38351
              }
38352
              status = wuffs_base__make_status(wuffs_cbor__error__unsupported_recursion_depth);
38353
              goto exit;
38354
            }
38355
            v_vminor = 2113553u;
38356
            v_vminor_alt = 2101314u;
38357
            if (v_depth > 0u) {
38358
              v_stack_byte = ((v_depth - 1u) / 16u);
38359
              v_stack_bit = (((v_depth - 1u) & 15u) * 2u);
38360
              if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) {
38361
                v_vminor = 2113569u;
38362
                v_vminor_alt = 2105410u;
38363
              } else {
38364
                v_vminor = 2113601u;
38365
                v_vminor_alt = 2113602u;
38366
              }
38367
            }
38368
            *iop_a_dst++ = wuffs_base__make_token(
38369
                (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
38370
                (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
38371
            if (v_c_minor == 0u) {
38372
              *iop_a_dst++ = wuffs_base__make_token(
38373
                  (((uint64_t)(v_vminor_alt)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
38374
                  (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
38375
              goto label__goto_parsed_a_leaf_value__break;
38376
            }
38377
            v_stack_byte = (v_depth / 16u);
38378
            v_stack_bit = ((v_depth & 15u) * 2u);
38379
            self->private_data.f_stack[v_stack_byte] |= (((uint32_t)(3u)) << v_stack_bit);
38380
            self->private_data.f_container_num_remaining[v_depth] = v_string_length;
38381
            v_depth += 1u;
38382
            v_tagged = false;
38383
            goto label__outer__continue;
38384
          } else if (v_c_major == 6u) {
38385
            if (v_c_minor >= 28u) {
38386
              break;
38387
            }
38388
            if (v_string_length < 262144u) {
38389
              *iop_a_dst++ = wuffs_base__make_token(
38390
                  (((uint64_t)(731642u)) << WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT) |
38391
                  (((uint64_t)((4194304u | ((uint32_t)(v_string_length))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
38392
                  (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
38393
            } else {
38394
              *iop_a_dst++ = wuffs_base__make_token(
38395
                  (((uint64_t)(731642u)) << WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT) |
38396
                  (((uint64_t)((4194304u | ((uint32_t)((v_string_length >> 46u)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
38397
                  (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
38398
                  (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
38399
              *iop_a_dst++ = wuffs_base__make_token(
38400
                  (~(v_string_length & 70368744177663u) << WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT) |
38401
                  (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
38402
            }
38403
            v_tagged = true;
38404
            goto label__outer__continue;
38405
          } else if (v_c_major == 7u) {
38406
            if (v_c_minor < 20u) {
38407
              *iop_a_dst++ = wuffs_base__make_token(
38408
                  (((uint64_t)(731642u)) << WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT) |
38409
                  (((uint64_t)((8388608u | ((uint32_t)((v_string_length & 255u)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
38410
                  (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
38411
              goto label__goto_parsed_a_leaf_value__break;
38412
            } else if (v_c_minor < 24u) {
38413
              *iop_a_dst++ = wuffs_base__make_token(
38414
                  (((uint64_t)(WUFFS_CBOR__LITERALS[((uint8_t)(v_c_minor & 3u))])) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
38415
                  (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
38416
              goto label__goto_parsed_a_leaf_value__break;
38417
            } else if (v_c_minor == 24u) {
38418
              if (v_string_length < 24u) {
38419
                if ( ! (iop_a_src > io1_a_src)) {
38420
                  status = wuffs_base__make_status(wuffs_cbor__error__internal_error_inconsistent_i_o);
38421
                  goto exit;
38422
                }
38423
                iop_a_src--;
38424
                break;
38425
              }
38426
              *iop_a_dst++ = wuffs_base__make_token(
38427
                  (((uint64_t)(731642u)) << WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT) |
38428
                  (((uint64_t)((8388608u | ((uint32_t)((v_string_length & 255u)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
38429
                  (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
38430
              goto label__goto_parsed_a_leaf_value__break;
38431
            } else if (v_c_minor < 28u) {
38432
              *iop_a_dst++ = wuffs_base__make_token(
38433
                  (((uint64_t)(10490113u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
38434
                  (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
38435
              goto label__goto_parsed_a_leaf_value__break;
38436
            } else if (v_c_minor == 31u) {
38437
              if (v_tagged || (v_depth <= 0u)) {
38438
                break;
38439
              }
38440
              v_depth -= 1u;
38441
              if (self->private_data.f_container_num_remaining[v_depth] != 0u) {
38442
                break;
38443
              }
38444
              v_stack_byte = (v_depth / 16u);
38445
              v_stack_bit = ((v_depth & 15u) * 2u);
38446
              v_stack_val = (3u & (self->private_data.f_stack[v_stack_byte] >> v_stack_bit));
38447
              if (v_stack_val == 1u) {
38448
                break;
38449
              }
38450
              if (v_stack_val != 3u) {
38451
                v_vminor_alt = 2097186u;
38452
              } else {
38453
                v_vminor_alt = 2097218u;
38454
              }
38455
              if (v_depth <= 0u) {
38456
                v_vminor_alt |= 4096u;
38457
              } else {
38458
                v_stack_byte = ((v_depth - 1u) / 16u);
38459
                v_stack_bit = (((v_depth - 1u) & 15u) * 2u);
38460
                if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) {
38461
                  v_vminor_alt |= 8192u;
38462
                } else {
38463
                  v_vminor_alt |= 16384u;
38464
                }
38465
              }
38466
              *iop_a_dst++ = wuffs_base__make_token(
38467
                  (((uint64_t)(v_vminor_alt)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
38468
                  (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
38469
              goto label__goto_parsed_a_leaf_value__break;
38470
            }
38471
          }
38472
        } while (0);
38473
        if (iop_a_src > io1_a_src) {
38474
          iop_a_src--;
38475
          status = wuffs_base__make_status(wuffs_cbor__error__bad_input);
38476
          goto exit;
38477
        }
38478
        status = wuffs_base__make_status(wuffs_cbor__error__internal_error_inconsistent_i_o);
38479
        goto exit;
38480
      }
38481
      label__goto_parsed_a_leaf_value__break:;
38482
      v_tagged = false;
38483
      while (v_depth > 0u) {
38484
        v_stack_byte = ((v_depth - 1u) / 16u);
38485
        v_stack_bit = (((v_depth - 1u) & 15u) * 2u);
38486
        self->private_data.f_stack[v_stack_byte] ^= (((uint32_t)(1u)) << (v_stack_bit + 1u));
38487
        if (1u == (3u & (self->private_data.f_stack[v_stack_byte] >> v_stack_bit))) {
38488
          goto label__outer__continue;
38489
        }
38490
        if (self->private_data.f_container_num_remaining[(v_depth - 1u)] <= 0u) {
38491
          goto label__outer__continue;
38492
        }
38493
        self->private_data.f_container_num_remaining[(v_depth - 1u)] -= 1u;
38494
        if (self->private_data.f_container_num_remaining[(v_depth - 1u)] > 0u) {
38495
          goto label__outer__continue;
38496
        }
38497
        while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
38498
          status = wuffs_base__make_status(wuffs_base__suspension__short_write);
38499
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8);
38500
          continue;
38501
        }
38502
        v_depth -= 1u;
38503
        v_stack_byte = (v_depth / 16u);
38504
        v_stack_bit = ((v_depth & 15u) * 2u);
38505
        if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) {
38506
          v_vminor_alt = 2097186u;
38507
        } else {
38508
          v_vminor_alt = 2097218u;
38509
        }
38510
        if (v_depth <= 0u) {
38511
          v_vminor_alt |= 4096u;
38512
        } else {
38513
          v_stack_byte = ((v_depth - 1u) / 16u);
38514
          v_stack_bit = (((v_depth - 1u) & 15u) * 2u);
38515
          if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) {
38516
            v_vminor_alt |= 8192u;
38517
          } else {
38518
            v_vminor_alt |= 16384u;
38519
          }
38520
        }
38521
        *iop_a_dst++ = wuffs_base__make_token(
38522
            (((uint64_t)(v_vminor_alt)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
38523
            (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
38524
      }
38525
      break;
38526
    }
38527
    self->private_impl.f_end_of_data = true;
38528
38529
    ok:
38530
    self->private_impl.p_decode_tokens = 0;
38531
    goto exit;
38532
  }
38533
38534
  goto suspend;
38535
  suspend:
38536
  self->private_impl.p_decode_tokens = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
38537
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
38538
  self->private_data.s_decode_tokens.v_string_length = v_string_length;
38539
  self->private_data.s_decode_tokens.v_depth = v_depth;
38540
  self->private_data.s_decode_tokens.v_tagged = v_tagged;
38541
  self->private_data.s_decode_tokens.v_indefinite_string_major_type = v_indefinite_string_major_type;
38542
38543
  goto exit;
38544
  exit:
38545
  if (a_dst && a_dst->data.ptr) {
38546
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
38547
  }
38548
  if (a_src && a_src->data.ptr) {
38549
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
38550
  }
38551
38552
  if (wuffs_base__status__is_error(&status)) {
38553
    self->private_impl.magic = WUFFS_BASE__DISABLED;
38554
  }
38555
  return status;
38556
}
38557
38558
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CBOR)
38559
38560
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC32)
38561
38562
// ---------------- Status Codes Implementations
38563
38564
// ---------------- Private Consts
38565
38566
static const uint32_t
38567
WUFFS_CRC32__IEEE_TABLE[16][256] WUFFS_BASE__POTENTIALLY_UNUSED = {
38568
  {
38569
    0u, 1996959894u, 3993919788u, 2567524794u, 124634137u, 1886057615u, 3915621685u, 2657392035u,
38570
    249268274u, 2044508324u, 3772115230u, 2547177864u, 162941995u, 2125561021u, 3887607047u, 2428444049u,
38571
    498536548u, 1789927666u, 4089016648u, 2227061214u, 450548861u, 1843258603u, 4107580753u, 2211677639u,
38572
    325883990u, 1684777152u, 4251122042u, 2321926636u, 335633487u, 1661365465u, 4195302755u, 2366115317u,
38573
    997073096u, 1281953886u, 3579855332u, 2724688242u, 1006888145u, 1258607687u, 3524101629u, 2768942443u,
38574
    901097722u, 1119000684u, 3686517206u, 2898065728u, 853044451u, 1172266101u, 3705015759u, 2882616665u,
38575
    651767980u, 1373503546u, 3369554304u, 3218104598u, 565507253u, 1454621731u, 3485111705u, 3099436303u,
38576
    671266974u, 1594198024u, 3322730930u, 2970347812u, 795835527u, 1483230225u, 3244367275u, 3060149565u,
38577
    1994146192u, 31158534u, 2563907772u, 4023717930u, 1907459465u, 112637215u, 2680153253u, 3904427059u,
38578
    2013776290u, 251722036u, 2517215374u, 3775830040u, 2137656763u, 141376813u, 2439277719u, 3865271297u,
38579
    1802195444u, 476864866u, 2238001368u, 4066508878u, 1812370925u, 453092731u, 2181625025u, 4111451223u,
38580
    1706088902u, 314042704u, 2344532202u, 4240017532u, 1658658271u, 366619977u, 2362670323u, 4224994405u,
38581
    1303535960u, 984961486u, 2747007092u, 3569037538u, 1256170817u, 1037604311u, 2765210733u, 3554079995u,
38582
    1131014506u, 879679996u, 2909243462u, 3663771856u, 1141124467u, 855842277u, 2852801631u, 3708648649u,
38583
    1342533948u, 654459306u, 3188396048u, 3373015174u, 1466479909u, 544179635u, 3110523913u, 3462522015u,
38584
    1591671054u, 702138776u, 2966460450u, 3352799412u, 1504918807u, 783551873u, 3082640443u, 3233442989u,
38585
    3988292384u, 2596254646u, 62317068u, 1957810842u, 3939845945u, 2647816111u, 81470997u, 1943803523u,
38586
    3814918930u, 2489596804u, 225274430u, 2053790376u, 3826175755u, 2466906013u, 167816743u, 2097651377u,
38587
    4027552580u, 2265490386u, 503444072u, 1762050814u, 4150417245u, 2154129355u, 426522225u, 1852507879u,
38588
    4275313526u, 2312317920u, 282753626u, 1742555852u, 4189708143u, 2394877945u, 397917763u, 1622183637u,
38589
    3604390888u, 2714866558u, 953729732u, 1340076626u, 3518719985u, 2797360999u, 1068828381u, 1219638859u,
38590
    3624741850u, 2936675148u, 906185462u, 1090812512u, 3747672003u, 2825379669u, 829329135u, 1181335161u,
38591
    3412177804u, 3160834842u, 628085408u, 1382605366u, 3423369109u, 3138078467u, 570562233u, 1426400815u,
38592
    3317316542u, 2998733608u, 733239954u, 1555261956u, 3268935591u, 3050360625u, 752459403u, 1541320221u,
38593
    2607071920u, 3965973030u, 1969922972u, 40735498u, 2617837225u, 3943577151u, 1913087877u, 83908371u,
38594
    2512341634u, 3803740692u, 2075208622u, 213261112u, 2463272603u, 3855990285u, 2094854071u, 198958881u,
38595
    2262029012u, 4057260610u, 1759359992u, 534414190u, 2176718541u, 4139329115u, 1873836001u, 414664567u,
38596
    2282248934u, 4279200368u, 1711684554u, 285281116u, 2405801727u, 4167216745u, 1634467795u, 376229701u,
38597
    2685067896u, 3608007406u, 1308918612u, 956543938u, 2808555105u, 3495958263u, 1231636301u, 1047427035u,
38598
    2932959818u, 3654703836u, 1088359270u, 936918000u, 2847714899u, 3736837829u, 1202900863u, 817233897u,
38599
    3183342108u, 3401237130u, 1404277552u, 615818150u, 3134207493u, 3453421203u, 1423857449u, 601450431u,
38600
    3009837614u, 3294710456u, 1567103746u, 711928724u, 3020668471u, 3272380065u, 1510334235u, 755167117u,
38601
  }, {
38602
    0u, 421212481u, 842424962u, 724390851u, 1684849924u, 2105013317u, 1448781702u, 1329698503u,
38603
    3369699848u, 3519200073u, 4210026634u, 3824474571u, 2897563404u, 3048111693u, 2659397006u, 2274893007u,
38604
    1254232657u, 1406739216u, 2029285587u, 1643069842u, 783210325u, 934667796u, 479770071u, 92505238u,
38605
    2182846553u, 2600511768u, 2955803355u, 2838940570u, 3866582365u, 4285295644u, 3561045983u, 3445231262u,
38606
    2508465314u, 2359236067u, 2813478432u, 3198777185u, 4058571174u, 3908292839u, 3286139684u, 3670389349u,
38607
    1566420650u, 1145479147u, 1869335592u, 1987116393u, 959540142u, 539646703u, 185010476u, 303839341u,
38608
    3745920755u, 3327985586u, 3983561841u, 4100678960u, 3140154359u, 2721170102u, 2300350837u, 2416418868u,
38609
    396344571u, 243568058u, 631889529u, 1018359608u, 1945336319u, 1793607870u, 1103436669u, 1490954812u,
38610
    4034481925u, 3915546180u, 3259968903u, 3679722694u, 2484439553u, 2366552896u, 2787371139u, 3208174018u,
38611
    950060301u, 565965900u, 177645455u, 328046286u, 1556873225u, 1171730760u, 1861902987u, 2011255754u,
38612
    3132841300u, 2745199637u, 2290958294u, 2442530455u, 3738671184u, 3352078609u, 3974232786u, 4126854035u,
38613
    1919080284u, 1803150877u, 1079293406u, 1498383519u, 370020952u, 253043481u, 607678682u, 1025720731u,
38614
    1711106983u, 2095471334u, 1472923941u, 1322268772u, 26324643u, 411738082u, 866634785u, 717028704u,
38615
    2904875439u, 3024081134u, 2668790573u, 2248782444u, 3376948395u, 3495106026u, 4219356713u, 3798300520u,
38616
    792689142u, 908347575u, 487136116u, 68299317u, 1263779058u, 1380486579u, 2036719216u, 1618931505u,
38617
    3890672638u, 4278043327u, 3587215740u, 3435896893u, 2206873338u, 2593195963u, 2981909624u, 2829542713u,
38618
    998479947u, 580430090u, 162921161u, 279890824u, 1609522511u, 1190423566u, 1842954189u, 1958874764u,
38619
    4082766403u, 3930137346u, 3245109441u, 3631694208u, 2536953671u, 2385372678u, 2768287173u, 3155920004u,
38620
    1900120602u, 1750776667u, 1131931800u, 1517083097u, 355290910u, 204897887u, 656092572u, 1040194781u,
38621
    3113746450u, 2692952403u, 2343461520u, 2461357009u, 3723805974u, 3304059991u, 4022511508u, 4141455061u,
38622
    2919742697u, 3072101800u, 2620513899u, 2234183466u, 3396041197u, 3547351212u, 4166851439u, 3779471918u,
38623
    1725839073u, 2143618976u, 1424512099u, 1307796770u, 45282277u, 464110244u, 813994343u, 698327078u,
38624
    3838160568u, 4259225593u, 3606301754u, 3488152955u, 2158586812u, 2578602749u, 2996767038u, 2877569151u,
38625
    740041904u, 889656817u, 506086962u, 120682355u, 1215357364u, 1366020341u, 2051441462u, 1667084919u,
38626
    3422213966u, 3538019855u, 4190942668u, 3772220557u, 2945847882u, 3062702859u, 2644537544u, 2226864521u,
38627
    52649286u, 439905287u, 823476164u, 672009861u, 1733269570u, 2119477507u, 1434057408u, 1281543041u,
38628
    2167981343u, 2552493150u, 3004082077u, 2853541596u, 3847487515u, 4233048410u, 3613549209u, 3464057816u,
38629
    1239502615u, 1358593622u, 2077699477u, 1657543892u, 764250643u, 882293586u, 532408465u, 111204816u,
38630
    1585378284u, 1197851309u, 1816695150u, 1968414767u, 974272232u, 587794345u, 136598634u, 289367339u,
38631
    2527558116u, 2411481253u, 2760973158u, 3179948583u, 4073438432u, 3956313505u, 3237863010u, 3655790371u,
38632
    347922877u, 229101820u, 646611775u, 1066513022u, 1892689081u, 1774917112u, 1122387515u, 1543337850u,
38633
    3697634229u, 3313392372u, 3998419255u, 4148705398u, 3087642289u, 2702352368u, 2319436851u, 2468674930u,
38634
  }, {
38635
    0u, 29518391u, 59036782u, 38190681u, 118073564u, 114017003u, 76381362u, 89069189u,
38636
    236147128u, 265370511u, 228034006u, 206958561u, 152762724u, 148411219u, 178138378u, 190596925u,
38637
    472294256u, 501532999u, 530741022u, 509615401u, 456068012u, 451764635u, 413917122u, 426358261u,
38638
    305525448u, 334993663u, 296822438u, 275991697u, 356276756u, 352202787u, 381193850u, 393929805u,
38639
    944588512u, 965684439u, 1003065998u, 973863097u, 1061482044u, 1049003019u, 1019230802u, 1023561829u,
38640
    912136024u, 933002607u, 903529270u, 874031361u, 827834244u, 815125939u, 852716522u, 856752605u,
38641
    611050896u, 631869351u, 669987326u, 640506825u, 593644876u, 580921211u, 551983394u, 556069653u,
38642
    712553512u, 733666847u, 704405574u, 675154545u, 762387700u, 749958851u, 787859610u, 792175277u,
38643
    1889177024u, 1901651959u, 1931368878u, 1927033753u, 2006131996u, 1985040171u, 1947726194u, 1976933189u,
38644
    2122964088u, 2135668303u, 2098006038u, 2093965857u, 2038461604u, 2017599123u, 2047123658u, 2076625661u,
38645
    1824272048u, 1836991623u, 1866005214u, 1861914857u, 1807058540u, 1786244187u, 1748062722u, 1777547317u,
38646
    1655668488u, 1668093247u, 1630251878u, 1625932113u, 1705433044u, 1684323811u, 1713505210u, 1742760333u,
38647
    1222101792u, 1226154263u, 1263738702u, 1251046777u, 1339974652u, 1310460363u, 1281013650u, 1301863845u,
38648
    1187289752u, 1191637167u, 1161842422u, 1149379777u, 1103966788u, 1074747507u, 1112139306u, 1133218845u,
38649
    1425107024u, 1429406311u, 1467333694u, 1454888457u, 1408811148u, 1379576507u, 1350309090u, 1371438805u,
38650
    1524775400u, 1528845279u, 1499917702u, 1487177649u, 1575719220u, 1546255107u, 1584350554u, 1605185389u,
38651
    3778354048u, 3774312887u, 3803303918u, 3816007129u, 3862737756u, 3892238699u, 3854067506u, 3833203973u,
38652
    4012263992u, 4007927823u, 3970080342u, 3982554209u, 3895452388u, 3924658387u, 3953866378u, 3932773565u,
38653
    4245928176u, 4241609415u, 4271336606u, 4283762345u, 4196012076u, 4225268251u, 4187931714u, 4166823541u,
38654
    4076923208u, 4072833919u, 4035198246u, 4047918865u, 4094247316u, 4123732899u, 4153251322u, 4132437965u,
38655
    3648544096u, 3636082519u, 3673983246u, 3678331705u, 3732010428u, 3753090955u, 3723829714u, 3694611429u,
38656
    3614117080u, 3601426159u, 3572488374u, 3576541825u, 3496125444u, 3516976691u, 3555094634u, 3525581405u,
38657
    3311336976u, 3298595879u, 3336186494u, 3340255305u, 3260503756u, 3281337595u, 3251864226u, 3222399125u,
38658
    3410866088u, 3398419871u, 3368647622u, 3372945905u, 3427010420u, 3448139075u, 3485520666u, 3456284973u,
38659
    2444203584u, 2423127159u, 2452308526u, 2481530905u, 2527477404u, 2539934891u, 2502093554u, 2497740997u,
38660
    2679949304u, 2659102159u, 2620920726u, 2650438049u, 2562027300u, 2574714131u, 2603727690u, 2599670141u,
38661
    2374579504u, 2353749767u, 2383274334u, 2412743529u, 2323684844u, 2336421851u, 2298759554u, 2294686645u,
38662
    2207933576u, 2186809023u, 2149495014u, 2178734801u, 2224278612u, 2236720739u, 2266437690u, 2262135309u,
38663
    2850214048u, 2820717207u, 2858812622u, 2879680249u, 2934667388u, 2938704459u, 2909776914u, 2897069605u,
38664
    2817622296u, 2788420399u, 2759153014u, 2780249921u, 2700618180u, 2704950259u, 2742877610u, 2730399645u,
38665
    3049550800u, 3020298727u, 3057690558u, 3078802825u, 2999835404u, 3004150075u, 2974355298u, 2961925461u,
38666
    3151438440u, 3121956959u, 3092510214u, 3113327665u, 3168701108u, 3172786307u, 3210370778u, 3197646061u,
38667
  }, {
38668
    0u, 3099354981u, 2852767883u, 313896942u, 2405603159u, 937357362u, 627793884u, 2648127673u,
38669
    3316918511u, 2097696650u, 1874714724u, 3607201537u, 1255587768u, 4067088605u, 3772741427u, 1482887254u,
38670
    1343838111u, 3903140090u, 4195393300u, 1118632049u, 3749429448u, 1741137837u, 1970407491u, 3452858150u,
38671
    2511175536u, 756094997u, 1067759611u, 2266550430u, 449832999u, 2725482306u, 2965774508u, 142231497u,
38672
    2687676222u, 412010587u, 171665333u, 2995192016u, 793786473u, 2548850444u, 2237264098u, 1038456711u,
38673
    1703315409u, 3711623348u, 3482275674u, 1999841343u, 3940814982u, 1381529571u, 1089329165u, 4166106984u,
38674
    4029413537u, 1217896388u, 1512189994u, 3802027855u, 2135519222u, 3354724499u, 3577784189u, 1845280792u,
38675
    899665998u, 2367928107u, 2677414085u, 657096608u, 3137160985u, 37822588u, 284462994u, 2823350519u,
38676
    2601801789u, 598228824u, 824021174u, 2309093331u, 343330666u, 2898962447u, 3195996129u, 113467524u,
38677
    1587572946u, 3860600759u, 4104763481u, 1276501820u, 3519211397u, 1769898208u, 2076913422u, 3279374443u,
38678
    3406630818u, 1941006535u, 1627703081u, 3652755532u, 1148164341u, 4241751952u, 3999682686u, 1457141531u,
38679
    247015245u, 3053797416u, 2763059142u, 470583459u, 2178658330u, 963106687u, 735213713u, 2473467892u,
38680
    992409347u, 2207944806u, 2435792776u, 697522413u, 3024379988u, 217581361u, 508405983u, 2800865210u,
38681
    4271038444u, 1177467017u, 1419450215u, 3962007554u, 1911572667u, 3377213406u, 3690561584u, 1665525589u,
38682
    1799331996u, 3548628985u, 3241568279u, 2039091058u, 3831314379u, 1558270126u, 1314193216u, 4142438437u,
38683
    2928380019u, 372764438u, 75645176u, 3158189981u, 568925988u, 2572515393u, 2346768303u, 861712586u,
38684
    3982079547u, 1441124702u, 1196457648u, 4293663189u, 1648042348u, 3666298377u, 3358779879u, 1888390786u,
38685
    686661332u, 2421291441u, 2196002399u, 978858298u, 2811169155u, 523464422u, 226935048u, 3040519789u,
38686
    3175145892u, 100435649u, 390670639u, 2952089162u, 841119475u, 2325614998u, 2553003640u, 546822429u,
38687
    2029308235u, 3225988654u, 3539796416u, 1782671013u, 4153826844u, 1328167289u, 1570739863u, 3844338162u,
38688
    1298864389u, 4124540512u, 3882013070u, 1608431339u, 3255406162u, 2058742071u, 1744848601u, 3501990332u,
38689
    2296328682u, 811816591u, 584513889u, 2590678532u, 129869501u, 3204563416u, 2914283062u, 352848211u,
38690
    494030490u, 2781751807u, 3078325777u, 264757620u, 2450577869u, 715964072u, 941166918u, 2158327331u,
38691
    3636881013u, 1618608400u, 1926213374u, 3396585883u, 1470427426u, 4011365959u, 4255988137u, 1158766284u,
38692
    1984818694u, 3471935843u, 3695453837u, 1693991400u, 4180638033u, 1100160564u, 1395044826u, 3952793279u,
38693
    3019491049u, 189112716u, 435162722u, 2706139399u, 1016811966u, 2217162459u, 2526189877u, 774831696u,
38694
    643086745u, 2666061564u, 2354934034u, 887166583u, 2838900430u, 294275499u, 54519365u, 3145957664u,
38695
    3823145334u, 1532818963u, 1240029693u, 4048895640u, 1820460577u, 3560857924u, 3331051178u, 2117577167u,
38696
    3598663992u, 1858283101u, 2088143283u, 3301633750u, 1495127663u, 3785470218u, 4078182116u, 1269332353u,
38697
    332098007u, 2876706482u, 3116540252u, 25085497u, 2628386432u, 605395429u, 916469259u, 2384220526u,
38698
    2254837415u, 1054503362u, 745528876u, 2496903497u, 151290352u, 2981684885u, 2735556987u, 464596510u,
38699
    1137851976u, 4218313005u, 3923506883u, 1365741990u, 3434129695u, 1946996346u, 1723425172u, 3724871409u,
38700
  }, {
38701
    0u, 1029712304u, 2059424608u, 1201699536u, 4118849216u, 3370159984u, 2403399072u, 2988497936u,
38702
    812665793u, 219177585u, 1253054625u, 2010132753u, 3320900865u, 4170237105u, 3207642721u, 2186319825u,
38703
    1625331586u, 1568718386u, 438355170u, 658566482u, 2506109250u, 2818578674u, 4020265506u, 3535817618u,
38704
    1351670851u, 1844508147u, 709922595u, 389064339u, 2769320579u, 2557498163u, 3754961379u, 3803185235u,
38705
    3250663172u, 4238411444u, 3137436772u, 2254525908u, 876710340u, 153198708u, 1317132964u, 1944187668u,
38706
    4054934725u, 3436268917u, 2339452837u, 3054575125u, 70369797u, 961670069u, 2129760613u, 1133623509u,
38707
    2703341702u, 2621542710u, 3689016294u, 3867263574u, 1419845190u, 1774270454u, 778128678u, 318858390u,
38708
    2438067015u, 2888948471u, 3952189479u, 3606153623u, 1691440519u, 1504803895u, 504432359u, 594620247u,
38709
    1492342857u, 1704161785u, 573770537u, 525542041u, 2910060169u, 2417219385u, 3618876905u, 3939730521u,
38710
    1753420680u, 1440954936u, 306397416u, 790849880u, 2634265928u, 2690882808u, 3888375336u, 3668168600u,
38711
    940822475u, 91481723u, 1121164459u, 2142483739u, 3448989963u, 4042473659u, 3075684971u, 2318603227u,
38712
    140739594u, 889433530u, 1923340138u, 1338244826u, 4259521226u, 3229813626u, 2267247018u, 3124975642u,
38713
    2570221389u, 2756861693u, 3824297005u, 3734113693u, 1823658381u, 1372780605u, 376603373u, 722643805u,
38714
    2839690380u, 2485261628u, 3548540908u, 4007806556u, 1556257356u, 1638052860u, 637716780u, 459464860u,
38715
    4191346895u, 3300051327u, 2199040943u, 3195181599u, 206718479u, 825388991u, 1989285231u, 1274166495u,
38716
    3382881038u, 4106388158u, 3009607790u, 2382549470u, 1008864718u, 21111934u, 1189240494u, 2072147742u,
38717
    2984685714u, 2357631266u, 3408323570u, 4131834434u, 1147541074u, 2030452706u, 1051084082u, 63335554u,
38718
    2174155603u, 3170292451u, 4216760371u, 3325460867u, 1947622803u, 1232499747u, 248909555u, 867575619u,
38719
    3506841360u, 3966111392u, 2881909872u, 2527485376u, 612794832u, 434546784u, 1581699760u, 1663499008u,
38720
    3782634705u, 3692447073u, 2612412337u, 2799048193u, 351717905u, 697754529u, 1849071985u, 1398190273u,
38721
    1881644950u, 1296545318u, 182963446u, 931652934u, 2242328918u, 3100053734u, 4284967478u, 3255255942u,
38722
    1079497815u, 2100821479u, 983009079u, 133672583u, 3050795671u, 2293717799u, 3474399735u, 4067887175u,
38723
    281479188u, 765927844u, 1778867060u, 1466397380u, 3846680276u, 3626469220u, 2676489652u, 2733102084u,
38724
    548881365u, 500656741u, 1517752501u, 1729575173u, 3577210133u, 3898068133u, 2952246901u, 2459410373u,
38725
    3910527195u, 3564487019u, 2480257979u, 2931134987u, 479546907u, 569730987u, 1716854139u, 1530213579u,
38726
    3647316762u, 3825568426u, 2745561210u, 2663766474u, 753206746u, 293940330u, 1445287610u, 1799716618u,
38727
    2314567513u, 3029685993u, 4080348217u, 3461678473u, 2088098201u, 1091956777u, 112560889u, 1003856713u,
38728
    3112514712u, 2229607720u, 3276105720u, 4263857736u, 1275433560u, 1902492648u, 918929720u, 195422344u,
38729
    685033439u, 364179055u, 1377080511u, 1869921551u, 3713294623u, 3761522863u, 2811507327u, 2599689167u,
38730
    413436958u, 633644462u, 1650777982u, 1594160846u, 3978570462u, 3494118254u, 2548332990u, 2860797966u,
38731
    1211387997u, 1968470509u, 854852413u, 261368461u, 3182753437u, 2161434413u, 3346310653u, 4195650637u,
38732
    2017729436u, 1160000044u, 42223868u, 1071931724u, 2378480988u, 2963576044u, 4144295484u, 3395602316u,
38733
  }, {
38734
    0u, 3411858341u, 1304994059u, 2257875630u, 2609988118u, 1355649459u, 3596215069u, 486879416u,
38735
    3964895853u, 655315400u, 2711298918u, 1791488195u, 2009251963u, 3164476382u, 973758832u, 4048990933u,
38736
    64357019u, 3364540734u, 1310630800u, 2235723829u, 2554806413u, 1394316072u, 3582976390u, 517157411u,
38737
    4018503926u, 618222419u, 2722963965u, 1762783832u, 1947517664u, 3209171269u, 970744811u, 4068520014u,
38738
    128714038u, 3438335635u, 1248109629u, 2167961496u, 2621261600u, 1466012805u, 3522553387u, 447296910u,
38739
    3959392091u, 547575038u, 2788632144u, 1835791861u, 1886307661u, 3140622056u, 1034314822u, 4143626211u,
38740
    75106221u, 3475428360u, 1236444838u, 2196665603u, 2682996155u, 1421317662u, 3525567664u, 427767573u,
38741
    3895035328u, 594892389u, 2782995659u, 1857943406u, 1941489622u, 3101955187u, 1047553757u, 4113347960u,
38742
    257428076u, 3288652233u, 1116777319u, 2311878850u, 2496219258u, 1603640287u, 3640781169u, 308099796u,
38743
    3809183745u, 676813732u, 2932025610u, 1704983215u, 2023410199u, 3016104370u, 894593820u, 4262377657u,
38744
    210634999u, 3352484690u, 1095150076u, 2316991065u, 2535410401u, 1547934020u, 3671583722u, 294336591u,
38745
    3772615322u, 729897279u, 2903845777u, 1716123700u, 2068629644u, 2953845545u, 914647431u, 4258839074u,
38746
    150212442u, 3282623743u, 1161604689u, 2388688372u, 2472889676u, 1480171241u, 3735940167u, 368132066u,
38747
    3836185911u, 805002898u, 2842635324u, 1647574937u, 2134298401u, 3026852996u, 855535146u, 4188192143u,
38748
    186781121u, 3229539940u, 1189784778u, 2377547631u, 2427670487u, 1542429810u, 3715886812u, 371670393u,
38749
    3882979244u, 741170185u, 2864262823u, 1642462466u, 2095107514u, 3082559007u, 824732849u, 4201955092u,
38750
    514856152u, 3589064573u, 1400419795u, 2552522358u, 2233554638u, 1316849003u, 3370776517u, 62202976u,
38751
    4075001525u, 968836368u, 3207280574u, 1954014235u, 1769133219u, 2720925446u, 616199592u, 4024870413u,
38752
    493229635u, 3594175974u, 1353627464u, 2616354029u, 2264355925u, 1303087088u, 3409966430u, 6498043u,
38753
    4046820398u, 979978123u, 3170710821u, 2007099008u, 1789187640u, 2717386141u, 661419827u, 3962610838u,
38754
    421269998u, 3527459403u, 1423225061u, 2676515648u, 2190300152u, 1238466653u, 3477467891u, 68755798u,
38755
    4115633027u, 1041448998u, 3095868040u, 1943789869u, 1860096405u, 2776760880u, 588673182u, 3897205563u,
38756
    449450869u, 3516317904u, 1459794558u, 2623431131u, 2170245475u, 1242006214u, 3432247400u, 131015629u,
38757
    4137259288u, 1036337853u, 3142660115u, 1879958454u, 1829294862u, 2790523051u, 549483013u, 3952910752u,
38758
    300424884u, 3669282065u, 1545650111u, 2541513754u, 2323209378u, 1092980487u, 3350330793u, 216870412u,
38759
    4256931033u, 921128828u, 2960342482u, 2066738807u, 1714085583u, 2910195050u, 736264132u, 3770592353u,
38760
    306060335u, 3647131530u, 1610005796u, 2494197377u, 2309971513u, 1123257756u, 3295149874u, 255536279u,
38761
    4268596802u, 892423655u, 3013951305u, 2029645036u, 1711070292u, 2929725425u, 674528607u, 3815288570u,
38762
    373562242u, 3709388839u, 1535949449u, 2429577516u, 2379569556u, 1183418929u, 3223189663u, 188820282u,
38763
    4195850735u, 827017802u, 3084859620u, 2089020225u, 1636228089u, 2866415708u, 743340786u, 3876759895u,
38764
    361896217u, 3738094268u, 1482340370u, 2466671543u, 2382584591u, 1163888810u, 3284924932u, 144124321u,
38765
    4190215028u, 849168593u, 3020503679u, 2136336858u, 1649465698u, 2836138695u, 798521449u, 3838094284u,
38766
  }, {
38767
    0u, 2792819636u, 2543784233u, 837294749u, 4098827283u, 1379413927u, 1674589498u, 3316072078u,
38768
    871321191u, 2509784531u, 2758827854u, 34034938u, 3349178996u, 1641505216u, 1346337629u, 4131942633u,
38769
    1742642382u, 3249117050u, 4030828007u, 1446413907u, 2475800797u, 904311657u, 68069876u, 2725880384u,
38770
    1412551337u, 4064729373u, 3283010432u, 1708771380u, 2692675258u, 101317902u, 937551763u, 2442587175u,
38771
    3485284764u, 1774858792u, 1478633653u, 4266992385u, 1005723023u, 2642744891u, 2892827814u, 169477906u,
38772
    4233263099u, 1512406095u, 1808623314u, 3451546982u, 136139752u, 2926205020u, 2676114113u, 972376437u,
38773
    2825102674u, 236236518u, 1073525883u, 2576072655u, 1546420545u, 4200303349u, 3417542760u, 1841601500u,
38774
    2609703733u, 1039917185u, 202635804u, 2858742184u, 1875103526u, 3384067218u, 4166835727u, 1579931067u,
38775
    1141601657u, 3799809741u, 3549717584u, 1977839588u, 2957267306u, 372464350u, 668680259u, 2175552503u,
38776
    2011446046u, 3516084394u, 3766168119u, 1175200131u, 2209029901u, 635180217u, 338955812u, 2990736784u,
38777
    601221559u, 2242044419u, 3024812190u, 306049834u, 3617246628u, 1911408144u, 1074125965u, 3866285881u,
38778
    272279504u, 3058543716u, 2275784441u, 567459149u, 3832906691u, 1107462263u, 1944752874u, 3583875422u,
38779
    2343980261u, 767641425u, 472473036u, 3126744696u, 2147051766u, 3649987394u, 3899029983u, 1309766251u,
38780
    3092841090u, 506333494u, 801510315u, 2310084639u, 1276520081u, 3932237093u, 3683203000u, 2113813516u,
38781
    3966292011u, 1243601823u, 2079834370u, 3716205238u, 405271608u, 3192979340u, 2411259153u, 701492901u,
38782
    3750207052u, 2045810168u, 1209569125u, 4000285905u, 734575199u, 2378150379u, 3159862134u, 438345922u,
38783
    2283203314u, 778166598u, 529136603u, 3120492655u, 2086260449u, 3660498261u, 3955679176u, 1303499900u,
38784
    3153699989u, 495890209u, 744928700u, 2316418568u, 1337360518u, 3921775410u, 3626602927u, 2120129051u,
38785
    4022892092u, 1237286280u, 2018993941u, 3726666913u, 461853231u, 3186645403u, 2350400262u, 711936178u,
38786
    3693557851u, 2052076527u, 1270360434u, 3989775046u, 677911624u, 2384402428u, 3220639073u, 427820757u,
38787
    1202443118u, 3789347034u, 3493118535u, 1984154099u, 3018127229u, 362020041u, 612099668u, 2181885408u,
38788
    1950653705u, 3526596285u, 3822816288u, 1168934804u, 2148251930u, 645706414u, 395618355u, 2984485767u,
38789
    544559008u, 2248295444u, 3085590153u, 295523645u, 3560598451u, 1917673479u, 1134918298u, 3855773998u,
38790
    328860103u, 3052210803u, 2214924526u, 577903450u, 3889505748u, 1101147744u, 1883911421u, 3594338121u,
38791
    3424493451u, 1785369663u, 1535282850u, 4260726038u, 944946072u, 2653270060u, 2949491377u, 163225861u,
38792
    4294103532u, 1501944408u, 1752023237u, 3457862513u, 196998655u, 2915761739u, 2619532502u, 978710370u,
38793
    2881684293u, 229902577u, 1012666988u, 2586515928u, 1603020630u, 4193987810u, 3356702335u, 1852063179u,
38794
    2553040162u, 1046169238u, 263412747u, 2848217023u, 1818454321u, 3390333573u, 4227627032u, 1569420204u,
38795
    60859927u, 2782375331u, 2487203646u, 843627658u, 4159668740u, 1368951216u, 1617990445u, 3322386585u,
38796
    810543216u, 2520310724u, 2815490393u, 27783917u, 3288386659u, 1652017111u, 1402985802u, 4125677310u,
38797
    1685994201u, 3255382381u, 4091620336u, 1435902020u, 2419138250u, 910562686u, 128847843u, 2715354199u,
38798
    1469150398u, 4058414858u, 3222168983u, 1719234083u, 2749255853u, 94984985u, 876691844u, 2453031472u,
38799
  }, {
38800
    0u, 3433693342u, 1109723005u, 2391738339u, 2219446010u, 1222643300u, 3329165703u, 180685081u,
38801
    3555007413u, 525277995u, 2445286600u, 1567235158u, 1471092047u, 2600801745u, 361370162u, 3642757804u,
38802
    2092642603u, 2953916853u, 1050555990u, 4063508168u, 4176560081u, 878395215u, 3134470316u, 1987983410u,
38803
    2942184094u, 1676945920u, 3984272867u, 567356797u, 722740324u, 3887998202u, 1764827929u, 2778407815u,
38804
    4185285206u, 903635656u, 3142804779u, 2012833205u, 2101111980u, 2979425330u, 1058630609u, 4088621903u,
38805
    714308067u, 3862526333u, 1756790430u, 2753330688u, 2933487385u, 1651734407u, 3975966820u, 542535930u,
38806
    2244825981u, 1231508451u, 3353891840u, 188896414u, 25648519u, 3442302233u, 1134713594u, 2399689316u,
38807
    1445480648u, 2592229462u, 336416693u, 3634843435u, 3529655858u, 516441772u, 2420588879u, 1559052753u,
38808
    698204909u, 3845636723u, 1807271312u, 2803025166u, 2916600855u, 1635634313u, 4025666410u, 593021940u,
38809
    4202223960u, 919787974u, 3093159461u, 1962401467u, 2117261218u, 2996361020u, 1008193759u, 4038971457u,
38810
    1428616134u, 2576151384u, 386135227u, 3685348389u, 3513580860u, 499580322u, 2471098945u, 1608776415u,
38811
    2260985971u, 1248454893u, 3303468814u, 139259792u, 42591881u, 3458459159u, 1085071860u, 2349261162u,
38812
    3505103035u, 474062885u, 2463016902u, 1583654744u, 1419882049u, 2550902495u, 377792828u, 3660491170u,
38813
    51297038u, 3483679632u, 1093385331u, 2374089965u, 2269427188u, 1273935210u, 3311514249u, 164344343u,
38814
    2890961296u, 1627033870u, 4000683757u, 585078387u, 672833386u, 3836780532u, 1782552599u, 2794821769u,
38815
    2142603813u, 3005188795u, 1032883544u, 4047146438u, 4227826911u, 928351297u, 3118105506u, 1970307900u,
38816
    1396409818u, 2677114180u, 287212199u, 3719594553u, 3614542624u, 467372990u, 2505346141u, 1509854403u,
38817
    2162073199u, 1282711281u, 3271268626u, 240228748u, 76845205u, 3359543307u, 1186043880u, 2317064054u,
38818
    796964081u, 3811226735u, 1839575948u, 2702160658u, 2882189835u, 1734392469u, 3924802934u, 625327592u,
38819
    4234522436u, 818917338u, 3191908409u, 1927981223u, 2016387518u, 3028656416u, 973776579u, 4137723485u,
38820
    2857232268u, 1726474002u, 3899187441u, 616751215u, 772270454u, 3803048424u, 1814228491u, 2693328533u,
38821
    2041117753u, 3036871847u, 999160644u, 4146592730u, 4259508931u, 826864221u, 3217552830u, 1936586016u,
38822
    3606501031u, 442291769u, 2496909786u, 1484378436u, 1388107869u, 2652297411u, 278519584u, 3694387134u,
38823
    85183762u, 3384397196u, 1194773103u, 2342308593u, 2170143720u, 1307820918u, 3279733909u, 265733131u,
38824
    2057717559u, 3054258089u, 948125770u, 4096344276u, 4276898253u, 843467091u, 3167309488u, 1885556270u,
38825
    2839764098u, 1709792284u, 3949353983u, 667704161u, 755585656u, 3785577190u, 1865176325u, 2743489947u,
38826
    102594076u, 3401021058u, 1144549729u, 2291298815u, 2186770662u, 1325234296u, 3228729243u, 215514885u,
38827
    3589828009u, 424832311u, 2547870420u, 1534552650u, 1370645331u, 2635621325u, 328688686u, 3745342640u,
38828
    2211456353u, 1333405183u, 3254067740u, 224338562u, 127544219u, 3408931589u, 1170156774u, 2299866232u,
38829
    1345666772u, 2627681866u, 303053225u, 3736746295u, 3565105198u, 416624816u, 2522494803u, 1525692365u,
38830
    4285207626u, 868291796u, 3176010551u, 1910772649u, 2065767088u, 3079346734u, 956571085u, 4121828691u,
38831
    747507711u, 3760459617u, 1856702594u, 2717976604u, 2831417605u, 1684930971u, 3940615800u, 642451174u,
38832
  },
38833
  {
38834
    0u, 393942083u, 787884166u, 965557445u, 1575768332u, 1251427663u, 1931114890u, 1684106697u,
38835
    3151536664u, 2896410203u, 2502855326u, 2186649309u, 3862229780u, 4048545623u, 3368213394u, 3753496529u,
38836
    2898281073u, 3149616690u, 2184604407u, 2504883892u, 4046197629u, 3864463166u, 3755621371u, 3366006712u,
38837
    387506281u, 6550570u, 971950319u, 781573292u, 1257550181u, 1569695014u, 1677892067u, 1937345952u,
38838
    2196865699u, 2508887776u, 2886183461u, 3145514598u, 3743273903u, 3362179052u, 4058774313u, 3868258154u,
38839
    958996667u, 777139448u, 400492605u, 10755198u, 1690661303u, 1941857780u, 1244879153u, 1565019506u,
38840
    775012562u, 961205393u, 13101140u, 398261271u, 1943900638u, 1688634781u, 1563146584u, 1246801179u,
38841
    2515100362u, 2190636681u, 3139390028u, 2892258831u, 3355784134u, 3749586821u, 3874691904u, 4052225795u,
38842
    3734110983u, 3387496260u, 4033096577u, 3877584834u, 2206093835u, 2483373640u, 2911402637u, 3136515790u,
38843
    1699389727u, 1915860316u, 1270647193u, 1556585946u, 950464531u, 803071056u, 374397077u, 19647702u,
38844
    1917993334u, 1697207605u, 1554278896u, 1272937907u, 800985210u, 952435769u, 21510396u, 372452543u,
38845
    3381322606u, 3740399405u, 3883715560u, 4027047851u, 2489758306u, 2199758369u, 3130039012u, 2917895847u,
38846
    1550025124u, 1259902439u, 1922410786u, 1710144865u, 26202280u, 385139947u, 796522542u, 939715693u,
38847
    3887801276u, 4039129087u, 3377269562u, 3728088953u, 3126293168u, 2905368307u, 2493602358u, 2212122229u,
38848
    4037264341u, 3889747862u, 3730172755u, 3375300368u, 2907673305u, 3124004506u, 2209987167u, 2495786524u,
38849
    1266377165u, 1543533966u, 1703758155u, 1928748296u, 379007169u, 32253058u, 945887303u, 790236164u,
38850
    1716846671u, 1898845196u, 1218652361u, 1608006794u, 1002000707u, 750929152u, 357530053u, 36990342u,
38851
    3717046871u, 3405166100u, 4084959953u, 3825245842u, 2153902939u, 2535122712u, 2929187805u, 3119304606u,
38852
    3398779454u, 3723384445u, 3831720632u, 4078468859u, 2541294386u, 2147616625u, 3113171892u, 2935238647u,
38853
    1900929062u, 1714877541u, 1606142112u, 1220599011u, 748794154u, 1004184937u, 39295404u, 355241455u,
38854
    3835986668u, 4091516591u, 3394415210u, 3710500393u, 3108557792u, 2922629027u, 2545875814u, 2160455461u,
38855
    1601970420u, 1208431799u, 1904871538u, 1727077425u, 43020792u, 367748539u, 744905086u, 991776061u,
38856
    1214562461u, 1595921630u, 1720903707u, 1911159896u, 361271697u, 49513938u, 998160663u, 738569556u,
38857
    4089209477u, 3838277318u, 3712633347u, 3392233024u, 2924491657u, 3106613194u, 2158369551u, 2547846988u,
38858
    3100050248u, 2948339467u, 2519804878u, 2169126797u, 3844821572u, 4065347079u, 3420289730u, 3701894785u,
38859
    52404560u, 342144275u, 770279894u, 982687125u, 1593045084u, 1233708063u, 1879431386u, 1736363161u,
38860
    336019769u, 58479994u, 988899775u, 764050940u, 1240141877u, 1586496630u, 1729968307u, 1885744368u,
38861
    2950685473u, 3097818978u, 2166999975u, 2522013668u, 4063474221u, 3846743662u, 3703937707u, 3418263272u,
38862
    976650731u, 760059304u, 348170605u, 62635310u, 1742393575u, 1889649828u, 1227683937u, 1582820386u,
38863
    2179867635u, 2526361520u, 2937588597u, 3093503798u, 3691148031u, 3413731004u, 4076100217u, 3851374138u,
38864
    2532754330u, 2173556697u, 3087067932u, 2944139103u, 3407516310u, 3697379029u, 3857496592u, 4070026835u,
38865
    758014338u, 978679233u, 64506116u, 346250567u, 1891774606u, 1740186829u, 1580472328u, 1229917259u,
38866
  }, {
38867
    0u, 4022496062u, 83218493u, 3946298115u, 166436986u, 3861498692u, 220098631u, 3806075769u,
38868
    332873972u, 4229245898u, 388141257u, 4175494135u, 440197262u, 4127099824u, 516501683u, 4044053389u,
38869
    665747944u, 3362581206u, 593187285u, 3432594155u, 776282514u, 3246869164u, 716239279u, 3312622225u,
38870
    880394524u, 3686509090u, 814485793u, 3746462239u, 1033003366u, 3528460888u, 963096923u, 3601193573u,
38871
    1331495888u, 2694801646u, 1269355501u, 2758457555u, 1186374570u, 2843003028u, 1111716759u, 2910918825u,
38872
    1552565028u, 3007850522u, 1484755737u, 3082680359u, 1432478558u, 3131279456u, 1368666979u, 3193329757u,
38873
    1760789048u, 2268195078u, 1812353541u, 2210675003u, 1628971586u, 2396670332u, 1710092927u, 2318375233u,
38874
    2066006732u, 2498144754u, 2144408305u, 2417195471u, 1926193846u, 2634877320u, 1983558283u, 2583222709u,
38875
    2662991776u, 1903717534u, 2588923805u, 1972223139u, 2538711002u, 2022952164u, 2477029351u, 2087066841u,
38876
    2372749140u, 1655647338u, 2308478825u, 1717238871u, 2223433518u, 1799654416u, 2155034387u, 1873894445u,
38877
    3105130056u, 1456926070u, 3185661557u, 1378041163u, 2969511474u, 1597852940u, 3020617231u, 1539874097u,
38878
    2864957116u, 1157737858u, 2922780289u, 1106542015u, 2737333958u, 1290407416u, 2816325371u, 1210047941u,
38879
    3521578096u, 1042640718u, 3574781005u, 986759027u, 3624707082u, 936300340u, 3707335735u, 859512585u,
38880
    3257943172u, 770846650u, 3334837433u, 688390023u, 3420185854u, 605654976u, 3475911875u, 552361981u,
38881
    4132013464u, 428600998u, 4072428965u, 494812827u, 4288816610u, 274747100u, 4216845791u, 345349857u,
38882
    3852387692u, 173846098u, 3781891409u, 245988975u, 3967116566u, 62328360u, 3900749099u, 121822741u,
38883
    3859089665u, 164061759u, 3807435068u, 221426178u, 4025395579u, 2933317u, 3944446278u, 81334904u,
38884
    4124199413u, 437265099u, 4045904328u, 518386422u, 4231653775u, 335250097u, 4174133682u, 386814604u,
38885
    3249244393u, 778691543u, 3311294676u, 714879978u, 3359647891u, 662848429u, 3434477742u, 595039120u,
38886
    3531393053u, 1035903779u, 3599308832u, 961245982u, 3684132967u, 877986649u, 3747788890u, 815846244u,
38887
    2841119441u, 1184522735u, 2913852140u, 1114616274u, 2696129195u, 1332855189u, 2756082326u, 1266946472u,
38888
    3129952805u, 1431118107u, 3195705880u, 1371074854u, 3009735263u, 1554415969u, 3079748194u, 1481855324u,
38889
    2398522169u, 1630855175u, 2315475716u, 1707159610u, 2266835779u, 1759461501u, 2213084030u, 1814728768u,
38890
    2636237773u, 1927520499u, 2580814832u, 1981182158u, 2496293815u, 2064121993u, 2420095882u, 2147340468u,
38891
    2025787041u, 2541577631u, 2085281436u, 2475210146u, 1901375195u, 2660681189u, 1973518054u, 2590184920u,
38892
    1801997909u, 2225743211u, 1872600680u, 2153772374u, 1652813359u, 2369881361u, 1719025170u, 2310296876u,
38893
    1594986313u, 2966676599u, 1541693300u, 3022402634u, 1459236659u, 3107472397u, 1376780046u, 3184366640u,
38894
    1288097725u, 2734990467u, 1211309952u, 2817619134u, 1160605639u, 2867791097u, 1104723962u, 2920993988u,
38895
    937561457u, 3626001999u, 857201996u, 3704993394u, 1040821515u, 3519792693u, 989625654u, 3577615880u,
38896
    607473029u, 3421972155u, 549494200u, 3473077894u, 769584639u, 3256649409u, 690699714u, 3337180924u,
38897
    273452185u, 4287555495u, 347692196u, 4219156378u, 430386403u, 4133832669u, 491977950u, 4069562336u,
38898
    60542061u, 3965298515u, 124656720u, 3903616878u, 175139863u, 3853649705u, 243645482u, 3779581716u,
38899
  }, {
38900
    0u, 3247366080u, 1483520449u, 2581751297u, 2967040898u, 1901571138u, 3904227907u, 691737987u,
38901
    3133399365u, 2068659845u, 3803142276u, 589399876u, 169513671u, 3415493895u, 1383475974u, 2482566342u,
38902
    2935407819u, 1870142219u, 4137319690u, 924099274u, 506443593u, 3751897225u, 1178799752u, 2278412616u,
38903
    339027342u, 3585866318u, 1280941135u, 2379694991u, 2766951948u, 1700956620u, 4236308429u, 1024339981u,
38904
    2258407383u, 1192382487u, 3740284438u, 528411094u, 910556245u, 4157285269u, 1848198548u, 2946996820u,
38905
    1012887186u, 4258378066u, 1681119059u, 2780629139u, 2357599504u, 1292419792u, 3572147409u, 358906641u,
38906
    678054684u, 3924071644u, 1879503581u, 2978491677u, 2561882270u, 1497229150u, 3235873119u, 22109855u,
38907
    2460592729u, 1395094937u, 3401913240u, 189516888u, 577821147u, 3825075739u, 2048679962u, 3146956762u,
38908
    3595049455u, 398902831u, 2384764974u, 1336573934u, 1720805997u, 2803873197u, 1056822188u, 4285729900u,
38909
    1821112490u, 2902796138u, 887570795u, 4117339819u, 3696397096u, 500978920u, 2218668777u, 1169222953u,
38910
    2025774372u, 3106931428u, 550659301u, 3780950821u, 3362238118u, 166293862u, 2416645991u, 1367722151u,
38911
    3262987361u, 66315169u, 2584839584u, 1537170016u, 1923370979u, 3005911075u, 717813282u, 3947244002u,
38912
    1356109368u, 2438613496u, 146288633u, 3375820857u, 3759007162u, 562248314u, 3093388411u, 2045739963u,
38913
    3927406461u, 731490493u, 2994458300u, 1945440636u, 1523451135u, 2604718911u, 44219710u, 3274466046u,
38914
    4263662323u, 1068272947u, 2790189874u, 1740649714u, 1325080945u, 2406874801u, 379033776u, 3608758128u,
38915
    1155642294u, 2238671990u, 479005303u, 3708016055u, 4097359924u, 901128180u, 2891217397u, 1843045941u,
38916
    2011248031u, 3060787807u, 797805662u, 3993195422u, 3342353949u, 112630237u, 2673147868u, 1591353372u,
38917
    3441611994u, 212601626u, 2504944923u, 1421914843u, 2113644376u, 3161815192u, 630660761u, 3826893145u,
38918
    3642224980u, 412692116u, 2172340373u, 1089836885u, 1775141590u, 2822790422u, 832715543u, 4029474007u,
38919
    1674842129u, 2723860433u, 1001957840u, 4197873168u, 3540870035u, 310623315u, 2338445906u, 1257178514u,
38920
    4051548744u, 821257608u, 2836464521u, 1755307081u, 1101318602u, 2150241802u, 432566283u, 3628511179u,
38921
    1270766349u, 2318435533u, 332587724u, 3529260300u, 4217841807u, 988411727u, 2735444302u, 1652903566u,
38922
    1602977411u, 2651169091u, 132630338u, 3328776322u, 4015131905u, 786223809u, 3074340032u, 1991273216u,
38923
    3846741958u, 616972294u, 3173262855u, 2091579847u, 1435626564u, 2485072772u, 234706309u, 3430124101u,
38924
    2712218736u, 1613231024u, 4190475697u, 944458353u, 292577266u, 3506339890u, 1226630707u, 2291284467u,
38925
    459984181u, 3672380149u, 1124496628u, 2189994804u, 2880683703u, 1782407543u, 4091479926u, 844224694u,
38926
    257943739u, 3469817723u, 1462980986u, 2529005242u, 3213269817u, 2114471161u, 3890881272u, 644152632u,
38927
    3046902270u, 1947391550u, 3991973951u, 746483711u, 88439420u, 3301680572u, 1563018173u, 2628197501u,
38928
    657826727u, 3871046759u, 2136545894u, 3201811878u, 2548879397u, 1449267173u, 3481299428u, 235845156u,
38929
    2650161890u, 1551408418u, 3315268387u, 68429027u, 758067552u, 3970035360u, 1967360161u, 3033356129u,
38930
    2311284588u, 1213053100u, 3517963949u, 270598509u, 958010606u, 4170500910u, 1635167535u, 2700636911u,
38931
    855672361u, 4069415401u, 1802256360u, 2866995240u, 2212099499u, 1113008747u, 3686091882u, 440112042u,
38932
  }, {
38933
    0u, 2611301487u, 3963330207u, 2006897392u, 50740095u, 2560849680u, 4013794784u, 1956178319u,
38934
    101480190u, 2645113489u, 3929532513u, 1905435662u, 84561281u, 2662269422u, 3912356638u, 1922342769u,
38935
    202960380u, 2545787283u, 3760419683u, 2072395532u, 253679235u, 2495322860u, 3810871324u, 2021655667u,
38936
    169122562u, 2444351341u, 3861841309u, 2106214898u, 152215677u, 2461527058u, 3844685538u, 2123133581u,
38937
    405920760u, 2207553431u, 4094313831u, 1873742088u, 456646791u, 2157096168u, 4144791064u, 1823027831u,
38938
    507358470u, 2241388905u, 4060492697u, 1772322806u, 490444409u, 2258557462u, 4043311334u, 1789215881u,
38939
    338245124u, 2408348267u, 4161972379u, 1672996084u, 388959611u, 2357870868u, 4212429796u, 1622269835u,
38940
    304431354u, 2306870421u, 4263435877u, 1706791434u, 287538053u, 2324051946u, 4246267162u, 1723705717u,
38941
    811841520u, 2881944479u, 3696765295u, 1207788800u, 862293135u, 2831204576u, 3747484176u, 1157324415u,
38942
    913293582u, 2915732833u, 3662962577u, 1106318334u, 896137841u, 2932651550u, 3646055662u, 1123494017u,
38943
    1014716940u, 2816349795u, 3493905555u, 1273334012u, 1065181555u, 2765630748u, 3544645612u, 1222882179u,
38944
    980888818u, 2714919069u, 3595350637u, 1307180546u, 963712909u, 2731826146u, 3578431762u, 1324336509u,
38945
    676490248u, 3019317351u, 3295277719u, 1607253752u, 726947703u, 2968591128u, 3345992168u, 1556776327u,
38946
    777919222u, 3053147801u, 3261432937u, 1505806342u, 760750473u, 3070062054u, 3244539670u, 1522987897u,
38947
    608862708u, 3220163995u, 3362856811u, 1406423812u, 659339915u, 3169449700u, 3413582868u, 1355966587u,
38948
    575076106u, 3118709605u, 3464325525u, 1440228858u, 557894773u, 3135602714u, 3447411434u, 1457397381u,
38949
    1623683040u, 4217512847u, 2365387135u, 391757072u, 1673614495u, 4167309552u, 2415577600u, 341804655u,
38950
    1724586270u, 4251866481u, 2331019137u, 290835438u, 1707942497u, 4268256782u, 2314648830u, 307490961u,
38951
    1826587164u, 4152020595u, 2162433155u, 457265388u, 1876539747u, 4101829900u, 2212636668u, 407333779u,
38952
    1792275682u, 4051089549u, 2263378557u, 491595282u, 1775619997u, 4067460082u, 2246988034u, 508239213u,
38953
    2029433880u, 3813931127u, 2496473735u, 258500328u, 2079362919u, 3763716872u, 2546668024u, 208559511u,
38954
    2130363110u, 3848244873u, 2462145657u, 157552662u, 2113730969u, 3864638966u, 2445764358u, 174205801u,
38955
    1961777636u, 4014675339u, 2564147067u, 57707284u, 2011718299u, 3964481268u, 2614361092u, 7778411u,
38956
    1927425818u, 3913769845u, 2665066885u, 92077546u, 1910772837u, 3930150922u, 2648673018u, 108709525u,
38957
    1352980496u, 3405878399u, 3164554895u, 658115296u, 1403183983u, 3355946752u, 3214507504u, 607924639u,
38958
    1453895406u, 3440239233u, 3130208369u, 557218846u, 1437504913u, 3456883198u, 3113552654u, 573589345u,
38959
    1555838444u, 3340335491u, 2961681267u, 723707676u, 1606028947u, 3290383100u, 3011612684u, 673504355u,
38960
    1521500946u, 3239382909u, 3062619533u, 758026722u, 1505130605u, 3256038402u, 3045975794u, 774417053u,
38961
    1217725416u, 3543158663u, 2762906999u, 1057739032u, 1267939479u, 3493229816u, 2812847624u, 1007544935u,
38962
    1318679830u, 3577493881u, 2728586121u, 956803046u, 1302285929u, 3594125830u, 2711933174u, 973184153u,
38963
    1150152212u, 3743982203u, 2830528651u, 856898788u, 1200346475u, 3694041348u, 2880457716u, 806684571u,
38964
    1115789546u, 3643069573u, 2931426933u, 891243034u, 1099408277u, 3659722746u, 2914794762u, 907637093u,
38965
  }, {
38966
    0u, 3717650821u, 1616688459u, 3184159950u, 3233376918u, 489665299u, 2699419613u, 2104690264u,
38967
    1510200173u, 2274691816u, 979330598u, 3888758691u, 2595928571u, 1194090622u, 4209380528u, 661706037u,
38968
    3020400346u, 1771143007u, 3562738577u, 164481556u, 1958661196u, 2837976521u, 350386439u, 3379863682u,
38969
    3993269687u, 865250354u, 2388181244u, 1406015865u, 784146209u, 4079732388u, 1323412074u, 2474079215u,
38970
    3011398645u, 1860735600u, 3542286014u, 246687547u, 1942430051u, 2924607718u, 328963112u, 3456978349u,
38971
    3917322392u, 887832861u, 2300653011u, 1421341782u, 700772878u, 4099025803u, 1234716485u, 2483986112u,
38972
    125431087u, 3673109674u, 1730500708u, 3132326369u, 3351283641u, 441867836u, 2812031730u, 2047535991u,
38973
    1568292418u, 2163009479u, 1025936137u, 3769651852u, 2646824148u, 1079348561u, 4255113631u, 537475098u,
38974
    3180171691u, 1612400686u, 3721471200u, 4717925u, 2100624189u, 2694980280u, 493375094u, 3237910515u,
38975
    3884860102u, 974691139u, 2278750093u, 1514417672u, 657926224u, 4204917205u, 1198234907u, 2600289438u,
38976
    160053105u, 3558665972u, 1775665722u, 3024116671u, 3375586791u, 346391650u, 2842683564u, 1962488105u,
38977
    1401545756u, 2384412057u, 869618007u, 3997403346u, 2469432970u, 1319524111u, 4083956673u, 788193860u,
38978
    250862174u, 3546612699u, 1856990997u, 3006903952u, 3461001416u, 333211981u, 2920678787u, 1937824774u,
38979
    1425017139u, 2305216694u, 883735672u, 3912918525u, 2487837605u, 1239398944u, 4095071982u, 696455019u,
38980
    3136584836u, 1734518017u, 3668494799u, 121507914u, 2051872274u, 2816200599u, 437363545u, 3347544796u,
38981
    3774328809u, 1029797484u, 2158697122u, 1564328743u, 542033279u, 4258798842u, 1074950196u, 2642717105u,
38982
    2691310871u, 2113731730u, 3224801372u, 497043929u, 1624461185u, 3175454212u, 9435850u, 3709412175u,
38983
    4201248378u, 671035391u, 2587181873u, 1201904308u, 986750188u, 3880142185u, 1519135143u, 2266689570u,
38984
    342721485u, 3388693064u, 1949382278u, 2846355203u, 3570723163u, 155332830u, 3028835344u, 1763607957u,
38985
    1315852448u, 2482538789u, 775087595u, 4087626862u, 2396469814u, 1396827059u, 4002123645u, 857560824u,
38986
    320106210u, 3464673127u, 1934154665u, 2933785132u, 3551331444u, 238804465u, 3018961215u, 1852270778u,
38987
    1226292623u, 2491507722u, 692783300u, 4108177729u, 2309936921u, 1412959900u, 3924976210u, 879016919u,
38988
    2803091512u, 2055541181u, 3343875443u, 450471158u, 1739236014u, 3124525867u, 133568485u, 3663777376u,
38989
    4245691221u, 545702608u, 2639048222u, 1088059291u, 1034514883u, 3762268230u, 1576387720u, 2153979149u,
38990
    501724348u, 3228659001u, 2109407735u, 2687359090u, 3713981994u, 13109167u, 3171052385u, 1620357860u,
38991
    1206151121u, 2591211092u, 666423962u, 4197321503u, 2271022407u, 1523307714u, 3875649548u, 982999433u,
38992
    2850034278u, 1953942499u, 3384583981u, 338329256u, 1767471344u, 3033506165u, 151375291u, 3566408766u,
38993
    4091789579u, 779425934u, 2478797888u, 1311354309u, 861580189u, 4006375960u, 1392910038u, 2391852883u,
38994
    2929327945u, 1930372812u, 3469036034u, 324244359u, 1847629279u, 3015068762u, 243015828u, 3555391761u,
38995
    4103744548u, 688715169u, 2496043375u, 1229996266u, 874727090u, 3920994103u, 1417671673u, 2313759356u,
38996
    446585235u, 3339223062u, 2059594968u, 2807313757u, 3660002053u, 129100416u, 3128657486u, 1743609803u,
38997
    1084066558u, 2634765179u, 549535669u, 4250396208u, 2149900392u, 1571961325u, 3765982499u, 1039043750u,
38998
  }, {
38999
    0u, 2635063670u, 3782132909u, 2086741467u, 430739227u, 2225303149u, 4173482934u, 1707977408u,
39000
    861478454u, 2924937024u, 3526875803u, 1329085421u, 720736557u, 3086643291u, 3415954816u, 1452586230u,
39001
    1722956908u, 4223524122u, 2279405761u, 450042295u, 2132718455u, 3792785921u, 2658170842u, 58693292u,
39002
    1441473114u, 3370435372u, 3028674295u, 696911745u, 1279765825u, 3511176247u, 2905172460u, 807831706u,
39003
    3445913816u, 1349228974u, 738901109u, 2969918723u, 3569940419u, 1237784245u, 900084590u, 2829701656u,
39004
    4265436910u, 1664255896u, 525574723u, 2187084597u, 3885099509u, 2057177219u, 117386584u, 2616249390u,
39005
    2882946228u, 920233410u, 1253605401u, 3619119471u, 2994391983u, 796207833u, 1393823490u, 3457937012u,
39006
    2559531650u, 92322804u, 2044829231u, 3840835417u, 2166609305u, 472659183u, 1615663412u, 4249022530u,
39007
    1102706673u, 3702920839u, 2698457948u, 1037619754u, 1477802218u, 3306854812u, 3111894087u, 611605809u,
39008
    1927342535u, 4025419953u, 2475568490u, 243387420u, 1800169180u, 4131620778u, 2317525617u, 388842247u,
39009
    655084445u, 3120835307u, 3328511792u, 1533734470u, 1051149446u, 2745738736u, 3754524715u, 1120297309u,
39010
    340972971u, 2304586973u, 4114354438u, 1748234352u, 234773168u, 2431761350u, 3968900637u, 1906278251u,
39011
    2363330345u, 299003487u, 1840466820u, 4038896370u, 2507210802u, 142532932u, 1948239007u, 3910149609u,
39012
    3213136159u, 579563625u, 1592415666u, 3286611140u, 2787646980u, 992477042u, 1195825833u, 3662232543u,
39013
    3933188933u, 2002801203u, 184645608u, 2517538462u, 4089658462u, 1858919720u, 313391347u, 2409765253u,
39014
    3644239219u, 1144605701u, 945318366u, 2773977256u, 3231326824u, 1570095902u, 569697989u, 3170568115u,
39015
    2205413346u, 511446676u, 1646078799u, 4279421497u, 2598330617u, 131105167u, 2075239508u, 3871229218u,
39016
    2955604436u, 757403810u, 1363424633u, 3427521551u, 2844163791u, 881434553u, 1223211618u, 3588709140u,
39017
    3854685070u, 2026779384u, 78583587u, 2577462869u, 4235025557u, 1633861091u, 486774840u, 2148301134u,
39018
    3600338360u, 1268198606u, 938871061u, 2868504675u, 3476308643u, 1379640277u, 777684494u, 3008718712u,
39019
    1310168890u, 3541595724u, 2943964055u, 846639841u, 1471879201u, 3400857943u, 3067468940u, 735723002u,
39020
    2102298892u, 3762382970u, 2619362721u, 19901655u, 1692534295u, 4193118049u, 2240594618u, 411247564u,
39021
    681945942u, 3047836192u, 3385552891u, 1422167693u, 822682701u, 2886124859u, 3496468704u, 1298661782u,
39022
    469546336u, 2264093718u, 4203901389u, 1738379451u, 38812283u, 2673859341u, 3812556502u, 2117148576u,
39023
    3268024339u, 1606809957u, 598006974u, 3198893512u, 3680933640u, 1181316734u, 973624229u, 2802299603u,
39024
    4052944421u, 1822222163u, 285065864u, 2381456382u, 3896478014u, 1966106696u, 156323219u, 2489232613u,
39025
    2759337087u, 964150537u, 1159127250u, 3625517476u, 3184831332u, 551242258u, 1555722185u, 3249901247u,
39026
    2535537225u, 170842943u, 1984954084u, 3946848146u, 2391651666u, 327308324u, 1877176831u, 4075589769u,
39027
    263086283u, 2460058045u, 4005602406u, 1942963472u, 369291216u, 2332888742u, 4151061373u, 1784924683u,
39028
    1022852861u, 2717425547u, 3717839440u, 1083595558u, 626782694u, 3092517008u, 3291821387u, 1497027645u,
39029
    1763466407u, 4094934481u, 2289211402u, 360544636u, 1890636732u, 3988730570u, 2447251217u, 215086695u,
39030
    1514488465u, 3343557607u, 3140191804u, 639919946u, 1139395978u, 3739626748u, 2726758695u, 1065936977u,
39031
  }, {
39032
    0u, 3120290792u, 2827399569u, 293431929u, 2323408227u, 864534155u, 586863858u, 2600537882u,
39033
    3481914503u, 1987188591u, 1729068310u, 3740575486u, 1173727716u, 4228805132u, 3983743093u, 1418249117u,
39034
    1147313999u, 4254680231u, 3974377182u, 1428157750u, 3458136620u, 2011505092u, 1721256893u, 3747844181u,
39035
    2347455432u, 839944224u, 594403929u, 2593536433u, 26687147u, 3094146371u, 2836498234u, 283794642u,
39036
    2294627998u, 826205558u, 541298447u, 2578994407u, 45702141u, 3141697557u, 2856315500u, 331624836u,
39037
    1196225049u, 4273416689u, 4023010184u, 1446090848u, 3442513786u, 1959480466u, 1706436331u, 3696098563u,
39038
    3433538001u, 1968994873u, 1679888448u, 3722103720u, 1188807858u, 4280295258u, 3999102243u, 1470541515u,
39039
    53374294u, 3134568126u, 2879970503u, 307431215u, 2303854645u, 816436189u, 567589284u, 2553242188u,
39040
    3405478781u, 1929420949u, 1652411116u, 3682996484u, 1082596894u, 4185703926u, 3892424591u, 1375368295u,
39041
    91404282u, 3163122706u, 2918450795u, 336584067u, 2400113305u, 922028401u, 663249672u, 2658384096u,
39042
    2392450098u, 929185754u, 639587747u, 2682555979u, 82149713u, 3172883129u, 2892181696u, 362343208u,
39043
    1091578037u, 4176212829u, 3918960932u, 1349337804u, 3412872662u, 1922537022u, 1676344391u, 3658557359u,
39044
    1111377379u, 4224032267u, 3937989746u, 1396912026u, 3359776896u, 1908013928u, 1623494929u, 3644803833u,
39045
    2377615716u, 877417100u, 623982837u, 2630542109u, 130804743u, 3190831087u, 2941083030u, 381060734u,
39046
    106748588u, 3215393092u, 2933549885u, 388083925u, 2350956495u, 903570471u, 614862430u, 2640172470u,
39047
    3386185259u, 1882115523u, 1632872378u, 3634920530u, 1135178568u, 4199721120u, 3945775833u, 1389631793u,
39048
    1317531835u, 4152109907u, 3858841898u, 1610259138u, 3304822232u, 2097172016u, 1820140617u, 3582394273u,
39049
    2165193788u, 955639764u, 696815021u, 2423477829u, 192043359u, 2995356343u, 2750736590u, 437203750u,
39050
    182808564u, 3005133852u, 2724453989u, 462947725u, 2157513367u, 962777471u, 673168134u, 2447663342u,
39051
    3312231283u, 2090301595u, 1844056802u, 3557935370u, 1326499344u, 4142603768u, 3885397889u, 1584245865u,
39052
    3326266917u, 2142836173u, 1858371508u, 3611272284u, 1279175494u, 4123357358u, 3837270743u, 1564721471u,
39053
    164299426u, 2955991370u, 2706223923u, 414607579u, 2209834945u, 978107433u, 724686416u, 2462715320u,
39054
    2183156074u, 1004243586u, 715579643u, 2472360723u, 140260361u, 2980573153u, 2698675608u, 421617264u,
39055
    1302961645u, 4099032581u, 3845074044u, 1557460884u, 3352688782u, 2116952934u, 1867729183u, 3601371895u,
39056
    2222754758u, 1032278062u, 754596439u, 2499928511u, 234942117u, 3086693709u, 2793824052u, 528319708u,
39057
    1274365761u, 4061043881u, 3816027856u, 1518873912u, 3246989858u, 2020800970u, 1762628531u, 3505670235u,
39058
    3223196809u, 2045103969u, 1754834200u, 3512958704u, 1247965674u, 4086934018u, 3806642299u, 1528765331u,
39059
    261609486u, 3060532198u, 2802936223u, 518697591u, 2246819181u, 1007707781u, 762121468u, 2492913428u,
39060
    213497176u, 3041029808u, 2755593417u, 499441441u, 2261110843u, 1061030867u, 776167850u, 2545465922u,
39061
    3274734047u, 2060165687u, 1807140942u, 3528266662u, 1229724860u, 4038575956u, 3788156205u, 1479636677u,
39062
    1222322711u, 4045468159u, 3764231046u, 1504067694u, 3265744756u, 2069664924u, 1780612837u, 3554288909u,
39063
    2270357136u, 1051278712u, 802445057u, 2519698665u, 221152243u, 3033880603u, 2779263586u, 475261322u,
39064
  }, {
39065
    0u, 2926088593u, 2275419491u, 701019378u, 3560000647u, 2052709654u, 1402038756u, 4261017717u,
39066
    1930665807u, 3715829470u, 4105419308u, 1524313021u, 2804077512u, 155861593u, 545453739u, 2397726522u,
39067
    3861331614u, 1213181711u, 1636244477u, 3488582252u, 840331801u, 2625561480u, 3048626042u, 467584747u,
39068
    2503254481u, 995897408u, 311723186u, 3170637091u, 1090907478u, 4016929991u, 3332753461u, 1758288292u,
39069
    390036349u, 3109546732u, 2426363422u, 1056427919u, 3272488954u, 1835443819u, 1152258713u, 3938878216u,
39070
    1680663602u, 3393484195u, 3817652561u, 1306808512u, 2954733749u, 510998820u, 935169494u, 2580880455u,
39071
    4044899811u, 1601229938u, 1991794816u, 3637571857u, 623446372u, 2336332021u, 2726898695u, 216120726u,
39072
    2181814956u, 744704829u, 95158223u, 2881711710u, 1446680107u, 4166125498u, 3516576584u, 2146575065u,
39073
    780072698u, 2148951915u, 2849952665u, 129384968u, 4199529085u, 1411853292u, 2112855838u, 3548843663u,
39074
    1567451573u, 4077254692u, 3670887638u, 1957027143u, 2304517426u, 657765539u, 251396177u, 2694091200u,
39075
    3361327204u, 1714510325u, 1341779207u, 3784408214u, 476611811u, 2986349938u, 2613617024u, 899690513u,
39076
    3142211371u, 354600634u, 1021997640u, 2458051545u, 1870338988u, 3239283261u, 3906682575u, 1186180958u,
39077
    960597383u, 2536053782u, 3202459876u, 277428597u, 3983589632u, 1125666961u, 1792074851u, 3300423154u,
39078
    1246892744u, 3829039961u, 3455203243u, 1671079482u, 2657312335u, 806080478u, 432241452u, 3081497277u,
39079
    3748049689u, 1896751752u, 1489409658u, 4138600427u, 190316446u, 2772397583u, 2365053693u, 580864876u,
39080
    2893360214u, 35503559u, 735381813u, 2243795108u, 2017747153u, 3593269568u, 4293150130u, 1368183843u,
39081
    1560145396u, 4069882981u, 3680356503u, 1966430470u, 2295112051u, 648294626u, 258769936u, 2701399425u,
39082
    804156091u, 2173100842u, 2823706584u, 103204425u, 4225711676u, 1438101421u, 2088704863u, 3524758222u,
39083
    3134903146u, 347226875u, 1031468553u, 2467456920u, 1860935661u, 3229814396u, 3914054286u, 1193487135u,
39084
    3385412645u, 1738661300u, 1315531078u, 3758225623u, 502792354u, 3012596019u, 2589468097u, 875607120u,
39085
    1271043721u, 3853125400u, 3429020650u, 1644831355u, 2683558414u, 832261023u, 408158061u, 3057348348u,
39086
    953223622u, 2528745559u, 3211865253u, 286899508u, 3974120769u, 1116263632u, 1799381026u, 3307794867u,
39087
    2917509143u, 59586950u, 709201268u, 2217549029u, 2043995280u, 3619452161u, 4269064691u, 1344032866u,
39088
    3740677976u, 1889445577u, 1498812987u, 4148069290u, 180845535u, 2762992206u, 2372361916u, 588238637u,
39089
    1921194766u, 3706423967u, 4112727661u, 1531686908u, 2796705673u, 148555288u, 554857194u, 2407195515u,
39090
    26248257u, 2952271312u, 2251333922u, 676868275u, 3584149702u, 2076793175u, 1375858085u, 4234771508u,
39091
    2493785488u, 986493953u, 319029491u, 3178008930u, 1083533591u, 4009621638u, 3342158964u, 1767759333u,
39092
    3887577823u, 1239362382u, 1612160956u, 3464433197u, 864482904u, 2649647049u, 3022443323u, 441336490u,
39093
    1706844275u, 3419730402u, 3793503504u, 1282724993u, 2978819316u, 535149925u, 908921239u, 2554697734u,
39094
    380632892u, 3100077741u, 2433735263u, 1063734222u, 3265180603u, 1828069930u, 1161729752u, 3948283721u,
39095
    2207997677u, 770953084u, 71007118u, 2857626143u, 1470763626u, 4190274555u, 3490330377u, 2120394392u,
39096
    4035494306u, 1591758899u, 1999168705u, 3644880208u, 616140069u, 2328960180u, 2736367686u, 225524183u,
39097
  },
39098
};
39099
39100
// ---------------- Private Initializer Prototypes
39101
39102
// ---------------- Private Function Prototypes
39103
39104
WUFFS_BASE__GENERATED_C_CODE
39105
static wuffs_base__empty_struct
39106
wuffs_crc32__ieee_hasher__up(
39107
    wuffs_crc32__ieee_hasher* self,
39108
    wuffs_base__slice_u8 a_x);
39109
39110
WUFFS_BASE__GENERATED_C_CODE
39111
static wuffs_base__empty_struct
39112
wuffs_crc32__ieee_hasher__up__choosy_default(
39113
    wuffs_crc32__ieee_hasher* self,
39114
    wuffs_base__slice_u8 a_x);
39115
39116
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32)
39117
WUFFS_BASE__GENERATED_C_CODE
39118
static wuffs_base__empty_struct
39119
wuffs_crc32__ieee_hasher__up_arm_crc32(
39120
    wuffs_crc32__ieee_hasher* self,
39121
    wuffs_base__slice_u8 a_x);
39122
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32)
39123
39124
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
39125
WUFFS_BASE__GENERATED_C_CODE
39126
static wuffs_base__empty_struct
39127
wuffs_crc32__ieee_hasher__up_x86_sse42(
39128
    wuffs_crc32__ieee_hasher* self,
39129
    wuffs_base__slice_u8 a_x);
39130
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
39131
39132
// ---------------- VTables
39133
39134
const wuffs_base__hasher_u32__func_ptrs
39135
wuffs_crc32__ieee_hasher__func_ptrs_for__wuffs_base__hasher_u32 = {
39136
  (uint32_t(*)(const void*))(&wuffs_crc32__ieee_hasher__checksum_u32),
39137
  (uint64_t(*)(const void*,
39138
      uint32_t))(&wuffs_crc32__ieee_hasher__get_quirk),
39139
  (wuffs_base__status(*)(void*,
39140
      uint32_t,
39141
      uint64_t))(&wuffs_crc32__ieee_hasher__set_quirk),
39142
  (wuffs_base__empty_struct(*)(void*,
39143
      wuffs_base__slice_u8))(&wuffs_crc32__ieee_hasher__update),
39144
  (uint32_t(*)(void*,
39145
      wuffs_base__slice_u8))(&wuffs_crc32__ieee_hasher__update_u32),
39146
};
39147
39148
// ---------------- Initializer Implementations
39149
39150
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
39151
wuffs_crc32__ieee_hasher__initialize(
39152
    wuffs_crc32__ieee_hasher* self,
39153
    size_t sizeof_star_self,
39154
    uint64_t wuffs_version,
39155
27.2k
    uint32_t options){
39156
27.2k
  if (!self) {
39157
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
39158
0
  }
39159
27.2k
  if (sizeof(*self) != sizeof_star_self) {
39160
0
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
39161
0
  }
39162
27.2k
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
39163
27.2k
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
39164
0
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
39165
0
  }
39166
39167
27.2k
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
39168
    // The whole point of this if-check is to detect an uninitialized *self.
39169
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
39170
#if !defined(__clang__) && defined(__GNUC__)
39171
#pragma GCC diagnostic push
39172
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
39173
#endif
39174
2.89k
    if (self->private_impl.magic != 0) {
39175
0
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
39176
0
    }
39177
#if !defined(__clang__) && defined(__GNUC__)
39178
#pragma GCC diagnostic pop
39179
#endif
39180
24.3k
  } else {
39181
24.3k
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
39182
0
      memset(self, 0, sizeof(*self));
39183
0
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
39184
24.3k
    } else {
39185
24.3k
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
39186
24.3k
    }
39187
24.3k
  }
39188
39189
27.2k
  self->private_impl.choosy_up = &wuffs_crc32__ieee_hasher__up__choosy_default;
39190
39191
27.2k
  self->private_impl.magic = WUFFS_BASE__MAGIC;
39192
27.2k
  self->private_impl.vtable_for__wuffs_base__hasher_u32.vtable_name =
39193
27.2k
      wuffs_base__hasher_u32__vtable_name;
39194
27.2k
  self->private_impl.vtable_for__wuffs_base__hasher_u32.function_pointers =
39195
27.2k
      (const void*)(&wuffs_crc32__ieee_hasher__func_ptrs_for__wuffs_base__hasher_u32);
39196
27.2k
  return wuffs_base__make_status(NULL);
39197
27.2k
}
39198
39199
wuffs_crc32__ieee_hasher*
39200
0
wuffs_crc32__ieee_hasher__alloc(void) {
39201
0
  wuffs_crc32__ieee_hasher* x =
39202
0
      (wuffs_crc32__ieee_hasher*)(calloc(1, sizeof(wuffs_crc32__ieee_hasher)));
39203
0
  if (!x) {
39204
0
    return NULL;
39205
0
  }
39206
0
  if (wuffs_crc32__ieee_hasher__initialize(
39207
0
      x, sizeof(wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
39208
0
    free(x);
39209
0
    return NULL;
39210
0
  }
39211
0
  return x;
39212
0
}
39213
39214
size_t
39215
0
sizeof__wuffs_crc32__ieee_hasher(void) {
39216
0
  return sizeof(wuffs_crc32__ieee_hasher);
39217
0
}
39218
39219
// ---------------- Function Implementations
39220
39221
// -------- func crc32.ieee_hasher.get_quirk
39222
39223
WUFFS_BASE__GENERATED_C_CODE
39224
WUFFS_BASE__MAYBE_STATIC uint64_t
39225
wuffs_crc32__ieee_hasher__get_quirk(
39226
    const wuffs_crc32__ieee_hasher* self,
39227
0
    uint32_t a_key) {
39228
0
  if (!self) {
39229
0
    return 0;
39230
0
  }
39231
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
39232
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
39233
0
    return 0;
39234
0
  }
39235
39236
0
  return 0u;
39237
0
}
39238
39239
// -------- func crc32.ieee_hasher.set_quirk
39240
39241
WUFFS_BASE__GENERATED_C_CODE
39242
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
39243
wuffs_crc32__ieee_hasher__set_quirk(
39244
    wuffs_crc32__ieee_hasher* self,
39245
    uint32_t a_key,
39246
0
    uint64_t a_value) {
39247
0
  if (!self) {
39248
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
39249
0
  }
39250
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
39251
0
    return wuffs_base__make_status(
39252
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
39253
0
        ? wuffs_base__error__disabled_by_previous_error
39254
0
        : wuffs_base__error__initialize_not_called);
39255
0
  }
39256
39257
0
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
39258
0
}
39259
39260
// -------- func crc32.ieee_hasher.update
39261
39262
WUFFS_BASE__GENERATED_C_CODE
39263
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
39264
wuffs_crc32__ieee_hasher__update(
39265
    wuffs_crc32__ieee_hasher* self,
39266
60.6k
    wuffs_base__slice_u8 a_x) {
39267
60.6k
  if (!self) {
39268
0
    return wuffs_base__make_empty_struct();
39269
0
  }
39270
60.6k
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
39271
0
    return wuffs_base__make_empty_struct();
39272
0
  }
39273
39274
60.6k
  if (self->private_impl.f_state == 0u) {
39275
21.5k
    self->private_impl.choosy_up = (
39276
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32)
39277
        wuffs_base__cpu_arch__have_arm_crc32() ? &wuffs_crc32__ieee_hasher__up_arm_crc32 :
39278
#endif
39279
21.5k
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
39280
21.5k
        wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_crc32__ieee_hasher__up_x86_sse42 :
39281
21.5k
#endif
39282
21.5k
        self->private_impl.choosy_up);
39283
21.5k
  }
39284
60.6k
  wuffs_crc32__ieee_hasher__up(self, a_x);
39285
60.6k
  return wuffs_base__make_empty_struct();
39286
60.6k
}
39287
39288
// -------- func crc32.ieee_hasher.update_u32
39289
39290
WUFFS_BASE__GENERATED_C_CODE
39291
WUFFS_BASE__MAYBE_STATIC uint32_t
39292
wuffs_crc32__ieee_hasher__update_u32(
39293
    wuffs_crc32__ieee_hasher* self,
39294
60.6k
    wuffs_base__slice_u8 a_x) {
39295
60.6k
  if (!self) {
39296
0
    return 0;
39297
0
  }
39298
60.6k
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
39299
0
    return 0;
39300
0
  }
39301
39302
60.6k
  wuffs_crc32__ieee_hasher__update(self, a_x);
39303
60.6k
  return self->private_impl.f_state;
39304
60.6k
}
39305
39306
// -------- func crc32.ieee_hasher.up
39307
39308
WUFFS_BASE__GENERATED_C_CODE
39309
static wuffs_base__empty_struct
39310
wuffs_crc32__ieee_hasher__up(
39311
    wuffs_crc32__ieee_hasher* self,
39312
60.6k
    wuffs_base__slice_u8 a_x) {
39313
60.6k
  return (*self->private_impl.choosy_up)(self, a_x);
39314
60.6k
}
39315
39316
WUFFS_BASE__GENERATED_C_CODE
39317
static wuffs_base__empty_struct
39318
wuffs_crc32__ieee_hasher__up__choosy_default(
39319
    wuffs_crc32__ieee_hasher* self,
39320
0
    wuffs_base__slice_u8 a_x) {
39321
0
  uint32_t v_s = 0;
39322
0
  wuffs_base__slice_u8 v_p = {0};
39323
39324
0
  v_s = (4294967295u ^ self->private_impl.f_state);
39325
0
  {
39326
0
    wuffs_base__slice_u8 i_slice_p = a_x;
39327
0
    v_p.ptr = i_slice_p.ptr;
39328
0
    v_p.len = 16;
39329
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));
39330
0
    while (v_p.ptr < i_end0_p) {
39331
0
      v_s ^= ((((uint32_t)(v_p.ptr[0u])) << 0u) |
39332
0
          (((uint32_t)(v_p.ptr[1u])) << 8u) |
39333
0
          (((uint32_t)(v_p.ptr[2u])) << 16u) |
39334
0
          (((uint32_t)(v_p.ptr[3u])) << 24u));
39335
0
      v_s = (WUFFS_CRC32__IEEE_TABLE[0u][v_p.ptr[15u]] ^
39336
0
          WUFFS_CRC32__IEEE_TABLE[1u][v_p.ptr[14u]] ^
39337
0
          WUFFS_CRC32__IEEE_TABLE[2u][v_p.ptr[13u]] ^
39338
0
          WUFFS_CRC32__IEEE_TABLE[3u][v_p.ptr[12u]] ^
39339
0
          WUFFS_CRC32__IEEE_TABLE[4u][v_p.ptr[11u]] ^
39340
0
          WUFFS_CRC32__IEEE_TABLE[5u][v_p.ptr[10u]] ^
39341
0
          WUFFS_CRC32__IEEE_TABLE[6u][v_p.ptr[9u]] ^
39342
0
          WUFFS_CRC32__IEEE_TABLE[7u][v_p.ptr[8u]] ^
39343
0
          WUFFS_CRC32__IEEE_TABLE[8u][v_p.ptr[7u]] ^
39344
0
          WUFFS_CRC32__IEEE_TABLE[9u][v_p.ptr[6u]] ^
39345
0
          WUFFS_CRC32__IEEE_TABLE[10u][v_p.ptr[5u]] ^
39346
0
          WUFFS_CRC32__IEEE_TABLE[11u][v_p.ptr[4u]] ^
39347
0
          WUFFS_CRC32__IEEE_TABLE[12u][(255u & (v_s >> 24u))] ^
39348
0
          WUFFS_CRC32__IEEE_TABLE[13u][(255u & (v_s >> 16u))] ^
39349
0
          WUFFS_CRC32__IEEE_TABLE[14u][(255u & (v_s >> 8u))] ^
39350
0
          WUFFS_CRC32__IEEE_TABLE[15u][(255u & (v_s >> 0u))]);
39351
0
      v_p.ptr += 16;
39352
0
      v_s ^= ((((uint32_t)(v_p.ptr[0u])) << 0u) |
39353
0
          (((uint32_t)(v_p.ptr[1u])) << 8u) |
39354
0
          (((uint32_t)(v_p.ptr[2u])) << 16u) |
39355
0
          (((uint32_t)(v_p.ptr[3u])) << 24u));
39356
0
      v_s = (WUFFS_CRC32__IEEE_TABLE[0u][v_p.ptr[15u]] ^
39357
0
          WUFFS_CRC32__IEEE_TABLE[1u][v_p.ptr[14u]] ^
39358
0
          WUFFS_CRC32__IEEE_TABLE[2u][v_p.ptr[13u]] ^
39359
0
          WUFFS_CRC32__IEEE_TABLE[3u][v_p.ptr[12u]] ^
39360
0
          WUFFS_CRC32__IEEE_TABLE[4u][v_p.ptr[11u]] ^
39361
0
          WUFFS_CRC32__IEEE_TABLE[5u][v_p.ptr[10u]] ^
39362
0
          WUFFS_CRC32__IEEE_TABLE[6u][v_p.ptr[9u]] ^
39363
0
          WUFFS_CRC32__IEEE_TABLE[7u][v_p.ptr[8u]] ^
39364
0
          WUFFS_CRC32__IEEE_TABLE[8u][v_p.ptr[7u]] ^
39365
0
          WUFFS_CRC32__IEEE_TABLE[9u][v_p.ptr[6u]] ^
39366
0
          WUFFS_CRC32__IEEE_TABLE[10u][v_p.ptr[5u]] ^
39367
0
          WUFFS_CRC32__IEEE_TABLE[11u][v_p.ptr[4u]] ^
39368
0
          WUFFS_CRC32__IEEE_TABLE[12u][(255u & (v_s >> 24u))] ^
39369
0
          WUFFS_CRC32__IEEE_TABLE[13u][(255u & (v_s >> 16u))] ^
39370
0
          WUFFS_CRC32__IEEE_TABLE[14u][(255u & (v_s >> 8u))] ^
39371
0
          WUFFS_CRC32__IEEE_TABLE[15u][(255u & (v_s >> 0u))]);
39372
0
      v_p.ptr += 16;
39373
0
    }
39374
0
    v_p.len = 16;
39375
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));
39376
0
    while (v_p.ptr < i_end1_p) {
39377
0
      v_s ^= ((((uint32_t)(v_p.ptr[0u])) << 0u) |
39378
0
          (((uint32_t)(v_p.ptr[1u])) << 8u) |
39379
0
          (((uint32_t)(v_p.ptr[2u])) << 16u) |
39380
0
          (((uint32_t)(v_p.ptr[3u])) << 24u));
39381
0
      v_s = (WUFFS_CRC32__IEEE_TABLE[0u][v_p.ptr[15u]] ^
39382
0
          WUFFS_CRC32__IEEE_TABLE[1u][v_p.ptr[14u]] ^
39383
0
          WUFFS_CRC32__IEEE_TABLE[2u][v_p.ptr[13u]] ^
39384
0
          WUFFS_CRC32__IEEE_TABLE[3u][v_p.ptr[12u]] ^
39385
0
          WUFFS_CRC32__IEEE_TABLE[4u][v_p.ptr[11u]] ^
39386
0
          WUFFS_CRC32__IEEE_TABLE[5u][v_p.ptr[10u]] ^
39387
0
          WUFFS_CRC32__IEEE_TABLE[6u][v_p.ptr[9u]] ^
39388
0
          WUFFS_CRC32__IEEE_TABLE[7u][v_p.ptr[8u]] ^
39389
0
          WUFFS_CRC32__IEEE_TABLE[8u][v_p.ptr[7u]] ^
39390
0
          WUFFS_CRC32__IEEE_TABLE[9u][v_p.ptr[6u]] ^
39391
0
          WUFFS_CRC32__IEEE_TABLE[10u][v_p.ptr[5u]] ^
39392
0
          WUFFS_CRC32__IEEE_TABLE[11u][v_p.ptr[4u]] ^
39393
0
          WUFFS_CRC32__IEEE_TABLE[12u][(255u & (v_s >> 24u))] ^
39394
0
          WUFFS_CRC32__IEEE_TABLE[13u][(255u & (v_s >> 16u))] ^
39395
0
          WUFFS_CRC32__IEEE_TABLE[14u][(255u & (v_s >> 8u))] ^
39396
0
          WUFFS_CRC32__IEEE_TABLE[15u][(255u & (v_s >> 0u))]);
39397
0
      v_p.ptr += 16;
39398
0
    }
39399
0
    v_p.len = 1;
39400
0
    const uint8_t* i_end2_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len);
39401
0
    while (v_p.ptr < i_end2_p) {
39402
0
      v_s = (WUFFS_CRC32__IEEE_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ v_p.ptr[0u]))] ^ (v_s >> 8u));
39403
0
      v_p.ptr += 1;
39404
0
    }
39405
0
    v_p.len = 0;
39406
0
  }
39407
0
  self->private_impl.f_state = (4294967295u ^ v_s);
39408
0
  return wuffs_base__make_empty_struct();
39409
0
}
39410
39411
// -------- func crc32.ieee_hasher.checksum_u32
39412
39413
WUFFS_BASE__GENERATED_C_CODE
39414
WUFFS_BASE__MAYBE_STATIC uint32_t
39415
wuffs_crc32__ieee_hasher__checksum_u32(
39416
0
    const wuffs_crc32__ieee_hasher* self) {
39417
0
  if (!self) {
39418
0
    return 0;
39419
0
  }
39420
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
39421
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
39422
0
    return 0;
39423
0
  }
39424
39425
0
  return self->private_impl.f_state;
39426
0
}
39427
39428
// โ€ผ WUFFS MULTI-FILE SECTION +arm_crc32
39429
// -------- func crc32.ieee_hasher.up_arm_crc32
39430
39431
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32)
39432
WUFFS_BASE__GENERATED_C_CODE
39433
static wuffs_base__empty_struct
39434
wuffs_crc32__ieee_hasher__up_arm_crc32(
39435
    wuffs_crc32__ieee_hasher* self,
39436
    wuffs_base__slice_u8 a_x) {
39437
  wuffs_base__slice_u8 v_p = {0};
39438
  uint32_t v_s = 0;
39439
39440
  v_s = (4294967295u ^ self->private_impl.f_state);
39441
  while ((((uint64_t)(a_x.len)) > 0u) && ((15u & ((uint32_t)(0xFFFu & (uintptr_t)(a_x.ptr)))) != 0u)) {
39442
    v_s = __crc32b(v_s, a_x.ptr[0u]);
39443
    a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u);
39444
  }
39445
  {
39446
    wuffs_base__slice_u8 i_slice_p = a_x;
39447
    v_p.ptr = i_slice_p.ptr;
39448
    v_p.len = 8;
39449
    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));
39450
    while (v_p.ptr < i_end0_p) {
39451
      v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
39452
      v_p.ptr += 8;
39453
      v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
39454
      v_p.ptr += 8;
39455
      v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
39456
      v_p.ptr += 8;
39457
      v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
39458
      v_p.ptr += 8;
39459
      v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
39460
      v_p.ptr += 8;
39461
      v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
39462
      v_p.ptr += 8;
39463
      v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
39464
      v_p.ptr += 8;
39465
      v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
39466
      v_p.ptr += 8;
39467
      v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
39468
      v_p.ptr += 8;
39469
      v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
39470
      v_p.ptr += 8;
39471
      v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
39472
      v_p.ptr += 8;
39473
      v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
39474
      v_p.ptr += 8;
39475
      v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
39476
      v_p.ptr += 8;
39477
      v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
39478
      v_p.ptr += 8;
39479
      v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
39480
      v_p.ptr += 8;
39481
      v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
39482
      v_p.ptr += 8;
39483
    }
39484
    v_p.len = 8;
39485
    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));
39486
    while (v_p.ptr < i_end1_p) {
39487
      v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
39488
      v_p.ptr += 8;
39489
    }
39490
    v_p.len = 1;
39491
    const uint8_t* i_end2_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len);
39492
    while (v_p.ptr < i_end2_p) {
39493
      v_s = __crc32b(v_s, v_p.ptr[0u]);
39494
      v_p.ptr += 1;
39495
    }
39496
    v_p.len = 0;
39497
  }
39498
  self->private_impl.f_state = (4294967295u ^ v_s);
39499
  return wuffs_base__make_empty_struct();
39500
}
39501
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32)
39502
// โ€ผ WUFFS MULTI-FILE SECTION -arm_crc32
39503
39504
// โ€ผ WUFFS MULTI-FILE SECTION +x86_sse42
39505
// -------- func crc32.ieee_hasher.up_x86_sse42
39506
39507
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
39508
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
39509
WUFFS_BASE__GENERATED_C_CODE
39510
static wuffs_base__empty_struct
39511
wuffs_crc32__ieee_hasher__up_x86_sse42(
39512
    wuffs_crc32__ieee_hasher* self,
39513
60.6k
    wuffs_base__slice_u8 a_x) {
39514
60.6k
  uint32_t v_s = 0;
39515
60.6k
  __m128i v_kk = {0};
39516
60.6k
  __m128i v_x0 = {0};
39517
60.6k
  __m128i v_x1 = {0};
39518
60.6k
  __m128i v_x2 = {0};
39519
60.6k
  __m128i v_x3 = {0};
39520
60.6k
  __m128i v_x4 = {0};
39521
60.6k
  __m128i v_x5 = {0};
39522
60.6k
  __m128i v_x6 = {0};
39523
60.6k
  __m128i v_x7 = {0};
39524
60.6k
  __m128i v_y0 = {0};
39525
60.6k
  __m128i v_y1 = {0};
39526
60.6k
  __m128i v_y2 = {0};
39527
60.6k
  __m128i v_y3 = {0};
39528
60.6k
  __m128i v_y4 = {0};
39529
60.6k
  __m128i v_y5 = {0};
39530
60.6k
  __m128i v_y6 = {0};
39531
60.6k
  __m128i v_y7 = {0};
39532
39533
60.6k
  v_s = (4294967295u ^ self->private_impl.f_state);
39534
123k
  while ((((uint64_t)(a_x.len)) > 0u) && ((15u & ((uint32_t)(0xFFFu & (uintptr_t)(a_x.ptr)))) != 0u)) {
39535
62.8k
    v_s = (WUFFS_CRC32__IEEE_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ a_x.ptr[0u]))] ^ (v_s >> 8u));
39536
62.8k
    a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u);
39537
62.8k
  }
39538
60.6k
  if (((uint64_t)(a_x.len)) >= 128u) {
39539
3.37k
    v_x0 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u));
39540
3.37k
    v_x1 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u));
39541
3.37k
    v_x2 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 32u));
39542
3.37k
    v_x3 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 48u));
39543
3.37k
    v_x4 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 64u));
39544
3.37k
    v_x5 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 80u));
39545
3.37k
    v_x6 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 96u));
39546
3.37k
    v_x7 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 112u));
39547
3.37k
    v_kk = _mm_set_epi32((int32_t)(0u), (int32_t)(2433674945u), (int32_t)(0u), (int32_t)(872412467u));
39548
3.37k
    v_x0 = _mm_xor_si128(v_x0, _mm_cvtsi32_si128((int32_t)(v_s)));
39549
3.37k
    a_x = wuffs_base__slice_u8__subslice_i(a_x, 128u);
39550
191k
    while (((uint64_t)(a_x.len)) >= 128u) {
39551
188k
      v_y0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(0u));
39552
188k
      v_x0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(17u));
39553
188k
      v_y1 = _mm_clmulepi64_si128(v_x1, v_kk, (int32_t)(0u));
39554
188k
      v_x1 = _mm_clmulepi64_si128(v_x1, v_kk, (int32_t)(17u));
39555
188k
      v_y2 = _mm_clmulepi64_si128(v_x2, v_kk, (int32_t)(0u));
39556
188k
      v_x2 = _mm_clmulepi64_si128(v_x2, v_kk, (int32_t)(17u));
39557
188k
      v_y3 = _mm_clmulepi64_si128(v_x3, v_kk, (int32_t)(0u));
39558
188k
      v_x3 = _mm_clmulepi64_si128(v_x3, v_kk, (int32_t)(17u));
39559
188k
      v_y4 = _mm_clmulepi64_si128(v_x4, v_kk, (int32_t)(0u));
39560
188k
      v_x4 = _mm_clmulepi64_si128(v_x4, v_kk, (int32_t)(17u));
39561
188k
      v_y5 = _mm_clmulepi64_si128(v_x5, v_kk, (int32_t)(0u));
39562
188k
      v_x5 = _mm_clmulepi64_si128(v_x5, v_kk, (int32_t)(17u));
39563
188k
      v_y6 = _mm_clmulepi64_si128(v_x6, v_kk, (int32_t)(0u));
39564
188k
      v_x6 = _mm_clmulepi64_si128(v_x6, v_kk, (int32_t)(17u));
39565
188k
      v_y7 = _mm_clmulepi64_si128(v_x7, v_kk, (int32_t)(0u));
39566
188k
      v_x7 = _mm_clmulepi64_si128(v_x7, v_kk, (int32_t)(17u));
39567
188k
      v_y0 = _mm_xor_si128(v_y0, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u)));
39568
188k
      v_x0 = _mm_xor_si128(v_x0, v_y0);
39569
188k
      v_y1 = _mm_xor_si128(v_y1, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u)));
39570
188k
      v_x1 = _mm_xor_si128(v_x1, v_y1);
39571
188k
      v_y2 = _mm_xor_si128(v_y2, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 32u)));
39572
188k
      v_x2 = _mm_xor_si128(v_x2, v_y2);
39573
188k
      v_y3 = _mm_xor_si128(v_y3, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 48u)));
39574
188k
      v_x3 = _mm_xor_si128(v_x3, v_y3);
39575
188k
      v_y4 = _mm_xor_si128(v_y4, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 64u)));
39576
188k
      v_x4 = _mm_xor_si128(v_x4, v_y4);
39577
188k
      v_y5 = _mm_xor_si128(v_y5, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 80u)));
39578
188k
      v_x5 = _mm_xor_si128(v_x5, v_y5);
39579
188k
      v_y6 = _mm_xor_si128(v_y6, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 96u)));
39580
188k
      v_x6 = _mm_xor_si128(v_x6, v_y6);
39581
188k
      v_y7 = _mm_xor_si128(v_y7, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 112u)));
39582
188k
      v_x7 = _mm_xor_si128(v_x7, v_y7);
39583
188k
      a_x = wuffs_base__slice_u8__subslice_i(a_x, 128u);
39584
188k
    }
39585
3.37k
    v_kk = _mm_set_epi32((int32_t)(0u), (int32_t)(3433693342u), (int32_t)(0u), (int32_t)(2926088593u));
39586
3.37k
    v_y0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(0u));
39587
3.37k
    v_x0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(17u));
39588
3.37k
    v_y2 = _mm_clmulepi64_si128(v_x2, v_kk, (int32_t)(0u));
39589
3.37k
    v_x2 = _mm_clmulepi64_si128(v_x2, v_kk, (int32_t)(17u));
39590
3.37k
    v_y4 = _mm_clmulepi64_si128(v_x4, v_kk, (int32_t)(0u));
39591
3.37k
    v_x4 = _mm_clmulepi64_si128(v_x4, v_kk, (int32_t)(17u));
39592
3.37k
    v_y6 = _mm_clmulepi64_si128(v_x6, v_kk, (int32_t)(0u));
39593
3.37k
    v_x6 = _mm_clmulepi64_si128(v_x6, v_kk, (int32_t)(17u));
39594
3.37k
    v_y0 = _mm_xor_si128(v_y0, v_x1);
39595
3.37k
    v_x0 = _mm_xor_si128(v_x0, v_y0);
39596
3.37k
    v_y2 = _mm_xor_si128(v_y2, v_x3);
39597
3.37k
    v_x2 = _mm_xor_si128(v_x2, v_y2);
39598
3.37k
    v_y4 = _mm_xor_si128(v_y4, v_x5);
39599
3.37k
    v_x4 = _mm_xor_si128(v_x4, v_y4);
39600
3.37k
    v_y6 = _mm_xor_si128(v_y6, v_x7);
39601
3.37k
    v_x6 = _mm_xor_si128(v_x6, v_y6);
39602
3.37k
    v_kk = _mm_set_epi32((int32_t)(0u), (int32_t)(2166711591u), (int32_t)(0u), (int32_t)(4057597354u));
39603
3.37k
    v_y0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(0u));
39604
3.37k
    v_x0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(17u));
39605
3.37k
    v_y4 = _mm_clmulepi64_si128(v_x4, v_kk, (int32_t)(0u));
39606
3.37k
    v_x4 = _mm_clmulepi64_si128(v_x4, v_kk, (int32_t)(17u));
39607
3.37k
    v_y0 = _mm_xor_si128(v_y0, v_x2);
39608
3.37k
    v_x0 = _mm_xor_si128(v_x0, v_y0);
39609
3.37k
    v_y4 = _mm_xor_si128(v_y4, v_x6);
39610
3.37k
    v_x4 = _mm_xor_si128(v_x4, v_y4);
39611
3.37k
    v_kk = _mm_set_epi32((int32_t)(0u), (int32_t)(496309207u), (int32_t)(0u), (int32_t)(2402626965u));
39612
3.37k
    v_y0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(0u));
39613
3.37k
    v_x0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(17u));
39614
3.37k
    v_y0 = _mm_xor_si128(v_y0, v_x4);
39615
3.37k
    v_x0 = _mm_xor_si128(v_x0, v_y0);
39616
3.37k
    v_kk = _mm_set_epi32((int32_t)(1u), (int32_t)(3681617473u), (int32_t)(3034951717u), (int32_t)(4144043585u));
39617
3.37k
    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))));
39618
3.37k
    v_kk = _mm_set_epi32((int32_t)(1u), (int32_t)(3681617473u), (int32_t)(3034951717u), (int32_t)(4144043585u));
39619
3.37k
    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))));
39620
3.37k
  }
39621
109k
  while (((uint64_t)(a_x.len)) >= 8u) {
39622
49.2k
    v_kk = _mm_set_epi32((int32_t)(1u), (int32_t)(3681617473u), (int32_t)(3034951717u), (int32_t)(4144043585u));
39623
49.2k
    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))));
39624
49.2k
    a_x = wuffs_base__slice_u8__subslice_i(a_x, 8u);
39625
49.2k
  }
39626
197k
  while (((uint64_t)(a_x.len)) > 0u) {
39627
136k
    v_s = (WUFFS_CRC32__IEEE_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ a_x.ptr[0u]))] ^ (v_s >> 8u));
39628
136k
    a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u);
39629
136k
  }
39630
60.6k
  self->private_impl.f_state = (4294967295u ^ v_s);
39631
60.6k
  return wuffs_base__make_empty_struct();
39632
60.6k
}
39633
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
39634
// โ€ผ WUFFS MULTI-FILE SECTION -x86_sse42
39635
39636
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC32)
39637
39638
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC64)
39639
39640
// ---------------- Status Codes Implementations
39641
39642
// ---------------- Private Consts
39643
39644
static const uint64_t
39645
WUFFS_CRC64__ECMA_TABLE[8][256] WUFFS_BASE__POTENTIALLY_UNUSED = {
39646
  {
39647
    0u, 12911341560706588527u, 17619267392293085275u, 5164075066763771700u, 8921845837811637811u, 14483170935171449180u, 10328150133527543400u, 4357999468653093127u,
39648
    17843691675623275622u, 4940391307328217865u, 226782375002905661u, 12685511915359257426u, 10119945210068853333u, 4566377562367245626u, 8715998937306186254u, 14689403211693301089u,
39649
    9051005139383707209u, 14895072503764629798u, 9880782614656435730u, 4193374422961527165u, 453564750005811322u, 13070904082541799189u, 17496296445768931361u, 4747102235666401102u,
39650
    9960315520700766767u, 4113029525020509504u, 9132755124734491252u, 14812441257301386523u, 17431997874612372508u, 4811156168024382323u, 391483189436228679u, 13132671735097031464u,
39651
    18102010278767414418u, 5195199925788447741u, 1131375642422963401u, 13591081480414639014u, 9288535643022529185u, 3731739485546663374u, 8386748845923054330u, 14361410892855143829u,
39652
    907129500011622644u, 13814943346342178715u, 17875617253995106479u, 5421418680781082560u, 8594564625313771207u, 14152643483341451688u, 9494204471332802204u, 3525329033817543155u,
39653
    9704381199536204507u, 3855837706121835956u, 8226059050041019008u, 13908973417437222383u, 18265510249468982504u, 5643692520190618503u, 718348998302913715u, 13463047253836762076u,
39654
    8146277531524994749u, 13989069943491807698u, 9622312336048764646u, 3938150108875254153u, 782966378872457358u, 13399312233903888353u, 18327840216347633877u, 5582173445676054458u,
39655
    7257036000092981153u, 15535280666427316430u, 10390399851576895482u, 2529986302517213333u, 2262751284845926802u, 12414353723947190013u, 16997392145760156105u, 6398650419759490726u,
39656
    10599130201908394951u, 2322133910755632296u, 7463478971093326748u, 15329644185724306675u, 16773497691846108660u, 6622864283287239323u, 2036569382881248687u, 12640783567252986560u,
39657
    1814259000023245288u, 12250853444207230599u, 17125426475222188467u, 6811676960462675676u, 7132938157145702363u, 15119434731753103540u, 10842837361562165120u, 2690676064372932847u,
39658
    17189129250627542414u, 6747026957542163169u, 1875814858707893717u, 12188560364711551674u, 10762704257491731389u, 2770420489343360210u, 7050658067635086310u, 15201536148867841161u,
39659
    11493583972846619443u, 3219832958944941148u, 7711675412243671912u, 15576564987190227975u, 16452118100082038016u, 6305011443818121839u, 1213047649942025563u, 11816267669673208372u,
39660
    7503259434831574869u, 15784731923736995898u, 11287385040381237006u, 3425713581329221729u, 1436697996605827430u, 11591809733187859977u, 16677985422973077821u, 6078267261889762898u,
39661
    16292555063049989498u, 5851447209550246421u, 1630020308903038241u, 11939238787801010766u, 11081681957373440841u, 3090674103720225830u, 7876300217750508306u, 16023932746787097725u,
39662
    1565932757744914716u, 12003503911822413427u, 16230825569204842823u, 5913566482019610152u, 7956607163135676207u, 15944361922680361024u, 11164346891352108916u, 3008957496780927003u,
39663
    14514072000185962306u, 8809633696146542637u, 4460922918905818905u, 10287960411460399222u, 12879331835779764593u, 113391187501452830u, 5059972605034426666u, 17660565739912801861u,
39664
    4525502569691853604u, 10224187249629523019u, 14576435430675780479u, 8748148222884465680u, 4980157760350383383u, 17740628527280140920u, 12797300839518981452u, 195741594718114339u,
39665
    13040162471224305931u, 565687821211481700u, 4644267821511264592u, 17536326748496696895u, 14926957942186653496u, 8937808626997553239u, 4297282312656885603u, 9839608450464401420u,
39666
    4852190599768102253u, 17327666750234135042u, 13245728566574478646u, 359174499151456857u, 4073138765762497374u, 10063573324157604913u, 14700457781105076997u, 9163920108173816938u,
39667
    3628518000046490576u, 9328460452529085631u, 14330211790445699979u, 8498696072880078052u, 5299565100954197475u, 18061012165519327884u, 13623353920925351352u, 1018284691440624343u,
39668
    14265876314291404726u, 8562713237611094233u, 3566469078572851181u, 9390260331795218562u, 13702854325316886917u, 937907429353946858u, 5381352128745865694u, 17978417549248290481u,
39669
    5746791986423309721u, 18225777846762470134u, 13494053915084326338u, 606523824971012781u, 3751629717415787434u, 9745292510640121029u, 13876787882151992305u, 8338992711486538910u,
39670
    13285957365033343487u, 815010154451519120u, 5540840978686720420u, 18431906428167644875u, 14101316135270172620u, 8115412784602421411u, 3978303581567838103u, 9519354766961195256u,
39671
    12527462061959317731u, 2230461459452909452u, 6439665917889882296u, 16893009583564617687u, 15423350824487343824u, 7288217715337890239u, 2490078880175191691u, 10493603952060017124u,
39672
    6520081235612152965u, 16813546994155744234u, 12610022887636243678u, 2148641156328442801u, 2426095299884051126u, 10557972909709735385u, 15361512820870335213u, 7350228890552538498u,
39673
    15006518869663149738u, 7165105895222849989u, 2649782550477098737u, 10947027550912647582u, 12362696414880903321u, 1783234539286425590u, 6851427162658443458u, 17022309211647725485u,
39674
    2873395993211654860u, 10722532847870938531u, 15232418832718623383u, 6938393941075996152u, 6642978682516671743u, 17230443782969840528u, 12156534523779525796u, 1989151790783919051u,
39675
    6263731030979658865u, 16556202624882645790u, 11702894419100492842u, 1245039440087595845u, 3260040617806076482u, 11390642587947386157u, 15688795063501830681u, 7680756410435167606u,
39676
    11622868312827688983u, 1324891275238549368u, 6181348207440451660u, 16638201170595874595u, 15752600435501016612u, 7616209416359311691u, 3321489341258335871u, 11328242235714328848u,
39677
    3131865515489829432u, 10977756817953029463u, 16137146508898304611u, 7844397531750915340u, 5811434156413844491u, 16395372229761246052u, 11827132964039220304u, 1660744670629167935u,
39678
    15913214326271352414u, 8068573254449152305u, 2905717078206922245u, 11204220263579804010u, 12035829987123708013u, 1452858539103461122u, 6017914993561854006u, 16189773752444600153u,
39679
  }, {
39680
    0u, 6118555238288912653u, 12237110476577825306u, 18247330833359770391u, 13942380710360636081u, 10778293617712507836u, 7543452712389327019u, 4343374206906190246u,
39681
    1162559746622204903u, 4957131115480832746u, 13398436261328603645u, 17084888254066768112u, 15086905424778654038u, 9634902877839851611u, 8686748413812380492u, 3198961161184305729u,
39682
    2325119493244409806u, 8407378615347160771u, 9914262230961665492u, 15960741045388068057u, 16229058527915052415u, 13101053971319389298u, 5254506258681524069u, 2018377927885299304u,
39683
    3487552142959377449u, 7246080283574668580u, 11075676491871100467u, 14798208821638459198u, 17373496827624760984u, 11957750539307177877u, 6397922322368611458u, 873845550624159119u,
39684
    4650238986488819612u, 1468611264581623441u, 16814757230694321542u, 13669406796222545035u, 9364600845881799981u, 15356367945216001056u, 2893367039927949111u, 8993183146101597754u,
39685
    5812680741028562043u, 307286854339917174u, 17976181078471403105u, 12506848973898782572u, 10509012517363048138u, 14213073068277772231u, 4036755855770598608u, 7848658706446142941u,
39686
    6975104285918754898u, 3757679901787621727u, 14492160567149337160u, 11382574084698991429u, 11651310343450272483u, 17679087685142107118u, 604386294999662841u, 6668229816820511220u,
39687
    8137636784695169973u, 2596263716583940792u, 15653459723670892975u, 10220140060479144098u, 12795844644737222916u, 16535671346696648713u, 1747691101248318238u, 5523790692630174227u,
39688
    9300477972977639224u, 15418239225476001333u, 2937222529163246882u, 8947075512310451247u, 4642267913777087881u, 1478833794519692420u, 16842993350473770899u, 13643422681269376670u,
39689
    10462937938231096543u, 14256895642581861842u, 4098594218943518405u, 7784568886045304776u, 5786734079855898222u, 335485660068962147u, 17986366292203195508u, 12498915352811683193u,
39690
    11625361482057124086u, 17707288688936286715u, 614573708679834348u, 6660293997941431265u, 6929031904881267271u, 3801500275841901386u, 14553996732492558429u, 11318486464284246352u,
39691
    12787875770090627857u, 16545891676414235164u, 1775925023235784971u, 5497808777625382918u, 8073511711541197216u, 2658137194938402989u, 15697317412892285882u, 10174030228858301111u,
39692
    13950208571837509796u, 10768213751408296361u, 7515359803575243454u, 4369215658492879795u, 64266086328445461u, 6056541296517372696u, 12193111774187735055u, 18293581128395077890u,
39693
    15112713823828466499u, 9606842886146402894u, 8676701462472931673u, 3206755967968430164u, 1208772589999325682u, 4913169729330573567u, 13336459633641022440u, 17149116886581154533u,
39694
    16275273569390339946u, 13057090384914568807u, 5192527433167881584u, 2082608760381092989u, 2350925692077440475u, 8379320821714095318u, 9904217479574233025u, 15968533654375526092u,
39695
    17437760713698643085u, 11895738795633802624u, 6353925819959930519u, 920093647833407386u, 3495382202496636476u, 7235998217053677361u, 11047581385260348454u, 14824052473177163051u,
39696
    10447068876609200373u, 14128364157388739064u, 4118967294799201007u, 7908597456515216354u, 5874445058326493764u, 391603411424480073u, 17894151024620902494u, 12447300791057279315u,
39697
    9284535827554175762u, 15289779793358354975u, 2957667589039384840u, 9071030930460645381u, 4729911307347480995u, 1535020299074674862u, 16750846767572792249u, 13591740465559749300u,
39698
    12735909365018523451u, 16453465302197274166u, 1832394617641637153u, 5585730863000118316u, 8197188437887036810u, 2678299164963691655u, 15569137772090609552u, 10158372272797335197u,
39699
    11573468159711796444u, 17614790262716542417u, 670971320137924294u, 6748289234561093579u, 7052776217202099821u, 3821593491595032416u, 14425748405936874615u, 11302896163253294458u,
39700
    15020497008676966249u, 9555230900528283236u, 8764415362900159859u, 3262871967819308158u, 1229147417359668696u, 5037195377843840213u, 13320587995882862530u, 17020586948957226703u,
39701
    13858063809762534542u, 10716528681989657987u, 7603000551683802772u, 4425403642365261721u, 84709666887204415u, 6180499360129388338u, 12177172482473303077u, 18165119875451415848u,
39702
    17309582619392432295u, 11880078264510294442u, 6477599625422879421u, 940257368289594288u, 3551850046471569942u, 7323923223311315739u, 10995617555250765836u, 14731624552464748801u,
39703
    16147023423082394432u, 13041502936518885965u, 5316274389876805978u, 2102700497890566231u, 2407324781779167729u, 8467313413945678076u, 9852321304593615851u, 15876037047908055782u,
39704
    1291018766690942925u, 4973072573440528064u, 13274480430592564695u, 17064442507263798490u, 15030719607150486908u, 9547259896855319665u, 8738431316985759590u, 3291108156134209131u,
39705
    128532172656890922u, 6134424711959717159u, 12113082593034745392u, 18226958170089932605u, 13886262546419256987u, 10690581952315096982u, 7595066862094806145u, 4435588787024731532u,
39706
    3580050981226981379u, 7297974293382715662u, 10987681667836234265u, 14741811897106152212u, 17353402924945863346u, 11834005814401532863u, 6413511935936860328u, 1002093465131966885u,
39707
    2417545179998651364u, 8459344608371405545u, 9826339458661147134u, 15904271038397419763u, 16208896970474576213u, 12977377931899316312u, 5270164626790366031u, 2146558256149678658u,
39708
    5864365122984562769u, 399431204366950748u, 17919992407673188939u, 12419207813205476166u, 10385054866335763168u, 14192630174644861933u, 4165217520762185978u, 7864598685623228919u,
39709
    4701851384154880950u, 1560828767195761339u, 16758641643428190636u, 13581693582721149089u, 9240574510442684679u, 15335992705270927370u, 3021896290089222941u, 9009054371811832336u,
39710
    8153224920554538911u, 2724514274940876434u, 15633368673088300421u, 10096393516356015240u, 12707851639919861038u, 16479271570068024355u, 1840187295666814772u, 5575686180147088953u,
39711
    6990764404993272952u, 3885857308630146421u, 14471996434107354722u, 11258899592309161839u, 11563386024119531209u, 17622620253752952772u, 696814903175779539u, 6720194058879067614u,
39712
  }, {
39713
    0u, 4542972359516777931u, 9085944719033555862u, 4691664355513513565u, 18171889438067111724u, 14061474303606774503u, 9383328711027027130u, 13633424072306524529u,
39714
    7676286055365832925u, 6164376987427609878u, 1481798532234586955u, 3142253189322229376u, 10855962452864321521u, 12223826156538735162u, 16771372852738792551u, 15543052108730888620u,
39715
    15352572110731665850u, 16862791698018765937u, 12328753974855219756u, 10669987536837040103u, 2963597064469173910u, 1597421751597874013u, 6284506378644458752u, 7511137813735006411u,
39716
    13801544397233820007u, 9260261528098962604u, 13951919735851666161u, 18344511890033026874u, 4874982405016790603u, 8983709158270585728u, 4445237816650825181u, 196831773885239318u,
39717
    4091022007653359089u, 562346998784700474u, 5103132815620245095u, 8780357948041161644u, 14189083196432476893u, 18150173592266475286u, 13474345022262784331u, 9652793049543924864u,
39718
    5927194128938347820u, 7875246409875505383u, 3194843503195748026u, 1395478681687169905u, 12569012757288917504u, 10477056948030502859u, 15022275627470012822u, 17253916197967211613u,
39719
    17134349580696108107u, 15186860751721288064u, 10655150290339489757u, 12453952663903504918u, 1289987737384422247u, 3381381201708377772u, 8066289525279445233u, 5835212509754572090u,
39720
    9749964810033581206u, 13278076374523191645u, 17967418316541171456u, 14290755639648123595u, 8890475633301650362u, 4929947589851190897u, 393663547770478636u, 4214651972966108647u,
39721
    8182044015306718178u, 5658655167774316073u, 1124693997569400948u, 3499391957275839935u, 10206265631240490190u, 12873559114121502981u, 17560715896082323288u, 14753743294414502547u,
39722
    1948880861322201919u, 2594127930539943668u, 7285718382500778153u, 6491924633276939618u, 16655531858934856723u, 15577868310755742168u, 11039333611388512133u, 11977453108914408014u,
39723
    11854388257876695640u, 11207451878732806035u, 15750492819751010766u, 16545974958769302533u, 6389687006391496052u, 7469038772501250239u, 2790957363374339810u, 1851148384058628905u,
39724
    14845159798643632773u, 17370237963685480270u, 12687582131971748115u, 10311195790054169816u, 3615017233668480425u, 946035540305899618u, 5493509258033841727u, 8302171348940565492u,
39725
    5281120895271462419u, 8521283507583323096u, 3989500891288354181u, 600787064567550030u, 13071075951463747903u, 9974957613568212212u, 14659789384177486505u, 17616368207971182434u,
39726
    2579975474768844494u, 2073357103652371205u, 6762762403416755544u, 7120694423275413651u, 16132579050558890466u, 16206641305794825257u, 11670425019509144180u, 11456679111066785727u,
39727
    11260412520859862953u, 11767594448091671138u, 16308316081471249471u, 15949821717821010420u, 6947506857025941637u, 6872882154850049358u, 2196985003345963795u, 2411294364755134168u,
39728
    17780951266603300724u, 14540225107906894527u, 9859895179702381794u, 13249171359945539881u, 787327095540957272u, 3884007889973030291u, 8429303945932217294u, 5472161678768272901u,
39729
    16364088030613436356u, 15858029804260760079u, 11317310335548632146u, 11674676600264311193u, 2249387995138801896u, 2322888996435045667u, 6998783914551679870u, 6785602652076537525u,
39730
    9916730820443375385u, 13156333278251739858u, 17836661041797717135u, 14448512960480194884u, 8480501340405739573u, 5384944246861192702u, 839650424281590691u, 3795664592519366248u,
39731
    3897761722644403838u, 656471011406904245u, 5188255861079887336u, 8578093388688728099u, 14571436765001556306u, 17668683201823263897u, 12983849266553879236u, 10026146741872662287u,
39732
    6669836397870376611u, 7177582867921406824u, 2488175334770097461u, 2129119614032302334u, 11583119667977343375u, 11507929313807383620u, 16044147764761037337u, 16259017374083049426u,
39733
    15843330937415051829u, 16489139217633298430u, 11946100509993103779u, 11151742071862860904u, 2878174689517968665u, 1799951022334374098u, 6478030266801178255u, 7416715545229372228u,
39734
    12779374012782992104u, 10255423946675697443u, 14938077545002500478u, 17313340186040954037u, 5581914726748679620u, 8249768321177223183u, 3702296768117257810u, 894758378090191769u,
39735
    1067805515879173007u, 3592318064290702916u, 8126281399163064345u, 5750455340522077650u, 17509465798031703203u, 14841048614271029608u, 10153889598922762037u, 12961990299524614910u,
39736
    7230034467336960850u, 6583663697231173273u, 1892071080611799236u, 2686992928761285903u, 10987018516067683454u, 12065805765134311861u, 16604342697881130984u, 15665095101429070371u,
39737
    10562241790542924838u, 12510858718452294125u, 17042567015166646192u, 15242640940723501691u, 7979001782576708362u, 5886480219318720193u, 1201574129135100060u, 3433774845539634519u,
39738
    17875696825445760251u, 14346457162030502192u, 9657117384671061869u, 13334903762452155046u, 305328503063841751u, 4266984645440464412u, 8803266454141587521u, 4981154328058445194u,
39739
    5159950949537688988u, 8687502257518297175u, 4146714207304742410u, 470617173809470401u, 13525524806833511088u, 9565558111887030139u, 14241388846550827302u, 18061812720343526637u,
39740
    3250597773715660097u, 1303669193657626762u, 5984074333724313303u, 7782311056298339100u, 15074661043719826029u, 17165493152098584486u, 12620272307991097851u, 10389759836427934768u,
39741
    12273052416502600151u, 10761709128327461916u, 15295744618112993857u, 16955639155056813962u, 6232173811933554427u, 7599472825692375856u, 2912390363305901421u, 1684630829289181350u,
39742
    13895013714051883274u, 18437420284065877185u, 13745764309700098716u, 9352044056584181591u, 4393970006691927590u, 284119552558480365u, 4822588729510268336u, 9072122871209877627u,
39743
    9177754244107333741u, 4635909983525117350u, 92935459340889083u, 4486092121981797936u, 9471751652205676353u, 13581038687731985034u, 18259186513699183831u, 14010214853299335452u,
39744
    1574654191081914544u, 3085435160094502267u, 7768015779946060582u, 6108684823746459373u, 16858607891864434588u, 15491872287116188247u, 10944323357536545802u, 12171520400656925121u,
39745
  }, {
39746
    0u, 2156813408461955548u, 4313626816923911096u, 2752718492472304228u, 8627253633847822192u, 7661928252530632364u, 5505436984944608456u, 5875429064940414228u,
39747
    17254507267695644384u, 17481523150583344956u, 15323856505061264728u, 14503785508944014468u, 11010873969889216912u, 9592933115173218380u, 11750858129880828456u, 13762408288327199732u,
39748
    5489899806547772229u, 5899293950881604249u, 8641596751236382973u, 7639112309309301025u, 4290280838231655477u, 2766522915734824425u, 24548853041579917u, 2141951263632483921u,
39749
    11764625126767791525u, 13739024951972572281u, 10995904098661322269u, 9617374173086412737u, 15347829100153899733u, 14488356108428585737u, 17231728733602892141u, 17495903608387299505u,
39750
    10979799613095544458u, 9623805157521532758u, 11798587901763208498u, 13714458609834648814u, 17283193502472765946u, 17452775347443867686u, 15278224618618602050u, 14549338234851124126u,
39751
    8580561676463310954u, 7708699370463537590u, 5533045831469648850u, 5847881786764880398u, 49097706083159834u, 2107935609010204358u, 4283902527264967842u, 2782645096555375998u,
39752
    15298762408106657231u, 14537220494637179923u, 17261466032775972471u, 17465946411177207723u, 11811312492909331135u, 13692276008895521635u, 10968273481005252871u, 9644925621600215259u,
39753
    4261616546501692207u, 2795266376586341107u, 70185227798988951u, 2096376465831291211u, 5520961050865536095u, 5868452604588535171u, 8593836137267777511u, 7687075229128879675u,
39754
    11680230827506930577u, 13832259058284016205u, 11080421551794245673u, 9523735455073038837u, 15394057194608301281u, 14432953972299937085u, 17185658977434064729u, 17550865948466574981u,
39755
    5579070418531851633u, 5801301123735731373u, 8552830750928559817u, 7736981982542757653u, 4239857041646656001u, 2826138345940532189u, 75412445699561913u, 2082177495183685733u,
39756
    17161123352926621908u, 17565732457015587080u, 15417398740927075180u, 14419136389292487344u, 11066091662939297700u, 9546555762013386360u, 11695763573529760796u, 13808381012597372352u,
39757
    98195412166319668u, 2067810197125185512u, 4215871218020408716u, 2841563382736944208u, 8567805054529935684u, 7712554084374493336u, 5565290193110751996u, 5824680096370817824u,
39758
    4213277561403610395u, 2852497928146826439u, 118647349622822563u, 2038740285422565247u, 5603244184571253355u, 5777048188553278391u, 8511711324634206675u, 7778039831901335567u,
39759
    15351860113773370363u, 14475212630091872807u, 17208772955998935107u, 17527831139023518111u, 11724816064851319947u, 13787876126790335831u, 11055209722282565427u, 9549167182608629487u,
39760
    8523233093003384414u, 7756906139291137922u, 5590532753172682214u, 5799235221864313914u, 140370455597977902u, 2025555993157185778u, 4192752931662582422u, 2864620100732154698u,
39761
    11041922101731072190u, 9570786891571902818u, 11736905209177070342u, 13767318537498720986u, 17187672274535555022u, 17539385849830522386u, 15374150458257759350u, 14462604578592423338u,
39762
    15486092620961298855u, 14629711868178897019u, 17092483903335922207u, 17355247692313779139u, 11624791503456485079u, 13600030943165030155u, 11137009302703308143u, 9754815117126884531u,
39763
    4151744643171039047u, 2626583331457439387u, 162377516962444543u, 2282879863086044451u, 5631712546292871223u, 6037452326221451755u, 8501327171535303567u, 7499692239708246611u,
39764
    11158140837063703266u, 9743299917872012094u, 11602602247471462746u, 13612749016692676742u, 17105661501857119634u, 17333526894853233742u, 15473963965085515306u, 14650238604571402230u,
39765
    8479714083293312002u, 7512977616177960414u, 5652276691881064378u, 6025361010828170854u, 150824891399123826u, 2303974039851176622u, 4164354990367371466u, 2604286280411140374u,
39766
    5659250822143950637u, 6009834889821986545u, 8454565055791594645u, 7546392787102457161u, 4121809449076176989u, 2656298618920900993u, 211263906290727909u, 2233791159333640761u,
39767
    11672732454520566221u, 13552292306546298897u, 11106145987650286197u, 9785898338790069161u, 15440531030182573757u, 14675335027319969633u, 17121240571213837573u, 17326570184971408601u,
39768
    196390824332639336u, 2258328937796115892u, 4135620394250371024u, 2632959299571932684u, 8431742436040817432u, 7560729365405768388u, 5683126765473888416u, 5994308631384381820u,
39769
    17135610109059871368u, 17303780593489122132u, 15425108168748986672u, 14699314298944934124u, 11130580386221503992u, 9770921945649714212u, 11649360192741635648u, 13566070240564762524u,
39770
    8426555122807220790u, 7574959341548112874u, 5704995856293652878u, 5963537623700588626u, 237294699245645126u, 2208312048661695642u, 4077480570845130494u, 2700071425513574178u,
39771
    11206488369142506710u, 9686112028953249034u, 11554096377106556782u, 13670376701660284594u, 17023422649268413350u, 17424940338905547386u, 15556079663802671134u, 14559229772221530562u,
39772
    4089596066908350835u, 2679540256679954607u, 224121464376355531u, 2230046074588744471u, 5727171952466636291u, 5950815117732351967u, 8405427952099257787u, 7586487769270013031u,
39773
    15543464952953907091u, 14581513594800801359u, 17034988434643772459u, 17403850594581005815u, 11533527867866456291u, 13682454788587061567u, 11228114617197060955u, 9672831084924650119u,
39774
    17046466186006768828u, 17401835225210195296u, 15513812278582275844u, 14601417988320120536u, 11181065506345364428u, 9711332585899690512u, 11598470443728627828u, 13625782737014311336u,
39775
    280740911195955804u, 2165085734748128128u, 4051111986314371556u, 2726642315882184760u, 8385505863325164844u, 7616087770173211888u, 5729240201464309396u, 5939354855465699144u,
39776
    11574598932837183481u, 13641322155266051621u, 11203874897631210561u, 9696991643941850525u, 15500005765847099529u, 14624770467483748693u, 17061326039500450609u, 17377293083093715693u,
39777
    5752625691707646233u, 5925581285101240517u, 8361067032314929825u, 7631051003498906493u, 4066548076212889193u, 2702667407911749557u, 266366940911429073u, 2187862166416278541u,
39778
  }, {
39779
    0u, 6642096280510406750u, 13284192561020813500u, 16462795876764246242u, 16315823105410768893u, 13708963636559134627u, 6500836570635362113u, 439922346977066783u,
39780
    6197597939812213119u, 733872460607717665u, 17174658310779658691u, 12859417258165748125u, 13001673141270724226u, 16736026809386770140u, 879844693954133566u, 5771540452186644064u,
39781
    12395195879624426238u, 17305613297699152544u, 1467744921215435330u, 5220531075568771612u, 5650300446275329283u, 1316336633116425565u, 17740532779662220735u, 12258375912742239713u,
39782
    18016332033719362433u, 11973850846087693279u, 4781749989466252093u, 2193612730179060579u, 1759689387908267132u, 4919860766213921826u, 11543080904373288128u, 18166453874549300382u,
39783
    14614610554166352761u, 10879836598703668007u, 8253805222095936453u, 3361408799105547163u, 2935489842430870660u, 8399638907315561690u, 10441062151137543224u, 14757009366268798054u,
39784
    11300600892550658566u, 13906759146888600152u, 2632673266232851130u, 8693166652788693732u, 9132946036408395259u, 2491556468171146661u, 14331668736193815879u, 11153489555886392601u,
39785
    7409848711186274695u, 4249257595424012761u, 16037314857127418171u, 9413239572791867749u, 9563499978932504186u, 15606406401646028324u, 4387225460358121158u, 6976068332272625304u,
39786
    3519378775816534264u, 7852640824571713702u, 9839721532427843652u, 15321459211647031322u, 15184496315767285509u, 10274783960564057947u, 7701371084599273401u, 3949009615571978215u,
39787
    539203352115488887u, 6581683165424715817u, 13772373076031531211u, 16360516657443457173u, 16507610444191872906u, 13347445937900984276u, 6722817598211094326u, 99441604310980456u,
39788
    5870979684861741320u, 960568039155968342u, 16799277814631123380u, 13046489736199563754u, 12904108438562707189u, 17238069777753355947u, 814716683761407561u, 6296880972452001303u,
39789
    12357655745765665417u, 17821378201246059223u, 1379747099228580405u, 5694995023857257067u, 5265346532465702260u, 1530999186474390826u, 17386333305577387464u, 12494636173022434710u,
39790
    18265892072816790518u, 11623803214076996520u, 4983112936342293322u, 1804507146630605588u, 2238305212630619147u, 4845162757404030037u, 12054694172541097143u, 18115614168568345833u,
39791
    14819697422372549390u, 10486441695742104400u, 8498515190848025522u, 3016776137306395628u, 3442815973027425523u, 8352525304506551469u, 10925090729870978127u, 14677459070913039377u,
39792
    11216336045685248625u, 14376925237369287215u, 2590274523633996493u, 9214355580338500243u, 8774450920716242316u, 2731551919773330898u, 13952136664545250608u, 11363291318662491502u,
39793
    7038757551633068528u, 4432606169309893038u, 15705281649143427404u, 9644785238863483154u, 9494645848386137613u, 16136034042300943955u, 4294513027018469041u, 7472698529450626799u,
39794
    4011857131457007759u, 7746628612951437521u, 10373500843358195763u, 15265904688119197805u, 15402742169198546802u, 9938598876682809132u, 7898019231143956430u, 3582070091934478224u,
39795
    1078406704230977774u, 5970139571501035696u, 13163366330849431634u, 16897748309796073484u, 17049000381336047379u, 12733717820530814797u, 6107119981172920239u, 643361792051163121u,
39796
    6410046491609887121u, 349161128571523535u, 16190407203032477997u, 13583585392940618099u, 13445635196422188652u, 16624205252526067250u, 198883208621960912u, 6840937431151644302u,
39797
    11741959369723482640u, 18365299631022420558u, 1921136078311936684u, 5081265949533565682u, 4656338829252136429u, 2068229881835728307u, 17925537898651110737u, 11883093821164285199u,
39798
    17650059563187254127u, 12167860639460954929u, 5524638460789093331u, 1190641388963713933u, 1629433367522815122u, 5382257181810330828u, 12593761944904002606u, 17504208224571739248u,
39799
    14134199920450915223u, 10956049054195313609u, 8970094247992396587u, 2328741787718953845u, 2759494198457160810u, 8819954874021999668u, 11389990047714514134u, 13996106797082358920u,
39800
    10530693064931404520u, 14846677937748691638u, 3061998372948781652u, 8526176301674629642u, 8091274350704555285u, 3198835872954668363u, 14416890915810522537u, 10682083699634542071u,
39801
    7503655637611612521u, 3751252662574033207u, 15021960841764981205u, 10112215774463453579u, 9966225872684586644u, 15448000658827392714u, 3609014293261211176u, 7942304654960916086u,
39802
    4476610425261238294u, 7065420035288041544u, 9690325514808060074u, 15733189881789008116u, 15874467260079749099u, 9250420838410950581u, 7212375292832610135u, 4051821833783301897u,
39803
    688179623118076057u, 6170372224719608007u, 12814440204992854053u, 17148438651140642939u, 16997030381696051044u, 13244209591132604218u, 6033552274612791256u, 1123099122930255750u,
39804
    6885631946054851046u, 262293608834169272u, 16705050609013102938u, 13544914965422553348u, 13683025758949262875u, 16271127284595091013u, 412415468322195111u, 6454862019777308409u,
39805
    11927910341603441255u, 17988788832627006009u, 2148953154424896219u, 4755777988240824965u, 5180549047267992986u, 2001980365486523844u, 18428711160677000486u, 11786650616022549880u,
39806
    17548901841432484632u, 12657171448130714438u, 5463103839546661796u, 1728714438829439994u, 1290082918514197733u, 5605359706950509755u, 12231113943998710873u, 17694874057198724103u,
39807
    14077515103266137056u, 11488706867561743294u, 8865212338619786076u, 2822341649514070786u, 2391433177253116957u, 9015472726907116611u, 11054926469989481633u, 14215482952762858751u,
39808
    10763369033251996319u, 14515766235920655041u, 3244216653174833699u, 8153963644554617469u, 8589026054036938082u, 3107253741862419772u, 14945397058901253598u, 10612099275430968704u,
39809
    8023714262914015518u, 3707732413820797248u, 15493257225902875042u, 10029072425162228220u, 10174906129304731363u, 15067338284929851069u, 3850131242430201439u, 7584939832928591361u,
39810
    4133108057121652833u, 7311251501606674495u, 9295800309597257949u, 15937155243838988419u, 15796038462287912860u, 9735579710801330114u, 7164140183868956448u, 4558017662132191102u,
39811
  }, {
39812
    0u, 7026975924517234630u, 14053951849034469260u, 11713158812725061706u, 1498566550037692829u, 8453026741656872539u, 15547077823203331601u, 13134332388348864983u,
39813
    2997133100075385658u, 5193532126013515004u, 16906053483313745078u, 10023477084983765872u, 4421425403924087463u, 6690338751863514465u, 18326734871926164779u, 11516110084014746349u,
39814
    5994266200150771316u, 3651077923391955378u, 10387064252027030008u, 17411644826573123134u, 5180286430728521705u, 2765428220391841839u, 9578516152858789989u, 16530863678517358499u,
39815
    8842850807848174926u, 1962664170658947720u, 13380677503727028930u, 15579466327313067268u, 7958959654645957843u, 1150444288916906773u, 12500388506175163231u, 14771411239789669529u,
39816
    11988532400301542632u, 14401112944851970862u, 7302155846783910756u, 347530691846251682u, 12867955000885349749u, 15208934917731379891u, 8186843028093092601u, 1160054057126929727u,
39817
    10360572861457043410u, 17171366937719040020u, 5530856440783683678u, 3262112454209283992u, 11170013709381963343u, 18052407625221859721u, 6344013830343901635u, 4147432248901248517u,
39818
    17685701615696349852u, 10733466276663946586u, 3925328341317895440u, 6340298665266291414u, 16265807495604570881u, 9241127928571882695u, 2500178400086410381u, 4843267757373072203u,
39819
    15917919309291915686u, 13646779991004769888u, 2300888577833813546u, 9109287431904666092u, 14423962049646856251u, 12225267820500938749u, 803223682168014775u, 7683504840782913649u,
39820
    16025789128531904341u, 13827140552201887891u, 2120809441137969369u, 9001136188144267039u, 14604311693567821512u, 12333148557000565006u, 695061383692503364u, 7503436758785666690u,
39821
    17866059964468495471u, 10841338299774886825u, 3817174930229677027u, 6160221704524114981u, 16373686056186185202u, 9421479739856314932u, 2320108114253859454u, 4735107671358188984u,
39822
    10180636633891078433u, 17063072784830850791u, 5638869205660782253u, 3442330069771397483u, 11061712881567367356u, 17872478072565786490u, 6524224908418567984u, 4255451551249279222u,
39823
    11880240423364919835u, 14221174549956093405u, 7482375666214882711u, 455541244296276561u, 12688027660687803270u, 15100631886079386688u, 8294864497802497034u, 1340262959281482700u,
39824
    8662912472460168125u, 1854372134182743163u, 13488687978245964849u, 15759686224643400695u, 7850656682635790880u, 970516889046347238u, 12680597330532582828u, 14879432787265004138u,
39825
    5885971969496909959u, 3471141773623390017u, 10567281927262422795u, 17519657531808653517u, 5000356800172820762u, 2657127470508076764u, 9686535514746144406u, 16711074697083887952u,
39826
    3105005063510429129u, 5373890534425651727u, 16725976600334615109u, 9915323596096578947u, 4601777155667627092u, 6798217371950640018u, 18218574863809332184u, 11336039720248747038u,
39827
    180360639130832627u, 7134845665859430709u, 13945800545768817023u, 11533079735570376377u, 1606447364336029550u, 8633376307814525096u, 15367009681565827298u, 13026170149548992292u,
39828
    3321048140255203375u, 5733767250183223273u, 17086394267351834531u, 10131907641284540517u, 4241618882275938738u, 6582455852881933940u, 18002272376288534078u, 10975340495589554680u,
39829
    540800415553098517u, 7351451582082282707u, 14161821513074465945u, 11892934580260027231u, 1390122767385006728u, 8272655212095272270u, 15006873517571333380u, 12810430501506267842u,
39830
    9023334491325470299u, 2070960623556915613u, 13704726720259086807u, 16119558478964112913u, 7634349860459354054u, 609813203025260544u, 12320443409048229962u, 14663675712440713100u,
39831
    6101997361665611105u, 3831000989484282535u, 10927717295939115757u, 17736259059608567083u, 4640216228507718908u, 2441383434118427450u, 9470215342716377968u, 16350357972595129526u,
39832
    9820495924665654471u, 16847328885758262017u, 5422549171225416523u, 3081613207998608525u, 11277738411321564506u, 18232337151134792348u, 6884660139542794966u, 4472053216375158032u,
39833
    11663933463862517757u, 13860471001487472699u, 7122221882022416497u, 239784031886489527u, 13048449816837135968u, 15317220237859158438u, 8510903102498558444u, 1700135351162517034u,
39834
    15809464669166377651u, 13466419319190748533u, 1760673139591009599u, 8785396677427507961u, 14964751332429765422u, 12549754610540477672u, 911082488592553122u, 7863291466191287140u,
39835
    17505901828360837513u, 10625576643111779919u, 3600872305391818245u, 5799522617425244611u, 16589728995604994068u, 9781356593166352338u, 2680525918562965400u, 4951691578960654430u,
39836
    17325824944920336250u, 10517423154702741692u, 3708744268365486326u, 5979881026315534128u, 16481568986909349607u, 9601286230029496609u, 2860877669727689067u, 5059570199676927661u,
39837
    15701313365271581760u, 13286340242614875014u, 1941033778092694476u, 8893266419348519946u, 14784683190314112477u, 12441592372201976347u, 1018963302412737105u, 8043641032810315159u,
39838
    11771943938993819918u, 14040690898222216904u, 6942283547246780034u, 131491994814691652u, 13228658641689481363u, 15425241784889898837u, 8402600130983321375u, 1520207950847359193u,
39839
    10000713600345641524u, 16955341590498866674u, 5314254941016153528u, 2901677057735113342u, 11385757773804508073u, 18412548169088955503u, 6704730509582687269u, 4363752465879022563u,
39840
    6210010127020858258u, 4011218604585024596u, 10747781068851303454u, 17627964906259002328u, 4820427307211528719u, 2549402735887646153u, 9361914515530929539u, 16170428419360240197u,
39841
    9203554311335254184u, 2178971175377796974u, 13596434743901280036u, 15939620083439087842u, 7742371330630129973u, 790022104701665011u, 12140516069312059065u, 14555372680310567295u,
39842
    360721278261665254u, 7243300338934250016u, 14269691331718861418u, 12073295142069515692u, 1281960468464901243u, 8092587130592951229u, 15187223161047700471u, 12918311238500824113u,
39843
    3212894728672059100u, 5553690289885640986u, 17266752615629050192u, 10239779664840078998u, 4061548595831021377u, 6474295767462639751u, 18110150936257777869u, 11155692307469580043u,
39844
  }, {
39845
    0u, 2517245393515406572u, 5034490787030813144u, 7435750759411199284u, 10068981574061626288u, 12201157653998401372u, 14871501518822398568u, 17045318164640841348u,
39846
    9628913577918544357u, 12056075433989135625u, 13870769438669140029u, 16326061061730899153u, 1016952077871524437u, 3239211695253081785u, 5459183210385793933u, 7578968205522831201u,
39847
    11067918171351838031u, 13508029996328618403u, 15872723984458359959u, 18349972777811820667u, 1307470557354262271u, 3515654148887976467u, 6339673239971903271u, 8436375012170683339u,
39848
    2033904155743048874u, 4528066323082129478u, 6478423390506163570u, 8865607338129291678u, 10918366420771587866u, 13072499669943034870u, 15157936411045662402u, 17344703028974807598u,
39849
    11667391723826758683u, 9441211325989495031u, 16444045520167767491u, 14329311757255665967u, 3050858413050517419u, 628778578755597127u, 8036894684654706291u, 5577642697640442527u,
39850
    2614941114708524542u, 478839856218937618u, 7031308297775952934u, 4862538486186004682u, 12679346479943806542u, 10167187506301176482u, 16872750024341366678u, 14467534086004917114u,
39851
    4067808311486097748u, 1917635425212288440u, 9056132646164258956u, 6864284009665987680u, 12956846781012327140u, 10457633378212404744u, 17731214676258583356u, 15347951510183778256u,
39852
    13678285260964991153u, 11474057634298917981u, 17873974704293108073u, 15772186515461651845u, 3922409453435093761u, 1477250791027468269u, 8336488571297909465u, 5863164957556321845u,
39853
    15063804914172139187u, 17573731408537121375u, 10724047561790938987u, 13131499433903012743u, 6535100908406441219u, 8673469987586793967u, 2265113888856263899u, 4431612735036172343u,
39854
    6101716826101034838u, 8521560882533092282u, 1257557157511194254u, 3719041779816530530u, 16073789369309412582u, 18302240886422657034u, 11155285395280885054u, 13267751491267498450u,
39855
    5229882229417049084u, 7672809353916620560u, 957679712437875236u, 3433240205686757064u, 14062616595551905868u, 16269110787469675680u, 9725076972372009364u, 11824592944582215032u,
39856
    14786588404820918809u, 17283564772171425525u, 9865866699426761665u, 12251361247433944877u, 5082513026899726761u, 7234957975966594373u, 240568853608110193u, 2430150771060047005u,
39857
    8135616622972195496u, 5911125624750880324u, 3835270850424576880u, 1717722887501053852u, 18112265292328517912u, 15687370158510810612u, 13728568019331975360u, 11271004332422294572u,
39858
    17674167644946721613u, 15539754686561718177u, 12725302718847165077u, 10553717607734429305u, 9150035367232403709u, 6635062193578351633u, 4261933579054297381u, 1858407040333796809u,
39859
    16825062113507622887u, 14668696227990231819u, 12439147139764057663u, 10254616302904316627u, 7116415003206659159u, 4624520499557157051u, 2818284765131990415u, 428829699325493603u,
39860
    7844818906870187522u, 5634399380472423150u, 2954501582054936538u, 860032292373900086u, 16672977142595818930u, 14235136279826723166u, 11726329915112643690u, 9246813302127474822u,
39861
    3513487962258617315u, 1309817375275636495u, 8438743075148003899u, 6337546835477044951u, 13510341259434958931u, 11065716548023207103u, 18347741267953084811u, 15874986514718330215u,
39862
    13070201816812882438u, 10920562880461237994u, 17346939975173587934u, 15155660198108440370u, 4530227777712527798u, 2031571415669472602u, 8863225470072344686u, 6480554254231811202u,
39863
    12203433652202069676u, 10066744842596399680u, 17043121765066184564u, 14873799311837557656u, 2515114315022388508u, 2382082824317424u, 7438083559633061060u, 5032329272252129320u,
39864
    3241337884980569929u, 1014584229661574053u, 7576621447749742225u, 5461349336866867837u, 12053812688995611897u, 9631145302510833685u, 16328262745174523169u, 13868458115447806413u,
39865
    10459764458834098168u, 12954464700354433812u, 15345618707833241120u, 17733376188870843084u, 1915359424875750472u, 4070045040789094564u, 6866480411373514128u, 9053834855311329660u,
39866
    1479513538183220765u, 3920177730975673073u, 5860963271950469061u, 8338799892386374441u, 11471931442405006765u, 13680653107046267201u, 15774533275401163893u, 17871808579940708505u,
39867
    626467317811485367u, 3053060038512016987u, 5579874205336949615u, 8034632152261867395u, 9443377510452431111u, 11665044903776710123u, 14326943696444768479u, 16446171926791300147u,
39868
    10165026053799453522u, 12681679222183806910u, 14469915951933188746u, 16870619158449294950u, 481137707216220386u, 2612744652856644622u, 4860301542120094010u, 7033584512875404758u,
39869
    16271233245944390992u, 14060243759811248572u, 11822251249501760648u, 9727246909562751076u, 7670541700849153760u, 5232109988680716812u, 3435445775002107704u, 955373222128557012u,
39870
    7237229143405862069u, 5080272407415421017u, 2427958334666397037u, 242871556844564865u, 17281429885116092165u, 14788965422804986857u, 12253699033039161053u, 9863708918048465457u,
39871
    8671167069616523295u, 6537293559533907187u, 4433853414635209159u, 2262842661302265131u, 17575888975148309423u, 15061467343334031171u, 13129122476067492471u, 10726182388697724571u,
39872
    18300070734464807418u, 16076131279156974870u, 13270124387156703266u, 11153162876657622222u, 8523867158108594762u, 6099511471519499942u, 3716814080667593618u, 1259824750463930238u,
39873
    4622362935074513227u, 7118752576211060135u, 431206655032469651u, 2816149936058911871u, 14670999143827763963u, 16822869460218058263u, 10252375625438018339u, 12441418369480155087u,
39874
    14232830006413318318u, 16675182499310091330u, 9249040999114314102u, 11724062320027170202u, 5636569530263980830u, 7842476994894082034u, 857659398650987206u, 2956624102806742570u,
39875
    15689637813740375044u, 18110037535197587688u, 11268798760944846300u, 13730874507508556080u, 5909003164109873076u, 8137989456584309592u, 1720064584747800172u, 3833100915362378368u,
39876
    6637197082762229217u, 9147658351414628621u, 1856069252600036409u, 4264091358266300629u, 15537483516989711953u, 17676408262268928701u, 10555910046260817801u, 12723000017772809061u,
39877
  }, {
39878
    0u, 15762200328042667840u, 2856835172924432389u, 18238190752146915141u, 5713670345848864778u, 10805715811487326026u, 7561135427655163919u, 12848797446532677455u,
39879
    11427340691697729556u, 4911321075843194708u, 13345174655120580625u, 7173389830452510545u, 15122270855310327838u, 820654137405644638u, 17760118084036943899u, 3226275954771115867u,
39880
    12678913378224905901u, 8451595299172663789u, 9822642151686389416u, 5976168202979041768u, 16194808345499688615u, 4179641502022828519u, 14346779660905021090u, 2135996745225445858u,
39881
    3558579666237890233u, 16995468946051088889u, 1641308274811289276u, 14733962144962732540u, 9090961916423626419u, 11859948271085519347u, 6452551909542231734u, 9453764156601606646u,
39882
    14785799433083167711u, 1697614691135618207u, 16903190598345327578u, 3470771065211313306u, 9402037001392841685u, 6396285171454065813u, 11952336405958083536u, 9178809987380452496u,
39883
    6027971268800324555u, 9878982515431963787u, 8359283004045657038u, 12591138999497481358u, 2084233168694272961u, 14290549069261356161u, 4271993490450891716u, 16282692837778922628u,
39884
    7117159332475780466u, 13293411258189767218u, 4999205320339463543u, 11519692655715205687u, 3282616549622578552u, 17811921192019632696u, 732879648334208381u, 15029958398333780541u,
39885
    18181923832847252838u, 2805107922438644262u, 15850048426093911395u, 92388385340408355u, 12905103819084463468u, 7612972483059622444u, 10717907374994120041u, 5621392111171994153u,
39886
    629311348378851643u, 15133597752622646907u, 3395229382271236414u, 17699378041462564478u, 5183867188229904689u, 11335100742646646385u, 6941542130422626612u, 13469099241846138484u,
39887
    10821536956051937583u, 5517832210058282607u, 12792570342908131626u, 7725577015716947562u, 15665448522205731109u, 277059068684322405u, 18357619974760904992u, 2629481737494357600u,
39888
    12055942537600649110u, 9075274912216783062u, 9289461107078326163u, 6508930745710590163u, 16718566008091314076u, 3655465612432595164u, 14961454118931310489u, 1522030784741112025u,
39889
    4168466337388545922u, 16386289672930760898u, 2196870928291817351u, 14177982363995224263u, 8543986980901783432u, 12406505804242475208u, 5852377756745475981u, 10054645982306597069u,
39890
    14234318664951560932u, 2248669261341992356u, 16298510681658284769u, 4076149859246245281u, 9998410640678927086u, 5800610134637962670u, 12494386096293518059u, 8636334373997692331u,
39891
    6565233099245157104u, 9341293662428177840u, 8987461698644630261u, 11963660006880118197u, 1465759296668416762u, 14909722918146729402u, 3743309483160705791u, 16810949547632248255u,
39892
    7673845564465570889u, 12736298827739970313u, 5610215844877288524u, 10909381007990496012u, 2681314179816367171u, 18413922163761052419u, 184776770680816710u, 15577635352405072646u,
39893
    17647610443766686813u, 3338994288425483037u, 15225944966119244888u, 717191546761911064u, 13520897736746902615u, 6997878541721926423u, 11242784222343988306u, 5096087965850491666u,
39894
    1258622696757703286u, 14684288965200833846u, 3950222953022231155u, 17036158029906267443u, 6790458764542472828u, 9548224856613104956u, 8762045755503235705u, 11756540858562383161u,
39895
    10367734376459809378u, 6151638724996853026u, 12124837022850257511u, 8285082520580115751u, 13883084260845253224u, 1879138195689975080u, 16649556998353834605u, 4445490780332133677u,
39896
    13727827248377474267u, 7223104792207356827u, 11035664420116565214u, 4870673773980832670u, 17422178244240010449u, 3131857036752565137u, 15451154031433895124u, 924103331921597332u,
39897
    2311784730144877775u, 18062687245331231631u, 554118137368644810u, 15928680121837474698u, 8024872609708797125u, 13105623011270275973u, 5258963474988715200u, 10539833548380279680u,
39898
    15872427342139003305u, 502333042764009193u, 18150549824433566124u, 2404114375865757420u, 10596187595637903779u, 5310779519913856739u, 13017861491421180326u, 7932573568563556070u,
39899
    4814384572959953341u, 10983915471956430589u, 7310931224865190328u, 13820193315420761848u, 980423156880069047u, 15503004023780282103u, 3044061569482224050u, 17329913425393921778u,
39900
    8336932674777091844u, 12181156958151692356u, 6059373863990406913u, 10279938678082531393u, 4393741856583634702u, 16593268045114871886u, 1971504083133951755u, 13970910599835103307u,
39901
    17087973961803566864u, 4006576835745435728u, 14591990156772618005u, 1170861220680101973u, 11704755513490951962u, 8705792948709298266u, 9640554597612056351u, 6878321524855255135u,
39902
    1858937689852799821u, 14083548048513152013u, 4497338522683984712u, 16489741062169236488u, 6235036951360285511u, 10104345546597921799u, 8152299718492490562u, 12365860697102636034u,
39903
    9753200483853429593u, 6765745319621112857u, 11601220269275925340u, 8809399250468705308u, 14416405870873226067u, 1346516287098352659u, 17272668747995384662u, 3821952007586370582u,
39904
    13130466198490314208u, 7820039919040899744u, 10492627387899532773u, 5414409408661555877u, 17974923397289260522u, 2579810761044912810u, 16057098401758057967u, 317732763665910447u,
39905
    2931518593336833524u, 17442526084696124084u, 1084062204544407025u, 15399436031514938033u, 7486618966321411582u, 13644576356632980158u, 4629793036166665723u, 11168576964637084347u,
39906
    15347691128931141778u, 1027777753507534802u, 17534896747071563927u, 3019349226222860247u, 11220431689754577048u, 4686116923914377176u, 13552315720802183325u, 7398828111596124125u,
39907
    5362628359632734342u, 10436379358185592774u, 7912374160093407363u, 13218332977821366211u, 369553541361633420u, 16113456511805446092u, 2487515902914439305u, 17887166489985742793u,
39908
    8865757316743550527u, 11653040814255671679u, 6677988576850966074u, 9660905738751846778u, 3765703796660934197u, 17220887603689539957u, 1434383093523822128u, 14508740362393577840u,
39909
    16546065181022836267u, 4549193289962883435u, 13995757083443852846u, 1766676892172462446u, 12309576339732698657u, 8100554995509053793u, 10192175931700983332u, 6327407589325138276u,
39910
  },
39911
};
39912
39913
static const uint8_t
39914
WUFFS_CRC64__ECMA_X86_SSE42_FOLD1[16] WUFFS_BASE__POTENTIALLY_UNUSED = {
39915
  228u, 58u, 57u, 202u, 151u, 212u, 93u, 224u,
39916
  64u, 95u, 135u, 199u, 175u, 149u, 190u, 218u,
39917
};
39918
39919
static const uint8_t
39920
WUFFS_CRC64__ECMA_X86_SSE42_FOLD2[16] WUFFS_BASE__POTENTIALLY_UNUSED = {
39921
  68u, 250u, 158u, 138u, 0u, 91u, 9u, 96u,
39922
  81u, 175u, 225u, 15u, 163u, 83u, 230u, 59u,
39923
};
39924
39925
static const uint8_t
39926
WUFFS_CRC64__ECMA_X86_SSE42_FOLD4[16] WUFFS_BASE__POTENTIALLY_UNUSED = {
39927
  243u, 65u, 212u, 157u, 187u, 239u, 227u, 106u,
39928
  244u, 45u, 132u, 167u, 84u, 96u, 31u, 8u,
39929
};
39930
39931
static const uint8_t
39932
WUFFS_CRC64__ECMA_X86_SSE42_FOLD8[16] WUFFS_BASE__POTENTIALLY_UNUSED = {
39933
  0u, 16u, 204u, 79u, 29u, 215u, 87u, 135u,
39934
  64u, 231u, 61u, 247u, 42u, 107u, 216u, 215u,
39935
};
39936
39937
static const uint8_t
39938
WUFFS_CRC64__ECMA_X86_SSE42_MUPX[16] WUFFS_BASE__POTENTIALLY_UNUSED = {
39939
  213u, 99u, 41u, 23u, 108u, 70u, 62u, 156u,
39940
  133u, 30u, 14u, 175u, 43u, 175u, 216u, 146u,
39941
};
39942
39943
// ---------------- Private Initializer Prototypes
39944
39945
// ---------------- Private Function Prototypes
39946
39947
WUFFS_BASE__GENERATED_C_CODE
39948
static wuffs_base__empty_struct
39949
wuffs_crc64__ecma_hasher__up(
39950
    wuffs_crc64__ecma_hasher* self,
39951
    wuffs_base__slice_u8 a_x);
39952
39953
WUFFS_BASE__GENERATED_C_CODE
39954
static wuffs_base__empty_struct
39955
wuffs_crc64__ecma_hasher__up__choosy_default(
39956
    wuffs_crc64__ecma_hasher* self,
39957
    wuffs_base__slice_u8 a_x);
39958
39959
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
39960
WUFFS_BASE__GENERATED_C_CODE
39961
static wuffs_base__empty_struct
39962
wuffs_crc64__ecma_hasher__up_x86_sse42(
39963
    wuffs_crc64__ecma_hasher* self,
39964
    wuffs_base__slice_u8 a_x);
39965
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
39966
39967
// ---------------- VTables
39968
39969
const wuffs_base__hasher_u64__func_ptrs
39970
wuffs_crc64__ecma_hasher__func_ptrs_for__wuffs_base__hasher_u64 = {
39971
  (uint64_t(*)(const void*))(&wuffs_crc64__ecma_hasher__checksum_u64),
39972
  (uint64_t(*)(const void*,
39973
      uint32_t))(&wuffs_crc64__ecma_hasher__get_quirk),
39974
  (wuffs_base__status(*)(void*,
39975
      uint32_t,
39976
      uint64_t))(&wuffs_crc64__ecma_hasher__set_quirk),
39977
  (wuffs_base__empty_struct(*)(void*,
39978
      wuffs_base__slice_u8))(&wuffs_crc64__ecma_hasher__update),
39979
  (uint64_t(*)(void*,
39980
      wuffs_base__slice_u8))(&wuffs_crc64__ecma_hasher__update_u64),
39981
};
39982
39983
// ---------------- Initializer Implementations
39984
39985
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
39986
wuffs_crc64__ecma_hasher__initialize(
39987
    wuffs_crc64__ecma_hasher* self,
39988
    size_t sizeof_star_self,
39989
    uint64_t wuffs_version,
39990
    uint32_t options){
39991
  if (!self) {
39992
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
39993
  }
39994
  if (sizeof(*self) != sizeof_star_self) {
39995
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
39996
  }
39997
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
39998
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
39999
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
40000
  }
40001
40002
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
40003
    // The whole point of this if-check is to detect an uninitialized *self.
40004
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
40005
#if !defined(__clang__) && defined(__GNUC__)
40006
#pragma GCC diagnostic push
40007
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
40008
#endif
40009
    if (self->private_impl.magic != 0) {
40010
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
40011
    }
40012
#if !defined(__clang__) && defined(__GNUC__)
40013
#pragma GCC diagnostic pop
40014
#endif
40015
  } else {
40016
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
40017
      memset(self, 0, sizeof(*self));
40018
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
40019
    } else {
40020
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
40021
    }
40022
  }
40023
40024
  self->private_impl.choosy_up = &wuffs_crc64__ecma_hasher__up__choosy_default;
40025
40026
  self->private_impl.magic = WUFFS_BASE__MAGIC;
40027
  self->private_impl.vtable_for__wuffs_base__hasher_u64.vtable_name =
40028
      wuffs_base__hasher_u64__vtable_name;
40029
  self->private_impl.vtable_for__wuffs_base__hasher_u64.function_pointers =
40030
      (const void*)(&wuffs_crc64__ecma_hasher__func_ptrs_for__wuffs_base__hasher_u64);
40031
  return wuffs_base__make_status(NULL);
40032
}
40033
40034
wuffs_crc64__ecma_hasher*
40035
wuffs_crc64__ecma_hasher__alloc(void) {
40036
  wuffs_crc64__ecma_hasher* x =
40037
      (wuffs_crc64__ecma_hasher*)(calloc(1, sizeof(wuffs_crc64__ecma_hasher)));
40038
  if (!x) {
40039
    return NULL;
40040
  }
40041
  if (wuffs_crc64__ecma_hasher__initialize(
40042
      x, sizeof(wuffs_crc64__ecma_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
40043
    free(x);
40044
    return NULL;
40045
  }
40046
  return x;
40047
}
40048
40049
size_t
40050
sizeof__wuffs_crc64__ecma_hasher(void) {
40051
  return sizeof(wuffs_crc64__ecma_hasher);
40052
}
40053
40054
// ---------------- Function Implementations
40055
40056
// -------- func crc64.ecma_hasher.get_quirk
40057
40058
WUFFS_BASE__GENERATED_C_CODE
40059
WUFFS_BASE__MAYBE_STATIC uint64_t
40060
wuffs_crc64__ecma_hasher__get_quirk(
40061
    const wuffs_crc64__ecma_hasher* self,
40062
    uint32_t a_key) {
40063
  if (!self) {
40064
    return 0;
40065
  }
40066
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
40067
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
40068
    return 0;
40069
  }
40070
40071
  return 0u;
40072
}
40073
40074
// -------- func crc64.ecma_hasher.set_quirk
40075
40076
WUFFS_BASE__GENERATED_C_CODE
40077
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
40078
wuffs_crc64__ecma_hasher__set_quirk(
40079
    wuffs_crc64__ecma_hasher* self,
40080
    uint32_t a_key,
40081
    uint64_t a_value) {
40082
  if (!self) {
40083
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
40084
  }
40085
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
40086
    return wuffs_base__make_status(
40087
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
40088
        ? wuffs_base__error__disabled_by_previous_error
40089
        : wuffs_base__error__initialize_not_called);
40090
  }
40091
40092
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
40093
}
40094
40095
// -------- func crc64.ecma_hasher.update
40096
40097
WUFFS_BASE__GENERATED_C_CODE
40098
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
40099
wuffs_crc64__ecma_hasher__update(
40100
    wuffs_crc64__ecma_hasher* self,
40101
    wuffs_base__slice_u8 a_x) {
40102
  if (!self) {
40103
    return wuffs_base__make_empty_struct();
40104
  }
40105
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
40106
    return wuffs_base__make_empty_struct();
40107
  }
40108
40109
  if (self->private_impl.f_state == 0u) {
40110
    self->private_impl.choosy_up = (
40111
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
40112
        wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_crc64__ecma_hasher__up_x86_sse42 :
40113
#endif
40114
        self->private_impl.choosy_up);
40115
  }
40116
  wuffs_crc64__ecma_hasher__up(self, a_x);
40117
  return wuffs_base__make_empty_struct();
40118
}
40119
40120
// -------- func crc64.ecma_hasher.update_u64
40121
40122
WUFFS_BASE__GENERATED_C_CODE
40123
WUFFS_BASE__MAYBE_STATIC uint64_t
40124
wuffs_crc64__ecma_hasher__update_u64(
40125
    wuffs_crc64__ecma_hasher* self,
40126
    wuffs_base__slice_u8 a_x) {
40127
  if (!self) {
40128
    return 0;
40129
  }
40130
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
40131
    return 0;
40132
  }
40133
40134
  wuffs_crc64__ecma_hasher__update(self, a_x);
40135
  return wuffs_crc64__ecma_hasher__checksum_u64(self);
40136
}
40137
40138
// -------- func crc64.ecma_hasher.up
40139
40140
WUFFS_BASE__GENERATED_C_CODE
40141
static wuffs_base__empty_struct
40142
wuffs_crc64__ecma_hasher__up(
40143
    wuffs_crc64__ecma_hasher* self,
40144
    wuffs_base__slice_u8 a_x) {
40145
  return (*self->private_impl.choosy_up)(self, a_x);
40146
}
40147
40148
WUFFS_BASE__GENERATED_C_CODE
40149
static wuffs_base__empty_struct
40150
wuffs_crc64__ecma_hasher__up__choosy_default(
40151
    wuffs_crc64__ecma_hasher* self,
40152
    wuffs_base__slice_u8 a_x) {
40153
  uint64_t v_s = 0;
40154
  wuffs_base__slice_u8 v_p = {0};
40155
40156
  v_s = (18446744073709551615u ^ self->private_impl.f_state);
40157
  {
40158
    wuffs_base__slice_u8 i_slice_p = a_x;
40159
    v_p.ptr = i_slice_p.ptr;
40160
    v_p.len = 8;
40161
    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));
40162
    while (v_p.ptr < i_end0_p) {
40163
      v_s ^= ((((uint64_t)(v_p.ptr[0u])) << 0u) |
40164
          (((uint64_t)(v_p.ptr[1u])) << 8u) |
40165
          (((uint64_t)(v_p.ptr[2u])) << 16u) |
40166
          (((uint64_t)(v_p.ptr[3u])) << 24u) |
40167
          (((uint64_t)(v_p.ptr[4u])) << 32u) |
40168
          (((uint64_t)(v_p.ptr[5u])) << 40u) |
40169
          (((uint64_t)(v_p.ptr[6u])) << 48u) |
40170
          (((uint64_t)(v_p.ptr[7u])) << 56u));
40171
      v_s = (WUFFS_CRC64__ECMA_TABLE[0u][(255u & (v_s >> 56u))] ^
40172
          WUFFS_CRC64__ECMA_TABLE[1u][(255u & (v_s >> 48u))] ^
40173
          WUFFS_CRC64__ECMA_TABLE[2u][(255u & (v_s >> 40u))] ^
40174
          WUFFS_CRC64__ECMA_TABLE[3u][(255u & (v_s >> 32u))] ^
40175
          WUFFS_CRC64__ECMA_TABLE[4u][(255u & (v_s >> 24u))] ^
40176
          WUFFS_CRC64__ECMA_TABLE[5u][(255u & (v_s >> 16u))] ^
40177
          WUFFS_CRC64__ECMA_TABLE[6u][(255u & (v_s >> 8u))] ^
40178
          WUFFS_CRC64__ECMA_TABLE[7u][(255u & (v_s >> 0u))]);
40179
      v_p.ptr += 8;
40180
    }
40181
    v_p.len = 1;
40182
    const uint8_t* i_end1_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len);
40183
    while (v_p.ptr < i_end1_p) {
40184
      v_s = (WUFFS_CRC64__ECMA_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ v_p.ptr[0u]))] ^ (v_s >> 8u));
40185
      v_p.ptr += 1;
40186
    }
40187
    v_p.len = 0;
40188
  }
40189
  self->private_impl.f_state = (18446744073709551615u ^ v_s);
40190
  return wuffs_base__make_empty_struct();
40191
}
40192
40193
// -------- func crc64.ecma_hasher.checksum_u64
40194
40195
WUFFS_BASE__GENERATED_C_CODE
40196
WUFFS_BASE__MAYBE_STATIC uint64_t
40197
wuffs_crc64__ecma_hasher__checksum_u64(
40198
    const wuffs_crc64__ecma_hasher* self) {
40199
  if (!self) {
40200
    return 0;
40201
  }
40202
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
40203
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
40204
    return 0;
40205
  }
40206
40207
  return self->private_impl.f_state;
40208
}
40209
40210
// โ€ผ WUFFS MULTI-FILE SECTION +x86_sse42
40211
// -------- func crc64.ecma_hasher.up_x86_sse42
40212
40213
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
40214
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
40215
WUFFS_BASE__GENERATED_C_CODE
40216
static wuffs_base__empty_struct
40217
wuffs_crc64__ecma_hasher__up_x86_sse42(
40218
    wuffs_crc64__ecma_hasher* self,
40219
    wuffs_base__slice_u8 a_x) {
40220
  uint64_t v_s = 0;
40221
  wuffs_base__slice_u8 v_p = {0};
40222
  uint8_t v_buf[48] = {0};
40223
  __m128i v_xa = {0};
40224
  __m128i v_xb = {0};
40225
  __m128i v_xc = {0};
40226
  __m128i v_xd = {0};
40227
  __m128i v_xe = {0};
40228
  __m128i v_xf = {0};
40229
  __m128i v_xg = {0};
40230
  __m128i v_xh = {0};
40231
  __m128i v_mu1 = {0};
40232
  __m128i v_mu2 = {0};
40233
  __m128i v_mu4 = {0};
40234
  __m128i v_mu8 = {0};
40235
  __m128i v_mupx = {0};
40236
40237
  v_s = (18446744073709551615u ^ self->private_impl.f_state);
40238
  while ((((uint64_t)(a_x.len)) > 0u) && ((15u & ((uint32_t)(0xFFFu & (uintptr_t)(a_x.ptr)))) != 0u)) {
40239
    v_s = (WUFFS_CRC64__ECMA_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ a_x.ptr[0u]))] ^ (v_s >> 8u));
40240
    a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u);
40241
  }
40242
  do {
40243
    do {
40244
      if (((uint64_t)(a_x.len)) >= 128u) {
40245
      } else if (((uint64_t)(a_x.len)) >= 64u) {
40246
        v_xa = _mm_xor_si128(_mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u)), _mm_cvtsi64_si128((int64_t)(v_s)));
40247
        v_xb = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u));
40248
        v_xc = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 32u));
40249
        v_xd = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 48u));
40250
        a_x = wuffs_base__slice_u8__subslice_i(a_x, 64u);
40251
        break;
40252
      } else if (((uint64_t)(a_x.len)) >= 32u) {
40253
        v_xa = _mm_xor_si128(_mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u)), _mm_cvtsi64_si128((int64_t)(v_s)));
40254
        v_xb = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u));
40255
        a_x = wuffs_base__slice_u8__subslice_i(a_x, 32u);
40256
        goto label__chain2__break;
40257
      } else {
40258
        {
40259
          wuffs_base__slice_u8 i_slice_p = a_x;
40260
          v_p.ptr = i_slice_p.ptr;
40261
          v_p.len = 1;
40262
          const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len);
40263
          while (v_p.ptr < i_end0_p) {
40264
            v_s = (WUFFS_CRC64__ECMA_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ v_p.ptr[0u]))] ^ (v_s >> 8u));
40265
            v_p.ptr += 1;
40266
          }
40267
          v_p.len = 0;
40268
        }
40269
        self->private_impl.f_state = (18446744073709551615u ^ v_s);
40270
        return wuffs_base__make_empty_struct();
40271
      }
40272
      v_xa = _mm_xor_si128(_mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u)), _mm_cvtsi64_si128((int64_t)(v_s)));
40273
      v_xb = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u));
40274
      v_xc = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 32u));
40275
      v_xd = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 48u));
40276
      v_xe = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 64u));
40277
      v_xf = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 80u));
40278
      v_xg = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 96u));
40279
      v_xh = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 112u));
40280
      a_x = wuffs_base__slice_u8__subslice_i(a_x, 128u);
40281
      v_mu8 = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC64__ECMA_X86_SSE42_FOLD8));
40282
      while (((uint64_t)(a_x.len)) >= 128u) {
40283
        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)));
40284
        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)));
40285
        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)));
40286
        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)));
40287
        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)));
40288
        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)));
40289
        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)));
40290
        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)));
40291
        a_x = wuffs_base__slice_u8__subslice_i(a_x, 128u);
40292
      }
40293
      v_mu4 = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC64__ECMA_X86_SSE42_FOLD4));
40294
      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);
40295
      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);
40296
      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);
40297
      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);
40298
      if (((uint64_t)(a_x.len)) > 64u) {
40299
        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)));
40300
        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)));
40301
        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)));
40302
        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)));
40303
        a_x = wuffs_base__slice_u8__subslice_i(a_x, 64u);
40304
      }
40305
    } while (0);
40306
    v_mu2 = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC64__ECMA_X86_SSE42_FOLD2));
40307
    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);
40308
    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);
40309
    if (((uint64_t)(a_x.len)) > 32u) {
40310
      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)));
40311
      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)));
40312
      a_x = wuffs_base__slice_u8__subslice_i(a_x, 32u);
40313
    }
40314
  } while (0);
40315
  label__chain2__break:;
40316
  v_mu1 = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC64__ECMA_X86_SSE42_FOLD1));
40317
  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);
40318
  if (((uint64_t)(a_x.len)) > 24u) {
40319
    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)));
40320
    a_x = wuffs_base__slice_u8__subslice_i(a_x, 16u);
40321
    if (((uint64_t)(a_x.len)) > 24u) {
40322
      return wuffs_base__make_empty_struct();
40323
    }
40324
  }
40325
  _mm_storeu_si128((__m128i*)(void*)(v_buf + (24u - ((uint64_t)(a_x.len)))), v_xa);
40326
  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);
40327
  v_mu2 = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC64__ECMA_X86_SSE42_FOLD2));
40328
  v_xa = _mm_lddqu_si128((const __m128i*)(const void*)(v_buf + 0u));
40329
  v_xb = _mm_lddqu_si128((const __m128i*)(const void*)(v_buf + 16u));
40330
  v_xc = _mm_lddqu_si128((const __m128i*)(const void*)(v_buf + 32u));
40331
  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)));
40332
  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)));
40333
  v_xa = _mm_xor_si128(v_xd, _mm_xor_si128(v_xe, v_xc));
40334
  v_mupx = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC64__ECMA_X86_SSE42_MUPX));
40335
  v_xb = _mm_clmulepi64_si128(v_xa, v_mupx, (int32_t)(0u));
40336
  v_xc = _mm_clmulepi64_si128(v_xb, v_mupx, (int32_t)(16u));
40337
  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))));
40338
  self->private_impl.f_state = (18446744073709551615u ^ v_s);
40339
  return wuffs_base__make_empty_struct();
40340
}
40341
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
40342
// โ€ผ WUFFS MULTI-FILE SECTION -x86_sse42
40343
40344
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC64)
40345
40346
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__DEFLATE)
40347
40348
// ---------------- Status Codes Implementations
40349
40350
const char wuffs_deflate__error__bad_huffman_code_over_subscribed[] = "#deflate: bad Huffman code (over-subscribed)";
40351
const char wuffs_deflate__error__bad_huffman_code_under_subscribed[] = "#deflate: bad Huffman code (under-subscribed)";
40352
const char wuffs_deflate__error__bad_huffman_code_length_count[] = "#deflate: bad Huffman code length count";
40353
const char wuffs_deflate__error__bad_huffman_code_length_repetition[] = "#deflate: bad Huffman code length repetition";
40354
const char wuffs_deflate__error__bad_huffman_code[] = "#deflate: bad Huffman code";
40355
const char wuffs_deflate__error__bad_huffman_minimum_code_length[] = "#deflate: bad Huffman minimum code length";
40356
const char wuffs_deflate__error__bad_block[] = "#deflate: bad block";
40357
const char wuffs_deflate__error__bad_distance[] = "#deflate: bad distance";
40358
const char wuffs_deflate__error__bad_distance_code_count[] = "#deflate: bad distance code count";
40359
const char wuffs_deflate__error__bad_literal_length_code_count[] = "#deflate: bad literal/length code count";
40360
const char wuffs_deflate__error__inconsistent_stored_block_length[] = "#deflate: inconsistent stored block length";
40361
const char wuffs_deflate__error__missing_end_of_block_code[] = "#deflate: missing end-of-block code";
40362
const char wuffs_deflate__error__no_huffman_codes[] = "#deflate: no Huffman codes";
40363
const char wuffs_deflate__error__truncated_input[] = "#deflate: truncated input";
40364
const char wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state[] = "#deflate: internal error: inconsistent Huffman decoder state";
40365
const char wuffs_deflate__error__internal_error_inconsistent_i_o[] = "#deflate: internal error: inconsistent I/O";
40366
const char wuffs_deflate__error__internal_error_inconsistent_distance[] = "#deflate: internal error: inconsistent distance";
40367
const char wuffs_deflate__error__internal_error_inconsistent_n_bits[] = "#deflate: internal error: inconsistent n_bits";
40368
40369
// ---------------- Private Consts
40370
40371
static const uint8_t
40372
WUFFS_DEFLATE__CODE_ORDER[19] WUFFS_BASE__POTENTIALLY_UNUSED = {
40373
  16u, 17u, 18u, 0u, 8u, 7u, 9u, 6u,
40374
  10u, 5u, 11u, 4u, 12u, 3u, 13u, 2u,
40375
  14u, 1u, 15u,
40376
};
40377
40378
static const uint8_t
40379
WUFFS_DEFLATE__REVERSE8[256] WUFFS_BASE__POTENTIALLY_UNUSED = {
40380
  0u, 128u, 64u, 192u, 32u, 160u, 96u, 224u,
40381
  16u, 144u, 80u, 208u, 48u, 176u, 112u, 240u,
40382
  8u, 136u, 72u, 200u, 40u, 168u, 104u, 232u,
40383
  24u, 152u, 88u, 216u, 56u, 184u, 120u, 248u,
40384
  4u, 132u, 68u, 196u, 36u, 164u, 100u, 228u,
40385
  20u, 148u, 84u, 212u, 52u, 180u, 116u, 244u,
40386
  12u, 140u, 76u, 204u, 44u, 172u, 108u, 236u,
40387
  28u, 156u, 92u, 220u, 60u, 188u, 124u, 252u,
40388
  2u, 130u, 66u, 194u, 34u, 162u, 98u, 226u,
40389
  18u, 146u, 82u, 210u, 50u, 178u, 114u, 242u,
40390
  10u, 138u, 74u, 202u, 42u, 170u, 106u, 234u,
40391
  26u, 154u, 90u, 218u, 58u, 186u, 122u, 250u,
40392
  6u, 134u, 70u, 198u, 38u, 166u, 102u, 230u,
40393
  22u, 150u, 86u, 214u, 54u, 182u, 118u, 246u,
40394
  14u, 142u, 78u, 206u, 46u, 174u, 110u, 238u,
40395
  30u, 158u, 94u, 222u, 62u, 190u, 126u, 254u,
40396
  1u, 129u, 65u, 193u, 33u, 161u, 97u, 225u,
40397
  17u, 145u, 81u, 209u, 49u, 177u, 113u, 241u,
40398
  9u, 137u, 73u, 201u, 41u, 169u, 105u, 233u,
40399
  25u, 153u, 89u, 217u, 57u, 185u, 121u, 249u,
40400
  5u, 133u, 69u, 197u, 37u, 165u, 101u, 229u,
40401
  21u, 149u, 85u, 213u, 53u, 181u, 117u, 245u,
40402
  13u, 141u, 77u, 205u, 45u, 173u, 109u, 237u,
40403
  29u, 157u, 93u, 221u, 61u, 189u, 125u, 253u,
40404
  3u, 131u, 67u, 195u, 35u, 163u, 99u, 227u,
40405
  19u, 147u, 83u, 211u, 51u, 179u, 115u, 243u,
40406
  11u, 139u, 75u, 203u, 43u, 171u, 107u, 235u,
40407
  27u, 155u, 91u, 219u, 59u, 187u, 123u, 251u,
40408
  7u, 135u, 71u, 199u, 39u, 167u, 103u, 231u,
40409
  23u, 151u, 87u, 215u, 55u, 183u, 119u, 247u,
40410
  15u, 143u, 79u, 207u, 47u, 175u, 111u, 239u,
40411
  31u, 159u, 95u, 223u, 63u, 191u, 127u, 255u,
40412
};
40413
40414
static const uint32_t
40415
WUFFS_DEFLATE__LCODE_MAGIC_NUMBERS[32] WUFFS_BASE__POTENTIALLY_UNUSED = {
40416
  1073741824u, 1073742080u, 1073742336u, 1073742592u, 1073742848u, 1073743104u, 1073743360u, 1073743616u,
40417
  1073743888u, 1073744400u, 1073744912u, 1073745424u, 1073745952u, 1073746976u, 1073748000u, 1073749024u,
40418
  1073750064u, 1073752112u, 1073754160u, 1073756208u, 1073758272u, 1073762368u, 1073766464u, 1073770560u,
40419
  1073774672u, 1073782864u, 1073791056u, 1073799248u, 1073807104u, 134217728u, 134217728u, 134217728u,
40420
};
40421
40422
static const uint32_t
40423
WUFFS_DEFLATE__DCODE_MAGIC_NUMBERS[32] WUFFS_BASE__POTENTIALLY_UNUSED = {
40424
  1073741824u, 1073742080u, 1073742336u, 1073742592u, 1073742864u, 1073743376u, 1073743904u, 1073744928u,
40425
  1073745968u, 1073748016u, 1073750080u, 1073754176u, 1073758288u, 1073766480u, 1073774688u, 1073791072u,
40426
  1073807472u, 1073840240u, 1073873024u, 1073938560u, 1074004112u, 1074135184u, 1074266272u, 1074528416u,
40427
  1074790576u, 1075314864u, 1075839168u, 1076887744u, 1077936336u, 1080033488u, 134217728u, 134217728u,
40428
};
40429
40430
#define WUFFS_DEFLATE__HUFFS_TABLE_SIZE 1024u
40431
40432
#define WUFFS_DEFLATE__HUFFS_TABLE_MASK 1023u
40433
40434
// ---------------- Private Initializer Prototypes
40435
40436
// ---------------- Private Function Prototypes
40437
40438
WUFFS_BASE__GENERATED_C_CODE
40439
static wuffs_base__status
40440
wuffs_deflate__decoder__do_transform_io(
40441
    wuffs_deflate__decoder* self,
40442
    wuffs_base__io_buffer* a_dst,
40443
    wuffs_base__io_buffer* a_src,
40444
    wuffs_base__slice_u8 a_workbuf);
40445
40446
WUFFS_BASE__GENERATED_C_CODE
40447
static wuffs_base__status
40448
wuffs_deflate__decoder__decode_blocks(
40449
    wuffs_deflate__decoder* self,
40450
    wuffs_base__io_buffer* a_dst,
40451
    wuffs_base__io_buffer* a_src);
40452
40453
WUFFS_BASE__GENERATED_C_CODE
40454
static wuffs_base__status
40455
wuffs_deflate__decoder__decode_uncompressed(
40456
    wuffs_deflate__decoder* self,
40457
    wuffs_base__io_buffer* a_dst,
40458
    wuffs_base__io_buffer* a_src);
40459
40460
WUFFS_BASE__GENERATED_C_CODE
40461
static wuffs_base__status
40462
wuffs_deflate__decoder__init_fixed_huffman(
40463
    wuffs_deflate__decoder* self);
40464
40465
WUFFS_BASE__GENERATED_C_CODE
40466
static wuffs_base__status
40467
wuffs_deflate__decoder__init_dynamic_huffman(
40468
    wuffs_deflate__decoder* self,
40469
    wuffs_base__io_buffer* a_src);
40470
40471
WUFFS_BASE__GENERATED_C_CODE
40472
static wuffs_base__status
40473
wuffs_deflate__decoder__init_huff(
40474
    wuffs_deflate__decoder* self,
40475
    uint32_t a_which,
40476
    uint32_t a_n_codes0,
40477
    uint32_t a_n_codes1,
40478
    uint32_t a_base_symbol);
40479
40480
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
40481
WUFFS_BASE__GENERATED_C_CODE
40482
static wuffs_base__status
40483
wuffs_deflate__decoder__decode_huffman_bmi2(
40484
    wuffs_deflate__decoder* self,
40485
    wuffs_base__io_buffer* a_dst,
40486
    wuffs_base__io_buffer* a_src);
40487
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
40488
40489
WUFFS_BASE__GENERATED_C_CODE
40490
static wuffs_base__status
40491
wuffs_deflate__decoder__decode_huffman_fast32(
40492
    wuffs_deflate__decoder* self,
40493
    wuffs_base__io_buffer* a_dst,
40494
    wuffs_base__io_buffer* a_src);
40495
40496
WUFFS_BASE__GENERATED_C_CODE
40497
static wuffs_base__status
40498
wuffs_deflate__decoder__decode_huffman_fast64(
40499
    wuffs_deflate__decoder* self,
40500
    wuffs_base__io_buffer* a_dst,
40501
    wuffs_base__io_buffer* a_src);
40502
40503
WUFFS_BASE__GENERATED_C_CODE
40504
static wuffs_base__status
40505
wuffs_deflate__decoder__decode_huffman_fast64__choosy_default(
40506
    wuffs_deflate__decoder* self,
40507
    wuffs_base__io_buffer* a_dst,
40508
    wuffs_base__io_buffer* a_src);
40509
40510
WUFFS_BASE__GENERATED_C_CODE
40511
static wuffs_base__status
40512
wuffs_deflate__decoder__decode_huffman_slow(
40513
    wuffs_deflate__decoder* self,
40514
    wuffs_base__io_buffer* a_dst,
40515
    wuffs_base__io_buffer* a_src);
40516
40517
// ---------------- VTables
40518
40519
const wuffs_base__io_transformer__func_ptrs
40520
wuffs_deflate__decoder__func_ptrs_for__wuffs_base__io_transformer = {
40521
  (wuffs_base__optional_u63(*)(const void*))(&wuffs_deflate__decoder__dst_history_retain_length),
40522
  (uint64_t(*)(const void*,
40523
      uint32_t))(&wuffs_deflate__decoder__get_quirk),
40524
  (wuffs_base__status(*)(void*,
40525
      uint32_t,
40526
      uint64_t))(&wuffs_deflate__decoder__set_quirk),
40527
  (wuffs_base__status(*)(void*,
40528
      wuffs_base__io_buffer*,
40529
      wuffs_base__io_buffer*,
40530
      wuffs_base__slice_u8))(&wuffs_deflate__decoder__transform_io),
40531
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_deflate__decoder__workbuf_len),
40532
};
40533
40534
// ---------------- Initializer Implementations
40535
40536
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
40537
wuffs_deflate__decoder__initialize(
40538
    wuffs_deflate__decoder* self,
40539
    size_t sizeof_star_self,
40540
    uint64_t wuffs_version,
40541
7.95k
    uint32_t options){
40542
7.95k
  if (!self) {
40543
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
40544
0
  }
40545
7.95k
  if (sizeof(*self) != sizeof_star_self) {
40546
0
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
40547
0
  }
40548
7.95k
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
40549
7.95k
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
40550
0
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
40551
0
  }
40552
40553
7.95k
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
40554
    // The whole point of this if-check is to detect an uninitialized *self.
40555
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
40556
#if !defined(__clang__) && defined(__GNUC__)
40557
#pragma GCC diagnostic push
40558
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
40559
#endif
40560
2.89k
    if (self->private_impl.magic != 0) {
40561
0
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
40562
0
    }
40563
#if !defined(__clang__) && defined(__GNUC__)
40564
#pragma GCC diagnostic pop
40565
#endif
40566
5.05k
  } else {
40567
5.05k
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
40568
0
      memset(self, 0, sizeof(*self));
40569
0
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
40570
5.05k
    } else {
40571
5.05k
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
40572
5.05k
    }
40573
5.05k
  }
40574
40575
7.95k
  self->private_impl.choosy_decode_huffman_fast64 = &wuffs_deflate__decoder__decode_huffman_fast64__choosy_default;
40576
40577
7.95k
  self->private_impl.magic = WUFFS_BASE__MAGIC;
40578
7.95k
  self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name =
40579
7.95k
      wuffs_base__io_transformer__vtable_name;
40580
7.95k
  self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers =
40581
7.95k
      (const void*)(&wuffs_deflate__decoder__func_ptrs_for__wuffs_base__io_transformer);
40582
7.95k
  return wuffs_base__make_status(NULL);
40583
7.95k
}
40584
40585
wuffs_deflate__decoder*
40586
0
wuffs_deflate__decoder__alloc(void) {
40587
0
  wuffs_deflate__decoder* x =
40588
0
      (wuffs_deflate__decoder*)(calloc(1, sizeof(wuffs_deflate__decoder)));
40589
0
  if (!x) {
40590
0
    return NULL;
40591
0
  }
40592
0
  if (wuffs_deflate__decoder__initialize(
40593
0
      x, sizeof(wuffs_deflate__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
40594
0
    free(x);
40595
0
    return NULL;
40596
0
  }
40597
0
  return x;
40598
0
}
40599
40600
size_t
40601
0
sizeof__wuffs_deflate__decoder(void) {
40602
0
  return sizeof(wuffs_deflate__decoder);
40603
0
}
40604
40605
// ---------------- Function Implementations
40606
40607
// -------- func deflate.decoder.add_history
40608
40609
WUFFS_BASE__GENERATED_C_CODE
40610
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
40611
wuffs_deflate__decoder__add_history(
40612
    wuffs_deflate__decoder* self,
40613
16.4k
    wuffs_base__slice_u8 a_hist) {
40614
16.4k
  if (!self) {
40615
0
    return wuffs_base__make_empty_struct();
40616
0
  }
40617
16.4k
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
40618
0
    return wuffs_base__make_empty_struct();
40619
0
  }
40620
40621
16.4k
  wuffs_base__slice_u8 v_s = {0};
40622
16.4k
  uint64_t v_n_copied = 0;
40623
16.4k
  uint32_t v_already_full = 0;
40624
40625
16.4k
  v_s = a_hist;
40626
16.4k
  if (((uint64_t)(v_s.len)) >= 32768u) {
40627
620
    v_s = wuffs_private_impl__slice_u8__suffix(v_s, 32768u);
40628
620
    wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__make_slice_u8(self->private_data.f_history, 32768), v_s);
40629
620
    self->private_impl.f_history_index = 32768u;
40630
15.7k
  } else {
40631
15.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);
40632
15.7k
    if (v_n_copied < ((uint64_t)(v_s.len))) {
40633
478
      v_s = wuffs_base__slice_u8__subslice_i(v_s, v_n_copied);
40634
478
      v_n_copied = wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__make_slice_u8(self->private_data.f_history, 32768), v_s);
40635
478
      self->private_impl.f_history_index = (((uint32_t)((v_n_copied & 32767u))) + 32768u);
40636
15.3k
    } else {
40637
15.3k
      v_already_full = 0u;
40638
15.3k
      if (self->private_impl.f_history_index >= 32768u) {
40639
1.33k
        v_already_full = 32768u;
40640
1.33k
      }
40641
15.3k
      self->private_impl.f_history_index = ((self->private_impl.f_history_index & 32767u) + ((uint32_t)((v_n_copied & 32767u))) + v_already_full);
40642
15.3k
    }
40643
15.7k
  }
40644
16.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));
40645
16.4k
  return wuffs_base__make_empty_struct();
40646
16.4k
}
40647
40648
// -------- func deflate.decoder.get_quirk
40649
40650
WUFFS_BASE__GENERATED_C_CODE
40651
WUFFS_BASE__MAYBE_STATIC uint64_t
40652
wuffs_deflate__decoder__get_quirk(
40653
    const wuffs_deflate__decoder* self,
40654
0
    uint32_t a_key) {
40655
0
  if (!self) {
40656
0
    return 0;
40657
0
  }
40658
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
40659
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
40660
0
    return 0;
40661
0
  }
40662
40663
0
  return 0u;
40664
0
}
40665
40666
// -------- func deflate.decoder.set_quirk
40667
40668
WUFFS_BASE__GENERATED_C_CODE
40669
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
40670
wuffs_deflate__decoder__set_quirk(
40671
    wuffs_deflate__decoder* self,
40672
    uint32_t a_key,
40673
0
    uint64_t a_value) {
40674
0
  if (!self) {
40675
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
40676
0
  }
40677
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
40678
0
    return wuffs_base__make_status(
40679
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
40680
0
        ? wuffs_base__error__disabled_by_previous_error
40681
0
        : wuffs_base__error__initialize_not_called);
40682
0
  }
40683
40684
0
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
40685
0
}
40686
40687
// -------- func deflate.decoder.dst_history_retain_length
40688
40689
WUFFS_BASE__GENERATED_C_CODE
40690
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
40691
wuffs_deflate__decoder__dst_history_retain_length(
40692
0
    const wuffs_deflate__decoder* self) {
40693
0
  if (!self) {
40694
0
    return wuffs_base__utility__make_optional_u63(false, 0u);
40695
0
  }
40696
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
40697
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
40698
0
    return wuffs_base__utility__make_optional_u63(false, 0u);
40699
0
  }
40700
40701
0
  return wuffs_base__utility__make_optional_u63(true, 0u);
40702
0
}
40703
40704
// -------- func deflate.decoder.workbuf_len
40705
40706
WUFFS_BASE__GENERATED_C_CODE
40707
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
40708
wuffs_deflate__decoder__workbuf_len(
40709
0
    const wuffs_deflate__decoder* self) {
40710
0
  if (!self) {
40711
0
    return wuffs_base__utility__empty_range_ii_u64();
40712
0
  }
40713
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
40714
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
40715
0
    return wuffs_base__utility__empty_range_ii_u64();
40716
0
  }
40717
40718
0
  return wuffs_base__utility__make_range_ii_u64(1u, 1u);
40719
0
}
40720
40721
// -------- func deflate.decoder.transform_io
40722
40723
WUFFS_BASE__GENERATED_C_CODE
40724
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
40725
wuffs_deflate__decoder__transform_io(
40726
    wuffs_deflate__decoder* self,
40727
    wuffs_base__io_buffer* a_dst,
40728
    wuffs_base__io_buffer* a_src,
40729
19.1k
    wuffs_base__slice_u8 a_workbuf) {
40730
19.1k
  if (!self) {
40731
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
40732
0
  }
40733
19.1k
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
40734
0
    return wuffs_base__make_status(
40735
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
40736
0
        ? wuffs_base__error__disabled_by_previous_error
40737
0
        : wuffs_base__error__initialize_not_called);
40738
0
  }
40739
19.1k
  if (!a_dst || !a_src) {
40740
0
    self->private_impl.magic = WUFFS_BASE__DISABLED;
40741
0
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
40742
0
  }
40743
19.1k
  if ((self->private_impl.active_coroutine != 0) &&
40744
19.1k
      (self->private_impl.active_coroutine != 1)) {
40745
0
    self->private_impl.magic = WUFFS_BASE__DISABLED;
40746
0
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
40747
0
  }
40748
19.1k
  self->private_impl.active_coroutine = 0;
40749
19.1k
  wuffs_base__status status = wuffs_base__make_status(NULL);
40750
40751
19.1k
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
40752
40753
19.1k
  uint32_t coro_susp_point = self->private_impl.p_transform_io;
40754
19.1k
  switch (coro_susp_point) {
40755
5.56k
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
40756
40757
19.1k
    while (true) {
40758
19.1k
      {
40759
19.1k
        wuffs_base__status t_0 = wuffs_deflate__decoder__do_transform_io(self, a_dst, a_src, a_workbuf);
40760
19.1k
        v_status = t_0;
40761
19.1k
      }
40762
19.1k
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
40763
1.29k
        status = wuffs_base__make_status(wuffs_deflate__error__truncated_input);
40764
1.29k
        goto exit;
40765
1.29k
      }
40766
17.8k
      status = v_status;
40767
17.8k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
40768
13.5k
    }
40769
40770
2.32k
    ok:
40771
2.32k
    self->private_impl.p_transform_io = 0;
40772
2.32k
    goto exit;
40773
19.1k
  }
40774
40775
0
  goto suspend;
40776
15.1k
  suspend:
40777
15.1k
  self->private_impl.p_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
40778
15.1k
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
40779
40780
15.1k
  goto exit;
40781
19.1k
  exit:
40782
19.1k
  if (wuffs_base__status__is_error(&status)) {
40783
1.66k
    self->private_impl.magic = WUFFS_BASE__DISABLED;
40784
1.66k
  }
40785
19.1k
  return status;
40786
19.1k
}
40787
40788
// -------- func deflate.decoder.do_transform_io
40789
40790
WUFFS_BASE__GENERATED_C_CODE
40791
static wuffs_base__status
40792
wuffs_deflate__decoder__do_transform_io(
40793
    wuffs_deflate__decoder* self,
40794
    wuffs_base__io_buffer* a_dst,
40795
    wuffs_base__io_buffer* a_src,
40796
19.1k
    wuffs_base__slice_u8 a_workbuf) {
40797
19.1k
  wuffs_base__status status = wuffs_base__make_status(NULL);
40798
40799
19.1k
  uint64_t v_mark = 0;
40800
19.1k
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
40801
40802
19.1k
  uint8_t* iop_a_dst = NULL;
40803
19.1k
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
40804
19.1k
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
40805
19.1k
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
40806
19.1k
  if (a_dst && a_dst->data.ptr) {
40807
19.1k
    io0_a_dst = a_dst->data.ptr;
40808
19.1k
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
40809
19.1k
    iop_a_dst = io1_a_dst;
40810
19.1k
    io2_a_dst = io0_a_dst + a_dst->data.len;
40811
19.1k
    if (a_dst->meta.closed) {
40812
0
      io2_a_dst = iop_a_dst;
40813
0
    }
40814
19.1k
  }
40815
40816
19.1k
  uint32_t coro_susp_point = self->private_impl.p_do_transform_io;
40817
19.1k
  switch (coro_susp_point) {
40818
5.56k
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
40819
40820
5.56k
    self->private_impl.choosy_decode_huffman_fast64 = (
40821
5.56k
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
40822
5.56k
        wuffs_base__cpu_arch__have_x86_bmi2() ? &wuffs_deflate__decoder__decode_huffman_bmi2 :
40823
5.56k
#endif
40824
5.56k
        self->private_impl.choosy_decode_huffman_fast64);
40825
19.1k
    while (true) {
40826
19.1k
      v_mark = ((uint64_t)(iop_a_dst - io0_a_dst));
40827
19.1k
      {
40828
19.1k
        if (a_dst) {
40829
19.1k
          a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
40830
19.1k
        }
40831
19.1k
        wuffs_base__status t_0 = wuffs_deflate__decoder__decode_blocks(self, a_dst, a_src);
40832
19.1k
        v_status = t_0;
40833
19.1k
        if (a_dst) {
40834
19.1k
          iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
40835
19.1k
        }
40836
19.1k
      }
40837
19.1k
      if ( ! wuffs_base__status__is_suspension(&v_status)) {
40838
2.69k
        status = v_status;
40839
2.69k
        if (wuffs_base__status__is_error(&status)) {
40840
370
          goto exit;
40841
2.32k
        } else if (wuffs_base__status__is_suspension(&status)) {
40842
0
          status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
40843
0
          goto exit;
40844
0
        }
40845
2.32k
        goto ok;
40846
2.69k
      }
40847
16.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))));
40848
16.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));
40849
16.4k
      status = v_status;
40850
16.4k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
40851
13.5k
    }
40852
40853
2.32k
    ok:
40854
2.32k
    self->private_impl.p_do_transform_io = 0;
40855
2.32k
    goto exit;
40856
19.1k
  }
40857
40858
0
  goto suspend;
40859
16.4k
  suspend:
40860
16.4k
  self->private_impl.p_do_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
40861
40862
16.4k
  goto exit;
40863
19.1k
  exit:
40864
19.1k
  if (a_dst && a_dst->data.ptr) {
40865
19.1k
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
40866
19.1k
  }
40867
40868
19.1k
  return status;
40869
19.1k
}
40870
40871
// -------- func deflate.decoder.decode_blocks
40872
40873
WUFFS_BASE__GENERATED_C_CODE
40874
static wuffs_base__status
40875
wuffs_deflate__decoder__decode_blocks(
40876
    wuffs_deflate__decoder* self,
40877
    wuffs_base__io_buffer* a_dst,
40878
19.1k
    wuffs_base__io_buffer* a_src) {
40879
19.1k
  wuffs_base__status status = wuffs_base__make_status(NULL);
40880
40881
19.1k
  uint32_t v_final = 0;
40882
19.1k
  uint32_t v_b0 = 0;
40883
19.1k
  uint32_t v_type = 0;
40884
19.1k
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
40885
40886
19.1k
  const uint8_t* iop_a_src = NULL;
40887
19.1k
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
40888
19.1k
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
40889
19.1k
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
40890
19.1k
  if (a_src && a_src->data.ptr) {
40891
19.1k
    io0_a_src = a_src->data.ptr;
40892
19.1k
    io1_a_src = io0_a_src + a_src->meta.ri;
40893
19.1k
    iop_a_src = io1_a_src;
40894
19.1k
    io2_a_src = io0_a_src + a_src->meta.wi;
40895
19.1k
  }
40896
40897
19.1k
  uint32_t coro_susp_point = self->private_impl.p_decode_blocks;
40898
19.1k
  if (coro_susp_point) {
40899
13.5k
    v_final = self->private_data.s_decode_blocks.v_final;
40900
13.5k
  }
40901
19.1k
  switch (coro_susp_point) {
40902
5.56k
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
40903
40904
14.1k
    label__outer__continue:;
40905
15.1k
    while (v_final == 0u) {
40906
23.0k
      while (self->private_impl.f_n_bits < 3u) {
40907
10.3k
        {
40908
10.7k
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
40909
10.7k
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
40910
510
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
40911
510
            goto suspend;
40912
510
          }
40913
10.2k
          uint32_t t_0 = *iop_a_src++;
40914
10.2k
          v_b0 = t_0;
40915
10.2k
        }
40916
0
        self->private_impl.f_bits |= (v_b0 << (self->private_impl.f_n_bits & 3u));
40917
10.2k
        self->private_impl.f_n_bits = ((self->private_impl.f_n_bits & 3u) + 8u);
40918
10.2k
      }
40919
12.7k
      v_final = (self->private_impl.f_bits & 1u);
40920
12.7k
      v_type = ((self->private_impl.f_bits >> 1u) & 3u);
40921
12.7k
      self->private_impl.f_bits >>= 3u;
40922
12.7k
      self->private_impl.f_n_bits -= 3u;
40923
12.7k
      if (v_type == 0u) {
40924
1.20k
        if (a_src) {
40925
1.20k
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
40926
1.20k
        }
40927
2.17k
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
40928
2.17k
        status = wuffs_deflate__decoder__decode_uncompressed(self, a_dst, a_src);
40929
2.17k
        if (a_src) {
40930
2.17k
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
40931
2.17k
        }
40932
2.17k
        if (status.repr) {
40933
1.18k
          goto suspend;
40934
1.18k
        }
40935
993
        continue;
40936
11.5k
      } else if (v_type == 1u) {
40937
6.75k
        v_status = wuffs_deflate__decoder__init_fixed_huffman(self);
40938
6.75k
        if ( ! wuffs_base__status__is_ok(&v_status)) {
40939
0
          status = v_status;
40940
0
          if (wuffs_base__status__is_error(&status)) {
40941
0
            goto exit;
40942
0
          } else if (wuffs_base__status__is_suspension(&status)) {
40943
0
            status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
40944
0
            goto exit;
40945
0
          }
40946
0
          goto ok;
40947
0
        }
40948
6.75k
      } else if (v_type == 2u) {
40949
4.73k
        if (a_src) {
40950
4.73k
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
40951
4.73k
        }
40952
6.27k
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
40953
6.27k
        status = wuffs_deflate__decoder__init_dynamic_huffman(self, a_src);
40954
6.27k
        if (a_src) {
40955
6.27k
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
40956
6.27k
        }
40957
6.27k
        if (status.repr) {
40958
1.83k
          goto suspend;
40959
1.83k
        }
40960
6.27k
      } else {
40961
26
        status = wuffs_base__make_status(wuffs_deflate__error__bad_block);
40962
26
        goto exit;
40963
26
      }
40964
11.1k
      self->private_impl.f_end_of_block = false;
40965
16.0k
      while (true) {
40966
16.0k
        if (sizeof(void*) == 4u) {
40967
0
          if (a_src) {
40968
0
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
40969
0
          }
40970
0
          v_status = wuffs_deflate__decoder__decode_huffman_fast32(self, a_dst, a_src);
40971
0
          if (a_src) {
40972
0
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
40973
0
          }
40974
16.0k
        } else {
40975
16.0k
          if (a_src) {
40976
16.0k
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
40977
16.0k
          }
40978
16.0k
          v_status = wuffs_deflate__decoder__decode_huffman_fast64(self, a_dst, a_src);
40979
16.0k
          if (a_src) {
40980
16.0k
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
40981
16.0k
          }
40982
16.0k
        }
40983
16.0k
        if (wuffs_base__status__is_error(&v_status)) {
40984
42
          status = v_status;
40985
42
          goto exit;
40986
42
        }
40987
16.0k
        if (self->private_impl.f_end_of_block) {
40988
4.05k
          goto label__outer__continue;
40989
4.05k
        }
40990
11.9k
        if (a_src) {
40991
11.9k
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
40992
11.9k
        }
40993
22.6k
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
40994
22.6k
        status = wuffs_deflate__decoder__decode_huffman_slow(self, a_dst, a_src);
40995
22.6k
        if (a_src) {
40996
22.6k
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
40997
22.6k
        }
40998
22.6k
        if (status.repr) {
40999
13.1k
          goto suspend;
41000
13.1k
        }
41001
9.42k
        if (self->private_impl.f_end_of_block) {
41002
4.51k
          goto label__outer__continue;
41003
4.51k
        }
41004
9.42k
      }
41005
11.1k
    }
41006
41007
2.32k
    ok:
41008
2.32k
    self->private_impl.p_decode_blocks = 0;
41009
2.32k
    goto exit;
41010
19.1k
  }
41011
41012
0
  goto suspend;
41013
16.7k
  suspend:
41014
16.7k
  self->private_impl.p_decode_blocks = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
41015
16.7k
  self->private_data.s_decode_blocks.v_final = v_final;
41016
41017
16.7k
  goto exit;
41018
19.1k
  exit:
41019
19.1k
  if (a_src && a_src->data.ptr) {
41020
19.1k
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
41021
19.1k
  }
41022
41023
19.1k
  return status;
41024
19.1k
}
41025
41026
// -------- func deflate.decoder.decode_uncompressed
41027
41028
WUFFS_BASE__GENERATED_C_CODE
41029
static wuffs_base__status
41030
wuffs_deflate__decoder__decode_uncompressed(
41031
    wuffs_deflate__decoder* self,
41032
    wuffs_base__io_buffer* a_dst,
41033
2.17k
    wuffs_base__io_buffer* a_src) {
41034
2.17k
  wuffs_base__status status = wuffs_base__make_status(NULL);
41035
41036
2.17k
  uint32_t v_length = 0;
41037
2.17k
  uint32_t v_n_copied = 0;
41038
41039
2.17k
  uint8_t* iop_a_dst = NULL;
41040
2.17k
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
41041
2.17k
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
41042
2.17k
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
41043
2.17k
  if (a_dst && a_dst->data.ptr) {
41044
2.17k
    io0_a_dst = a_dst->data.ptr;
41045
2.17k
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
41046
2.17k
    iop_a_dst = io1_a_dst;
41047
2.17k
    io2_a_dst = io0_a_dst + a_dst->data.len;
41048
2.17k
    if (a_dst->meta.closed) {
41049
0
      io2_a_dst = iop_a_dst;
41050
0
    }
41051
2.17k
  }
41052
2.17k
  const uint8_t* iop_a_src = NULL;
41053
2.17k
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
41054
2.17k
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
41055
2.17k
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
41056
2.17k
  if (a_src && a_src->data.ptr) {
41057
2.17k
    io0_a_src = a_src->data.ptr;
41058
2.17k
    io1_a_src = io0_a_src + a_src->meta.ri;
41059
2.17k
    iop_a_src = io1_a_src;
41060
2.17k
    io2_a_src = io0_a_src + a_src->meta.wi;
41061
2.17k
  }
41062
41063
2.17k
  uint32_t coro_susp_point = self->private_impl.p_decode_uncompressed;
41064
2.17k
  if (coro_susp_point) {
41065
966
    v_length = self->private_data.s_decode_uncompressed.v_length;
41066
966
  }
41067
2.17k
  switch (coro_susp_point) {
41068
1.20k
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
41069
41070
1.20k
    if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) {
41071
0
      status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits);
41072
0
      goto exit;
41073
0
    }
41074
1.20k
    self->private_impl.f_n_bits = 0u;
41075
1.20k
    self->private_impl.f_bits = 0u;
41076
1.20k
    {
41077
1.20k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
41078
1.20k
      uint32_t t_0;
41079
1.20k
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
41080
1.14k
        t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
41081
1.14k
        iop_a_src += 4;
41082
1.14k
      } else {
41083
62
        self->private_data.s_decode_uncompressed.scratch = 0;
41084
608
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
41085
712
        while (true) {
41086
712
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
41087
603
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
41088
603
            goto suspend;
41089
603
          }
41090
109
          uint64_t* scratch = &self->private_data.s_decode_uncompressed.scratch;
41091
109
          uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
41092
109
          *scratch <<= 8;
41093
109
          *scratch >>= 8;
41094
109
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
41095
109
          if (num_bits_0 == 24) {
41096
5
            t_0 = ((uint32_t)(*scratch));
41097
5
            break;
41098
5
          }
41099
104
          num_bits_0 += 8u;
41100
104
          *scratch |= ((uint64_t)(num_bits_0)) << 56;
41101
104
        }
41102
608
      }
41103
1.15k
      v_length = t_0;
41104
1.15k
    }
41105
1.15k
    if ((((v_length) & 0xFFFFu) + ((v_length) >> (32u - 16u))) != 65535u) {
41106
57
      status = wuffs_base__make_status(wuffs_deflate__error__inconsistent_stored_block_length);
41107
57
      goto exit;
41108
57
    }
41109
1.09k
    v_length = ((v_length) & 0xFFFFu);
41110
1.51k
    while (true) {
41111
1.51k
      v_n_copied = wuffs_private_impl__io_writer__limited_copy_u32_from_reader(
41112
1.51k
          &iop_a_dst, io2_a_dst,v_length, &iop_a_src, io2_a_src);
41113
1.51k
      if (v_length <= v_n_copied) {
41114
993
        status = wuffs_base__make_status(NULL);
41115
993
        goto ok;
41116
993
      }
41117
520
      v_length -= v_n_copied;
41118
520
      if (((uint64_t)(io2_a_dst - iop_a_dst)) == 0u) {
41119
51
        status = wuffs_base__make_status(wuffs_base__suspension__short_write);
41120
51
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3);
41121
469
      } else {
41122
469
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
41123
469
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4);
41124
374
      }
41125
520
    }
41126
41127
993
    ok:
41128
993
    self->private_impl.p_decode_uncompressed = 0;
41129
993
    goto exit;
41130
2.17k
  }
41131
41132
0
  goto suspend;
41133
1.12k
  suspend:
41134
1.12k
  self->private_impl.p_decode_uncompressed = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
41135
1.12k
  self->private_data.s_decode_uncompressed.v_length = v_length;
41136
41137
1.12k
  goto exit;
41138
2.17k
  exit:
41139
2.17k
  if (a_dst && a_dst->data.ptr) {
41140
2.17k
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
41141
2.17k
  }
41142
2.17k
  if (a_src && a_src->data.ptr) {
41143
2.17k
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
41144
2.17k
  }
41145
41146
2.17k
  return status;
41147
2.17k
}
41148
41149
// -------- func deflate.decoder.init_fixed_huffman
41150
41151
WUFFS_BASE__GENERATED_C_CODE
41152
static wuffs_base__status
41153
wuffs_deflate__decoder__init_fixed_huffman(
41154
6.75k
    wuffs_deflate__decoder* self) {
41155
6.75k
  uint32_t v_i = 0;
41156
6.75k
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
41157
41158
979k
  while (v_i < 144u) {
41159
972k
    self->private_data.f_code_lengths[v_i] = 8u;
41160
972k
    v_i += 1u;
41161
972k
  }
41162
763k
  while (v_i < 256u) {
41163
756k
    self->private_data.f_code_lengths[v_i] = 9u;
41164
756k
    v_i += 1u;
41165
756k
  }
41166
168k
  while (v_i < 280u) {
41167
162k
    self->private_data.f_code_lengths[v_i] = 7u;
41168
162k
    v_i += 1u;
41169
162k
  }
41170
60.8k
  while (v_i < 288u) {
41171
54.0k
    self->private_data.f_code_lengths[v_i] = 8u;
41172
54.0k
    v_i += 1u;
41173
54.0k
  }
41174
222k
  while (v_i < 320u) {
41175
216k
    self->private_data.f_code_lengths[v_i] = 5u;
41176
216k
    v_i += 1u;
41177
216k
  }
41178
6.75k
  v_status = wuffs_deflate__decoder__init_huff(self,
41179
6.75k
      0u,
41180
6.75k
      0u,
41181
6.75k
      288u,
41182
6.75k
      257u);
41183
6.75k
  if (wuffs_base__status__is_error(&v_status)) {
41184
0
    return v_status;
41185
0
  }
41186
6.75k
  v_status = wuffs_deflate__decoder__init_huff(self,
41187
6.75k
      1u,
41188
6.75k
      288u,
41189
6.75k
      320u,
41190
6.75k
      0u);
41191
6.75k
  if (wuffs_base__status__is_error(&v_status)) {
41192
0
    return v_status;
41193
0
  }
41194
6.75k
  return wuffs_base__make_status(NULL);
41195
6.75k
}
41196
41197
// -------- func deflate.decoder.init_dynamic_huffman
41198
41199
WUFFS_BASE__GENERATED_C_CODE
41200
static wuffs_base__status
41201
wuffs_deflate__decoder__init_dynamic_huffman(
41202
    wuffs_deflate__decoder* self,
41203
6.27k
    wuffs_base__io_buffer* a_src) {
41204
6.27k
  wuffs_base__status status = wuffs_base__make_status(NULL);
41205
41206
6.27k
  uint32_t v_bits = 0;
41207
6.27k
  uint32_t v_n_bits = 0;
41208
6.27k
  uint32_t v_b0 = 0;
41209
6.27k
  uint32_t v_n_lit = 0;
41210
6.27k
  uint32_t v_n_dist = 0;
41211
6.27k
  uint32_t v_n_clen = 0;
41212
6.27k
  uint32_t v_i = 0;
41213
6.27k
  uint32_t v_b1 = 0;
41214
6.27k
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
41215
6.27k
  uint32_t v_mask = 0;
41216
6.27k
  uint32_t v_table_entry = 0;
41217
6.27k
  uint32_t v_table_entry_n_bits = 0;
41218
6.27k
  uint32_t v_b2 = 0;
41219
6.27k
  uint32_t v_n_extra_bits = 0;
41220
6.27k
  uint8_t v_rep_symbol = 0;
41221
6.27k
  uint32_t v_rep_count = 0;
41222
6.27k
  uint32_t v_b3 = 0;
41223
41224
6.27k
  const uint8_t* iop_a_src = NULL;
41225
6.27k
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
41226
6.27k
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
41227
6.27k
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
41228
6.27k
  if (a_src && a_src->data.ptr) {
41229
6.27k
    io0_a_src = a_src->data.ptr;
41230
6.27k
    io1_a_src = io0_a_src + a_src->meta.ri;
41231
6.27k
    iop_a_src = io1_a_src;
41232
6.27k
    io2_a_src = io0_a_src + a_src->meta.wi;
41233
6.27k
  }
41234
41235
6.27k
  uint32_t coro_susp_point = self->private_impl.p_init_dynamic_huffman;
41236
6.27k
  if (coro_susp_point) {
41237
1.53k
    v_bits = self->private_data.s_init_dynamic_huffman.v_bits;
41238
1.53k
    v_n_bits = self->private_data.s_init_dynamic_huffman.v_n_bits;
41239
1.53k
    v_n_lit = self->private_data.s_init_dynamic_huffman.v_n_lit;
41240
1.53k
    v_n_dist = self->private_data.s_init_dynamic_huffman.v_n_dist;
41241
1.53k
    v_n_clen = self->private_data.s_init_dynamic_huffman.v_n_clen;
41242
1.53k
    v_i = self->private_data.s_init_dynamic_huffman.v_i;
41243
1.53k
    v_mask = self->private_data.s_init_dynamic_huffman.v_mask;
41244
1.53k
    v_n_extra_bits = self->private_data.s_init_dynamic_huffman.v_n_extra_bits;
41245
1.53k
    v_rep_symbol = self->private_data.s_init_dynamic_huffman.v_rep_symbol;
41246
1.53k
    v_rep_count = self->private_data.s_init_dynamic_huffman.v_rep_count;
41247
1.53k
  }
41248
6.27k
  switch (coro_susp_point) {
41249
4.73k
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
41250
41251
4.73k
    v_bits = self->private_impl.f_bits;
41252
4.73k
    v_n_bits = self->private_impl.f_n_bits;
41253
13.5k
    while (v_n_bits < 14u) {
41254
8.84k
      {
41255
9.23k
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
41256
9.23k
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
41257
422
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
41258
422
          goto suspend;
41259
422
        }
41260
8.81k
        uint32_t t_0 = *iop_a_src++;
41261
8.81k
        v_b0 = t_0;
41262
8.81k
      }
41263
0
      v_bits |= (v_b0 << v_n_bits);
41264
8.81k
      v_n_bits += 8u;
41265
8.81k
    }
41266
4.70k
    v_n_lit = (((v_bits) & 0x1Fu) + 257u);
41267
4.70k
    if (v_n_lit > 286u) {
41268
2
      status = wuffs_base__make_status(wuffs_deflate__error__bad_literal_length_code_count);
41269
2
      goto exit;
41270
2
    }
41271
4.70k
    v_bits >>= 5u;
41272
4.70k
    v_n_dist = (((v_bits) & 0x1Fu) + 1u);
41273
4.70k
    if (v_n_dist > 30u) {
41274
2
      status = wuffs_base__make_status(wuffs_deflate__error__bad_distance_code_count);
41275
2
      goto exit;
41276
2
    }
41277
4.70k
    v_bits >>= 5u;
41278
4.70k
    v_n_clen = (((v_bits) & 0xFu) + 4u);
41279
4.70k
    v_bits >>= 4u;
41280
4.70k
    v_n_bits -= 14u;
41281
4.70k
    v_i = 0u;
41282
85.5k
    while (v_i < v_n_clen) {
41283
109k
      while (v_n_bits < 3u) {
41284
28.1k
        {
41285
28.5k
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
41286
28.5k
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
41287
434
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
41288
434
            goto suspend;
41289
434
          }
41290
28.0k
          uint32_t t_1 = *iop_a_src++;
41291
28.0k
          v_b1 = t_1;
41292
28.0k
        }
41293
0
        v_bits |= (v_b1 << v_n_bits);
41294
28.0k
        v_n_bits += 8u;
41295
28.0k
      }
41296
80.8k
      self->private_data.f_code_lengths[WUFFS_DEFLATE__CODE_ORDER[v_i]] = ((uint8_t)((v_bits & 7u)));
41297
80.8k
      v_bits >>= 3u;
41298
80.8k
      v_n_bits -= 3u;
41299
80.8k
      v_i += 1u;
41300
80.8k
    }
41301
12.3k
    while (v_i < 19u) {
41302
7.72k
      self->private_data.f_code_lengths[WUFFS_DEFLATE__CODE_ORDER[v_i]] = 0u;
41303
7.72k
      v_i += 1u;
41304
7.72k
    }
41305
4.65k
    v_status = wuffs_deflate__decoder__init_huff(self,
41306
4.65k
        0u,
41307
4.65k
        0u,
41308
4.65k
        19u,
41309
4.65k
        4095u);
41310
4.65k
    if (wuffs_base__status__is_error(&v_status)) {
41311
39
      status = v_status;
41312
39
      goto exit;
41313
39
    }
41314
4.61k
    v_mask = ((((uint32_t)(1u)) << self->private_impl.f_n_huffs_bits[0u]) - 1u);
41315
4.61k
    v_i = 0u;
41316
340k
    while (v_i < (v_n_lit + v_n_dist)) {
41317
475k
      while (true) {
41318
475k
        v_table_entry = self->private_data.f_huffs[0u][(v_bits & v_mask)];
41319
475k
        v_table_entry_n_bits = (v_table_entry & 15u);
41320
475k
        if (v_n_bits >= v_table_entry_n_bits) {
41321
335k
          v_bits >>= v_table_entry_n_bits;
41322
335k
          v_n_bits -= v_table_entry_n_bits;
41323
335k
          break;
41324
335k
        }
41325
139k
        {
41326
139k
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
41327
139k
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
41328
450
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
41329
450
            goto suspend;
41330
450
          }
41331
139k
          uint32_t t_2 = *iop_a_src++;
41332
139k
          v_b2 = t_2;
41333
139k
        }
41334
0
        v_bits |= (v_b2 << v_n_bits);
41335
139k
        v_n_bits += 8u;
41336
139k
      }
41337
335k
      if ((v_table_entry >> 24u) != 128u) {
41338
0
        status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
41339
0
        goto exit;
41340
0
      }
41341
335k
      v_table_entry = ((v_table_entry >> 8u) & 255u);
41342
335k
      if (v_table_entry < 16u) {
41343
290k
        self->private_data.f_code_lengths[v_i] = ((uint8_t)(v_table_entry));
41344
290k
        v_i += 1u;
41345
290k
        continue;
41346
290k
      }
41347
45.1k
      v_n_extra_bits = 0u;
41348
45.1k
      v_rep_symbol = 0u;
41349
45.1k
      v_rep_count = 0u;
41350
45.1k
      if (v_table_entry == 16u) {
41351
24.8k
        v_n_extra_bits = 2u;
41352
24.8k
        if (v_i <= 0u) {
41353
7
          status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_length_repetition);
41354
7
          goto exit;
41355
7
        }
41356
24.8k
        v_rep_symbol = ((uint8_t)(self->private_data.f_code_lengths[(v_i - 1u)] & 15u));
41357
24.8k
        v_rep_count = 3u;
41358
24.8k
      } else if (v_table_entry == 17u) {
41359
11.0k
        v_n_extra_bits = 3u;
41360
11.0k
        v_rep_symbol = 0u;
41361
11.0k
        v_rep_count = 3u;
41362
11.0k
      } else if (v_table_entry == 18u) {
41363
9.28k
        v_n_extra_bits = 7u;
41364
9.28k
        v_rep_symbol = 0u;
41365
9.28k
        v_rep_count = 11u;
41366
9.28k
      } else {
41367
0
        status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
41368
0
        goto exit;
41369
0
      }
41370
62.3k
      while (v_n_bits < v_n_extra_bits) {
41371
17.2k
        {
41372
17.6k
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
41373
17.6k
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
41374
414
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
41375
414
            goto suspend;
41376
414
          }
41377
17.2k
          uint32_t t_3 = *iop_a_src++;
41378
17.2k
          v_b3 = t_3;
41379
17.2k
        }
41380
0
        v_bits |= (v_b3 << v_n_bits);
41381
17.2k
        v_n_bits += 8u;
41382
17.2k
      }
41383
45.1k
      v_rep_count += ((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(v_n_extra_bits));
41384
45.1k
      v_bits >>= v_n_extra_bits;
41385
45.1k
      v_n_bits -= v_n_extra_bits;
41386
1.08M
      while (v_rep_count > 0u) {
41387
1.03M
        if (v_i >= (v_n_lit + v_n_dist)) {
41388
4
          status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_length_count);
41389
4
          goto exit;
41390
4
        }
41391
1.03M
        self->private_data.f_code_lengths[v_i] = v_rep_symbol;
41392
1.03M
        v_i += 1u;
41393
1.03M
        v_rep_count -= 1u;
41394
1.03M
      }
41395
45.1k
    }
41396
4.49k
    if (v_i != (v_n_lit + v_n_dist)) {
41397
0
      status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_length_count);
41398
0
      goto exit;
41399
0
    }
41400
4.49k
    if (self->private_data.f_code_lengths[256u] == 0u) {
41401
1
      status = wuffs_base__make_status(wuffs_deflate__error__missing_end_of_block_code);
41402
1
      goto exit;
41403
1
    }
41404
4.49k
    v_status = wuffs_deflate__decoder__init_huff(self,
41405
4.49k
        0u,
41406
4.49k
        0u,
41407
4.49k
        v_n_lit,
41408
4.49k
        257u);
41409
4.49k
    if (wuffs_base__status__is_error(&v_status)) {
41410
16
      status = v_status;
41411
16
      goto exit;
41412
16
    }
41413
4.48k
    v_status = wuffs_deflate__decoder__init_huff(self,
41414
4.48k
        1u,
41415
4.48k
        v_n_lit,
41416
4.48k
        (v_n_lit + v_n_dist),
41417
4.48k
        0u);
41418
4.48k
    if (wuffs_base__status__is_error(&v_status)) {
41419
47
      status = v_status;
41420
47
      goto exit;
41421
47
    }
41422
4.43k
    self->private_impl.f_bits = v_bits;
41423
4.43k
    self->private_impl.f_n_bits = v_n_bits;
41424
41425
4.43k
    goto ok;
41426
4.43k
    ok:
41427
4.43k
    self->private_impl.p_init_dynamic_huffman = 0;
41428
4.43k
    goto exit;
41429
6.27k
  }
41430
41431
0
  goto suspend;
41432
1.72k
  suspend:
41433
1.72k
  self->private_impl.p_init_dynamic_huffman = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
41434
1.72k
  self->private_data.s_init_dynamic_huffman.v_bits = v_bits;
41435
1.72k
  self->private_data.s_init_dynamic_huffman.v_n_bits = v_n_bits;
41436
1.72k
  self->private_data.s_init_dynamic_huffman.v_n_lit = v_n_lit;
41437
1.72k
  self->private_data.s_init_dynamic_huffman.v_n_dist = v_n_dist;
41438
1.72k
  self->private_data.s_init_dynamic_huffman.v_n_clen = v_n_clen;
41439
1.72k
  self->private_data.s_init_dynamic_huffman.v_i = v_i;
41440
1.72k
  self->private_data.s_init_dynamic_huffman.v_mask = v_mask;
41441
1.72k
  self->private_data.s_init_dynamic_huffman.v_n_extra_bits = v_n_extra_bits;
41442
1.72k
  self->private_data.s_init_dynamic_huffman.v_rep_symbol = v_rep_symbol;
41443
1.72k
  self->private_data.s_init_dynamic_huffman.v_rep_count = v_rep_count;
41444
41445
1.72k
  goto exit;
41446
6.27k
  exit:
41447
6.27k
  if (a_src && a_src->data.ptr) {
41448
6.27k
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
41449
6.27k
  }
41450
41451
6.27k
  return status;
41452
6.27k
}
41453
41454
// -------- func deflate.decoder.init_huff
41455
41456
WUFFS_BASE__GENERATED_C_CODE
41457
static wuffs_base__status
41458
wuffs_deflate__decoder__init_huff(
41459
    wuffs_deflate__decoder* self,
41460
    uint32_t a_which,
41461
    uint32_t a_n_codes0,
41462
    uint32_t a_n_codes1,
41463
27.1k
    uint32_t a_base_symbol) {
41464
27.1k
  uint16_t v_counts[16] = {0};
41465
27.1k
  uint32_t v_i = 0;
41466
27.1k
  uint32_t v_remaining = 0;
41467
27.1k
  uint16_t v_offsets[16] = {0};
41468
27.1k
  uint32_t v_n_symbols = 0;
41469
27.1k
  uint32_t v_count = 0;
41470
27.1k
  uint16_t v_symbols[320] = {0};
41471
27.1k
  uint32_t v_min_cl = 0;
41472
27.1k
  uint32_t v_max_cl = 0;
41473
27.1k
  uint32_t v_initial_high_bits = 0;
41474
27.1k
  uint32_t v_prev_cl = 0;
41475
27.1k
  uint32_t v_prev_redirect_key = 0;
41476
27.1k
  uint32_t v_top = 0;
41477
27.1k
  uint32_t v_next_top = 0;
41478
27.1k
  uint32_t v_code = 0;
41479
27.1k
  uint32_t v_key = 0;
41480
27.1k
  uint32_t v_value = 0;
41481
27.1k
  uint32_t v_cl = 0;
41482
27.1k
  uint32_t v_redirect_key = 0;
41483
27.1k
  uint32_t v_j = 0;
41484
27.1k
  uint32_t v_reversed_key = 0;
41485
27.1k
  uint32_t v_symbol = 0;
41486
27.1k
  uint32_t v_high_bits = 0;
41487
27.1k
  uint32_t v_delta = 0;
41488
41489
27.1k
  v_i = a_n_codes0;
41490
3.59M
  while (v_i < a_n_codes1) {
41491
3.57M
    if (v_counts[((uint8_t)(self->private_data.f_code_lengths[v_i] & 15u))] >= 320u) {
41492
0
      return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
41493
0
    }
41494
3.57M
#if defined(__GNUC__)
41495
3.57M
#pragma GCC diagnostic push
41496
3.57M
#pragma GCC diagnostic ignored "-Wconversion"
41497
3.57M
#endif
41498
3.57M
    v_counts[((uint8_t)(self->private_data.f_code_lengths[v_i] & 15u))] += 1u;
41499
3.57M
#if defined(__GNUC__)
41500
3.57M
#pragma GCC diagnostic pop
41501
3.57M
#endif
41502
3.57M
    v_i += 1u;
41503
3.57M
  }
41504
27.1k
  if ((((uint32_t)(v_counts[0u])) + a_n_codes0) == a_n_codes1) {
41505
6
    return wuffs_base__make_status(wuffs_deflate__error__no_huffman_codes);
41506
6
  }
41507
27.1k
  v_remaining = 1u;
41508
27.1k
  v_i = 1u;
41509
433k
  while (v_i <= 15u) {
41510
406k
    if (v_remaining > 1073741824u) {
41511
0
      return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
41512
0
    }
41513
406k
    v_remaining <<= 1u;
41514
406k
    if (v_remaining < ((uint32_t)(v_counts[v_i]))) {
41515
22
      return wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_over_subscribed);
41516
22
    }
41517
406k
    v_remaining -= ((uint32_t)(v_counts[v_i]));
41518
406k
    v_i += 1u;
41519
406k
  }
41520
27.1k
  if (v_remaining != 0u) {
41521
1.45k
    if ((a_which == 1u) && (v_counts[1u] == 1u) && ((((uint32_t)(v_counts[0u])) + a_n_codes0 + 1u) == a_n_codes1)) {
41522
1.38k
      v_i = 0u;
41523
3.05k
      while (v_i <= 29u) {
41524
3.05k
        if (self->private_data.f_code_lengths[(a_n_codes0 + v_i)] == 1u) {
41525
1.38k
          self->private_impl.f_n_huffs_bits[1u] = 1u;
41526
1.38k
          self->private_data.f_huffs[1u][0u] = (WUFFS_DEFLATE__DCODE_MAGIC_NUMBERS[v_i] | 1u);
41527
1.38k
          self->private_data.f_huffs[1u][1u] = (WUFFS_DEFLATE__DCODE_MAGIC_NUMBERS[31u] | 1u);
41528
1.38k
          return wuffs_base__make_status(NULL);
41529
1.38k
        }
41530
1.67k
        v_i += 1u;
41531
1.67k
      }
41532
1.38k
    }
41533
74
    return wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_under_subscribed);
41534
1.45k
  }
41535
25.6k
  v_i = 1u;
41536
410k
  while (v_i <= 15u) {
41537
384k
    v_offsets[v_i] = ((uint16_t)(v_n_symbols));
41538
384k
    v_count = ((uint32_t)(v_counts[v_i]));
41539
384k
    if (v_n_symbols > (320u - v_count)) {
41540
0
      return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
41541
0
    }
41542
384k
    v_n_symbols = (v_n_symbols + v_count);
41543
384k
    v_i += 1u;
41544
384k
  }
41545
25.6k
  if (v_n_symbols > 288u) {
41546
0
    return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
41547
0
  }
41548
25.6k
  v_i = a_n_codes0;
41549
3.58M
  while (v_i < a_n_codes1) {
41550
3.55M
    if (v_i < a_n_codes0) {
41551
0
      return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
41552
0
    }
41553
3.55M
    if (self->private_data.f_code_lengths[v_i] != 0u) {
41554
2.58M
      if (v_offsets[((uint8_t)(self->private_data.f_code_lengths[v_i] & 15u))] >= 320u) {
41555
0
        return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
41556
0
      }
41557
2.58M
      v_symbols[v_offsets[((uint8_t)(self->private_data.f_code_lengths[v_i] & 15u))]] = ((uint16_t)((v_i - a_n_codes0)));
41558
2.58M
#if defined(__GNUC__)
41559
2.58M
#pragma GCC diagnostic push
41560
2.58M
#pragma GCC diagnostic ignored "-Wconversion"
41561
2.58M
#endif
41562
2.58M
      v_offsets[((uint8_t)(self->private_data.f_code_lengths[v_i] & 15u))] += 1u;
41563
2.58M
#if defined(__GNUC__)
41564
2.58M
#pragma GCC diagnostic pop
41565
2.58M
#endif
41566
2.58M
    }
41567
3.55M
    v_i += 1u;
41568
3.55M
  }
41569
25.6k
  v_min_cl = 1u;
41570
103k
  while (true) {
41571
103k
    if (v_counts[v_min_cl] != 0u) {
41572
25.6k
      break;
41573
25.6k
    }
41574
77.7k
    if (v_min_cl >= 9u) {
41575
0
      return wuffs_base__make_status(wuffs_deflate__error__bad_huffman_minimum_code_length);
41576
0
    }
41577
77.7k
    v_min_cl += 1u;
41578
77.7k
  }
41579
25.6k
  v_max_cl = 15u;
41580
234k
  while (true) {
41581
234k
    if (v_counts[v_max_cl] != 0u) {
41582
25.6k
      break;
41583
25.6k
    }
41584
208k
    if (v_max_cl <= 1u) {
41585
0
      return wuffs_base__make_status(wuffs_deflate__error__no_huffman_codes);
41586
0
    }
41587
208k
    v_max_cl -= 1u;
41588
208k
  }
41589
25.6k
  if (v_max_cl <= 9u) {
41590
22.8k
    self->private_impl.f_n_huffs_bits[a_which] = v_max_cl;
41591
22.8k
  } else {
41592
2.81k
    self->private_impl.f_n_huffs_bits[a_which] = 9u;
41593
2.81k
  }
41594
25.6k
  v_i = 0u;
41595
25.6k
  if ((v_n_symbols != ((uint32_t)(v_offsets[v_max_cl]))) || (v_n_symbols != ((uint32_t)(v_offsets[15u])))) {
41596
0
    return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
41597
0
  }
41598
25.6k
  if ((a_n_codes0 + ((uint32_t)(v_symbols[0u]))) >= 320u) {
41599
0
    return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
41600
0
  }
41601
25.6k
  v_initial_high_bits = 512u;
41602
25.6k
  if (v_max_cl < 9u) {
41603
15.1k
    v_initial_high_bits = (((uint32_t)(1u)) << v_max_cl);
41604
15.1k
  }
41605
25.6k
  v_prev_cl = ((uint32_t)(((uint8_t)(self->private_data.f_code_lengths[(a_n_codes0 + ((uint32_t)(v_symbols[0u])))] & 15u))));
41606
25.6k
  v_prev_redirect_key = 4294967295u;
41607
25.6k
  v_top = 0u;
41608
25.6k
  v_next_top = 512u;
41609
25.6k
  v_code = 0u;
41610
25.6k
  v_key = 0u;
41611
25.6k
  v_value = 0u;
41612
2.58M
  while (true) {
41613
2.58M
    if ((a_n_codes0 + ((uint32_t)(v_symbols[v_i]))) >= 320u) {
41614
0
      return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
41615
0
    }
41616
2.58M
    v_cl = ((uint32_t)(((uint8_t)(self->private_data.f_code_lengths[(a_n_codes0 + ((uint32_t)(v_symbols[v_i])))] & 15u))));
41617
2.58M
    if (v_cl > v_prev_cl) {
41618
63.5k
      v_code <<= (v_cl - v_prev_cl);
41619
63.5k
      if (v_code >= 32768u) {
41620
0
        return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
41621
0
      }
41622
63.5k
    }
41623
2.58M
    v_prev_cl = v_cl;
41624
2.58M
    v_key = v_code;
41625
2.58M
    if (v_cl > 9u) {
41626
147k
      v_cl -= 9u;
41627
147k
      v_redirect_key = ((v_key >> v_cl) & 511u);
41628
147k
      v_key = ((v_key) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(v_cl));
41629
147k
      if (v_prev_redirect_key != v_redirect_key) {
41630
26.2k
        v_prev_redirect_key = v_redirect_key;
41631
26.2k
        v_remaining = (((uint32_t)(1u)) << v_cl);
41632
26.2k
        v_j = v_prev_cl;
41633
31.7k
        while (v_j <= 15u) {
41634
31.7k
          if (v_remaining <= ((uint32_t)(v_counts[v_j]))) {
41635
26.2k
            break;
41636
26.2k
          }
41637
5.52k
          v_remaining -= ((uint32_t)(v_counts[v_j]));
41638
5.52k
          if (v_remaining > 1073741824u) {
41639
0
            return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
41640
0
          }
41641
5.52k
          v_remaining <<= 1u;
41642
5.52k
          v_j += 1u;
41643
5.52k
        }
41644
26.2k
        if ((v_j <= 9u) || (15u < v_j)) {
41645
0
          return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
41646
0
        }
41647
26.2k
        v_j -= 9u;
41648
26.2k
        v_initial_high_bits = (((uint32_t)(1u)) << v_j);
41649
26.2k
        v_top = v_next_top;
41650
26.2k
        if ((v_top + (((uint32_t)(1u)) << v_j)) > 1024u) {
41651
0
          return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
41652
0
        }
41653
26.2k
        v_next_top = (v_top + (((uint32_t)(1u)) << v_j));
41654
26.2k
        v_redirect_key = (((uint32_t)(WUFFS_DEFLATE__REVERSE8[(v_redirect_key >> 1u)])) | ((v_redirect_key & 1u) << 8u));
41655
26.2k
        self->private_data.f_huffs[a_which][v_redirect_key] = (268435465u | (v_top << 8u) | (v_j << 4u));
41656
26.2k
      }
41657
147k
    }
41658
2.58M
    if ((v_key >= 512u) || (v_counts[v_prev_cl] <= 0u)) {
41659
0
      return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
41660
0
    }
41661
2.58M
#if defined(__GNUC__)
41662
2.58M
#pragma GCC diagnostic push
41663
2.58M
#pragma GCC diagnostic ignored "-Wconversion"
41664
2.58M
#endif
41665
2.58M
    v_counts[v_prev_cl] -= 1u;
41666
2.58M
#if defined(__GNUC__)
41667
2.58M
#pragma GCC diagnostic pop
41668
2.58M
#endif
41669
2.58M
    v_reversed_key = (((uint32_t)(WUFFS_DEFLATE__REVERSE8[(v_key >> 1u)])) | ((v_key & 1u) << 8u));
41670
2.58M
    v_reversed_key >>= (9u - v_cl);
41671
2.58M
    v_symbol = ((uint32_t)(v_symbols[v_i]));
41672
2.58M
    if (v_symbol == 256u) {
41673
11.2k
      v_value = (536870912u | v_cl);
41674
2.57M
    } else if ((v_symbol < 256u) && (a_which == 0u)) {
41675
2.05M
      v_value = (2147483648u | (v_symbol << 8u) | v_cl);
41676
2.05M
    } else if (v_symbol >= a_base_symbol) {
41677
525k
      v_symbol -= a_base_symbol;
41678
525k
      if (a_which == 0u) {
41679
266k
        v_value = (WUFFS_DEFLATE__LCODE_MAGIC_NUMBERS[(v_symbol & 31u)] | v_cl);
41680
266k
      } else {
41681
259k
        v_value = (WUFFS_DEFLATE__DCODE_MAGIC_NUMBERS[(v_symbol & 31u)] | v_cl);
41682
259k
      }
41683
525k
    } else {
41684
0
      return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
41685
0
    }
41686
2.58M
    v_high_bits = v_initial_high_bits;
41687
2.58M
    v_delta = (((uint32_t)(1u)) << v_cl);
41688
8.89M
    while (v_high_bits >= v_delta) {
41689
6.30M
      v_high_bits -= v_delta;
41690
6.30M
      if ((v_top + ((v_high_bits | v_reversed_key) & 511u)) >= 1024u) {
41691
0
        return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
41692
0
      }
41693
6.30M
      self->private_data.f_huffs[a_which][(v_top + ((v_high_bits | v_reversed_key) & 511u))] = v_value;
41694
6.30M
    }
41695
2.58M
    v_i += 1u;
41696
2.58M
    if (v_i >= v_n_symbols) {
41697
25.6k
      break;
41698
25.6k
    }
41699
2.56M
    v_code += 1u;
41700
2.56M
    if (v_code >= 32768u) {
41701
0
      return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
41702
0
    }
41703
2.56M
  }
41704
25.6k
  return wuffs_base__make_status(NULL);
41705
25.6k
}
41706
41707
// โ€ผ WUFFS MULTI-FILE SECTION +x86_bmi2
41708
// -------- func deflate.decoder.decode_huffman_bmi2
41709
41710
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
41711
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("bmi2")
41712
WUFFS_BASE__GENERATED_C_CODE
41713
static wuffs_base__status
41714
wuffs_deflate__decoder__decode_huffman_bmi2(
41715
    wuffs_deflate__decoder* self,
41716
    wuffs_base__io_buffer* a_dst,
41717
16.0k
    wuffs_base__io_buffer* a_src) {
41718
16.0k
  wuffs_base__status status = wuffs_base__make_status(NULL);
41719
41720
16.0k
  uint64_t v_bits = 0;
41721
16.0k
  uint32_t v_n_bits = 0;
41722
16.0k
  uint32_t v_table_entry = 0;
41723
16.0k
  uint32_t v_table_entry_n_bits = 0;
41724
16.0k
  uint64_t v_lmask = 0;
41725
16.0k
  uint64_t v_dmask = 0;
41726
16.0k
  uint32_t v_redir_top = 0;
41727
16.0k
  uint32_t v_redir_mask = 0;
41728
16.0k
  uint32_t v_length = 0;
41729
16.0k
  uint32_t v_dist_minus_1 = 0;
41730
16.0k
  uint32_t v_hlen = 0;
41731
16.0k
  uint32_t v_hdist = 0;
41732
16.0k
  uint32_t v_hdist_adjustment = 0;
41733
41734
16.0k
  uint8_t* iop_a_dst = NULL;
41735
16.0k
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
41736
16.0k
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
41737
16.0k
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
41738
16.0k
  if (a_dst && a_dst->data.ptr) {
41739
16.0k
    io0_a_dst = a_dst->data.ptr;
41740
16.0k
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
41741
16.0k
    iop_a_dst = io1_a_dst;
41742
16.0k
    io2_a_dst = io0_a_dst + a_dst->data.len;
41743
16.0k
    if (a_dst->meta.closed) {
41744
0
      io2_a_dst = iop_a_dst;
41745
0
    }
41746
16.0k
  }
41747
16.0k
  const uint8_t* iop_a_src = NULL;
41748
16.0k
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
41749
16.0k
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
41750
16.0k
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
41751
16.0k
  if (a_src && a_src->data.ptr) {
41752
16.0k
    io0_a_src = a_src->data.ptr;
41753
16.0k
    io1_a_src = io0_a_src + a_src->meta.ri;
41754
16.0k
    iop_a_src = io1_a_src;
41755
16.0k
    io2_a_src = io0_a_src + a_src->meta.wi;
41756
16.0k
  }
41757
41758
16.0k
  if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) {
41759
0
    status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits);
41760
0
    goto exit;
41761
0
  }
41762
16.0k
  v_bits = ((uint64_t)(self->private_impl.f_bits));
41763
16.0k
  v_n_bits = self->private_impl.f_n_bits;
41764
16.0k
  v_lmask = ((((uint64_t)(1u)) << self->private_impl.f_n_huffs_bits[0u]) - 1u);
41765
16.0k
  v_dmask = ((((uint64_t)(1u)) << self->private_impl.f_n_huffs_bits[1u]) - 1u);
41766
16.0k
  if (self->private_impl.f_transformed_history_count < (a_dst ? a_dst->meta.pos : 0u)) {
41767
0
    status = wuffs_base__make_status(wuffs_base__error__bad_i_o_position);
41768
0
    goto exit;
41769
0
  }
41770
16.0k
  v_hdist_adjustment = ((uint32_t)((self->private_impl.f_transformed_history_count - (a_dst ? a_dst->meta.pos : 0u))));
41771
214k
  label__loop__continue:;
41772
26.1M
  while ((((uint64_t)(io2_a_dst - iop_a_dst)) >= 266u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 8u)) {
41773
26.1M
    v_bits |= ((uint64_t)(wuffs_base__peek_u64le__no_bounds_check(iop_a_src) << (v_n_bits & 63u)));
41774
26.1M
    iop_a_src += ((63u - (v_n_bits & 63u)) >> 3u);
41775
26.1M
    v_n_bits |= 56u;
41776
26.1M
    v_table_entry = self->private_data.f_huffs[0u][(v_bits & v_lmask)];
41777
26.1M
    v_table_entry_n_bits = (v_table_entry & 15u);
41778
26.1M
    v_bits >>= v_table_entry_n_bits;
41779
26.1M
    v_n_bits -= v_table_entry_n_bits;
41780
26.1M
    if ((v_table_entry >> 31u) != 0u) {
41781
17.8M
      (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1);
41782
17.8M
      continue;
41783
17.8M
    } else if ((v_table_entry >> 30u) != 0u) {
41784
7.88M
    } else if ((v_table_entry >> 29u) != 0u) {
41785
3.07k
      self->private_impl.f_end_of_block = true;
41786
3.07k
      break;
41787
438k
    } else if ((v_table_entry >> 28u) != 0u) {
41788
438k
      v_redir_top = ((v_table_entry >> 8u) & 65535u);
41789
438k
      v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u);
41790
438k
      v_table_entry = self->private_data.f_huffs[0u][((v_redir_top + (((uint32_t)(v_bits)) & v_redir_mask)) & 1023u)];
41791
438k
      v_table_entry_n_bits = (v_table_entry & 15u);
41792
438k
      v_bits >>= v_table_entry_n_bits;
41793
438k
      v_n_bits -= v_table_entry_n_bits;
41794
438k
      if ((v_table_entry >> 31u) != 0u) {
41795
387k
        (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1);
41796
387k
        continue;
41797
387k
      } else if ((v_table_entry >> 30u) != 0u) {
41798
49.5k
      } else if ((v_table_entry >> 29u) != 0u) {
41799
982
        self->private_impl.f_end_of_block = true;
41800
982
        break;
41801
982
      } else if ((v_table_entry >> 28u) != 0u) {
41802
0
        status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
41803
0
        goto exit;
41804
0
      } else if ((v_table_entry >> 27u) != 0u) {
41805
0
        status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code);
41806
0
        goto exit;
41807
0
      } else {
41808
0
        status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
41809
0
        goto exit;
41810
0
      }
41811
438k
    } else if ((v_table_entry >> 27u) != 0u) {
41812
2
      status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code);
41813
2
      goto exit;
41814
2
    } else {
41815
0
      status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
41816
0
      goto exit;
41817
0
    }
41818
7.93M
    v_length = (((v_table_entry >> 8u) & 255u) + 3u);
41819
7.93M
    v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u);
41820
7.93M
    if (v_table_entry_n_bits > 0u) {
41821
519k
      v_length = (((v_length + 253u + ((uint32_t)(((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U64(v_table_entry_n_bits))))) & 255u) + 3u);
41822
519k
      v_bits >>= v_table_entry_n_bits;
41823
519k
      v_n_bits -= v_table_entry_n_bits;
41824
519k
    }
41825
7.93M
    v_table_entry = self->private_data.f_huffs[1u][(v_bits & v_dmask)];
41826
7.93M
    v_table_entry_n_bits = (v_table_entry & 15u);
41827
7.93M
    v_bits >>= v_table_entry_n_bits;
41828
7.93M
    v_n_bits -= v_table_entry_n_bits;
41829
7.93M
    if ((v_table_entry >> 28u) == 1u) {
41830
1.08k
      v_redir_top = ((v_table_entry >> 8u) & 65535u);
41831
1.08k
      v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u);
41832
1.08k
      v_table_entry = self->private_data.f_huffs[1u][((v_redir_top + (((uint32_t)(v_bits)) & v_redir_mask)) & 1023u)];
41833
1.08k
      v_table_entry_n_bits = (v_table_entry & 15u);
41834
1.08k
      v_bits >>= v_table_entry_n_bits;
41835
1.08k
      v_n_bits -= v_table_entry_n_bits;
41836
1.08k
    }
41837
7.93M
    if ((v_table_entry >> 24u) != 64u) {
41838
3
      if ((v_table_entry >> 24u) == 8u) {
41839
3
        status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code);
41840
3
        goto exit;
41841
3
      }
41842
0
      status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
41843
0
      goto exit;
41844
3
    }
41845
7.93M
    v_dist_minus_1 = ((v_table_entry >> 8u) & 32767u);
41846
7.93M
    v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u);
41847
7.93M
    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);
41848
7.93M
    v_bits >>= v_table_entry_n_bits;
41849
7.93M
    v_n_bits -= v_table_entry_n_bits;
41850
7.93M
    do {
41851
7.93M
      if (((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) {
41852
199k
        v_hlen = 0u;
41853
199k
        v_hdist = ((uint32_t)((((uint64_t)((v_dist_minus_1 + 1u))) - ((uint64_t)(iop_a_dst - io0_a_dst)))));
41854
199k
        if (v_length > v_hdist) {
41855
648
          v_length -= v_hdist;
41856
648
          v_hlen = v_hdist;
41857
198k
        } else {
41858
198k
          v_hlen = v_length;
41859
198k
          v_length = 0u;
41860
198k
        }
41861
199k
        v_hdist += v_hdist_adjustment;
41862
199k
        if (self->private_impl.f_history_index < v_hdist) {
41863
37
          status = wuffs_base__make_status(wuffs_deflate__error__bad_distance);
41864
37
          goto exit;
41865
37
        }
41866
199k
        wuffs_private_impl__io_writer__limited_copy_u32_from_slice(
41867
199k
            &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));
41868
199k
        if (v_length == 0u) {
41869
198k
          goto label__loop__continue;
41870
198k
        }
41871
636
        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)))) {
41872
0
          status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_distance);
41873
0
          goto exit;
41874
0
        }
41875
636
      }
41876
7.73M
      if ((v_dist_minus_1 + 1u) >= 8u) {
41877
935k
        wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast(
41878
935k
            &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u));
41879
6.79M
      } else if ((v_dist_minus_1 + 1u) == 1u) {
41880
2.84M
        wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast(
41881
2.84M
            &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u));
41882
3.95M
      } else {
41883
3.95M
        wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast(
41884
3.95M
            &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u));
41885
3.95M
      }
41886
7.73M
    } while (0);
41887
7.93M
  }
41888
16.0k
  if (v_n_bits > 63u) {
41889
0
    status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits);
41890
0
    goto exit;
41891
0
  }
41892
70.9k
  while (v_n_bits >= 8u) {
41893
54.8k
    v_n_bits -= 8u;
41894
54.8k
    if (iop_a_src > io1_a_src) {
41895
54.8k
      iop_a_src--;
41896
54.8k
    } else {
41897
0
      status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_i_o);
41898
0
      goto exit;
41899
0
    }
41900
54.8k
  }
41901
16.0k
  self->private_impl.f_bits = ((uint32_t)((v_bits & ((((uint64_t)(1u)) << v_n_bits) - 1u))));
41902
16.0k
  self->private_impl.f_n_bits = v_n_bits;
41903
16.0k
  if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> self->private_impl.f_n_bits) != 0u)) {
41904
0
    status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits);
41905
0
    goto exit;
41906
0
  }
41907
16.0k
  goto exit;
41908
16.0k
  exit:
41909
16.0k
  if (a_dst && a_dst->data.ptr) {
41910
16.0k
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
41911
16.0k
  }
41912
16.0k
  if (a_src && a_src->data.ptr) {
41913
16.0k
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
41914
16.0k
  }
41915
41916
16.0k
  return status;
41917
16.0k
}
41918
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
41919
// โ€ผ WUFFS MULTI-FILE SECTION -x86_bmi2
41920
41921
// -------- func deflate.decoder.decode_huffman_fast32
41922
41923
WUFFS_BASE__GENERATED_C_CODE
41924
static wuffs_base__status
41925
wuffs_deflate__decoder__decode_huffman_fast32(
41926
    wuffs_deflate__decoder* self,
41927
    wuffs_base__io_buffer* a_dst,
41928
0
    wuffs_base__io_buffer* a_src) {
41929
0
  wuffs_base__status status = wuffs_base__make_status(NULL);
41930
0
41931
0
  uint32_t v_bits = 0;
41932
0
  uint32_t v_n_bits = 0;
41933
0
  uint32_t v_table_entry = 0;
41934
0
  uint32_t v_table_entry_n_bits = 0;
41935
0
  uint32_t v_lmask = 0;
41936
0
  uint32_t v_dmask = 0;
41937
0
  uint32_t v_redir_top = 0;
41938
0
  uint32_t v_redir_mask = 0;
41939
0
  uint32_t v_length = 0;
41940
0
  uint32_t v_dist_minus_1 = 0;
41941
0
  uint32_t v_hlen = 0;
41942
0
  uint32_t v_hdist = 0;
41943
0
  uint32_t v_hdist_adjustment = 0;
41944
0
41945
0
  uint8_t* iop_a_dst = NULL;
41946
0
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
41947
0
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
41948
0
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
41949
0
  if (a_dst && a_dst->data.ptr) {
41950
0
    io0_a_dst = a_dst->data.ptr;
41951
0
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
41952
0
    iop_a_dst = io1_a_dst;
41953
0
    io2_a_dst = io0_a_dst + a_dst->data.len;
41954
0
    if (a_dst->meta.closed) {
41955
0
      io2_a_dst = iop_a_dst;
41956
0
    }
41957
0
  }
41958
0
  const uint8_t* iop_a_src = NULL;
41959
0
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
41960
0
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
41961
0
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
41962
0
  if (a_src && a_src->data.ptr) {
41963
0
    io0_a_src = a_src->data.ptr;
41964
0
    io1_a_src = io0_a_src + a_src->meta.ri;
41965
0
    iop_a_src = io1_a_src;
41966
0
    io2_a_src = io0_a_src + a_src->meta.wi;
41967
0
  }
41968
0
41969
0
  if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) {
41970
0
    status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits);
41971
0
    goto exit;
41972
0
  }
41973
0
  v_bits = self->private_impl.f_bits;
41974
0
  v_n_bits = self->private_impl.f_n_bits;
41975
0
  v_lmask = ((((uint32_t)(1u)) << self->private_impl.f_n_huffs_bits[0u]) - 1u);
41976
0
  v_dmask = ((((uint32_t)(1u)) << self->private_impl.f_n_huffs_bits[1u]) - 1u);
41977
0
  if (self->private_impl.f_transformed_history_count < (a_dst ? a_dst->meta.pos : 0u)) {
41978
0
    status = wuffs_base__make_status(wuffs_base__error__bad_i_o_position);
41979
0
    goto exit;
41980
0
  }
41981
0
  v_hdist_adjustment = ((uint32_t)((self->private_impl.f_transformed_history_count - (a_dst ? a_dst->meta.pos : 0u))));
41982
0
  label__loop__continue:;
41983
0
  while ((((uint64_t)(io2_a_dst - iop_a_dst)) >= 266u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 12u)) {
41984
0
    if (v_n_bits < 15u) {
41985
0
      v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
41986
0
      iop_a_src += 1u;
41987
0
      v_n_bits += 8u;
41988
0
      v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
41989
0
      iop_a_src += 1u;
41990
0
      v_n_bits += 8u;
41991
0
    } else {
41992
0
    }
41993
0
    v_table_entry = self->private_data.f_huffs[0u][(v_bits & v_lmask)];
41994
0
    v_table_entry_n_bits = (v_table_entry & 15u);
41995
0
    v_bits >>= v_table_entry_n_bits;
41996
0
    v_n_bits -= v_table_entry_n_bits;
41997
0
    if ((v_table_entry >> 31u) != 0u) {
41998
0
      (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1);
41999
0
      continue;
42000
0
    } else if ((v_table_entry >> 30u) != 0u) {
42001
0
    } else if ((v_table_entry >> 29u) != 0u) {
42002
0
      self->private_impl.f_end_of_block = true;
42003
0
      break;
42004
0
    } else if ((v_table_entry >> 28u) != 0u) {
42005
0
      if (v_n_bits < 15u) {
42006
0
        v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
42007
0
        iop_a_src += 1u;
42008
0
        v_n_bits += 8u;
42009
0
        v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
42010
0
        iop_a_src += 1u;
42011
0
        v_n_bits += 8u;
42012
0
      } else {
42013
0
      }
42014
0
      v_redir_top = ((v_table_entry >> 8u) & 65535u);
42015
0
      v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u);
42016
0
      v_table_entry = self->private_data.f_huffs[0u][((v_redir_top + (v_bits & v_redir_mask)) & 1023u)];
42017
0
      v_table_entry_n_bits = (v_table_entry & 15u);
42018
0
      v_bits >>= v_table_entry_n_bits;
42019
0
      v_n_bits -= v_table_entry_n_bits;
42020
0
      if ((v_table_entry >> 31u) != 0u) {
42021
0
        (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1);
42022
0
        continue;
42023
0
      } else if ((v_table_entry >> 30u) != 0u) {
42024
0
      } else if ((v_table_entry >> 29u) != 0u) {
42025
0
        self->private_impl.f_end_of_block = true;
42026
0
        break;
42027
0
      } else if ((v_table_entry >> 28u) != 0u) {
42028
0
        status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
42029
0
        goto exit;
42030
0
      } else if ((v_table_entry >> 27u) != 0u) {
42031
0
        status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code);
42032
0
        goto exit;
42033
0
      } else {
42034
0
        status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
42035
0
        goto exit;
42036
0
      }
42037
0
    } else if ((v_table_entry >> 27u) != 0u) {
42038
0
      status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code);
42039
0
      goto exit;
42040
0
    } else {
42041
0
      status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
42042
0
      goto exit;
42043
0
    }
42044
0
    v_length = (((v_table_entry >> 8u) & 255u) + 3u);
42045
0
    v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u);
42046
0
    if (v_table_entry_n_bits > 0u) {
42047
0
      if (v_n_bits < 15u) {
42048
0
        v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
42049
0
        iop_a_src += 1u;
42050
0
        v_n_bits += 8u;
42051
0
        v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
42052
0
        iop_a_src += 1u;
42053
0
        v_n_bits += 8u;
42054
0
      } else {
42055
0
      }
42056
0
      v_length = (((v_length + 253u + ((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(v_table_entry_n_bits))) & 255u) + 3u);
42057
0
      v_bits >>= v_table_entry_n_bits;
42058
0
      v_n_bits -= v_table_entry_n_bits;
42059
0
    } else {
42060
0
    }
42061
0
    if (v_n_bits < 15u) {
42062
0
      v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
42063
0
      iop_a_src += 1u;
42064
0
      v_n_bits += 8u;
42065
0
      v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
42066
0
      iop_a_src += 1u;
42067
0
      v_n_bits += 8u;
42068
0
    } else {
42069
0
    }
42070
0
    v_table_entry = self->private_data.f_huffs[1u][(v_bits & v_dmask)];
42071
0
    v_table_entry_n_bits = (v_table_entry & 15u);
42072
0
    v_bits >>= v_table_entry_n_bits;
42073
0
    v_n_bits -= v_table_entry_n_bits;
42074
0
    if ((v_table_entry >> 28u) == 1u) {
42075
0
      if (v_n_bits < 15u) {
42076
0
        v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
42077
0
        iop_a_src += 1u;
42078
0
        v_n_bits += 8u;
42079
0
        v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
42080
0
        iop_a_src += 1u;
42081
0
        v_n_bits += 8u;
42082
0
      } else {
42083
0
      }
42084
0
      v_redir_top = ((v_table_entry >> 8u) & 65535u);
42085
0
      v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u);
42086
0
      v_table_entry = self->private_data.f_huffs[1u][((v_redir_top + (v_bits & v_redir_mask)) & 1023u)];
42087
0
      v_table_entry_n_bits = (v_table_entry & 15u);
42088
0
      v_bits >>= v_table_entry_n_bits;
42089
0
      v_n_bits -= v_table_entry_n_bits;
42090
0
    } else {
42091
0
    }
42092
0
    if ((v_table_entry >> 24u) != 64u) {
42093
0
      if ((v_table_entry >> 24u) == 8u) {
42094
0
        status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code);
42095
0
        goto exit;
42096
0
      }
42097
0
      status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
42098
0
      goto exit;
42099
0
    }
42100
0
    v_dist_minus_1 = ((v_table_entry >> 8u) & 32767u);
42101
0
    v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u);
42102
0
    if (v_n_bits < v_table_entry_n_bits) {
42103
0
      v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
42104
0
      iop_a_src += 1u;
42105
0
      v_n_bits += 8u;
42106
0
      v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
42107
0
      iop_a_src += 1u;
42108
0
      v_n_bits += 8u;
42109
0
    }
42110
0
    v_dist_minus_1 = ((v_dist_minus_1 + ((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(v_table_entry_n_bits))) & 32767u);
42111
0
    v_bits >>= v_table_entry_n_bits;
42112
0
    v_n_bits -= v_table_entry_n_bits;
42113
0
    do {
42114
0
      if (((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) {
42115
0
        v_hlen = 0u;
42116
0
        v_hdist = ((uint32_t)((((uint64_t)((v_dist_minus_1 + 1u))) - ((uint64_t)(iop_a_dst - io0_a_dst)))));
42117
0
        if (v_length > v_hdist) {
42118
0
          v_length -= v_hdist;
42119
0
          v_hlen = v_hdist;
42120
0
        } else {
42121
0
          v_hlen = v_length;
42122
0
          v_length = 0u;
42123
0
        }
42124
0
        v_hdist += v_hdist_adjustment;
42125
0
        if (self->private_impl.f_history_index < v_hdist) {
42126
0
          status = wuffs_base__make_status(wuffs_deflate__error__bad_distance);
42127
0
          goto exit;
42128
0
        }
42129
0
        wuffs_private_impl__io_writer__limited_copy_u32_from_slice(
42130
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));
42131
0
        if (v_length == 0u) {
42132
0
          goto label__loop__continue;
42133
0
        }
42134
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)))) {
42135
0
          status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_distance);
42136
0
          goto exit;
42137
0
        }
42138
0
      }
42139
0
      if ((v_dist_minus_1 + 1u) >= 8u) {
42140
0
        wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast(
42141
0
            &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u));
42142
0
      } else {
42143
0
        wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast(
42144
0
            &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u));
42145
0
      }
42146
0
    } while (0);
42147
0
  }
42148
0
  while (v_n_bits >= 8u) {
42149
0
    v_n_bits -= 8u;
42150
0
    if (iop_a_src > io1_a_src) {
42151
0
      iop_a_src--;
42152
0
    } else {
42153
0
      status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_i_o);
42154
0
      goto exit;
42155
0
    }
42156
0
  }
42157
0
  self->private_impl.f_bits = (v_bits & ((((uint32_t)(1u)) << v_n_bits) - 1u));
42158
0
  self->private_impl.f_n_bits = v_n_bits;
42159
0
  if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> self->private_impl.f_n_bits) != 0u)) {
42160
0
    status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits);
42161
0
    goto exit;
42162
0
  }
42163
0
  goto exit;
42164
0
  exit:
42165
0
  if (a_dst && a_dst->data.ptr) {
42166
0
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
42167
0
  }
42168
0
  if (a_src && a_src->data.ptr) {
42169
0
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
42170
0
  }
42171
0
42172
0
  return status;
42173
0
}
42174
42175
// -------- func deflate.decoder.decode_huffman_fast64
42176
42177
WUFFS_BASE__GENERATED_C_CODE
42178
static wuffs_base__status
42179
wuffs_deflate__decoder__decode_huffman_fast64(
42180
    wuffs_deflate__decoder* self,
42181
    wuffs_base__io_buffer* a_dst,
42182
16.0k
    wuffs_base__io_buffer* a_src) {
42183
16.0k
  return (*self->private_impl.choosy_decode_huffman_fast64)(self, a_dst, a_src);
42184
16.0k
}
42185
42186
WUFFS_BASE__GENERATED_C_CODE
42187
static wuffs_base__status
42188
wuffs_deflate__decoder__decode_huffman_fast64__choosy_default(
42189
    wuffs_deflate__decoder* self,
42190
    wuffs_base__io_buffer* a_dst,
42191
0
    wuffs_base__io_buffer* a_src) {
42192
0
  wuffs_base__status status = wuffs_base__make_status(NULL);
42193
42194
0
  uint64_t v_bits = 0;
42195
0
  uint32_t v_n_bits = 0;
42196
0
  uint32_t v_table_entry = 0;
42197
0
  uint32_t v_table_entry_n_bits = 0;
42198
0
  uint64_t v_lmask = 0;
42199
0
  uint64_t v_dmask = 0;
42200
0
  uint32_t v_redir_top = 0;
42201
0
  uint32_t v_redir_mask = 0;
42202
0
  uint32_t v_length = 0;
42203
0
  uint32_t v_dist_minus_1 = 0;
42204
0
  uint32_t v_hlen = 0;
42205
0
  uint32_t v_hdist = 0;
42206
0
  uint32_t v_hdist_adjustment = 0;
42207
42208
0
  uint8_t* iop_a_dst = NULL;
42209
0
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
42210
0
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
42211
0
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
42212
0
  if (a_dst && a_dst->data.ptr) {
42213
0
    io0_a_dst = a_dst->data.ptr;
42214
0
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
42215
0
    iop_a_dst = io1_a_dst;
42216
0
    io2_a_dst = io0_a_dst + a_dst->data.len;
42217
0
    if (a_dst->meta.closed) {
42218
0
      io2_a_dst = iop_a_dst;
42219
0
    }
42220
0
  }
42221
0
  const uint8_t* iop_a_src = NULL;
42222
0
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
42223
0
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
42224
0
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
42225
0
  if (a_src && a_src->data.ptr) {
42226
0
    io0_a_src = a_src->data.ptr;
42227
0
    io1_a_src = io0_a_src + a_src->meta.ri;
42228
0
    iop_a_src = io1_a_src;
42229
0
    io2_a_src = io0_a_src + a_src->meta.wi;
42230
0
  }
42231
42232
0
  if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) {
42233
0
    status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits);
42234
0
    goto exit;
42235
0
  }
42236
0
  v_bits = ((uint64_t)(self->private_impl.f_bits));
42237
0
  v_n_bits = self->private_impl.f_n_bits;
42238
0
  v_lmask = ((((uint64_t)(1u)) << self->private_impl.f_n_huffs_bits[0u]) - 1u);
42239
0
  v_dmask = ((((uint64_t)(1u)) << self->private_impl.f_n_huffs_bits[1u]) - 1u);
42240
0
  if (self->private_impl.f_transformed_history_count < (a_dst ? a_dst->meta.pos : 0u)) {
42241
0
    status = wuffs_base__make_status(wuffs_base__error__bad_i_o_position);
42242
0
    goto exit;
42243
0
  }
42244
0
  v_hdist_adjustment = ((uint32_t)((self->private_impl.f_transformed_history_count - (a_dst ? a_dst->meta.pos : 0u))));
42245
0
  label__loop__continue:;
42246
0
  while ((((uint64_t)(io2_a_dst - iop_a_dst)) >= 266u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 8u)) {
42247
0
    v_bits |= ((uint64_t)(wuffs_base__peek_u64le__no_bounds_check(iop_a_src) << (v_n_bits & 63u)));
42248
0
    iop_a_src += ((63u - (v_n_bits & 63u)) >> 3u);
42249
0
    v_n_bits |= 56u;
42250
0
    v_table_entry = self->private_data.f_huffs[0u][(v_bits & v_lmask)];
42251
0
    v_table_entry_n_bits = (v_table_entry & 15u);
42252
0
    v_bits >>= v_table_entry_n_bits;
42253
0
    v_n_bits -= v_table_entry_n_bits;
42254
0
    if ((v_table_entry >> 31u) != 0u) {
42255
0
      (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1);
42256
0
      continue;
42257
0
    } else if ((v_table_entry >> 30u) != 0u) {
42258
0
    } else if ((v_table_entry >> 29u) != 0u) {
42259
0
      self->private_impl.f_end_of_block = true;
42260
0
      break;
42261
0
    } else if ((v_table_entry >> 28u) != 0u) {
42262
0
      v_redir_top = ((v_table_entry >> 8u) & 65535u);
42263
0
      v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u);
42264
0
      v_table_entry = self->private_data.f_huffs[0u][((v_redir_top + (((uint32_t)(v_bits)) & v_redir_mask)) & 1023u)];
42265
0
      v_table_entry_n_bits = (v_table_entry & 15u);
42266
0
      v_bits >>= v_table_entry_n_bits;
42267
0
      v_n_bits -= v_table_entry_n_bits;
42268
0
      if ((v_table_entry >> 31u) != 0u) {
42269
0
        (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1);
42270
0
        continue;
42271
0
      } else if ((v_table_entry >> 30u) != 0u) {
42272
0
      } else if ((v_table_entry >> 29u) != 0u) {
42273
0
        self->private_impl.f_end_of_block = true;
42274
0
        break;
42275
0
      } else if ((v_table_entry >> 28u) != 0u) {
42276
0
        status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
42277
0
        goto exit;
42278
0
      } else if ((v_table_entry >> 27u) != 0u) {
42279
0
        status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code);
42280
0
        goto exit;
42281
0
      } else {
42282
0
        status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
42283
0
        goto exit;
42284
0
      }
42285
0
    } else if ((v_table_entry >> 27u) != 0u) {
42286
0
      status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code);
42287
0
      goto exit;
42288
0
    } else {
42289
0
      status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
42290
0
      goto exit;
42291
0
    }
42292
0
    v_length = (((v_table_entry >> 8u) & 255u) + 3u);
42293
0
    v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u);
42294
0
    if (v_table_entry_n_bits > 0u) {
42295
0
      v_length = (((v_length + 253u + ((uint32_t)(((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U64(v_table_entry_n_bits))))) & 255u) + 3u);
42296
0
      v_bits >>= v_table_entry_n_bits;
42297
0
      v_n_bits -= v_table_entry_n_bits;
42298
0
    }
42299
0
    v_table_entry = self->private_data.f_huffs[1u][(v_bits & v_dmask)];
42300
0
    v_table_entry_n_bits = (v_table_entry & 15u);
42301
0
    v_bits >>= v_table_entry_n_bits;
42302
0
    v_n_bits -= v_table_entry_n_bits;
42303
0
    if ((v_table_entry >> 28u) == 1u) {
42304
0
      v_redir_top = ((v_table_entry >> 8u) & 65535u);
42305
0
      v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u);
42306
0
      v_table_entry = self->private_data.f_huffs[1u][((v_redir_top + (((uint32_t)(v_bits)) & v_redir_mask)) & 1023u)];
42307
0
      v_table_entry_n_bits = (v_table_entry & 15u);
42308
0
      v_bits >>= v_table_entry_n_bits;
42309
0
      v_n_bits -= v_table_entry_n_bits;
42310
0
    }
42311
0
    if ((v_table_entry >> 24u) != 64u) {
42312
0
      if ((v_table_entry >> 24u) == 8u) {
42313
0
        status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code);
42314
0
        goto exit;
42315
0
      }
42316
0
      status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
42317
0
      goto exit;
42318
0
    }
42319
0
    v_dist_minus_1 = ((v_table_entry >> 8u) & 32767u);
42320
0
    v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u);
42321
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);
42322
0
    v_bits >>= v_table_entry_n_bits;
42323
0
    v_n_bits -= v_table_entry_n_bits;
42324
0
    do {
42325
0
      if (((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) {
42326
0
        v_hlen = 0u;
42327
0
        v_hdist = ((uint32_t)((((uint64_t)((v_dist_minus_1 + 1u))) - ((uint64_t)(iop_a_dst - io0_a_dst)))));
42328
0
        if (v_length > v_hdist) {
42329
0
          v_length -= v_hdist;
42330
0
          v_hlen = v_hdist;
42331
0
        } else {
42332
0
          v_hlen = v_length;
42333
0
          v_length = 0u;
42334
0
        }
42335
0
        v_hdist += v_hdist_adjustment;
42336
0
        if (self->private_impl.f_history_index < v_hdist) {
42337
0
          status = wuffs_base__make_status(wuffs_deflate__error__bad_distance);
42338
0
          goto exit;
42339
0
        }
42340
0
        wuffs_private_impl__io_writer__limited_copy_u32_from_slice(
42341
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));
42342
0
        if (v_length == 0u) {
42343
0
          goto label__loop__continue;
42344
0
        }
42345
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)))) {
42346
0
          status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_distance);
42347
0
          goto exit;
42348
0
        }
42349
0
      }
42350
0
      if ((v_dist_minus_1 + 1u) >= 8u) {
42351
0
        wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast(
42352
0
            &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u));
42353
0
      } else if ((v_dist_minus_1 + 1u) == 1u) {
42354
0
        wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast(
42355
0
            &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u));
42356
0
      } else {
42357
0
        wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast(
42358
0
            &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u));
42359
0
      }
42360
0
    } while (0);
42361
0
  }
42362
0
  if (v_n_bits > 63u) {
42363
0
    status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits);
42364
0
    goto exit;
42365
0
  }
42366
0
  while (v_n_bits >= 8u) {
42367
0
    v_n_bits -= 8u;
42368
0
    if (iop_a_src > io1_a_src) {
42369
0
      iop_a_src--;
42370
0
    } else {
42371
0
      status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_i_o);
42372
0
      goto exit;
42373
0
    }
42374
0
  }
42375
0
  self->private_impl.f_bits = ((uint32_t)((v_bits & ((((uint64_t)(1u)) << v_n_bits) - 1u))));
42376
0
  self->private_impl.f_n_bits = v_n_bits;
42377
0
  if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> self->private_impl.f_n_bits) != 0u)) {
42378
0
    status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits);
42379
0
    goto exit;
42380
0
  }
42381
0
  goto exit;
42382
0
  exit:
42383
0
  if (a_dst && a_dst->data.ptr) {
42384
0
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
42385
0
  }
42386
0
  if (a_src && a_src->data.ptr) {
42387
0
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
42388
0
  }
42389
42390
0
  return status;
42391
0
}
42392
42393
// -------- func deflate.decoder.decode_huffman_slow
42394
42395
WUFFS_BASE__GENERATED_C_CODE
42396
static wuffs_base__status
42397
wuffs_deflate__decoder__decode_huffman_slow(
42398
    wuffs_deflate__decoder* self,
42399
    wuffs_base__io_buffer* a_dst,
42400
22.6k
    wuffs_base__io_buffer* a_src) {
42401
22.6k
  wuffs_base__status status = wuffs_base__make_status(NULL);
42402
42403
22.6k
  uint32_t v_bits = 0;
42404
22.6k
  uint32_t v_n_bits = 0;
42405
22.6k
  uint32_t v_table_entry = 0;
42406
22.6k
  uint32_t v_table_entry_n_bits = 0;
42407
22.6k
  uint32_t v_lmask = 0;
42408
22.6k
  uint32_t v_dmask = 0;
42409
22.6k
  uint32_t v_b0 = 0;
42410
22.6k
  uint32_t v_redir_top = 0;
42411
22.6k
  uint32_t v_redir_mask = 0;
42412
22.6k
  uint32_t v_b1 = 0;
42413
22.6k
  uint32_t v_length = 0;
42414
22.6k
  uint32_t v_b2 = 0;
42415
22.6k
  uint32_t v_b3 = 0;
42416
22.6k
  uint32_t v_b4 = 0;
42417
22.6k
  uint32_t v_dist_minus_1 = 0;
42418
22.6k
  uint32_t v_b5 = 0;
42419
22.6k
  uint32_t v_n_copied = 0;
42420
22.6k
  uint32_t v_hlen = 0;
42421
22.6k
  uint32_t v_hdist = 0;
42422
42423
22.6k
  uint8_t* iop_a_dst = NULL;
42424
22.6k
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
42425
22.6k
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
42426
22.6k
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
42427
22.6k
  if (a_dst && a_dst->data.ptr) {
42428
22.6k
    io0_a_dst = a_dst->data.ptr;
42429
22.6k
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
42430
22.6k
    iop_a_dst = io1_a_dst;
42431
22.6k
    io2_a_dst = io0_a_dst + a_dst->data.len;
42432
22.6k
    if (a_dst->meta.closed) {
42433
0
      io2_a_dst = iop_a_dst;
42434
0
    }
42435
22.6k
  }
42436
22.6k
  const uint8_t* iop_a_src = NULL;
42437
22.6k
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
42438
22.6k
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
42439
22.6k
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
42440
22.6k
  if (a_src && a_src->data.ptr) {
42441
22.6k
    io0_a_src = a_src->data.ptr;
42442
22.6k
    io1_a_src = io0_a_src + a_src->meta.ri;
42443
22.6k
    iop_a_src = io1_a_src;
42444
22.6k
    io2_a_src = io0_a_src + a_src->meta.wi;
42445
22.6k
  }
42446
42447
22.6k
  uint32_t coro_susp_point = self->private_impl.p_decode_huffman_slow;
42448
22.6k
  if (coro_susp_point) {
42449
10.6k
    v_bits = self->private_data.s_decode_huffman_slow.v_bits;
42450
10.6k
    v_n_bits = self->private_data.s_decode_huffman_slow.v_n_bits;
42451
10.6k
    v_table_entry_n_bits = self->private_data.s_decode_huffman_slow.v_table_entry_n_bits;
42452
10.6k
    v_lmask = self->private_data.s_decode_huffman_slow.v_lmask;
42453
10.6k
    v_dmask = self->private_data.s_decode_huffman_slow.v_dmask;
42454
10.6k
    v_redir_top = self->private_data.s_decode_huffman_slow.v_redir_top;
42455
10.6k
    v_redir_mask = self->private_data.s_decode_huffman_slow.v_redir_mask;
42456
10.6k
    v_length = self->private_data.s_decode_huffman_slow.v_length;
42457
10.6k
    v_dist_minus_1 = self->private_data.s_decode_huffman_slow.v_dist_minus_1;
42458
10.6k
  }
42459
22.6k
  switch (coro_susp_point) {
42460
11.9k
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
42461
42462
11.9k
    if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) {
42463
0
      status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits);
42464
0
      goto exit;
42465
0
    }
42466
11.9k
    v_bits = self->private_impl.f_bits;
42467
11.9k
    v_n_bits = self->private_impl.f_n_bits;
42468
11.9k
    v_lmask = ((((uint32_t)(1u)) << self->private_impl.f_n_huffs_bits[0u]) - 1u);
42469
11.9k
    v_dmask = ((((uint32_t)(1u)) << self->private_impl.f_n_huffs_bits[1u]) - 1u);
42470
54.8k
    label__loop__continue:;
42471
98.4k
    while ( ! (self->private_impl.p_decode_huffman_slow != 0)) {
42472
149k
      while (true) {
42473
149k
        v_table_entry = self->private_data.f_huffs[0u][(v_bits & v_lmask)];
42474
149k
        v_table_entry_n_bits = (v_table_entry & 15u);
42475
149k
        if (v_n_bits >= v_table_entry_n_bits) {
42476
92.3k
          v_bits >>= v_table_entry_n_bits;
42477
92.3k
          v_n_bits -= v_table_entry_n_bits;
42478
92.3k
          break;
42479
92.3k
        }
42480
56.6k
        {
42481
59.0k
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
42482
59.0k
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
42483
3.59k
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
42484
3.59k
            goto suspend;
42485
3.59k
          }
42486
55.4k
          uint32_t t_0 = *iop_a_src++;
42487
55.4k
          v_b0 = t_0;
42488
55.4k
        }
42489
0
        v_bits |= (v_b0 << v_n_bits);
42490
55.4k
        v_n_bits += 8u;
42491
55.4k
      }
42492
92.3k
      if ((v_table_entry >> 31u) != 0u) {
42493
42.5k
        self->private_data.s_decode_huffman_slow.scratch = ((uint8_t)((v_table_entry >> 8u)));
42494
42.6k
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
42495
42.6k
        if (iop_a_dst == io2_a_dst) {
42496
92
          status = wuffs_base__make_status(wuffs_base__suspension__short_write);
42497
92
          goto suspend;
42498
92
        }
42499
42.5k
        *iop_a_dst++ = ((uint8_t)(self->private_data.s_decode_huffman_slow.scratch));
42500
42.5k
        continue;
42501
49.8k
      } else if ((v_table_entry >> 30u) != 0u) {
42502
43.5k
      } else if ((v_table_entry >> 29u) != 0u) {
42503
3.63k
        self->private_impl.f_end_of_block = true;
42504
3.63k
        break;
42505
3.63k
      } else if ((v_table_entry >> 28u) != 0u) {
42506
2.68k
        v_redir_top = ((v_table_entry >> 8u) & 65535u);
42507
2.68k
        v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u);
42508
3.37k
        while (true) {
42509
3.37k
          v_table_entry = self->private_data.f_huffs[0u][((v_redir_top + (v_bits & v_redir_mask)) & 1023u)];
42510
3.37k
          v_table_entry_n_bits = (v_table_entry & 15u);
42511
3.37k
          if (v_n_bits >= v_table_entry_n_bits) {
42512
2.66k
            v_bits >>= v_table_entry_n_bits;
42513
2.66k
            v_n_bits -= v_table_entry_n_bits;
42514
2.66k
            break;
42515
2.66k
          }
42516
704
          {
42517
1.09k
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
42518
1.09k
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
42519
409
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
42520
409
              goto suspend;
42521
409
            }
42522
688
            uint32_t t_1 = *iop_a_src++;
42523
688
            v_b1 = t_1;
42524
688
          }
42525
0
          v_bits |= (v_b1 << v_n_bits);
42526
688
          v_n_bits += 8u;
42527
688
        }
42528
2.66k
        if ((v_table_entry >> 31u) != 0u) {
42529
1.14k
          self->private_data.s_decode_huffman_slow.scratch = ((uint8_t)((v_table_entry >> 8u)));
42530
1.16k
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
42531
1.16k
          if (iop_a_dst == io2_a_dst) {
42532
16
            status = wuffs_base__make_status(wuffs_base__suspension__short_write);
42533
16
            goto suspend;
42534
16
          }
42535
1.14k
          *iop_a_dst++ = ((uint8_t)(self->private_data.s_decode_huffman_slow.scratch));
42536
1.14k
          continue;
42537
1.52k
        } else if ((v_table_entry >> 30u) != 0u) {
42538
884
        } else if ((v_table_entry >> 29u) != 0u) {
42539
884
          self->private_impl.f_end_of_block = true;
42540
884
          break;
42541
884
        } else if ((v_table_entry >> 28u) != 0u) {
42542
0
          status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
42543
0
          goto exit;
42544
0
        } else if ((v_table_entry >> 27u) != 0u) {
42545
0
          status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code);
42546
0
          goto exit;
42547
0
        } else {
42548
0
          status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
42549
0
          goto exit;
42550
0
        }
42551
2.66k
      } else if ((v_table_entry >> 27u) != 0u) {
42552
17
        status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code);
42553
17
        goto exit;
42554
17
      } else {
42555
0
        status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
42556
0
        goto exit;
42557
0
      }
42558
44.1k
      v_length = (((v_table_entry >> 8u) & 255u) + 3u);
42559
44.1k
      v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u);
42560
44.1k
      if (v_table_entry_n_bits > 0u) {
42561
12.7k
        while (v_n_bits < v_table_entry_n_bits) {
42562
3.25k
          {
42563
3.50k
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
42564
3.50k
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
42565
282
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
42566
282
              goto suspend;
42567
282
            }
42568
3.21k
            uint32_t t_2 = *iop_a_src++;
42569
3.21k
            v_b2 = t_2;
42570
3.21k
          }
42571
0
          v_bits |= (v_b2 << v_n_bits);
42572
3.21k
          v_n_bits += 8u;
42573
3.21k
        }
42574
9.48k
        v_length = (((v_length + 253u + ((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(v_table_entry_n_bits))) & 255u) + 3u);
42575
9.48k
        v_bits >>= v_table_entry_n_bits;
42576
9.48k
        v_n_bits -= v_table_entry_n_bits;
42577
9.48k
      }
42578
54.7k
      while (true) {
42579
54.7k
        v_table_entry = self->private_data.f_huffs[1u][(v_bits & v_dmask)];
42580
54.7k
        v_table_entry_n_bits = (v_table_entry & 15u);
42581
54.7k
        if (v_n_bits >= v_table_entry_n_bits) {
42582
43.8k
          v_bits >>= v_table_entry_n_bits;
42583
43.8k
          v_n_bits -= v_table_entry_n_bits;
42584
43.8k
          break;
42585
43.8k
        }
42586
10.8k
        {
42587
13.0k
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
42588
13.0k
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
42589
2.44k
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
42590
2.44k
            goto suspend;
42591
2.44k
          }
42592
10.6k
          uint32_t t_3 = *iop_a_src++;
42593
10.6k
          v_b3 = t_3;
42594
10.6k
        }
42595
0
        v_bits |= (v_b3 << v_n_bits);
42596
10.6k
        v_n_bits += 8u;
42597
10.6k
      }
42598
43.8k
      if ((v_table_entry >> 28u) == 1u) {
42599
319
        v_redir_top = ((v_table_entry >> 8u) & 65535u);
42600
319
        v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u);
42601
442
        while (true) {
42602
442
          v_table_entry = self->private_data.f_huffs[1u][((v_redir_top + (v_bits & v_redir_mask)) & 1023u)];
42603
442
          v_table_entry_n_bits = (v_table_entry & 15u);
42604
442
          if (v_n_bits >= v_table_entry_n_bits) {
42605
302
            v_bits >>= v_table_entry_n_bits;
42606
302
            v_n_bits -= v_table_entry_n_bits;
42607
302
            break;
42608
302
          }
42609
140
          {
42610
582
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
42611
582
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
42612
459
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
42613
459
              goto suspend;
42614
459
            }
42615
123
            uint32_t t_4 = *iop_a_src++;
42616
123
            v_b4 = t_4;
42617
123
          }
42618
0
          v_bits |= (v_b4 << v_n_bits);
42619
123
          v_n_bits += 8u;
42620
123
        }
42621
319
      }
42622
43.8k
      if ((v_table_entry >> 24u) != 64u) {
42623
28
        if ((v_table_entry >> 24u) == 8u) {
42624
28
          status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code);
42625
28
          goto exit;
42626
28
        }
42627
0
        status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
42628
0
        goto exit;
42629
28
      }
42630
43.8k
      v_dist_minus_1 = ((v_table_entry >> 8u) & 32767u);
42631
43.8k
      v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u);
42632
43.8k
      if (v_table_entry_n_bits > 0u) {
42633
17.8k
        while (v_n_bits < v_table_entry_n_bits) {
42634
7.20k
          {
42635
7.93k
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
42636
7.93k
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
42637
825
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
42638
825
              goto suspend;
42639
825
            }
42640
7.11k
            uint32_t t_5 = *iop_a_src++;
42641
7.11k
            v_b5 = t_5;
42642
7.11k
          }
42643
0
          v_bits |= (v_b5 << v_n_bits);
42644
7.11k
          v_n_bits += 8u;
42645
7.11k
        }
42646
10.6k
        v_dist_minus_1 = ((v_dist_minus_1 + ((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(v_table_entry_n_bits))) & 32767u);
42647
10.6k
        v_bits >>= v_table_entry_n_bits;
42648
10.6k
        v_n_bits -= v_table_entry_n_bits;
42649
10.6k
      }
42650
47.8k
      while (true) {
42651
47.8k
        if (((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) {
42652
6.79k
          v_hdist = ((uint32_t)((((uint64_t)((v_dist_minus_1 + 1u))) - ((uint64_t)(iop_a_dst - io0_a_dst)))));
42653
6.79k
          if (v_hdist < v_length) {
42654
5.29k
            v_hlen = v_hdist;
42655
5.29k
          } else {
42656
1.50k
            v_hlen = v_length;
42657
1.50k
          }
42658
6.79k
          v_hdist += ((uint32_t)(((uint64_t)(self->private_impl.f_transformed_history_count - (a_dst ? a_dst->meta.pos : 0u)))));
42659
6.79k
          if (self->private_impl.f_history_index < v_hdist) {
42660
82
            status = wuffs_base__make_status(wuffs_deflate__error__bad_distance);
42661
82
            goto exit;
42662
82
          }
42663
6.71k
          v_n_copied = wuffs_private_impl__io_writer__limited_copy_u32_from_slice(
42664
6.71k
              &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));
42665
6.71k
          if (v_n_copied < v_hlen) {
42666
81
            v_length -= v_n_copied;
42667
81
            status = wuffs_base__make_status(wuffs_base__suspension__short_write);
42668
81
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9);
42669
76
            continue;
42670
81
          }
42671
6.63k
          v_length -= v_hlen;
42672
6.63k
          if (v_length == 0u) {
42673
1.40k
            goto label__loop__continue;
42674
1.40k
          }
42675
6.63k
        }
42676
46.2k
        v_n_copied = wuffs_private_impl__io_writer__limited_copy_u32_from_history(
42677
46.2k
            &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u));
42678
46.2k
        if (v_length <= v_n_copied) {
42679
41.4k
          goto label__loop__continue;
42680
41.4k
        }
42681
4.85k
        v_length -= v_n_copied;
42682
4.85k
        status = wuffs_base__make_status(wuffs_base__suspension__short_write);
42683
4.85k
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10);
42684
4.02k
      }
42685
43.7k
    }
42686
9.42k
    self->private_impl.f_bits = v_bits;
42687
9.42k
    self->private_impl.f_n_bits = v_n_bits;
42688
9.42k
    if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) {
42689
0
      status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits);
42690
0
      goto exit;
42691
0
    }
42692
42693
9.42k
    ok:
42694
9.42k
    self->private_impl.p_decode_huffman_slow = 0;
42695
9.42k
    goto exit;
42696
22.6k
  }
42697
42698
0
  goto suspend;
42699
13.0k
  suspend:
42700
13.0k
  self->private_impl.p_decode_huffman_slow = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
42701
13.0k
  self->private_data.s_decode_huffman_slow.v_bits = v_bits;
42702
13.0k
  self->private_data.s_decode_huffman_slow.v_n_bits = v_n_bits;
42703
13.0k
  self->private_data.s_decode_huffman_slow.v_table_entry_n_bits = v_table_entry_n_bits;
42704
13.0k
  self->private_data.s_decode_huffman_slow.v_lmask = v_lmask;
42705
13.0k
  self->private_data.s_decode_huffman_slow.v_dmask = v_dmask;
42706
13.0k
  self->private_data.s_decode_huffman_slow.v_redir_top = v_redir_top;
42707
13.0k
  self->private_data.s_decode_huffman_slow.v_redir_mask = v_redir_mask;
42708
13.0k
  self->private_data.s_decode_huffman_slow.v_length = v_length;
42709
13.0k
  self->private_data.s_decode_huffman_slow.v_dist_minus_1 = v_dist_minus_1;
42710
42711
13.0k
  goto exit;
42712
22.6k
  exit:
42713
22.6k
  if (a_dst && a_dst->data.ptr) {
42714
22.6k
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
42715
22.6k
  }
42716
22.6k
  if (a_src && a_src->data.ptr) {
42717
22.6k
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
42718
22.6k
  }
42719
42720
22.6k
  return status;
42721
22.6k
}
42722
42723
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__DEFLATE)
42724
42725
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ETC2)
42726
42727
// ---------------- Status Codes Implementations
42728
42729
const char wuffs_etc2__error__bad_header[] = "#etc2: bad header";
42730
const char wuffs_etc2__error__truncated_input[] = "#etc2: truncated input";
42731
const char wuffs_etc2__error__unsupported_etc2_file[] = "#etc2: unsupported ETC2 file";
42732
42733
// ---------------- Private Consts
42734
42735
static const uint32_t
42736
WUFFS_ETC2__DIFFS[8] WUFFS_BASE__POTENTIALLY_UNUSED = {
42737
  0u, 1u, 2u, 3u, 4294967292u, 4294967293u, 4294967294u, 4294967295u,
42738
};
42739
42740
static const uint32_t
42741
WUFFS_ETC2__MODIFIERS[16][4] WUFFS_BASE__POTENTIALLY_UNUSED = {
42742
  {
42743
    2u, 8u, 4294967294u, 4294967288u,
42744
  }, {
42745
    5u, 17u, 4294967291u, 4294967279u,
42746
  }, {
42747
    9u, 29u, 4294967287u, 4294967267u,
42748
  }, {
42749
    13u, 42u, 4294967283u, 4294967254u,
42750
  }, {
42751
    18u, 60u, 4294967278u, 4294967236u,
42752
  }, {
42753
    24u, 80u, 4294967272u, 4294967216u,
42754
  }, {
42755
    33u, 106u, 4294967263u, 4294967190u,
42756
  }, {
42757
    47u, 183u, 4294967249u, 4294967113u,
42758
  },
42759
  {
42760
    0u, 8u, 0u, 4294967288u,
42761
  }, {
42762
    0u, 17u, 0u, 4294967279u,
42763
  }, {
42764
    0u, 29u, 0u, 4294967267u,
42765
  }, {
42766
    0u, 42u, 0u, 4294967254u,
42767
  }, {
42768
    0u, 60u, 0u, 4294967236u,
42769
  }, {
42770
    0u, 80u, 0u, 4294967216u,
42771
  }, {
42772
    0u, 106u, 0u, 4294967190u,
42773
  }, {
42774
    0u, 183u, 0u, 4294967113u,
42775
  },
42776
};
42777
42778
static const uint8_t
42779
WUFFS_ETC2__T_H_MODIFIERS[8] WUFFS_BASE__POTENTIALLY_UNUSED = {
42780
  3u, 6u, 11u, 16u, 23u, 32u, 41u, 64u,
42781
};
42782
42783
static const uint32_t
42784
WUFFS_ETC2__ALPHA_MODIFIERS[16][8] WUFFS_BASE__POTENTIALLY_UNUSED = {
42785
  {
42786
    4294967293u, 4294967290u, 4294967287u, 4294967281u, 2u, 5u, 8u, 14u,
42787
  }, {
42788
    4294967293u, 4294967289u, 4294967286u, 4294967283u, 2u, 6u, 9u, 12u,
42789
  }, {
42790
    4294967294u, 4294967291u, 4294967288u, 4294967283u, 1u, 4u, 7u, 12u,
42791
  }, {
42792
    4294967294u, 4294967292u, 4294967290u, 4294967283u, 1u, 3u, 5u, 12u,
42793
  }, {
42794
    4294967293u, 4294967290u, 4294967288u, 4294967284u, 2u, 5u, 7u, 11u,
42795
  }, {
42796
    4294967293u, 4294967289u, 4294967287u, 4294967285u, 2u, 6u, 8u, 10u,
42797
  }, {
42798
    4294967292u, 4294967289u, 4294967288u, 4294967285u, 3u, 6u, 7u, 10u,
42799
  }, {
42800
    4294967293u, 4294967291u, 4294967288u, 4294967285u, 2u, 4u, 7u, 10u,
42801
  },
42802
  {
42803
    4294967294u, 4294967290u, 4294967288u, 4294967286u, 1u, 5u, 7u, 9u,
42804
  }, {
42805
    4294967294u, 4294967291u, 4294967288u, 4294967286u, 1u, 4u, 7u, 9u,
42806
  }, {
42807
    4294967294u, 4294967292u, 4294967288u, 4294967286u, 1u, 3u, 7u, 9u,
42808
  }, {
42809
    4294967294u, 4294967291u, 4294967289u, 4294967286u, 1u, 4u, 6u, 9u,
42810
  }, {
42811
    4294967293u, 4294967292u, 4294967289u, 4294967286u, 2u, 3u, 6u, 9u,
42812
  }, {
42813
    4294967295u, 4294967294u, 4294967293u, 4294967286u, 0u, 1u, 2u, 9u,
42814
  }, {
42815
    4294967292u, 4294967290u, 4294967288u, 4294967287u, 3u, 5u, 7u, 8u,
42816
  }, {
42817
    4294967293u, 4294967291u, 4294967289u, 4294967287u, 2u, 4u, 6u, 8u,
42818
  },
42819
};
42820
42821
static const uint8_t
42822
WUFFS_ETC2__CLAMP[1024] WUFFS_BASE__POTENTIALLY_UNUSED = {
42823
  0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u,
42824
  8u, 9u, 10u, 11u, 12u, 13u, 14u, 15u,
42825
  16u, 17u, 18u, 19u, 20u, 21u, 22u, 23u,
42826
  24u, 25u, 26u, 27u, 28u, 29u, 30u, 31u,
42827
  32u, 33u, 34u, 35u, 36u, 37u, 38u, 39u,
42828
  40u, 41u, 42u, 43u, 44u, 45u, 46u, 47u,
42829
  48u, 49u, 50u, 51u, 52u, 53u, 54u, 55u,
42830
  56u, 57u, 58u, 59u, 60u, 61u, 62u, 63u,
42831
  64u, 65u, 66u, 67u, 68u, 69u, 70u, 71u,
42832
  72u, 73u, 74u, 75u, 76u, 77u, 78u, 79u,
42833
  80u, 81u, 82u, 83u, 84u, 85u, 86u, 87u,
42834
  88u, 89u, 90u, 91u, 92u, 93u, 94u, 95u,
42835
  96u, 97u, 98u, 99u, 100u, 101u, 102u, 103u,
42836
  104u, 105u, 106u, 107u, 108u, 109u, 110u, 111u,
42837
  112u, 113u, 114u, 115u, 116u, 117u, 118u, 119u,
42838
  120u, 121u, 122u, 123u, 124u, 125u, 126u, 127u,
42839
  128u, 129u, 130u, 131u, 132u, 133u, 134u, 135u,
42840
  136u, 137u, 138u, 139u, 140u, 141u, 142u, 143u,
42841
  144u, 145u, 146u, 147u, 148u, 149u, 150u, 151u,
42842
  152u, 153u, 154u, 155u, 156u, 157u, 158u, 159u,
42843
  160u, 161u, 162u, 163u, 164u, 165u, 166u, 167u,
42844
  168u, 169u, 170u, 171u, 172u, 173u, 174u, 175u,
42845
  176u, 177u, 178u, 179u, 180u, 181u, 182u, 183u,
42846
  184u, 185u, 186u, 187u, 188u, 189u, 190u, 191u,
42847
  192u, 193u, 194u, 195u, 196u, 197u, 198u, 199u,
42848
  200u, 201u, 202u, 203u, 204u, 205u, 206u, 207u,
42849
  208u, 209u, 210u, 211u, 212u, 213u, 214u, 215u,
42850
  216u, 217u, 218u, 219u, 220u, 221u, 222u, 223u,
42851
  224u, 225u, 226u, 227u, 228u, 229u, 230u, 231u,
42852
  232u, 233u, 234u, 235u, 236u, 237u, 238u, 239u,
42853
  240u, 241u, 242u, 243u, 244u, 245u, 246u, 247u,
42854
  248u, 249u, 250u, 251u, 252u, 253u, 254u, 255u,
42855
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
42856
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
42857
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
42858
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
42859
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
42860
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
42861
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
42862
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
42863
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
42864
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
42865
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
42866
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
42867
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
42868
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
42869
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
42870
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
42871
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
42872
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
42873
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
42874
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
42875
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
42876
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
42877
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
42878
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
42879
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
42880
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
42881
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
42882
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
42883
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
42884
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
42885
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
42886
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
42887
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42888
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42889
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42890
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42891
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42892
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42893
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42894
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42895
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42896
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42897
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42898
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42899
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42900
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42901
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42902
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42903
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42904
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42905
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42906
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42907
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42908
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42909
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42910
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42911
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42912
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42913
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42914
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42915
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42916
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42917
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42918
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42919
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42920
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42921
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42922
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42923
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42924
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42925
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42926
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42927
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42928
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42929
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42930
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42931
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42932
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42933
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42934
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42935
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42936
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42937
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42938
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42939
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42940
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42941
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42942
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42943
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42944
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42945
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42946
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42947
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42948
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42949
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42950
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
42951
};
42952
42953
// ---------------- Private Initializer Prototypes
42954
42955
// ---------------- Private Function Prototypes
42956
42957
WUFFS_BASE__GENERATED_C_CODE
42958
static wuffs_base__status
42959
wuffs_etc2__decoder__do_decode_image_config(
42960
    wuffs_etc2__decoder* self,
42961
    wuffs_base__image_config* a_dst,
42962
    wuffs_base__io_buffer* a_src);
42963
42964
WUFFS_BASE__GENERATED_C_CODE
42965
static wuffs_base__status
42966
wuffs_etc2__decoder__do_decode_frame_config(
42967
    wuffs_etc2__decoder* self,
42968
    wuffs_base__frame_config* a_dst,
42969
    wuffs_base__io_buffer* a_src);
42970
42971
WUFFS_BASE__GENERATED_C_CODE
42972
static wuffs_base__status
42973
wuffs_etc2__decoder__do_decode_frame(
42974
    wuffs_etc2__decoder* self,
42975
    wuffs_base__pixel_buffer* a_dst,
42976
    wuffs_base__io_buffer* a_src,
42977
    wuffs_base__pixel_blend a_blend,
42978
    wuffs_base__slice_u8 a_workbuf,
42979
    wuffs_base__decode_frame_options* a_opts);
42980
42981
WUFFS_BASE__GENERATED_C_CODE
42982
static wuffs_base__status
42983
wuffs_etc2__decoder__from_src_to_colors(
42984
    wuffs_etc2__decoder* self,
42985
    wuffs_base__io_buffer* a_src);
42986
42987
WUFFS_BASE__GENERATED_C_CODE
42988
static wuffs_base__empty_struct
42989
wuffs_etc2__decoder__from_colors_to_buffer(
42990
    wuffs_etc2__decoder* self);
42991
42992
WUFFS_BASE__GENERATED_C_CODE
42993
static wuffs_base__empty_struct
42994
wuffs_etc2__decoder__decode_t_mode(
42995
    wuffs_etc2__decoder* self,
42996
    uint64_t a_bits,
42997
    uint32_t a_offset,
42998
    bool a_transparent);
42999
43000
WUFFS_BASE__GENERATED_C_CODE
43001
static wuffs_base__empty_struct
43002
wuffs_etc2__decoder__decode_h_mode(
43003
    wuffs_etc2__decoder* self,
43004
    uint64_t a_bits,
43005
    uint32_t a_offset,
43006
    bool a_transparent);
43007
43008
WUFFS_BASE__GENERATED_C_CODE
43009
static wuffs_base__empty_struct
43010
wuffs_etc2__decoder__decode_planar_mode(
43011
    wuffs_etc2__decoder* self,
43012
    uint64_t a_bits,
43013
    uint32_t a_offset);
43014
43015
WUFFS_BASE__GENERATED_C_CODE
43016
static wuffs_base__empty_struct
43017
wuffs_etc2__decoder__decode_half_block(
43018
    wuffs_etc2__decoder* self,
43019
    uint32_t a_bits,
43020
    uint32_t a_offset,
43021
    uint32_t a_which,
43022
    uint32_t a_r,
43023
    uint32_t a_g,
43024
    uint32_t a_b,
43025
    bool a_flip,
43026
    bool a_transparent,
43027
    bool a_second);
43028
43029
WUFFS_BASE__GENERATED_C_CODE
43030
static wuffs_base__empty_struct
43031
wuffs_etc2__decoder__from_alphas_to_buffer(
43032
    wuffs_etc2__decoder* self);
43033
43034
WUFFS_BASE__GENERATED_C_CODE
43035
static wuffs_base__status
43036
wuffs_etc2__decoder__from_buffer_to_dst(
43037
    wuffs_etc2__decoder* self,
43038
    wuffs_base__pixel_buffer* a_dst);
43039
43040
// ---------------- VTables
43041
43042
const wuffs_base__image_decoder__func_ptrs
43043
wuffs_etc2__decoder__func_ptrs_for__wuffs_base__image_decoder = {
43044
  (wuffs_base__status(*)(void*,
43045
      wuffs_base__pixel_buffer*,
43046
      wuffs_base__io_buffer*,
43047
      wuffs_base__pixel_blend,
43048
      wuffs_base__slice_u8,
43049
      wuffs_base__decode_frame_options*))(&wuffs_etc2__decoder__decode_frame),
43050
  (wuffs_base__status(*)(void*,
43051
      wuffs_base__frame_config*,
43052
      wuffs_base__io_buffer*))(&wuffs_etc2__decoder__decode_frame_config),
43053
  (wuffs_base__status(*)(void*,
43054
      wuffs_base__image_config*,
43055
      wuffs_base__io_buffer*))(&wuffs_etc2__decoder__decode_image_config),
43056
  (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_etc2__decoder__frame_dirty_rect),
43057
  (uint64_t(*)(const void*,
43058
      uint32_t))(&wuffs_etc2__decoder__get_quirk),
43059
  (uint32_t(*)(const void*))(&wuffs_etc2__decoder__num_animation_loops),
43060
  (uint64_t(*)(const void*))(&wuffs_etc2__decoder__num_decoded_frame_configs),
43061
  (uint64_t(*)(const void*))(&wuffs_etc2__decoder__num_decoded_frames),
43062
  (wuffs_base__status(*)(void*,
43063
      uint64_t,
43064
      uint64_t))(&wuffs_etc2__decoder__restart_frame),
43065
  (wuffs_base__status(*)(void*,
43066
      uint32_t,
43067
      uint64_t))(&wuffs_etc2__decoder__set_quirk),
43068
  (wuffs_base__empty_struct(*)(void*,
43069
      uint32_t,
43070
      bool))(&wuffs_etc2__decoder__set_report_metadata),
43071
  (wuffs_base__status(*)(void*,
43072
      wuffs_base__io_buffer*,
43073
      wuffs_base__more_information*,
43074
      wuffs_base__io_buffer*))(&wuffs_etc2__decoder__tell_me_more),
43075
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_etc2__decoder__workbuf_len),
43076
};
43077
43078
// ---------------- Initializer Implementations
43079
43080
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
43081
wuffs_etc2__decoder__initialize(
43082
    wuffs_etc2__decoder* self,
43083
    size_t sizeof_star_self,
43084
    uint64_t wuffs_version,
43085
    uint32_t options){
43086
  if (!self) {
43087
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
43088
  }
43089
  if (sizeof(*self) != sizeof_star_self) {
43090
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
43091
  }
43092
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
43093
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
43094
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
43095
  }
43096
43097
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
43098
    // The whole point of this if-check is to detect an uninitialized *self.
43099
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
43100
#if !defined(__clang__) && defined(__GNUC__)
43101
#pragma GCC diagnostic push
43102
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
43103
#endif
43104
    if (self->private_impl.magic != 0) {
43105
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
43106
    }
43107
#if !defined(__clang__) && defined(__GNUC__)
43108
#pragma GCC diagnostic pop
43109
#endif
43110
  } else {
43111
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
43112
      memset(self, 0, sizeof(*self));
43113
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
43114
    } else {
43115
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
43116
    }
43117
  }
43118
43119
  self->private_impl.magic = WUFFS_BASE__MAGIC;
43120
  self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name =
43121
      wuffs_base__image_decoder__vtable_name;
43122
  self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers =
43123
      (const void*)(&wuffs_etc2__decoder__func_ptrs_for__wuffs_base__image_decoder);
43124
  return wuffs_base__make_status(NULL);
43125
}
43126
43127
wuffs_etc2__decoder*
43128
wuffs_etc2__decoder__alloc(void) {
43129
  wuffs_etc2__decoder* x =
43130
      (wuffs_etc2__decoder*)(calloc(1, sizeof(wuffs_etc2__decoder)));
43131
  if (!x) {
43132
    return NULL;
43133
  }
43134
  if (wuffs_etc2__decoder__initialize(
43135
      x, sizeof(wuffs_etc2__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
43136
    free(x);
43137
    return NULL;
43138
  }
43139
  return x;
43140
}
43141
43142
size_t
43143
sizeof__wuffs_etc2__decoder(void) {
43144
  return sizeof(wuffs_etc2__decoder);
43145
}
43146
43147
// ---------------- Function Implementations
43148
43149
// -------- func etc2.decoder.get_quirk
43150
43151
WUFFS_BASE__GENERATED_C_CODE
43152
WUFFS_BASE__MAYBE_STATIC uint64_t
43153
wuffs_etc2__decoder__get_quirk(
43154
    const wuffs_etc2__decoder* self,
43155
    uint32_t a_key) {
43156
  if (!self) {
43157
    return 0;
43158
  }
43159
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
43160
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
43161
    return 0;
43162
  }
43163
43164
  return 0u;
43165
}
43166
43167
// -------- func etc2.decoder.set_quirk
43168
43169
WUFFS_BASE__GENERATED_C_CODE
43170
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
43171
wuffs_etc2__decoder__set_quirk(
43172
    wuffs_etc2__decoder* self,
43173
    uint32_t a_key,
43174
    uint64_t a_value) {
43175
  if (!self) {
43176
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
43177
  }
43178
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
43179
    return wuffs_base__make_status(
43180
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
43181
        ? wuffs_base__error__disabled_by_previous_error
43182
        : wuffs_base__error__initialize_not_called);
43183
  }
43184
43185
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
43186
}
43187
43188
// -------- func etc2.decoder.decode_image_config
43189
43190
WUFFS_BASE__GENERATED_C_CODE
43191
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
43192
wuffs_etc2__decoder__decode_image_config(
43193
    wuffs_etc2__decoder* self,
43194
    wuffs_base__image_config* a_dst,
43195
    wuffs_base__io_buffer* a_src) {
43196
  if (!self) {
43197
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
43198
  }
43199
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
43200
    return wuffs_base__make_status(
43201
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
43202
        ? wuffs_base__error__disabled_by_previous_error
43203
        : wuffs_base__error__initialize_not_called);
43204
  }
43205
  if (!a_src) {
43206
    self->private_impl.magic = WUFFS_BASE__DISABLED;
43207
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
43208
  }
43209
  if ((self->private_impl.active_coroutine != 0) &&
43210
      (self->private_impl.active_coroutine != 1)) {
43211
    self->private_impl.magic = WUFFS_BASE__DISABLED;
43212
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
43213
  }
43214
  self->private_impl.active_coroutine = 0;
43215
  wuffs_base__status status = wuffs_base__make_status(NULL);
43216
43217
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
43218
43219
  uint32_t coro_susp_point = self->private_impl.p_decode_image_config;
43220
  switch (coro_susp_point) {
43221
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
43222
43223
    while (true) {
43224
      {
43225
        wuffs_base__status t_0 = wuffs_etc2__decoder__do_decode_image_config(self, a_dst, a_src);
43226
        v_status = t_0;
43227
      }
43228
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
43229
        status = wuffs_base__make_status(wuffs_etc2__error__truncated_input);
43230
        goto exit;
43231
      }
43232
      status = v_status;
43233
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
43234
    }
43235
43236
    ok:
43237
    self->private_impl.p_decode_image_config = 0;
43238
    goto exit;
43239
  }
43240
43241
  goto suspend;
43242
  suspend:
43243
  self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
43244
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
43245
43246
  goto exit;
43247
  exit:
43248
  if (wuffs_base__status__is_error(&status)) {
43249
    self->private_impl.magic = WUFFS_BASE__DISABLED;
43250
  }
43251
  return status;
43252
}
43253
43254
// -------- func etc2.decoder.do_decode_image_config
43255
43256
WUFFS_BASE__GENERATED_C_CODE
43257
static wuffs_base__status
43258
wuffs_etc2__decoder__do_decode_image_config(
43259
    wuffs_etc2__decoder* self,
43260
    wuffs_base__image_config* a_dst,
43261
    wuffs_base__io_buffer* a_src) {
43262
  wuffs_base__status status = wuffs_base__make_status(NULL);
43263
43264
  uint32_t v_c32 = 0;
43265
  uint16_t v_rounded_up_width = 0;
43266
  uint16_t v_rounded_up_height = 0;
43267
43268
  const uint8_t* iop_a_src = NULL;
43269
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
43270
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
43271
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
43272
  if (a_src && a_src->data.ptr) {
43273
    io0_a_src = a_src->data.ptr;
43274
    io1_a_src = io0_a_src + a_src->meta.ri;
43275
    iop_a_src = io1_a_src;
43276
    io2_a_src = io0_a_src + a_src->meta.wi;
43277
  }
43278
43279
  uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config;
43280
  if (coro_susp_point) {
43281
    v_rounded_up_width = self->private_data.s_do_decode_image_config.v_rounded_up_width;
43282
    v_rounded_up_height = self->private_data.s_do_decode_image_config.v_rounded_up_height;
43283
  }
43284
  switch (coro_susp_point) {
43285
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
43286
43287
    if (self->private_impl.f_call_sequence != 0u) {
43288
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
43289
      goto exit;
43290
    }
43291
    {
43292
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
43293
      uint32_t t_0;
43294
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
43295
        t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
43296
        iop_a_src += 4;
43297
      } else {
43298
        self->private_data.s_do_decode_image_config.scratch = 0;
43299
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
43300
        while (true) {
43301
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
43302
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
43303
            goto suspend;
43304
          }
43305
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
43306
          uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
43307
          *scratch <<= 8;
43308
          *scratch >>= 8;
43309
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
43310
          if (num_bits_0 == 24) {
43311
            t_0 = ((uint32_t)(*scratch));
43312
            break;
43313
          }
43314
          num_bits_0 += 8u;
43315
          *scratch |= ((uint64_t)(num_bits_0)) << 56;
43316
        }
43317
      }
43318
      v_c32 = t_0;
43319
    }
43320
    if (v_c32 != 541936464u) {
43321
      status = wuffs_base__make_status(wuffs_etc2__error__bad_header);
43322
      goto exit;
43323
    }
43324
    {
43325
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
43326
      uint32_t t_1;
43327
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
43328
        t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
43329
        iop_a_src += 4;
43330
      } else {
43331
        self->private_data.s_do_decode_image_config.scratch = 0;
43332
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
43333
        while (true) {
43334
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
43335
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
43336
            goto suspend;
43337
          }
43338
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
43339
          uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
43340
          *scratch <<= 8;
43341
          *scratch >>= 8;
43342
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
43343
          if (num_bits_1 == 24) {
43344
            t_1 = ((uint32_t)(*scratch));
43345
            break;
43346
          }
43347
          num_bits_1 += 8u;
43348
          *scratch |= ((uint64_t)(num_bits_1)) << 56;
43349
        }
43350
      }
43351
      v_c32 = t_1;
43352
    }
43353
    if ((v_c32 == 12337u) || (v_c32 == 16789554u) || (v_c32 == 151007282u)) {
43354
      self->private_impl.f_pixfmt = 2415954056u;
43355
    } else if ((v_c32 == 50343986u) || (v_c32 == 167784498u)) {
43356
      self->private_impl.f_pixfmt = 2164295816u;
43357
    } else if ((v_c32 == 67121202u) || (v_c32 == 184561714u)) {
43358
      self->private_impl.f_pixfmt = 2197850248u;
43359
    } else if ((v_c32 & 65535u) == 12338u) {
43360
      status = wuffs_base__make_status(wuffs_etc2__error__unsupported_etc2_file);
43361
      goto exit;
43362
    } else {
43363
      status = wuffs_base__make_status(wuffs_etc2__error__bad_header);
43364
      goto exit;
43365
    }
43366
    self->private_impl.f_srgb = ((v_c32 >> 24u) >= 9u);
43367
    {
43368
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
43369
      uint16_t t_2;
43370
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
43371
        t_2 = wuffs_base__peek_u16be__no_bounds_check(iop_a_src);
43372
        iop_a_src += 2;
43373
      } else {
43374
        self->private_data.s_do_decode_image_config.scratch = 0;
43375
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
43376
        while (true) {
43377
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
43378
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
43379
            goto suspend;
43380
          }
43381
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
43382
          uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu));
43383
          *scratch >>= 8;
43384
          *scratch <<= 8;
43385
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2);
43386
          if (num_bits_2 == 8) {
43387
            t_2 = ((uint16_t)(*scratch >> 48));
43388
            break;
43389
          }
43390
          num_bits_2 += 8u;
43391
          *scratch |= ((uint64_t)(num_bits_2));
43392
        }
43393
      }
43394
      v_rounded_up_width = t_2;
43395
    }
43396
    {
43397
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
43398
      uint16_t t_3;
43399
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
43400
        t_3 = wuffs_base__peek_u16be__no_bounds_check(iop_a_src);
43401
        iop_a_src += 2;
43402
      } else {
43403
        self->private_data.s_do_decode_image_config.scratch = 0;
43404
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
43405
        while (true) {
43406
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
43407
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
43408
            goto suspend;
43409
          }
43410
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
43411
          uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFFu));
43412
          *scratch >>= 8;
43413
          *scratch <<= 8;
43414
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3);
43415
          if (num_bits_3 == 8) {
43416
            t_3 = ((uint16_t)(*scratch >> 48));
43417
            break;
43418
          }
43419
          num_bits_3 += 8u;
43420
          *scratch |= ((uint64_t)(num_bits_3));
43421
        }
43422
      }
43423
      v_rounded_up_height = t_3;
43424
    }
43425
    {
43426
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
43427
      uint32_t t_4;
43428
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
43429
        t_4 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src)));
43430
        iop_a_src += 2;
43431
      } else {
43432
        self->private_data.s_do_decode_image_config.scratch = 0;
43433
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
43434
        while (true) {
43435
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
43436
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
43437
            goto suspend;
43438
          }
43439
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
43440
          uint32_t num_bits_4 = ((uint32_t)(*scratch & 0xFFu));
43441
          *scratch >>= 8;
43442
          *scratch <<= 8;
43443
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_4);
43444
          if (num_bits_4 == 8) {
43445
            t_4 = ((uint32_t)(*scratch >> 48));
43446
            break;
43447
          }
43448
          num_bits_4 += 8u;
43449
          *scratch |= ((uint64_t)(num_bits_4));
43450
        }
43451
      }
43452
      v_c32 = t_4;
43453
    }
43454
    if (((v_c32 + 3u) & 4294967292u) != ((uint32_t)(v_rounded_up_width))) {
43455
      status = wuffs_base__make_status(wuffs_etc2__error__bad_header);
43456
      goto exit;
43457
    }
43458
    self->private_impl.f_width = v_c32;
43459
    {
43460
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11);
43461
      uint32_t t_5;
43462
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
43463
        t_5 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src)));
43464
        iop_a_src += 2;
43465
      } else {
43466
        self->private_data.s_do_decode_image_config.scratch = 0;
43467
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12);
43468
        while (true) {
43469
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
43470
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
43471
            goto suspend;
43472
          }
43473
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
43474
          uint32_t num_bits_5 = ((uint32_t)(*scratch & 0xFFu));
43475
          *scratch >>= 8;
43476
          *scratch <<= 8;
43477
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_5);
43478
          if (num_bits_5 == 8) {
43479
            t_5 = ((uint32_t)(*scratch >> 48));
43480
            break;
43481
          }
43482
          num_bits_5 += 8u;
43483
          *scratch |= ((uint64_t)(num_bits_5));
43484
        }
43485
      }
43486
      v_c32 = t_5;
43487
    }
43488
    if (((v_c32 + 3u) & 4294967292u) != ((uint32_t)(v_rounded_up_height))) {
43489
      status = wuffs_base__make_status(wuffs_etc2__error__bad_header);
43490
      goto exit;
43491
    }
43492
    self->private_impl.f_height = v_c32;
43493
    if (a_dst != NULL) {
43494
      wuffs_base__image_config__set(
43495
          a_dst,
43496
          self->private_impl.f_pixfmt,
43497
          0u,
43498
          self->private_impl.f_width,
43499
          self->private_impl.f_height,
43500
          16u,
43501
          (self->private_impl.f_pixfmt == 2415954056u));
43502
    }
43503
    self->private_impl.f_call_sequence = 32u;
43504
43505
    goto ok;
43506
    ok:
43507
    self->private_impl.p_do_decode_image_config = 0;
43508
    goto exit;
43509
  }
43510
43511
  goto suspend;
43512
  suspend:
43513
  self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
43514
  self->private_data.s_do_decode_image_config.v_rounded_up_width = v_rounded_up_width;
43515
  self->private_data.s_do_decode_image_config.v_rounded_up_height = v_rounded_up_height;
43516
43517
  goto exit;
43518
  exit:
43519
  if (a_src && a_src->data.ptr) {
43520
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
43521
  }
43522
43523
  return status;
43524
}
43525
43526
// -------- func etc2.decoder.decode_frame_config
43527
43528
WUFFS_BASE__GENERATED_C_CODE
43529
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
43530
wuffs_etc2__decoder__decode_frame_config(
43531
    wuffs_etc2__decoder* self,
43532
    wuffs_base__frame_config* a_dst,
43533
    wuffs_base__io_buffer* a_src) {
43534
  if (!self) {
43535
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
43536
  }
43537
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
43538
    return wuffs_base__make_status(
43539
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
43540
        ? wuffs_base__error__disabled_by_previous_error
43541
        : wuffs_base__error__initialize_not_called);
43542
  }
43543
  if (!a_src) {
43544
    self->private_impl.magic = WUFFS_BASE__DISABLED;
43545
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
43546
  }
43547
  if ((self->private_impl.active_coroutine != 0) &&
43548
      (self->private_impl.active_coroutine != 2)) {
43549
    self->private_impl.magic = WUFFS_BASE__DISABLED;
43550
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
43551
  }
43552
  self->private_impl.active_coroutine = 0;
43553
  wuffs_base__status status = wuffs_base__make_status(NULL);
43554
43555
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
43556
43557
  uint32_t coro_susp_point = self->private_impl.p_decode_frame_config;
43558
  switch (coro_susp_point) {
43559
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
43560
43561
    while (true) {
43562
      {
43563
        wuffs_base__status t_0 = wuffs_etc2__decoder__do_decode_frame_config(self, a_dst, a_src);
43564
        v_status = t_0;
43565
      }
43566
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
43567
        status = wuffs_base__make_status(wuffs_etc2__error__truncated_input);
43568
        goto exit;
43569
      }
43570
      status = v_status;
43571
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
43572
    }
43573
43574
    ok:
43575
    self->private_impl.p_decode_frame_config = 0;
43576
    goto exit;
43577
  }
43578
43579
  goto suspend;
43580
  suspend:
43581
  self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
43582
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0;
43583
43584
  goto exit;
43585
  exit:
43586
  if (wuffs_base__status__is_error(&status)) {
43587
    self->private_impl.magic = WUFFS_BASE__DISABLED;
43588
  }
43589
  return status;
43590
}
43591
43592
// -------- func etc2.decoder.do_decode_frame_config
43593
43594
WUFFS_BASE__GENERATED_C_CODE
43595
static wuffs_base__status
43596
wuffs_etc2__decoder__do_decode_frame_config(
43597
    wuffs_etc2__decoder* self,
43598
    wuffs_base__frame_config* a_dst,
43599
    wuffs_base__io_buffer* a_src) {
43600
  wuffs_base__status status = wuffs_base__make_status(NULL);
43601
43602
  wuffs_base__pixel_format v_pixfmt = {0};
43603
43604
  const uint8_t* iop_a_src = NULL;
43605
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
43606
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
43607
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
43608
  if (a_src && a_src->data.ptr) {
43609
    io0_a_src = a_src->data.ptr;
43610
    io1_a_src = io0_a_src + a_src->meta.ri;
43611
    iop_a_src = io1_a_src;
43612
    io2_a_src = io0_a_src + a_src->meta.wi;
43613
  }
43614
43615
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config;
43616
  switch (coro_susp_point) {
43617
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
43618
43619
    if (self->private_impl.f_call_sequence == 32u) {
43620
    } else if (self->private_impl.f_call_sequence < 32u) {
43621
      if (a_src) {
43622
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
43623
      }
43624
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
43625
      status = wuffs_etc2__decoder__do_decode_image_config(self, NULL, a_src);
43626
      if (a_src) {
43627
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
43628
      }
43629
      if (status.repr) {
43630
        goto suspend;
43631
      }
43632
    } else if (self->private_impl.f_call_sequence == 40u) {
43633
      if (16u != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) {
43634
        status = wuffs_base__make_status(wuffs_base__error__bad_restart);
43635
        goto exit;
43636
      }
43637
    } else if (self->private_impl.f_call_sequence == 64u) {
43638
      self->private_impl.f_call_sequence = 96u;
43639
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
43640
      goto ok;
43641
    } else {
43642
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
43643
      goto ok;
43644
    }
43645
    if (a_dst != NULL) {
43646
      v_pixfmt = wuffs_base__utility__make_pixel_format(self->private_impl.f_pixfmt);
43647
      wuffs_base__frame_config__set(
43648
          a_dst,
43649
          wuffs_base__utility__make_rect_ie_u32(
43650
          0u,
43651
          0u,
43652
          self->private_impl.f_width,
43653
          self->private_impl.f_height),
43654
          ((wuffs_base__flicks)(0u)),
43655
          0u,
43656
          16u,
43657
          0u,
43658
          (self->private_impl.f_pixfmt == 2415954056u),
43659
          false,
43660
          wuffs_base__pixel_format__default_background_color(&v_pixfmt));
43661
    }
43662
    self->private_impl.f_call_sequence = 64u;
43663
43664
    ok:
43665
    self->private_impl.p_do_decode_frame_config = 0;
43666
    goto exit;
43667
  }
43668
43669
  goto suspend;
43670
  suspend:
43671
  self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
43672
43673
  goto exit;
43674
  exit:
43675
  if (a_src && a_src->data.ptr) {
43676
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
43677
  }
43678
43679
  return status;
43680
}
43681
43682
// -------- func etc2.decoder.decode_frame
43683
43684
WUFFS_BASE__GENERATED_C_CODE
43685
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
43686
wuffs_etc2__decoder__decode_frame(
43687
    wuffs_etc2__decoder* self,
43688
    wuffs_base__pixel_buffer* a_dst,
43689
    wuffs_base__io_buffer* a_src,
43690
    wuffs_base__pixel_blend a_blend,
43691
    wuffs_base__slice_u8 a_workbuf,
43692
    wuffs_base__decode_frame_options* a_opts) {
43693
  if (!self) {
43694
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
43695
  }
43696
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
43697
    return wuffs_base__make_status(
43698
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
43699
        ? wuffs_base__error__disabled_by_previous_error
43700
        : wuffs_base__error__initialize_not_called);
43701
  }
43702
  if (!a_dst || !a_src) {
43703
    self->private_impl.magic = WUFFS_BASE__DISABLED;
43704
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
43705
  }
43706
  if ((self->private_impl.active_coroutine != 0) &&
43707
      (self->private_impl.active_coroutine != 3)) {
43708
    self->private_impl.magic = WUFFS_BASE__DISABLED;
43709
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
43710
  }
43711
  self->private_impl.active_coroutine = 0;
43712
  wuffs_base__status status = wuffs_base__make_status(NULL);
43713
43714
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
43715
43716
  uint32_t coro_susp_point = self->private_impl.p_decode_frame;
43717
  switch (coro_susp_point) {
43718
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
43719
43720
    while (true) {
43721
      {
43722
        wuffs_base__status t_0 = wuffs_etc2__decoder__do_decode_frame(self,
43723
            a_dst,
43724
            a_src,
43725
            a_blend,
43726
            a_workbuf,
43727
            a_opts);
43728
        v_status = t_0;
43729
      }
43730
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
43731
        status = wuffs_base__make_status(wuffs_etc2__error__truncated_input);
43732
        goto exit;
43733
      }
43734
      status = v_status;
43735
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
43736
    }
43737
43738
    ok:
43739
    self->private_impl.p_decode_frame = 0;
43740
    goto exit;
43741
  }
43742
43743
  goto suspend;
43744
  suspend:
43745
  self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
43746
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0;
43747
43748
  goto exit;
43749
  exit:
43750
  if (wuffs_base__status__is_error(&status)) {
43751
    self->private_impl.magic = WUFFS_BASE__DISABLED;
43752
  }
43753
  return status;
43754
}
43755
43756
// -------- func etc2.decoder.do_decode_frame
43757
43758
WUFFS_BASE__GENERATED_C_CODE
43759
static wuffs_base__status
43760
wuffs_etc2__decoder__do_decode_frame(
43761
    wuffs_etc2__decoder* self,
43762
    wuffs_base__pixel_buffer* a_dst,
43763
    wuffs_base__io_buffer* a_src,
43764
    wuffs_base__pixel_blend a_blend,
43765
    wuffs_base__slice_u8 a_workbuf,
43766
    wuffs_base__decode_frame_options* a_opts) {
43767
  wuffs_base__status status = wuffs_base__make_status(NULL);
43768
43769
  uint32_t v_remaining = 0;
43770
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
43771
43772
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame;
43773
  if (coro_susp_point) {
43774
    v_remaining = self->private_data.s_do_decode_frame.v_remaining;
43775
  }
43776
  switch (coro_susp_point) {
43777
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
43778
43779
    if (self->private_impl.f_call_sequence == 64u) {
43780
    } else if (self->private_impl.f_call_sequence < 64u) {
43781
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
43782
      status = wuffs_etc2__decoder__do_decode_frame_config(self, NULL, a_src);
43783
      if (status.repr) {
43784
        goto suspend;
43785
      }
43786
    } else {
43787
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
43788
      goto ok;
43789
    }
43790
    v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler,
43791
        wuffs_base__pixel_buffer__pixel_format(a_dst),
43792
        wuffs_base__pixel_buffer__palette(a_dst),
43793
        wuffs_base__utility__make_pixel_format(self->private_impl.f_pixfmt),
43794
        wuffs_base__utility__empty_slice_u8(),
43795
        a_blend);
43796
    if ( ! wuffs_base__status__is_ok(&v_status)) {
43797
      status = v_status;
43798
      if (wuffs_base__status__is_error(&status)) {
43799
        goto exit;
43800
      } else if (wuffs_base__status__is_suspension(&status)) {
43801
        status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
43802
        goto exit;
43803
      }
43804
      goto ok;
43805
    }
43806
    self->private_impl.f_dst_x = 0u;
43807
    self->private_impl.f_dst_y = 0u;
43808
    v_remaining = (((self->private_impl.f_width + 3u) / 4u) * ((self->private_impl.f_height + 3u) / 4u));
43809
    while (v_remaining > 0u) {
43810
      self->private_impl.f_num_buffered_blocks = wuffs_base__u32__min(v_remaining, 64u);
43811
      if (v_remaining < self->private_impl.f_num_buffered_blocks) {
43812
        status = wuffs_base__make_status(wuffs_base__error__too_much_data);
43813
        goto exit;
43814
      }
43815
      v_remaining -= self->private_impl.f_num_buffered_blocks;
43816
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
43817
      status = wuffs_etc2__decoder__from_src_to_colors(self, a_src);
43818
      if (status.repr) {
43819
        goto suspend;
43820
      }
43821
      wuffs_etc2__decoder__from_colors_to_buffer(self);
43822
      if (self->private_impl.f_pixfmt == 2164295816u) {
43823
        wuffs_etc2__decoder__from_alphas_to_buffer(self);
43824
      }
43825
      v_status = wuffs_etc2__decoder__from_buffer_to_dst(self, a_dst);
43826
      if ( ! wuffs_base__status__is_ok(&v_status)) {
43827
        status = v_status;
43828
        if (wuffs_base__status__is_error(&status)) {
43829
          goto exit;
43830
        } else if (wuffs_base__status__is_suspension(&status)) {
43831
          status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
43832
          goto exit;
43833
        }
43834
        goto ok;
43835
      }
43836
    }
43837
    self->private_impl.f_call_sequence = 96u;
43838
43839
    ok:
43840
    self->private_impl.p_do_decode_frame = 0;
43841
    goto exit;
43842
  }
43843
43844
  goto suspend;
43845
  suspend:
43846
  self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
43847
  self->private_data.s_do_decode_frame.v_remaining = v_remaining;
43848
43849
  goto exit;
43850
  exit:
43851
  return status;
43852
}
43853
43854
// -------- func etc2.decoder.from_src_to_colors
43855
43856
WUFFS_BASE__GENERATED_C_CODE
43857
static wuffs_base__status
43858
wuffs_etc2__decoder__from_src_to_colors(
43859
    wuffs_etc2__decoder* self,
43860
    wuffs_base__io_buffer* a_src) {
43861
  wuffs_base__status status = wuffs_base__make_status(NULL);
43862
43863
  uint32_t v_bi = 0;
43864
43865
  const uint8_t* iop_a_src = NULL;
43866
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
43867
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
43868
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
43869
  if (a_src && a_src->data.ptr) {
43870
    io0_a_src = a_src->data.ptr;
43871
    io1_a_src = io0_a_src + a_src->meta.ri;
43872
    iop_a_src = io1_a_src;
43873
    io2_a_src = io0_a_src + a_src->meta.wi;
43874
  }
43875
43876
  uint32_t coro_susp_point = self->private_impl.p_from_src_to_colors;
43877
  if (coro_susp_point) {
43878
    v_bi = self->private_data.s_from_src_to_colors.v_bi;
43879
  }
43880
  switch (coro_susp_point) {
43881
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
43882
43883
    while (v_bi < self->private_impl.f_num_buffered_blocks) {
43884
      if (self->private_impl.f_pixfmt == 2164295816u) {
43885
        {
43886
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
43887
          uint64_t t_0;
43888
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) {
43889
            t_0 = wuffs_base__peek_u64be__no_bounds_check(iop_a_src);
43890
            iop_a_src += 8;
43891
          } else {
43892
            self->private_data.s_from_src_to_colors.scratch = 0;
43893
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
43894
            while (true) {
43895
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
43896
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
43897
                goto suspend;
43898
              }
43899
              uint64_t* scratch = &self->private_data.s_from_src_to_colors.scratch;
43900
              uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu));
43901
              *scratch >>= 8;
43902
              *scratch <<= 8;
43903
              *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0);
43904
              if (num_bits_0 == 56) {
43905
                t_0 = ((uint64_t)(*scratch >> 0));
43906
                break;
43907
              }
43908
              num_bits_0 += 8u;
43909
              *scratch |= ((uint64_t)(num_bits_0));
43910
            }
43911
          }
43912
          self->private_data.f_alphas[v_bi] = t_0;
43913
        }
43914
      }
43915
      {
43916
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
43917
        uint64_t t_1;
43918
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) {
43919
          t_1 = wuffs_base__peek_u64be__no_bounds_check(iop_a_src);
43920
          iop_a_src += 8;
43921
        } else {
43922
          self->private_data.s_from_src_to_colors.scratch = 0;
43923
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
43924
          while (true) {
43925
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
43926
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
43927
              goto suspend;
43928
            }
43929
            uint64_t* scratch = &self->private_data.s_from_src_to_colors.scratch;
43930
            uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu));
43931
            *scratch >>= 8;
43932
            *scratch <<= 8;
43933
            *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1);
43934
            if (num_bits_1 == 56) {
43935
              t_1 = ((uint64_t)(*scratch >> 0));
43936
              break;
43937
            }
43938
            num_bits_1 += 8u;
43939
            *scratch |= ((uint64_t)(num_bits_1));
43940
          }
43941
        }
43942
        self->private_data.f_colors[v_bi] = t_1;
43943
      }
43944
      v_bi += 1u;
43945
    }
43946
43947
    goto ok;
43948
    ok:
43949
    self->private_impl.p_from_src_to_colors = 0;
43950
    goto exit;
43951
  }
43952
43953
  goto suspend;
43954
  suspend:
43955
  self->private_impl.p_from_src_to_colors = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
43956
  self->private_data.s_from_src_to_colors.v_bi = v_bi;
43957
43958
  goto exit;
43959
  exit:
43960
  if (a_src && a_src->data.ptr) {
43961
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
43962
  }
43963
43964
  return status;
43965
}
43966
43967
// -------- func etc2.decoder.from_colors_to_buffer
43968
43969
WUFFS_BASE__GENERATED_C_CODE
43970
static wuffs_base__empty_struct
43971
wuffs_etc2__decoder__from_colors_to_buffer(
43972
    wuffs_etc2__decoder* self) {
43973
  uint32_t v_bi = 0;
43974
  uint64_t v_color = 0;
43975
  uint32_t v_r0 = 0;
43976
  uint32_t v_r1 = 0;
43977
  uint32_t v_g0 = 0;
43978
  uint32_t v_g1 = 0;
43979
  uint32_t v_b0 = 0;
43980
  uint32_t v_b1 = 0;
43981
  bool v_diff = false;
43982
  bool v_tran = false;
43983
  bool v_flip = false;
43984
43985
  while (v_bi < self->private_impl.f_num_buffered_blocks) {
43986
    v_color = self->private_data.f_colors[v_bi];
43987
    v_diff = ((v_color & 8589934592u) != 0u);
43988
    v_tran = ( ! v_diff && (self->private_impl.f_pixfmt == 2197850248u));
43989
    if ( ! v_diff && (self->private_impl.f_pixfmt != 2197850248u)) {
43990
      v_r0 = ((uint32_t)((15u & (v_color >> 60u))));
43991
      v_r0 = ((v_r0 << 4u) | v_r0);
43992
      v_r1 = ((uint32_t)((15u & (v_color >> 56u))));
43993
      v_r1 = ((v_r1 << 4u) | v_r1);
43994
      v_g0 = ((uint32_t)((15u & (v_color >> 52u))));
43995
      v_g0 = ((v_g0 << 4u) | v_g0);
43996
      v_g1 = ((uint32_t)((15u & (v_color >> 48u))));
43997
      v_g1 = ((v_g1 << 4u) | v_g1);
43998
      v_b0 = ((uint32_t)((15u & (v_color >> 44u))));
43999
      v_b0 = ((v_b0 << 4u) | v_b0);
44000
      v_b1 = ((uint32_t)((15u & (v_color >> 40u))));
44001
      v_b1 = ((v_b1 << 4u) | v_b1);
44002
    } else {
44003
      v_r0 = ((uint32_t)((31u & (v_color >> 59u))));
44004
      v_r1 = ((uint32_t)(v_r0 + WUFFS_ETC2__DIFFS[(7u & (v_color >> 56u))]));
44005
      if ((v_r1 >> 5u) != 0u) {
44006
        wuffs_etc2__decoder__decode_t_mode(self, v_color, (16u * v_bi), v_tran);
44007
        v_bi += 1u;
44008
        continue;
44009
      }
44010
      v_r0 = (((uint32_t)(v_r0 << 3u)) | (v_r0 >> 2u));
44011
      v_r1 = (((uint32_t)(v_r1 << 3u)) | (v_r1 >> 2u));
44012
      v_g0 = ((uint32_t)((31u & (v_color >> 51u))));
44013
      v_g1 = ((uint32_t)(v_g0 + WUFFS_ETC2__DIFFS[(7u & (v_color >> 48u))]));
44014
      if ((v_g1 >> 5u) != 0u) {
44015
        wuffs_etc2__decoder__decode_h_mode(self, v_color, (16u * v_bi), v_tran);
44016
        v_bi += 1u;
44017
        continue;
44018
      }
44019
      v_g0 = (((uint32_t)(v_g0 << 3u)) | (v_g0 >> 2u));
44020
      v_g1 = (((uint32_t)(v_g1 << 3u)) | (v_g1 >> 2u));
44021
      v_b0 = ((uint32_t)((31u & (v_color >> 43u))));
44022
      v_b1 = ((uint32_t)(v_b0 + WUFFS_ETC2__DIFFS[(7u & (v_color >> 40u))]));
44023
      if ((v_b1 >> 5u) != 0u) {
44024
        wuffs_etc2__decoder__decode_planar_mode(self, v_color, (16u * v_bi));
44025
        v_bi += 1u;
44026
        continue;
44027
      }
44028
      v_b0 = (((uint32_t)(v_b0 << 3u)) | (v_b0 >> 2u));
44029
      v_b1 = (((uint32_t)(v_b1 << 3u)) | (v_b1 >> 2u));
44030
    }
44031
    v_flip = ((v_color & 4294967296u) != 0u);
44032
    wuffs_etc2__decoder__decode_half_block(self,
44033
        ((uint32_t)(v_color)),
44034
        (16u * v_bi),
44035
        ((uint32_t)(((v_color >> 37u) & 7u))),
44036
        v_r0,
44037
        v_g0,
44038
        v_b0,
44039
        v_flip,
44040
        v_tran,
44041
        false);
44042
    wuffs_etc2__decoder__decode_half_block(self,
44043
        ((uint32_t)(v_color)),
44044
        (16u * v_bi),
44045
        ((uint32_t)(((v_color >> 34u) & 7u))),
44046
        v_r1,
44047
        v_g1,
44048
        v_b1,
44049
        v_flip,
44050
        v_tran,
44051
        true);
44052
    v_bi += 1u;
44053
  }
44054
  return wuffs_base__make_empty_struct();
44055
}
44056
44057
// -------- func etc2.decoder.decode_t_mode
44058
44059
WUFFS_BASE__GENERATED_C_CODE
44060
static wuffs_base__empty_struct
44061
wuffs_etc2__decoder__decode_t_mode(
44062
    wuffs_etc2__decoder* self,
44063
    uint64_t a_bits,
44064
    uint32_t a_offset,
44065
    bool a_transparent) {
44066
  uint8_t v_r[4] = {0};
44067
  uint8_t v_g[4] = {0};
44068
  uint8_t v_b[4] = {0};
44069
  uint8_t v_a[4] = {0};
44070
  uint32_t v_which = 0;
44071
  uint32_t v_delta = 0;
44072
  uint32_t v_y = 0;
44073
  uint32_t v_x = 0;
44074
  uint32_t v_x4y = 0;
44075
  uint32_t v_index = 0;
44076
  uint32_t v_o = 0;
44077
44078
  v_r[0u] = ((uint8_t)(((uint8_t)((12u & (a_bits >> 57u)))) | ((uint8_t)((3u & (a_bits >> 56u))))));
44079
  v_r[0u] = ((uint8_t)(((uint8_t)(v_r[0u] << 4u)) | v_r[0u]));
44080
  v_g[0u] = ((uint8_t)((15u & (a_bits >> 52u))));
44081
  v_g[0u] = ((uint8_t)(((uint8_t)(v_g[0u] << 4u)) | v_g[0u]));
44082
  v_b[0u] = ((uint8_t)((15u & (a_bits >> 48u))));
44083
  v_b[0u] = ((uint8_t)(((uint8_t)(v_b[0u] << 4u)) | v_b[0u]));
44084
  v_a[0u] = 255u;
44085
  v_r[2u] = ((uint8_t)((15u & (a_bits >> 44u))));
44086
  v_r[2u] = ((uint8_t)(((uint8_t)(v_r[2u] << 4u)) | v_r[2u]));
44087
  v_g[2u] = ((uint8_t)((15u & (a_bits >> 40u))));
44088
  v_g[2u] = ((uint8_t)(((uint8_t)(v_g[2u] << 4u)) | v_g[2u]));
44089
  v_b[2u] = ((uint8_t)((15u & (a_bits >> 36u))));
44090
  v_b[2u] = ((uint8_t)(((uint8_t)(v_b[2u] << 4u)) | v_b[2u]));
44091
  v_a[2u] = 255u;
44092
  v_which = (((uint32_t)((6u & (a_bits >> 33u)))) | ((uint32_t)((1u & (a_bits >> 32u)))));
44093
  v_delta = ((uint32_t)(WUFFS_ETC2__T_H_MODIFIERS[v_which]));
44094
  v_r[1u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_r[2u])) + v_delta)) & 1023u)];
44095
  v_g[1u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_g[2u])) + v_delta)) & 1023u)];
44096
  v_b[1u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_b[2u])) + v_delta)) & 1023u)];
44097
  v_a[1u] = 255u;
44098
  v_r[3u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_r[2u])) - v_delta)) & 1023u)];
44099
  v_g[3u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_g[2u])) - v_delta)) & 1023u)];
44100
  v_b[3u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_b[2u])) - v_delta)) & 1023u)];
44101
  v_a[3u] = 255u;
44102
  if (a_transparent) {
44103
    v_r[2u] = 0u;
44104
    v_g[2u] = 0u;
44105
    v_b[2u] = 0u;
44106
    v_a[2u] = 0u;
44107
  }
44108
  while (v_y < 4u) {
44109
    v_x = 0u;
44110
    while (v_x < 4u) {
44111
      v_x4y = ((v_x * 4u) | v_y);
44112
      v_index = (((uint32_t)(((a_bits >> v_x4y) & 1u))) | ((uint32_t)(((a_bits >> (v_x4y + 15u)) & 2u))));
44113
      v_o = (a_offset + (v_x * 4u) + (v_y * 1024u));
44114
      self->private_data.f_buffer[(v_o + 0u)] = v_b[v_index];
44115
      self->private_data.f_buffer[(v_o + 1u)] = v_g[v_index];
44116
      self->private_data.f_buffer[(v_o + 2u)] = v_r[v_index];
44117
      self->private_data.f_buffer[(v_o + 3u)] = v_a[v_index];
44118
      v_x += 1u;
44119
    }
44120
    v_y += 1u;
44121
  }
44122
  return wuffs_base__make_empty_struct();
44123
}
44124
44125
// -------- func etc2.decoder.decode_h_mode
44126
44127
WUFFS_BASE__GENERATED_C_CODE
44128
static wuffs_base__empty_struct
44129
wuffs_etc2__decoder__decode_h_mode(
44130
    wuffs_etc2__decoder* self,
44131
    uint64_t a_bits,
44132
    uint32_t a_offset,
44133
    bool a_transparent) {
44134
  uint8_t v_r[4] = {0};
44135
  uint8_t v_g[4] = {0};
44136
  uint8_t v_b[4] = {0};
44137
  uint8_t v_a[4] = {0};
44138
  uint32_t v_rgb0 = 0;
44139
  uint32_t v_rgb2 = 0;
44140
  uint32_t v_which = 0;
44141
  uint32_t v_delta = 0;
44142
  uint32_t v_y = 0;
44143
  uint32_t v_x = 0;
44144
  uint32_t v_x4y = 0;
44145
  uint32_t v_index = 0;
44146
  uint32_t v_o = 0;
44147
44148
  v_r[0u] = ((uint8_t)((15u & (a_bits >> 59u))));
44149
  v_r[0u] = ((uint8_t)(((uint8_t)(v_r[0u] << 4u)) | v_r[0u]));
44150
  v_g[0u] = ((uint8_t)(((uint8_t)((14u & (a_bits >> 55u)))) | ((uint8_t)((1u & (a_bits >> 52u))))));
44151
  v_g[0u] = ((uint8_t)(((uint8_t)(v_g[0u] << 4u)) | v_g[0u]));
44152
  v_b[0u] = ((uint8_t)(((uint8_t)((8u & (a_bits >> 48u)))) | ((uint8_t)((7u & (a_bits >> 47u))))));
44153
  v_b[0u] = ((uint8_t)(((uint8_t)(v_b[0u] << 4u)) | v_b[0u]));
44154
  v_r[2u] = ((uint8_t)((15u & (a_bits >> 43u))));
44155
  v_r[2u] = ((uint8_t)(((uint8_t)(v_r[2u] << 4u)) | v_r[2u]));
44156
  v_g[2u] = ((uint8_t)((15u & (a_bits >> 39u))));
44157
  v_g[2u] = ((uint8_t)(((uint8_t)(v_g[2u] << 4u)) | v_g[2u]));
44158
  v_b[2u] = ((uint8_t)((15u & (a_bits >> 35u))));
44159
  v_b[2u] = ((uint8_t)(((uint8_t)(v_b[2u] << 4u)) | v_b[2u]));
44160
  v_rgb0 = ((((uint32_t)(v_r[0u])) << 16u) | (((uint32_t)(v_g[0u])) << 8u) | (((uint32_t)(v_b[0u])) << 0u));
44161
  v_rgb2 = ((((uint32_t)(v_r[2u])) << 16u) | (((uint32_t)(v_g[2u])) << 8u) | (((uint32_t)(v_b[2u])) << 0u));
44162
  v_which = (((uint32_t)((4u & (a_bits >> 32u)))) | ((uint32_t)((2u & (a_bits >> 31u)))));
44163
  if (v_rgb0 >= v_rgb2) {
44164
    v_which |= 1u;
44165
  }
44166
  v_delta = ((uint32_t)(WUFFS_ETC2__T_H_MODIFIERS[v_which]));
44167
  v_r[1u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_r[0u])) - v_delta)) & 1023u)];
44168
  v_g[1u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_g[0u])) - v_delta)) & 1023u)];
44169
  v_b[1u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_b[0u])) - v_delta)) & 1023u)];
44170
  v_a[1u] = 255u;
44171
  v_r[0u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_r[0u])) + v_delta)) & 1023u)];
44172
  v_g[0u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_g[0u])) + v_delta)) & 1023u)];
44173
  v_b[0u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_b[0u])) + v_delta)) & 1023u)];
44174
  v_a[0u] = 255u;
44175
  v_r[3u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_r[2u])) - v_delta)) & 1023u)];
44176
  v_g[3u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_g[2u])) - v_delta)) & 1023u)];
44177
  v_b[3u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_b[2u])) - v_delta)) & 1023u)];
44178
  v_a[3u] = 255u;
44179
  v_r[2u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_r[2u])) + v_delta)) & 1023u)];
44180
  v_g[2u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_g[2u])) + v_delta)) & 1023u)];
44181
  v_b[2u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_b[2u])) + v_delta)) & 1023u)];
44182
  v_a[2u] = 255u;
44183
  if (a_transparent) {
44184
    v_r[2u] = 0u;
44185
    v_g[2u] = 0u;
44186
    v_b[2u] = 0u;
44187
    v_a[2u] = 0u;
44188
  }
44189
  while (v_y < 4u) {
44190
    v_x = 0u;
44191
    while (v_x < 4u) {
44192
      v_x4y = ((v_x * 4u) | v_y);
44193
      v_index = (((uint32_t)(((a_bits >> v_x4y) & 1u))) | ((uint32_t)(((a_bits >> (v_x4y + 15u)) & 2u))));
44194
      v_o = (a_offset + (v_x * 4u) + (v_y * 1024u));
44195
      self->private_data.f_buffer[(v_o + 0u)] = v_b[v_index];
44196
      self->private_data.f_buffer[(v_o + 1u)] = v_g[v_index];
44197
      self->private_data.f_buffer[(v_o + 2u)] = v_r[v_index];
44198
      self->private_data.f_buffer[(v_o + 3u)] = v_a[v_index];
44199
      v_x += 1u;
44200
    }
44201
    v_y += 1u;
44202
  }
44203
  return wuffs_base__make_empty_struct();
44204
}
44205
44206
// -------- func etc2.decoder.decode_planar_mode
44207
44208
WUFFS_BASE__GENERATED_C_CODE
44209
static wuffs_base__empty_struct
44210
wuffs_etc2__decoder__decode_planar_mode(
44211
    wuffs_etc2__decoder* self,
44212
    uint64_t a_bits,
44213
    uint32_t a_offset) {
44214
  uint32_t v_ro = 0;
44215
  uint32_t v_go = 0;
44216
  uint32_t v_bo = 0;
44217
  uint32_t v_rh = 0;
44218
  uint32_t v_gh = 0;
44219
  uint32_t v_bh = 0;
44220
  uint32_t v_rv = 0;
44221
  uint32_t v_gv = 0;
44222
  uint32_t v_bv = 0;
44223
  uint32_t v_y = 0;
44224
  uint32_t v_x = 0;
44225
  uint32_t v_o = 0;
44226
  uint32_t v_rp = 0;
44227
  uint32_t v_gp = 0;
44228
  uint32_t v_bp = 0;
44229
44230
  v_ro = ((uint32_t)((63u & (a_bits >> 57u))));
44231
  v_ro = (((uint32_t)(v_ro << 2u)) | (v_ro >> 4u));
44232
  v_go = (((uint32_t)((64u & (a_bits >> 50u)))) | ((uint32_t)((63u & (a_bits >> 49u)))));
44233
  v_go = (((uint32_t)(v_go << 1u)) | (v_go >> 6u));
44234
  v_bo = (((uint32_t)((32u & (a_bits >> 43u)))) | ((uint32_t)((24u & (a_bits >> 40u)))) | ((uint32_t)((7u & (a_bits >> 39u)))));
44235
  v_bo = (((uint32_t)(v_bo << 2u)) | (v_bo >> 4u));
44236
  v_rh = (((uint32_t)((62u & (a_bits >> 33u)))) | ((uint32_t)((1u & (a_bits >> 32u)))));
44237
  v_rh = (((uint32_t)(v_rh << 2u)) | (v_rh >> 4u));
44238
  v_gh = ((uint32_t)((127u & (a_bits >> 25u))));
44239
  v_gh = (((uint32_t)(v_gh << 1u)) | (v_gh >> 6u));
44240
  v_bh = ((uint32_t)((63u & (a_bits >> 19u))));
44241
  v_bh = (((uint32_t)(v_bh << 2u)) | (v_bh >> 4u));
44242
  v_rv = ((uint32_t)((63u & (a_bits >> 13u))));
44243
  v_rv = (((uint32_t)(v_rv << 2u)) | (v_rv >> 4u));
44244
  v_gv = ((uint32_t)((127u & (a_bits >> 6u))));
44245
  v_gv = (((uint32_t)(v_gv << 1u)) | (v_gv >> 6u));
44246
  v_bv = ((uint32_t)((63u & (a_bits >> 0u))));
44247
  v_bv = (((uint32_t)(v_bv << 2u)) | (v_bv >> 4u));
44248
  v_rh -= v_ro;
44249
  v_gh -= v_go;
44250
  v_bh -= v_bo;
44251
  v_rv -= v_ro;
44252
  v_gv -= v_go;
44253
  v_bv -= v_bo;
44254
  v_ro *= 4u;
44255
  v_go *= 4u;
44256
  v_bo *= 4u;
44257
  while (v_y < 4u) {
44258
    v_x = 0u;
44259
    while (v_x < 4u) {
44260
      v_o = (a_offset + (v_x * 4u) + (v_y * 1024u));
44261
      v_bp = ((uint32_t)(((uint32_t)(((uint32_t)(v_x * v_bh)) + ((uint32_t)(v_y * v_bv)))) + v_bo));
44262
      self->private_data.f_buffer[(v_o + 0u)] = WUFFS_ETC2__CLAMP[((((uint32_t)(v_bp + 2u)) / 4u) & 1023u)];
44263
      v_gp = ((uint32_t)(((uint32_t)(((uint32_t)(v_x * v_gh)) + ((uint32_t)(v_y * v_gv)))) + v_go));
44264
      self->private_data.f_buffer[(v_o + 1u)] = WUFFS_ETC2__CLAMP[((((uint32_t)(v_gp + 2u)) / 4u) & 1023u)];
44265
      v_rp = ((uint32_t)(((uint32_t)(((uint32_t)(v_x * v_rh)) + ((uint32_t)(v_y * v_rv)))) + v_ro));
44266
      self->private_data.f_buffer[(v_o + 2u)] = WUFFS_ETC2__CLAMP[((((uint32_t)(v_rp + 2u)) / 4u) & 1023u)];
44267
      v_x += 1u;
44268
      self->private_data.f_buffer[(v_o + 3u)] = 255u;
44269
    }
44270
    v_y += 1u;
44271
  }
44272
  return wuffs_base__make_empty_struct();
44273
}
44274
44275
// -------- func etc2.decoder.decode_half_block
44276
44277
WUFFS_BASE__GENERATED_C_CODE
44278
static wuffs_base__empty_struct
44279
wuffs_etc2__decoder__decode_half_block(
44280
    wuffs_etc2__decoder* self,
44281
    uint32_t a_bits,
44282
    uint32_t a_offset,
44283
    uint32_t a_which,
44284
    uint32_t a_r,
44285
    uint32_t a_g,
44286
    uint32_t a_b,
44287
    bool a_flip,
44288
    bool a_transparent,
44289
    bool a_second) {
44290
  uint32_t v_which = 0;
44291
  uint32_t v_x0 = 0;
44292
  uint32_t v_y0 = 0;
44293
  uint32_t v_x = 0;
44294
  uint32_t v_y = 0;
44295
  uint32_t v_i = 0;
44296
  uint32_t v_x4y = 0;
44297
  uint32_t v_index = 0;
44298
  uint32_t v_modif = 0;
44299
  uint32_t v_o = 0;
44300
44301
  v_which = a_which;
44302
  if (a_transparent) {
44303
    v_which |= 8u;
44304
  }
44305
  if ( ! a_second) {
44306
  } else if (a_flip) {
44307
    v_y0 = 2u;
44308
  } else {
44309
    v_x0 = 2u;
44310
  }
44311
  while (v_i < 8u) {
44312
    if (a_flip) {
44313
      v_x = ((v_x0 + (v_i / 2u)) & 3u);
44314
      v_y = (v_y0 + (v_i & 1u));
44315
    } else {
44316
      v_x = (v_x0 + (v_i / 4u));
44317
      v_y = ((v_y0 + v_i) & 3u);
44318
    }
44319
    v_x4y = ((v_x * 4u) | v_y);
44320
    v_index = (((a_bits >> v_x4y) & 1u) | ((a_bits >> (v_x4y + 15u)) & 2u));
44321
    v_modif = WUFFS_ETC2__MODIFIERS[v_which][v_index];
44322
    v_o = (a_offset + (v_x * 4u) + (v_y * 1024u));
44323
    if (a_transparent && (v_index == 2u)) {
44324
      self->private_data.f_buffer[(v_o + 0u)] = 0u;
44325
      self->private_data.f_buffer[(v_o + 1u)] = 0u;
44326
      self->private_data.f_buffer[(v_o + 2u)] = 0u;
44327
      self->private_data.f_buffer[(v_o + 3u)] = 0u;
44328
    } else {
44329
      self->private_data.f_buffer[(v_o + 0u)] = WUFFS_ETC2__CLAMP[(((uint32_t)(a_b + v_modif)) & 1023u)];
44330
      self->private_data.f_buffer[(v_o + 1u)] = WUFFS_ETC2__CLAMP[(((uint32_t)(a_g + v_modif)) & 1023u)];
44331
      self->private_data.f_buffer[(v_o + 2u)] = WUFFS_ETC2__CLAMP[(((uint32_t)(a_r + v_modif)) & 1023u)];
44332
      self->private_data.f_buffer[(v_o + 3u)] = 255u;
44333
    }
44334
    v_i += 1u;
44335
  }
44336
  return wuffs_base__make_empty_struct();
44337
}
44338
44339
// -------- func etc2.decoder.from_alphas_to_buffer
44340
44341
WUFFS_BASE__GENERATED_C_CODE
44342
static wuffs_base__empty_struct
44343
wuffs_etc2__decoder__from_alphas_to_buffer(
44344
    wuffs_etc2__decoder* self) {
44345
  uint32_t v_bi = 0;
44346
  uint64_t v_alpha = 0;
44347
  uint32_t v_a0 = 0;
44348
  uint32_t v_multiplier = 0;
44349
  uint32_t v_which = 0;
44350
  uint32_t v_offset = 0;
44351
  uint32_t v_y = 0;
44352
  uint32_t v_x = 0;
44353
  uint32_t v_shift = 0;
44354
  uint32_t v_delta = 0;
44355
  uint32_t v_o = 0;
44356
44357
  while (v_bi < self->private_impl.f_num_buffered_blocks) {
44358
    v_alpha = self->private_data.f_alphas[v_bi];
44359
    v_a0 = ((uint32_t)((v_alpha >> 56u)));
44360
    v_multiplier = ((uint32_t)(((v_alpha >> 52u) & 15u)));
44361
    v_which = ((uint32_t)(((v_alpha >> 48u) & 15u)));
44362
    v_offset = (16u * v_bi);
44363
    v_y = 0u;
44364
    while (v_y < 4u) {
44365
      v_x = 0u;
44366
      while (v_x < 4u) {
44367
        v_shift = ((((v_x ^ 3u) * 4u) | (v_y ^ 3u)) * 3u);
44368
        v_delta = ((uint32_t)(v_multiplier * WUFFS_ETC2__ALPHA_MODIFIERS[v_which][(7u & (v_alpha >> v_shift))]));
44369
        v_o = (v_offset + (v_x * 4u) + (v_y * 1024u));
44370
        self->private_data.f_buffer[(v_o + 3u)] = WUFFS_ETC2__CLAMP[(((uint32_t)(v_a0 + v_delta)) & 1023u)];
44371
        v_x += 1u;
44372
      }
44373
      v_y += 1u;
44374
    }
44375
    v_bi += 1u;
44376
  }
44377
  return wuffs_base__make_empty_struct();
44378
}
44379
44380
// -------- func etc2.decoder.from_buffer_to_dst
44381
44382
WUFFS_BASE__GENERATED_C_CODE
44383
static wuffs_base__status
44384
wuffs_etc2__decoder__from_buffer_to_dst(
44385
    wuffs_etc2__decoder* self,
44386
    wuffs_base__pixel_buffer* a_dst) {
44387
  wuffs_base__pixel_format v_dst_pixfmt = {0};
44388
  uint32_t v_dst_bits_per_pixel = 0;
44389
  uint32_t v_dst_bytes_per_pixel = 0;
44390
  uint64_t v_dst_bytes_per_row = 0;
44391
  wuffs_base__table_u8 v_tab = {0};
44392
  uint32_t v_bi = 0;
44393
  uint32_t v_rem_x = 0;
44394
  uint32_t v_dy = 0;
44395
  wuffs_base__slice_u8 v_dst = {0};
44396
  wuffs_base__slice_u8 v_src = {0};
44397
  uint32_t v_si = 0;
44398
  uint32_t v_sj = 0;
44399
  uint64_t v_i = 0;
44400
  uint32_t v_num_src_pixels = 0;
44401
44402
  v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
44403
  v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
44404
  if ((v_dst_bits_per_pixel & 7u) != 0u) {
44405
    return wuffs_base__make_status(wuffs_base__error__unsupported_option);
44406
  }
44407
  v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u);
44408
  v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel)));
44409
  v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
44410
  while (v_bi < self->private_impl.f_num_buffered_blocks) {
44411
    if (self->private_impl.f_width <= self->private_impl.f_dst_x) {
44412
      self->private_impl.f_dst_x = 0u;
44413
      self->private_impl.f_dst_y += 4u;
44414
      if (self->private_impl.f_dst_y >= self->private_impl.f_height) {
44415
        break;
44416
      }
44417
      v_rem_x = self->private_impl.f_width;
44418
    } else {
44419
      v_rem_x = (self->private_impl.f_width - self->private_impl.f_dst_x);
44420
    }
44421
    v_dy = 0u;
44422
    while (v_dy < 4u) {
44423
      v_si = ((1024u * v_dy) + (16u * v_bi));
44424
      v_sj = ((1024u * v_dy) + 1024u);
44425
      if (v_si < v_sj) {
44426
        v_src = wuffs_base__make_slice_u8_ij(self->private_data.f_buffer, v_si, v_sj);
44427
      }
44428
      if (((uint64_t)((4u * v_rem_x))) < ((uint64_t)(v_src.len))) {
44429
        v_src = wuffs_base__slice_u8__subslice_j(v_src, ((uint64_t)((4u * v_rem_x))));
44430
      }
44431
      if (((uint32_t)(self->private_impl.f_dst_y + v_dy)) >= self->private_impl.f_height) {
44432
        break;
44433
      }
44434
      v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, ((uint32_t)(self->private_impl.f_dst_y + v_dy)));
44435
      if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) {
44436
        v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row);
44437
      }
44438
      v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel)));
44439
      if (v_i < ((uint64_t)(v_dst.len))) {
44440
        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);
44441
      }
44442
      v_dy += 1u;
44443
    }
44444
    v_num_src_pixels = (((uint32_t)(((uint64_t)(v_src.len)))) / 4u);
44445
    self->private_impl.f_dst_x += v_num_src_pixels;
44446
    v_bi += ((v_num_src_pixels + 3u) / 4u);
44447
  }
44448
  return wuffs_base__make_status(NULL);
44449
}
44450
44451
// -------- func etc2.decoder.frame_dirty_rect
44452
44453
WUFFS_BASE__GENERATED_C_CODE
44454
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
44455
wuffs_etc2__decoder__frame_dirty_rect(
44456
    const wuffs_etc2__decoder* self) {
44457
  if (!self) {
44458
    return wuffs_base__utility__empty_rect_ie_u32();
44459
  }
44460
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
44461
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
44462
    return wuffs_base__utility__empty_rect_ie_u32();
44463
  }
44464
44465
  return wuffs_base__utility__make_rect_ie_u32(
44466
      0u,
44467
      0u,
44468
      self->private_impl.f_width,
44469
      self->private_impl.f_height);
44470
}
44471
44472
// -------- func etc2.decoder.num_animation_loops
44473
44474
WUFFS_BASE__GENERATED_C_CODE
44475
WUFFS_BASE__MAYBE_STATIC uint32_t
44476
wuffs_etc2__decoder__num_animation_loops(
44477
    const wuffs_etc2__decoder* self) {
44478
  if (!self) {
44479
    return 0;
44480
  }
44481
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
44482
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
44483
    return 0;
44484
  }
44485
44486
  return 0u;
44487
}
44488
44489
// -------- func etc2.decoder.num_decoded_frame_configs
44490
44491
WUFFS_BASE__GENERATED_C_CODE
44492
WUFFS_BASE__MAYBE_STATIC uint64_t
44493
wuffs_etc2__decoder__num_decoded_frame_configs(
44494
    const wuffs_etc2__decoder* self) {
44495
  if (!self) {
44496
    return 0;
44497
  }
44498
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
44499
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
44500
    return 0;
44501
  }
44502
44503
  if (self->private_impl.f_call_sequence > 32u) {
44504
    return 1u;
44505
  }
44506
  return 0u;
44507
}
44508
44509
// -------- func etc2.decoder.num_decoded_frames
44510
44511
WUFFS_BASE__GENERATED_C_CODE
44512
WUFFS_BASE__MAYBE_STATIC uint64_t
44513
wuffs_etc2__decoder__num_decoded_frames(
44514
    const wuffs_etc2__decoder* self) {
44515
  if (!self) {
44516
    return 0;
44517
  }
44518
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
44519
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
44520
    return 0;
44521
  }
44522
44523
  if (self->private_impl.f_call_sequence > 64u) {
44524
    return 1u;
44525
  }
44526
  return 0u;
44527
}
44528
44529
// -------- func etc2.decoder.restart_frame
44530
44531
WUFFS_BASE__GENERATED_C_CODE
44532
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
44533
wuffs_etc2__decoder__restart_frame(
44534
    wuffs_etc2__decoder* self,
44535
    uint64_t a_index,
44536
    uint64_t a_io_position) {
44537
  if (!self) {
44538
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
44539
  }
44540
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
44541
    return wuffs_base__make_status(
44542
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
44543
        ? wuffs_base__error__disabled_by_previous_error
44544
        : wuffs_base__error__initialize_not_called);
44545
  }
44546
44547
  if (self->private_impl.f_call_sequence < 32u) {
44548
    return wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
44549
  }
44550
  if ((a_index != 0u) || (a_io_position != 16u)) {
44551
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
44552
  }
44553
  self->private_impl.f_call_sequence = 40u;
44554
  return wuffs_base__make_status(NULL);
44555
}
44556
44557
// -------- func etc2.decoder.set_report_metadata
44558
44559
WUFFS_BASE__GENERATED_C_CODE
44560
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
44561
wuffs_etc2__decoder__set_report_metadata(
44562
    wuffs_etc2__decoder* self,
44563
    uint32_t a_fourcc,
44564
    bool a_report) {
44565
  return wuffs_base__make_empty_struct();
44566
}
44567
44568
// -------- func etc2.decoder.tell_me_more
44569
44570
WUFFS_BASE__GENERATED_C_CODE
44571
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
44572
wuffs_etc2__decoder__tell_me_more(
44573
    wuffs_etc2__decoder* self,
44574
    wuffs_base__io_buffer* a_dst,
44575
    wuffs_base__more_information* a_minfo,
44576
    wuffs_base__io_buffer* a_src) {
44577
  if (!self) {
44578
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
44579
  }
44580
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
44581
    return wuffs_base__make_status(
44582
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
44583
        ? wuffs_base__error__disabled_by_previous_error
44584
        : wuffs_base__error__initialize_not_called);
44585
  }
44586
  if (!a_dst || !a_src) {
44587
    self->private_impl.magic = WUFFS_BASE__DISABLED;
44588
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
44589
  }
44590
  if ((self->private_impl.active_coroutine != 0) &&
44591
      (self->private_impl.active_coroutine != 4)) {
44592
    self->private_impl.magic = WUFFS_BASE__DISABLED;
44593
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
44594
  }
44595
  self->private_impl.active_coroutine = 0;
44596
  wuffs_base__status status = wuffs_base__make_status(NULL);
44597
44598
  status = wuffs_base__make_status(wuffs_base__error__no_more_information);
44599
  goto exit;
44600
44601
  goto ok;
44602
  ok:
44603
  goto exit;
44604
  exit:
44605
  if (wuffs_base__status__is_error(&status)) {
44606
    self->private_impl.magic = WUFFS_BASE__DISABLED;
44607
  }
44608
  return status;
44609
}
44610
44611
// -------- func etc2.decoder.workbuf_len
44612
44613
WUFFS_BASE__GENERATED_C_CODE
44614
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
44615
wuffs_etc2__decoder__workbuf_len(
44616
    const wuffs_etc2__decoder* self) {
44617
  if (!self) {
44618
    return wuffs_base__utility__empty_range_ii_u64();
44619
  }
44620
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
44621
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
44622
    return wuffs_base__utility__empty_range_ii_u64();
44623
  }
44624
44625
  return wuffs_base__utility__make_range_ii_u64(0u, 0u);
44626
}
44627
44628
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ETC2)
44629
44630
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GIF)
44631
44632
// ---------------- Status Codes Implementations
44633
44634
const char wuffs_gif__error__bad_lzw_code[] = "#gif: bad LZW code";
44635
const char wuffs_gif__error__bad_extension_label[] = "#gif: bad extension label";
44636
const char wuffs_gif__error__bad_frame_size[] = "#gif: bad frame size";
44637
const char wuffs_gif__error__bad_graphic_control[] = "#gif: bad graphic control";
44638
const char wuffs_gif__error__bad_header[] = "#gif: bad header";
44639
const char wuffs_gif__error__bad_literal_width[] = "#gif: bad literal width";
44640
const char wuffs_gif__error__bad_palette[] = "#gif: bad palette";
44641
const char wuffs_gif__error__truncated_input[] = "#gif: truncated input";
44642
const char wuffs_gif__error__internal_error_inconsistent_i_o[] = "#gif: internal error: inconsistent I/O";
44643
44644
// ---------------- Private Consts
44645
44646
static const uint32_t
44647
WUFFS_GIF__INTERLACE_START[5] WUFFS_BASE__POTENTIALLY_UNUSED = {
44648
  4294967295u, 1u, 2u, 4u, 0u,
44649
};
44650
44651
static const uint8_t
44652
WUFFS_GIF__INTERLACE_DELTA[5] WUFFS_BASE__POTENTIALLY_UNUSED = {
44653
  1u, 2u, 4u, 8u, 8u,
44654
};
44655
44656
static const uint8_t
44657
WUFFS_GIF__INTERLACE_COUNT[5] WUFFS_BASE__POTENTIALLY_UNUSED = {
44658
  0u, 1u, 2u, 4u, 8u,
44659
};
44660
44661
static const uint8_t
44662
WUFFS_GIF__ANIMEXTS1DOT0[11] WUFFS_BASE__POTENTIALLY_UNUSED = {
44663
  65u, 78u, 73u, 77u, 69u, 88u, 84u, 83u,
44664
  49u, 46u, 48u,
44665
};
44666
44667
static const uint8_t
44668
WUFFS_GIF__NETSCAPE2DOT0[11] WUFFS_BASE__POTENTIALLY_UNUSED = {
44669
  78u, 69u, 84u, 83u, 67u, 65u, 80u, 69u,
44670
  50u, 46u, 48u,
44671
};
44672
44673
static const uint8_t
44674
WUFFS_GIF__ICCRGBG1012[11] WUFFS_BASE__POTENTIALLY_UNUSED = {
44675
  73u, 67u, 67u, 82u, 71u, 66u, 71u, 49u,
44676
  48u, 49u, 50u,
44677
};
44678
44679
static const uint8_t
44680
WUFFS_GIF__XMPDATAXMP[11] WUFFS_BASE__POTENTIALLY_UNUSED = {
44681
  88u, 77u, 80u, 32u, 68u, 97u, 116u, 97u,
44682
  88u, 77u, 80u,
44683
};
44684
44685
#define WUFFS_GIF__QUIRKS_BASE 983928832u
44686
44687
#define WUFFS_GIF__QUIRKS_COUNT 7u
44688
44689
// ---------------- Private Initializer Prototypes
44690
44691
// ---------------- Private Function Prototypes
44692
44693
WUFFS_BASE__GENERATED_C_CODE
44694
static wuffs_base__status
44695
wuffs_gif__decoder__do_decode_image_config(
44696
    wuffs_gif__decoder* self,
44697
    wuffs_base__image_config* a_dst,
44698
    wuffs_base__io_buffer* a_src);
44699
44700
WUFFS_BASE__GENERATED_C_CODE
44701
static wuffs_base__status
44702
wuffs_gif__decoder__do_tell_me_more(
44703
    wuffs_gif__decoder* self,
44704
    wuffs_base__io_buffer* a_dst,
44705
    wuffs_base__more_information* a_minfo,
44706
    wuffs_base__io_buffer* a_src);
44707
44708
WUFFS_BASE__GENERATED_C_CODE
44709
static wuffs_base__status
44710
wuffs_gif__decoder__do_decode_frame_config(
44711
    wuffs_gif__decoder* self,
44712
    wuffs_base__frame_config* a_dst,
44713
    wuffs_base__io_buffer* a_src);
44714
44715
WUFFS_BASE__GENERATED_C_CODE
44716
static wuffs_base__status
44717
wuffs_gif__decoder__skip_frame(
44718
    wuffs_gif__decoder* self,
44719
    wuffs_base__io_buffer* a_src);
44720
44721
WUFFS_BASE__GENERATED_C_CODE
44722
static wuffs_base__status
44723
wuffs_gif__decoder__do_decode_frame(
44724
    wuffs_gif__decoder* self,
44725
    wuffs_base__pixel_buffer* a_dst,
44726
    wuffs_base__io_buffer* a_src,
44727
    wuffs_base__pixel_blend a_blend,
44728
    wuffs_base__slice_u8 a_workbuf,
44729
    wuffs_base__decode_frame_options* a_opts);
44730
44731
WUFFS_BASE__GENERATED_C_CODE
44732
static wuffs_base__empty_struct
44733
wuffs_gif__decoder__reset_gc(
44734
    wuffs_gif__decoder* self);
44735
44736
WUFFS_BASE__GENERATED_C_CODE
44737
static wuffs_base__status
44738
wuffs_gif__decoder__decode_up_to_id_part1(
44739
    wuffs_gif__decoder* self,
44740
    wuffs_base__io_buffer* a_src);
44741
44742
WUFFS_BASE__GENERATED_C_CODE
44743
static wuffs_base__status
44744
wuffs_gif__decoder__decode_header(
44745
    wuffs_gif__decoder* self,
44746
    wuffs_base__io_buffer* a_src);
44747
44748
WUFFS_BASE__GENERATED_C_CODE
44749
static wuffs_base__status
44750
wuffs_gif__decoder__decode_lsd(
44751
    wuffs_gif__decoder* self,
44752
    wuffs_base__io_buffer* a_src);
44753
44754
WUFFS_BASE__GENERATED_C_CODE
44755
static wuffs_base__status
44756
wuffs_gif__decoder__decode_extension(
44757
    wuffs_gif__decoder* self,
44758
    wuffs_base__io_buffer* a_src);
44759
44760
WUFFS_BASE__GENERATED_C_CODE
44761
static wuffs_base__status
44762
wuffs_gif__decoder__skip_blocks(
44763
    wuffs_gif__decoder* self,
44764
    wuffs_base__io_buffer* a_src);
44765
44766
WUFFS_BASE__GENERATED_C_CODE
44767
static wuffs_base__status
44768
wuffs_gif__decoder__decode_ae(
44769
    wuffs_gif__decoder* self,
44770
    wuffs_base__io_buffer* a_src);
44771
44772
WUFFS_BASE__GENERATED_C_CODE
44773
static wuffs_base__status
44774
wuffs_gif__decoder__decode_gc(
44775
    wuffs_gif__decoder* self,
44776
    wuffs_base__io_buffer* a_src);
44777
44778
WUFFS_BASE__GENERATED_C_CODE
44779
static wuffs_base__status
44780
wuffs_gif__decoder__decode_id_part0(
44781
    wuffs_gif__decoder* self,
44782
    wuffs_base__io_buffer* a_src);
44783
44784
WUFFS_BASE__GENERATED_C_CODE
44785
static wuffs_base__status
44786
wuffs_gif__decoder__decode_id_part1(
44787
    wuffs_gif__decoder* self,
44788
    wuffs_base__pixel_buffer* a_dst,
44789
    wuffs_base__io_buffer* a_src,
44790
    wuffs_base__pixel_blend a_blend);
44791
44792
WUFFS_BASE__GENERATED_C_CODE
44793
static wuffs_base__status
44794
wuffs_gif__decoder__decode_id_part2(
44795
    wuffs_gif__decoder* self,
44796
    wuffs_base__pixel_buffer* a_dst,
44797
    wuffs_base__io_buffer* a_src,
44798
    wuffs_base__slice_u8 a_workbuf);
44799
44800
WUFFS_BASE__GENERATED_C_CODE
44801
static wuffs_base__status
44802
wuffs_gif__decoder__copy_to_image_buffer(
44803
    wuffs_gif__decoder* self,
44804
    wuffs_base__pixel_buffer* a_pb,
44805
    wuffs_base__slice_u8 a_src);
44806
44807
WUFFS_BASE__GENERATED_C_CODE
44808
static wuffs_base__empty_struct
44809
wuffs_gif__decoder__lzw_init(
44810
    wuffs_gif__decoder* self);
44811
44812
WUFFS_BASE__GENERATED_C_CODE
44813
static wuffs_base__empty_struct
44814
wuffs_gif__decoder__lzw_read_from(
44815
    wuffs_gif__decoder* self,
44816
    wuffs_base__io_buffer* a_src);
44817
44818
// ---------------- VTables
44819
44820
const wuffs_base__image_decoder__func_ptrs
44821
wuffs_gif__decoder__func_ptrs_for__wuffs_base__image_decoder = {
44822
  (wuffs_base__status(*)(void*,
44823
      wuffs_base__pixel_buffer*,
44824
      wuffs_base__io_buffer*,
44825
      wuffs_base__pixel_blend,
44826
      wuffs_base__slice_u8,
44827
      wuffs_base__decode_frame_options*))(&wuffs_gif__decoder__decode_frame),
44828
  (wuffs_base__status(*)(void*,
44829
      wuffs_base__frame_config*,
44830
      wuffs_base__io_buffer*))(&wuffs_gif__decoder__decode_frame_config),
44831
  (wuffs_base__status(*)(void*,
44832
      wuffs_base__image_config*,
44833
      wuffs_base__io_buffer*))(&wuffs_gif__decoder__decode_image_config),
44834
  (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_gif__decoder__frame_dirty_rect),
44835
  (uint64_t(*)(const void*,
44836
      uint32_t))(&wuffs_gif__decoder__get_quirk),
44837
  (uint32_t(*)(const void*))(&wuffs_gif__decoder__num_animation_loops),
44838
  (uint64_t(*)(const void*))(&wuffs_gif__decoder__num_decoded_frame_configs),
44839
  (uint64_t(*)(const void*))(&wuffs_gif__decoder__num_decoded_frames),
44840
  (wuffs_base__status(*)(void*,
44841
      uint64_t,
44842
      uint64_t))(&wuffs_gif__decoder__restart_frame),
44843
  (wuffs_base__status(*)(void*,
44844
      uint32_t,
44845
      uint64_t))(&wuffs_gif__decoder__set_quirk),
44846
  (wuffs_base__empty_struct(*)(void*,
44847
      uint32_t,
44848
      bool))(&wuffs_gif__decoder__set_report_metadata),
44849
  (wuffs_base__status(*)(void*,
44850
      wuffs_base__io_buffer*,
44851
      wuffs_base__more_information*,
44852
      wuffs_base__io_buffer*))(&wuffs_gif__decoder__tell_me_more),
44853
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_gif__decoder__workbuf_len),
44854
};
44855
44856
// ---------------- Initializer Implementations
44857
44858
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
44859
wuffs_gif__decoder__initialize(
44860
    wuffs_gif__decoder* self,
44861
    size_t sizeof_star_self,
44862
    uint64_t wuffs_version,
44863
    uint32_t options){
44864
  if (!self) {
44865
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
44866
  }
44867
  if (sizeof(*self) != sizeof_star_self) {
44868
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
44869
  }
44870
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
44871
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
44872
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
44873
  }
44874
44875
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
44876
    // The whole point of this if-check is to detect an uninitialized *self.
44877
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
44878
#if !defined(__clang__) && defined(__GNUC__)
44879
#pragma GCC diagnostic push
44880
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
44881
#endif
44882
    if (self->private_impl.magic != 0) {
44883
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
44884
    }
44885
#if !defined(__clang__) && defined(__GNUC__)
44886
#pragma GCC diagnostic pop
44887
#endif
44888
  } else {
44889
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
44890
      memset(self, 0, sizeof(*self));
44891
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
44892
    } else {
44893
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
44894
    }
44895
  }
44896
44897
  self->private_impl.magic = WUFFS_BASE__MAGIC;
44898
  self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name =
44899
      wuffs_base__image_decoder__vtable_name;
44900
  self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers =
44901
      (const void*)(&wuffs_gif__decoder__func_ptrs_for__wuffs_base__image_decoder);
44902
  return wuffs_base__make_status(NULL);
44903
}
44904
44905
wuffs_gif__decoder*
44906
wuffs_gif__decoder__alloc(void) {
44907
  wuffs_gif__decoder* x =
44908
      (wuffs_gif__decoder*)(calloc(1, sizeof(wuffs_gif__decoder)));
44909
  if (!x) {
44910
    return NULL;
44911
  }
44912
  if (wuffs_gif__decoder__initialize(
44913
      x, sizeof(wuffs_gif__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
44914
    free(x);
44915
    return NULL;
44916
  }
44917
  return x;
44918
}
44919
44920
size_t
44921
sizeof__wuffs_gif__decoder(void) {
44922
  return sizeof(wuffs_gif__decoder);
44923
}
44924
44925
// ---------------- Function Implementations
44926
44927
// -------- func gif.decoder.get_quirk
44928
44929
WUFFS_BASE__GENERATED_C_CODE
44930
WUFFS_BASE__MAYBE_STATIC uint64_t
44931
wuffs_gif__decoder__get_quirk(
44932
    const wuffs_gif__decoder* self,
44933
    uint32_t a_key) {
44934
  if (!self) {
44935
    return 0;
44936
  }
44937
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
44938
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
44939
    return 0;
44940
  }
44941
44942
  uint32_t v_key = 0;
44943
44944
  if (a_key >= 983928832u) {
44945
    v_key = (a_key - 983928832u);
44946
    if (v_key < 7u) {
44947
      if (self->private_impl.f_quirks[v_key]) {
44948
        return 1u;
44949
      }
44950
    }
44951
  }
44952
  return 0u;
44953
}
44954
44955
// -------- func gif.decoder.set_quirk
44956
44957
WUFFS_BASE__GENERATED_C_CODE
44958
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
44959
wuffs_gif__decoder__set_quirk(
44960
    wuffs_gif__decoder* self,
44961
    uint32_t a_key,
44962
    uint64_t a_value) {
44963
  if (!self) {
44964
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
44965
  }
44966
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
44967
    return wuffs_base__make_status(
44968
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
44969
        ? wuffs_base__error__disabled_by_previous_error
44970
        : wuffs_base__error__initialize_not_called);
44971
  }
44972
44973
  if ((self->private_impl.f_call_sequence == 0u) && (a_key >= 983928832u)) {
44974
    a_key -= 983928832u;
44975
    if (a_key < 7u) {
44976
      self->private_impl.f_quirks[a_key] = (a_value > 0u);
44977
      return wuffs_base__make_status(NULL);
44978
    }
44979
  }
44980
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
44981
}
44982
44983
// -------- func gif.decoder.decode_image_config
44984
44985
WUFFS_BASE__GENERATED_C_CODE
44986
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
44987
wuffs_gif__decoder__decode_image_config(
44988
    wuffs_gif__decoder* self,
44989
    wuffs_base__image_config* a_dst,
44990
    wuffs_base__io_buffer* a_src) {
44991
  if (!self) {
44992
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
44993
  }
44994
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
44995
    return wuffs_base__make_status(
44996
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
44997
        ? wuffs_base__error__disabled_by_previous_error
44998
        : wuffs_base__error__initialize_not_called);
44999
  }
45000
  if (!a_src) {
45001
    self->private_impl.magic = WUFFS_BASE__DISABLED;
45002
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
45003
  }
45004
  if ((self->private_impl.active_coroutine != 0) &&
45005
      (self->private_impl.active_coroutine != 1)) {
45006
    self->private_impl.magic = WUFFS_BASE__DISABLED;
45007
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
45008
  }
45009
  self->private_impl.active_coroutine = 0;
45010
  wuffs_base__status status = wuffs_base__make_status(NULL);
45011
45012
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
45013
45014
  uint32_t coro_susp_point = self->private_impl.p_decode_image_config;
45015
  switch (coro_susp_point) {
45016
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
45017
45018
    while (true) {
45019
      {
45020
        wuffs_base__status t_0 = wuffs_gif__decoder__do_decode_image_config(self, a_dst, a_src);
45021
        v_status = t_0;
45022
      }
45023
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
45024
        status = wuffs_base__make_status(wuffs_gif__error__truncated_input);
45025
        goto exit;
45026
      }
45027
      status = v_status;
45028
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
45029
    }
45030
45031
    ok:
45032
    self->private_impl.p_decode_image_config = 0;
45033
    goto exit;
45034
  }
45035
45036
  goto suspend;
45037
  suspend:
45038
  self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
45039
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
45040
45041
  goto exit;
45042
  exit:
45043
  if (wuffs_base__status__is_error(&status)) {
45044
    self->private_impl.magic = WUFFS_BASE__DISABLED;
45045
  }
45046
  return status;
45047
}
45048
45049
// -------- func gif.decoder.do_decode_image_config
45050
45051
WUFFS_BASE__GENERATED_C_CODE
45052
static wuffs_base__status
45053
wuffs_gif__decoder__do_decode_image_config(
45054
    wuffs_gif__decoder* self,
45055
    wuffs_base__image_config* a_dst,
45056
    wuffs_base__io_buffer* a_src) {
45057
  wuffs_base__status status = wuffs_base__make_status(NULL);
45058
45059
  bool v_ffio = false;
45060
45061
  uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config;
45062
  switch (coro_susp_point) {
45063
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
45064
45065
    if (self->private_impl.f_call_sequence != 0u) {
45066
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
45067
      goto exit;
45068
    } else if ( ! self->private_impl.f_seen_header) {
45069
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
45070
      status = wuffs_gif__decoder__decode_header(self, a_src);
45071
      if (status.repr) {
45072
        goto suspend;
45073
      }
45074
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
45075
      status = wuffs_gif__decoder__decode_lsd(self, a_src);
45076
      if (status.repr) {
45077
        goto suspend;
45078
      }
45079
      self->private_impl.f_seen_header = true;
45080
    }
45081
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
45082
    status = wuffs_gif__decoder__decode_up_to_id_part1(self, a_src);
45083
    if (status.repr) {
45084
      goto suspend;
45085
    }
45086
    v_ffio =  ! self->private_impl.f_gc_has_transparent_index;
45087
    if ( ! self->private_impl.f_quirks[2u]) {
45088
      v_ffio = (v_ffio &&
45089
          (self->private_impl.f_frame_rect_x0 == 0u) &&
45090
          (self->private_impl.f_frame_rect_y0 == 0u) &&
45091
          (self->private_impl.f_frame_rect_x1 == self->private_impl.f_width) &&
45092
          (self->private_impl.f_frame_rect_y1 == self->private_impl.f_height));
45093
    } else if (v_ffio) {
45094
      self->private_impl.f_black_color_u32_argb_premul = 4278190080u;
45095
    }
45096
    if (self->private_impl.f_background_color_u32_argb_premul == 77u) {
45097
      self->private_impl.f_background_color_u32_argb_premul = self->private_impl.f_black_color_u32_argb_premul;
45098
    }
45099
    if (a_dst != NULL) {
45100
      wuffs_base__image_config__set(
45101
          a_dst,
45102
          2198077448u,
45103
          0u,
45104
          self->private_impl.f_width,
45105
          self->private_impl.f_height,
45106
          self->private_impl.f_frame_config_io_position,
45107
          v_ffio);
45108
    }
45109
    if (self->private_impl.f_call_sequence == 0u) {
45110
      self->private_impl.f_call_sequence = 32u;
45111
    }
45112
45113
    goto ok;
45114
    ok:
45115
    self->private_impl.p_do_decode_image_config = 0;
45116
    goto exit;
45117
  }
45118
45119
  goto suspend;
45120
  suspend:
45121
  self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
45122
45123
  goto exit;
45124
  exit:
45125
  return status;
45126
}
45127
45128
// -------- func gif.decoder.set_report_metadata
45129
45130
WUFFS_BASE__GENERATED_C_CODE
45131
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
45132
wuffs_gif__decoder__set_report_metadata(
45133
    wuffs_gif__decoder* self,
45134
    uint32_t a_fourcc,
45135
    bool a_report) {
45136
  if (!self) {
45137
    return wuffs_base__make_empty_struct();
45138
  }
45139
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
45140
    return wuffs_base__make_empty_struct();
45141
  }
45142
45143
  if (a_fourcc == 1229144912u) {
45144
    self->private_impl.f_report_metadata_iccp = a_report;
45145
  } else if (a_fourcc == 1481461792u) {
45146
    self->private_impl.f_report_metadata_xmp = a_report;
45147
  }
45148
  return wuffs_base__make_empty_struct();
45149
}
45150
45151
// -------- func gif.decoder.tell_me_more
45152
45153
WUFFS_BASE__GENERATED_C_CODE
45154
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
45155
wuffs_gif__decoder__tell_me_more(
45156
    wuffs_gif__decoder* self,
45157
    wuffs_base__io_buffer* a_dst,
45158
    wuffs_base__more_information* a_minfo,
45159
    wuffs_base__io_buffer* a_src) {
45160
  if (!self) {
45161
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
45162
  }
45163
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
45164
    return wuffs_base__make_status(
45165
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
45166
        ? wuffs_base__error__disabled_by_previous_error
45167
        : wuffs_base__error__initialize_not_called);
45168
  }
45169
  if (!a_dst || !a_src) {
45170
    self->private_impl.magic = WUFFS_BASE__DISABLED;
45171
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
45172
  }
45173
  if ((self->private_impl.active_coroutine != 0) &&
45174
      (self->private_impl.active_coroutine != 2)) {
45175
    self->private_impl.magic = WUFFS_BASE__DISABLED;
45176
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
45177
  }
45178
  self->private_impl.active_coroutine = 0;
45179
  wuffs_base__status status = wuffs_base__make_status(NULL);
45180
45181
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
45182
45183
  uint32_t coro_susp_point = self->private_impl.p_tell_me_more;
45184
  switch (coro_susp_point) {
45185
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
45186
45187
    while (true) {
45188
      {
45189
        wuffs_base__status t_0 = wuffs_gif__decoder__do_tell_me_more(self, a_dst, a_minfo, a_src);
45190
        v_status = t_0;
45191
      }
45192
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
45193
        status = wuffs_base__make_status(wuffs_gif__error__truncated_input);
45194
        goto exit;
45195
      }
45196
      status = v_status;
45197
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
45198
    }
45199
45200
    ok:
45201
    self->private_impl.p_tell_me_more = 0;
45202
    goto exit;
45203
  }
45204
45205
  goto suspend;
45206
  suspend:
45207
  self->private_impl.p_tell_me_more = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
45208
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0;
45209
45210
  goto exit;
45211
  exit:
45212
  if (wuffs_base__status__is_error(&status)) {
45213
    self->private_impl.magic = WUFFS_BASE__DISABLED;
45214
  }
45215
  return status;
45216
}
45217
45218
// -------- func gif.decoder.do_tell_me_more
45219
45220
WUFFS_BASE__GENERATED_C_CODE
45221
static wuffs_base__status
45222
wuffs_gif__decoder__do_tell_me_more(
45223
    wuffs_gif__decoder* self,
45224
    wuffs_base__io_buffer* a_dst,
45225
    wuffs_base__more_information* a_minfo,
45226
    wuffs_base__io_buffer* a_src) {
45227
  wuffs_base__status status = wuffs_base__make_status(NULL);
45228
45229
  uint64_t v_chunk_length = 0;
45230
45231
  const uint8_t* iop_a_src = NULL;
45232
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
45233
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
45234
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
45235
  if (a_src && a_src->data.ptr) {
45236
    io0_a_src = a_src->data.ptr;
45237
    io1_a_src = io0_a_src + a_src->meta.ri;
45238
    iop_a_src = io1_a_src;
45239
    io2_a_src = io0_a_src + a_src->meta.wi;
45240
  }
45241
45242
  uint32_t coro_susp_point = self->private_impl.p_do_tell_me_more;
45243
  switch (coro_susp_point) {
45244
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
45245
45246
    if (((uint8_t)(self->private_impl.f_call_sequence & 16u)) == 0u) {
45247
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
45248
      goto exit;
45249
    }
45250
    if (self->private_impl.f_metadata_fourcc == 0u) {
45251
      status = wuffs_base__make_status(wuffs_base__error__no_more_information);
45252
      goto exit;
45253
    }
45254
    while (true) {
45255
      while (true) {
45256
        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) {
45257
          if (a_minfo != NULL) {
45258
            wuffs_base__more_information__set(a_minfo,
45259
                2u,
45260
                0u,
45261
                self->private_impl.f_metadata_io_position,
45262
                0u,
45263
                0u);
45264
          }
45265
          status = wuffs_base__make_status(wuffs_base__suspension__mispositioned_read);
45266
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
45267
          continue;
45268
        }
45269
        if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
45270
          if (a_minfo != NULL) {
45271
            wuffs_base__more_information__set(a_minfo,
45272
                0u,
45273
                0u,
45274
                0u,
45275
                0u,
45276
                0u);
45277
          }
45278
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
45279
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2);
45280
          continue;
45281
        }
45282
        break;
45283
      }
45284
      v_chunk_length = ((uint64_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src)));
45285
      if (v_chunk_length <= 0u) {
45286
        iop_a_src += 1u;
45287
        break;
45288
      }
45289
      if (self->private_impl.f_metadata_fourcc == 1481461792u) {
45290
        v_chunk_length += 1u;
45291
      } else {
45292
        iop_a_src += 1u;
45293
      }
45294
      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);
45295
      if (a_minfo != NULL) {
45296
        wuffs_base__more_information__set(a_minfo,
45297
            3u,
45298
            self->private_impl.f_metadata_fourcc,
45299
            0u,
45300
            wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))),
45301
            self->private_impl.f_metadata_io_position);
45302
      }
45303
      status = wuffs_base__make_status(wuffs_base__suspension__even_more_information);
45304
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3);
45305
    }
45306
    if (a_minfo != NULL) {
45307
      wuffs_base__more_information__set(a_minfo,
45308
          3u,
45309
          self->private_impl.f_metadata_fourcc,
45310
          0u,
45311
          self->private_impl.f_metadata_io_position,
45312
          self->private_impl.f_metadata_io_position);
45313
    }
45314
    self->private_impl.f_call_sequence &= 239u;
45315
    self->private_impl.f_metadata_fourcc = 0u;
45316
    self->private_impl.f_metadata_io_position = 0u;
45317
    status = wuffs_base__make_status(NULL);
45318
    goto ok;
45319
45320
    ok:
45321
    self->private_impl.p_do_tell_me_more = 0;
45322
    goto exit;
45323
  }
45324
45325
  goto suspend;
45326
  suspend:
45327
  self->private_impl.p_do_tell_me_more = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
45328
45329
  goto exit;
45330
  exit:
45331
  if (a_src && a_src->data.ptr) {
45332
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
45333
  }
45334
45335
  return status;
45336
}
45337
45338
// -------- func gif.decoder.num_animation_loops
45339
45340
WUFFS_BASE__GENERATED_C_CODE
45341
WUFFS_BASE__MAYBE_STATIC uint32_t
45342
wuffs_gif__decoder__num_animation_loops(
45343
    const wuffs_gif__decoder* self) {
45344
  if (!self) {
45345
    return 0;
45346
  }
45347
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
45348
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
45349
    return 0;
45350
  }
45351
45352
  if (self->private_impl.f_seen_num_animation_loops_value) {
45353
    return self->private_impl.f_num_animation_loops_value;
45354
  }
45355
  if (self->private_impl.f_num_decoded_frame_configs_value > 1u) {
45356
    return 1u;
45357
  }
45358
  return 0u;
45359
}
45360
45361
// -------- func gif.decoder.num_decoded_frame_configs
45362
45363
WUFFS_BASE__GENERATED_C_CODE
45364
WUFFS_BASE__MAYBE_STATIC uint64_t
45365
wuffs_gif__decoder__num_decoded_frame_configs(
45366
    const wuffs_gif__decoder* self) {
45367
  if (!self) {
45368
    return 0;
45369
  }
45370
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
45371
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
45372
    return 0;
45373
  }
45374
45375
  return self->private_impl.f_num_decoded_frame_configs_value;
45376
}
45377
45378
// -------- func gif.decoder.num_decoded_frames
45379
45380
WUFFS_BASE__GENERATED_C_CODE
45381
WUFFS_BASE__MAYBE_STATIC uint64_t
45382
wuffs_gif__decoder__num_decoded_frames(
45383
    const wuffs_gif__decoder* self) {
45384
  if (!self) {
45385
    return 0;
45386
  }
45387
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
45388
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
45389
    return 0;
45390
  }
45391
45392
  return self->private_impl.f_num_decoded_frames_value;
45393
}
45394
45395
// -------- func gif.decoder.frame_dirty_rect
45396
45397
WUFFS_BASE__GENERATED_C_CODE
45398
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
45399
wuffs_gif__decoder__frame_dirty_rect(
45400
    const wuffs_gif__decoder* self) {
45401
  if (!self) {
45402
    return wuffs_base__utility__empty_rect_ie_u32();
45403
  }
45404
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
45405
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
45406
    return wuffs_base__utility__empty_rect_ie_u32();
45407
  }
45408
45409
  return wuffs_base__utility__make_rect_ie_u32(
45410
      wuffs_base__u32__min(self->private_impl.f_frame_rect_x0, self->private_impl.f_width),
45411
      wuffs_base__u32__min(self->private_impl.f_frame_rect_y0, self->private_impl.f_height),
45412
      wuffs_base__u32__min(self->private_impl.f_frame_rect_x1, self->private_impl.f_width),
45413
      wuffs_base__u32__min(self->private_impl.f_dirty_max_excl_y, self->private_impl.f_height));
45414
}
45415
45416
// -------- func gif.decoder.workbuf_len
45417
45418
WUFFS_BASE__GENERATED_C_CODE
45419
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
45420
wuffs_gif__decoder__workbuf_len(
45421
    const wuffs_gif__decoder* self) {
45422
  if (!self) {
45423
    return wuffs_base__utility__empty_range_ii_u64();
45424
  }
45425
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
45426
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
45427
    return wuffs_base__utility__empty_range_ii_u64();
45428
  }
45429
45430
  return wuffs_base__utility__make_range_ii_u64(0u, 0u);
45431
}
45432
45433
// -------- func gif.decoder.restart_frame
45434
45435
WUFFS_BASE__GENERATED_C_CODE
45436
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
45437
wuffs_gif__decoder__restart_frame(
45438
    wuffs_gif__decoder* self,
45439
    uint64_t a_index,
45440
    uint64_t a_io_position) {
45441
  if (!self) {
45442
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
45443
  }
45444
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
45445
    return wuffs_base__make_status(
45446
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
45447
        ? wuffs_base__error__disabled_by_previous_error
45448
        : wuffs_base__error__initialize_not_called);
45449
  }
45450
45451
  if (self->private_impl.f_call_sequence < 32u) {
45452
    return wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
45453
  } else if (a_io_position == 0u) {
45454
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
45455
  }
45456
  self->private_impl.f_delayed_num_decoded_frames = false;
45457
  self->private_impl.f_frame_config_io_position = a_io_position;
45458
  self->private_impl.f_num_decoded_frame_configs_value = a_index;
45459
  self->private_impl.f_num_decoded_frames_value = a_index;
45460
  wuffs_gif__decoder__reset_gc(self);
45461
  self->private_impl.f_call_sequence = 40u;
45462
  return wuffs_base__make_status(NULL);
45463
}
45464
45465
// -------- func gif.decoder.decode_frame_config
45466
45467
WUFFS_BASE__GENERATED_C_CODE
45468
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
45469
wuffs_gif__decoder__decode_frame_config(
45470
    wuffs_gif__decoder* self,
45471
    wuffs_base__frame_config* a_dst,
45472
    wuffs_base__io_buffer* a_src) {
45473
  if (!self) {
45474
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
45475
  }
45476
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
45477
    return wuffs_base__make_status(
45478
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
45479
        ? wuffs_base__error__disabled_by_previous_error
45480
        : wuffs_base__error__initialize_not_called);
45481
  }
45482
  if (!a_src) {
45483
    self->private_impl.magic = WUFFS_BASE__DISABLED;
45484
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
45485
  }
45486
  if ((self->private_impl.active_coroutine != 0) &&
45487
      (self->private_impl.active_coroutine != 3)) {
45488
    self->private_impl.magic = WUFFS_BASE__DISABLED;
45489
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
45490
  }
45491
  self->private_impl.active_coroutine = 0;
45492
  wuffs_base__status status = wuffs_base__make_status(NULL);
45493
45494
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
45495
45496
  uint32_t coro_susp_point = self->private_impl.p_decode_frame_config;
45497
  switch (coro_susp_point) {
45498
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
45499
45500
    while (true) {
45501
      {
45502
        wuffs_base__status t_0 = wuffs_gif__decoder__do_decode_frame_config(self, a_dst, a_src);
45503
        v_status = t_0;
45504
      }
45505
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
45506
        status = wuffs_base__make_status(wuffs_gif__error__truncated_input);
45507
        goto exit;
45508
      }
45509
      status = v_status;
45510
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
45511
    }
45512
45513
    ok:
45514
    self->private_impl.p_decode_frame_config = 0;
45515
    goto exit;
45516
  }
45517
45518
  goto suspend;
45519
  suspend:
45520
  self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
45521
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0;
45522
45523
  goto exit;
45524
  exit:
45525
  if (wuffs_base__status__is_error(&status)) {
45526
    self->private_impl.magic = WUFFS_BASE__DISABLED;
45527
  }
45528
  return status;
45529
}
45530
45531
// -------- func gif.decoder.do_decode_frame_config
45532
45533
WUFFS_BASE__GENERATED_C_CODE
45534
static wuffs_base__status
45535
wuffs_gif__decoder__do_decode_frame_config(
45536
    wuffs_gif__decoder* self,
45537
    wuffs_base__frame_config* a_dst,
45538
    wuffs_base__io_buffer* a_src) {
45539
  wuffs_base__status status = wuffs_base__make_status(NULL);
45540
45541
  uint32_t v_background_color = 0;
45542
  uint8_t v_flags = 0;
45543
45544
  const uint8_t* iop_a_src = NULL;
45545
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
45546
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
45547
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
45548
  if (a_src && a_src->data.ptr) {
45549
    io0_a_src = a_src->data.ptr;
45550
    io1_a_src = io0_a_src + a_src->meta.ri;
45551
    iop_a_src = io1_a_src;
45552
    io2_a_src = io0_a_src + a_src->meta.wi;
45553
  }
45554
45555
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config;
45556
  if (coro_susp_point) {
45557
    v_background_color = self->private_data.s_do_decode_frame_config.v_background_color;
45558
  }
45559
  switch (coro_susp_point) {
45560
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
45561
45562
    self->private_impl.f_dirty_max_excl_y = 0u;
45563
    if (((uint8_t)(self->private_impl.f_call_sequence & 16u)) != 0u) {
45564
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
45565
      goto exit;
45566
    } else if (self->private_impl.f_call_sequence == 32u) {
45567
    } else if (self->private_impl.f_call_sequence < 32u) {
45568
      if (a_src) {
45569
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
45570
      }
45571
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
45572
      status = wuffs_gif__decoder__do_decode_image_config(self, NULL, a_src);
45573
      if (a_src) {
45574
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
45575
      }
45576
      if (status.repr) {
45577
        goto suspend;
45578
      }
45579
    } else if (self->private_impl.f_call_sequence == 40u) {
45580
      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)))) {
45581
        status = wuffs_base__make_status(wuffs_base__error__bad_restart);
45582
        goto exit;
45583
      }
45584
    } else if (self->private_impl.f_call_sequence == 64u) {
45585
      if (a_src) {
45586
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
45587
      }
45588
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
45589
      status = wuffs_gif__decoder__skip_frame(self, a_src);
45590
      if (a_src) {
45591
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
45592
      }
45593
      if (status.repr) {
45594
        goto suspend;
45595
      }
45596
      if (self->private_impl.f_call_sequence >= 96u) {
45597
        status = wuffs_base__make_status(wuffs_base__note__end_of_data);
45598
        goto ok;
45599
      }
45600
    } else {
45601
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
45602
      goto ok;
45603
    }
45604
    if ((self->private_impl.f_num_decoded_frame_configs_value > 0u) || (self->private_impl.f_call_sequence == 40u)) {
45605
      if (a_src) {
45606
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
45607
      }
45608
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
45609
      status = wuffs_gif__decoder__decode_up_to_id_part1(self, a_src);
45610
      if (a_src) {
45611
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
45612
      }
45613
      if (status.repr) {
45614
        goto suspend;
45615
      }
45616
      if (self->private_impl.f_call_sequence >= 96u) {
45617
        status = wuffs_base__make_status(wuffs_base__note__end_of_data);
45618
        goto ok;
45619
      }
45620
    }
45621
    v_background_color = self->private_impl.f_black_color_u32_argb_premul;
45622
    if ( ! self->private_impl.f_gc_has_transparent_index) {
45623
      v_background_color = self->private_impl.f_background_color_u32_argb_premul;
45624
      if (self->private_impl.f_quirks[1u] && (self->private_impl.f_num_decoded_frame_configs_value == 0u)) {
45625
        while (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
45626
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
45627
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4);
45628
        }
45629
        v_flags = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
45630
        if (((uint8_t)(v_flags & 128u)) != 0u) {
45631
          v_background_color = self->private_impl.f_black_color_u32_argb_premul;
45632
        }
45633
      }
45634
    }
45635
    if (a_dst != NULL) {
45636
      wuffs_base__frame_config__set(
45637
          a_dst,
45638
          wuffs_base__utility__make_rect_ie_u32(
45639
          wuffs_base__u32__min(self->private_impl.f_frame_rect_x0, self->private_impl.f_width),
45640
          wuffs_base__u32__min(self->private_impl.f_frame_rect_y0, self->private_impl.f_height),
45641
          wuffs_base__u32__min(self->private_impl.f_frame_rect_x1, self->private_impl.f_width),
45642
          wuffs_base__u32__min(self->private_impl.f_frame_rect_y1, self->private_impl.f_height)),
45643
          ((wuffs_base__flicks)(self->private_impl.f_gc_duration)),
45644
          self->private_impl.f_num_decoded_frame_configs_value,
45645
          self->private_impl.f_frame_config_io_position,
45646
          self->private_impl.f_gc_disposal,
45647
          ! self->private_impl.f_gc_has_transparent_index,
45648
          false,
45649
          v_background_color);
45650
    }
45651
    wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frame_configs_value, 1u);
45652
    self->private_impl.f_call_sequence = 64u;
45653
45654
    ok:
45655
    self->private_impl.p_do_decode_frame_config = 0;
45656
    goto exit;
45657
  }
45658
45659
  goto suspend;
45660
  suspend:
45661
  self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
45662
  self->private_data.s_do_decode_frame_config.v_background_color = v_background_color;
45663
45664
  goto exit;
45665
  exit:
45666
  if (a_src && a_src->data.ptr) {
45667
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
45668
  }
45669
45670
  return status;
45671
}
45672
45673
// -------- func gif.decoder.skip_frame
45674
45675
WUFFS_BASE__GENERATED_C_CODE
45676
static wuffs_base__status
45677
wuffs_gif__decoder__skip_frame(
45678
    wuffs_gif__decoder* self,
45679
    wuffs_base__io_buffer* a_src) {
45680
  wuffs_base__status status = wuffs_base__make_status(NULL);
45681
45682
  uint8_t v_flags = 0;
45683
  uint8_t v_lw = 0;
45684
45685
  const uint8_t* iop_a_src = NULL;
45686
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
45687
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
45688
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
45689
  if (a_src && a_src->data.ptr) {
45690
    io0_a_src = a_src->data.ptr;
45691
    io1_a_src = io0_a_src + a_src->meta.ri;
45692
    iop_a_src = io1_a_src;
45693
    io2_a_src = io0_a_src + a_src->meta.wi;
45694
  }
45695
45696
  uint32_t coro_susp_point = self->private_impl.p_skip_frame;
45697
  switch (coro_susp_point) {
45698
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
45699
45700
    {
45701
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
45702
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
45703
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
45704
        goto suspend;
45705
      }
45706
      uint8_t t_0 = *iop_a_src++;
45707
      v_flags = t_0;
45708
    }
45709
    if (((uint8_t)(v_flags & 128u)) != 0u) {
45710
      self->private_data.s_skip_frame.scratch = (((uint32_t)(3u)) << ((uint8_t)(1u + ((uint8_t)(v_flags & 7u)))));
45711
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
45712
      if (self->private_data.s_skip_frame.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
45713
        self->private_data.s_skip_frame.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
45714
        iop_a_src = io2_a_src;
45715
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
45716
        goto suspend;
45717
      }
45718
      iop_a_src += self->private_data.s_skip_frame.scratch;
45719
    }
45720
    {
45721
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
45722
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
45723
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
45724
        goto suspend;
45725
      }
45726
      uint8_t t_1 = *iop_a_src++;
45727
      v_lw = t_1;
45728
    }
45729
    if (v_lw > 8u) {
45730
      status = wuffs_base__make_status(wuffs_gif__error__bad_literal_width);
45731
      goto exit;
45732
    }
45733
    if (a_src) {
45734
      a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
45735
    }
45736
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
45737
    status = wuffs_gif__decoder__skip_blocks(self, a_src);
45738
    if (a_src) {
45739
      iop_a_src = a_src->data.ptr + a_src->meta.ri;
45740
    }
45741
    if (status.repr) {
45742
      goto suspend;
45743
    }
45744
    if (self->private_impl.f_quirks[0u]) {
45745
      self->private_impl.f_delayed_num_decoded_frames = true;
45746
    } else {
45747
      wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u);
45748
    }
45749
    wuffs_gif__decoder__reset_gc(self);
45750
    self->private_impl.f_call_sequence = 32u;
45751
45752
    goto ok;
45753
    ok:
45754
    self->private_impl.p_skip_frame = 0;
45755
    goto exit;
45756
  }
45757
45758
  goto suspend;
45759
  suspend:
45760
  self->private_impl.p_skip_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
45761
45762
  goto exit;
45763
  exit:
45764
  if (a_src && a_src->data.ptr) {
45765
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
45766
  }
45767
45768
  return status;
45769
}
45770
45771
// -------- func gif.decoder.decode_frame
45772
45773
WUFFS_BASE__GENERATED_C_CODE
45774
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
45775
wuffs_gif__decoder__decode_frame(
45776
    wuffs_gif__decoder* self,
45777
    wuffs_base__pixel_buffer* a_dst,
45778
    wuffs_base__io_buffer* a_src,
45779
    wuffs_base__pixel_blend a_blend,
45780
    wuffs_base__slice_u8 a_workbuf,
45781
    wuffs_base__decode_frame_options* a_opts) {
45782
  if (!self) {
45783
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
45784
  }
45785
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
45786
    return wuffs_base__make_status(
45787
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
45788
        ? wuffs_base__error__disabled_by_previous_error
45789
        : wuffs_base__error__initialize_not_called);
45790
  }
45791
  if (!a_dst || !a_src) {
45792
    self->private_impl.magic = WUFFS_BASE__DISABLED;
45793
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
45794
  }
45795
  if ((self->private_impl.active_coroutine != 0) &&
45796
      (self->private_impl.active_coroutine != 4)) {
45797
    self->private_impl.magic = WUFFS_BASE__DISABLED;
45798
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
45799
  }
45800
  self->private_impl.active_coroutine = 0;
45801
  wuffs_base__status status = wuffs_base__make_status(NULL);
45802
45803
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
45804
45805
  uint32_t coro_susp_point = self->private_impl.p_decode_frame;
45806
  switch (coro_susp_point) {
45807
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
45808
45809
    while (true) {
45810
      {
45811
        wuffs_base__status t_0 = wuffs_gif__decoder__do_decode_frame(self,
45812
            a_dst,
45813
            a_src,
45814
            a_blend,
45815
            a_workbuf,
45816
            a_opts);
45817
        v_status = t_0;
45818
      }
45819
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
45820
        status = wuffs_base__make_status(wuffs_gif__error__truncated_input);
45821
        goto exit;
45822
      }
45823
      status = v_status;
45824
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
45825
    }
45826
45827
    ok:
45828
    self->private_impl.p_decode_frame = 0;
45829
    goto exit;
45830
  }
45831
45832
  goto suspend;
45833
  suspend:
45834
  self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
45835
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 4 : 0;
45836
45837
  goto exit;
45838
  exit:
45839
  if (wuffs_base__status__is_error(&status)) {
45840
    self->private_impl.magic = WUFFS_BASE__DISABLED;
45841
  }
45842
  return status;
45843
}
45844
45845
// -------- func gif.decoder.do_decode_frame
45846
45847
WUFFS_BASE__GENERATED_C_CODE
45848
static wuffs_base__status
45849
wuffs_gif__decoder__do_decode_frame(
45850
    wuffs_gif__decoder* self,
45851
    wuffs_base__pixel_buffer* a_dst,
45852
    wuffs_base__io_buffer* a_src,
45853
    wuffs_base__pixel_blend a_blend,
45854
    wuffs_base__slice_u8 a_workbuf,
45855
    wuffs_base__decode_frame_options* a_opts) {
45856
  wuffs_base__status status = wuffs_base__make_status(NULL);
45857
45858
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame;
45859
  switch (coro_susp_point) {
45860
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
45861
45862
    if (self->private_impl.f_call_sequence == 64u) {
45863
    } else if (self->private_impl.f_call_sequence < 64u) {
45864
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
45865
      status = wuffs_gif__decoder__do_decode_frame_config(self, NULL, a_src);
45866
      if (status.repr) {
45867
        goto suspend;
45868
      }
45869
    } else {
45870
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
45871
      goto ok;
45872
    }
45873
    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))) {
45874
      status = wuffs_base__make_status(wuffs_gif__error__bad_frame_size);
45875
      goto exit;
45876
    }
45877
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
45878
    status = wuffs_gif__decoder__decode_id_part1(self, a_dst, a_src, a_blend);
45879
    if (status.repr) {
45880
      goto suspend;
45881
    }
45882
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
45883
    status = wuffs_gif__decoder__decode_id_part2(self, a_dst, a_src, a_workbuf);
45884
    if (status.repr) {
45885
      goto suspend;
45886
    }
45887
    wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u);
45888
    wuffs_gif__decoder__reset_gc(self);
45889
    self->private_impl.f_call_sequence = 32u;
45890
45891
    ok:
45892
    self->private_impl.p_do_decode_frame = 0;
45893
    goto exit;
45894
  }
45895
45896
  goto suspend;
45897
  suspend:
45898
  self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
45899
45900
  goto exit;
45901
  exit:
45902
  return status;
45903
}
45904
45905
// -------- func gif.decoder.reset_gc
45906
45907
WUFFS_BASE__GENERATED_C_CODE
45908
static wuffs_base__empty_struct
45909
wuffs_gif__decoder__reset_gc(
45910
    wuffs_gif__decoder* self) {
45911
  self->private_impl.f_gc_has_transparent_index = false;
45912
  self->private_impl.f_gc_transparent_index = 0u;
45913
  self->private_impl.f_gc_disposal = 0u;
45914
  self->private_impl.f_gc_duration = 0u;
45915
  return wuffs_base__make_empty_struct();
45916
}
45917
45918
// -------- func gif.decoder.decode_up_to_id_part1
45919
45920
WUFFS_BASE__GENERATED_C_CODE
45921
static wuffs_base__status
45922
wuffs_gif__decoder__decode_up_to_id_part1(
45923
    wuffs_gif__decoder* self,
45924
    wuffs_base__io_buffer* a_src) {
45925
  wuffs_base__status status = wuffs_base__make_status(NULL);
45926
45927
  uint8_t v_block_type = 0;
45928
45929
  const uint8_t* iop_a_src = NULL;
45930
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
45931
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
45932
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
45933
  if (a_src && a_src->data.ptr) {
45934
    io0_a_src = a_src->data.ptr;
45935
    io1_a_src = io0_a_src + a_src->meta.ri;
45936
    iop_a_src = io1_a_src;
45937
    io2_a_src = io0_a_src + a_src->meta.wi;
45938
  }
45939
45940
  uint32_t coro_susp_point = self->private_impl.p_decode_up_to_id_part1;
45941
  switch (coro_susp_point) {
45942
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
45943
45944
    if ((self->private_impl.f_frame_config_io_position == 0u) || (self->private_impl.f_num_decoded_frame_configs_value > 0u)) {
45945
      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)));
45946
    }
45947
    while (true) {
45948
      {
45949
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
45950
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
45951
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
45952
          goto suspend;
45953
        }
45954
        uint8_t t_0 = *iop_a_src++;
45955
        v_block_type = t_0;
45956
      }
45957
      if (v_block_type == 33u) {
45958
        if (a_src) {
45959
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
45960
        }
45961
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
45962
        status = wuffs_gif__decoder__decode_extension(self, a_src);
45963
        if (a_src) {
45964
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
45965
        }
45966
        if (status.repr) {
45967
          goto suspend;
45968
        }
45969
      } else if (v_block_type == 44u) {
45970
        if (self->private_impl.f_delayed_num_decoded_frames) {
45971
          self->private_impl.f_delayed_num_decoded_frames = false;
45972
          wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u);
45973
        }
45974
        if (a_src) {
45975
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
45976
        }
45977
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
45978
        status = wuffs_gif__decoder__decode_id_part0(self, a_src);
45979
        if (a_src) {
45980
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
45981
        }
45982
        if (status.repr) {
45983
          goto suspend;
45984
        }
45985
        break;
45986
      } else {
45987
        if (self->private_impl.f_delayed_num_decoded_frames) {
45988
          self->private_impl.f_delayed_num_decoded_frames = false;
45989
          wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u);
45990
        }
45991
        self->private_impl.f_call_sequence = 96u;
45992
        break;
45993
      }
45994
    }
45995
45996
    goto ok;
45997
    ok:
45998
    self->private_impl.p_decode_up_to_id_part1 = 0;
45999
    goto exit;
46000
  }
46001
46002
  goto suspend;
46003
  suspend:
46004
  self->private_impl.p_decode_up_to_id_part1 = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
46005
46006
  goto exit;
46007
  exit:
46008
  if (a_src && a_src->data.ptr) {
46009
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
46010
  }
46011
46012
  return status;
46013
}
46014
46015
// -------- func gif.decoder.decode_header
46016
46017
WUFFS_BASE__GENERATED_C_CODE
46018
static wuffs_base__status
46019
wuffs_gif__decoder__decode_header(
46020
    wuffs_gif__decoder* self,
46021
    wuffs_base__io_buffer* a_src) {
46022
  wuffs_base__status status = wuffs_base__make_status(NULL);
46023
46024
  uint64_t v_c48 = 0;
46025
46026
  const uint8_t* iop_a_src = NULL;
46027
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
46028
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
46029
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
46030
  if (a_src && a_src->data.ptr) {
46031
    io0_a_src = a_src->data.ptr;
46032
    io1_a_src = io0_a_src + a_src->meta.ri;
46033
    iop_a_src = io1_a_src;
46034
    io2_a_src = io0_a_src + a_src->meta.wi;
46035
  }
46036
46037
  uint32_t coro_susp_point = self->private_impl.p_decode_header;
46038
  switch (coro_susp_point) {
46039
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
46040
46041
    {
46042
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
46043
      uint64_t t_0;
46044
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 6)) {
46045
        t_0 = ((uint64_t)(wuffs_base__peek_u48le__no_bounds_check(iop_a_src)));
46046
        iop_a_src += 6;
46047
      } else {
46048
        self->private_data.s_decode_header.scratch = 0;
46049
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
46050
        while (true) {
46051
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
46052
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
46053
            goto suspend;
46054
          }
46055
          uint64_t* scratch = &self->private_data.s_decode_header.scratch;
46056
          uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
46057
          *scratch <<= 8;
46058
          *scratch >>= 8;
46059
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
46060
          if (num_bits_0 == 40) {
46061
            t_0 = ((uint64_t)(*scratch));
46062
            break;
46063
          }
46064
          num_bits_0 += 8u;
46065
          *scratch |= ((uint64_t)(num_bits_0)) << 56;
46066
        }
46067
      }
46068
      v_c48 = t_0;
46069
    }
46070
    if ((v_c48 != 106889795225927u) && (v_c48 != 106898385160519u)) {
46071
      status = wuffs_base__make_status(wuffs_gif__error__bad_header);
46072
      goto exit;
46073
    }
46074
46075
    goto ok;
46076
    ok:
46077
    self->private_impl.p_decode_header = 0;
46078
    goto exit;
46079
  }
46080
46081
  goto suspend;
46082
  suspend:
46083
  self->private_impl.p_decode_header = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
46084
46085
  goto exit;
46086
  exit:
46087
  if (a_src && a_src->data.ptr) {
46088
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
46089
  }
46090
46091
  return status;
46092
}
46093
46094
// -------- func gif.decoder.decode_lsd
46095
46096
WUFFS_BASE__GENERATED_C_CODE
46097
static wuffs_base__status
46098
wuffs_gif__decoder__decode_lsd(
46099
    wuffs_gif__decoder* self,
46100
    wuffs_base__io_buffer* a_src) {
46101
  wuffs_base__status status = wuffs_base__make_status(NULL);
46102
46103
  uint8_t v_flags = 0;
46104
  uint8_t v_background_color_index = 0;
46105
  uint32_t v_num_palette_entries = 0;
46106
  uint32_t v_i = 0;
46107
  uint32_t v_j = 0;
46108
  uint32_t v_argb = 0;
46109
46110
  const uint8_t* iop_a_src = NULL;
46111
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
46112
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
46113
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
46114
  if (a_src && a_src->data.ptr) {
46115
    io0_a_src = a_src->data.ptr;
46116
    io1_a_src = io0_a_src + a_src->meta.ri;
46117
    iop_a_src = io1_a_src;
46118
    io2_a_src = io0_a_src + a_src->meta.wi;
46119
  }
46120
46121
  uint32_t coro_susp_point = self->private_impl.p_decode_lsd;
46122
  if (coro_susp_point) {
46123
    v_flags = self->private_data.s_decode_lsd.v_flags;
46124
    v_background_color_index = self->private_data.s_decode_lsd.v_background_color_index;
46125
    v_num_palette_entries = self->private_data.s_decode_lsd.v_num_palette_entries;
46126
    v_i = self->private_data.s_decode_lsd.v_i;
46127
  }
46128
  switch (coro_susp_point) {
46129
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
46130
46131
    {
46132
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
46133
      uint32_t t_0;
46134
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
46135
        t_0 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
46136
        iop_a_src += 2;
46137
      } else {
46138
        self->private_data.s_decode_lsd.scratch = 0;
46139
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
46140
        while (true) {
46141
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
46142
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
46143
            goto suspend;
46144
          }
46145
          uint64_t* scratch = &self->private_data.s_decode_lsd.scratch;
46146
          uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
46147
          *scratch <<= 8;
46148
          *scratch >>= 8;
46149
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
46150
          if (num_bits_0 == 8) {
46151
            t_0 = ((uint32_t)(*scratch));
46152
            break;
46153
          }
46154
          num_bits_0 += 8u;
46155
          *scratch |= ((uint64_t)(num_bits_0)) << 56;
46156
        }
46157
      }
46158
      self->private_impl.f_width = t_0;
46159
    }
46160
    {
46161
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
46162
      uint32_t t_1;
46163
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
46164
        t_1 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
46165
        iop_a_src += 2;
46166
      } else {
46167
        self->private_data.s_decode_lsd.scratch = 0;
46168
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
46169
        while (true) {
46170
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
46171
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
46172
            goto suspend;
46173
          }
46174
          uint64_t* scratch = &self->private_data.s_decode_lsd.scratch;
46175
          uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
46176
          *scratch <<= 8;
46177
          *scratch >>= 8;
46178
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
46179
          if (num_bits_1 == 8) {
46180
            t_1 = ((uint32_t)(*scratch));
46181
            break;
46182
          }
46183
          num_bits_1 += 8u;
46184
          *scratch |= ((uint64_t)(num_bits_1)) << 56;
46185
        }
46186
      }
46187
      self->private_impl.f_height = t_1;
46188
    }
46189
    {
46190
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
46191
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
46192
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
46193
        goto suspend;
46194
      }
46195
      uint8_t t_2 = *iop_a_src++;
46196
      v_flags = t_2;
46197
    }
46198
    {
46199
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
46200
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
46201
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
46202
        goto suspend;
46203
      }
46204
      uint8_t t_3 = *iop_a_src++;
46205
      v_background_color_index = t_3;
46206
    }
46207
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
46208
    if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
46209
      status = wuffs_base__make_status(wuffs_base__suspension__short_read);
46210
      goto suspend;
46211
    }
46212
    iop_a_src++;
46213
    v_i = 0u;
46214
    self->private_impl.f_has_global_palette = (((uint8_t)(v_flags & 128u)) != 0u);
46215
    if (self->private_impl.f_has_global_palette) {
46216
      v_num_palette_entries = (((uint32_t)(1u)) << ((uint8_t)(1u + ((uint8_t)(v_flags & 7u)))));
46217
      while (v_i < v_num_palette_entries) {
46218
        {
46219
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
46220
          uint32_t t_4;
46221
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) {
46222
            t_4 = ((uint32_t)(wuffs_base__peek_u24be__no_bounds_check(iop_a_src)));
46223
            iop_a_src += 3;
46224
          } else {
46225
            self->private_data.s_decode_lsd.scratch = 0;
46226
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
46227
            while (true) {
46228
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
46229
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
46230
                goto suspend;
46231
              }
46232
              uint64_t* scratch = &self->private_data.s_decode_lsd.scratch;
46233
              uint32_t num_bits_4 = ((uint32_t)(*scratch & 0xFFu));
46234
              *scratch >>= 8;
46235
              *scratch <<= 8;
46236
              *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_4);
46237
              if (num_bits_4 == 16) {
46238
                t_4 = ((uint32_t)(*scratch >> 40));
46239
                break;
46240
              }
46241
              num_bits_4 += 8u;
46242
              *scratch |= ((uint64_t)(num_bits_4));
46243
            }
46244
          }
46245
          v_argb = t_4;
46246
        }
46247
        v_argb |= 4278190080u;
46248
        self->private_data.f_palettes[0u][((4u * v_i) + 0u)] = ((uint8_t)((v_argb >> 0u)));
46249
        self->private_data.f_palettes[0u][((4u * v_i) + 1u)] = ((uint8_t)((v_argb >> 8u)));
46250
        self->private_data.f_palettes[0u][((4u * v_i) + 2u)] = ((uint8_t)((v_argb >> 16u)));
46251
        self->private_data.f_palettes[0u][((4u * v_i) + 3u)] = ((uint8_t)((v_argb >> 24u)));
46252
        v_i += 1u;
46253
      }
46254
      if (self->private_impl.f_quirks[2u]) {
46255
        if ((v_background_color_index != 0u) && (((uint32_t)(v_background_color_index)) < v_num_palette_entries)) {
46256
          v_j = (4u * ((uint32_t)(v_background_color_index)));
46257
          self->private_impl.f_background_color_u32_argb_premul = ((((uint32_t)(self->private_data.f_palettes[0u][(v_j + 0u)])) << 0u) |
46258
              (((uint32_t)(self->private_data.f_palettes[0u][(v_j + 1u)])) << 8u) |
46259
              (((uint32_t)(self->private_data.f_palettes[0u][(v_j + 2u)])) << 16u) |
46260
              (((uint32_t)(self->private_data.f_palettes[0u][(v_j + 3u)])) << 24u));
46261
        } else {
46262
          self->private_impl.f_background_color_u32_argb_premul = 77u;
46263
        }
46264
      }
46265
    }
46266
    while (v_i < 256u) {
46267
      self->private_data.f_palettes[0u][((4u * v_i) + 0u)] = 0u;
46268
      self->private_data.f_palettes[0u][((4u * v_i) + 1u)] = 0u;
46269
      self->private_data.f_palettes[0u][((4u * v_i) + 2u)] = 0u;
46270
      self->private_data.f_palettes[0u][((4u * v_i) + 3u)] = 255u;
46271
      v_i += 1u;
46272
    }
46273
46274
    goto ok;
46275
    ok:
46276
    self->private_impl.p_decode_lsd = 0;
46277
    goto exit;
46278
  }
46279
46280
  goto suspend;
46281
  suspend:
46282
  self->private_impl.p_decode_lsd = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
46283
  self->private_data.s_decode_lsd.v_flags = v_flags;
46284
  self->private_data.s_decode_lsd.v_background_color_index = v_background_color_index;
46285
  self->private_data.s_decode_lsd.v_num_palette_entries = v_num_palette_entries;
46286
  self->private_data.s_decode_lsd.v_i = v_i;
46287
46288
  goto exit;
46289
  exit:
46290
  if (a_src && a_src->data.ptr) {
46291
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
46292
  }
46293
46294
  return status;
46295
}
46296
46297
// -------- func gif.decoder.decode_extension
46298
46299
WUFFS_BASE__GENERATED_C_CODE
46300
static wuffs_base__status
46301
wuffs_gif__decoder__decode_extension(
46302
    wuffs_gif__decoder* self,
46303
    wuffs_base__io_buffer* a_src) {
46304
  wuffs_base__status status = wuffs_base__make_status(NULL);
46305
46306
  uint8_t v_label = 0;
46307
46308
  const uint8_t* iop_a_src = NULL;
46309
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
46310
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
46311
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
46312
  if (a_src && a_src->data.ptr) {
46313
    io0_a_src = a_src->data.ptr;
46314
    io1_a_src = io0_a_src + a_src->meta.ri;
46315
    iop_a_src = io1_a_src;
46316
    io2_a_src = io0_a_src + a_src->meta.wi;
46317
  }
46318
46319
  uint32_t coro_susp_point = self->private_impl.p_decode_extension;
46320
  switch (coro_susp_point) {
46321
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
46322
46323
    {
46324
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
46325
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
46326
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
46327
        goto suspend;
46328
      }
46329
      uint8_t t_0 = *iop_a_src++;
46330
      v_label = t_0;
46331
    }
46332
    if (v_label == 249u) {
46333
      if (a_src) {
46334
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
46335
      }
46336
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
46337
      status = wuffs_gif__decoder__decode_gc(self, a_src);
46338
      if (a_src) {
46339
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
46340
      }
46341
      if (status.repr) {
46342
        goto suspend;
46343
      }
46344
      status = wuffs_base__make_status(NULL);
46345
      goto ok;
46346
    } else if (v_label == 255u) {
46347
      if (a_src) {
46348
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
46349
      }
46350
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
46351
      status = wuffs_gif__decoder__decode_ae(self, a_src);
46352
      if (a_src) {
46353
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
46354
      }
46355
      if (status.repr) {
46356
        goto suspend;
46357
      }
46358
      status = wuffs_base__make_status(NULL);
46359
      goto ok;
46360
    }
46361
    if (a_src) {
46362
      a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
46363
    }
46364
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
46365
    status = wuffs_gif__decoder__skip_blocks(self, a_src);
46366
    if (a_src) {
46367
      iop_a_src = a_src->data.ptr + a_src->meta.ri;
46368
    }
46369
    if (status.repr) {
46370
      goto suspend;
46371
    }
46372
46373
    ok:
46374
    self->private_impl.p_decode_extension = 0;
46375
    goto exit;
46376
  }
46377
46378
  goto suspend;
46379
  suspend:
46380
  self->private_impl.p_decode_extension = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
46381
46382
  goto exit;
46383
  exit:
46384
  if (a_src && a_src->data.ptr) {
46385
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
46386
  }
46387
46388
  return status;
46389
}
46390
46391
// -------- func gif.decoder.skip_blocks
46392
46393
WUFFS_BASE__GENERATED_C_CODE
46394
static wuffs_base__status
46395
wuffs_gif__decoder__skip_blocks(
46396
    wuffs_gif__decoder* self,
46397
    wuffs_base__io_buffer* a_src) {
46398
  wuffs_base__status status = wuffs_base__make_status(NULL);
46399
46400
  uint8_t v_block_size = 0;
46401
46402
  const uint8_t* iop_a_src = NULL;
46403
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
46404
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
46405
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
46406
  if (a_src && a_src->data.ptr) {
46407
    io0_a_src = a_src->data.ptr;
46408
    io1_a_src = io0_a_src + a_src->meta.ri;
46409
    iop_a_src = io1_a_src;
46410
    io2_a_src = io0_a_src + a_src->meta.wi;
46411
  }
46412
46413
  uint32_t coro_susp_point = self->private_impl.p_skip_blocks;
46414
  switch (coro_susp_point) {
46415
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
46416
46417
    while (true) {
46418
      {
46419
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
46420
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
46421
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
46422
          goto suspend;
46423
        }
46424
        uint8_t t_0 = *iop_a_src++;
46425
        v_block_size = t_0;
46426
      }
46427
      if (v_block_size == 0u) {
46428
        status = wuffs_base__make_status(NULL);
46429
        goto ok;
46430
      }
46431
      self->private_data.s_skip_blocks.scratch = ((uint32_t)(v_block_size));
46432
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
46433
      if (self->private_data.s_skip_blocks.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
46434
        self->private_data.s_skip_blocks.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
46435
        iop_a_src = io2_a_src;
46436
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
46437
        goto suspend;
46438
      }
46439
      iop_a_src += self->private_data.s_skip_blocks.scratch;
46440
    }
46441
46442
    ok:
46443
    self->private_impl.p_skip_blocks = 0;
46444
    goto exit;
46445
  }
46446
46447
  goto suspend;
46448
  suspend:
46449
  self->private_impl.p_skip_blocks = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
46450
46451
  goto exit;
46452
  exit:
46453
  if (a_src && a_src->data.ptr) {
46454
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
46455
  }
46456
46457
  return status;
46458
}
46459
46460
// -------- func gif.decoder.decode_ae
46461
46462
WUFFS_BASE__GENERATED_C_CODE
46463
static wuffs_base__status
46464
wuffs_gif__decoder__decode_ae(
46465
    wuffs_gif__decoder* self,
46466
    wuffs_base__io_buffer* a_src) {
46467
  wuffs_base__status status = wuffs_base__make_status(NULL);
46468
46469
  uint8_t v_c8 = 0;
46470
  uint8_t v_block_size = 0;
46471
  bool v_is_animexts = false;
46472
  bool v_is_netscape = false;
46473
  bool v_is_iccp = false;
46474
  bool v_is_xmp = false;
46475
46476
  const uint8_t* iop_a_src = NULL;
46477
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
46478
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
46479
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
46480
  if (a_src && a_src->data.ptr) {
46481
    io0_a_src = a_src->data.ptr;
46482
    io1_a_src = io0_a_src + a_src->meta.ri;
46483
    iop_a_src = io1_a_src;
46484
    io2_a_src = io0_a_src + a_src->meta.wi;
46485
  }
46486
46487
  uint32_t coro_susp_point = self->private_impl.p_decode_ae;
46488
  if (coro_susp_point) {
46489
    v_block_size = self->private_data.s_decode_ae.v_block_size;
46490
    v_is_animexts = self->private_data.s_decode_ae.v_is_animexts;
46491
    v_is_netscape = self->private_data.s_decode_ae.v_is_netscape;
46492
    v_is_iccp = self->private_data.s_decode_ae.v_is_iccp;
46493
    v_is_xmp = self->private_data.s_decode_ae.v_is_xmp;
46494
  }
46495
  switch (coro_susp_point) {
46496
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
46497
46498
    do {
46499
      if (self->private_impl.f_metadata_fourcc != 0u) {
46500
        status = wuffs_base__make_status(wuffs_base__note__metadata_reported);
46501
        goto ok;
46502
      }
46503
      {
46504
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
46505
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
46506
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
46507
          goto suspend;
46508
        }
46509
        uint8_t t_0 = *iop_a_src++;
46510
        v_block_size = t_0;
46511
      }
46512
      if (v_block_size == 0u) {
46513
        status = wuffs_base__make_status(NULL);
46514
        goto ok;
46515
      }
46516
      if (v_block_size != 11u) {
46517
        self->private_data.s_decode_ae.scratch = ((uint32_t)(v_block_size));
46518
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
46519
        if (self->private_data.s_decode_ae.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
46520
          self->private_data.s_decode_ae.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
46521
          iop_a_src = io2_a_src;
46522
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
46523
          goto suspend;
46524
        }
46525
        iop_a_src += self->private_data.s_decode_ae.scratch;
46526
        break;
46527
      }
46528
      v_is_animexts = true;
46529
      v_is_netscape = true;
46530
      v_is_iccp = true;
46531
      v_is_xmp = true;
46532
      v_block_size = 0u;
46533
      while (v_block_size < 11u) {
46534
        {
46535
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
46536
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
46537
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
46538
            goto suspend;
46539
          }
46540
          uint8_t t_1 = *iop_a_src++;
46541
          v_c8 = t_1;
46542
        }
46543
        v_is_animexts = (v_is_animexts && (v_c8 == WUFFS_GIF__ANIMEXTS1DOT0[v_block_size]));
46544
        v_is_netscape = (v_is_netscape && (v_c8 == WUFFS_GIF__NETSCAPE2DOT0[v_block_size]));
46545
        v_is_iccp = (v_is_iccp && (v_c8 == WUFFS_GIF__ICCRGBG1012[v_block_size]));
46546
        v_is_xmp = (v_is_xmp && (v_c8 == WUFFS_GIF__XMPDATAXMP[v_block_size]));
46547
#if defined(__GNUC__)
46548
#pragma GCC diagnostic push
46549
#pragma GCC diagnostic ignored "-Wconversion"
46550
#endif
46551
        v_block_size += 1u;
46552
#if defined(__GNUC__)
46553
#pragma GCC diagnostic pop
46554
#endif
46555
      }
46556
      if (v_is_animexts || v_is_netscape) {
46557
        {
46558
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
46559
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
46560
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
46561
            goto suspend;
46562
          }
46563
          uint8_t t_2 = *iop_a_src++;
46564
          v_block_size = t_2;
46565
        }
46566
        if (v_block_size != 3u) {
46567
          self->private_data.s_decode_ae.scratch = ((uint32_t)(v_block_size));
46568
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
46569
          if (self->private_data.s_decode_ae.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
46570
            self->private_data.s_decode_ae.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
46571
            iop_a_src = io2_a_src;
46572
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
46573
            goto suspend;
46574
          }
46575
          iop_a_src += self->private_data.s_decode_ae.scratch;
46576
          break;
46577
        }
46578
        {
46579
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
46580
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
46581
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
46582
            goto suspend;
46583
          }
46584
          uint8_t t_3 = *iop_a_src++;
46585
          v_c8 = t_3;
46586
        }
46587
        if (v_c8 != 1u) {
46588
          self->private_data.s_decode_ae.scratch = 2u;
46589
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
46590
          if (self->private_data.s_decode_ae.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
46591
            self->private_data.s_decode_ae.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
46592
            iop_a_src = io2_a_src;
46593
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
46594
            goto suspend;
46595
          }
46596
          iop_a_src += self->private_data.s_decode_ae.scratch;
46597
          break;
46598
        }
46599
        {
46600
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
46601
          uint32_t t_4;
46602
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
46603
            t_4 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
46604
            iop_a_src += 2;
46605
          } else {
46606
            self->private_data.s_decode_ae.scratch = 0;
46607
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
46608
            while (true) {
46609
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
46610
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
46611
                goto suspend;
46612
              }
46613
              uint64_t* scratch = &self->private_data.s_decode_ae.scratch;
46614
              uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56));
46615
              *scratch <<= 8;
46616
              *scratch >>= 8;
46617
              *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4;
46618
              if (num_bits_4 == 8) {
46619
                t_4 = ((uint32_t)(*scratch));
46620
                break;
46621
              }
46622
              num_bits_4 += 8u;
46623
              *scratch |= ((uint64_t)(num_bits_4)) << 56;
46624
            }
46625
          }
46626
          self->private_impl.f_num_animation_loops_value = t_4;
46627
        }
46628
        self->private_impl.f_seen_num_animation_loops_value = true;
46629
        if ((0u < self->private_impl.f_num_animation_loops_value) && (self->private_impl.f_num_animation_loops_value <= 65535u)) {
46630
          self->private_impl.f_num_animation_loops_value += 1u;
46631
        }
46632
      } else if (self->private_impl.f_call_sequence >= 32u) {
46633
      } else if (v_is_iccp && self->private_impl.f_report_metadata_iccp) {
46634
        self->private_impl.f_metadata_fourcc = 1229144912u;
46635
        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)));
46636
        self->private_impl.f_call_sequence = 16u;
46637
        status = wuffs_base__make_status(wuffs_base__note__metadata_reported);
46638
        goto ok;
46639
      } else if (v_is_xmp && self->private_impl.f_report_metadata_xmp) {
46640
        self->private_impl.f_metadata_fourcc = 1481461792u;
46641
        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)));
46642
        self->private_impl.f_call_sequence = 16u;
46643
        status = wuffs_base__make_status(wuffs_base__note__metadata_reported);
46644
        goto ok;
46645
      }
46646
    } while (0);
46647
    if (a_src) {
46648
      a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
46649
    }
46650
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
46651
    status = wuffs_gif__decoder__skip_blocks(self, a_src);
46652
    if (a_src) {
46653
      iop_a_src = a_src->data.ptr + a_src->meta.ri;
46654
    }
46655
    if (status.repr) {
46656
      goto suspend;
46657
    }
46658
46659
    ok:
46660
    self->private_impl.p_decode_ae = 0;
46661
    goto exit;
46662
  }
46663
46664
  goto suspend;
46665
  suspend:
46666
  self->private_impl.p_decode_ae = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
46667
  self->private_data.s_decode_ae.v_block_size = v_block_size;
46668
  self->private_data.s_decode_ae.v_is_animexts = v_is_animexts;
46669
  self->private_data.s_decode_ae.v_is_netscape = v_is_netscape;
46670
  self->private_data.s_decode_ae.v_is_iccp = v_is_iccp;
46671
  self->private_data.s_decode_ae.v_is_xmp = v_is_xmp;
46672
46673
  goto exit;
46674
  exit:
46675
  if (a_src && a_src->data.ptr) {
46676
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
46677
  }
46678
46679
  return status;
46680
}
46681
46682
// -------- func gif.decoder.decode_gc
46683
46684
WUFFS_BASE__GENERATED_C_CODE
46685
static wuffs_base__status
46686
wuffs_gif__decoder__decode_gc(
46687
    wuffs_gif__decoder* self,
46688
    wuffs_base__io_buffer* a_src) {
46689
  wuffs_base__status status = wuffs_base__make_status(NULL);
46690
46691
  uint8_t v_c8 = 0;
46692
  uint8_t v_flags = 0;
46693
  uint16_t v_gc_duration_centiseconds = 0;
46694
46695
  const uint8_t* iop_a_src = NULL;
46696
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
46697
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
46698
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
46699
  if (a_src && a_src->data.ptr) {
46700
    io0_a_src = a_src->data.ptr;
46701
    io1_a_src = io0_a_src + a_src->meta.ri;
46702
    iop_a_src = io1_a_src;
46703
    io2_a_src = io0_a_src + a_src->meta.wi;
46704
  }
46705
46706
  uint32_t coro_susp_point = self->private_impl.p_decode_gc;
46707
  switch (coro_susp_point) {
46708
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
46709
46710
    {
46711
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
46712
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
46713
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
46714
        goto suspend;
46715
      }
46716
      uint8_t t_0 = *iop_a_src++;
46717
      v_c8 = t_0;
46718
    }
46719
    if (v_c8 != 4u) {
46720
      status = wuffs_base__make_status(wuffs_gif__error__bad_graphic_control);
46721
      goto exit;
46722
    }
46723
    {
46724
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
46725
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
46726
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
46727
        goto suspend;
46728
      }
46729
      uint8_t t_1 = *iop_a_src++;
46730
      v_flags = t_1;
46731
    }
46732
    self->private_impl.f_gc_has_transparent_index = (((uint8_t)(v_flags & 1u)) != 0u);
46733
    v_flags = ((uint8_t)(((uint8_t)(v_flags >> 2u)) & 7u));
46734
    if (v_flags == 2u) {
46735
      self->private_impl.f_gc_disposal = 1u;
46736
    } else if ((v_flags == 3u) || (v_flags == 4u)) {
46737
      self->private_impl.f_gc_disposal = 2u;
46738
    } else {
46739
      self->private_impl.f_gc_disposal = 0u;
46740
    }
46741
    {
46742
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
46743
      uint16_t t_2;
46744
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
46745
        t_2 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src);
46746
        iop_a_src += 2;
46747
      } else {
46748
        self->private_data.s_decode_gc.scratch = 0;
46749
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
46750
        while (true) {
46751
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
46752
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
46753
            goto suspend;
46754
          }
46755
          uint64_t* scratch = &self->private_data.s_decode_gc.scratch;
46756
          uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56));
46757
          *scratch <<= 8;
46758
          *scratch >>= 8;
46759
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2;
46760
          if (num_bits_2 == 8) {
46761
            t_2 = ((uint16_t)(*scratch));
46762
            break;
46763
          }
46764
          num_bits_2 += 8u;
46765
          *scratch |= ((uint64_t)(num_bits_2)) << 56;
46766
        }
46767
      }
46768
      v_gc_duration_centiseconds = t_2;
46769
    }
46770
    self->private_impl.f_gc_duration = (((uint64_t)(v_gc_duration_centiseconds)) * 7056000u);
46771
    {
46772
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
46773
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
46774
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
46775
        goto suspend;
46776
      }
46777
      uint8_t t_3 = *iop_a_src++;
46778
      self->private_impl.f_gc_transparent_index = t_3;
46779
    }
46780
    {
46781
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
46782
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
46783
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
46784
        goto suspend;
46785
      }
46786
      uint8_t t_4 = *iop_a_src++;
46787
      v_c8 = t_4;
46788
    }
46789
    if (v_c8 != 0u) {
46790
      status = wuffs_base__make_status(wuffs_gif__error__bad_graphic_control);
46791
      goto exit;
46792
    }
46793
46794
    goto ok;
46795
    ok:
46796
    self->private_impl.p_decode_gc = 0;
46797
    goto exit;
46798
  }
46799
46800
  goto suspend;
46801
  suspend:
46802
  self->private_impl.p_decode_gc = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
46803
46804
  goto exit;
46805
  exit:
46806
  if (a_src && a_src->data.ptr) {
46807
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
46808
  }
46809
46810
  return status;
46811
}
46812
46813
// -------- func gif.decoder.decode_id_part0
46814
46815
WUFFS_BASE__GENERATED_C_CODE
46816
static wuffs_base__status
46817
wuffs_gif__decoder__decode_id_part0(
46818
    wuffs_gif__decoder* self,
46819
    wuffs_base__io_buffer* a_src) {
46820
  wuffs_base__status status = wuffs_base__make_status(NULL);
46821
46822
  const uint8_t* iop_a_src = NULL;
46823
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
46824
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
46825
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
46826
  if (a_src && a_src->data.ptr) {
46827
    io0_a_src = a_src->data.ptr;
46828
    io1_a_src = io0_a_src + a_src->meta.ri;
46829
    iop_a_src = io1_a_src;
46830
    io2_a_src = io0_a_src + a_src->meta.wi;
46831
  }
46832
46833
  uint32_t coro_susp_point = self->private_impl.p_decode_id_part0;
46834
  switch (coro_susp_point) {
46835
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
46836
46837
    {
46838
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
46839
      uint32_t t_0;
46840
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
46841
        t_0 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
46842
        iop_a_src += 2;
46843
      } else {
46844
        self->private_data.s_decode_id_part0.scratch = 0;
46845
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
46846
        while (true) {
46847
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
46848
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
46849
            goto suspend;
46850
          }
46851
          uint64_t* scratch = &self->private_data.s_decode_id_part0.scratch;
46852
          uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
46853
          *scratch <<= 8;
46854
          *scratch >>= 8;
46855
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
46856
          if (num_bits_0 == 8) {
46857
            t_0 = ((uint32_t)(*scratch));
46858
            break;
46859
          }
46860
          num_bits_0 += 8u;
46861
          *scratch |= ((uint64_t)(num_bits_0)) << 56;
46862
        }
46863
      }
46864
      self->private_impl.f_frame_rect_x0 = t_0;
46865
    }
46866
    {
46867
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
46868
      uint32_t t_1;
46869
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
46870
        t_1 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
46871
        iop_a_src += 2;
46872
      } else {
46873
        self->private_data.s_decode_id_part0.scratch = 0;
46874
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
46875
        while (true) {
46876
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
46877
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
46878
            goto suspend;
46879
          }
46880
          uint64_t* scratch = &self->private_data.s_decode_id_part0.scratch;
46881
          uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
46882
          *scratch <<= 8;
46883
          *scratch >>= 8;
46884
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
46885
          if (num_bits_1 == 8) {
46886
            t_1 = ((uint32_t)(*scratch));
46887
            break;
46888
          }
46889
          num_bits_1 += 8u;
46890
          *scratch |= ((uint64_t)(num_bits_1)) << 56;
46891
        }
46892
      }
46893
      self->private_impl.f_frame_rect_y0 = t_1;
46894
    }
46895
    {
46896
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
46897
      uint32_t t_2;
46898
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
46899
        t_2 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
46900
        iop_a_src += 2;
46901
      } else {
46902
        self->private_data.s_decode_id_part0.scratch = 0;
46903
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
46904
        while (true) {
46905
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
46906
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
46907
            goto suspend;
46908
          }
46909
          uint64_t* scratch = &self->private_data.s_decode_id_part0.scratch;
46910
          uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56));
46911
          *scratch <<= 8;
46912
          *scratch >>= 8;
46913
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2;
46914
          if (num_bits_2 == 8) {
46915
            t_2 = ((uint32_t)(*scratch));
46916
            break;
46917
          }
46918
          num_bits_2 += 8u;
46919
          *scratch |= ((uint64_t)(num_bits_2)) << 56;
46920
        }
46921
      }
46922
      self->private_impl.f_frame_rect_x1 = t_2;
46923
    }
46924
    self->private_impl.f_frame_rect_x1 += self->private_impl.f_frame_rect_x0;
46925
    {
46926
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
46927
      uint32_t t_3;
46928
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
46929
        t_3 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
46930
        iop_a_src += 2;
46931
      } else {
46932
        self->private_data.s_decode_id_part0.scratch = 0;
46933
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
46934
        while (true) {
46935
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
46936
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
46937
            goto suspend;
46938
          }
46939
          uint64_t* scratch = &self->private_data.s_decode_id_part0.scratch;
46940
          uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56));
46941
          *scratch <<= 8;
46942
          *scratch >>= 8;
46943
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3;
46944
          if (num_bits_3 == 8) {
46945
            t_3 = ((uint32_t)(*scratch));
46946
            break;
46947
          }
46948
          num_bits_3 += 8u;
46949
          *scratch |= ((uint64_t)(num_bits_3)) << 56;
46950
        }
46951
      }
46952
      self->private_impl.f_frame_rect_y1 = t_3;
46953
    }
46954
    self->private_impl.f_frame_rect_y1 += self->private_impl.f_frame_rect_y0;
46955
    self->private_impl.f_dst_x = self->private_impl.f_frame_rect_x0;
46956
    self->private_impl.f_dst_y = self->private_impl.f_frame_rect_y0;
46957
    if ((self->private_impl.f_num_decoded_frame_configs_value == 0u) &&  ! self->private_impl.f_quirks[4u]) {
46958
      self->private_impl.f_width = wuffs_base__u32__max(self->private_impl.f_width, self->private_impl.f_frame_rect_x1);
46959
      self->private_impl.f_height = wuffs_base__u32__max(self->private_impl.f_height, self->private_impl.f_frame_rect_y1);
46960
    }
46961
46962
    goto ok;
46963
    ok:
46964
    self->private_impl.p_decode_id_part0 = 0;
46965
    goto exit;
46966
  }
46967
46968
  goto suspend;
46969
  suspend:
46970
  self->private_impl.p_decode_id_part0 = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
46971
46972
  goto exit;
46973
  exit:
46974
  if (a_src && a_src->data.ptr) {
46975
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
46976
  }
46977
46978
  return status;
46979
}
46980
46981
// -------- func gif.decoder.decode_id_part1
46982
46983
WUFFS_BASE__GENERATED_C_CODE
46984
static wuffs_base__status
46985
wuffs_gif__decoder__decode_id_part1(
46986
    wuffs_gif__decoder* self,
46987
    wuffs_base__pixel_buffer* a_dst,
46988
    wuffs_base__io_buffer* a_src,
46989
    wuffs_base__pixel_blend a_blend) {
46990
  wuffs_base__status status = wuffs_base__make_status(NULL);
46991
46992
  uint8_t v_flags = 0;
46993
  uint8_t v_which_palette = 0;
46994
  uint32_t v_num_palette_entries = 0;
46995
  uint32_t v_i = 0;
46996
  uint32_t v_argb = 0;
46997
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
46998
  uint8_t v_lw = 0;
46999
47000
  const uint8_t* iop_a_src = NULL;
47001
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
47002
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
47003
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
47004
  if (a_src && a_src->data.ptr) {
47005
    io0_a_src = a_src->data.ptr;
47006
    io1_a_src = io0_a_src + a_src->meta.ri;
47007
    iop_a_src = io1_a_src;
47008
    io2_a_src = io0_a_src + a_src->meta.wi;
47009
  }
47010
47011
  uint32_t coro_susp_point = self->private_impl.p_decode_id_part1;
47012
  if (coro_susp_point) {
47013
    v_which_palette = self->private_data.s_decode_id_part1.v_which_palette;
47014
    v_num_palette_entries = self->private_data.s_decode_id_part1.v_num_palette_entries;
47015
    v_i = self->private_data.s_decode_id_part1.v_i;
47016
  }
47017
  switch (coro_susp_point) {
47018
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
47019
47020
    {
47021
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
47022
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
47023
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
47024
        goto suspend;
47025
      }
47026
      uint8_t t_0 = *iop_a_src++;
47027
      v_flags = t_0;
47028
    }
47029
    if (((uint8_t)(v_flags & 64u)) != 0u) {
47030
      self->private_impl.f_interlace = 4u;
47031
    } else {
47032
      self->private_impl.f_interlace = 0u;
47033
    }
47034
    v_which_palette = 1u;
47035
    if (((uint8_t)(v_flags & 128u)) != 0u) {
47036
      v_num_palette_entries = (((uint32_t)(1u)) << ((uint8_t)(1u + ((uint8_t)(v_flags & 7u)))));
47037
      v_i = 0u;
47038
      while (v_i < v_num_palette_entries) {
47039
        {
47040
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
47041
          uint32_t t_1;
47042
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) {
47043
            t_1 = ((uint32_t)(wuffs_base__peek_u24be__no_bounds_check(iop_a_src)));
47044
            iop_a_src += 3;
47045
          } else {
47046
            self->private_data.s_decode_id_part1.scratch = 0;
47047
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
47048
            while (true) {
47049
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
47050
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
47051
                goto suspend;
47052
              }
47053
              uint64_t* scratch = &self->private_data.s_decode_id_part1.scratch;
47054
              uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu));
47055
              *scratch >>= 8;
47056
              *scratch <<= 8;
47057
              *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1);
47058
              if (num_bits_1 == 16) {
47059
                t_1 = ((uint32_t)(*scratch >> 40));
47060
                break;
47061
              }
47062
              num_bits_1 += 8u;
47063
              *scratch |= ((uint64_t)(num_bits_1));
47064
            }
47065
          }
47066
          v_argb = t_1;
47067
        }
47068
        v_argb |= 4278190080u;
47069
        self->private_data.f_palettes[1u][((4u * v_i) + 0u)] = ((uint8_t)((v_argb >> 0u)));
47070
        self->private_data.f_palettes[1u][((4u * v_i) + 1u)] = ((uint8_t)((v_argb >> 8u)));
47071
        self->private_data.f_palettes[1u][((4u * v_i) + 2u)] = ((uint8_t)((v_argb >> 16u)));
47072
        self->private_data.f_palettes[1u][((4u * v_i) + 3u)] = ((uint8_t)((v_argb >> 24u)));
47073
        v_i += 1u;
47074
      }
47075
      while (v_i < 256u) {
47076
        self->private_data.f_palettes[1u][((4u * v_i) + 0u)] = 0u;
47077
        self->private_data.f_palettes[1u][((4u * v_i) + 1u)] = 0u;
47078
        self->private_data.f_palettes[1u][((4u * v_i) + 2u)] = 0u;
47079
        self->private_data.f_palettes[1u][((4u * v_i) + 3u)] = 255u;
47080
        v_i += 1u;
47081
      }
47082
    } else if (self->private_impl.f_quirks[6u] &&  ! self->private_impl.f_has_global_palette) {
47083
      status = wuffs_base__make_status(wuffs_gif__error__bad_palette);
47084
      goto exit;
47085
    } else if (self->private_impl.f_gc_has_transparent_index) {
47086
      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));
47087
    } else {
47088
      v_which_palette = 0u;
47089
    }
47090
    if (self->private_impl.f_gc_has_transparent_index) {
47091
      self->private_data.f_palettes[1u][((4u * ((uint32_t)(self->private_impl.f_gc_transparent_index))) + 0u)] = 0u;
47092
      self->private_data.f_palettes[1u][((4u * ((uint32_t)(self->private_impl.f_gc_transparent_index))) + 1u)] = 0u;
47093
      self->private_data.f_palettes[1u][((4u * ((uint32_t)(self->private_impl.f_gc_transparent_index))) + 2u)] = 0u;
47094
      self->private_data.f_palettes[1u][((4u * ((uint32_t)(self->private_impl.f_gc_transparent_index))) + 3u)] = 0u;
47095
    }
47096
    v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler,
47097
        wuffs_base__pixel_buffer__pixel_format(a_dst),
47098
        wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)),
47099
        wuffs_base__utility__make_pixel_format(2198077448u),
47100
        wuffs_base__make_slice_u8(self->private_data.f_palettes[v_which_palette], 1024),
47101
        a_blend);
47102
    if ( ! wuffs_base__status__is_ok(&v_status)) {
47103
      status = v_status;
47104
      if (wuffs_base__status__is_error(&status)) {
47105
        goto exit;
47106
      } else if (wuffs_base__status__is_suspension(&status)) {
47107
        status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
47108
        goto exit;
47109
      }
47110
      goto ok;
47111
    }
47112
    if (self->private_impl.f_ignored_but_affects_benchmarks) {
47113
    }
47114
    {
47115
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
47116
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
47117
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
47118
        goto suspend;
47119
      }
47120
      uint8_t t_2 = *iop_a_src++;
47121
      v_lw = t_2;
47122
    }
47123
    if (v_lw > 8u) {
47124
      status = wuffs_base__make_status(wuffs_gif__error__bad_literal_width);
47125
      goto exit;
47126
    }
47127
    self->private_impl.f_lzw_pending_literal_width_plus_one = ((uint32_t)(((uint8_t)(1u + v_lw))));
47128
    self->private_impl.f_ignored_but_affects_benchmarks = true;
47129
47130
    ok:
47131
    self->private_impl.p_decode_id_part1 = 0;
47132
    goto exit;
47133
  }
47134
47135
  goto suspend;
47136
  suspend:
47137
  self->private_impl.p_decode_id_part1 = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
47138
  self->private_data.s_decode_id_part1.v_which_palette = v_which_palette;
47139
  self->private_data.s_decode_id_part1.v_num_palette_entries = v_num_palette_entries;
47140
  self->private_data.s_decode_id_part1.v_i = v_i;
47141
47142
  goto exit;
47143
  exit:
47144
  if (a_src && a_src->data.ptr) {
47145
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
47146
  }
47147
47148
  return status;
47149
}
47150
47151
// -------- func gif.decoder.decode_id_part2
47152
47153
WUFFS_BASE__GENERATED_C_CODE
47154
static wuffs_base__status
47155
wuffs_gif__decoder__decode_id_part2(
47156
    wuffs_gif__decoder* self,
47157
    wuffs_base__pixel_buffer* a_dst,
47158
    wuffs_base__io_buffer* a_src,
47159
    wuffs_base__slice_u8 a_workbuf) {
47160
  wuffs_base__status status = wuffs_base__make_status(NULL);
47161
47162
  uint64_t v_block_size = 0;
47163
  bool v_need_block_size = false;
47164
  uint32_t v_n_copied = 0;
47165
  uint64_t v_n_compressed = 0;
47166
  wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer();
47167
  wuffs_base__io_buffer* v_r = &u_r;
47168
  const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
47169
  const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
47170
  const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
47171
  const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
47172
  uint64_t v_mark = 0;
47173
  wuffs_base__status v_copy_status = wuffs_base__make_status(NULL);
47174
47175
  const uint8_t* iop_a_src = NULL;
47176
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
47177
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
47178
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
47179
  if (a_src && a_src->data.ptr) {
47180
    io0_a_src = a_src->data.ptr;
47181
    io1_a_src = io0_a_src + a_src->meta.ri;
47182
    iop_a_src = io1_a_src;
47183
    io2_a_src = io0_a_src + a_src->meta.wi;
47184
  }
47185
47186
  uint32_t coro_susp_point = self->private_impl.p_decode_id_part2;
47187
  if (coro_susp_point) {
47188
    v_block_size = self->private_data.s_decode_id_part2.v_block_size;
47189
    v_need_block_size = self->private_data.s_decode_id_part2.v_need_block_size;
47190
  }
47191
  switch (coro_susp_point) {
47192
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
47193
47194
    wuffs_gif__decoder__lzw_init(self);
47195
    v_need_block_size = true;
47196
    label__outer__continue:;
47197
    while (true) {
47198
      if (v_need_block_size) {
47199
        v_need_block_size = false;
47200
        {
47201
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
47202
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
47203
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
47204
            goto suspend;
47205
          }
47206
          uint64_t t_0 = *iop_a_src++;
47207
          v_block_size = t_0;
47208
        }
47209
      }
47210
      if (v_block_size == 0u) {
47211
        break;
47212
      }
47213
      while (((uint64_t)(io2_a_src - iop_a_src)) == 0u) {
47214
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
47215
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2);
47216
      }
47217
      if (self->private_impl.f_compressed_ri == self->private_impl.f_compressed_wi) {
47218
        self->private_impl.f_compressed_ri = 0u;
47219
        self->private_impl.f_compressed_wi = 0u;
47220
      }
47221
      while (self->private_impl.f_compressed_wi <= 3841u) {
47222
        v_n_compressed = wuffs_base__u64__min(v_block_size, ((uint64_t)(io2_a_src - iop_a_src)));
47223
        if (v_n_compressed <= 0u) {
47224
          break;
47225
        }
47226
        v_n_copied = wuffs_private_impl__io_reader__limited_copy_u32_to_slice(
47227
            &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));
47228
        wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_compressed_wi, ((uint64_t)(v_n_copied)));
47229
        wuffs_private_impl__u64__sat_sub_indirect(&v_block_size, ((uint64_t)(v_n_copied)));
47230
        if (v_block_size > 0u) {
47231
          break;
47232
        }
47233
        if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
47234
          v_need_block_size = true;
47235
          break;
47236
        }
47237
        v_block_size = ((uint64_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src)));
47238
        iop_a_src += 1u;
47239
      }
47240
      while (true) {
47241
        if ((self->private_impl.f_compressed_ri > self->private_impl.f_compressed_wi) || (self->private_impl.f_compressed_wi > 4096u)) {
47242
          status = wuffs_base__make_status(wuffs_gif__error__internal_error_inconsistent_i_o);
47243
          goto exit;
47244
        }
47245
        {
47246
          wuffs_base__io_buffer* o_0_v_r = v_r;
47247
          const uint8_t* o_0_iop_v_r = iop_v_r;
47248
          const uint8_t* o_0_io0_v_r = io0_v_r;
47249
          const uint8_t* o_0_io1_v_r = io1_v_r;
47250
          const uint8_t* o_0_io2_v_r = io2_v_r;
47251
          v_r = wuffs_private_impl__io_reader__set(
47252
              &u_r,
47253
              &iop_v_r,
47254
              &io0_v_r,
47255
              &io1_v_r,
47256
              &io2_v_r,
47257
              wuffs_base__make_slice_u8_ij(self->private_data.f_compressed,
47258
              self->private_impl.f_compressed_ri,
47259
              self->private_impl.f_compressed_wi),
47260
              0u);
47261
          v_mark = ((uint64_t)(iop_v_r - io0_v_r));
47262
          u_r.meta.ri = ((size_t)(iop_v_r - u_r.data.ptr));
47263
          wuffs_gif__decoder__lzw_read_from(self, v_r);
47264
          iop_v_r = u_r.data.ptr + u_r.meta.ri;
47265
          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))));
47266
          v_r = o_0_v_r;
47267
          iop_v_r = o_0_iop_v_r;
47268
          io0_v_r = o_0_io0_v_r;
47269
          io1_v_r = o_0_io1_v_r;
47270
          io2_v_r = o_0_io2_v_r;
47271
        }
47272
        if (self->private_impl.f_lzw_output_ri < self->private_impl.f_lzw_output_wi) {
47273
          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,
47274
              self->private_impl.f_lzw_output_ri,
47275
              self->private_impl.f_lzw_output_wi));
47276
          if (wuffs_base__status__is_error(&v_copy_status)) {
47277
            status = v_copy_status;
47278
            goto exit;
47279
          }
47280
          self->private_impl.f_lzw_output_ri = 0u;
47281
          self->private_impl.f_lzw_output_wi = 0u;
47282
        }
47283
        if (self->private_impl.f_lzw_read_from_return_value == 0u) {
47284
          self->private_impl.f_ignored_but_affects_benchmarks = false;
47285
          if (v_need_block_size || (v_block_size > 0u)) {
47286
            self->private_data.s_decode_id_part2.scratch = ((uint32_t)(v_block_size));
47287
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
47288
            if (self->private_data.s_decode_id_part2.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
47289
              self->private_data.s_decode_id_part2.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
47290
              iop_a_src = io2_a_src;
47291
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
47292
              goto suspend;
47293
            }
47294
            iop_a_src += self->private_data.s_decode_id_part2.scratch;
47295
            if (a_src) {
47296
              a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
47297
            }
47298
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
47299
            status = wuffs_gif__decoder__skip_blocks(self, a_src);
47300
            if (a_src) {
47301
              iop_a_src = a_src->data.ptr + a_src->meta.ri;
47302
            }
47303
            if (status.repr) {
47304
              goto suspend;
47305
            }
47306
          }
47307
          goto label__outer__break;
47308
        } else if (self->private_impl.f_lzw_read_from_return_value == 1u) {
47309
          continue;
47310
        } else if (self->private_impl.f_lzw_read_from_return_value == 2u) {
47311
          goto label__outer__continue;
47312
        } 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)) {
47313
          if (v_need_block_size || (v_block_size > 0u)) {
47314
            self->private_data.s_decode_id_part2.scratch = ((uint32_t)(v_block_size));
47315
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
47316
            if (self->private_data.s_decode_id_part2.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
47317
              self->private_data.s_decode_id_part2.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
47318
              iop_a_src = io2_a_src;
47319
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
47320
              goto suspend;
47321
            }
47322
            iop_a_src += self->private_data.s_decode_id_part2.scratch;
47323
            if (a_src) {
47324
              a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
47325
            }
47326
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
47327
            status = wuffs_gif__decoder__skip_blocks(self, a_src);
47328
            if (a_src) {
47329
              iop_a_src = a_src->data.ptr + a_src->meta.ri;
47330
            }
47331
            if (status.repr) {
47332
              goto suspend;
47333
            }
47334
          }
47335
          goto label__outer__break;
47336
        } else if (self->private_impl.f_lzw_read_from_return_value == 3u) {
47337
          status = wuffs_base__make_status(wuffs_gif__error__truncated_input);
47338
          goto exit;
47339
        } else if (self->private_impl.f_lzw_read_from_return_value == 4u) {
47340
          status = wuffs_base__make_status(wuffs_gif__error__bad_lzw_code);
47341
          goto exit;
47342
        }
47343
        status = wuffs_base__make_status(wuffs_gif__error__internal_error_inconsistent_i_o);
47344
        goto exit;
47345
      }
47346
    }
47347
    label__outer__break:;
47348
    self->private_impl.f_compressed_ri = 0u;
47349
    self->private_impl.f_compressed_wi = 0u;
47350
    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)) {
47351
      status = wuffs_base__make_status(wuffs_base__error__not_enough_data);
47352
      goto exit;
47353
    }
47354
47355
    ok:
47356
    self->private_impl.p_decode_id_part2 = 0;
47357
    goto exit;
47358
  }
47359
47360
  goto suspend;
47361
  suspend:
47362
  self->private_impl.p_decode_id_part2 = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
47363
  self->private_data.s_decode_id_part2.v_block_size = v_block_size;
47364
  self->private_data.s_decode_id_part2.v_need_block_size = v_need_block_size;
47365
47366
  goto exit;
47367
  exit:
47368
  if (a_src && a_src->data.ptr) {
47369
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
47370
  }
47371
47372
  return status;
47373
}
47374
47375
// -------- func gif.decoder.copy_to_image_buffer
47376
47377
WUFFS_BASE__GENERATED_C_CODE
47378
static wuffs_base__status
47379
wuffs_gif__decoder__copy_to_image_buffer(
47380
    wuffs_gif__decoder* self,
47381
    wuffs_base__pixel_buffer* a_pb,
47382
    wuffs_base__slice_u8 a_src) {
47383
  wuffs_base__slice_u8 v_dst = {0};
47384
  wuffs_base__slice_u8 v_src = {0};
47385
  uint64_t v_width_in_bytes = 0;
47386
  uint64_t v_n = 0;
47387
  uint64_t v_src_ri = 0;
47388
  wuffs_base__pixel_format v_pixfmt = {0};
47389
  uint32_t v_bytes_per_pixel = 0;
47390
  uint32_t v_bits_per_pixel = 0;
47391
  wuffs_base__table_u8 v_tab = {0};
47392
  uint64_t v_i = 0;
47393
  uint64_t v_j = 0;
47394
  uint32_t v_replicate_y0 = 0;
47395
  uint32_t v_replicate_y1 = 0;
47396
  wuffs_base__slice_u8 v_replicate_dst = {0};
47397
  wuffs_base__slice_u8 v_replicate_src = {0};
47398
47399
  v_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_pb);
47400
  v_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_pixfmt);
47401
  if ((v_bits_per_pixel & 7u) != 0u) {
47402
    return wuffs_base__make_status(wuffs_base__error__unsupported_option);
47403
  }
47404
  v_bytes_per_pixel = (v_bits_per_pixel >> 3u);
47405
  v_width_in_bytes = ((uint64_t)((self->private_impl.f_width * v_bytes_per_pixel)));
47406
  v_tab = wuffs_base__pixel_buffer__plane(a_pb, 0u);
47407
  while (v_src_ri < ((uint64_t)(a_src.len))) {
47408
    v_src = wuffs_base__slice_u8__subslice_i(a_src, v_src_ri);
47409
    if (self->private_impl.f_dst_y >= self->private_impl.f_frame_rect_y1) {
47410
      if (self->private_impl.f_quirks[3u]) {
47411
        return wuffs_base__make_status(NULL);
47412
      }
47413
      return wuffs_base__make_status(wuffs_base__error__too_much_data);
47414
    }
47415
    v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y);
47416
    if (self->private_impl.f_dst_y >= self->private_impl.f_height) {
47417
      v_dst = wuffs_base__slice_u8__subslice_j(v_dst, 0u);
47418
    } else if (v_width_in_bytes < ((uint64_t)(v_dst.len))) {
47419
      v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_width_in_bytes);
47420
    }
47421
    v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_bytes_per_pixel)));
47422
    if (v_i < ((uint64_t)(v_dst.len))) {
47423
      v_j = (((uint64_t)(self->private_impl.f_frame_rect_x1)) * ((uint64_t)(v_bytes_per_pixel)));
47424
      if ((v_i <= v_j) && (v_j <= ((uint64_t)(v_dst.len)))) {
47425
        v_dst = wuffs_base__slice_u8__subslice_ij(v_dst, v_i, v_j);
47426
      } else {
47427
        v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_i);
47428
      }
47429
      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);
47430
      wuffs_private_impl__u64__sat_add_indirect(&v_src_ri, v_n);
47431
      wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n)));
47432
      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));
47433
    }
47434
    if (self->private_impl.f_frame_rect_x1 <= self->private_impl.f_dst_x) {
47435
      self->private_impl.f_dst_x = self->private_impl.f_frame_rect_x0;
47436
      if (self->private_impl.f_interlace == 0u) {
47437
        wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_y, 1u);
47438
        continue;
47439
      }
47440
      if ((self->private_impl.f_num_decoded_frames_value == 0u) &&  ! self->private_impl.f_gc_has_transparent_index && (self->private_impl.f_interlace > 1u)) {
47441
        v_replicate_src = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y);
47442
        v_replicate_y0 = wuffs_base__u32__sat_add(self->private_impl.f_dst_y, 1u);
47443
        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])));
47444
        v_replicate_y1 = wuffs_base__u32__min(v_replicate_y1, self->private_impl.f_frame_rect_y1);
47445
        while (v_replicate_y0 < v_replicate_y1) {
47446
          v_replicate_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_replicate_y0);
47447
          wuffs_private_impl__slice_u8__copy_from_slice(v_replicate_dst, v_replicate_src);
47448
          v_replicate_y0 += 1u;
47449
        }
47450
        self->private_impl.f_dirty_max_excl_y = wuffs_base__u32__max(self->private_impl.f_dirty_max_excl_y, v_replicate_y1);
47451
      }
47452
      wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_y, ((uint32_t)(WUFFS_GIF__INTERLACE_DELTA[self->private_impl.f_interlace])));
47453
      while ((self->private_impl.f_interlace > 0u) && (self->private_impl.f_dst_y >= self->private_impl.f_frame_rect_y1)) {
47454
#if defined(__GNUC__)
47455
#pragma GCC diagnostic push
47456
#pragma GCC diagnostic ignored "-Wconversion"
47457
#endif
47458
        self->private_impl.f_interlace -= 1u;
47459
#if defined(__GNUC__)
47460
#pragma GCC diagnostic pop
47461
#endif
47462
        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]);
47463
      }
47464
      continue;
47465
    }
47466
    if (((uint64_t)(a_src.len)) == v_src_ri) {
47467
      break;
47468
    } else if (((uint64_t)(a_src.len)) < v_src_ri) {
47469
      return wuffs_base__make_status(wuffs_gif__error__internal_error_inconsistent_i_o);
47470
    }
47471
    v_n = ((uint64_t)((self->private_impl.f_frame_rect_x1 - self->private_impl.f_dst_x)));
47472
    v_n = wuffs_base__u64__min(v_n, (((uint64_t)(a_src.len)) - v_src_ri));
47473
    wuffs_private_impl__u64__sat_add_indirect(&v_src_ri, v_n);
47474
    wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n)));
47475
    if (self->private_impl.f_frame_rect_x1 <= self->private_impl.f_dst_x) {
47476
      self->private_impl.f_dst_x = self->private_impl.f_frame_rect_x0;
47477
      wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_y, ((uint32_t)(WUFFS_GIF__INTERLACE_DELTA[self->private_impl.f_interlace])));
47478
      while ((self->private_impl.f_interlace > 0u) && (self->private_impl.f_dst_y >= self->private_impl.f_frame_rect_y1)) {
47479
#if defined(__GNUC__)
47480
#pragma GCC diagnostic push
47481
#pragma GCC diagnostic ignored "-Wconversion"
47482
#endif
47483
        self->private_impl.f_interlace -= 1u;
47484
#if defined(__GNUC__)
47485
#pragma GCC diagnostic pop
47486
#endif
47487
        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]);
47488
      }
47489
      continue;
47490
    }
47491
    if (v_src_ri != ((uint64_t)(a_src.len))) {
47492
      return wuffs_base__make_status(wuffs_gif__error__internal_error_inconsistent_i_o);
47493
    }
47494
    break;
47495
  }
47496
  return wuffs_base__make_status(NULL);
47497
}
47498
47499
// -------- func gif.decoder.lzw_init
47500
47501
WUFFS_BASE__GENERATED_C_CODE
47502
static wuffs_base__empty_struct
47503
wuffs_gif__decoder__lzw_init(
47504
    wuffs_gif__decoder* self) {
47505
  uint32_t v_i = 0;
47506
47507
  self->private_impl.f_lzw_literal_width = 8u;
47508
  if (self->private_impl.f_lzw_pending_literal_width_plus_one > 0u) {
47509
    self->private_impl.f_lzw_literal_width = (self->private_impl.f_lzw_pending_literal_width_plus_one - 1u);
47510
  }
47511
  self->private_impl.f_lzw_clear_code = (((uint32_t)(1u)) << self->private_impl.f_lzw_literal_width);
47512
  self->private_impl.f_lzw_end_code = (self->private_impl.f_lzw_clear_code + 1u);
47513
  self->private_impl.f_lzw_save_code = self->private_impl.f_lzw_end_code;
47514
  self->private_impl.f_lzw_prev_code = self->private_impl.f_lzw_end_code;
47515
  self->private_impl.f_lzw_width = (self->private_impl.f_lzw_literal_width + 1u);
47516
  self->private_impl.f_lzw_bits = 0u;
47517
  self->private_impl.f_lzw_n_bits = 0u;
47518
  self->private_impl.f_lzw_output_ri = 0u;
47519
  self->private_impl.f_lzw_output_wi = 0u;
47520
  v_i = 0u;
47521
  while (v_i < self->private_impl.f_lzw_clear_code) {
47522
    self->private_data.f_lzw_lm1s[v_i] = 0u;
47523
    self->private_data.f_lzw_suffixes[v_i][0u] = ((uint8_t)(v_i));
47524
    v_i += 1u;
47525
  }
47526
  return wuffs_base__make_empty_struct();
47527
}
47528
47529
// -------- func gif.decoder.lzw_read_from
47530
47531
WUFFS_BASE__GENERATED_C_CODE
47532
static wuffs_base__empty_struct
47533
wuffs_gif__decoder__lzw_read_from(
47534
    wuffs_gif__decoder* self,
47535
    wuffs_base__io_buffer* a_src) {
47536
  uint32_t v_clear_code = 0;
47537
  uint32_t v_end_code = 0;
47538
  uint32_t v_save_code = 0;
47539
  uint32_t v_prev_code = 0;
47540
  uint32_t v_width = 0;
47541
  uint32_t v_bits = 0;
47542
  uint32_t v_n_bits = 0;
47543
  uint32_t v_output_wi = 0;
47544
  uint32_t v_code = 0;
47545
  uint32_t v_c = 0;
47546
  uint32_t v_o = 0;
47547
  uint32_t v_steps = 0;
47548
  uint8_t v_first_byte = 0;
47549
  uint16_t v_lm1_b = 0;
47550
  uint16_t v_lm1_a = 0;
47551
47552
  const uint8_t* iop_a_src = NULL;
47553
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
47554
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
47555
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
47556
  if (a_src && a_src->data.ptr) {
47557
    io0_a_src = a_src->data.ptr;
47558
    io1_a_src = io0_a_src + a_src->meta.ri;
47559
    iop_a_src = io1_a_src;
47560
    io2_a_src = io0_a_src + a_src->meta.wi;
47561
  }
47562
47563
  v_clear_code = self->private_impl.f_lzw_clear_code;
47564
  v_end_code = self->private_impl.f_lzw_end_code;
47565
  v_save_code = self->private_impl.f_lzw_save_code;
47566
  v_prev_code = self->private_impl.f_lzw_prev_code;
47567
  v_width = self->private_impl.f_lzw_width;
47568
  v_bits = self->private_impl.f_lzw_bits;
47569
  v_n_bits = self->private_impl.f_lzw_n_bits;
47570
  v_output_wi = self->private_impl.f_lzw_output_wi;
47571
  while (true) {
47572
    if (v_n_bits < v_width) {
47573
      if (((uint64_t)(io2_a_src - iop_a_src)) >= 4u) {
47574
        v_bits |= ((uint32_t)(wuffs_base__peek_u32le__no_bounds_check(iop_a_src) << v_n_bits));
47575
        iop_a_src += ((31u - v_n_bits) >> 3u);
47576
        v_n_bits |= 24u;
47577
      } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
47578
        if (a_src && a_src->meta.closed) {
47579
          self->private_impl.f_lzw_read_from_return_value = 3u;
47580
        } else {
47581
          self->private_impl.f_lzw_read_from_return_value = 2u;
47582
        }
47583
        break;
47584
      } else {
47585
        v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
47586
        iop_a_src += 1u;
47587
        v_n_bits += 8u;
47588
        if (v_n_bits >= v_width) {
47589
        } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
47590
          if (a_src && a_src->meta.closed) {
47591
            self->private_impl.f_lzw_read_from_return_value = 3u;
47592
          } else {
47593
            self->private_impl.f_lzw_read_from_return_value = 2u;
47594
          }
47595
          break;
47596
        } else {
47597
          v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
47598
          iop_a_src += 1u;
47599
          v_n_bits += 8u;
47600
          if (v_n_bits < v_width) {
47601
            self->private_impl.f_lzw_read_from_return_value = 5u;
47602
            break;
47603
          }
47604
        }
47605
      }
47606
    }
47607
    v_code = ((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(v_width));
47608
    v_bits >>= v_width;
47609
    v_n_bits -= v_width;
47610
    if (v_code < v_clear_code) {
47611
      self->private_data.f_lzw_output[v_output_wi] = ((uint8_t)(v_code));
47612
      v_output_wi = ((v_output_wi + 1u) & 8191u);
47613
      if (v_save_code <= 4095u) {
47614
        v_lm1_a = ((uint16_t)(((uint16_t)(self->private_data.f_lzw_lm1s[v_prev_code] + 1u)) & 4095u));
47615
        self->private_data.f_lzw_lm1s[v_save_code] = v_lm1_a;
47616
        if (((uint16_t)(v_lm1_a % 8u)) != 0u) {
47617
          self->private_impl.f_lzw_prefixes[v_save_code] = self->private_impl.f_lzw_prefixes[v_prev_code];
47618
          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]));
47619
          self->private_data.f_lzw_suffixes[v_save_code][((uint16_t)(v_lm1_a % 8u))] = ((uint8_t)(v_code));
47620
        } else {
47621
          self->private_impl.f_lzw_prefixes[v_save_code] = ((uint16_t)(v_prev_code));
47622
          self->private_data.f_lzw_suffixes[v_save_code][0u] = ((uint8_t)(v_code));
47623
        }
47624
        v_save_code += 1u;
47625
        if (v_width < 12u) {
47626
          v_width += (1u & (v_save_code >> v_width));
47627
        }
47628
        v_prev_code = v_code;
47629
      }
47630
    } else if (v_code <= v_end_code) {
47631
      if (v_code == v_end_code) {
47632
        self->private_impl.f_lzw_read_from_return_value = 0u;
47633
        break;
47634
      }
47635
      v_save_code = v_end_code;
47636
      v_prev_code = v_end_code;
47637
      v_width = (self->private_impl.f_lzw_literal_width + 1u);
47638
    } else if (v_code <= v_save_code) {
47639
      v_c = v_code;
47640
      if (v_code == v_save_code) {
47641
        v_c = v_prev_code;
47642
      }
47643
      v_o = ((v_output_wi + (((uint32_t)(self->private_data.f_lzw_lm1s[v_c])) & 4294967288u)) & 8191u);
47644
      v_output_wi = ((v_output_wi + 1u + ((uint32_t)(self->private_data.f_lzw_lm1s[v_c]))) & 8191u);
47645
      v_steps = (((uint32_t)(self->private_data.f_lzw_lm1s[v_c])) >> 3u);
47646
      while (true) {
47647
        memcpy((self->private_data.f_lzw_output)+(v_o), (self->private_data.f_lzw_suffixes[v_c]), 8u);
47648
        if (v_steps <= 0u) {
47649
          break;
47650
        }
47651
        v_steps -= 1u;
47652
        v_o = (((uint32_t)(v_o - 8u)) & 8191u);
47653
        v_c = ((uint32_t)(self->private_impl.f_lzw_prefixes[v_c]));
47654
      }
47655
      v_first_byte = self->private_data.f_lzw_suffixes[v_c][0u];
47656
      if (v_code == v_save_code) {
47657
        self->private_data.f_lzw_output[v_output_wi] = v_first_byte;
47658
        v_output_wi = ((v_output_wi + 1u) & 8191u);
47659
      }
47660
      if (v_save_code <= 4095u) {
47661
        v_lm1_b = ((uint16_t)(((uint16_t)(self->private_data.f_lzw_lm1s[v_prev_code] + 1u)) & 4095u));
47662
        self->private_data.f_lzw_lm1s[v_save_code] = v_lm1_b;
47663
        if (((uint16_t)(v_lm1_b % 8u)) != 0u) {
47664
          self->private_impl.f_lzw_prefixes[v_save_code] = self->private_impl.f_lzw_prefixes[v_prev_code];
47665
          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]));
47666
          self->private_data.f_lzw_suffixes[v_save_code][((uint16_t)(v_lm1_b % 8u))] = v_first_byte;
47667
        } else {
47668
          self->private_impl.f_lzw_prefixes[v_save_code] = ((uint16_t)(v_prev_code));
47669
          self->private_data.f_lzw_suffixes[v_save_code][0u] = ((uint8_t)(v_first_byte));
47670
        }
47671
        v_save_code += 1u;
47672
        if (v_width < 12u) {
47673
          v_width += (1u & (v_save_code >> v_width));
47674
        }
47675
        v_prev_code = v_code;
47676
      }
47677
    } else {
47678
      self->private_impl.f_lzw_read_from_return_value = 4u;
47679
      break;
47680
    }
47681
    if (v_output_wi > 4095u) {
47682
      self->private_impl.f_lzw_read_from_return_value = 1u;
47683
      break;
47684
    }
47685
  }
47686
  if (self->private_impl.f_lzw_read_from_return_value != 2u) {
47687
    while (v_n_bits >= 8u) {
47688
      v_n_bits -= 8u;
47689
      if (iop_a_src > io1_a_src) {
47690
        iop_a_src--;
47691
      } else {
47692
        self->private_impl.f_lzw_read_from_return_value = 5u;
47693
        break;
47694
      }
47695
    }
47696
  }
47697
  self->private_impl.f_lzw_save_code = v_save_code;
47698
  self->private_impl.f_lzw_prev_code = v_prev_code;
47699
  self->private_impl.f_lzw_width = v_width;
47700
  self->private_impl.f_lzw_bits = v_bits;
47701
  self->private_impl.f_lzw_n_bits = v_n_bits;
47702
  self->private_impl.f_lzw_output_wi = v_output_wi;
47703
  if (a_src && a_src->data.ptr) {
47704
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
47705
  }
47706
47707
  return wuffs_base__make_empty_struct();
47708
}
47709
47710
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GIF)
47711
47712
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GZIP)
47713
47714
// ---------------- Status Codes Implementations
47715
47716
const char wuffs_gzip__error__bad_checksum[] = "#gzip: bad checksum";
47717
const char wuffs_gzip__error__bad_compression_method[] = "#gzip: bad compression method";
47718
const char wuffs_gzip__error__bad_encoding_flags[] = "#gzip: bad encoding flags";
47719
const char wuffs_gzip__error__bad_header[] = "#gzip: bad header";
47720
const char wuffs_gzip__error__truncated_input[] = "#gzip: truncated input";
47721
47722
// ---------------- Private Consts
47723
47724
// ---------------- Private Initializer Prototypes
47725
47726
// ---------------- Private Function Prototypes
47727
47728
WUFFS_BASE__GENERATED_C_CODE
47729
static wuffs_base__status
47730
wuffs_gzip__decoder__do_transform_io(
47731
    wuffs_gzip__decoder* self,
47732
    wuffs_base__io_buffer* a_dst,
47733
    wuffs_base__io_buffer* a_src,
47734
    wuffs_base__slice_u8 a_workbuf);
47735
47736
// ---------------- VTables
47737
47738
const wuffs_base__io_transformer__func_ptrs
47739
wuffs_gzip__decoder__func_ptrs_for__wuffs_base__io_transformer = {
47740
  (wuffs_base__optional_u63(*)(const void*))(&wuffs_gzip__decoder__dst_history_retain_length),
47741
  (uint64_t(*)(const void*,
47742
      uint32_t))(&wuffs_gzip__decoder__get_quirk),
47743
  (wuffs_base__status(*)(void*,
47744
      uint32_t,
47745
      uint64_t))(&wuffs_gzip__decoder__set_quirk),
47746
  (wuffs_base__status(*)(void*,
47747
      wuffs_base__io_buffer*,
47748
      wuffs_base__io_buffer*,
47749
      wuffs_base__slice_u8))(&wuffs_gzip__decoder__transform_io),
47750
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_gzip__decoder__workbuf_len),
47751
};
47752
47753
// ---------------- Initializer Implementations
47754
47755
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
47756
wuffs_gzip__decoder__initialize(
47757
    wuffs_gzip__decoder* self,
47758
    size_t sizeof_star_self,
47759
    uint64_t wuffs_version,
47760
    uint32_t options){
47761
  if (!self) {
47762
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
47763
  }
47764
  if (sizeof(*self) != sizeof_star_self) {
47765
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
47766
  }
47767
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
47768
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
47769
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
47770
  }
47771
47772
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
47773
    // The whole point of this if-check is to detect an uninitialized *self.
47774
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
47775
#if !defined(__clang__) && defined(__GNUC__)
47776
#pragma GCC diagnostic push
47777
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
47778
#endif
47779
    if (self->private_impl.magic != 0) {
47780
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
47781
    }
47782
#if !defined(__clang__) && defined(__GNUC__)
47783
#pragma GCC diagnostic pop
47784
#endif
47785
  } else {
47786
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
47787
      memset(self, 0, sizeof(*self));
47788
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
47789
    } else {
47790
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
47791
    }
47792
  }
47793
47794
  {
47795
    wuffs_base__status z = wuffs_crc32__ieee_hasher__initialize(
47796
        &self->private_data.f_checksum, sizeof(self->private_data.f_checksum), WUFFS_VERSION, options);
47797
    if (z.repr) {
47798
      return z;
47799
    }
47800
  }
47801
  {
47802
    wuffs_base__status z = wuffs_deflate__decoder__initialize(
47803
        &self->private_data.f_flate, sizeof(self->private_data.f_flate), WUFFS_VERSION, options);
47804
    if (z.repr) {
47805
      return z;
47806
    }
47807
  }
47808
  self->private_impl.magic = WUFFS_BASE__MAGIC;
47809
  self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name =
47810
      wuffs_base__io_transformer__vtable_name;
47811
  self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers =
47812
      (const void*)(&wuffs_gzip__decoder__func_ptrs_for__wuffs_base__io_transformer);
47813
  return wuffs_base__make_status(NULL);
47814
}
47815
47816
wuffs_gzip__decoder*
47817
wuffs_gzip__decoder__alloc(void) {
47818
  wuffs_gzip__decoder* x =
47819
      (wuffs_gzip__decoder*)(calloc(1, sizeof(wuffs_gzip__decoder)));
47820
  if (!x) {
47821
    return NULL;
47822
  }
47823
  if (wuffs_gzip__decoder__initialize(
47824
      x, sizeof(wuffs_gzip__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
47825
    free(x);
47826
    return NULL;
47827
  }
47828
  return x;
47829
}
47830
47831
size_t
47832
sizeof__wuffs_gzip__decoder(void) {
47833
  return sizeof(wuffs_gzip__decoder);
47834
}
47835
47836
// ---------------- Function Implementations
47837
47838
// -------- func gzip.decoder.get_quirk
47839
47840
WUFFS_BASE__GENERATED_C_CODE
47841
WUFFS_BASE__MAYBE_STATIC uint64_t
47842
wuffs_gzip__decoder__get_quirk(
47843
    const wuffs_gzip__decoder* self,
47844
    uint32_t a_key) {
47845
  if (!self) {
47846
    return 0;
47847
  }
47848
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
47849
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
47850
    return 0;
47851
  }
47852
47853
  if ((a_key == 1u) && self->private_impl.f_ignore_checksum) {
47854
    return 1u;
47855
  }
47856
  return 0u;
47857
}
47858
47859
// -------- func gzip.decoder.set_quirk
47860
47861
WUFFS_BASE__GENERATED_C_CODE
47862
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
47863
wuffs_gzip__decoder__set_quirk(
47864
    wuffs_gzip__decoder* self,
47865
    uint32_t a_key,
47866
    uint64_t a_value) {
47867
  if (!self) {
47868
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
47869
  }
47870
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
47871
    return wuffs_base__make_status(
47872
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
47873
        ? wuffs_base__error__disabled_by_previous_error
47874
        : wuffs_base__error__initialize_not_called);
47875
  }
47876
47877
  if (a_key == 1u) {
47878
    self->private_impl.f_ignore_checksum = (a_value > 0u);
47879
    return wuffs_base__make_status(NULL);
47880
  }
47881
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
47882
}
47883
47884
// -------- func gzip.decoder.dst_history_retain_length
47885
47886
WUFFS_BASE__GENERATED_C_CODE
47887
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
47888
wuffs_gzip__decoder__dst_history_retain_length(
47889
    const wuffs_gzip__decoder* self) {
47890
  if (!self) {
47891
    return wuffs_base__utility__make_optional_u63(false, 0u);
47892
  }
47893
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
47894
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
47895
    return wuffs_base__utility__make_optional_u63(false, 0u);
47896
  }
47897
47898
  return wuffs_base__utility__make_optional_u63(true, 0u);
47899
}
47900
47901
// -------- func gzip.decoder.workbuf_len
47902
47903
WUFFS_BASE__GENERATED_C_CODE
47904
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
47905
wuffs_gzip__decoder__workbuf_len(
47906
    const wuffs_gzip__decoder* self) {
47907
  if (!self) {
47908
    return wuffs_base__utility__empty_range_ii_u64();
47909
  }
47910
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
47911
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
47912
    return wuffs_base__utility__empty_range_ii_u64();
47913
  }
47914
47915
  return wuffs_base__utility__make_range_ii_u64(1u, 1u);
47916
}
47917
47918
// -------- func gzip.decoder.transform_io
47919
47920
WUFFS_BASE__GENERATED_C_CODE
47921
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
47922
wuffs_gzip__decoder__transform_io(
47923
    wuffs_gzip__decoder* self,
47924
    wuffs_base__io_buffer* a_dst,
47925
    wuffs_base__io_buffer* a_src,
47926
    wuffs_base__slice_u8 a_workbuf) {
47927
  if (!self) {
47928
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
47929
  }
47930
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
47931
    return wuffs_base__make_status(
47932
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
47933
        ? wuffs_base__error__disabled_by_previous_error
47934
        : wuffs_base__error__initialize_not_called);
47935
  }
47936
  if (!a_dst || !a_src) {
47937
    self->private_impl.magic = WUFFS_BASE__DISABLED;
47938
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
47939
  }
47940
  if ((self->private_impl.active_coroutine != 0) &&
47941
      (self->private_impl.active_coroutine != 1)) {
47942
    self->private_impl.magic = WUFFS_BASE__DISABLED;
47943
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
47944
  }
47945
  self->private_impl.active_coroutine = 0;
47946
  wuffs_base__status status = wuffs_base__make_status(NULL);
47947
47948
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
47949
47950
  uint32_t coro_susp_point = self->private_impl.p_transform_io;
47951
  switch (coro_susp_point) {
47952
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
47953
47954
    while (true) {
47955
      {
47956
        wuffs_base__status t_0 = wuffs_gzip__decoder__do_transform_io(self, a_dst, a_src, a_workbuf);
47957
        v_status = t_0;
47958
      }
47959
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
47960
        status = wuffs_base__make_status(wuffs_gzip__error__truncated_input);
47961
        goto exit;
47962
      }
47963
      status = v_status;
47964
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
47965
    }
47966
47967
    ok:
47968
    self->private_impl.p_transform_io = 0;
47969
    goto exit;
47970
  }
47971
47972
  goto suspend;
47973
  suspend:
47974
  self->private_impl.p_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
47975
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
47976
47977
  goto exit;
47978
  exit:
47979
  if (wuffs_base__status__is_error(&status)) {
47980
    self->private_impl.magic = WUFFS_BASE__DISABLED;
47981
  }
47982
  return status;
47983
}
47984
47985
// -------- func gzip.decoder.do_transform_io
47986
47987
WUFFS_BASE__GENERATED_C_CODE
47988
static wuffs_base__status
47989
wuffs_gzip__decoder__do_transform_io(
47990
    wuffs_gzip__decoder* self,
47991
    wuffs_base__io_buffer* a_dst,
47992
    wuffs_base__io_buffer* a_src,
47993
    wuffs_base__slice_u8 a_workbuf) {
47994
  wuffs_base__status status = wuffs_base__make_status(NULL);
47995
47996
  uint8_t v_c8 = 0;
47997
  uint8_t v_flags = 0;
47998
  uint16_t v_xlen = 0;
47999
  uint64_t v_mark = 0;
48000
  uint32_t v_checksum_have = 0;
48001
  uint32_t v_decoded_length_have = 0;
48002
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
48003
  uint32_t v_checksum_want = 0;
48004
  uint32_t v_decoded_length_want = 0;
48005
48006
  uint8_t* iop_a_dst = NULL;
48007
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
48008
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
48009
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
48010
  if (a_dst && a_dst->data.ptr) {
48011
    io0_a_dst = a_dst->data.ptr;
48012
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
48013
    iop_a_dst = io1_a_dst;
48014
    io2_a_dst = io0_a_dst + a_dst->data.len;
48015
    if (a_dst->meta.closed) {
48016
      io2_a_dst = iop_a_dst;
48017
    }
48018
  }
48019
  const uint8_t* iop_a_src = NULL;
48020
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
48021
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
48022
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
48023
  if (a_src && a_src->data.ptr) {
48024
    io0_a_src = a_src->data.ptr;
48025
    io1_a_src = io0_a_src + a_src->meta.ri;
48026
    iop_a_src = io1_a_src;
48027
    io2_a_src = io0_a_src + a_src->meta.wi;
48028
  }
48029
48030
  uint32_t coro_susp_point = self->private_impl.p_do_transform_io;
48031
  if (coro_susp_point) {
48032
    v_flags = self->private_data.s_do_transform_io.v_flags;
48033
    v_checksum_have = self->private_data.s_do_transform_io.v_checksum_have;
48034
    v_decoded_length_have = self->private_data.s_do_transform_io.v_decoded_length_have;
48035
    v_checksum_want = self->private_data.s_do_transform_io.v_checksum_want;
48036
  }
48037
  switch (coro_susp_point) {
48038
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
48039
48040
    {
48041
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
48042
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
48043
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
48044
        goto suspend;
48045
      }
48046
      uint8_t t_0 = *iop_a_src++;
48047
      v_c8 = t_0;
48048
    }
48049
    if (v_c8 != 31u) {
48050
      status = wuffs_base__make_status(wuffs_gzip__error__bad_header);
48051
      goto exit;
48052
    }
48053
    {
48054
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
48055
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
48056
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
48057
        goto suspend;
48058
      }
48059
      uint8_t t_1 = *iop_a_src++;
48060
      v_c8 = t_1;
48061
    }
48062
    if (v_c8 != 139u) {
48063
      status = wuffs_base__make_status(wuffs_gzip__error__bad_header);
48064
      goto exit;
48065
    }
48066
    {
48067
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
48068
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
48069
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
48070
        goto suspend;
48071
      }
48072
      uint8_t t_2 = *iop_a_src++;
48073
      v_c8 = t_2;
48074
    }
48075
    if (v_c8 != 8u) {
48076
      status = wuffs_base__make_status(wuffs_gzip__error__bad_compression_method);
48077
      goto exit;
48078
    }
48079
    {
48080
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
48081
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
48082
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
48083
        goto suspend;
48084
      }
48085
      uint8_t t_3 = *iop_a_src++;
48086
      v_flags = t_3;
48087
    }
48088
    self->private_data.s_do_transform_io.scratch = 6u;
48089
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
48090
    if (self->private_data.s_do_transform_io.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
48091
      self->private_data.s_do_transform_io.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
48092
      iop_a_src = io2_a_src;
48093
      status = wuffs_base__make_status(wuffs_base__suspension__short_read);
48094
      goto suspend;
48095
    }
48096
    iop_a_src += self->private_data.s_do_transform_io.scratch;
48097
    if (((uint8_t)(v_flags & 4u)) != 0u) {
48098
      {
48099
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
48100
        uint16_t t_4;
48101
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
48102
          t_4 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src);
48103
          iop_a_src += 2;
48104
        } else {
48105
          self->private_data.s_do_transform_io.scratch = 0;
48106
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
48107
          while (true) {
48108
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
48109
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
48110
              goto suspend;
48111
            }
48112
            uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
48113
            uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56));
48114
            *scratch <<= 8;
48115
            *scratch >>= 8;
48116
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4;
48117
            if (num_bits_4 == 8) {
48118
              t_4 = ((uint16_t)(*scratch));
48119
              break;
48120
            }
48121
            num_bits_4 += 8u;
48122
            *scratch |= ((uint64_t)(num_bits_4)) << 56;
48123
          }
48124
        }
48125
        v_xlen = t_4;
48126
      }
48127
      self->private_data.s_do_transform_io.scratch = ((uint32_t)(v_xlen));
48128
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
48129
      if (self->private_data.s_do_transform_io.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
48130
        self->private_data.s_do_transform_io.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
48131
        iop_a_src = io2_a_src;
48132
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
48133
        goto suspend;
48134
      }
48135
      iop_a_src += self->private_data.s_do_transform_io.scratch;
48136
    }
48137
    if (((uint8_t)(v_flags & 8u)) != 0u) {
48138
      while (true) {
48139
        {
48140
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
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_5 = *iop_a_src++;
48146
          v_c8 = t_5;
48147
        }
48148
        if (v_c8 == 0u) {
48149
          break;
48150
        }
48151
      }
48152
    }
48153
    if (((uint8_t)(v_flags & 16u)) != 0u) {
48154
      while (true) {
48155
        {
48156
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
48157
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
48158
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
48159
            goto suspend;
48160
          }
48161
          uint8_t t_6 = *iop_a_src++;
48162
          v_c8 = t_6;
48163
        }
48164
        if (v_c8 == 0u) {
48165
          break;
48166
        }
48167
      }
48168
    }
48169
    if (((uint8_t)(v_flags & 2u)) != 0u) {
48170
      self->private_data.s_do_transform_io.scratch = 2u;
48171
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11);
48172
      if (self->private_data.s_do_transform_io.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
48173
        self->private_data.s_do_transform_io.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
48174
        iop_a_src = io2_a_src;
48175
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
48176
        goto suspend;
48177
      }
48178
      iop_a_src += self->private_data.s_do_transform_io.scratch;
48179
    }
48180
    if (((uint8_t)(v_flags & 224u)) != 0u) {
48181
      status = wuffs_base__make_status(wuffs_gzip__error__bad_encoding_flags);
48182
      goto exit;
48183
    }
48184
    while (true) {
48185
      v_mark = ((uint64_t)(iop_a_dst - io0_a_dst));
48186
      {
48187
        if (a_dst) {
48188
          a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
48189
        }
48190
        if (a_src) {
48191
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
48192
        }
48193
        wuffs_base__status t_7 = wuffs_deflate__decoder__transform_io(&self->private_data.f_flate, a_dst, a_src, a_workbuf);
48194
        v_status = t_7;
48195
        if (a_dst) {
48196
          iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
48197
        }
48198
        if (a_src) {
48199
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
48200
        }
48201
      }
48202
      if ( ! self->private_impl.f_ignore_checksum) {
48203
        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));
48204
        v_decoded_length_have += ((uint32_t)(wuffs_private_impl__io__count_since(v_mark, ((uint64_t)(iop_a_dst - io0_a_dst)))));
48205
      }
48206
      if (wuffs_base__status__is_ok(&v_status)) {
48207
        break;
48208
      }
48209
      status = v_status;
48210
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(12);
48211
    }
48212
    {
48213
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13);
48214
      uint32_t t_8;
48215
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
48216
        t_8 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
48217
        iop_a_src += 4;
48218
      } else {
48219
        self->private_data.s_do_transform_io.scratch = 0;
48220
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14);
48221
        while (true) {
48222
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
48223
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
48224
            goto suspend;
48225
          }
48226
          uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
48227
          uint32_t num_bits_8 = ((uint32_t)(*scratch >> 56));
48228
          *scratch <<= 8;
48229
          *scratch >>= 8;
48230
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_8;
48231
          if (num_bits_8 == 24) {
48232
            t_8 = ((uint32_t)(*scratch));
48233
            break;
48234
          }
48235
          num_bits_8 += 8u;
48236
          *scratch |= ((uint64_t)(num_bits_8)) << 56;
48237
        }
48238
      }
48239
      v_checksum_want = t_8;
48240
    }
48241
    {
48242
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15);
48243
      uint32_t t_9;
48244
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
48245
        t_9 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
48246
        iop_a_src += 4;
48247
      } else {
48248
        self->private_data.s_do_transform_io.scratch = 0;
48249
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16);
48250
        while (true) {
48251
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
48252
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
48253
            goto suspend;
48254
          }
48255
          uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
48256
          uint32_t num_bits_9 = ((uint32_t)(*scratch >> 56));
48257
          *scratch <<= 8;
48258
          *scratch >>= 8;
48259
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_9;
48260
          if (num_bits_9 == 24) {
48261
            t_9 = ((uint32_t)(*scratch));
48262
            break;
48263
          }
48264
          num_bits_9 += 8u;
48265
          *scratch |= ((uint64_t)(num_bits_9)) << 56;
48266
        }
48267
      }
48268
      v_decoded_length_want = t_9;
48269
    }
48270
    if ( ! self->private_impl.f_ignore_checksum && ((v_checksum_have != v_checksum_want) || (v_decoded_length_have != v_decoded_length_want))) {
48271
      status = wuffs_base__make_status(wuffs_gzip__error__bad_checksum);
48272
      goto exit;
48273
    }
48274
48275
    ok:
48276
    self->private_impl.p_do_transform_io = 0;
48277
    goto exit;
48278
  }
48279
48280
  goto suspend;
48281
  suspend:
48282
  self->private_impl.p_do_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
48283
  self->private_data.s_do_transform_io.v_flags = v_flags;
48284
  self->private_data.s_do_transform_io.v_checksum_have = v_checksum_have;
48285
  self->private_data.s_do_transform_io.v_decoded_length_have = v_decoded_length_have;
48286
  self->private_data.s_do_transform_io.v_checksum_want = v_checksum_want;
48287
48288
  goto exit;
48289
  exit:
48290
  if (a_dst && a_dst->data.ptr) {
48291
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
48292
  }
48293
  if (a_src && a_src->data.ptr) {
48294
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
48295
  }
48296
48297
  return status;
48298
}
48299
48300
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GZIP)
48301
48302
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JPEG)
48303
48304
// ---------------- Status Codes Implementations
48305
48306
const char wuffs_jpeg__error__bad_dht_marker[] = "#jpeg: bad DHT marker";
48307
const char wuffs_jpeg__error__bad_dqt_marker[] = "#jpeg: bad DQT marker";
48308
const char wuffs_jpeg__error__bad_dri_marker[] = "#jpeg: bad DRI marker";
48309
const char wuffs_jpeg__error__bad_sof_marker[] = "#jpeg: bad SOF marker";
48310
const char wuffs_jpeg__error__bad_sos_marker[] = "#jpeg: bad SOS marker";
48311
const char wuffs_jpeg__error__bad_header[] = "#jpeg: bad header";
48312
const char wuffs_jpeg__error__bad_marker[] = "#jpeg: bad marker";
48313
const char wuffs_jpeg__error__bad_scan_count[] = "#jpeg: bad scan count";
48314
const char wuffs_jpeg__error__missing_huffman_table[] = "#jpeg: missing Huffman table";
48315
const char wuffs_jpeg__error__missing_quantization_table[] = "#jpeg: missing Quantization table";
48316
const char wuffs_jpeg__error__rejected_progressive_jpeg[] = "#jpeg: rejected progressive JPEG";
48317
const char wuffs_jpeg__error__short_sos_bitstream[] = "#jpeg: short SOS bitstream";
48318
const char wuffs_jpeg__error__truncated_input[] = "#jpeg: truncated input";
48319
const char wuffs_jpeg__error__unsupported_arithmetic_coding[] = "#jpeg: unsupported arithmetic coding";
48320
const char wuffs_jpeg__error__unsupported_color_model[] = "#jpeg: unsupported color model";
48321
const char wuffs_jpeg__error__unsupported_fractional_sampling[] = "#jpeg: unsupported fractional sampling";
48322
const char wuffs_jpeg__error__unsupported_hierarchical_coding[] = "#jpeg: unsupported hierarchical coding";
48323
const char wuffs_jpeg__error__unsupported_implicit_height[] = "#jpeg: unsupported implicit height";
48324
const char wuffs_jpeg__error__unsupported_lossless_coding[] = "#jpeg: unsupported lossless coding";
48325
const char wuffs_jpeg__error__unsupported_marker[] = "#jpeg: unsupported marker";
48326
const char wuffs_jpeg__error__unsupported_precision_12_bits[] = "#jpeg: unsupported precision (12 bits)";
48327
const char wuffs_jpeg__error__unsupported_precision_16_bits[] = "#jpeg: unsupported precision (16 bits)";
48328
const char wuffs_jpeg__error__unsupported_precision[] = "#jpeg: unsupported precision";
48329
const char wuffs_jpeg__error__unsupported_scan_count[] = "#jpeg: unsupported scan count";
48330
const char wuffs_jpeg__error__internal_error_inconsistent_decoder_state[] = "#jpeg: internal error: inconsistent decoder state";
48331
48332
// ---------------- Private Consts
48333
48334
static const uint8_t
48335
WUFFS_JPEG__UNZIG[80] WUFFS_BASE__POTENTIALLY_UNUSED = {
48336
  0u, 0u, 1u, 8u, 16u, 9u, 2u, 3u,
48337
  10u, 17u, 24u, 32u, 25u, 18u, 11u, 4u,
48338
  5u, 12u, 19u, 26u, 33u, 40u, 48u, 41u,
48339
  34u, 27u, 20u, 13u, 6u, 7u, 14u, 21u,
48340
  28u, 35u, 42u, 49u, 56u, 57u, 50u, 43u,
48341
  36u, 29u, 22u, 15u, 23u, 30u, 37u, 44u,
48342
  51u, 58u, 59u, 52u, 45u, 38u, 31u, 39u,
48343
  46u, 53u, 60u, 61u, 54u, 47u, 55u, 62u,
48344
  63u, 63u, 63u, 63u, 63u, 63u, 63u, 63u,
48345
  63u, 63u, 63u, 63u, 63u, 63u, 63u, 63u,
48346
};
48347
48348
static const uint8_t
48349
WUFFS_JPEG__BIAS_AND_CLAMP[1024] WUFFS_BASE__POTENTIALLY_UNUSED = {
48350
  128u, 129u, 130u, 131u, 132u, 133u, 134u, 135u,
48351
  136u, 137u, 138u, 139u, 140u, 141u, 142u, 143u,
48352
  144u, 145u, 146u, 147u, 148u, 149u, 150u, 151u,
48353
  152u, 153u, 154u, 155u, 156u, 157u, 158u, 159u,
48354
  160u, 161u, 162u, 163u, 164u, 165u, 166u, 167u,
48355
  168u, 169u, 170u, 171u, 172u, 173u, 174u, 175u,
48356
  176u, 177u, 178u, 179u, 180u, 181u, 182u, 183u,
48357
  184u, 185u, 186u, 187u, 188u, 189u, 190u, 191u,
48358
  192u, 193u, 194u, 195u, 196u, 197u, 198u, 199u,
48359
  200u, 201u, 202u, 203u, 204u, 205u, 206u, 207u,
48360
  208u, 209u, 210u, 211u, 212u, 213u, 214u, 215u,
48361
  216u, 217u, 218u, 219u, 220u, 221u, 222u, 223u,
48362
  224u, 225u, 226u, 227u, 228u, 229u, 230u, 231u,
48363
  232u, 233u, 234u, 235u, 236u, 237u, 238u, 239u,
48364
  240u, 241u, 242u, 243u, 244u, 245u, 246u, 247u,
48365
  248u, 249u, 250u, 251u, 252u, 253u, 254u, 255u,
48366
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
48367
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
48368
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
48369
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
48370
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
48371
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
48372
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
48373
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
48374
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
48375
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
48376
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
48377
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
48378
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
48379
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
48380
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
48381
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
48382
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
48383
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
48384
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
48385
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
48386
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
48387
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
48388
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
48389
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
48390
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
48391
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
48392
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
48393
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
48394
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
48395
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
48396
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
48397
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
48398
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
48399
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
48400
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
48401
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
48402
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
48403
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
48404
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
48405
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
48406
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
48407
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
48408
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
48409
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
48410
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
48411
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
48412
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
48413
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
48414
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
48415
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
48416
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
48417
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
48418
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
48419
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
48420
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
48421
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
48422
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
48423
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
48424
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
48425
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
48426
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
48427
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
48428
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
48429
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
48430
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
48431
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
48432
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
48433
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
48434
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
48435
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
48436
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
48437
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
48438
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
48439
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
48440
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
48441
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
48442
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
48443
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
48444
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
48445
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
48446
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
48447
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
48448
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
48449
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
48450
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
48451
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
48452
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
48453
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
48454
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
48455
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
48456
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
48457
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
48458
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
48459
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
48460
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
48461
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
48462
  0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u,
48463
  8u, 9u, 10u, 11u, 12u, 13u, 14u, 15u,
48464
  16u, 17u, 18u, 19u, 20u, 21u, 22u, 23u,
48465
  24u, 25u, 26u, 27u, 28u, 29u, 30u, 31u,
48466
  32u, 33u, 34u, 35u, 36u, 37u, 38u, 39u,
48467
  40u, 41u, 42u, 43u, 44u, 45u, 46u, 47u,
48468
  48u, 49u, 50u, 51u, 52u, 53u, 54u, 55u,
48469
  56u, 57u, 58u, 59u, 60u, 61u, 62u, 63u,
48470
  64u, 65u, 66u, 67u, 68u, 69u, 70u, 71u,
48471
  72u, 73u, 74u, 75u, 76u, 77u, 78u, 79u,
48472
  80u, 81u, 82u, 83u, 84u, 85u, 86u, 87u,
48473
  88u, 89u, 90u, 91u, 92u, 93u, 94u, 95u,
48474
  96u, 97u, 98u, 99u, 100u, 101u, 102u, 103u,
48475
  104u, 105u, 106u, 107u, 108u, 109u, 110u, 111u,
48476
  112u, 113u, 114u, 115u, 116u, 117u, 118u, 119u,
48477
  120u, 121u, 122u, 123u, 124u, 125u, 126u, 127u,
48478
};
48479
48480
static const uint16_t
48481
WUFFS_JPEG__EXTEND[16] WUFFS_BASE__POTENTIALLY_UNUSED = {
48482
  0u, 65535u, 65533u, 65529u, 65521u, 65505u, 65473u, 65409u,
48483
  65281u, 65025u, 64513u, 63489u, 61441u, 57345u, 49153u, 32769u,
48484
};
48485
48486
static const uint8_t
48487
WUFFS_JPEG__DEFAULT_HUFF_TABLE_DC_LUMA[29] WUFFS_BASE__POTENTIALLY_UNUSED = {
48488
  0u, 0u, 1u, 5u, 1u, 1u, 1u, 1u,
48489
  1u, 1u, 0u, 0u, 0u, 0u, 0u, 0u,
48490
  0u, 0u, 1u, 2u, 3u, 4u, 5u, 6u,
48491
  7u, 8u, 9u, 10u, 11u,
48492
};
48493
48494
static const uint8_t
48495
WUFFS_JPEG__DEFAULT_HUFF_TABLE_DC_CHROMA[29] WUFFS_BASE__POTENTIALLY_UNUSED = {
48496
  1u, 0u, 3u, 1u, 1u, 1u, 1u, 1u,
48497
  1u, 1u, 1u, 1u, 0u, 0u, 0u, 0u,
48498
  0u, 0u, 1u, 2u, 3u, 4u, 5u, 6u,
48499
  7u, 8u, 9u, 10u, 11u,
48500
};
48501
48502
static const uint8_t
48503
WUFFS_JPEG__DEFAULT_HUFF_TABLE_AC_LUMA[179] WUFFS_BASE__POTENTIALLY_UNUSED = {
48504
  16u, 0u, 2u, 1u, 3u, 3u, 2u, 4u,
48505
  3u, 5u, 5u, 4u, 4u, 0u, 0u, 1u,
48506
  125u, 1u, 2u, 3u, 0u, 4u, 17u, 5u,
48507
  18u, 33u, 49u, 65u, 6u, 19u, 81u, 97u,
48508
  7u, 34u, 113u, 20u, 50u, 129u, 145u, 161u,
48509
  8u, 35u, 66u, 177u, 193u, 21u, 82u, 209u,
48510
  240u, 36u, 51u, 98u, 114u, 130u, 9u, 10u,
48511
  22u, 23u, 24u, 25u, 26u, 37u, 38u, 39u,
48512
  40u, 41u, 42u, 52u, 53u, 54u, 55u, 56u,
48513
  57u, 58u, 67u, 68u, 69u, 70u, 71u, 72u,
48514
  73u, 74u, 83u, 84u, 85u, 86u, 87u, 88u,
48515
  89u, 90u, 99u, 100u, 101u, 102u, 103u, 104u,
48516
  105u, 106u, 115u, 116u, 117u, 118u, 119u, 120u,
48517
  121u, 122u, 131u, 132u, 133u, 134u, 135u, 136u,
48518
  137u, 138u, 146u, 147u, 148u, 149u, 150u, 151u,
48519
  152u, 153u, 154u, 162u, 163u, 164u, 165u, 166u,
48520
  167u, 168u, 169u, 170u, 178u, 179u, 180u, 181u,
48521
  182u, 183u, 184u, 185u, 186u, 194u, 195u, 196u,
48522
  197u, 198u, 199u, 200u, 201u, 202u, 210u, 211u,
48523
  212u, 213u, 214u, 215u, 216u, 217u, 218u, 225u,
48524
  226u, 227u, 228u, 229u, 230u, 231u, 232u, 233u,
48525
  234u, 241u, 242u, 243u, 244u, 245u, 246u, 247u,
48526
  248u, 249u, 250u,
48527
};
48528
48529
static const uint8_t
48530
WUFFS_JPEG__DEFAULT_HUFF_TABLE_AC_CHROMA[179] WUFFS_BASE__POTENTIALLY_UNUSED = {
48531
  17u, 0u, 2u, 1u, 2u, 4u, 4u, 3u,
48532
  4u, 7u, 5u, 4u, 4u, 0u, 1u, 2u,
48533
  119u, 0u, 1u, 2u, 3u, 17u, 4u, 5u,
48534
  33u, 49u, 6u, 18u, 65u, 81u, 7u, 97u,
48535
  113u, 19u, 34u, 50u, 129u, 8u, 20u, 66u,
48536
  145u, 161u, 177u, 193u, 9u, 35u, 51u, 82u,
48537
  240u, 21u, 98u, 114u, 209u, 10u, 22u, 36u,
48538
  52u, 225u, 37u, 241u, 23u, 24u, 25u, 26u,
48539
  38u, 39u, 40u, 41u, 42u, 53u, 54u, 55u,
48540
  56u, 57u, 58u, 67u, 68u, 69u, 70u, 71u,
48541
  72u, 73u, 74u, 83u, 84u, 85u, 86u, 87u,
48542
  88u, 89u, 90u, 99u, 100u, 101u, 102u, 103u,
48543
  104u, 105u, 106u, 115u, 116u, 117u, 118u, 119u,
48544
  120u, 121u, 122u, 130u, 131u, 132u, 133u, 134u,
48545
  135u, 136u, 137u, 138u, 146u, 147u, 148u, 149u,
48546
  150u, 151u, 152u, 153u, 154u, 162u, 163u, 164u,
48547
  165u, 166u, 167u, 168u, 169u, 170u, 178u, 179u,
48548
  180u, 181u, 182u, 183u, 184u, 185u, 186u, 194u,
48549
  195u, 196u, 197u, 198u, 199u, 200u, 201u, 202u,
48550
  210u, 211u, 212u, 213u, 214u, 215u, 216u, 217u,
48551
  218u, 226u, 227u, 228u, 229u, 230u, 231u, 232u,
48552
  233u, 234u, 242u, 243u, 244u, 245u, 246u, 247u,
48553
  248u, 249u, 250u,
48554
};
48555
48556
#define WUFFS_JPEG__QUIRKS_BASE 1162824704u
48557
48558
// ---------------- Private Initializer Prototypes
48559
48560
// ---------------- Private Function Prototypes
48561
48562
WUFFS_BASE__GENERATED_C_CODE
48563
static wuffs_base__empty_struct
48564
wuffs_jpeg__decoder__decode_idct(
48565
    wuffs_jpeg__decoder* self,
48566
    wuffs_base__slice_u8 a_dst_buffer,
48567
    uint64_t a_dst_stride,
48568
    uint32_t a_q);
48569
48570
WUFFS_BASE__GENERATED_C_CODE
48571
static wuffs_base__empty_struct
48572
wuffs_jpeg__decoder__decode_idct__choosy_default(
48573
    wuffs_jpeg__decoder* self,
48574
    wuffs_base__slice_u8 a_dst_buffer,
48575
    uint64_t a_dst_stride,
48576
    uint32_t a_q);
48577
48578
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
48579
WUFFS_BASE__GENERATED_C_CODE
48580
static wuffs_base__empty_struct
48581
wuffs_jpeg__decoder__decode_idct_x86_avx2(
48582
    wuffs_jpeg__decoder* self,
48583
    wuffs_base__slice_u8 a_dst_buffer,
48584
    uint64_t a_dst_stride,
48585
    uint32_t a_q);
48586
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
48587
48588
WUFFS_BASE__GENERATED_C_CODE
48589
static wuffs_base__status
48590
wuffs_jpeg__decoder__do_decode_image_config(
48591
    wuffs_jpeg__decoder* self,
48592
    wuffs_base__image_config* a_dst,
48593
    wuffs_base__io_buffer* a_src);
48594
48595
WUFFS_BASE__GENERATED_C_CODE
48596
static wuffs_base__status
48597
wuffs_jpeg__decoder__decode_dqt(
48598
    wuffs_jpeg__decoder* self,
48599
    wuffs_base__io_buffer* a_src);
48600
48601
WUFFS_BASE__GENERATED_C_CODE
48602
static wuffs_base__status
48603
wuffs_jpeg__decoder__decode_dri(
48604
    wuffs_jpeg__decoder* self,
48605
    wuffs_base__io_buffer* a_src);
48606
48607
WUFFS_BASE__GENERATED_C_CODE
48608
static wuffs_base__status
48609
wuffs_jpeg__decoder__decode_appn(
48610
    wuffs_jpeg__decoder* self,
48611
    wuffs_base__io_buffer* a_src,
48612
    uint8_t a_marker);
48613
48614
WUFFS_BASE__GENERATED_C_CODE
48615
static wuffs_base__status
48616
wuffs_jpeg__decoder__decode_sof(
48617
    wuffs_jpeg__decoder* self,
48618
    wuffs_base__io_buffer* a_src);
48619
48620
WUFFS_BASE__GENERATED_C_CODE
48621
static uint32_t
48622
wuffs_jpeg__decoder__quantize_dimension(
48623
    const wuffs_jpeg__decoder* self,
48624
    uint32_t a_width,
48625
    uint8_t a_h,
48626
    uint8_t a_max_incl_h);
48627
48628
WUFFS_BASE__GENERATED_C_CODE
48629
static wuffs_base__status
48630
wuffs_jpeg__decoder__do_decode_frame_config(
48631
    wuffs_jpeg__decoder* self,
48632
    wuffs_base__frame_config* a_dst,
48633
    wuffs_base__io_buffer* a_src);
48634
48635
WUFFS_BASE__GENERATED_C_CODE
48636
static wuffs_base__status
48637
wuffs_jpeg__decoder__do_decode_frame(
48638
    wuffs_jpeg__decoder* self,
48639
    wuffs_base__pixel_buffer* a_dst,
48640
    wuffs_base__io_buffer* a_src,
48641
    wuffs_base__pixel_blend a_blend,
48642
    wuffs_base__slice_u8 a_workbuf,
48643
    wuffs_base__decode_frame_options* a_opts);
48644
48645
WUFFS_BASE__GENERATED_C_CODE
48646
static wuffs_base__status
48647
wuffs_jpeg__decoder__decode_dht(
48648
    wuffs_jpeg__decoder* self,
48649
    wuffs_base__io_buffer* a_src);
48650
48651
WUFFS_BASE__GENERATED_C_CODE
48652
static bool
48653
wuffs_jpeg__decoder__calculate_huff_tables(
48654
    wuffs_jpeg__decoder* self,
48655
    uint8_t a_tc4_th,
48656
    uint32_t a_total_count);
48657
48658
WUFFS_BASE__GENERATED_C_CODE
48659
static wuffs_base__status
48660
wuffs_jpeg__decoder__decode_sos(
48661
    wuffs_jpeg__decoder* self,
48662
    wuffs_base__pixel_buffer* a_dst,
48663
    wuffs_base__io_buffer* a_src,
48664
    wuffs_base__slice_u8 a_workbuf);
48665
48666
WUFFS_BASE__GENERATED_C_CODE
48667
static wuffs_base__status
48668
wuffs_jpeg__decoder__prepare_scan(
48669
    wuffs_jpeg__decoder* self,
48670
    wuffs_base__io_buffer* a_src);
48671
48672
WUFFS_BASE__GENERATED_C_CODE
48673
static wuffs_base__status
48674
wuffs_jpeg__decoder__use_default_huffman_table(
48675
    wuffs_jpeg__decoder* self,
48676
    uint8_t a_tc4_th);
48677
48678
WUFFS_BASE__GENERATED_C_CODE
48679
static wuffs_base__empty_struct
48680
wuffs_jpeg__decoder__calculate_single_component_scan_fields(
48681
    wuffs_jpeg__decoder* self);
48682
48683
WUFFS_BASE__GENERATED_C_CODE
48684
static bool
48685
wuffs_jpeg__decoder__calculate_multiple_component_scan_fields(
48686
    wuffs_jpeg__decoder* self);
48687
48688
WUFFS_BASE__GENERATED_C_CODE
48689
static wuffs_base__empty_struct
48690
wuffs_jpeg__decoder__fill_bitstream(
48691
    wuffs_jpeg__decoder* self,
48692
    wuffs_base__io_buffer* a_src);
48693
48694
WUFFS_BASE__GENERATED_C_CODE
48695
static wuffs_base__empty_struct
48696
wuffs_jpeg__decoder__load_mcu_blocks_for_single_component(
48697
    wuffs_jpeg__decoder* self,
48698
    uint32_t a_mx,
48699
    uint32_t a_my,
48700
    wuffs_base__slice_u8 a_workbuf,
48701
    uint32_t a_csel);
48702
48703
WUFFS_BASE__GENERATED_C_CODE
48704
static wuffs_base__empty_struct
48705
wuffs_jpeg__decoder__load_mcu_blocks_for_single_component__choosy_default(
48706
    wuffs_jpeg__decoder* self,
48707
    uint32_t a_mx,
48708
    uint32_t a_my,
48709
    wuffs_base__slice_u8 a_workbuf,
48710
    uint32_t a_csel);
48711
48712
WUFFS_BASE__GENERATED_C_CODE
48713
static wuffs_base__empty_struct
48714
wuffs_jpeg__decoder__load_mcu_blocks(
48715
    wuffs_jpeg__decoder* self,
48716
    uint32_t a_mx,
48717
    uint32_t a_my,
48718
    wuffs_base__slice_u8 a_workbuf);
48719
48720
WUFFS_BASE__GENERATED_C_CODE
48721
static wuffs_base__empty_struct
48722
wuffs_jpeg__decoder__save_mcu_blocks(
48723
    wuffs_jpeg__decoder* self,
48724
    uint32_t a_mx,
48725
    uint32_t a_my,
48726
    wuffs_base__slice_u8 a_workbuf);
48727
48728
WUFFS_BASE__GENERATED_C_CODE
48729
static wuffs_base__status
48730
wuffs_jpeg__decoder__skip_past_the_next_restart_marker(
48731
    wuffs_jpeg__decoder* self,
48732
    wuffs_base__io_buffer* a_src);
48733
48734
WUFFS_BASE__GENERATED_C_CODE
48735
static wuffs_base__empty_struct
48736
wuffs_jpeg__decoder__apply_progressive_idct(
48737
    wuffs_jpeg__decoder* self,
48738
    wuffs_base__slice_u8 a_workbuf);
48739
48740
WUFFS_BASE__GENERATED_C_CODE
48741
static wuffs_base__status
48742
wuffs_jpeg__decoder__swizzle_gray(
48743
    wuffs_jpeg__decoder* self,
48744
    wuffs_base__pixel_buffer* a_dst,
48745
    wuffs_base__slice_u8 a_workbuf,
48746
    uint32_t a_x0,
48747
    uint32_t a_x1,
48748
    uint32_t a_y0,
48749
    uint32_t a_y1,
48750
    uint64_t a_stride);
48751
48752
WUFFS_BASE__GENERATED_C_CODE
48753
static wuffs_base__status
48754
wuffs_jpeg__decoder__swizzle_colorful(
48755
    wuffs_jpeg__decoder* self,
48756
    wuffs_base__pixel_buffer* a_dst,
48757
    wuffs_base__slice_u8 a_workbuf,
48758
    uint32_t a_x0,
48759
    uint32_t a_x1,
48760
    uint32_t a_y0,
48761
    uint32_t a_y1);
48762
48763
WUFFS_BASE__GENERATED_C_CODE
48764
static bool
48765
wuffs_jpeg__decoder__top_left_quants_has_zero(
48766
    const wuffs_jpeg__decoder* self,
48767
    uint32_t a_q);
48768
48769
WUFFS_BASE__GENERATED_C_CODE
48770
static wuffs_base__empty_struct
48771
wuffs_jpeg__decoder__load_mcu_blocks_for_single_component_smooth(
48772
    wuffs_jpeg__decoder* self,
48773
    uint32_t a_mx,
48774
    uint32_t a_my,
48775
    wuffs_base__slice_u8 a_workbuf,
48776
    uint32_t a_csel);
48777
48778
WUFFS_BASE__GENERATED_C_CODE
48779
static uint32_t
48780
wuffs_jpeg__decoder__decode_mcu(
48781
    wuffs_jpeg__decoder* self,
48782
    wuffs_base__pixel_buffer* a_dst,
48783
    wuffs_base__slice_u8 a_workbuf,
48784
    uint32_t a_mx,
48785
    uint32_t a_my);
48786
48787
WUFFS_BASE__GENERATED_C_CODE
48788
static uint32_t
48789
wuffs_jpeg__decoder__decode_mcu__choosy_default(
48790
    wuffs_jpeg__decoder* self,
48791
    wuffs_base__pixel_buffer* a_dst,
48792
    wuffs_base__slice_u8 a_workbuf,
48793
    uint32_t a_mx,
48794
    uint32_t a_my);
48795
48796
WUFFS_BASE__GENERATED_C_CODE
48797
static uint32_t
48798
wuffs_jpeg__decoder__decode_mcu_progressive_ac_high_bits(
48799
    wuffs_jpeg__decoder* self,
48800
    wuffs_base__pixel_buffer* a_dst,
48801
    wuffs_base__slice_u8 a_workbuf,
48802
    uint32_t a_mx,
48803
    uint32_t a_my);
48804
48805
WUFFS_BASE__GENERATED_C_CODE
48806
static uint32_t
48807
wuffs_jpeg__decoder__decode_mcu_progressive_ac_low_bit(
48808
    wuffs_jpeg__decoder* self,
48809
    wuffs_base__pixel_buffer* a_dst,
48810
    wuffs_base__slice_u8 a_workbuf,
48811
    uint32_t a_mx,
48812
    uint32_t a_my);
48813
48814
WUFFS_BASE__GENERATED_C_CODE
48815
static uint32_t
48816
wuffs_jpeg__decoder__decode_mcu_progressive_dc_high_bits(
48817
    wuffs_jpeg__decoder* self,
48818
    wuffs_base__pixel_buffer* a_dst,
48819
    wuffs_base__slice_u8 a_workbuf,
48820
    uint32_t a_mx,
48821
    uint32_t a_my);
48822
48823
WUFFS_BASE__GENERATED_C_CODE
48824
static uint32_t
48825
wuffs_jpeg__decoder__decode_mcu_progressive_dc_low_bit(
48826
    wuffs_jpeg__decoder* self,
48827
    wuffs_base__pixel_buffer* a_dst,
48828
    wuffs_base__slice_u8 a_workbuf,
48829
    uint32_t a_mx,
48830
    uint32_t a_my);
48831
48832
// ---------------- VTables
48833
48834
const wuffs_base__image_decoder__func_ptrs
48835
wuffs_jpeg__decoder__func_ptrs_for__wuffs_base__image_decoder = {
48836
  (wuffs_base__status(*)(void*,
48837
      wuffs_base__pixel_buffer*,
48838
      wuffs_base__io_buffer*,
48839
      wuffs_base__pixel_blend,
48840
      wuffs_base__slice_u8,
48841
      wuffs_base__decode_frame_options*))(&wuffs_jpeg__decoder__decode_frame),
48842
  (wuffs_base__status(*)(void*,
48843
      wuffs_base__frame_config*,
48844
      wuffs_base__io_buffer*))(&wuffs_jpeg__decoder__decode_frame_config),
48845
  (wuffs_base__status(*)(void*,
48846
      wuffs_base__image_config*,
48847
      wuffs_base__io_buffer*))(&wuffs_jpeg__decoder__decode_image_config),
48848
  (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_jpeg__decoder__frame_dirty_rect),
48849
  (uint64_t(*)(const void*,
48850
      uint32_t))(&wuffs_jpeg__decoder__get_quirk),
48851
  (uint32_t(*)(const void*))(&wuffs_jpeg__decoder__num_animation_loops),
48852
  (uint64_t(*)(const void*))(&wuffs_jpeg__decoder__num_decoded_frame_configs),
48853
  (uint64_t(*)(const void*))(&wuffs_jpeg__decoder__num_decoded_frames),
48854
  (wuffs_base__status(*)(void*,
48855
      uint64_t,
48856
      uint64_t))(&wuffs_jpeg__decoder__restart_frame),
48857
  (wuffs_base__status(*)(void*,
48858
      uint32_t,
48859
      uint64_t))(&wuffs_jpeg__decoder__set_quirk),
48860
  (wuffs_base__empty_struct(*)(void*,
48861
      uint32_t,
48862
      bool))(&wuffs_jpeg__decoder__set_report_metadata),
48863
  (wuffs_base__status(*)(void*,
48864
      wuffs_base__io_buffer*,
48865
      wuffs_base__more_information*,
48866
      wuffs_base__io_buffer*))(&wuffs_jpeg__decoder__tell_me_more),
48867
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_jpeg__decoder__workbuf_len),
48868
};
48869
48870
// ---------------- Initializer Implementations
48871
48872
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
48873
wuffs_jpeg__decoder__initialize(
48874
    wuffs_jpeg__decoder* self,
48875
    size_t sizeof_star_self,
48876
    uint64_t wuffs_version,
48877
    uint32_t options){
48878
  if (!self) {
48879
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
48880
  }
48881
  if (sizeof(*self) != sizeof_star_self) {
48882
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
48883
  }
48884
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
48885
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
48886
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
48887
  }
48888
48889
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
48890
    // The whole point of this if-check is to detect an uninitialized *self.
48891
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
48892
#if !defined(__clang__) && defined(__GNUC__)
48893
#pragma GCC diagnostic push
48894
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
48895
#endif
48896
    if (self->private_impl.magic != 0) {
48897
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
48898
    }
48899
#if !defined(__clang__) && defined(__GNUC__)
48900
#pragma GCC diagnostic pop
48901
#endif
48902
  } else {
48903
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
48904
      memset(self, 0, sizeof(*self));
48905
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
48906
    } else {
48907
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
48908
    }
48909
  }
48910
48911
  self->private_impl.choosy_decode_idct = &wuffs_jpeg__decoder__decode_idct__choosy_default;
48912
  self->private_impl.choosy_load_mcu_blocks_for_single_component = &wuffs_jpeg__decoder__load_mcu_blocks_for_single_component__choosy_default;
48913
  self->private_impl.choosy_decode_mcu = &wuffs_jpeg__decoder__decode_mcu__choosy_default;
48914
48915
  self->private_impl.magic = WUFFS_BASE__MAGIC;
48916
  self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name =
48917
      wuffs_base__image_decoder__vtable_name;
48918
  self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers =
48919
      (const void*)(&wuffs_jpeg__decoder__func_ptrs_for__wuffs_base__image_decoder);
48920
  return wuffs_base__make_status(NULL);
48921
}
48922
48923
wuffs_jpeg__decoder*
48924
wuffs_jpeg__decoder__alloc(void) {
48925
  wuffs_jpeg__decoder* x =
48926
      (wuffs_jpeg__decoder*)(calloc(1, sizeof(wuffs_jpeg__decoder)));
48927
  if (!x) {
48928
    return NULL;
48929
  }
48930
  if (wuffs_jpeg__decoder__initialize(
48931
      x, sizeof(wuffs_jpeg__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
48932
    free(x);
48933
    return NULL;
48934
  }
48935
  return x;
48936
}
48937
48938
size_t
48939
sizeof__wuffs_jpeg__decoder(void) {
48940
  return sizeof(wuffs_jpeg__decoder);
48941
}
48942
48943
// ---------------- Function Implementations
48944
48945
// -------- func jpeg.decoder.decode_idct
48946
48947
WUFFS_BASE__GENERATED_C_CODE
48948
static wuffs_base__empty_struct
48949
wuffs_jpeg__decoder__decode_idct(
48950
    wuffs_jpeg__decoder* self,
48951
    wuffs_base__slice_u8 a_dst_buffer,
48952
    uint64_t a_dst_stride,
48953
    uint32_t a_q) {
48954
  return (*self->private_impl.choosy_decode_idct)(self, a_dst_buffer, a_dst_stride, a_q);
48955
}
48956
48957
WUFFS_BASE__GENERATED_C_CODE
48958
static wuffs_base__empty_struct
48959
wuffs_jpeg__decoder__decode_idct__choosy_default(
48960
    wuffs_jpeg__decoder* self,
48961
    wuffs_base__slice_u8 a_dst_buffer,
48962
    uint64_t a_dst_stride,
48963
    uint32_t a_q) {
48964
  uint32_t v_bq0 = 0;
48965
  uint32_t v_bq2 = 0;
48966
  uint32_t v_bq4 = 0;
48967
  uint32_t v_bq6 = 0;
48968
  uint32_t v_ca = 0;
48969
  uint32_t v_cb2 = 0;
48970
  uint32_t v_cb6 = 0;
48971
  uint32_t v_ccp = 0;
48972
  uint32_t v_ccm = 0;
48973
  uint32_t v_cd0 = 0;
48974
  uint32_t v_cd1 = 0;
48975
  uint32_t v_cd2 = 0;
48976
  uint32_t v_cd3 = 0;
48977
  uint32_t v_bq1 = 0;
48978
  uint32_t v_bq3 = 0;
48979
  uint32_t v_bq5 = 0;
48980
  uint32_t v_bq7 = 0;
48981
  uint32_t v_ci51 = 0;
48982
  uint32_t v_ci53 = 0;
48983
  uint32_t v_ci71 = 0;
48984
  uint32_t v_ci73 = 0;
48985
  uint32_t v_cj = 0;
48986
  uint32_t v_ck1 = 0;
48987
  uint32_t v_ck3 = 0;
48988
  uint32_t v_ck5 = 0;
48989
  uint32_t v_ck7 = 0;
48990
  uint32_t v_cl51 = 0;
48991
  uint32_t v_cl73 = 0;
48992
  uint32_t v_in0 = 0;
48993
  uint32_t v_in2 = 0;
48994
  uint32_t v_in4 = 0;
48995
  uint32_t v_in6 = 0;
48996
  uint32_t v_ra = 0;
48997
  uint32_t v_rb2 = 0;
48998
  uint32_t v_rb6 = 0;
48999
  uint32_t v_rcp = 0;
49000
  uint32_t v_rcm = 0;
49001
  uint32_t v_rd0 = 0;
49002
  uint32_t v_rd1 = 0;
49003
  uint32_t v_rd2 = 0;
49004
  uint32_t v_rd3 = 0;
49005
  uint32_t v_in1 = 0;
49006
  uint32_t v_in3 = 0;
49007
  uint32_t v_in5 = 0;
49008
  uint32_t v_in7 = 0;
49009
  uint32_t v_ri51 = 0;
49010
  uint32_t v_ri53 = 0;
49011
  uint32_t v_ri71 = 0;
49012
  uint32_t v_ri73 = 0;
49013
  uint32_t v_rj = 0;
49014
  uint32_t v_rk1 = 0;
49015
  uint32_t v_rk3 = 0;
49016
  uint32_t v_rk5 = 0;
49017
  uint32_t v_rk7 = 0;
49018
  uint32_t v_rl51 = 0;
49019
  uint32_t v_rl73 = 0;
49020
  uint32_t v_intermediate[64] = {0};
49021
49022
  if (8u > a_dst_stride) {
49023
    return wuffs_base__make_empty_struct();
49024
  }
49025
  if (0u == (self->private_data.f_mcu_blocks[0u][8u] |
49026
      self->private_data.f_mcu_blocks[0u][16u] |
49027
      self->private_data.f_mcu_blocks[0u][24u] |
49028
      self->private_data.f_mcu_blocks[0u][32u] |
49029
      self->private_data.f_mcu_blocks[0u][40u] |
49030
      self->private_data.f_mcu_blocks[0u][48u] |
49031
      self->private_data.f_mcu_blocks[0u][56u])) {
49032
    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));
49033
    v_intermediate[8u] = v_intermediate[0u];
49034
    v_intermediate[16u] = v_intermediate[0u];
49035
    v_intermediate[24u] = v_intermediate[0u];
49036
    v_intermediate[32u] = v_intermediate[0u];
49037
    v_intermediate[40u] = v_intermediate[0u];
49038
    v_intermediate[48u] = v_intermediate[0u];
49039
    v_intermediate[56u] = v_intermediate[0u];
49040
  } else {
49041
    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]))));
49042
    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]))));
49043
    v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u));
49044
    v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u))));
49045
    v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u))));
49046
    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]))));
49047
    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]))));
49048
    v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u));
49049
    v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u));
49050
    v_cd0 = ((uint32_t)(v_ccp + v_cb2));
49051
    v_cd1 = ((uint32_t)(v_ccm + v_cb6));
49052
    v_cd2 = ((uint32_t)(v_ccm - v_cb6));
49053
    v_cd3 = ((uint32_t)(v_ccp - v_cb2));
49054
    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]))));
49055
    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]))));
49056
    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]))));
49057
    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]))));
49058
    v_ci51 = ((uint32_t)(v_bq5 + v_bq1));
49059
    v_ci53 = ((uint32_t)(v_bq5 + v_bq3));
49060
    v_ci71 = ((uint32_t)(v_bq7 + v_bq1));
49061
    v_ci73 = ((uint32_t)(v_bq7 + v_bq3));
49062
    v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u));
49063
    v_ck1 = ((uint32_t)(v_bq1 * 12299u));
49064
    v_ck3 = ((uint32_t)(v_bq3 * 25172u));
49065
    v_ck5 = ((uint32_t)(v_bq5 * 16819u));
49066
    v_ck7 = ((uint32_t)(v_bq7 * 2446u));
49067
    v_ci51 *= 4294964100u;
49068
    v_ci53 *= 4294946301u;
49069
    v_ci71 *= 4294959923u;
49070
    v_ci73 *= 4294951227u;
49071
    v_cl51 = ((uint32_t)(v_ci51 + v_cj));
49072
    v_cl73 = ((uint32_t)(v_ci73 + v_cj));
49073
    v_ck1 += ((uint32_t)(v_ci71 + v_cl51));
49074
    v_ck3 += ((uint32_t)(v_ci53 + v_cl73));
49075
    v_ck5 += ((uint32_t)(v_ci53 + v_cl51));
49076
    v_ck7 += ((uint32_t)(v_ci71 + v_cl73));
49077
    v_intermediate[0u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u);
49078
    v_intermediate[56u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u);
49079
    v_intermediate[8u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u);
49080
    v_intermediate[48u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u);
49081
    v_intermediate[16u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u);
49082
    v_intermediate[40u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u);
49083
    v_intermediate[24u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u);
49084
    v_intermediate[32u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u);
49085
  }
49086
  if (0u == (self->private_data.f_mcu_blocks[0u][9u] |
49087
      self->private_data.f_mcu_blocks[0u][17u] |
49088
      self->private_data.f_mcu_blocks[0u][25u] |
49089
      self->private_data.f_mcu_blocks[0u][33u] |
49090
      self->private_data.f_mcu_blocks[0u][41u] |
49091
      self->private_data.f_mcu_blocks[0u][49u] |
49092
      self->private_data.f_mcu_blocks[0u][57u])) {
49093
    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));
49094
    v_intermediate[9u] = v_intermediate[1u];
49095
    v_intermediate[17u] = v_intermediate[1u];
49096
    v_intermediate[25u] = v_intermediate[1u];
49097
    v_intermediate[33u] = v_intermediate[1u];
49098
    v_intermediate[41u] = v_intermediate[1u];
49099
    v_intermediate[49u] = v_intermediate[1u];
49100
    v_intermediate[57u] = v_intermediate[1u];
49101
  } else {
49102
    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]))));
49103
    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]))));
49104
    v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u));
49105
    v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u))));
49106
    v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u))));
49107
    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]))));
49108
    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]))));
49109
    v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u));
49110
    v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u));
49111
    v_cd0 = ((uint32_t)(v_ccp + v_cb2));
49112
    v_cd1 = ((uint32_t)(v_ccm + v_cb6));
49113
    v_cd2 = ((uint32_t)(v_ccm - v_cb6));
49114
    v_cd3 = ((uint32_t)(v_ccp - v_cb2));
49115
    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]))));
49116
    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]))));
49117
    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]))));
49118
    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]))));
49119
    v_ci51 = ((uint32_t)(v_bq5 + v_bq1));
49120
    v_ci53 = ((uint32_t)(v_bq5 + v_bq3));
49121
    v_ci71 = ((uint32_t)(v_bq7 + v_bq1));
49122
    v_ci73 = ((uint32_t)(v_bq7 + v_bq3));
49123
    v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u));
49124
    v_ck1 = ((uint32_t)(v_bq1 * 12299u));
49125
    v_ck3 = ((uint32_t)(v_bq3 * 25172u));
49126
    v_ck5 = ((uint32_t)(v_bq5 * 16819u));
49127
    v_ck7 = ((uint32_t)(v_bq7 * 2446u));
49128
    v_ci51 *= 4294964100u;
49129
    v_ci53 *= 4294946301u;
49130
    v_ci71 *= 4294959923u;
49131
    v_ci73 *= 4294951227u;
49132
    v_cl51 = ((uint32_t)(v_ci51 + v_cj));
49133
    v_cl73 = ((uint32_t)(v_ci73 + v_cj));
49134
    v_ck1 += ((uint32_t)(v_ci71 + v_cl51));
49135
    v_ck3 += ((uint32_t)(v_ci53 + v_cl73));
49136
    v_ck5 += ((uint32_t)(v_ci53 + v_cl51));
49137
    v_ck7 += ((uint32_t)(v_ci71 + v_cl73));
49138
    v_intermediate[1u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u);
49139
    v_intermediate[57u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u);
49140
    v_intermediate[9u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u);
49141
    v_intermediate[49u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u);
49142
    v_intermediate[17u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u);
49143
    v_intermediate[41u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u);
49144
    v_intermediate[25u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u);
49145
    v_intermediate[33u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u);
49146
  }
49147
  if (0u == (self->private_data.f_mcu_blocks[0u][10u] |
49148
      self->private_data.f_mcu_blocks[0u][18u] |
49149
      self->private_data.f_mcu_blocks[0u][26u] |
49150
      self->private_data.f_mcu_blocks[0u][34u] |
49151
      self->private_data.f_mcu_blocks[0u][42u] |
49152
      self->private_data.f_mcu_blocks[0u][50u] |
49153
      self->private_data.f_mcu_blocks[0u][58u])) {
49154
    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));
49155
    v_intermediate[10u] = v_intermediate[2u];
49156
    v_intermediate[18u] = v_intermediate[2u];
49157
    v_intermediate[26u] = v_intermediate[2u];
49158
    v_intermediate[34u] = v_intermediate[2u];
49159
    v_intermediate[42u] = v_intermediate[2u];
49160
    v_intermediate[50u] = v_intermediate[2u];
49161
    v_intermediate[58u] = v_intermediate[2u];
49162
  } else {
49163
    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]))));
49164
    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]))));
49165
    v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u));
49166
    v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u))));
49167
    v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u))));
49168
    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]))));
49169
    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]))));
49170
    v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u));
49171
    v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u));
49172
    v_cd0 = ((uint32_t)(v_ccp + v_cb2));
49173
    v_cd1 = ((uint32_t)(v_ccm + v_cb6));
49174
    v_cd2 = ((uint32_t)(v_ccm - v_cb6));
49175
    v_cd3 = ((uint32_t)(v_ccp - v_cb2));
49176
    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]))));
49177
    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]))));
49178
    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]))));
49179
    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]))));
49180
    v_ci51 = ((uint32_t)(v_bq5 + v_bq1));
49181
    v_ci53 = ((uint32_t)(v_bq5 + v_bq3));
49182
    v_ci71 = ((uint32_t)(v_bq7 + v_bq1));
49183
    v_ci73 = ((uint32_t)(v_bq7 + v_bq3));
49184
    v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u));
49185
    v_ck1 = ((uint32_t)(v_bq1 * 12299u));
49186
    v_ck3 = ((uint32_t)(v_bq3 * 25172u));
49187
    v_ck5 = ((uint32_t)(v_bq5 * 16819u));
49188
    v_ck7 = ((uint32_t)(v_bq7 * 2446u));
49189
    v_ci51 *= 4294964100u;
49190
    v_ci53 *= 4294946301u;
49191
    v_ci71 *= 4294959923u;
49192
    v_ci73 *= 4294951227u;
49193
    v_cl51 = ((uint32_t)(v_ci51 + v_cj));
49194
    v_cl73 = ((uint32_t)(v_ci73 + v_cj));
49195
    v_ck1 += ((uint32_t)(v_ci71 + v_cl51));
49196
    v_ck3 += ((uint32_t)(v_ci53 + v_cl73));
49197
    v_ck5 += ((uint32_t)(v_ci53 + v_cl51));
49198
    v_ck7 += ((uint32_t)(v_ci71 + v_cl73));
49199
    v_intermediate[2u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u);
49200
    v_intermediate[58u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u);
49201
    v_intermediate[10u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u);
49202
    v_intermediate[50u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u);
49203
    v_intermediate[18u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u);
49204
    v_intermediate[42u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u);
49205
    v_intermediate[26u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u);
49206
    v_intermediate[34u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u);
49207
  }
49208
  if (0u == (self->private_data.f_mcu_blocks[0u][11u] |
49209
      self->private_data.f_mcu_blocks[0u][19u] |
49210
      self->private_data.f_mcu_blocks[0u][27u] |
49211
      self->private_data.f_mcu_blocks[0u][35u] |
49212
      self->private_data.f_mcu_blocks[0u][43u] |
49213
      self->private_data.f_mcu_blocks[0u][51u] |
49214
      self->private_data.f_mcu_blocks[0u][59u])) {
49215
    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));
49216
    v_intermediate[11u] = v_intermediate[3u];
49217
    v_intermediate[19u] = v_intermediate[3u];
49218
    v_intermediate[27u] = v_intermediate[3u];
49219
    v_intermediate[35u] = v_intermediate[3u];
49220
    v_intermediate[43u] = v_intermediate[3u];
49221
    v_intermediate[51u] = v_intermediate[3u];
49222
    v_intermediate[59u] = v_intermediate[3u];
49223
  } else {
49224
    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]))));
49225
    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]))));
49226
    v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u));
49227
    v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u))));
49228
    v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u))));
49229
    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]))));
49230
    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]))));
49231
    v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u));
49232
    v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u));
49233
    v_cd0 = ((uint32_t)(v_ccp + v_cb2));
49234
    v_cd1 = ((uint32_t)(v_ccm + v_cb6));
49235
    v_cd2 = ((uint32_t)(v_ccm - v_cb6));
49236
    v_cd3 = ((uint32_t)(v_ccp - v_cb2));
49237
    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]))));
49238
    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]))));
49239
    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]))));
49240
    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]))));
49241
    v_ci51 = ((uint32_t)(v_bq5 + v_bq1));
49242
    v_ci53 = ((uint32_t)(v_bq5 + v_bq3));
49243
    v_ci71 = ((uint32_t)(v_bq7 + v_bq1));
49244
    v_ci73 = ((uint32_t)(v_bq7 + v_bq3));
49245
    v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u));
49246
    v_ck1 = ((uint32_t)(v_bq1 * 12299u));
49247
    v_ck3 = ((uint32_t)(v_bq3 * 25172u));
49248
    v_ck5 = ((uint32_t)(v_bq5 * 16819u));
49249
    v_ck7 = ((uint32_t)(v_bq7 * 2446u));
49250
    v_ci51 *= 4294964100u;
49251
    v_ci53 *= 4294946301u;
49252
    v_ci71 *= 4294959923u;
49253
    v_ci73 *= 4294951227u;
49254
    v_cl51 = ((uint32_t)(v_ci51 + v_cj));
49255
    v_cl73 = ((uint32_t)(v_ci73 + v_cj));
49256
    v_ck1 += ((uint32_t)(v_ci71 + v_cl51));
49257
    v_ck3 += ((uint32_t)(v_ci53 + v_cl73));
49258
    v_ck5 += ((uint32_t)(v_ci53 + v_cl51));
49259
    v_ck7 += ((uint32_t)(v_ci71 + v_cl73));
49260
    v_intermediate[3u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u);
49261
    v_intermediate[59u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u);
49262
    v_intermediate[11u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u);
49263
    v_intermediate[51u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u);
49264
    v_intermediate[19u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u);
49265
    v_intermediate[43u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u);
49266
    v_intermediate[27u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u);
49267
    v_intermediate[35u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u);
49268
  }
49269
  if (0u == (self->private_data.f_mcu_blocks[0u][12u] |
49270
      self->private_data.f_mcu_blocks[0u][20u] |
49271
      self->private_data.f_mcu_blocks[0u][28u] |
49272
      self->private_data.f_mcu_blocks[0u][36u] |
49273
      self->private_data.f_mcu_blocks[0u][44u] |
49274
      self->private_data.f_mcu_blocks[0u][52u] |
49275
      self->private_data.f_mcu_blocks[0u][60u])) {
49276
    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));
49277
    v_intermediate[12u] = v_intermediate[4u];
49278
    v_intermediate[20u] = v_intermediate[4u];
49279
    v_intermediate[28u] = v_intermediate[4u];
49280
    v_intermediate[36u] = v_intermediate[4u];
49281
    v_intermediate[44u] = v_intermediate[4u];
49282
    v_intermediate[52u] = v_intermediate[4u];
49283
    v_intermediate[60u] = v_intermediate[4u];
49284
  } else {
49285
    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]))));
49286
    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]))));
49287
    v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u));
49288
    v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u))));
49289
    v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u))));
49290
    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]))));
49291
    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]))));
49292
    v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u));
49293
    v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u));
49294
    v_cd0 = ((uint32_t)(v_ccp + v_cb2));
49295
    v_cd1 = ((uint32_t)(v_ccm + v_cb6));
49296
    v_cd2 = ((uint32_t)(v_ccm - v_cb6));
49297
    v_cd3 = ((uint32_t)(v_ccp - v_cb2));
49298
    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]))));
49299
    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]))));
49300
    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]))));
49301
    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]))));
49302
    v_ci51 = ((uint32_t)(v_bq5 + v_bq1));
49303
    v_ci53 = ((uint32_t)(v_bq5 + v_bq3));
49304
    v_ci71 = ((uint32_t)(v_bq7 + v_bq1));
49305
    v_ci73 = ((uint32_t)(v_bq7 + v_bq3));
49306
    v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u));
49307
    v_ck1 = ((uint32_t)(v_bq1 * 12299u));
49308
    v_ck3 = ((uint32_t)(v_bq3 * 25172u));
49309
    v_ck5 = ((uint32_t)(v_bq5 * 16819u));
49310
    v_ck7 = ((uint32_t)(v_bq7 * 2446u));
49311
    v_ci51 *= 4294964100u;
49312
    v_ci53 *= 4294946301u;
49313
    v_ci71 *= 4294959923u;
49314
    v_ci73 *= 4294951227u;
49315
    v_cl51 = ((uint32_t)(v_ci51 + v_cj));
49316
    v_cl73 = ((uint32_t)(v_ci73 + v_cj));
49317
    v_ck1 += ((uint32_t)(v_ci71 + v_cl51));
49318
    v_ck3 += ((uint32_t)(v_ci53 + v_cl73));
49319
    v_ck5 += ((uint32_t)(v_ci53 + v_cl51));
49320
    v_ck7 += ((uint32_t)(v_ci71 + v_cl73));
49321
    v_intermediate[4u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u);
49322
    v_intermediate[60u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u);
49323
    v_intermediate[12u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u);
49324
    v_intermediate[52u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u);
49325
    v_intermediate[20u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u);
49326
    v_intermediate[44u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u);
49327
    v_intermediate[28u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u);
49328
    v_intermediate[36u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u);
49329
  }
49330
  if (0u == (self->private_data.f_mcu_blocks[0u][13u] |
49331
      self->private_data.f_mcu_blocks[0u][21u] |
49332
      self->private_data.f_mcu_blocks[0u][29u] |
49333
      self->private_data.f_mcu_blocks[0u][37u] |
49334
      self->private_data.f_mcu_blocks[0u][45u] |
49335
      self->private_data.f_mcu_blocks[0u][53u] |
49336
      self->private_data.f_mcu_blocks[0u][61u])) {
49337
    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));
49338
    v_intermediate[13u] = v_intermediate[5u];
49339
    v_intermediate[21u] = v_intermediate[5u];
49340
    v_intermediate[29u] = v_intermediate[5u];
49341
    v_intermediate[37u] = v_intermediate[5u];
49342
    v_intermediate[45u] = v_intermediate[5u];
49343
    v_intermediate[53u] = v_intermediate[5u];
49344
    v_intermediate[61u] = v_intermediate[5u];
49345
  } else {
49346
    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]))));
49347
    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]))));
49348
    v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u));
49349
    v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u))));
49350
    v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u))));
49351
    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]))));
49352
    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]))));
49353
    v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u));
49354
    v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u));
49355
    v_cd0 = ((uint32_t)(v_ccp + v_cb2));
49356
    v_cd1 = ((uint32_t)(v_ccm + v_cb6));
49357
    v_cd2 = ((uint32_t)(v_ccm - v_cb6));
49358
    v_cd3 = ((uint32_t)(v_ccp - v_cb2));
49359
    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]))));
49360
    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]))));
49361
    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]))));
49362
    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]))));
49363
    v_ci51 = ((uint32_t)(v_bq5 + v_bq1));
49364
    v_ci53 = ((uint32_t)(v_bq5 + v_bq3));
49365
    v_ci71 = ((uint32_t)(v_bq7 + v_bq1));
49366
    v_ci73 = ((uint32_t)(v_bq7 + v_bq3));
49367
    v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u));
49368
    v_ck1 = ((uint32_t)(v_bq1 * 12299u));
49369
    v_ck3 = ((uint32_t)(v_bq3 * 25172u));
49370
    v_ck5 = ((uint32_t)(v_bq5 * 16819u));
49371
    v_ck7 = ((uint32_t)(v_bq7 * 2446u));
49372
    v_ci51 *= 4294964100u;
49373
    v_ci53 *= 4294946301u;
49374
    v_ci71 *= 4294959923u;
49375
    v_ci73 *= 4294951227u;
49376
    v_cl51 = ((uint32_t)(v_ci51 + v_cj));
49377
    v_cl73 = ((uint32_t)(v_ci73 + v_cj));
49378
    v_ck1 += ((uint32_t)(v_ci71 + v_cl51));
49379
    v_ck3 += ((uint32_t)(v_ci53 + v_cl73));
49380
    v_ck5 += ((uint32_t)(v_ci53 + v_cl51));
49381
    v_ck7 += ((uint32_t)(v_ci71 + v_cl73));
49382
    v_intermediate[5u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u);
49383
    v_intermediate[61u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u);
49384
    v_intermediate[13u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u);
49385
    v_intermediate[53u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u);
49386
    v_intermediate[21u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u);
49387
    v_intermediate[45u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u);
49388
    v_intermediate[29u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u);
49389
    v_intermediate[37u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u);
49390
  }
49391
  if (0u == (self->private_data.f_mcu_blocks[0u][14u] |
49392
      self->private_data.f_mcu_blocks[0u][22u] |
49393
      self->private_data.f_mcu_blocks[0u][30u] |
49394
      self->private_data.f_mcu_blocks[0u][38u] |
49395
      self->private_data.f_mcu_blocks[0u][46u] |
49396
      self->private_data.f_mcu_blocks[0u][54u] |
49397
      self->private_data.f_mcu_blocks[0u][62u])) {
49398
    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));
49399
    v_intermediate[14u] = v_intermediate[6u];
49400
    v_intermediate[22u] = v_intermediate[6u];
49401
    v_intermediate[30u] = v_intermediate[6u];
49402
    v_intermediate[38u] = v_intermediate[6u];
49403
    v_intermediate[46u] = v_intermediate[6u];
49404
    v_intermediate[54u] = v_intermediate[6u];
49405
    v_intermediate[62u] = v_intermediate[6u];
49406
  } else {
49407
    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]))));
49408
    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]))));
49409
    v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u));
49410
    v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u))));
49411
    v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u))));
49412
    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]))));
49413
    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]))));
49414
    v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u));
49415
    v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u));
49416
    v_cd0 = ((uint32_t)(v_ccp + v_cb2));
49417
    v_cd1 = ((uint32_t)(v_ccm + v_cb6));
49418
    v_cd2 = ((uint32_t)(v_ccm - v_cb6));
49419
    v_cd3 = ((uint32_t)(v_ccp - v_cb2));
49420
    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]))));
49421
    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]))));
49422
    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]))));
49423
    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]))));
49424
    v_ci51 = ((uint32_t)(v_bq5 + v_bq1));
49425
    v_ci53 = ((uint32_t)(v_bq5 + v_bq3));
49426
    v_ci71 = ((uint32_t)(v_bq7 + v_bq1));
49427
    v_ci73 = ((uint32_t)(v_bq7 + v_bq3));
49428
    v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u));
49429
    v_ck1 = ((uint32_t)(v_bq1 * 12299u));
49430
    v_ck3 = ((uint32_t)(v_bq3 * 25172u));
49431
    v_ck5 = ((uint32_t)(v_bq5 * 16819u));
49432
    v_ck7 = ((uint32_t)(v_bq7 * 2446u));
49433
    v_ci51 *= 4294964100u;
49434
    v_ci53 *= 4294946301u;
49435
    v_ci71 *= 4294959923u;
49436
    v_ci73 *= 4294951227u;
49437
    v_cl51 = ((uint32_t)(v_ci51 + v_cj));
49438
    v_cl73 = ((uint32_t)(v_ci73 + v_cj));
49439
    v_ck1 += ((uint32_t)(v_ci71 + v_cl51));
49440
    v_ck3 += ((uint32_t)(v_ci53 + v_cl73));
49441
    v_ck5 += ((uint32_t)(v_ci53 + v_cl51));
49442
    v_ck7 += ((uint32_t)(v_ci71 + v_cl73));
49443
    v_intermediate[6u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u);
49444
    v_intermediate[62u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u);
49445
    v_intermediate[14u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u);
49446
    v_intermediate[54u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u);
49447
    v_intermediate[22u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u);
49448
    v_intermediate[46u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u);
49449
    v_intermediate[30u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u);
49450
    v_intermediate[38u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u);
49451
  }
49452
  if (0u == (self->private_data.f_mcu_blocks[0u][15u] |
49453
      self->private_data.f_mcu_blocks[0u][23u] |
49454
      self->private_data.f_mcu_blocks[0u][31u] |
49455
      self->private_data.f_mcu_blocks[0u][39u] |
49456
      self->private_data.f_mcu_blocks[0u][47u] |
49457
      self->private_data.f_mcu_blocks[0u][55u] |
49458
      self->private_data.f_mcu_blocks[0u][63u])) {
49459
    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));
49460
    v_intermediate[15u] = v_intermediate[7u];
49461
    v_intermediate[23u] = v_intermediate[7u];
49462
    v_intermediate[31u] = v_intermediate[7u];
49463
    v_intermediate[39u] = v_intermediate[7u];
49464
    v_intermediate[47u] = v_intermediate[7u];
49465
    v_intermediate[55u] = v_intermediate[7u];
49466
    v_intermediate[63u] = v_intermediate[7u];
49467
  } else {
49468
    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]))));
49469
    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]))));
49470
    v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u));
49471
    v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u))));
49472
    v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u))));
49473
    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]))));
49474
    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]))));
49475
    v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u));
49476
    v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u));
49477
    v_cd0 = ((uint32_t)(v_ccp + v_cb2));
49478
    v_cd1 = ((uint32_t)(v_ccm + v_cb6));
49479
    v_cd2 = ((uint32_t)(v_ccm - v_cb6));
49480
    v_cd3 = ((uint32_t)(v_ccp - v_cb2));
49481
    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]))));
49482
    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]))));
49483
    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]))));
49484
    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]))));
49485
    v_ci51 = ((uint32_t)(v_bq5 + v_bq1));
49486
    v_ci53 = ((uint32_t)(v_bq5 + v_bq3));
49487
    v_ci71 = ((uint32_t)(v_bq7 + v_bq1));
49488
    v_ci73 = ((uint32_t)(v_bq7 + v_bq3));
49489
    v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u));
49490
    v_ck1 = ((uint32_t)(v_bq1 * 12299u));
49491
    v_ck3 = ((uint32_t)(v_bq3 * 25172u));
49492
    v_ck5 = ((uint32_t)(v_bq5 * 16819u));
49493
    v_ck7 = ((uint32_t)(v_bq7 * 2446u));
49494
    v_ci51 *= 4294964100u;
49495
    v_ci53 *= 4294946301u;
49496
    v_ci71 *= 4294959923u;
49497
    v_ci73 *= 4294951227u;
49498
    v_cl51 = ((uint32_t)(v_ci51 + v_cj));
49499
    v_cl73 = ((uint32_t)(v_ci73 + v_cj));
49500
    v_ck1 += ((uint32_t)(v_ci71 + v_cl51));
49501
    v_ck3 += ((uint32_t)(v_ci53 + v_cl73));
49502
    v_ck5 += ((uint32_t)(v_ci53 + v_cl51));
49503
    v_ck7 += ((uint32_t)(v_ci71 + v_cl73));
49504
    v_intermediate[7u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u);
49505
    v_intermediate[63u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u);
49506
    v_intermediate[15u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u);
49507
    v_intermediate[55u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u);
49508
    v_intermediate[23u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u);
49509
    v_intermediate[47u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u);
49510
    v_intermediate[31u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u);
49511
    v_intermediate[39u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u);
49512
  }
49513
  if (0u == (v_intermediate[1u] |
49514
      v_intermediate[2u] |
49515
      v_intermediate[3u] |
49516
      v_intermediate[4u] |
49517
      v_intermediate[5u] |
49518
      v_intermediate[6u] |
49519
      v_intermediate[7u])) {
49520
    if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
49521
      return wuffs_base__make_empty_struct();
49522
    }
49523
    a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[0u] + 16u)) >> 5u) & 1023u)];
49524
    a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u];
49525
    a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u];
49526
    a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u];
49527
    a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u];
49528
    a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u];
49529
    a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u];
49530
    a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u];
49531
    a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
49532
  } else {
49533
    v_in2 = v_intermediate[2u];
49534
    v_in6 = v_intermediate[6u];
49535
    v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u));
49536
    v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u))));
49537
    v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u))));
49538
    v_in0 = v_intermediate[0u];
49539
    v_in4 = v_intermediate[4u];
49540
    v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u));
49541
    v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u));
49542
    v_rd0 = ((uint32_t)(v_rcp + v_rb2));
49543
    v_rd1 = ((uint32_t)(v_rcm + v_rb6));
49544
    v_rd2 = ((uint32_t)(v_rcm - v_rb6));
49545
    v_rd3 = ((uint32_t)(v_rcp - v_rb2));
49546
    v_in1 = v_intermediate[1u];
49547
    v_in3 = v_intermediate[3u];
49548
    v_in5 = v_intermediate[5u];
49549
    v_in7 = v_intermediate[7u];
49550
    v_ri51 = ((uint32_t)(v_in5 + v_in1));
49551
    v_ri53 = ((uint32_t)(v_in5 + v_in3));
49552
    v_ri71 = ((uint32_t)(v_in7 + v_in1));
49553
    v_ri73 = ((uint32_t)(v_in7 + v_in3));
49554
    v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u));
49555
    v_rk1 = ((uint32_t)(v_in1 * 12299u));
49556
    v_rk3 = ((uint32_t)(v_in3 * 25172u));
49557
    v_rk5 = ((uint32_t)(v_in5 * 16819u));
49558
    v_rk7 = ((uint32_t)(v_in7 * 2446u));
49559
    v_ri51 *= 4294964100u;
49560
    v_ri53 *= 4294946301u;
49561
    v_ri71 *= 4294959923u;
49562
    v_ri73 *= 4294951227u;
49563
    v_rl51 = ((uint32_t)(v_ri51 + v_rj));
49564
    v_rl73 = ((uint32_t)(v_ri73 + v_rj));
49565
    v_rk1 += ((uint32_t)(v_ri71 + v_rl51));
49566
    v_rk3 += ((uint32_t)(v_ri53 + v_rl73));
49567
    v_rk5 += ((uint32_t)(v_ri53 + v_rl51));
49568
    v_rk7 += ((uint32_t)(v_ri71 + v_rl73));
49569
    if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
49570
      return wuffs_base__make_empty_struct();
49571
    }
49572
    a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)];
49573
    a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)];
49574
    a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)];
49575
    a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)];
49576
    a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)];
49577
    a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)];
49578
    a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)];
49579
    a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)];
49580
    a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
49581
  }
49582
  if (0u == (v_intermediate[9u] |
49583
      v_intermediate[10u] |
49584
      v_intermediate[11u] |
49585
      v_intermediate[12u] |
49586
      v_intermediate[13u] |
49587
      v_intermediate[14u] |
49588
      v_intermediate[15u])) {
49589
    if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
49590
      return wuffs_base__make_empty_struct();
49591
    }
49592
    a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[8u] + 16u)) >> 5u) & 1023u)];
49593
    a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u];
49594
    a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u];
49595
    a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u];
49596
    a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u];
49597
    a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u];
49598
    a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u];
49599
    a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u];
49600
    a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
49601
  } else {
49602
    v_in2 = v_intermediate[10u];
49603
    v_in6 = v_intermediate[14u];
49604
    v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u));
49605
    v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u))));
49606
    v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u))));
49607
    v_in0 = v_intermediate[8u];
49608
    v_in4 = v_intermediate[12u];
49609
    v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u));
49610
    v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u));
49611
    v_rd0 = ((uint32_t)(v_rcp + v_rb2));
49612
    v_rd1 = ((uint32_t)(v_rcm + v_rb6));
49613
    v_rd2 = ((uint32_t)(v_rcm - v_rb6));
49614
    v_rd3 = ((uint32_t)(v_rcp - v_rb2));
49615
    v_in1 = v_intermediate[9u];
49616
    v_in3 = v_intermediate[11u];
49617
    v_in5 = v_intermediate[13u];
49618
    v_in7 = v_intermediate[15u];
49619
    v_ri51 = ((uint32_t)(v_in5 + v_in1));
49620
    v_ri53 = ((uint32_t)(v_in5 + v_in3));
49621
    v_ri71 = ((uint32_t)(v_in7 + v_in1));
49622
    v_ri73 = ((uint32_t)(v_in7 + v_in3));
49623
    v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u));
49624
    v_rk1 = ((uint32_t)(v_in1 * 12299u));
49625
    v_rk3 = ((uint32_t)(v_in3 * 25172u));
49626
    v_rk5 = ((uint32_t)(v_in5 * 16819u));
49627
    v_rk7 = ((uint32_t)(v_in7 * 2446u));
49628
    v_ri51 *= 4294964100u;
49629
    v_ri53 *= 4294946301u;
49630
    v_ri71 *= 4294959923u;
49631
    v_ri73 *= 4294951227u;
49632
    v_rl51 = ((uint32_t)(v_ri51 + v_rj));
49633
    v_rl73 = ((uint32_t)(v_ri73 + v_rj));
49634
    v_rk1 += ((uint32_t)(v_ri71 + v_rl51));
49635
    v_rk3 += ((uint32_t)(v_ri53 + v_rl73));
49636
    v_rk5 += ((uint32_t)(v_ri53 + v_rl51));
49637
    v_rk7 += ((uint32_t)(v_ri71 + v_rl73));
49638
    if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
49639
      return wuffs_base__make_empty_struct();
49640
    }
49641
    a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)];
49642
    a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)];
49643
    a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)];
49644
    a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)];
49645
    a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)];
49646
    a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)];
49647
    a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)];
49648
    a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)];
49649
    a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
49650
  }
49651
  if (0u == (v_intermediate[17u] |
49652
      v_intermediate[18u] |
49653
      v_intermediate[19u] |
49654
      v_intermediate[20u] |
49655
      v_intermediate[21u] |
49656
      v_intermediate[22u] |
49657
      v_intermediate[23u])) {
49658
    if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
49659
      return wuffs_base__make_empty_struct();
49660
    }
49661
    a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[16u] + 16u)) >> 5u) & 1023u)];
49662
    a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u];
49663
    a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u];
49664
    a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u];
49665
    a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u];
49666
    a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u];
49667
    a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u];
49668
    a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u];
49669
    a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
49670
  } else {
49671
    v_in2 = v_intermediate[18u];
49672
    v_in6 = v_intermediate[22u];
49673
    v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u));
49674
    v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u))));
49675
    v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u))));
49676
    v_in0 = v_intermediate[16u];
49677
    v_in4 = v_intermediate[20u];
49678
    v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u));
49679
    v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u));
49680
    v_rd0 = ((uint32_t)(v_rcp + v_rb2));
49681
    v_rd1 = ((uint32_t)(v_rcm + v_rb6));
49682
    v_rd2 = ((uint32_t)(v_rcm - v_rb6));
49683
    v_rd3 = ((uint32_t)(v_rcp - v_rb2));
49684
    v_in1 = v_intermediate[17u];
49685
    v_in3 = v_intermediate[19u];
49686
    v_in5 = v_intermediate[21u];
49687
    v_in7 = v_intermediate[23u];
49688
    v_ri51 = ((uint32_t)(v_in5 + v_in1));
49689
    v_ri53 = ((uint32_t)(v_in5 + v_in3));
49690
    v_ri71 = ((uint32_t)(v_in7 + v_in1));
49691
    v_ri73 = ((uint32_t)(v_in7 + v_in3));
49692
    v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u));
49693
    v_rk1 = ((uint32_t)(v_in1 * 12299u));
49694
    v_rk3 = ((uint32_t)(v_in3 * 25172u));
49695
    v_rk5 = ((uint32_t)(v_in5 * 16819u));
49696
    v_rk7 = ((uint32_t)(v_in7 * 2446u));
49697
    v_ri51 *= 4294964100u;
49698
    v_ri53 *= 4294946301u;
49699
    v_ri71 *= 4294959923u;
49700
    v_ri73 *= 4294951227u;
49701
    v_rl51 = ((uint32_t)(v_ri51 + v_rj));
49702
    v_rl73 = ((uint32_t)(v_ri73 + v_rj));
49703
    v_rk1 += ((uint32_t)(v_ri71 + v_rl51));
49704
    v_rk3 += ((uint32_t)(v_ri53 + v_rl73));
49705
    v_rk5 += ((uint32_t)(v_ri53 + v_rl51));
49706
    v_rk7 += ((uint32_t)(v_ri71 + v_rl73));
49707
    if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
49708
      return wuffs_base__make_empty_struct();
49709
    }
49710
    a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)];
49711
    a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)];
49712
    a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)];
49713
    a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)];
49714
    a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)];
49715
    a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)];
49716
    a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)];
49717
    a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)];
49718
    a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
49719
  }
49720
  if (0u == (v_intermediate[25u] |
49721
      v_intermediate[26u] |
49722
      v_intermediate[27u] |
49723
      v_intermediate[28u] |
49724
      v_intermediate[29u] |
49725
      v_intermediate[30u] |
49726
      v_intermediate[31u])) {
49727
    if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
49728
      return wuffs_base__make_empty_struct();
49729
    }
49730
    a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[24u] + 16u)) >> 5u) & 1023u)];
49731
    a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u];
49732
    a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u];
49733
    a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u];
49734
    a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u];
49735
    a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u];
49736
    a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u];
49737
    a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u];
49738
    a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
49739
  } else {
49740
    v_in2 = v_intermediate[26u];
49741
    v_in6 = v_intermediate[30u];
49742
    v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u));
49743
    v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u))));
49744
    v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u))));
49745
    v_in0 = v_intermediate[24u];
49746
    v_in4 = v_intermediate[28u];
49747
    v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u));
49748
    v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u));
49749
    v_rd0 = ((uint32_t)(v_rcp + v_rb2));
49750
    v_rd1 = ((uint32_t)(v_rcm + v_rb6));
49751
    v_rd2 = ((uint32_t)(v_rcm - v_rb6));
49752
    v_rd3 = ((uint32_t)(v_rcp - v_rb2));
49753
    v_in1 = v_intermediate[25u];
49754
    v_in3 = v_intermediate[27u];
49755
    v_in5 = v_intermediate[29u];
49756
    v_in7 = v_intermediate[31u];
49757
    v_ri51 = ((uint32_t)(v_in5 + v_in1));
49758
    v_ri53 = ((uint32_t)(v_in5 + v_in3));
49759
    v_ri71 = ((uint32_t)(v_in7 + v_in1));
49760
    v_ri73 = ((uint32_t)(v_in7 + v_in3));
49761
    v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u));
49762
    v_rk1 = ((uint32_t)(v_in1 * 12299u));
49763
    v_rk3 = ((uint32_t)(v_in3 * 25172u));
49764
    v_rk5 = ((uint32_t)(v_in5 * 16819u));
49765
    v_rk7 = ((uint32_t)(v_in7 * 2446u));
49766
    v_ri51 *= 4294964100u;
49767
    v_ri53 *= 4294946301u;
49768
    v_ri71 *= 4294959923u;
49769
    v_ri73 *= 4294951227u;
49770
    v_rl51 = ((uint32_t)(v_ri51 + v_rj));
49771
    v_rl73 = ((uint32_t)(v_ri73 + v_rj));
49772
    v_rk1 += ((uint32_t)(v_ri71 + v_rl51));
49773
    v_rk3 += ((uint32_t)(v_ri53 + v_rl73));
49774
    v_rk5 += ((uint32_t)(v_ri53 + v_rl51));
49775
    v_rk7 += ((uint32_t)(v_ri71 + v_rl73));
49776
    if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
49777
      return wuffs_base__make_empty_struct();
49778
    }
49779
    a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)];
49780
    a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)];
49781
    a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)];
49782
    a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)];
49783
    a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)];
49784
    a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)];
49785
    a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)];
49786
    a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)];
49787
    a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
49788
  }
49789
  if (0u == (v_intermediate[33u] |
49790
      v_intermediate[34u] |
49791
      v_intermediate[35u] |
49792
      v_intermediate[36u] |
49793
      v_intermediate[37u] |
49794
      v_intermediate[38u] |
49795
      v_intermediate[39u])) {
49796
    if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
49797
      return wuffs_base__make_empty_struct();
49798
    }
49799
    a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[32u] + 16u)) >> 5u) & 1023u)];
49800
    a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u];
49801
    a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u];
49802
    a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u];
49803
    a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u];
49804
    a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u];
49805
    a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u];
49806
    a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u];
49807
    a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
49808
  } else {
49809
    v_in2 = v_intermediate[34u];
49810
    v_in6 = v_intermediate[38u];
49811
    v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u));
49812
    v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u))));
49813
    v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u))));
49814
    v_in0 = v_intermediate[32u];
49815
    v_in4 = v_intermediate[36u];
49816
    v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u));
49817
    v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u));
49818
    v_rd0 = ((uint32_t)(v_rcp + v_rb2));
49819
    v_rd1 = ((uint32_t)(v_rcm + v_rb6));
49820
    v_rd2 = ((uint32_t)(v_rcm - v_rb6));
49821
    v_rd3 = ((uint32_t)(v_rcp - v_rb2));
49822
    v_in1 = v_intermediate[33u];
49823
    v_in3 = v_intermediate[35u];
49824
    v_in5 = v_intermediate[37u];
49825
    v_in7 = v_intermediate[39u];
49826
    v_ri51 = ((uint32_t)(v_in5 + v_in1));
49827
    v_ri53 = ((uint32_t)(v_in5 + v_in3));
49828
    v_ri71 = ((uint32_t)(v_in7 + v_in1));
49829
    v_ri73 = ((uint32_t)(v_in7 + v_in3));
49830
    v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u));
49831
    v_rk1 = ((uint32_t)(v_in1 * 12299u));
49832
    v_rk3 = ((uint32_t)(v_in3 * 25172u));
49833
    v_rk5 = ((uint32_t)(v_in5 * 16819u));
49834
    v_rk7 = ((uint32_t)(v_in7 * 2446u));
49835
    v_ri51 *= 4294964100u;
49836
    v_ri53 *= 4294946301u;
49837
    v_ri71 *= 4294959923u;
49838
    v_ri73 *= 4294951227u;
49839
    v_rl51 = ((uint32_t)(v_ri51 + v_rj));
49840
    v_rl73 = ((uint32_t)(v_ri73 + v_rj));
49841
    v_rk1 += ((uint32_t)(v_ri71 + v_rl51));
49842
    v_rk3 += ((uint32_t)(v_ri53 + v_rl73));
49843
    v_rk5 += ((uint32_t)(v_ri53 + v_rl51));
49844
    v_rk7 += ((uint32_t)(v_ri71 + v_rl73));
49845
    if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
49846
      return wuffs_base__make_empty_struct();
49847
    }
49848
    a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)];
49849
    a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)];
49850
    a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)];
49851
    a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)];
49852
    a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)];
49853
    a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)];
49854
    a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)];
49855
    a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)];
49856
    a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
49857
  }
49858
  if (0u == (v_intermediate[41u] |
49859
      v_intermediate[42u] |
49860
      v_intermediate[43u] |
49861
      v_intermediate[44u] |
49862
      v_intermediate[45u] |
49863
      v_intermediate[46u] |
49864
      v_intermediate[47u])) {
49865
    if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
49866
      return wuffs_base__make_empty_struct();
49867
    }
49868
    a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[40u] + 16u)) >> 5u) & 1023u)];
49869
    a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u];
49870
    a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u];
49871
    a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u];
49872
    a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u];
49873
    a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u];
49874
    a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u];
49875
    a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u];
49876
    a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
49877
  } else {
49878
    v_in2 = v_intermediate[42u];
49879
    v_in6 = v_intermediate[46u];
49880
    v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u));
49881
    v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u))));
49882
    v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u))));
49883
    v_in0 = v_intermediate[40u];
49884
    v_in4 = v_intermediate[44u];
49885
    v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u));
49886
    v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u));
49887
    v_rd0 = ((uint32_t)(v_rcp + v_rb2));
49888
    v_rd1 = ((uint32_t)(v_rcm + v_rb6));
49889
    v_rd2 = ((uint32_t)(v_rcm - v_rb6));
49890
    v_rd3 = ((uint32_t)(v_rcp - v_rb2));
49891
    v_in1 = v_intermediate[41u];
49892
    v_in3 = v_intermediate[43u];
49893
    v_in5 = v_intermediate[45u];
49894
    v_in7 = v_intermediate[47u];
49895
    v_ri51 = ((uint32_t)(v_in5 + v_in1));
49896
    v_ri53 = ((uint32_t)(v_in5 + v_in3));
49897
    v_ri71 = ((uint32_t)(v_in7 + v_in1));
49898
    v_ri73 = ((uint32_t)(v_in7 + v_in3));
49899
    v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u));
49900
    v_rk1 = ((uint32_t)(v_in1 * 12299u));
49901
    v_rk3 = ((uint32_t)(v_in3 * 25172u));
49902
    v_rk5 = ((uint32_t)(v_in5 * 16819u));
49903
    v_rk7 = ((uint32_t)(v_in7 * 2446u));
49904
    v_ri51 *= 4294964100u;
49905
    v_ri53 *= 4294946301u;
49906
    v_ri71 *= 4294959923u;
49907
    v_ri73 *= 4294951227u;
49908
    v_rl51 = ((uint32_t)(v_ri51 + v_rj));
49909
    v_rl73 = ((uint32_t)(v_ri73 + v_rj));
49910
    v_rk1 += ((uint32_t)(v_ri71 + v_rl51));
49911
    v_rk3 += ((uint32_t)(v_ri53 + v_rl73));
49912
    v_rk5 += ((uint32_t)(v_ri53 + v_rl51));
49913
    v_rk7 += ((uint32_t)(v_ri71 + v_rl73));
49914
    if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
49915
      return wuffs_base__make_empty_struct();
49916
    }
49917
    a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)];
49918
    a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)];
49919
    a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)];
49920
    a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)];
49921
    a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)];
49922
    a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)];
49923
    a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)];
49924
    a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)];
49925
    a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
49926
  }
49927
  if (0u == (v_intermediate[49u] |
49928
      v_intermediate[50u] |
49929
      v_intermediate[51u] |
49930
      v_intermediate[52u] |
49931
      v_intermediate[53u] |
49932
      v_intermediate[54u] |
49933
      v_intermediate[55u])) {
49934
    if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
49935
      return wuffs_base__make_empty_struct();
49936
    }
49937
    a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[48u] + 16u)) >> 5u) & 1023u)];
49938
    a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u];
49939
    a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u];
49940
    a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u];
49941
    a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u];
49942
    a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u];
49943
    a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u];
49944
    a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u];
49945
    a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
49946
  } else {
49947
    v_in2 = v_intermediate[50u];
49948
    v_in6 = v_intermediate[54u];
49949
    v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u));
49950
    v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u))));
49951
    v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u))));
49952
    v_in0 = v_intermediate[48u];
49953
    v_in4 = v_intermediate[52u];
49954
    v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u));
49955
    v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u));
49956
    v_rd0 = ((uint32_t)(v_rcp + v_rb2));
49957
    v_rd1 = ((uint32_t)(v_rcm + v_rb6));
49958
    v_rd2 = ((uint32_t)(v_rcm - v_rb6));
49959
    v_rd3 = ((uint32_t)(v_rcp - v_rb2));
49960
    v_in1 = v_intermediate[49u];
49961
    v_in3 = v_intermediate[51u];
49962
    v_in5 = v_intermediate[53u];
49963
    v_in7 = v_intermediate[55u];
49964
    v_ri51 = ((uint32_t)(v_in5 + v_in1));
49965
    v_ri53 = ((uint32_t)(v_in5 + v_in3));
49966
    v_ri71 = ((uint32_t)(v_in7 + v_in1));
49967
    v_ri73 = ((uint32_t)(v_in7 + v_in3));
49968
    v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u));
49969
    v_rk1 = ((uint32_t)(v_in1 * 12299u));
49970
    v_rk3 = ((uint32_t)(v_in3 * 25172u));
49971
    v_rk5 = ((uint32_t)(v_in5 * 16819u));
49972
    v_rk7 = ((uint32_t)(v_in7 * 2446u));
49973
    v_ri51 *= 4294964100u;
49974
    v_ri53 *= 4294946301u;
49975
    v_ri71 *= 4294959923u;
49976
    v_ri73 *= 4294951227u;
49977
    v_rl51 = ((uint32_t)(v_ri51 + v_rj));
49978
    v_rl73 = ((uint32_t)(v_ri73 + v_rj));
49979
    v_rk1 += ((uint32_t)(v_ri71 + v_rl51));
49980
    v_rk3 += ((uint32_t)(v_ri53 + v_rl73));
49981
    v_rk5 += ((uint32_t)(v_ri53 + v_rl51));
49982
    v_rk7 += ((uint32_t)(v_ri71 + v_rl73));
49983
    if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
49984
      return wuffs_base__make_empty_struct();
49985
    }
49986
    a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)];
49987
    a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)];
49988
    a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)];
49989
    a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)];
49990
    a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)];
49991
    a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)];
49992
    a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)];
49993
    a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)];
49994
    a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
49995
  }
49996
  if (0u == (v_intermediate[57u] |
49997
      v_intermediate[58u] |
49998
      v_intermediate[59u] |
49999
      v_intermediate[60u] |
50000
      v_intermediate[61u] |
50001
      v_intermediate[62u] |
50002
      v_intermediate[63u])) {
50003
    if (8u > ((uint64_t)(a_dst_buffer.len))) {
50004
      return wuffs_base__make_empty_struct();
50005
    }
50006
    a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[56u] + 16u)) >> 5u) & 1023u)];
50007
    a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u];
50008
    a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u];
50009
    a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u];
50010
    a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u];
50011
    a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u];
50012
    a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u];
50013
    a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u];
50014
  } else {
50015
    v_in2 = v_intermediate[58u];
50016
    v_in6 = v_intermediate[62u];
50017
    v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u));
50018
    v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u))));
50019
    v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u))));
50020
    v_in0 = v_intermediate[56u];
50021
    v_in4 = v_intermediate[60u];
50022
    v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u));
50023
    v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u));
50024
    v_rd0 = ((uint32_t)(v_rcp + v_rb2));
50025
    v_rd1 = ((uint32_t)(v_rcm + v_rb6));
50026
    v_rd2 = ((uint32_t)(v_rcm - v_rb6));
50027
    v_rd3 = ((uint32_t)(v_rcp - v_rb2));
50028
    v_in1 = v_intermediate[57u];
50029
    v_in3 = v_intermediate[59u];
50030
    v_in5 = v_intermediate[61u];
50031
    v_in7 = v_intermediate[63u];
50032
    v_ri51 = ((uint32_t)(v_in5 + v_in1));
50033
    v_ri53 = ((uint32_t)(v_in5 + v_in3));
50034
    v_ri71 = ((uint32_t)(v_in7 + v_in1));
50035
    v_ri73 = ((uint32_t)(v_in7 + v_in3));
50036
    v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u));
50037
    v_rk1 = ((uint32_t)(v_in1 * 12299u));
50038
    v_rk3 = ((uint32_t)(v_in3 * 25172u));
50039
    v_rk5 = ((uint32_t)(v_in5 * 16819u));
50040
    v_rk7 = ((uint32_t)(v_in7 * 2446u));
50041
    v_ri51 *= 4294964100u;
50042
    v_ri53 *= 4294946301u;
50043
    v_ri71 *= 4294959923u;
50044
    v_ri73 *= 4294951227u;
50045
    v_rl51 = ((uint32_t)(v_ri51 + v_rj));
50046
    v_rl73 = ((uint32_t)(v_ri73 + v_rj));
50047
    v_rk1 += ((uint32_t)(v_ri71 + v_rl51));
50048
    v_rk3 += ((uint32_t)(v_ri53 + v_rl73));
50049
    v_rk5 += ((uint32_t)(v_ri53 + v_rl51));
50050
    v_rk7 += ((uint32_t)(v_ri71 + v_rl73));
50051
    if (8u > ((uint64_t)(a_dst_buffer.len))) {
50052
      return wuffs_base__make_empty_struct();
50053
    }
50054
    a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)];
50055
    a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)];
50056
    a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)];
50057
    a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)];
50058
    a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)];
50059
    a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)];
50060
    a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)];
50061
    a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)];
50062
  }
50063
  return wuffs_base__make_empty_struct();
50064
}
50065
50066
// โ€ผ WUFFS MULTI-FILE SECTION +x86_avx2
50067
// -------- func jpeg.decoder.decode_idct_x86_avx2
50068
50069
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
50070
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2")
50071
WUFFS_BASE__GENERATED_C_CODE
50072
static wuffs_base__empty_struct
50073
wuffs_jpeg__decoder__decode_idct_x86_avx2(
50074
    wuffs_jpeg__decoder* self,
50075
    wuffs_base__slice_u8 a_dst_buffer,
50076
    uint64_t a_dst_stride,
50077
    uint32_t a_q) {
50078
  __m256i v_k_0000 = {0};
50079
  __m256i v_k_8080 = {0};
50080
  __m256i v_k_0000_0002 = {0};
50081
  __m256i v_k_0001_FFFF = {0};
50082
  __m256i v_k_0400_0000 = {0};
50083
  __m256i v_k_29CF_1151_D630_1151 = {0};
50084
  __m256i v_k_E333_133E_ADFD_1051 = {0};
50085
  __m256i v_k_E6DC_25A1_1925_25A1 = {0};
50086
  __m256i v_k_ECC1_E333_EFB0_ADFD = {0};
50087
  __m128i v_az_coeffs = {0};
50088
  __m256i v_az_ah00 = {0};
50089
  __m256i v_az_ad00 = {0};
50090
  __m256i v_az_eh00 = {0};
50091
  __m256i v_az_adeh = {0};
50092
  __m256i v_rows01 = {0};
50093
  __m256i v_rows23 = {0};
50094
  __m256i v_rows45 = {0};
50095
  __m256i v_rows67 = {0};
50096
  __m256i v_quants01 = {0};
50097
  __m256i v_quants23 = {0};
50098
  __m256i v_quants45 = {0};
50099
  __m256i v_quants67 = {0};
50100
  __m256i v_rows04 = {0};
50101
  __m256i v_rows31 = {0};
50102
  __m256i v_rows26 = {0};
50103
  __m256i v_rows75 = {0};
50104
  __m256i v_fp_rows62 = {0};
50105
  __m256i v_fp_bq2662ad = {0};
50106
  __m256i v_fp_bq2662eh = {0};
50107
  __m256i v_fp_cb26ad = {0};
50108
  __m256i v_fp_cb26eh = {0};
50109
  __m256i v_fp_rows40pos = {0};
50110
  __m256i v_fp_rows04neg = {0};
50111
  __m256i v_fp_rows0pm4 = {0};
50112
  __m256i v_fp_ccpmad = {0};
50113
  __m256i v_fp_ccpmeh = {0};
50114
  __m256i v_fp_cd01ad = {0};
50115
  __m256i v_fp_cd01eh = {0};
50116
  __m256i v_fp_cd32ad = {0};
50117
  __m256i v_fp_cd32eh = {0};
50118
  __m256i v_fp_sums7351 = {0};
50119
  __m256i v_fp_sums5173 = {0};
50120
  __m256i v_fp_ci73515173ad = {0};
50121
  __m256i v_fp_ci73515173eh = {0};
50122
  __m256i v_fp_cl7351ad = {0};
50123
  __m256i v_fp_cl7351eh = {0};
50124
  __m256i v_fp_rows13 = {0};
50125
  __m256i v_fp_bq7153ad = {0};
50126
  __m256i v_fp_bq7153eh = {0};
50127
  __m256i v_fp_ck75ad = {0};
50128
  __m256i v_fp_ck75eh = {0};
50129
  __m256i v_fp_cl5173ad = {0};
50130
  __m256i v_fp_cl5173eh = {0};
50131
  __m256i v_fp_ck13ad = {0};
50132
  __m256i v_fp_ck13eh = {0};
50133
  __m256i v_intermediate01ad = {0};
50134
  __m256i v_intermediate01eh = {0};
50135
  __m256i v_intermediate01 = {0};
50136
  __m256i v_intermediate32ad = {0};
50137
  __m256i v_intermediate32eh = {0};
50138
  __m256i v_intermediate32 = {0};
50139
  __m256i v_intermediate45ad = {0};
50140
  __m256i v_intermediate45eh = {0};
50141
  __m256i v_intermediate45 = {0};
50142
  __m256i v_intermediate76ad = {0};
50143
  __m256i v_intermediate76eh = {0};
50144
  __m256i v_intermediate76 = {0};
50145
  __m256i v_ita0a1e0e1 = {0};
50146
  __m256i v_ita2a3e2e3 = {0};
50147
  __m256i v_ita4a5e4e5 = {0};
50148
  __m256i v_ita6a7e6e7 = {0};
50149
  __m256i v_ita0c0e0g0 = {0};
50150
  __m256i v_ita1c1e1g1 = {0};
50151
  __m256i v_ita4c4e4g4 = {0};
50152
  __m256i v_ita5c5e5g5 = {0};
50153
  __m256i v_ita0b0e0f0 = {0};
50154
  __m256i v_ita4b4e4f4 = {0};
50155
  __m256i v_itc0d0g0h0 = {0};
50156
  __m256i v_itc4d4g4h4 = {0};
50157
  __m256i v_intermediateae = {0};
50158
  __m256i v_intermediatebf = {0};
50159
  __m256i v_intermediatecg = {0};
50160
  __m256i v_intermediatedh = {0};
50161
  __m256i v_intermediatedb = {0};
50162
  __m256i v_intermediatehf = {0};
50163
  __m256i v_sp_cols62 = {0};
50164
  __m256i v_sp_bq2662ad = {0};
50165
  __m256i v_sp_bq2662eh = {0};
50166
  __m256i v_sp_rb26ad = {0};
50167
  __m256i v_sp_rb26eh = {0};
50168
  __m256i v_sp_cols40pos = {0};
50169
  __m256i v_sp_cols04neg = {0};
50170
  __m256i v_sp_cols0pm4 = {0};
50171
  __m256i v_sp_rcpmad = {0};
50172
  __m256i v_sp_rcpmeh = {0};
50173
  __m256i v_sp_rd01ad = {0};
50174
  __m256i v_sp_rd01eh = {0};
50175
  __m256i v_sp_rd32ad = {0};
50176
  __m256i v_sp_rd32eh = {0};
50177
  __m256i v_sp_sums7351 = {0};
50178
  __m256i v_sp_sums5173 = {0};
50179
  __m256i v_sp_ri73515173ad = {0};
50180
  __m256i v_sp_ri73515173eh = {0};
50181
  __m256i v_sp_rl7351ad = {0};
50182
  __m256i v_sp_rl7351eh = {0};
50183
  __m256i v_sp_cols13 = {0};
50184
  __m256i v_sp_bq7153ad = {0};
50185
  __m256i v_sp_bq7153eh = {0};
50186
  __m256i v_sp_rk75ad = {0};
50187
  __m256i v_sp_rk75eh = {0};
50188
  __m256i v_sp_rl5173ad = {0};
50189
  __m256i v_sp_rl5173eh = {0};
50190
  __m256i v_sp_rk13ad = {0};
50191
  __m256i v_sp_rk13eh = {0};
50192
  __m256i v_final01ad = {0};
50193
  __m256i v_final01eh = {0};
50194
  __m256i v_final01 = {0};
50195
  __m256i v_final32ad = {0};
50196
  __m256i v_final32eh = {0};
50197
  __m256i v_final32 = {0};
50198
  __m256i v_final45ad = {0};
50199
  __m256i v_final45eh = {0};
50200
  __m256i v_final45 = {0};
50201
  __m256i v_final76ad = {0};
50202
  __m256i v_final76eh = {0};
50203
  __m256i v_final76 = {0};
50204
  __m256i v_fta0a1e0e1 = {0};
50205
  __m256i v_fta2a3e2e3 = {0};
50206
  __m256i v_fta4a5e4e5 = {0};
50207
  __m256i v_fta6a7e6e7 = {0};
50208
  __m256i v_fta0c0e0g0 = {0};
50209
  __m256i v_fta1c1e1g1 = {0};
50210
  __m256i v_fta4c4e4g4 = {0};
50211
  __m256i v_fta5c5e5g5 = {0};
50212
  __m256i v_fta0b0e0f0 = {0};
50213
  __m256i v_ftc0d0g0h0 = {0};
50214
  __m256i v_fta4b4e4f4 = {0};
50215
  __m256i v_ftc4d4g4h4 = {0};
50216
  __m256i v_finalae = {0};
50217
  __m256i v_finalbf = {0};
50218
  __m256i v_finalcg = {0};
50219
  __m256i v_finaldh = {0};
50220
  __m256i v_final0145 = {0};
50221
  __m256i v_final2367 = {0};
50222
  uint64_t v_final0 = 0;
50223
  uint64_t v_final1 = 0;
50224
  uint64_t v_final2 = 0;
50225
  uint64_t v_final3 = 0;
50226
  uint64_t v_final4 = 0;
50227
  uint64_t v_final5 = 0;
50228
  uint64_t v_final6 = 0;
50229
  uint64_t v_final7 = 0;
50230
  wuffs_base__slice_u8 v_remaining = {0};
50231
50232
  if (8u > a_dst_stride) {
50233
    return wuffs_base__make_empty_struct();
50234
  }
50235
  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));
50236
  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));
50237
  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));
50238
  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));
50239
  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));
50240
  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));
50241
  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));
50242
  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));
50243
  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));
50244
  do {
50245
    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)))) {
50246
      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)));
50247
      if (0u == ((uint64_t)(_mm_cvtsi128_si64(_mm_packs_epi16(v_az_coeffs, v_az_coeffs))))) {
50248
        v_rows01 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 0u));
50249
        v_quants01 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_impl.f_quant_tables[a_q] + 0u));
50250
        v_rows01 = _mm256_mullo_epi16(v_rows01, v_quants01);
50251
        v_az_ah00 = _mm256_slli_epi16(v_rows01, (int32_t)(2u));
50252
        v_az_ad00 = _mm256_unpacklo_epi16(v_az_ah00, v_az_ah00);
50253
        v_az_eh00 = _mm256_unpackhi_epi16(v_az_ah00, v_az_ah00);
50254
        v_az_adeh = _mm256_inserti128_si256(v_az_ad00, _mm256_castsi256_si128(v_az_eh00), (int32_t)(1u));
50255
        v_intermediateae = _mm256_shuffle_epi32(v_az_adeh, (int32_t)(0u));
50256
        v_intermediatebf = _mm256_shuffle_epi32(v_az_adeh, (int32_t)(85u));
50257
        v_intermediatecg = _mm256_shuffle_epi32(v_az_adeh, (int32_t)(170u));
50258
        v_intermediatedh = _mm256_shuffle_epi32(v_az_adeh, (int32_t)(255u));
50259
        break;
50260
      }
50261
    }
50262
    v_rows01 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 0u));
50263
    v_rows23 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 16u));
50264
    v_rows45 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 32u));
50265
    v_rows67 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 48u));
50266
    v_quants01 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_impl.f_quant_tables[a_q] + 0u));
50267
    v_quants23 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_impl.f_quant_tables[a_q] + 16u));
50268
    v_quants45 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_impl.f_quant_tables[a_q] + 32u));
50269
    v_quants67 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_impl.f_quant_tables[a_q] + 48u));
50270
    v_rows01 = _mm256_mullo_epi16(v_rows01, v_quants01);
50271
    v_rows23 = _mm256_mullo_epi16(v_rows23, v_quants23);
50272
    v_rows45 = _mm256_mullo_epi16(v_rows45, v_quants45);
50273
    v_rows67 = _mm256_mullo_epi16(v_rows67, v_quants67);
50274
    v_rows04 = _mm256_permute2x128_si256(v_rows01, v_rows45, (int32_t)(32u));
50275
    v_rows31 = _mm256_permute2x128_si256(v_rows23, v_rows01, (int32_t)(49u));
50276
    v_rows26 = _mm256_permute2x128_si256(v_rows23, v_rows67, (int32_t)(32u));
50277
    v_rows75 = _mm256_permute2x128_si256(v_rows67, v_rows45, (int32_t)(49u));
50278
    v_fp_rows62 = _mm256_permute2x128_si256(v_rows26, v_rows26, (int32_t)(1u));
50279
    v_fp_bq2662ad = _mm256_unpacklo_epi16(v_rows26, v_fp_rows62);
50280
    v_fp_bq2662eh = _mm256_unpackhi_epi16(v_rows26, v_fp_rows62);
50281
    v_fp_cb26ad = _mm256_madd_epi16(v_fp_bq2662ad, v_k_29CF_1151_D630_1151);
50282
    v_fp_cb26eh = _mm256_madd_epi16(v_fp_bq2662eh, v_k_29CF_1151_D630_1151);
50283
    v_fp_rows40pos = _mm256_permute2x128_si256(v_rows04, v_rows04, (int32_t)(1u));
50284
    v_fp_rows04neg = _mm256_sign_epi16(v_rows04, v_k_0001_FFFF);
50285
    v_fp_rows0pm4 = _mm256_add_epi16(v_fp_rows40pos, v_fp_rows04neg);
50286
    v_fp_ccpmad = _mm256_srai_epi32(_mm256_unpacklo_epi16(v_k_0000, v_fp_rows0pm4), (int32_t)(3u));
50287
    v_fp_ccpmeh = _mm256_srai_epi32(_mm256_unpackhi_epi16(v_k_0000, v_fp_rows0pm4), (int32_t)(3u));
50288
    v_fp_cd01ad = _mm256_add_epi32(v_fp_ccpmad, v_fp_cb26ad);
50289
    v_fp_cd01eh = _mm256_add_epi32(v_fp_ccpmeh, v_fp_cb26eh);
50290
    v_fp_cd32ad = _mm256_sub_epi32(v_fp_ccpmad, v_fp_cb26ad);
50291
    v_fp_cd32eh = _mm256_sub_epi32(v_fp_ccpmeh, v_fp_cb26eh);
50292
    v_fp_sums7351 = _mm256_add_epi16(v_rows75, v_rows31);
50293
    v_fp_sums5173 = _mm256_permute2x128_si256(v_fp_sums7351, v_fp_sums7351, (int32_t)(1u));
50294
    v_fp_ci73515173ad = _mm256_unpacklo_epi16(v_fp_sums7351, v_fp_sums5173);
50295
    v_fp_ci73515173eh = _mm256_unpackhi_epi16(v_fp_sums7351, v_fp_sums5173);
50296
    v_fp_cl7351ad = _mm256_madd_epi16(v_fp_ci73515173ad, v_k_E6DC_25A1_1925_25A1);
50297
    v_fp_cl7351eh = _mm256_madd_epi16(v_fp_ci73515173eh, v_k_E6DC_25A1_1925_25A1);
50298
    v_fp_rows13 = _mm256_permute2x128_si256(v_rows31, v_rows31, (int32_t)(1u));
50299
    v_fp_bq7153ad = _mm256_unpacklo_epi16(v_rows75, v_fp_rows13);
50300
    v_fp_bq7153eh = _mm256_unpackhi_epi16(v_rows75, v_fp_rows13);
50301
    v_fp_ck75ad = _mm256_add_epi32(_mm256_madd_epi16(v_fp_bq7153ad, v_k_ECC1_E333_EFB0_ADFD), v_fp_cl7351ad);
50302
    v_fp_ck75eh = _mm256_add_epi32(_mm256_madd_epi16(v_fp_bq7153eh, v_k_ECC1_E333_EFB0_ADFD), v_fp_cl7351eh);
50303
    v_fp_cl5173ad = _mm256_permute2x128_si256(v_fp_cl7351ad, v_fp_cl7351ad, (int32_t)(1u));
50304
    v_fp_cl5173eh = _mm256_permute2x128_si256(v_fp_cl7351eh, v_fp_cl7351eh, (int32_t)(1u));
50305
    v_fp_ck13ad = _mm256_add_epi32(v_fp_cl5173ad, _mm256_madd_epi16(v_fp_bq7153ad, v_k_E333_133E_ADFD_1051));
50306
    v_fp_ck13eh = _mm256_add_epi32(v_fp_cl5173eh, _mm256_madd_epi16(v_fp_bq7153eh, v_k_E333_133E_ADFD_1051));
50307
    v_intermediate01ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_fp_cd01ad, v_fp_ck13ad), v_k_0400_0000), (int32_t)(11u));
50308
    v_intermediate01eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_fp_cd01eh, v_fp_ck13eh), v_k_0400_0000), (int32_t)(11u));
50309
    v_intermediate01 = _mm256_packs_epi32(v_intermediate01ad, v_intermediate01eh);
50310
    v_intermediate32ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_fp_cd32ad, v_fp_ck75ad), v_k_0400_0000), (int32_t)(11u));
50311
    v_intermediate32eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_fp_cd32eh, v_fp_ck75eh), v_k_0400_0000), (int32_t)(11u));
50312
    v_intermediate32 = _mm256_packs_epi32(v_intermediate32ad, v_intermediate32eh);
50313
    v_intermediate45ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_fp_cd32ad, v_fp_ck75ad), v_k_0400_0000), (int32_t)(11u));
50314
    v_intermediate45eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_fp_cd32eh, v_fp_ck75eh), v_k_0400_0000), (int32_t)(11u));
50315
    v_intermediate45 = _mm256_packs_epi32(v_intermediate45ad, v_intermediate45eh);
50316
    v_intermediate76ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_fp_cd01ad, v_fp_ck13ad), v_k_0400_0000), (int32_t)(11u));
50317
    v_intermediate76eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_fp_cd01eh, v_fp_ck13eh), v_k_0400_0000), (int32_t)(11u));
50318
    v_intermediate76 = _mm256_packs_epi32(v_intermediate76ad, v_intermediate76eh);
50319
    v_ita0a1e0e1 = _mm256_permute4x64_epi64(v_intermediate01, (int32_t)(216u));
50320
    v_ita2a3e2e3 = _mm256_permute4x64_epi64(v_intermediate32, (int32_t)(114u));
50321
    v_ita4a5e4e5 = _mm256_permute4x64_epi64(v_intermediate45, (int32_t)(216u));
50322
    v_ita6a7e6e7 = _mm256_permute4x64_epi64(v_intermediate76, (int32_t)(114u));
50323
    v_ita0c0e0g0 = _mm256_unpacklo_epi16(v_ita0a1e0e1, v_ita2a3e2e3);
50324
    v_ita1c1e1g1 = _mm256_unpackhi_epi16(v_ita0a1e0e1, v_ita2a3e2e3);
50325
    v_ita4c4e4g4 = _mm256_unpacklo_epi16(v_ita4a5e4e5, v_ita6a7e6e7);
50326
    v_ita5c5e5g5 = _mm256_unpackhi_epi16(v_ita4a5e4e5, v_ita6a7e6e7);
50327
    v_ita0b0e0f0 = _mm256_unpacklo_epi16(v_ita0c0e0g0, v_ita1c1e1g1);
50328
    v_itc0d0g0h0 = _mm256_unpackhi_epi16(v_ita0c0e0g0, v_ita1c1e1g1);
50329
    v_ita4b4e4f4 = _mm256_unpacklo_epi16(v_ita4c4e4g4, v_ita5c5e5g5);
50330
    v_itc4d4g4h4 = _mm256_unpackhi_epi16(v_ita4c4e4g4, v_ita5c5e5g5);
50331
    v_intermediateae = _mm256_unpacklo_epi64(v_ita0b0e0f0, v_ita4b4e4f4);
50332
    v_intermediatebf = _mm256_unpackhi_epi64(v_ita0b0e0f0, v_ita4b4e4f4);
50333
    v_intermediatecg = _mm256_unpacklo_epi64(v_itc0d0g0h0, v_itc4d4g4h4);
50334
    v_intermediatedh = _mm256_unpackhi_epi64(v_itc0d0g0h0, v_itc4d4g4h4);
50335
  } while (0);
50336
  v_intermediatedb = _mm256_permute2x128_si256(v_intermediatedh, v_intermediatebf, (int32_t)(32u));
50337
  v_intermediatehf = _mm256_permute2x128_si256(v_intermediatedh, v_intermediatebf, (int32_t)(49u));
50338
  v_sp_cols62 = _mm256_permute2x128_si256(v_intermediatecg, v_intermediatecg, (int32_t)(1u));
50339
  v_sp_bq2662ad = _mm256_unpacklo_epi16(v_intermediatecg, v_sp_cols62);
50340
  v_sp_bq2662eh = _mm256_unpackhi_epi16(v_intermediatecg, v_sp_cols62);
50341
  v_sp_rb26ad = _mm256_madd_epi16(v_sp_bq2662ad, v_k_29CF_1151_D630_1151);
50342
  v_sp_rb26eh = _mm256_madd_epi16(v_sp_bq2662eh, v_k_29CF_1151_D630_1151);
50343
  v_sp_cols40pos = _mm256_permute2x128_si256(v_intermediateae, v_intermediateae, (int32_t)(1u));
50344
  v_sp_cols04neg = _mm256_sign_epi16(v_intermediateae, v_k_0001_FFFF);
50345
  v_sp_cols0pm4 = _mm256_add_epi16(v_sp_cols40pos, v_sp_cols04neg);
50346
  v_sp_rcpmad = _mm256_srai_epi32(_mm256_unpacklo_epi16(v_k_0000, v_sp_cols0pm4), (int32_t)(3u));
50347
  v_sp_rcpmeh = _mm256_srai_epi32(_mm256_unpackhi_epi16(v_k_0000, v_sp_cols0pm4), (int32_t)(3u));
50348
  v_sp_rd01ad = _mm256_add_epi32(v_sp_rcpmad, v_sp_rb26ad);
50349
  v_sp_rd01eh = _mm256_add_epi32(v_sp_rcpmeh, v_sp_rb26eh);
50350
  v_sp_rd32ad = _mm256_sub_epi32(v_sp_rcpmad, v_sp_rb26ad);
50351
  v_sp_rd32eh = _mm256_sub_epi32(v_sp_rcpmeh, v_sp_rb26eh);
50352
  v_sp_sums7351 = _mm256_add_epi16(v_intermediatehf, v_intermediatedb);
50353
  v_sp_sums5173 = _mm256_permute2x128_si256(v_sp_sums7351, v_sp_sums7351, (int32_t)(1u));
50354
  v_sp_ri73515173ad = _mm256_unpacklo_epi16(v_sp_sums7351, v_sp_sums5173);
50355
  v_sp_ri73515173eh = _mm256_unpackhi_epi16(v_sp_sums7351, v_sp_sums5173);
50356
  v_sp_rl7351ad = _mm256_madd_epi16(v_sp_ri73515173ad, v_k_E6DC_25A1_1925_25A1);
50357
  v_sp_rl7351eh = _mm256_madd_epi16(v_sp_ri73515173eh, v_k_E6DC_25A1_1925_25A1);
50358
  v_sp_cols13 = _mm256_permute2x128_si256(v_intermediatedb, v_intermediatedb, (int32_t)(1u));
50359
  v_sp_bq7153ad = _mm256_unpacklo_epi16(v_intermediatehf, v_sp_cols13);
50360
  v_sp_bq7153eh = _mm256_unpackhi_epi16(v_intermediatehf, v_sp_cols13);
50361
  v_sp_rk75ad = _mm256_add_epi32(_mm256_madd_epi16(v_sp_bq7153ad, v_k_ECC1_E333_EFB0_ADFD), v_sp_rl7351ad);
50362
  v_sp_rk75eh = _mm256_add_epi32(_mm256_madd_epi16(v_sp_bq7153eh, v_k_ECC1_E333_EFB0_ADFD), v_sp_rl7351eh);
50363
  v_sp_rl5173ad = _mm256_permute2x128_si256(v_sp_rl7351ad, v_sp_rl7351ad, (int32_t)(1u));
50364
  v_sp_rl5173eh = _mm256_permute2x128_si256(v_sp_rl7351eh, v_sp_rl7351eh, (int32_t)(1u));
50365
  v_sp_rk13ad = _mm256_add_epi32(v_sp_rl5173ad, _mm256_madd_epi16(v_sp_bq7153ad, v_k_E333_133E_ADFD_1051));
50366
  v_sp_rk13eh = _mm256_add_epi32(v_sp_rl5173eh, _mm256_madd_epi16(v_sp_bq7153eh, v_k_E333_133E_ADFD_1051));
50367
  v_final01ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_sp_rd01ad, v_sp_rk13ad), v_k_0000_0002), (int32_t)(18u));
50368
  v_final01eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_sp_rd01eh, v_sp_rk13eh), v_k_0000_0002), (int32_t)(18u));
50369
  v_final01 = _mm256_packs_epi32(v_final01ad, v_final01eh);
50370
  v_final32ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_sp_rd32ad, v_sp_rk75ad), v_k_0000_0002), (int32_t)(18u));
50371
  v_final32eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_sp_rd32eh, v_sp_rk75eh), v_k_0000_0002), (int32_t)(18u));
50372
  v_final32 = _mm256_packs_epi32(v_final32ad, v_final32eh);
50373
  v_final45ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_sp_rd32ad, v_sp_rk75ad), v_k_0000_0002), (int32_t)(18u));
50374
  v_final45eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_sp_rd32eh, v_sp_rk75eh), v_k_0000_0002), (int32_t)(18u));
50375
  v_final45 = _mm256_packs_epi32(v_final45ad, v_final45eh);
50376
  v_final76ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_sp_rd01ad, v_sp_rk13ad), v_k_0000_0002), (int32_t)(18u));
50377
  v_final76eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_sp_rd01eh, v_sp_rk13eh), v_k_0000_0002), (int32_t)(18u));
50378
  v_final76 = _mm256_packs_epi32(v_final76ad, v_final76eh);
50379
  v_fta0a1e0e1 = _mm256_permute4x64_epi64(v_final01, (int32_t)(216u));
50380
  v_fta2a3e2e3 = _mm256_permute4x64_epi64(v_final32, (int32_t)(114u));
50381
  v_fta4a5e4e5 = _mm256_permute4x64_epi64(v_final45, (int32_t)(216u));
50382
  v_fta6a7e6e7 = _mm256_permute4x64_epi64(v_final76, (int32_t)(114u));
50383
  v_fta0c0e0g0 = _mm256_unpacklo_epi16(v_fta0a1e0e1, v_fta2a3e2e3);
50384
  v_fta1c1e1g1 = _mm256_unpackhi_epi16(v_fta0a1e0e1, v_fta2a3e2e3);
50385
  v_fta4c4e4g4 = _mm256_unpacklo_epi16(v_fta4a5e4e5, v_fta6a7e6e7);
50386
  v_fta5c5e5g5 = _mm256_unpackhi_epi16(v_fta4a5e4e5, v_fta6a7e6e7);
50387
  v_fta0b0e0f0 = _mm256_unpacklo_epi16(v_fta0c0e0g0, v_fta1c1e1g1);
50388
  v_ftc0d0g0h0 = _mm256_unpackhi_epi16(v_fta0c0e0g0, v_fta1c1e1g1);
50389
  v_fta4b4e4f4 = _mm256_unpacklo_epi16(v_fta4c4e4g4, v_fta5c5e5g5);
50390
  v_ftc4d4g4h4 = _mm256_unpackhi_epi16(v_fta4c4e4g4, v_fta5c5e5g5);
50391
  v_finalae = _mm256_unpacklo_epi64(v_fta0b0e0f0, v_fta4b4e4f4);
50392
  v_finalbf = _mm256_unpackhi_epi64(v_fta0b0e0f0, v_fta4b4e4f4);
50393
  v_finalcg = _mm256_unpacklo_epi64(v_ftc0d0g0h0, v_ftc4d4g4h4);
50394
  v_finaldh = _mm256_unpackhi_epi64(v_ftc0d0g0h0, v_ftc4d4g4h4);
50395
  v_final0145 = _mm256_add_epi8(_mm256_packs_epi16(v_finalae, v_finalbf), v_k_8080);
50396
  v_final2367 = _mm256_add_epi8(_mm256_packs_epi16(v_finalcg, v_finaldh), v_k_8080);
50397
  v_final0 = ((uint64_t)(_mm256_extract_epi64(v_final0145, (int32_t)(0u))));
50398
  v_final1 = ((uint64_t)(_mm256_extract_epi64(v_final0145, (int32_t)(1u))));
50399
  v_final2 = ((uint64_t)(_mm256_extract_epi64(v_final2367, (int32_t)(0u))));
50400
  v_final3 = ((uint64_t)(_mm256_extract_epi64(v_final2367, (int32_t)(1u))));
50401
  v_final4 = ((uint64_t)(_mm256_extract_epi64(v_final0145, (int32_t)(2u))));
50402
  v_final5 = ((uint64_t)(_mm256_extract_epi64(v_final0145, (int32_t)(3u))));
50403
  v_final6 = ((uint64_t)(_mm256_extract_epi64(v_final2367, (int32_t)(2u))));
50404
  v_final7 = ((uint64_t)(_mm256_extract_epi64(v_final2367, (int32_t)(3u))));
50405
  if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
50406
    return wuffs_base__make_empty_struct();
50407
  }
50408
  v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
50409
  wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final0);
50410
  a_dst_buffer = v_remaining;
50411
  if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
50412
    return wuffs_base__make_empty_struct();
50413
  }
50414
  v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
50415
  wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final1);
50416
  a_dst_buffer = v_remaining;
50417
  if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
50418
    return wuffs_base__make_empty_struct();
50419
  }
50420
  v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
50421
  wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final2);
50422
  a_dst_buffer = v_remaining;
50423
  if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
50424
    return wuffs_base__make_empty_struct();
50425
  }
50426
  v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
50427
  wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final3);
50428
  a_dst_buffer = v_remaining;
50429
  if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
50430
    return wuffs_base__make_empty_struct();
50431
  }
50432
  v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
50433
  wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final4);
50434
  a_dst_buffer = v_remaining;
50435
  if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
50436
    return wuffs_base__make_empty_struct();
50437
  }
50438
  v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
50439
  wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final5);
50440
  a_dst_buffer = v_remaining;
50441
  if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
50442
    return wuffs_base__make_empty_struct();
50443
  }
50444
  v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
50445
  wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final6);
50446
  a_dst_buffer = v_remaining;
50447
  if (8u > ((uint64_t)(a_dst_buffer.len))) {
50448
    return wuffs_base__make_empty_struct();
50449
  }
50450
  wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final7);
50451
  return wuffs_base__make_empty_struct();
50452
}
50453
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
50454
// โ€ผ WUFFS MULTI-FILE SECTION -x86_avx2
50455
50456
// -------- func jpeg.decoder.get_quirk
50457
50458
WUFFS_BASE__GENERATED_C_CODE
50459
WUFFS_BASE__MAYBE_STATIC uint64_t
50460
wuffs_jpeg__decoder__get_quirk(
50461
    const wuffs_jpeg__decoder* self,
50462
    uint32_t a_key) {
50463
  if (!self) {
50464
    return 0;
50465
  }
50466
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
50467
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
50468
    return 0;
50469
  }
50470
50471
  if (a_key == 2u) {
50472
    if (self->private_impl.f_use_lower_quality) {
50473
      return 18446744073709551615u;
50474
    }
50475
  } else if (a_key == 1162824704u) {
50476
    if (self->private_impl.f_reject_progressive_jpegs) {
50477
      return 1u;
50478
    }
50479
  }
50480
  return 0u;
50481
}
50482
50483
// -------- func jpeg.decoder.set_quirk
50484
50485
WUFFS_BASE__GENERATED_C_CODE
50486
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
50487
wuffs_jpeg__decoder__set_quirk(
50488
    wuffs_jpeg__decoder* self,
50489
    uint32_t a_key,
50490
    uint64_t a_value) {
50491
  if (!self) {
50492
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
50493
  }
50494
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
50495
    return wuffs_base__make_status(
50496
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
50497
        ? wuffs_base__error__disabled_by_previous_error
50498
        : wuffs_base__error__initialize_not_called);
50499
  }
50500
50501
  if (a_key == 2u) {
50502
    self->private_impl.f_use_lower_quality = (a_value >= 9223372036854775808u);
50503
    return wuffs_base__make_status(NULL);
50504
  } else if (a_key == 1162824704u) {
50505
    self->private_impl.f_reject_progressive_jpegs = (a_value != 0u);
50506
    return wuffs_base__make_status(NULL);
50507
  }
50508
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
50509
}
50510
50511
// -------- func jpeg.decoder.decode_image_config
50512
50513
WUFFS_BASE__GENERATED_C_CODE
50514
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
50515
wuffs_jpeg__decoder__decode_image_config(
50516
    wuffs_jpeg__decoder* self,
50517
    wuffs_base__image_config* a_dst,
50518
    wuffs_base__io_buffer* a_src) {
50519
  if (!self) {
50520
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
50521
  }
50522
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
50523
    return wuffs_base__make_status(
50524
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
50525
        ? wuffs_base__error__disabled_by_previous_error
50526
        : wuffs_base__error__initialize_not_called);
50527
  }
50528
  if (!a_src) {
50529
    self->private_impl.magic = WUFFS_BASE__DISABLED;
50530
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
50531
  }
50532
  if ((self->private_impl.active_coroutine != 0) &&
50533
      (self->private_impl.active_coroutine != 1)) {
50534
    self->private_impl.magic = WUFFS_BASE__DISABLED;
50535
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
50536
  }
50537
  self->private_impl.active_coroutine = 0;
50538
  wuffs_base__status status = wuffs_base__make_status(NULL);
50539
50540
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
50541
50542
  uint32_t coro_susp_point = self->private_impl.p_decode_image_config;
50543
  switch (coro_susp_point) {
50544
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
50545
50546
    while (true) {
50547
      {
50548
        wuffs_base__status t_0 = wuffs_jpeg__decoder__do_decode_image_config(self, a_dst, a_src);
50549
        v_status = t_0;
50550
      }
50551
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
50552
        status = wuffs_base__make_status(wuffs_jpeg__error__truncated_input);
50553
        goto exit;
50554
      }
50555
      status = v_status;
50556
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
50557
    }
50558
50559
    ok:
50560
    self->private_impl.p_decode_image_config = 0;
50561
    goto exit;
50562
  }
50563
50564
  goto suspend;
50565
  suspend:
50566
  self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
50567
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
50568
50569
  goto exit;
50570
  exit:
50571
  if (wuffs_base__status__is_error(&status)) {
50572
    self->private_impl.magic = WUFFS_BASE__DISABLED;
50573
  }
50574
  return status;
50575
}
50576
50577
// -------- func jpeg.decoder.do_decode_image_config
50578
50579
WUFFS_BASE__GENERATED_C_CODE
50580
static wuffs_base__status
50581
wuffs_jpeg__decoder__do_decode_image_config(
50582
    wuffs_jpeg__decoder* self,
50583
    wuffs_base__image_config* a_dst,
50584
    wuffs_base__io_buffer* a_src) {
50585
  wuffs_base__status status = wuffs_base__make_status(NULL);
50586
50587
  uint8_t v_c8 = 0;
50588
  uint8_t v_marker = 0;
50589
  uint32_t v_pixfmt = 0;
50590
50591
  const uint8_t* iop_a_src = NULL;
50592
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
50593
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
50594
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
50595
  if (a_src && a_src->data.ptr) {
50596
    io0_a_src = a_src->data.ptr;
50597
    io1_a_src = io0_a_src + a_src->meta.ri;
50598
    iop_a_src = io1_a_src;
50599
    io2_a_src = io0_a_src + a_src->meta.wi;
50600
  }
50601
50602
  uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config;
50603
  if (coro_susp_point) {
50604
    v_marker = self->private_data.s_do_decode_image_config.v_marker;
50605
  }
50606
  switch (coro_susp_point) {
50607
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
50608
50609
    if (self->private_impl.f_call_sequence != 0u) {
50610
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
50611
      goto exit;
50612
    }
50613
    {
50614
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
50615
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
50616
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
50617
        goto suspend;
50618
      }
50619
      uint8_t t_0 = *iop_a_src++;
50620
      v_c8 = t_0;
50621
    }
50622
    if (v_c8 != 255u) {
50623
      status = wuffs_base__make_status(wuffs_jpeg__error__bad_header);
50624
      goto exit;
50625
    }
50626
    {
50627
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
50628
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
50629
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
50630
        goto suspend;
50631
      }
50632
      uint8_t t_1 = *iop_a_src++;
50633
      v_c8 = t_1;
50634
    }
50635
    if (v_c8 != 216u) {
50636
      status = wuffs_base__make_status(wuffs_jpeg__error__bad_header);
50637
      goto exit;
50638
    }
50639
    while (true) {
50640
      while (true) {
50641
        {
50642
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
50643
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
50644
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
50645
            goto suspend;
50646
          }
50647
          uint8_t t_2 = *iop_a_src++;
50648
          v_c8 = t_2;
50649
        }
50650
        if (v_c8 == 255u) {
50651
          break;
50652
        }
50653
      }
50654
      while (true) {
50655
        {
50656
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
50657
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
50658
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
50659
            goto suspend;
50660
          }
50661
          uint8_t t_3 = *iop_a_src++;
50662
          v_c8 = t_3;
50663
        }
50664
        if (v_c8 != 255u) {
50665
          v_marker = v_c8;
50666
          break;
50667
        }
50668
      }
50669
      if (v_marker == 0u) {
50670
        continue;
50671
      } else if ((208u <= v_marker) && (v_marker <= 217u)) {
50672
        if (v_marker <= 215u) {
50673
          continue;
50674
        }
50675
      } else {
50676
        {
50677
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
50678
          uint32_t t_4;
50679
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
50680
            t_4 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src)));
50681
            iop_a_src += 2;
50682
          } else {
50683
            self->private_data.s_do_decode_image_config.scratch = 0;
50684
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
50685
            while (true) {
50686
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
50687
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
50688
                goto suspend;
50689
              }
50690
              uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
50691
              uint32_t num_bits_4 = ((uint32_t)(*scratch & 0xFFu));
50692
              *scratch >>= 8;
50693
              *scratch <<= 8;
50694
              *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_4);
50695
              if (num_bits_4 == 8) {
50696
                t_4 = ((uint32_t)(*scratch >> 48));
50697
                break;
50698
              }
50699
              num_bits_4 += 8u;
50700
              *scratch |= ((uint64_t)(num_bits_4));
50701
            }
50702
          }
50703
          self->private_impl.f_payload_length = t_4;
50704
        }
50705
        if (self->private_impl.f_payload_length < 2u) {
50706
          if ((v_marker == 254u) || ((224u <= v_marker) && (v_marker < 240u))) {
50707
            continue;
50708
          }
50709
          status = wuffs_base__make_status(wuffs_jpeg__error__bad_marker);
50710
          goto exit;
50711
        }
50712
        self->private_impl.f_payload_length -= 2u;
50713
      }
50714
      if (v_marker < 192u) {
50715
        status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker);
50716
        goto exit;
50717
      } else if (v_marker < 208u) {
50718
        if (v_marker <= 194u) {
50719
          if ((v_marker == 194u) && self->private_impl.f_reject_progressive_jpegs) {
50720
            status = wuffs_base__make_status(wuffs_jpeg__error__rejected_progressive_jpeg);
50721
            goto exit;
50722
          } else if (self->private_impl.f_sof_marker != 0u) {
50723
            status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker);
50724
            goto exit;
50725
          } else if (v_marker == 192u) {
50726
            if (self->private_impl.f_seen_dht[2u] ||
50727
                self->private_impl.f_seen_dht[3u] ||
50728
                self->private_impl.f_seen_dht[6u] ||
50729
                self->private_impl.f_seen_dht[7u]) {
50730
              status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker);
50731
              goto exit;
50732
            }
50733
          }
50734
          self->private_impl.f_sof_marker = v_marker;
50735
          if (a_src) {
50736
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
50737
          }
50738
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
50739
          status = wuffs_jpeg__decoder__decode_sof(self, a_src);
50740
          if (a_src) {
50741
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
50742
          }
50743
          if (status.repr) {
50744
            goto suspend;
50745
          }
50746
          break;
50747
        } else if (v_marker == 195u) {
50748
          status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_lossless_coding);
50749
          goto exit;
50750
        } else if (v_marker == 196u) {
50751
          if (a_src) {
50752
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
50753
          }
50754
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
50755
          status = wuffs_jpeg__decoder__decode_dht(self, a_src);
50756
          if (a_src) {
50757
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
50758
          }
50759
          if (status.repr) {
50760
            goto suspend;
50761
          }
50762
          continue;
50763
        } else if ((197u <= v_marker) && (v_marker <= 199u)) {
50764
          status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_hierarchical_coding);
50765
          goto exit;
50766
        } else if (v_marker == 200u) {
50767
          status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker);
50768
          goto exit;
50769
        } else {
50770
          status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_arithmetic_coding);
50771
          goto exit;
50772
        }
50773
      } else if (v_marker < 224u) {
50774
        if (v_marker < 218u) {
50775
          status = wuffs_base__make_status(wuffs_jpeg__error__bad_marker);
50776
          goto exit;
50777
        } else if (v_marker == 218u) {
50778
          status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker);
50779
          goto exit;
50780
        } else if (v_marker == 219u) {
50781
          if (a_src) {
50782
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
50783
          }
50784
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
50785
          status = wuffs_jpeg__decoder__decode_dqt(self, a_src);
50786
          if (a_src) {
50787
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
50788
          }
50789
          if (status.repr) {
50790
            goto suspend;
50791
          }
50792
          continue;
50793
        } else if (v_marker == 221u) {
50794
          if (a_src) {
50795
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
50796
          }
50797
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
50798
          status = wuffs_jpeg__decoder__decode_dri(self, a_src);
50799
          if (a_src) {
50800
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
50801
          }
50802
          if (status.repr) {
50803
            goto suspend;
50804
          }
50805
          continue;
50806
        } else {
50807
          status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker);
50808
          goto exit;
50809
        }
50810
      } else if (v_marker < 240u) {
50811
        if (a_src) {
50812
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
50813
        }
50814
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11);
50815
        status = wuffs_jpeg__decoder__decode_appn(self, a_src, v_marker);
50816
        if (a_src) {
50817
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
50818
        }
50819
        if (status.repr) {
50820
          goto suspend;
50821
        }
50822
        continue;
50823
      } else {
50824
        if (v_marker == 254u) {
50825
        } else {
50826
          status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker);
50827
          goto exit;
50828
        }
50829
      }
50830
      self->private_data.s_do_decode_image_config.scratch = self->private_impl.f_payload_length;
50831
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12);
50832
      if (self->private_data.s_do_decode_image_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
50833
        self->private_data.s_do_decode_image_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
50834
        iop_a_src = io2_a_src;
50835
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
50836
        goto suspend;
50837
      }
50838
      iop_a_src += self->private_data.s_do_decode_image_config.scratch;
50839
      self->private_impl.f_payload_length = 0u;
50840
    }
50841
    self->private_impl.choosy_decode_idct = (
50842
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
50843
        wuffs_base__cpu_arch__have_x86_avx2() ? &wuffs_jpeg__decoder__decode_idct_x86_avx2 :
50844
#endif
50845
        self->private_impl.choosy_decode_idct);
50846
    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)));
50847
    if (a_dst != NULL) {
50848
      v_pixfmt = 536870920u;
50849
      if (self->private_impl.f_num_components > 1u) {
50850
        v_pixfmt = 2415954056u;
50851
      }
50852
      wuffs_base__image_config__set(
50853
          a_dst,
50854
          v_pixfmt,
50855
          0u,
50856
          self->private_impl.f_width,
50857
          self->private_impl.f_height,
50858
          self->private_impl.f_frame_config_io_position,
50859
          true);
50860
    }
50861
    self->private_impl.f_call_sequence = 32u;
50862
50863
    goto ok;
50864
    ok:
50865
    self->private_impl.p_do_decode_image_config = 0;
50866
    goto exit;
50867
  }
50868
50869
  goto suspend;
50870
  suspend:
50871
  self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
50872
  self->private_data.s_do_decode_image_config.v_marker = v_marker;
50873
50874
  goto exit;
50875
  exit:
50876
  if (a_src && a_src->data.ptr) {
50877
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
50878
  }
50879
50880
  return status;
50881
}
50882
50883
// -------- func jpeg.decoder.decode_dqt
50884
50885
WUFFS_BASE__GENERATED_C_CODE
50886
static wuffs_base__status
50887
wuffs_jpeg__decoder__decode_dqt(
50888
    wuffs_jpeg__decoder* self,
50889
    wuffs_base__io_buffer* a_src) {
50890
  wuffs_base__status status = wuffs_base__make_status(NULL);
50891
50892
  uint8_t v_c8 = 0;
50893
  uint8_t v_q = 0;
50894
  uint32_t v_i = 0;
50895
50896
  const uint8_t* iop_a_src = NULL;
50897
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
50898
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
50899
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
50900
  if (a_src && a_src->data.ptr) {
50901
    io0_a_src = a_src->data.ptr;
50902
    io1_a_src = io0_a_src + a_src->meta.ri;
50903
    iop_a_src = io1_a_src;
50904
    io2_a_src = io0_a_src + a_src->meta.wi;
50905
  }
50906
50907
  uint32_t coro_susp_point = self->private_impl.p_decode_dqt;
50908
  if (coro_susp_point) {
50909
    v_q = self->private_data.s_decode_dqt.v_q;
50910
    v_i = self->private_data.s_decode_dqt.v_i;
50911
  }
50912
  switch (coro_susp_point) {
50913
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
50914
50915
    while (self->private_impl.f_payload_length > 0u) {
50916
      self->private_impl.f_payload_length -= 1u;
50917
      {
50918
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
50919
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
50920
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
50921
          goto suspend;
50922
        }
50923
        uint8_t t_0 = *iop_a_src++;
50924
        v_c8 = t_0;
50925
      }
50926
      if (((uint8_t)(v_c8 & 15u)) > 3u) {
50927
        status = wuffs_base__make_status(wuffs_jpeg__error__bad_dqt_marker);
50928
        goto exit;
50929
      }
50930
      v_q = ((uint8_t)(v_c8 & 15u));
50931
      if (((uint8_t)(v_c8 >> 4u)) == 1u) {
50932
        status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_precision);
50933
        goto exit;
50934
      } else if ((((uint8_t)(v_c8 >> 4u)) > 1u) || (self->private_impl.f_payload_length < 64u)) {
50935
        status = wuffs_base__make_status(wuffs_jpeg__error__bad_dqt_marker);
50936
        goto exit;
50937
      }
50938
      self->private_impl.f_payload_length -= 64u;
50939
      v_i = 0u;
50940
      while (v_i < 64u) {
50941
        v_i += 1u;
50942
        {
50943
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
50944
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
50945
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
50946
            goto suspend;
50947
          }
50948
          uint16_t t_1 = *iop_a_src++;
50949
          self->private_impl.f_quant_tables[v_q][WUFFS_JPEG__UNZIG[v_i]] = t_1;
50950
        }
50951
      }
50952
      self->private_impl.f_seen_dqt[v_q] = true;
50953
      if (self->private_impl.f_sof_marker == 0u) {
50954
        v_i = 0u;
50955
        while (v_i < 64u) {
50956
          self->private_impl.f_saved_quant_tables[v_q][v_i] = self->private_impl.f_quant_tables[v_q][v_i];
50957
          v_i += 1u;
50958
        }
50959
        self->private_impl.f_saved_seen_dqt[v_q] = true;
50960
      }
50961
    }
50962
50963
    goto ok;
50964
    ok:
50965
    self->private_impl.p_decode_dqt = 0;
50966
    goto exit;
50967
  }
50968
50969
  goto suspend;
50970
  suspend:
50971
  self->private_impl.p_decode_dqt = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
50972
  self->private_data.s_decode_dqt.v_q = v_q;
50973
  self->private_data.s_decode_dqt.v_i = v_i;
50974
50975
  goto exit;
50976
  exit:
50977
  if (a_src && a_src->data.ptr) {
50978
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
50979
  }
50980
50981
  return status;
50982
}
50983
50984
// -------- func jpeg.decoder.decode_dri
50985
50986
WUFFS_BASE__GENERATED_C_CODE
50987
static wuffs_base__status
50988
wuffs_jpeg__decoder__decode_dri(
50989
    wuffs_jpeg__decoder* self,
50990
    wuffs_base__io_buffer* a_src) {
50991
  wuffs_base__status status = wuffs_base__make_status(NULL);
50992
50993
  const uint8_t* iop_a_src = NULL;
50994
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
50995
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
50996
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
50997
  if (a_src && a_src->data.ptr) {
50998
    io0_a_src = a_src->data.ptr;
50999
    io1_a_src = io0_a_src + a_src->meta.ri;
51000
    iop_a_src = io1_a_src;
51001
    io2_a_src = io0_a_src + a_src->meta.wi;
51002
  }
51003
51004
  uint32_t coro_susp_point = self->private_impl.p_decode_dri;
51005
  switch (coro_susp_point) {
51006
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
51007
51008
    if (self->private_impl.f_payload_length != 2u) {
51009
      status = wuffs_base__make_status(wuffs_jpeg__error__bad_dri_marker);
51010
      goto exit;
51011
    }
51012
    self->private_impl.f_payload_length = 0u;
51013
    {
51014
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
51015
      uint16_t t_0;
51016
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
51017
        t_0 = wuffs_base__peek_u16be__no_bounds_check(iop_a_src);
51018
        iop_a_src += 2;
51019
      } else {
51020
        self->private_data.s_decode_dri.scratch = 0;
51021
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
51022
        while (true) {
51023
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
51024
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
51025
            goto suspend;
51026
          }
51027
          uint64_t* scratch = &self->private_data.s_decode_dri.scratch;
51028
          uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu));
51029
          *scratch >>= 8;
51030
          *scratch <<= 8;
51031
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0);
51032
          if (num_bits_0 == 8) {
51033
            t_0 = ((uint16_t)(*scratch >> 48));
51034
            break;
51035
          }
51036
          num_bits_0 += 8u;
51037
          *scratch |= ((uint64_t)(num_bits_0));
51038
        }
51039
      }
51040
      self->private_impl.f_restart_interval = t_0;
51041
    }
51042
    if (self->private_impl.f_sof_marker == 0u) {
51043
      self->private_impl.f_saved_restart_interval = self->private_impl.f_restart_interval;
51044
    }
51045
51046
    goto ok;
51047
    ok:
51048
    self->private_impl.p_decode_dri = 0;
51049
    goto exit;
51050
  }
51051
51052
  goto suspend;
51053
  suspend:
51054
  self->private_impl.p_decode_dri = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
51055
51056
  goto exit;
51057
  exit:
51058
  if (a_src && a_src->data.ptr) {
51059
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
51060
  }
51061
51062
  return status;
51063
}
51064
51065
// -------- func jpeg.decoder.decode_appn
51066
51067
WUFFS_BASE__GENERATED_C_CODE
51068
static wuffs_base__status
51069
wuffs_jpeg__decoder__decode_appn(
51070
    wuffs_jpeg__decoder* self,
51071
    wuffs_base__io_buffer* a_src,
51072
    uint8_t a_marker) {
51073
  wuffs_base__status status = wuffs_base__make_status(NULL);
51074
51075
  uint8_t v_c8 = 0;
51076
  uint32_t v_c32 = 0;
51077
51078
  const uint8_t* iop_a_src = NULL;
51079
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
51080
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
51081
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
51082
  if (a_src && a_src->data.ptr) {
51083
    io0_a_src = a_src->data.ptr;
51084
    io1_a_src = io0_a_src + a_src->meta.ri;
51085
    iop_a_src = io1_a_src;
51086
    io2_a_src = io0_a_src + a_src->meta.wi;
51087
  }
51088
51089
  uint32_t coro_susp_point = self->private_impl.p_decode_appn;
51090
  switch (coro_susp_point) {
51091
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
51092
51093
    do {
51094
      if (a_marker == 224u) {
51095
        if (self->private_impl.f_payload_length >= 5u) {
51096
          self->private_impl.f_payload_length -= 5u;
51097
          {
51098
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
51099
            uint32_t t_0;
51100
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
51101
              t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
51102
              iop_a_src += 4;
51103
            } else {
51104
              self->private_data.s_decode_appn.scratch = 0;
51105
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
51106
              while (true) {
51107
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
51108
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
51109
                  goto suspend;
51110
                }
51111
                uint64_t* scratch = &self->private_data.s_decode_appn.scratch;
51112
                uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
51113
                *scratch <<= 8;
51114
                *scratch >>= 8;
51115
                *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
51116
                if (num_bits_0 == 24) {
51117
                  t_0 = ((uint32_t)(*scratch));
51118
                  break;
51119
                }
51120
                num_bits_0 += 8u;
51121
                *scratch |= ((uint64_t)(num_bits_0)) << 56;
51122
              }
51123
            }
51124
            v_c32 = t_0;
51125
          }
51126
          if (v_c32 != 1179207242u) {
51127
            self->private_impl.f_payload_length = (65535u & (self->private_impl.f_payload_length + 1u));
51128
            break;
51129
          }
51130
          {
51131
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
51132
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
51133
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
51134
              goto suspend;
51135
            }
51136
            uint8_t t_1 = *iop_a_src++;
51137
            v_c8 = t_1;
51138
          }
51139
          self->private_impl.f_is_jfif = (v_c8 == 0u);
51140
        }
51141
      } else if (a_marker == 238u) {
51142
        if (self->private_impl.f_payload_length >= 12u) {
51143
          self->private_impl.f_payload_length -= 12u;
51144
          {
51145
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
51146
            uint32_t t_2;
51147
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
51148
              t_2 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
51149
              iop_a_src += 4;
51150
            } else {
51151
              self->private_data.s_decode_appn.scratch = 0;
51152
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
51153
              while (true) {
51154
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
51155
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
51156
                  goto suspend;
51157
                }
51158
                uint64_t* scratch = &self->private_data.s_decode_appn.scratch;
51159
                uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56));
51160
                *scratch <<= 8;
51161
                *scratch >>= 8;
51162
                *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2;
51163
                if (num_bits_2 == 24) {
51164
                  t_2 = ((uint32_t)(*scratch));
51165
                  break;
51166
                }
51167
                num_bits_2 += 8u;
51168
                *scratch |= ((uint64_t)(num_bits_2)) << 56;
51169
              }
51170
            }
51171
            v_c32 = t_2;
51172
          }
51173
          if (v_c32 != 1651467329u) {
51174
            self->private_impl.f_payload_length = (65535u & (self->private_impl.f_payload_length + 8u));
51175
            break;
51176
          }
51177
          {
51178
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
51179
            uint32_t t_3;
51180
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
51181
              t_3 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
51182
              iop_a_src += 4;
51183
            } else {
51184
              self->private_data.s_decode_appn.scratch = 0;
51185
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
51186
              while (true) {
51187
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
51188
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
51189
                  goto suspend;
51190
                }
51191
                uint64_t* scratch = &self->private_data.s_decode_appn.scratch;
51192
                uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56));
51193
                *scratch <<= 8;
51194
                *scratch >>= 8;
51195
                *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3;
51196
                if (num_bits_3 == 24) {
51197
                  t_3 = ((uint32_t)(*scratch));
51198
                  break;
51199
                }
51200
                num_bits_3 += 8u;
51201
                *scratch |= ((uint64_t)(num_bits_3)) << 56;
51202
              }
51203
            }
51204
            v_c32 = t_3;
51205
          }
51206
          if ((255u & v_c32) != 101u) {
51207
            self->private_impl.f_payload_length = (65535u & (self->private_impl.f_payload_length + 4u));
51208
            break;
51209
          }
51210
          {
51211
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
51212
            uint32_t t_4;
51213
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
51214
              t_4 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
51215
              iop_a_src += 4;
51216
            } else {
51217
              self->private_data.s_decode_appn.scratch = 0;
51218
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
51219
              while (true) {
51220
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
51221
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
51222
                  goto suspend;
51223
                }
51224
                uint64_t* scratch = &self->private_data.s_decode_appn.scratch;
51225
                uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56));
51226
                *scratch <<= 8;
51227
                *scratch >>= 8;
51228
                *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4;
51229
                if (num_bits_4 == 24) {
51230
                  t_4 = ((uint32_t)(*scratch));
51231
                  break;
51232
                }
51233
                num_bits_4 += 8u;
51234
                *scratch |= ((uint64_t)(num_bits_4)) << 56;
51235
              }
51236
            }
51237
            v_c32 = t_4;
51238
          }
51239
          if ((v_c32 >> 24u) == 0u) {
51240
            self->private_impl.f_is_adobe = 1u;
51241
          } else {
51242
            self->private_impl.f_is_adobe = 2u;
51243
          }
51244
        }
51245
      }
51246
    } while (0);
51247
    self->private_data.s_decode_appn.scratch = self->private_impl.f_payload_length;
51248
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
51249
    if (self->private_data.s_decode_appn.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
51250
      self->private_data.s_decode_appn.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
51251
      iop_a_src = io2_a_src;
51252
      status = wuffs_base__make_status(wuffs_base__suspension__short_read);
51253
      goto suspend;
51254
    }
51255
    iop_a_src += self->private_data.s_decode_appn.scratch;
51256
    self->private_impl.f_payload_length = 0u;
51257
51258
    goto ok;
51259
    ok:
51260
    self->private_impl.p_decode_appn = 0;
51261
    goto exit;
51262
  }
51263
51264
  goto suspend;
51265
  suspend:
51266
  self->private_impl.p_decode_appn = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
51267
51268
  goto exit;
51269
  exit:
51270
  if (a_src && a_src->data.ptr) {
51271
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
51272
  }
51273
51274
  return status;
51275
}
51276
51277
// -------- func jpeg.decoder.decode_sof
51278
51279
WUFFS_BASE__GENERATED_C_CODE
51280
static wuffs_base__status
51281
wuffs_jpeg__decoder__decode_sof(
51282
    wuffs_jpeg__decoder* self,
51283
    wuffs_base__io_buffer* a_src) {
51284
  wuffs_base__status status = wuffs_base__make_status(NULL);
51285
51286
  uint8_t v_c8 = 0;
51287
  uint8_t v_comp_h = 0;
51288
  uint8_t v_comp_v = 0;
51289
  uint32_t v_i = 0;
51290
  uint32_t v_j = 0;
51291
  bool v_has_h24 = false;
51292
  bool v_has_h3 = false;
51293
  bool v_has_v24 = false;
51294
  bool v_has_v3 = false;
51295
  uint32_t v_upper_bound = 0;
51296
  uint64_t v_wh0 = 0;
51297
  uint64_t v_wh1 = 0;
51298
  uint64_t v_wh2 = 0;
51299
  uint64_t v_wh3 = 0;
51300
  uint64_t v_progressive = 0;
51301
51302
  const uint8_t* iop_a_src = NULL;
51303
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
51304
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
51305
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
51306
  if (a_src && a_src->data.ptr) {
51307
    io0_a_src = a_src->data.ptr;
51308
    io1_a_src = io0_a_src + a_src->meta.ri;
51309
    iop_a_src = io1_a_src;
51310
    io2_a_src = io0_a_src + a_src->meta.wi;
51311
  }
51312
51313
  uint32_t coro_susp_point = self->private_impl.p_decode_sof;
51314
  if (coro_susp_point) {
51315
    v_i = self->private_data.s_decode_sof.v_i;
51316
  }
51317
  switch (coro_susp_point) {
51318
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
51319
51320
    if (self->private_impl.f_payload_length < 6u) {
51321
      status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker);
51322
      goto exit;
51323
    }
51324
    self->private_impl.f_payload_length -= 6u;
51325
    {
51326
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
51327
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
51328
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
51329
        goto suspend;
51330
      }
51331
      uint8_t t_0 = *iop_a_src++;
51332
      v_c8 = t_0;
51333
    }
51334
    if (v_c8 == 8u) {
51335
    } else if (v_c8 == 12u) {
51336
      status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_precision_12_bits);
51337
      goto exit;
51338
    } else if (v_c8 == 16u) {
51339
      status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_precision_16_bits);
51340
      goto exit;
51341
    } else {
51342
      status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_precision);
51343
      goto exit;
51344
    }
51345
    {
51346
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
51347
      uint32_t t_1;
51348
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
51349
        t_1 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src)));
51350
        iop_a_src += 2;
51351
      } else {
51352
        self->private_data.s_decode_sof.scratch = 0;
51353
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
51354
        while (true) {
51355
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
51356
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
51357
            goto suspend;
51358
          }
51359
          uint64_t* scratch = &self->private_data.s_decode_sof.scratch;
51360
          uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu));
51361
          *scratch >>= 8;
51362
          *scratch <<= 8;
51363
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1);
51364
          if (num_bits_1 == 8) {
51365
            t_1 = ((uint32_t)(*scratch >> 48));
51366
            break;
51367
          }
51368
          num_bits_1 += 8u;
51369
          *scratch |= ((uint64_t)(num_bits_1));
51370
        }
51371
      }
51372
      self->private_impl.f_height = t_1;
51373
    }
51374
    if (self->private_impl.f_height == 0u) {
51375
      status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_implicit_height);
51376
      goto exit;
51377
    }
51378
    {
51379
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
51380
      uint32_t t_2;
51381
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
51382
        t_2 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src)));
51383
        iop_a_src += 2;
51384
      } else {
51385
        self->private_data.s_decode_sof.scratch = 0;
51386
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
51387
        while (true) {
51388
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
51389
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
51390
            goto suspend;
51391
          }
51392
          uint64_t* scratch = &self->private_data.s_decode_sof.scratch;
51393
          uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu));
51394
          *scratch >>= 8;
51395
          *scratch <<= 8;
51396
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2);
51397
          if (num_bits_2 == 8) {
51398
            t_2 = ((uint32_t)(*scratch >> 48));
51399
            break;
51400
          }
51401
          num_bits_2 += 8u;
51402
          *scratch |= ((uint64_t)(num_bits_2));
51403
        }
51404
      }
51405
      self->private_impl.f_width = t_2;
51406
    }
51407
    if (self->private_impl.f_width == 0u) {
51408
      status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension);
51409
      goto exit;
51410
    }
51411
    {
51412
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
51413
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
51414
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
51415
        goto suspend;
51416
      }
51417
      uint8_t t_3 = *iop_a_src++;
51418
      v_c8 = t_3;
51419
    }
51420
    if ((v_c8 == 0u) || (v_c8 > 4u)) {
51421
      status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker);
51422
      goto exit;
51423
    } else if (v_c8 == 2u) {
51424
      status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_color_model);
51425
      goto exit;
51426
    }
51427
    self->private_impl.f_num_components = ((uint32_t)(v_c8));
51428
    if (self->private_impl.f_payload_length != (3u * self->private_impl.f_num_components)) {
51429
      status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker);
51430
      goto exit;
51431
    }
51432
    self->private_impl.f_payload_length = 0u;
51433
    v_i = 0u;
51434
    while (v_i < self->private_impl.f_num_components) {
51435
      {
51436
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
51437
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
51438
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
51439
          goto suspend;
51440
        }
51441
        uint8_t t_4 = *iop_a_src++;
51442
        self->private_impl.f_components_c[v_i] = t_4;
51443
      }
51444
      {
51445
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
51446
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
51447
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
51448
          goto suspend;
51449
        }
51450
        uint8_t t_5 = *iop_a_src++;
51451
        v_c8 = t_5;
51452
      }
51453
      v_comp_h = ((uint8_t)(v_c8 >> 4u));
51454
      v_comp_v = ((uint8_t)(v_c8 & 15u));
51455
      if ((v_comp_h == 0u) ||
51456
          (v_comp_h > 4u) ||
51457
          (v_comp_v == 0u) ||
51458
          (v_comp_v > 4u)) {
51459
        status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker);
51460
        goto exit;
51461
      }
51462
      self->private_impl.f_components_h[v_i] = v_comp_h;
51463
      if (self->private_impl.f_max_incl_components_h < self->private_impl.f_components_h[v_i]) {
51464
        self->private_impl.f_max_incl_components_h = self->private_impl.f_components_h[v_i];
51465
      }
51466
      self->private_impl.f_components_v[v_i] = v_comp_v;
51467
      if (self->private_impl.f_max_incl_components_v < self->private_impl.f_components_v[v_i]) {
51468
        self->private_impl.f_max_incl_components_v = self->private_impl.f_components_v[v_i];
51469
      }
51470
      {
51471
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
51472
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
51473
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
51474
          goto suspend;
51475
        }
51476
        uint8_t t_6 = *iop_a_src++;
51477
        v_c8 = t_6;
51478
      }
51479
      if (v_c8 >= 4u) {
51480
        status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker);
51481
        goto exit;
51482
      }
51483
      self->private_impl.f_components_tq[v_i] = v_c8;
51484
      v_j = 0u;
51485
      while (v_j < v_i) {
51486
        if (self->private_impl.f_components_c[v_j] == self->private_impl.f_components_c[v_i]) {
51487
          status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker);
51488
          goto exit;
51489
        }
51490
        v_j += 1u;
51491
      }
51492
      v_i += 1u;
51493
    }
51494
    if (self->private_impl.f_num_components == 1u) {
51495
      self->private_impl.f_max_incl_components_h = 1u;
51496
      self->private_impl.f_max_incl_components_v = 1u;
51497
      self->private_impl.f_components_h[0u] = 1u;
51498
      self->private_impl.f_components_v[0u] = 1u;
51499
    } else {
51500
      v_has_h24 = false;
51501
      v_has_h3 = false;
51502
      v_has_v24 = false;
51503
      v_has_v3 = false;
51504
      v_i = 0u;
51505
      while (v_i < self->private_impl.f_num_components) {
51506
        v_has_h24 = (v_has_h24 || (self->private_impl.f_components_h[v_i] == 2u) || (self->private_impl.f_components_h[v_i] == 4u));
51507
        v_has_h3 = (v_has_h3 || (self->private_impl.f_components_h[v_i] == 3u));
51508
        v_has_v24 = (v_has_v24 || (self->private_impl.f_components_v[v_i] == 2u) || (self->private_impl.f_components_v[v_i] == 4u));
51509
        v_has_v3 = (v_has_v3 || (self->private_impl.f_components_v[v_i] == 3u));
51510
        v_i += 1u;
51511
      }
51512
      if ((v_has_h24 && v_has_h3) || (v_has_v24 && v_has_v3)) {
51513
        status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_fractional_sampling);
51514
        goto exit;
51515
      }
51516
      if (self->private_impl.f_num_components == 4u) {
51517
        self->private_impl.f_is_rgb_or_cmyk = (self->private_impl.f_is_adobe < 2u);
51518
      } else {
51519
        if (self->private_impl.f_is_jfif) {
51520
          self->private_impl.f_is_rgb_or_cmyk = false;
51521
        } else if (self->private_impl.f_is_adobe > 0u) {
51522
          self->private_impl.f_is_rgb_or_cmyk = (self->private_impl.f_is_adobe == 1u);
51523
        } else {
51524
          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));
51525
        }
51526
      }
51527
    }
51528
    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);
51529
    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);
51530
    v_upper_bound = 65544u;
51531
    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]))));
51532
    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]))));
51533
    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]))));
51534
    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]))));
51535
    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]))));
51536
    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]))));
51537
    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]))));
51538
    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]))));
51539
    v_wh0 = (((uint64_t)(self->private_impl.f_components_workbuf_widths[0u])) * ((uint64_t)(self->private_impl.f_components_workbuf_heights[0u])));
51540
    v_wh1 = (((uint64_t)(self->private_impl.f_components_workbuf_widths[1u])) * ((uint64_t)(self->private_impl.f_components_workbuf_heights[1u])));
51541
    v_wh2 = (((uint64_t)(self->private_impl.f_components_workbuf_widths[2u])) * ((uint64_t)(self->private_impl.f_components_workbuf_heights[2u])));
51542
    v_wh3 = (((uint64_t)(self->private_impl.f_components_workbuf_widths[3u])) * ((uint64_t)(self->private_impl.f_components_workbuf_heights[3u])));
51543
    v_progressive = 0u;
51544
    if (self->private_impl.f_sof_marker >= 194u) {
51545
      v_progressive = 2u;
51546
      v_i = 0u;
51547
      while (v_i < 4u) {
51548
        v_j = 0u;
51549
        while (v_j < 10u) {
51550
          self->private_impl.f_block_smoothing_lowest_scan_al[v_i][v_j] = 16u;
51551
          v_j += 1u;
51552
        }
51553
        v_i += 1u;
51554
      }
51555
    }
51556
    self->private_impl.f_components_workbuf_offsets[0u] = 0u;
51557
    self->private_impl.f_components_workbuf_offsets[1u] = (self->private_impl.f_components_workbuf_offsets[0u] + v_wh0);
51558
    self->private_impl.f_components_workbuf_offsets[2u] = (self->private_impl.f_components_workbuf_offsets[1u] + v_wh1);
51559
    self->private_impl.f_components_workbuf_offsets[3u] = (self->private_impl.f_components_workbuf_offsets[2u] + v_wh2);
51560
    self->private_impl.f_components_workbuf_offsets[4u] = (self->private_impl.f_components_workbuf_offsets[3u] + v_wh3);
51561
    self->private_impl.f_components_workbuf_offsets[5u] = (self->private_impl.f_components_workbuf_offsets[4u] + (v_wh0 * v_progressive));
51562
    self->private_impl.f_components_workbuf_offsets[6u] = (self->private_impl.f_components_workbuf_offsets[5u] + (v_wh1 * v_progressive));
51563
    self->private_impl.f_components_workbuf_offsets[7u] = (self->private_impl.f_components_workbuf_offsets[6u] + (v_wh2 * v_progressive));
51564
    self->private_impl.f_components_workbuf_offsets[8u] = (self->private_impl.f_components_workbuf_offsets[7u] + (v_wh3 * v_progressive));
51565
51566
    goto ok;
51567
    ok:
51568
    self->private_impl.p_decode_sof = 0;
51569
    goto exit;
51570
  }
51571
51572
  goto suspend;
51573
  suspend:
51574
  self->private_impl.p_decode_sof = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
51575
  self->private_data.s_decode_sof.v_i = v_i;
51576
51577
  goto exit;
51578
  exit:
51579
  if (a_src && a_src->data.ptr) {
51580
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
51581
  }
51582
51583
  return status;
51584
}
51585
51586
// -------- func jpeg.decoder.quantize_dimension
51587
51588
WUFFS_BASE__GENERATED_C_CODE
51589
static uint32_t
51590
wuffs_jpeg__decoder__quantize_dimension(
51591
    const wuffs_jpeg__decoder* self,
51592
    uint32_t a_width,
51593
    uint8_t a_h,
51594
    uint8_t a_max_incl_h) {
51595
  uint32_t v_ratio = 0;
51596
51597
  v_ratio = 0u;
51598
  if (a_h > 0u) {
51599
    v_ratio = ((uint32_t)(((uint8_t)(a_max_incl_h / a_h))));
51600
  }
51601
  if (v_ratio == 1u) {
51602
    return ((a_width + 7u) / 8u);
51603
  } else if (v_ratio == 2u) {
51604
    return ((a_width + 15u) / 16u);
51605
  } else if (v_ratio == 3u) {
51606
    return ((a_width + 23u) / 24u);
51607
  }
51608
  return ((a_width + 31u) / 32u);
51609
}
51610
51611
// -------- func jpeg.decoder.decode_frame_config
51612
51613
WUFFS_BASE__GENERATED_C_CODE
51614
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
51615
wuffs_jpeg__decoder__decode_frame_config(
51616
    wuffs_jpeg__decoder* self,
51617
    wuffs_base__frame_config* a_dst,
51618
    wuffs_base__io_buffer* a_src) {
51619
  if (!self) {
51620
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
51621
  }
51622
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
51623
    return wuffs_base__make_status(
51624
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
51625
        ? wuffs_base__error__disabled_by_previous_error
51626
        : wuffs_base__error__initialize_not_called);
51627
  }
51628
  if (!a_src) {
51629
    self->private_impl.magic = WUFFS_BASE__DISABLED;
51630
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
51631
  }
51632
  if ((self->private_impl.active_coroutine != 0) &&
51633
      (self->private_impl.active_coroutine != 2)) {
51634
    self->private_impl.magic = WUFFS_BASE__DISABLED;
51635
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
51636
  }
51637
  self->private_impl.active_coroutine = 0;
51638
  wuffs_base__status status = wuffs_base__make_status(NULL);
51639
51640
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
51641
51642
  uint32_t coro_susp_point = self->private_impl.p_decode_frame_config;
51643
  switch (coro_susp_point) {
51644
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
51645
51646
    while (true) {
51647
      {
51648
        wuffs_base__status t_0 = wuffs_jpeg__decoder__do_decode_frame_config(self, a_dst, a_src);
51649
        v_status = t_0;
51650
      }
51651
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
51652
        status = wuffs_base__make_status(wuffs_jpeg__error__truncated_input);
51653
        goto exit;
51654
      }
51655
      status = v_status;
51656
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
51657
    }
51658
51659
    ok:
51660
    self->private_impl.p_decode_frame_config = 0;
51661
    goto exit;
51662
  }
51663
51664
  goto suspend;
51665
  suspend:
51666
  self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
51667
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0;
51668
51669
  goto exit;
51670
  exit:
51671
  if (wuffs_base__status__is_error(&status)) {
51672
    self->private_impl.magic = WUFFS_BASE__DISABLED;
51673
  }
51674
  return status;
51675
}
51676
51677
// -------- func jpeg.decoder.do_decode_frame_config
51678
51679
WUFFS_BASE__GENERATED_C_CODE
51680
static wuffs_base__status
51681
wuffs_jpeg__decoder__do_decode_frame_config(
51682
    wuffs_jpeg__decoder* self,
51683
    wuffs_base__frame_config* a_dst,
51684
    wuffs_base__io_buffer* a_src) {
51685
  wuffs_base__status status = wuffs_base__make_status(NULL);
51686
51687
  const uint8_t* iop_a_src = NULL;
51688
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
51689
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
51690
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
51691
  if (a_src && a_src->data.ptr) {
51692
    io0_a_src = a_src->data.ptr;
51693
    io1_a_src = io0_a_src + a_src->meta.ri;
51694
    iop_a_src = io1_a_src;
51695
    io2_a_src = io0_a_src + a_src->meta.wi;
51696
  }
51697
51698
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config;
51699
  switch (coro_susp_point) {
51700
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
51701
51702
    if (self->private_impl.f_call_sequence == 32u) {
51703
    } else if (self->private_impl.f_call_sequence < 32u) {
51704
      if (a_src) {
51705
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
51706
      }
51707
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
51708
      status = wuffs_jpeg__decoder__do_decode_image_config(self, NULL, a_src);
51709
      if (a_src) {
51710
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
51711
      }
51712
      if (status.repr) {
51713
        goto suspend;
51714
      }
51715
    } else if (self->private_impl.f_call_sequence == 40u) {
51716
      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)))) {
51717
        status = wuffs_base__make_status(wuffs_base__error__bad_restart);
51718
        goto exit;
51719
      }
51720
    } else if (self->private_impl.f_call_sequence == 64u) {
51721
      self->private_impl.f_call_sequence = 96u;
51722
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
51723
      goto ok;
51724
    } else {
51725
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
51726
      goto ok;
51727
    }
51728
    if (a_dst != NULL) {
51729
      wuffs_base__frame_config__set(
51730
          a_dst,
51731
          wuffs_base__utility__make_rect_ie_u32(
51732
          0u,
51733
          0u,
51734
          self->private_impl.f_width,
51735
          self->private_impl.f_height),
51736
          ((wuffs_base__flicks)(0u)),
51737
          0u,
51738
          self->private_impl.f_frame_config_io_position,
51739
          0u,
51740
          true,
51741
          false,
51742
          4278190080u);
51743
    }
51744
    self->private_impl.f_call_sequence = 64u;
51745
51746
    ok:
51747
    self->private_impl.p_do_decode_frame_config = 0;
51748
    goto exit;
51749
  }
51750
51751
  goto suspend;
51752
  suspend:
51753
  self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
51754
51755
  goto exit;
51756
  exit:
51757
  if (a_src && a_src->data.ptr) {
51758
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
51759
  }
51760
51761
  return status;
51762
}
51763
51764
// -------- func jpeg.decoder.decode_frame
51765
51766
WUFFS_BASE__GENERATED_C_CODE
51767
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
51768
wuffs_jpeg__decoder__decode_frame(
51769
    wuffs_jpeg__decoder* self,
51770
    wuffs_base__pixel_buffer* a_dst,
51771
    wuffs_base__io_buffer* a_src,
51772
    wuffs_base__pixel_blend a_blend,
51773
    wuffs_base__slice_u8 a_workbuf,
51774
    wuffs_base__decode_frame_options* a_opts) {
51775
  if (!self) {
51776
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
51777
  }
51778
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
51779
    return wuffs_base__make_status(
51780
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
51781
        ? wuffs_base__error__disabled_by_previous_error
51782
        : wuffs_base__error__initialize_not_called);
51783
  }
51784
  if (!a_dst || !a_src) {
51785
    self->private_impl.magic = WUFFS_BASE__DISABLED;
51786
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
51787
  }
51788
  if ((self->private_impl.active_coroutine != 0) &&
51789
      (self->private_impl.active_coroutine != 3)) {
51790
    self->private_impl.magic = WUFFS_BASE__DISABLED;
51791
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
51792
  }
51793
  self->private_impl.active_coroutine = 0;
51794
  wuffs_base__status status = wuffs_base__make_status(NULL);
51795
51796
  wuffs_base__status v_ddf_status = wuffs_base__make_status(NULL);
51797
  wuffs_base__status v_swizzle_status = wuffs_base__make_status(NULL);
51798
  uint32_t v_scan_count = 0;
51799
51800
  uint32_t coro_susp_point = self->private_impl.p_decode_frame;
51801
  switch (coro_susp_point) {
51802
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
51803
51804
    while (true) {
51805
      v_scan_count = self->private_impl.f_scan_count;
51806
      {
51807
        wuffs_base__status t_0 = wuffs_jpeg__decoder__do_decode_frame(self,
51808
            a_dst,
51809
            a_src,
51810
            a_blend,
51811
            a_workbuf,
51812
            a_opts);
51813
        v_ddf_status = t_0;
51814
      }
51815
      if ((v_ddf_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
51816
        v_ddf_status = wuffs_base__make_status(wuffs_jpeg__error__truncated_input);
51817
      }
51818
      if ( ! self->private_impl.f_swizzle_immediately && (wuffs_base__status__is_error(&v_ddf_status) || (v_scan_count < self->private_impl.f_scan_count))) {
51819
        if (self->private_impl.f_sof_marker >= 194u) {
51820
          wuffs_jpeg__decoder__apply_progressive_idct(self, a_workbuf);
51821
        }
51822
        if (self->private_impl.f_num_components == 1u) {
51823
          v_swizzle_status = wuffs_jpeg__decoder__swizzle_gray(self,
51824
              a_dst,
51825
              a_workbuf,
51826
              0u,
51827
              4294967295u,
51828
              0u,
51829
              4294967295u,
51830
              ((uint64_t)(self->private_impl.f_components_workbuf_widths[0u])));
51831
        } else {
51832
          v_swizzle_status = wuffs_jpeg__decoder__swizzle_colorful(self,
51833
              a_dst,
51834
              a_workbuf,
51835
              0u,
51836
              4294967295u,
51837
              0u,
51838
              4294967295u);
51839
        }
51840
        if (wuffs_base__status__is_error(&v_ddf_status)) {
51841
          status = v_ddf_status;
51842
          goto exit;
51843
        } else if (wuffs_base__status__is_error(&v_swizzle_status)) {
51844
          status = v_swizzle_status;
51845
          goto exit;
51846
        }
51847
      }
51848
      status = v_ddf_status;
51849
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
51850
    }
51851
51852
    ok:
51853
    self->private_impl.p_decode_frame = 0;
51854
    goto exit;
51855
  }
51856
51857
  goto suspend;
51858
  suspend:
51859
  self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
51860
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0;
51861
51862
  goto exit;
51863
  exit:
51864
  if (wuffs_base__status__is_error(&status)) {
51865
    self->private_impl.magic = WUFFS_BASE__DISABLED;
51866
  }
51867
  return status;
51868
}
51869
51870
// -------- func jpeg.decoder.do_decode_frame
51871
51872
WUFFS_BASE__GENERATED_C_CODE
51873
static wuffs_base__status
51874
wuffs_jpeg__decoder__do_decode_frame(
51875
    wuffs_jpeg__decoder* self,
51876
    wuffs_base__pixel_buffer* a_dst,
51877
    wuffs_base__io_buffer* a_src,
51878
    wuffs_base__pixel_blend a_blend,
51879
    wuffs_base__slice_u8 a_workbuf,
51880
    wuffs_base__decode_frame_options* a_opts) {
51881
  wuffs_base__status status = wuffs_base__make_status(NULL);
51882
51883
  uint32_t v_pixfmt = 0;
51884
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
51885
  uint8_t v_c8 = 0;
51886
  uint8_t v_marker = 0;
51887
51888
  const uint8_t* iop_a_src = NULL;
51889
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
51890
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
51891
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
51892
  if (a_src && a_src->data.ptr) {
51893
    io0_a_src = a_src->data.ptr;
51894
    io1_a_src = io0_a_src + a_src->meta.ri;
51895
    iop_a_src = io1_a_src;
51896
    io2_a_src = io0_a_src + a_src->meta.wi;
51897
  }
51898
51899
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame;
51900
  if (coro_susp_point) {
51901
    v_marker = self->private_data.s_do_decode_frame.v_marker;
51902
  }
51903
  switch (coro_susp_point) {
51904
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
51905
51906
    if (self->private_impl.f_call_sequence == 64u) {
51907
    } else if (self->private_impl.f_call_sequence < 64u) {
51908
      if (a_src) {
51909
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
51910
      }
51911
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
51912
      status = wuffs_jpeg__decoder__do_decode_frame_config(self, NULL, a_src);
51913
      if (a_src) {
51914
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
51915
      }
51916
      if (status.repr) {
51917
        goto suspend;
51918
      }
51919
    } else {
51920
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
51921
      goto ok;
51922
    }
51923
    v_pixfmt = 536870920u;
51924
    if (self->private_impl.f_num_components > 1u) {
51925
      v_pixfmt = 2415954056u;
51926
    }
51927
    v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler,
51928
        wuffs_base__pixel_buffer__pixel_format(a_dst),
51929
        wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)),
51930
        wuffs_base__utility__make_pixel_format(v_pixfmt),
51931
        wuffs_base__utility__empty_slice_u8(),
51932
        a_blend);
51933
    if ( ! wuffs_base__status__is_ok(&v_status)) {
51934
      status = v_status;
51935
      if (wuffs_base__status__is_error(&status)) {
51936
        goto exit;
51937
      } else if (wuffs_base__status__is_suspension(&status)) {
51938
        status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
51939
        goto exit;
51940
      }
51941
      goto ok;
51942
    }
51943
    self->private_impl.f_swizzle_immediately = false;
51944
    if (self->private_impl.f_components_workbuf_offsets[8u] > ((uint64_t)(a_workbuf.len))) {
51945
      if ((self->private_impl.f_sof_marker >= 194u) ||  ! self->private_impl.f_use_lower_quality) {
51946
        status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length);
51947
        goto exit;
51948
      }
51949
      self->private_impl.f_swizzle_immediately = true;
51950
      self->private_impl.f_swizzle_immediately_status = wuffs_base__make_status(NULL);
51951
    } else if (self->private_impl.f_components_workbuf_offsets[4u] < self->private_impl.f_components_workbuf_offsets[8u]) {
51952
      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);
51953
    }
51954
    if (self->private_impl.f_components_workbuf_offsets[4u] <= ((uint64_t)(a_workbuf.len))) {
51955
      wuffs_private_impl__bulk_memset(a_workbuf.ptr, self->private_impl.f_components_workbuf_offsets[4u], 128u);
51956
    }
51957
    while (true) {
51958
      while (true) {
51959
        {
51960
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
51961
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
51962
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
51963
            goto suspend;
51964
          }
51965
          uint8_t t_0 = *iop_a_src++;
51966
          v_c8 = t_0;
51967
        }
51968
        if (v_c8 == 255u) {
51969
          break;
51970
        }
51971
      }
51972
      while (true) {
51973
        {
51974
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
51975
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
51976
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
51977
            goto suspend;
51978
          }
51979
          uint8_t t_1 = *iop_a_src++;
51980
          v_c8 = t_1;
51981
        }
51982
        if (v_c8 != 255u) {
51983
          v_marker = v_c8;
51984
          break;
51985
        }
51986
      }
51987
      if (v_marker == 0u) {
51988
        continue;
51989
      } else if ((208u <= v_marker) && (v_marker <= 217u)) {
51990
        if (v_marker <= 215u) {
51991
          continue;
51992
        }
51993
      } else {
51994
        {
51995
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
51996
          uint32_t t_2;
51997
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
51998
            t_2 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src)));
51999
            iop_a_src += 2;
52000
          } else {
52001
            self->private_data.s_do_decode_frame.scratch = 0;
52002
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
52003
            while (true) {
52004
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
52005
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
52006
                goto suspend;
52007
              }
52008
              uint64_t* scratch = &self->private_data.s_do_decode_frame.scratch;
52009
              uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu));
52010
              *scratch >>= 8;
52011
              *scratch <<= 8;
52012
              *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2);
52013
              if (num_bits_2 == 8) {
52014
                t_2 = ((uint32_t)(*scratch >> 48));
52015
                break;
52016
              }
52017
              num_bits_2 += 8u;
52018
              *scratch |= ((uint64_t)(num_bits_2));
52019
            }
52020
          }
52021
          self->private_impl.f_payload_length = t_2;
52022
        }
52023
        if (self->private_impl.f_payload_length < 2u) {
52024
          status = wuffs_base__make_status(wuffs_jpeg__error__bad_marker);
52025
          goto exit;
52026
        }
52027
        self->private_impl.f_payload_length -= 2u;
52028
      }
52029
      if (v_marker < 192u) {
52030
        status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker);
52031
        goto exit;
52032
      } else if (v_marker < 208u) {
52033
        if (v_marker == 196u) {
52034
          if (a_src) {
52035
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
52036
          }
52037
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
52038
          status = wuffs_jpeg__decoder__decode_dht(self, a_src);
52039
          if (a_src) {
52040
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
52041
          }
52042
          if (status.repr) {
52043
            goto suspend;
52044
          }
52045
          continue;
52046
        } else if (v_marker == 200u) {
52047
          status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker);
52048
          goto exit;
52049
        }
52050
        status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker);
52051
        goto exit;
52052
      } else if (v_marker < 224u) {
52053
        if (v_marker < 217u) {
52054
          status = wuffs_base__make_status(wuffs_jpeg__error__bad_marker);
52055
          goto exit;
52056
        } else if (v_marker == 217u) {
52057
          break;
52058
        } else if (v_marker == 218u) {
52059
          if (a_src) {
52060
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
52061
          }
52062
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
52063
          status = wuffs_jpeg__decoder__decode_sos(self, a_dst, a_src, a_workbuf);
52064
          if (a_src) {
52065
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
52066
          }
52067
          if (status.repr) {
52068
            goto suspend;
52069
          }
52070
          continue;
52071
        } else if (v_marker == 219u) {
52072
          if (a_src) {
52073
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
52074
          }
52075
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
52076
          status = wuffs_jpeg__decoder__decode_dqt(self, a_src);
52077
          if (a_src) {
52078
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
52079
          }
52080
          if (status.repr) {
52081
            goto suspend;
52082
          }
52083
          continue;
52084
        } else if (v_marker == 221u) {
52085
          if (a_src) {
52086
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
52087
          }
52088
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
52089
          status = wuffs_jpeg__decoder__decode_dri(self, a_src);
52090
          if (a_src) {
52091
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
52092
          }
52093
          if (status.repr) {
52094
            goto suspend;
52095
          }
52096
          continue;
52097
        } else {
52098
          status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker);
52099
          goto exit;
52100
        }
52101
      } else if (v_marker < 240u) {
52102
      } else {
52103
        if (v_marker == 254u) {
52104
        } else {
52105
          status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker);
52106
          goto exit;
52107
        }
52108
      }
52109
      self->private_data.s_do_decode_frame.scratch = self->private_impl.f_payload_length;
52110
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
52111
      if (self->private_data.s_do_decode_frame.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
52112
        self->private_data.s_do_decode_frame.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
52113
        iop_a_src = io2_a_src;
52114
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
52115
        goto suspend;
52116
      }
52117
      iop_a_src += self->private_data.s_do_decode_frame.scratch;
52118
      self->private_impl.f_payload_length = 0u;
52119
    }
52120
    self->private_impl.f_call_sequence = 96u;
52121
52122
    ok:
52123
    self->private_impl.p_do_decode_frame = 0;
52124
    goto exit;
52125
  }
52126
52127
  goto suspend;
52128
  suspend:
52129
  self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
52130
  self->private_data.s_do_decode_frame.v_marker = v_marker;
52131
52132
  goto exit;
52133
  exit:
52134
  if (a_src && a_src->data.ptr) {
52135
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
52136
  }
52137
52138
  return status;
52139
}
52140
52141
// -------- func jpeg.decoder.decode_dht
52142
52143
WUFFS_BASE__GENERATED_C_CODE
52144
static wuffs_base__status
52145
wuffs_jpeg__decoder__decode_dht(
52146
    wuffs_jpeg__decoder* self,
52147
    wuffs_base__io_buffer* a_src) {
52148
  wuffs_base__status status = wuffs_base__make_status(NULL);
52149
52150
  uint8_t v_c8 = 0;
52151
  uint8_t v_tc = 0;
52152
  uint8_t v_th = 0;
52153
  uint8_t v_tc4_th = 0;
52154
  uint32_t v_working_total_count = 0;
52155
  uint32_t v_total_count = 0;
52156
  uint32_t v_i = 0;
52157
  bool v_failed = false;
52158
52159
  const uint8_t* iop_a_src = NULL;
52160
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
52161
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
52162
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
52163
  if (a_src && a_src->data.ptr) {
52164
    io0_a_src = a_src->data.ptr;
52165
    io1_a_src = io0_a_src + a_src->meta.ri;
52166
    iop_a_src = io1_a_src;
52167
    io2_a_src = io0_a_src + a_src->meta.wi;
52168
  }
52169
52170
  uint32_t coro_susp_point = self->private_impl.p_decode_dht;
52171
  if (coro_susp_point) {
52172
    v_tc4_th = self->private_data.s_decode_dht.v_tc4_th;
52173
    v_total_count = self->private_data.s_decode_dht.v_total_count;
52174
    v_i = self->private_data.s_decode_dht.v_i;
52175
  }
52176
  switch (coro_susp_point) {
52177
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
52178
52179
    while (self->private_impl.f_payload_length > 0u) {
52180
      if (self->private_impl.f_payload_length < 17u) {
52181
        status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker);
52182
        goto exit;
52183
      }
52184
      self->private_impl.f_payload_length -= 17u;
52185
      {
52186
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
52187
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
52188
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
52189
          goto suspend;
52190
        }
52191
        uint8_t t_0 = *iop_a_src++;
52192
        v_c8 = t_0;
52193
      }
52194
      if ((((uint8_t)(v_c8 >> 4u)) > 1u) || (((uint8_t)(v_c8 & 15u)) > 3u)) {
52195
        status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker);
52196
        goto exit;
52197
      }
52198
      v_tc = ((uint8_t)(v_c8 >> 4u));
52199
      v_th = ((uint8_t)(v_c8 & 15u));
52200
      v_tc4_th = ((uint8_t)(((uint8_t)(((uint8_t)(v_tc * 4u)) | v_th))));
52201
      if ((self->private_impl.f_sof_marker == 192u) && (((uint8_t)(v_tc4_th & 3u)) > 1u)) {
52202
        status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker);
52203
        goto exit;
52204
      }
52205
      v_i = 0u;
52206
      while (v_i < 16u) {
52207
        {
52208
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
52209
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
52210
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
52211
            goto suspend;
52212
          }
52213
          uint8_t t_1 = *iop_a_src++;
52214
          self->private_data.f_dht_temp_counts[v_i] = t_1;
52215
        }
52216
        v_i += 1u;
52217
      }
52218
      v_working_total_count = 0u;
52219
      v_i = 0u;
52220
      while (v_i < 16u) {
52221
        v_working_total_count = ((v_working_total_count + ((uint32_t)(self->private_data.f_dht_temp_counts[v_i]))) & 65535u);
52222
        v_i += 1u;
52223
      }
52224
      if ((v_working_total_count <= 0u) || (256u < v_working_total_count)) {
52225
        status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker);
52226
        goto exit;
52227
      }
52228
      v_total_count = v_working_total_count;
52229
      if (self->private_impl.f_payload_length < v_total_count) {
52230
        status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker);
52231
        goto exit;
52232
      }
52233
      self->private_impl.f_payload_length -= v_total_count;
52234
      v_i = 0u;
52235
      while (v_i < v_total_count) {
52236
        {
52237
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
52238
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
52239
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
52240
            goto suspend;
52241
          }
52242
          uint8_t t_2 = *iop_a_src++;
52243
          self->private_impl.f_huff_tables_symbols[v_tc4_th][v_i] = t_2;
52244
        }
52245
        v_i += 1u;
52246
      }
52247
      while (v_i < 256u) {
52248
        self->private_impl.f_huff_tables_symbols[v_tc4_th][v_i] = 0u;
52249
        v_i += 1u;
52250
      }
52251
      if (((uint8_t)(v_tc4_th & 4u)) == 0u) {
52252
        v_i = 0u;
52253
        while (v_i < v_total_count) {
52254
          if (self->private_impl.f_huff_tables_symbols[v_tc4_th][v_i] > 15u) {
52255
            status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker);
52256
            goto exit;
52257
          }
52258
          v_i += 1u;
52259
        }
52260
      }
52261
      v_failed = wuffs_jpeg__decoder__calculate_huff_tables(self, v_tc4_th, v_total_count);
52262
      if (v_failed) {
52263
        status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker);
52264
        goto exit;
52265
      }
52266
      self->private_impl.f_seen_dht[v_tc4_th] = true;
52267
    }
52268
52269
    goto ok;
52270
    ok:
52271
    self->private_impl.p_decode_dht = 0;
52272
    goto exit;
52273
  }
52274
52275
  goto suspend;
52276
  suspend:
52277
  self->private_impl.p_decode_dht = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
52278
  self->private_data.s_decode_dht.v_tc4_th = v_tc4_th;
52279
  self->private_data.s_decode_dht.v_total_count = v_total_count;
52280
  self->private_data.s_decode_dht.v_i = v_i;
52281
52282
  goto exit;
52283
  exit:
52284
  if (a_src && a_src->data.ptr) {
52285
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
52286
  }
52287
52288
  return status;
52289
}
52290
52291
// -------- func jpeg.decoder.calculate_huff_tables
52292
52293
WUFFS_BASE__GENERATED_C_CODE
52294
static bool
52295
wuffs_jpeg__decoder__calculate_huff_tables(
52296
    wuffs_jpeg__decoder* self,
52297
    uint8_t a_tc4_th,
52298
    uint32_t a_total_count) {
52299
  uint32_t v_i = 0;
52300
  uint8_t v_j = 0;
52301
  uint8_t v_k = 0;
52302
  uint32_t v_bit_length_minus_one = 0;
52303
  uint8_t v_bit_length = 0;
52304
  uint32_t v_bit_string = 0;
52305
  uint32_t v_slow = 0;
52306
  uint8_t v_prefix = 0;
52307
  uint16_t v_fast = 0;
52308
  uint32_t v_reps = 0;
52309
52310
  v_i = 0u;
52311
  v_k = 0u;
52312
  v_bit_length_minus_one = 0u;
52313
  while (v_i < a_total_count) {
52314
    while (v_k >= self->private_data.f_dht_temp_counts[v_bit_length_minus_one]) {
52315
      v_k = 0u;
52316
      v_bit_length_minus_one = ((v_bit_length_minus_one + 1u) & 15u);
52317
    }
52318
#if defined(__GNUC__)
52319
#pragma GCC diagnostic push
52320
#pragma GCC diagnostic ignored "-Wconversion"
52321
#endif
52322
    v_k += 1u;
52323
#if defined(__GNUC__)
52324
#pragma GCC diagnostic pop
52325
#endif
52326
    self->private_data.f_dht_temp_bit_lengths[v_i] = ((uint8_t)((v_bit_length_minus_one + 1u)));
52327
    v_i += 1u;
52328
  }
52329
  v_bit_length = 0u;
52330
  v_bit_string = 0u;
52331
  v_i = 0u;
52332
  while (v_i < a_total_count) {
52333
    while (v_bit_length < self->private_data.f_dht_temp_bit_lengths[v_i]) {
52334
      if (v_bit_length >= 16u) {
52335
        return true;
52336
      }
52337
#if defined(__GNUC__)
52338
#pragma GCC diagnostic push
52339
#pragma GCC diagnostic ignored "-Wconversion"
52340
#endif
52341
      v_bit_length += 1u;
52342
#if defined(__GNUC__)
52343
#pragma GCC diagnostic pop
52344
#endif
52345
      v_bit_string <<= 1u;
52346
    }
52347
    self->private_data.f_dht_temp_bit_strings[v_i] = ((uint16_t)(v_bit_string));
52348
    v_bit_string += 1u;
52349
    if ((v_bit_string >> v_bit_length) > 0u) {
52350
      return true;
52351
    }
52352
    v_i += 1u;
52353
  }
52354
  v_k = 0u;
52355
  v_bit_length_minus_one = 0u;
52356
  while (true) {
52357
    if (self->private_data.f_dht_temp_counts[v_bit_length_minus_one] == 0u) {
52358
      self->private_impl.f_huff_tables_slow[a_tc4_th][v_bit_length_minus_one] = 0u;
52359
    } else {
52360
      v_slow = (255u & ((uint32_t)(((uint32_t)(v_k)) - ((uint32_t)(self->private_data.f_dht_temp_bit_strings[v_k])))));
52361
#if defined(__GNUC__)
52362
#pragma GCC diagnostic push
52363
#pragma GCC diagnostic ignored "-Wconversion"
52364
#endif
52365
      v_k += self->private_data.f_dht_temp_counts[v_bit_length_minus_one];
52366
#if defined(__GNUC__)
52367
#pragma GCC diagnostic pop
52368
#endif
52369
      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));
52370
    }
52371
    v_bit_length_minus_one = ((v_bit_length_minus_one + 1u) & 15u);
52372
    if (v_bit_length_minus_one == 0u) {
52373
      break;
52374
    }
52375
  }
52376
  v_i = 0u;
52377
  while (v_i < 256u) {
52378
    self->private_impl.f_huff_tables_fast[a_tc4_th][v_i] = 65535u;
52379
    v_i += 1u;
52380
  }
52381
  v_j = 0u;
52382
  v_bit_length_minus_one = 0u;
52383
  while (v_bit_length_minus_one < 8u) {
52384
    v_k = 0u;
52385
    while (v_k < self->private_data.f_dht_temp_counts[v_bit_length_minus_one]) {
52386
      v_prefix = ((uint8_t)((((uint32_t)(self->private_data.f_dht_temp_bit_strings[v_j])) << (7u - v_bit_length_minus_one))));
52387
      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])))));
52388
      v_reps = (((uint32_t)(1u)) << (7u - v_bit_length_minus_one));
52389
      while (v_reps > 0u) {
52390
        self->private_impl.f_huff_tables_fast[a_tc4_th][v_prefix] = v_fast;
52391
#if defined(__GNUC__)
52392
#pragma GCC diagnostic push
52393
#pragma GCC diagnostic ignored "-Wconversion"
52394
#endif
52395
        v_prefix += 1u;
52396
#if defined(__GNUC__)
52397
#pragma GCC diagnostic pop
52398
#endif
52399
        v_reps -= 1u;
52400
      }
52401
#if defined(__GNUC__)
52402
#pragma GCC diagnostic push
52403
#pragma GCC diagnostic ignored "-Wconversion"
52404
#endif
52405
      v_k += 1u;
52406
      v_j += 1u;
52407
#if defined(__GNUC__)
52408
#pragma GCC diagnostic pop
52409
#endif
52410
    }
52411
    v_bit_length_minus_one += 1u;
52412
  }
52413
  return false;
52414
}
52415
52416
// -------- func jpeg.decoder.decode_sos
52417
52418
WUFFS_BASE__GENERATED_C_CODE
52419
static wuffs_base__status
52420
wuffs_jpeg__decoder__decode_sos(
52421
    wuffs_jpeg__decoder* self,
52422
    wuffs_base__pixel_buffer* a_dst,
52423
    wuffs_base__io_buffer* a_src,
52424
    wuffs_base__slice_u8 a_workbuf) {
52425
  wuffs_base__status status = wuffs_base__make_status(NULL);
52426
52427
  uint32_t v_my = 0;
52428
  uint32_t v_mx = 0;
52429
  uint32_t v_decode_mcu_result = 0;
52430
  uint32_t v_bitstream_length = 0;
52431
52432
  uint32_t coro_susp_point = self->private_impl.p_decode_sos;
52433
  if (coro_susp_point) {
52434
    v_my = self->private_data.s_decode_sos.v_my;
52435
    v_mx = self->private_data.s_decode_sos.v_mx;
52436
  }
52437
  switch (coro_susp_point) {
52438
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
52439
52440
    if (self->private_impl.f_scan_count >= 32u) {
52441
      status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_scan_count);
52442
      goto exit;
52443
    } else if ((self->private_impl.f_scan_count > 0u) &&  ! self->private_impl.f_expect_multiple_scans) {
52444
      status = wuffs_base__make_status(wuffs_jpeg__error__bad_scan_count);
52445
      goto exit;
52446
    }
52447
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
52448
    status = wuffs_jpeg__decoder__prepare_scan(self, a_src);
52449
    if (status.repr) {
52450
      goto suspend;
52451
    }
52452
    self->private_impl.f_next_restart_marker = 0u;
52453
    self->private_impl.f_mcu_previous_dc_values[0u] = 0u;
52454
    self->private_impl.f_mcu_previous_dc_values[1u] = 0u;
52455
    self->private_impl.f_mcu_previous_dc_values[2u] = 0u;
52456
    self->private_impl.f_mcu_previous_dc_values[3u] = 0u;
52457
    self->private_impl.f_restarts_remaining = self->private_impl.f_restart_interval;
52458
    self->private_impl.f_eob_run = 0u;
52459
    self->private_impl.f_bitstream_bits = 0u;
52460
    self->private_impl.f_bitstream_n_bits = 0u;
52461
    self->private_impl.f_bitstream_ri = 0u;
52462
    self->private_impl.f_bitstream_wi = 0u;
52463
    self->private_impl.f_bitstream_padding = 12345u;
52464
    wuffs_jpeg__decoder__fill_bitstream(self, a_src);
52465
    v_my = 0u;
52466
    while (v_my < self->private_impl.f_scan_height_in_mcus) {
52467
      v_mx = 0u;
52468
      while (v_mx < self->private_impl.f_scan_width_in_mcus) {
52469
        self->private_impl.f_mcu_current_block = 0u;
52470
        self->private_impl.f_mcu_zig_index = ((uint32_t)(self->private_impl.f_scan_ss));
52471
        if (self->private_impl.f_sof_marker >= 194u) {
52472
          wuffs_jpeg__decoder__load_mcu_blocks(self, v_mx, v_my, a_workbuf);
52473
        }
52474
        while (true) {
52475
          v_decode_mcu_result = wuffs_jpeg__decoder__decode_mcu(self,
52476
              a_dst,
52477
              a_workbuf,
52478
              v_mx,
52479
              v_my);
52480
          if (v_decode_mcu_result == 0u) {
52481
            break;
52482
          } else if (v_decode_mcu_result == 1u) {
52483
          } else if (v_decode_mcu_result == 2u) {
52484
            status = wuffs_base__make_status(wuffs_jpeg__error__internal_error_inconsistent_decoder_state);
52485
            goto exit;
52486
          } else {
52487
            status = self->private_impl.f_swizzle_immediately_status;
52488
            if (wuffs_base__status__is_error(&status)) {
52489
              goto exit;
52490
            } else if (wuffs_base__status__is_suspension(&status)) {
52491
              status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
52492
              goto exit;
52493
            }
52494
            goto ok;
52495
          }
52496
          while (true) {
52497
            v_bitstream_length = ((uint32_t)(self->private_impl.f_bitstream_wi - self->private_impl.f_bitstream_ri));
52498
            wuffs_jpeg__decoder__fill_bitstream(self, a_src);
52499
            if (v_bitstream_length < ((uint32_t)(self->private_impl.f_bitstream_wi - self->private_impl.f_bitstream_ri))) {
52500
              break;
52501
            } else if (self->private_impl.f_bitstream_padding == 0u) {
52502
              status = wuffs_base__make_status(wuffs_jpeg__error__short_sos_bitstream);
52503
              goto exit;
52504
            } else if ((a_src && a_src->meta.closed) &&  ! self->private_impl.f_bitstream_is_closed) {
52505
              if (self->private_impl.f_bitstream_wi < 1024u) {
52506
                wuffs_private_impl__bulk_memset(&self->private_data.f_bitstream_buffer[self->private_impl.f_bitstream_wi], 264u, 0u);
52507
                self->private_impl.f_bitstream_wi += 264u;
52508
                self->private_impl.f_bitstream_is_closed = true;
52509
              }
52510
              break;
52511
            }
52512
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
52513
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2);
52514
          }
52515
        }
52516
        if (self->private_impl.f_sof_marker >= 194u) {
52517
          wuffs_jpeg__decoder__save_mcu_blocks(self, v_mx, v_my, a_workbuf);
52518
        }
52519
        if (self->private_impl.f_restarts_remaining > 0u) {
52520
#if defined(__GNUC__)
52521
#pragma GCC diagnostic push
52522
#pragma GCC diagnostic ignored "-Wconversion"
52523
#endif
52524
          self->private_impl.f_restarts_remaining -= 1u;
52525
#if defined(__GNUC__)
52526
#pragma GCC diagnostic pop
52527
#endif
52528
          if (self->private_impl.f_restarts_remaining == 0u) {
52529
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
52530
            status = wuffs_jpeg__decoder__skip_past_the_next_restart_marker(self, a_src);
52531
            if (status.repr) {
52532
              goto suspend;
52533
            }
52534
            self->private_impl.f_mcu_previous_dc_values[0u] = 0u;
52535
            self->private_impl.f_mcu_previous_dc_values[1u] = 0u;
52536
            self->private_impl.f_mcu_previous_dc_values[2u] = 0u;
52537
            self->private_impl.f_mcu_previous_dc_values[3u] = 0u;
52538
            self->private_impl.f_restarts_remaining = self->private_impl.f_restart_interval;
52539
            self->private_impl.f_eob_run = 0u;
52540
            self->private_impl.f_bitstream_bits = 0u;
52541
            self->private_impl.f_bitstream_n_bits = 0u;
52542
            self->private_impl.f_bitstream_ri = 0u;
52543
            self->private_impl.f_bitstream_wi = 0u;
52544
            self->private_impl.f_bitstream_padding = 12345u;
52545
          }
52546
        }
52547
        v_mx += 1u;
52548
      }
52549
      v_my += 1u;
52550
    }
52551
    wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_scan_count, 1u);
52552
52553
    ok:
52554
    self->private_impl.p_decode_sos = 0;
52555
    goto exit;
52556
  }
52557
52558
  goto suspend;
52559
  suspend:
52560
  self->private_impl.p_decode_sos = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
52561
  self->private_data.s_decode_sos.v_my = v_my;
52562
  self->private_data.s_decode_sos.v_mx = v_mx;
52563
52564
  goto exit;
52565
  exit:
52566
  return status;
52567
}
52568
52569
// -------- func jpeg.decoder.prepare_scan
52570
52571
WUFFS_BASE__GENERATED_C_CODE
52572
static wuffs_base__status
52573
wuffs_jpeg__decoder__prepare_scan(
52574
    wuffs_jpeg__decoder* self,
52575
    wuffs_base__io_buffer* a_src) {
52576
  wuffs_base__status status = wuffs_base__make_status(NULL);
52577
52578
  uint8_t v_c8 = 0;
52579
  uint32_t v_i = 0;
52580
  uint32_t v_j = 0;
52581
  uint32_t v_j_max_incl = 0;
52582
  bool v_failed = false;
52583
52584
  const uint8_t* iop_a_src = NULL;
52585
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
52586
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
52587
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
52588
  if (a_src && a_src->data.ptr) {
52589
    io0_a_src = a_src->data.ptr;
52590
    io1_a_src = io0_a_src + a_src->meta.ri;
52591
    iop_a_src = io1_a_src;
52592
    io2_a_src = io0_a_src + a_src->meta.wi;
52593
  }
52594
52595
  uint32_t coro_susp_point = self->private_impl.p_prepare_scan;
52596
  if (coro_susp_point) {
52597
    v_i = self->private_data.s_prepare_scan.v_i;
52598
  }
52599
  switch (coro_susp_point) {
52600
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
52601
52602
    if ((self->private_impl.f_payload_length < 6u) || (self->private_impl.f_payload_length > 12u)) {
52603
      status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker);
52604
      goto exit;
52605
    }
52606
    {
52607
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
52608
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
52609
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
52610
        goto suspend;
52611
      }
52612
      uint8_t t_0 = *iop_a_src++;
52613
      v_c8 = t_0;
52614
    }
52615
    if ((v_c8 < 1u) || (v_c8 > 4u)) {
52616
      status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker);
52617
      goto exit;
52618
    }
52619
    self->private_impl.f_scan_num_components = ((uint32_t)(v_c8));
52620
    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)))) {
52621
      status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker);
52622
      goto exit;
52623
    }
52624
    self->private_impl.f_payload_length = 0u;
52625
    v_i = 0u;
52626
    while (v_i < self->private_impl.f_scan_num_components) {
52627
      {
52628
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
52629
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
52630
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
52631
          goto suspend;
52632
        }
52633
        uint8_t t_1 = *iop_a_src++;
52634
        v_c8 = t_1;
52635
      }
52636
      v_j = 0u;
52637
      while (true) {
52638
        if (v_j >= self->private_impl.f_num_components) {
52639
          status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker);
52640
          goto exit;
52641
        }
52642
        if (v_c8 == self->private_impl.f_components_c[v_j]) {
52643
          if ( ! self->private_impl.f_seen_dqt[self->private_impl.f_components_tq[v_j]]) {
52644
            status = wuffs_base__make_status(wuffs_jpeg__error__missing_quantization_table);
52645
            goto exit;
52646
          }
52647
          self->private_impl.f_scan_comps_cselector[v_i] = ((uint8_t)(v_j));
52648
          break;
52649
        }
52650
        v_j += 1u;
52651
      }
52652
      v_j = 0u;
52653
      while (v_j < v_i) {
52654
        if (self->private_impl.f_scan_comps_cselector[v_i] == self->private_impl.f_scan_comps_cselector[v_j]) {
52655
          status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker);
52656
          goto exit;
52657
        }
52658
        v_j += 1u;
52659
      }
52660
      {
52661
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
52662
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
52663
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
52664
          goto suspend;
52665
        }
52666
        uint8_t t_2 = *iop_a_src++;
52667
        v_c8 = t_2;
52668
      }
52669
      if ((((uint8_t)(v_c8 >> 4u)) > 3u) || (((uint8_t)(v_c8 & 15u)) > 3u)) {
52670
        status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker);
52671
        goto exit;
52672
      }
52673
      self->private_impl.f_scan_comps_td[v_i] = ((uint8_t)(v_c8 >> 4u));
52674
      self->private_impl.f_scan_comps_ta[v_i] = ((uint8_t)(v_c8 & 15u));
52675
      if (self->private_impl.f_sof_marker == 192u) {
52676
        if ((self->private_impl.f_scan_comps_td[v_i] > 1u) || (self->private_impl.f_scan_comps_ta[v_i] > 1u)) {
52677
          status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker);
52678
          goto exit;
52679
        }
52680
      }
52681
      v_i += 1u;
52682
    }
52683
    if (self->private_impl.f_scan_count == 0u) {
52684
      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));
52685
    }
52686
    if (self->private_impl.f_sof_marker < 194u) {
52687
      self->private_data.s_prepare_scan.scratch = 3u;
52688
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
52689
      if (self->private_data.s_prepare_scan.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
52690
        self->private_data.s_prepare_scan.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
52691
        iop_a_src = io2_a_src;
52692
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
52693
        goto suspend;
52694
      }
52695
      iop_a_src += self->private_data.s_prepare_scan.scratch;
52696
      self->private_impl.f_scan_ss = 0u;
52697
      self->private_impl.f_scan_se = 63u;
52698
      self->private_impl.f_scan_ah = 0u;
52699
      self->private_impl.f_scan_al = 0u;
52700
    } else {
52701
      {
52702
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
52703
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
52704
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
52705
          goto suspend;
52706
        }
52707
        uint8_t t_3 = *iop_a_src++;
52708
        v_c8 = t_3;
52709
      }
52710
      if (v_c8 > 63u) {
52711
        status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker);
52712
        goto exit;
52713
      }
52714
      self->private_impl.f_scan_ss = v_c8;
52715
      {
52716
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
52717
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
52718
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
52719
          goto suspend;
52720
        }
52721
        uint8_t t_4 = *iop_a_src++;
52722
        v_c8 = t_4;
52723
      }
52724
      if ((v_c8 > 63u) || (v_c8 < self->private_impl.f_scan_ss)) {
52725
        status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker);
52726
        goto exit;
52727
      }
52728
      self->private_impl.f_scan_se = v_c8;
52729
      {
52730
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
52731
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
52732
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
52733
          goto suspend;
52734
        }
52735
        uint8_t t_5 = *iop_a_src++;
52736
        v_c8 = t_5;
52737
      }
52738
      if ((((uint8_t)(v_c8 >> 4u)) > 14u) || (((uint8_t)(v_c8 & 15u)) > 13u)) {
52739
        status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker);
52740
        goto exit;
52741
      }
52742
      self->private_impl.f_scan_ah = ((uint8_t)(v_c8 >> 4u));
52743
      self->private_impl.f_scan_al = ((uint8_t)(v_c8 & 15u));
52744
      if (self->private_impl.f_scan_ah > 0u) {
52745
        if (((uint8_t)(self->private_impl.f_scan_ah - 1u)) != self->private_impl.f_scan_al) {
52746
          status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker);
52747
          goto exit;
52748
        }
52749
      }
52750
      if (self->private_impl.f_scan_ss == 0u) {
52751
        if (self->private_impl.f_scan_se != 0u) {
52752
          status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker);
52753
          goto exit;
52754
        } else if (self->private_impl.f_scan_ah == 0u) {
52755
          self->private_impl.choosy_decode_mcu = (
52756
              &wuffs_jpeg__decoder__decode_mcu_progressive_dc_high_bits);
52757
        } else {
52758
          self->private_impl.choosy_decode_mcu = (
52759
              &wuffs_jpeg__decoder__decode_mcu_progressive_dc_low_bit);
52760
        }
52761
      } else {
52762
        if (self->private_impl.f_scan_num_components != 1u) {
52763
          status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker);
52764
          goto exit;
52765
        } else if (self->private_impl.f_scan_ah == 0u) {
52766
          self->private_impl.choosy_decode_mcu = (
52767
              &wuffs_jpeg__decoder__decode_mcu_progressive_ac_high_bits);
52768
        } else {
52769
          self->private_impl.choosy_decode_mcu = (
52770
              &wuffs_jpeg__decoder__decode_mcu_progressive_ac_low_bit);
52771
        }
52772
      }
52773
    }
52774
    v_i = 0u;
52775
    while (v_i < self->private_impl.f_scan_num_components) {
52776
      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]))]) {
52777
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
52778
        status = wuffs_jpeg__decoder__use_default_huffman_table(self, ((uint8_t)(0u | self->private_impl.f_scan_comps_td[v_i])));
52779
        if (status.repr) {
52780
          goto suspend;
52781
        }
52782
      }
52783
      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]))]) {
52784
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
52785
        status = wuffs_jpeg__decoder__use_default_huffman_table(self, ((uint8_t)(4u | self->private_impl.f_scan_comps_ta[v_i])));
52786
        if (status.repr) {
52787
          goto suspend;
52788
        }
52789
      }
52790
      v_j = ((uint32_t)(self->private_impl.f_scan_ss));
52791
      v_j_max_incl = ((uint32_t)(wuffs_base__u8__min(self->private_impl.f_scan_se, 9u)));
52792
      while (v_j <= v_j_max_incl) {
52793
        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;
52794
        v_j += 1u;
52795
      }
52796
      v_i += 1u;
52797
    }
52798
    if (self->private_impl.f_scan_num_components == 1u) {
52799
      wuffs_jpeg__decoder__calculate_single_component_scan_fields(self);
52800
    } else {
52801
      v_failed = wuffs_jpeg__decoder__calculate_multiple_component_scan_fields(self);
52802
      if (v_failed) {
52803
        status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker);
52804
        goto exit;
52805
      }
52806
    }
52807
52808
    goto ok;
52809
    ok:
52810
    self->private_impl.p_prepare_scan = 0;
52811
    goto exit;
52812
  }
52813
52814
  goto suspend;
52815
  suspend:
52816
  self->private_impl.p_prepare_scan = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
52817
  self->private_data.s_prepare_scan.v_i = v_i;
52818
52819
  goto exit;
52820
  exit:
52821
  if (a_src && a_src->data.ptr) {
52822
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
52823
  }
52824
52825
  return status;
52826
}
52827
52828
// -------- func jpeg.decoder.use_default_huffman_table
52829
52830
WUFFS_BASE__GENERATED_C_CODE
52831
static wuffs_base__status
52832
wuffs_jpeg__decoder__use_default_huffman_table(
52833
    wuffs_jpeg__decoder* self,
52834
    uint8_t a_tc4_th) {
52835
  wuffs_base__status status = wuffs_base__make_status(NULL);
52836
52837
  wuffs_base__slice_u8 v_data = {0};
52838
  wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer();
52839
  wuffs_base__io_buffer* v_r = &u_r;
52840
  const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
52841
  const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
52842
  const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
52843
  const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
52844
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
52845
52846
  if (a_tc4_th == 0u) {
52847
    v_data = wuffs_base__make_slice_u8(wuffs_base__strip_const_from_u8_ptr(WUFFS_JPEG__DEFAULT_HUFF_TABLE_DC_LUMA), 29);
52848
  } else if (a_tc4_th == 1u) {
52849
    v_data = wuffs_base__make_slice_u8(wuffs_base__strip_const_from_u8_ptr(WUFFS_JPEG__DEFAULT_HUFF_TABLE_DC_CHROMA), 29);
52850
  } else if (a_tc4_th == 4u) {
52851
    v_data = wuffs_base__make_slice_u8(wuffs_base__strip_const_from_u8_ptr(WUFFS_JPEG__DEFAULT_HUFF_TABLE_AC_LUMA), 179);
52852
  } else if (a_tc4_th == 5u) {
52853
    v_data = wuffs_base__make_slice_u8(wuffs_base__strip_const_from_u8_ptr(WUFFS_JPEG__DEFAULT_HUFF_TABLE_AC_CHROMA), 179);
52854
  } else {
52855
    status = wuffs_base__make_status(wuffs_jpeg__error__missing_huffman_table);
52856
    goto exit;
52857
  }
52858
  {
52859
    wuffs_base__io_buffer* o_0_v_r = v_r;
52860
    const uint8_t* o_0_iop_v_r = iop_v_r;
52861
    const uint8_t* o_0_io0_v_r = io0_v_r;
52862
    const uint8_t* o_0_io1_v_r = io1_v_r;
52863
    const uint8_t* o_0_io2_v_r = io2_v_r;
52864
    v_r = wuffs_private_impl__io_reader__set(
52865
        &u_r,
52866
        &iop_v_r,
52867
        &io0_v_r,
52868
        &io1_v_r,
52869
        &io2_v_r,
52870
        v_data,
52871
        0u);
52872
    self->private_impl.f_payload_length = ((uint32_t)((((uint64_t)(v_data.len)) & 65535u)));
52873
    {
52874
      wuffs_base__status t_0 = wuffs_jpeg__decoder__decode_dht(self, v_r);
52875
      v_status = t_0;
52876
    }
52877
    v_r = o_0_v_r;
52878
    iop_v_r = o_0_iop_v_r;
52879
    io0_v_r = o_0_io0_v_r;
52880
    io1_v_r = o_0_io1_v_r;
52881
    io2_v_r = o_0_io2_v_r;
52882
  }
52883
  status = v_status;
52884
  if (wuffs_base__status__is_error(&status)) {
52885
    goto exit;
52886
  } else if (wuffs_base__status__is_suspension(&status)) {
52887
    status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
52888
    goto exit;
52889
  }
52890
  goto ok;
52891
52892
  ok:
52893
  goto exit;
52894
  exit:
52895
  return status;
52896
}
52897
52898
// -------- func jpeg.decoder.calculate_single_component_scan_fields
52899
52900
WUFFS_BASE__GENERATED_C_CODE
52901
static wuffs_base__empty_struct
52902
wuffs_jpeg__decoder__calculate_single_component_scan_fields(
52903
    wuffs_jpeg__decoder* self) {
52904
  uint8_t v_csel = 0;
52905
52906
  self->private_impl.f_scan_comps_bx_offset[0u] = 0u;
52907
  self->private_impl.f_scan_comps_by_offset[0u] = 0u;
52908
  self->private_impl.f_mcu_num_blocks = 1u;
52909
  self->private_impl.f_mcu_blocks_sselector[0u] = 0u;
52910
  v_csel = self->private_impl.f_scan_comps_cselector[0u];
52911
  self->private_impl.f_mcu_blocks_offset[0u] = self->private_impl.f_components_workbuf_offsets[v_csel];
52912
  self->private_impl.f_mcu_blocks_mx_mul[0u] = 8u;
52913
  self->private_impl.f_mcu_blocks_my_mul[0u] = (8u * self->private_impl.f_components_workbuf_widths[v_csel]);
52914
  self->private_impl.f_mcu_blocks_dc_hselector[0u] = ((uint8_t)(0u | self->private_impl.f_scan_comps_td[0u]));
52915
  self->private_impl.f_mcu_blocks_ac_hselector[0u] = ((uint8_t)(4u | self->private_impl.f_scan_comps_ta[0u]));
52916
  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);
52917
  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);
52918
  return wuffs_base__make_empty_struct();
52919
}
52920
52921
// -------- func jpeg.decoder.calculate_multiple_component_scan_fields
52922
52923
WUFFS_BASE__GENERATED_C_CODE
52924
static bool
52925
wuffs_jpeg__decoder__calculate_multiple_component_scan_fields(
52926
    wuffs_jpeg__decoder* self) {
52927
  uint32_t v_i = 0;
52928
  uint32_t v_h = 0;
52929
  uint32_t v_v = 0;
52930
  uint32_t v_hv = 0;
52931
  uint32_t v_total_hv = 0;
52932
  uint32_t v_b = 0;
52933
  uint32_t v_bx_offset = 0;
52934
  uint32_t v_by_offset = 0;
52935
  uint32_t v_sibo = 0;
52936
  uint8_t v_ssel = 0;
52937
  uint8_t v_csel = 0;
52938
52939
  v_total_hv = 0u;
52940
  v_i = 0u;
52941
  v_b = 0u;
52942
  v_bx_offset = 0u;
52943
  v_by_offset = 0u;
52944
  while (v_i < self->private_impl.f_scan_num_components) {
52945
    v_h = ((uint32_t)(self->private_impl.f_components_h[self->private_impl.f_scan_comps_cselector[v_i]]));
52946
    v_v = ((uint32_t)(self->private_impl.f_components_v[self->private_impl.f_scan_comps_cselector[v_i]]));
52947
    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]])));
52948
    self->private_impl.f_swizzle_immediately_c_offsets[v_i] = ((uint32_t)(64u * v_total_hv));
52949
    v_total_hv += v_hv;
52950
    while (v_hv > 0u) {
52951
      self->private_impl.f_scan_comps_bx_offset[(v_b & 15u)] = ((uint8_t)((v_bx_offset & 3u)));
52952
      self->private_impl.f_scan_comps_by_offset[(v_b & 15u)] = ((uint8_t)((v_by_offset & 3u)));
52953
      self->private_impl.f_mcu_blocks_sselector[(v_b & 15u)] = ((uint8_t)(v_i));
52954
      v_b += 1u;
52955
      v_bx_offset += 1u;
52956
      if (v_bx_offset == v_h) {
52957
        v_bx_offset = 0u;
52958
        v_by_offset += 1u;
52959
        if (v_by_offset == v_v) {
52960
          v_by_offset = 0u;
52961
        }
52962
      }
52963
      v_hv -= 1u;
52964
    }
52965
    v_i += 1u;
52966
  }
52967
  if (v_total_hv > 10u) {
52968
    return true;
52969
  }
52970
  self->private_impl.f_mcu_num_blocks = v_total_hv;
52971
  self->private_impl.f_swizzle_immediately_c_offsets[self->private_impl.f_scan_num_components] = ((uint32_t)(64u * v_total_hv));
52972
  v_b = 0u;
52973
  while (v_b < self->private_impl.f_mcu_num_blocks) {
52974
    v_ssel = self->private_impl.f_mcu_blocks_sselector[v_b];
52975
    v_csel = self->private_impl.f_scan_comps_cselector[v_ssel];
52976
    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]))));
52977
    self->private_impl.f_mcu_blocks_mx_mul[v_b] = (8u * ((uint32_t)(self->private_impl.f_components_h[v_csel])));
52978
    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]);
52979
    self->private_impl.f_mcu_blocks_dc_hselector[v_b] = ((uint8_t)(0u | self->private_impl.f_scan_comps_td[v_ssel]));
52980
    self->private_impl.f_mcu_blocks_ac_hselector[v_b] = ((uint8_t)(4u | self->private_impl.f_scan_comps_ta[v_ssel]));
52981
    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]))))));
52982
    self->private_impl.f_swizzle_immediately_b_offsets[v_b] = wuffs_base__u32__min(v_sibo, 576u);
52983
    v_b += 1u;
52984
  }
52985
  self->private_impl.f_scan_width_in_mcus = self->private_impl.f_width_in_mcus;
52986
  self->private_impl.f_scan_height_in_mcus = self->private_impl.f_height_in_mcus;
52987
  return false;
52988
}
52989
52990
// -------- func jpeg.decoder.fill_bitstream
52991
52992
WUFFS_BASE__GENERATED_C_CODE
52993
static wuffs_base__empty_struct
52994
wuffs_jpeg__decoder__fill_bitstream(
52995
    wuffs_jpeg__decoder* self,
52996
    wuffs_base__io_buffer* a_src) {
52997
  uint32_t v_wi = 0;
52998
  uint8_t v_c8 = 0;
52999
  uint32_t v_new_wi = 0;
53000
53001
  const uint8_t* iop_a_src = NULL;
53002
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
53003
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
53004
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
53005
  if (a_src && a_src->data.ptr) {
53006
    io0_a_src = a_src->data.ptr;
53007
    io1_a_src = io0_a_src + a_src->meta.ri;
53008
    iop_a_src = io1_a_src;
53009
    io2_a_src = io0_a_src + a_src->meta.wi;
53010
  }
53011
53012
  if (self->private_impl.f_bitstream_ri <= 0u) {
53013
  } else if (self->private_impl.f_bitstream_ri >= self->private_impl.f_bitstream_wi) {
53014
    self->private_impl.f_bitstream_ri = 0u;
53015
    self->private_impl.f_bitstream_wi = 0u;
53016
  } else {
53017
    v_wi = (self->private_impl.f_bitstream_wi - self->private_impl.f_bitstream_ri);
53018
    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,
53019
        self->private_impl.f_bitstream_ri,
53020
        self->private_impl.f_bitstream_wi));
53021
    self->private_impl.f_bitstream_ri = 0u;
53022
    self->private_impl.f_bitstream_wi = v_wi;
53023
  }
53024
  v_wi = self->private_impl.f_bitstream_wi;
53025
  while ((v_wi < 2048u) && (((uint64_t)(io2_a_src - iop_a_src)) > 0u)) {
53026
    v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
53027
    if (v_c8 < 255u) {
53028
      self->private_data.f_bitstream_buffer[v_wi] = v_c8;
53029
      v_wi += 1u;
53030
      iop_a_src += 1u;
53031
      continue;
53032
    } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 1u) {
53033
      break;
53034
    }
53035
    v_c8 = iop_a_src[1u];
53036
    if (v_c8 == 0u) {
53037
      self->private_data.f_bitstream_buffer[v_wi] = 255u;
53038
      v_wi += 1u;
53039
      iop_a_src += 2u;
53040
      continue;
53041
    } else if (v_c8 < 255u) {
53042
      break;
53043
    }
53044
    iop_a_src += 1u;
53045
  }
53046
  if (((uint64_t)(io2_a_src - iop_a_src)) > 1u) {
53047
    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)) {
53048
      v_new_wi = (wuffs_base__u32__min(v_wi, 1784u) + 264u);
53049
      v_new_wi = wuffs_base__u32__min(v_new_wi, (v_wi + self->private_impl.f_bitstream_padding));
53050
      if (v_wi < v_new_wi) {
53051
        wuffs_private_impl__u32__sat_sub_indirect(&self->private_impl.f_bitstream_padding, (v_new_wi - v_wi));
53052
        wuffs_private_impl__bulk_memset(&self->private_data.f_bitstream_buffer[v_wi], (v_new_wi - v_wi), 0u);
53053
        v_wi = v_new_wi;
53054
      }
53055
    }
53056
  }
53057
  self->private_impl.f_bitstream_wi = v_wi;
53058
  if (a_src && a_src->data.ptr) {
53059
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
53060
  }
53061
53062
  return wuffs_base__make_empty_struct();
53063
}
53064
53065
// -------- func jpeg.decoder.load_mcu_blocks_for_single_component
53066
53067
WUFFS_BASE__GENERATED_C_CODE
53068
static wuffs_base__empty_struct
53069
wuffs_jpeg__decoder__load_mcu_blocks_for_single_component(
53070
    wuffs_jpeg__decoder* self,
53071
    uint32_t a_mx,
53072
    uint32_t a_my,
53073
    wuffs_base__slice_u8 a_workbuf,
53074
    uint32_t a_csel) {
53075
  return (*self->private_impl.choosy_load_mcu_blocks_for_single_component)(self, a_mx, a_my, a_workbuf, a_csel);
53076
}
53077
53078
WUFFS_BASE__GENERATED_C_CODE
53079
static wuffs_base__empty_struct
53080
wuffs_jpeg__decoder__load_mcu_blocks_for_single_component__choosy_default(
53081
    wuffs_jpeg__decoder* self,
53082
    uint32_t a_mx,
53083
    uint32_t a_my,
53084
    wuffs_base__slice_u8 a_workbuf,
53085
    uint32_t a_csel) {
53086
  uint64_t v_stride16 = 0;
53087
  uint64_t v_offset = 0;
53088
53089
  v_stride16 = ((uint64_t)((self->private_impl.f_components_workbuf_widths[a_csel] * 16u)));
53090
  v_offset = (self->private_impl.f_components_workbuf_offsets[(a_csel | 4u)] + (((uint64_t)(a_mx)) * 128u) + (((uint64_t)(a_my)) * v_stride16));
53091
  if (v_offset <= ((uint64_t)(a_workbuf.len))) {
53092
    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));
53093
  }
53094
  return wuffs_base__make_empty_struct();
53095
}
53096
53097
// -------- func jpeg.decoder.load_mcu_blocks
53098
53099
WUFFS_BASE__GENERATED_C_CODE
53100
static wuffs_base__empty_struct
53101
wuffs_jpeg__decoder__load_mcu_blocks(
53102
    wuffs_jpeg__decoder* self,
53103
    uint32_t a_mx,
53104
    uint32_t a_my,
53105
    wuffs_base__slice_u8 a_workbuf) {
53106
  uint32_t v_b = 0;
53107
  uint8_t v_csel = 0;
53108
  uint64_t v_h = 0;
53109
  uint64_t v_v = 0;
53110
  uint64_t v_stride16 = 0;
53111
  uint64_t v_offset = 0;
53112
53113
  v_h = 1u;
53114
  v_v = 1u;
53115
  v_b = 0u;
53116
  while (v_b < self->private_impl.f_mcu_num_blocks) {
53117
    v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[v_b]];
53118
    if (self->private_impl.f_scan_num_components > 1u) {
53119
      v_h = ((uint64_t)(self->private_impl.f_components_h[v_csel]));
53120
      v_v = ((uint64_t)(self->private_impl.f_components_v[v_csel]));
53121
    }
53122
    v_stride16 = ((uint64_t)((self->private_impl.f_components_workbuf_widths[v_csel] * 16u)));
53123
    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));
53124
    if (v_offset <= ((uint64_t)(a_workbuf.len))) {
53125
      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));
53126
    }
53127
    v_b += 1u;
53128
  }
53129
  return wuffs_base__make_empty_struct();
53130
}
53131
53132
// -------- func jpeg.decoder.save_mcu_blocks
53133
53134
WUFFS_BASE__GENERATED_C_CODE
53135
static wuffs_base__empty_struct
53136
wuffs_jpeg__decoder__save_mcu_blocks(
53137
    wuffs_jpeg__decoder* self,
53138
    uint32_t a_mx,
53139
    uint32_t a_my,
53140
    wuffs_base__slice_u8 a_workbuf) {
53141
  uint32_t v_b = 0;
53142
  uint8_t v_csel = 0;
53143
  uint64_t v_h = 0;
53144
  uint64_t v_v = 0;
53145
  uint64_t v_stride16 = 0;
53146
  uint64_t v_offset = 0;
53147
53148
  v_h = 1u;
53149
  v_v = 1u;
53150
  v_b = 0u;
53151
  while (v_b < self->private_impl.f_mcu_num_blocks) {
53152
    v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[v_b]];
53153
    if (self->private_impl.f_scan_num_components > 1u) {
53154
      v_h = ((uint64_t)(self->private_impl.f_components_h[v_csel]));
53155
      v_v = ((uint64_t)(self->private_impl.f_components_v[v_csel]));
53156
    }
53157
    v_stride16 = ((uint64_t)((self->private_impl.f_components_workbuf_widths[v_csel] * 16u)));
53158
    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));
53159
    if (v_offset <= ((uint64_t)(a_workbuf.len))) {
53160
      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));
53161
    }
53162
    v_b += 1u;
53163
  }
53164
  return wuffs_base__make_empty_struct();
53165
}
53166
53167
// -------- func jpeg.decoder.skip_past_the_next_restart_marker
53168
53169
WUFFS_BASE__GENERATED_C_CODE
53170
static wuffs_base__status
53171
wuffs_jpeg__decoder__skip_past_the_next_restart_marker(
53172
    wuffs_jpeg__decoder* self,
53173
    wuffs_base__io_buffer* a_src) {
53174
  wuffs_base__status status = wuffs_base__make_status(NULL);
53175
53176
  uint8_t v_c8 = 0;
53177
53178
  const uint8_t* iop_a_src = NULL;
53179
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
53180
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
53181
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
53182
  if (a_src && a_src->data.ptr) {
53183
    io0_a_src = a_src->data.ptr;
53184
    io1_a_src = io0_a_src + a_src->meta.ri;
53185
    iop_a_src = io1_a_src;
53186
    io2_a_src = io0_a_src + a_src->meta.wi;
53187
  }
53188
53189
  uint32_t coro_susp_point = self->private_impl.p_skip_past_the_next_restart_marker;
53190
  switch (coro_susp_point) {
53191
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
53192
53193
    while (true) {
53194
      if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) {
53195
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
53196
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
53197
        continue;
53198
      } else if (wuffs_base__peek_u8be__no_bounds_check(iop_a_src) < 255u) {
53199
        iop_a_src += 1u;
53200
        continue;
53201
      }
53202
      v_c8 = ((uint8_t)(((uint16_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src) >> 8u))));
53203
      if (v_c8 < 192u) {
53204
        iop_a_src += 2u;
53205
        continue;
53206
      } else if ((v_c8 < 208u) || (215u < v_c8)) {
53207
        break;
53208
      }
53209
      v_c8 &= 7u;
53210
      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)))) {
53211
        break;
53212
      } 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)))) {
53213
        iop_a_src += 2u;
53214
        continue;
53215
      } else {
53216
        iop_a_src += 2u;
53217
        break;
53218
      }
53219
    }
53220
    self->private_impl.f_next_restart_marker = ((uint8_t)(((uint8_t)(self->private_impl.f_next_restart_marker + 1u)) & 7u));
53221
53222
    ok:
53223
    self->private_impl.p_skip_past_the_next_restart_marker = 0;
53224
    goto exit;
53225
  }
53226
53227
  goto suspend;
53228
  suspend:
53229
  self->private_impl.p_skip_past_the_next_restart_marker = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
53230
53231
  goto exit;
53232
  exit:
53233
  if (a_src && a_src->data.ptr) {
53234
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
53235
  }
53236
53237
  return status;
53238
}
53239
53240
// -------- func jpeg.decoder.apply_progressive_idct
53241
53242
WUFFS_BASE__GENERATED_C_CODE
53243
static wuffs_base__empty_struct
53244
wuffs_jpeg__decoder__apply_progressive_idct(
53245
    wuffs_jpeg__decoder* self,
53246
    wuffs_base__slice_u8 a_workbuf) {
53247
  uint32_t v_csel = 0;
53248
  bool v_block_smoothing_applicable = false;
53249
  uint32_t v_scan_width_in_mcus = 0;
53250
  uint32_t v_scan_height_in_mcus = 0;
53251
  uint32_t v_mcu_blocks_mx_mul_0 = 0;
53252
  uint32_t v_mcu_blocks_my_mul_0 = 0;
53253
  uint32_t v_my = 0;
53254
  uint32_t v_mx = 0;
53255
  uint64_t v_stride = 0;
53256
  uint64_t v_offset = 0;
53257
  uint8_t v_stashed_mcu_blocks_0[128] = {0};
53258
53259
  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));
53260
  v_block_smoothing_applicable = true;
53261
  v_csel = 0u;
53262
  while (v_csel < self->private_impl.f_num_components) {
53263
    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])))) {
53264
      v_block_smoothing_applicable = false;
53265
    }
53266
    v_csel += 1u;
53267
  }
53268
  v_csel = 0u;
53269
  while (v_csel < self->private_impl.f_num_components) {
53270
    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);
53271
    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);
53272
    v_mcu_blocks_mx_mul_0 = 8u;
53273
    v_mcu_blocks_my_mul_0 = (8u * self->private_impl.f_components_workbuf_widths[v_csel]);
53274
    if (v_block_smoothing_applicable && (0u != (self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][1u] |
53275
        self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][2u] |
53276
        self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][3u] |
53277
        self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][4u] |
53278
        self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][5u] |
53279
        self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][6u] |
53280
        self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][8u] |
53281
        self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][8u] |
53282
        self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][9u]))) {
53283
      self->private_impl.choosy_load_mcu_blocks_for_single_component = (
53284
          &wuffs_jpeg__decoder__load_mcu_blocks_for_single_component_smooth);
53285
      self->private_impl.f_block_smoothing_mx_max_incl = wuffs_base__u32__sat_sub(v_scan_width_in_mcus, 1u);
53286
      self->private_impl.f_block_smoothing_my_max_incl = wuffs_base__u32__sat_sub(v_scan_height_in_mcus, 1u);
53287
    } else {
53288
      self->private_impl.choosy_load_mcu_blocks_for_single_component = (
53289
          &wuffs_jpeg__decoder__load_mcu_blocks_for_single_component__choosy_default);
53290
    }
53291
    v_my = 0u;
53292
    while (v_my < v_scan_height_in_mcus) {
53293
      v_mx = 0u;
53294
      while (v_mx < v_scan_width_in_mcus) {
53295
        wuffs_jpeg__decoder__load_mcu_blocks_for_single_component(self,
53296
            v_mx,
53297
            v_my,
53298
            a_workbuf,
53299
            v_csel);
53300
        v_stride = ((uint64_t)(self->private_impl.f_components_workbuf_widths[v_csel]));
53301
        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))));
53302
        if (v_offset <= ((uint64_t)(a_workbuf.len))) {
53303
          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])));
53304
        }
53305
        v_mx += 1u;
53306
      }
53307
      v_my += 1u;
53308
    }
53309
    v_csel += 1u;
53310
  }
53311
  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));
53312
  return wuffs_base__make_empty_struct();
53313
}
53314
53315
// -------- func jpeg.decoder.swizzle_gray
53316
53317
WUFFS_BASE__GENERATED_C_CODE
53318
static wuffs_base__status
53319
wuffs_jpeg__decoder__swizzle_gray(
53320
    wuffs_jpeg__decoder* self,
53321
    wuffs_base__pixel_buffer* a_dst,
53322
    wuffs_base__slice_u8 a_workbuf,
53323
    uint32_t a_x0,
53324
    uint32_t a_x1,
53325
    uint32_t a_y0,
53326
    uint32_t a_y1,
53327
    uint64_t a_stride) {
53328
  wuffs_base__pixel_format v_dst_pixfmt = {0};
53329
  uint32_t v_dst_bits_per_pixel = 0;
53330
  uint32_t v_dst_bytes_per_pixel = 0;
53331
  uint64_t v_x0 = 0;
53332
  uint64_t v_x1 = 0;
53333
  wuffs_base__table_u8 v_tab = {0};
53334
  wuffs_base__slice_u8 v_dst = {0};
53335
  uint32_t v_y = 0;
53336
  uint32_t v_y1 = 0;
53337
53338
  v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
53339
  v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
53340
  if ((v_dst_bits_per_pixel & 7u) != 0u) {
53341
    return wuffs_base__make_status(wuffs_base__error__unsupported_option);
53342
  }
53343
  v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u);
53344
  v_x0 = ((uint64_t)((v_dst_bytes_per_pixel * wuffs_base__u32__min(a_x0, self->private_impl.f_width))));
53345
  v_x1 = ((uint64_t)((v_dst_bytes_per_pixel * wuffs_base__u32__min(a_x1, self->private_impl.f_width))));
53346
  v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
53347
  v_y = a_y0;
53348
  v_y1 = wuffs_base__u32__min(a_y1, self->private_impl.f_height);
53349
  while (v_y < v_y1) {
53350
    v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_y);
53351
    if (v_x1 < ((uint64_t)(v_dst.len))) {
53352
      v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_x1);
53353
    }
53354
    if (v_x0 < ((uint64_t)(v_dst.len))) {
53355
      v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_x0);
53356
    } else {
53357
      v_dst = wuffs_base__utility__empty_slice_u8();
53358
    }
53359
    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);
53360
    if (a_stride <= ((uint64_t)(a_workbuf.len))) {
53361
      a_workbuf = wuffs_base__slice_u8__subslice_i(a_workbuf, a_stride);
53362
    } else {
53363
      a_workbuf = wuffs_base__utility__empty_slice_u8();
53364
    }
53365
    v_y += 1u;
53366
  }
53367
  return wuffs_base__make_status(NULL);
53368
}
53369
53370
// -------- func jpeg.decoder.swizzle_colorful
53371
53372
WUFFS_BASE__GENERATED_C_CODE
53373
static wuffs_base__status
53374
wuffs_jpeg__decoder__swizzle_colorful(
53375
    wuffs_jpeg__decoder* self,
53376
    wuffs_base__pixel_buffer* a_dst,
53377
    wuffs_base__slice_u8 a_workbuf,
53378
    uint32_t a_x0,
53379
    uint32_t a_x1,
53380
    uint32_t a_y0,
53381
    uint32_t a_y1) {
53382
  uint64_t v_i = 0;
53383
  uint64_t v_j = 0;
53384
  wuffs_base__slice_u8 v_src0 = {0};
53385
  wuffs_base__slice_u8 v_src1 = {0};
53386
  wuffs_base__slice_u8 v_src2 = {0};
53387
  wuffs_base__slice_u8 v_src3 = {0};
53388
  uint32_t v_width0 = 0;
53389
  uint32_t v_width1 = 0;
53390
  uint32_t v_width2 = 0;
53391
  uint32_t v_width3 = 0;
53392
  uint32_t v_height0 = 0;
53393
  uint32_t v_height1 = 0;
53394
  uint32_t v_height2 = 0;
53395
  uint32_t v_height3 = 0;
53396
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
53397
53398
  if (self->private_impl.f_swizzle_immediately) {
53399
    v_i = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[0u]));
53400
    v_j = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[1u]));
53401
    if ((v_i <= v_j) && (v_j <= 640u)) {
53402
      v_src0 = wuffs_base__make_slice_u8_ij(self->private_data.f_swizzle_immediately_buffer, v_i, v_j);
53403
      v_width0 = (8u * ((uint32_t)(self->private_impl.f_components_h[0u])));
53404
      v_height0 = (8u * ((uint32_t)(self->private_impl.f_components_v[0u])));
53405
    }
53406
    v_i = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[1u]));
53407
    v_j = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[2u]));
53408
    if ((v_i <= v_j) && (v_j <= 640u)) {
53409
      v_src1 = wuffs_base__make_slice_u8_ij(self->private_data.f_swizzle_immediately_buffer, v_i, v_j);
53410
      v_width1 = (8u * ((uint32_t)(self->private_impl.f_components_h[1u])));
53411
      v_height1 = (8u * ((uint32_t)(self->private_impl.f_components_v[1u])));
53412
    }
53413
    v_i = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[2u]));
53414
    v_j = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[3u]));
53415
    if ((v_i <= v_j) && (v_j <= 640u)) {
53416
      v_src2 = wuffs_base__make_slice_u8_ij(self->private_data.f_swizzle_immediately_buffer, v_i, v_j);
53417
      v_width2 = (8u * ((uint32_t)(self->private_impl.f_components_h[2u])));
53418
      v_height2 = (8u * ((uint32_t)(self->private_impl.f_components_v[2u])));
53419
    }
53420
    v_i = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[3u]));
53421
    v_j = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[4u]));
53422
    if ((v_i <= v_j) && (v_j <= 640u)) {
53423
      v_src3 = wuffs_base__make_slice_u8_ij(self->private_data.f_swizzle_immediately_buffer, v_i, v_j);
53424
      v_width3 = (8u * ((uint32_t)(self->private_impl.f_components_h[3u])));
53425
      v_height3 = (8u * ((uint32_t)(self->private_impl.f_components_v[3u])));
53426
    }
53427
  } else {
53428
    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)))) {
53429
      v_src0 = wuffs_base__slice_u8__subslice_ij(a_workbuf,
53430
          self->private_impl.f_components_workbuf_offsets[0u],
53431
          self->private_impl.f_components_workbuf_offsets[1u]);
53432
      v_width0 = self->private_impl.f_components_workbuf_widths[0u];
53433
      v_height0 = self->private_impl.f_components_workbuf_heights[0u];
53434
    }
53435
    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)))) {
53436
      v_src1 = wuffs_base__slice_u8__subslice_ij(a_workbuf,
53437
          self->private_impl.f_components_workbuf_offsets[1u],
53438
          self->private_impl.f_components_workbuf_offsets[2u]);
53439
      v_width1 = self->private_impl.f_components_workbuf_widths[1u];
53440
      v_height1 = self->private_impl.f_components_workbuf_heights[1u];
53441
    }
53442
    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)))) {
53443
      v_src2 = wuffs_base__slice_u8__subslice_ij(a_workbuf,
53444
          self->private_impl.f_components_workbuf_offsets[2u],
53445
          self->private_impl.f_components_workbuf_offsets[3u]);
53446
      v_width2 = self->private_impl.f_components_workbuf_widths[2u];
53447
      v_height2 = self->private_impl.f_components_workbuf_heights[2u];
53448
    }
53449
    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)))) {
53450
      v_src3 = wuffs_base__slice_u8__subslice_ij(a_workbuf,
53451
          self->private_impl.f_components_workbuf_offsets[3u],
53452
          self->private_impl.f_components_workbuf_offsets[4u]);
53453
      v_width3 = self->private_impl.f_components_workbuf_widths[3u];
53454
      v_height3 = self->private_impl.f_components_workbuf_heights[3u];
53455
    }
53456
  }
53457
  v_status = wuffs_base__pixel_swizzler__swizzle_ycck(&self->private_impl.f_swizzler,
53458
      a_dst,
53459
      wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)),
53460
      (a_x0 & 65535u),
53461
      wuffs_base__u32__min(a_x1, self->private_impl.f_width),
53462
      (a_y0 & 65535u),
53463
      wuffs_base__u32__min(a_y1, self->private_impl.f_height),
53464
      v_src0,
53465
      v_src1,
53466
      v_src2,
53467
      v_src3,
53468
      v_width0,
53469
      v_width1,
53470
      v_width2,
53471
      v_width3,
53472
      v_height0,
53473
      v_height1,
53474
      v_height2,
53475
      v_height3,
53476
      v_width0,
53477
      v_width1,
53478
      v_width2,
53479
      v_width3,
53480
      self->private_impl.f_components_h[0u],
53481
      self->private_impl.f_components_h[1u],
53482
      self->private_impl.f_components_h[2u],
53483
      self->private_impl.f_components_h[3u],
53484
      self->private_impl.f_components_v[0u],
53485
      self->private_impl.f_components_v[1u],
53486
      self->private_impl.f_components_v[2u],
53487
      self->private_impl.f_components_v[3u],
53488
      self->private_impl.f_is_rgb_or_cmyk,
53489
      ! self->private_impl.f_use_lower_quality,
53490
      wuffs_base__make_slice_u8(self->private_data.f_swizzle_ycck_scratch_buffer_2k, 2048));
53491
  return wuffs_private_impl__status__ensure_not_a_suspension(v_status);
53492
}
53493
53494
// -------- func jpeg.decoder.frame_dirty_rect
53495
53496
WUFFS_BASE__GENERATED_C_CODE
53497
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
53498
wuffs_jpeg__decoder__frame_dirty_rect(
53499
    const wuffs_jpeg__decoder* self) {
53500
  if (!self) {
53501
    return wuffs_base__utility__empty_rect_ie_u32();
53502
  }
53503
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
53504
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
53505
    return wuffs_base__utility__empty_rect_ie_u32();
53506
  }
53507
53508
  return wuffs_base__utility__make_rect_ie_u32(
53509
      0u,
53510
      0u,
53511
      self->private_impl.f_width,
53512
      self->private_impl.f_height);
53513
}
53514
53515
// -------- func jpeg.decoder.num_animation_loops
53516
53517
WUFFS_BASE__GENERATED_C_CODE
53518
WUFFS_BASE__MAYBE_STATIC uint32_t
53519
wuffs_jpeg__decoder__num_animation_loops(
53520
    const wuffs_jpeg__decoder* self) {
53521
  if (!self) {
53522
    return 0;
53523
  }
53524
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
53525
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
53526
    return 0;
53527
  }
53528
53529
  return 0u;
53530
}
53531
53532
// -------- func jpeg.decoder.num_decoded_frame_configs
53533
53534
WUFFS_BASE__GENERATED_C_CODE
53535
WUFFS_BASE__MAYBE_STATIC uint64_t
53536
wuffs_jpeg__decoder__num_decoded_frame_configs(
53537
    const wuffs_jpeg__decoder* self) {
53538
  if (!self) {
53539
    return 0;
53540
  }
53541
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
53542
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
53543
    return 0;
53544
  }
53545
53546
  if (self->private_impl.f_call_sequence > 32u) {
53547
    return 1u;
53548
  }
53549
  return 0u;
53550
}
53551
53552
// -------- func jpeg.decoder.num_decoded_frames
53553
53554
WUFFS_BASE__GENERATED_C_CODE
53555
WUFFS_BASE__MAYBE_STATIC uint64_t
53556
wuffs_jpeg__decoder__num_decoded_frames(
53557
    const wuffs_jpeg__decoder* self) {
53558
  if (!self) {
53559
    return 0;
53560
  }
53561
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
53562
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
53563
    return 0;
53564
  }
53565
53566
  if (self->private_impl.f_call_sequence > 64u) {
53567
    return 1u;
53568
  }
53569
  return 0u;
53570
}
53571
53572
// -------- func jpeg.decoder.restart_frame
53573
53574
WUFFS_BASE__GENERATED_C_CODE
53575
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
53576
wuffs_jpeg__decoder__restart_frame(
53577
    wuffs_jpeg__decoder* self,
53578
    uint64_t a_index,
53579
    uint64_t a_io_position) {
53580
  if (!self) {
53581
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
53582
  }
53583
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
53584
    return wuffs_base__make_status(
53585
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
53586
        ? wuffs_base__error__disabled_by_previous_error
53587
        : wuffs_base__error__initialize_not_called);
53588
  }
53589
53590
  uint32_t v_i = 0;
53591
  uint32_t v_j = 0;
53592
53593
  if (self->private_impl.f_call_sequence < 32u) {
53594
    return wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
53595
  }
53596
  if (a_index != 0u) {
53597
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
53598
  }
53599
  self->private_impl.f_call_sequence = 40u;
53600
  self->private_impl.f_bitstream_is_closed = false;
53601
  self->private_impl.f_expect_multiple_scans = false;
53602
  self->private_impl.f_frame_config_io_position = a_io_position;
53603
  self->private_impl.f_scan_count = 0u;
53604
  self->private_impl.f_restart_interval = self->private_impl.f_saved_restart_interval;
53605
  v_i = 0u;
53606
  while (v_i < 4u) {
53607
    self->private_impl.f_seen_dqt[v_i] = self->private_impl.f_saved_seen_dqt[v_i];
53608
    v_j = 0u;
53609
    while (v_j < 64u) {
53610
      self->private_impl.f_quant_tables[v_i][v_j] = self->private_impl.f_saved_quant_tables[v_i][v_j];
53611
      v_j += 1u;
53612
    }
53613
    v_i += 1u;
53614
  }
53615
  v_i = 0u;
53616
  while (v_i < 4u) {
53617
    v_j = 0u;
53618
    while (v_j < 10u) {
53619
      self->private_impl.f_block_smoothing_lowest_scan_al[v_i][v_j] = 16u;
53620
      v_j += 1u;
53621
    }
53622
    v_i += 1u;
53623
  }
53624
  v_i = 0u;
53625
  while (v_i < 8u) {
53626
    self->private_impl.f_seen_dht[v_i] = false;
53627
    v_i += 1u;
53628
  }
53629
  return wuffs_base__make_status(NULL);
53630
}
53631
53632
// -------- func jpeg.decoder.set_report_metadata
53633
53634
WUFFS_BASE__GENERATED_C_CODE
53635
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
53636
wuffs_jpeg__decoder__set_report_metadata(
53637
    wuffs_jpeg__decoder* self,
53638
    uint32_t a_fourcc,
53639
    bool a_report) {
53640
  return wuffs_base__make_empty_struct();
53641
}
53642
53643
// -------- func jpeg.decoder.tell_me_more
53644
53645
WUFFS_BASE__GENERATED_C_CODE
53646
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
53647
wuffs_jpeg__decoder__tell_me_more(
53648
    wuffs_jpeg__decoder* self,
53649
    wuffs_base__io_buffer* a_dst,
53650
    wuffs_base__more_information* a_minfo,
53651
    wuffs_base__io_buffer* a_src) {
53652
  if (!self) {
53653
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
53654
  }
53655
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
53656
    return wuffs_base__make_status(
53657
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
53658
        ? wuffs_base__error__disabled_by_previous_error
53659
        : wuffs_base__error__initialize_not_called);
53660
  }
53661
  if (!a_dst || !a_src) {
53662
    self->private_impl.magic = WUFFS_BASE__DISABLED;
53663
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
53664
  }
53665
  if ((self->private_impl.active_coroutine != 0) &&
53666
      (self->private_impl.active_coroutine != 4)) {
53667
    self->private_impl.magic = WUFFS_BASE__DISABLED;
53668
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
53669
  }
53670
  self->private_impl.active_coroutine = 0;
53671
  wuffs_base__status status = wuffs_base__make_status(NULL);
53672
53673
  status = wuffs_base__make_status(wuffs_base__error__no_more_information);
53674
  goto exit;
53675
53676
  goto ok;
53677
  ok:
53678
  goto exit;
53679
  exit:
53680
  if (wuffs_base__status__is_error(&status)) {
53681
    self->private_impl.magic = WUFFS_BASE__DISABLED;
53682
  }
53683
  return status;
53684
}
53685
53686
// -------- func jpeg.decoder.workbuf_len
53687
53688
WUFFS_BASE__GENERATED_C_CODE
53689
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
53690
wuffs_jpeg__decoder__workbuf_len(
53691
    const wuffs_jpeg__decoder* self) {
53692
  if (!self) {
53693
    return wuffs_base__utility__empty_range_ii_u64();
53694
  }
53695
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
53696
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
53697
    return wuffs_base__utility__empty_range_ii_u64();
53698
  }
53699
53700
  if (self->private_impl.f_use_lower_quality && (self->private_impl.f_sof_marker < 194u)) {
53701
    return wuffs_base__utility__make_range_ii_u64(0u, self->private_impl.f_components_workbuf_offsets[8u]);
53702
  }
53703
  return wuffs_base__utility__make_range_ii_u64(self->private_impl.f_components_workbuf_offsets[8u], self->private_impl.f_components_workbuf_offsets[8u]);
53704
}
53705
53706
// -------- func jpeg.decoder.top_left_quants_has_zero
53707
53708
WUFFS_BASE__GENERATED_C_CODE
53709
static bool
53710
wuffs_jpeg__decoder__top_left_quants_has_zero(
53711
    const wuffs_jpeg__decoder* self,
53712
    uint32_t a_q) {
53713
  return ((self->private_impl.f_quant_tables[a_q][0u] == 0u) ||
53714
      (self->private_impl.f_quant_tables[a_q][1u] == 0u) ||
53715
      (self->private_impl.f_quant_tables[a_q][2u] == 0u) ||
53716
      (self->private_impl.f_quant_tables[a_q][3u] == 0u) ||
53717
      (self->private_impl.f_quant_tables[a_q][8u] == 0u) ||
53718
      (self->private_impl.f_quant_tables[a_q][9u] == 0u) ||
53719
      (self->private_impl.f_quant_tables[a_q][10u] == 0u) ||
53720
      (self->private_impl.f_quant_tables[a_q][16u] == 0u) ||
53721
      (self->private_impl.f_quant_tables[a_q][17u] == 0u) ||
53722
      (self->private_impl.f_quant_tables[a_q][24u] == 0u));
53723
}
53724
53725
// -------- func jpeg.decoder.load_mcu_blocks_for_single_component_smooth
53726
53727
WUFFS_BASE__GENERATED_C_CODE
53728
static wuffs_base__empty_struct
53729
wuffs_jpeg__decoder__load_mcu_blocks_for_single_component_smooth(
53730
    wuffs_jpeg__decoder* self,
53731
    uint32_t a_mx,
53732
    uint32_t a_my,
53733
    wuffs_base__slice_u8 a_workbuf,
53734
    uint32_t a_csel) {
53735
  uint64_t v_stride16 = 0;
53736
  uint64_t v_offset = 0;
53737
  uint32_t v_dx = 0;
53738
  uint32_t v_dy = 0;
53739
  uint32_t v_mx = 0;
53740
  uint32_t v_my = 0;
53741
  uint8_t v_q = 0;
53742
  uint32_t v_q_00 = 0;
53743
  uint32_t v_q_xy = 0;
53744
  uint8_t v_al = 0;
53745
  uint32_t v_scratch = 0;
53746
  uint32_t v_limit = 0;
53747
53748
  v_stride16 = ((uint64_t)((self->private_impl.f_components_workbuf_widths[a_csel] * 16u)));
53749
  v_offset = (self->private_impl.f_components_workbuf_offsets[(a_csel | 4u)] + (((uint64_t)(a_mx)) * 128u) + (((uint64_t)(a_my)) * v_stride16));
53750
  if (v_offset <= ((uint64_t)(a_workbuf.len))) {
53751
    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));
53752
  }
53753
  v_dy = 0u;
53754
  while (v_dy < 5u) {
53755
    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));
53756
    v_dx = 0u;
53757
    while (v_dx < 5u) {
53758
      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));
53759
      v_offset = (self->private_impl.f_components_workbuf_offsets[(a_csel | 4u)] + (((uint64_t)(v_mx)) * 128u) + (((uint64_t)(v_my)) * v_stride16));
53760
      if (v_offset <= ((uint64_t)(a_workbuf.len))) {
53761
        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));
53762
      }
53763
      v_dx += 1u;
53764
    }
53765
    v_dy += 1u;
53766
  }
53767
  v_q = self->private_impl.f_components_tq[a_csel];
53768
  v_q_00 = ((uint32_t)(self->private_impl.f_quant_tables[v_q][0u]));
53769
  if (v_q_00 <= 0u) {
53770
    return wuffs_base__make_empty_struct();
53771
  }
53772
  if (0u != (16u &
53773
      self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][1u] &
53774
      self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][2u] &
53775
      self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][3u] &
53776
      self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][4u] &
53777
      self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][5u] &
53778
      self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][6u] &
53779
      self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][7u] &
53780
      self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][8u] &
53781
      self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][9u])) {
53782
    v_scratch = 0u;
53783
    v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u])));
53784
    v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u])));
53785
    v_scratch += ((uint32_t)(4294967288u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u])));
53786
    v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u])));
53787
    v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u])));
53788
    v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u])));
53789
    v_scratch += ((uint32_t)(6u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u])));
53790
    v_scratch += ((uint32_t)(42u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u])));
53791
    v_scratch += ((uint32_t)(6u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u])));
53792
    v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u])));
53793
    v_scratch += ((uint32_t)(4294967288u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u])));
53794
    v_scratch += ((uint32_t)(42u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u])));
53795
    v_scratch += ((uint32_t)(152u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u])));
53796
    v_scratch += ((uint32_t)(42u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u])));
53797
    v_scratch += ((uint32_t)(4294967288u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u])));
53798
    v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u])));
53799
    v_scratch += ((uint32_t)(6u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u])));
53800
    v_scratch += ((uint32_t)(42u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u])));
53801
    v_scratch += ((uint32_t)(6u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u])));
53802
    v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u])));
53803
    v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u])));
53804
    v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u])));
53805
    v_scratch += ((uint32_t)(4294967288u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u])));
53806
    v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u])));
53807
    v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u])));
53808
    if (v_scratch < 2147483648u) {
53809
      v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + 128u)) / 256u)));
53810
    } else {
53811
      v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + 128u)) / 256u)));
53812
    }
53813
    self->private_data.f_mcu_blocks[0u][0u] = ((uint16_t)(v_scratch));
53814
    v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][1u]));
53815
    if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][1u] == 0u)) {
53816
      v_scratch = 0u;
53817
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u])));
53818
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u])));
53819
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u])));
53820
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u])));
53821
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u])));
53822
      v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u])));
53823
      v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u])));
53824
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u])));
53825
      v_scratch += ((uint32_t)(4294967283u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u])));
53826
      v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u])));
53827
      v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u])));
53828
      v_scratch += ((uint32_t)(38u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u])));
53829
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u])));
53830
      v_scratch += ((uint32_t)(4294967258u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u])));
53831
      v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u])));
53832
      v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u])));
53833
      v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u])));
53834
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u])));
53835
      v_scratch += ((uint32_t)(4294967283u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u])));
53836
      v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u])));
53837
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u])));
53838
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u])));
53839
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u])));
53840
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u])));
53841
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u])));
53842
      v_scratch *= v_q_00;
53843
      if (v_scratch < 2147483648u) {
53844
        v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
53845
      } else {
53846
        v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
53847
      }
53848
      self->private_data.f_mcu_blocks[0u][1u] = ((uint16_t)(v_scratch));
53849
    }
53850
    v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][2u]));
53851
    if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][2u] == 0u)) {
53852
      v_scratch = 0u;
53853
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u])));
53854
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u])));
53855
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u])));
53856
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u])));
53857
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u])));
53858
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u])));
53859
      v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u])));
53860
      v_scratch += ((uint32_t)(4294967291u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u])));
53861
      v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u])));
53862
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u])));
53863
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u])));
53864
      v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u])));
53865
      v_scratch += ((uint32_t)(4294967282u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u])));
53866
      v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u])));
53867
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u])));
53868
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u])));
53869
      v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u])));
53870
      v_scratch += ((uint32_t)(4294967291u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u])));
53871
      v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u])));
53872
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u])));
53873
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u])));
53874
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u])));
53875
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u])));
53876
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u])));
53877
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u])));
53878
      v_scratch *= v_q_00;
53879
      if (v_scratch < 2147483648u) {
53880
        v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
53881
      } else {
53882
        v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
53883
      }
53884
      self->private_data.f_mcu_blocks[0u][2u] = ((uint16_t)(v_scratch));
53885
    }
53886
    v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][3u]));
53887
    if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][3u] == 0u)) {
53888
      v_scratch = 0u;
53889
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u])));
53890
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u])));
53891
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u])));
53892
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u])));
53893
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u])));
53894
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u])));
53895
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u])));
53896
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u])));
53897
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u])));
53898
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u])));
53899
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u])));
53900
      v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u])));
53901
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u])));
53902
      v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u])));
53903
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u])));
53904
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u])));
53905
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u])));
53906
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u])));
53907
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u])));
53908
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u])));
53909
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u])));
53910
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u])));
53911
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u])));
53912
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u])));
53913
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u])));
53914
      v_scratch *= v_q_00;
53915
      if (v_scratch < 2147483648u) {
53916
        v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
53917
      } else {
53918
        v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
53919
      }
53920
      self->private_data.f_mcu_blocks[0u][3u] = ((uint16_t)(v_scratch));
53921
    }
53922
    v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][8u]));
53923
    if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][8u] == 0u)) {
53924
      v_scratch = 0u;
53925
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u])));
53926
      v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u])));
53927
      v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u])));
53928
      v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u])));
53929
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u])));
53930
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u])));
53931
      v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u])));
53932
      v_scratch += ((uint32_t)(38u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u])));
53933
      v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u])));
53934
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u])));
53935
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u])));
53936
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u])));
53937
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u])));
53938
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u])));
53939
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u])));
53940
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u])));
53941
      v_scratch += ((uint32_t)(4294967283u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u])));
53942
      v_scratch += ((uint32_t)(4294967258u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u])));
53943
      v_scratch += ((uint32_t)(4294967283u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u])));
53944
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u])));
53945
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u])));
53946
      v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u])));
53947
      v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u])));
53948
      v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u])));
53949
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u])));
53950
      v_scratch *= v_q_00;
53951
      if (v_scratch < 2147483648u) {
53952
        v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
53953
      } else {
53954
        v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
53955
      }
53956
      self->private_data.f_mcu_blocks[0u][8u] = ((uint16_t)(v_scratch));
53957
    }
53958
    v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][9u]));
53959
    if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][9u] == 0u)) {
53960
      v_scratch = 0u;
53961
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u])));
53962
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u])));
53963
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u])));
53964
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u])));
53965
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u])));
53966
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u])));
53967
      v_scratch += ((uint32_t)(9u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u])));
53968
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u])));
53969
      v_scratch += ((uint32_t)(4294967287u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u])));
53970
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u])));
53971
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u])));
53972
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u])));
53973
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u])));
53974
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u])));
53975
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u])));
53976
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u])));
53977
      v_scratch += ((uint32_t)(4294967287u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u])));
53978
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u])));
53979
      v_scratch += ((uint32_t)(9u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u])));
53980
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u])));
53981
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u])));
53982
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u])));
53983
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u])));
53984
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u])));
53985
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u])));
53986
      v_scratch *= v_q_00;
53987
      if (v_scratch < 2147483648u) {
53988
        v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
53989
      } else {
53990
        v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
53991
      }
53992
      self->private_data.f_mcu_blocks[0u][9u] = ((uint16_t)(v_scratch));
53993
    }
53994
    v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][10u]));
53995
    if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][10u] == 0u)) {
53996
      v_scratch = 0u;
53997
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u])));
53998
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u])));
53999
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u])));
54000
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u])));
54001
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u])));
54002
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u])));
54003
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u])));
54004
      v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u])));
54005
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u])));
54006
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u])));
54007
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u])));
54008
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u])));
54009
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u])));
54010
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u])));
54011
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u])));
54012
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u])));
54013
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u])));
54014
      v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u])));
54015
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u])));
54016
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u])));
54017
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u])));
54018
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u])));
54019
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u])));
54020
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u])));
54021
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u])));
54022
      v_scratch *= v_q_00;
54023
      if (v_scratch < 2147483648u) {
54024
        v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
54025
      } else {
54026
        v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
54027
      }
54028
      self->private_data.f_mcu_blocks[0u][10u] = ((uint16_t)(v_scratch));
54029
    }
54030
    v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][16u]));
54031
    if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][16u] == 0u)) {
54032
      v_scratch = 0u;
54033
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u])));
54034
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u])));
54035
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u])));
54036
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u])));
54037
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u])));
54038
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u])));
54039
      v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u])));
54040
      v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u])));
54041
      v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u])));
54042
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u])));
54043
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u])));
54044
      v_scratch += ((uint32_t)(4294967291u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u])));
54045
      v_scratch += ((uint32_t)(4294967282u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u])));
54046
      v_scratch += ((uint32_t)(4294967291u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u])));
54047
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u])));
54048
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u])));
54049
      v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u])));
54050
      v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u])));
54051
      v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u])));
54052
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u])));
54053
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u])));
54054
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u])));
54055
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u])));
54056
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u])));
54057
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u])));
54058
      v_scratch *= v_q_00;
54059
      if (v_scratch < 2147483648u) {
54060
        v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
54061
      } else {
54062
        v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
54063
      }
54064
      self->private_data.f_mcu_blocks[0u][16u] = ((uint16_t)(v_scratch));
54065
    }
54066
    v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][17u]));
54067
    if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][17u] == 0u)) {
54068
      v_scratch = 0u;
54069
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u])));
54070
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u])));
54071
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u])));
54072
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u])));
54073
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u])));
54074
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u])));
54075
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u])));
54076
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u])));
54077
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u])));
54078
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u])));
54079
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u])));
54080
      v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u])));
54081
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u])));
54082
      v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u])));
54083
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u])));
54084
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u])));
54085
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u])));
54086
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u])));
54087
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u])));
54088
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u])));
54089
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u])));
54090
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u])));
54091
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u])));
54092
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u])));
54093
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u])));
54094
      v_scratch *= v_q_00;
54095
      if (v_scratch < 2147483648u) {
54096
        v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
54097
      } else {
54098
        v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
54099
      }
54100
      self->private_data.f_mcu_blocks[0u][17u] = ((uint16_t)(v_scratch));
54101
    }
54102
    v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][24u]));
54103
    if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][24u] == 0u)) {
54104
      v_scratch = 0u;
54105
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u])));
54106
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u])));
54107
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u])));
54108
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u])));
54109
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u])));
54110
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u])));
54111
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u])));
54112
      v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u])));
54113
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u])));
54114
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u])));
54115
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u])));
54116
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u])));
54117
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u])));
54118
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u])));
54119
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u])));
54120
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u])));
54121
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u])));
54122
      v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u])));
54123
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u])));
54124
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u])));
54125
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u])));
54126
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u])));
54127
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u])));
54128
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u])));
54129
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u])));
54130
      v_scratch *= v_q_00;
54131
      if (v_scratch < 2147483648u) {
54132
        v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
54133
      } else {
54134
        v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
54135
      }
54136
      self->private_data.f_mcu_blocks[0u][24u] = ((uint16_t)(v_scratch));
54137
    }
54138
  } else {
54139
    v_al = self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][1u];
54140
    v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][1u]));
54141
    if ((v_al > 0u) && (v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][1u] == 0u)) {
54142
      v_limit = ((((uint32_t)(1u)) << v_al) - 1u);
54143
      v_scratch = 0u;
54144
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u])));
54145
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u])));
54146
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u])));
54147
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u])));
54148
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u])));
54149
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u])));
54150
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u])));
54151
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u])));
54152
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u])));
54153
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u])));
54154
      v_scratch += ((uint32_t)(4294967289u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u])));
54155
      v_scratch += ((uint32_t)(50u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u])));
54156
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u])));
54157
      v_scratch += ((uint32_t)(4294967246u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u])));
54158
      v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u])));
54159
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u])));
54160
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u])));
54161
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u])));
54162
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u])));
54163
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u])));
54164
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u])));
54165
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u])));
54166
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u])));
54167
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u])));
54168
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u])));
54169
      v_scratch *= v_q_00;
54170
      if (v_scratch < 2147483648u) {
54171
        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)))));
54172
      } else {
54173
        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)))));
54174
      }
54175
      self->private_data.f_mcu_blocks[0u][1u] = ((uint16_t)(v_scratch));
54176
    }
54177
    v_al = self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][5u];
54178
    v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][2u]));
54179
    if ((v_al > 0u) && (v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][2u] == 0u)) {
54180
      v_limit = ((((uint32_t)(1u)) << v_al) - 1u);
54181
      v_scratch = 0u;
54182
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u])));
54183
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u])));
54184
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u])));
54185
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u])));
54186
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u])));
54187
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u])));
54188
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u])));
54189
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u])));
54190
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u])));
54191
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u])));
54192
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u])));
54193
      v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u])));
54194
      v_scratch += ((uint32_t)(4294967272u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u])));
54195
      v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u])));
54196
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u])));
54197
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u])));
54198
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u])));
54199
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u])));
54200
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u])));
54201
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u])));
54202
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u])));
54203
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u])));
54204
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u])));
54205
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u])));
54206
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u])));
54207
      v_scratch *= v_q_00;
54208
      if (v_scratch < 2147483648u) {
54209
        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)))));
54210
      } else {
54211
        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)))));
54212
      }
54213
      self->private_data.f_mcu_blocks[0u][2u] = ((uint16_t)(v_scratch));
54214
    }
54215
    v_al = self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][2u];
54216
    v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][8u]));
54217
    if ((v_al > 0u) && (v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][8u] == 0u)) {
54218
      v_limit = ((((uint32_t)(1u)) << v_al) - 1u);
54219
      v_scratch = 0u;
54220
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u])));
54221
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u])));
54222
      v_scratch += ((uint32_t)(4294967289u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u])));
54223
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u])));
54224
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u])));
54225
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u])));
54226
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u])));
54227
      v_scratch += ((uint32_t)(50u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u])));
54228
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u])));
54229
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u])));
54230
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u])));
54231
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u])));
54232
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u])));
54233
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u])));
54234
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u])));
54235
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u])));
54236
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u])));
54237
      v_scratch += ((uint32_t)(4294967246u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u])));
54238
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u])));
54239
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u])));
54240
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u])));
54241
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u])));
54242
      v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u])));
54243
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u])));
54244
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u])));
54245
      v_scratch *= v_q_00;
54246
      if (v_scratch < 2147483648u) {
54247
        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)))));
54248
      } else {
54249
        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)))));
54250
      }
54251
      self->private_data.f_mcu_blocks[0u][8u] = ((uint16_t)(v_scratch));
54252
    }
54253
    v_al = self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][4u];
54254
    v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][9u]));
54255
    if ((v_al > 0u) && (v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][9u] == 0u)) {
54256
      v_limit = ((((uint32_t)(1u)) << v_al) - 1u);
54257
      v_scratch = 0u;
54258
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u])));
54259
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u])));
54260
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u])));
54261
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u])));
54262
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u])));
54263
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u])));
54264
      v_scratch += ((uint32_t)(10u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u])));
54265
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u])));
54266
      v_scratch += ((uint32_t)(4294967286u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u])));
54267
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u])));
54268
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u])));
54269
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u])));
54270
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u])));
54271
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u])));
54272
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u])));
54273
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u])));
54274
      v_scratch += ((uint32_t)(4294967286u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u])));
54275
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u])));
54276
      v_scratch += ((uint32_t)(10u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u])));
54277
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u])));
54278
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u])));
54279
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u])));
54280
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u])));
54281
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u])));
54282
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u])));
54283
      v_scratch *= v_q_00;
54284
      if (v_scratch < 2147483648u) {
54285
        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)))));
54286
      } else {
54287
        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)))));
54288
      }
54289
      self->private_data.f_mcu_blocks[0u][9u] = ((uint16_t)(v_scratch));
54290
    }
54291
    v_al = self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][3u];
54292
    v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][16u]));
54293
    if ((v_al > 0u) && (v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][16u] == 0u)) {
54294
      v_limit = ((((uint32_t)(1u)) << v_al) - 1u);
54295
      v_scratch = 0u;
54296
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u])));
54297
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u])));
54298
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u])));
54299
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u])));
54300
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u])));
54301
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u])));
54302
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u])));
54303
      v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u])));
54304
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u])));
54305
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u])));
54306
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u])));
54307
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u])));
54308
      v_scratch += ((uint32_t)(4294967272u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u])));
54309
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u])));
54310
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u])));
54311
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u])));
54312
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u])));
54313
      v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u])));
54314
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u])));
54315
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u])));
54316
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u])));
54317
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u])));
54318
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u])));
54319
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u])));
54320
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u])));
54321
      v_scratch *= v_q_00;
54322
      if (v_scratch < 2147483648u) {
54323
        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)))));
54324
      } else {
54325
        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)))));
54326
      }
54327
      self->private_data.f_mcu_blocks[0u][16u] = ((uint16_t)(v_scratch));
54328
    }
54329
  }
54330
  return wuffs_base__make_empty_struct();
54331
}
54332
54333
// -------- func jpeg.decoder.decode_mcu
54334
54335
WUFFS_BASE__GENERATED_C_CODE
54336
static uint32_t
54337
wuffs_jpeg__decoder__decode_mcu(
54338
    wuffs_jpeg__decoder* self,
54339
    wuffs_base__pixel_buffer* a_dst,
54340
    wuffs_base__slice_u8 a_workbuf,
54341
    uint32_t a_mx,
54342
    uint32_t a_my) {
54343
  return (*self->private_impl.choosy_decode_mcu)(self, a_dst, a_workbuf, a_mx, a_my);
54344
}
54345
54346
WUFFS_BASE__GENERATED_C_CODE
54347
static uint32_t
54348
wuffs_jpeg__decoder__decode_mcu__choosy_default(
54349
    wuffs_jpeg__decoder* self,
54350
    wuffs_base__pixel_buffer* a_dst,
54351
    wuffs_base__slice_u8 a_workbuf,
54352
    uint32_t a_mx,
54353
    uint32_t a_my) {
54354
  uint32_t v_ret = 0;
54355
  uint64_t v_bits = 0;
54356
  uint32_t v_n_bits = 0;
54357
  uint8_t v_csel = 0;
54358
  wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer();
54359
  wuffs_base__io_buffer* v_r = &u_r;
54360
  const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
54361
  const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
54362
  const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
54363
  const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
54364
  uint32_t v_pos = 0;
54365
  uint8_t v_dc_h = 0;
54366
  uint32_t v_dc_symbol = 0;
54367
  uint32_t v_dc_ht_fast = 0;
54368
  uint32_t v_dc_bl = 0;
54369
  uint32_t v_dc_code = 0;
54370
  uint32_t v_dc_blm1 = 0;
54371
  uint32_t v_dc_ht_slow = 0;
54372
  uint16_t v_dc_value = 0;
54373
  uint16_t v_dc_extend = 0;
54374
  const uint16_t* v_ac_huff_table_fast = NULL;
54375
  uint8_t v_ac_h = 0;
54376
  uint32_t v_ac_symbol = 0;
54377
  uint32_t v_ac_ht_fast = 0;
54378
  uint32_t v_ac_bl = 0;
54379
  uint32_t v_ac_code = 0;
54380
  uint32_t v_ac_blm1 = 0;
54381
  uint32_t v_ac_ht_slow = 0;
54382
  uint16_t v_ac_value = 0;
54383
  uint16_t v_ac_extend = 0;
54384
  uint32_t v_ac_rrrr = 0;
54385
  uint32_t v_ac_ssss = 0;
54386
  uint32_t v_z = 0;
54387
  uint32_t v_mcb = 0;
54388
  uint64_t v_stride = 0;
54389
  uint64_t v_offset = 0;
54390
54391
  v_bits = self->private_impl.f_bitstream_bits;
54392
  v_n_bits = self->private_impl.f_bitstream_n_bits;
54393
  if (self->private_impl.f_bitstream_ri > self->private_impl.f_bitstream_wi) {
54394
    return 2u;
54395
  }
54396
  {
54397
    wuffs_base__io_buffer* o_0_v_r = v_r;
54398
    const uint8_t* o_0_iop_v_r = iop_v_r;
54399
    const uint8_t* o_0_io0_v_r = io0_v_r;
54400
    const uint8_t* o_0_io1_v_r = io1_v_r;
54401
    const uint8_t* o_0_io2_v_r = io2_v_r;
54402
    v_r = wuffs_private_impl__io_reader__set(
54403
        &u_r,
54404
        &iop_v_r,
54405
        &io0_v_r,
54406
        &io1_v_r,
54407
        &io2_v_r,
54408
        wuffs_base__make_slice_u8_ij(self->private_data.f_bitstream_buffer,
54409
        self->private_impl.f_bitstream_ri,
54410
        self->private_impl.f_bitstream_wi),
54411
        ((uint64_t)(self->private_impl.f_bitstream_ri)));
54412
    do {
54413
      while (self->private_impl.f_mcu_current_block < self->private_impl.f_mcu_num_blocks) {
54414
        while (self->private_impl.f_mcu_zig_index <= 0u) {
54415
          wuffs_private_impl__bulk_memset(&self->private_data.f_mcu_blocks[0], 1u * (size_t)128u, 0u);
54416
          if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) {
54417
            v_ret = 1u;
54418
            goto label__goto_done__break;
54419
          }
54420
          v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u));
54421
          iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u);
54422
          v_n_bits |= 56u;
54423
          v_dc_h = self->private_impl.f_mcu_blocks_dc_hselector[self->private_impl.f_mcu_current_block];
54424
          v_dc_ht_fast = ((uint32_t)(self->private_impl.f_huff_tables_fast[v_dc_h][(v_bits >> 56u)]));
54425
          v_dc_bl = (v_dc_ht_fast >> 8u);
54426
          if (v_n_bits >= v_dc_bl) {
54427
            v_dc_symbol = (15u & v_dc_ht_fast);
54428
            v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol];
54429
            v_bits <<= (v_dc_bl & 63u);
54430
            v_n_bits -= v_dc_bl;
54431
          } else {
54432
            v_dc_code = ((uint32_t)((v_bits >> 55u)));
54433
            v_dc_blm1 = 8u;
54434
            v_bits <<= 9u;
54435
            v_n_bits -= 9u;
54436
            while (true) {
54437
              v_dc_ht_slow = self->private_impl.f_huff_tables_slow[v_dc_h][v_dc_blm1];
54438
              if (v_dc_code < (v_dc_ht_slow >> 8u)) {
54439
                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)))])));
54440
                v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol];
54441
                break;
54442
              }
54443
              v_dc_code = (((uint32_t)(v_dc_code << 1u)) | ((uint32_t)((v_bits >> 63u))));
54444
              v_bits <<= 1u;
54445
              v_n_bits -= 1u;
54446
              v_dc_blm1 = ((v_dc_blm1 + 1u) & 15u);
54447
              if (v_dc_blm1 == 0u) {
54448
                v_dc_symbol = 0u;
54449
                v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol];
54450
                break;
54451
              }
54452
            }
54453
          }
54454
          v_dc_value = ((uint16_t)(((v_bits >> 32u) >> (32u - v_dc_symbol))));
54455
#if defined(__GNUC__)
54456
#pragma GCC diagnostic push
54457
#pragma GCC diagnostic ignored "-Wconversion"
54458
#endif
54459
          v_dc_value += ((uint16_t)(v_dc_extend & ((uint16_t)(((uint16_t)(wuffs_base__utility__sign_extend_rshift_u64(v_bits, 63u))) ^ 65535u))));
54460
#if defined(__GNUC__)
54461
#pragma GCC diagnostic pop
54462
#endif
54463
          v_bits <<= v_dc_symbol;
54464
          v_n_bits -= v_dc_symbol;
54465
          v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[self->private_impl.f_mcu_current_block]];
54466
#if defined(__GNUC__)
54467
#pragma GCC diagnostic push
54468
#pragma GCC diagnostic ignored "-Wconversion"
54469
#endif
54470
          self->private_impl.f_mcu_previous_dc_values[v_csel] += v_dc_value;
54471
#if defined(__GNUC__)
54472
#pragma GCC diagnostic pop
54473
#endif
54474
          self->private_data.f_mcu_blocks[0u][0u] = self->private_impl.f_mcu_previous_dc_values[v_csel];
54475
          self->private_impl.f_mcu_zig_index = 1u;
54476
          break;
54477
        }
54478
        if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) {
54479
          v_ret = 1u;
54480
          goto label__goto_done__break;
54481
        }
54482
        if (v_n_bits < 16u) {
54483
          v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u));
54484
        }
54485
        v_z = 1u;
54486
        self->private_impl.f_mcu_zig_index = 0u;
54487
        v_ac_h = self->private_impl.f_mcu_blocks_ac_hselector[self->private_impl.f_mcu_current_block];
54488
        v_ac_huff_table_fast = &self->private_impl.f_huff_tables_fast[v_ac_h][0u];
54489
        while (v_z < 64u) {
54490
          v_ac_ht_fast = ((uint32_t)(v_ac_huff_table_fast[(v_bits >> 56u)]));
54491
          if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) {
54492
            v_ret = 2u;
54493
            goto label__goto_done__break;
54494
          }
54495
          v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u));
54496
          iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u);
54497
          v_n_bits |= 56u;
54498
          v_ac_bl = (v_ac_ht_fast >> 8u);
54499
          if (v_n_bits >= v_ac_bl) {
54500
            v_ac_symbol = (255u & v_ac_ht_fast);
54501
            v_bits <<= (v_ac_bl & 63u);
54502
            v_n_bits -= v_ac_bl;
54503
          } else {
54504
            v_ac_code = ((uint32_t)((v_bits >> 55u)));
54505
            v_ac_blm1 = 8u;
54506
            v_bits <<= 9u;
54507
            v_n_bits -= 9u;
54508
            while (true) {
54509
              v_ac_ht_slow = self->private_impl.f_huff_tables_slow[v_ac_h][v_ac_blm1];
54510
              if (v_ac_code < (v_ac_ht_slow >> 8u)) {
54511
                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)))]));
54512
                break;
54513
              }
54514
              v_ac_code = (((uint32_t)(v_ac_code << 1u)) | ((uint32_t)((v_bits >> 63u))));
54515
              v_bits <<= 1u;
54516
              v_n_bits -= 1u;
54517
              v_ac_blm1 = ((v_ac_blm1 + 1u) & 15u);
54518
              if (v_ac_blm1 == 0u) {
54519
                v_ac_symbol = 0u;
54520
                break;
54521
              }
54522
            }
54523
          }
54524
          v_ac_rrrr = (v_ac_symbol >> 4u);
54525
          v_z += (v_ac_rrrr + 1u);
54526
          v_ac_ssss = (v_ac_symbol & 15u);
54527
          v_ac_extend = WUFFS_JPEG__EXTEND[v_ac_ssss];
54528
          if (v_ac_ssss > 0u) {
54529
            v_ac_value = ((uint16_t)((v_bits >> (64u - v_ac_ssss))));
54530
#if defined(__GNUC__)
54531
#pragma GCC diagnostic push
54532
#pragma GCC diagnostic ignored "-Wconversion"
54533
#endif
54534
            v_ac_value += ((uint16_t)(v_ac_extend & ((uint16_t)(((uint16_t)(wuffs_base__utility__sign_extend_rshift_u64(v_bits, 63u))) ^ 65535u))));
54535
#if defined(__GNUC__)
54536
#pragma GCC diagnostic pop
54537
#endif
54538
            v_bits <<= v_ac_ssss;
54539
            v_n_bits -= v_ac_ssss;
54540
            self->private_data.f_mcu_blocks[0u][WUFFS_JPEG__UNZIG[v_z]] = v_ac_value;
54541
          } else if (v_ac_rrrr < 15u) {
54542
            break;
54543
          }
54544
        }
54545
        v_mcb = self->private_impl.f_mcu_current_block;
54546
        self->private_impl.f_mcu_current_block += 1u;
54547
        if (self->private_impl.f_test_only_interrupt_decode_mcu) {
54548
          goto label__goto_done__break;
54549
        }
54550
        if ( ! self->private_impl.f_swizzle_immediately) {
54551
          v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[v_mcb]];
54552
          v_stride = ((uint64_t)(self->private_impl.f_components_workbuf_widths[v_csel]));
54553
          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))));
54554
          if (v_offset <= ((uint64_t)(a_workbuf.len))) {
54555
            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])));
54556
          }
54557
        } else if (self->private_impl.f_num_components == 1u) {
54558
          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])));
54559
          self->private_impl.f_swizzle_immediately_status = wuffs_jpeg__decoder__swizzle_gray(self,
54560
              a_dst,
54561
              wuffs_base__make_slice_u8(self->private_data.f_swizzle_immediately_buffer, 64),
54562
              ((a_mx + 0u) * 8u),
54563
              ((a_mx + 1u) * 8u),
54564
              ((a_my + 0u) * 8u),
54565
              ((a_my + 1u) * 8u),
54566
              8u);
54567
          if ( ! wuffs_base__status__is_ok(&self->private_impl.f_swizzle_immediately_status)) {
54568
            v_ret = 3u;
54569
            goto label__goto_done__break;
54570
          }
54571
          break;
54572
        } else {
54573
          v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[v_mcb]];
54574
          v_stride = (8u * ((uint64_t)(self->private_impl.f_components_h[v_csel])));
54575
          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])));
54576
          if (self->private_impl.f_mcu_current_block < self->private_impl.f_mcu_num_blocks) {
54577
            continue;
54578
          }
54579
          self->private_impl.f_swizzle_immediately_status = wuffs_jpeg__decoder__swizzle_colorful(self,
54580
              a_dst,
54581
              wuffs_base__utility__empty_slice_u8(),
54582
              ((a_mx + 0u) * 8u * ((uint32_t)(self->private_impl.f_max_incl_components_h))),
54583
              ((a_mx + 1u) * 8u * ((uint32_t)(self->private_impl.f_max_incl_components_h))),
54584
              ((a_my + 0u) * 8u * ((uint32_t)(self->private_impl.f_max_incl_components_v))),
54585
              ((a_my + 1u) * 8u * ((uint32_t)(self->private_impl.f_max_incl_components_v))));
54586
          if ( ! wuffs_base__status__is_ok(&self->private_impl.f_swizzle_immediately_status)) {
54587
            v_ret = 3u;
54588
            goto label__goto_done__break;
54589
          }
54590
          break;
54591
        }
54592
      }
54593
      self->private_impl.f_mcu_current_block = 0u;
54594
    } while (0);
54595
    label__goto_done__break:;
54596
    v_pos = ((uint32_t)(wuffs_base__u64__sat_add((v_r ? v_r->meta.pos : 0), ((uint64_t)(iop_v_r - io0_v_r)))));
54597
    if (v_pos > self->private_impl.f_bitstream_wi) {
54598
      v_ret = 2u;
54599
    } else {
54600
      self->private_impl.f_bitstream_ri = v_pos;
54601
    }
54602
    v_r = o_0_v_r;
54603
    iop_v_r = o_0_iop_v_r;
54604
    io0_v_r = o_0_io0_v_r;
54605
    io1_v_r = o_0_io1_v_r;
54606
    io2_v_r = o_0_io2_v_r;
54607
  }
54608
  self->private_impl.f_bitstream_bits = v_bits;
54609
  self->private_impl.f_bitstream_n_bits = v_n_bits;
54610
  return v_ret;
54611
}
54612
54613
// -------- func jpeg.decoder.decode_mcu_progressive_ac_high_bits
54614
54615
WUFFS_BASE__GENERATED_C_CODE
54616
static uint32_t
54617
wuffs_jpeg__decoder__decode_mcu_progressive_ac_high_bits(
54618
    wuffs_jpeg__decoder* self,
54619
    wuffs_base__pixel_buffer* a_dst,
54620
    wuffs_base__slice_u8 a_workbuf,
54621
    uint32_t a_mx,
54622
    uint32_t a_my) {
54623
  uint32_t v_ret = 0;
54624
  uint64_t v_bits = 0;
54625
  uint32_t v_n_bits = 0;
54626
  wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer();
54627
  wuffs_base__io_buffer* v_r = &u_r;
54628
  const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
54629
  const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
54630
  const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
54631
  const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
54632
  uint32_t v_pos = 0;
54633
  const uint16_t* v_ac_huff_table_fast = NULL;
54634
  uint8_t v_ac_h = 0;
54635
  uint32_t v_ac_symbol = 0;
54636
  uint32_t v_ac_ht_fast = 0;
54637
  uint32_t v_ac_bl = 0;
54638
  uint32_t v_ac_code = 0;
54639
  uint32_t v_ac_blm1 = 0;
54640
  uint32_t v_ac_ht_slow = 0;
54641
  uint16_t v_ac_value = 0;
54642
  uint16_t v_ac_extend = 0;
54643
  uint32_t v_ac_rrrr = 0;
54644
  uint32_t v_ac_ssss = 0;
54645
  uint32_t v_z = 0;
54646
54647
  if (self->private_impl.f_eob_run > 0u) {
54648
#if defined(__GNUC__)
54649
#pragma GCC diagnostic push
54650
#pragma GCC diagnostic ignored "-Wconversion"
54651
#endif
54652
    self->private_impl.f_eob_run -= 1u;
54653
#if defined(__GNUC__)
54654
#pragma GCC diagnostic pop
54655
#endif
54656
    return 0u;
54657
  }
54658
  v_bits = self->private_impl.f_bitstream_bits;
54659
  v_n_bits = self->private_impl.f_bitstream_n_bits;
54660
  if (self->private_impl.f_bitstream_ri > self->private_impl.f_bitstream_wi) {
54661
    return 2u;
54662
  }
54663
  {
54664
    wuffs_base__io_buffer* o_0_v_r = v_r;
54665
    const uint8_t* o_0_iop_v_r = iop_v_r;
54666
    const uint8_t* o_0_io0_v_r = io0_v_r;
54667
    const uint8_t* o_0_io1_v_r = io1_v_r;
54668
    const uint8_t* o_0_io2_v_r = io2_v_r;
54669
    v_r = wuffs_private_impl__io_reader__set(
54670
        &u_r,
54671
        &iop_v_r,
54672
        &io0_v_r,
54673
        &io1_v_r,
54674
        &io2_v_r,
54675
        wuffs_base__make_slice_u8_ij(self->private_data.f_bitstream_buffer,
54676
        self->private_impl.f_bitstream_ri,
54677
        self->private_impl.f_bitstream_wi),
54678
        ((uint64_t)(self->private_impl.f_bitstream_ri)));
54679
    do {
54680
      do {
54681
        if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) {
54682
          v_ret = 1u;
54683
          goto label__goto_done__break;
54684
        }
54685
        if (v_n_bits < 16u) {
54686
          v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u));
54687
        }
54688
        v_z = self->private_impl.f_mcu_zig_index;
54689
        self->private_impl.f_mcu_zig_index = 0u;
54690
        v_ac_h = self->private_impl.f_mcu_blocks_ac_hselector[0u];
54691
        v_ac_huff_table_fast = &self->private_impl.f_huff_tables_fast[v_ac_h][0u];
54692
        while (v_z <= ((uint32_t)(self->private_impl.f_scan_se))) {
54693
          v_ac_ht_fast = ((uint32_t)(v_ac_huff_table_fast[(v_bits >> 56u)]));
54694
          if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) {
54695
            v_ret = 2u;
54696
            goto label__goto_done__break;
54697
          }
54698
          v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u));
54699
          iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u);
54700
          v_n_bits |= 56u;
54701
          v_ac_bl = (v_ac_ht_fast >> 8u);
54702
          if (v_n_bits >= v_ac_bl) {
54703
            v_ac_symbol = (255u & v_ac_ht_fast);
54704
            v_bits <<= (v_ac_bl & 63u);
54705
            v_n_bits -= v_ac_bl;
54706
          } else {
54707
            v_ac_code = ((uint32_t)((v_bits >> 55u)));
54708
            v_ac_blm1 = 8u;
54709
            v_bits <<= 9u;
54710
            v_n_bits -= 9u;
54711
            while (true) {
54712
              v_ac_ht_slow = self->private_impl.f_huff_tables_slow[v_ac_h][v_ac_blm1];
54713
              if (v_ac_code < (v_ac_ht_slow >> 8u)) {
54714
                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)))]));
54715
                break;
54716
              }
54717
              v_ac_code = (((uint32_t)(v_ac_code << 1u)) | ((uint32_t)((v_bits >> 63u))));
54718
              v_bits <<= 1u;
54719
              v_n_bits -= 1u;
54720
              v_ac_blm1 = ((v_ac_blm1 + 1u) & 15u);
54721
              if (v_ac_blm1 == 0u) {
54722
                v_ac_symbol = 0u;
54723
                break;
54724
              }
54725
            }
54726
          }
54727
          v_ac_rrrr = (v_ac_symbol >> 4u);
54728
          v_z += (v_ac_rrrr + 1u);
54729
          v_ac_ssss = (v_ac_symbol & 15u);
54730
          v_ac_extend = WUFFS_JPEG__EXTEND[v_ac_ssss];
54731
          if (v_ac_ssss > 0u) {
54732
            v_ac_value = ((uint16_t)((v_bits >> (64u - v_ac_ssss))));
54733
#if defined(__GNUC__)
54734
#pragma GCC diagnostic push
54735
#pragma GCC diagnostic ignored "-Wconversion"
54736
#endif
54737
            v_ac_value += ((uint16_t)(v_ac_extend & ((uint16_t)(((uint16_t)(wuffs_base__utility__sign_extend_rshift_u64(v_bits, 63u))) ^ 65535u))));
54738
#if defined(__GNUC__)
54739
#pragma GCC diagnostic pop
54740
#endif
54741
            v_bits <<= v_ac_ssss;
54742
            v_n_bits -= v_ac_ssss;
54743
            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))));
54744
          } else if (v_ac_rrrr < 15u) {
54745
            self->private_impl.f_eob_run = ((uint16_t)(((uint16_t)(((uint16_t)(((uint16_t)(1u)) << v_ac_rrrr)) - 1u))));
54746
            if (v_ac_rrrr > 0u) {
54747
#if defined(__GNUC__)
54748
#pragma GCC diagnostic push
54749
#pragma GCC diagnostic ignored "-Wconversion"
54750
#endif
54751
              self->private_impl.f_eob_run += ((uint16_t)((v_bits >> (64u - v_ac_rrrr))));
54752
#if defined(__GNUC__)
54753
#pragma GCC diagnostic pop
54754
#endif
54755
              v_bits <<= v_ac_rrrr;
54756
              v_n_bits -= v_ac_rrrr;
54757
            }
54758
            break;
54759
          }
54760
        }
54761
      } while (0);
54762
    } while (0);
54763
    label__goto_done__break:;
54764
    v_pos = ((uint32_t)(wuffs_base__u64__sat_add((v_r ? v_r->meta.pos : 0), ((uint64_t)(iop_v_r - io0_v_r)))));
54765
    if (v_pos > self->private_impl.f_bitstream_wi) {
54766
      v_ret = 2u;
54767
    } else {
54768
      self->private_impl.f_bitstream_ri = v_pos;
54769
    }
54770
    v_r = o_0_v_r;
54771
    iop_v_r = o_0_iop_v_r;
54772
    io0_v_r = o_0_io0_v_r;
54773
    io1_v_r = o_0_io1_v_r;
54774
    io2_v_r = o_0_io2_v_r;
54775
  }
54776
  self->private_impl.f_bitstream_bits = v_bits;
54777
  self->private_impl.f_bitstream_n_bits = v_n_bits;
54778
  return v_ret;
54779
}
54780
54781
// -------- func jpeg.decoder.decode_mcu_progressive_ac_low_bit
54782
54783
WUFFS_BASE__GENERATED_C_CODE
54784
static uint32_t
54785
wuffs_jpeg__decoder__decode_mcu_progressive_ac_low_bit(
54786
    wuffs_jpeg__decoder* self,
54787
    wuffs_base__pixel_buffer* a_dst,
54788
    wuffs_base__slice_u8 a_workbuf,
54789
    uint32_t a_mx,
54790
    uint32_t a_my) {
54791
  uint32_t v_ret = 0;
54792
  uint64_t v_bits = 0;
54793
  uint32_t v_n_bits = 0;
54794
  uint16_t v_one_lshift_scan_al = 0;
54795
  wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer();
54796
  wuffs_base__io_buffer* v_r = &u_r;
54797
  const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
54798
  const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
54799
  const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
54800
  const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
54801
  uint32_t v_pos = 0;
54802
  const uint16_t* v_ac_huff_table_fast = NULL;
54803
  uint8_t v_ac_h = 0;
54804
  uint32_t v_ac_symbol = 0;
54805
  uint32_t v_ac_ht_fast = 0;
54806
  uint32_t v_ac_bl = 0;
54807
  uint32_t v_ac_code = 0;
54808
  uint32_t v_ac_blm1 = 0;
54809
  uint32_t v_ac_ht_slow = 0;
54810
  uint16_t v_ac_value = 0;
54811
  uint32_t v_ac_rrrr = 0;
54812
  uint32_t v_ac_ssss = 0;
54813
  uint8_t v_unzig = 0;
54814
  bool v_bit = false;
54815
54816
  v_bits = self->private_impl.f_bitstream_bits;
54817
  v_n_bits = self->private_impl.f_bitstream_n_bits;
54818
  v_one_lshift_scan_al = ((uint16_t)(((uint16_t)(1u)) << self->private_impl.f_scan_al));
54819
  if (self->private_impl.f_bitstream_ri > self->private_impl.f_bitstream_wi) {
54820
    return 2u;
54821
  }
54822
  {
54823
    wuffs_base__io_buffer* o_0_v_r = v_r;
54824
    const uint8_t* o_0_iop_v_r = iop_v_r;
54825
    const uint8_t* o_0_io0_v_r = io0_v_r;
54826
    const uint8_t* o_0_io1_v_r = io1_v_r;
54827
    const uint8_t* o_0_io2_v_r = io2_v_r;
54828
    v_r = wuffs_private_impl__io_reader__set(
54829
        &u_r,
54830
        &iop_v_r,
54831
        &io0_v_r,
54832
        &io1_v_r,
54833
        &io2_v_r,
54834
        wuffs_base__make_slice_u8_ij(self->private_data.f_bitstream_buffer,
54835
        self->private_impl.f_bitstream_ri,
54836
        self->private_impl.f_bitstream_wi),
54837
        ((uint64_t)(self->private_impl.f_bitstream_ri)));
54838
    do {
54839
      do {
54840
        if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) {
54841
          v_ret = 1u;
54842
          goto label__goto_done__break;
54843
        }
54844
        while (true) {
54845
          if (self->private_impl.f_eob_run > 0u) {
54846
            break;
54847
          }
54848
          v_ac_h = self->private_impl.f_mcu_blocks_ac_hselector[0u];
54849
          v_ac_huff_table_fast = &self->private_impl.f_huff_tables_fast[v_ac_h][0u];
54850
          while (true) {
54851
            if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) {
54852
              v_ret = 2u;
54853
              goto label__goto_done__break;
54854
            }
54855
            v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u));
54856
            iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u);
54857
            v_n_bits |= 56u;
54858
            v_ac_ht_fast = ((uint32_t)(v_ac_huff_table_fast[(v_bits >> 56u)]));
54859
            v_ac_bl = (v_ac_ht_fast >> 8u);
54860
            if (v_n_bits >= v_ac_bl) {
54861
              v_ac_symbol = (255u & v_ac_ht_fast);
54862
              v_bits <<= (v_ac_bl & 63u);
54863
              v_n_bits -= v_ac_bl;
54864
            } else {
54865
              v_ac_code = ((uint32_t)((v_bits >> 55u)));
54866
              v_ac_blm1 = 8u;
54867
              v_bits <<= 9u;
54868
              v_n_bits -= 9u;
54869
              while (true) {
54870
                v_ac_ht_slow = self->private_impl.f_huff_tables_slow[v_ac_h][v_ac_blm1];
54871
                if (v_ac_code < (v_ac_ht_slow >> 8u)) {
54872
                  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)))]));
54873
                  break;
54874
                }
54875
                v_ac_code = (((uint32_t)(v_ac_code << 1u)) | ((uint32_t)((v_bits >> 63u))));
54876
                v_bits <<= 1u;
54877
                v_n_bits -= 1u;
54878
                v_ac_blm1 = ((v_ac_blm1 + 1u) & 15u);
54879
                if (v_ac_blm1 == 0u) {
54880
                  v_ac_symbol = 0u;
54881
                  break;
54882
                }
54883
              }
54884
            }
54885
            v_ac_rrrr = (v_ac_symbol >> 4u);
54886
            v_ac_ssss = (v_ac_symbol & 15u);
54887
            v_ac_value = 0u;
54888
            if (v_ac_ssss > 0u) {
54889
              v_ac_value = ((uint16_t)(((uint16_t)(1u)) << self->private_impl.f_scan_al));
54890
              if ((v_bits >> 63u) == 0u) {
54891
                v_ac_value = ((uint16_t)(((uint16_t)(65535u)) << self->private_impl.f_scan_al));
54892
              }
54893
              v_bits <<= 1u;
54894
              v_n_bits -= 1u;
54895
            } else if (v_ac_rrrr < 15u) {
54896
              self->private_impl.f_eob_run = ((uint16_t)(((uint16_t)(1u)) << v_ac_rrrr));
54897
              if (v_ac_rrrr > 0u) {
54898
#if defined(__GNUC__)
54899
#pragma GCC diagnostic push
54900
#pragma GCC diagnostic ignored "-Wconversion"
54901
#endif
54902
                self->private_impl.f_eob_run += ((uint16_t)((v_bits >> (64u - v_ac_rrrr))));
54903
#if defined(__GNUC__)
54904
#pragma GCC diagnostic pop
54905
#endif
54906
                v_bits <<= v_ac_rrrr;
54907
                v_n_bits -= v_ac_rrrr;
54908
              }
54909
              goto label__goto_do_eob__break;
54910
            }
54911
            while (true) {
54912
              v_unzig = WUFFS_JPEG__UNZIG[(1u + self->private_impl.f_mcu_zig_index)];
54913
              if (self->private_data.f_mcu_blocks[0u][v_unzig] != 0u) {
54914
                if (v_n_bits == 0u) {
54915
                  if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) {
54916
                    v_ret = 2u;
54917
                    goto label__goto_done__break;
54918
                  }
54919
                  v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u));
54920
                  iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u);
54921
                  v_n_bits |= 56u;
54922
                }
54923
                v_bit = ((v_bits >> 63u) > 0u);
54924
                v_bits <<= 1u;
54925
                v_n_bits -= 1u;
54926
                if (v_bit) {
54927
                  if (self->private_data.f_mcu_blocks[0u][v_unzig] < 32768u) {
54928
#if defined(__GNUC__)
54929
#pragma GCC diagnostic push
54930
#pragma GCC diagnostic ignored "-Wconversion"
54931
#endif
54932
                    self->private_data.f_mcu_blocks[0u][v_unzig] += v_one_lshift_scan_al;
54933
#if defined(__GNUC__)
54934
#pragma GCC diagnostic pop
54935
#endif
54936
                  } else {
54937
#if defined(__GNUC__)
54938
#pragma GCC diagnostic push
54939
#pragma GCC diagnostic ignored "-Wconversion"
54940
#endif
54941
                    self->private_data.f_mcu_blocks[0u][v_unzig] -= v_one_lshift_scan_al;
54942
#if defined(__GNUC__)
54943
#pragma GCC diagnostic pop
54944
#endif
54945
                  }
54946
                }
54947
              } else if (v_ac_rrrr <= 0u) {
54948
                break;
54949
              } else {
54950
                v_ac_rrrr -= 1u;
54951
              }
54952
              if (self->private_impl.f_mcu_zig_index >= ((uint32_t)(self->private_impl.f_scan_se))) {
54953
                break;
54954
              }
54955
              self->private_impl.f_mcu_zig_index += 1u;
54956
            }
54957
            if (v_ac_value != 0u) {
54958
              self->private_data.f_mcu_blocks[0u][WUFFS_JPEG__UNZIG[(1u + self->private_impl.f_mcu_zig_index)]] = v_ac_value;
54959
            }
54960
            if (self->private_impl.f_mcu_zig_index >= ((uint32_t)(self->private_impl.f_scan_se))) {
54961
              break;
54962
            }
54963
            self->private_impl.f_mcu_zig_index += 1u;
54964
          }
54965
          goto label__block__break;
54966
        }
54967
        label__goto_do_eob__break:;
54968
        if (self->private_impl.f_eob_run <= 0u) {
54969
          v_ret = 2u;
54970
          goto label__goto_done__break;
54971
        }
54972
        while (true) {
54973
          v_unzig = WUFFS_JPEG__UNZIG[(1u + self->private_impl.f_mcu_zig_index)];
54974
          if (self->private_data.f_mcu_blocks[0u][v_unzig] != 0u) {
54975
            if (v_n_bits == 0u) {
54976
              if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) {
54977
                v_ret = 2u;
54978
                goto label__goto_done__break;
54979
              }
54980
              v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u));
54981
              iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u);
54982
              v_n_bits |= 56u;
54983
            }
54984
            v_bit = ((v_bits >> 63u) > 0u);
54985
            v_bits <<= 1u;
54986
            v_n_bits -= 1u;
54987
            if (v_bit) {
54988
              if (self->private_data.f_mcu_blocks[0u][v_unzig] < 32768u) {
54989
#if defined(__GNUC__)
54990
#pragma GCC diagnostic push
54991
#pragma GCC diagnostic ignored "-Wconversion"
54992
#endif
54993
                self->private_data.f_mcu_blocks[0u][v_unzig] += v_one_lshift_scan_al;
54994
#if defined(__GNUC__)
54995
#pragma GCC diagnostic pop
54996
#endif
54997
              } else {
54998
#if defined(__GNUC__)
54999
#pragma GCC diagnostic push
55000
#pragma GCC diagnostic ignored "-Wconversion"
55001
#endif
55002
                self->private_data.f_mcu_blocks[0u][v_unzig] -= v_one_lshift_scan_al;
55003
#if defined(__GNUC__)
55004
#pragma GCC diagnostic pop
55005
#endif
55006
              }
55007
            }
55008
          }
55009
          if (self->private_impl.f_mcu_zig_index >= ((uint32_t)(self->private_impl.f_scan_se))) {
55010
            break;
55011
          }
55012
          self->private_impl.f_mcu_zig_index += 1u;
55013
        }
55014
#if defined(__GNUC__)
55015
#pragma GCC diagnostic push
55016
#pragma GCC diagnostic ignored "-Wconversion"
55017
#endif
55018
        self->private_impl.f_eob_run -= 1u;
55019
#if defined(__GNUC__)
55020
#pragma GCC diagnostic pop
55021
#endif
55022
      } while (0);
55023
      label__block__break:;
55024
    } while (0);
55025
    label__goto_done__break:;
55026
    v_pos = ((uint32_t)(wuffs_base__u64__sat_add((v_r ? v_r->meta.pos : 0), ((uint64_t)(iop_v_r - io0_v_r)))));
55027
    if (v_pos > self->private_impl.f_bitstream_wi) {
55028
      v_ret = 2u;
55029
    } else {
55030
      self->private_impl.f_bitstream_ri = v_pos;
55031
    }
55032
    v_r = o_0_v_r;
55033
    iop_v_r = o_0_iop_v_r;
55034
    io0_v_r = o_0_io0_v_r;
55035
    io1_v_r = o_0_io1_v_r;
55036
    io2_v_r = o_0_io2_v_r;
55037
  }
55038
  self->private_impl.f_bitstream_bits = v_bits;
55039
  self->private_impl.f_bitstream_n_bits = v_n_bits;
55040
  return v_ret;
55041
}
55042
55043
// -------- func jpeg.decoder.decode_mcu_progressive_dc_high_bits
55044
55045
WUFFS_BASE__GENERATED_C_CODE
55046
static uint32_t
55047
wuffs_jpeg__decoder__decode_mcu_progressive_dc_high_bits(
55048
    wuffs_jpeg__decoder* self,
55049
    wuffs_base__pixel_buffer* a_dst,
55050
    wuffs_base__slice_u8 a_workbuf,
55051
    uint32_t a_mx,
55052
    uint32_t a_my) {
55053
  uint32_t v_ret = 0;
55054
  uint64_t v_bits = 0;
55055
  uint32_t v_n_bits = 0;
55056
  uint8_t v_csel = 0;
55057
  wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer();
55058
  wuffs_base__io_buffer* v_r = &u_r;
55059
  const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
55060
  const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
55061
  const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
55062
  const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
55063
  uint32_t v_pos = 0;
55064
  uint8_t v_dc_h = 0;
55065
  uint32_t v_dc_symbol = 0;
55066
  uint32_t v_dc_ht_fast = 0;
55067
  uint32_t v_dc_bl = 0;
55068
  uint32_t v_dc_code = 0;
55069
  uint32_t v_dc_blm1 = 0;
55070
  uint32_t v_dc_ht_slow = 0;
55071
  uint16_t v_dc_value = 0;
55072
  uint16_t v_dc_extend = 0;
55073
55074
  v_bits = self->private_impl.f_bitstream_bits;
55075
  v_n_bits = self->private_impl.f_bitstream_n_bits;
55076
  if (self->private_impl.f_bitstream_ri > self->private_impl.f_bitstream_wi) {
55077
    return 2u;
55078
  }
55079
  {
55080
    wuffs_base__io_buffer* o_0_v_r = v_r;
55081
    const uint8_t* o_0_iop_v_r = iop_v_r;
55082
    const uint8_t* o_0_io0_v_r = io0_v_r;
55083
    const uint8_t* o_0_io1_v_r = io1_v_r;
55084
    const uint8_t* o_0_io2_v_r = io2_v_r;
55085
    v_r = wuffs_private_impl__io_reader__set(
55086
        &u_r,
55087
        &iop_v_r,
55088
        &io0_v_r,
55089
        &io1_v_r,
55090
        &io2_v_r,
55091
        wuffs_base__make_slice_u8_ij(self->private_data.f_bitstream_buffer,
55092
        self->private_impl.f_bitstream_ri,
55093
        self->private_impl.f_bitstream_wi),
55094
        ((uint64_t)(self->private_impl.f_bitstream_ri)));
55095
    do {
55096
      while (self->private_impl.f_mcu_current_block < self->private_impl.f_mcu_num_blocks) {
55097
        if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) {
55098
          v_ret = 1u;
55099
          goto label__goto_done__break;
55100
        }
55101
        do {
55102
          if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) {
55103
            v_ret = 2u;
55104
            goto label__goto_done__break;
55105
          }
55106
          v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u));
55107
          iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u);
55108
          v_n_bits |= 56u;
55109
          v_dc_h = self->private_impl.f_mcu_blocks_dc_hselector[self->private_impl.f_mcu_current_block];
55110
          v_dc_ht_fast = ((uint32_t)(self->private_impl.f_huff_tables_fast[v_dc_h][(v_bits >> 56u)]));
55111
          v_dc_bl = (v_dc_ht_fast >> 8u);
55112
          if (v_n_bits >= v_dc_bl) {
55113
            v_dc_symbol = (15u & v_dc_ht_fast);
55114
            v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol];
55115
            v_bits <<= (v_dc_bl & 63u);
55116
            v_n_bits -= v_dc_bl;
55117
          } else {
55118
            v_dc_code = ((uint32_t)((v_bits >> 55u)));
55119
            v_dc_blm1 = 8u;
55120
            v_bits <<= 9u;
55121
            v_n_bits -= 9u;
55122
            while (true) {
55123
              v_dc_ht_slow = self->private_impl.f_huff_tables_slow[v_dc_h][v_dc_blm1];
55124
              if (v_dc_code < (v_dc_ht_slow >> 8u)) {
55125
                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)))])));
55126
                v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol];
55127
                break;
55128
              }
55129
              v_dc_code = (((uint32_t)(v_dc_code << 1u)) | ((uint32_t)((v_bits >> 63u))));
55130
              v_bits <<= 1u;
55131
              v_n_bits -= 1u;
55132
              v_dc_blm1 = ((v_dc_blm1 + 1u) & 15u);
55133
              if (v_dc_blm1 == 0u) {
55134
                v_dc_symbol = 0u;
55135
                v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol];
55136
                break;
55137
              }
55138
            }
55139
          }
55140
          v_dc_value = ((uint16_t)(((v_bits >> 32u) >> (32u - v_dc_symbol))));
55141
#if defined(__GNUC__)
55142
#pragma GCC diagnostic push
55143
#pragma GCC diagnostic ignored "-Wconversion"
55144
#endif
55145
          v_dc_value += ((uint16_t)(v_dc_extend & ((uint16_t)(((uint16_t)(wuffs_base__utility__sign_extend_rshift_u64(v_bits, 63u))) ^ 65535u))));
55146
#if defined(__GNUC__)
55147
#pragma GCC diagnostic pop
55148
#endif
55149
          v_bits <<= v_dc_symbol;
55150
          v_n_bits -= v_dc_symbol;
55151
          v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[self->private_impl.f_mcu_current_block]];
55152
#if defined(__GNUC__)
55153
#pragma GCC diagnostic push
55154
#pragma GCC diagnostic ignored "-Wconversion"
55155
#endif
55156
          self->private_impl.f_mcu_previous_dc_values[v_csel] += v_dc_value;
55157
#if defined(__GNUC__)
55158
#pragma GCC diagnostic pop
55159
#endif
55160
          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));
55161
        } while (0);
55162
        self->private_impl.f_mcu_current_block += 1u;
55163
      }
55164
      self->private_impl.f_mcu_current_block = 0u;
55165
    } while (0);
55166
    label__goto_done__break:;
55167
    v_pos = ((uint32_t)(wuffs_base__u64__sat_add((v_r ? v_r->meta.pos : 0), ((uint64_t)(iop_v_r - io0_v_r)))));
55168
    if (v_pos > self->private_impl.f_bitstream_wi) {
55169
      v_ret = 2u;
55170
    } else {
55171
      self->private_impl.f_bitstream_ri = v_pos;
55172
    }
55173
    v_r = o_0_v_r;
55174
    iop_v_r = o_0_iop_v_r;
55175
    io0_v_r = o_0_io0_v_r;
55176
    io1_v_r = o_0_io1_v_r;
55177
    io2_v_r = o_0_io2_v_r;
55178
  }
55179
  self->private_impl.f_bitstream_bits = v_bits;
55180
  self->private_impl.f_bitstream_n_bits = v_n_bits;
55181
  return v_ret;
55182
}
55183
55184
// -------- func jpeg.decoder.decode_mcu_progressive_dc_low_bit
55185
55186
WUFFS_BASE__GENERATED_C_CODE
55187
static uint32_t
55188
wuffs_jpeg__decoder__decode_mcu_progressive_dc_low_bit(
55189
    wuffs_jpeg__decoder* self,
55190
    wuffs_base__pixel_buffer* a_dst,
55191
    wuffs_base__slice_u8 a_workbuf,
55192
    uint32_t a_mx,
55193
    uint32_t a_my) {
55194
  uint32_t v_ret = 0;
55195
  uint64_t v_bits = 0;
55196
  uint32_t v_n_bits = 0;
55197
  uint16_t v_one_lshift_scan_al = 0;
55198
  wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer();
55199
  wuffs_base__io_buffer* v_r = &u_r;
55200
  const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
55201
  const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
55202
  const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
55203
  const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
55204
  uint32_t v_pos = 0;
55205
55206
  v_bits = self->private_impl.f_bitstream_bits;
55207
  v_n_bits = self->private_impl.f_bitstream_n_bits;
55208
  v_one_lshift_scan_al = ((uint16_t)(((uint16_t)(1u)) << self->private_impl.f_scan_al));
55209
  if (self->private_impl.f_bitstream_ri > self->private_impl.f_bitstream_wi) {
55210
    return 2u;
55211
  }
55212
  {
55213
    wuffs_base__io_buffer* o_0_v_r = v_r;
55214
    const uint8_t* o_0_iop_v_r = iop_v_r;
55215
    const uint8_t* o_0_io0_v_r = io0_v_r;
55216
    const uint8_t* o_0_io1_v_r = io1_v_r;
55217
    const uint8_t* o_0_io2_v_r = io2_v_r;
55218
    v_r = wuffs_private_impl__io_reader__set(
55219
        &u_r,
55220
        &iop_v_r,
55221
        &io0_v_r,
55222
        &io1_v_r,
55223
        &io2_v_r,
55224
        wuffs_base__make_slice_u8_ij(self->private_data.f_bitstream_buffer,
55225
        self->private_impl.f_bitstream_ri,
55226
        self->private_impl.f_bitstream_wi),
55227
        ((uint64_t)(self->private_impl.f_bitstream_ri)));
55228
    do {
55229
      while (self->private_impl.f_mcu_current_block < self->private_impl.f_mcu_num_blocks) {
55230
        if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) {
55231
          v_ret = 1u;
55232
          goto label__goto_done__break;
55233
        }
55234
        do {
55235
          if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) {
55236
            v_ret = 2u;
55237
            goto label__goto_done__break;
55238
          }
55239
          v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u));
55240
          iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u);
55241
          v_n_bits |= 56u;
55242
          if ((v_bits >> 63u) != 0u) {
55243
            self->private_data.f_mcu_blocks[self->private_impl.f_mcu_current_block][0u] |= v_one_lshift_scan_al;
55244
          }
55245
          v_bits <<= 1u;
55246
          v_n_bits -= 1u;
55247
        } while (0);
55248
        self->private_impl.f_mcu_current_block += 1u;
55249
      }
55250
      self->private_impl.f_mcu_current_block = 0u;
55251
    } while (0);
55252
    label__goto_done__break:;
55253
    v_pos = ((uint32_t)(wuffs_base__u64__sat_add((v_r ? v_r->meta.pos : 0), ((uint64_t)(iop_v_r - io0_v_r)))));
55254
    if (v_pos > self->private_impl.f_bitstream_wi) {
55255
      v_ret = 2u;
55256
    } else {
55257
      self->private_impl.f_bitstream_ri = v_pos;
55258
    }
55259
    v_r = o_0_v_r;
55260
    iop_v_r = o_0_iop_v_r;
55261
    io0_v_r = o_0_io0_v_r;
55262
    io1_v_r = o_0_io1_v_r;
55263
    io2_v_r = o_0_io2_v_r;
55264
  }
55265
  self->private_impl.f_bitstream_bits = v_bits;
55266
  self->private_impl.f_bitstream_n_bits = v_n_bits;
55267
  return v_ret;
55268
}
55269
55270
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JPEG)
55271
55272
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JSON)
55273
55274
// ---------------- Status Codes Implementations
55275
55276
const char wuffs_json__error__bad_c0_control_code[] = "#json: bad C0 control code";
55277
const char wuffs_json__error__bad_utf_8[] = "#json: bad UTF-8";
55278
const char wuffs_json__error__bad_backslash_escape[] = "#json: bad backslash-escape";
55279
const char wuffs_json__error__bad_input[] = "#json: bad input";
55280
const char wuffs_json__error__bad_new_line_in_a_string[] = "#json: bad new-line in a string";
55281
const char wuffs_json__error__bad_quirk_combination[] = "#json: bad quirk combination";
55282
const char wuffs_json__error__unsupported_number_length[] = "#json: unsupported number length";
55283
const char wuffs_json__error__unsupported_recursion_depth[] = "#json: unsupported recursion depth";
55284
const char wuffs_json__error__internal_error_inconsistent_i_o[] = "#json: internal error: inconsistent I/O";
55285
55286
// ---------------- Private Consts
55287
55288
#define WUFFS_JSON__DECODER_NUMBER_LENGTH_MAX_INCL 99u
55289
55290
static const uint8_t
55291
WUFFS_JSON__LUT_BACKSLASHES[256] WUFFS_BASE__POTENTIALLY_UNUSED = {
55292
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55293
  0u, 0u, 3u, 0u, 0u, 0u, 0u, 0u,
55294
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55295
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55296
  0u, 0u, 162u, 0u, 0u, 0u, 0u, 5u,
55297
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 175u,
55298
  7u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55299
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 4u,
55300
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55301
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55302
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55303
  0u, 0u, 0u, 0u, 220u, 0u, 0u, 0u,
55304
  0u, 1u, 136u, 0u, 0u, 2u, 140u, 0u,
55305
  0u, 0u, 0u, 0u, 0u, 0u, 138u, 0u,
55306
  0u, 0u, 141u, 0u, 137u, 0u, 6u, 0u,
55307
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55308
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55309
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55310
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55311
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55312
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55313
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55314
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55315
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55316
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55317
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55318
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55319
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55320
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55321
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55322
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55323
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55324
};
55325
55326
static const uint8_t
55327
WUFFS_JSON__LUT_QUIRKY_BACKSLASHES_QUIRKS[8] WUFFS_BASE__POTENTIALLY_UNUSED = {
55328
  0u, 1u, 3u, 4u, 5u, 6u, 7u, 10u,
55329
};
55330
55331
static const uint8_t
55332
WUFFS_JSON__LUT_QUIRKY_BACKSLASHES_CHARS[8] WUFFS_BASE__POTENTIALLY_UNUSED = {
55333
  0u, 7u, 27u, 10u, 63u, 39u, 11u, 0u,
55334
};
55335
55336
static const uint8_t
55337
WUFFS_JSON__LUT_CHARS[256] WUFFS_BASE__POTENTIALLY_UNUSED = {
55338
  128u, 129u, 130u, 131u, 132u, 133u, 134u, 135u,
55339
  136u, 137u, 138u, 139u, 140u, 141u, 142u, 143u,
55340
  144u, 145u, 146u, 147u, 148u, 149u, 150u, 151u,
55341
  152u, 153u, 154u, 155u, 156u, 157u, 158u, 159u,
55342
  0u, 0u, 1u, 0u, 0u, 0u, 0u, 0u,
55343
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55344
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55345
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55346
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55347
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55348
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55349
  0u, 0u, 0u, 0u, 2u, 0u, 0u, 0u,
55350
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55351
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55352
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55353
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55354
  16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u,
55355
  16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u,
55356
  16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u,
55357
  16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u,
55358
  16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u,
55359
  16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u,
55360
  16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u,
55361
  16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u,
55362
  32u, 32u, 3u, 3u, 3u, 3u, 3u, 3u,
55363
  3u, 3u, 3u, 3u, 3u, 3u, 3u, 3u,
55364
  3u, 3u, 3u, 3u, 3u, 3u, 3u, 3u,
55365
  3u, 3u, 3u, 3u, 3u, 3u, 3u, 3u,
55366
  4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u,
55367
  4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u,
55368
  5u, 5u, 5u, 5u, 5u, 32u, 32u, 32u,
55369
  32u, 32u, 32u, 32u, 32u, 32u, 32u, 32u,
55370
};
55371
55372
#define WUFFS_JSON__CLASS_WHITESPACE 0u
55373
55374
#define WUFFS_JSON__CLASS_STRING 1u
55375
55376
#define WUFFS_JSON__CLASS_COMMA 2u
55377
55378
#define WUFFS_JSON__CLASS_COLON 3u
55379
55380
#define WUFFS_JSON__CLASS_NUMBER 4u
55381
55382
#define WUFFS_JSON__CLASS_OPEN_CURLY_BRACE 5u
55383
55384
#define WUFFS_JSON__CLASS_CLOSE_CURLY_BRACE 6u
55385
55386
#define WUFFS_JSON__CLASS_OPEN_SQUARE_BRACKET 7u
55387
55388
#define WUFFS_JSON__CLASS_CLOSE_SQUARE_BRACKET 8u
55389
55390
#define WUFFS_JSON__CLASS_FALSE 9u
55391
55392
#define WUFFS_JSON__CLASS_TRUE 10u
55393
55394
#define WUFFS_JSON__CLASS_NULL_NAN_INF 11u
55395
55396
#define WUFFS_JSON__CLASS_COMMENT 12u
55397
55398
#define WUFFS_JSON__EXPECT_VALUE 7858u
55399
55400
#define WUFFS_JSON__EXPECT_NON_STRING_VALUE 7856u
55401
55402
#define WUFFS_JSON__EXPECT_STRING 4098u
55403
55404
#define WUFFS_JSON__EXPECT_COMMA 4100u
55405
55406
#define WUFFS_JSON__EXPECT_COLON 4104u
55407
55408
#define WUFFS_JSON__EXPECT_NUMBER 4112u
55409
55410
#define WUFFS_JSON__EXPECT_CLOSE_CURLY_BRACE 4160u
55411
55412
#define WUFFS_JSON__EXPECT_CLOSE_SQUARE_BRACKET 4352u
55413
55414
static const uint8_t
55415
WUFFS_JSON__LUT_CLASSES[256] WUFFS_BASE__POTENTIALLY_UNUSED = {
55416
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
55417
  15u, 0u, 0u, 15u, 15u, 0u, 15u, 15u,
55418
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
55419
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
55420
  0u, 15u, 1u, 15u, 15u, 15u, 15u, 15u,
55421
  15u, 15u, 15u, 11u, 2u, 4u, 15u, 12u,
55422
  4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u,
55423
  4u, 4u, 3u, 15u, 15u, 15u, 15u, 15u,
55424
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
55425
  15u, 11u, 15u, 15u, 15u, 15u, 11u, 15u,
55426
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
55427
  15u, 15u, 15u, 7u, 15u, 8u, 15u, 15u,
55428
  15u, 15u, 15u, 15u, 15u, 15u, 9u, 15u,
55429
  15u, 11u, 15u, 15u, 15u, 15u, 11u, 15u,
55430
  15u, 15u, 15u, 15u, 10u, 15u, 15u, 15u,
55431
  15u, 15u, 15u, 5u, 15u, 6u, 15u, 15u,
55432
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
55433
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
55434
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
55435
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
55436
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
55437
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
55438
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
55439
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
55440
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
55441
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
55442
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
55443
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
55444
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
55445
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
55446
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
55447
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
55448
};
55449
55450
static const uint8_t
55451
WUFFS_JSON__LUT_DECIMAL_DIGITS[256] WUFFS_BASE__POTENTIALLY_UNUSED = {
55452
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55453
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55454
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55455
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55456
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55457
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55458
  128u, 129u, 130u, 131u, 132u, 133u, 134u, 135u,
55459
  136u, 137u, 0u, 0u, 0u, 0u, 0u, 0u,
55460
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55461
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55462
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55463
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55464
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55465
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55466
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55467
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55468
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55469
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55470
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55471
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55472
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55473
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55474
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55475
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55476
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55477
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55478
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55479
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55480
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55481
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55482
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55483
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55484
};
55485
55486
static const uint8_t
55487
WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[256] WUFFS_BASE__POTENTIALLY_UNUSED = {
55488
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55489
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55490
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55491
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55492
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55493
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55494
  128u, 129u, 130u, 131u, 132u, 133u, 134u, 135u,
55495
  136u, 137u, 0u, 0u, 0u, 0u, 0u, 0u,
55496
  0u, 138u, 139u, 140u, 141u, 142u, 143u, 0u,
55497
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55498
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55499
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55500
  0u, 138u, 139u, 140u, 141u, 142u, 143u, 0u,
55501
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55502
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55503
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55504
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55505
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55506
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55507
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55508
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55509
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55510
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55511
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55512
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55513
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55514
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55515
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55516
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55517
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55518
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55519
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
55520
};
55521
55522
#define WUFFS_JSON__QUIRKS_BASE 1167656960u
55523
55524
#define WUFFS_JSON__QUIRKS_COUNT 21u
55525
55526
// ---------------- Private Initializer Prototypes
55527
55528
// ---------------- Private Function Prototypes
55529
55530
WUFFS_BASE__GENERATED_C_CODE
55531
static uint32_t
55532
wuffs_json__decoder__decode_number(
55533
    wuffs_json__decoder* self,
55534
    wuffs_base__io_buffer* a_src);
55535
55536
WUFFS_BASE__GENERATED_C_CODE
55537
static uint32_t
55538
wuffs_json__decoder__decode_digits(
55539
    wuffs_json__decoder* self,
55540
    wuffs_base__io_buffer* a_src,
55541
    uint32_t a_n);
55542
55543
WUFFS_BASE__GENERATED_C_CODE
55544
static wuffs_base__status
55545
wuffs_json__decoder__decode_leading(
55546
    wuffs_json__decoder* self,
55547
    wuffs_base__token_buffer* a_dst,
55548
    wuffs_base__io_buffer* a_src);
55549
55550
WUFFS_BASE__GENERATED_C_CODE
55551
static wuffs_base__status
55552
wuffs_json__decoder__decode_comment(
55553
    wuffs_json__decoder* self,
55554
    wuffs_base__token_buffer* a_dst,
55555
    wuffs_base__io_buffer* a_src);
55556
55557
WUFFS_BASE__GENERATED_C_CODE
55558
static wuffs_base__status
55559
wuffs_json__decoder__decode_inf_nan(
55560
    wuffs_json__decoder* self,
55561
    wuffs_base__token_buffer* a_dst,
55562
    wuffs_base__io_buffer* a_src);
55563
55564
WUFFS_BASE__GENERATED_C_CODE
55565
static wuffs_base__status
55566
wuffs_json__decoder__decode_trailer(
55567
    wuffs_json__decoder* self,
55568
    wuffs_base__token_buffer* a_dst,
55569
    wuffs_base__io_buffer* a_src);
55570
55571
// ---------------- VTables
55572
55573
const wuffs_base__token_decoder__func_ptrs
55574
wuffs_json__decoder__func_ptrs_for__wuffs_base__token_decoder = {
55575
  (wuffs_base__status(*)(void*,
55576
      wuffs_base__token_buffer*,
55577
      wuffs_base__io_buffer*,
55578
      wuffs_base__slice_u8))(&wuffs_json__decoder__decode_tokens),
55579
  (uint64_t(*)(const void*,
55580
      uint32_t))(&wuffs_json__decoder__get_quirk),
55581
  (wuffs_base__status(*)(void*,
55582
      uint32_t,
55583
      uint64_t))(&wuffs_json__decoder__set_quirk),
55584
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_json__decoder__workbuf_len),
55585
};
55586
55587
// ---------------- Initializer Implementations
55588
55589
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
55590
wuffs_json__decoder__initialize(
55591
    wuffs_json__decoder* self,
55592
    size_t sizeof_star_self,
55593
    uint64_t wuffs_version,
55594
    uint32_t options){
55595
  if (!self) {
55596
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
55597
  }
55598
  if (sizeof(*self) != sizeof_star_self) {
55599
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
55600
  }
55601
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
55602
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
55603
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
55604
  }
55605
55606
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
55607
    // The whole point of this if-check is to detect an uninitialized *self.
55608
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
55609
#if !defined(__clang__) && defined(__GNUC__)
55610
#pragma GCC diagnostic push
55611
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
55612
#endif
55613
    if (self->private_impl.magic != 0) {
55614
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
55615
    }
55616
#if !defined(__clang__) && defined(__GNUC__)
55617
#pragma GCC diagnostic pop
55618
#endif
55619
  } else {
55620
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
55621
      memset(self, 0, sizeof(*self));
55622
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
55623
    } else {
55624
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
55625
    }
55626
  }
55627
55628
  self->private_impl.magic = WUFFS_BASE__MAGIC;
55629
  self->private_impl.vtable_for__wuffs_base__token_decoder.vtable_name =
55630
      wuffs_base__token_decoder__vtable_name;
55631
  self->private_impl.vtable_for__wuffs_base__token_decoder.function_pointers =
55632
      (const void*)(&wuffs_json__decoder__func_ptrs_for__wuffs_base__token_decoder);
55633
  return wuffs_base__make_status(NULL);
55634
}
55635
55636
wuffs_json__decoder*
55637
wuffs_json__decoder__alloc(void) {
55638
  wuffs_json__decoder* x =
55639
      (wuffs_json__decoder*)(calloc(1, sizeof(wuffs_json__decoder)));
55640
  if (!x) {
55641
    return NULL;
55642
  }
55643
  if (wuffs_json__decoder__initialize(
55644
      x, sizeof(wuffs_json__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
55645
    free(x);
55646
    return NULL;
55647
  }
55648
  return x;
55649
}
55650
55651
size_t
55652
sizeof__wuffs_json__decoder(void) {
55653
  return sizeof(wuffs_json__decoder);
55654
}
55655
55656
// ---------------- Function Implementations
55657
55658
// -------- func json.decoder.get_quirk
55659
55660
WUFFS_BASE__GENERATED_C_CODE
55661
WUFFS_BASE__MAYBE_STATIC uint64_t
55662
wuffs_json__decoder__get_quirk(
55663
    const wuffs_json__decoder* self,
55664
    uint32_t a_key) {
55665
  if (!self) {
55666
    return 0;
55667
  }
55668
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
55669
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
55670
    return 0;
55671
  }
55672
55673
  uint32_t v_key = 0;
55674
55675
  if (a_key >= 1167656960u) {
55676
    v_key = (a_key - 1167656960u);
55677
    if (v_key < 21u) {
55678
      if (self->private_impl.f_quirks[v_key]) {
55679
        return 1u;
55680
      }
55681
    }
55682
  }
55683
  return 0u;
55684
}
55685
55686
// -------- func json.decoder.set_quirk
55687
55688
WUFFS_BASE__GENERATED_C_CODE
55689
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
55690
wuffs_json__decoder__set_quirk(
55691
    wuffs_json__decoder* self,
55692
    uint32_t a_key,
55693
    uint64_t a_value) {
55694
  if (!self) {
55695
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
55696
  }
55697
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
55698
    return wuffs_base__make_status(
55699
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
55700
        ? wuffs_base__error__disabled_by_previous_error
55701
        : wuffs_base__error__initialize_not_called);
55702
  }
55703
55704
  if (a_key >= 1167656960u) {
55705
    a_key -= 1167656960u;
55706
    if (a_key < 21u) {
55707
      self->private_impl.f_quirks[a_key] = (a_value > 0u);
55708
      return wuffs_base__make_status(NULL);
55709
    }
55710
  }
55711
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
55712
}
55713
55714
// -------- func json.decoder.workbuf_len
55715
55716
WUFFS_BASE__GENERATED_C_CODE
55717
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
55718
wuffs_json__decoder__workbuf_len(
55719
    const wuffs_json__decoder* self) {
55720
  if (!self) {
55721
    return wuffs_base__utility__empty_range_ii_u64();
55722
  }
55723
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
55724
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
55725
    return wuffs_base__utility__empty_range_ii_u64();
55726
  }
55727
55728
  return wuffs_base__utility__empty_range_ii_u64();
55729
}
55730
55731
// -------- func json.decoder.decode_tokens
55732
55733
WUFFS_BASE__GENERATED_C_CODE
55734
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
55735
wuffs_json__decoder__decode_tokens(
55736
    wuffs_json__decoder* self,
55737
    wuffs_base__token_buffer* a_dst,
55738
    wuffs_base__io_buffer* a_src,
55739
    wuffs_base__slice_u8 a_workbuf) {
55740
  if (!self) {
55741
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
55742
  }
55743
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
55744
    return wuffs_base__make_status(
55745
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
55746
        ? wuffs_base__error__disabled_by_previous_error
55747
        : wuffs_base__error__initialize_not_called);
55748
  }
55749
  if (!a_dst || !a_src) {
55750
    self->private_impl.magic = WUFFS_BASE__DISABLED;
55751
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
55752
  }
55753
  if ((self->private_impl.active_coroutine != 0) &&
55754
      (self->private_impl.active_coroutine != 1)) {
55755
    self->private_impl.magic = WUFFS_BASE__DISABLED;
55756
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
55757
  }
55758
  self->private_impl.active_coroutine = 0;
55759
  wuffs_base__status status = wuffs_base__make_status(NULL);
55760
55761
  uint32_t v_vminor = 0;
55762
  uint32_t v_number_length = 0;
55763
  uint32_t v_number_status = 0;
55764
  uint32_t v_string_length = 0;
55765
  uint32_t v_whitespace_length = 0;
55766
  uint32_t v_depth = 0;
55767
  uint32_t v_stack_byte = 0;
55768
  uint32_t v_stack_bit = 0;
55769
  uint32_t v_match = 0;
55770
  uint32_t v_c32 = 0;
55771
  uint8_t v_c8 = 0;
55772
  uint8_t v_backslash = 0;
55773
  uint8_t v_char = 0;
55774
  uint8_t v_class = 0;
55775
  uint32_t v_multi_byte_utf8 = 0;
55776
  uint8_t v_backslash_x_ok = 0;
55777
  uint8_t v_backslash_x_value = 0;
55778
  uint32_t v_backslash_x_string = 0;
55779
  uint8_t v_uni4_ok = 0;
55780
  uint64_t v_uni4_string = 0;
55781
  uint32_t v_uni4_value = 0;
55782
  uint32_t v_uni4_high_surrogate = 0;
55783
  uint8_t v_uni8_ok = 0;
55784
  uint64_t v_uni8_string = 0;
55785
  uint32_t v_uni8_value = 0;
55786
  uint32_t v_expect = 0;
55787
  uint32_t v_expect_after_value = 0;
55788
55789
  wuffs_base__token* iop_a_dst = NULL;
55790
  wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
55791
  wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
55792
  wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
55793
  if (a_dst && a_dst->data.ptr) {
55794
    io0_a_dst = a_dst->data.ptr;
55795
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
55796
    iop_a_dst = io1_a_dst;
55797
    io2_a_dst = io0_a_dst + a_dst->data.len;
55798
    if (a_dst->meta.closed) {
55799
      io2_a_dst = iop_a_dst;
55800
    }
55801
  }
55802
  const uint8_t* iop_a_src = NULL;
55803
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
55804
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
55805
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
55806
  if (a_src && a_src->data.ptr) {
55807
    io0_a_src = a_src->data.ptr;
55808
    io1_a_src = io0_a_src + a_src->meta.ri;
55809
    iop_a_src = io1_a_src;
55810
    io2_a_src = io0_a_src + a_src->meta.wi;
55811
  }
55812
55813
  uint32_t coro_susp_point = self->private_impl.p_decode_tokens;
55814
  if (coro_susp_point) {
55815
    v_depth = self->private_data.s_decode_tokens.v_depth;
55816
    v_expect = self->private_data.s_decode_tokens.v_expect;
55817
    v_expect_after_value = self->private_data.s_decode_tokens.v_expect_after_value;
55818
  }
55819
  switch (coro_susp_point) {
55820
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
55821
55822
    if (self->private_impl.f_end_of_data) {
55823
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
55824
      goto ok;
55825
    }
55826
    if (self->private_impl.f_quirks[18u]) {
55827
      if (self->private_impl.f_quirks[11u] || self->private_impl.f_quirks[12u] || self->private_impl.f_quirks[17u]) {
55828
        status = wuffs_base__make_status(wuffs_json__error__bad_quirk_combination);
55829
        goto exit;
55830
      }
55831
    }
55832
    if (self->private_impl.f_quirks[15u] || self->private_impl.f_quirks[16u]) {
55833
      if (a_dst) {
55834
        a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
55835
      }
55836
      if (a_src) {
55837
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
55838
      }
55839
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
55840
      status = wuffs_json__decoder__decode_leading(self, a_dst, a_src);
55841
      if (a_dst) {
55842
        iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
55843
      }
55844
      if (a_src) {
55845
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
55846
      }
55847
      if (status.repr) {
55848
        goto suspend;
55849
      }
55850
    }
55851
    v_expect = 7858u;
55852
    label__outer__continue:;
55853
    while (true) {
55854
      while (true) {
55855
        if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
55856
          status = wuffs_base__make_status(wuffs_base__suspension__short_write);
55857
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2);
55858
          goto label__outer__continue;
55859
        }
55860
        v_whitespace_length = 0u;
55861
        v_c8 = 0u;
55862
        v_class = 0u;
55863
        while (true) {
55864
          if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
55865
            if (v_whitespace_length > 0u) {
55866
              *iop_a_dst++ = wuffs_base__make_token(
55867
                  (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
55868
                  (((uint64_t)(v_whitespace_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
55869
              v_whitespace_length = 0u;
55870
            }
55871
            if (a_src && a_src->meta.closed) {
55872
              status = wuffs_base__make_status(wuffs_json__error__bad_input);
55873
              goto exit;
55874
            }
55875
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
55876
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3);
55877
            goto label__outer__continue;
55878
          }
55879
          v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
55880
          v_class = WUFFS_JSON__LUT_CLASSES[v_c8];
55881
          if (v_class != 0u) {
55882
            break;
55883
          }
55884
          iop_a_src += 1u;
55885
          if (v_whitespace_length >= 65534u) {
55886
            *iop_a_dst++ = wuffs_base__make_token(
55887
                (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
55888
                (((uint64_t)(65535u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
55889
            v_whitespace_length = 0u;
55890
            goto label__outer__continue;
55891
          }
55892
          v_whitespace_length += 1u;
55893
        }
55894
        if (v_whitespace_length > 0u) {
55895
          *iop_a_dst++ = wuffs_base__make_token(
55896
              (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
55897
              (((uint64_t)(v_whitespace_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
55898
          v_whitespace_length = 0u;
55899
          if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
55900
            goto label__outer__continue;
55901
          }
55902
        }
55903
        if (0u == (v_expect & (((uint32_t)(1u)) << v_class))) {
55904
          status = wuffs_base__make_status(wuffs_json__error__bad_input);
55905
          goto exit;
55906
        }
55907
        if (v_class == 1u) {
55908
          *iop_a_dst++ = wuffs_base__make_token(
55909
              (((uint64_t)(4194579u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
55910
              (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
55911
              (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
55912
          iop_a_src += 1u;
55913
          label__string_loop_outer__continue:;
55914
          while (true) {
55915
            if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
55916
              status = wuffs_base__make_status(wuffs_base__suspension__short_write);
55917
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4);
55918
              continue;
55919
            }
55920
            v_string_length = 0u;
55921
            while (true) {
55922
              if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
55923
                if (v_string_length > 0u) {
55924
                  *iop_a_dst++ = wuffs_base__make_token(
55925
                      (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
55926
                      (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
55927
                      (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
55928
                  v_string_length = 0u;
55929
                }
55930
                if (a_src && a_src->meta.closed) {
55931
                  status = wuffs_base__make_status(wuffs_json__error__bad_input);
55932
                  goto exit;
55933
                }
55934
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
55935
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5);
55936
                goto label__string_loop_outer__continue;
55937
              }
55938
              while (((uint64_t)(io2_a_src - iop_a_src)) > 4u) {
55939
                v_c32 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
55940
                if (0u != (WUFFS_JSON__LUT_CHARS[(255u & (v_c32 >> 0u))] |
55941
                    WUFFS_JSON__LUT_CHARS[(255u & (v_c32 >> 8u))] |
55942
                    WUFFS_JSON__LUT_CHARS[(255u & (v_c32 >> 16u))] |
55943
                    WUFFS_JSON__LUT_CHARS[(255u & (v_c32 >> 24u))])) {
55944
                  break;
55945
                }
55946
                iop_a_src += 4u;
55947
                if (v_string_length > 65527u) {
55948
                  *iop_a_dst++ = wuffs_base__make_token(
55949
                      (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
55950
                      (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
55951
                      (((uint64_t)((v_string_length + 4u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
55952
                  v_string_length = 0u;
55953
                  goto label__string_loop_outer__continue;
55954
                }
55955
                v_string_length += 4u;
55956
              }
55957
              v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
55958
              v_char = WUFFS_JSON__LUT_CHARS[v_c8];
55959
              if (v_char == 0u) {
55960
                iop_a_src += 1u;
55961
                if (v_string_length >= 65531u) {
55962
                  *iop_a_dst++ = wuffs_base__make_token(
55963
                      (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
55964
                      (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
55965
                      (((uint64_t)(65532u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
55966
                  v_string_length = 0u;
55967
                  goto label__string_loop_outer__continue;
55968
                }
55969
                v_string_length += 1u;
55970
                continue;
55971
              } else if (v_char == 1u) {
55972
                if (v_string_length != 0u) {
55973
                  *iop_a_dst++ = wuffs_base__make_token(
55974
                      (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
55975
                      (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
55976
                      (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
55977
                  v_string_length = 0u;
55978
                }
55979
                goto label__string_loop_outer__break;
55980
              } else if (v_char == 2u) {
55981
                if (v_string_length > 0u) {
55982
                  *iop_a_dst++ = wuffs_base__make_token(
55983
                      (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
55984
                      (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
55985
                      (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
55986
                  v_string_length = 0u;
55987
                  if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
55988
                    goto label__string_loop_outer__continue;
55989
                  }
55990
                }
55991
                if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) {
55992
                  if (a_src && a_src->meta.closed) {
55993
                    status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape);
55994
                    goto exit;
55995
                  }
55996
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
55997
                  WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6);
55998
                  goto label__string_loop_outer__continue;
55999
                }
56000
                v_c8 = ((uint8_t)(((uint16_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src) >> 8u))));
56001
                v_backslash = WUFFS_JSON__LUT_BACKSLASHES[v_c8];
56002
                if (((uint8_t)(v_backslash & 128u)) != 0u) {
56003
                  iop_a_src += 2u;
56004
                  *iop_a_dst++ = wuffs_base__make_token(
56005
                      (((uint64_t)((6291456u | ((uint32_t)(((uint8_t)(v_backslash & 127u))))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
56006
                      (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
56007
                      (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
56008
                  goto label__string_loop_outer__continue;
56009
                } else if (v_backslash != 0u) {
56010
                  if (self->private_impl.f_quirks[WUFFS_JSON__LUT_QUIRKY_BACKSLASHES_QUIRKS[((uint8_t)(v_backslash & 7u))]]) {
56011
                    iop_a_src += 2u;
56012
                    *iop_a_dst++ = wuffs_base__make_token(
56013
                        (((uint64_t)((6291456u | ((uint32_t)(WUFFS_JSON__LUT_QUIRKY_BACKSLASHES_CHARS[((uint8_t)(v_backslash & 7u))]))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
56014
                        (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
56015
                        (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
56016
                    goto label__string_loop_outer__continue;
56017
                  }
56018
                } else if (v_c8 == 117u) {
56019
                  if (((uint64_t)(io2_a_src - iop_a_src)) < 6u) {
56020
                    if (a_src && a_src->meta.closed) {
56021
                      status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape);
56022
                      goto exit;
56023
                    }
56024
                    status = wuffs_base__make_status(wuffs_base__suspension__short_read);
56025
                    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7);
56026
                    goto label__string_loop_outer__continue;
56027
                  }
56028
                  v_uni4_string = (((uint64_t)(wuffs_base__peek_u48le__no_bounds_check(iop_a_src))) >> 16u);
56029
                  v_uni4_value = 0u;
56030
                  v_uni4_ok = 128u;
56031
                  v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 0u))];
56032
                  v_uni4_ok &= v_c8;
56033
                  v_uni4_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 12u);
56034
                  v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 8u))];
56035
                  v_uni4_ok &= v_c8;
56036
                  v_uni4_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 8u);
56037
                  v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 16u))];
56038
                  v_uni4_ok &= v_c8;
56039
                  v_uni4_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 4u);
56040
                  v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 24u))];
56041
                  v_uni4_ok &= v_c8;
56042
                  v_uni4_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 0u);
56043
                  if (v_uni4_ok == 0u) {
56044
                  } else if ((v_uni4_value < 55296u) || (57343u < v_uni4_value)) {
56045
                    iop_a_src += 6u;
56046
                    *iop_a_dst++ = wuffs_base__make_token(
56047
                        (((uint64_t)((6291456u | v_uni4_value))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
56048
                        (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
56049
                        (((uint64_t)(6u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
56050
                    goto label__string_loop_outer__continue;
56051
                  } else if (v_uni4_value >= 56320u) {
56052
                  } else {
56053
                    if (((uint64_t)(io2_a_src - iop_a_src)) < 12u) {
56054
                      if (a_src && a_src->meta.closed) {
56055
                        if (self->private_impl.f_quirks[20u]) {
56056
                          iop_a_src += 6u;
56057
                          *iop_a_dst++ = wuffs_base__make_token(
56058
                              (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
56059
                              (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
56060
                              (((uint64_t)(6u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
56061
                          goto label__string_loop_outer__continue;
56062
                        }
56063
                        status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape);
56064
                        goto exit;
56065
                      }
56066
                      status = wuffs_base__make_status(wuffs_base__suspension__short_read);
56067
                      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8);
56068
                      goto label__string_loop_outer__continue;
56069
                    }
56070
                    v_uni4_string = (wuffs_base__peek_u64le__no_bounds_check(iop_a_src + 4u) >> 16u);
56071
                    if (((255u & (v_uni4_string >> 0u)) != 92u) || ((255u & (v_uni4_string >> 8u)) != 117u)) {
56072
                      v_uni4_high_surrogate = 0u;
56073
                      v_uni4_value = 0u;
56074
                      v_uni4_ok = 0u;
56075
                    } else {
56076
                      v_uni4_high_surrogate = (65536u + ((v_uni4_value - 55296u) << 10u));
56077
                      v_uni4_value = 0u;
56078
                      v_uni4_ok = 128u;
56079
                      v_uni4_string >>= 16u;
56080
                      v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 0u))];
56081
                      v_uni4_ok &= v_c8;
56082
                      v_uni4_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 12u);
56083
                      v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 8u))];
56084
                      v_uni4_ok &= v_c8;
56085
                      v_uni4_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 8u);
56086
                      v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 16u))];
56087
                      v_uni4_ok &= v_c8;
56088
                      v_uni4_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 4u);
56089
                      v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 24u))];
56090
                      v_uni4_ok &= v_c8;
56091
                      v_uni4_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 0u);
56092
                    }
56093
                    if ((v_uni4_ok != 0u) && (56320u <= v_uni4_value) && (v_uni4_value <= 57343u)) {
56094
                      v_uni4_value -= 56320u;
56095
                      iop_a_src += 12u;
56096
                      *iop_a_dst++ = wuffs_base__make_token(
56097
                          (((uint64_t)((6291456u | v_uni4_high_surrogate | v_uni4_value))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
56098
                          (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
56099
                          (((uint64_t)(12u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
56100
                      goto label__string_loop_outer__continue;
56101
                    }
56102
                  }
56103
                  if (self->private_impl.f_quirks[20u]) {
56104
                    if (((uint64_t)(io2_a_src - iop_a_src)) < 6u) {
56105
                      status = wuffs_base__make_status(wuffs_json__error__internal_error_inconsistent_i_o);
56106
                      goto exit;
56107
                    }
56108
                    iop_a_src += 6u;
56109
                    *iop_a_dst++ = wuffs_base__make_token(
56110
                        (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
56111
                        (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
56112
                        (((uint64_t)(6u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
56113
                    goto label__string_loop_outer__continue;
56114
                  }
56115
                } else if ((v_c8 == 85u) && self->private_impl.f_quirks[2u]) {
56116
                  if (((uint64_t)(io2_a_src - iop_a_src)) < 10u) {
56117
                    if (a_src && a_src->meta.closed) {
56118
                      status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape);
56119
                      goto exit;
56120
                    }
56121
                    status = wuffs_base__make_status(wuffs_base__suspension__short_read);
56122
                    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9);
56123
                    goto label__string_loop_outer__continue;
56124
                  }
56125
                  v_uni8_string = wuffs_base__peek_u64le__no_bounds_check(iop_a_src + 2u);
56126
                  v_uni8_value = 0u;
56127
                  v_uni8_ok = 128u;
56128
                  v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 0u))];
56129
                  v_uni8_ok &= v_c8;
56130
                  v_uni8_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 28u);
56131
                  v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 8u))];
56132
                  v_uni8_ok &= v_c8;
56133
                  v_uni8_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 24u);
56134
                  v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 16u))];
56135
                  v_uni8_ok &= v_c8;
56136
                  v_uni8_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 20u);
56137
                  v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 24u))];
56138
                  v_uni8_ok &= v_c8;
56139
                  v_uni8_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 16u);
56140
                  v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 32u))];
56141
                  v_uni8_ok &= v_c8;
56142
                  v_uni8_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 12u);
56143
                  v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 40u))];
56144
                  v_uni8_ok &= v_c8;
56145
                  v_uni8_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 8u);
56146
                  v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 48u))];
56147
                  v_uni8_ok &= v_c8;
56148
                  v_uni8_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 4u);
56149
                  v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 56u))];
56150
                  v_uni8_ok &= v_c8;
56151
                  v_uni8_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 0u);
56152
                  if (v_uni8_ok == 0u) {
56153
                  } else if ((v_uni8_value < 55296u) || ((57343u < v_uni8_value) && (v_uni8_value <= 1114111u))) {
56154
                    iop_a_src += 10u;
56155
                    *iop_a_dst++ = wuffs_base__make_token(
56156
                        (((uint64_t)((6291456u | (v_uni8_value & 2097151u)))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
56157
                        (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
56158
                        (((uint64_t)(10u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
56159
                    goto label__string_loop_outer__continue;
56160
                  } else if (self->private_impl.f_quirks[20u]) {
56161
                    iop_a_src += 10u;
56162
                    *iop_a_dst++ = wuffs_base__make_token(
56163
                        (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
56164
                        (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
56165
                        (((uint64_t)(10u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
56166
                    goto label__string_loop_outer__continue;
56167
                  }
56168
                } else if ((v_c8 == 120u) && self->private_impl.f_quirks[9u]) {
56169
                  if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) {
56170
                    if (a_src && a_src->meta.closed) {
56171
                      status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape);
56172
                      goto exit;
56173
                    }
56174
                    status = wuffs_base__make_status(wuffs_base__suspension__short_read);
56175
                    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10);
56176
                    goto label__string_loop_outer__continue;
56177
                  }
56178
                  v_backslash_x_string = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
56179
                  v_backslash_x_ok = 128u;
56180
                  v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_backslash_x_string >> 16u))];
56181
                  v_backslash_x_ok &= v_c8;
56182
                  v_backslash_x_value = ((uint8_t)(((uint8_t)(((uint8_t)(v_c8 & 15u)) << 4u))));
56183
                  v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_backslash_x_string >> 24u))];
56184
                  v_backslash_x_ok &= v_c8;
56185
                  v_backslash_x_value = ((uint8_t)(((uint8_t)(v_backslash_x_value | ((uint8_t)(v_c8 & 15u))))));
56186
                  if ((v_backslash_x_ok == 0u) || ((v_backslash_x_string & 65535u) != 30812u)) {
56187
                    status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape);
56188
                    goto exit;
56189
                  }
56190
                  iop_a_src += 4u;
56191
                  *iop_a_dst++ = wuffs_base__make_token(
56192
                      (((uint64_t)((6291456u | ((uint32_t)(v_backslash_x_value))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
56193
                      (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
56194
                      (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
56195
                  goto label__string_loop_outer__continue;
56196
                }
56197
                status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape);
56198
                goto exit;
56199
              } else if (v_char == 3u) {
56200
                if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) {
56201
                  if (v_string_length > 0u) {
56202
                    *iop_a_dst++ = wuffs_base__make_token(
56203
                        (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
56204
                        (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
56205
                        (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
56206
                    v_string_length = 0u;
56207
                    if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
56208
                      goto label__string_loop_outer__continue;
56209
                    }
56210
                  }
56211
                  if (a_src && a_src->meta.closed) {
56212
                    if (self->private_impl.f_quirks[20u]) {
56213
                      *iop_a_dst++ = wuffs_base__make_token(
56214
                          (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
56215
                          (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
56216
                          (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
56217
                      iop_a_src += 1u;
56218
                      goto label__string_loop_outer__continue;
56219
                    }
56220
                    status = wuffs_base__make_status(wuffs_json__error__bad_utf_8);
56221
                    goto exit;
56222
                  }
56223
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
56224
                  WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(11);
56225
                  goto label__string_loop_outer__continue;
56226
                }
56227
                v_multi_byte_utf8 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
56228
                if ((v_multi_byte_utf8 & 49152u) == 32768u) {
56229
                  v_multi_byte_utf8 = ((1984u & ((uint32_t)(v_multi_byte_utf8 << 6u))) | (63u & (v_multi_byte_utf8 >> 8u)));
56230
                  iop_a_src += 2u;
56231
                  if (v_string_length >= 65528u) {
56232
                    *iop_a_dst++ = wuffs_base__make_token(
56233
                        (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
56234
                        (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
56235
                        (((uint64_t)((v_string_length + 2u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
56236
                    v_string_length = 0u;
56237
                    goto label__string_loop_outer__continue;
56238
                  }
56239
                  v_string_length += 2u;
56240
                  continue;
56241
                }
56242
              } else if (v_char == 4u) {
56243
                if (((uint64_t)(io2_a_src - iop_a_src)) < 3u) {
56244
                  if (v_string_length > 0u) {
56245
                    *iop_a_dst++ = wuffs_base__make_token(
56246
                        (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
56247
                        (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
56248
                        (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
56249
                    v_string_length = 0u;
56250
                    if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
56251
                      goto label__string_loop_outer__continue;
56252
                    }
56253
                  }
56254
                  if (a_src && a_src->meta.closed) {
56255
                    if (self->private_impl.f_quirks[20u]) {
56256
                      *iop_a_dst++ = wuffs_base__make_token(
56257
                          (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
56258
                          (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
56259
                          (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
56260
                      iop_a_src += 1u;
56261
                      goto label__string_loop_outer__continue;
56262
                    }
56263
                    status = wuffs_base__make_status(wuffs_json__error__bad_utf_8);
56264
                    goto exit;
56265
                  }
56266
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
56267
                  WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(12);
56268
                  goto label__string_loop_outer__continue;
56269
                }
56270
                v_multi_byte_utf8 = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src)));
56271
                if ((v_multi_byte_utf8 & 12632064u) == 8421376u) {
56272
                  v_multi_byte_utf8 = ((61440u & ((uint32_t)(v_multi_byte_utf8 << 12u))) | (4032u & (v_multi_byte_utf8 >> 2u)) | (63u & (v_multi_byte_utf8 >> 16u)));
56273
                  if ((2047u < v_multi_byte_utf8) && ((v_multi_byte_utf8 < 55296u) || (57343u < v_multi_byte_utf8))) {
56274
                    iop_a_src += 3u;
56275
                    if (v_string_length >= 65528u) {
56276
                      *iop_a_dst++ = wuffs_base__make_token(
56277
                          (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
56278
                          (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
56279
                          (((uint64_t)((v_string_length + 3u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
56280
                      v_string_length = 0u;
56281
                      goto label__string_loop_outer__continue;
56282
                    }
56283
                    v_string_length += 3u;
56284
                    continue;
56285
                  }
56286
                }
56287
              } else if (v_char == 5u) {
56288
                if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) {
56289
                  if (v_string_length > 0u) {
56290
                    *iop_a_dst++ = wuffs_base__make_token(
56291
                        (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
56292
                        (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
56293
                        (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
56294
                    v_string_length = 0u;
56295
                    if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
56296
                      goto label__string_loop_outer__continue;
56297
                    }
56298
                  }
56299
                  if (a_src && a_src->meta.closed) {
56300
                    if (self->private_impl.f_quirks[20u]) {
56301
                      *iop_a_dst++ = wuffs_base__make_token(
56302
                          (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
56303
                          (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
56304
                          (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
56305
                      iop_a_src += 1u;
56306
                      goto label__string_loop_outer__continue;
56307
                    }
56308
                    status = wuffs_base__make_status(wuffs_json__error__bad_utf_8);
56309
                    goto exit;
56310
                  }
56311
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
56312
                  WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(13);
56313
                  goto label__string_loop_outer__continue;
56314
                }
56315
                v_multi_byte_utf8 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
56316
                if ((v_multi_byte_utf8 & 3233857536u) == 2155905024u) {
56317
                  v_multi_byte_utf8 = ((1835008u & ((uint32_t)(v_multi_byte_utf8 << 18u))) |
56318
                      (258048u & ((uint32_t)(v_multi_byte_utf8 << 4u))) |
56319
                      (4032u & (v_multi_byte_utf8 >> 10u)) |
56320
                      (63u & (v_multi_byte_utf8 >> 24u)));
56321
                  if ((65535u < v_multi_byte_utf8) && (v_multi_byte_utf8 <= 1114111u)) {
56322
                    iop_a_src += 4u;
56323
                    if (v_string_length >= 65528u) {
56324
                      *iop_a_dst++ = wuffs_base__make_token(
56325
                          (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
56326
                          (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
56327
                          (((uint64_t)((v_string_length + 4u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
56328
                      v_string_length = 0u;
56329
                      goto label__string_loop_outer__continue;
56330
                    }
56331
                    v_string_length += 4u;
56332
                    continue;
56333
                  }
56334
                }
56335
              }
56336
              if (v_string_length > 0u) {
56337
                *iop_a_dst++ = wuffs_base__make_token(
56338
                    (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
56339
                    (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
56340
                    (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
56341
                v_string_length = 0u;
56342
                if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
56343
                  goto label__string_loop_outer__continue;
56344
                }
56345
              }
56346
              if (((uint8_t)(v_char & 128u)) != 0u) {
56347
                if (self->private_impl.f_quirks[0u]) {
56348
                  *iop_a_dst++ = wuffs_base__make_token(
56349
                      (((uint64_t)((6291456u | ((uint32_t)(((uint8_t)(v_char & 127u))))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
56350
                      (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
56351
                      (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
56352
                  iop_a_src += 1u;
56353
                  goto label__string_loop_outer__continue;
56354
                }
56355
                if (v_char == 138u) {
56356
                  status = wuffs_base__make_status(wuffs_json__error__bad_new_line_in_a_string);
56357
                  goto exit;
56358
                }
56359
                status = wuffs_base__make_status(wuffs_json__error__bad_c0_control_code);
56360
                goto exit;
56361
              }
56362
              if (self->private_impl.f_quirks[20u]) {
56363
                *iop_a_dst++ = wuffs_base__make_token(
56364
                    (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
56365
                    (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
56366
                    (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
56367
                iop_a_src += 1u;
56368
                goto label__string_loop_outer__continue;
56369
              }
56370
              status = wuffs_base__make_status(wuffs_json__error__bad_utf_8);
56371
              goto exit;
56372
            }
56373
          }
56374
          label__string_loop_outer__break:;
56375
          while (true) {
56376
            if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
56377
              if (a_src && a_src->meta.closed) {
56378
                status = wuffs_base__make_status(wuffs_json__error__bad_input);
56379
                goto exit;
56380
              }
56381
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
56382
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(14);
56383
              continue;
56384
            }
56385
            if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
56386
              status = wuffs_base__make_status(wuffs_base__suspension__short_write);
56387
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(15);
56388
              continue;
56389
            }
56390
            iop_a_src += 1u;
56391
            *iop_a_dst++ = wuffs_base__make_token(
56392
                (((uint64_t)(4194579u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
56393
                (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
56394
            break;
56395
          }
56396
          if (0u == (v_expect & (((uint32_t)(1u)) << 4u))) {
56397
            v_expect = 4104u;
56398
            goto label__outer__continue;
56399
          }
56400
          break;
56401
        } else if (v_class == 2u) {
56402
          iop_a_src += 1u;
56403
          *iop_a_dst++ = wuffs_base__make_token(
56404
              (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
56405
              (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
56406
          if (0u == (v_expect & (((uint32_t)(1u)) << 8u))) {
56407
            if (self->private_impl.f_quirks[13u]) {
56408
              v_expect = 4162u;
56409
            } else {
56410
              v_expect = 4098u;
56411
            }
56412
          } else {
56413
            if (self->private_impl.f_quirks[13u]) {
56414
              v_expect = 8114u;
56415
            } else {
56416
              v_expect = 7858u;
56417
            }
56418
          }
56419
          goto label__outer__continue;
56420
        } else if (v_class == 3u) {
56421
          iop_a_src += 1u;
56422
          *iop_a_dst++ = wuffs_base__make_token(
56423
              (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
56424
              (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
56425
          v_expect = 7858u;
56426
          goto label__outer__continue;
56427
        } else if (v_class == 4u) {
56428
          while (true) {
56429
            if (a_src) {
56430
              a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
56431
            }
56432
            v_number_length = wuffs_json__decoder__decode_number(self, a_src);
56433
            if (a_src) {
56434
              iop_a_src = a_src->data.ptr + a_src->meta.ri;
56435
            }
56436
            v_number_status = (v_number_length >> 8u);
56437
            v_vminor = 10486787u;
56438
            if ((v_number_length & 128u) != 0u) {
56439
              v_vminor = 10486785u;
56440
            }
56441
            v_number_length = (v_number_length & 127u);
56442
            if (v_number_status == 0u) {
56443
              *iop_a_dst++ = wuffs_base__make_token(
56444
                  (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
56445
                  (((uint64_t)(v_number_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
56446
              break;
56447
            }
56448
            while (v_number_length > 0u) {
56449
              v_number_length -= 1u;
56450
              if (iop_a_src > io1_a_src) {
56451
                iop_a_src--;
56452
              } else {
56453
                status = wuffs_base__make_status(wuffs_json__error__internal_error_inconsistent_i_o);
56454
                goto exit;
56455
              }
56456
            }
56457
            if (v_number_status == 1u) {
56458
              if (self->private_impl.f_quirks[14u]) {
56459
                if (a_dst) {
56460
                  a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
56461
                }
56462
                if (a_src) {
56463
                  a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
56464
                }
56465
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16);
56466
                status = wuffs_json__decoder__decode_inf_nan(self, a_dst, a_src);
56467
                if (a_dst) {
56468
                  iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
56469
                }
56470
                if (a_src) {
56471
                  iop_a_src = a_src->data.ptr + a_src->meta.ri;
56472
                }
56473
                if (status.repr) {
56474
                  goto suspend;
56475
                }
56476
                break;
56477
              }
56478
              status = wuffs_base__make_status(wuffs_json__error__bad_input);
56479
              goto exit;
56480
            } else if (v_number_status == 2u) {
56481
              status = wuffs_base__make_status(wuffs_json__error__unsupported_number_length);
56482
              goto exit;
56483
            } else {
56484
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
56485
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(17);
56486
              while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
56487
                status = wuffs_base__make_status(wuffs_base__suspension__short_write);
56488
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(18);
56489
              }
56490
            }
56491
          }
56492
          break;
56493
        } else if (v_class == 5u) {
56494
          v_vminor = 2113553u;
56495
          if (v_depth == 0u) {
56496
          } else if (0u != (v_expect_after_value & (((uint32_t)(1u)) << 6u))) {
56497
            v_vminor = 2113601u;
56498
          } else {
56499
            v_vminor = 2113569u;
56500
          }
56501
          if (v_depth >= 1024u) {
56502
            status = wuffs_base__make_status(wuffs_json__error__unsupported_recursion_depth);
56503
            goto exit;
56504
          }
56505
          v_stack_byte = (v_depth / 32u);
56506
          v_stack_bit = (v_depth & 31u);
56507
          self->private_data.f_stack[v_stack_byte] |= (((uint32_t)(1u)) << v_stack_bit);
56508
          v_depth += 1u;
56509
          iop_a_src += 1u;
56510
          *iop_a_dst++ = wuffs_base__make_token(
56511
              (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
56512
              (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
56513
          v_expect = 4162u;
56514
          v_expect_after_value = 4164u;
56515
          goto label__outer__continue;
56516
        } else if (v_class == 6u) {
56517
          iop_a_src += 1u;
56518
          if (v_depth <= 1u) {
56519
            *iop_a_dst++ = wuffs_base__make_token(
56520
                (((uint64_t)(2101314u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
56521
                (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
56522
            goto label__outer__break;
56523
          }
56524
          v_depth -= 1u;
56525
          v_stack_byte = ((v_depth - 1u) / 32u);
56526
          v_stack_bit = ((v_depth - 1u) & 31u);
56527
          if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) {
56528
            *iop_a_dst++ = wuffs_base__make_token(
56529
                (((uint64_t)(2105410u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
56530
                (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
56531
            v_expect = 4356u;
56532
            v_expect_after_value = 4356u;
56533
          } else {
56534
            *iop_a_dst++ = wuffs_base__make_token(
56535
                (((uint64_t)(2113602u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
56536
                (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
56537
            v_expect = 4164u;
56538
            v_expect_after_value = 4164u;
56539
          }
56540
          goto label__outer__continue;
56541
        } else if (v_class == 7u) {
56542
          v_vminor = 2105361u;
56543
          if (v_depth == 0u) {
56544
          } else if (0u != (v_expect_after_value & (((uint32_t)(1u)) << 6u))) {
56545
            v_vminor = 2105409u;
56546
          } else {
56547
            v_vminor = 2105377u;
56548
          }
56549
          if (v_depth >= 1024u) {
56550
            status = wuffs_base__make_status(wuffs_json__error__unsupported_recursion_depth);
56551
            goto exit;
56552
          }
56553
          v_stack_byte = (v_depth / 32u);
56554
          v_stack_bit = (v_depth & 31u);
56555
          self->private_data.f_stack[v_stack_byte] &= (4294967295u ^ (((uint32_t)(1u)) << v_stack_bit));
56556
          v_depth += 1u;
56557
          iop_a_src += 1u;
56558
          *iop_a_dst++ = wuffs_base__make_token(
56559
              (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
56560
              (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
56561
          v_expect = 8114u;
56562
          v_expect_after_value = 4356u;
56563
          goto label__outer__continue;
56564
        } else if (v_class == 8u) {
56565
          iop_a_src += 1u;
56566
          if (v_depth <= 1u) {
56567
            *iop_a_dst++ = wuffs_base__make_token(
56568
                (((uint64_t)(2101282u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
56569
                (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
56570
            goto label__outer__break;
56571
          }
56572
          v_depth -= 1u;
56573
          v_stack_byte = ((v_depth - 1u) / 32u);
56574
          v_stack_bit = ((v_depth - 1u) & 31u);
56575
          if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) {
56576
            *iop_a_dst++ = wuffs_base__make_token(
56577
                (((uint64_t)(2105378u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
56578
                (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
56579
            v_expect = 4356u;
56580
            v_expect_after_value = 4356u;
56581
          } else {
56582
            *iop_a_dst++ = wuffs_base__make_token(
56583
                (((uint64_t)(2113570u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
56584
                (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
56585
            v_expect = 4164u;
56586
            v_expect_after_value = 4164u;
56587
          }
56588
          goto label__outer__continue;
56589
        } else if (v_class == 9u) {
56590
          v_match = wuffs_private_impl__io_reader__match7(iop_a_src, io2_a_src, a_src, 111546413966853u);
56591
          if (v_match == 0u) {
56592
            *iop_a_dst++ = wuffs_base__make_token(
56593
                (((uint64_t)(8388612u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
56594
                (((uint64_t)(5u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
56595
            if (((uint64_t)(io2_a_src - iop_a_src)) < 5u) {
56596
              status = wuffs_base__make_status(wuffs_json__error__internal_error_inconsistent_i_o);
56597
              goto exit;
56598
            }
56599
            iop_a_src += 5u;
56600
            break;
56601
          } else if (v_match == 1u) {
56602
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
56603
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(19);
56604
            goto label__outer__continue;
56605
          }
56606
        } else if (v_class == 10u) {
56607
          v_match = wuffs_private_impl__io_reader__match7(iop_a_src, io2_a_src, a_src, 435762131972u);
56608
          if (v_match == 0u) {
56609
            *iop_a_dst++ = wuffs_base__make_token(
56610
                (((uint64_t)(8388616u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
56611
                (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
56612
            if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) {
56613
              status = wuffs_base__make_status(wuffs_json__error__internal_error_inconsistent_i_o);
56614
              goto exit;
56615
            }
56616
            iop_a_src += 4u;
56617
            break;
56618
          } else if (v_match == 1u) {
56619
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
56620
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(20);
56621
            goto label__outer__continue;
56622
          }
56623
        } else if (v_class == 11u) {
56624
          v_match = wuffs_private_impl__io_reader__match7(iop_a_src, io2_a_src, a_src, 465676103172u);
56625
          if (v_match == 0u) {
56626
            *iop_a_dst++ = wuffs_base__make_token(
56627
                (((uint64_t)(8388610u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
56628
                (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
56629
            if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) {
56630
              status = wuffs_base__make_status(wuffs_json__error__internal_error_inconsistent_i_o);
56631
              goto exit;
56632
            }
56633
            iop_a_src += 4u;
56634
            break;
56635
          } else if (v_match == 1u) {
56636
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
56637
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(21);
56638
            goto label__outer__continue;
56639
          }
56640
          if (self->private_impl.f_quirks[14u]) {
56641
            if (a_dst) {
56642
              a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
56643
            }
56644
            if (a_src) {
56645
              a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
56646
            }
56647
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(22);
56648
            status = wuffs_json__decoder__decode_inf_nan(self, a_dst, a_src);
56649
            if (a_dst) {
56650
              iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
56651
            }
56652
            if (a_src) {
56653
              iop_a_src = a_src->data.ptr + a_src->meta.ri;
56654
            }
56655
            if (status.repr) {
56656
              goto suspend;
56657
            }
56658
            break;
56659
          }
56660
        } else if (v_class == 12u) {
56661
          if (self->private_impl.f_quirks[11u] || self->private_impl.f_quirks[12u]) {
56662
            if (a_dst) {
56663
              a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
56664
            }
56665
            if (a_src) {
56666
              a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
56667
            }
56668
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(23);
56669
            status = wuffs_json__decoder__decode_comment(self, a_dst, a_src);
56670
            if (a_dst) {
56671
              iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
56672
            }
56673
            if (a_src) {
56674
              iop_a_src = a_src->data.ptr + a_src->meta.ri;
56675
            }
56676
            if (status.repr) {
56677
              goto suspend;
56678
            }
56679
            if (self->private_impl.f_comment_type > 0u) {
56680
              goto label__outer__continue;
56681
            }
56682
          }
56683
        }
56684
        status = wuffs_base__make_status(wuffs_json__error__bad_input);
56685
        goto exit;
56686
      }
56687
      if (v_depth == 0u) {
56688
        break;
56689
      }
56690
      v_expect = v_expect_after_value;
56691
    }
56692
    label__outer__break:;
56693
    if (self->private_impl.f_quirks[17u] || self->private_impl.f_quirks[18u]) {
56694
      if (a_dst) {
56695
        a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
56696
      }
56697
      if (a_src) {
56698
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
56699
      }
56700
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(24);
56701
      status = wuffs_json__decoder__decode_trailer(self, a_dst, a_src);
56702
      if (a_dst) {
56703
        iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
56704
      }
56705
      if (a_src) {
56706
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
56707
      }
56708
      if (status.repr) {
56709
        goto suspend;
56710
      }
56711
    }
56712
    self->private_impl.f_end_of_data = true;
56713
56714
    ok:
56715
    self->private_impl.p_decode_tokens = 0;
56716
    goto exit;
56717
  }
56718
56719
  goto suspend;
56720
  suspend:
56721
  self->private_impl.p_decode_tokens = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
56722
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
56723
  self->private_data.s_decode_tokens.v_depth = v_depth;
56724
  self->private_data.s_decode_tokens.v_expect = v_expect;
56725
  self->private_data.s_decode_tokens.v_expect_after_value = v_expect_after_value;
56726
56727
  goto exit;
56728
  exit:
56729
  if (a_dst && a_dst->data.ptr) {
56730
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
56731
  }
56732
  if (a_src && a_src->data.ptr) {
56733
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
56734
  }
56735
56736
  if (wuffs_base__status__is_error(&status)) {
56737
    self->private_impl.magic = WUFFS_BASE__DISABLED;
56738
  }
56739
  return status;
56740
}
56741
56742
// -------- func json.decoder.decode_number
56743
56744
WUFFS_BASE__GENERATED_C_CODE
56745
static uint32_t
56746
wuffs_json__decoder__decode_number(
56747
    wuffs_json__decoder* self,
56748
    wuffs_base__io_buffer* a_src) {
56749
  uint8_t v_c8 = 0;
56750
  uint32_t v_n = 0;
56751
  uint32_t v_floating_point = 0;
56752
56753
  const uint8_t* iop_a_src = NULL;
56754
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
56755
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
56756
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
56757
  if (a_src && a_src->data.ptr) {
56758
    io0_a_src = a_src->data.ptr;
56759
    io1_a_src = io0_a_src + a_src->meta.ri;
56760
    iop_a_src = io1_a_src;
56761
    io2_a_src = io0_a_src + a_src->meta.wi;
56762
  }
56763
56764
  do {
56765
    v_n = 0u;
56766
    if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
56767
      if ( ! (a_src && a_src->meta.closed)) {
56768
        v_n |= 768u;
56769
      }
56770
      break;
56771
    }
56772
    v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
56773
    if (v_c8 != 45u) {
56774
    } else {
56775
      v_n += 1u;
56776
      iop_a_src += 1u;
56777
      if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
56778
        if ( ! (a_src && a_src->meta.closed)) {
56779
          v_n |= 768u;
56780
        }
56781
        v_n |= 256u;
56782
        break;
56783
      }
56784
      v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
56785
    }
56786
    if (v_c8 == 48u) {
56787
      v_n += 1u;
56788
      iop_a_src += 1u;
56789
    } else {
56790
      if (a_src) {
56791
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
56792
      }
56793
      v_n = wuffs_json__decoder__decode_digits(self, a_src, v_n);
56794
      if (a_src) {
56795
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
56796
      }
56797
      if (v_n > 99u) {
56798
        break;
56799
      }
56800
    }
56801
    if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
56802
      if ( ! (a_src && a_src->meta.closed)) {
56803
        v_n |= 768u;
56804
      }
56805
      break;
56806
    }
56807
    v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
56808
    if (v_c8 != 46u) {
56809
    } else {
56810
      if (v_n >= 99u) {
56811
        v_n |= 512u;
56812
        break;
56813
      }
56814
      v_n += 1u;
56815
      iop_a_src += 1u;
56816
      v_floating_point = 128u;
56817
      if (a_src) {
56818
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
56819
      }
56820
      v_n = wuffs_json__decoder__decode_digits(self, a_src, v_n);
56821
      if (a_src) {
56822
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
56823
      }
56824
      if (v_n > 99u) {
56825
        break;
56826
      }
56827
      if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
56828
        if ( ! (a_src && a_src->meta.closed)) {
56829
          v_n |= 768u;
56830
        }
56831
        break;
56832
      }
56833
      v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
56834
    }
56835
    if ((v_c8 != 69u) && (v_c8 != 101u)) {
56836
      break;
56837
    }
56838
    if (v_n >= 99u) {
56839
      v_n |= 512u;
56840
      break;
56841
    }
56842
    v_n += 1u;
56843
    iop_a_src += 1u;
56844
    v_floating_point = 128u;
56845
    if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
56846
      if ( ! (a_src && a_src->meta.closed)) {
56847
        v_n |= 768u;
56848
      }
56849
      v_n |= 256u;
56850
      break;
56851
    }
56852
    v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
56853
    if ((v_c8 != 43u) && (v_c8 != 45u)) {
56854
    } else {
56855
      if (v_n >= 99u) {
56856
        v_n |= 512u;
56857
        break;
56858
      }
56859
      v_n += 1u;
56860
      iop_a_src += 1u;
56861
    }
56862
    if (a_src) {
56863
      a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
56864
    }
56865
    v_n = wuffs_json__decoder__decode_digits(self, a_src, v_n);
56866
    if (a_src) {
56867
      iop_a_src = a_src->data.ptr + a_src->meta.ri;
56868
    }
56869
  } while (0);
56870
  if (a_src && a_src->data.ptr) {
56871
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
56872
  }
56873
  return (v_n | v_floating_point);
56874
}
56875
56876
// -------- func json.decoder.decode_digits
56877
56878
WUFFS_BASE__GENERATED_C_CODE
56879
static uint32_t
56880
wuffs_json__decoder__decode_digits(
56881
    wuffs_json__decoder* self,
56882
    wuffs_base__io_buffer* a_src,
56883
    uint32_t a_n) {
56884
  uint8_t v_c8 = 0;
56885
  uint32_t v_n = 0;
56886
56887
  const uint8_t* iop_a_src = NULL;
56888
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
56889
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
56890
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
56891
  if (a_src && a_src->data.ptr) {
56892
    io0_a_src = a_src->data.ptr;
56893
    io1_a_src = io0_a_src + a_src->meta.ri;
56894
    iop_a_src = io1_a_src;
56895
    io2_a_src = io0_a_src + a_src->meta.wi;
56896
  }
56897
56898
  v_n = a_n;
56899
  while (true) {
56900
    if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
56901
      if ( ! (a_src && a_src->meta.closed)) {
56902
        v_n |= 768u;
56903
      }
56904
      break;
56905
    }
56906
    v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
56907
    if (0u == WUFFS_JSON__LUT_DECIMAL_DIGITS[v_c8]) {
56908
      break;
56909
    }
56910
    if (v_n >= 99u) {
56911
      v_n |= 512u;
56912
      break;
56913
    }
56914
    v_n += 1u;
56915
    iop_a_src += 1u;
56916
  }
56917
  if (v_n == a_n) {
56918
    v_n |= 256u;
56919
  }
56920
  if (a_src && a_src->data.ptr) {
56921
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
56922
  }
56923
  return v_n;
56924
}
56925
56926
// -------- func json.decoder.decode_leading
56927
56928
WUFFS_BASE__GENERATED_C_CODE
56929
static wuffs_base__status
56930
wuffs_json__decoder__decode_leading(
56931
    wuffs_json__decoder* self,
56932
    wuffs_base__token_buffer* a_dst,
56933
    wuffs_base__io_buffer* a_src) {
56934
  wuffs_base__status status = wuffs_base__make_status(NULL);
56935
56936
  uint8_t v_c8 = 0;
56937
  uint32_t v_u = 0;
56938
56939
  wuffs_base__token* iop_a_dst = NULL;
56940
  wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
56941
  wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
56942
  wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
56943
  if (a_dst && a_dst->data.ptr) {
56944
    io0_a_dst = a_dst->data.ptr;
56945
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
56946
    iop_a_dst = io1_a_dst;
56947
    io2_a_dst = io0_a_dst + a_dst->data.len;
56948
    if (a_dst->meta.closed) {
56949
      io2_a_dst = iop_a_dst;
56950
    }
56951
  }
56952
  const uint8_t* iop_a_src = NULL;
56953
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
56954
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
56955
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
56956
  if (a_src && a_src->data.ptr) {
56957
    io0_a_src = a_src->data.ptr;
56958
    io1_a_src = io0_a_src + a_src->meta.ri;
56959
    iop_a_src = io1_a_src;
56960
    io2_a_src = io0_a_src + a_src->meta.wi;
56961
  }
56962
56963
  uint32_t coro_susp_point = self->private_impl.p_decode_leading;
56964
  switch (coro_susp_point) {
56965
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
56966
56967
    self->private_impl.f_allow_leading_ars = self->private_impl.f_quirks[15u];
56968
    self->private_impl.f_allow_leading_ubom = self->private_impl.f_quirks[16u];
56969
    while (self->private_impl.f_allow_leading_ars || self->private_impl.f_allow_leading_ubom) {
56970
      if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
56971
        status = wuffs_base__make_status(wuffs_base__suspension__short_write);
56972
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
56973
        continue;
56974
      }
56975
      if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
56976
        if (a_src && a_src->meta.closed) {
56977
          break;
56978
        }
56979
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
56980
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2);
56981
        continue;
56982
      }
56983
      v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
56984
      if ((v_c8 == 30u) && self->private_impl.f_allow_leading_ars) {
56985
        self->private_impl.f_allow_leading_ars = false;
56986
        iop_a_src += 1u;
56987
        *iop_a_dst++ = wuffs_base__make_token(
56988
            (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
56989
            (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
56990
        continue;
56991
      } else if ((v_c8 == 239u) && self->private_impl.f_allow_leading_ubom) {
56992
        if (((uint64_t)(io2_a_src - iop_a_src)) < 3u) {
56993
          if (a_src && a_src->meta.closed) {
56994
            break;
56995
          }
56996
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
56997
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3);
56998
          continue;
56999
        }
57000
        v_u = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src)));
57001
        if (v_u == 12565487u) {
57002
          self->private_impl.f_allow_leading_ubom = false;
57003
          iop_a_src += 3u;
57004
          *iop_a_dst++ = wuffs_base__make_token(
57005
              (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
57006
              (((uint64_t)(3u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
57007
          continue;
57008
        }
57009
      }
57010
      break;
57011
    }
57012
57013
    ok:
57014
    self->private_impl.p_decode_leading = 0;
57015
    goto exit;
57016
  }
57017
57018
  goto suspend;
57019
  suspend:
57020
  self->private_impl.p_decode_leading = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
57021
57022
  goto exit;
57023
  exit:
57024
  if (a_dst && a_dst->data.ptr) {
57025
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
57026
  }
57027
  if (a_src && a_src->data.ptr) {
57028
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
57029
  }
57030
57031
  return status;
57032
}
57033
57034
// -------- func json.decoder.decode_comment
57035
57036
WUFFS_BASE__GENERATED_C_CODE
57037
static wuffs_base__status
57038
wuffs_json__decoder__decode_comment(
57039
    wuffs_json__decoder* self,
57040
    wuffs_base__token_buffer* a_dst,
57041
    wuffs_base__io_buffer* a_src) {
57042
  wuffs_base__status status = wuffs_base__make_status(NULL);
57043
57044
  uint8_t v_c8 = 0;
57045
  uint16_t v_c16 = 0;
57046
  uint32_t v_length = 0;
57047
57048
  wuffs_base__token* iop_a_dst = NULL;
57049
  wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
57050
  wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
57051
  wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
57052
  if (a_dst && a_dst->data.ptr) {
57053
    io0_a_dst = a_dst->data.ptr;
57054
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
57055
    iop_a_dst = io1_a_dst;
57056
    io2_a_dst = io0_a_dst + a_dst->data.len;
57057
    if (a_dst->meta.closed) {
57058
      io2_a_dst = iop_a_dst;
57059
    }
57060
  }
57061
  const uint8_t* iop_a_src = NULL;
57062
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
57063
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
57064
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
57065
  if (a_src && a_src->data.ptr) {
57066
    io0_a_src = a_src->data.ptr;
57067
    io1_a_src = io0_a_src + a_src->meta.ri;
57068
    iop_a_src = io1_a_src;
57069
    io2_a_src = io0_a_src + a_src->meta.wi;
57070
  }
57071
57072
  uint32_t coro_susp_point = self->private_impl.p_decode_comment;
57073
  switch (coro_susp_point) {
57074
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
57075
57076
    self->private_impl.f_comment_type = 0u;
57077
    while ((((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) || (((uint64_t)(io2_a_src - iop_a_src)) <= 1u)) {
57078
      if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
57079
        status = wuffs_base__make_status(wuffs_base__suspension__short_write);
57080
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
57081
        continue;
57082
      }
57083
      if (a_src && a_src->meta.closed) {
57084
        status = wuffs_base__make_status(NULL);
57085
        goto ok;
57086
      }
57087
      status = wuffs_base__make_status(wuffs_base__suspension__short_read);
57088
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2);
57089
    }
57090
    v_c16 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src);
57091
    if ((v_c16 == 10799u) && self->private_impl.f_quirks[11u]) {
57092
      iop_a_src += 2u;
57093
      v_length = 2u;
57094
      while (true) {
57095
        if (((uint64_t)(io2_a_src - iop_a_src)) <= 1u) {
57096
          if (v_length > 0u) {
57097
            *iop_a_dst++ = wuffs_base__make_token(
57098
                (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
57099
                (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
57100
                (((uint64_t)(v_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
57101
          }
57102
          if (a_src && a_src->meta.closed) {
57103
            status = wuffs_base__make_status(wuffs_json__error__bad_input);
57104
            goto exit;
57105
          }
57106
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
57107
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3);
57108
          while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
57109
            status = wuffs_base__make_status(wuffs_base__suspension__short_write);
57110
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4);
57111
          }
57112
          v_length = 0u;
57113
          continue;
57114
        }
57115
        v_c16 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src);
57116
        if (v_c16 == 12074u) {
57117
          iop_a_src += 2u;
57118
          *iop_a_dst++ = wuffs_base__make_token(
57119
              (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
57120
              (((uint64_t)((v_length + 2u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
57121
          self->private_impl.f_comment_type = 1u;
57122
          status = wuffs_base__make_status(NULL);
57123
          goto ok;
57124
        }
57125
        iop_a_src += 1u;
57126
        if (v_length >= 65533u) {
57127
          *iop_a_dst++ = wuffs_base__make_token(
57128
              (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
57129
              (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
57130
              (((uint64_t)((v_length + 1u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
57131
          while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
57132
            status = wuffs_base__make_status(wuffs_base__suspension__short_write);
57133
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5);
57134
          }
57135
          v_length = 0u;
57136
          continue;
57137
        }
57138
        v_length += 1u;
57139
      }
57140
    } else if ((v_c16 == 12079u) && self->private_impl.f_quirks[12u]) {
57141
      iop_a_src += 2u;
57142
      v_length = 2u;
57143
      while (true) {
57144
        if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
57145
          if (a_src && a_src->meta.closed) {
57146
            *iop_a_dst++ = wuffs_base__make_token(
57147
                (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
57148
                (((uint64_t)(v_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
57149
            self->private_impl.f_comment_type = 2u;
57150
            status = wuffs_base__make_status(NULL);
57151
            goto ok;
57152
          } else if (v_length > 0u) {
57153
            *iop_a_dst++ = wuffs_base__make_token(
57154
                (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
57155
                (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
57156
                (((uint64_t)(v_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
57157
          }
57158
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
57159
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6);
57160
          while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
57161
            status = wuffs_base__make_status(wuffs_base__suspension__short_write);
57162
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7);
57163
          }
57164
          v_length = 0u;
57165
          continue;
57166
        }
57167
        v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
57168
        if (v_c8 == 10u) {
57169
          *iop_a_dst++ = wuffs_base__make_token(
57170
              (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
57171
              (((uint64_t)(v_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
57172
          self->private_impl.f_comment_type = 2u;
57173
          status = wuffs_base__make_status(NULL);
57174
          goto ok;
57175
        }
57176
        iop_a_src += 1u;
57177
        if (v_length >= 65533u) {
57178
          *iop_a_dst++ = wuffs_base__make_token(
57179
              (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
57180
              (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
57181
              (((uint64_t)((v_length + 1u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
57182
          while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
57183
            status = wuffs_base__make_status(wuffs_base__suspension__short_write);
57184
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8);
57185
          }
57186
          v_length = 0u;
57187
          continue;
57188
        }
57189
        v_length += 1u;
57190
      }
57191
    }
57192
57193
    ok:
57194
    self->private_impl.p_decode_comment = 0;
57195
    goto exit;
57196
  }
57197
57198
  goto suspend;
57199
  suspend:
57200
  self->private_impl.p_decode_comment = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
57201
57202
  goto exit;
57203
  exit:
57204
  if (a_dst && a_dst->data.ptr) {
57205
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
57206
  }
57207
  if (a_src && a_src->data.ptr) {
57208
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
57209
  }
57210
57211
  return status;
57212
}
57213
57214
// -------- func json.decoder.decode_inf_nan
57215
57216
WUFFS_BASE__GENERATED_C_CODE
57217
static wuffs_base__status
57218
wuffs_json__decoder__decode_inf_nan(
57219
    wuffs_json__decoder* self,
57220
    wuffs_base__token_buffer* a_dst,
57221
    wuffs_base__io_buffer* a_src) {
57222
  wuffs_base__status status = wuffs_base__make_status(NULL);
57223
57224
  uint32_t v_c32 = 0;
57225
  uint32_t v_neg = 0;
57226
57227
  wuffs_base__token* iop_a_dst = NULL;
57228
  wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
57229
  wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
57230
  wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
57231
  if (a_dst && a_dst->data.ptr) {
57232
    io0_a_dst = a_dst->data.ptr;
57233
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
57234
    iop_a_dst = io1_a_dst;
57235
    io2_a_dst = io0_a_dst + a_dst->data.len;
57236
    if (a_dst->meta.closed) {
57237
      io2_a_dst = iop_a_dst;
57238
    }
57239
  }
57240
  const uint8_t* iop_a_src = NULL;
57241
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
57242
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
57243
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
57244
  if (a_src && a_src->data.ptr) {
57245
    io0_a_src = a_src->data.ptr;
57246
    io1_a_src = io0_a_src + a_src->meta.ri;
57247
    iop_a_src = io1_a_src;
57248
    io2_a_src = io0_a_src + a_src->meta.wi;
57249
  }
57250
57251
  uint32_t coro_susp_point = self->private_impl.p_decode_inf_nan;
57252
  switch (coro_susp_point) {
57253
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
57254
57255
    while (true) {
57256
      if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
57257
        status = wuffs_base__make_status(wuffs_base__suspension__short_write);
57258
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
57259
        continue;
57260
      }
57261
      if (((uint64_t)(io2_a_src - iop_a_src)) <= 2u) {
57262
        if (a_src && a_src->meta.closed) {
57263
          status = wuffs_base__make_status(wuffs_json__error__bad_input);
57264
          goto exit;
57265
        }
57266
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
57267
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2);
57268
        continue;
57269
      }
57270
      v_c32 = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src)));
57271
      if ((v_c32 | 2105376u) == 6712937u) {
57272
        if (((uint64_t)(io2_a_src - iop_a_src)) > 7u) {
57273
          if ((wuffs_base__peek_u64le__no_bounds_check(iop_a_src) | 2314885530818453536u) == 8751735898823356009u) {
57274
            *iop_a_dst++ = wuffs_base__make_token(
57275
                (((uint64_t)(10485792u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
57276
                (((uint64_t)(8u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
57277
            iop_a_src += 8u;
57278
            status = wuffs_base__make_status(NULL);
57279
            goto ok;
57280
          }
57281
        } else if ( ! (a_src && a_src->meta.closed)) {
57282
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
57283
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3);
57284
          continue;
57285
        }
57286
        *iop_a_dst++ = wuffs_base__make_token(
57287
            (((uint64_t)(10485792u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
57288
            (((uint64_t)(3u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
57289
        iop_a_src += 3u;
57290
        status = wuffs_base__make_status(NULL);
57291
        goto ok;
57292
      } else if ((v_c32 | 2105376u) == 7233902u) {
57293
        *iop_a_dst++ = wuffs_base__make_token(
57294
            (((uint64_t)(10485888u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
57295
            (((uint64_t)(3u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
57296
        iop_a_src += 3u;
57297
        status = wuffs_base__make_status(NULL);
57298
        goto ok;
57299
      } else if ((v_c32 & 255u) == 43u) {
57300
        v_neg = 0u;
57301
      } else if ((v_c32 & 255u) == 45u) {
57302
        v_neg = 1u;
57303
      } else {
57304
        status = wuffs_base__make_status(wuffs_json__error__bad_input);
57305
        goto exit;
57306
      }
57307
      if (((uint64_t)(io2_a_src - iop_a_src)) <= 3u) {
57308
        if (a_src && a_src->meta.closed) {
57309
          status = wuffs_base__make_status(wuffs_json__error__bad_input);
57310
          goto exit;
57311
        }
57312
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
57313
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4);
57314
        continue;
57315
      }
57316
      v_c32 = (wuffs_base__peek_u32le__no_bounds_check(iop_a_src) >> 8u);
57317
      if ((v_c32 | 2105376u) == 6712937u) {
57318
        if (((uint64_t)(io2_a_src - iop_a_src)) > 8u) {
57319
          if ((wuffs_base__peek_u64le__no_bounds_check(iop_a_src + 1u) | 2314885530818453536u) == 8751735898823356009u) {
57320
            *iop_a_dst++ = wuffs_base__make_token(
57321
                (((uint64_t)((10485760u | (((uint32_t)(32u)) >> v_neg)))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
57322
                (((uint64_t)(9u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
57323
            iop_a_src += 9u;
57324
            status = wuffs_base__make_status(NULL);
57325
            goto ok;
57326
          }
57327
        } else if ( ! (a_src && a_src->meta.closed)) {
57328
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
57329
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5);
57330
          continue;
57331
        }
57332
        *iop_a_dst++ = wuffs_base__make_token(
57333
            (((uint64_t)((10485760u | (((uint32_t)(32u)) >> v_neg)))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
57334
            (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
57335
        iop_a_src += 4u;
57336
        status = wuffs_base__make_status(NULL);
57337
        goto ok;
57338
      } else if ((v_c32 | 2105376u) == 7233902u) {
57339
        *iop_a_dst++ = wuffs_base__make_token(
57340
            (((uint64_t)((10485760u | (((uint32_t)(128u)) >> v_neg)))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
57341
            (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
57342
        iop_a_src += 4u;
57343
        status = wuffs_base__make_status(NULL);
57344
        goto ok;
57345
      }
57346
      status = wuffs_base__make_status(wuffs_json__error__bad_input);
57347
      goto exit;
57348
    }
57349
57350
    ok:
57351
    self->private_impl.p_decode_inf_nan = 0;
57352
    goto exit;
57353
  }
57354
57355
  goto suspend;
57356
  suspend:
57357
  self->private_impl.p_decode_inf_nan = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
57358
57359
  goto exit;
57360
  exit:
57361
  if (a_dst && a_dst->data.ptr) {
57362
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
57363
  }
57364
  if (a_src && a_src->data.ptr) {
57365
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
57366
  }
57367
57368
  return status;
57369
}
57370
57371
// -------- func json.decoder.decode_trailer
57372
57373
WUFFS_BASE__GENERATED_C_CODE
57374
static wuffs_base__status
57375
wuffs_json__decoder__decode_trailer(
57376
    wuffs_json__decoder* self,
57377
    wuffs_base__token_buffer* a_dst,
57378
    wuffs_base__io_buffer* a_src) {
57379
  wuffs_base__status status = wuffs_base__make_status(NULL);
57380
57381
  uint8_t v_c8 = 0;
57382
  uint32_t v_whitespace_length = 0;
57383
57384
  wuffs_base__token* iop_a_dst = NULL;
57385
  wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
57386
  wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
57387
  wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
57388
  if (a_dst && a_dst->data.ptr) {
57389
    io0_a_dst = a_dst->data.ptr;
57390
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
57391
    iop_a_dst = io1_a_dst;
57392
    io2_a_dst = io0_a_dst + a_dst->data.len;
57393
    if (a_dst->meta.closed) {
57394
      io2_a_dst = iop_a_dst;
57395
    }
57396
  }
57397
  const uint8_t* iop_a_src = NULL;
57398
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
57399
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
57400
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
57401
  if (a_src && a_src->data.ptr) {
57402
    io0_a_src = a_src->data.ptr;
57403
    io1_a_src = io0_a_src + a_src->meta.ri;
57404
    iop_a_src = io1_a_src;
57405
    io2_a_src = io0_a_src + a_src->meta.wi;
57406
  }
57407
57408
  uint32_t coro_susp_point = self->private_impl.p_decode_trailer;
57409
  switch (coro_susp_point) {
57410
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
57411
57412
    if (self->private_impl.f_quirks[18u]) {
57413
      self->private_impl.f_trailer_stop = 10u;
57414
    } else {
57415
      self->private_impl.f_trailer_stop = 0u;
57416
    }
57417
    label__outer__continue:;
57418
    while (true) {
57419
      if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
57420
        status = wuffs_base__make_status(wuffs_base__suspension__short_write);
57421
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
57422
        continue;
57423
      }
57424
      v_whitespace_length = 0u;
57425
      while (true) {
57426
        if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
57427
          if (v_whitespace_length > 0u) {
57428
            *iop_a_dst++ = wuffs_base__make_token(
57429
                (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
57430
                (((uint64_t)(v_whitespace_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
57431
          }
57432
          if (a_src && a_src->meta.closed) {
57433
            goto label__outer__break;
57434
          }
57435
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
57436
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2);
57437
          goto label__outer__continue;
57438
        }
57439
        v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
57440
        if (WUFFS_JSON__LUT_CLASSES[v_c8] != 0u) {
57441
          if (v_whitespace_length > 0u) {
57442
            *iop_a_dst++ = wuffs_base__make_token(
57443
                (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
57444
                (((uint64_t)(v_whitespace_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
57445
          }
57446
          if (self->private_impl.f_trailer_stop > 0u) {
57447
            status = wuffs_base__make_status(wuffs_json__error__bad_input);
57448
            goto exit;
57449
          }
57450
          if (a_dst) {
57451
            a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
57452
          }
57453
          if (a_src) {
57454
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
57455
          }
57456
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
57457
          status = wuffs_json__decoder__decode_comment(self, a_dst, a_src);
57458
          if (a_dst) {
57459
            iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
57460
          }
57461
          if (a_src) {
57462
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
57463
          }
57464
          if (status.repr) {
57465
            goto suspend;
57466
          }
57467
          if (self->private_impl.f_comment_type > 0u) {
57468
            goto label__outer__continue;
57469
          }
57470
          status = wuffs_base__make_status(NULL);
57471
          goto ok;
57472
        }
57473
        iop_a_src += 1u;
57474
        if ((v_whitespace_length >= 65534u) || (v_c8 == self->private_impl.f_trailer_stop)) {
57475
          *iop_a_dst++ = wuffs_base__make_token(
57476
              (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
57477
              (((uint64_t)((v_whitespace_length + 1u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
57478
          if (v_c8 == self->private_impl.f_trailer_stop) {
57479
            status = wuffs_base__make_status(NULL);
57480
            goto ok;
57481
          }
57482
          goto label__outer__continue;
57483
        }
57484
        v_whitespace_length += 1u;
57485
      }
57486
    }
57487
    label__outer__break:;
57488
57489
    ok:
57490
    self->private_impl.p_decode_trailer = 0;
57491
    goto exit;
57492
  }
57493
57494
  goto suspend;
57495
  suspend:
57496
  self->private_impl.p_decode_trailer = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
57497
57498
  goto exit;
57499
  exit:
57500
  if (a_dst && a_dst->data.ptr) {
57501
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
57502
  }
57503
  if (a_src && a_src->data.ptr) {
57504
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
57505
  }
57506
57507
  return status;
57508
}
57509
57510
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JSON)
57511
57512
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZMA)
57513
57514
// ---------------- Status Codes Implementations
57515
57516
const char wuffs_lzma__error__bad_lzma2_header[] = "#lzma: bad LZMA2 header";
57517
const char wuffs_lzma__error__bad_bitstream_trailer[] = "#lzma: bad bitstream trailer";
57518
const char wuffs_lzma__error__bad_code[] = "#lzma: bad code";
57519
const char wuffs_lzma__error__bad_decoded_length[] = "#lzma: bad decoded length";
57520
const char wuffs_lzma__error__bad_distance[] = "#lzma: bad distance";
57521
const char wuffs_lzma__error__bad_header[] = "#lzma: bad header";
57522
const char wuffs_lzma__error__truncated_input[] = "#lzma: truncated input";
57523
const char wuffs_lzma__error__unsupported_decoded_length[] = "#lzma: unsupported decoded length";
57524
const char wuffs_lzma__error__unsupported_properties[] = "#lzma: unsupported properties";
57525
const char wuffs_lzma__error__internal_error_inconsistent_i_o[] = "#lzma: internal error: inconsistent I/O";
57526
const char wuffs_lzma__error__internal_error_inconsistent_dictionary_state[] = "#lzma: internal error: inconsistent dictionary state";
57527
57528
// ---------------- Private Consts
57529
57530
static const uint8_t
57531
WUFFS_LZMA__STATE_TRANSITION_LITERAL[12] WUFFS_BASE__POTENTIALLY_UNUSED = {
57532
  0u, 0u, 0u, 0u, 1u, 2u, 3u, 4u,
57533
  5u, 6u, 4u, 5u,
57534
};
57535
57536
static const uint8_t
57537
WUFFS_LZMA__STATE_TRANSITION_MATCH[12] WUFFS_BASE__POTENTIALLY_UNUSED = {
57538
  7u, 7u, 7u, 7u, 7u, 7u, 7u, 10u,
57539
  10u, 10u, 10u, 10u,
57540
};
57541
57542
static const uint8_t
57543
WUFFS_LZMA__STATE_TRANSITION_LONGREP[12] WUFFS_BASE__POTENTIALLY_UNUSED = {
57544
  8u, 8u, 8u, 8u, 8u, 8u, 8u, 11u,
57545
  11u, 11u, 11u, 11u,
57546
};
57547
57548
static const uint8_t
57549
WUFFS_LZMA__STATE_TRANSITION_SHORTREP[12] WUFFS_BASE__POTENTIALLY_UNUSED = {
57550
  9u, 9u, 9u, 9u, 9u, 9u, 9u, 11u,
57551
  11u, 11u, 11u, 11u,
57552
};
57553
57554
static const uint8_t
57555
WUFFS_LZMA__CLAMP_NO_MORE_THAN_3[8] WUFFS_BASE__POTENTIALLY_UNUSED = {
57556
  0u, 1u, 2u, 3u, 3u, 3u, 3u, 3u,
57557
};
57558
57559
#define WUFFS_LZMA__QUIRKS_BASE 1290294272u
57560
57561
// ---------------- Private Initializer Prototypes
57562
57563
// ---------------- Private Function Prototypes
57564
57565
WUFFS_BASE__GENERATED_C_CODE
57566
static wuffs_base__status
57567
wuffs_lzma__decoder__decode_bitstream_fast(
57568
    wuffs_lzma__decoder* self,
57569
    wuffs_base__io_buffer* a_dst,
57570
    wuffs_base__io_buffer* a_src,
57571
    wuffs_base__slice_u8 a_workbuf);
57572
57573
WUFFS_BASE__GENERATED_C_CODE
57574
static wuffs_base__status
57575
wuffs_lzma__decoder__decode_bitstream_slow(
57576
    wuffs_lzma__decoder* self,
57577
    wuffs_base__io_buffer* a_dst,
57578
    wuffs_base__io_buffer* a_src,
57579
    wuffs_base__slice_u8 a_workbuf);
57580
57581
WUFFS_BASE__GENERATED_C_CODE
57582
static wuffs_base__status
57583
wuffs_lzma__decoder__add_history(
57584
    wuffs_lzma__decoder* self,
57585
    wuffs_base__slice_u8 a_hist,
57586
    wuffs_base__slice_u8 a_workbuf);
57587
57588
WUFFS_BASE__GENERATED_C_CODE
57589
static wuffs_base__status
57590
wuffs_lzma__decoder__do_transform_io(
57591
    wuffs_lzma__decoder* self,
57592
    wuffs_base__io_buffer* a_dst,
57593
    wuffs_base__io_buffer* a_src,
57594
    wuffs_base__slice_u8 a_workbuf);
57595
57596
WUFFS_BASE__GENERATED_C_CODE
57597
static wuffs_base__status
57598
wuffs_lzma__decoder__decode_bitstream(
57599
    wuffs_lzma__decoder* self,
57600
    wuffs_base__io_buffer* a_dst,
57601
    wuffs_base__io_buffer* a_src,
57602
    wuffs_base__slice_u8 a_workbuf);
57603
57604
WUFFS_BASE__GENERATED_C_CODE
57605
static wuffs_base__status
57606
wuffs_lzma__decoder__update_stashed_bytes(
57607
    wuffs_lzma__decoder* self,
57608
    wuffs_base__io_buffer* a_dst,
57609
    wuffs_base__slice_u8 a_workbuf);
57610
57611
WUFFS_BASE__GENERATED_C_CODE
57612
static wuffs_base__status
57613
wuffs_lzma__decoder__decode_optional_end_of_stream(
57614
    wuffs_lzma__decoder* self,
57615
    wuffs_base__io_buffer* a_src,
57616
    wuffs_base__slice_u8 a_workbuf);
57617
57618
WUFFS_BASE__GENERATED_C_CODE
57619
static wuffs_base__empty_struct
57620
wuffs_lzma__decoder__initialize_dict(
57621
    wuffs_lzma__decoder* self);
57622
57623
WUFFS_BASE__GENERATED_C_CODE
57624
static wuffs_base__empty_struct
57625
wuffs_lzma__decoder__initialize_probs(
57626
    wuffs_lzma__decoder* self);
57627
57628
// ---------------- VTables
57629
57630
const wuffs_base__io_transformer__func_ptrs
57631
wuffs_lzma__decoder__func_ptrs_for__wuffs_base__io_transformer = {
57632
  (wuffs_base__optional_u63(*)(const void*))(&wuffs_lzma__decoder__dst_history_retain_length),
57633
  (uint64_t(*)(const void*,
57634
      uint32_t))(&wuffs_lzma__decoder__get_quirk),
57635
  (wuffs_base__status(*)(void*,
57636
      uint32_t,
57637
      uint64_t))(&wuffs_lzma__decoder__set_quirk),
57638
  (wuffs_base__status(*)(void*,
57639
      wuffs_base__io_buffer*,
57640
      wuffs_base__io_buffer*,
57641
      wuffs_base__slice_u8))(&wuffs_lzma__decoder__transform_io),
57642
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_lzma__decoder__workbuf_len),
57643
};
57644
57645
// ---------------- Initializer Implementations
57646
57647
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
57648
wuffs_lzma__decoder__initialize(
57649
    wuffs_lzma__decoder* self,
57650
    size_t sizeof_star_self,
57651
    uint64_t wuffs_version,
57652
    uint32_t options){
57653
  if (!self) {
57654
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
57655
  }
57656
  if (sizeof(*self) != sizeof_star_self) {
57657
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
57658
  }
57659
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
57660
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
57661
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
57662
  }
57663
57664
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
57665
    // The whole point of this if-check is to detect an uninitialized *self.
57666
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
57667
#if !defined(__clang__) && defined(__GNUC__)
57668
#pragma GCC diagnostic push
57669
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
57670
#endif
57671
    if (self->private_impl.magic != 0) {
57672
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
57673
    }
57674
#if !defined(__clang__) && defined(__GNUC__)
57675
#pragma GCC diagnostic pop
57676
#endif
57677
  } else {
57678
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
57679
      memset(self, 0, sizeof(*self));
57680
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
57681
    } else {
57682
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
57683
    }
57684
  }
57685
57686
  self->private_impl.magic = WUFFS_BASE__MAGIC;
57687
  self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name =
57688
      wuffs_base__io_transformer__vtable_name;
57689
  self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers =
57690
      (const void*)(&wuffs_lzma__decoder__func_ptrs_for__wuffs_base__io_transformer);
57691
  return wuffs_base__make_status(NULL);
57692
}
57693
57694
wuffs_lzma__decoder*
57695
wuffs_lzma__decoder__alloc(void) {
57696
  wuffs_lzma__decoder* x =
57697
      (wuffs_lzma__decoder*)(calloc(1, sizeof(wuffs_lzma__decoder)));
57698
  if (!x) {
57699
    return NULL;
57700
  }
57701
  if (wuffs_lzma__decoder__initialize(
57702
      x, sizeof(wuffs_lzma__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
57703
    free(x);
57704
    return NULL;
57705
  }
57706
  return x;
57707
}
57708
57709
size_t
57710
sizeof__wuffs_lzma__decoder(void) {
57711
  return sizeof(wuffs_lzma__decoder);
57712
}
57713
57714
// ---------------- Function Implementations
57715
57716
// -------- func lzma.decoder.decode_bitstream_fast
57717
57718
WUFFS_BASE__GENERATED_C_CODE
57719
static wuffs_base__status
57720
wuffs_lzma__decoder__decode_bitstream_fast(
57721
    wuffs_lzma__decoder* self,
57722
    wuffs_base__io_buffer* a_dst,
57723
    wuffs_base__io_buffer* a_src,
57724
    wuffs_base__slice_u8 a_workbuf) {
57725
  wuffs_base__status status = wuffs_base__make_status(NULL);
57726
57727
  uint8_t v_c8 = 0;
57728
  uint32_t v_bits = 0;
57729
  uint32_t v_range = 0;
57730
  uint32_t v_state = 0;
57731
  uint32_t v_rep0 = 0;
57732
  uint32_t v_rep1 = 0;
57733
  uint32_t v_rep2 = 0;
57734
  uint32_t v_rep3 = 0;
57735
  uint32_t v_reptmp = 0;
57736
  uint32_t v_rep = 0;
57737
  uint64_t v_pos = 0;
57738
  uint64_t v_pos_end = 0;
57739
  uint32_t v_lc = 0;
57740
  uint64_t v_lp_mask = 0;
57741
  uint64_t v_pb_mask = 0;
57742
  uint32_t v_prob = 0;
57743
  uint32_t v_threshold = 0;
57744
  uint32_t v_tree_node = 0;
57745
  uint8_t v_prev_byte = 0;
57746
  uint32_t v_match_byte = 0;
57747
  uint32_t v_match_cusp = 0;
57748
  uint32_t v_len_state = 0;
57749
  uint32_t v_slot = 0;
57750
  uint32_t v_len = 0;
57751
  uint32_t v_lanl_offset = 0;
57752
  uint32_t v_lanl_old_offset = 0;
57753
  uint32_t v_lanl_index = 0;
57754
  uint32_t v_num_extra_bits = 0;
57755
  uint32_t v_dist_extra_bits = 0;
57756
  uint32_t v_high_bit_was_on = 0;
57757
  uint32_t v_i = 0;
57758
  uint32_t v_index_ao00 = 0;
57759
  uint32_t v_index_ao41 = 0;
57760
  uint32_t v_index_lit = 0;
57761
  uint32_t v_index_len = 0;
57762
  uint32_t v_index_small_dist_base = 0;
57763
  uint32_t v_index_small_dist_extra = 0;
57764
  uint32_t v_index_small_dist = 0;
57765
  uint32_t v_index_large_dist = 0;
57766
  uint32_t v_dist = 0;
57767
  uint32_t v_adj_dist = 0;
57768
  uint64_t v_wb_index = 0;
57769
57770
  uint8_t* iop_a_dst = NULL;
57771
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
57772
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
57773
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
57774
  if (a_dst && a_dst->data.ptr) {
57775
    io0_a_dst = a_dst->data.ptr;
57776
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
57777
    iop_a_dst = io1_a_dst;
57778
    io2_a_dst = io0_a_dst + a_dst->data.len;
57779
    if (a_dst->meta.closed) {
57780
      io2_a_dst = iop_a_dst;
57781
    }
57782
  }
57783
  const uint8_t* iop_a_src = NULL;
57784
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
57785
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
57786
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
57787
  if (a_src && a_src->data.ptr) {
57788
    io0_a_src = a_src->data.ptr;
57789
    io1_a_src = io0_a_src + a_src->meta.ri;
57790
    iop_a_src = io1_a_src;
57791
    io2_a_src = io0_a_src + a_src->meta.wi;
57792
  }
57793
57794
  v_prev_byte = self->private_impl.f_stashed_bytes[0u];
57795
  v_match_byte = ((uint32_t)(self->private_impl.f_stashed_bytes[1u]));
57796
  v_bits = self->private_impl.f_stashed_bits;
57797
  v_range = self->private_impl.f_stashed_range;
57798
  v_state = self->private_impl.f_stashed_state;
57799
  v_rep0 = self->private_impl.f_stashed_rep0;
57800
  v_rep1 = self->private_impl.f_stashed_rep1;
57801
  v_rep2 = self->private_impl.f_stashed_rep2;
57802
  v_rep3 = self->private_impl.f_stashed_rep3;
57803
  v_pos = self->private_impl.f_stashed_pos;
57804
  v_pos_end = self->private_impl.f_stashed_pos_end;
57805
  v_lc = self->private_impl.f_lc;
57806
  v_lp_mask = ((((uint64_t)(1u)) << self->private_impl.f_lp) - 1u);
57807
  v_pb_mask = ((((uint64_t)(1u)) << self->private_impl.f_pb) - 1u);
57808
  while ((((uint64_t)(io2_a_dst - iop_a_dst)) >= 282u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 48u)) {
57809
    if (v_pos >= v_pos_end) {
57810
      self->private_impl.f_end_of_chunk = true;
57811
      break;
57812
    }
57813
    v_index_ao00 = ((v_state << 4u) | ((uint32_t)((v_pos & v_pb_mask))));
57814
    v_prob = ((uint32_t)(self->private_data.f_probs_ao00[v_index_ao00]));
57815
    v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
57816
    if (v_bits < v_threshold) {
57817
      v_range = v_threshold;
57818
      v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
57819
      self->private_data.f_probs_ao00[v_index_ao00] = ((uint16_t)(v_prob));
57820
      if ((v_range >> 24u) == 0u) {
57821
        v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
57822
        iop_a_src += 1u;
57823
        v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
57824
        v_range <<= 8u;
57825
      }
57826
      v_index_lit = (15u & ((((uint32_t)((v_pos & v_lp_mask))) << v_lc) | (((uint32_t)(v_prev_byte)) >> (8u - v_lc))));
57827
      v_lanl_offset = 0u;
57828
      if (v_state >= 7u) {
57829
        v_lanl_offset = 256u;
57830
      }
57831
      v_tree_node = 1u;
57832
      while (v_tree_node < 256u) {
57833
        v_match_byte <<= 1u;
57834
        v_lanl_old_offset = v_lanl_offset;
57835
        v_lanl_offset &= v_match_byte;
57836
        v_lanl_index = (v_lanl_offset + v_lanl_old_offset + v_tree_node);
57837
        v_prob = ((uint32_t)(self->private_data.f_probs_lit[v_index_lit][v_lanl_index]));
57838
        v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
57839
        if (v_bits < v_threshold) {
57840
          v_lanl_offset = ((v_lanl_offset ^ v_lanl_old_offset) & 256u);
57841
          v_range = v_threshold;
57842
          v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
57843
          self->private_data.f_probs_lit[v_index_lit][v_lanl_index] = ((uint16_t)(v_prob));
57844
          v_tree_node = (v_tree_node << 1u);
57845
        } else {
57846
          v_bits -= v_threshold;
57847
          v_range -= v_threshold;
57848
          v_prob -= (v_prob >> 5u);
57849
          self->private_data.f_probs_lit[v_index_lit][v_lanl_index] = ((uint16_t)(v_prob));
57850
          v_tree_node = ((v_tree_node << 1u) | 1u);
57851
        }
57852
        if ((v_range >> 24u) == 0u) {
57853
          if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
57854
            status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
57855
            goto exit;
57856
          }
57857
          v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
57858
          iop_a_src += 1u;
57859
          v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
57860
          v_range <<= 8u;
57861
        }
57862
      }
57863
      v_prev_byte = ((uint8_t)(v_tree_node));
57864
      (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, v_prev_byte), iop_a_dst += 1);
57865
      v_pos += 1u;
57866
      v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_LITERAL[v_state]));
57867
      continue;
57868
    }
57869
    v_bits -= v_threshold;
57870
    v_range -= v_threshold;
57871
    v_prob -= (v_prob >> 5u);
57872
    self->private_data.f_probs_ao00[v_index_ao00] = ((uint16_t)(v_prob));
57873
    if ((v_range >> 24u) == 0u) {
57874
      v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
57875
      iop_a_src += 1u;
57876
      v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
57877
      v_range <<= 8u;
57878
    } else {
57879
    }
57880
    do {
57881
      v_prob = ((uint32_t)(self->private_data.f_probs_ao20[v_state]));
57882
      v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
57883
      if (v_bits < v_threshold) {
57884
        v_range = v_threshold;
57885
        v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
57886
        self->private_data.f_probs_ao20[v_state] = ((uint16_t)(v_prob));
57887
        if ((v_range >> 24u) == 0u) {
57888
          v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
57889
          iop_a_src += 1u;
57890
          v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
57891
          v_range <<= 8u;
57892
        } else {
57893
        }
57894
        do {
57895
          v_prob = ((uint32_t)(self->private_data.f_probs_match_len_low[0u][0u]));
57896
          v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
57897
          if (v_bits < v_threshold) {
57898
            v_range = v_threshold;
57899
            v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
57900
            self->private_data.f_probs_match_len_low[0u][0u] = ((uint16_t)(v_prob));
57901
            if ((v_range >> 24u) == 0u) {
57902
              v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
57903
              iop_a_src += 1u;
57904
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
57905
              v_range <<= 8u;
57906
            }
57907
            v_index_len = ((uint32_t)((v_pos & v_pb_mask)));
57908
            v_tree_node = 1u;
57909
            while (v_tree_node < 8u) {
57910
              v_prob = ((uint32_t)(self->private_data.f_probs_match_len_low[v_index_len][v_tree_node]));
57911
              v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
57912
              if (v_bits < v_threshold) {
57913
                v_range = v_threshold;
57914
                v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
57915
                self->private_data.f_probs_match_len_low[v_index_len][v_tree_node] = ((uint16_t)(v_prob));
57916
                v_tree_node = (v_tree_node << 1u);
57917
              } else {
57918
                v_bits -= v_threshold;
57919
                v_range -= v_threshold;
57920
                v_prob -= (v_prob >> 5u);
57921
                self->private_data.f_probs_match_len_low[v_index_len][v_tree_node] = ((uint16_t)(v_prob));
57922
                v_tree_node = ((v_tree_node << 1u) | 1u);
57923
              }
57924
              if ((v_range >> 24u) == 0u) {
57925
                if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
57926
                  status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
57927
                  goto exit;
57928
                }
57929
                v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
57930
                iop_a_src += 1u;
57931
                v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
57932
                v_range <<= 8u;
57933
              }
57934
            }
57935
            v_len_state = ((uint32_t)(WUFFS_LZMA__CLAMP_NO_MORE_THAN_3[(v_tree_node & 7u)]));
57936
            v_len = ((v_tree_node & 7u) + 2u);
57937
            break;
57938
          }
57939
          v_bits -= v_threshold;
57940
          v_range -= v_threshold;
57941
          v_prob -= (v_prob >> 5u);
57942
          self->private_data.f_probs_match_len_low[0u][0u] = ((uint16_t)(v_prob));
57943
          if ((v_range >> 24u) == 0u) {
57944
            if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
57945
              status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
57946
              goto exit;
57947
            }
57948
            v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
57949
            iop_a_src += 1u;
57950
            v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
57951
            v_range <<= 8u;
57952
          }
57953
          v_prob = ((uint32_t)(self->private_data.f_probs_match_len_mid[0u][0u]));
57954
          v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
57955
          if (v_bits < v_threshold) {
57956
            v_range = v_threshold;
57957
            v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
57958
            self->private_data.f_probs_match_len_mid[0u][0u] = ((uint16_t)(v_prob));
57959
            if ((v_range >> 24u) == 0u) {
57960
              if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
57961
                status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
57962
                goto exit;
57963
              }
57964
              v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
57965
              iop_a_src += 1u;
57966
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
57967
              v_range <<= 8u;
57968
            }
57969
            v_index_len = ((uint32_t)((v_pos & v_pb_mask)));
57970
            v_tree_node = 1u;
57971
            while (v_tree_node < 8u) {
57972
              v_prob = ((uint32_t)(self->private_data.f_probs_match_len_mid[v_index_len][v_tree_node]));
57973
              v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
57974
              if (v_bits < v_threshold) {
57975
                v_range = v_threshold;
57976
                v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
57977
                self->private_data.f_probs_match_len_mid[v_index_len][v_tree_node] = ((uint16_t)(v_prob));
57978
                v_tree_node = (v_tree_node << 1u);
57979
              } else {
57980
                v_bits -= v_threshold;
57981
                v_range -= v_threshold;
57982
                v_prob -= (v_prob >> 5u);
57983
                self->private_data.f_probs_match_len_mid[v_index_len][v_tree_node] = ((uint16_t)(v_prob));
57984
                v_tree_node = ((v_tree_node << 1u) | 1u);
57985
              }
57986
              if ((v_range >> 24u) == 0u) {
57987
                if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
57988
                  status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
57989
                  goto exit;
57990
                }
57991
                v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
57992
                iop_a_src += 1u;
57993
                v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
57994
                v_range <<= 8u;
57995
              }
57996
            }
57997
            v_len = ((v_tree_node & 7u) + 10u);
57998
            v_len_state = 3u;
57999
            break;
58000
          }
58001
          v_bits -= v_threshold;
58002
          v_range -= v_threshold;
58003
          v_prob -= (v_prob >> 5u);
58004
          self->private_data.f_probs_match_len_mid[0u][0u] = ((uint16_t)(v_prob));
58005
          if ((v_range >> 24u) == 0u) {
58006
            if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
58007
              status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
58008
              goto exit;
58009
            }
58010
            v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
58011
            iop_a_src += 1u;
58012
            v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
58013
            v_range <<= 8u;
58014
          }
58015
          v_tree_node = 1u;
58016
          while (v_tree_node < 256u) {
58017
            v_prob = ((uint32_t)(self->private_data.f_probs_match_len_high[0u][v_tree_node]));
58018
            v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
58019
            if (v_bits < v_threshold) {
58020
              v_range = v_threshold;
58021
              v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
58022
              self->private_data.f_probs_match_len_high[0u][v_tree_node] = ((uint16_t)(v_prob));
58023
              v_tree_node = (v_tree_node << 1u);
58024
            } else {
58025
              v_bits -= v_threshold;
58026
              v_range -= v_threshold;
58027
              v_prob -= (v_prob >> 5u);
58028
              self->private_data.f_probs_match_len_high[0u][v_tree_node] = ((uint16_t)(v_prob));
58029
              v_tree_node = ((v_tree_node << 1u) | 1u);
58030
            }
58031
            if ((v_range >> 24u) == 0u) {
58032
              if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
58033
                status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
58034
                goto exit;
58035
              }
58036
              v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
58037
              iop_a_src += 1u;
58038
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
58039
              v_range <<= 8u;
58040
            }
58041
          }
58042
          v_len = ((v_tree_node & 255u) + 18u);
58043
          v_len_state = 3u;
58044
        } while (0);
58045
        v_slot = 1u;
58046
        while (v_slot < 64u) {
58047
          v_prob = ((uint32_t)(self->private_data.f_probs_slot[v_len_state][v_slot]));
58048
          v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
58049
          if (v_bits < v_threshold) {
58050
            v_range = v_threshold;
58051
            v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
58052
            self->private_data.f_probs_slot[v_len_state][v_slot] = ((uint16_t)(v_prob));
58053
            v_slot = (v_slot << 1u);
58054
          } else {
58055
            v_bits -= v_threshold;
58056
            v_range -= v_threshold;
58057
            v_prob -= (v_prob >> 5u);
58058
            self->private_data.f_probs_slot[v_len_state][v_slot] = ((uint16_t)(v_prob));
58059
            v_slot = ((v_slot << 1u) | 1u);
58060
          }
58061
          if ((v_range >> 24u) == 0u) {
58062
            if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
58063
              status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
58064
              goto exit;
58065
            }
58066
            v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
58067
            iop_a_src += 1u;
58068
            v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
58069
            v_range <<= 8u;
58070
          }
58071
        }
58072
        v_slot &= 63u;
58073
        v_rep = v_slot;
58074
        if (v_slot < 4u) {
58075
        } else if (v_slot < 14u) {
58076
          v_num_extra_bits = ((v_slot >> 1u) - 1u);
58077
          v_rep = ((2u | (v_slot & 1u)) << v_num_extra_bits);
58078
          v_index_small_dist_base = ((uint32_t)(v_rep - v_slot));
58079
          v_index_small_dist_extra = 1u;
58080
          v_dist_extra_bits = 0u;
58081
          v_i = 0u;
58082
          while (v_i < v_num_extra_bits) {
58083
            v_index_small_dist = (((uint32_t)(v_index_small_dist_base + v_index_small_dist_extra)) & 127u);
58084
            v_prob = ((uint32_t)(self->private_data.f_probs_small_dist[v_index_small_dist]));
58085
            v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
58086
            if (v_bits < v_threshold) {
58087
              v_range = v_threshold;
58088
              v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
58089
              self->private_data.f_probs_small_dist[v_index_small_dist] = ((uint16_t)(v_prob));
58090
              v_index_small_dist_extra = ((uint32_t)(v_index_small_dist_extra << 1u));
58091
              v_i += 1u;
58092
            } else {
58093
              v_bits -= v_threshold;
58094
              v_range -= v_threshold;
58095
              v_prob -= (v_prob >> 5u);
58096
              self->private_data.f_probs_small_dist[v_index_small_dist] = ((uint16_t)(v_prob));
58097
              v_index_small_dist_extra = (((uint32_t)(v_index_small_dist_extra << 1u)) | 1u);
58098
              v_dist_extra_bits |= (((uint32_t)(1u)) << v_i);
58099
              v_i += 1u;
58100
            }
58101
            if ((v_range >> 24u) == 0u) {
58102
              if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
58103
                status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
58104
                goto exit;
58105
              }
58106
              v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
58107
              iop_a_src += 1u;
58108
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
58109
              v_range <<= 8u;
58110
            }
58111
          }
58112
          v_rep += v_dist_extra_bits;
58113
        } else {
58114
          v_num_extra_bits = ((v_slot >> 1u) - 1u);
58115
          v_rep = ((2u | (v_slot & 1u)) << v_num_extra_bits);
58116
          v_dist_extra_bits = 0u;
58117
          while (true) {
58118
            v_range >>= 1u;
58119
            v_bits -= v_range;
58120
            v_high_bit_was_on = ((uint32_t)(0u - (v_bits >> 31u)));
58121
            v_bits += (v_range & v_high_bit_was_on);
58122
            v_dist_extra_bits = (((uint32_t)(v_dist_extra_bits << 1u)) | (((uint32_t)(v_high_bit_was_on + 1u)) & 1u));
58123
            if ((v_range >> 24u) == 0u) {
58124
              if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
58125
                status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
58126
                goto exit;
58127
              }
58128
              v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
58129
              iop_a_src += 1u;
58130
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
58131
              v_range <<= 8u;
58132
            }
58133
            v_num_extra_bits -= 1u;
58134
            if (v_num_extra_bits <= 4u) {
58135
              break;
58136
            }
58137
          }
58138
          v_dist_extra_bits <<= 4u;
58139
          v_index_large_dist = 1u;
58140
          while (true) {
58141
            v_prob = ((uint32_t)(self->private_data.f_probs_large_dist[v_index_large_dist]));
58142
            v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
58143
            if (v_bits < v_threshold) {
58144
              v_range = v_threshold;
58145
              v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
58146
              self->private_data.f_probs_large_dist[v_index_large_dist] = ((uint16_t)(v_prob));
58147
              v_index_large_dist = (15u & ((uint32_t)(v_index_large_dist << 1u)));
58148
            } else {
58149
              v_bits -= v_threshold;
58150
              v_range -= v_threshold;
58151
              v_prob -= (v_prob >> 5u);
58152
              self->private_data.f_probs_large_dist[v_index_large_dist] = ((uint16_t)(v_prob));
58153
              v_index_large_dist = (15u & (((uint32_t)(v_index_large_dist << 1u)) | 1u));
58154
              v_dist_extra_bits |= (((uint32_t)(1u)) << (4u - v_num_extra_bits));
58155
            }
58156
            if ((v_range >> 24u) == 0u) {
58157
              if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
58158
                status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
58159
                goto exit;
58160
              }
58161
              v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
58162
              iop_a_src += 1u;
58163
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
58164
              v_range <<= 8u;
58165
            }
58166
            v_num_extra_bits -= 1u;
58167
            if (v_num_extra_bits <= 0u) {
58168
              break;
58169
            }
58170
          }
58171
          v_rep += v_dist_extra_bits;
58172
        }
58173
        if (v_rep >= 4294967295u) {
58174
          self->private_impl.f_end_of_chunk = true;
58175
          goto label__outer__break;
58176
        }
58177
        v_rep3 = v_rep2;
58178
        v_rep2 = v_rep1;
58179
        v_rep1 = v_rep0;
58180
        v_rep0 = v_rep;
58181
        v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_MATCH[v_state]));
58182
        break;
58183
      }
58184
      v_bits -= v_threshold;
58185
      v_range -= v_threshold;
58186
      v_prob -= (v_prob >> 5u);
58187
      self->private_data.f_probs_ao20[v_state] = ((uint16_t)(v_prob));
58188
      if ((v_range >> 24u) == 0u) {
58189
        v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
58190
        iop_a_src += 1u;
58191
        v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
58192
        v_range <<= 8u;
58193
      } else {
58194
      }
58195
      v_prob = ((uint32_t)(self->private_data.f_probs_ao40[v_state]));
58196
      v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
58197
      if (v_bits < v_threshold) {
58198
        v_range = v_threshold;
58199
        v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
58200
        self->private_data.f_probs_ao40[v_state] = ((uint16_t)(v_prob));
58201
        if ((v_range >> 24u) == 0u) {
58202
          v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
58203
          iop_a_src += 1u;
58204
          v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
58205
          v_range <<= 8u;
58206
        } else {
58207
        }
58208
        v_index_ao41 = ((v_state << 4u) | ((uint32_t)((v_pos & v_pb_mask))));
58209
        v_prob = ((uint32_t)(self->private_data.f_probs_ao41[v_index_ao41]));
58210
        v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
58211
        if (v_bits < v_threshold) {
58212
          v_range = v_threshold;
58213
          v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
58214
          self->private_data.f_probs_ao41[v_index_ao41] = ((uint16_t)(v_prob));
58215
          if ((v_range >> 24u) == 0u) {
58216
            v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
58217
            iop_a_src += 1u;
58218
            v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
58219
            v_range <<= 8u;
58220
          }
58221
          v_len = 1u;
58222
          v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_SHORTREP[v_state]));
58223
          break;
58224
        }
58225
        v_bits -= v_threshold;
58226
        v_range -= v_threshold;
58227
        v_prob -= (v_prob >> 5u);
58228
        self->private_data.f_probs_ao41[v_index_ao41] = ((uint16_t)(v_prob));
58229
        if ((v_range >> 24u) == 0u) {
58230
          v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
58231
          iop_a_src += 1u;
58232
          v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
58233
          v_range <<= 8u;
58234
        }
58235
      } else {
58236
        v_bits -= v_threshold;
58237
        v_range -= v_threshold;
58238
        v_prob -= (v_prob >> 5u);
58239
        self->private_data.f_probs_ao40[v_state] = ((uint16_t)(v_prob));
58240
        if ((v_range >> 24u) == 0u) {
58241
          v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
58242
          iop_a_src += 1u;
58243
          v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
58244
          v_range <<= 8u;
58245
        } else {
58246
        }
58247
        v_prob = ((uint32_t)(self->private_data.f_probs_ao60[v_state]));
58248
        v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
58249
        if (v_bits < v_threshold) {
58250
          v_range = v_threshold;
58251
          v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
58252
          self->private_data.f_probs_ao60[v_state] = ((uint16_t)(v_prob));
58253
          if ((v_range >> 24u) == 0u) {
58254
            v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
58255
            iop_a_src += 1u;
58256
            v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
58257
            v_range <<= 8u;
58258
          }
58259
          v_reptmp = v_rep1;
58260
          v_rep1 = v_rep0;
58261
          v_rep0 = v_reptmp;
58262
        } else {
58263
          v_bits -= v_threshold;
58264
          v_range -= v_threshold;
58265
          v_prob -= (v_prob >> 5u);
58266
          self->private_data.f_probs_ao60[v_state] = ((uint16_t)(v_prob));
58267
          if ((v_range >> 24u) == 0u) {
58268
            v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
58269
            iop_a_src += 1u;
58270
            v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
58271
            v_range <<= 8u;
58272
          } else {
58273
          }
58274
          v_prob = ((uint32_t)(self->private_data.f_probs_ao63[v_state]));
58275
          v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
58276
          if (v_bits < v_threshold) {
58277
            v_range = v_threshold;
58278
            v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
58279
            self->private_data.f_probs_ao63[v_state] = ((uint16_t)(v_prob));
58280
            if ((v_range >> 24u) == 0u) {
58281
              v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
58282
              iop_a_src += 1u;
58283
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
58284
              v_range <<= 8u;
58285
            }
58286
            v_reptmp = v_rep2;
58287
            v_rep2 = v_rep1;
58288
            v_rep1 = v_rep0;
58289
            v_rep0 = v_reptmp;
58290
          } else {
58291
            v_bits -= v_threshold;
58292
            v_range -= v_threshold;
58293
            v_prob -= (v_prob >> 5u);
58294
            self->private_data.f_probs_ao63[v_state] = ((uint16_t)(v_prob));
58295
            if ((v_range >> 24u) == 0u) {
58296
              v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
58297
              iop_a_src += 1u;
58298
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
58299
              v_range <<= 8u;
58300
            }
58301
            v_reptmp = v_rep3;
58302
            v_rep3 = v_rep2;
58303
            v_rep2 = v_rep1;
58304
            v_rep1 = v_rep0;
58305
            v_rep0 = v_reptmp;
58306
          }
58307
        }
58308
      }
58309
      do {
58310
        v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_low[0u][0u]));
58311
        v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
58312
        if (v_bits < v_threshold) {
58313
          v_range = v_threshold;
58314
          v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
58315
          self->private_data.f_probs_longrep_len_low[0u][0u] = ((uint16_t)(v_prob));
58316
          if ((v_range >> 24u) == 0u) {
58317
            if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
58318
              status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
58319
              goto exit;
58320
            }
58321
            v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
58322
            iop_a_src += 1u;
58323
            v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
58324
            v_range <<= 8u;
58325
          }
58326
          v_index_len = ((uint32_t)((v_pos & v_pb_mask)));
58327
          v_tree_node = 1u;
58328
          while (v_tree_node < 8u) {
58329
            v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_low[v_index_len][v_tree_node]));
58330
            v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
58331
            if (v_bits < v_threshold) {
58332
              v_range = v_threshold;
58333
              v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
58334
              self->private_data.f_probs_longrep_len_low[v_index_len][v_tree_node] = ((uint16_t)(v_prob));
58335
              v_tree_node = (v_tree_node << 1u);
58336
            } else {
58337
              v_bits -= v_threshold;
58338
              v_range -= v_threshold;
58339
              v_prob -= (v_prob >> 5u);
58340
              self->private_data.f_probs_longrep_len_low[v_index_len][v_tree_node] = ((uint16_t)(v_prob));
58341
              v_tree_node = ((v_tree_node << 1u) | 1u);
58342
            }
58343
            if ((v_range >> 24u) == 0u) {
58344
              if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
58345
                status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
58346
                goto exit;
58347
              }
58348
              v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
58349
              iop_a_src += 1u;
58350
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
58351
              v_range <<= 8u;
58352
            }
58353
          }
58354
          v_len = ((v_tree_node & 7u) + 2u);
58355
          v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_LONGREP[v_state]));
58356
          break;
58357
        }
58358
        v_bits -= v_threshold;
58359
        v_range -= v_threshold;
58360
        v_prob -= (v_prob >> 5u);
58361
        self->private_data.f_probs_longrep_len_low[0u][0u] = ((uint16_t)(v_prob));
58362
        if ((v_range >> 24u) == 0u) {
58363
          if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
58364
            status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
58365
            goto exit;
58366
          }
58367
          v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
58368
          iop_a_src += 1u;
58369
          v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
58370
          v_range <<= 8u;
58371
        }
58372
        v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_mid[0u][0u]));
58373
        v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
58374
        if (v_bits < v_threshold) {
58375
          v_range = v_threshold;
58376
          v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
58377
          self->private_data.f_probs_longrep_len_mid[0u][0u] = ((uint16_t)(v_prob));
58378
          if ((v_range >> 24u) == 0u) {
58379
            if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
58380
              status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
58381
              goto exit;
58382
            }
58383
            v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
58384
            iop_a_src += 1u;
58385
            v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
58386
            v_range <<= 8u;
58387
          }
58388
          v_index_len = ((uint32_t)((v_pos & v_pb_mask)));
58389
          v_tree_node = 1u;
58390
          while (v_tree_node < 8u) {
58391
            v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_mid[v_index_len][v_tree_node]));
58392
            v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
58393
            if (v_bits < v_threshold) {
58394
              v_range = v_threshold;
58395
              v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
58396
              self->private_data.f_probs_longrep_len_mid[v_index_len][v_tree_node] = ((uint16_t)(v_prob));
58397
              v_tree_node = (v_tree_node << 1u);
58398
            } else {
58399
              v_bits -= v_threshold;
58400
              v_range -= v_threshold;
58401
              v_prob -= (v_prob >> 5u);
58402
              self->private_data.f_probs_longrep_len_mid[v_index_len][v_tree_node] = ((uint16_t)(v_prob));
58403
              v_tree_node = ((v_tree_node << 1u) | 1u);
58404
            }
58405
            if ((v_range >> 24u) == 0u) {
58406
              if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
58407
                status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
58408
                goto exit;
58409
              }
58410
              v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
58411
              iop_a_src += 1u;
58412
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
58413
              v_range <<= 8u;
58414
            }
58415
          }
58416
          v_len = ((v_tree_node & 7u) + 10u);
58417
          v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_LONGREP[v_state]));
58418
          break;
58419
        }
58420
        v_bits -= v_threshold;
58421
        v_range -= v_threshold;
58422
        v_prob -= (v_prob >> 5u);
58423
        self->private_data.f_probs_longrep_len_mid[0u][0u] = ((uint16_t)(v_prob));
58424
        if ((v_range >> 24u) == 0u) {
58425
          if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
58426
            status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
58427
            goto exit;
58428
          }
58429
          v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
58430
          iop_a_src += 1u;
58431
          v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
58432
          v_range <<= 8u;
58433
        }
58434
        v_tree_node = 1u;
58435
        while (v_tree_node < 256u) {
58436
          v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_high[0u][v_tree_node]));
58437
          v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
58438
          if (v_bits < v_threshold) {
58439
            v_range = v_threshold;
58440
            v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
58441
            self->private_data.f_probs_longrep_len_high[0u][v_tree_node] = ((uint16_t)(v_prob));
58442
            v_tree_node = (v_tree_node << 1u);
58443
          } else {
58444
            v_bits -= v_threshold;
58445
            v_range -= v_threshold;
58446
            v_prob -= (v_prob >> 5u);
58447
            self->private_data.f_probs_longrep_len_high[0u][v_tree_node] = ((uint16_t)(v_prob));
58448
            v_tree_node = ((v_tree_node << 1u) | 1u);
58449
          }
58450
          if ((v_range >> 24u) == 0u) {
58451
            if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
58452
              status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
58453
              goto exit;
58454
            }
58455
            v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
58456
            iop_a_src += 1u;
58457
            v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
58458
            v_range <<= 8u;
58459
          }
58460
        }
58461
        v_len = ((v_tree_node & 255u) + 18u);
58462
        v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_LONGREP[v_state]));
58463
      } while (0);
58464
    } while (0);
58465
    v_dist = (v_rep0 + 1u);
58466
    if ((((uint64_t)(v_dist)) > v_pos) || (((uint64_t)(v_dist)) > ((uint64_t)(self->private_impl.f_dict_size)))) {
58467
      status = wuffs_base__make_status(wuffs_lzma__error__bad_distance);
58468
      goto exit;
58469
    }
58470
    v_pos += ((uint64_t)(v_len));
58471
    if (((uint64_t)(v_dist)) > ((uint64_t)(iop_a_dst - io0_a_dst))) {
58472
      v_adj_dist = ((uint32_t)((((uint64_t)(v_dist)) - ((uint64_t)(iop_a_dst - io0_a_dst)))));
58473
      if (v_adj_dist > self->private_impl.f_dict_seen) {
58474
        status = wuffs_base__make_status(wuffs_lzma__error__bad_distance);
58475
        goto exit;
58476
      }
58477
      v_wb_index = ((uint64_t)(((uint64_t)(self->private_impl.f_dict_workbuf_index)) - ((uint64_t)(v_adj_dist))));
58478
      while (v_wb_index >= 9223372036854775808u) {
58479
        v_wb_index += ((uint64_t)(self->private_impl.f_dict_size));
58480
      }
58481
      if (v_wb_index >= ((uint64_t)(a_workbuf.len))) {
58482
        status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state);
58483
        goto exit;
58484
      }
58485
      if (v_len < v_adj_dist) {
58486
        wuffs_private_impl__io_writer__limited_copy_u32_from_slice(
58487
            &iop_a_dst, io2_a_dst,(v_len + 1u), wuffs_base__slice_u8__subslice_i(a_workbuf, v_wb_index));
58488
        if ( ! (iop_a_dst > io1_a_dst)) {
58489
          status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state);
58490
          goto exit;
58491
        }
58492
        v_match_byte = ((uint32_t)(iop_a_dst[-1]));
58493
        iop_a_dst--;
58494
        if ( ! (iop_a_dst > io1_a_dst)) {
58495
          status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state);
58496
          goto exit;
58497
        }
58498
        v_prev_byte = iop_a_dst[-1];
58499
        continue;
58500
      } else if (v_len == v_adj_dist) {
58501
        wuffs_private_impl__io_writer__limited_copy_u32_from_slice(
58502
            &iop_a_dst, io2_a_dst,v_len, wuffs_base__slice_u8__subslice_i(a_workbuf, v_wb_index));
58503
        wuffs_private_impl__io_writer__limited_copy_u32_from_history(
58504
            &iop_a_dst, io0_a_dst, io2_a_dst, 1u, v_dist);
58505
        if ( ! (iop_a_dst > io1_a_dst)) {
58506
          status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state);
58507
          goto exit;
58508
        }
58509
        v_match_byte = ((uint32_t)(iop_a_dst[-1]));
58510
        iop_a_dst--;
58511
        if ( ! (iop_a_dst > io1_a_dst)) {
58512
          status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state);
58513
          goto exit;
58514
        }
58515
        v_prev_byte = iop_a_dst[-1];
58516
        continue;
58517
      }
58518
      wuffs_private_impl__io_writer__limited_copy_u32_from_slice(
58519
          &iop_a_dst, io2_a_dst,v_adj_dist, wuffs_base__slice_u8__subslice_i(a_workbuf, v_wb_index));
58520
      v_len -= v_adj_dist;
58521
      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)))) {
58522
        status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state);
58523
        goto exit;
58524
      }
58525
    }
58526
    if (v_dist >= 8u) {
58527
      v_match_cusp = wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast_return_cusp(
58528
          &iop_a_dst, io0_a_dst, io2_a_dst, v_len, v_dist);
58529
      v_match_byte = (v_match_cusp >> 8u);
58530
      v_prev_byte = ((uint8_t)(v_match_cusp));
58531
    } else {
58532
      v_match_cusp = wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast_return_cusp(
58533
          &iop_a_dst, io0_a_dst, io2_a_dst, v_len, v_dist);
58534
      v_match_byte = (v_match_cusp >> 8u);
58535
      v_prev_byte = ((uint8_t)(v_match_cusp));
58536
    }
58537
  }
58538
  label__outer__break:;
58539
  self->private_impl.f_stashed_bytes[0u] = v_prev_byte;
58540
  self->private_impl.f_stashed_bytes[1u] = ((uint8_t)(v_match_byte));
58541
  self->private_impl.f_stashed_bits = v_bits;
58542
  self->private_impl.f_stashed_range = v_range;
58543
  self->private_impl.f_stashed_state = v_state;
58544
  self->private_impl.f_stashed_rep0 = v_rep0;
58545
  self->private_impl.f_stashed_rep1 = v_rep1;
58546
  self->private_impl.f_stashed_rep2 = v_rep2;
58547
  self->private_impl.f_stashed_rep3 = v_rep3;
58548
  self->private_impl.f_stashed_pos = v_pos;
58549
  self->private_impl.f_stashed_pos_end = v_pos_end;
58550
  goto exit;
58551
  exit:
58552
  if (a_dst && a_dst->data.ptr) {
58553
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
58554
  }
58555
  if (a_src && a_src->data.ptr) {
58556
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
58557
  }
58558
58559
  return status;
58560
}
58561
58562
// -------- func lzma.decoder.decode_bitstream_slow
58563
58564
WUFFS_BASE__GENERATED_C_CODE
58565
static wuffs_base__status
58566
wuffs_lzma__decoder__decode_bitstream_slow(
58567
    wuffs_lzma__decoder* self,
58568
    wuffs_base__io_buffer* a_dst,
58569
    wuffs_base__io_buffer* a_src,
58570
    wuffs_base__slice_u8 a_workbuf) {
58571
  wuffs_base__status status = wuffs_base__make_status(NULL);
58572
58573
  uint8_t v_c8 = 0;
58574
  uint32_t v_bits = 0;
58575
  uint32_t v_range = 0;
58576
  uint32_t v_state = 0;
58577
  uint32_t v_rep0 = 0;
58578
  uint32_t v_rep1 = 0;
58579
  uint32_t v_rep2 = 0;
58580
  uint32_t v_rep3 = 0;
58581
  uint32_t v_reptmp = 0;
58582
  uint32_t v_rep = 0;
58583
  uint64_t v_pos = 0;
58584
  uint64_t v_pos_end = 0;
58585
  uint32_t v_lc = 0;
58586
  uint64_t v_lp_mask = 0;
58587
  uint64_t v_pb_mask = 0;
58588
  uint32_t v_prob = 0;
58589
  uint32_t v_threshold = 0;
58590
  uint32_t v_tree_node = 0;
58591
  uint8_t v_prev_byte = 0;
58592
  uint32_t v_match_byte = 0;
58593
  uint32_t v_match_cusp = 0;
58594
  uint32_t v_len_state = 0;
58595
  uint32_t v_slot = 0;
58596
  uint32_t v_len = 0;
58597
  uint32_t v_lanl_offset = 0;
58598
  uint32_t v_lanl_old_offset = 0;
58599
  uint32_t v_lanl_index = 0;
58600
  uint32_t v_num_extra_bits = 0;
58601
  uint32_t v_dist_extra_bits = 0;
58602
  uint32_t v_high_bit_was_on = 0;
58603
  uint32_t v_i = 0;
58604
  uint32_t v_index_ao00 = 0;
58605
  uint32_t v_index_ao41 = 0;
58606
  uint32_t v_index_lit = 0;
58607
  uint32_t v_index_len = 0;
58608
  uint32_t v_index_small_dist_base = 0;
58609
  uint32_t v_index_small_dist_extra = 0;
58610
  uint32_t v_index_small_dist = 0;
58611
  uint32_t v_index_large_dist = 0;
58612
  uint32_t v_dist = 0;
58613
  uint32_t v_adj_dist = 0;
58614
  uint64_t v_wb_index = 0;
58615
58616
  uint8_t* iop_a_dst = NULL;
58617
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
58618
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
58619
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
58620
  if (a_dst && a_dst->data.ptr) {
58621
    io0_a_dst = a_dst->data.ptr;
58622
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
58623
    iop_a_dst = io1_a_dst;
58624
    io2_a_dst = io0_a_dst + a_dst->data.len;
58625
    if (a_dst->meta.closed) {
58626
      io2_a_dst = iop_a_dst;
58627
    }
58628
  }
58629
  const uint8_t* iop_a_src = NULL;
58630
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
58631
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
58632
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
58633
  if (a_src && a_src->data.ptr) {
58634
    io0_a_src = a_src->data.ptr;
58635
    io1_a_src = io0_a_src + a_src->meta.ri;
58636
    iop_a_src = io1_a_src;
58637
    io2_a_src = io0_a_src + a_src->meta.wi;
58638
  }
58639
58640
  uint32_t coro_susp_point = self->private_impl.p_decode_bitstream_slow;
58641
  if (coro_susp_point) {
58642
    v_bits = self->private_data.s_decode_bitstream_slow.v_bits;
58643
    v_range = self->private_data.s_decode_bitstream_slow.v_range;
58644
    v_state = self->private_data.s_decode_bitstream_slow.v_state;
58645
    v_rep0 = self->private_data.s_decode_bitstream_slow.v_rep0;
58646
    v_rep1 = self->private_data.s_decode_bitstream_slow.v_rep1;
58647
    v_rep2 = self->private_data.s_decode_bitstream_slow.v_rep2;
58648
    v_rep3 = self->private_data.s_decode_bitstream_slow.v_rep3;
58649
    v_rep = self->private_data.s_decode_bitstream_slow.v_rep;
58650
    v_pos = self->private_data.s_decode_bitstream_slow.v_pos;
58651
    v_pos_end = self->private_data.s_decode_bitstream_slow.v_pos_end;
58652
    v_lc = self->private_data.s_decode_bitstream_slow.v_lc;
58653
    v_lp_mask = self->private_data.s_decode_bitstream_slow.v_lp_mask;
58654
    v_pb_mask = self->private_data.s_decode_bitstream_slow.v_pb_mask;
58655
    v_tree_node = self->private_data.s_decode_bitstream_slow.v_tree_node;
58656
    v_prev_byte = self->private_data.s_decode_bitstream_slow.v_prev_byte;
58657
    v_match_byte = self->private_data.s_decode_bitstream_slow.v_match_byte;
58658
    v_len_state = self->private_data.s_decode_bitstream_slow.v_len_state;
58659
    v_slot = self->private_data.s_decode_bitstream_slow.v_slot;
58660
    v_len = self->private_data.s_decode_bitstream_slow.v_len;
58661
    v_lanl_offset = self->private_data.s_decode_bitstream_slow.v_lanl_offset;
58662
    v_num_extra_bits = self->private_data.s_decode_bitstream_slow.v_num_extra_bits;
58663
    v_dist_extra_bits = self->private_data.s_decode_bitstream_slow.v_dist_extra_bits;
58664
    v_i = self->private_data.s_decode_bitstream_slow.v_i;
58665
    v_index_lit = self->private_data.s_decode_bitstream_slow.v_index_lit;
58666
    v_index_len = self->private_data.s_decode_bitstream_slow.v_index_len;
58667
    v_index_small_dist_base = self->private_data.s_decode_bitstream_slow.v_index_small_dist_base;
58668
    v_index_small_dist_extra = self->private_data.s_decode_bitstream_slow.v_index_small_dist_extra;
58669
    v_index_large_dist = self->private_data.s_decode_bitstream_slow.v_index_large_dist;
58670
    v_dist = self->private_data.s_decode_bitstream_slow.v_dist;
58671
  }
58672
  switch (coro_susp_point) {
58673
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
58674
58675
    v_prev_byte = self->private_impl.f_stashed_bytes[0u];
58676
    v_match_byte = ((uint32_t)(self->private_impl.f_stashed_bytes[1u]));
58677
    v_bits = self->private_impl.f_stashed_bits;
58678
    v_range = self->private_impl.f_stashed_range;
58679
    v_state = self->private_impl.f_stashed_state;
58680
    v_rep0 = self->private_impl.f_stashed_rep0;
58681
    v_rep1 = self->private_impl.f_stashed_rep1;
58682
    v_rep2 = self->private_impl.f_stashed_rep2;
58683
    v_rep3 = self->private_impl.f_stashed_rep3;
58684
    v_pos = self->private_impl.f_stashed_pos;
58685
    v_pos_end = self->private_impl.f_stashed_pos_end;
58686
    v_lc = self->private_impl.f_lc;
58687
    v_lp_mask = ((((uint64_t)(1u)) << self->private_impl.f_lp) - 1u);
58688
    v_pb_mask = ((((uint64_t)(1u)) << self->private_impl.f_pb) - 1u);
58689
    while ( ! (self->private_impl.p_decode_bitstream_slow != 0)) {
58690
      if (v_pos >= v_pos_end) {
58691
        self->private_impl.f_end_of_chunk = true;
58692
        break;
58693
      }
58694
      v_index_ao00 = ((v_state << 4u) | ((uint32_t)((v_pos & v_pb_mask))));
58695
      v_prob = ((uint32_t)(self->private_data.f_probs_ao00[v_index_ao00]));
58696
      v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
58697
      if (v_bits < v_threshold) {
58698
        v_range = v_threshold;
58699
        v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
58700
        self->private_data.f_probs_ao00[v_index_ao00] = ((uint16_t)(v_prob));
58701
        if ((v_range >> 24u) == 0u) {
58702
          {
58703
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
58704
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
58705
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
58706
              goto suspend;
58707
            }
58708
            uint8_t t_0 = *iop_a_src++;
58709
            v_c8 = t_0;
58710
          }
58711
          v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
58712
          v_range <<= 8u;
58713
        }
58714
        v_index_lit = (15u & ((((uint32_t)((v_pos & v_lp_mask))) << v_lc) | (((uint32_t)(v_prev_byte)) >> (8u - v_lc))));
58715
        if (v_state >= 7u) {
58716
          v_lanl_offset = 256u;
58717
          v_tree_node = 1u;
58718
          while (v_tree_node < 256u) {
58719
            v_match_byte <<= 1u;
58720
            v_lanl_old_offset = v_lanl_offset;
58721
            v_lanl_offset &= v_match_byte;
58722
            v_lanl_index = (v_lanl_offset + v_lanl_old_offset + v_tree_node);
58723
            v_prob = ((uint32_t)(self->private_data.f_probs_lit[v_index_lit][v_lanl_index]));
58724
            v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
58725
            if (v_bits < v_threshold) {
58726
              v_lanl_offset = ((v_lanl_offset ^ v_lanl_old_offset) & 256u);
58727
              v_range = v_threshold;
58728
              v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
58729
              self->private_data.f_probs_lit[v_index_lit][v_lanl_index] = ((uint16_t)(v_prob));
58730
              v_tree_node = (v_tree_node << 1u);
58731
            } else {
58732
              v_bits -= v_threshold;
58733
              v_range -= v_threshold;
58734
              v_prob -= (v_prob >> 5u);
58735
              self->private_data.f_probs_lit[v_index_lit][v_lanl_index] = ((uint16_t)(v_prob));
58736
              v_tree_node = ((v_tree_node << 1u) | 1u);
58737
            }
58738
            if ((v_range >> 24u) == 0u) {
58739
              {
58740
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
58741
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
58742
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
58743
                  goto suspend;
58744
                }
58745
                uint8_t t_1 = *iop_a_src++;
58746
                v_c8 = t_1;
58747
              }
58748
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
58749
              v_range <<= 8u;
58750
            }
58751
          }
58752
        } else {
58753
          v_tree_node = 1u;
58754
          while (v_tree_node < 256u) {
58755
            v_prob = ((uint32_t)(self->private_data.f_probs_lit[v_index_lit][v_tree_node]));
58756
            v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
58757
            if (v_bits < v_threshold) {
58758
              v_range = v_threshold;
58759
              v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
58760
              self->private_data.f_probs_lit[v_index_lit][v_tree_node] = ((uint16_t)(v_prob));
58761
              v_tree_node = (v_tree_node << 1u);
58762
            } else {
58763
              v_bits -= v_threshold;
58764
              v_range -= v_threshold;
58765
              v_prob -= (v_prob >> 5u);
58766
              self->private_data.f_probs_lit[v_index_lit][v_tree_node] = ((uint16_t)(v_prob));
58767
              v_tree_node = ((v_tree_node << 1u) | 1u);
58768
            }
58769
            if ((v_range >> 24u) == 0u) {
58770
              {
58771
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
58772
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
58773
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
58774
                  goto suspend;
58775
                }
58776
                uint8_t t_2 = *iop_a_src++;
58777
                v_c8 = t_2;
58778
              }
58779
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
58780
              v_range <<= 8u;
58781
            }
58782
          }
58783
        }
58784
        v_prev_byte = ((uint8_t)(v_tree_node));
58785
        self->private_data.s_decode_bitstream_slow.scratch = v_prev_byte;
58786
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
58787
        if (iop_a_dst == io2_a_dst) {
58788
          status = wuffs_base__make_status(wuffs_base__suspension__short_write);
58789
          goto suspend;
58790
        }
58791
        *iop_a_dst++ = ((uint8_t)(self->private_data.s_decode_bitstream_slow.scratch));
58792
        v_pos += 1u;
58793
        v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_LITERAL[v_state]));
58794
        continue;
58795
      }
58796
      v_bits -= v_threshold;
58797
      v_range -= v_threshold;
58798
      v_prob -= (v_prob >> 5u);
58799
      self->private_data.f_probs_ao00[v_index_ao00] = ((uint16_t)(v_prob));
58800
      if ((v_range >> 24u) == 0u) {
58801
        {
58802
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
58803
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
58804
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
58805
            goto suspend;
58806
          }
58807
          uint8_t t_3 = *iop_a_src++;
58808
          v_c8 = t_3;
58809
        }
58810
        v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
58811
        v_range <<= 8u;
58812
      }
58813
      do {
58814
        v_prob = ((uint32_t)(self->private_data.f_probs_ao20[v_state]));
58815
        v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
58816
        if (v_bits < v_threshold) {
58817
          v_range = v_threshold;
58818
          v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
58819
          self->private_data.f_probs_ao20[v_state] = ((uint16_t)(v_prob));
58820
          if ((v_range >> 24u) == 0u) {
58821
            {
58822
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
58823
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
58824
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
58825
                goto suspend;
58826
              }
58827
              uint8_t t_4 = *iop_a_src++;
58828
              v_c8 = t_4;
58829
            }
58830
            v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
58831
            v_range <<= 8u;
58832
          }
58833
          do {
58834
            v_prob = ((uint32_t)(self->private_data.f_probs_match_len_low[0u][0u]));
58835
            v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
58836
            if (v_bits < v_threshold) {
58837
              v_range = v_threshold;
58838
              v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
58839
              self->private_data.f_probs_match_len_low[0u][0u] = ((uint16_t)(v_prob));
58840
              if ((v_range >> 24u) == 0u) {
58841
                {
58842
                  WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
58843
                  if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
58844
                    status = wuffs_base__make_status(wuffs_base__suspension__short_read);
58845
                    goto suspend;
58846
                  }
58847
                  uint8_t t_5 = *iop_a_src++;
58848
                  v_c8 = t_5;
58849
                }
58850
                v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
58851
                v_range <<= 8u;
58852
              }
58853
              v_index_len = ((uint32_t)((v_pos & v_pb_mask)));
58854
              v_tree_node = 1u;
58855
              while (v_tree_node < 8u) {
58856
                v_prob = ((uint32_t)(self->private_data.f_probs_match_len_low[v_index_len][v_tree_node]));
58857
                v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
58858
                if (v_bits < v_threshold) {
58859
                  v_range = v_threshold;
58860
                  v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
58861
                  self->private_data.f_probs_match_len_low[v_index_len][v_tree_node] = ((uint16_t)(v_prob));
58862
                  v_tree_node = (v_tree_node << 1u);
58863
                } else {
58864
                  v_bits -= v_threshold;
58865
                  v_range -= v_threshold;
58866
                  v_prob -= (v_prob >> 5u);
58867
                  self->private_data.f_probs_match_len_low[v_index_len][v_tree_node] = ((uint16_t)(v_prob));
58868
                  v_tree_node = ((v_tree_node << 1u) | 1u);
58869
                }
58870
                if ((v_range >> 24u) == 0u) {
58871
                  {
58872
                    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
58873
                    if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
58874
                      status = wuffs_base__make_status(wuffs_base__suspension__short_read);
58875
                      goto suspend;
58876
                    }
58877
                    uint8_t t_6 = *iop_a_src++;
58878
                    v_c8 = t_6;
58879
                  }
58880
                  v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
58881
                  v_range <<= 8u;
58882
                }
58883
              }
58884
              v_len_state = ((uint32_t)(WUFFS_LZMA__CLAMP_NO_MORE_THAN_3[(v_tree_node & 7u)]));
58885
              v_len = ((v_tree_node & 7u) + 2u);
58886
              break;
58887
            }
58888
            v_bits -= v_threshold;
58889
            v_range -= v_threshold;
58890
            v_prob -= (v_prob >> 5u);
58891
            self->private_data.f_probs_match_len_low[0u][0u] = ((uint16_t)(v_prob));
58892
            if ((v_range >> 24u) == 0u) {
58893
              {
58894
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
58895
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
58896
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
58897
                  goto suspend;
58898
                }
58899
                uint8_t t_7 = *iop_a_src++;
58900
                v_c8 = t_7;
58901
              }
58902
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
58903
              v_range <<= 8u;
58904
            }
58905
            v_prob = ((uint32_t)(self->private_data.f_probs_match_len_mid[0u][0u]));
58906
            v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
58907
            if (v_bits < v_threshold) {
58908
              v_range = v_threshold;
58909
              v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
58910
              self->private_data.f_probs_match_len_mid[0u][0u] = ((uint16_t)(v_prob));
58911
              if ((v_range >> 24u) == 0u) {
58912
                {
58913
                  WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
58914
                  if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
58915
                    status = wuffs_base__make_status(wuffs_base__suspension__short_read);
58916
                    goto suspend;
58917
                  }
58918
                  uint8_t t_8 = *iop_a_src++;
58919
                  v_c8 = t_8;
58920
                }
58921
                v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
58922
                v_range <<= 8u;
58923
              }
58924
              v_index_len = ((uint32_t)((v_pos & v_pb_mask)));
58925
              v_tree_node = 1u;
58926
              while (v_tree_node < 8u) {
58927
                v_prob = ((uint32_t)(self->private_data.f_probs_match_len_mid[v_index_len][v_tree_node]));
58928
                v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
58929
                if (v_bits < v_threshold) {
58930
                  v_range = v_threshold;
58931
                  v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
58932
                  self->private_data.f_probs_match_len_mid[v_index_len][v_tree_node] = ((uint16_t)(v_prob));
58933
                  v_tree_node = (v_tree_node << 1u);
58934
                } else {
58935
                  v_bits -= v_threshold;
58936
                  v_range -= v_threshold;
58937
                  v_prob -= (v_prob >> 5u);
58938
                  self->private_data.f_probs_match_len_mid[v_index_len][v_tree_node] = ((uint16_t)(v_prob));
58939
                  v_tree_node = ((v_tree_node << 1u) | 1u);
58940
                }
58941
                if ((v_range >> 24u) == 0u) {
58942
                  {
58943
                    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11);
58944
                    if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
58945
                      status = wuffs_base__make_status(wuffs_base__suspension__short_read);
58946
                      goto suspend;
58947
                    }
58948
                    uint8_t t_9 = *iop_a_src++;
58949
                    v_c8 = t_9;
58950
                  }
58951
                  v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
58952
                  v_range <<= 8u;
58953
                }
58954
              }
58955
              v_len = ((v_tree_node & 7u) + 10u);
58956
              v_len_state = 3u;
58957
              break;
58958
            }
58959
            v_bits -= v_threshold;
58960
            v_range -= v_threshold;
58961
            v_prob -= (v_prob >> 5u);
58962
            self->private_data.f_probs_match_len_mid[0u][0u] = ((uint16_t)(v_prob));
58963
            if ((v_range >> 24u) == 0u) {
58964
              {
58965
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12);
58966
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
58967
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
58968
                  goto suspend;
58969
                }
58970
                uint8_t t_10 = *iop_a_src++;
58971
                v_c8 = t_10;
58972
              }
58973
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
58974
              v_range <<= 8u;
58975
            }
58976
            v_tree_node = 1u;
58977
            while (v_tree_node < 256u) {
58978
              v_prob = ((uint32_t)(self->private_data.f_probs_match_len_high[0u][v_tree_node]));
58979
              v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
58980
              if (v_bits < v_threshold) {
58981
                v_range = v_threshold;
58982
                v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
58983
                self->private_data.f_probs_match_len_high[0u][v_tree_node] = ((uint16_t)(v_prob));
58984
                v_tree_node = (v_tree_node << 1u);
58985
              } else {
58986
                v_bits -= v_threshold;
58987
                v_range -= v_threshold;
58988
                v_prob -= (v_prob >> 5u);
58989
                self->private_data.f_probs_match_len_high[0u][v_tree_node] = ((uint16_t)(v_prob));
58990
                v_tree_node = ((v_tree_node << 1u) | 1u);
58991
              }
58992
              if ((v_range >> 24u) == 0u) {
58993
                {
58994
                  WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13);
58995
                  if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
58996
                    status = wuffs_base__make_status(wuffs_base__suspension__short_read);
58997
                    goto suspend;
58998
                  }
58999
                  uint8_t t_11 = *iop_a_src++;
59000
                  v_c8 = t_11;
59001
                }
59002
                v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
59003
                v_range <<= 8u;
59004
              }
59005
            }
59006
            v_len = ((v_tree_node & 255u) + 18u);
59007
            v_len_state = 3u;
59008
          } while (0);
59009
          v_slot = 1u;
59010
          while (v_slot < 64u) {
59011
            v_prob = ((uint32_t)(self->private_data.f_probs_slot[v_len_state][v_slot]));
59012
            v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
59013
            if (v_bits < v_threshold) {
59014
              v_range = v_threshold;
59015
              v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
59016
              self->private_data.f_probs_slot[v_len_state][v_slot] = ((uint16_t)(v_prob));
59017
              v_slot = (v_slot << 1u);
59018
            } else {
59019
              v_bits -= v_threshold;
59020
              v_range -= v_threshold;
59021
              v_prob -= (v_prob >> 5u);
59022
              self->private_data.f_probs_slot[v_len_state][v_slot] = ((uint16_t)(v_prob));
59023
              v_slot = ((v_slot << 1u) | 1u);
59024
            }
59025
            if ((v_range >> 24u) == 0u) {
59026
              {
59027
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14);
59028
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
59029
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
59030
                  goto suspend;
59031
                }
59032
                uint8_t t_12 = *iop_a_src++;
59033
                v_c8 = t_12;
59034
              }
59035
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
59036
              v_range <<= 8u;
59037
            }
59038
          }
59039
          v_slot &= 63u;
59040
          v_rep = v_slot;
59041
          if (v_slot < 4u) {
59042
          } else if (v_slot < 14u) {
59043
            v_num_extra_bits = ((v_slot >> 1u) - 1u);
59044
            v_rep = ((2u | (v_slot & 1u)) << v_num_extra_bits);
59045
            v_index_small_dist_base = ((uint32_t)(v_rep - v_slot));
59046
            v_index_small_dist_extra = 1u;
59047
            v_dist_extra_bits = 0u;
59048
            v_i = 0u;
59049
            while (v_i < v_num_extra_bits) {
59050
              v_index_small_dist = (((uint32_t)(v_index_small_dist_base + v_index_small_dist_extra)) & 127u);
59051
              v_prob = ((uint32_t)(self->private_data.f_probs_small_dist[v_index_small_dist]));
59052
              v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
59053
              if (v_bits < v_threshold) {
59054
                v_range = v_threshold;
59055
                v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
59056
                self->private_data.f_probs_small_dist[v_index_small_dist] = ((uint16_t)(v_prob));
59057
                v_index_small_dist_extra = ((uint32_t)(v_index_small_dist_extra << 1u));
59058
                v_i += 1u;
59059
              } else {
59060
                v_bits -= v_threshold;
59061
                v_range -= v_threshold;
59062
                v_prob -= (v_prob >> 5u);
59063
                self->private_data.f_probs_small_dist[v_index_small_dist] = ((uint16_t)(v_prob));
59064
                v_index_small_dist_extra = (((uint32_t)(v_index_small_dist_extra << 1u)) | 1u);
59065
                v_dist_extra_bits |= (((uint32_t)(1u)) << v_i);
59066
                v_i += 1u;
59067
              }
59068
              if ((v_range >> 24u) == 0u) {
59069
                {
59070
                  WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15);
59071
                  if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
59072
                    status = wuffs_base__make_status(wuffs_base__suspension__short_read);
59073
                    goto suspend;
59074
                  }
59075
                  uint8_t t_13 = *iop_a_src++;
59076
                  v_c8 = t_13;
59077
                }
59078
                v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
59079
                v_range <<= 8u;
59080
              }
59081
            }
59082
            v_rep += v_dist_extra_bits;
59083
          } else {
59084
            v_num_extra_bits = ((v_slot >> 1u) - 1u);
59085
            v_rep = ((2u | (v_slot & 1u)) << v_num_extra_bits);
59086
            v_dist_extra_bits = 0u;
59087
            while (true) {
59088
              v_range >>= 1u;
59089
              v_bits -= v_range;
59090
              v_high_bit_was_on = ((uint32_t)(0u - (v_bits >> 31u)));
59091
              v_bits += (v_range & v_high_bit_was_on);
59092
              v_dist_extra_bits = (((uint32_t)(v_dist_extra_bits << 1u)) | (((uint32_t)(v_high_bit_was_on + 1u)) & 1u));
59093
              if ((v_range >> 24u) == 0u) {
59094
                {
59095
                  WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16);
59096
                  if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
59097
                    status = wuffs_base__make_status(wuffs_base__suspension__short_read);
59098
                    goto suspend;
59099
                  }
59100
                  uint8_t t_14 = *iop_a_src++;
59101
                  v_c8 = t_14;
59102
                }
59103
                v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
59104
                v_range <<= 8u;
59105
              }
59106
              v_num_extra_bits -= 1u;
59107
              if (v_num_extra_bits <= 4u) {
59108
                break;
59109
              }
59110
            }
59111
            v_dist_extra_bits <<= 4u;
59112
            v_index_large_dist = 1u;
59113
            while (true) {
59114
              v_prob = ((uint32_t)(self->private_data.f_probs_large_dist[v_index_large_dist]));
59115
              v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
59116
              if (v_bits < v_threshold) {
59117
                v_range = v_threshold;
59118
                v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
59119
                self->private_data.f_probs_large_dist[v_index_large_dist] = ((uint16_t)(v_prob));
59120
                v_index_large_dist = (15u & ((uint32_t)(v_index_large_dist << 1u)));
59121
              } else {
59122
                v_bits -= v_threshold;
59123
                v_range -= v_threshold;
59124
                v_prob -= (v_prob >> 5u);
59125
                self->private_data.f_probs_large_dist[v_index_large_dist] = ((uint16_t)(v_prob));
59126
                v_index_large_dist = (15u & (((uint32_t)(v_index_large_dist << 1u)) | 1u));
59127
                v_dist_extra_bits |= (((uint32_t)(1u)) << (4u - v_num_extra_bits));
59128
              }
59129
              if ((v_range >> 24u) == 0u) {
59130
                {
59131
                  WUFFS_BASE__COROUTINE_SUSPENSION_POINT(17);
59132
                  if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
59133
                    status = wuffs_base__make_status(wuffs_base__suspension__short_read);
59134
                    goto suspend;
59135
                  }
59136
                  uint8_t t_15 = *iop_a_src++;
59137
                  v_c8 = t_15;
59138
                }
59139
                v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
59140
                v_range <<= 8u;
59141
              }
59142
              v_num_extra_bits -= 1u;
59143
              if (v_num_extra_bits <= 0u) {
59144
                break;
59145
              }
59146
            }
59147
            v_rep += v_dist_extra_bits;
59148
          }
59149
          if (v_rep >= 4294967295u) {
59150
            self->private_impl.f_end_of_chunk = true;
59151
            goto label__outer__break;
59152
          }
59153
          v_rep3 = v_rep2;
59154
          v_rep2 = v_rep1;
59155
          v_rep1 = v_rep0;
59156
          v_rep0 = v_rep;
59157
          v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_MATCH[v_state]));
59158
          break;
59159
        }
59160
        v_bits -= v_threshold;
59161
        v_range -= v_threshold;
59162
        v_prob -= (v_prob >> 5u);
59163
        self->private_data.f_probs_ao20[v_state] = ((uint16_t)(v_prob));
59164
        if ((v_range >> 24u) == 0u) {
59165
          {
59166
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(18);
59167
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
59168
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
59169
              goto suspend;
59170
            }
59171
            uint8_t t_16 = *iop_a_src++;
59172
            v_c8 = t_16;
59173
          }
59174
          v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
59175
          v_range <<= 8u;
59176
        }
59177
        v_prob = ((uint32_t)(self->private_data.f_probs_ao40[v_state]));
59178
        v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
59179
        if (v_bits < v_threshold) {
59180
          v_range = v_threshold;
59181
          v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
59182
          self->private_data.f_probs_ao40[v_state] = ((uint16_t)(v_prob));
59183
          if ((v_range >> 24u) == 0u) {
59184
            {
59185
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(19);
59186
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
59187
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
59188
                goto suspend;
59189
              }
59190
              uint8_t t_17 = *iop_a_src++;
59191
              v_c8 = t_17;
59192
            }
59193
            v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
59194
            v_range <<= 8u;
59195
          }
59196
          v_index_ao41 = ((v_state << 4u) | ((uint32_t)((v_pos & v_pb_mask))));
59197
          v_prob = ((uint32_t)(self->private_data.f_probs_ao41[v_index_ao41]));
59198
          v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
59199
          if (v_bits < v_threshold) {
59200
            v_range = v_threshold;
59201
            v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
59202
            self->private_data.f_probs_ao41[v_index_ao41] = ((uint16_t)(v_prob));
59203
            if ((v_range >> 24u) == 0u) {
59204
              {
59205
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT(20);
59206
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
59207
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
59208
                  goto suspend;
59209
                }
59210
                uint8_t t_18 = *iop_a_src++;
59211
                v_c8 = t_18;
59212
              }
59213
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
59214
              v_range <<= 8u;
59215
            }
59216
            v_len = 1u;
59217
            v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_SHORTREP[v_state]));
59218
            break;
59219
          }
59220
          v_bits -= v_threshold;
59221
          v_range -= v_threshold;
59222
          v_prob -= (v_prob >> 5u);
59223
          self->private_data.f_probs_ao41[v_index_ao41] = ((uint16_t)(v_prob));
59224
          if ((v_range >> 24u) == 0u) {
59225
            {
59226
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(21);
59227
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
59228
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
59229
                goto suspend;
59230
              }
59231
              uint8_t t_19 = *iop_a_src++;
59232
              v_c8 = t_19;
59233
            }
59234
            v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
59235
            v_range <<= 8u;
59236
          }
59237
        } else {
59238
          v_bits -= v_threshold;
59239
          v_range -= v_threshold;
59240
          v_prob -= (v_prob >> 5u);
59241
          self->private_data.f_probs_ao40[v_state] = ((uint16_t)(v_prob));
59242
          if ((v_range >> 24u) == 0u) {
59243
            {
59244
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(22);
59245
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
59246
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
59247
                goto suspend;
59248
              }
59249
              uint8_t t_20 = *iop_a_src++;
59250
              v_c8 = t_20;
59251
            }
59252
            v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
59253
            v_range <<= 8u;
59254
          }
59255
          v_prob = ((uint32_t)(self->private_data.f_probs_ao60[v_state]));
59256
          v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
59257
          if (v_bits < v_threshold) {
59258
            v_range = v_threshold;
59259
            v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
59260
            self->private_data.f_probs_ao60[v_state] = ((uint16_t)(v_prob));
59261
            if ((v_range >> 24u) == 0u) {
59262
              {
59263
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT(23);
59264
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
59265
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
59266
                  goto suspend;
59267
                }
59268
                uint8_t t_21 = *iop_a_src++;
59269
                v_c8 = t_21;
59270
              }
59271
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
59272
              v_range <<= 8u;
59273
            }
59274
            v_reptmp = v_rep1;
59275
            v_rep1 = v_rep0;
59276
            v_rep0 = v_reptmp;
59277
          } else {
59278
            v_bits -= v_threshold;
59279
            v_range -= v_threshold;
59280
            v_prob -= (v_prob >> 5u);
59281
            self->private_data.f_probs_ao60[v_state] = ((uint16_t)(v_prob));
59282
            if ((v_range >> 24u) == 0u) {
59283
              {
59284
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT(24);
59285
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
59286
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
59287
                  goto suspend;
59288
                }
59289
                uint8_t t_22 = *iop_a_src++;
59290
                v_c8 = t_22;
59291
              }
59292
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
59293
              v_range <<= 8u;
59294
            }
59295
            v_prob = ((uint32_t)(self->private_data.f_probs_ao63[v_state]));
59296
            v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
59297
            if (v_bits < v_threshold) {
59298
              v_range = v_threshold;
59299
              v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
59300
              self->private_data.f_probs_ao63[v_state] = ((uint16_t)(v_prob));
59301
              if ((v_range >> 24u) == 0u) {
59302
                {
59303
                  WUFFS_BASE__COROUTINE_SUSPENSION_POINT(25);
59304
                  if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
59305
                    status = wuffs_base__make_status(wuffs_base__suspension__short_read);
59306
                    goto suspend;
59307
                  }
59308
                  uint8_t t_23 = *iop_a_src++;
59309
                  v_c8 = t_23;
59310
                }
59311
                v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
59312
                v_range <<= 8u;
59313
              }
59314
              v_reptmp = v_rep2;
59315
              v_rep2 = v_rep1;
59316
              v_rep1 = v_rep0;
59317
              v_rep0 = v_reptmp;
59318
            } else {
59319
              v_bits -= v_threshold;
59320
              v_range -= v_threshold;
59321
              v_prob -= (v_prob >> 5u);
59322
              self->private_data.f_probs_ao63[v_state] = ((uint16_t)(v_prob));
59323
              if ((v_range >> 24u) == 0u) {
59324
                {
59325
                  WUFFS_BASE__COROUTINE_SUSPENSION_POINT(26);
59326
                  if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
59327
                    status = wuffs_base__make_status(wuffs_base__suspension__short_read);
59328
                    goto suspend;
59329
                  }
59330
                  uint8_t t_24 = *iop_a_src++;
59331
                  v_c8 = t_24;
59332
                }
59333
                v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
59334
                v_range <<= 8u;
59335
              }
59336
              v_reptmp = v_rep3;
59337
              v_rep3 = v_rep2;
59338
              v_rep2 = v_rep1;
59339
              v_rep1 = v_rep0;
59340
              v_rep0 = v_reptmp;
59341
            }
59342
          }
59343
        }
59344
        do {
59345
          v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_low[0u][0u]));
59346
          v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
59347
          if (v_bits < v_threshold) {
59348
            v_range = v_threshold;
59349
            v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
59350
            self->private_data.f_probs_longrep_len_low[0u][0u] = ((uint16_t)(v_prob));
59351
            if ((v_range >> 24u) == 0u) {
59352
              {
59353
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT(27);
59354
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
59355
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
59356
                  goto suspend;
59357
                }
59358
                uint8_t t_25 = *iop_a_src++;
59359
                v_c8 = t_25;
59360
              }
59361
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
59362
              v_range <<= 8u;
59363
            }
59364
            v_index_len = ((uint32_t)((v_pos & v_pb_mask)));
59365
            v_tree_node = 1u;
59366
            while (v_tree_node < 8u) {
59367
              v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_low[v_index_len][v_tree_node]));
59368
              v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
59369
              if (v_bits < v_threshold) {
59370
                v_range = v_threshold;
59371
                v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
59372
                self->private_data.f_probs_longrep_len_low[v_index_len][v_tree_node] = ((uint16_t)(v_prob));
59373
                v_tree_node = (v_tree_node << 1u);
59374
              } else {
59375
                v_bits -= v_threshold;
59376
                v_range -= v_threshold;
59377
                v_prob -= (v_prob >> 5u);
59378
                self->private_data.f_probs_longrep_len_low[v_index_len][v_tree_node] = ((uint16_t)(v_prob));
59379
                v_tree_node = ((v_tree_node << 1u) | 1u);
59380
              }
59381
              if ((v_range >> 24u) == 0u) {
59382
                {
59383
                  WUFFS_BASE__COROUTINE_SUSPENSION_POINT(28);
59384
                  if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
59385
                    status = wuffs_base__make_status(wuffs_base__suspension__short_read);
59386
                    goto suspend;
59387
                  }
59388
                  uint8_t t_26 = *iop_a_src++;
59389
                  v_c8 = t_26;
59390
                }
59391
                v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
59392
                v_range <<= 8u;
59393
              }
59394
            }
59395
            v_len = ((v_tree_node & 7u) + 2u);
59396
            v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_LONGREP[v_state]));
59397
            break;
59398
          }
59399
          v_bits -= v_threshold;
59400
          v_range -= v_threshold;
59401
          v_prob -= (v_prob >> 5u);
59402
          self->private_data.f_probs_longrep_len_low[0u][0u] = ((uint16_t)(v_prob));
59403
          if ((v_range >> 24u) == 0u) {
59404
            {
59405
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(29);
59406
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
59407
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
59408
                goto suspend;
59409
              }
59410
              uint8_t t_27 = *iop_a_src++;
59411
              v_c8 = t_27;
59412
            }
59413
            v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
59414
            v_range <<= 8u;
59415
          }
59416
          v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_mid[0u][0u]));
59417
          v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
59418
          if (v_bits < v_threshold) {
59419
            v_range = v_threshold;
59420
            v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
59421
            self->private_data.f_probs_longrep_len_mid[0u][0u] = ((uint16_t)(v_prob));
59422
            if ((v_range >> 24u) == 0u) {
59423
              {
59424
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT(30);
59425
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
59426
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
59427
                  goto suspend;
59428
                }
59429
                uint8_t t_28 = *iop_a_src++;
59430
                v_c8 = t_28;
59431
              }
59432
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
59433
              v_range <<= 8u;
59434
            }
59435
            v_index_len = ((uint32_t)((v_pos & v_pb_mask)));
59436
            v_tree_node = 1u;
59437
            while (v_tree_node < 8u) {
59438
              v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_mid[v_index_len][v_tree_node]));
59439
              v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
59440
              if (v_bits < v_threshold) {
59441
                v_range = v_threshold;
59442
                v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
59443
                self->private_data.f_probs_longrep_len_mid[v_index_len][v_tree_node] = ((uint16_t)(v_prob));
59444
                v_tree_node = (v_tree_node << 1u);
59445
              } else {
59446
                v_bits -= v_threshold;
59447
                v_range -= v_threshold;
59448
                v_prob -= (v_prob >> 5u);
59449
                self->private_data.f_probs_longrep_len_mid[v_index_len][v_tree_node] = ((uint16_t)(v_prob));
59450
                v_tree_node = ((v_tree_node << 1u) | 1u);
59451
              }
59452
              if ((v_range >> 24u) == 0u) {
59453
                {
59454
                  WUFFS_BASE__COROUTINE_SUSPENSION_POINT(31);
59455
                  if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
59456
                    status = wuffs_base__make_status(wuffs_base__suspension__short_read);
59457
                    goto suspend;
59458
                  }
59459
                  uint8_t t_29 = *iop_a_src++;
59460
                  v_c8 = t_29;
59461
                }
59462
                v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
59463
                v_range <<= 8u;
59464
              }
59465
            }
59466
            v_len = ((v_tree_node & 7u) + 10u);
59467
            v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_LONGREP[v_state]));
59468
            break;
59469
          }
59470
          v_bits -= v_threshold;
59471
          v_range -= v_threshold;
59472
          v_prob -= (v_prob >> 5u);
59473
          self->private_data.f_probs_longrep_len_mid[0u][0u] = ((uint16_t)(v_prob));
59474
          if ((v_range >> 24u) == 0u) {
59475
            {
59476
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(32);
59477
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
59478
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
59479
                goto suspend;
59480
              }
59481
              uint8_t t_30 = *iop_a_src++;
59482
              v_c8 = t_30;
59483
            }
59484
            v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
59485
            v_range <<= 8u;
59486
          }
59487
          v_tree_node = 1u;
59488
          while (v_tree_node < 256u) {
59489
            v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_high[0u][v_tree_node]));
59490
            v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
59491
            if (v_bits < v_threshold) {
59492
              v_range = v_threshold;
59493
              v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
59494
              self->private_data.f_probs_longrep_len_high[0u][v_tree_node] = ((uint16_t)(v_prob));
59495
              v_tree_node = (v_tree_node << 1u);
59496
            } else {
59497
              v_bits -= v_threshold;
59498
              v_range -= v_threshold;
59499
              v_prob -= (v_prob >> 5u);
59500
              self->private_data.f_probs_longrep_len_high[0u][v_tree_node] = ((uint16_t)(v_prob));
59501
              v_tree_node = ((v_tree_node << 1u) | 1u);
59502
            }
59503
            if ((v_range >> 24u) == 0u) {
59504
              {
59505
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT(33);
59506
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
59507
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
59508
                  goto suspend;
59509
                }
59510
                uint8_t t_31 = *iop_a_src++;
59511
                v_c8 = t_31;
59512
              }
59513
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
59514
              v_range <<= 8u;
59515
            }
59516
          }
59517
          v_len = ((v_tree_node & 255u) + 18u);
59518
          v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_LONGREP[v_state]));
59519
        } while (0);
59520
      } while (0);
59521
      v_dist = (v_rep0 + 1u);
59522
      if ((((uint64_t)(v_dist)) > v_pos) || (((uint64_t)(v_dist)) > ((uint64_t)(self->private_impl.f_dict_size)))) {
59523
        status = wuffs_base__make_status(wuffs_lzma__error__bad_distance);
59524
        goto exit;
59525
      }
59526
      v_pos += ((uint64_t)(v_len));
59527
      while (274u > ((uint64_t)(io2_a_dst - iop_a_dst))) {
59528
        status = wuffs_base__make_status(wuffs_base__suspension__short_write);
59529
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(34);
59530
      }
59531
      if (((uint64_t)(v_dist)) > ((uint64_t)(iop_a_dst - io0_a_dst))) {
59532
        v_adj_dist = ((uint32_t)((((uint64_t)(v_dist)) - ((uint64_t)(iop_a_dst - io0_a_dst)))));
59533
        if (v_adj_dist > self->private_impl.f_dict_seen) {
59534
          status = wuffs_base__make_status(wuffs_lzma__error__bad_distance);
59535
          goto exit;
59536
        }
59537
        v_wb_index = ((uint64_t)(((uint64_t)(self->private_impl.f_dict_workbuf_index)) - ((uint64_t)(v_adj_dist))));
59538
        while (v_wb_index >= 9223372036854775808u) {
59539
          v_wb_index += ((uint64_t)(self->private_impl.f_dict_size));
59540
        }
59541
        if (v_wb_index >= ((uint64_t)(a_workbuf.len))) {
59542
          status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state);
59543
          goto exit;
59544
        }
59545
        if (v_len < v_adj_dist) {
59546
          wuffs_private_impl__io_writer__limited_copy_u32_from_slice(
59547
              &iop_a_dst, io2_a_dst,(v_len + 1u), wuffs_base__slice_u8__subslice_i(a_workbuf, v_wb_index));
59548
          if ( ! (iop_a_dst > io1_a_dst)) {
59549
            status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state);
59550
            goto exit;
59551
          }
59552
          v_match_byte = ((uint32_t)(iop_a_dst[-1]));
59553
          iop_a_dst--;
59554
          if ( ! (iop_a_dst > io1_a_dst)) {
59555
            status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state);
59556
            goto exit;
59557
          }
59558
          v_prev_byte = iop_a_dst[-1];
59559
          continue;
59560
        } else if (v_len == v_adj_dist) {
59561
          wuffs_private_impl__io_writer__limited_copy_u32_from_slice(
59562
              &iop_a_dst, io2_a_dst,v_len, wuffs_base__slice_u8__subslice_i(a_workbuf, v_wb_index));
59563
          wuffs_private_impl__io_writer__limited_copy_u32_from_history(
59564
              &iop_a_dst, io0_a_dst, io2_a_dst, 1u, v_dist);
59565
          if ( ! (iop_a_dst > io1_a_dst)) {
59566
            status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state);
59567
            goto exit;
59568
          }
59569
          v_match_byte = ((uint32_t)(iop_a_dst[-1]));
59570
          iop_a_dst--;
59571
          if ( ! (iop_a_dst > io1_a_dst)) {
59572
            status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state);
59573
            goto exit;
59574
          }
59575
          v_prev_byte = iop_a_dst[-1];
59576
          continue;
59577
        }
59578
        wuffs_private_impl__io_writer__limited_copy_u32_from_slice(
59579
            &iop_a_dst, io2_a_dst,v_adj_dist, wuffs_base__slice_u8__subslice_i(a_workbuf, v_wb_index));
59580
        v_len -= v_adj_dist;
59581
        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)))) {
59582
          status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state);
59583
          goto exit;
59584
        }
59585
      }
59586
      v_match_cusp = wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast_return_cusp(
59587
          &iop_a_dst, io0_a_dst, io2_a_dst, v_len, v_dist);
59588
      v_match_byte = (v_match_cusp >> 8u);
59589
      v_prev_byte = ((uint8_t)(v_match_cusp));
59590
    }
59591
    label__outer__break:;
59592
    self->private_impl.f_stashed_bytes[0u] = v_prev_byte;
59593
    self->private_impl.f_stashed_bytes[1u] = ((uint8_t)(v_match_byte));
59594
    self->private_impl.f_stashed_bits = v_bits;
59595
    self->private_impl.f_stashed_range = v_range;
59596
    self->private_impl.f_stashed_state = v_state;
59597
    self->private_impl.f_stashed_rep0 = v_rep0;
59598
    self->private_impl.f_stashed_rep1 = v_rep1;
59599
    self->private_impl.f_stashed_rep2 = v_rep2;
59600
    self->private_impl.f_stashed_rep3 = v_rep3;
59601
    self->private_impl.f_stashed_pos = v_pos;
59602
    self->private_impl.f_stashed_pos_end = v_pos_end;
59603
59604
    ok:
59605
    self->private_impl.p_decode_bitstream_slow = 0;
59606
    goto exit;
59607
  }
59608
59609
  goto suspend;
59610
  suspend:
59611
  self->private_impl.p_decode_bitstream_slow = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
59612
  self->private_data.s_decode_bitstream_slow.v_bits = v_bits;
59613
  self->private_data.s_decode_bitstream_slow.v_range = v_range;
59614
  self->private_data.s_decode_bitstream_slow.v_state = v_state;
59615
  self->private_data.s_decode_bitstream_slow.v_rep0 = v_rep0;
59616
  self->private_data.s_decode_bitstream_slow.v_rep1 = v_rep1;
59617
  self->private_data.s_decode_bitstream_slow.v_rep2 = v_rep2;
59618
  self->private_data.s_decode_bitstream_slow.v_rep3 = v_rep3;
59619
  self->private_data.s_decode_bitstream_slow.v_rep = v_rep;
59620
  self->private_data.s_decode_bitstream_slow.v_pos = v_pos;
59621
  self->private_data.s_decode_bitstream_slow.v_pos_end = v_pos_end;
59622
  self->private_data.s_decode_bitstream_slow.v_lc = v_lc;
59623
  self->private_data.s_decode_bitstream_slow.v_lp_mask = v_lp_mask;
59624
  self->private_data.s_decode_bitstream_slow.v_pb_mask = v_pb_mask;
59625
  self->private_data.s_decode_bitstream_slow.v_tree_node = v_tree_node;
59626
  self->private_data.s_decode_bitstream_slow.v_prev_byte = v_prev_byte;
59627
  self->private_data.s_decode_bitstream_slow.v_match_byte = v_match_byte;
59628
  self->private_data.s_decode_bitstream_slow.v_len_state = v_len_state;
59629
  self->private_data.s_decode_bitstream_slow.v_slot = v_slot;
59630
  self->private_data.s_decode_bitstream_slow.v_len = v_len;
59631
  self->private_data.s_decode_bitstream_slow.v_lanl_offset = v_lanl_offset;
59632
  self->private_data.s_decode_bitstream_slow.v_num_extra_bits = v_num_extra_bits;
59633
  self->private_data.s_decode_bitstream_slow.v_dist_extra_bits = v_dist_extra_bits;
59634
  self->private_data.s_decode_bitstream_slow.v_i = v_i;
59635
  self->private_data.s_decode_bitstream_slow.v_index_lit = v_index_lit;
59636
  self->private_data.s_decode_bitstream_slow.v_index_len = v_index_len;
59637
  self->private_data.s_decode_bitstream_slow.v_index_small_dist_base = v_index_small_dist_base;
59638
  self->private_data.s_decode_bitstream_slow.v_index_small_dist_extra = v_index_small_dist_extra;
59639
  self->private_data.s_decode_bitstream_slow.v_index_large_dist = v_index_large_dist;
59640
  self->private_data.s_decode_bitstream_slow.v_dist = v_dist;
59641
59642
  goto exit;
59643
  exit:
59644
  if (a_dst && a_dst->data.ptr) {
59645
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
59646
  }
59647
  if (a_src && a_src->data.ptr) {
59648
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
59649
  }
59650
59651
  return status;
59652
}
59653
59654
// -------- func lzma.decoder.add_history
59655
59656
WUFFS_BASE__GENERATED_C_CODE
59657
static wuffs_base__status
59658
wuffs_lzma__decoder__add_history(
59659
    wuffs_lzma__decoder* self,
59660
    wuffs_base__slice_u8 a_hist,
59661
    wuffs_base__slice_u8 a_workbuf) {
59662
  uint64_t v_dict_workbuf_index = 0;
59663
  uint64_t v_dict_size = 0;
59664
  uint64_t v_hist_length = 0;
59665
  wuffs_base__slice_u8 v_s = {0};
59666
  uint64_t v_n_copied = 0;
59667
  uint64_t v_n = 0;
59668
59669
  v_dict_workbuf_index = ((uint64_t)(self->private_impl.f_dict_workbuf_index));
59670
  v_dict_size = ((uint64_t)(self->private_impl.f_dict_size));
59671
  if (((uint64_t)(a_hist.len)) == 0u) {
59672
    return wuffs_base__make_status(NULL);
59673
  }
59674
  if (((uint64_t)(a_workbuf.len)) < (v_dict_size + 273u)) {
59675
    return wuffs_base__make_status(wuffs_base__error__bad_workbuf_length);
59676
  }
59677
  v_hist_length = ((uint64_t)(a_hist.len));
59678
  if (v_hist_length > 4294967295u) {
59679
    self->private_impl.f_dict_seen = 4294967295u;
59680
  } else {
59681
    wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dict_seen, ((uint32_t)(v_hist_length)));
59682
  }
59683
  v_s = a_hist;
59684
  if (((uint64_t)(v_s.len)) >= v_dict_size) {
59685
    v_s = wuffs_private_impl__slice_u8__suffix(v_s, v_dict_size);
59686
    wuffs_private_impl__slice_u8__copy_from_slice(a_workbuf, v_s);
59687
    self->private_impl.f_dict_workbuf_index = 0u;
59688
  } else if (v_dict_workbuf_index > v_dict_size) {
59689
    return wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state);
59690
  } else {
59691
    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);
59692
    if (v_n_copied < ((uint64_t)(v_s.len))) {
59693
      v_n = wuffs_private_impl__slice_u8__copy_from_slice(a_workbuf, wuffs_base__slice_u8__subslice_i(v_s, v_n_copied));
59694
      self->private_impl.f_dict_workbuf_index = ((uint32_t)(v_n));
59695
    } else {
59696
      v_n = ((uint64_t)(v_dict_workbuf_index + v_n_copied));
59697
      if (v_n < v_dict_size) {
59698
        self->private_impl.f_dict_workbuf_index = ((uint32_t)(v_n));
59699
      } else {
59700
        self->private_impl.f_dict_workbuf_index = 0u;
59701
      }
59702
    }
59703
  }
59704
  if ((273u > v_dict_size) || (v_dict_size > ((uint64_t)(a_workbuf.len)))) {
59705
    return wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state);
59706
  }
59707
  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));
59708
  return wuffs_base__make_status(NULL);
59709
}
59710
59711
// -------- func lzma.decoder.get_quirk
59712
59713
WUFFS_BASE__GENERATED_C_CODE
59714
WUFFS_BASE__MAYBE_STATIC uint64_t
59715
wuffs_lzma__decoder__get_quirk(
59716
    const wuffs_lzma__decoder* self,
59717
    uint32_t a_key) {
59718
  if (!self) {
59719
    return 0;
59720
  }
59721
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
59722
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
59723
    return 0;
59724
  }
59725
59726
  if (a_key == 1290294272u) {
59727
    if (self->private_impl.f_allow_non_zero_initial_byte) {
59728
      return 1u;
59729
    }
59730
  } else if (a_key == 1290294273u) {
59731
    return ((uint64_t)(self->private_impl.f_format_extension));
59732
  }
59733
  return 0u;
59734
}
59735
59736
// -------- func lzma.decoder.set_quirk
59737
59738
WUFFS_BASE__GENERATED_C_CODE
59739
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
59740
wuffs_lzma__decoder__set_quirk(
59741
    wuffs_lzma__decoder* self,
59742
    uint32_t a_key,
59743
    uint64_t a_value) {
59744
  if (!self) {
59745
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
59746
  }
59747
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
59748
    return wuffs_base__make_status(
59749
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
59750
        ? wuffs_base__error__disabled_by_previous_error
59751
        : wuffs_base__error__initialize_not_called);
59752
  }
59753
59754
  uint32_t v_v = 0;
59755
  uint32_t v_n = 0;
59756
59757
  if (a_key == 1290294272u) {
59758
    self->private_impl.f_allow_non_zero_initial_byte = (a_value > 0u);
59759
  } else if (a_key == 1290294273u) {
59760
    if (a_value == 0u) {
59761
      self->private_impl.f_format_extension = 0u;
59762
      return wuffs_base__make_status(NULL);
59763
    } else if ((a_value & 255u) == 1u) {
59764
      if ((a_value >> 8u) <= 255u) {
59765
        self->private_impl.f_format_extension = ((uint32_t)(a_value));
59766
        v_v = (self->private_impl.f_format_extension >> 8u);
59767
        v_n = (((uint32_t)(1u)) << (v_v & 31u));
59768
        wuffs_private_impl__u32__sat_sub_indirect(&v_n, ((v_n >> 4u) * ((v_v >> 5u) & 7u)));
59769
        if ((v_n < 4096u) || (536870912u < v_n)) {
59770
          return wuffs_base__make_status(wuffs_base__error__bad_argument);
59771
        }
59772
        self->private_impl.f_dict_size = v_n;
59773
        return wuffs_base__make_status(NULL);
59774
      }
59775
    } else if ((a_value & 255u) == 2u) {
59776
      if ((a_value >> 8u) <= 40u) {
59777
        self->private_impl.f_format_extension = ((uint32_t)(a_value));
59778
        v_v = (self->private_impl.f_format_extension >> 8u);
59779
        if (v_v < 40u) {
59780
          self->private_impl.f_dict_size = ((2u | (v_v & 1u)) << ((v_v >> 1u) + 11u));
59781
        } else {
59782
          self->private_impl.f_dict_size = 4294967295u;
59783
        }
59784
        return wuffs_base__make_status(NULL);
59785
      }
59786
    }
59787
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
59788
  }
59789
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
59790
}
59791
59792
// -------- func lzma.decoder.dst_history_retain_length
59793
59794
WUFFS_BASE__GENERATED_C_CODE
59795
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
59796
wuffs_lzma__decoder__dst_history_retain_length(
59797
    const wuffs_lzma__decoder* self) {
59798
  if (!self) {
59799
    return wuffs_base__utility__make_optional_u63(false, 0u);
59800
  }
59801
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
59802
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
59803
    return wuffs_base__utility__make_optional_u63(false, 0u);
59804
  }
59805
59806
  return wuffs_base__utility__make_optional_u63(true, 0u);
59807
}
59808
59809
// -------- func lzma.decoder.workbuf_len
59810
59811
WUFFS_BASE__GENERATED_C_CODE
59812
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
59813
wuffs_lzma__decoder__workbuf_len(
59814
    const wuffs_lzma__decoder* self) {
59815
  if (!self) {
59816
    return wuffs_base__utility__empty_range_ii_u64();
59817
  }
59818
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
59819
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
59820
    return wuffs_base__utility__empty_range_ii_u64();
59821
  }
59822
59823
  uint64_t v_m = 0;
59824
59825
  if (self->private_impl.f_dict_size == 0u) {
59826
    return wuffs_base__utility__make_range_ii_u64(0u, 0u);
59827
  }
59828
  v_m = (((uint64_t)(self->private_impl.f_dict_size)) + 273u);
59829
  return wuffs_base__utility__make_range_ii_u64(v_m, v_m);
59830
}
59831
59832
// -------- func lzma.decoder.transform_io
59833
59834
WUFFS_BASE__GENERATED_C_CODE
59835
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
59836
wuffs_lzma__decoder__transform_io(
59837
    wuffs_lzma__decoder* self,
59838
    wuffs_base__io_buffer* a_dst,
59839
    wuffs_base__io_buffer* a_src,
59840
    wuffs_base__slice_u8 a_workbuf) {
59841
  if (!self) {
59842
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
59843
  }
59844
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
59845
    return wuffs_base__make_status(
59846
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
59847
        ? wuffs_base__error__disabled_by_previous_error
59848
        : wuffs_base__error__initialize_not_called);
59849
  }
59850
  if (!a_dst || !a_src) {
59851
    self->private_impl.magic = WUFFS_BASE__DISABLED;
59852
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
59853
  }
59854
  if ((self->private_impl.active_coroutine != 0) &&
59855
      (self->private_impl.active_coroutine != 1)) {
59856
    self->private_impl.magic = WUFFS_BASE__DISABLED;
59857
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
59858
  }
59859
  self->private_impl.active_coroutine = 0;
59860
  wuffs_base__status status = wuffs_base__make_status(NULL);
59861
59862
  uint64_t v_mark = 0;
59863
  wuffs_base__status v_dti_status = wuffs_base__make_status(NULL);
59864
  wuffs_base__status v_ah_status = wuffs_base__make_status(NULL);
59865
59866
  uint8_t* iop_a_dst = NULL;
59867
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
59868
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
59869
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
59870
  if (a_dst && a_dst->data.ptr) {
59871
    io0_a_dst = a_dst->data.ptr;
59872
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
59873
    iop_a_dst = io1_a_dst;
59874
    io2_a_dst = io0_a_dst + a_dst->data.len;
59875
    if (a_dst->meta.closed) {
59876
      io2_a_dst = iop_a_dst;
59877
    }
59878
  }
59879
59880
  uint32_t coro_susp_point = self->private_impl.p_transform_io;
59881
  switch (coro_susp_point) {
59882
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
59883
59884
    while (true) {
59885
      v_mark = ((uint64_t)(iop_a_dst - io0_a_dst));
59886
      {
59887
        if (a_dst) {
59888
          a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
59889
        }
59890
        wuffs_base__status t_0 = wuffs_lzma__decoder__do_transform_io(self, a_dst, a_src, a_workbuf);
59891
        v_dti_status = t_0;
59892
        if (a_dst) {
59893
          iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
59894
        }
59895
      }
59896
      if ( ! wuffs_base__status__is_suspension(&v_dti_status)) {
59897
        status = v_dti_status;
59898
        if (wuffs_base__status__is_error(&status)) {
59899
          goto exit;
59900
        } else if (wuffs_base__status__is_suspension(&status)) {
59901
          status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
59902
          goto exit;
59903
        }
59904
        goto ok;
59905
      } else if ((v_dti_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
59906
        status = wuffs_base__make_status(wuffs_lzma__error__truncated_input);
59907
        goto exit;
59908
      }
59909
      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);
59910
      if (wuffs_base__status__is_error(&v_ah_status)) {
59911
        status = v_ah_status;
59912
        goto exit;
59913
      }
59914
      status = v_dti_status;
59915
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
59916
    }
59917
59918
    ok:
59919
    self->private_impl.p_transform_io = 0;
59920
    goto exit;
59921
  }
59922
59923
  goto suspend;
59924
  suspend:
59925
  self->private_impl.p_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
59926
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
59927
59928
  goto exit;
59929
  exit:
59930
  if (a_dst && a_dst->data.ptr) {
59931
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
59932
  }
59933
59934
  if (wuffs_base__status__is_error(&status)) {
59935
    self->private_impl.magic = WUFFS_BASE__DISABLED;
59936
  }
59937
  return status;
59938
}
59939
59940
// -------- func lzma.decoder.do_transform_io
59941
59942
WUFFS_BASE__GENERATED_C_CODE
59943
static wuffs_base__status
59944
wuffs_lzma__decoder__do_transform_io(
59945
    wuffs_lzma__decoder* self,
59946
    wuffs_base__io_buffer* a_dst,
59947
    wuffs_base__io_buffer* a_src,
59948
    wuffs_base__slice_u8 a_workbuf) {
59949
  wuffs_base__status status = wuffs_base__make_status(NULL);
59950
59951
  uint8_t v_header_byte = 0;
59952
  uint8_t v_c8 = 0;
59953
  uint32_t v_c32 = 0;
59954
  uint8_t v_prop_byte = 0;
59955
  uint32_t v_lc = 0;
59956
  uint32_t v_lp = 0;
59957
  uint32_t v_pb = 0;
59958
  uint32_t v_length = 0;
59959
  uint32_t v_n_copied = 0;
59960
  uint64_t v_smark = 0;
59961
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
59962
59963
  uint8_t* iop_a_dst = NULL;
59964
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
59965
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
59966
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
59967
  if (a_dst && a_dst->data.ptr) {
59968
    io0_a_dst = a_dst->data.ptr;
59969
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
59970
    iop_a_dst = io1_a_dst;
59971
    io2_a_dst = io0_a_dst + a_dst->data.len;
59972
    if (a_dst->meta.closed) {
59973
      io2_a_dst = iop_a_dst;
59974
    }
59975
  }
59976
  const uint8_t* iop_a_src = NULL;
59977
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
59978
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
59979
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
59980
  if (a_src && a_src->data.ptr) {
59981
    io0_a_src = a_src->data.ptr;
59982
    io1_a_src = io0_a_src + a_src->meta.ri;
59983
    iop_a_src = io1_a_src;
59984
    io2_a_src = io0_a_src + a_src->meta.wi;
59985
  }
59986
59987
  uint32_t coro_susp_point = self->private_impl.p_do_transform_io;
59988
  if (coro_susp_point) {
59989
    v_header_byte = self->private_data.s_do_transform_io.v_header_byte;
59990
    v_length = self->private_data.s_do_transform_io.v_length;
59991
  }
59992
  switch (coro_susp_point) {
59993
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
59994
59995
    self->private_impl.f_lzma2_need_prob_reset = true;
59996
    self->private_impl.f_lzma2_need_properties = true;
59997
    self->private_impl.f_lzma2_need_dict_reset = true;
59998
    while (true) {
59999
      if ((self->private_impl.f_format_extension & 255u) == 0u) {
60000
        {
60001
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
60002
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
60003
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
60004
            goto suspend;
60005
          }
60006
          uint8_t t_0 = *iop_a_src++;
60007
          v_prop_byte = t_0;
60008
        }
60009
        if (v_prop_byte >= 225u) {
60010
          status = wuffs_base__make_status(wuffs_lzma__error__bad_header);
60011
          goto exit;
60012
        }
60013
        v_lc = ((uint32_t)(((uint8_t)(v_prop_byte % 9u))));
60014
#if defined(__GNUC__)
60015
#pragma GCC diagnostic push
60016
#pragma GCC diagnostic ignored "-Wconversion"
60017
#endif
60018
        v_prop_byte /= 9u;
60019
#if defined(__GNUC__)
60020
#pragma GCC diagnostic pop
60021
#endif
60022
        v_lp = ((uint32_t)(((uint8_t)(v_prop_byte % 5u))));
60023
        v_pb = ((uint32_t)(((uint8_t)(v_prop_byte / 5u))));
60024
        if ((v_lc + v_lp) > 4u) {
60025
          status = wuffs_base__make_status(wuffs_lzma__error__unsupported_properties);
60026
          goto exit;
60027
        }
60028
        self->private_impl.f_lc = wuffs_base__u32__min(v_lc, 4u);
60029
        self->private_impl.f_lp = v_lp;
60030
        self->private_impl.f_pb = v_pb;
60031
        {
60032
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
60033
          uint32_t t_1;
60034
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
60035
            t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
60036
            iop_a_src += 4;
60037
          } else {
60038
            self->private_data.s_do_transform_io.scratch = 0;
60039
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
60040
            while (true) {
60041
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
60042
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
60043
                goto suspend;
60044
              }
60045
              uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
60046
              uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
60047
              *scratch <<= 8;
60048
              *scratch >>= 8;
60049
              *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
60050
              if (num_bits_1 == 24) {
60051
                t_1 = ((uint32_t)(*scratch));
60052
                break;
60053
              }
60054
              num_bits_1 += 8u;
60055
              *scratch |= ((uint64_t)(num_bits_1)) << 56;
60056
            }
60057
          }
60058
          v_c32 = t_1;
60059
        }
60060
        self->private_impl.f_dict_size = wuffs_base__u32__max(v_c32, 4096u);
60061
        {
60062
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
60063
          uint64_t t_2;
60064
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) {
60065
            t_2 = wuffs_base__peek_u64le__no_bounds_check(iop_a_src);
60066
            iop_a_src += 8;
60067
          } else {
60068
            self->private_data.s_do_transform_io.scratch = 0;
60069
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
60070
            while (true) {
60071
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
60072
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
60073
                goto suspend;
60074
              }
60075
              uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
60076
              uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56));
60077
              *scratch <<= 8;
60078
              *scratch >>= 8;
60079
              *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2;
60080
              if (num_bits_2 == 56) {
60081
                t_2 = ((uint64_t)(*scratch));
60082
                break;
60083
              }
60084
              num_bits_2 += 8u;
60085
              *scratch |= ((uint64_t)(num_bits_2)) << 56;
60086
            }
60087
          }
60088
          self->private_impl.f_decoded_length = t_2;
60089
        }
60090
        if ((self->private_impl.f_decoded_length >= 9223372036854775808u) && (self->private_impl.f_decoded_length != 18446744073709551615u)) {
60091
          status = wuffs_base__make_status(wuffs_lzma__error__unsupported_decoded_length);
60092
          goto exit;
60093
        }
60094
        wuffs_lzma__decoder__initialize_probs(self);
60095
      } else if ((self->private_impl.f_format_extension & 255u) == 1u) {
60096
        self->private_impl.f_lc = 3u;
60097
        self->private_impl.f_lp = 0u;
60098
        self->private_impl.f_pb = 2u;
60099
        self->private_impl.f_decoded_length = 18446744073709551615u;
60100
        wuffs_lzma__decoder__initialize_probs(self);
60101
      } else {
60102
        while (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
60103
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
60104
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6);
60105
        }
60106
        if (wuffs_base__peek_u8be__no_bounds_check(iop_a_src) == 0u) {
60107
          iop_a_src += 1u;
60108
          break;
60109
        }
60110
        {
60111
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
60112
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
60113
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
60114
            goto suspend;
60115
          }
60116
          uint8_t t_3 = *iop_a_src++;
60117
          v_header_byte = t_3;
60118
        }
60119
        if (v_header_byte < 128u) {
60120
          if (v_header_byte < 2u) {
60121
            self->private_impl.f_lzma2_need_prob_reset = true;
60122
            self->private_impl.f_lzma2_need_properties = true;
60123
            self->private_impl.f_lzma2_need_dict_reset = false;
60124
            wuffs_lzma__decoder__initialize_dict(self);
60125
          } else if ((v_header_byte > 2u) || self->private_impl.f_lzma2_need_dict_reset) {
60126
            status = wuffs_base__make_status(wuffs_lzma__error__bad_lzma2_header);
60127
            goto exit;
60128
          }
60129
          self->private_impl.f_prev_lzma2_chunk_was_uncompressed = true;
60130
          {
60131
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
60132
            uint32_t t_4;
60133
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
60134
              t_4 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src)));
60135
              iop_a_src += 2;
60136
            } else {
60137
              self->private_data.s_do_transform_io.scratch = 0;
60138
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
60139
              while (true) {
60140
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
60141
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
60142
                  goto suspend;
60143
                }
60144
                uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
60145
                uint32_t num_bits_4 = ((uint32_t)(*scratch & 0xFFu));
60146
                *scratch >>= 8;
60147
                *scratch <<= 8;
60148
                *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_4);
60149
                if (num_bits_4 == 8) {
60150
                  t_4 = ((uint32_t)(*scratch >> 48));
60151
                  break;
60152
                }
60153
                num_bits_4 += 8u;
60154
                *scratch |= ((uint64_t)(num_bits_4));
60155
              }
60156
            }
60157
            v_c32 = t_4;
60158
          }
60159
          v_length = (1u + v_c32);
60160
          while (true) {
60161
            v_n_copied = wuffs_private_impl__io_writer__limited_copy_u32_from_reader(
60162
                &iop_a_dst, io2_a_dst,v_length, &iop_a_src, io2_a_src);
60163
            wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_stashed_pos, ((uint64_t)(v_n_copied)));
60164
            if (v_length <= v_n_copied) {
60165
              break;
60166
            }
60167
            v_length -= v_n_copied;
60168
            if (((uint64_t)(io2_a_dst - iop_a_dst)) == 0u) {
60169
              status = wuffs_base__make_status(wuffs_base__suspension__short_write);
60170
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10);
60171
            } else {
60172
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
60173
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(11);
60174
            }
60175
          }
60176
          continue;
60177
        }
60178
        self->private_impl.f_decoded_length = ((uint64_t)(v_header_byte));
60179
        {
60180
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12);
60181
          uint32_t t_5;
60182
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
60183
            t_5 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src)));
60184
            iop_a_src += 2;
60185
          } else {
60186
            self->private_data.s_do_transform_io.scratch = 0;
60187
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13);
60188
            while (true) {
60189
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
60190
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
60191
                goto suspend;
60192
              }
60193
              uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
60194
              uint32_t num_bits_5 = ((uint32_t)(*scratch & 0xFFu));
60195
              *scratch >>= 8;
60196
              *scratch <<= 8;
60197
              *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_5);
60198
              if (num_bits_5 == 8) {
60199
                t_5 = ((uint32_t)(*scratch >> 48));
60200
                break;
60201
              }
60202
              num_bits_5 += 8u;
60203
              *scratch |= ((uint64_t)(num_bits_5));
60204
            }
60205
          }
60206
          v_c32 = t_5;
60207
        }
60208
        self->private_impl.f_decoded_length = (((self->private_impl.f_decoded_length & 31u) << 16u) + ((uint64_t)((1u + v_c32))));
60209
        {
60210
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14);
60211
          uint32_t t_6;
60212
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
60213
            t_6 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src)));
60214
            iop_a_src += 2;
60215
          } else {
60216
            self->private_data.s_do_transform_io.scratch = 0;
60217
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15);
60218
            while (true) {
60219
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
60220
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
60221
                goto suspend;
60222
              }
60223
              uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
60224
              uint32_t num_bits_6 = ((uint32_t)(*scratch & 0xFFu));
60225
              *scratch >>= 8;
60226
              *scratch <<= 8;
60227
              *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_6);
60228
              if (num_bits_6 == 8) {
60229
                t_6 = ((uint32_t)(*scratch >> 48));
60230
                break;
60231
              }
60232
              num_bits_6 += 8u;
60233
              *scratch |= ((uint64_t)(num_bits_6));
60234
            }
60235
          }
60236
          v_c32 = t_6;
60237
        }
60238
        self->private_impl.f_lzma2_encoded_length_want = ((uint64_t)((1u + v_c32)));
60239
        if (v_header_byte >= 160u) {
60240
          wuffs_lzma__decoder__initialize_probs(self);
60241
          self->private_impl.f_lzma2_need_prob_reset = false;
60242
        }
60243
        if (v_header_byte >= 192u) {
60244
          {
60245
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16);
60246
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
60247
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
60248
              goto suspend;
60249
            }
60250
            uint8_t t_7 = *iop_a_src++;
60251
            v_prop_byte = t_7;
60252
          }
60253
          if (v_prop_byte >= 225u) {
60254
            status = wuffs_base__make_status(wuffs_lzma__error__bad_lzma2_header);
60255
            goto exit;
60256
          }
60257
          v_lc = ((uint32_t)(((uint8_t)(v_prop_byte % 9u))));
60258
#if defined(__GNUC__)
60259
#pragma GCC diagnostic push
60260
#pragma GCC diagnostic ignored "-Wconversion"
60261
#endif
60262
          v_prop_byte /= 9u;
60263
#if defined(__GNUC__)
60264
#pragma GCC diagnostic pop
60265
#endif
60266
          v_lp = ((uint32_t)(((uint8_t)(v_prop_byte % 5u))));
60267
          v_pb = ((uint32_t)(((uint8_t)(v_prop_byte / 5u))));
60268
          if ((v_lc + v_lp) > 4u) {
60269
            status = wuffs_base__make_status(wuffs_lzma__error__bad_lzma2_header);
60270
            goto exit;
60271
          }
60272
          self->private_impl.f_lc = wuffs_base__u32__min(v_lc, 4u);
60273
          self->private_impl.f_lp = v_lp;
60274
          self->private_impl.f_pb = v_pb;
60275
          self->private_impl.f_lzma2_need_properties = false;
60276
        }
60277
        if (v_header_byte >= 224u) {
60278
          self->private_impl.f_lzma2_need_dict_reset = false;
60279
          wuffs_lzma__decoder__initialize_dict(self);
60280
        } else if (self->private_impl.f_prev_lzma2_chunk_was_uncompressed) {
60281
          if (a_dst) {
60282
            a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
60283
          }
60284
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(17);
60285
          status = wuffs_lzma__decoder__update_stashed_bytes(self, a_dst, a_workbuf);
60286
          if (a_dst) {
60287
            iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
60288
          }
60289
          if (status.repr) {
60290
            goto suspend;
60291
          }
60292
        }
60293
        self->private_impl.f_prev_lzma2_chunk_was_uncompressed = false;
60294
        if (self->private_impl.f_lzma2_need_prob_reset || self->private_impl.f_lzma2_need_properties || self->private_impl.f_lzma2_need_dict_reset) {
60295
          status = wuffs_base__make_status(wuffs_lzma__error__bad_lzma2_header);
60296
          goto exit;
60297
        }
60298
      }
60299
      {
60300
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(18);
60301
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
60302
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
60303
          goto suspend;
60304
        }
60305
        uint8_t t_8 = *iop_a_src++;
60306
        v_c8 = t_8;
60307
      }
60308
      if ((v_c8 != 0u) &&  ! self->private_impl.f_allow_non_zero_initial_byte) {
60309
        status = wuffs_base__make_status(wuffs_lzma__error__bad_code);
60310
        goto exit;
60311
      }
60312
      {
60313
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(19);
60314
        uint32_t t_9;
60315
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
60316
          t_9 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
60317
          iop_a_src += 4;
60318
        } else {
60319
          self->private_data.s_do_transform_io.scratch = 0;
60320
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(20);
60321
          while (true) {
60322
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
60323
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
60324
              goto suspend;
60325
            }
60326
            uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
60327
            uint32_t num_bits_9 = ((uint32_t)(*scratch & 0xFFu));
60328
            *scratch >>= 8;
60329
            *scratch <<= 8;
60330
            *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_9);
60331
            if (num_bits_9 == 24) {
60332
              t_9 = ((uint32_t)(*scratch >> 32));
60333
              break;
60334
            }
60335
            num_bits_9 += 8u;
60336
            *scratch |= ((uint64_t)(num_bits_9));
60337
          }
60338
        }
60339
        self->private_impl.f_stashed_bits = t_9;
60340
      }
60341
      if (self->private_impl.f_stashed_bits == 4294967295u) {
60342
        status = wuffs_base__make_status(wuffs_lzma__error__bad_code);
60343
        goto exit;
60344
      }
60345
      self->private_impl.f_stashed_range = 4294967295u;
60346
      self->private_impl.f_stashed_pos_end = wuffs_base__u64__sat_add(self->private_impl.f_stashed_pos, self->private_impl.f_decoded_length);
60347
      if ((self->private_impl.f_stashed_pos_end == 18446744073709551615u) && (self->private_impl.f_decoded_length != 18446744073709551615u)) {
60348
        status = wuffs_base__make_status(wuffs_lzma__error__unsupported_decoded_length);
60349
        goto exit;
60350
      }
60351
      self->private_impl.f_lzma2_encoded_length_have = 5u;
60352
      while (((uint64_t)(a_workbuf.len)) < (((uint64_t)(self->private_impl.f_dict_size)) + 273u)) {
60353
        status = wuffs_base__make_status(wuffs_base__suspension__short_workbuf);
60354
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(21);
60355
      }
60356
      while (true) {
60357
        v_smark = ((uint64_t)(iop_a_src - io0_a_src));
60358
        {
60359
          if (a_dst) {
60360
            a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
60361
          }
60362
          if (a_src) {
60363
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
60364
          }
60365
          wuffs_base__status t_10 = wuffs_lzma__decoder__decode_bitstream(self, a_dst, a_src, a_workbuf);
60366
          v_status = t_10;
60367
          if (a_dst) {
60368
            iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
60369
          }
60370
          if (a_src) {
60371
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
60372
          }
60373
        }
60374
        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))));
60375
        if (wuffs_base__status__is_ok(&v_status)) {
60376
          break;
60377
        }
60378
        status = v_status;
60379
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(22);
60380
      }
60381
      if (self->private_impl.f_decoded_length == 18446744073709551615u) {
60382
        if (self->private_impl.f_stashed_bits != 0u) {
60383
          status = wuffs_base__make_status(wuffs_lzma__error__bad_bitstream_trailer);
60384
          goto exit;
60385
        }
60386
      } else if (self->private_impl.f_stashed_pos != self->private_impl.f_stashed_pos_end) {
60387
        status = wuffs_base__make_status(wuffs_lzma__error__bad_decoded_length);
60388
        goto exit;
60389
      } else if (self->private_impl.f_stashed_bits != 0u) {
60390
        if (a_src) {
60391
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
60392
        }
60393
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(23);
60394
        status = wuffs_lzma__decoder__decode_optional_end_of_stream(self, a_src, a_workbuf);
60395
        if (a_src) {
60396
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
60397
        }
60398
        if (status.repr) {
60399
          goto suspend;
60400
        }
60401
        if (self->private_impl.f_stashed_bits != 0u) {
60402
          status = wuffs_base__make_status(wuffs_lzma__error__bad_bitstream_trailer);
60403
          goto exit;
60404
        }
60405
      }
60406
      if ((self->private_impl.f_format_extension & 255u) < 2u) {
60407
        break;
60408
      } else if (self->private_impl.f_lzma2_encoded_length_have != self->private_impl.f_lzma2_encoded_length_want) {
60409
        status = wuffs_base__make_status(wuffs_lzma__error__bad_lzma2_header);
60410
        goto exit;
60411
      }
60412
    }
60413
60414
    ok:
60415
    self->private_impl.p_do_transform_io = 0;
60416
    goto exit;
60417
  }
60418
60419
  goto suspend;
60420
  suspend:
60421
  self->private_impl.p_do_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
60422
  self->private_data.s_do_transform_io.v_header_byte = v_header_byte;
60423
  self->private_data.s_do_transform_io.v_length = v_length;
60424
60425
  goto exit;
60426
  exit:
60427
  if (a_dst && a_dst->data.ptr) {
60428
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
60429
  }
60430
  if (a_src && a_src->data.ptr) {
60431
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
60432
  }
60433
60434
  return status;
60435
}
60436
60437
// -------- func lzma.decoder.decode_bitstream
60438
60439
WUFFS_BASE__GENERATED_C_CODE
60440
static wuffs_base__status
60441
wuffs_lzma__decoder__decode_bitstream(
60442
    wuffs_lzma__decoder* self,
60443
    wuffs_base__io_buffer* a_dst,
60444
    wuffs_base__io_buffer* a_src,
60445
    wuffs_base__slice_u8 a_workbuf) {
60446
  wuffs_base__status status = wuffs_base__make_status(NULL);
60447
60448
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
60449
60450
  uint32_t coro_susp_point = self->private_impl.p_decode_bitstream;
60451
  switch (coro_susp_point) {
60452
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
60453
60454
    self->private_impl.f_end_of_chunk = false;
60455
    while (true) {
60456
      v_status = wuffs_lzma__decoder__decode_bitstream_fast(self, a_dst, a_src, a_workbuf);
60457
      if (wuffs_base__status__is_error(&v_status)) {
60458
        status = v_status;
60459
        goto exit;
60460
      }
60461
      if (self->private_impl.f_end_of_chunk) {
60462
        break;
60463
      }
60464
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
60465
      status = wuffs_lzma__decoder__decode_bitstream_slow(self, a_dst, a_src, a_workbuf);
60466
      if (status.repr) {
60467
        goto suspend;
60468
      }
60469
      if (self->private_impl.f_end_of_chunk) {
60470
        break;
60471
      }
60472
    }
60473
60474
    goto ok;
60475
    ok:
60476
    self->private_impl.p_decode_bitstream = 0;
60477
    goto exit;
60478
  }
60479
60480
  goto suspend;
60481
  suspend:
60482
  self->private_impl.p_decode_bitstream = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
60483
60484
  goto exit;
60485
  exit:
60486
  return status;
60487
}
60488
60489
// -------- func lzma.decoder.update_stashed_bytes
60490
60491
WUFFS_BASE__GENERATED_C_CODE
60492
static wuffs_base__status
60493
wuffs_lzma__decoder__update_stashed_bytes(
60494
    wuffs_lzma__decoder* self,
60495
    wuffs_base__io_buffer* a_dst,
60496
    wuffs_base__slice_u8 a_workbuf) {
60497
  wuffs_base__status status = wuffs_base__make_status(NULL);
60498
60499
  uint32_t v_dist = 0;
60500
  uint32_t v_which = 0;
60501
  uint32_t v_adj_dist = 0;
60502
  uint64_t v_wb_index = 0;
60503
60504
  uint8_t* iop_a_dst = NULL;
60505
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
60506
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
60507
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
60508
  if (a_dst && a_dst->data.ptr) {
60509
    io0_a_dst = a_dst->data.ptr;
60510
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
60511
    iop_a_dst = io1_a_dst;
60512
    io2_a_dst = io0_a_dst + a_dst->data.len;
60513
    if (a_dst->meta.closed) {
60514
      io2_a_dst = iop_a_dst;
60515
    }
60516
  }
60517
60518
  uint32_t coro_susp_point = self->private_impl.p_update_stashed_bytes;
60519
  switch (coro_susp_point) {
60520
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
60521
60522
    while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
60523
      status = wuffs_base__make_status(wuffs_base__suspension__short_write);
60524
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
60525
    }
60526
    v_dist = 1u;
60527
    v_which = 0u;
60528
    while (v_which < 2u) {
60529
      if (((uint64_t)(v_dist)) <= ((uint64_t)(iop_a_dst - io0_a_dst))) {
60530
        wuffs_private_impl__io_writer__limited_copy_u32_from_history(
60531
            &iop_a_dst, io0_a_dst, io2_a_dst, 1u, v_dist);
60532
        if ( ! (iop_a_dst > io1_a_dst)) {
60533
          status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state);
60534
          goto exit;
60535
        }
60536
        self->private_impl.f_stashed_bytes[v_which] = iop_a_dst[-1];
60537
        iop_a_dst--;
60538
      } else {
60539
        v_adj_dist = ((uint32_t)((((uint64_t)(v_dist)) - ((uint64_t)(iop_a_dst - io0_a_dst)))));
60540
        v_wb_index = ((uint64_t)(((uint64_t)(self->private_impl.f_dict_workbuf_index)) - ((uint64_t)(v_adj_dist))));
60541
        while (v_wb_index >= 9223372036854775808u) {
60542
          v_wb_index += ((uint64_t)(self->private_impl.f_dict_size));
60543
        }
60544
        if (v_wb_index >= ((uint64_t)(a_workbuf.len))) {
60545
          status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state);
60546
          goto exit;
60547
        }
60548
        self->private_impl.f_stashed_bytes[v_which] = a_workbuf.ptr[v_wb_index];
60549
      }
60550
      v_dist = (1u + self->private_impl.f_stashed_rep0);
60551
      v_which += 1u;
60552
    }
60553
60554
    ok:
60555
    self->private_impl.p_update_stashed_bytes = 0;
60556
    goto exit;
60557
  }
60558
60559
  goto suspend;
60560
  suspend:
60561
  self->private_impl.p_update_stashed_bytes = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
60562
60563
  goto exit;
60564
  exit:
60565
  if (a_dst && a_dst->data.ptr) {
60566
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
60567
  }
60568
60569
  return status;
60570
}
60571
60572
// -------- func lzma.decoder.decode_optional_end_of_stream
60573
60574
WUFFS_BASE__GENERATED_C_CODE
60575
static wuffs_base__status
60576
wuffs_lzma__decoder__decode_optional_end_of_stream(
60577
    wuffs_lzma__decoder* self,
60578
    wuffs_base__io_buffer* a_src,
60579
    wuffs_base__slice_u8 a_workbuf) {
60580
  wuffs_base__status status = wuffs_base__make_status(NULL);
60581
60582
  wuffs_base__io_buffer u_w = wuffs_base__empty_io_buffer();
60583
  wuffs_base__io_buffer* v_w = &u_w;
60584
  uint8_t* iop_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
60585
  uint8_t* io0_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
60586
  uint8_t* io1_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
60587
  uint8_t* io2_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
60588
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
60589
60590
  uint32_t coro_susp_point = self->private_impl.p_decode_optional_end_of_stream;
60591
  switch (coro_susp_point) {
60592
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
60593
60594
    self->private_impl.f_stashed_pos_end = 18446744073709551615u;
60595
    while (true) {
60596
      {
60597
        wuffs_base__io_buffer* o_0_v_w = v_w;
60598
        uint8_t* o_0_iop_v_w = iop_v_w;
60599
        uint8_t* o_0_io0_v_w = io0_v_w;
60600
        uint8_t* o_0_io1_v_w = io1_v_w;
60601
        uint8_t* o_0_io2_v_w = io2_v_w;
60602
        v_w = wuffs_private_impl__io_writer__set(
60603
            &u_w,
60604
            &iop_v_w,
60605
            &io0_v_w,
60606
            &io1_v_w,
60607
            &io2_v_w,
60608
            wuffs_base__utility__empty_slice_u8(),
60609
            0u);
60610
        {
60611
          wuffs_base__status t_0 = wuffs_lzma__decoder__decode_bitstream_slow(self, v_w, a_src, a_workbuf);
60612
          v_status = t_0;
60613
        }
60614
        v_w = o_0_v_w;
60615
        iop_v_w = o_0_iop_v_w;
60616
        io0_v_w = o_0_io0_v_w;
60617
        io1_v_w = o_0_io1_v_w;
60618
        io2_v_w = o_0_io2_v_w;
60619
      }
60620
      if (wuffs_base__status__is_ok(&v_status)) {
60621
        break;
60622
      } else if (v_status.repr == wuffs_base__suspension__short_write) {
60623
        status = wuffs_base__make_status(wuffs_lzma__error__bad_bitstream_trailer);
60624
        goto exit;
60625
      }
60626
      status = v_status;
60627
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
60628
    }
60629
    self->private_impl.f_stashed_pos_end = self->private_impl.f_stashed_pos;
60630
60631
    ok:
60632
    self->private_impl.p_decode_optional_end_of_stream = 0;
60633
    goto exit;
60634
  }
60635
60636
  goto suspend;
60637
  suspend:
60638
  self->private_impl.p_decode_optional_end_of_stream = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
60639
60640
  goto exit;
60641
  exit:
60642
  return status;
60643
}
60644
60645
// -------- func lzma.decoder.initialize_dict
60646
60647
WUFFS_BASE__GENERATED_C_CODE
60648
static wuffs_base__empty_struct
60649
wuffs_lzma__decoder__initialize_dict(
60650
    wuffs_lzma__decoder* self) {
60651
  self->private_impl.f_dict_workbuf_index = 0u;
60652
  self->private_impl.f_dict_seen = 0u;
60653
  self->private_impl.f_stashed_bytes[0u] = 0u;
60654
  self->private_impl.f_stashed_bytes[1u] = 0u;
60655
  self->private_impl.f_stashed_pos = 0u;
60656
  return wuffs_base__make_empty_struct();
60657
}
60658
60659
// -------- func lzma.decoder.initialize_probs
60660
60661
WUFFS_BASE__GENERATED_C_CODE
60662
static wuffs_base__empty_struct
60663
wuffs_lzma__decoder__initialize_probs(
60664
    wuffs_lzma__decoder* self) {
60665
  uint32_t v_i = 0;
60666
  uint32_t v_j = 0;
60667
60668
  v_i = 0u;
60669
  while (v_i < 192u) {
60670
    self->private_data.f_probs_ao00[v_i] = 1024u;
60671
    v_i += 1u;
60672
  }
60673
  v_i = 0u;
60674
  while (v_i < 12u) {
60675
    self->private_data.f_probs_ao20[v_i] = 1024u;
60676
    v_i += 1u;
60677
  }
60678
  v_i = 0u;
60679
  while (v_i < 12u) {
60680
    self->private_data.f_probs_ao40[v_i] = 1024u;
60681
    v_i += 1u;
60682
  }
60683
  v_i = 0u;
60684
  while (v_i < 192u) {
60685
    self->private_data.f_probs_ao41[v_i] = 1024u;
60686
    v_i += 1u;
60687
  }
60688
  v_i = 0u;
60689
  while (v_i < 12u) {
60690
    self->private_data.f_probs_ao60[v_i] = 1024u;
60691
    v_i += 1u;
60692
  }
60693
  v_i = 0u;
60694
  while (v_i < 12u) {
60695
    self->private_data.f_probs_ao63[v_i] = 1024u;
60696
    v_i += 1u;
60697
  }
60698
  v_i = 0u;
60699
  while (v_i < 16u) {
60700
    v_j = 0u;
60701
    while (v_j < 8u) {
60702
      self->private_data.f_probs_match_len_low[v_i][v_j] = 1024u;
60703
      v_j += 1u;
60704
    }
60705
    v_i += 1u;
60706
  }
60707
  v_i = 0u;
60708
  while (v_i < 16u) {
60709
    v_j = 0u;
60710
    while (v_j < 8u) {
60711
      self->private_data.f_probs_match_len_mid[v_i][v_j] = 1024u;
60712
      v_j += 1u;
60713
    }
60714
    v_i += 1u;
60715
  }
60716
  v_i = 0u;
60717
  while (v_i < 256u) {
60718
    self->private_data.f_probs_match_len_high[0u][v_i] = 1024u;
60719
    v_i += 1u;
60720
  }
60721
  v_i = 0u;
60722
  while (v_i < 16u) {
60723
    v_j = 0u;
60724
    while (v_j < 8u) {
60725
      self->private_data.f_probs_longrep_len_low[v_i][v_j] = 1024u;
60726
      v_j += 1u;
60727
    }
60728
    v_i += 1u;
60729
  }
60730
  v_i = 0u;
60731
  while (v_i < 16u) {
60732
    v_j = 0u;
60733
    while (v_j < 8u) {
60734
      self->private_data.f_probs_longrep_len_mid[v_i][v_j] = 1024u;
60735
      v_j += 1u;
60736
    }
60737
    v_i += 1u;
60738
  }
60739
  v_i = 0u;
60740
  while (v_i < 256u) {
60741
    self->private_data.f_probs_longrep_len_high[0u][v_i] = 1024u;
60742
    v_i += 1u;
60743
  }
60744
  v_i = 0u;
60745
  while (v_i < 4u) {
60746
    v_j = 0u;
60747
    while (v_j < 64u) {
60748
      self->private_data.f_probs_slot[v_i][v_j] = 1024u;
60749
      v_j += 1u;
60750
    }
60751
    v_i += 1u;
60752
  }
60753
  v_i = 0u;
60754
  while (v_i < 128u) {
60755
    self->private_data.f_probs_small_dist[v_i] = 1024u;
60756
    v_i += 1u;
60757
  }
60758
  v_i = 0u;
60759
  while (v_i < 16u) {
60760
    self->private_data.f_probs_large_dist[v_i] = 1024u;
60761
    v_i += 1u;
60762
  }
60763
  v_i = 0u;
60764
  while (v_i < 16u) {
60765
    v_j = 0u;
60766
    while (v_j < 768u) {
60767
      self->private_data.f_probs_lit[v_i][v_j] = 1024u;
60768
      v_j += 1u;
60769
    }
60770
    v_i += 1u;
60771
  }
60772
  self->private_impl.f_stashed_state = 0u;
60773
  self->private_impl.f_stashed_rep0 = 0u;
60774
  self->private_impl.f_stashed_rep1 = 0u;
60775
  self->private_impl.f_stashed_rep2 = 0u;
60776
  self->private_impl.f_stashed_rep3 = 0u;
60777
  return wuffs_base__make_empty_struct();
60778
}
60779
60780
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZMA)
60781
60782
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZIP)
60783
60784
// ---------------- Status Codes Implementations
60785
60786
const char wuffs_lzip__error__bad_checksum[] = "#lzip: bad checksum";
60787
const char wuffs_lzip__error__bad_footer[] = "#lzip: bad footer";
60788
const char wuffs_lzip__error__bad_header[] = "#lzip: bad header";
60789
const char wuffs_lzip__error__truncated_input[] = "#lzip: truncated input";
60790
60791
// ---------------- Private Consts
60792
60793
// ---------------- Private Initializer Prototypes
60794
60795
// ---------------- Private Function Prototypes
60796
60797
WUFFS_BASE__GENERATED_C_CODE
60798
static wuffs_base__status
60799
wuffs_lzip__decoder__do_transform_io(
60800
    wuffs_lzip__decoder* self,
60801
    wuffs_base__io_buffer* a_dst,
60802
    wuffs_base__io_buffer* a_src,
60803
    wuffs_base__slice_u8 a_workbuf);
60804
60805
// ---------------- VTables
60806
60807
const wuffs_base__io_transformer__func_ptrs
60808
wuffs_lzip__decoder__func_ptrs_for__wuffs_base__io_transformer = {
60809
  (wuffs_base__optional_u63(*)(const void*))(&wuffs_lzip__decoder__dst_history_retain_length),
60810
  (uint64_t(*)(const void*,
60811
      uint32_t))(&wuffs_lzip__decoder__get_quirk),
60812
  (wuffs_base__status(*)(void*,
60813
      uint32_t,
60814
      uint64_t))(&wuffs_lzip__decoder__set_quirk),
60815
  (wuffs_base__status(*)(void*,
60816
      wuffs_base__io_buffer*,
60817
      wuffs_base__io_buffer*,
60818
      wuffs_base__slice_u8))(&wuffs_lzip__decoder__transform_io),
60819
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_lzip__decoder__workbuf_len),
60820
};
60821
60822
// ---------------- Initializer Implementations
60823
60824
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
60825
wuffs_lzip__decoder__initialize(
60826
    wuffs_lzip__decoder* self,
60827
    size_t sizeof_star_self,
60828
    uint64_t wuffs_version,
60829
    uint32_t options){
60830
  if (!self) {
60831
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
60832
  }
60833
  if (sizeof(*self) != sizeof_star_self) {
60834
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
60835
  }
60836
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
60837
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
60838
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
60839
  }
60840
60841
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
60842
    // The whole point of this if-check is to detect an uninitialized *self.
60843
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
60844
#if !defined(__clang__) && defined(__GNUC__)
60845
#pragma GCC diagnostic push
60846
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
60847
#endif
60848
    if (self->private_impl.magic != 0) {
60849
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
60850
    }
60851
#if !defined(__clang__) && defined(__GNUC__)
60852
#pragma GCC diagnostic pop
60853
#endif
60854
  } else {
60855
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
60856
      memset(self, 0, sizeof(*self));
60857
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
60858
    } else {
60859
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
60860
    }
60861
  }
60862
60863
  {
60864
    wuffs_base__status z = wuffs_crc32__ieee_hasher__initialize(
60865
        &self->private_data.f_crc32, sizeof(self->private_data.f_crc32), WUFFS_VERSION, options);
60866
    if (z.repr) {
60867
      return z;
60868
    }
60869
  }
60870
  {
60871
    wuffs_base__status z = wuffs_lzma__decoder__initialize(
60872
        &self->private_data.f_lzma, sizeof(self->private_data.f_lzma), WUFFS_VERSION, options);
60873
    if (z.repr) {
60874
      return z;
60875
    }
60876
  }
60877
  self->private_impl.magic = WUFFS_BASE__MAGIC;
60878
  self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name =
60879
      wuffs_base__io_transformer__vtable_name;
60880
  self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers =
60881
      (const void*)(&wuffs_lzip__decoder__func_ptrs_for__wuffs_base__io_transformer);
60882
  return wuffs_base__make_status(NULL);
60883
}
60884
60885
wuffs_lzip__decoder*
60886
wuffs_lzip__decoder__alloc(void) {
60887
  wuffs_lzip__decoder* x =
60888
      (wuffs_lzip__decoder*)(calloc(1, sizeof(wuffs_lzip__decoder)));
60889
  if (!x) {
60890
    return NULL;
60891
  }
60892
  if (wuffs_lzip__decoder__initialize(
60893
      x, sizeof(wuffs_lzip__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
60894
    free(x);
60895
    return NULL;
60896
  }
60897
  return x;
60898
}
60899
60900
size_t
60901
sizeof__wuffs_lzip__decoder(void) {
60902
  return sizeof(wuffs_lzip__decoder);
60903
}
60904
60905
// ---------------- Function Implementations
60906
60907
// -------- func lzip.decoder.get_quirk
60908
60909
WUFFS_BASE__GENERATED_C_CODE
60910
WUFFS_BASE__MAYBE_STATIC uint64_t
60911
wuffs_lzip__decoder__get_quirk(
60912
    const wuffs_lzip__decoder* self,
60913
    uint32_t a_key) {
60914
  if (!self) {
60915
    return 0;
60916
  }
60917
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
60918
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
60919
    return 0;
60920
  }
60921
60922
  if ((a_key == 1u) && self->private_impl.f_ignore_checksum) {
60923
    return 1u;
60924
  }
60925
  return 0u;
60926
}
60927
60928
// -------- func lzip.decoder.set_quirk
60929
60930
WUFFS_BASE__GENERATED_C_CODE
60931
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
60932
wuffs_lzip__decoder__set_quirk(
60933
    wuffs_lzip__decoder* self,
60934
    uint32_t a_key,
60935
    uint64_t a_value) {
60936
  if (!self) {
60937
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
60938
  }
60939
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
60940
    return wuffs_base__make_status(
60941
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
60942
        ? wuffs_base__error__disabled_by_previous_error
60943
        : wuffs_base__error__initialize_not_called);
60944
  }
60945
60946
  if (a_key == 1u) {
60947
    self->private_impl.f_ignore_checksum = (a_value > 0u);
60948
    return wuffs_base__make_status(NULL);
60949
  }
60950
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
60951
}
60952
60953
// -------- func lzip.decoder.dst_history_retain_length
60954
60955
WUFFS_BASE__GENERATED_C_CODE
60956
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
60957
wuffs_lzip__decoder__dst_history_retain_length(
60958
    const wuffs_lzip__decoder* self) {
60959
  if (!self) {
60960
    return wuffs_base__utility__make_optional_u63(false, 0u);
60961
  }
60962
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
60963
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
60964
    return wuffs_base__utility__make_optional_u63(false, 0u);
60965
  }
60966
60967
  return wuffs_lzma__decoder__dst_history_retain_length(&self->private_data.f_lzma);
60968
}
60969
60970
// -------- func lzip.decoder.workbuf_len
60971
60972
WUFFS_BASE__GENERATED_C_CODE
60973
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
60974
wuffs_lzip__decoder__workbuf_len(
60975
    const wuffs_lzip__decoder* self) {
60976
  if (!self) {
60977
    return wuffs_base__utility__empty_range_ii_u64();
60978
  }
60979
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
60980
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
60981
    return wuffs_base__utility__empty_range_ii_u64();
60982
  }
60983
60984
  return wuffs_lzma__decoder__workbuf_len(&self->private_data.f_lzma);
60985
}
60986
60987
// -------- func lzip.decoder.transform_io
60988
60989
WUFFS_BASE__GENERATED_C_CODE
60990
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
60991
wuffs_lzip__decoder__transform_io(
60992
    wuffs_lzip__decoder* self,
60993
    wuffs_base__io_buffer* a_dst,
60994
    wuffs_base__io_buffer* a_src,
60995
    wuffs_base__slice_u8 a_workbuf) {
60996
  if (!self) {
60997
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
60998
  }
60999
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
61000
    return wuffs_base__make_status(
61001
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
61002
        ? wuffs_base__error__disabled_by_previous_error
61003
        : wuffs_base__error__initialize_not_called);
61004
  }
61005
  if (!a_dst || !a_src) {
61006
    self->private_impl.magic = WUFFS_BASE__DISABLED;
61007
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
61008
  }
61009
  if ((self->private_impl.active_coroutine != 0) &&
61010
      (self->private_impl.active_coroutine != 1)) {
61011
    self->private_impl.magic = WUFFS_BASE__DISABLED;
61012
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
61013
  }
61014
  self->private_impl.active_coroutine = 0;
61015
  wuffs_base__status status = wuffs_base__make_status(NULL);
61016
61017
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
61018
61019
  uint32_t coro_susp_point = self->private_impl.p_transform_io;
61020
  switch (coro_susp_point) {
61021
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
61022
61023
    while (true) {
61024
      {
61025
        wuffs_base__status t_0 = wuffs_lzip__decoder__do_transform_io(self, a_dst, a_src, a_workbuf);
61026
        v_status = t_0;
61027
      }
61028
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
61029
        status = wuffs_base__make_status(wuffs_lzip__error__truncated_input);
61030
        goto exit;
61031
      }
61032
      status = v_status;
61033
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
61034
    }
61035
61036
    ok:
61037
    self->private_impl.p_transform_io = 0;
61038
    goto exit;
61039
  }
61040
61041
  goto suspend;
61042
  suspend:
61043
  self->private_impl.p_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
61044
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
61045
61046
  goto exit;
61047
  exit:
61048
  if (wuffs_base__status__is_error(&status)) {
61049
    self->private_impl.magic = WUFFS_BASE__DISABLED;
61050
  }
61051
  return status;
61052
}
61053
61054
// -------- func lzip.decoder.do_transform_io
61055
61056
WUFFS_BASE__GENERATED_C_CODE
61057
static wuffs_base__status
61058
wuffs_lzip__decoder__do_transform_io(
61059
    wuffs_lzip__decoder* self,
61060
    wuffs_base__io_buffer* a_dst,
61061
    wuffs_base__io_buffer* a_src,
61062
    wuffs_base__slice_u8 a_workbuf) {
61063
  wuffs_base__status status = wuffs_base__make_status(NULL);
61064
61065
  uint8_t v_c8 = 0;
61066
  uint32_t v_c32 = 0;
61067
  uint64_t v_c64 = 0;
61068
  uint64_t v_dmark = 0;
61069
  uint64_t v_smark = 0;
61070
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
61071
  uint32_t v_checksum_want = 0;
61072
  uint32_t v_checksum_have = 0;
61073
  uint64_t v_size_want = 0;
61074
61075
  uint8_t* iop_a_dst = NULL;
61076
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
61077
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
61078
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
61079
  if (a_dst && a_dst->data.ptr) {
61080
    io0_a_dst = a_dst->data.ptr;
61081
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
61082
    iop_a_dst = io1_a_dst;
61083
    io2_a_dst = io0_a_dst + a_dst->data.len;
61084
    if (a_dst->meta.closed) {
61085
      io2_a_dst = iop_a_dst;
61086
    }
61087
  }
61088
  const uint8_t* iop_a_src = NULL;
61089
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
61090
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
61091
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
61092
  if (a_src && a_src->data.ptr) {
61093
    io0_a_src = a_src->data.ptr;
61094
    io1_a_src = io0_a_src + a_src->meta.ri;
61095
    iop_a_src = io1_a_src;
61096
    io2_a_src = io0_a_src + a_src->meta.wi;
61097
  }
61098
61099
  uint32_t coro_susp_point = self->private_impl.p_do_transform_io;
61100
  switch (coro_susp_point) {
61101
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
61102
61103
    while (true) {
61104
      {
61105
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
61106
        uint64_t t_0;
61107
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 5)) {
61108
          t_0 = ((uint64_t)(wuffs_base__peek_u40le__no_bounds_check(iop_a_src)));
61109
          iop_a_src += 5;
61110
        } else {
61111
          self->private_data.s_do_transform_io.scratch = 0;
61112
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
61113
          while (true) {
61114
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
61115
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
61116
              goto suspend;
61117
            }
61118
            uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
61119
            uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
61120
            *scratch <<= 8;
61121
            *scratch >>= 8;
61122
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
61123
            if (num_bits_0 == 32) {
61124
              t_0 = ((uint64_t)(*scratch));
61125
              break;
61126
            }
61127
            num_bits_0 += 8u;
61128
            *scratch |= ((uint64_t)(num_bits_0)) << 56;
61129
          }
61130
        }
61131
        v_c64 = t_0;
61132
      }
61133
      if (v_c64 != 5641951820u) {
61134
        status = wuffs_base__make_status(wuffs_lzip__error__bad_header);
61135
        goto exit;
61136
      }
61137
      {
61138
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
61139
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
61140
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
61141
          goto suspend;
61142
        }
61143
        uint8_t t_1 = *iop_a_src++;
61144
        v_c8 = t_1;
61145
      }
61146
      v_status = wuffs_lzma__decoder__set_quirk(&self->private_data.f_lzma, 1290294273u, (1u | (((uint64_t)(v_c8)) << 8u)));
61147
      if ( ! wuffs_base__status__is_ok(&v_status)) {
61148
        if (v_status.repr == wuffs_base__error__bad_argument) {
61149
          status = wuffs_base__make_status(wuffs_lzip__error__bad_header);
61150
          goto exit;
61151
        }
61152
        status = v_status;
61153
        if (wuffs_base__status__is_error(&status)) {
61154
          goto exit;
61155
        } else if (wuffs_base__status__is_suspension(&status)) {
61156
          status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
61157
          goto exit;
61158
        }
61159
        goto ok;
61160
      }
61161
      self->private_impl.f_ssize_have = 0u;
61162
      self->private_impl.f_dsize_have = 0u;
61163
      wuffs_lzma__decoder__set_quirk(&self->private_data.f_lzma, 1290294272u, 1u);
61164
      while (true) {
61165
        v_dmark = ((uint64_t)(iop_a_dst - io0_a_dst));
61166
        v_smark = ((uint64_t)(iop_a_src - io0_a_src));
61167
        {
61168
          if (a_dst) {
61169
            a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
61170
          }
61171
          if (a_src) {
61172
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
61173
          }
61174
          wuffs_base__status t_2 = wuffs_lzma__decoder__transform_io(&self->private_data.f_lzma, a_dst, a_src, a_workbuf);
61175
          v_status = t_2;
61176
          if (a_dst) {
61177
            iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
61178
          }
61179
          if (a_src) {
61180
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
61181
          }
61182
        }
61183
        self->private_impl.f_ssize_have += wuffs_private_impl__io__count_since(v_smark, ((uint64_t)(iop_a_src - io0_a_src)));
61184
        self->private_impl.f_dsize_have += wuffs_private_impl__io__count_since(v_dmark, ((uint64_t)(iop_a_dst - io0_a_dst)));
61185
        if ( ! self->private_impl.f_ignore_checksum) {
61186
          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));
61187
        }
61188
        if (wuffs_base__status__is_ok(&v_status)) {
61189
          break;
61190
        }
61191
        status = v_status;
61192
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4);
61193
      }
61194
      {
61195
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
61196
        uint32_t t_3;
61197
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
61198
          t_3 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
61199
          iop_a_src += 4;
61200
        } else {
61201
          self->private_data.s_do_transform_io.scratch = 0;
61202
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
61203
          while (true) {
61204
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
61205
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
61206
              goto suspend;
61207
            }
61208
            uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
61209
            uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56));
61210
            *scratch <<= 8;
61211
            *scratch >>= 8;
61212
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3;
61213
            if (num_bits_3 == 24) {
61214
              t_3 = ((uint32_t)(*scratch));
61215
              break;
61216
            }
61217
            num_bits_3 += 8u;
61218
            *scratch |= ((uint64_t)(num_bits_3)) << 56;
61219
          }
61220
        }
61221
        v_checksum_want = t_3;
61222
      }
61223
      if ( ! self->private_impl.f_ignore_checksum) {
61224
        v_checksum_have = wuffs_crc32__ieee_hasher__checksum_u32(&self->private_data.f_crc32);
61225
        if (v_checksum_have != v_checksum_want) {
61226
          status = wuffs_base__make_status(wuffs_lzip__error__bad_checksum);
61227
          goto exit;
61228
        }
61229
      }
61230
      {
61231
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
61232
        uint64_t t_4;
61233
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) {
61234
          t_4 = wuffs_base__peek_u64le__no_bounds_check(iop_a_src);
61235
          iop_a_src += 8;
61236
        } else {
61237
          self->private_data.s_do_transform_io.scratch = 0;
61238
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
61239
          while (true) {
61240
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
61241
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
61242
              goto suspend;
61243
            }
61244
            uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
61245
            uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56));
61246
            *scratch <<= 8;
61247
            *scratch >>= 8;
61248
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4;
61249
            if (num_bits_4 == 56) {
61250
              t_4 = ((uint64_t)(*scratch));
61251
              break;
61252
            }
61253
            num_bits_4 += 8u;
61254
            *scratch |= ((uint64_t)(num_bits_4)) << 56;
61255
          }
61256
        }
61257
        v_size_want = t_4;
61258
      }
61259
      if (self->private_impl.f_dsize_have != v_size_want) {
61260
        status = wuffs_base__make_status(wuffs_lzip__error__bad_footer);
61261
        goto exit;
61262
      }
61263
      {
61264
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
61265
        uint64_t t_5;
61266
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) {
61267
          t_5 = wuffs_base__peek_u64le__no_bounds_check(iop_a_src);
61268
          iop_a_src += 8;
61269
        } else {
61270
          self->private_data.s_do_transform_io.scratch = 0;
61271
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
61272
          while (true) {
61273
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
61274
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
61275
              goto suspend;
61276
            }
61277
            uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
61278
            uint32_t num_bits_5 = ((uint32_t)(*scratch >> 56));
61279
            *scratch <<= 8;
61280
            *scratch >>= 8;
61281
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_5;
61282
            if (num_bits_5 == 56) {
61283
              t_5 = ((uint64_t)(*scratch));
61284
              break;
61285
            }
61286
            num_bits_5 += 8u;
61287
            *scratch |= ((uint64_t)(num_bits_5)) << 56;
61288
          }
61289
        }
61290
        v_size_want = t_5;
61291
      }
61292
      if ((v_size_want < 26u) || (2251799813685248u < v_size_want)) {
61293
        status = wuffs_base__make_status(wuffs_lzip__error__bad_footer);
61294
        goto exit;
61295
      } else if (self->private_impl.f_ssize_have != (v_size_want - 26u)) {
61296
        status = wuffs_base__make_status(wuffs_lzip__error__bad_footer);
61297
        goto exit;
61298
      }
61299
      while (((uint64_t)(io2_a_src - iop_a_src)) < 4u) {
61300
        if (a_src && a_src->meta.closed) {
61301
          goto label__outer__break;
61302
        }
61303
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
61304
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(11);
61305
      }
61306
      v_c32 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
61307
      if (v_c32 != 1346984524u) {
61308
        break;
61309
      }
61310
      wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32,
61311
          sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
61312
      wuffs_private_impl__ignore_status(wuffs_lzma__decoder__initialize(&self->private_data.f_lzma,
61313
          sizeof (wuffs_lzma__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
61314
    }
61315
    label__outer__break:;
61316
61317
    ok:
61318
    self->private_impl.p_do_transform_io = 0;
61319
    goto exit;
61320
  }
61321
61322
  goto suspend;
61323
  suspend:
61324
  self->private_impl.p_do_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
61325
61326
  goto exit;
61327
  exit:
61328
  if (a_dst && a_dst->data.ptr) {
61329
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
61330
  }
61331
  if (a_src && a_src->data.ptr) {
61332
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
61333
  }
61334
61335
  return status;
61336
}
61337
61338
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZIP)
61339
61340
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZW)
61341
61342
// ---------------- Status Codes Implementations
61343
61344
const char wuffs_lzw__error__bad_code[] = "#lzw: bad code";
61345
const char wuffs_lzw__error__truncated_input[] = "#lzw: truncated input";
61346
const char wuffs_lzw__error__internal_error_inconsistent_i_o[] = "#lzw: internal error: inconsistent I/O";
61347
61348
// ---------------- Private Consts
61349
61350
#define WUFFS_LZW__QUIRKS_BASE 1290672128u
61351
61352
// ---------------- Private Initializer Prototypes
61353
61354
// ---------------- Private Function Prototypes
61355
61356
WUFFS_BASE__GENERATED_C_CODE
61357
static wuffs_base__empty_struct
61358
wuffs_lzw__decoder__read_from(
61359
    wuffs_lzw__decoder* self,
61360
    wuffs_base__io_buffer* a_src);
61361
61362
WUFFS_BASE__GENERATED_C_CODE
61363
static wuffs_base__status
61364
wuffs_lzw__decoder__write_to(
61365
    wuffs_lzw__decoder* self,
61366
    wuffs_base__io_buffer* a_dst);
61367
61368
// ---------------- VTables
61369
61370
const wuffs_base__io_transformer__func_ptrs
61371
wuffs_lzw__decoder__func_ptrs_for__wuffs_base__io_transformer = {
61372
  (wuffs_base__optional_u63(*)(const void*))(&wuffs_lzw__decoder__dst_history_retain_length),
61373
  (uint64_t(*)(const void*,
61374
      uint32_t))(&wuffs_lzw__decoder__get_quirk),
61375
  (wuffs_base__status(*)(void*,
61376
      uint32_t,
61377
      uint64_t))(&wuffs_lzw__decoder__set_quirk),
61378
  (wuffs_base__status(*)(void*,
61379
      wuffs_base__io_buffer*,
61380
      wuffs_base__io_buffer*,
61381
      wuffs_base__slice_u8))(&wuffs_lzw__decoder__transform_io),
61382
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_lzw__decoder__workbuf_len),
61383
};
61384
61385
// ---------------- Initializer Implementations
61386
61387
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
61388
wuffs_lzw__decoder__initialize(
61389
    wuffs_lzw__decoder* self,
61390
    size_t sizeof_star_self,
61391
    uint64_t wuffs_version,
61392
    uint32_t options){
61393
  if (!self) {
61394
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
61395
  }
61396
  if (sizeof(*self) != sizeof_star_self) {
61397
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
61398
  }
61399
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
61400
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
61401
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
61402
  }
61403
61404
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
61405
    // The whole point of this if-check is to detect an uninitialized *self.
61406
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
61407
#if !defined(__clang__) && defined(__GNUC__)
61408
#pragma GCC diagnostic push
61409
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
61410
#endif
61411
    if (self->private_impl.magic != 0) {
61412
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
61413
    }
61414
#if !defined(__clang__) && defined(__GNUC__)
61415
#pragma GCC diagnostic pop
61416
#endif
61417
  } else {
61418
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
61419
      memset(self, 0, sizeof(*self));
61420
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
61421
    } else {
61422
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
61423
    }
61424
  }
61425
61426
  self->private_impl.magic = WUFFS_BASE__MAGIC;
61427
  self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name =
61428
      wuffs_base__io_transformer__vtable_name;
61429
  self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers =
61430
      (const void*)(&wuffs_lzw__decoder__func_ptrs_for__wuffs_base__io_transformer);
61431
  return wuffs_base__make_status(NULL);
61432
}
61433
61434
wuffs_lzw__decoder*
61435
wuffs_lzw__decoder__alloc(void) {
61436
  wuffs_lzw__decoder* x =
61437
      (wuffs_lzw__decoder*)(calloc(1, sizeof(wuffs_lzw__decoder)));
61438
  if (!x) {
61439
    return NULL;
61440
  }
61441
  if (wuffs_lzw__decoder__initialize(
61442
      x, sizeof(wuffs_lzw__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
61443
    free(x);
61444
    return NULL;
61445
  }
61446
  return x;
61447
}
61448
61449
size_t
61450
sizeof__wuffs_lzw__decoder(void) {
61451
  return sizeof(wuffs_lzw__decoder);
61452
}
61453
61454
// ---------------- Function Implementations
61455
61456
// -------- func lzw.decoder.get_quirk
61457
61458
WUFFS_BASE__GENERATED_C_CODE
61459
WUFFS_BASE__MAYBE_STATIC uint64_t
61460
wuffs_lzw__decoder__get_quirk(
61461
    const wuffs_lzw__decoder* self,
61462
    uint32_t a_key) {
61463
  if (!self) {
61464
    return 0;
61465
  }
61466
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
61467
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
61468
    return 0;
61469
  }
61470
61471
  if (a_key == 1290672128u) {
61472
    return ((uint64_t)(self->private_impl.f_pending_literal_width_plus_one));
61473
  }
61474
  return 0u;
61475
}
61476
61477
// -------- func lzw.decoder.set_quirk
61478
61479
WUFFS_BASE__GENERATED_C_CODE
61480
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
61481
wuffs_lzw__decoder__set_quirk(
61482
    wuffs_lzw__decoder* self,
61483
    uint32_t a_key,
61484
    uint64_t a_value) {
61485
  if (!self) {
61486
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
61487
  }
61488
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
61489
    return wuffs_base__make_status(
61490
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
61491
        ? wuffs_base__error__disabled_by_previous_error
61492
        : wuffs_base__error__initialize_not_called);
61493
  }
61494
61495
  if (a_key == 1290672128u) {
61496
    if (a_value > 9u) {
61497
      return wuffs_base__make_status(wuffs_base__error__bad_argument);
61498
    }
61499
    self->private_impl.f_pending_literal_width_plus_one = ((uint32_t)(a_value));
61500
    return wuffs_base__make_status(NULL);
61501
  }
61502
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
61503
}
61504
61505
// -------- func lzw.decoder.dst_history_retain_length
61506
61507
WUFFS_BASE__GENERATED_C_CODE
61508
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
61509
wuffs_lzw__decoder__dst_history_retain_length(
61510
    const wuffs_lzw__decoder* self) {
61511
  if (!self) {
61512
    return wuffs_base__utility__make_optional_u63(false, 0u);
61513
  }
61514
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
61515
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
61516
    return wuffs_base__utility__make_optional_u63(false, 0u);
61517
  }
61518
61519
  return wuffs_base__utility__make_optional_u63(true, 0u);
61520
}
61521
61522
// -------- func lzw.decoder.workbuf_len
61523
61524
WUFFS_BASE__GENERATED_C_CODE
61525
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
61526
wuffs_lzw__decoder__workbuf_len(
61527
    const wuffs_lzw__decoder* self) {
61528
  if (!self) {
61529
    return wuffs_base__utility__empty_range_ii_u64();
61530
  }
61531
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
61532
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
61533
    return wuffs_base__utility__empty_range_ii_u64();
61534
  }
61535
61536
  return wuffs_base__utility__make_range_ii_u64(0u, 0u);
61537
}
61538
61539
// -------- func lzw.decoder.transform_io
61540
61541
WUFFS_BASE__GENERATED_C_CODE
61542
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
61543
wuffs_lzw__decoder__transform_io(
61544
    wuffs_lzw__decoder* self,
61545
    wuffs_base__io_buffer* a_dst,
61546
    wuffs_base__io_buffer* a_src,
61547
    wuffs_base__slice_u8 a_workbuf) {
61548
  if (!self) {
61549
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
61550
  }
61551
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
61552
    return wuffs_base__make_status(
61553
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
61554
        ? wuffs_base__error__disabled_by_previous_error
61555
        : wuffs_base__error__initialize_not_called);
61556
  }
61557
  if (!a_dst || !a_src) {
61558
    self->private_impl.magic = WUFFS_BASE__DISABLED;
61559
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
61560
  }
61561
  if ((self->private_impl.active_coroutine != 0) &&
61562
      (self->private_impl.active_coroutine != 1)) {
61563
    self->private_impl.magic = WUFFS_BASE__DISABLED;
61564
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
61565
  }
61566
  self->private_impl.active_coroutine = 0;
61567
  wuffs_base__status status = wuffs_base__make_status(NULL);
61568
61569
  uint32_t v_i = 0;
61570
61571
  uint32_t coro_susp_point = self->private_impl.p_transform_io;
61572
  switch (coro_susp_point) {
61573
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
61574
61575
    self->private_impl.f_literal_width = 8u;
61576
    if (self->private_impl.f_pending_literal_width_plus_one > 0u) {
61577
      self->private_impl.f_literal_width = (self->private_impl.f_pending_literal_width_plus_one - 1u);
61578
    }
61579
    self->private_impl.f_clear_code = (((uint32_t)(1u)) << self->private_impl.f_literal_width);
61580
    self->private_impl.f_end_code = (self->private_impl.f_clear_code + 1u);
61581
    self->private_impl.f_save_code = self->private_impl.f_end_code;
61582
    self->private_impl.f_prev_code = self->private_impl.f_end_code;
61583
    self->private_impl.f_width = (self->private_impl.f_literal_width + 1u);
61584
    self->private_impl.f_bits = 0u;
61585
    self->private_impl.f_n_bits = 0u;
61586
    self->private_impl.f_output_ri = 0u;
61587
    self->private_impl.f_output_wi = 0u;
61588
    v_i = 0u;
61589
    while (v_i < self->private_impl.f_clear_code) {
61590
      self->private_data.f_lm1s[v_i] = 0u;
61591
      self->private_data.f_suffixes[v_i][0u] = ((uint8_t)(v_i));
61592
      v_i += 1u;
61593
    }
61594
    while (true) {
61595
      wuffs_lzw__decoder__read_from(self, a_src);
61596
      if (self->private_impl.f_output_wi > 0u) {
61597
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
61598
        status = wuffs_lzw__decoder__write_to(self, a_dst);
61599
        if (status.repr) {
61600
          goto suspend;
61601
        }
61602
      }
61603
      if (self->private_impl.f_read_from_return_value == 0u) {
61604
        break;
61605
      } else if (self->private_impl.f_read_from_return_value == 1u) {
61606
        continue;
61607
      } else if (self->private_impl.f_read_from_return_value == 2u) {
61608
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
61609
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2);
61610
      } else if (self->private_impl.f_read_from_return_value == 3u) {
61611
        status = wuffs_base__make_status(wuffs_lzw__error__truncated_input);
61612
        goto exit;
61613
      } else if (self->private_impl.f_read_from_return_value == 4u) {
61614
        status = wuffs_base__make_status(wuffs_lzw__error__bad_code);
61615
        goto exit;
61616
      } else {
61617
        status = wuffs_base__make_status(wuffs_lzw__error__internal_error_inconsistent_i_o);
61618
        goto exit;
61619
      }
61620
    }
61621
61622
    ok:
61623
    self->private_impl.p_transform_io = 0;
61624
    goto exit;
61625
  }
61626
61627
  goto suspend;
61628
  suspend:
61629
  self->private_impl.p_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
61630
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
61631
61632
  goto exit;
61633
  exit:
61634
  if (wuffs_base__status__is_error(&status)) {
61635
    self->private_impl.magic = WUFFS_BASE__DISABLED;
61636
  }
61637
  return status;
61638
}
61639
61640
// -------- func lzw.decoder.read_from
61641
61642
WUFFS_BASE__GENERATED_C_CODE
61643
static wuffs_base__empty_struct
61644
wuffs_lzw__decoder__read_from(
61645
    wuffs_lzw__decoder* self,
61646
    wuffs_base__io_buffer* a_src) {
61647
  uint32_t v_clear_code = 0;
61648
  uint32_t v_end_code = 0;
61649
  uint32_t v_save_code = 0;
61650
  uint32_t v_prev_code = 0;
61651
  uint32_t v_width = 0;
61652
  uint32_t v_bits = 0;
61653
  uint32_t v_n_bits = 0;
61654
  uint32_t v_output_wi = 0;
61655
  uint32_t v_code = 0;
61656
  uint32_t v_c = 0;
61657
  uint32_t v_o = 0;
61658
  uint32_t v_steps = 0;
61659
  uint8_t v_first_byte = 0;
61660
  uint16_t v_lm1_b = 0;
61661
  uint16_t v_lm1_a = 0;
61662
61663
  const uint8_t* iop_a_src = NULL;
61664
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
61665
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
61666
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
61667
  if (a_src && a_src->data.ptr) {
61668
    io0_a_src = a_src->data.ptr;
61669
    io1_a_src = io0_a_src + a_src->meta.ri;
61670
    iop_a_src = io1_a_src;
61671
    io2_a_src = io0_a_src + a_src->meta.wi;
61672
  }
61673
61674
  v_clear_code = self->private_impl.f_clear_code;
61675
  v_end_code = self->private_impl.f_end_code;
61676
  v_save_code = self->private_impl.f_save_code;
61677
  v_prev_code = self->private_impl.f_prev_code;
61678
  v_width = self->private_impl.f_width;
61679
  v_bits = self->private_impl.f_bits;
61680
  v_n_bits = self->private_impl.f_n_bits;
61681
  v_output_wi = self->private_impl.f_output_wi;
61682
  while (true) {
61683
    if (v_n_bits < v_width) {
61684
      if (((uint64_t)(io2_a_src - iop_a_src)) >= 4u) {
61685
        v_bits |= ((uint32_t)(wuffs_base__peek_u32le__no_bounds_check(iop_a_src) << v_n_bits));
61686
        iop_a_src += ((31u - v_n_bits) >> 3u);
61687
        v_n_bits |= 24u;
61688
      } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
61689
        if (a_src && a_src->meta.closed) {
61690
          self->private_impl.f_read_from_return_value = 3u;
61691
        } else {
61692
          self->private_impl.f_read_from_return_value = 2u;
61693
        }
61694
        break;
61695
      } else {
61696
        v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
61697
        iop_a_src += 1u;
61698
        v_n_bits += 8u;
61699
        if (v_n_bits >= v_width) {
61700
        } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
61701
          if (a_src && a_src->meta.closed) {
61702
            self->private_impl.f_read_from_return_value = 3u;
61703
          } else {
61704
            self->private_impl.f_read_from_return_value = 2u;
61705
          }
61706
          break;
61707
        } else {
61708
          v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
61709
          iop_a_src += 1u;
61710
          v_n_bits += 8u;
61711
          if (v_n_bits < v_width) {
61712
            self->private_impl.f_read_from_return_value = 5u;
61713
            break;
61714
          }
61715
        }
61716
      }
61717
    }
61718
    v_code = ((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(v_width));
61719
    v_bits >>= v_width;
61720
    v_n_bits -= v_width;
61721
    if (v_code < v_clear_code) {
61722
      self->private_data.f_output[v_output_wi] = ((uint8_t)(v_code));
61723
      v_output_wi = ((v_output_wi + 1u) & 8191u);
61724
      if (v_save_code <= 4095u) {
61725
        v_lm1_a = ((uint16_t)(((uint16_t)(self->private_data.f_lm1s[v_prev_code] + 1u)) & 4095u));
61726
        self->private_data.f_lm1s[v_save_code] = v_lm1_a;
61727
        if (((uint16_t)(v_lm1_a % 8u)) != 0u) {
61728
          self->private_impl.f_prefixes[v_save_code] = self->private_impl.f_prefixes[v_prev_code];
61729
          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]));
61730
          self->private_data.f_suffixes[v_save_code][((uint16_t)(v_lm1_a % 8u))] = ((uint8_t)(v_code));
61731
        } else {
61732
          self->private_impl.f_prefixes[v_save_code] = ((uint16_t)(v_prev_code));
61733
          self->private_data.f_suffixes[v_save_code][0u] = ((uint8_t)(v_code));
61734
        }
61735
        v_save_code += 1u;
61736
        if (v_width < 12u) {
61737
          v_width += (1u & (v_save_code >> v_width));
61738
        }
61739
        v_prev_code = v_code;
61740
      }
61741
    } else if (v_code <= v_end_code) {
61742
      if (v_code == v_end_code) {
61743
        self->private_impl.f_read_from_return_value = 0u;
61744
        break;
61745
      }
61746
      v_save_code = v_end_code;
61747
      v_prev_code = v_end_code;
61748
      v_width = (self->private_impl.f_literal_width + 1u);
61749
    } else if (v_code <= v_save_code) {
61750
      v_c = v_code;
61751
      if (v_code == v_save_code) {
61752
        v_c = v_prev_code;
61753
      }
61754
      v_o = ((v_output_wi + (((uint32_t)(self->private_data.f_lm1s[v_c])) & 4294967288u)) & 8191u);
61755
      v_output_wi = ((v_output_wi + 1u + ((uint32_t)(self->private_data.f_lm1s[v_c]))) & 8191u);
61756
      v_steps = (((uint32_t)(self->private_data.f_lm1s[v_c])) >> 3u);
61757
      while (true) {
61758
        memcpy((self->private_data.f_output)+(v_o), (self->private_data.f_suffixes[v_c]), 8u);
61759
        if (v_steps <= 0u) {
61760
          break;
61761
        }
61762
        v_steps -= 1u;
61763
        v_o = (((uint32_t)(v_o - 8u)) & 8191u);
61764
        v_c = ((uint32_t)(self->private_impl.f_prefixes[v_c]));
61765
      }
61766
      v_first_byte = self->private_data.f_suffixes[v_c][0u];
61767
      if (v_code == v_save_code) {
61768
        self->private_data.f_output[v_output_wi] = v_first_byte;
61769
        v_output_wi = ((v_output_wi + 1u) & 8191u);
61770
      }
61771
      if (v_save_code <= 4095u) {
61772
        v_lm1_b = ((uint16_t)(((uint16_t)(self->private_data.f_lm1s[v_prev_code] + 1u)) & 4095u));
61773
        self->private_data.f_lm1s[v_save_code] = v_lm1_b;
61774
        if (((uint16_t)(v_lm1_b % 8u)) != 0u) {
61775
          self->private_impl.f_prefixes[v_save_code] = self->private_impl.f_prefixes[v_prev_code];
61776
          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]));
61777
          self->private_data.f_suffixes[v_save_code][((uint16_t)(v_lm1_b % 8u))] = v_first_byte;
61778
        } else {
61779
          self->private_impl.f_prefixes[v_save_code] = ((uint16_t)(v_prev_code));
61780
          self->private_data.f_suffixes[v_save_code][0u] = ((uint8_t)(v_first_byte));
61781
        }
61782
        v_save_code += 1u;
61783
        if (v_width < 12u) {
61784
          v_width += (1u & (v_save_code >> v_width));
61785
        }
61786
        v_prev_code = v_code;
61787
      }
61788
    } else {
61789
      self->private_impl.f_read_from_return_value = 4u;
61790
      break;
61791
    }
61792
    if (v_output_wi > 4095u) {
61793
      self->private_impl.f_read_from_return_value = 1u;
61794
      break;
61795
    }
61796
  }
61797
  if (self->private_impl.f_read_from_return_value != 2u) {
61798
    while (v_n_bits >= 8u) {
61799
      v_n_bits -= 8u;
61800
      if (iop_a_src > io1_a_src) {
61801
        iop_a_src--;
61802
      } else {
61803
        self->private_impl.f_read_from_return_value = 5u;
61804
        break;
61805
      }
61806
    }
61807
  }
61808
  self->private_impl.f_save_code = v_save_code;
61809
  self->private_impl.f_prev_code = v_prev_code;
61810
  self->private_impl.f_width = v_width;
61811
  self->private_impl.f_bits = v_bits;
61812
  self->private_impl.f_n_bits = v_n_bits;
61813
  self->private_impl.f_output_wi = v_output_wi;
61814
  if (a_src && a_src->data.ptr) {
61815
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
61816
  }
61817
61818
  return wuffs_base__make_empty_struct();
61819
}
61820
61821
// -------- func lzw.decoder.write_to
61822
61823
WUFFS_BASE__GENERATED_C_CODE
61824
static wuffs_base__status
61825
wuffs_lzw__decoder__write_to(
61826
    wuffs_lzw__decoder* self,
61827
    wuffs_base__io_buffer* a_dst) {
61828
  wuffs_base__status status = wuffs_base__make_status(NULL);
61829
61830
  wuffs_base__slice_u8 v_s = {0};
61831
  uint64_t v_n = 0;
61832
61833
  uint8_t* iop_a_dst = NULL;
61834
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
61835
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
61836
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
61837
  if (a_dst && a_dst->data.ptr) {
61838
    io0_a_dst = a_dst->data.ptr;
61839
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
61840
    iop_a_dst = io1_a_dst;
61841
    io2_a_dst = io0_a_dst + a_dst->data.len;
61842
    if (a_dst->meta.closed) {
61843
      io2_a_dst = iop_a_dst;
61844
    }
61845
  }
61846
61847
  uint32_t coro_susp_point = self->private_impl.p_write_to;
61848
  switch (coro_susp_point) {
61849
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
61850
61851
    while (self->private_impl.f_output_wi > 0u) {
61852
      if (self->private_impl.f_output_ri > self->private_impl.f_output_wi) {
61853
        status = wuffs_base__make_status(wuffs_lzw__error__internal_error_inconsistent_i_o);
61854
        goto exit;
61855
      }
61856
      v_s = wuffs_base__make_slice_u8_ij(self->private_data.f_output,
61857
          self->private_impl.f_output_ri,
61858
          self->private_impl.f_output_wi);
61859
      v_n = wuffs_private_impl__io_writer__copy_from_slice(&iop_a_dst, io2_a_dst,v_s);
61860
      if (v_n == ((uint64_t)(v_s.len))) {
61861
        self->private_impl.f_output_ri = 0u;
61862
        self->private_impl.f_output_wi = 0u;
61863
        status = wuffs_base__make_status(NULL);
61864
        goto ok;
61865
      }
61866
      self->private_impl.f_output_ri = (((uint32_t)(self->private_impl.f_output_ri + ((uint32_t)(v_n)))) & 8191u);
61867
      status = wuffs_base__make_status(wuffs_base__suspension__short_write);
61868
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
61869
    }
61870
61871
    ok:
61872
    self->private_impl.p_write_to = 0;
61873
    goto exit;
61874
  }
61875
61876
  goto suspend;
61877
  suspend:
61878
  self->private_impl.p_write_to = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
61879
61880
  goto exit;
61881
  exit:
61882
  if (a_dst && a_dst->data.ptr) {
61883
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
61884
  }
61885
61886
  return status;
61887
}
61888
61889
// -------- func lzw.decoder.flush
61890
61891
WUFFS_BASE__GENERATED_C_CODE
61892
WUFFS_BASE__MAYBE_STATIC wuffs_base__slice_u8
61893
wuffs_lzw__decoder__flush(
61894
    wuffs_lzw__decoder* self) {
61895
  if (!self) {
61896
    return wuffs_base__empty_slice_u8();
61897
  }
61898
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
61899
    return wuffs_base__empty_slice_u8();
61900
  }
61901
61902
  uint32_t v_ri = 0;
61903
  uint32_t v_wi = 0;
61904
61905
  v_ri = self->private_impl.f_output_ri;
61906
  v_wi = self->private_impl.f_output_wi;
61907
  self->private_impl.f_output_ri = 0u;
61908
  self->private_impl.f_output_wi = 0u;
61909
  if (v_ri <= v_wi) {
61910
    return wuffs_base__make_slice_u8_ij(self->private_data.f_output, v_ri, v_wi);
61911
  }
61912
  return wuffs_base__make_slice_u8(self->private_data.f_output, 0);
61913
}
61914
61915
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZW)
61916
61917
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NETPBM)
61918
61919
// ---------------- Status Codes Implementations
61920
61921
const char wuffs_netpbm__error__bad_header[] = "#netpbm: bad header";
61922
const char wuffs_netpbm__error__truncated_input[] = "#netpbm: truncated input";
61923
const char wuffs_netpbm__error__unsupported_netpbm_file[] = "#netpbm: unsupported Netpbm file";
61924
const char wuffs_netpbm__note__internal_note_short_read[] = "@netpbm: internal note: short read";
61925
61926
// ---------------- Private Consts
61927
61928
// ---------------- Private Initializer Prototypes
61929
61930
// ---------------- Private Function Prototypes
61931
61932
WUFFS_BASE__GENERATED_C_CODE
61933
static wuffs_base__status
61934
wuffs_netpbm__decoder__do_decode_image_config(
61935
    wuffs_netpbm__decoder* self,
61936
    wuffs_base__image_config* a_dst,
61937
    wuffs_base__io_buffer* a_src);
61938
61939
WUFFS_BASE__GENERATED_C_CODE
61940
static wuffs_base__status
61941
wuffs_netpbm__decoder__do_decode_frame_config(
61942
    wuffs_netpbm__decoder* self,
61943
    wuffs_base__frame_config* a_dst,
61944
    wuffs_base__io_buffer* a_src);
61945
61946
WUFFS_BASE__GENERATED_C_CODE
61947
static wuffs_base__status
61948
wuffs_netpbm__decoder__do_decode_frame(
61949
    wuffs_netpbm__decoder* self,
61950
    wuffs_base__pixel_buffer* a_dst,
61951
    wuffs_base__io_buffer* a_src,
61952
    wuffs_base__pixel_blend a_blend,
61953
    wuffs_base__slice_u8 a_workbuf,
61954
    wuffs_base__decode_frame_options* a_opts);
61955
61956
WUFFS_BASE__GENERATED_C_CODE
61957
static wuffs_base__status
61958
wuffs_netpbm__decoder__swizzle_easy(
61959
    wuffs_netpbm__decoder* self,
61960
    wuffs_base__pixel_buffer* a_dst,
61961
    wuffs_base__io_buffer* a_src);
61962
61963
WUFFS_BASE__GENERATED_C_CODE
61964
static wuffs_base__status
61965
wuffs_netpbm__decoder__swizzle_hard(
61966
    wuffs_netpbm__decoder* self,
61967
    wuffs_base__pixel_buffer* a_dst,
61968
    wuffs_base__io_buffer* a_src);
61969
61970
// ---------------- VTables
61971
61972
const wuffs_base__image_decoder__func_ptrs
61973
wuffs_netpbm__decoder__func_ptrs_for__wuffs_base__image_decoder = {
61974
  (wuffs_base__status(*)(void*,
61975
      wuffs_base__pixel_buffer*,
61976
      wuffs_base__io_buffer*,
61977
      wuffs_base__pixel_blend,
61978
      wuffs_base__slice_u8,
61979
      wuffs_base__decode_frame_options*))(&wuffs_netpbm__decoder__decode_frame),
61980
  (wuffs_base__status(*)(void*,
61981
      wuffs_base__frame_config*,
61982
      wuffs_base__io_buffer*))(&wuffs_netpbm__decoder__decode_frame_config),
61983
  (wuffs_base__status(*)(void*,
61984
      wuffs_base__image_config*,
61985
      wuffs_base__io_buffer*))(&wuffs_netpbm__decoder__decode_image_config),
61986
  (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_netpbm__decoder__frame_dirty_rect),
61987
  (uint64_t(*)(const void*,
61988
      uint32_t))(&wuffs_netpbm__decoder__get_quirk),
61989
  (uint32_t(*)(const void*))(&wuffs_netpbm__decoder__num_animation_loops),
61990
  (uint64_t(*)(const void*))(&wuffs_netpbm__decoder__num_decoded_frame_configs),
61991
  (uint64_t(*)(const void*))(&wuffs_netpbm__decoder__num_decoded_frames),
61992
  (wuffs_base__status(*)(void*,
61993
      uint64_t,
61994
      uint64_t))(&wuffs_netpbm__decoder__restart_frame),
61995
  (wuffs_base__status(*)(void*,
61996
      uint32_t,
61997
      uint64_t))(&wuffs_netpbm__decoder__set_quirk),
61998
  (wuffs_base__empty_struct(*)(void*,
61999
      uint32_t,
62000
      bool))(&wuffs_netpbm__decoder__set_report_metadata),
62001
  (wuffs_base__status(*)(void*,
62002
      wuffs_base__io_buffer*,
62003
      wuffs_base__more_information*,
62004
      wuffs_base__io_buffer*))(&wuffs_netpbm__decoder__tell_me_more),
62005
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_netpbm__decoder__workbuf_len),
62006
};
62007
62008
// ---------------- Initializer Implementations
62009
62010
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
62011
wuffs_netpbm__decoder__initialize(
62012
    wuffs_netpbm__decoder* self,
62013
    size_t sizeof_star_self,
62014
    uint64_t wuffs_version,
62015
    uint32_t options){
62016
  if (!self) {
62017
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
62018
  }
62019
  if (sizeof(*self) != sizeof_star_self) {
62020
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
62021
  }
62022
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
62023
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
62024
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
62025
  }
62026
62027
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
62028
    // The whole point of this if-check is to detect an uninitialized *self.
62029
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
62030
#if !defined(__clang__) && defined(__GNUC__)
62031
#pragma GCC diagnostic push
62032
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
62033
#endif
62034
    if (self->private_impl.magic != 0) {
62035
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
62036
    }
62037
#if !defined(__clang__) && defined(__GNUC__)
62038
#pragma GCC diagnostic pop
62039
#endif
62040
  } else {
62041
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
62042
      memset(self, 0, sizeof(*self));
62043
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
62044
    } else {
62045
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
62046
    }
62047
  }
62048
62049
  self->private_impl.magic = WUFFS_BASE__MAGIC;
62050
  self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name =
62051
      wuffs_base__image_decoder__vtable_name;
62052
  self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers =
62053
      (const void*)(&wuffs_netpbm__decoder__func_ptrs_for__wuffs_base__image_decoder);
62054
  return wuffs_base__make_status(NULL);
62055
}
62056
62057
wuffs_netpbm__decoder*
62058
wuffs_netpbm__decoder__alloc(void) {
62059
  wuffs_netpbm__decoder* x =
62060
      (wuffs_netpbm__decoder*)(calloc(1, sizeof(wuffs_netpbm__decoder)));
62061
  if (!x) {
62062
    return NULL;
62063
  }
62064
  if (wuffs_netpbm__decoder__initialize(
62065
      x, sizeof(wuffs_netpbm__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
62066
    free(x);
62067
    return NULL;
62068
  }
62069
  return x;
62070
}
62071
62072
size_t
62073
sizeof__wuffs_netpbm__decoder(void) {
62074
  return sizeof(wuffs_netpbm__decoder);
62075
}
62076
62077
// ---------------- Function Implementations
62078
62079
// -------- func netpbm.decoder.get_quirk
62080
62081
WUFFS_BASE__GENERATED_C_CODE
62082
WUFFS_BASE__MAYBE_STATIC uint64_t
62083
wuffs_netpbm__decoder__get_quirk(
62084
    const wuffs_netpbm__decoder* self,
62085
    uint32_t a_key) {
62086
  if (!self) {
62087
    return 0;
62088
  }
62089
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
62090
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
62091
    return 0;
62092
  }
62093
62094
  return 0u;
62095
}
62096
62097
// -------- func netpbm.decoder.set_quirk
62098
62099
WUFFS_BASE__GENERATED_C_CODE
62100
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
62101
wuffs_netpbm__decoder__set_quirk(
62102
    wuffs_netpbm__decoder* self,
62103
    uint32_t a_key,
62104
    uint64_t a_value) {
62105
  if (!self) {
62106
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
62107
  }
62108
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
62109
    return wuffs_base__make_status(
62110
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
62111
        ? wuffs_base__error__disabled_by_previous_error
62112
        : wuffs_base__error__initialize_not_called);
62113
  }
62114
62115
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
62116
}
62117
62118
// -------- func netpbm.decoder.decode_image_config
62119
62120
WUFFS_BASE__GENERATED_C_CODE
62121
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
62122
wuffs_netpbm__decoder__decode_image_config(
62123
    wuffs_netpbm__decoder* self,
62124
    wuffs_base__image_config* a_dst,
62125
    wuffs_base__io_buffer* a_src) {
62126
  if (!self) {
62127
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
62128
  }
62129
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
62130
    return wuffs_base__make_status(
62131
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
62132
        ? wuffs_base__error__disabled_by_previous_error
62133
        : wuffs_base__error__initialize_not_called);
62134
  }
62135
  if (!a_src) {
62136
    self->private_impl.magic = WUFFS_BASE__DISABLED;
62137
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
62138
  }
62139
  if ((self->private_impl.active_coroutine != 0) &&
62140
      (self->private_impl.active_coroutine != 1)) {
62141
    self->private_impl.magic = WUFFS_BASE__DISABLED;
62142
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
62143
  }
62144
  self->private_impl.active_coroutine = 0;
62145
  wuffs_base__status status = wuffs_base__make_status(NULL);
62146
62147
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
62148
62149
  uint32_t coro_susp_point = self->private_impl.p_decode_image_config;
62150
  switch (coro_susp_point) {
62151
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
62152
62153
    while (true) {
62154
      {
62155
        wuffs_base__status t_0 = wuffs_netpbm__decoder__do_decode_image_config(self, a_dst, a_src);
62156
        v_status = t_0;
62157
      }
62158
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
62159
        status = wuffs_base__make_status(wuffs_netpbm__error__truncated_input);
62160
        goto exit;
62161
      }
62162
      status = v_status;
62163
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
62164
    }
62165
62166
    ok:
62167
    self->private_impl.p_decode_image_config = 0;
62168
    goto exit;
62169
  }
62170
62171
  goto suspend;
62172
  suspend:
62173
  self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
62174
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
62175
62176
  goto exit;
62177
  exit:
62178
  if (wuffs_base__status__is_error(&status)) {
62179
    self->private_impl.magic = WUFFS_BASE__DISABLED;
62180
  }
62181
  return status;
62182
}
62183
62184
// -------- func netpbm.decoder.do_decode_image_config
62185
62186
WUFFS_BASE__GENERATED_C_CODE
62187
static wuffs_base__status
62188
wuffs_netpbm__decoder__do_decode_image_config(
62189
    wuffs_netpbm__decoder* self,
62190
    wuffs_base__image_config* a_dst,
62191
    wuffs_base__io_buffer* a_src) {
62192
  wuffs_base__status status = wuffs_base__make_status(NULL);
62193
62194
  uint8_t v_c8 = 0;
62195
  uint32_t v_n = 0;
62196
62197
  const uint8_t* iop_a_src = NULL;
62198
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
62199
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
62200
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
62201
  if (a_src && a_src->data.ptr) {
62202
    io0_a_src = a_src->data.ptr;
62203
    io1_a_src = io0_a_src + a_src->meta.ri;
62204
    iop_a_src = io1_a_src;
62205
    io2_a_src = io0_a_src + a_src->meta.wi;
62206
  }
62207
62208
  uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config;
62209
  switch (coro_susp_point) {
62210
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
62211
62212
    if (self->private_impl.f_call_sequence != 0u) {
62213
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
62214
      goto exit;
62215
    }
62216
    {
62217
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
62218
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62219
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62220
        goto suspend;
62221
      }
62222
      uint8_t t_0 = *iop_a_src++;
62223
      v_c8 = t_0;
62224
    }
62225
    if (v_c8 != 80u) {
62226
      status = wuffs_base__make_status(wuffs_netpbm__error__bad_header);
62227
      goto exit;
62228
    }
62229
    {
62230
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
62231
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62232
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62233
        goto suspend;
62234
      }
62235
      uint8_t t_1 = *iop_a_src++;
62236
      v_c8 = t_1;
62237
    }
62238
    if ((v_c8 < 49u) || (55u < v_c8)) {
62239
      status = wuffs_base__make_status(wuffs_netpbm__error__bad_header);
62240
      goto exit;
62241
    } else if (v_c8 == 53u) {
62242
      self->private_impl.f_pixfmt = 536870920u;
62243
    } else if (v_c8 == 54u) {
62244
      self->private_impl.f_pixfmt = 2684356744u;
62245
    } else {
62246
      status = wuffs_base__make_status(wuffs_netpbm__error__unsupported_netpbm_file);
62247
      goto exit;
62248
    }
62249
    {
62250
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
62251
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62252
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62253
        goto suspend;
62254
      }
62255
      uint8_t t_2 = *iop_a_src++;
62256
      v_c8 = t_2;
62257
    }
62258
    if (v_c8 != 10u) {
62259
      status = wuffs_base__make_status(wuffs_netpbm__error__bad_header);
62260
      goto exit;
62261
    }
62262
    while (true) {
62263
      {
62264
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
62265
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62266
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62267
          goto suspend;
62268
        }
62269
        uint8_t t_3 = *iop_a_src++;
62270
        v_c8 = t_3;
62271
      }
62272
      if ((v_c8 == 32u) || (v_c8 == 9u)) {
62273
        continue;
62274
      } else if (v_c8 == 35u) {
62275
        while (true) {
62276
          {
62277
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
62278
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62279
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62280
              goto suspend;
62281
            }
62282
            uint8_t t_4 = *iop_a_src++;
62283
            v_c8 = t_4;
62284
          }
62285
          if (v_c8 == 10u) {
62286
            break;
62287
          }
62288
        }
62289
        continue;
62290
      } else if ((v_c8 < 48u) || (57u < v_c8)) {
62291
        status = wuffs_base__make_status(wuffs_netpbm__error__bad_header);
62292
        goto exit;
62293
      }
62294
      self->private_impl.f_width = ((uint32_t)(((uint8_t)(v_c8 - 48u))));
62295
      break;
62296
    }
62297
    while (true) {
62298
      {
62299
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
62300
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62301
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62302
          goto suspend;
62303
        }
62304
        uint8_t t_5 = *iop_a_src++;
62305
        v_c8 = t_5;
62306
      }
62307
      if ((v_c8 == 32u) || (v_c8 == 9u)) {
62308
        break;
62309
      } else if ((v_c8 < 48u) || (57u < v_c8)) {
62310
        status = wuffs_base__make_status(wuffs_netpbm__error__bad_header);
62311
        goto exit;
62312
      }
62313
      v_n = ((10u * self->private_impl.f_width) + ((uint32_t)(((uint8_t)(v_c8 - 48u)))));
62314
      if (v_n > 16777215u) {
62315
        status = wuffs_base__make_status(wuffs_netpbm__error__unsupported_netpbm_file);
62316
        goto exit;
62317
      }
62318
      self->private_impl.f_width = v_n;
62319
    }
62320
    while (true) {
62321
      {
62322
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
62323
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62324
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62325
          goto suspend;
62326
        }
62327
        uint8_t t_6 = *iop_a_src++;
62328
        v_c8 = t_6;
62329
      }
62330
      if ((v_c8 == 32u) || (v_c8 == 9u)) {
62331
        continue;
62332
      } else if (v_c8 == 35u) {
62333
        while (true) {
62334
          {
62335
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
62336
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62337
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62338
              goto suspend;
62339
            }
62340
            uint8_t t_7 = *iop_a_src++;
62341
            v_c8 = t_7;
62342
          }
62343
          if (v_c8 == 10u) {
62344
            break;
62345
          }
62346
        }
62347
        continue;
62348
      } else if ((v_c8 < 48u) || (57u < v_c8)) {
62349
        status = wuffs_base__make_status(wuffs_netpbm__error__bad_header);
62350
        goto exit;
62351
      }
62352
      self->private_impl.f_height = ((uint32_t)(((uint8_t)(v_c8 - 48u))));
62353
      break;
62354
    }
62355
    while (true) {
62356
      {
62357
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
62358
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62359
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62360
          goto suspend;
62361
        }
62362
        uint8_t t_8 = *iop_a_src++;
62363
        v_c8 = t_8;
62364
      }
62365
      if ((v_c8 == 32u) || (v_c8 == 9u) || (v_c8 == 13u)) {
62366
        continue;
62367
      } else if (v_c8 == 10u) {
62368
        break;
62369
      } else if ((v_c8 < 48u) || (57u < v_c8)) {
62370
        status = wuffs_base__make_status(wuffs_netpbm__error__bad_header);
62371
        goto exit;
62372
      }
62373
      v_n = ((10u * self->private_impl.f_height) + ((uint32_t)(((uint8_t)(v_c8 - 48u)))));
62374
      if (v_n > 16777215u) {
62375
        status = wuffs_base__make_status(wuffs_netpbm__error__unsupported_netpbm_file);
62376
        goto exit;
62377
      }
62378
      self->private_impl.f_height = v_n;
62379
    }
62380
    while (true) {
62381
      {
62382
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
62383
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62384
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62385
          goto suspend;
62386
        }
62387
        uint8_t t_9 = *iop_a_src++;
62388
        v_c8 = t_9;
62389
      }
62390
      if ((v_c8 == 32u) || (v_c8 == 9u)) {
62391
        continue;
62392
      } else if (v_c8 == 35u) {
62393
        while (true) {
62394
          {
62395
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11);
62396
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62397
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62398
              goto suspend;
62399
            }
62400
            uint8_t t_10 = *iop_a_src++;
62401
            v_c8 = t_10;
62402
          }
62403
          if (v_c8 == 10u) {
62404
            break;
62405
          }
62406
        }
62407
        continue;
62408
      } else if ((v_c8 < 48u) || (57u < v_c8)) {
62409
        status = wuffs_base__make_status(wuffs_netpbm__error__bad_header);
62410
        goto exit;
62411
      }
62412
      self->private_impl.f_max_value = ((uint32_t)(((uint8_t)(v_c8 - 48u))));
62413
      break;
62414
    }
62415
    while (true) {
62416
      {
62417
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12);
62418
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62419
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62420
          goto suspend;
62421
        }
62422
        uint8_t t_11 = *iop_a_src++;
62423
        v_c8 = t_11;
62424
      }
62425
      if ((v_c8 == 32u) || (v_c8 == 9u) || (v_c8 == 13u)) {
62426
        continue;
62427
      } else if (v_c8 == 10u) {
62428
        break;
62429
      } else if ((v_c8 < 48u) || (57u < v_c8)) {
62430
        status = wuffs_base__make_status(wuffs_netpbm__error__bad_header);
62431
        goto exit;
62432
      }
62433
      v_n = ((10u * self->private_impl.f_max_value) + ((uint32_t)(((uint8_t)(v_c8 - 48u)))));
62434
      if (v_n > 16777215u) {
62435
        status = wuffs_base__make_status(wuffs_netpbm__error__unsupported_netpbm_file);
62436
        goto exit;
62437
      }
62438
      self->private_impl.f_max_value = v_n;
62439
    }
62440
    if (self->private_impl.f_max_value == 255u) {
62441
    } else if (self->private_impl.f_max_value == 65535u) {
62442
      if (self->private_impl.f_pixfmt == 536870920u) {
62443
        self->private_impl.f_pixfmt = 537919499u;
62444
      } else if (self->private_impl.f_pixfmt == 2684356744u) {
62445
        self->private_impl.f_pixfmt = 2164308923u;
62446
      }
62447
    } else {
62448
      status = wuffs_base__make_status(wuffs_netpbm__error__unsupported_netpbm_file);
62449
      goto exit;
62450
    }
62451
    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)));
62452
    if (a_dst != NULL) {
62453
      wuffs_base__image_config__set(
62454
          a_dst,
62455
          self->private_impl.f_pixfmt,
62456
          0u,
62457
          self->private_impl.f_width,
62458
          self->private_impl.f_height,
62459
          self->private_impl.f_frame_config_io_position,
62460
          false);
62461
    }
62462
    self->private_impl.f_call_sequence = 32u;
62463
62464
    goto ok;
62465
    ok:
62466
    self->private_impl.p_do_decode_image_config = 0;
62467
    goto exit;
62468
  }
62469
62470
  goto suspend;
62471
  suspend:
62472
  self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
62473
62474
  goto exit;
62475
  exit:
62476
  if (a_src && a_src->data.ptr) {
62477
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
62478
  }
62479
62480
  return status;
62481
}
62482
62483
// -------- func netpbm.decoder.decode_frame_config
62484
62485
WUFFS_BASE__GENERATED_C_CODE
62486
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
62487
wuffs_netpbm__decoder__decode_frame_config(
62488
    wuffs_netpbm__decoder* self,
62489
    wuffs_base__frame_config* a_dst,
62490
    wuffs_base__io_buffer* a_src) {
62491
  if (!self) {
62492
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
62493
  }
62494
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
62495
    return wuffs_base__make_status(
62496
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
62497
        ? wuffs_base__error__disabled_by_previous_error
62498
        : wuffs_base__error__initialize_not_called);
62499
  }
62500
  if (!a_src) {
62501
    self->private_impl.magic = WUFFS_BASE__DISABLED;
62502
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
62503
  }
62504
  if ((self->private_impl.active_coroutine != 0) &&
62505
      (self->private_impl.active_coroutine != 2)) {
62506
    self->private_impl.magic = WUFFS_BASE__DISABLED;
62507
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
62508
  }
62509
  self->private_impl.active_coroutine = 0;
62510
  wuffs_base__status status = wuffs_base__make_status(NULL);
62511
62512
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
62513
62514
  uint32_t coro_susp_point = self->private_impl.p_decode_frame_config;
62515
  switch (coro_susp_point) {
62516
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
62517
62518
    while (true) {
62519
      {
62520
        wuffs_base__status t_0 = wuffs_netpbm__decoder__do_decode_frame_config(self, a_dst, a_src);
62521
        v_status = t_0;
62522
      }
62523
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
62524
        status = wuffs_base__make_status(wuffs_netpbm__error__truncated_input);
62525
        goto exit;
62526
      }
62527
      status = v_status;
62528
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
62529
    }
62530
62531
    ok:
62532
    self->private_impl.p_decode_frame_config = 0;
62533
    goto exit;
62534
  }
62535
62536
  goto suspend;
62537
  suspend:
62538
  self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
62539
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0;
62540
62541
  goto exit;
62542
  exit:
62543
  if (wuffs_base__status__is_error(&status)) {
62544
    self->private_impl.magic = WUFFS_BASE__DISABLED;
62545
  }
62546
  return status;
62547
}
62548
62549
// -------- func netpbm.decoder.do_decode_frame_config
62550
62551
WUFFS_BASE__GENERATED_C_CODE
62552
static wuffs_base__status
62553
wuffs_netpbm__decoder__do_decode_frame_config(
62554
    wuffs_netpbm__decoder* self,
62555
    wuffs_base__frame_config* a_dst,
62556
    wuffs_base__io_buffer* a_src) {
62557
  wuffs_base__status status = wuffs_base__make_status(NULL);
62558
62559
  const uint8_t* iop_a_src = NULL;
62560
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
62561
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
62562
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
62563
  if (a_src && a_src->data.ptr) {
62564
    io0_a_src = a_src->data.ptr;
62565
    io1_a_src = io0_a_src + a_src->meta.ri;
62566
    iop_a_src = io1_a_src;
62567
    io2_a_src = io0_a_src + a_src->meta.wi;
62568
  }
62569
62570
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config;
62571
  switch (coro_susp_point) {
62572
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
62573
62574
    if (self->private_impl.f_call_sequence == 32u) {
62575
    } else if (self->private_impl.f_call_sequence < 32u) {
62576
      if (a_src) {
62577
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
62578
      }
62579
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
62580
      status = wuffs_netpbm__decoder__do_decode_image_config(self, NULL, a_src);
62581
      if (a_src) {
62582
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
62583
      }
62584
      if (status.repr) {
62585
        goto suspend;
62586
      }
62587
    } else if (self->private_impl.f_call_sequence == 40u) {
62588
      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)))) {
62589
        status = wuffs_base__make_status(wuffs_base__error__bad_restart);
62590
        goto exit;
62591
      }
62592
    } else if (self->private_impl.f_call_sequence == 64u) {
62593
      self->private_impl.f_call_sequence = 96u;
62594
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
62595
      goto ok;
62596
    } else {
62597
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
62598
      goto ok;
62599
    }
62600
    if (a_dst != NULL) {
62601
      wuffs_base__frame_config__set(
62602
          a_dst,
62603
          wuffs_base__utility__make_rect_ie_u32(
62604
          0u,
62605
          0u,
62606
          self->private_impl.f_width,
62607
          self->private_impl.f_height),
62608
          ((wuffs_base__flicks)(0u)),
62609
          0u,
62610
          self->private_impl.f_frame_config_io_position,
62611
          0u,
62612
          false,
62613
          false,
62614
          4278190080u);
62615
    }
62616
    self->private_impl.f_call_sequence = 64u;
62617
62618
    ok:
62619
    self->private_impl.p_do_decode_frame_config = 0;
62620
    goto exit;
62621
  }
62622
62623
  goto suspend;
62624
  suspend:
62625
  self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
62626
62627
  goto exit;
62628
  exit:
62629
  if (a_src && a_src->data.ptr) {
62630
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
62631
  }
62632
62633
  return status;
62634
}
62635
62636
// -------- func netpbm.decoder.decode_frame
62637
62638
WUFFS_BASE__GENERATED_C_CODE
62639
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
62640
wuffs_netpbm__decoder__decode_frame(
62641
    wuffs_netpbm__decoder* self,
62642
    wuffs_base__pixel_buffer* a_dst,
62643
    wuffs_base__io_buffer* a_src,
62644
    wuffs_base__pixel_blend a_blend,
62645
    wuffs_base__slice_u8 a_workbuf,
62646
    wuffs_base__decode_frame_options* a_opts) {
62647
  if (!self) {
62648
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
62649
  }
62650
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
62651
    return wuffs_base__make_status(
62652
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
62653
        ? wuffs_base__error__disabled_by_previous_error
62654
        : wuffs_base__error__initialize_not_called);
62655
  }
62656
  if (!a_dst || !a_src) {
62657
    self->private_impl.magic = WUFFS_BASE__DISABLED;
62658
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
62659
  }
62660
  if ((self->private_impl.active_coroutine != 0) &&
62661
      (self->private_impl.active_coroutine != 3)) {
62662
    self->private_impl.magic = WUFFS_BASE__DISABLED;
62663
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
62664
  }
62665
  self->private_impl.active_coroutine = 0;
62666
  wuffs_base__status status = wuffs_base__make_status(NULL);
62667
62668
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
62669
62670
  uint32_t coro_susp_point = self->private_impl.p_decode_frame;
62671
  switch (coro_susp_point) {
62672
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
62673
62674
    while (true) {
62675
      {
62676
        wuffs_base__status t_0 = wuffs_netpbm__decoder__do_decode_frame(self,
62677
            a_dst,
62678
            a_src,
62679
            a_blend,
62680
            a_workbuf,
62681
            a_opts);
62682
        v_status = t_0;
62683
      }
62684
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
62685
        status = wuffs_base__make_status(wuffs_netpbm__error__truncated_input);
62686
        goto exit;
62687
      }
62688
      status = v_status;
62689
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
62690
    }
62691
62692
    ok:
62693
    self->private_impl.p_decode_frame = 0;
62694
    goto exit;
62695
  }
62696
62697
  goto suspend;
62698
  suspend:
62699
  self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
62700
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0;
62701
62702
  goto exit;
62703
  exit:
62704
  if (wuffs_base__status__is_error(&status)) {
62705
    self->private_impl.magic = WUFFS_BASE__DISABLED;
62706
  }
62707
  return status;
62708
}
62709
62710
// -------- func netpbm.decoder.do_decode_frame
62711
62712
WUFFS_BASE__GENERATED_C_CODE
62713
static wuffs_base__status
62714
wuffs_netpbm__decoder__do_decode_frame(
62715
    wuffs_netpbm__decoder* self,
62716
    wuffs_base__pixel_buffer* a_dst,
62717
    wuffs_base__io_buffer* a_src,
62718
    wuffs_base__pixel_blend a_blend,
62719
    wuffs_base__slice_u8 a_workbuf,
62720
    wuffs_base__decode_frame_options* a_opts) {
62721
  wuffs_base__status status = wuffs_base__make_status(NULL);
62722
62723
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
62724
62725
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame;
62726
  switch (coro_susp_point) {
62727
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
62728
62729
    if (self->private_impl.f_call_sequence == 64u) {
62730
    } else if (self->private_impl.f_call_sequence < 64u) {
62731
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
62732
      status = wuffs_netpbm__decoder__do_decode_frame_config(self, NULL, a_src);
62733
      if (status.repr) {
62734
        goto suspend;
62735
      }
62736
    } else {
62737
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
62738
      goto ok;
62739
    }
62740
    self->private_impl.f_dst_x = 0u;
62741
    self->private_impl.f_dst_y = 0u;
62742
    self->private_data.f_buffer[6u] = 255u;
62743
    self->private_data.f_buffer[7u] = 255u;
62744
    v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler,
62745
        wuffs_base__pixel_buffer__pixel_format(a_dst),
62746
        wuffs_base__pixel_buffer__palette(a_dst),
62747
        wuffs_base__utility__make_pixel_format(self->private_impl.f_pixfmt),
62748
        wuffs_base__utility__empty_slice_u8(),
62749
        a_blend);
62750
    if ( ! wuffs_base__status__is_ok(&v_status)) {
62751
      status = v_status;
62752
      if (wuffs_base__status__is_error(&status)) {
62753
        goto exit;
62754
      } else if (wuffs_base__status__is_suspension(&status)) {
62755
        status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
62756
        goto exit;
62757
      }
62758
      goto ok;
62759
    }
62760
    while (true) {
62761
      if (self->private_impl.f_pixfmt != 2164308923u) {
62762
        v_status = wuffs_netpbm__decoder__swizzle_easy(self, a_dst, a_src);
62763
      } else {
62764
        v_status = wuffs_netpbm__decoder__swizzle_hard(self, a_dst, a_src);
62765
      }
62766
      if (wuffs_base__status__is_ok(&v_status)) {
62767
        break;
62768
      } else if (v_status.repr != wuffs_netpbm__note__internal_note_short_read) {
62769
        status = v_status;
62770
        if (wuffs_base__status__is_error(&status)) {
62771
          goto exit;
62772
        } else if (wuffs_base__status__is_suspension(&status)) {
62773
          status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
62774
          goto exit;
62775
        }
62776
        goto ok;
62777
      }
62778
      status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62779
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2);
62780
    }
62781
    self->private_impl.f_call_sequence = 96u;
62782
62783
    ok:
62784
    self->private_impl.p_do_decode_frame = 0;
62785
    goto exit;
62786
  }
62787
62788
  goto suspend;
62789
  suspend:
62790
  self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
62791
62792
  goto exit;
62793
  exit:
62794
  return status;
62795
}
62796
62797
// -------- func netpbm.decoder.swizzle_easy
62798
62799
WUFFS_BASE__GENERATED_C_CODE
62800
static wuffs_base__status
62801
wuffs_netpbm__decoder__swizzle_easy(
62802
    wuffs_netpbm__decoder* self,
62803
    wuffs_base__pixel_buffer* a_dst,
62804
    wuffs_base__io_buffer* a_src) {
62805
  wuffs_base__status status = wuffs_base__make_status(NULL);
62806
62807
  wuffs_base__pixel_format v_dst_pixfmt = {0};
62808
  uint32_t v_dst_bits_per_pixel = 0;
62809
  uint32_t v_dst_bytes_per_pixel = 0;
62810
  uint64_t v_dst_bytes_per_row = 0;
62811
  uint32_t v_src_bytes_per_pixel = 0;
62812
  wuffs_base__table_u8 v_tab = {0};
62813
  wuffs_base__slice_u8 v_dst = {0};
62814
  uint64_t v_i = 0;
62815
  uint64_t v_j = 0;
62816
  uint64_t v_n = 0;
62817
62818
  const uint8_t* iop_a_src = NULL;
62819
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
62820
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
62821
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
62822
  if (a_src && a_src->data.ptr) {
62823
    io0_a_src = a_src->data.ptr;
62824
    io1_a_src = io0_a_src + a_src->meta.ri;
62825
    iop_a_src = io1_a_src;
62826
    io2_a_src = io0_a_src + a_src->meta.wi;
62827
  }
62828
62829
  v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
62830
  v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
62831
  if ((v_dst_bits_per_pixel & 7u) != 0u) {
62832
    status = wuffs_base__make_status(wuffs_base__error__unsupported_option);
62833
    goto exit;
62834
  }
62835
  v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u);
62836
  v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel)));
62837
  v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
62838
  while (true) {
62839
    if (self->private_impl.f_dst_x == self->private_impl.f_width) {
62840
      self->private_impl.f_dst_x = 0u;
62841
      self->private_impl.f_dst_y += 1u;
62842
      if (self->private_impl.f_dst_y >= self->private_impl.f_height) {
62843
        break;
62844
      }
62845
    }
62846
    v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y);
62847
    if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) {
62848
      v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row);
62849
    }
62850
    v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel)));
62851
    if (v_i >= ((uint64_t)(v_dst.len))) {
62852
      v_src_bytes_per_pixel = 1u;
62853
      if (self->private_impl.f_pixfmt == 2684356744u) {
62854
        v_src_bytes_per_pixel = 3u;
62855
      } else if (self->private_impl.f_pixfmt == 537919499u) {
62856
        v_src_bytes_per_pixel = 2u;
62857
      }
62858
      v_n = (((uint64_t)(io2_a_src - iop_a_src)) / ((uint64_t)(v_src_bytes_per_pixel)));
62859
      v_n = wuffs_base__u64__min(v_n, ((uint64_t)(((uint32_t)(self->private_impl.f_width - self->private_impl.f_dst_x)))));
62860
      v_j = v_n;
62861
      while (v_j >= 8u) {
62862
        if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 8u)))) {
62863
          iop_a_src += (v_src_bytes_per_pixel * 8u);
62864
        }
62865
        v_j -= 8u;
62866
      }
62867
      while (v_j > 0u) {
62868
        if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 1u)))) {
62869
          iop_a_src += (v_src_bytes_per_pixel * 1u);
62870
        }
62871
        v_j -= 1u;
62872
      }
62873
    } else {
62874
      v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_reader(
62875
          &self->private_impl.f_swizzler,
62876
          wuffs_base__slice_u8__subslice_i(v_dst, v_i),
62877
          wuffs_base__pixel_buffer__palette(a_dst),
62878
          &iop_a_src,
62879
          io2_a_src);
62880
    }
62881
    if (v_n == 0u) {
62882
      status = wuffs_base__make_status(wuffs_netpbm__note__internal_note_short_read);
62883
      goto ok;
62884
    }
62885
    wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n)));
62886
  }
62887
  status = wuffs_base__make_status(NULL);
62888
  goto ok;
62889
62890
  ok:
62891
  goto exit;
62892
  exit:
62893
  if (a_src && a_src->data.ptr) {
62894
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
62895
  }
62896
62897
  return status;
62898
}
62899
62900
// -------- func netpbm.decoder.swizzle_hard
62901
62902
WUFFS_BASE__GENERATED_C_CODE
62903
static wuffs_base__status
62904
wuffs_netpbm__decoder__swizzle_hard(
62905
    wuffs_netpbm__decoder* self,
62906
    wuffs_base__pixel_buffer* a_dst,
62907
    wuffs_base__io_buffer* a_src) {
62908
  wuffs_base__status status = wuffs_base__make_status(NULL);
62909
62910
  wuffs_base__pixel_format v_dst_pixfmt = {0};
62911
  uint32_t v_dst_bits_per_pixel = 0;
62912
  uint64_t v_dst_bytes_per_pixel = 0;
62913
  wuffs_base__table_u8 v_tab = {0};
62914
  wuffs_base__slice_u8 v_dst = {0};
62915
  uint64_t v_i = 0;
62916
62917
  const uint8_t* iop_a_src = NULL;
62918
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
62919
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
62920
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
62921
  if (a_src && a_src->data.ptr) {
62922
    io0_a_src = a_src->data.ptr;
62923
    io1_a_src = io0_a_src + a_src->meta.ri;
62924
    iop_a_src = io1_a_src;
62925
    io2_a_src = io0_a_src + a_src->meta.wi;
62926
  }
62927
62928
  v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
62929
  v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
62930
  if ((v_dst_bits_per_pixel & 7u) != 0u) {
62931
    status = wuffs_base__make_status(wuffs_base__error__unsupported_option);
62932
    goto exit;
62933
  }
62934
  v_dst_bytes_per_pixel = ((uint64_t)((v_dst_bits_per_pixel / 8u)));
62935
  v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
62936
  while (self->private_impl.f_dst_y < self->private_impl.f_height) {
62937
    v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y);
62938
    v_i = (((uint64_t)(self->private_impl.f_dst_x)) * v_dst_bytes_per_pixel);
62939
    if (v_i <= ((uint64_t)(v_dst.len))) {
62940
      v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_i);
62941
    }
62942
    while (true) {
62943
      if (self->private_impl.f_dst_x >= self->private_impl.f_width) {
62944
        self->private_impl.f_dst_x = 0u;
62945
        self->private_impl.f_dst_y += 1u;
62946
        break;
62947
      }
62948
      if (((uint64_t)(io2_a_src - iop_a_src)) < 6u) {
62949
        status = wuffs_base__make_status(wuffs_netpbm__note__internal_note_short_read);
62950
        goto ok;
62951
      }
62952
      self->private_data.f_buffer[5u] = iop_a_src[0u];
62953
      self->private_data.f_buffer[4u] = iop_a_src[1u];
62954
      self->private_data.f_buffer[3u] = iop_a_src[2u];
62955
      self->private_data.f_buffer[2u] = iop_a_src[3u];
62956
      self->private_data.f_buffer[1u] = iop_a_src[4u];
62957
      self->private_data.f_buffer[0u] = iop_a_src[5u];
62958
      iop_a_src += 6u;
62959
      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));
62960
      if (v_dst_bytes_per_pixel <= ((uint64_t)(v_dst.len))) {
62961
        v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_bytes_per_pixel);
62962
      }
62963
      self->private_impl.f_dst_x += 1u;
62964
    }
62965
  }
62966
  status = wuffs_base__make_status(NULL);
62967
  goto ok;
62968
62969
  ok:
62970
  goto exit;
62971
  exit:
62972
  if (a_src && a_src->data.ptr) {
62973
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
62974
  }
62975
62976
  return status;
62977
}
62978
62979
// -------- func netpbm.decoder.frame_dirty_rect
62980
62981
WUFFS_BASE__GENERATED_C_CODE
62982
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
62983
wuffs_netpbm__decoder__frame_dirty_rect(
62984
    const wuffs_netpbm__decoder* self) {
62985
  if (!self) {
62986
    return wuffs_base__utility__empty_rect_ie_u32();
62987
  }
62988
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
62989
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
62990
    return wuffs_base__utility__empty_rect_ie_u32();
62991
  }
62992
62993
  return wuffs_base__utility__make_rect_ie_u32(
62994
      0u,
62995
      0u,
62996
      self->private_impl.f_width,
62997
      self->private_impl.f_height);
62998
}
62999
63000
// -------- func netpbm.decoder.num_animation_loops
63001
63002
WUFFS_BASE__GENERATED_C_CODE
63003
WUFFS_BASE__MAYBE_STATIC uint32_t
63004
wuffs_netpbm__decoder__num_animation_loops(
63005
    const wuffs_netpbm__decoder* self) {
63006
  if (!self) {
63007
    return 0;
63008
  }
63009
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
63010
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
63011
    return 0;
63012
  }
63013
63014
  return 0u;
63015
}
63016
63017
// -------- func netpbm.decoder.num_decoded_frame_configs
63018
63019
WUFFS_BASE__GENERATED_C_CODE
63020
WUFFS_BASE__MAYBE_STATIC uint64_t
63021
wuffs_netpbm__decoder__num_decoded_frame_configs(
63022
    const wuffs_netpbm__decoder* self) {
63023
  if (!self) {
63024
    return 0;
63025
  }
63026
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
63027
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
63028
    return 0;
63029
  }
63030
63031
  if (self->private_impl.f_call_sequence > 32u) {
63032
    return 1u;
63033
  }
63034
  return 0u;
63035
}
63036
63037
// -------- func netpbm.decoder.num_decoded_frames
63038
63039
WUFFS_BASE__GENERATED_C_CODE
63040
WUFFS_BASE__MAYBE_STATIC uint64_t
63041
wuffs_netpbm__decoder__num_decoded_frames(
63042
    const wuffs_netpbm__decoder* self) {
63043
  if (!self) {
63044
    return 0;
63045
  }
63046
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
63047
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
63048
    return 0;
63049
  }
63050
63051
  if (self->private_impl.f_call_sequence > 64u) {
63052
    return 1u;
63053
  }
63054
  return 0u;
63055
}
63056
63057
// -------- func netpbm.decoder.restart_frame
63058
63059
WUFFS_BASE__GENERATED_C_CODE
63060
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
63061
wuffs_netpbm__decoder__restart_frame(
63062
    wuffs_netpbm__decoder* self,
63063
    uint64_t a_index,
63064
    uint64_t a_io_position) {
63065
  if (!self) {
63066
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
63067
  }
63068
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
63069
    return wuffs_base__make_status(
63070
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
63071
        ? wuffs_base__error__disabled_by_previous_error
63072
        : wuffs_base__error__initialize_not_called);
63073
  }
63074
63075
  if (self->private_impl.f_call_sequence < 32u) {
63076
    return wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
63077
  }
63078
  if ((a_index != 0u) || (a_io_position != self->private_impl.f_frame_config_io_position)) {
63079
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
63080
  }
63081
  self->private_impl.f_call_sequence = 40u;
63082
  return wuffs_base__make_status(NULL);
63083
}
63084
63085
// -------- func netpbm.decoder.set_report_metadata
63086
63087
WUFFS_BASE__GENERATED_C_CODE
63088
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
63089
wuffs_netpbm__decoder__set_report_metadata(
63090
    wuffs_netpbm__decoder* self,
63091
    uint32_t a_fourcc,
63092
    bool a_report) {
63093
  return wuffs_base__make_empty_struct();
63094
}
63095
63096
// -------- func netpbm.decoder.tell_me_more
63097
63098
WUFFS_BASE__GENERATED_C_CODE
63099
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
63100
wuffs_netpbm__decoder__tell_me_more(
63101
    wuffs_netpbm__decoder* self,
63102
    wuffs_base__io_buffer* a_dst,
63103
    wuffs_base__more_information* a_minfo,
63104
    wuffs_base__io_buffer* a_src) {
63105
  if (!self) {
63106
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
63107
  }
63108
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
63109
    return wuffs_base__make_status(
63110
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
63111
        ? wuffs_base__error__disabled_by_previous_error
63112
        : wuffs_base__error__initialize_not_called);
63113
  }
63114
  if (!a_dst || !a_src) {
63115
    self->private_impl.magic = WUFFS_BASE__DISABLED;
63116
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
63117
  }
63118
  if ((self->private_impl.active_coroutine != 0) &&
63119
      (self->private_impl.active_coroutine != 4)) {
63120
    self->private_impl.magic = WUFFS_BASE__DISABLED;
63121
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
63122
  }
63123
  self->private_impl.active_coroutine = 0;
63124
  wuffs_base__status status = wuffs_base__make_status(NULL);
63125
63126
  status = wuffs_base__make_status(wuffs_base__error__no_more_information);
63127
  goto exit;
63128
63129
  goto ok;
63130
  ok:
63131
  goto exit;
63132
  exit:
63133
  if (wuffs_base__status__is_error(&status)) {
63134
    self->private_impl.magic = WUFFS_BASE__DISABLED;
63135
  }
63136
  return status;
63137
}
63138
63139
// -------- func netpbm.decoder.workbuf_len
63140
63141
WUFFS_BASE__GENERATED_C_CODE
63142
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
63143
wuffs_netpbm__decoder__workbuf_len(
63144
    const wuffs_netpbm__decoder* self) {
63145
  if (!self) {
63146
    return wuffs_base__utility__empty_range_ii_u64();
63147
  }
63148
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
63149
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
63150
    return wuffs_base__utility__empty_range_ii_u64();
63151
  }
63152
63153
  return wuffs_base__utility__make_range_ii_u64(0u, 0u);
63154
}
63155
63156
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NETPBM)
63157
63158
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NIE)
63159
63160
// ---------------- Status Codes Implementations
63161
63162
const char wuffs_nie__error__bad_header[] = "#nie: bad header";
63163
const char wuffs_nie__error__truncated_input[] = "#nie: truncated input";
63164
const char wuffs_nie__error__unsupported_nie_file[] = "#nie: unsupported NIE file";
63165
const char wuffs_nie__note__internal_note_short_read[] = "@nie: internal note: short read";
63166
63167
// ---------------- Private Consts
63168
63169
// ---------------- Private Initializer Prototypes
63170
63171
// ---------------- Private Function Prototypes
63172
63173
WUFFS_BASE__GENERATED_C_CODE
63174
static wuffs_base__status
63175
wuffs_nie__decoder__do_decode_image_config(
63176
    wuffs_nie__decoder* self,
63177
    wuffs_base__image_config* a_dst,
63178
    wuffs_base__io_buffer* a_src);
63179
63180
WUFFS_BASE__GENERATED_C_CODE
63181
static wuffs_base__status
63182
wuffs_nie__decoder__do_decode_frame_config(
63183
    wuffs_nie__decoder* self,
63184
    wuffs_base__frame_config* a_dst,
63185
    wuffs_base__io_buffer* a_src);
63186
63187
WUFFS_BASE__GENERATED_C_CODE
63188
static wuffs_base__status
63189
wuffs_nie__decoder__do_decode_frame(
63190
    wuffs_nie__decoder* self,
63191
    wuffs_base__pixel_buffer* a_dst,
63192
    wuffs_base__io_buffer* a_src,
63193
    wuffs_base__pixel_blend a_blend,
63194
    wuffs_base__slice_u8 a_workbuf,
63195
    wuffs_base__decode_frame_options* a_opts);
63196
63197
WUFFS_BASE__GENERATED_C_CODE
63198
static wuffs_base__status
63199
wuffs_nie__decoder__swizzle(
63200
    wuffs_nie__decoder* self,
63201
    wuffs_base__pixel_buffer* a_dst,
63202
    wuffs_base__io_buffer* a_src);
63203
63204
// ---------------- VTables
63205
63206
const wuffs_base__image_decoder__func_ptrs
63207
wuffs_nie__decoder__func_ptrs_for__wuffs_base__image_decoder = {
63208
  (wuffs_base__status(*)(void*,
63209
      wuffs_base__pixel_buffer*,
63210
      wuffs_base__io_buffer*,
63211
      wuffs_base__pixel_blend,
63212
      wuffs_base__slice_u8,
63213
      wuffs_base__decode_frame_options*))(&wuffs_nie__decoder__decode_frame),
63214
  (wuffs_base__status(*)(void*,
63215
      wuffs_base__frame_config*,
63216
      wuffs_base__io_buffer*))(&wuffs_nie__decoder__decode_frame_config),
63217
  (wuffs_base__status(*)(void*,
63218
      wuffs_base__image_config*,
63219
      wuffs_base__io_buffer*))(&wuffs_nie__decoder__decode_image_config),
63220
  (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_nie__decoder__frame_dirty_rect),
63221
  (uint64_t(*)(const void*,
63222
      uint32_t))(&wuffs_nie__decoder__get_quirk),
63223
  (uint32_t(*)(const void*))(&wuffs_nie__decoder__num_animation_loops),
63224
  (uint64_t(*)(const void*))(&wuffs_nie__decoder__num_decoded_frame_configs),
63225
  (uint64_t(*)(const void*))(&wuffs_nie__decoder__num_decoded_frames),
63226
  (wuffs_base__status(*)(void*,
63227
      uint64_t,
63228
      uint64_t))(&wuffs_nie__decoder__restart_frame),
63229
  (wuffs_base__status(*)(void*,
63230
      uint32_t,
63231
      uint64_t))(&wuffs_nie__decoder__set_quirk),
63232
  (wuffs_base__empty_struct(*)(void*,
63233
      uint32_t,
63234
      bool))(&wuffs_nie__decoder__set_report_metadata),
63235
  (wuffs_base__status(*)(void*,
63236
      wuffs_base__io_buffer*,
63237
      wuffs_base__more_information*,
63238
      wuffs_base__io_buffer*))(&wuffs_nie__decoder__tell_me_more),
63239
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_nie__decoder__workbuf_len),
63240
};
63241
63242
// ---------------- Initializer Implementations
63243
63244
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
63245
wuffs_nie__decoder__initialize(
63246
    wuffs_nie__decoder* self,
63247
    size_t sizeof_star_self,
63248
    uint64_t wuffs_version,
63249
    uint32_t options){
63250
  if (!self) {
63251
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
63252
  }
63253
  if (sizeof(*self) != sizeof_star_self) {
63254
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
63255
  }
63256
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
63257
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
63258
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
63259
  }
63260
63261
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
63262
    // The whole point of this if-check is to detect an uninitialized *self.
63263
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
63264
#if !defined(__clang__) && defined(__GNUC__)
63265
#pragma GCC diagnostic push
63266
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
63267
#endif
63268
    if (self->private_impl.magic != 0) {
63269
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
63270
    }
63271
#if !defined(__clang__) && defined(__GNUC__)
63272
#pragma GCC diagnostic pop
63273
#endif
63274
  } else {
63275
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
63276
      memset(self, 0, sizeof(*self));
63277
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
63278
    } else {
63279
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
63280
    }
63281
  }
63282
63283
  self->private_impl.magic = WUFFS_BASE__MAGIC;
63284
  self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name =
63285
      wuffs_base__image_decoder__vtable_name;
63286
  self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers =
63287
      (const void*)(&wuffs_nie__decoder__func_ptrs_for__wuffs_base__image_decoder);
63288
  return wuffs_base__make_status(NULL);
63289
}
63290
63291
wuffs_nie__decoder*
63292
wuffs_nie__decoder__alloc(void) {
63293
  wuffs_nie__decoder* x =
63294
      (wuffs_nie__decoder*)(calloc(1, sizeof(wuffs_nie__decoder)));
63295
  if (!x) {
63296
    return NULL;
63297
  }
63298
  if (wuffs_nie__decoder__initialize(
63299
      x, sizeof(wuffs_nie__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
63300
    free(x);
63301
    return NULL;
63302
  }
63303
  return x;
63304
}
63305
63306
size_t
63307
sizeof__wuffs_nie__decoder(void) {
63308
  return sizeof(wuffs_nie__decoder);
63309
}
63310
63311
// ---------------- Function Implementations
63312
63313
// -------- func nie.decoder.get_quirk
63314
63315
WUFFS_BASE__GENERATED_C_CODE
63316
WUFFS_BASE__MAYBE_STATIC uint64_t
63317
wuffs_nie__decoder__get_quirk(
63318
    const wuffs_nie__decoder* self,
63319
    uint32_t a_key) {
63320
  if (!self) {
63321
    return 0;
63322
  }
63323
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
63324
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
63325
    return 0;
63326
  }
63327
63328
  return 0u;
63329
}
63330
63331
// -------- func nie.decoder.set_quirk
63332
63333
WUFFS_BASE__GENERATED_C_CODE
63334
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
63335
wuffs_nie__decoder__set_quirk(
63336
    wuffs_nie__decoder* self,
63337
    uint32_t a_key,
63338
    uint64_t a_value) {
63339
  if (!self) {
63340
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
63341
  }
63342
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
63343
    return wuffs_base__make_status(
63344
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
63345
        ? wuffs_base__error__disabled_by_previous_error
63346
        : wuffs_base__error__initialize_not_called);
63347
  }
63348
63349
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
63350
}
63351
63352
// -------- func nie.decoder.decode_image_config
63353
63354
WUFFS_BASE__GENERATED_C_CODE
63355
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
63356
wuffs_nie__decoder__decode_image_config(
63357
    wuffs_nie__decoder* self,
63358
    wuffs_base__image_config* a_dst,
63359
    wuffs_base__io_buffer* a_src) {
63360
  if (!self) {
63361
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
63362
  }
63363
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
63364
    return wuffs_base__make_status(
63365
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
63366
        ? wuffs_base__error__disabled_by_previous_error
63367
        : wuffs_base__error__initialize_not_called);
63368
  }
63369
  if (!a_src) {
63370
    self->private_impl.magic = WUFFS_BASE__DISABLED;
63371
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
63372
  }
63373
  if ((self->private_impl.active_coroutine != 0) &&
63374
      (self->private_impl.active_coroutine != 1)) {
63375
    self->private_impl.magic = WUFFS_BASE__DISABLED;
63376
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
63377
  }
63378
  self->private_impl.active_coroutine = 0;
63379
  wuffs_base__status status = wuffs_base__make_status(NULL);
63380
63381
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
63382
63383
  uint32_t coro_susp_point = self->private_impl.p_decode_image_config;
63384
  switch (coro_susp_point) {
63385
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
63386
63387
    while (true) {
63388
      {
63389
        wuffs_base__status t_0 = wuffs_nie__decoder__do_decode_image_config(self, a_dst, a_src);
63390
        v_status = t_0;
63391
      }
63392
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
63393
        status = wuffs_base__make_status(wuffs_nie__error__truncated_input);
63394
        goto exit;
63395
      }
63396
      status = v_status;
63397
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
63398
    }
63399
63400
    ok:
63401
    self->private_impl.p_decode_image_config = 0;
63402
    goto exit;
63403
  }
63404
63405
  goto suspend;
63406
  suspend:
63407
  self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
63408
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
63409
63410
  goto exit;
63411
  exit:
63412
  if (wuffs_base__status__is_error(&status)) {
63413
    self->private_impl.magic = WUFFS_BASE__DISABLED;
63414
  }
63415
  return status;
63416
}
63417
63418
// -------- func nie.decoder.do_decode_image_config
63419
63420
WUFFS_BASE__GENERATED_C_CODE
63421
static wuffs_base__status
63422
wuffs_nie__decoder__do_decode_image_config(
63423
    wuffs_nie__decoder* self,
63424
    wuffs_base__image_config* a_dst,
63425
    wuffs_base__io_buffer* a_src) {
63426
  wuffs_base__status status = wuffs_base__make_status(NULL);
63427
63428
  uint32_t v_a = 0;
63429
63430
  const uint8_t* iop_a_src = NULL;
63431
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
63432
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
63433
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
63434
  if (a_src && a_src->data.ptr) {
63435
    io0_a_src = a_src->data.ptr;
63436
    io1_a_src = io0_a_src + a_src->meta.ri;
63437
    iop_a_src = io1_a_src;
63438
    io2_a_src = io0_a_src + a_src->meta.wi;
63439
  }
63440
63441
  uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config;
63442
  switch (coro_susp_point) {
63443
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
63444
63445
    if (self->private_impl.f_call_sequence != 0u) {
63446
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
63447
      goto exit;
63448
    }
63449
    {
63450
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
63451
      uint32_t t_0;
63452
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
63453
        t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
63454
        iop_a_src += 4;
63455
      } else {
63456
        self->private_data.s_do_decode_image_config.scratch = 0;
63457
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
63458
        while (true) {
63459
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
63460
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
63461
            goto suspend;
63462
          }
63463
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
63464
          uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
63465
          *scratch <<= 8;
63466
          *scratch >>= 8;
63467
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
63468
          if (num_bits_0 == 24) {
63469
            t_0 = ((uint32_t)(*scratch));
63470
            break;
63471
          }
63472
          num_bits_0 += 8u;
63473
          *scratch |= ((uint64_t)(num_bits_0)) << 56;
63474
        }
63475
      }
63476
      v_a = t_0;
63477
    }
63478
    if (v_a != 1169146734u) {
63479
      status = wuffs_base__make_status(wuffs_nie__error__bad_header);
63480
      goto exit;
63481
    }
63482
    {
63483
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
63484
      uint32_t t_1;
63485
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
63486
        t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
63487
        iop_a_src += 4;
63488
      } else {
63489
        self->private_data.s_do_decode_image_config.scratch = 0;
63490
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
63491
        while (true) {
63492
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
63493
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
63494
            goto suspend;
63495
          }
63496
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
63497
          uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
63498
          *scratch <<= 8;
63499
          *scratch >>= 8;
63500
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
63501
          if (num_bits_1 == 24) {
63502
            t_1 = ((uint32_t)(*scratch));
63503
            break;
63504
          }
63505
          num_bits_1 += 8u;
63506
          *scratch |= ((uint64_t)(num_bits_1)) << 56;
63507
        }
63508
      }
63509
      v_a = t_1;
63510
    }
63511
    if (v_a == 879649535u) {
63512
      self->private_impl.f_pixfmt = 2164295816u;
63513
    } else if (v_a == 946758399u) {
63514
      self->private_impl.f_pixfmt = 2164308923u;
63515
    } else if (v_a == 879780607u) {
63516
      status = wuffs_base__make_status(wuffs_nie__error__unsupported_nie_file);
63517
      goto exit;
63518
    } else if (v_a == 946889471u) {
63519
      status = wuffs_base__make_status(wuffs_nie__error__unsupported_nie_file);
63520
      goto exit;
63521
    } else {
63522
      status = wuffs_base__make_status(wuffs_nie__error__bad_header);
63523
      goto exit;
63524
    }
63525
    {
63526
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
63527
      uint32_t t_2;
63528
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
63529
        t_2 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
63530
        iop_a_src += 4;
63531
      } else {
63532
        self->private_data.s_do_decode_image_config.scratch = 0;
63533
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
63534
        while (true) {
63535
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
63536
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
63537
            goto suspend;
63538
          }
63539
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
63540
          uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56));
63541
          *scratch <<= 8;
63542
          *scratch >>= 8;
63543
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2;
63544
          if (num_bits_2 == 24) {
63545
            t_2 = ((uint32_t)(*scratch));
63546
            break;
63547
          }
63548
          num_bits_2 += 8u;
63549
          *scratch |= ((uint64_t)(num_bits_2)) << 56;
63550
        }
63551
      }
63552
      v_a = t_2;
63553
    }
63554
    if (v_a > 2147483647u) {
63555
      status = wuffs_base__make_status(wuffs_nie__error__bad_header);
63556
      goto exit;
63557
    } else if (v_a > 16777215u) {
63558
      status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension);
63559
      goto exit;
63560
    }
63561
    self->private_impl.f_width = v_a;
63562
    {
63563
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
63564
      uint32_t t_3;
63565
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
63566
        t_3 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
63567
        iop_a_src += 4;
63568
      } else {
63569
        self->private_data.s_do_decode_image_config.scratch = 0;
63570
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
63571
        while (true) {
63572
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
63573
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
63574
            goto suspend;
63575
          }
63576
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
63577
          uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56));
63578
          *scratch <<= 8;
63579
          *scratch >>= 8;
63580
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3;
63581
          if (num_bits_3 == 24) {
63582
            t_3 = ((uint32_t)(*scratch));
63583
            break;
63584
          }
63585
          num_bits_3 += 8u;
63586
          *scratch |= ((uint64_t)(num_bits_3)) << 56;
63587
        }
63588
      }
63589
      v_a = t_3;
63590
    }
63591
    if (v_a > 2147483647u) {
63592
      status = wuffs_base__make_status(wuffs_nie__error__bad_header);
63593
      goto exit;
63594
    } else if (v_a > 16777215u) {
63595
      status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension);
63596
      goto exit;
63597
    }
63598
    self->private_impl.f_height = v_a;
63599
    if (a_dst != NULL) {
63600
      wuffs_base__image_config__set(
63601
          a_dst,
63602
          self->private_impl.f_pixfmt,
63603
          0u,
63604
          self->private_impl.f_width,
63605
          self->private_impl.f_height,
63606
          16u,
63607
          false);
63608
    }
63609
    self->private_impl.f_call_sequence = 32u;
63610
63611
    goto ok;
63612
    ok:
63613
    self->private_impl.p_do_decode_image_config = 0;
63614
    goto exit;
63615
  }
63616
63617
  goto suspend;
63618
  suspend:
63619
  self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
63620
63621
  goto exit;
63622
  exit:
63623
  if (a_src && a_src->data.ptr) {
63624
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
63625
  }
63626
63627
  return status;
63628
}
63629
63630
// -------- func nie.decoder.decode_frame_config
63631
63632
WUFFS_BASE__GENERATED_C_CODE
63633
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
63634
wuffs_nie__decoder__decode_frame_config(
63635
    wuffs_nie__decoder* self,
63636
    wuffs_base__frame_config* a_dst,
63637
    wuffs_base__io_buffer* a_src) {
63638
  if (!self) {
63639
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
63640
  }
63641
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
63642
    return wuffs_base__make_status(
63643
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
63644
        ? wuffs_base__error__disabled_by_previous_error
63645
        : wuffs_base__error__initialize_not_called);
63646
  }
63647
  if (!a_src) {
63648
    self->private_impl.magic = WUFFS_BASE__DISABLED;
63649
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
63650
  }
63651
  if ((self->private_impl.active_coroutine != 0) &&
63652
      (self->private_impl.active_coroutine != 2)) {
63653
    self->private_impl.magic = WUFFS_BASE__DISABLED;
63654
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
63655
  }
63656
  self->private_impl.active_coroutine = 0;
63657
  wuffs_base__status status = wuffs_base__make_status(NULL);
63658
63659
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
63660
63661
  uint32_t coro_susp_point = self->private_impl.p_decode_frame_config;
63662
  switch (coro_susp_point) {
63663
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
63664
63665
    while (true) {
63666
      {
63667
        wuffs_base__status t_0 = wuffs_nie__decoder__do_decode_frame_config(self, a_dst, a_src);
63668
        v_status = t_0;
63669
      }
63670
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
63671
        status = wuffs_base__make_status(wuffs_nie__error__truncated_input);
63672
        goto exit;
63673
      }
63674
      status = v_status;
63675
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
63676
    }
63677
63678
    ok:
63679
    self->private_impl.p_decode_frame_config = 0;
63680
    goto exit;
63681
  }
63682
63683
  goto suspend;
63684
  suspend:
63685
  self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
63686
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0;
63687
63688
  goto exit;
63689
  exit:
63690
  if (wuffs_base__status__is_error(&status)) {
63691
    self->private_impl.magic = WUFFS_BASE__DISABLED;
63692
  }
63693
  return status;
63694
}
63695
63696
// -------- func nie.decoder.do_decode_frame_config
63697
63698
WUFFS_BASE__GENERATED_C_CODE
63699
static wuffs_base__status
63700
wuffs_nie__decoder__do_decode_frame_config(
63701
    wuffs_nie__decoder* self,
63702
    wuffs_base__frame_config* a_dst,
63703
    wuffs_base__io_buffer* a_src) {
63704
  wuffs_base__status status = wuffs_base__make_status(NULL);
63705
63706
  wuffs_base__pixel_format v_pixfmt = {0};
63707
63708
  const uint8_t* iop_a_src = NULL;
63709
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
63710
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
63711
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
63712
  if (a_src && a_src->data.ptr) {
63713
    io0_a_src = a_src->data.ptr;
63714
    io1_a_src = io0_a_src + a_src->meta.ri;
63715
    iop_a_src = io1_a_src;
63716
    io2_a_src = io0_a_src + a_src->meta.wi;
63717
  }
63718
63719
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config;
63720
  switch (coro_susp_point) {
63721
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
63722
63723
    if (self->private_impl.f_call_sequence == 32u) {
63724
    } else if (self->private_impl.f_call_sequence < 32u) {
63725
      if (a_src) {
63726
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
63727
      }
63728
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
63729
      status = wuffs_nie__decoder__do_decode_image_config(self, NULL, a_src);
63730
      if (a_src) {
63731
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
63732
      }
63733
      if (status.repr) {
63734
        goto suspend;
63735
      }
63736
    } else if (self->private_impl.f_call_sequence == 40u) {
63737
      if (16u != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) {
63738
        status = wuffs_base__make_status(wuffs_base__error__bad_restart);
63739
        goto exit;
63740
      }
63741
    } else if (self->private_impl.f_call_sequence == 64u) {
63742
      self->private_impl.f_call_sequence = 96u;
63743
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
63744
      goto ok;
63745
    } else {
63746
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
63747
      goto ok;
63748
    }
63749
    if (a_dst != NULL) {
63750
      v_pixfmt = wuffs_base__utility__make_pixel_format(self->private_impl.f_pixfmt);
63751
      wuffs_base__frame_config__set(
63752
          a_dst,
63753
          wuffs_base__utility__make_rect_ie_u32(
63754
          0u,
63755
          0u,
63756
          self->private_impl.f_width,
63757
          self->private_impl.f_height),
63758
          ((wuffs_base__flicks)(0u)),
63759
          0u,
63760
          16u,
63761
          0u,
63762
          false,
63763
          false,
63764
          wuffs_base__pixel_format__default_background_color(&v_pixfmt));
63765
    }
63766
    self->private_impl.f_call_sequence = 64u;
63767
63768
    ok:
63769
    self->private_impl.p_do_decode_frame_config = 0;
63770
    goto exit;
63771
  }
63772
63773
  goto suspend;
63774
  suspend:
63775
  self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
63776
63777
  goto exit;
63778
  exit:
63779
  if (a_src && a_src->data.ptr) {
63780
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
63781
  }
63782
63783
  return status;
63784
}
63785
63786
// -------- func nie.decoder.decode_frame
63787
63788
WUFFS_BASE__GENERATED_C_CODE
63789
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
63790
wuffs_nie__decoder__decode_frame(
63791
    wuffs_nie__decoder* self,
63792
    wuffs_base__pixel_buffer* a_dst,
63793
    wuffs_base__io_buffer* a_src,
63794
    wuffs_base__pixel_blend a_blend,
63795
    wuffs_base__slice_u8 a_workbuf,
63796
    wuffs_base__decode_frame_options* a_opts) {
63797
  if (!self) {
63798
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
63799
  }
63800
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
63801
    return wuffs_base__make_status(
63802
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
63803
        ? wuffs_base__error__disabled_by_previous_error
63804
        : wuffs_base__error__initialize_not_called);
63805
  }
63806
  if (!a_dst || !a_src) {
63807
    self->private_impl.magic = WUFFS_BASE__DISABLED;
63808
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
63809
  }
63810
  if ((self->private_impl.active_coroutine != 0) &&
63811
      (self->private_impl.active_coroutine != 3)) {
63812
    self->private_impl.magic = WUFFS_BASE__DISABLED;
63813
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
63814
  }
63815
  self->private_impl.active_coroutine = 0;
63816
  wuffs_base__status status = wuffs_base__make_status(NULL);
63817
63818
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
63819
63820
  uint32_t coro_susp_point = self->private_impl.p_decode_frame;
63821
  switch (coro_susp_point) {
63822
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
63823
63824
    while (true) {
63825
      {
63826
        wuffs_base__status t_0 = wuffs_nie__decoder__do_decode_frame(self,
63827
            a_dst,
63828
            a_src,
63829
            a_blend,
63830
            a_workbuf,
63831
            a_opts);
63832
        v_status = t_0;
63833
      }
63834
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
63835
        status = wuffs_base__make_status(wuffs_nie__error__truncated_input);
63836
        goto exit;
63837
      }
63838
      status = v_status;
63839
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
63840
    }
63841
63842
    ok:
63843
    self->private_impl.p_decode_frame = 0;
63844
    goto exit;
63845
  }
63846
63847
  goto suspend;
63848
  suspend:
63849
  self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
63850
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0;
63851
63852
  goto exit;
63853
  exit:
63854
  if (wuffs_base__status__is_error(&status)) {
63855
    self->private_impl.magic = WUFFS_BASE__DISABLED;
63856
  }
63857
  return status;
63858
}
63859
63860
// -------- func nie.decoder.do_decode_frame
63861
63862
WUFFS_BASE__GENERATED_C_CODE
63863
static wuffs_base__status
63864
wuffs_nie__decoder__do_decode_frame(
63865
    wuffs_nie__decoder* self,
63866
    wuffs_base__pixel_buffer* a_dst,
63867
    wuffs_base__io_buffer* a_src,
63868
    wuffs_base__pixel_blend a_blend,
63869
    wuffs_base__slice_u8 a_workbuf,
63870
    wuffs_base__decode_frame_options* a_opts) {
63871
  wuffs_base__status status = wuffs_base__make_status(NULL);
63872
63873
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
63874
63875
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame;
63876
  switch (coro_susp_point) {
63877
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
63878
63879
    if (self->private_impl.f_call_sequence == 64u) {
63880
    } else if (self->private_impl.f_call_sequence < 64u) {
63881
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
63882
      status = wuffs_nie__decoder__do_decode_frame_config(self, NULL, a_src);
63883
      if (status.repr) {
63884
        goto suspend;
63885
      }
63886
    } else {
63887
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
63888
      goto ok;
63889
    }
63890
    self->private_impl.f_dst_x = 0u;
63891
    self->private_impl.f_dst_y = 0u;
63892
    v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler,
63893
        wuffs_base__pixel_buffer__pixel_format(a_dst),
63894
        wuffs_base__pixel_buffer__palette(a_dst),
63895
        wuffs_base__utility__make_pixel_format(self->private_impl.f_pixfmt),
63896
        wuffs_base__utility__empty_slice_u8(),
63897
        a_blend);
63898
    if ( ! wuffs_base__status__is_ok(&v_status)) {
63899
      status = v_status;
63900
      if (wuffs_base__status__is_error(&status)) {
63901
        goto exit;
63902
      } else if (wuffs_base__status__is_suspension(&status)) {
63903
        status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
63904
        goto exit;
63905
      }
63906
      goto ok;
63907
    }
63908
    while (true) {
63909
      v_status = wuffs_nie__decoder__swizzle(self, a_dst, a_src);
63910
      if (wuffs_base__status__is_ok(&v_status)) {
63911
        break;
63912
      } else if (v_status.repr != wuffs_nie__note__internal_note_short_read) {
63913
        status = v_status;
63914
        if (wuffs_base__status__is_error(&status)) {
63915
          goto exit;
63916
        } else if (wuffs_base__status__is_suspension(&status)) {
63917
          status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
63918
          goto exit;
63919
        }
63920
        goto ok;
63921
      }
63922
      status = wuffs_base__make_status(wuffs_base__suspension__short_read);
63923
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2);
63924
    }
63925
    self->private_impl.f_call_sequence = 96u;
63926
63927
    ok:
63928
    self->private_impl.p_do_decode_frame = 0;
63929
    goto exit;
63930
  }
63931
63932
  goto suspend;
63933
  suspend:
63934
  self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
63935
63936
  goto exit;
63937
  exit:
63938
  return status;
63939
}
63940
63941
// -------- func nie.decoder.swizzle
63942
63943
WUFFS_BASE__GENERATED_C_CODE
63944
static wuffs_base__status
63945
wuffs_nie__decoder__swizzle(
63946
    wuffs_nie__decoder* self,
63947
    wuffs_base__pixel_buffer* a_dst,
63948
    wuffs_base__io_buffer* a_src) {
63949
  wuffs_base__status status = wuffs_base__make_status(NULL);
63950
63951
  wuffs_base__pixel_format v_dst_pixfmt = {0};
63952
  uint32_t v_dst_bits_per_pixel = 0;
63953
  uint32_t v_dst_bytes_per_pixel = 0;
63954
  uint64_t v_dst_bytes_per_row = 0;
63955
  uint32_t v_src_bytes_per_pixel = 0;
63956
  wuffs_base__table_u8 v_tab = {0};
63957
  wuffs_base__slice_u8 v_dst = {0};
63958
  uint64_t v_i = 0;
63959
  uint64_t v_j = 0;
63960
  uint64_t v_n = 0;
63961
63962
  const uint8_t* iop_a_src = NULL;
63963
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
63964
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
63965
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
63966
  if (a_src && a_src->data.ptr) {
63967
    io0_a_src = a_src->data.ptr;
63968
    io1_a_src = io0_a_src + a_src->meta.ri;
63969
    iop_a_src = io1_a_src;
63970
    io2_a_src = io0_a_src + a_src->meta.wi;
63971
  }
63972
63973
  v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
63974
  v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
63975
  if ((v_dst_bits_per_pixel & 7u) != 0u) {
63976
    status = wuffs_base__make_status(wuffs_base__error__unsupported_option);
63977
    goto exit;
63978
  }
63979
  v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u);
63980
  v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel)));
63981
  v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
63982
  while (true) {
63983
    if (self->private_impl.f_dst_x == self->private_impl.f_width) {
63984
      self->private_impl.f_dst_x = 0u;
63985
      self->private_impl.f_dst_y += 1u;
63986
      if (self->private_impl.f_dst_y >= self->private_impl.f_height) {
63987
        break;
63988
      }
63989
    }
63990
    v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y);
63991
    if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) {
63992
      v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row);
63993
    }
63994
    v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel)));
63995
    if (v_i >= ((uint64_t)(v_dst.len))) {
63996
      v_src_bytes_per_pixel = 4u;
63997
      if (self->private_impl.f_pixfmt == 2164308923u) {
63998
        v_src_bytes_per_pixel = 8u;
63999
      }
64000
      v_n = (((uint64_t)(io2_a_src - iop_a_src)) / ((uint64_t)(v_src_bytes_per_pixel)));
64001
      v_n = wuffs_base__u64__min(v_n, ((uint64_t)(((uint32_t)(self->private_impl.f_width - self->private_impl.f_dst_x)))));
64002
      v_j = v_n;
64003
      while (v_j >= 8u) {
64004
        if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 8u)))) {
64005
          iop_a_src += (v_src_bytes_per_pixel * 8u);
64006
        }
64007
        v_j -= 8u;
64008
      }
64009
      while (v_j > 0u) {
64010
        if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 1u)))) {
64011
          iop_a_src += (v_src_bytes_per_pixel * 1u);
64012
        }
64013
        v_j -= 1u;
64014
      }
64015
    } else {
64016
      v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_reader(
64017
          &self->private_impl.f_swizzler,
64018
          wuffs_base__slice_u8__subslice_i(v_dst, v_i),
64019
          wuffs_base__pixel_buffer__palette(a_dst),
64020
          &iop_a_src,
64021
          io2_a_src);
64022
    }
64023
    if (v_n == 0u) {
64024
      status = wuffs_base__make_status(wuffs_nie__note__internal_note_short_read);
64025
      goto ok;
64026
    }
64027
    wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n)));
64028
  }
64029
  status = wuffs_base__make_status(NULL);
64030
  goto ok;
64031
64032
  ok:
64033
  goto exit;
64034
  exit:
64035
  if (a_src && a_src->data.ptr) {
64036
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
64037
  }
64038
64039
  return status;
64040
}
64041
64042
// -------- func nie.decoder.frame_dirty_rect
64043
64044
WUFFS_BASE__GENERATED_C_CODE
64045
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
64046
wuffs_nie__decoder__frame_dirty_rect(
64047
    const wuffs_nie__decoder* self) {
64048
  if (!self) {
64049
    return wuffs_base__utility__empty_rect_ie_u32();
64050
  }
64051
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
64052
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
64053
    return wuffs_base__utility__empty_rect_ie_u32();
64054
  }
64055
64056
  return wuffs_base__utility__make_rect_ie_u32(
64057
      0u,
64058
      0u,
64059
      self->private_impl.f_width,
64060
      self->private_impl.f_height);
64061
}
64062
64063
// -------- func nie.decoder.num_animation_loops
64064
64065
WUFFS_BASE__GENERATED_C_CODE
64066
WUFFS_BASE__MAYBE_STATIC uint32_t
64067
wuffs_nie__decoder__num_animation_loops(
64068
    const wuffs_nie__decoder* self) {
64069
  if (!self) {
64070
    return 0;
64071
  }
64072
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
64073
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
64074
    return 0;
64075
  }
64076
64077
  return 0u;
64078
}
64079
64080
// -------- func nie.decoder.num_decoded_frame_configs
64081
64082
WUFFS_BASE__GENERATED_C_CODE
64083
WUFFS_BASE__MAYBE_STATIC uint64_t
64084
wuffs_nie__decoder__num_decoded_frame_configs(
64085
    const wuffs_nie__decoder* self) {
64086
  if (!self) {
64087
    return 0;
64088
  }
64089
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
64090
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
64091
    return 0;
64092
  }
64093
64094
  if (self->private_impl.f_call_sequence > 32u) {
64095
    return 1u;
64096
  }
64097
  return 0u;
64098
}
64099
64100
// -------- func nie.decoder.num_decoded_frames
64101
64102
WUFFS_BASE__GENERATED_C_CODE
64103
WUFFS_BASE__MAYBE_STATIC uint64_t
64104
wuffs_nie__decoder__num_decoded_frames(
64105
    const wuffs_nie__decoder* self) {
64106
  if (!self) {
64107
    return 0;
64108
  }
64109
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
64110
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
64111
    return 0;
64112
  }
64113
64114
  if (self->private_impl.f_call_sequence > 64u) {
64115
    return 1u;
64116
  }
64117
  return 0u;
64118
}
64119
64120
// -------- func nie.decoder.restart_frame
64121
64122
WUFFS_BASE__GENERATED_C_CODE
64123
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
64124
wuffs_nie__decoder__restart_frame(
64125
    wuffs_nie__decoder* self,
64126
    uint64_t a_index,
64127
    uint64_t a_io_position) {
64128
  if (!self) {
64129
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
64130
  }
64131
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
64132
    return wuffs_base__make_status(
64133
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
64134
        ? wuffs_base__error__disabled_by_previous_error
64135
        : wuffs_base__error__initialize_not_called);
64136
  }
64137
64138
  if (self->private_impl.f_call_sequence < 32u) {
64139
    return wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
64140
  }
64141
  if ((a_index != 0u) || (a_io_position != 16u)) {
64142
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
64143
  }
64144
  self->private_impl.f_call_sequence = 40u;
64145
  return wuffs_base__make_status(NULL);
64146
}
64147
64148
// -------- func nie.decoder.set_report_metadata
64149
64150
WUFFS_BASE__GENERATED_C_CODE
64151
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
64152
wuffs_nie__decoder__set_report_metadata(
64153
    wuffs_nie__decoder* self,
64154
    uint32_t a_fourcc,
64155
    bool a_report) {
64156
  return wuffs_base__make_empty_struct();
64157
}
64158
64159
// -------- func nie.decoder.tell_me_more
64160
64161
WUFFS_BASE__GENERATED_C_CODE
64162
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
64163
wuffs_nie__decoder__tell_me_more(
64164
    wuffs_nie__decoder* self,
64165
    wuffs_base__io_buffer* a_dst,
64166
    wuffs_base__more_information* a_minfo,
64167
    wuffs_base__io_buffer* a_src) {
64168
  if (!self) {
64169
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
64170
  }
64171
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
64172
    return wuffs_base__make_status(
64173
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
64174
        ? wuffs_base__error__disabled_by_previous_error
64175
        : wuffs_base__error__initialize_not_called);
64176
  }
64177
  if (!a_dst || !a_src) {
64178
    self->private_impl.magic = WUFFS_BASE__DISABLED;
64179
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
64180
  }
64181
  if ((self->private_impl.active_coroutine != 0) &&
64182
      (self->private_impl.active_coroutine != 4)) {
64183
    self->private_impl.magic = WUFFS_BASE__DISABLED;
64184
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
64185
  }
64186
  self->private_impl.active_coroutine = 0;
64187
  wuffs_base__status status = wuffs_base__make_status(NULL);
64188
64189
  status = wuffs_base__make_status(wuffs_base__error__no_more_information);
64190
  goto exit;
64191
64192
  goto ok;
64193
  ok:
64194
  goto exit;
64195
  exit:
64196
  if (wuffs_base__status__is_error(&status)) {
64197
    self->private_impl.magic = WUFFS_BASE__DISABLED;
64198
  }
64199
  return status;
64200
}
64201
64202
// -------- func nie.decoder.workbuf_len
64203
64204
WUFFS_BASE__GENERATED_C_CODE
64205
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
64206
wuffs_nie__decoder__workbuf_len(
64207
    const wuffs_nie__decoder* self) {
64208
  if (!self) {
64209
    return wuffs_base__utility__empty_range_ii_u64();
64210
  }
64211
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
64212
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
64213
    return wuffs_base__utility__empty_range_ii_u64();
64214
  }
64215
64216
  return wuffs_base__utility__make_range_ii_u64(0u, 0u);
64217
}
64218
64219
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NIE)
64220
64221
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ZLIB)
64222
64223
// ---------------- Status Codes Implementations
64224
64225
const char wuffs_zlib__note__dictionary_required[] = "@zlib: dictionary required";
64226
const char wuffs_zlib__error__bad_checksum[] = "#zlib: bad checksum";
64227
const char wuffs_zlib__error__bad_compression_method[] = "#zlib: bad compression method";
64228
const char wuffs_zlib__error__bad_compression_window_size[] = "#zlib: bad compression window size";
64229
const char wuffs_zlib__error__bad_parity_check[] = "#zlib: bad parity check";
64230
const char wuffs_zlib__error__incorrect_dictionary[] = "#zlib: incorrect dictionary";
64231
const char wuffs_zlib__error__truncated_input[] = "#zlib: truncated input";
64232
64233
// ---------------- Private Consts
64234
64235
#define WUFFS_ZLIB__QUIRKS_BASE 2056083456u
64236
64237
#define WUFFS_ZLIB__QUIRKS_COUNT 1u
64238
64239
// ---------------- Private Initializer Prototypes
64240
64241
// ---------------- Private Function Prototypes
64242
64243
WUFFS_BASE__GENERATED_C_CODE
64244
static wuffs_base__status
64245
wuffs_zlib__decoder__do_transform_io(
64246
    wuffs_zlib__decoder* self,
64247
    wuffs_base__io_buffer* a_dst,
64248
    wuffs_base__io_buffer* a_src,
64249
    wuffs_base__slice_u8 a_workbuf);
64250
64251
// ---------------- VTables
64252
64253
const wuffs_base__io_transformer__func_ptrs
64254
wuffs_zlib__decoder__func_ptrs_for__wuffs_base__io_transformer = {
64255
  (wuffs_base__optional_u63(*)(const void*))(&wuffs_zlib__decoder__dst_history_retain_length),
64256
  (uint64_t(*)(const void*,
64257
      uint32_t))(&wuffs_zlib__decoder__get_quirk),
64258
  (wuffs_base__status(*)(void*,
64259
      uint32_t,
64260
      uint64_t))(&wuffs_zlib__decoder__set_quirk),
64261
  (wuffs_base__status(*)(void*,
64262
      wuffs_base__io_buffer*,
64263
      wuffs_base__io_buffer*,
64264
      wuffs_base__slice_u8))(&wuffs_zlib__decoder__transform_io),
64265
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_zlib__decoder__workbuf_len),
64266
};
64267
64268
// ---------------- Initializer Implementations
64269
64270
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
64271
wuffs_zlib__decoder__initialize(
64272
    wuffs_zlib__decoder* self,
64273
    size_t sizeof_star_self,
64274
    uint64_t wuffs_version,
64275
7.95k
    uint32_t options){
64276
7.95k
  if (!self) {
64277
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
64278
0
  }
64279
7.95k
  if (sizeof(*self) != sizeof_star_self) {
64280
0
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
64281
0
  }
64282
7.95k
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
64283
7.95k
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
64284
0
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
64285
0
  }
64286
64287
7.95k
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
64288
    // The whole point of this if-check is to detect an uninitialized *self.
64289
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
64290
#if !defined(__clang__) && defined(__GNUC__)
64291
#pragma GCC diagnostic push
64292
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
64293
#endif
64294
2.89k
    if (self->private_impl.magic != 0) {
64295
0
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
64296
0
    }
64297
#if !defined(__clang__) && defined(__GNUC__)
64298
#pragma GCC diagnostic pop
64299
#endif
64300
5.05k
  } else {
64301
5.05k
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
64302
0
      memset(self, 0, sizeof(*self));
64303
0
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
64304
5.05k
    } else {
64305
5.05k
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
64306
5.05k
    }
64307
5.05k
  }
64308
64309
7.95k
  {
64310
7.95k
    wuffs_base__status z = wuffs_adler32__hasher__initialize(
64311
7.95k
        &self->private_data.f_checksum, sizeof(self->private_data.f_checksum), WUFFS_VERSION, options);
64312
7.95k
    if (z.repr) {
64313
0
      return z;
64314
0
    }
64315
7.95k
  }
64316
7.95k
  {
64317
7.95k
    wuffs_base__status z = wuffs_adler32__hasher__initialize(
64318
7.95k
        &self->private_data.f_dict_id_hasher, sizeof(self->private_data.f_dict_id_hasher), WUFFS_VERSION, options);
64319
7.95k
    if (z.repr) {
64320
0
      return z;
64321
0
    }
64322
7.95k
  }
64323
7.95k
  {
64324
7.95k
    wuffs_base__status z = wuffs_deflate__decoder__initialize(
64325
7.95k
        &self->private_data.f_flate, sizeof(self->private_data.f_flate), WUFFS_VERSION, options);
64326
7.95k
    if (z.repr) {
64327
0
      return z;
64328
0
    }
64329
7.95k
  }
64330
7.95k
  self->private_impl.magic = WUFFS_BASE__MAGIC;
64331
7.95k
  self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name =
64332
7.95k
      wuffs_base__io_transformer__vtable_name;
64333
7.95k
  self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers =
64334
7.95k
      (const void*)(&wuffs_zlib__decoder__func_ptrs_for__wuffs_base__io_transformer);
64335
7.95k
  return wuffs_base__make_status(NULL);
64336
7.95k
}
64337
64338
wuffs_zlib__decoder*
64339
0
wuffs_zlib__decoder__alloc(void) {
64340
0
  wuffs_zlib__decoder* x =
64341
0
      (wuffs_zlib__decoder*)(calloc(1, sizeof(wuffs_zlib__decoder)));
64342
0
  if (!x) {
64343
0
    return NULL;
64344
0
  }
64345
0
  if (wuffs_zlib__decoder__initialize(
64346
0
      x, sizeof(wuffs_zlib__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
64347
0
    free(x);
64348
0
    return NULL;
64349
0
  }
64350
0
  return x;
64351
0
}
64352
64353
size_t
64354
0
sizeof__wuffs_zlib__decoder(void) {
64355
0
  return sizeof(wuffs_zlib__decoder);
64356
0
}
64357
64358
// ---------------- Function Implementations
64359
64360
// -------- func zlib.decoder.dictionary_id
64361
64362
WUFFS_BASE__GENERATED_C_CODE
64363
WUFFS_BASE__MAYBE_STATIC uint32_t
64364
wuffs_zlib__decoder__dictionary_id(
64365
0
    const wuffs_zlib__decoder* self) {
64366
0
  if (!self) {
64367
0
    return 0;
64368
0
  }
64369
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
64370
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
64371
0
    return 0;
64372
0
  }
64373
64374
0
  return self->private_impl.f_dict_id_want;
64375
0
}
64376
64377
// -------- func zlib.decoder.add_dictionary
64378
64379
WUFFS_BASE__GENERATED_C_CODE
64380
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
64381
wuffs_zlib__decoder__add_dictionary(
64382
    wuffs_zlib__decoder* self,
64383
0
    wuffs_base__slice_u8 a_dict) {
64384
0
  if (!self) {
64385
0
    return wuffs_base__make_empty_struct();
64386
0
  }
64387
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
64388
0
    return wuffs_base__make_empty_struct();
64389
0
  }
64390
64391
0
  if (self->private_impl.f_header_complete) {
64392
0
    self->private_impl.f_bad_call_sequence = true;
64393
0
  } else {
64394
0
    self->private_impl.f_dict_id_have = wuffs_adler32__hasher__update_u32(&self->private_data.f_dict_id_hasher, a_dict);
64395
0
    wuffs_deflate__decoder__add_history(&self->private_data.f_flate, a_dict);
64396
0
  }
64397
0
  self->private_impl.f_got_dictionary = true;
64398
0
  return wuffs_base__make_empty_struct();
64399
0
}
64400
64401
// -------- func zlib.decoder.get_quirk
64402
64403
WUFFS_BASE__GENERATED_C_CODE
64404
WUFFS_BASE__MAYBE_STATIC uint64_t
64405
wuffs_zlib__decoder__get_quirk(
64406
    const wuffs_zlib__decoder* self,
64407
0
    uint32_t a_key) {
64408
0
  if (!self) {
64409
0
    return 0;
64410
0
  }
64411
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
64412
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
64413
0
    return 0;
64414
0
  }
64415
64416
0
  uint32_t v_key = 0;
64417
64418
0
  if ((a_key == 1u) && self->private_impl.f_ignore_checksum) {
64419
0
    return 1u;
64420
0
  } else if (a_key >= 2056083456u) {
64421
0
    v_key = (a_key - 2056083456u);
64422
0
    if (v_key < 1u) {
64423
0
      if (self->private_impl.f_quirks[v_key]) {
64424
0
        return 1u;
64425
0
      }
64426
0
    }
64427
0
  }
64428
0
  return 0u;
64429
0
}
64430
64431
// -------- func zlib.decoder.set_quirk
64432
64433
WUFFS_BASE__GENERATED_C_CODE
64434
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
64435
wuffs_zlib__decoder__set_quirk(
64436
    wuffs_zlib__decoder* self,
64437
    uint32_t a_key,
64438
0
    uint64_t a_value) {
64439
0
  if (!self) {
64440
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
64441
0
  }
64442
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
64443
0
    return wuffs_base__make_status(
64444
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
64445
0
        ? wuffs_base__error__disabled_by_previous_error
64446
0
        : wuffs_base__error__initialize_not_called);
64447
0
  }
64448
64449
0
  if (self->private_impl.f_header_complete) {
64450
0
    self->private_impl.f_bad_call_sequence = true;
64451
0
    return wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
64452
0
  } else if (a_key == 1u) {
64453
0
    self->private_impl.f_ignore_checksum = (a_value > 0u);
64454
0
    return wuffs_base__make_status(NULL);
64455
0
  } else if (a_key >= 2056083456u) {
64456
0
    a_key -= 2056083456u;
64457
0
    if (a_key < 1u) {
64458
0
      self->private_impl.f_quirks[a_key] = (a_value > 0u);
64459
0
      return wuffs_base__make_status(NULL);
64460
0
    }
64461
0
  }
64462
0
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
64463
0
}
64464
64465
// -------- func zlib.decoder.dst_history_retain_length
64466
64467
WUFFS_BASE__GENERATED_C_CODE
64468
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
64469
wuffs_zlib__decoder__dst_history_retain_length(
64470
0
    const wuffs_zlib__decoder* self) {
64471
0
  if (!self) {
64472
0
    return wuffs_base__utility__make_optional_u63(false, 0u);
64473
0
  }
64474
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
64475
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
64476
0
    return wuffs_base__utility__make_optional_u63(false, 0u);
64477
0
  }
64478
64479
0
  return wuffs_base__utility__make_optional_u63(true, 0u);
64480
0
}
64481
64482
// -------- func zlib.decoder.workbuf_len
64483
64484
WUFFS_BASE__GENERATED_C_CODE
64485
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
64486
wuffs_zlib__decoder__workbuf_len(
64487
0
    const wuffs_zlib__decoder* self) {
64488
0
  if (!self) {
64489
0
    return wuffs_base__utility__empty_range_ii_u64();
64490
0
  }
64491
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
64492
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
64493
0
    return wuffs_base__utility__empty_range_ii_u64();
64494
0
  }
64495
64496
0
  return wuffs_base__utility__make_range_ii_u64(1u, 1u);
64497
0
}
64498
64499
// -------- func zlib.decoder.transform_io
64500
64501
WUFFS_BASE__GENERATED_C_CODE
64502
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
64503
wuffs_zlib__decoder__transform_io(
64504
    wuffs_zlib__decoder* self,
64505
    wuffs_base__io_buffer* a_dst,
64506
    wuffs_base__io_buffer* a_src,
64507
21.3k
    wuffs_base__slice_u8 a_workbuf) {
64508
21.3k
  if (!self) {
64509
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
64510
0
  }
64511
21.3k
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
64512
0
    return wuffs_base__make_status(
64513
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
64514
0
        ? wuffs_base__error__disabled_by_previous_error
64515
0
        : wuffs_base__error__initialize_not_called);
64516
0
  }
64517
21.3k
  if (!a_dst || !a_src) {
64518
0
    self->private_impl.magic = WUFFS_BASE__DISABLED;
64519
0
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
64520
0
  }
64521
21.3k
  if ((self->private_impl.active_coroutine != 0) &&
64522
21.3k
      (self->private_impl.active_coroutine != 1)) {
64523
0
    self->private_impl.magic = WUFFS_BASE__DISABLED;
64524
0
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
64525
0
  }
64526
21.3k
  self->private_impl.active_coroutine = 0;
64527
21.3k
  wuffs_base__status status = wuffs_base__make_status(NULL);
64528
64529
21.3k
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
64530
64531
21.3k
  uint32_t coro_susp_point = self->private_impl.p_transform_io;
64532
21.3k
  switch (coro_susp_point) {
64533
6.13k
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
64534
64535
21.3k
    while (true) {
64536
21.3k
      {
64537
21.3k
        wuffs_base__status t_0 = wuffs_zlib__decoder__do_transform_io(self, a_dst, a_src, a_workbuf);
64538
21.3k
        v_status = t_0;
64539
21.3k
      }
64540
21.3k
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
64541
187
        status = wuffs_base__make_status(wuffs_zlib__error__truncated_input);
64542
187
        goto exit;
64543
187
      }
64544
21.1k
      status = v_status;
64545
21.1k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
64546
15.2k
    }
64547
64548
2.18k
    ok:
64549
2.18k
    self->private_impl.p_transform_io = 0;
64550
2.18k
    goto exit;
64551
21.3k
  }
64552
64553
0
  goto suspend;
64554
17.2k
  suspend:
64555
17.2k
  self->private_impl.p_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
64556
17.2k
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
64557
64558
17.2k
  goto exit;
64559
21.3k
  exit:
64560
21.3k
  if (wuffs_base__status__is_error(&status)) {
64561
1.94k
    self->private_impl.magic = WUFFS_BASE__DISABLED;
64562
1.94k
  }
64563
21.3k
  return status;
64564
21.3k
}
64565
64566
// -------- func zlib.decoder.do_transform_io
64567
64568
WUFFS_BASE__GENERATED_C_CODE
64569
static wuffs_base__status
64570
wuffs_zlib__decoder__do_transform_io(
64571
    wuffs_zlib__decoder* self,
64572
    wuffs_base__io_buffer* a_dst,
64573
    wuffs_base__io_buffer* a_src,
64574
21.3k
    wuffs_base__slice_u8 a_workbuf) {
64575
21.3k
  wuffs_base__status status = wuffs_base__make_status(NULL);
64576
64577
21.3k
  uint16_t v_x = 0;
64578
21.3k
  uint32_t v_checksum_have = 0;
64579
21.3k
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
64580
21.3k
  uint32_t v_checksum_want = 0;
64581
21.3k
  uint64_t v_mark = 0;
64582
64583
21.3k
  uint8_t* iop_a_dst = NULL;
64584
21.3k
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
64585
21.3k
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
64586
21.3k
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
64587
21.3k
  if (a_dst && a_dst->data.ptr) {
64588
21.3k
    io0_a_dst = a_dst->data.ptr;
64589
21.3k
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
64590
21.3k
    iop_a_dst = io1_a_dst;
64591
21.3k
    io2_a_dst = io0_a_dst + a_dst->data.len;
64592
21.3k
    if (a_dst->meta.closed) {
64593
0
      io2_a_dst = iop_a_dst;
64594
0
    }
64595
21.3k
  }
64596
21.3k
  const uint8_t* iop_a_src = NULL;
64597
21.3k
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
64598
21.3k
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
64599
21.3k
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
64600
21.3k
  if (a_src && a_src->data.ptr) {
64601
21.3k
    io0_a_src = a_src->data.ptr;
64602
21.3k
    io1_a_src = io0_a_src + a_src->meta.ri;
64603
21.3k
    iop_a_src = io1_a_src;
64604
21.3k
    io2_a_src = io0_a_src + a_src->meta.wi;
64605
21.3k
  }
64606
64607
21.3k
  uint32_t coro_susp_point = self->private_impl.p_do_transform_io;
64608
21.3k
  if (coro_susp_point) {
64609
15.2k
    v_checksum_have = self->private_data.s_do_transform_io.v_checksum_have;
64610
15.2k
  }
64611
21.3k
  switch (coro_susp_point) {
64612
6.13k
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
64613
64614
6.13k
    if (self->private_impl.f_bad_call_sequence) {
64615
0
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
64616
0
      goto exit;
64617
6.13k
    } else if (self->private_impl.f_quirks[0u]) {
64618
6.13k
    } else if ( ! self->private_impl.f_want_dictionary) {
64619
6.13k
      {
64620
6.13k
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
64621
6.13k
        uint16_t t_0;
64622
6.13k
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
64623
5.60k
          t_0 = wuffs_base__peek_u16be__no_bounds_check(iop_a_src);
64624
5.60k
          iop_a_src += 2;
64625
5.60k
        } else {
64626
532
          self->private_data.s_do_transform_io.scratch = 0;
64627
1.43k
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
64628
1.51k
          while (true) {
64629
1.51k
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
64630
1.40k
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
64631
1.40k
              goto suspend;
64632
1.40k
            }
64633
108
            uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
64634
108
            uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu));
64635
108
            *scratch >>= 8;
64636
108
            *scratch <<= 8;
64637
108
            *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0);
64638
108
            if (num_bits_0 == 8) {
64639
29
              t_0 = ((uint16_t)(*scratch >> 48));
64640
29
              break;
64641
29
            }
64642
79
            num_bits_0 += 8u;
64643
79
            *scratch |= ((uint64_t)(num_bits_0));
64644
79
          }
64645
1.43k
        }
64646
5.62k
        v_x = t_0;
64647
5.62k
      }
64648
5.62k
      if (((uint16_t)(((uint16_t)(v_x >> 8u)) & 15u)) != 8u) {
64649
16
        status = wuffs_base__make_status(wuffs_zlib__error__bad_compression_method);
64650
16
        goto exit;
64651
16
      }
64652
5.61k
      if (((uint16_t)(v_x >> 12u)) > 7u) {
64653
2
        status = wuffs_base__make_status(wuffs_zlib__error__bad_compression_window_size);
64654
2
        goto exit;
64655
2
      }
64656
5.61k
      if (((uint16_t)(v_x % 31u)) != 0u) {
64657
13
        status = wuffs_base__make_status(wuffs_zlib__error__bad_parity_check);
64658
13
        goto exit;
64659
13
      }
64660
5.59k
      self->private_impl.f_want_dictionary = (((uint16_t)(v_x & 32u)) != 0u);
64661
5.59k
      if (self->private_impl.f_want_dictionary) {
64662
32
        self->private_impl.f_dict_id_have = 1u;
64663
32
        {
64664
32
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
64665
32
          uint32_t t_1;
64666
32
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
64667
9
            t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
64668
9
            iop_a_src += 4;
64669
23
          } else {
64670
23
            self->private_data.s_do_transform_io.scratch = 0;
64671
398
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
64672
454
            while (true) {
64673
454
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
64674
397
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
64675
397
                goto suspend;
64676
397
              }
64677
57
              uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
64678
57
              uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu));
64679
57
              *scratch >>= 8;
64680
57
              *scratch <<= 8;
64681
57
              *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1);
64682
57
              if (num_bits_1 == 24) {
64683
1
                t_1 = ((uint32_t)(*scratch >> 32));
64684
1
                break;
64685
1
              }
64686
56
              num_bits_1 += 8u;
64687
56
              *scratch |= ((uint64_t)(num_bits_1));
64688
56
            }
64689
398
          }
64690
10
          self->private_impl.f_dict_id_want = t_1;
64691
10
        }
64692
0
        status = wuffs_base__make_status(wuffs_zlib__note__dictionary_required);
64693
10
        goto ok;
64694
5.56k
      } else if (self->private_impl.f_got_dictionary) {
64695
0
        status = wuffs_base__make_status(wuffs_zlib__error__incorrect_dictionary);
64696
0
        goto exit;
64697
0
      }
64698
5.59k
    } else if (self->private_impl.f_dict_id_have != self->private_impl.f_dict_id_want) {
64699
0
      if (self->private_impl.f_got_dictionary) {
64700
0
        status = wuffs_base__make_status(wuffs_zlib__error__incorrect_dictionary);
64701
0
        goto exit;
64702
0
      }
64703
0
      status = wuffs_base__make_status(wuffs_zlib__note__dictionary_required);
64704
0
      goto ok;
64705
0
    }
64706
5.56k
    self->private_impl.f_header_complete = true;
64707
19.1k
    while (true) {
64708
19.1k
      v_mark = ((uint64_t)(iop_a_dst - io0_a_dst));
64709
19.1k
      {
64710
19.1k
        if (a_dst) {
64711
19.1k
          a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
64712
19.1k
        }
64713
19.1k
        if (a_src) {
64714
19.1k
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
64715
19.1k
        }
64716
19.1k
        wuffs_base__status t_2 = wuffs_deflate__decoder__transform_io(&self->private_data.f_flate, a_dst, a_src, a_workbuf);
64717
19.1k
        v_status = t_2;
64718
19.1k
        if (a_dst) {
64719
19.1k
          iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
64720
19.1k
        }
64721
19.1k
        if (a_src) {
64722
19.1k
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
64723
19.1k
        }
64724
19.1k
      }
64725
19.1k
      if ( ! self->private_impl.f_ignore_checksum &&  ! self->private_impl.f_quirks[0u]) {
64726
19.1k
        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));
64727
19.1k
      }
64728
19.1k
      if (wuffs_base__status__is_ok(&v_status)) {
64729
2.32k
        break;
64730
2.32k
      }
64731
16.7k
      status = v_status;
64732
16.7k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5);
64733
13.5k
    }
64734
2.32k
    if ( ! self->private_impl.f_quirks[0u]) {
64735
2.32k
      {
64736
2.32k
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
64737
2.32k
        uint32_t t_3;
64738
2.32k
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
64739
2.25k
          t_3 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
64740
2.25k
          iop_a_src += 4;
64741
2.25k
        } else {
64742
71
          self->private_data.s_do_transform_io.scratch = 0;
64743
484
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
64744
550
          while (true) {
64745
550
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
64746
482
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
64747
482
              goto suspend;
64748
482
            }
64749
68
            uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
64750
68
            uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFFu));
64751
68
            *scratch >>= 8;
64752
68
            *scratch <<= 8;
64753
68
            *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3);
64754
68
            if (num_bits_3 == 24) {
64755
2
              t_3 = ((uint32_t)(*scratch >> 32));
64756
2
              break;
64757
2
            }
64758
66
            num_bits_3 += 8u;
64759
66
            *scratch |= ((uint64_t)(num_bits_3));
64760
66
          }
64761
484
        }
64762
2.25k
        v_checksum_want = t_3;
64763
2.25k
      }
64764
2.25k
      if ( ! self->private_impl.f_ignore_checksum && (v_checksum_have != v_checksum_want)) {
64765
69
        status = wuffs_base__make_status(wuffs_zlib__error__bad_checksum);
64766
69
        goto exit;
64767
69
      }
64768
2.25k
    }
64769
64770
2.19k
    ok:
64771
2.19k
    self->private_impl.p_do_transform_io = 0;
64772
2.19k
    goto exit;
64773
21.3k
  }
64774
64775
0
  goto suspend;
64776
17.3k
  suspend:
64777
17.3k
  self->private_impl.p_do_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
64778
17.3k
  self->private_data.s_do_transform_io.v_checksum_have = v_checksum_have;
64779
64780
17.3k
  goto exit;
64781
21.3k
  exit:
64782
21.3k
  if (a_dst && a_dst->data.ptr) {
64783
21.3k
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
64784
21.3k
  }
64785
21.3k
  if (a_src && a_src->data.ptr) {
64786
21.3k
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
64787
21.3k
  }
64788
64789
21.3k
  return status;
64790
21.3k
}
64791
64792
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ZLIB)
64793
64794
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__PNG)
64795
64796
// ---------------- Status Codes Implementations
64797
64798
const char wuffs_png__error__bad_animation_sequence_number[] = "#png: bad animation sequence number";
64799
const char wuffs_png__error__bad_checksum[] = "#png: bad checksum";
64800
const char wuffs_png__error__bad_chunk[] = "#png: bad chunk";
64801
const char wuffs_png__error__bad_filter[] = "#png: bad filter";
64802
const char wuffs_png__error__bad_header[] = "#png: bad header";
64803
const char wuffs_png__error__bad_text_chunk_not_latin_1[] = "#png: bad text chunk (not Latin-1)";
64804
const char wuffs_png__error__missing_palette[] = "#png: missing palette";
64805
const char wuffs_png__error__truncated_input[] = "#png: truncated input";
64806
const char wuffs_png__error__unsupported_cgbi_extension[] = "#png: unsupported CgBI extension";
64807
const char wuffs_png__error__unsupported_png_compression_method[] = "#png: unsupported PNG compression method";
64808
const char wuffs_png__error__unsupported_png_file[] = "#png: unsupported PNG file";
64809
const char wuffs_png__error__internal_error_inconsistent_i_o[] = "#png: internal error: inconsistent I/O";
64810
const char wuffs_png__error__internal_error_inconsistent_chunk_type[] = "#png: internal error: inconsistent chunk type";
64811
const char wuffs_png__error__internal_error_inconsistent_workbuf_length[] = "#png: internal error: inconsistent workbuf length";
64812
const char wuffs_png__error__internal_error_zlib_decoder_did_not_exhaust_its_input[] = "#png: internal error: zlib decoder did not exhaust its input";
64813
64814
// ---------------- Private Consts
64815
64816
#define WUFFS_PNG__ANCILLARY_BIT 32u
64817
64818
static const uint8_t
64819
WUFFS_PNG__INTERLACING[8][6] WUFFS_BASE__POTENTIALLY_UNUSED = {
64820
  {
64821
    0u, 0u, 0u, 0u, 0u, 0u,
64822
  }, {
64823
    3u, 7u, 0u, 3u, 7u, 0u,
64824
  }, {
64825
    3u, 3u, 4u, 3u, 7u, 0u,
64826
  }, {
64827
    2u, 3u, 0u, 3u, 3u, 4u,
64828
  }, {
64829
    2u, 1u, 2u, 2u, 3u, 0u,
64830
  }, {
64831
    1u, 1u, 0u, 2u, 1u, 2u,
64832
  }, {
64833
    1u, 0u, 1u, 1u, 1u, 0u,
64834
  }, {
64835
    0u, 0u, 0u, 1u, 0u, 1u,
64836
  },
64837
};
64838
64839
static const uint8_t
64840
WUFFS_PNG__LOW_BIT_DEPTH_MULTIPLIERS[8] WUFFS_BASE__POTENTIALLY_UNUSED = {
64841
  0u, 255u, 85u, 0u, 17u, 0u, 0u, 0u,
64842
};
64843
64844
static const uint8_t
64845
WUFFS_PNG__LOW_BIT_DEPTH_NUM_PACKS[8] WUFFS_BASE__POTENTIALLY_UNUSED = {
64846
  0u, 8u, 4u, 0u, 2u, 0u, 0u, 0u,
64847
};
64848
64849
static const uint8_t
64850
WUFFS_PNG__NUM_CHANNELS[8] WUFFS_BASE__POTENTIALLY_UNUSED = {
64851
  1u, 0u, 3u, 1u, 2u, 0u, 4u, 0u,
64852
};
64853
64854
static const uint16_t
64855
WUFFS_PNG__LATIN_1[256] WUFFS_BASE__POTENTIALLY_UNUSED = {
64856
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
64857
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
64858
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
64859
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
64860
  32u, 33u, 34u, 35u, 36u, 37u, 38u, 39u,
64861
  40u, 41u, 42u, 43u, 44u, 45u, 46u, 47u,
64862
  48u, 49u, 50u, 51u, 52u, 53u, 54u, 55u,
64863
  56u, 57u, 58u, 59u, 60u, 61u, 62u, 63u,
64864
  64u, 65u, 66u, 67u, 68u, 69u, 70u, 71u,
64865
  72u, 73u, 74u, 75u, 76u, 77u, 78u, 79u,
64866
  80u, 81u, 82u, 83u, 84u, 85u, 86u, 87u,
64867
  88u, 89u, 90u, 91u, 92u, 93u, 94u, 95u,
64868
  96u, 97u, 98u, 99u, 100u, 101u, 102u, 103u,
64869
  104u, 105u, 106u, 107u, 108u, 109u, 110u, 111u,
64870
  112u, 113u, 114u, 115u, 116u, 117u, 118u, 119u,
64871
  120u, 121u, 122u, 123u, 124u, 125u, 126u, 0u,
64872
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
64873
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
64874
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
64875
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
64876
  0u, 41410u, 41666u, 41922u, 42178u, 42434u, 42690u, 42946u,
64877
  43202u, 43458u, 43714u, 43970u, 44226u, 44482u, 44738u, 44994u,
64878
  45250u, 45506u, 45762u, 46018u, 46274u, 46530u, 46786u, 47042u,
64879
  47298u, 47554u, 47810u, 48066u, 48322u, 48578u, 48834u, 49090u,
64880
  32963u, 33219u, 33475u, 33731u, 33987u, 34243u, 34499u, 34755u,
64881
  35011u, 35267u, 35523u, 35779u, 36035u, 36291u, 36547u, 36803u,
64882
  37059u, 37315u, 37571u, 37827u, 38083u, 38339u, 38595u, 38851u,
64883
  39107u, 39363u, 39619u, 39875u, 40131u, 40387u, 40643u, 40899u,
64884
  41155u, 41411u, 41667u, 41923u, 42179u, 42435u, 42691u, 42947u,
64885
  43203u, 43459u, 43715u, 43971u, 44227u, 44483u, 44739u, 44995u,
64886
  45251u, 45507u, 45763u, 46019u, 46275u, 46531u, 46787u, 47043u,
64887
  47299u, 47555u, 47811u, 48067u, 48323u, 48579u, 48835u, 49091u,
64888
};
64889
64890
// ---------------- Private Initializer Prototypes
64891
64892
// ---------------- Private Function Prototypes
64893
64894
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
64895
WUFFS_BASE__GENERATED_C_CODE
64896
static wuffs_base__empty_struct
64897
wuffs_png__decoder__filter_1_distance_4_arm_neon(
64898
    wuffs_png__decoder* self,
64899
    wuffs_base__slice_u8 a_curr);
64900
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
64901
64902
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
64903
WUFFS_BASE__GENERATED_C_CODE
64904
static wuffs_base__empty_struct
64905
wuffs_png__decoder__filter_3_distance_4_arm_neon(
64906
    wuffs_png__decoder* self,
64907
    wuffs_base__slice_u8 a_curr,
64908
    wuffs_base__slice_u8 a_prev);
64909
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
64910
64911
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
64912
WUFFS_BASE__GENERATED_C_CODE
64913
static wuffs_base__empty_struct
64914
wuffs_png__decoder__filter_4_distance_3_arm_neon(
64915
    wuffs_png__decoder* self,
64916
    wuffs_base__slice_u8 a_curr,
64917
    wuffs_base__slice_u8 a_prev);
64918
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
64919
64920
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
64921
WUFFS_BASE__GENERATED_C_CODE
64922
static wuffs_base__empty_struct
64923
wuffs_png__decoder__filter_4_distance_4_arm_neon(
64924
    wuffs_png__decoder* self,
64925
    wuffs_base__slice_u8 a_curr,
64926
    wuffs_base__slice_u8 a_prev);
64927
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
64928
64929
WUFFS_BASE__GENERATED_C_CODE
64930
static wuffs_base__empty_struct
64931
wuffs_png__decoder__filter_1(
64932
    wuffs_png__decoder* self,
64933
    wuffs_base__slice_u8 a_curr);
64934
64935
WUFFS_BASE__GENERATED_C_CODE
64936
static wuffs_base__empty_struct
64937
wuffs_png__decoder__filter_1__choosy_default(
64938
    wuffs_png__decoder* self,
64939
    wuffs_base__slice_u8 a_curr);
64940
64941
WUFFS_BASE__GENERATED_C_CODE
64942
static wuffs_base__empty_struct
64943
wuffs_png__decoder__filter_1_distance_3_fallback(
64944
    wuffs_png__decoder* self,
64945
    wuffs_base__slice_u8 a_curr);
64946
64947
WUFFS_BASE__GENERATED_C_CODE
64948
static wuffs_base__empty_struct
64949
wuffs_png__decoder__filter_1_distance_4_fallback(
64950
    wuffs_png__decoder* self,
64951
    wuffs_base__slice_u8 a_curr);
64952
64953
WUFFS_BASE__GENERATED_C_CODE
64954
static wuffs_base__empty_struct
64955
wuffs_png__decoder__filter_2(
64956
    wuffs_png__decoder* self,
64957
    wuffs_base__slice_u8 a_curr,
64958
    wuffs_base__slice_u8 a_prev);
64959
64960
WUFFS_BASE__GENERATED_C_CODE
64961
static wuffs_base__empty_struct
64962
wuffs_png__decoder__filter_3(
64963
    wuffs_png__decoder* self,
64964
    wuffs_base__slice_u8 a_curr,
64965
    wuffs_base__slice_u8 a_prev);
64966
64967
WUFFS_BASE__GENERATED_C_CODE
64968
static wuffs_base__empty_struct
64969
wuffs_png__decoder__filter_3__choosy_default(
64970
    wuffs_png__decoder* self,
64971
    wuffs_base__slice_u8 a_curr,
64972
    wuffs_base__slice_u8 a_prev);
64973
64974
WUFFS_BASE__GENERATED_C_CODE
64975
static wuffs_base__empty_struct
64976
wuffs_png__decoder__filter_3_distance_3_fallback(
64977
    wuffs_png__decoder* self,
64978
    wuffs_base__slice_u8 a_curr,
64979
    wuffs_base__slice_u8 a_prev);
64980
64981
WUFFS_BASE__GENERATED_C_CODE
64982
static wuffs_base__empty_struct
64983
wuffs_png__decoder__filter_3_distance_4_fallback(
64984
    wuffs_png__decoder* self,
64985
    wuffs_base__slice_u8 a_curr,
64986
    wuffs_base__slice_u8 a_prev);
64987
64988
WUFFS_BASE__GENERATED_C_CODE
64989
static wuffs_base__empty_struct
64990
wuffs_png__decoder__filter_4(
64991
    wuffs_png__decoder* self,
64992
    wuffs_base__slice_u8 a_curr,
64993
    wuffs_base__slice_u8 a_prev);
64994
64995
WUFFS_BASE__GENERATED_C_CODE
64996
static wuffs_base__empty_struct
64997
wuffs_png__decoder__filter_4__choosy_default(
64998
    wuffs_png__decoder* self,
64999
    wuffs_base__slice_u8 a_curr,
65000
    wuffs_base__slice_u8 a_prev);
65001
65002
WUFFS_BASE__GENERATED_C_CODE
65003
static wuffs_base__empty_struct
65004
wuffs_png__decoder__filter_4_distance_3_fallback(
65005
    wuffs_png__decoder* self,
65006
    wuffs_base__slice_u8 a_curr,
65007
    wuffs_base__slice_u8 a_prev);
65008
65009
WUFFS_BASE__GENERATED_C_CODE
65010
static wuffs_base__empty_struct
65011
wuffs_png__decoder__filter_4_distance_4_fallback(
65012
    wuffs_png__decoder* self,
65013
    wuffs_base__slice_u8 a_curr,
65014
    wuffs_base__slice_u8 a_prev);
65015
65016
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
65017
WUFFS_BASE__GENERATED_C_CODE
65018
static wuffs_base__empty_struct
65019
wuffs_png__decoder__filter_1_distance_4_x86_sse42(
65020
    wuffs_png__decoder* self,
65021
    wuffs_base__slice_u8 a_curr);
65022
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
65023
65024
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
65025
WUFFS_BASE__GENERATED_C_CODE
65026
static wuffs_base__empty_struct
65027
wuffs_png__decoder__filter_3_distance_4_x86_sse42(
65028
    wuffs_png__decoder* self,
65029
    wuffs_base__slice_u8 a_curr,
65030
    wuffs_base__slice_u8 a_prev);
65031
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
65032
65033
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
65034
WUFFS_BASE__GENERATED_C_CODE
65035
static wuffs_base__empty_struct
65036
wuffs_png__decoder__filter_4_distance_3_x86_sse42(
65037
    wuffs_png__decoder* self,
65038
    wuffs_base__slice_u8 a_curr,
65039
    wuffs_base__slice_u8 a_prev);
65040
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
65041
65042
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
65043
WUFFS_BASE__GENERATED_C_CODE
65044
static wuffs_base__empty_struct
65045
wuffs_png__decoder__filter_4_distance_4_x86_sse42(
65046
    wuffs_png__decoder* self,
65047
    wuffs_base__slice_u8 a_curr,
65048
    wuffs_base__slice_u8 a_prev);
65049
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
65050
65051
WUFFS_BASE__GENERATED_C_CODE
65052
static wuffs_base__status
65053
wuffs_png__decoder__do_decode_image_config(
65054
    wuffs_png__decoder* self,
65055
    wuffs_base__image_config* a_dst,
65056
    wuffs_base__io_buffer* a_src);
65057
65058
WUFFS_BASE__GENERATED_C_CODE
65059
static wuffs_base__status
65060
wuffs_png__decoder__decode_ihdr(
65061
    wuffs_png__decoder* self,
65062
    wuffs_base__io_buffer* a_src);
65063
65064
WUFFS_BASE__GENERATED_C_CODE
65065
static wuffs_base__empty_struct
65066
wuffs_png__decoder__assign_filter_distance(
65067
    wuffs_png__decoder* self);
65068
65069
WUFFS_BASE__GENERATED_C_CODE
65070
static uint64_t
65071
wuffs_png__decoder__calculate_bytes_per_row(
65072
    const wuffs_png__decoder* self,
65073
    uint32_t a_width);
65074
65075
WUFFS_BASE__GENERATED_C_CODE
65076
static wuffs_base__empty_struct
65077
wuffs_png__decoder__choose_filter_implementations(
65078
    wuffs_png__decoder* self);
65079
65080
WUFFS_BASE__GENERATED_C_CODE
65081
static wuffs_base__status
65082
wuffs_png__decoder__decode_other_chunk(
65083
    wuffs_png__decoder* self,
65084
    wuffs_base__io_buffer* a_src,
65085
    bool a_framy);
65086
65087
WUFFS_BASE__GENERATED_C_CODE
65088
static wuffs_base__status
65089
wuffs_png__decoder__decode_actl(
65090
    wuffs_png__decoder* self,
65091
    wuffs_base__io_buffer* a_src);
65092
65093
WUFFS_BASE__GENERATED_C_CODE
65094
static wuffs_base__status
65095
wuffs_png__decoder__decode_chrm(
65096
    wuffs_png__decoder* self,
65097
    wuffs_base__io_buffer* a_src);
65098
65099
WUFFS_BASE__GENERATED_C_CODE
65100
static wuffs_base__status
65101
wuffs_png__decoder__decode_exif(
65102
    wuffs_png__decoder* self,
65103
    wuffs_base__io_buffer* a_src);
65104
65105
WUFFS_BASE__GENERATED_C_CODE
65106
static wuffs_base__status
65107
wuffs_png__decoder__decode_fctl(
65108
    wuffs_png__decoder* self,
65109
    wuffs_base__io_buffer* a_src);
65110
65111
WUFFS_BASE__GENERATED_C_CODE
65112
static wuffs_base__status
65113
wuffs_png__decoder__decode_gama(
65114
    wuffs_png__decoder* self,
65115
    wuffs_base__io_buffer* a_src);
65116
65117
WUFFS_BASE__GENERATED_C_CODE
65118
static wuffs_base__status
65119
wuffs_png__decoder__decode_iccp(
65120
    wuffs_png__decoder* self,
65121
    wuffs_base__io_buffer* a_src);
65122
65123
WUFFS_BASE__GENERATED_C_CODE
65124
static wuffs_base__status
65125
wuffs_png__decoder__decode_plte(
65126
    wuffs_png__decoder* self,
65127
    wuffs_base__io_buffer* a_src);
65128
65129
WUFFS_BASE__GENERATED_C_CODE
65130
static wuffs_base__status
65131
wuffs_png__decoder__decode_srgb(
65132
    wuffs_png__decoder* self,
65133
    wuffs_base__io_buffer* a_src);
65134
65135
WUFFS_BASE__GENERATED_C_CODE
65136
static wuffs_base__status
65137
wuffs_png__decoder__decode_trns(
65138
    wuffs_png__decoder* self,
65139
    wuffs_base__io_buffer* a_src);
65140
65141
WUFFS_BASE__GENERATED_C_CODE
65142
static wuffs_base__status
65143
wuffs_png__decoder__do_decode_frame_config(
65144
    wuffs_png__decoder* self,
65145
    wuffs_base__frame_config* a_dst,
65146
    wuffs_base__io_buffer* a_src);
65147
65148
WUFFS_BASE__GENERATED_C_CODE
65149
static wuffs_base__status
65150
wuffs_png__decoder__skip_frame(
65151
    wuffs_png__decoder* self,
65152
    wuffs_base__io_buffer* a_src);
65153
65154
WUFFS_BASE__GENERATED_C_CODE
65155
static wuffs_base__status
65156
wuffs_png__decoder__do_decode_frame(
65157
    wuffs_png__decoder* self,
65158
    wuffs_base__pixel_buffer* a_dst,
65159
    wuffs_base__io_buffer* a_src,
65160
    wuffs_base__pixel_blend a_blend,
65161
    wuffs_base__slice_u8 a_workbuf,
65162
    wuffs_base__decode_frame_options* a_opts);
65163
65164
WUFFS_BASE__GENERATED_C_CODE
65165
static wuffs_base__status
65166
wuffs_png__decoder__decode_pass(
65167
    wuffs_png__decoder* self,
65168
    wuffs_base__io_buffer* a_src,
65169
    wuffs_base__slice_u8 a_workbuf);
65170
65171
WUFFS_BASE__GENERATED_C_CODE
65172
static wuffs_base__status
65173
wuffs_png__decoder__do_tell_me_more(
65174
    wuffs_png__decoder* self,
65175
    wuffs_base__io_buffer* a_dst,
65176
    wuffs_base__more_information* a_minfo,
65177
    wuffs_base__io_buffer* a_src);
65178
65179
WUFFS_BASE__GENERATED_C_CODE
65180
static wuffs_base__status
65181
wuffs_png__decoder__filter_and_swizzle(
65182
    wuffs_png__decoder* self,
65183
    wuffs_base__pixel_buffer* a_dst,
65184
    wuffs_base__slice_u8 a_workbuf);
65185
65186
WUFFS_BASE__GENERATED_C_CODE
65187
static wuffs_base__status
65188
wuffs_png__decoder__filter_and_swizzle__choosy_default(
65189
    wuffs_png__decoder* self,
65190
    wuffs_base__pixel_buffer* a_dst,
65191
    wuffs_base__slice_u8 a_workbuf);
65192
65193
WUFFS_BASE__GENERATED_C_CODE
65194
static wuffs_base__status
65195
wuffs_png__decoder__filter_and_swizzle_tricky(
65196
    wuffs_png__decoder* self,
65197
    wuffs_base__pixel_buffer* a_dst,
65198
    wuffs_base__slice_u8 a_workbuf);
65199
65200
// ---------------- VTables
65201
65202
const wuffs_base__image_decoder__func_ptrs
65203
wuffs_png__decoder__func_ptrs_for__wuffs_base__image_decoder = {
65204
  (wuffs_base__status(*)(void*,
65205
      wuffs_base__pixel_buffer*,
65206
      wuffs_base__io_buffer*,
65207
      wuffs_base__pixel_blend,
65208
      wuffs_base__slice_u8,
65209
      wuffs_base__decode_frame_options*))(&wuffs_png__decoder__decode_frame),
65210
  (wuffs_base__status(*)(void*,
65211
      wuffs_base__frame_config*,
65212
      wuffs_base__io_buffer*))(&wuffs_png__decoder__decode_frame_config),
65213
  (wuffs_base__status(*)(void*,
65214
      wuffs_base__image_config*,
65215
      wuffs_base__io_buffer*))(&wuffs_png__decoder__decode_image_config),
65216
  (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_png__decoder__frame_dirty_rect),
65217
  (uint64_t(*)(const void*,
65218
      uint32_t))(&wuffs_png__decoder__get_quirk),
65219
  (uint32_t(*)(const void*))(&wuffs_png__decoder__num_animation_loops),
65220
  (uint64_t(*)(const void*))(&wuffs_png__decoder__num_decoded_frame_configs),
65221
  (uint64_t(*)(const void*))(&wuffs_png__decoder__num_decoded_frames),
65222
  (wuffs_base__status(*)(void*,
65223
      uint64_t,
65224
      uint64_t))(&wuffs_png__decoder__restart_frame),
65225
  (wuffs_base__status(*)(void*,
65226
      uint32_t,
65227
      uint64_t))(&wuffs_png__decoder__set_quirk),
65228
  (wuffs_base__empty_struct(*)(void*,
65229
      uint32_t,
65230
      bool))(&wuffs_png__decoder__set_report_metadata),
65231
  (wuffs_base__status(*)(void*,
65232
      wuffs_base__io_buffer*,
65233
      wuffs_base__more_information*,
65234
      wuffs_base__io_buffer*))(&wuffs_png__decoder__tell_me_more),
65235
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_png__decoder__workbuf_len),
65236
};
65237
65238
// ---------------- Initializer Implementations
65239
65240
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
65241
wuffs_png__decoder__initialize(
65242
    wuffs_png__decoder* self,
65243
    size_t sizeof_star_self,
65244
    uint64_t wuffs_version,
65245
5.73k
    uint32_t options){
65246
5.73k
  if (!self) {
65247
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
65248
0
  }
65249
5.73k
  if (sizeof(*self) != sizeof_star_self) {
65250
0
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
65251
0
  }
65252
5.73k
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
65253
5.73k
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
65254
0
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
65255
0
  }
65256
65257
5.73k
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
65258
    // The whole point of this if-check is to detect an uninitialized *self.
65259
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
65260
#if !defined(__clang__) && defined(__GNUC__)
65261
#pragma GCC diagnostic push
65262
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
65263
#endif
65264
0
    if (self->private_impl.magic != 0) {
65265
0
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
65266
0
    }
65267
#if !defined(__clang__) && defined(__GNUC__)
65268
#pragma GCC diagnostic pop
65269
#endif
65270
5.73k
  } else {
65271
5.73k
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
65272
2.89k
      memset(self, 0, sizeof(*self));
65273
2.89k
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
65274
2.89k
    } else {
65275
2.83k
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
65276
2.83k
    }
65277
5.73k
  }
65278
65279
5.73k
  self->private_impl.choosy_filter_1 = &wuffs_png__decoder__filter_1__choosy_default;
65280
5.73k
  self->private_impl.choosy_filter_3 = &wuffs_png__decoder__filter_3__choosy_default;
65281
5.73k
  self->private_impl.choosy_filter_4 = &wuffs_png__decoder__filter_4__choosy_default;
65282
5.73k
  self->private_impl.choosy_filter_and_swizzle = &wuffs_png__decoder__filter_and_swizzle__choosy_default;
65283
65284
5.73k
  {
65285
5.73k
    wuffs_base__status z = wuffs_crc32__ieee_hasher__initialize(
65286
5.73k
        &self->private_data.f_crc32, sizeof(self->private_data.f_crc32), WUFFS_VERSION, options);
65287
5.73k
    if (z.repr) {
65288
0
      return z;
65289
0
    }
65290
5.73k
  }
65291
5.73k
  {
65292
5.73k
    wuffs_base__status z = wuffs_zlib__decoder__initialize(
65293
5.73k
        &self->private_data.f_zlib, sizeof(self->private_data.f_zlib), WUFFS_VERSION, options);
65294
5.73k
    if (z.repr) {
65295
0
      return z;
65296
0
    }
65297
5.73k
  }
65298
5.73k
  self->private_impl.magic = WUFFS_BASE__MAGIC;
65299
5.73k
  self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name =
65300
5.73k
      wuffs_base__image_decoder__vtable_name;
65301
5.73k
  self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers =
65302
5.73k
      (const void*)(&wuffs_png__decoder__func_ptrs_for__wuffs_base__image_decoder);
65303
5.73k
  return wuffs_base__make_status(NULL);
65304
5.73k
}
65305
65306
wuffs_png__decoder*
65307
0
wuffs_png__decoder__alloc(void) {
65308
0
  wuffs_png__decoder* x =
65309
0
      (wuffs_png__decoder*)(calloc(1, sizeof(wuffs_png__decoder)));
65310
0
  if (!x) {
65311
0
    return NULL;
65312
0
  }
65313
0
  if (wuffs_png__decoder__initialize(
65314
0
      x, sizeof(wuffs_png__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
65315
0
    free(x);
65316
0
    return NULL;
65317
0
  }
65318
0
  return x;
65319
0
}
65320
65321
size_t
65322
0
sizeof__wuffs_png__decoder(void) {
65323
0
  return sizeof(wuffs_png__decoder);
65324
0
}
65325
65326
// ---------------- Function Implementations
65327
65328
// โ€ผ WUFFS MULTI-FILE SECTION +arm_neon
65329
// -------- func png.decoder.filter_1_distance_4_arm_neon
65330
65331
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
65332
WUFFS_BASE__GENERATED_C_CODE
65333
static wuffs_base__empty_struct
65334
wuffs_png__decoder__filter_1_distance_4_arm_neon(
65335
    wuffs_png__decoder* self,
65336
    wuffs_base__slice_u8 a_curr) {
65337
  wuffs_base__slice_u8 v_curr = {0};
65338
  uint8x8_t v_fa = {0};
65339
  uint8x8_t v_fx = {0};
65340
65341
  {
65342
    wuffs_base__slice_u8 i_slice_curr = a_curr;
65343
    v_curr.ptr = i_slice_curr.ptr;
65344
    v_curr.len = 4;
65345
    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));
65346
    while (v_curr.ptr < i_end0_curr) {
65347
      v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
65348
      v_fx = vadd_u8(v_fx, v_fa);
65349
      wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u));
65350
      v_fa = v_fx;
65351
      v_curr.ptr += 4;
65352
      v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
65353
      v_fx = vadd_u8(v_fx, v_fa);
65354
      wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u));
65355
      v_fa = v_fx;
65356
      v_curr.ptr += 4;
65357
    }
65358
    v_curr.len = 4;
65359
    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));
65360
    while (v_curr.ptr < i_end1_curr) {
65361
      v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
65362
      v_fx = vadd_u8(v_fx, v_fa);
65363
      wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u));
65364
      v_fa = v_fx;
65365
      v_curr.ptr += 4;
65366
    }
65367
    v_curr.len = 0;
65368
  }
65369
  return wuffs_base__make_empty_struct();
65370
}
65371
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
65372
// โ€ผ WUFFS MULTI-FILE SECTION -arm_neon
65373
65374
// โ€ผ WUFFS MULTI-FILE SECTION +arm_neon
65375
// -------- func png.decoder.filter_3_distance_4_arm_neon
65376
65377
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
65378
WUFFS_BASE__GENERATED_C_CODE
65379
static wuffs_base__empty_struct
65380
wuffs_png__decoder__filter_3_distance_4_arm_neon(
65381
    wuffs_png__decoder* self,
65382
    wuffs_base__slice_u8 a_curr,
65383
    wuffs_base__slice_u8 a_prev) {
65384
  wuffs_base__slice_u8 v_curr = {0};
65385
  wuffs_base__slice_u8 v_prev = {0};
65386
  uint8x8_t v_fa = {0};
65387
  uint8x8_t v_fb = {0};
65388
  uint8x8_t v_fx = {0};
65389
65390
  if (((uint64_t)(a_prev.len)) == 0u) {
65391
    {
65392
      wuffs_base__slice_u8 i_slice_curr = a_curr;
65393
      v_curr.ptr = i_slice_curr.ptr;
65394
      v_curr.len = 4;
65395
      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));
65396
      while (v_curr.ptr < i_end0_curr) {
65397
        v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
65398
        v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb));
65399
        wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u));
65400
        v_fa = v_fx;
65401
        v_curr.ptr += 4;
65402
        v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
65403
        v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb));
65404
        wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u));
65405
        v_fa = v_fx;
65406
        v_curr.ptr += 4;
65407
      }
65408
      v_curr.len = 4;
65409
      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));
65410
      while (v_curr.ptr < i_end1_curr) {
65411
        v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
65412
        v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb));
65413
        wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u));
65414
        v_fa = v_fx;
65415
        v_curr.ptr += 4;
65416
      }
65417
      v_curr.len = 0;
65418
    }
65419
  } else {
65420
    {
65421
      wuffs_base__slice_u8 i_slice_curr = a_curr;
65422
      v_curr.ptr = i_slice_curr.ptr;
65423
      wuffs_base__slice_u8 i_slice_prev = a_prev;
65424
      v_prev.ptr = i_slice_prev.ptr;
65425
      i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len)));
65426
      v_curr.len = 4;
65427
      v_prev.len = 4;
65428
      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));
65429
      while (v_curr.ptr < i_end0_curr) {
65430
        v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
65431
        v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
65432
        v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb));
65433
        wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u));
65434
        v_fa = v_fx;
65435
        v_curr.ptr += 4;
65436
        v_prev.ptr += 4;
65437
        v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
65438
        v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
65439
        v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb));
65440
        wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u));
65441
        v_fa = v_fx;
65442
        v_curr.ptr += 4;
65443
        v_prev.ptr += 4;
65444
      }
65445
      v_curr.len = 4;
65446
      v_prev.len = 4;
65447
      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));
65448
      while (v_curr.ptr < i_end1_curr) {
65449
        v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
65450
        v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
65451
        v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb));
65452
        wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u));
65453
        v_fa = v_fx;
65454
        v_curr.ptr += 4;
65455
        v_prev.ptr += 4;
65456
      }
65457
      v_curr.len = 0;
65458
      v_prev.len = 0;
65459
    }
65460
  }
65461
  return wuffs_base__make_empty_struct();
65462
}
65463
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
65464
// โ€ผ WUFFS MULTI-FILE SECTION -arm_neon
65465
65466
// โ€ผ WUFFS MULTI-FILE SECTION +arm_neon
65467
// -------- func png.decoder.filter_4_distance_3_arm_neon
65468
65469
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
65470
WUFFS_BASE__GENERATED_C_CODE
65471
static wuffs_base__empty_struct
65472
wuffs_png__decoder__filter_4_distance_3_arm_neon(
65473
    wuffs_png__decoder* self,
65474
    wuffs_base__slice_u8 a_curr,
65475
    wuffs_base__slice_u8 a_prev) {
65476
  wuffs_base__slice_u8 v_curr = {0};
65477
  wuffs_base__slice_u8 v_prev = {0};
65478
  uint8x8_t v_fa = {0};
65479
  uint8x8_t v_fb = {0};
65480
  uint8x8_t v_fc = {0};
65481
  uint8x8_t v_fx = {0};
65482
  uint16x8_t v_fafb = {0};
65483
  uint16x8_t v_fcfc = {0};
65484
  uint16x8_t v_pa = {0};
65485
  uint16x8_t v_pb = {0};
65486
  uint16x8_t v_pc = {0};
65487
  uint16x8_t v_cmpab = {0};
65488
  uint16x8_t v_cmpac = {0};
65489
  uint8x8_t v_picka = {0};
65490
  uint8x8_t v_pickb = {0};
65491
65492
  {
65493
    wuffs_base__slice_u8 i_slice_curr = a_curr;
65494
    v_curr.ptr = i_slice_curr.ptr;
65495
    wuffs_base__slice_u8 i_slice_prev = a_prev;
65496
    v_prev.ptr = i_slice_prev.ptr;
65497
    i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len)));
65498
    v_curr.len = 4;
65499
    v_prev.len = 4;
65500
    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));
65501
    while (v_curr.ptr < i_end0_curr) {
65502
      v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
65503
      v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
65504
      v_fafb = vaddl_u8(v_fa, v_fb);
65505
      v_fcfc = vaddl_u8(v_fc, v_fc);
65506
      v_pa = vabdl_u8(v_fb, v_fc);
65507
      v_pb = vabdl_u8(v_fa, v_fc);
65508
      v_pc = vabdq_u16(v_fafb, v_fcfc);
65509
      v_cmpab = vcleq_u16(v_pa, v_pb);
65510
      v_cmpac = vcleq_u16(v_pa, v_pc);
65511
      v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac));
65512
      v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc));
65513
      v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc)));
65514
      wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u));
65515
      v_fc = v_fb;
65516
      v_fa = v_fx;
65517
      v_curr.ptr += 3;
65518
      v_prev.ptr += 3;
65519
      v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
65520
      v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
65521
      v_fafb = vaddl_u8(v_fa, v_fb);
65522
      v_fcfc = vaddl_u8(v_fc, v_fc);
65523
      v_pa = vabdl_u8(v_fb, v_fc);
65524
      v_pb = vabdl_u8(v_fa, v_fc);
65525
      v_pc = vabdq_u16(v_fafb, v_fcfc);
65526
      v_cmpab = vcleq_u16(v_pa, v_pb);
65527
      v_cmpac = vcleq_u16(v_pa, v_pc);
65528
      v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac));
65529
      v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc));
65530
      v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc)));
65531
      wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u));
65532
      v_fc = v_fb;
65533
      v_fa = v_fx;
65534
      v_curr.ptr += 3;
65535
      v_prev.ptr += 3;
65536
    }
65537
    v_curr.len = 4;
65538
    v_prev.len = 4;
65539
    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));
65540
    while (v_curr.ptr < i_end1_curr) {
65541
      v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
65542
      v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
65543
      v_fafb = vaddl_u8(v_fa, v_fb);
65544
      v_fcfc = vaddl_u8(v_fc, v_fc);
65545
      v_pa = vabdl_u8(v_fb, v_fc);
65546
      v_pb = vabdl_u8(v_fa, v_fc);
65547
      v_pc = vabdq_u16(v_fafb, v_fcfc);
65548
      v_cmpab = vcleq_u16(v_pa, v_pb);
65549
      v_cmpac = vcleq_u16(v_pa, v_pc);
65550
      v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac));
65551
      v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc));
65552
      v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc)));
65553
      wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u));
65554
      v_fc = v_fb;
65555
      v_fa = v_fx;
65556
      v_curr.ptr += 3;
65557
      v_prev.ptr += 3;
65558
    }
65559
    v_curr.len = 3;
65560
    v_prev.len = 3;
65561
    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));
65562
    while (v_curr.ptr < i_end2_curr) {
65563
      v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u24le__no_bounds_check(v_prev.ptr)));
65564
      v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u24le__no_bounds_check(v_curr.ptr)));
65565
      v_fafb = vaddl_u8(v_fa, v_fb);
65566
      v_fcfc = vaddl_u8(v_fc, v_fc);
65567
      v_pa = vabdl_u8(v_fb, v_fc);
65568
      v_pb = vabdl_u8(v_fa, v_fc);
65569
      v_pc = vabdq_u16(v_fafb, v_fcfc);
65570
      v_cmpab = vcleq_u16(v_pa, v_pb);
65571
      v_cmpac = vcleq_u16(v_pa, v_pc);
65572
      v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac));
65573
      v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc));
65574
      v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc)));
65575
      wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u));
65576
      v_curr.ptr += 3;
65577
      v_prev.ptr += 3;
65578
    }
65579
    v_curr.len = 0;
65580
    v_prev.len = 0;
65581
  }
65582
  return wuffs_base__make_empty_struct();
65583
}
65584
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
65585
// โ€ผ WUFFS MULTI-FILE SECTION -arm_neon
65586
65587
// โ€ผ WUFFS MULTI-FILE SECTION +arm_neon
65588
// -------- func png.decoder.filter_4_distance_4_arm_neon
65589
65590
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
65591
WUFFS_BASE__GENERATED_C_CODE
65592
static wuffs_base__empty_struct
65593
wuffs_png__decoder__filter_4_distance_4_arm_neon(
65594
    wuffs_png__decoder* self,
65595
    wuffs_base__slice_u8 a_curr,
65596
    wuffs_base__slice_u8 a_prev) {
65597
  wuffs_base__slice_u8 v_curr = {0};
65598
  wuffs_base__slice_u8 v_prev = {0};
65599
  uint8x8_t v_fa = {0};
65600
  uint8x8_t v_fb = {0};
65601
  uint8x8_t v_fc = {0};
65602
  uint8x8_t v_fx = {0};
65603
  uint16x8_t v_fafb = {0};
65604
  uint16x8_t v_fcfc = {0};
65605
  uint16x8_t v_pa = {0};
65606
  uint16x8_t v_pb = {0};
65607
  uint16x8_t v_pc = {0};
65608
  uint16x8_t v_cmpab = {0};
65609
  uint16x8_t v_cmpac = {0};
65610
  uint8x8_t v_picka = {0};
65611
  uint8x8_t v_pickb = {0};
65612
65613
  {
65614
    wuffs_base__slice_u8 i_slice_curr = a_curr;
65615
    v_curr.ptr = i_slice_curr.ptr;
65616
    wuffs_base__slice_u8 i_slice_prev = a_prev;
65617
    v_prev.ptr = i_slice_prev.ptr;
65618
    i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len)));
65619
    v_curr.len = 4;
65620
    v_prev.len = 4;
65621
    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));
65622
    while (v_curr.ptr < i_end0_curr) {
65623
      v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
65624
      v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
65625
      v_fafb = vaddl_u8(v_fa, v_fb);
65626
      v_fcfc = vaddl_u8(v_fc, v_fc);
65627
      v_pa = vabdl_u8(v_fb, v_fc);
65628
      v_pb = vabdl_u8(v_fa, v_fc);
65629
      v_pc = vabdq_u16(v_fafb, v_fcfc);
65630
      v_cmpab = vcleq_u16(v_pa, v_pb);
65631
      v_cmpac = vcleq_u16(v_pa, v_pc);
65632
      v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac));
65633
      v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc));
65634
      v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc)));
65635
      wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u));
65636
      v_fc = v_fb;
65637
      v_fa = v_fx;
65638
      v_curr.ptr += 4;
65639
      v_prev.ptr += 4;
65640
      v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
65641
      v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
65642
      v_fafb = vaddl_u8(v_fa, v_fb);
65643
      v_fcfc = vaddl_u8(v_fc, v_fc);
65644
      v_pa = vabdl_u8(v_fb, v_fc);
65645
      v_pb = vabdl_u8(v_fa, v_fc);
65646
      v_pc = vabdq_u16(v_fafb, v_fcfc);
65647
      v_cmpab = vcleq_u16(v_pa, v_pb);
65648
      v_cmpac = vcleq_u16(v_pa, v_pc);
65649
      v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac));
65650
      v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc));
65651
      v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc)));
65652
      wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u));
65653
      v_fc = v_fb;
65654
      v_fa = v_fx;
65655
      v_curr.ptr += 4;
65656
      v_prev.ptr += 4;
65657
    }
65658
    v_curr.len = 4;
65659
    v_prev.len = 4;
65660
    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));
65661
    while (v_curr.ptr < i_end1_curr) {
65662
      v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
65663
      v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
65664
      v_fafb = vaddl_u8(v_fa, v_fb);
65665
      v_fcfc = vaddl_u8(v_fc, v_fc);
65666
      v_pa = vabdl_u8(v_fb, v_fc);
65667
      v_pb = vabdl_u8(v_fa, v_fc);
65668
      v_pc = vabdq_u16(v_fafb, v_fcfc);
65669
      v_cmpab = vcleq_u16(v_pa, v_pb);
65670
      v_cmpac = vcleq_u16(v_pa, v_pc);
65671
      v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac));
65672
      v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc));
65673
      v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc)));
65674
      wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u));
65675
      v_fc = v_fb;
65676
      v_fa = v_fx;
65677
      v_curr.ptr += 4;
65678
      v_prev.ptr += 4;
65679
    }
65680
    v_curr.len = 0;
65681
    v_prev.len = 0;
65682
  }
65683
  return wuffs_base__make_empty_struct();
65684
}
65685
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
65686
// โ€ผ WUFFS MULTI-FILE SECTION -arm_neon
65687
65688
// -------- func png.decoder.filter_1
65689
65690
WUFFS_BASE__GENERATED_C_CODE
65691
static wuffs_base__empty_struct
65692
wuffs_png__decoder__filter_1(
65693
    wuffs_png__decoder* self,
65694
52.3k
    wuffs_base__slice_u8 a_curr) {
65695
52.3k
  return (*self->private_impl.choosy_filter_1)(self, a_curr);
65696
52.3k
}
65697
65698
WUFFS_BASE__GENERATED_C_CODE
65699
static wuffs_base__empty_struct
65700
wuffs_png__decoder__filter_1__choosy_default(
65701
    wuffs_png__decoder* self,
65702
4.52k
    wuffs_base__slice_u8 a_curr) {
65703
4.52k
  uint64_t v_filter_distance = 0;
65704
4.52k
  uint8_t v_fa = 0;
65705
4.52k
  uint64_t v_i_start = 0;
65706
4.52k
  uint64_t v_i = 0;
65707
65708
4.52k
  v_filter_distance = ((uint64_t)(self->private_impl.f_filter_distance));
65709
4.52k
  v_i_start = 0u;
65710
11.1k
  while (v_i_start < v_filter_distance) {
65711
6.65k
    v_fa = 0u;
65712
6.65k
    v_i = v_i_start;
65713
38.2M
    while (v_i < ((uint64_t)(a_curr.len))) {
65714
38.2M
      a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + v_fa));
65715
38.2M
      v_fa = a_curr.ptr[v_i];
65716
38.2M
      v_i += v_filter_distance;
65717
38.2M
    }
65718
6.65k
    v_i_start += 1u;
65719
6.65k
  }
65720
4.52k
  return wuffs_base__make_empty_struct();
65721
4.52k
}
65722
65723
// -------- func png.decoder.filter_1_distance_3_fallback
65724
65725
WUFFS_BASE__GENERATED_C_CODE
65726
static wuffs_base__empty_struct
65727
wuffs_png__decoder__filter_1_distance_3_fallback(
65728
    wuffs_png__decoder* self,
65729
42.1k
    wuffs_base__slice_u8 a_curr) {
65730
42.1k
  wuffs_base__slice_u8 v_curr = {0};
65731
42.1k
  uint8_t v_fa0 = 0;
65732
42.1k
  uint8_t v_fa1 = 0;
65733
42.1k
  uint8_t v_fa2 = 0;
65734
65735
42.1k
  {
65736
42.1k
    wuffs_base__slice_u8 i_slice_curr = a_curr;
65737
42.1k
    v_curr.ptr = i_slice_curr.ptr;
65738
42.1k
    v_curr.len = 3;
65739
42.1k
    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));
65740
1.64M
    while (v_curr.ptr < i_end0_curr) {
65741
1.60M
      v_fa0 = ((uint8_t)(v_fa0 + v_curr.ptr[0u]));
65742
1.60M
      v_curr.ptr[0u] = v_fa0;
65743
1.60M
      v_fa1 = ((uint8_t)(v_fa1 + v_curr.ptr[1u]));
65744
1.60M
      v_curr.ptr[1u] = v_fa1;
65745
1.60M
      v_fa2 = ((uint8_t)(v_fa2 + v_curr.ptr[2u]));
65746
1.60M
      v_curr.ptr[2u] = v_fa2;
65747
1.60M
      v_curr.ptr += 3;
65748
1.60M
      v_fa0 = ((uint8_t)(v_fa0 + v_curr.ptr[0u]));
65749
1.60M
      v_curr.ptr[0u] = v_fa0;
65750
1.60M
      v_fa1 = ((uint8_t)(v_fa1 + v_curr.ptr[1u]));
65751
1.60M
      v_curr.ptr[1u] = v_fa1;
65752
1.60M
      v_fa2 = ((uint8_t)(v_fa2 + v_curr.ptr[2u]));
65753
1.60M
      v_curr.ptr[2u] = v_fa2;
65754
1.60M
      v_curr.ptr += 3;
65755
1.60M
    }
65756
42.1k
    v_curr.len = 3;
65757
42.1k
    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));
65758
83.6k
    while (v_curr.ptr < i_end1_curr) {
65759
41.4k
      v_fa0 = ((uint8_t)(v_fa0 + v_curr.ptr[0u]));
65760
41.4k
      v_curr.ptr[0u] = v_fa0;
65761
41.4k
      v_fa1 = ((uint8_t)(v_fa1 + v_curr.ptr[1u]));
65762
41.4k
      v_curr.ptr[1u] = v_fa1;
65763
41.4k
      v_fa2 = ((uint8_t)(v_fa2 + v_curr.ptr[2u]));
65764
41.4k
      v_curr.ptr[2u] = v_fa2;
65765
41.4k
      v_curr.ptr += 3;
65766
41.4k
    }
65767
42.1k
    v_curr.len = 0;
65768
42.1k
  }
65769
42.1k
  return wuffs_base__make_empty_struct();
65770
42.1k
}
65771
65772
// -------- func png.decoder.filter_1_distance_4_fallback
65773
65774
WUFFS_BASE__GENERATED_C_CODE
65775
static wuffs_base__empty_struct
65776
wuffs_png__decoder__filter_1_distance_4_fallback(
65777
    wuffs_png__decoder* self,
65778
0
    wuffs_base__slice_u8 a_curr) {
65779
0
  wuffs_base__slice_u8 v_curr = {0};
65780
0
  uint8_t v_fa0 = 0;
65781
0
  uint8_t v_fa1 = 0;
65782
0
  uint8_t v_fa2 = 0;
65783
0
  uint8_t v_fa3 = 0;
65784
65785
0
  {
65786
0
    wuffs_base__slice_u8 i_slice_curr = a_curr;
65787
0
    v_curr.ptr = i_slice_curr.ptr;
65788
0
    v_curr.len = 4;
65789
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));
65790
0
    while (v_curr.ptr < i_end0_curr) {
65791
0
      v_fa0 = ((uint8_t)(v_fa0 + v_curr.ptr[0u]));
65792
0
      v_curr.ptr[0u] = v_fa0;
65793
0
      v_fa1 = ((uint8_t)(v_fa1 + v_curr.ptr[1u]));
65794
0
      v_curr.ptr[1u] = v_fa1;
65795
0
      v_fa2 = ((uint8_t)(v_fa2 + v_curr.ptr[2u]));
65796
0
      v_curr.ptr[2u] = v_fa2;
65797
0
      v_fa3 = ((uint8_t)(v_fa3 + v_curr.ptr[3u]));
65798
0
      v_curr.ptr[3u] = v_fa3;
65799
0
      v_curr.ptr += 4;
65800
0
    }
65801
0
    v_curr.len = 0;
65802
0
  }
65803
0
  return wuffs_base__make_empty_struct();
65804
0
}
65805
65806
// -------- func png.decoder.filter_2
65807
65808
WUFFS_BASE__GENERATED_C_CODE
65809
static wuffs_base__empty_struct
65810
wuffs_png__decoder__filter_2(
65811
    wuffs_png__decoder* self,
65812
    wuffs_base__slice_u8 a_curr,
65813
17.8k
    wuffs_base__slice_u8 a_prev) {
65814
17.8k
  uint64_t v_n = 0;
65815
17.8k
  uint64_t v_i = 0;
65816
65817
17.8k
  v_n = wuffs_base__u64__min(((uint64_t)(a_curr.len)), ((uint64_t)(a_prev.len)));
65818
17.8k
  v_i = 0u;
65819
6.45M
  while (v_i < v_n) {
65820
6.43M
    a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + a_prev.ptr[v_i]));
65821
6.43M
    v_i += 1u;
65822
6.43M
  }
65823
17.8k
  return wuffs_base__make_empty_struct();
65824
17.8k
}
65825
65826
// -------- func png.decoder.filter_3
65827
65828
WUFFS_BASE__GENERATED_C_CODE
65829
static wuffs_base__empty_struct
65830
wuffs_png__decoder__filter_3(
65831
    wuffs_png__decoder* self,
65832
    wuffs_base__slice_u8 a_curr,
65833
359k
    wuffs_base__slice_u8 a_prev) {
65834
359k
  return (*self->private_impl.choosy_filter_3)(self, a_curr, a_prev);
65835
359k
}
65836
65837
WUFFS_BASE__GENERATED_C_CODE
65838
static wuffs_base__empty_struct
65839
wuffs_png__decoder__filter_3__choosy_default(
65840
    wuffs_png__decoder* self,
65841
    wuffs_base__slice_u8 a_curr,
65842
2.41k
    wuffs_base__slice_u8 a_prev) {
65843
2.41k
  uint64_t v_filter_distance = 0;
65844
2.41k
  uint64_t v_n = 0;
65845
2.41k
  uint64_t v_i = 0;
65846
65847
2.41k
  v_filter_distance = ((uint64_t)(self->private_impl.f_filter_distance));
65848
2.41k
  if (((uint64_t)(a_prev.len)) == 0u) {
65849
307
    v_i = v_filter_distance;
65850
6.58M
    while (v_i < ((uint64_t)(a_curr.len))) {
65851
6.58M
      a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + ((uint8_t)(a_curr.ptr[(v_i - v_filter_distance)] / 2u))));
65852
6.58M
      v_i += 1u;
65853
6.58M
    }
65854
2.10k
  } else {
65855
2.10k
    v_n = wuffs_base__u64__min(((uint64_t)(a_curr.len)), ((uint64_t)(a_prev.len)));
65856
2.10k
    v_i = 0u;
65857
5.52k
    while ((v_i < v_n) && (v_i < v_filter_distance)) {
65858
3.42k
      a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + ((uint8_t)(a_prev.ptr[v_i] / 2u))));
65859
3.42k
      v_i += 1u;
65860
3.42k
    }
65861
2.10k
    v_i = v_filter_distance;
65862
16.2M
    while (v_i < v_n) {
65863
16.2M
      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)))));
65864
16.2M
      v_i += 1u;
65865
16.2M
    }
65866
2.10k
  }
65867
2.41k
  return wuffs_base__make_empty_struct();
65868
2.41k
}
65869
65870
// -------- func png.decoder.filter_3_distance_3_fallback
65871
65872
WUFFS_BASE__GENERATED_C_CODE
65873
static wuffs_base__empty_struct
65874
wuffs_png__decoder__filter_3_distance_3_fallback(
65875
    wuffs_png__decoder* self,
65876
    wuffs_base__slice_u8 a_curr,
65877
349k
    wuffs_base__slice_u8 a_prev) {
65878
349k
  wuffs_base__slice_u8 v_curr = {0};
65879
349k
  wuffs_base__slice_u8 v_prev = {0};
65880
349k
  uint8_t v_fa0 = 0;
65881
349k
  uint8_t v_fa1 = 0;
65882
349k
  uint8_t v_fa2 = 0;
65883
65884
349k
  if (((uint64_t)(a_prev.len)) == 0u) {
65885
101
    {
65886
101
      wuffs_base__slice_u8 i_slice_curr = a_curr;
65887
101
      v_curr.ptr = i_slice_curr.ptr;
65888
101
      v_curr.len = 3;
65889
101
      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));
65890
7.50k
      while (v_curr.ptr < i_end0_curr) {
65891
7.39k
        v_fa0 = ((uint8_t)(((uint8_t)(v_fa0 / 2u)) + v_curr.ptr[0u]));
65892
7.39k
        v_curr.ptr[0u] = v_fa0;
65893
7.39k
        v_fa1 = ((uint8_t)(((uint8_t)(v_fa1 / 2u)) + v_curr.ptr[1u]));
65894
7.39k
        v_curr.ptr[1u] = v_fa1;
65895
7.39k
        v_fa2 = ((uint8_t)(((uint8_t)(v_fa2 / 2u)) + v_curr.ptr[2u]));
65896
7.39k
        v_curr.ptr[2u] = v_fa2;
65897
7.39k
        v_curr.ptr += 3;
65898
7.39k
        v_fa0 = ((uint8_t)(((uint8_t)(v_fa0 / 2u)) + v_curr.ptr[0u]));
65899
7.39k
        v_curr.ptr[0u] = v_fa0;
65900
7.39k
        v_fa1 = ((uint8_t)(((uint8_t)(v_fa1 / 2u)) + v_curr.ptr[1u]));
65901
7.39k
        v_curr.ptr[1u] = v_fa1;
65902
7.39k
        v_fa2 = ((uint8_t)(((uint8_t)(v_fa2 / 2u)) + v_curr.ptr[2u]));
65903
7.39k
        v_curr.ptr[2u] = v_fa2;
65904
7.39k
        v_curr.ptr += 3;
65905
7.39k
      }
65906
101
      v_curr.len = 3;
65907
101
      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));
65908
164
      while (v_curr.ptr < i_end1_curr) {
65909
63
        v_fa0 = ((uint8_t)(((uint8_t)(v_fa0 / 2u)) + v_curr.ptr[0u]));
65910
63
        v_curr.ptr[0u] = v_fa0;
65911
63
        v_fa1 = ((uint8_t)(((uint8_t)(v_fa1 / 2u)) + v_curr.ptr[1u]));
65912
63
        v_curr.ptr[1u] = v_fa1;
65913
63
        v_fa2 = ((uint8_t)(((uint8_t)(v_fa2 / 2u)) + v_curr.ptr[2u]));
65914
63
        v_curr.ptr[2u] = v_fa2;
65915
63
        v_curr.ptr += 3;
65916
63
      }
65917
101
      v_curr.len = 0;
65918
101
    }
65919
349k
  } else {
65920
349k
    {
65921
349k
      wuffs_base__slice_u8 i_slice_curr = a_curr;
65922
349k
      v_curr.ptr = i_slice_curr.ptr;
65923
349k
      wuffs_base__slice_u8 i_slice_prev = a_prev;
65924
349k
      v_prev.ptr = i_slice_prev.ptr;
65925
349k
      i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len)));
65926
349k
      v_curr.len = 3;
65927
349k
      v_prev.len = 3;
65928
349k
      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));
65929
1.67M
      while (v_curr.ptr < i_end0_curr) {
65930
1.32M
        v_fa0 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa0)) + ((uint32_t)(v_prev.ptr[0u]))) / 2u))) + v_curr.ptr[0u]));
65931
1.32M
        v_curr.ptr[0u] = v_fa0;
65932
1.32M
        v_fa1 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa1)) + ((uint32_t)(v_prev.ptr[1u]))) / 2u))) + v_curr.ptr[1u]));
65933
1.32M
        v_curr.ptr[1u] = v_fa1;
65934
1.32M
        v_fa2 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa2)) + ((uint32_t)(v_prev.ptr[2u]))) / 2u))) + v_curr.ptr[2u]));
65935
1.32M
        v_curr.ptr[2u] = v_fa2;
65936
1.32M
        v_curr.ptr += 3;
65937
1.32M
        v_prev.ptr += 3;
65938
1.32M
        v_fa0 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa0)) + ((uint32_t)(v_prev.ptr[0u]))) / 2u))) + v_curr.ptr[0u]));
65939
1.32M
        v_curr.ptr[0u] = v_fa0;
65940
1.32M
        v_fa1 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa1)) + ((uint32_t)(v_prev.ptr[1u]))) / 2u))) + v_curr.ptr[1u]));
65941
1.32M
        v_curr.ptr[1u] = v_fa1;
65942
1.32M
        v_fa2 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa2)) + ((uint32_t)(v_prev.ptr[2u]))) / 2u))) + v_curr.ptr[2u]));
65943
1.32M
        v_curr.ptr[2u] = v_fa2;
65944
1.32M
        v_curr.ptr += 3;
65945
1.32M
        v_prev.ptr += 3;
65946
1.32M
      }
65947
349k
      v_curr.len = 3;
65948
349k
      v_prev.len = 3;
65949
349k
      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));
65950
697k
      while (v_curr.ptr < i_end1_curr) {
65951
348k
        v_fa0 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa0)) + ((uint32_t)(v_prev.ptr[0u]))) / 2u))) + v_curr.ptr[0u]));
65952
348k
        v_curr.ptr[0u] = v_fa0;
65953
348k
        v_fa1 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa1)) + ((uint32_t)(v_prev.ptr[1u]))) / 2u))) + v_curr.ptr[1u]));
65954
348k
        v_curr.ptr[1u] = v_fa1;
65955
348k
        v_fa2 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa2)) + ((uint32_t)(v_prev.ptr[2u]))) / 2u))) + v_curr.ptr[2u]));
65956
348k
        v_curr.ptr[2u] = v_fa2;
65957
348k
        v_curr.ptr += 3;
65958
348k
        v_prev.ptr += 3;
65959
348k
      }
65960
349k
      v_curr.len = 0;
65961
349k
      v_prev.len = 0;
65962
349k
    }
65963
349k
  }
65964
349k
  return wuffs_base__make_empty_struct();
65965
349k
}
65966
65967
// -------- func png.decoder.filter_3_distance_4_fallback
65968
65969
WUFFS_BASE__GENERATED_C_CODE
65970
static wuffs_base__empty_struct
65971
wuffs_png__decoder__filter_3_distance_4_fallback(
65972
    wuffs_png__decoder* self,
65973
    wuffs_base__slice_u8 a_curr,
65974
0
    wuffs_base__slice_u8 a_prev) {
65975
0
  wuffs_base__slice_u8 v_curr = {0};
65976
0
  wuffs_base__slice_u8 v_prev = {0};
65977
0
  uint8_t v_fa0 = 0;
65978
0
  uint8_t v_fa1 = 0;
65979
0
  uint8_t v_fa2 = 0;
65980
0
  uint8_t v_fa3 = 0;
65981
65982
0
  if (((uint64_t)(a_prev.len)) == 0u) {
65983
0
    {
65984
0
      wuffs_base__slice_u8 i_slice_curr = a_curr;
65985
0
      v_curr.ptr = i_slice_curr.ptr;
65986
0
      v_curr.len = 4;
65987
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));
65988
0
      while (v_curr.ptr < i_end0_curr) {
65989
0
        v_fa0 = ((uint8_t)(((uint8_t)(v_fa0 / 2u)) + v_curr.ptr[0u]));
65990
0
        v_curr.ptr[0u] = v_fa0;
65991
0
        v_fa1 = ((uint8_t)(((uint8_t)(v_fa1 / 2u)) + v_curr.ptr[1u]));
65992
0
        v_curr.ptr[1u] = v_fa1;
65993
0
        v_fa2 = ((uint8_t)(((uint8_t)(v_fa2 / 2u)) + v_curr.ptr[2u]));
65994
0
        v_curr.ptr[2u] = v_fa2;
65995
0
        v_fa3 = ((uint8_t)(((uint8_t)(v_fa3 / 2u)) + v_curr.ptr[3u]));
65996
0
        v_curr.ptr[3u] = v_fa3;
65997
0
        v_curr.ptr += 4;
65998
0
      }
65999
0
      v_curr.len = 0;
66000
0
    }
66001
0
  } else {
66002
0
    {
66003
0
      wuffs_base__slice_u8 i_slice_curr = a_curr;
66004
0
      v_curr.ptr = i_slice_curr.ptr;
66005
0
      wuffs_base__slice_u8 i_slice_prev = a_prev;
66006
0
      v_prev.ptr = i_slice_prev.ptr;
66007
0
      i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len)));
66008
0
      v_curr.len = 4;
66009
0
      v_prev.len = 4;
66010
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));
66011
0
      while (v_curr.ptr < i_end0_curr) {
66012
0
        v_fa0 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa0)) + ((uint32_t)(v_prev.ptr[0u]))) / 2u))) + v_curr.ptr[0u]));
66013
0
        v_curr.ptr[0u] = v_fa0;
66014
0
        v_fa1 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa1)) + ((uint32_t)(v_prev.ptr[1u]))) / 2u))) + v_curr.ptr[1u]));
66015
0
        v_curr.ptr[1u] = v_fa1;
66016
0
        v_fa2 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa2)) + ((uint32_t)(v_prev.ptr[2u]))) / 2u))) + v_curr.ptr[2u]));
66017
0
        v_curr.ptr[2u] = v_fa2;
66018
0
        v_fa3 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa3)) + ((uint32_t)(v_prev.ptr[3u]))) / 2u))) + v_curr.ptr[3u]));
66019
0
        v_curr.ptr[3u] = v_fa3;
66020
0
        v_curr.ptr += 4;
66021
0
        v_prev.ptr += 4;
66022
0
      }
66023
0
      v_curr.len = 0;
66024
0
      v_prev.len = 0;
66025
0
    }
66026
0
  }
66027
0
  return wuffs_base__make_empty_struct();
66028
0
}
66029
66030
// -------- func png.decoder.filter_4
66031
66032
WUFFS_BASE__GENERATED_C_CODE
66033
static wuffs_base__empty_struct
66034
wuffs_png__decoder__filter_4(
66035
    wuffs_png__decoder* self,
66036
    wuffs_base__slice_u8 a_curr,
66037
19.8k
    wuffs_base__slice_u8 a_prev) {
66038
19.8k
  return (*self->private_impl.choosy_filter_4)(self, a_curr, a_prev);
66039
19.8k
}
66040
66041
WUFFS_BASE__GENERATED_C_CODE
66042
static wuffs_base__empty_struct
66043
wuffs_png__decoder__filter_4__choosy_default(
66044
    wuffs_png__decoder* self,
66045
    wuffs_base__slice_u8 a_curr,
66046
7.14k
    wuffs_base__slice_u8 a_prev) {
66047
7.14k
  uint64_t v_filter_distance = 0;
66048
7.14k
  uint64_t v_n = 0;
66049
7.14k
  uint64_t v_i = 0;
66050
7.14k
  uint32_t v_fa = 0;
66051
7.14k
  uint32_t v_fb = 0;
66052
7.14k
  uint32_t v_fc = 0;
66053
7.14k
  uint32_t v_pp = 0;
66054
7.14k
  uint32_t v_pa = 0;
66055
7.14k
  uint32_t v_pb = 0;
66056
7.14k
  uint32_t v_pc = 0;
66057
66058
7.14k
  v_filter_distance = ((uint64_t)(self->private_impl.f_filter_distance));
66059
7.14k
  v_n = wuffs_base__u64__min(((uint64_t)(a_curr.len)), ((uint64_t)(a_prev.len)));
66060
7.14k
  v_i = 0u;
66061
19.3k
  while ((v_i < v_n) && (v_i < v_filter_distance)) {
66062
12.2k
    a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + a_prev.ptr[v_i]));
66063
12.2k
    v_i += 1u;
66064
12.2k
  }
66065
7.14k
  v_i = v_filter_distance;
66066
38.1M
  while (v_i < v_n) {
66067
38.0M
    v_fa = ((uint32_t)(a_curr.ptr[(v_i - v_filter_distance)]));
66068
38.0M
    v_fb = ((uint32_t)(a_prev.ptr[v_i]));
66069
38.0M
    v_fc = ((uint32_t)(a_prev.ptr[(v_i - v_filter_distance)]));
66070
38.0M
    v_pp = ((uint32_t)(((uint32_t)(v_fa + v_fb)) - v_fc));
66071
38.0M
    v_pa = ((uint32_t)(v_pp - v_fa));
66072
38.0M
    if (v_pa >= 2147483648u) {
66073
816k
      v_pa = ((uint32_t)(0u - v_pa));
66074
816k
    }
66075
38.0M
    v_pb = ((uint32_t)(v_pp - v_fb));
66076
38.0M
    if (v_pb >= 2147483648u) {
66077
1.82M
      v_pb = ((uint32_t)(0u - v_pb));
66078
1.82M
    }
66079
38.0M
    v_pc = ((uint32_t)(v_pp - v_fc));
66080
38.0M
    if (v_pc >= 2147483648u) {
66081
2.00M
      v_pc = ((uint32_t)(0u - v_pc));
66082
2.00M
    }
66083
38.0M
    if ((v_pa <= v_pb) && (v_pa <= v_pc)) {
66084
34.9M
    } else if (v_pb <= v_pc) {
66085
3.07M
      v_fa = v_fb;
66086
3.07M
    } else {
66087
26.2k
      v_fa = v_fc;
66088
26.2k
    }
66089
38.0M
    a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + ((uint8_t)(v_fa))));
66090
38.0M
    v_i += 1u;
66091
38.0M
  }
66092
7.14k
  return wuffs_base__make_empty_struct();
66093
7.14k
}
66094
66095
// -------- func png.decoder.filter_4_distance_3_fallback
66096
66097
WUFFS_BASE__GENERATED_C_CODE
66098
static wuffs_base__empty_struct
66099
wuffs_png__decoder__filter_4_distance_3_fallback(
66100
    wuffs_png__decoder* self,
66101
    wuffs_base__slice_u8 a_curr,
66102
0
    wuffs_base__slice_u8 a_prev) {
66103
0
  wuffs_base__slice_u8 v_curr = {0};
66104
0
  wuffs_base__slice_u8 v_prev = {0};
66105
0
  uint32_t v_fa0 = 0;
66106
0
  uint32_t v_fa1 = 0;
66107
0
  uint32_t v_fa2 = 0;
66108
0
  uint32_t v_fb0 = 0;
66109
0
  uint32_t v_fb1 = 0;
66110
0
  uint32_t v_fb2 = 0;
66111
0
  uint32_t v_fc0 = 0;
66112
0
  uint32_t v_fc1 = 0;
66113
0
  uint32_t v_fc2 = 0;
66114
0
  uint32_t v_pp0 = 0;
66115
0
  uint32_t v_pp1 = 0;
66116
0
  uint32_t v_pp2 = 0;
66117
0
  uint32_t v_pa0 = 0;
66118
0
  uint32_t v_pa1 = 0;
66119
0
  uint32_t v_pa2 = 0;
66120
0
  uint32_t v_pb0 = 0;
66121
0
  uint32_t v_pb1 = 0;
66122
0
  uint32_t v_pb2 = 0;
66123
0
  uint32_t v_pc0 = 0;
66124
0
  uint32_t v_pc1 = 0;
66125
0
  uint32_t v_pc2 = 0;
66126
66127
0
  {
66128
0
    wuffs_base__slice_u8 i_slice_curr = a_curr;
66129
0
    v_curr.ptr = i_slice_curr.ptr;
66130
0
    wuffs_base__slice_u8 i_slice_prev = a_prev;
66131
0
    v_prev.ptr = i_slice_prev.ptr;
66132
0
    i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len)));
66133
0
    v_curr.len = 3;
66134
0
    v_prev.len = 3;
66135
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));
66136
0
    while (v_curr.ptr < i_end0_curr) {
66137
0
      v_fb0 = ((uint32_t)(v_prev.ptr[0u]));
66138
0
      v_pp0 = ((uint32_t)(((uint32_t)(v_fa0 + v_fb0)) - v_fc0));
66139
0
      v_pa0 = ((uint32_t)(v_pp0 - v_fa0));
66140
0
      if (v_pa0 >= 2147483648u) {
66141
0
        v_pa0 = ((uint32_t)(0u - v_pa0));
66142
0
      }
66143
0
      v_pb0 = ((uint32_t)(v_pp0 - v_fb0));
66144
0
      if (v_pb0 >= 2147483648u) {
66145
0
        v_pb0 = ((uint32_t)(0u - v_pb0));
66146
0
      }
66147
0
      v_pc0 = ((uint32_t)(v_pp0 - v_fc0));
66148
0
      if (v_pc0 >= 2147483648u) {
66149
0
        v_pc0 = ((uint32_t)(0u - v_pc0));
66150
0
      }
66151
0
      if ((v_pa0 <= v_pb0) && (v_pa0 <= v_pc0)) {
66152
0
      } else if (v_pb0 <= v_pc0) {
66153
0
        v_fa0 = v_fb0;
66154
0
      } else {
66155
0
        v_fa0 = v_fc0;
66156
0
      }
66157
0
      v_curr.ptr[0u] = ((uint8_t)(v_curr.ptr[0u] + ((uint8_t)(v_fa0))));
66158
0
      v_fa0 = ((uint32_t)(v_curr.ptr[0u]));
66159
0
      v_fc0 = v_fb0;
66160
0
      v_fb1 = ((uint32_t)(v_prev.ptr[1u]));
66161
0
      v_pp1 = ((uint32_t)(((uint32_t)(v_fa1 + v_fb1)) - v_fc1));
66162
0
      v_pa1 = ((uint32_t)(v_pp1 - v_fa1));
66163
0
      if (v_pa1 >= 2147483648u) {
66164
0
        v_pa1 = ((uint32_t)(0u - v_pa1));
66165
0
      }
66166
0
      v_pb1 = ((uint32_t)(v_pp1 - v_fb1));
66167
0
      if (v_pb1 >= 2147483648u) {
66168
0
        v_pb1 = ((uint32_t)(0u - v_pb1));
66169
0
      }
66170
0
      v_pc1 = ((uint32_t)(v_pp1 - v_fc1));
66171
0
      if (v_pc1 >= 2147483648u) {
66172
0
        v_pc1 = ((uint32_t)(0u - v_pc1));
66173
0
      }
66174
0
      if ((v_pa1 <= v_pb1) && (v_pa1 <= v_pc1)) {
66175
0
      } else if (v_pb1 <= v_pc1) {
66176
0
        v_fa1 = v_fb1;
66177
0
      } else {
66178
0
        v_fa1 = v_fc1;
66179
0
      }
66180
0
      v_curr.ptr[1u] = ((uint8_t)(v_curr.ptr[1u] + ((uint8_t)(v_fa1))));
66181
0
      v_fa1 = ((uint32_t)(v_curr.ptr[1u]));
66182
0
      v_fc1 = v_fb1;
66183
0
      v_fb2 = ((uint32_t)(v_prev.ptr[2u]));
66184
0
      v_pp2 = ((uint32_t)(((uint32_t)(v_fa2 + v_fb2)) - v_fc2));
66185
0
      v_pa2 = ((uint32_t)(v_pp2 - v_fa2));
66186
0
      if (v_pa2 >= 2147483648u) {
66187
0
        v_pa2 = ((uint32_t)(0u - v_pa2));
66188
0
      }
66189
0
      v_pb2 = ((uint32_t)(v_pp2 - v_fb2));
66190
0
      if (v_pb2 >= 2147483648u) {
66191
0
        v_pb2 = ((uint32_t)(0u - v_pb2));
66192
0
      }
66193
0
      v_pc2 = ((uint32_t)(v_pp2 - v_fc2));
66194
0
      if (v_pc2 >= 2147483648u) {
66195
0
        v_pc2 = ((uint32_t)(0u - v_pc2));
66196
0
      }
66197
0
      if ((v_pa2 <= v_pb2) && (v_pa2 <= v_pc2)) {
66198
0
      } else if (v_pb2 <= v_pc2) {
66199
0
        v_fa2 = v_fb2;
66200
0
      } else {
66201
0
        v_fa2 = v_fc2;
66202
0
      }
66203
0
      v_curr.ptr[2u] = ((uint8_t)(v_curr.ptr[2u] + ((uint8_t)(v_fa2))));
66204
0
      v_fa2 = ((uint32_t)(v_curr.ptr[2u]));
66205
0
      v_fc2 = v_fb2;
66206
0
      v_curr.ptr += 3;
66207
0
      v_prev.ptr += 3;
66208
0
    }
66209
0
    v_curr.len = 0;
66210
0
    v_prev.len = 0;
66211
0
  }
66212
0
  return wuffs_base__make_empty_struct();
66213
0
}
66214
66215
// -------- func png.decoder.filter_4_distance_4_fallback
66216
66217
WUFFS_BASE__GENERATED_C_CODE
66218
static wuffs_base__empty_struct
66219
wuffs_png__decoder__filter_4_distance_4_fallback(
66220
    wuffs_png__decoder* self,
66221
    wuffs_base__slice_u8 a_curr,
66222
0
    wuffs_base__slice_u8 a_prev) {
66223
0
  wuffs_base__slice_u8 v_curr = {0};
66224
0
  wuffs_base__slice_u8 v_prev = {0};
66225
0
  uint32_t v_fa0 = 0;
66226
0
  uint32_t v_fa1 = 0;
66227
0
  uint32_t v_fa2 = 0;
66228
0
  uint32_t v_fa3 = 0;
66229
0
  uint32_t v_fb0 = 0;
66230
0
  uint32_t v_fb1 = 0;
66231
0
  uint32_t v_fb2 = 0;
66232
0
  uint32_t v_fb3 = 0;
66233
0
  uint32_t v_fc0 = 0;
66234
0
  uint32_t v_fc1 = 0;
66235
0
  uint32_t v_fc2 = 0;
66236
0
  uint32_t v_fc3 = 0;
66237
0
  uint32_t v_pp0 = 0;
66238
0
  uint32_t v_pp1 = 0;
66239
0
  uint32_t v_pp2 = 0;
66240
0
  uint32_t v_pp3 = 0;
66241
0
  uint32_t v_pa0 = 0;
66242
0
  uint32_t v_pa1 = 0;
66243
0
  uint32_t v_pa2 = 0;
66244
0
  uint32_t v_pa3 = 0;
66245
0
  uint32_t v_pb0 = 0;
66246
0
  uint32_t v_pb1 = 0;
66247
0
  uint32_t v_pb2 = 0;
66248
0
  uint32_t v_pb3 = 0;
66249
0
  uint32_t v_pc0 = 0;
66250
0
  uint32_t v_pc1 = 0;
66251
0
  uint32_t v_pc2 = 0;
66252
0
  uint32_t v_pc3 = 0;
66253
66254
0
  {
66255
0
    wuffs_base__slice_u8 i_slice_curr = a_curr;
66256
0
    v_curr.ptr = i_slice_curr.ptr;
66257
0
    wuffs_base__slice_u8 i_slice_prev = a_prev;
66258
0
    v_prev.ptr = i_slice_prev.ptr;
66259
0
    i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len)));
66260
0
    v_curr.len = 4;
66261
0
    v_prev.len = 4;
66262
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));
66263
0
    while (v_curr.ptr < i_end0_curr) {
66264
0
      v_fb0 = ((uint32_t)(v_prev.ptr[0u]));
66265
0
      v_pp0 = ((uint32_t)(((uint32_t)(v_fa0 + v_fb0)) - v_fc0));
66266
0
      v_pa0 = ((uint32_t)(v_pp0 - v_fa0));
66267
0
      if (v_pa0 >= 2147483648u) {
66268
0
        v_pa0 = ((uint32_t)(0u - v_pa0));
66269
0
      }
66270
0
      v_pb0 = ((uint32_t)(v_pp0 - v_fb0));
66271
0
      if (v_pb0 >= 2147483648u) {
66272
0
        v_pb0 = ((uint32_t)(0u - v_pb0));
66273
0
      }
66274
0
      v_pc0 = ((uint32_t)(v_pp0 - v_fc0));
66275
0
      if (v_pc0 >= 2147483648u) {
66276
0
        v_pc0 = ((uint32_t)(0u - v_pc0));
66277
0
      }
66278
0
      if ((v_pa0 <= v_pb0) && (v_pa0 <= v_pc0)) {
66279
0
      } else if (v_pb0 <= v_pc0) {
66280
0
        v_fa0 = v_fb0;
66281
0
      } else {
66282
0
        v_fa0 = v_fc0;
66283
0
      }
66284
0
      v_curr.ptr[0u] = ((uint8_t)(v_curr.ptr[0u] + ((uint8_t)(v_fa0))));
66285
0
      v_fa0 = ((uint32_t)(v_curr.ptr[0u]));
66286
0
      v_fc0 = v_fb0;
66287
0
      v_fb1 = ((uint32_t)(v_prev.ptr[1u]));
66288
0
      v_pp1 = ((uint32_t)(((uint32_t)(v_fa1 + v_fb1)) - v_fc1));
66289
0
      v_pa1 = ((uint32_t)(v_pp1 - v_fa1));
66290
0
      if (v_pa1 >= 2147483648u) {
66291
0
        v_pa1 = ((uint32_t)(0u - v_pa1));
66292
0
      }
66293
0
      v_pb1 = ((uint32_t)(v_pp1 - v_fb1));
66294
0
      if (v_pb1 >= 2147483648u) {
66295
0
        v_pb1 = ((uint32_t)(0u - v_pb1));
66296
0
      }
66297
0
      v_pc1 = ((uint32_t)(v_pp1 - v_fc1));
66298
0
      if (v_pc1 >= 2147483648u) {
66299
0
        v_pc1 = ((uint32_t)(0u - v_pc1));
66300
0
      }
66301
0
      if ((v_pa1 <= v_pb1) && (v_pa1 <= v_pc1)) {
66302
0
      } else if (v_pb1 <= v_pc1) {
66303
0
        v_fa1 = v_fb1;
66304
0
      } else {
66305
0
        v_fa1 = v_fc1;
66306
0
      }
66307
0
      v_curr.ptr[1u] = ((uint8_t)(v_curr.ptr[1u] + ((uint8_t)(v_fa1))));
66308
0
      v_fa1 = ((uint32_t)(v_curr.ptr[1u]));
66309
0
      v_fc1 = v_fb1;
66310
0
      v_fb2 = ((uint32_t)(v_prev.ptr[2u]));
66311
0
      v_pp2 = ((uint32_t)(((uint32_t)(v_fa2 + v_fb2)) - v_fc2));
66312
0
      v_pa2 = ((uint32_t)(v_pp2 - v_fa2));
66313
0
      if (v_pa2 >= 2147483648u) {
66314
0
        v_pa2 = ((uint32_t)(0u - v_pa2));
66315
0
      }
66316
0
      v_pb2 = ((uint32_t)(v_pp2 - v_fb2));
66317
0
      if (v_pb2 >= 2147483648u) {
66318
0
        v_pb2 = ((uint32_t)(0u - v_pb2));
66319
0
      }
66320
0
      v_pc2 = ((uint32_t)(v_pp2 - v_fc2));
66321
0
      if (v_pc2 >= 2147483648u) {
66322
0
        v_pc2 = ((uint32_t)(0u - v_pc2));
66323
0
      }
66324
0
      if ((v_pa2 <= v_pb2) && (v_pa2 <= v_pc2)) {
66325
0
      } else if (v_pb2 <= v_pc2) {
66326
0
        v_fa2 = v_fb2;
66327
0
      } else {
66328
0
        v_fa2 = v_fc2;
66329
0
      }
66330
0
      v_curr.ptr[2u] = ((uint8_t)(v_curr.ptr[2u] + ((uint8_t)(v_fa2))));
66331
0
      v_fa2 = ((uint32_t)(v_curr.ptr[2u]));
66332
0
      v_fc2 = v_fb2;
66333
0
      v_fb3 = ((uint32_t)(v_prev.ptr[3u]));
66334
0
      v_pp3 = ((uint32_t)(((uint32_t)(v_fa3 + v_fb3)) - v_fc3));
66335
0
      v_pa3 = ((uint32_t)(v_pp3 - v_fa3));
66336
0
      if (v_pa3 >= 2147483648u) {
66337
0
        v_pa3 = ((uint32_t)(0u - v_pa3));
66338
0
      }
66339
0
      v_pb3 = ((uint32_t)(v_pp3 - v_fb3));
66340
0
      if (v_pb3 >= 2147483648u) {
66341
0
        v_pb3 = ((uint32_t)(0u - v_pb3));
66342
0
      }
66343
0
      v_pc3 = ((uint32_t)(v_pp3 - v_fc3));
66344
0
      if (v_pc3 >= 2147483648u) {
66345
0
        v_pc3 = ((uint32_t)(0u - v_pc3));
66346
0
      }
66347
0
      if ((v_pa3 <= v_pb3) && (v_pa3 <= v_pc3)) {
66348
0
      } else if (v_pb3 <= v_pc3) {
66349
0
        v_fa3 = v_fb3;
66350
0
      } else {
66351
0
        v_fa3 = v_fc3;
66352
0
      }
66353
0
      v_curr.ptr[3u] = ((uint8_t)(v_curr.ptr[3u] + ((uint8_t)(v_fa3))));
66354
0
      v_fa3 = ((uint32_t)(v_curr.ptr[3u]));
66355
0
      v_fc3 = v_fb3;
66356
0
      v_curr.ptr += 4;
66357
0
      v_prev.ptr += 4;
66358
0
    }
66359
0
    v_curr.len = 0;
66360
0
    v_prev.len = 0;
66361
0
  }
66362
0
  return wuffs_base__make_empty_struct();
66363
0
}
66364
66365
// โ€ผ WUFFS MULTI-FILE SECTION +x86_sse42
66366
// -------- func png.decoder.filter_1_distance_4_x86_sse42
66367
66368
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
66369
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
66370
WUFFS_BASE__GENERATED_C_CODE
66371
static wuffs_base__empty_struct
66372
wuffs_png__decoder__filter_1_distance_4_x86_sse42(
66373
    wuffs_png__decoder* self,
66374
5.62k
    wuffs_base__slice_u8 a_curr) {
66375
5.62k
  wuffs_base__slice_u8 v_curr = {0};
66376
5.62k
  __m128i v_x128 = {0};
66377
5.62k
  __m128i v_a128 = {0};
66378
66379
5.62k
  {
66380
5.62k
    wuffs_base__slice_u8 i_slice_curr = a_curr;
66381
5.62k
    v_curr.ptr = i_slice_curr.ptr;
66382
5.62k
    v_curr.len = 4;
66383
5.62k
    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));
66384
12.3M
    while (v_curr.ptr < i_end0_curr) {
66385
12.3M
      v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
66386
12.3M
      v_x128 = _mm_add_epi8(v_x128, v_a128);
66387
12.3M
      v_a128 = v_x128;
66388
12.3M
      wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128))));
66389
12.3M
      v_curr.ptr += 4;
66390
12.3M
      v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
66391
12.3M
      v_x128 = _mm_add_epi8(v_x128, v_a128);
66392
12.3M
      v_a128 = v_x128;
66393
12.3M
      wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128))));
66394
12.3M
      v_curr.ptr += 4;
66395
12.3M
    }
66396
5.62k
    v_curr.len = 4;
66397
5.62k
    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));
66398
6.66k
    while (v_curr.ptr < i_end1_curr) {
66399
1.04k
      v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
66400
1.04k
      v_x128 = _mm_add_epi8(v_x128, v_a128);
66401
1.04k
      v_a128 = v_x128;
66402
1.04k
      wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128))));
66403
1.04k
      v_curr.ptr += 4;
66404
1.04k
    }
66405
5.62k
    v_curr.len = 0;
66406
5.62k
  }
66407
5.62k
  return wuffs_base__make_empty_struct();
66408
5.62k
}
66409
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
66410
// โ€ผ WUFFS MULTI-FILE SECTION -x86_sse42
66411
66412
// โ€ผ WUFFS MULTI-FILE SECTION +x86_sse42
66413
// -------- func png.decoder.filter_3_distance_4_x86_sse42
66414
66415
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
66416
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
66417
WUFFS_BASE__GENERATED_C_CODE
66418
static wuffs_base__empty_struct
66419
wuffs_png__decoder__filter_3_distance_4_x86_sse42(
66420
    wuffs_png__decoder* self,
66421
    wuffs_base__slice_u8 a_curr,
66422
8.03k
    wuffs_base__slice_u8 a_prev) {
66423
8.03k
  wuffs_base__slice_u8 v_curr = {0};
66424
8.03k
  wuffs_base__slice_u8 v_prev = {0};
66425
8.03k
  __m128i v_x128 = {0};
66426
8.03k
  __m128i v_a128 = {0};
66427
8.03k
  __m128i v_b128 = {0};
66428
8.03k
  __m128i v_p128 = {0};
66429
8.03k
  __m128i v_k128 = {0};
66430
66431
8.03k
  if (((uint64_t)(a_prev.len)) == 0u) {
66432
165
    v_k128 = _mm_set1_epi8((int8_t)(254u));
66433
165
    {
66434
165
      wuffs_base__slice_u8 i_slice_curr = a_curr;
66435
165
      v_curr.ptr = i_slice_curr.ptr;
66436
165
      v_curr.len = 4;
66437
165
      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));
66438
1.23M
      while (v_curr.ptr < i_end0_curr) {
66439
1.23M
        v_p128 = _mm_avg_epu8(_mm_and_si128(v_a128, v_k128), v_b128);
66440
1.23M
        v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
66441
1.23M
        v_x128 = _mm_add_epi8(v_x128, v_p128);
66442
1.23M
        v_a128 = v_x128;
66443
1.23M
        wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128))));
66444
1.23M
        v_curr.ptr += 4;
66445
1.23M
        v_p128 = _mm_avg_epu8(_mm_and_si128(v_a128, v_k128), v_b128);
66446
1.23M
        v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
66447
1.23M
        v_x128 = _mm_add_epi8(v_x128, v_p128);
66448
1.23M
        v_a128 = v_x128;
66449
1.23M
        wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128))));
66450
1.23M
        v_curr.ptr += 4;
66451
1.23M
      }
66452
165
      v_curr.len = 4;
66453
165
      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));
66454
248
      while (v_curr.ptr < i_end1_curr) {
66455
83
        v_p128 = _mm_avg_epu8(_mm_and_si128(v_a128, v_k128), v_b128);
66456
83
        v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
66457
83
        v_x128 = _mm_add_epi8(v_x128, v_p128);
66458
83
        v_a128 = v_x128;
66459
83
        wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128))));
66460
83
        v_curr.ptr += 4;
66461
83
      }
66462
165
      v_curr.len = 0;
66463
165
    }
66464
7.86k
  } else {
66465
7.86k
    v_k128 = _mm_set1_epi8((int8_t)(1u));
66466
7.86k
    {
66467
7.86k
      wuffs_base__slice_u8 i_slice_curr = a_curr;
66468
7.86k
      v_curr.ptr = i_slice_curr.ptr;
66469
7.86k
      wuffs_base__slice_u8 i_slice_prev = a_prev;
66470
7.86k
      v_prev.ptr = i_slice_prev.ptr;
66471
7.86k
      i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len)));
66472
7.86k
      v_curr.len = 4;
66473
7.86k
      v_prev.len = 4;
66474
7.86k
      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));
66475
2.38M
      while (v_curr.ptr < i_end0_curr) {
66476
2.37M
        v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
66477
2.37M
        v_p128 = _mm_avg_epu8(v_a128, v_b128);
66478
2.37M
        v_p128 = _mm_sub_epi8(v_p128, _mm_and_si128(v_k128, _mm_xor_si128(v_a128, v_b128)));
66479
2.37M
        v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
66480
2.37M
        v_x128 = _mm_add_epi8(v_x128, v_p128);
66481
2.37M
        v_a128 = v_x128;
66482
2.37M
        wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128))));
66483
2.37M
        v_curr.ptr += 4;
66484
2.37M
        v_prev.ptr += 4;
66485
2.37M
        v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
66486
2.37M
        v_p128 = _mm_avg_epu8(v_a128, v_b128);
66487
2.37M
        v_p128 = _mm_sub_epi8(v_p128, _mm_and_si128(v_k128, _mm_xor_si128(v_a128, v_b128)));
66488
2.37M
        v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
66489
2.37M
        v_x128 = _mm_add_epi8(v_x128, v_p128);
66490
2.37M
        v_a128 = v_x128;
66491
2.37M
        wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128))));
66492
2.37M
        v_curr.ptr += 4;
66493
2.37M
        v_prev.ptr += 4;
66494
2.37M
      }
66495
7.86k
      v_curr.len = 4;
66496
7.86k
      v_prev.len = 4;
66497
7.86k
      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));
66498
9.80k
      while (v_curr.ptr < i_end1_curr) {
66499
1.93k
        v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
66500
1.93k
        v_p128 = _mm_avg_epu8(v_a128, v_b128);
66501
1.93k
        v_p128 = _mm_sub_epi8(v_p128, _mm_and_si128(v_k128, _mm_xor_si128(v_a128, v_b128)));
66502
1.93k
        v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
66503
1.93k
        v_x128 = _mm_add_epi8(v_x128, v_p128);
66504
1.93k
        v_a128 = v_x128;
66505
1.93k
        wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128))));
66506
1.93k
        v_curr.ptr += 4;
66507
1.93k
        v_prev.ptr += 4;
66508
1.93k
      }
66509
7.86k
      v_curr.len = 0;
66510
7.86k
      v_prev.len = 0;
66511
7.86k
    }
66512
7.86k
  }
66513
8.03k
  return wuffs_base__make_empty_struct();
66514
8.03k
}
66515
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
66516
// โ€ผ WUFFS MULTI-FILE SECTION -x86_sse42
66517
66518
// โ€ผ WUFFS MULTI-FILE SECTION +x86_sse42
66519
// -------- func png.decoder.filter_4_distance_3_x86_sse42
66520
66521
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
66522
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
66523
WUFFS_BASE__GENERATED_C_CODE
66524
static wuffs_base__empty_struct
66525
wuffs_png__decoder__filter_4_distance_3_x86_sse42(
66526
    wuffs_png__decoder* self,
66527
    wuffs_base__slice_u8 a_curr,
66528
5.71k
    wuffs_base__slice_u8 a_prev) {
66529
5.71k
  wuffs_base__slice_u8 v_curr = {0};
66530
5.71k
  wuffs_base__slice_u8 v_prev = {0};
66531
5.71k
  __m128i v_x128 = {0};
66532
5.71k
  __m128i v_a128 = {0};
66533
5.71k
  __m128i v_b128 = {0};
66534
5.71k
  __m128i v_c128 = {0};
66535
5.71k
  __m128i v_p128 = {0};
66536
5.71k
  __m128i v_pa128 = {0};
66537
5.71k
  __m128i v_pb128 = {0};
66538
5.71k
  __m128i v_pc128 = {0};
66539
5.71k
  __m128i v_smallest128 = {0};
66540
5.71k
  __m128i v_z128 = {0};
66541
66542
5.71k
  {
66543
5.71k
    wuffs_base__slice_u8 i_slice_curr = a_curr;
66544
5.71k
    v_curr.ptr = i_slice_curr.ptr;
66545
5.71k
    wuffs_base__slice_u8 i_slice_prev = a_prev;
66546
5.71k
    v_prev.ptr = i_slice_prev.ptr;
66547
5.71k
    i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len)));
66548
5.71k
    v_curr.len = 4;
66549
5.71k
    v_prev.len = 4;
66550
5.71k
    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));
66551
706k
    while (v_curr.ptr < i_end0_curr) {
66552
701k
      v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
66553
701k
      v_b128 = _mm_unpacklo_epi8(v_b128, v_z128);
66554
701k
      v_pa128 = _mm_sub_epi16(v_b128, v_c128);
66555
701k
      v_pb128 = _mm_sub_epi16(v_a128, v_c128);
66556
701k
      v_pc128 = _mm_add_epi16(v_pa128, v_pb128);
66557
701k
      v_pa128 = _mm_abs_epi16(v_pa128);
66558
701k
      v_pb128 = _mm_abs_epi16(v_pb128);
66559
701k
      v_pc128 = _mm_abs_epi16(v_pc128);
66560
701k
      v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128));
66561
701k
      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));
66562
701k
      v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
66563
701k
      v_x128 = _mm_unpacklo_epi8(v_x128, v_z128);
66564
701k
      v_x128 = _mm_add_epi8(v_x128, v_p128);
66565
701k
      v_a128 = v_x128;
66566
701k
      v_c128 = v_b128;
66567
701k
      v_x128 = _mm_packus_epi16(v_x128, v_x128);
66568
701k
      wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128))));
66569
701k
      v_curr.ptr += 3;
66570
701k
      v_prev.ptr += 3;
66571
701k
      v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
66572
701k
      v_b128 = _mm_unpacklo_epi8(v_b128, v_z128);
66573
701k
      v_pa128 = _mm_sub_epi16(v_b128, v_c128);
66574
701k
      v_pb128 = _mm_sub_epi16(v_a128, v_c128);
66575
701k
      v_pc128 = _mm_add_epi16(v_pa128, v_pb128);
66576
701k
      v_pa128 = _mm_abs_epi16(v_pa128);
66577
701k
      v_pb128 = _mm_abs_epi16(v_pb128);
66578
701k
      v_pc128 = _mm_abs_epi16(v_pc128);
66579
701k
      v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128));
66580
701k
      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));
66581
701k
      v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
66582
701k
      v_x128 = _mm_unpacklo_epi8(v_x128, v_z128);
66583
701k
      v_x128 = _mm_add_epi8(v_x128, v_p128);
66584
701k
      v_a128 = v_x128;
66585
701k
      v_c128 = v_b128;
66586
701k
      v_x128 = _mm_packus_epi16(v_x128, v_x128);
66587
701k
      wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128))));
66588
701k
      v_curr.ptr += 3;
66589
701k
      v_prev.ptr += 3;
66590
701k
    }
66591
5.71k
    v_curr.len = 4;
66592
5.71k
    v_prev.len = 4;
66593
5.71k
    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));
66594
6.54k
    while (v_curr.ptr < i_end1_curr) {
66595
832
      v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
66596
832
      v_b128 = _mm_unpacklo_epi8(v_b128, v_z128);
66597
832
      v_pa128 = _mm_sub_epi16(v_b128, v_c128);
66598
832
      v_pb128 = _mm_sub_epi16(v_a128, v_c128);
66599
832
      v_pc128 = _mm_add_epi16(v_pa128, v_pb128);
66600
832
      v_pa128 = _mm_abs_epi16(v_pa128);
66601
832
      v_pb128 = _mm_abs_epi16(v_pb128);
66602
832
      v_pc128 = _mm_abs_epi16(v_pc128);
66603
832
      v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128));
66604
832
      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));
66605
832
      v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
66606
832
      v_x128 = _mm_unpacklo_epi8(v_x128, v_z128);
66607
832
      v_x128 = _mm_add_epi8(v_x128, v_p128);
66608
832
      v_a128 = v_x128;
66609
832
      v_c128 = v_b128;
66610
832
      v_x128 = _mm_packus_epi16(v_x128, v_x128);
66611
832
      wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128))));
66612
832
      v_curr.ptr += 3;
66613
832
      v_prev.ptr += 3;
66614
832
    }
66615
5.71k
    v_curr.len = 3;
66616
5.71k
    v_prev.len = 3;
66617
5.71k
    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));
66618
11.3k
    while (v_curr.ptr < i_end2_curr) {
66619
5.60k
      v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u24le__no_bounds_check(v_prev.ptr)));
66620
5.60k
      v_b128 = _mm_unpacklo_epi8(v_b128, v_z128);
66621
5.60k
      v_pa128 = _mm_sub_epi16(v_b128, v_c128);
66622
5.60k
      v_pb128 = _mm_sub_epi16(v_a128, v_c128);
66623
5.60k
      v_pc128 = _mm_add_epi16(v_pa128, v_pb128);
66624
5.60k
      v_pa128 = _mm_abs_epi16(v_pa128);
66625
5.60k
      v_pb128 = _mm_abs_epi16(v_pb128);
66626
5.60k
      v_pc128 = _mm_abs_epi16(v_pc128);
66627
5.60k
      v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128));
66628
5.60k
      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));
66629
5.60k
      v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u24le__no_bounds_check(v_curr.ptr)));
66630
5.60k
      v_x128 = _mm_unpacklo_epi8(v_x128, v_z128);
66631
5.60k
      v_x128 = _mm_add_epi8(v_x128, v_p128);
66632
5.60k
      v_x128 = _mm_packus_epi16(v_x128, v_x128);
66633
5.60k
      wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128))));
66634
5.60k
      v_curr.ptr += 3;
66635
5.60k
      v_prev.ptr += 3;
66636
5.60k
    }
66637
5.71k
    v_curr.len = 0;
66638
5.71k
    v_prev.len = 0;
66639
5.71k
  }
66640
5.71k
  return wuffs_base__make_empty_struct();
66641
5.71k
}
66642
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
66643
// โ€ผ WUFFS MULTI-FILE SECTION -x86_sse42
66644
66645
// โ€ผ WUFFS MULTI-FILE SECTION +x86_sse42
66646
// -------- func png.decoder.filter_4_distance_4_x86_sse42
66647
66648
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
66649
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
66650
WUFFS_BASE__GENERATED_C_CODE
66651
static wuffs_base__empty_struct
66652
wuffs_png__decoder__filter_4_distance_4_x86_sse42(
66653
    wuffs_png__decoder* self,
66654
    wuffs_base__slice_u8 a_curr,
66655
7.02k
    wuffs_base__slice_u8 a_prev) {
66656
7.02k
  wuffs_base__slice_u8 v_curr = {0};
66657
7.02k
  wuffs_base__slice_u8 v_prev = {0};
66658
7.02k
  __m128i v_x128 = {0};
66659
7.02k
  __m128i v_a128 = {0};
66660
7.02k
  __m128i v_b128 = {0};
66661
7.02k
  __m128i v_c128 = {0};
66662
7.02k
  __m128i v_p128 = {0};
66663
7.02k
  __m128i v_pa128 = {0};
66664
7.02k
  __m128i v_pb128 = {0};
66665
7.02k
  __m128i v_pc128 = {0};
66666
7.02k
  __m128i v_smallest128 = {0};
66667
7.02k
  __m128i v_z128 = {0};
66668
66669
7.02k
  {
66670
7.02k
    wuffs_base__slice_u8 i_slice_curr = a_curr;
66671
7.02k
    v_curr.ptr = i_slice_curr.ptr;
66672
7.02k
    wuffs_base__slice_u8 i_slice_prev = a_prev;
66673
7.02k
    v_prev.ptr = i_slice_prev.ptr;
66674
7.02k
    i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len)));
66675
7.02k
    v_curr.len = 4;
66676
7.02k
    v_prev.len = 4;
66677
7.02k
    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));
66678
560k
    while (v_curr.ptr < i_end0_curr) {
66679
553k
      v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
66680
553k
      v_b128 = _mm_unpacklo_epi8(v_b128, v_z128);
66681
553k
      v_pa128 = _mm_sub_epi16(v_b128, v_c128);
66682
553k
      v_pb128 = _mm_sub_epi16(v_a128, v_c128);
66683
553k
      v_pc128 = _mm_add_epi16(v_pa128, v_pb128);
66684
553k
      v_pa128 = _mm_abs_epi16(v_pa128);
66685
553k
      v_pb128 = _mm_abs_epi16(v_pb128);
66686
553k
      v_pc128 = _mm_abs_epi16(v_pc128);
66687
553k
      v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128));
66688
553k
      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));
66689
553k
      v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
66690
553k
      v_x128 = _mm_unpacklo_epi8(v_x128, v_z128);
66691
553k
      v_x128 = _mm_add_epi8(v_x128, v_p128);
66692
553k
      v_a128 = v_x128;
66693
553k
      v_c128 = v_b128;
66694
553k
      v_x128 = _mm_packus_epi16(v_x128, v_x128);
66695
553k
      wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128))));
66696
553k
      v_curr.ptr += 4;
66697
553k
      v_prev.ptr += 4;
66698
553k
      v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
66699
553k
      v_b128 = _mm_unpacklo_epi8(v_b128, v_z128);
66700
553k
      v_pa128 = _mm_sub_epi16(v_b128, v_c128);
66701
553k
      v_pb128 = _mm_sub_epi16(v_a128, v_c128);
66702
553k
      v_pc128 = _mm_add_epi16(v_pa128, v_pb128);
66703
553k
      v_pa128 = _mm_abs_epi16(v_pa128);
66704
553k
      v_pb128 = _mm_abs_epi16(v_pb128);
66705
553k
      v_pc128 = _mm_abs_epi16(v_pc128);
66706
553k
      v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128));
66707
553k
      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));
66708
553k
      v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
66709
553k
      v_x128 = _mm_unpacklo_epi8(v_x128, v_z128);
66710
553k
      v_x128 = _mm_add_epi8(v_x128, v_p128);
66711
553k
      v_a128 = v_x128;
66712
553k
      v_c128 = v_b128;
66713
553k
      v_x128 = _mm_packus_epi16(v_x128, v_x128);
66714
553k
      wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128))));
66715
553k
      v_curr.ptr += 4;
66716
553k
      v_prev.ptr += 4;
66717
553k
    }
66718
7.02k
    v_curr.len = 4;
66719
7.02k
    v_prev.len = 4;
66720
7.02k
    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));
66721
8.19k
    while (v_curr.ptr < i_end1_curr) {
66722
1.17k
      v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
66723
1.17k
      v_b128 = _mm_unpacklo_epi8(v_b128, v_z128);
66724
1.17k
      v_pa128 = _mm_sub_epi16(v_b128, v_c128);
66725
1.17k
      v_pb128 = _mm_sub_epi16(v_a128, v_c128);
66726
1.17k
      v_pc128 = _mm_add_epi16(v_pa128, v_pb128);
66727
1.17k
      v_pa128 = _mm_abs_epi16(v_pa128);
66728
1.17k
      v_pb128 = _mm_abs_epi16(v_pb128);
66729
1.17k
      v_pc128 = _mm_abs_epi16(v_pc128);
66730
1.17k
      v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128));
66731
1.17k
      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));
66732
1.17k
      v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
66733
1.17k
      v_x128 = _mm_unpacklo_epi8(v_x128, v_z128);
66734
1.17k
      v_x128 = _mm_add_epi8(v_x128, v_p128);
66735
1.17k
      v_a128 = v_x128;
66736
1.17k
      v_c128 = v_b128;
66737
1.17k
      v_x128 = _mm_packus_epi16(v_x128, v_x128);
66738
1.17k
      wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128))));
66739
1.17k
      v_curr.ptr += 4;
66740
1.17k
      v_prev.ptr += 4;
66741
1.17k
    }
66742
7.02k
    v_curr.len = 0;
66743
7.02k
    v_prev.len = 0;
66744
7.02k
  }
66745
7.02k
  return wuffs_base__make_empty_struct();
66746
7.02k
}
66747
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
66748
// โ€ผ WUFFS MULTI-FILE SECTION -x86_sse42
66749
66750
// -------- func png.decoder.get_quirk
66751
66752
WUFFS_BASE__GENERATED_C_CODE
66753
WUFFS_BASE__MAYBE_STATIC uint64_t
66754
wuffs_png__decoder__get_quirk(
66755
    const wuffs_png__decoder* self,
66756
0
    uint32_t a_key) {
66757
0
  if (!self) {
66758
0
    return 0;
66759
0
  }
66760
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
66761
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
66762
0
    return 0;
66763
0
  }
66764
66765
0
  if ((a_key == 1u) && self->private_impl.f_ignore_checksum) {
66766
0
    return 1u;
66767
0
  }
66768
0
  return 0u;
66769
0
}
66770
66771
// -------- func png.decoder.set_quirk
66772
66773
WUFFS_BASE__GENERATED_C_CODE
66774
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
66775
wuffs_png__decoder__set_quirk(
66776
    wuffs_png__decoder* self,
66777
    uint32_t a_key,
66778
0
    uint64_t a_value) {
66779
0
  if (!self) {
66780
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
66781
0
  }
66782
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
66783
0
    return wuffs_base__make_status(
66784
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
66785
0
        ? wuffs_base__error__disabled_by_previous_error
66786
0
        : wuffs_base__error__initialize_not_called);
66787
0
  }
66788
66789
0
  if (a_key == 1u) {
66790
0
    self->private_impl.f_ignore_checksum = (a_value > 0u);
66791
0
    wuffs_zlib__decoder__set_quirk(&self->private_data.f_zlib, a_key, a_value);
66792
0
    return wuffs_base__make_status(NULL);
66793
0
  }
66794
0
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
66795
0
}
66796
66797
// -------- func png.decoder.decode_image_config
66798
66799
WUFFS_BASE__GENERATED_C_CODE
66800
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
66801
wuffs_png__decoder__decode_image_config(
66802
    wuffs_png__decoder* self,
66803
    wuffs_base__image_config* a_dst,
66804
5.73k
    wuffs_base__io_buffer* a_src) {
66805
5.73k
  if (!self) {
66806
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
66807
0
  }
66808
5.73k
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
66809
0
    return wuffs_base__make_status(
66810
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
66811
0
        ? wuffs_base__error__disabled_by_previous_error
66812
0
        : wuffs_base__error__initialize_not_called);
66813
0
  }
66814
5.73k
  if (!a_src) {
66815
0
    self->private_impl.magic = WUFFS_BASE__DISABLED;
66816
0
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
66817
0
  }
66818
5.73k
  if ((self->private_impl.active_coroutine != 0) &&
66819
5.73k
      (self->private_impl.active_coroutine != 1)) {
66820
0
    self->private_impl.magic = WUFFS_BASE__DISABLED;
66821
0
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
66822
0
  }
66823
5.73k
  self->private_impl.active_coroutine = 0;
66824
5.73k
  wuffs_base__status status = wuffs_base__make_status(NULL);
66825
66826
5.73k
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
66827
66828
5.73k
  uint32_t coro_susp_point = self->private_impl.p_decode_image_config;
66829
5.73k
  switch (coro_susp_point) {
66830
5.73k
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
66831
66832
5.73k
    while (true) {
66833
5.73k
      {
66834
5.73k
        wuffs_base__status t_0 = wuffs_png__decoder__do_decode_image_config(self, a_dst, a_src);
66835
5.73k
        v_status = t_0;
66836
5.73k
      }
66837
5.73k
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
66838
385
        status = wuffs_base__make_status(wuffs_png__error__truncated_input);
66839
385
        goto exit;
66840
385
      }
66841
5.34k
      status = v_status;
66842
5.34k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
66843
0
    }
66844
66845
4.03k
    ok:
66846
4.03k
    self->private_impl.p_decode_image_config = 0;
66847
4.03k
    goto exit;
66848
5.73k
  }
66849
66850
0
  goto suspend;
66851
320
  suspend:
66852
320
  self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
66853
320
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
66854
66855
320
  goto exit;
66856
5.73k
  exit:
66857
5.73k
  if (wuffs_base__status__is_error(&status)) {
66858
1.37k
    self->private_impl.magic = WUFFS_BASE__DISABLED;
66859
1.37k
  }
66860
5.73k
  return status;
66861
5.73k
}
66862
66863
// -------- func png.decoder.do_decode_image_config
66864
66865
WUFFS_BASE__GENERATED_C_CODE
66866
static wuffs_base__status
66867
wuffs_png__decoder__do_decode_image_config(
66868
    wuffs_png__decoder* self,
66869
    wuffs_base__image_config* a_dst,
66870
5.73k
    wuffs_base__io_buffer* a_src) {
66871
5.73k
  wuffs_base__status status = wuffs_base__make_status(NULL);
66872
66873
5.73k
  uint64_t v_magic = 0;
66874
5.73k
  uint64_t v_mark = 0;
66875
5.73k
  uint32_t v_checksum_have = 0;
66876
5.73k
  uint32_t v_checksum_want = 0;
66877
5.73k
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
66878
66879
5.73k
  const uint8_t* iop_a_src = NULL;
66880
5.73k
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
66881
5.73k
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
66882
5.73k
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
66883
5.73k
  if (a_src && a_src->data.ptr) {
66884
5.73k
    io0_a_src = a_src->data.ptr;
66885
5.73k
    io1_a_src = io0_a_src + a_src->meta.ri;
66886
5.73k
    iop_a_src = io1_a_src;
66887
5.73k
    io2_a_src = io0_a_src + a_src->meta.wi;
66888
5.73k
  }
66889
66890
5.73k
  uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config;
66891
5.73k
  if (coro_susp_point) {
66892
0
    v_checksum_have = self->private_data.s_do_decode_image_config.v_checksum_have;
66893
0
  }
66894
5.73k
  switch (coro_susp_point) {
66895
5.73k
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
66896
66897
5.73k
    if (self->private_impl.f_call_sequence != 0u) {
66898
0
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
66899
0
      goto exit;
66900
5.73k
    } else if ( ! self->private_impl.f_seen_ihdr) {
66901
5.73k
      {
66902
5.73k
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
66903
5.73k
        uint64_t t_0;
66904
5.73k
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) {
66905
5.72k
          t_0 = wuffs_base__peek_u64le__no_bounds_check(iop_a_src);
66906
5.72k
          iop_a_src += 8;
66907
5.72k
        } else {
66908
10
          self->private_data.s_do_decode_image_config.scratch = 0;
66909
10
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
66910
44
          while (true) {
66911
44
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
66912
10
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
66913
10
              goto suspend;
66914
10
            }
66915
34
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
66916
34
            uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
66917
34
            *scratch <<= 8;
66918
34
            *scratch >>= 8;
66919
34
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
66920
34
            if (num_bits_0 == 56) {
66921
0
              t_0 = ((uint64_t)(*scratch));
66922
0
              break;
66923
0
            }
66924
34
            num_bits_0 += 8u;
66925
34
            *scratch |= ((uint64_t)(num_bits_0)) << 56;
66926
34
          }
66927
10
        }
66928
5.72k
        v_magic = t_0;
66929
5.72k
      }
66930
5.72k
      if (v_magic != 727905341920923785u) {
66931
99
        status = wuffs_base__make_status(wuffs_png__error__bad_header);
66932
99
        goto exit;
66933
99
      }
66934
5.62k
      {
66935
5.62k
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
66936
5.62k
        uint64_t t_1;
66937
5.62k
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) {
66938
5.61k
          t_1 = wuffs_base__peek_u64le__no_bounds_check(iop_a_src);
66939
5.61k
          iop_a_src += 8;
66940
5.61k
        } else {
66941
8
          self->private_data.s_do_decode_image_config.scratch = 0;
66942
8
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
66943
36
          while (true) {
66944
36
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
66945
8
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
66946
8
              goto suspend;
66947
8
            }
66948
28
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
66949
28
            uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
66950
28
            *scratch <<= 8;
66951
28
            *scratch >>= 8;
66952
28
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
66953
28
            if (num_bits_1 == 56) {
66954
0
              t_1 = ((uint64_t)(*scratch));
66955
0
              break;
66956
0
            }
66957
28
            num_bits_1 += 8u;
66958
28
            *scratch |= ((uint64_t)(num_bits_1)) << 56;
66959
28
          }
66960
8
        }
66961
5.61k
        v_magic = t_1;
66962
5.61k
      }
66963
5.61k
      if (v_magic != 5927942488114331648u) {
66964
149
        if (v_magic == 5278895250759221248u) {
66965
1
          status = wuffs_base__make_status(wuffs_png__error__unsupported_cgbi_extension);
66966
1
          goto exit;
66967
1
        }
66968
148
        status = wuffs_base__make_status(wuffs_png__error__bad_header);
66969
148
        goto exit;
66970
149
      }
66971
5.46k
      self->private_impl.f_chunk_type_array[0u] = 73u;
66972
5.46k
      self->private_impl.f_chunk_type_array[1u] = 72u;
66973
5.46k
      self->private_impl.f_chunk_type_array[2u] = 68u;
66974
5.46k
      self->private_impl.f_chunk_type_array[3u] = 82u;
66975
5.46k
      wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32,
66976
5.46k
          sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
66977
5.46k
      wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__make_slice_u8(self->private_impl.f_chunk_type_array, 4));
66978
5.46k
      while (true) {
66979
5.46k
        v_mark = ((uint64_t)(iop_a_src - io0_a_src));
66980
5.46k
        {
66981
5.46k
          if (a_src) {
66982
5.46k
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
66983
5.46k
          }
66984
5.46k
          wuffs_base__status t_2 = wuffs_png__decoder__decode_ihdr(self, a_src);
66985
5.46k
          v_status = t_2;
66986
5.46k
          if (a_src) {
66987
5.46k
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
66988
5.46k
          }
66989
5.46k
        }
66990
5.46k
        if ( ! self->private_impl.f_ignore_checksum) {
66991
5.46k
          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));
66992
5.46k
        }
66993
5.46k
        if (wuffs_base__status__is_ok(&v_status)) {
66994
5.24k
          break;
66995
5.24k
        }
66996
223
        status = v_status;
66997
223
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5);
66998
0
      }
66999
5.24k
      {
67000
5.24k
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
67001
5.24k
        uint32_t t_3;
67002
5.24k
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
67003
5.22k
          t_3 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
67004
5.22k
          iop_a_src += 4;
67005
5.22k
        } else {
67006
16
          self->private_data.s_do_decode_image_config.scratch = 0;
67007
16
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
67008
22
          while (true) {
67009
22
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
67010
16
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
67011
16
              goto suspend;
67012
16
            }
67013
6
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
67014
6
            uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFFu));
67015
6
            *scratch >>= 8;
67016
6
            *scratch <<= 8;
67017
6
            *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3);
67018
6
            if (num_bits_3 == 24) {
67019
0
              t_3 = ((uint32_t)(*scratch >> 32));
67020
0
              break;
67021
0
            }
67022
6
            num_bits_3 += 8u;
67023
6
            *scratch |= ((uint64_t)(num_bits_3));
67024
6
          }
67025
16
        }
67026
5.22k
        v_checksum_want = t_3;
67027
5.22k
      }
67028
5.22k
      if ( ! self->private_impl.f_ignore_checksum && (v_checksum_have != v_checksum_want)) {
67029
44
        status = wuffs_base__make_status(wuffs_png__error__bad_checksum);
67030
44
        goto exit;
67031
44
      }
67032
5.18k
      self->private_impl.f_seen_ihdr = true;
67033
5.18k
    } else if (self->private_impl.f_metadata_fourcc != 0u) {
67034
0
      self->private_impl.f_call_sequence = 16u;
67035
0
      status = wuffs_base__make_status(wuffs_base__note__metadata_reported);
67036
0
      goto ok;
67037
0
    }
67038
8.49k
    while (true) {
67039
8.49k
      if (((uint64_t)(io2_a_src - iop_a_src)) < 8u) {
67040
22
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
67041
22
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8);
67042
0
        continue;
67043
22
      }
67044
8.46k
      self->private_impl.f_chunk_length = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
67045
8.46k
      self->private_impl.f_chunk_type = ((uint32_t)((wuffs_base__peek_u64le__no_bounds_check(iop_a_src) >> 32u)));
67046
8.46k
      if (self->private_impl.f_chunk_type == 1413563465u) {
67047
4.47k
        if ( ! self->private_impl.f_seen_actl || self->private_impl.f_seen_fctl) {
67048
4.01k
          break;
67049
4.01k
        }
67050
461
        self->private_impl.f_seen_idat = true;
67051
3.99k
      } else if (self->private_impl.f_chunk_type == 1413571686u) {
67052
24
        if (self->private_impl.f_seen_idat && self->private_impl.f_seen_fctl) {
67053
22
          break;
67054
22
        }
67055
2
        status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
67056
2
        goto exit;
67057
24
      }
67058
4.43k
      iop_a_src += 8u;
67059
4.43k
      if ( ! self->private_impl.f_ignore_checksum && ((self->private_impl.f_chunk_type & 32u) == 0u)) {
67060
916
        self->private_impl.f_chunk_type_array[0u] = ((uint8_t)((self->private_impl.f_chunk_type >> 0u)));
67061
916
        self->private_impl.f_chunk_type_array[1u] = ((uint8_t)((self->private_impl.f_chunk_type >> 8u)));
67062
916
        self->private_impl.f_chunk_type_array[2u] = ((uint8_t)((self->private_impl.f_chunk_type >> 16u)));
67063
916
        self->private_impl.f_chunk_type_array[3u] = ((uint8_t)((self->private_impl.f_chunk_type >> 24u)));
67064
916
        wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32,
67065
916
            sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
67066
916
        wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__make_slice_u8(self->private_impl.f_chunk_type_array, 4));
67067
916
      }
67068
4.43k
      while (true) {
67069
4.43k
        v_mark = ((uint64_t)(iop_a_src - io0_a_src));
67070
4.43k
        {
67071
4.43k
          if (a_src) {
67072
4.43k
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
67073
4.43k
          }
67074
4.43k
          wuffs_base__status t_4 = wuffs_png__decoder__decode_other_chunk(self, a_src, false);
67075
4.43k
          v_status = t_4;
67076
4.43k
          if (a_src) {
67077
4.43k
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
67078
4.43k
          }
67079
4.43k
        }
67080
4.43k
        if ( ! self->private_impl.f_ignore_checksum && ((self->private_impl.f_chunk_type & 32u) == 0u)) {
67081
916
          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));
67082
916
        }
67083
4.43k
        if (wuffs_base__status__is_ok(&v_status)) {
67084
3.44k
          break;
67085
3.44k
        }
67086
982
        status = v_status;
67087
982
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9);
67088
0
      }
67089
3.44k
      if (self->private_impl.f_metadata_fourcc != 0u) {
67090
0
        self->private_impl.f_call_sequence = 16u;
67091
0
        status = wuffs_base__make_status(wuffs_base__note__metadata_reported);
67092
0
        goto ok;
67093
0
      }
67094
3.44k
      {
67095
3.44k
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
67096
3.44k
        uint32_t t_5;
67097
3.44k
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
67098
3.35k
          t_5 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
67099
3.35k
          iop_a_src += 4;
67100
3.35k
        } else {
67101
92
          self->private_data.s_do_decode_image_config.scratch = 0;
67102
92
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11);
67103
109
          while (true) {
67104
109
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
67105
92
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
67106
92
              goto suspend;
67107
92
            }
67108
17
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
67109
17
            uint32_t num_bits_5 = ((uint32_t)(*scratch & 0xFFu));
67110
17
            *scratch >>= 8;
67111
17
            *scratch <<= 8;
67112
17
            *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_5);
67113
17
            if (num_bits_5 == 24) {
67114
0
              t_5 = ((uint32_t)(*scratch >> 32));
67115
0
              break;
67116
0
            }
67117
17
            num_bits_5 += 8u;
67118
17
            *scratch |= ((uint64_t)(num_bits_5));
67119
17
          }
67120
92
        }
67121
3.35k
        v_checksum_want = t_5;
67122
3.35k
      }
67123
3.35k
      if ( ! self->private_impl.f_ignore_checksum && ((self->private_impl.f_chunk_type & 32u) == 0u) && (v_checksum_have != v_checksum_want)) {
67124
48
        status = wuffs_base__make_status(wuffs_png__error__bad_checksum);
67125
48
        goto exit;
67126
48
      }
67127
3.35k
    }
67128
4.03k
    if ((self->private_impl.f_color_type == 3u) &&  ! self->private_impl.f_seen_plte) {
67129
1
      status = wuffs_base__make_status(wuffs_png__error__missing_palette);
67130
1
      goto exit;
67131
1
    }
67132
4.03k
    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)));
67133
4.03k
    self->private_impl.f_first_config_io_position = self->private_impl.f_frame_config_io_position;
67134
4.03k
    if (a_dst != NULL) {
67135
4.03k
      wuffs_base__image_config__set(
67136
4.03k
          a_dst,
67137
4.03k
          self->private_impl.f_dst_pixfmt,
67138
4.03k
          0u,
67139
4.03k
          self->private_impl.f_width,
67140
4.03k
          self->private_impl.f_height,
67141
4.03k
          self->private_impl.f_first_config_io_position,
67142
4.03k
          ((self->private_impl.f_color_type <= 3u) &&  ! self->private_impl.f_seen_trns));
67143
4.03k
    }
67144
4.03k
    if ( ! self->private_impl.f_seen_actl) {
67145
3.81k
      self->private_impl.f_num_animation_frames_value = 1u;
67146
3.81k
      self->private_impl.f_first_rect_x0 = 0u;
67147
3.81k
      self->private_impl.f_first_rect_y0 = 0u;
67148
3.81k
      self->private_impl.f_first_rect_x1 = self->private_impl.f_width;
67149
3.81k
      self->private_impl.f_first_rect_y1 = self->private_impl.f_height;
67150
3.81k
      self->private_impl.f_first_duration = 0u;
67151
3.81k
      self->private_impl.f_first_disposal = 0u;
67152
3.81k
      self->private_impl.f_first_overwrite_instead_of_blend = false;
67153
3.81k
    }
67154
4.03k
    self->private_impl.f_call_sequence = 32u;
67155
67156
4.03k
    ok:
67157
4.03k
    self->private_impl.p_do_decode_image_config = 0;
67158
4.03k
    goto exit;
67159
5.73k
  }
67160
67161
0
  goto suspend;
67162
705
  suspend:
67163
705
  self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
67164
705
  self->private_data.s_do_decode_image_config.v_checksum_have = v_checksum_have;
67165
67166
705
  goto exit;
67167
5.73k
  exit:
67168
5.73k
  if (a_src && a_src->data.ptr) {
67169
5.73k
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
67170
5.73k
  }
67171
67172
5.73k
  return status;
67173
5.73k
}
67174
67175
// -------- func png.decoder.decode_ihdr
67176
67177
WUFFS_BASE__GENERATED_C_CODE
67178
static wuffs_base__status
67179
wuffs_png__decoder__decode_ihdr(
67180
    wuffs_png__decoder* self,
67181
5.46k
    wuffs_base__io_buffer* a_src) {
67182
5.46k
  wuffs_base__status status = wuffs_base__make_status(NULL);
67183
67184
5.46k
  uint32_t v_a32 = 0;
67185
5.46k
  uint8_t v_a8 = 0;
67186
67187
5.46k
  const uint8_t* iop_a_src = NULL;
67188
5.46k
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
67189
5.46k
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
67190
5.46k
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
67191
5.46k
  if (a_src && a_src->data.ptr) {
67192
5.46k
    io0_a_src = a_src->data.ptr;
67193
5.46k
    io1_a_src = io0_a_src + a_src->meta.ri;
67194
5.46k
    iop_a_src = io1_a_src;
67195
5.46k
    io2_a_src = io0_a_src + a_src->meta.wi;
67196
5.46k
  }
67197
67198
5.46k
  uint32_t coro_susp_point = self->private_impl.p_decode_ihdr;
67199
5.46k
  switch (coro_susp_point) {
67200
5.46k
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
67201
67202
5.46k
    {
67203
5.46k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
67204
5.46k
      uint32_t t_0;
67205
5.46k
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
67206
5.46k
        t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
67207
5.46k
        iop_a_src += 4;
67208
5.46k
      } else {
67209
4
        self->private_data.s_decode_ihdr.scratch = 0;
67210
4
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
67211
10
        while (true) {
67212
10
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
67213
4
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
67214
4
            goto suspend;
67215
4
          }
67216
6
          uint64_t* scratch = &self->private_data.s_decode_ihdr.scratch;
67217
6
          uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu));
67218
6
          *scratch >>= 8;
67219
6
          *scratch <<= 8;
67220
6
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0);
67221
6
          if (num_bits_0 == 24) {
67222
0
            t_0 = ((uint32_t)(*scratch >> 32));
67223
0
            break;
67224
0
          }
67225
6
          num_bits_0 += 8u;
67226
6
          *scratch |= ((uint64_t)(num_bits_0));
67227
6
        }
67228
4
      }
67229
5.46k
      v_a32 = t_0;
67230
5.46k
    }
67231
5.46k
    if ((v_a32 == 0u) || (v_a32 > 2147483647u)) {
67232
32
      status = wuffs_base__make_status(wuffs_png__error__bad_header);
67233
32
      goto exit;
67234
5.43k
    } else if (v_a32 > 16777215u) {
67235
9
      status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension);
67236
9
      goto exit;
67237
9
    }
67238
5.42k
    self->private_impl.f_width = v_a32;
67239
5.42k
    {
67240
5.42k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
67241
5.42k
      uint32_t t_1;
67242
5.42k
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
67243
5.38k
        t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
67244
5.38k
        iop_a_src += 4;
67245
5.38k
      } else {
67246
34
        self->private_data.s_decode_ihdr.scratch = 0;
67247
34
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
67248
40
        while (true) {
67249
40
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
67250
34
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
67251
34
            goto suspend;
67252
34
          }
67253
6
          uint64_t* scratch = &self->private_data.s_decode_ihdr.scratch;
67254
6
          uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu));
67255
6
          *scratch >>= 8;
67256
6
          *scratch <<= 8;
67257
6
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1);
67258
6
          if (num_bits_1 == 24) {
67259
0
            t_1 = ((uint32_t)(*scratch >> 32));
67260
0
            break;
67261
0
          }
67262
6
          num_bits_1 += 8u;
67263
6
          *scratch |= ((uint64_t)(num_bits_1));
67264
6
        }
67265
34
      }
67266
5.38k
      v_a32 = t_1;
67267
5.38k
    }
67268
5.38k
    if ((v_a32 == 0u) || (v_a32 > 2147483647u)) {
67269
32
      status = wuffs_base__make_status(wuffs_png__error__bad_header);
67270
32
      goto exit;
67271
5.35k
    } else if (v_a32 > 16777215u) {
67272
13
      status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension);
67273
13
      goto exit;
67274
13
    }
67275
5.34k
    self->private_impl.f_height = v_a32;
67276
5.34k
    {
67277
5.34k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
67278
5.34k
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
67279
28
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
67280
28
        goto suspend;
67281
28
      }
67282
5.31k
      uint8_t t_2 = *iop_a_src++;
67283
5.31k
      v_a8 = t_2;
67284
5.31k
    }
67285
5.31k
    if (v_a8 > 16u) {
67286
3
      status = wuffs_base__make_status(wuffs_png__error__bad_header);
67287
3
      goto exit;
67288
3
    }
67289
5.31k
    self->private_impl.f_depth = v_a8;
67290
5.31k
    {
67291
5.31k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
67292
5.31k
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
67293
6
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
67294
6
        goto suspend;
67295
6
      }
67296
5.30k
      uint8_t t_3 = *iop_a_src++;
67297
5.30k
      v_a8 = t_3;
67298
5.30k
    }
67299
5.30k
    if ((v_a8 == 1u) || (v_a8 == 5u) || (v_a8 > 6u)) {
67300
9
      status = wuffs_base__make_status(wuffs_png__error__bad_header);
67301
9
      goto exit;
67302
9
    }
67303
5.29k
    self->private_impl.f_color_type = v_a8;
67304
5.29k
    {
67305
5.29k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
67306
5.29k
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
67307
5
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
67308
5
        goto suspend;
67309
5
      }
67310
5.29k
      uint8_t t_4 = *iop_a_src++;
67311
5.29k
      v_a8 = t_4;
67312
5.29k
    }
67313
5.29k
    if (v_a8 != 0u) {
67314
8
      status = wuffs_base__make_status(wuffs_png__error__unsupported_png_compression_method);
67315
8
      goto exit;
67316
8
    }
67317
5.28k
    {
67318
5.28k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
67319
5.28k
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
67320
1
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
67321
1
        goto suspend;
67322
1
      }
67323
5.28k
      uint8_t t_5 = *iop_a_src++;
67324
5.28k
      v_a8 = t_5;
67325
5.28k
    }
67326
5.28k
    if (v_a8 != 0u) {
67327
8
      status = wuffs_base__make_status(wuffs_png__error__bad_header);
67328
8
      goto exit;
67329
8
    }
67330
5.27k
    {
67331
5.27k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
67332
5.27k
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
67333
1
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
67334
1
        goto suspend;
67335
1
      }
67336
5.27k
      uint8_t t_6 = *iop_a_src++;
67337
5.27k
      v_a8 = t_6;
67338
5.27k
    }
67339
5.27k
    if (v_a8 == 0u) {
67340
2.56k
      self->private_impl.f_interlace_pass = 0u;
67341
2.70k
    } else if (v_a8 == 1u) {
67342
2.69k
      self->private_impl.f_interlace_pass = 1u;
67343
2.69k
      self->private_impl.choosy_filter_and_swizzle = (
67344
2.69k
          &wuffs_png__decoder__filter_and_swizzle_tricky);
67345
2.69k
    } else {
67346
9
      status = wuffs_base__make_status(wuffs_png__error__bad_header);
67347
9
      goto exit;
67348
9
    }
67349
5.26k
    self->private_impl.f_filter_distance = 0u;
67350
5.26k
    wuffs_png__decoder__assign_filter_distance(self);
67351
5.26k
    if (self->private_impl.f_filter_distance == 0u) {
67352
21
      status = wuffs_base__make_status(wuffs_png__error__bad_header);
67353
21
      goto exit;
67354
21
    }
67355
5.24k
    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)));
67356
5.24k
    wuffs_png__decoder__choose_filter_implementations(self);
67357
67358
5.24k
    goto ok;
67359
5.24k
    ok:
67360
5.24k
    self->private_impl.p_decode_ihdr = 0;
67361
5.24k
    goto exit;
67362
5.46k
  }
67363
67364
0
  goto suspend;
67365
79
  suspend:
67366
79
  self->private_impl.p_decode_ihdr = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
67367
67368
79
  goto exit;
67369
5.46k
  exit:
67370
5.46k
  if (a_src && a_src->data.ptr) {
67371
5.46k
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
67372
5.46k
  }
67373
67374
5.46k
  return status;
67375
5.46k
}
67376
67377
// -------- func png.decoder.assign_filter_distance
67378
67379
WUFFS_BASE__GENERATED_C_CODE
67380
static wuffs_base__empty_struct
67381
wuffs_png__decoder__assign_filter_distance(
67382
5.26k
    wuffs_png__decoder* self) {
67383
5.26k
  if (self->private_impl.f_depth < 8u) {
67384
1.41k
    if ((self->private_impl.f_depth != 1u) && (self->private_impl.f_depth != 2u) && (self->private_impl.f_depth != 4u)) {
67385
4
      return wuffs_base__make_empty_struct();
67386
1.41k
    } else if (self->private_impl.f_color_type == 0u) {
67387
1.22k
      self->private_impl.f_dst_pixfmt = 536870920u;
67388
1.22k
      self->private_impl.f_src_pixfmt = 536870920u;
67389
1.22k
    } else if (self->private_impl.f_color_type == 3u) {
67390
185
      self->private_impl.f_dst_pixfmt = 2198077448u;
67391
185
      self->private_impl.f_src_pixfmt = 2198077448u;
67392
185
    } else {
67393
3
      return wuffs_base__make_empty_struct();
67394
3
    }
67395
1.41k
    self->private_impl.f_filter_distance = 1u;
67396
1.41k
    self->private_impl.choosy_filter_and_swizzle = (
67397
1.41k
        &wuffs_png__decoder__filter_and_swizzle_tricky);
67398
3.84k
  } else if (self->private_impl.f_color_type == 0u) {
67399
621
    if (self->private_impl.f_depth == 8u) {
67400
238
      self->private_impl.f_dst_pixfmt = 536870920u;
67401
238
      self->private_impl.f_src_pixfmt = 536870920u;
67402
238
      self->private_impl.f_filter_distance = 1u;
67403
383
    } else if (self->private_impl.f_depth == 16u) {
67404
380
      if (self->private_impl.f_interlace_pass == 0u) {
67405
212
        self->private_impl.f_dst_pixfmt = 536870923u;
67406
212
        self->private_impl.f_src_pixfmt = 537919499u;
67407
212
      } else {
67408
168
        self->private_impl.f_dst_pixfmt = 2164308923u;
67409
168
        self->private_impl.f_src_pixfmt = 2164308923u;
67410
168
      }
67411
380
      self->private_impl.f_filter_distance = 2u;
67412
380
    }
67413
3.22k
  } else if (self->private_impl.f_color_type == 2u) {
67414
1.41k
    if (self->private_impl.f_depth == 8u) {
67415
1.17k
      self->private_impl.f_dst_pixfmt = 2147485832u;
67416
1.17k
      self->private_impl.f_src_pixfmt = 2684356744u;
67417
1.17k
      self->private_impl.f_filter_distance = 3u;
67418
1.17k
    } else if (self->private_impl.f_depth == 16u) {
67419
234
      self->private_impl.f_dst_pixfmt = 2164308923u;
67420
234
      self->private_impl.f_src_pixfmt = 2164308923u;
67421
234
      self->private_impl.f_filter_distance = 6u;
67422
234
      self->private_impl.choosy_filter_and_swizzle = (
67423
234
          &wuffs_png__decoder__filter_and_swizzle_tricky);
67424
234
    }
67425
1.81k
  } else if (self->private_impl.f_color_type == 3u) {
67426
322
    if (self->private_impl.f_depth == 8u) {
67427
320
      self->private_impl.f_dst_pixfmt = 2198077448u;
67428
320
      self->private_impl.f_src_pixfmt = 2198077448u;
67429
320
      self->private_impl.f_filter_distance = 1u;
67430
320
    }
67431
1.48k
  } else if (self->private_impl.f_color_type == 4u) {
67432
204
    if (self->private_impl.f_depth == 8u) {
67433
137
      self->private_impl.f_dst_pixfmt = 553648264u;
67434
137
      self->private_impl.f_src_pixfmt = 553648264u;
67435
137
      self->private_impl.f_filter_distance = 2u;
67436
137
    } else if (self->private_impl.f_depth == 16u) {
67437
64
      self->private_impl.f_dst_pixfmt = 2164308923u;
67438
64
      self->private_impl.f_src_pixfmt = 2164308923u;
67439
64
      self->private_impl.f_filter_distance = 4u;
67440
64
      self->private_impl.choosy_filter_and_swizzle = (
67441
64
          &wuffs_png__decoder__filter_and_swizzle_tricky);
67442
64
    }
67443
1.28k
  } else if (self->private_impl.f_color_type == 6u) {
67444
1.28k
    if (self->private_impl.f_depth == 8u) {
67445
1.16k
      self->private_impl.f_dst_pixfmt = 2164295816u;
67446
1.16k
      self->private_impl.f_src_pixfmt = 2701166728u;
67447
1.16k
      self->private_impl.f_filter_distance = 4u;
67448
1.16k
    } else if (self->private_impl.f_depth == 16u) {
67449
121
      self->private_impl.f_dst_pixfmt = 2164308923u;
67450
121
      self->private_impl.f_src_pixfmt = 2164308923u;
67451
121
      self->private_impl.f_filter_distance = 8u;
67452
121
      self->private_impl.choosy_filter_and_swizzle = (
67453
121
          &wuffs_png__decoder__filter_and_swizzle_tricky);
67454
121
    }
67455
1.28k
  }
67456
5.25k
  return wuffs_base__make_empty_struct();
67457
5.26k
}
67458
67459
// -------- func png.decoder.calculate_bytes_per_row
67460
67461
WUFFS_BASE__GENERATED_C_CODE
67462
static uint64_t
67463
wuffs_png__decoder__calculate_bytes_per_row(
67464
    const wuffs_png__decoder* self,
67465
15.6k
    uint32_t a_width) {
67466
15.6k
  uint64_t v_bytes_per_channel = 0;
67467
67468
15.6k
  if (self->private_impl.f_depth == 1u) {
67469
317
    return ((uint64_t)(((a_width + 7u) / 8u)));
67470
15.2k
  } else if (self->private_impl.f_depth == 2u) {
67471
4.53k
    return ((uint64_t)(((a_width + 3u) / 4u)));
67472
10.7k
  } else if (self->private_impl.f_depth == 4u) {
67473
237
    return ((uint64_t)(((a_width + 1u) / 2u)));
67474
237
  }
67475
10.5k
  v_bytes_per_channel = ((uint64_t)(((uint8_t)(self->private_impl.f_depth >> 3u))));
67476
10.5k
  return (((uint64_t)(a_width)) * v_bytes_per_channel * ((uint64_t)(WUFFS_PNG__NUM_CHANNELS[self->private_impl.f_color_type])));
67477
15.6k
}
67478
67479
// -------- func png.decoder.choose_filter_implementations
67480
67481
WUFFS_BASE__GENERATED_C_CODE
67482
static wuffs_base__empty_struct
67483
wuffs_png__decoder__choose_filter_implementations(
67484
5.24k
    wuffs_png__decoder* self) {
67485
5.24k
  if (self->private_impl.f_filter_distance == 3u) {
67486
1.17k
    self->private_impl.choosy_filter_1 = (
67487
1.17k
        &wuffs_png__decoder__filter_1_distance_3_fallback);
67488
1.17k
    self->private_impl.choosy_filter_3 = (
67489
1.17k
        &wuffs_png__decoder__filter_3_distance_3_fallback);
67490
1.17k
    self->private_impl.choosy_filter_4 = (
67491
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
67492
        wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_png__decoder__filter_4_distance_3_arm_neon :
67493
#endif
67494
1.17k
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
67495
1.17k
        wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_png__decoder__filter_4_distance_3_x86_sse42 :
67496
1.17k
#endif
67497
1.17k
        &wuffs_png__decoder__filter_4_distance_3_fallback);
67498
4.06k
  } else if (self->private_impl.f_filter_distance == 4u) {
67499
1.22k
    self->private_impl.choosy_filter_1 = (
67500
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
67501
        wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_png__decoder__filter_1_distance_4_arm_neon :
67502
#endif
67503
1.22k
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
67504
1.22k
        wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_png__decoder__filter_1_distance_4_x86_sse42 :
67505
1.22k
#endif
67506
1.22k
        &wuffs_png__decoder__filter_1_distance_4_fallback);
67507
1.22k
    self->private_impl.choosy_filter_3 = (
67508
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
67509
        wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_png__decoder__filter_3_distance_4_arm_neon :
67510
#endif
67511
1.22k
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
67512
1.22k
        wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_png__decoder__filter_3_distance_4_x86_sse42 :
67513
1.22k
#endif
67514
1.22k
        &wuffs_png__decoder__filter_3_distance_4_fallback);
67515
1.22k
    self->private_impl.choosy_filter_4 = (
67516
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
67517
        wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_png__decoder__filter_4_distance_4_arm_neon :
67518
#endif
67519
1.22k
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
67520
1.22k
        wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_png__decoder__filter_4_distance_4_x86_sse42 :
67521
1.22k
#endif
67522
1.22k
        &wuffs_png__decoder__filter_4_distance_4_fallback);
67523
1.22k
  }
67524
5.24k
  return wuffs_base__make_empty_struct();
67525
5.24k
}
67526
67527
// -------- func png.decoder.decode_other_chunk
67528
67529
WUFFS_BASE__GENERATED_C_CODE
67530
static wuffs_base__status
67531
wuffs_png__decoder__decode_other_chunk(
67532
    wuffs_png__decoder* self,
67533
    wuffs_base__io_buffer* a_src,
67534
5.14k
    bool a_framy) {
67535
5.14k
  wuffs_base__status status = wuffs_base__make_status(NULL);
67536
67537
5.14k
  const uint8_t* iop_a_src = NULL;
67538
5.14k
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
67539
5.14k
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
67540
5.14k
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
67541
5.14k
  if (a_src && a_src->data.ptr) {
67542
5.14k
    io0_a_src = a_src->data.ptr;
67543
5.14k
    io1_a_src = io0_a_src + a_src->meta.ri;
67544
5.14k
    iop_a_src = io1_a_src;
67545
5.14k
    io2_a_src = io0_a_src + a_src->meta.wi;
67546
5.14k
  }
67547
67548
5.14k
  uint32_t coro_susp_point = self->private_impl.p_decode_other_chunk;
67549
5.14k
  switch (coro_susp_point) {
67550
5.14k
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
67551
67552
5.14k
    if ((self->private_impl.f_chunk_type == 1163152464u) &&  ! a_framy) {
67553
362
      if (self->private_impl.f_seen_plte) {
67554
1
        status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
67555
1
        goto exit;
67556
361
      } else if (self->private_impl.f_color_type == 3u) {
67557
327
        if (a_src) {
67558
327
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
67559
327
        }
67560
327
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
67561
327
        status = wuffs_png__decoder__decode_plte(self, a_src);
67562
327
        if (a_src) {
67563
327
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
67564
327
        }
67565
327
        if (status.repr) {
67566
62
          goto suspend;
67567
62
        }
67568
327
      } else if ((self->private_impl.f_color_type == 2u) || (self->private_impl.f_color_type == 6u)) {
67569
32
      } else {
67570
2
        status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
67571
2
        goto exit;
67572
2
      }
67573
297
      self->private_impl.f_seen_plte = true;
67574
4.77k
    } else if ((self->private_impl.f_chunk_type & 32u) == 0u) {
67575
1.09k
      if (self->private_impl.f_chunk_type != 1413563465u) {
67576
155
        status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
67577
155
        goto exit;
67578
155
      }
67579
1.09k
    }
67580
4.92k
    if (self->private_impl.f_chunk_type == 1716082789u) {
67581
211
      if (self->private_impl.f_report_metadata_exif) {
67582
0
        if (self->private_impl.f_seen_exif) {
67583
0
          status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
67584
0
          goto exit;
67585
0
        }
67586
0
        if (a_src) {
67587
0
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
67588
0
        }
67589
0
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
67590
0
        status = wuffs_png__decoder__decode_exif(self, a_src);
67591
0
        if (a_src) {
67592
0
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
67593
0
        }
67594
0
        if (status.repr) {
67595
0
          goto suspend;
67596
0
        }
67597
0
        self->private_impl.f_seen_exif = true;
67598
0
      }
67599
4.71k
    } else if ((self->private_impl.f_chunk_type == 1951945833u) || (self->private_impl.f_chunk_type == 1951942004u) || (self->private_impl.f_chunk_type == 1951945850u)) {
67600
645
      if (self->private_impl.f_report_metadata_kvp) {
67601
0
        self->private_impl.f_metadata_flavor = 4u;
67602
0
        self->private_impl.f_metadata_fourcc = 1263947851u;
67603
0
        self->private_impl.f_metadata_x = 0u;
67604
0
        self->private_impl.f_metadata_y = 0u;
67605
0
        self->private_impl.f_metadata_z = 0u;
67606
0
      }
67607
4.06k
    } else if ( ! a_framy) {
67608
3.41k
      if (self->private_impl.f_chunk_type == 1280598881u) {
67609
343
        if (self->private_impl.f_seen_actl) {
67610
1
          status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
67611
1
          goto exit;
67612
1
        }
67613
342
        if (a_src) {
67614
342
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
67615
342
        }
67616
342
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
67617
342
        status = wuffs_png__decoder__decode_actl(self, a_src);
67618
342
        if (a_src) {
67619
342
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
67620
342
        }
67621
342
        if (status.repr) {
67622
83
          goto suspend;
67623
83
        }
67624
259
        self->private_impl.f_seen_actl = true;
67625
3.07k
      } else if (self->private_impl.f_chunk_type == 1297238115u) {
67626
206
        if (self->private_impl.f_report_metadata_chrm) {
67627
0
          if (self->private_impl.f_seen_chrm) {
67628
0
            status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
67629
0
            goto exit;
67630
0
          }
67631
0
          if (a_src) {
67632
0
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
67633
0
          }
67634
0
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
67635
0
          status = wuffs_png__decoder__decode_chrm(self, a_src);
67636
0
          if (a_src) {
67637
0
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
67638
0
          }
67639
0
          if (status.repr) {
67640
0
            goto suspend;
67641
0
          }
67642
0
          self->private_impl.f_seen_chrm = true;
67643
0
        }
67644
2.86k
      } else if (self->private_impl.f_chunk_type == 1280598886u) {
67645
614
        if (self->private_impl.f_seen_fctl) {
67646
1
          status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
67647
1
          goto exit;
67648
1
        }
67649
613
        if (a_src) {
67650
613
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
67651
613
        }
67652
613
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
67653
613
        status = wuffs_png__decoder__decode_fctl(self, a_src);
67654
613
        if (a_src) {
67655
613
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
67656
613
        }
67657
613
        if (status.repr) {
67658
270
          goto suspend;
67659
270
        }
67660
343
        self->private_impl.f_seen_fctl = true;
67661
2.25k
      } else if (self->private_impl.f_chunk_type == 1095582055u) {
67662
313
        if (self->private_impl.f_report_metadata_gama) {
67663
0
          if (self->private_impl.f_seen_gama) {
67664
0
            status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
67665
0
            goto exit;
67666
0
          }
67667
0
          if (a_src) {
67668
0
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
67669
0
          }
67670
0
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
67671
0
          status = wuffs_png__decoder__decode_gama(self, a_src);
67672
0
          if (a_src) {
67673
0
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
67674
0
          }
67675
0
          if (status.repr) {
67676
0
            goto suspend;
67677
0
          }
67678
0
          self->private_impl.f_seen_gama = true;
67679
0
        }
67680
1.94k
      } else if (self->private_impl.f_chunk_type == 1346585449u) {
67681
194
        if (self->private_impl.f_report_metadata_iccp) {
67682
0
          if (self->private_impl.f_seen_iccp) {
67683
0
            status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
67684
0
            goto exit;
67685
0
          }
67686
0
          if (a_src) {
67687
0
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
67688
0
          }
67689
0
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
67690
0
          status = wuffs_png__decoder__decode_iccp(self, a_src);
67691
0
          if (a_src) {
67692
0
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
67693
0
          }
67694
0
          if (status.repr) {
67695
0
            goto suspend;
67696
0
          }
67697
0
          self->private_impl.f_seen_iccp = true;
67698
0
        }
67699
1.74k
      } else if (self->private_impl.f_chunk_type == 1111970419u) {
67700
200
        if (self->private_impl.f_report_metadata_srgb) {
67701
0
          if (self->private_impl.f_seen_srgb) {
67702
0
            status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
67703
0
            goto exit;
67704
0
          }
67705
0
          if (a_src) {
67706
0
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
67707
0
          }
67708
0
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
67709
0
          status = wuffs_png__decoder__decode_srgb(self, a_src);
67710
0
          if (a_src) {
67711
0
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
67712
0
          }
67713
0
          if (status.repr) {
67714
0
            goto suspend;
67715
0
          }
67716
0
          self->private_impl.f_seen_srgb = true;
67717
0
        }
67718
1.54k
      } else if (self->private_impl.f_chunk_type == 1397641844u) {
67719
330
        if (self->private_impl.f_seen_trns || ((self->private_impl.f_color_type == 3u) &&  ! self->private_impl.f_seen_plte)) {
67720
2
          status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
67721
2
          goto exit;
67722
328
        } else if (self->private_impl.f_color_type > 3u) {
67723
327
        } else {
67724
327
          if (a_src) {
67725
327
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
67726
327
          }
67727
327
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
67728
327
          status = wuffs_png__decoder__decode_trns(self, a_src);
67729
327
          if (a_src) {
67730
327
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
67731
327
          }
67732
327
          if (status.repr) {
67733
136
            goto suspend;
67734
136
          }
67735
327
        }
67736
192
        self->private_impl.f_seen_trns = true;
67737
192
      }
67738
3.41k
    }
67739
4.42k
    if (self->private_impl.f_metadata_fourcc == 0u) {
67740
4.42k
      self->private_data.s_decode_other_chunk.scratch = self->private_impl.f_chunk_length;
67741
4.42k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
67742
4.42k
      if (self->private_data.s_decode_other_chunk.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
67743
354
        self->private_data.s_decode_other_chunk.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
67744
354
        iop_a_src = io2_a_src;
67745
354
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
67746
354
        goto suspend;
67747
354
      }
67748
4.07k
      iop_a_src += self->private_data.s_decode_other_chunk.scratch;
67749
4.07k
    }
67750
67751
4.07k
    goto ok;
67752
4.07k
    ok:
67753
4.07k
    self->private_impl.p_decode_other_chunk = 0;
67754
4.07k
    goto exit;
67755
5.14k
  }
67756
67757
0
  goto suspend;
67758
905
  suspend:
67759
905
  self->private_impl.p_decode_other_chunk = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
67760
67761
905
  goto exit;
67762
5.14k
  exit:
67763
5.14k
  if (a_src && a_src->data.ptr) {
67764
5.14k
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
67765
5.14k
  }
67766
67767
5.14k
  return status;
67768
5.14k
}
67769
67770
// -------- func png.decoder.decode_actl
67771
67772
WUFFS_BASE__GENERATED_C_CODE
67773
static wuffs_base__status
67774
wuffs_png__decoder__decode_actl(
67775
    wuffs_png__decoder* self,
67776
342
    wuffs_base__io_buffer* a_src) {
67777
342
  wuffs_base__status status = wuffs_base__make_status(NULL);
67778
67779
342
  const uint8_t* iop_a_src = NULL;
67780
342
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
67781
342
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
67782
342
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
67783
342
  if (a_src && a_src->data.ptr) {
67784
342
    io0_a_src = a_src->data.ptr;
67785
342
    io1_a_src = io0_a_src + a_src->meta.ri;
67786
342
    iop_a_src = io1_a_src;
67787
342
    io2_a_src = io0_a_src + a_src->meta.wi;
67788
342
  }
67789
67790
342
  uint32_t coro_susp_point = self->private_impl.p_decode_actl;
67791
342
  switch (coro_susp_point) {
67792
342
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
67793
67794
342
    if (self->private_impl.f_chunk_length != 8u) {
67795
35
      status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
67796
35
      goto exit;
67797
307
    } else if (self->private_impl.f_interlace_pass > 0u) {
67798
1
      status = wuffs_base__make_status(wuffs_png__error__unsupported_png_file);
67799
1
      goto exit;
67800
1
    }
67801
306
    self->private_impl.f_chunk_length = 0u;
67802
306
    {
67803
306
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
67804
306
      uint32_t t_0;
67805
306
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
67806
302
        t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
67807
302
        iop_a_src += 4;
67808
302
      } else {
67809
4
        self->private_data.s_decode_actl.scratch = 0;
67810
4
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
67811
10
        while (true) {
67812
10
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
67813
4
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
67814
4
            goto suspend;
67815
4
          }
67816
6
          uint64_t* scratch = &self->private_data.s_decode_actl.scratch;
67817
6
          uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu));
67818
6
          *scratch >>= 8;
67819
6
          *scratch <<= 8;
67820
6
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0);
67821
6
          if (num_bits_0 == 24) {
67822
0
            t_0 = ((uint32_t)(*scratch >> 32));
67823
0
            break;
67824
0
          }
67825
6
          num_bits_0 += 8u;
67826
6
          *scratch |= ((uint64_t)(num_bits_0));
67827
6
        }
67828
4
      }
67829
302
      self->private_impl.f_num_animation_frames_value = t_0;
67830
302
    }
67831
302
    if (self->private_impl.f_num_animation_frames_value == 0u) {
67832
1
      status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
67833
1
      goto exit;
67834
1
    }
67835
301
    {
67836
301
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
67837
301
      uint32_t t_1;
67838
301
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
67839
259
        t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
67840
259
        iop_a_src += 4;
67841
259
      } else {
67842
42
        self->private_data.s_decode_actl.scratch = 0;
67843
42
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
67844
68
        while (true) {
67845
68
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
67846
42
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
67847
42
            goto suspend;
67848
42
          }
67849
26
          uint64_t* scratch = &self->private_data.s_decode_actl.scratch;
67850
26
          uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu));
67851
26
          *scratch >>= 8;
67852
26
          *scratch <<= 8;
67853
26
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1);
67854
26
          if (num_bits_1 == 24) {
67855
0
            t_1 = ((uint32_t)(*scratch >> 32));
67856
0
            break;
67857
0
          }
67858
26
          num_bits_1 += 8u;
67859
26
          *scratch |= ((uint64_t)(num_bits_1));
67860
26
        }
67861
42
      }
67862
259
      self->private_impl.f_num_animation_loops_value = t_1;
67863
259
    }
67864
67865
0
    goto ok;
67866
259
    ok:
67867
259
    self->private_impl.p_decode_actl = 0;
67868
259
    goto exit;
67869
342
  }
67870
67871
0
  goto suspend;
67872
46
  suspend:
67873
46
  self->private_impl.p_decode_actl = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
67874
67875
46
  goto exit;
67876
342
  exit:
67877
342
  if (a_src && a_src->data.ptr) {
67878
342
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
67879
342
  }
67880
67881
342
  return status;
67882
342
}
67883
67884
// -------- func png.decoder.decode_chrm
67885
67886
WUFFS_BASE__GENERATED_C_CODE
67887
static wuffs_base__status
67888
wuffs_png__decoder__decode_chrm(
67889
    wuffs_png__decoder* self,
67890
0
    wuffs_base__io_buffer* a_src) {
67891
0
  wuffs_base__status status = wuffs_base__make_status(NULL);
67892
67893
0
  uint64_t v_u = 0;
67894
67895
0
  const uint8_t* iop_a_src = NULL;
67896
0
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
67897
0
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
67898
0
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
67899
0
  if (a_src && a_src->data.ptr) {
67900
0
    io0_a_src = a_src->data.ptr;
67901
0
    io1_a_src = io0_a_src + a_src->meta.ri;
67902
0
    iop_a_src = io1_a_src;
67903
0
    io2_a_src = io0_a_src + a_src->meta.wi;
67904
0
  }
67905
67906
0
  uint32_t coro_susp_point = self->private_impl.p_decode_chrm;
67907
0
  switch (coro_susp_point) {
67908
0
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
67909
67910
0
    if (self->private_impl.f_chunk_length != 32u) {
67911
0
      status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
67912
0
      goto exit;
67913
0
    }
67914
0
    self->private_impl.f_chunk_length = 0u;
67915
0
    self->private_impl.f_metadata_flavor = 5u;
67916
0
    self->private_impl.f_metadata_fourcc = 1128813133u;
67917
0
    self->private_impl.f_metadata_x = 0u;
67918
0
    self->private_impl.f_metadata_y = 0u;
67919
0
    self->private_impl.f_metadata_z = 0u;
67920
0
    {
67921
0
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
67922
0
      uint64_t t_0;
67923
0
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
67924
0
        t_0 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src)));
67925
0
        iop_a_src += 4;
67926
0
      } else {
67927
0
        self->private_data.s_decode_chrm.scratch = 0;
67928
0
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
67929
0
        while (true) {
67930
0
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
67931
0
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
67932
0
            goto suspend;
67933
0
          }
67934
0
          uint64_t* scratch = &self->private_data.s_decode_chrm.scratch;
67935
0
          uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu));
67936
0
          *scratch >>= 8;
67937
0
          *scratch <<= 8;
67938
0
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0);
67939
0
          if (num_bits_0 == 24) {
67940
0
            t_0 = ((uint64_t)(*scratch >> 32));
67941
0
            break;
67942
0
          }
67943
0
          num_bits_0 += 8u;
67944
0
          *scratch |= ((uint64_t)(num_bits_0));
67945
0
        }
67946
0
      }
67947
0
      v_u = t_0;
67948
0
    }
67949
0
    self->private_impl.f_metadata_x |= ((16777215u & v_u) << 0u);
67950
0
    {
67951
0
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
67952
0
      uint64_t t_1;
67953
0
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
67954
0
        t_1 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src)));
67955
0
        iop_a_src += 4;
67956
0
      } else {
67957
0
        self->private_data.s_decode_chrm.scratch = 0;
67958
0
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
67959
0
        while (true) {
67960
0
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
67961
0
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
67962
0
            goto suspend;
67963
0
          }
67964
0
          uint64_t* scratch = &self->private_data.s_decode_chrm.scratch;
67965
0
          uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu));
67966
0
          *scratch >>= 8;
67967
0
          *scratch <<= 8;
67968
0
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1);
67969
0
          if (num_bits_1 == 24) {
67970
0
            t_1 = ((uint64_t)(*scratch >> 32));
67971
0
            break;
67972
0
          }
67973
0
          num_bits_1 += 8u;
67974
0
          *scratch |= ((uint64_t)(num_bits_1));
67975
0
        }
67976
0
      }
67977
0
      v_u = t_1;
67978
0
    }
67979
0
    self->private_impl.f_metadata_x |= ((16777215u & v_u) << 24u);
67980
0
    {
67981
0
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
67982
0
      uint64_t t_2;
67983
0
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
67984
0
        t_2 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src)));
67985
0
        iop_a_src += 4;
67986
0
      } else {
67987
0
        self->private_data.s_decode_chrm.scratch = 0;
67988
0
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
67989
0
        while (true) {
67990
0
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
67991
0
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
67992
0
            goto suspend;
67993
0
          }
67994
0
          uint64_t* scratch = &self->private_data.s_decode_chrm.scratch;
67995
0
          uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu));
67996
0
          *scratch >>= 8;
67997
0
          *scratch <<= 8;
67998
0
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2);
67999
0
          if (num_bits_2 == 24) {
68000
0
            t_2 = ((uint64_t)(*scratch >> 32));
68001
0
            break;
68002
0
          }
68003
0
          num_bits_2 += 8u;
68004
0
          *scratch |= ((uint64_t)(num_bits_2));
68005
0
        }
68006
0
      }
68007
0
      v_u = t_2;
68008
0
    }
68009
0
    self->private_impl.f_metadata_x |= ((uint64_t)((16777215u & v_u) << 48u));
68010
0
    self->private_impl.f_metadata_y |= ((16777215u & v_u) >> 16u);
68011
0
    {
68012
0
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
68013
0
      uint64_t t_3;
68014
0
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
68015
0
        t_3 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src)));
68016
0
        iop_a_src += 4;
68017
0
      } else {
68018
0
        self->private_data.s_decode_chrm.scratch = 0;
68019
0
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
68020
0
        while (true) {
68021
0
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
68022
0
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
68023
0
            goto suspend;
68024
0
          }
68025
0
          uint64_t* scratch = &self->private_data.s_decode_chrm.scratch;
68026
0
          uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFFu));
68027
0
          *scratch >>= 8;
68028
0
          *scratch <<= 8;
68029
0
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3);
68030
0
          if (num_bits_3 == 24) {
68031
0
            t_3 = ((uint64_t)(*scratch >> 32));
68032
0
            break;
68033
0
          }
68034
0
          num_bits_3 += 8u;
68035
0
          *scratch |= ((uint64_t)(num_bits_3));
68036
0
        }
68037
0
      }
68038
0
      v_u = t_3;
68039
0
    }
68040
0
    self->private_impl.f_metadata_y |= ((16777215u & v_u) << 8u);
68041
0
    {
68042
0
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
68043
0
      uint64_t t_4;
68044
0
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
68045
0
        t_4 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src)));
68046
0
        iop_a_src += 4;
68047
0
      } else {
68048
0
        self->private_data.s_decode_chrm.scratch = 0;
68049
0
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
68050
0
        while (true) {
68051
0
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
68052
0
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
68053
0
            goto suspend;
68054
0
          }
68055
0
          uint64_t* scratch = &self->private_data.s_decode_chrm.scratch;
68056
0
          uint32_t num_bits_4 = ((uint32_t)(*scratch & 0xFFu));
68057
0
          *scratch >>= 8;
68058
0
          *scratch <<= 8;
68059
0
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_4);
68060
0
          if (num_bits_4 == 24) {
68061
0
            t_4 = ((uint64_t)(*scratch >> 32));
68062
0
            break;
68063
0
          }
68064
0
          num_bits_4 += 8u;
68065
0
          *scratch |= ((uint64_t)(num_bits_4));
68066
0
        }
68067
0
      }
68068
0
      v_u = t_4;
68069
0
    }
68070
0
    self->private_impl.f_metadata_y |= ((16777215u & v_u) << 32u);
68071
0
    {
68072
0
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11);
68073
0
      uint64_t t_5;
68074
0
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
68075
0
        t_5 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src)));
68076
0
        iop_a_src += 4;
68077
0
      } else {
68078
0
        self->private_data.s_decode_chrm.scratch = 0;
68079
0
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12);
68080
0
        while (true) {
68081
0
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
68082
0
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
68083
0
            goto suspend;
68084
0
          }
68085
0
          uint64_t* scratch = &self->private_data.s_decode_chrm.scratch;
68086
0
          uint32_t num_bits_5 = ((uint32_t)(*scratch & 0xFFu));
68087
0
          *scratch >>= 8;
68088
0
          *scratch <<= 8;
68089
0
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_5);
68090
0
          if (num_bits_5 == 24) {
68091
0
            t_5 = ((uint64_t)(*scratch >> 32));
68092
0
            break;
68093
0
          }
68094
0
          num_bits_5 += 8u;
68095
0
          *scratch |= ((uint64_t)(num_bits_5));
68096
0
        }
68097
0
      }
68098
0
      v_u = t_5;
68099
0
    }
68100
0
    self->private_impl.f_metadata_y |= ((uint64_t)((16777215u & v_u) << 56u));
68101
0
    self->private_impl.f_metadata_z |= ((16777215u & v_u) >> 8u);
68102
0
    {
68103
0
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13);
68104
0
      uint64_t t_6;
68105
0
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
68106
0
        t_6 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src)));
68107
0
        iop_a_src += 4;
68108
0
      } else {
68109
0
        self->private_data.s_decode_chrm.scratch = 0;
68110
0
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14);
68111
0
        while (true) {
68112
0
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
68113
0
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
68114
0
            goto suspend;
68115
0
          }
68116
0
          uint64_t* scratch = &self->private_data.s_decode_chrm.scratch;
68117
0
          uint32_t num_bits_6 = ((uint32_t)(*scratch & 0xFFu));
68118
0
          *scratch >>= 8;
68119
0
          *scratch <<= 8;
68120
0
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_6);
68121
0
          if (num_bits_6 == 24) {
68122
0
            t_6 = ((uint64_t)(*scratch >> 32));
68123
0
            break;
68124
0
          }
68125
0
          num_bits_6 += 8u;
68126
0
          *scratch |= ((uint64_t)(num_bits_6));
68127
0
        }
68128
0
      }
68129
0
      v_u = t_6;
68130
0
    }
68131
0
    self->private_impl.f_metadata_z |= ((16777215u & v_u) << 16u);
68132
0
    {
68133
0
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15);
68134
0
      uint64_t t_7;
68135
0
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
68136
0
        t_7 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src)));
68137
0
        iop_a_src += 4;
68138
0
      } else {
68139
0
        self->private_data.s_decode_chrm.scratch = 0;
68140
0
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16);
68141
0
        while (true) {
68142
0
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
68143
0
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
68144
0
            goto suspend;
68145
0
          }
68146
0
          uint64_t* scratch = &self->private_data.s_decode_chrm.scratch;
68147
0
          uint32_t num_bits_7 = ((uint32_t)(*scratch & 0xFFu));
68148
0
          *scratch >>= 8;
68149
0
          *scratch <<= 8;
68150
0
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_7);
68151
0
          if (num_bits_7 == 24) {
68152
0
            t_7 = ((uint64_t)(*scratch >> 32));
68153
0
            break;
68154
0
          }
68155
0
          num_bits_7 += 8u;
68156
0
          *scratch |= ((uint64_t)(num_bits_7));
68157
0
        }
68158
0
      }
68159
0
      v_u = t_7;
68160
0
    }
68161
0
    self->private_impl.f_metadata_z |= ((16777215u & v_u) << 40u);
68162
68163
0
    goto ok;
68164
0
    ok:
68165
0
    self->private_impl.p_decode_chrm = 0;
68166
0
    goto exit;
68167
0
  }
68168
68169
0
  goto suspend;
68170
0
  suspend:
68171
0
  self->private_impl.p_decode_chrm = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
68172
68173
0
  goto exit;
68174
0
  exit:
68175
0
  if (a_src && a_src->data.ptr) {
68176
0
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
68177
0
  }
68178
68179
0
  return status;
68180
0
}
68181
68182
// -------- func png.decoder.decode_exif
68183
68184
WUFFS_BASE__GENERATED_C_CODE
68185
static wuffs_base__status
68186
wuffs_png__decoder__decode_exif(
68187
    wuffs_png__decoder* self,
68188
0
    wuffs_base__io_buffer* a_src) {
68189
0
  wuffs_base__status status = wuffs_base__make_status(NULL);
68190
68191
0
  const uint8_t* iop_a_src = NULL;
68192
0
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
68193
0
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
68194
0
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
68195
0
  if (a_src && a_src->data.ptr) {
68196
0
    io0_a_src = a_src->data.ptr;
68197
0
    io1_a_src = io0_a_src + a_src->meta.ri;
68198
0
    iop_a_src = io1_a_src;
68199
0
    io2_a_src = io0_a_src + a_src->meta.wi;
68200
0
  }
68201
68202
0
  if (self->private_impl.f_chunk_length < 4u) {
68203
0
    status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
68204
0
    goto exit;
68205
0
  }
68206
0
  self->private_impl.f_metadata_flavor = 3u;
68207
0
  self->private_impl.f_metadata_fourcc = 1163413830u;
68208
0
  self->private_impl.f_metadata_x = 0u;
68209
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)));
68210
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)));
68211
0
  self->private_impl.f_chunk_length = 0u;
68212
68213
0
  goto ok;
68214
0
  ok:
68215
0
  goto exit;
68216
0
  exit:
68217
0
  if (a_src && a_src->data.ptr) {
68218
0
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
68219
0
  }
68220
68221
0
  return status;
68222
0
}
68223
68224
// -------- func png.decoder.decode_fctl
68225
68226
WUFFS_BASE__GENERATED_C_CODE
68227
static wuffs_base__status
68228
wuffs_png__decoder__decode_fctl(
68229
    wuffs_png__decoder* self,
68230
3.21k
    wuffs_base__io_buffer* a_src) {
68231
3.21k
  wuffs_base__status status = wuffs_base__make_status(NULL);
68232
68233
3.21k
  uint32_t v_x0 = 0;
68234
3.21k
  uint32_t v_y0 = 0;
68235
3.21k
  uint32_t v_x1 = 0;
68236
3.21k
  uint32_t v_y1 = 0;
68237
68238
3.21k
  const uint8_t* iop_a_src = NULL;
68239
3.21k
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
68240
3.21k
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
68241
3.21k
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
68242
3.21k
  if (a_src && a_src->data.ptr) {
68243
3.21k
    io0_a_src = a_src->data.ptr;
68244
3.21k
    io1_a_src = io0_a_src + a_src->meta.ri;
68245
3.21k
    iop_a_src = io1_a_src;
68246
3.21k
    io2_a_src = io0_a_src + a_src->meta.wi;
68247
3.21k
  }
68248
68249
3.21k
  uint32_t coro_susp_point = self->private_impl.p_decode_fctl;
68250
3.21k
  if (coro_susp_point) {
68251
0
    v_x0 = self->private_data.s_decode_fctl.v_x0;
68252
0
    v_x1 = self->private_data.s_decode_fctl.v_x1;
68253
0
    v_y1 = self->private_data.s_decode_fctl.v_y1;
68254
0
  }
68255
3.21k
  switch (coro_susp_point) {
68256
3.21k
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
68257
68258
3.21k
    if (self->private_impl.f_chunk_length != 26u) {
68259
7
      status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
68260
7
      goto exit;
68261
7
    }
68262
3.20k
    self->private_impl.f_chunk_length = 0u;
68263
3.20k
    {
68264
3.20k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
68265
3.20k
      uint32_t t_0;
68266
3.20k
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
68267
3.19k
        t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
68268
3.19k
        iop_a_src += 4;
68269
3.19k
      } else {
68270
11
        self->private_data.s_decode_fctl.scratch = 0;
68271
11
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
68272
17
        while (true) {
68273
17
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
68274
11
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
68275
11
            goto suspend;
68276
11
          }
68277
6
          uint64_t* scratch = &self->private_data.s_decode_fctl.scratch;
68278
6
          uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu));
68279
6
          *scratch >>= 8;
68280
6
          *scratch <<= 8;
68281
6
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0);
68282
6
          if (num_bits_0 == 24) {
68283
0
            t_0 = ((uint32_t)(*scratch >> 32));
68284
0
            break;
68285
0
          }
68286
6
          num_bits_0 += 8u;
68287
6
          *scratch |= ((uint64_t)(num_bits_0));
68288
6
        }
68289
11
      }
68290
3.19k
      v_x0 = t_0;
68291
3.19k
    }
68292
3.19k
    if (v_x0 != self->private_impl.f_next_animation_seq_num) {
68293
50
      status = wuffs_base__make_status(wuffs_png__error__bad_animation_sequence_number);
68294
50
      goto exit;
68295
3.14k
    } else if (self->private_impl.f_next_animation_seq_num >= 4294967295u) {
68296
0
      status = wuffs_base__make_status(wuffs_png__error__unsupported_png_file);
68297
0
      goto exit;
68298
0
    }
68299
3.14k
    self->private_impl.f_next_animation_seq_num += 1u;
68300
3.14k
    {
68301
3.14k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
68302
3.14k
      uint32_t t_1;
68303
3.14k
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
68304
3.13k
        t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
68305
3.13k
        iop_a_src += 4;
68306
3.13k
      } else {
68307
9
        self->private_data.s_decode_fctl.scratch = 0;
68308
9
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
68309
18
        while (true) {
68310
18
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
68311
9
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
68312
9
            goto suspend;
68313
9
          }
68314
9
          uint64_t* scratch = &self->private_data.s_decode_fctl.scratch;
68315
9
          uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu));
68316
9
          *scratch >>= 8;
68317
9
          *scratch <<= 8;
68318
9
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1);
68319
9
          if (num_bits_1 == 24) {
68320
0
            t_1 = ((uint32_t)(*scratch >> 32));
68321
0
            break;
68322
0
          }
68323
9
          num_bits_1 += 8u;
68324
9
          *scratch |= ((uint64_t)(num_bits_1));
68325
9
        }
68326
9
      }
68327
3.13k
      v_x1 = t_1;
68328
3.13k
    }
68329
0
    {
68330
3.13k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
68331
3.13k
      uint32_t t_2;
68332
3.13k
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
68333
3.12k
        t_2 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
68334
3.12k
        iop_a_src += 4;
68335
3.12k
      } else {
68336
10
        self->private_data.s_decode_fctl.scratch = 0;
68337
10
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
68338
19
        while (true) {
68339
19
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
68340
10
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
68341
10
            goto suspend;
68342
10
          }
68343
9
          uint64_t* scratch = &self->private_data.s_decode_fctl.scratch;
68344
9
          uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu));
68345
9
          *scratch >>= 8;
68346
9
          *scratch <<= 8;
68347
9
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2);
68348
9
          if (num_bits_2 == 24) {
68349
0
            t_2 = ((uint32_t)(*scratch >> 32));
68350
0
            break;
68351
0
          }
68352
9
          num_bits_2 += 8u;
68353
9
          *scratch |= ((uint64_t)(num_bits_2));
68354
9
        }
68355
10
      }
68356
3.12k
      v_y1 = t_2;
68357
3.12k
    }
68358
0
    {
68359
3.12k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
68360
3.12k
      uint32_t t_3;
68361
3.12k
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
68362
3.11k
        t_3 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
68363
3.11k
        iop_a_src += 4;
68364
3.11k
      } else {
68365
10
        self->private_data.s_decode_fctl.scratch = 0;
68366
10
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
68367
16
        while (true) {
68368
16
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
68369
10
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
68370
10
            goto suspend;
68371
10
          }
68372
6
          uint64_t* scratch = &self->private_data.s_decode_fctl.scratch;
68373
6
          uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFFu));
68374
6
          *scratch >>= 8;
68375
6
          *scratch <<= 8;
68376
6
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3);
68377
6
          if (num_bits_3 == 24) {
68378
0
            t_3 = ((uint32_t)(*scratch >> 32));
68379
0
            break;
68380
0
          }
68381
6
          num_bits_3 += 8u;
68382
6
          *scratch |= ((uint64_t)(num_bits_3));
68383
6
        }
68384
10
      }
68385
3.11k
      v_x0 = t_3;
68386
3.11k
    }
68387
0
    {
68388
3.11k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
68389
3.11k
      uint32_t t_4;
68390
3.11k
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
68391
3.10k
        t_4 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
68392
3.10k
        iop_a_src += 4;
68393
3.10k
      } else {
68394
10
        self->private_data.s_decode_fctl.scratch = 0;
68395
10
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
68396
16
        while (true) {
68397
16
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
68398
10
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
68399
10
            goto suspend;
68400
10
          }
68401
6
          uint64_t* scratch = &self->private_data.s_decode_fctl.scratch;
68402
6
          uint32_t num_bits_4 = ((uint32_t)(*scratch & 0xFFu));
68403
6
          *scratch >>= 8;
68404
6
          *scratch <<= 8;
68405
6
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_4);
68406
6
          if (num_bits_4 == 24) {
68407
0
            t_4 = ((uint32_t)(*scratch >> 32));
68408
0
            break;
68409
0
          }
68410
6
          num_bits_4 += 8u;
68411
6
          *scratch |= ((uint64_t)(num_bits_4));
68412
6
        }
68413
10
      }
68414
3.10k
      v_y0 = t_4;
68415
3.10k
    }
68416
0
    v_x1 += v_x0;
68417
3.10k
    v_y1 += v_y0;
68418
3.10k
    if ((v_x0 >= v_x1) ||
68419
3.10k
        (v_x0 > self->private_impl.f_width) ||
68420
3.10k
        (v_x1 > self->private_impl.f_width) ||
68421
3.10k
        (v_y0 >= v_y1) ||
68422
3.10k
        (v_y0 > self->private_impl.f_height) ||
68423
3.10k
        (v_y1 > self->private_impl.f_height)) {
68424
180
      status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
68425
180
      goto exit;
68426
180
    }
68427
2.92k
    self->private_impl.f_frame_rect_x0 = v_x0;
68428
2.92k
    self->private_impl.f_frame_rect_y0 = v_y0;
68429
2.92k
    self->private_impl.f_frame_rect_x1 = v_x1;
68430
2.92k
    self->private_impl.f_frame_rect_y1 = v_y1;
68431
2.92k
    {
68432
2.92k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11);
68433
2.92k
      uint32_t t_5;
68434
2.92k
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
68435
2.92k
        t_5 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src)));
68436
2.92k
        iop_a_src += 2;
68437
2.92k
      } else {
68438
8
        self->private_data.s_decode_fctl.scratch = 0;
68439
8
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12);
68440
11
        while (true) {
68441
11
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
68442
8
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
68443
8
            goto suspend;
68444
8
          }
68445
3
          uint64_t* scratch = &self->private_data.s_decode_fctl.scratch;
68446
3
          uint32_t num_bits_5 = ((uint32_t)(*scratch & 0xFFu));
68447
3
          *scratch >>= 8;
68448
3
          *scratch <<= 8;
68449
3
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_5);
68450
3
          if (num_bits_5 == 8) {
68451
0
            t_5 = ((uint32_t)(*scratch >> 48));
68452
0
            break;
68453
0
          }
68454
3
          num_bits_5 += 8u;
68455
3
          *scratch |= ((uint64_t)(num_bits_5));
68456
3
        }
68457
8
      }
68458
2.92k
      v_x0 = t_5;
68459
2.92k
    }
68460
0
    {
68461
2.92k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13);
68462
2.92k
      uint32_t t_6;
68463
2.92k
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
68464
2.91k
        t_6 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src)));
68465
2.91k
        iop_a_src += 2;
68466
2.91k
      } else {
68467
8
        self->private_data.s_decode_fctl.scratch = 0;
68468
8
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14);
68469
10
        while (true) {
68470
10
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
68471
8
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
68472
8
            goto suspend;
68473
8
          }
68474
2
          uint64_t* scratch = &self->private_data.s_decode_fctl.scratch;
68475
2
          uint32_t num_bits_6 = ((uint32_t)(*scratch & 0xFFu));
68476
2
          *scratch >>= 8;
68477
2
          *scratch <<= 8;
68478
2
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_6);
68479
2
          if (num_bits_6 == 8) {
68480
0
            t_6 = ((uint32_t)(*scratch >> 48));
68481
0
            break;
68482
0
          }
68483
2
          num_bits_6 += 8u;
68484
2
          *scratch |= ((uint64_t)(num_bits_6));
68485
2
        }
68486
8
      }
68487
2.91k
      v_x1 = t_6;
68488
2.91k
    }
68489
2.91k
    if (v_x1 <= 0u) {
68490
391
      self->private_impl.f_frame_duration = (((uint64_t)(v_x0)) * 7056000u);
68491
2.52k
    } else {
68492
2.52k
      self->private_impl.f_frame_duration = ((((uint64_t)(v_x0)) * 705600000u) / ((uint64_t)(v_x1)));
68493
2.52k
    }
68494
2.91k
    {
68495
2.91k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15);
68496
2.91k
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
68497
25
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
68498
25
        goto suspend;
68499
25
      }
68500
2.88k
      uint32_t t_7 = *iop_a_src++;
68501
2.88k
      v_x0 = t_7;
68502
2.88k
    }
68503
2.88k
    if (v_x0 == 0u) {
68504
1.17k
      self->private_impl.f_frame_disposal = 0u;
68505
1.71k
    } else if (v_x0 == 1u) {
68506
1.62k
      self->private_impl.f_frame_disposal = 1u;
68507
1.62k
    } else if (v_x0 == 2u) {
68508
71
      self->private_impl.f_frame_disposal = 2u;
68509
71
    } else {
68510
11
      status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
68511
11
      goto exit;
68512
11
    }
68513
2.87k
    {
68514
2.87k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16);
68515
2.87k
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
68516
16
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
68517
16
        goto suspend;
68518
16
      }
68519
2.86k
      uint32_t t_8 = *iop_a_src++;
68520
2.86k
      v_x0 = t_8;
68521
2.86k
    }
68522
2.86k
    if (v_x0 == 0u) {
68523
2.60k
      self->private_impl.f_frame_overwrite_instead_of_blend = true;
68524
2.60k
    } else if (v_x0 == 1u) {
68525
239
      self->private_impl.f_frame_overwrite_instead_of_blend = false;
68526
239
    } else {
68527
13
      status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
68528
13
      goto exit;
68529
13
    }
68530
2.84k
    if (self->private_impl.f_num_decoded_frame_configs_value == 0u) {
68531
343
      self->private_impl.f_first_rect_x0 = self->private_impl.f_frame_rect_x0;
68532
343
      self->private_impl.f_first_rect_y0 = self->private_impl.f_frame_rect_y0;
68533
343
      self->private_impl.f_first_rect_x1 = self->private_impl.f_frame_rect_x1;
68534
343
      self->private_impl.f_first_rect_y1 = self->private_impl.f_frame_rect_y1;
68535
343
      self->private_impl.f_first_duration = self->private_impl.f_frame_duration;
68536
343
      self->private_impl.f_first_disposal = self->private_impl.f_frame_disposal;
68537
343
      self->private_impl.f_first_overwrite_instead_of_blend = self->private_impl.f_frame_overwrite_instead_of_blend;
68538
343
    }
68539
68540
2.84k
    goto ok;
68541
2.84k
    ok:
68542
2.84k
    self->private_impl.p_decode_fctl = 0;
68543
2.84k
    goto exit;
68544
3.21k
  }
68545
68546
0
  goto suspend;
68547
107
  suspend:
68548
107
  self->private_impl.p_decode_fctl = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
68549
107
  self->private_data.s_decode_fctl.v_x0 = v_x0;
68550
107
  self->private_data.s_decode_fctl.v_x1 = v_x1;
68551
107
  self->private_data.s_decode_fctl.v_y1 = v_y1;
68552
68553
107
  goto exit;
68554
3.21k
  exit:
68555
3.21k
  if (a_src && a_src->data.ptr) {
68556
3.21k
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
68557
3.21k
  }
68558
68559
3.21k
  return status;
68560
3.21k
}
68561
68562
// -------- func png.decoder.decode_gama
68563
68564
WUFFS_BASE__GENERATED_C_CODE
68565
static wuffs_base__status
68566
wuffs_png__decoder__decode_gama(
68567
    wuffs_png__decoder* self,
68568
0
    wuffs_base__io_buffer* a_src) {
68569
0
  wuffs_base__status status = wuffs_base__make_status(NULL);
68570
68571
0
  const uint8_t* iop_a_src = NULL;
68572
0
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
68573
0
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
68574
0
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
68575
0
  if (a_src && a_src->data.ptr) {
68576
0
    io0_a_src = a_src->data.ptr;
68577
0
    io1_a_src = io0_a_src + a_src->meta.ri;
68578
0
    iop_a_src = io1_a_src;
68579
0
    io2_a_src = io0_a_src + a_src->meta.wi;
68580
0
  }
68581
68582
0
  uint32_t coro_susp_point = self->private_impl.p_decode_gama;
68583
0
  switch (coro_susp_point) {
68584
0
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
68585
68586
0
    if (self->private_impl.f_chunk_length != 4u) {
68587
0
      status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
68588
0
      goto exit;
68589
0
    }
68590
0
    self->private_impl.f_chunk_length = 0u;
68591
0
    self->private_impl.f_metadata_flavor = 5u;
68592
0
    self->private_impl.f_metadata_fourcc = 1195461953u;
68593
0
    {
68594
0
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
68595
0
      uint64_t t_0;
68596
0
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
68597
0
        t_0 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src)));
68598
0
        iop_a_src += 4;
68599
0
      } else {
68600
0
        self->private_data.s_decode_gama.scratch = 0;
68601
0
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
68602
0
        while (true) {
68603
0
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
68604
0
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
68605
0
            goto suspend;
68606
0
          }
68607
0
          uint64_t* scratch = &self->private_data.s_decode_gama.scratch;
68608
0
          uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu));
68609
0
          *scratch >>= 8;
68610
0
          *scratch <<= 8;
68611
0
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0);
68612
0
          if (num_bits_0 == 24) {
68613
0
            t_0 = ((uint64_t)(*scratch >> 32));
68614
0
            break;
68615
0
          }
68616
0
          num_bits_0 += 8u;
68617
0
          *scratch |= ((uint64_t)(num_bits_0));
68618
0
        }
68619
0
      }
68620
0
      self->private_impl.f_metadata_x = t_0;
68621
0
    }
68622
0
    self->private_impl.f_metadata_y = 0u;
68623
0
    self->private_impl.f_metadata_z = 0u;
68624
68625
0
    goto ok;
68626
0
    ok:
68627
0
    self->private_impl.p_decode_gama = 0;
68628
0
    goto exit;
68629
0
  }
68630
68631
0
  goto suspend;
68632
0
  suspend:
68633
0
  self->private_impl.p_decode_gama = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
68634
68635
0
  goto exit;
68636
0
  exit:
68637
0
  if (a_src && a_src->data.ptr) {
68638
0
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
68639
0
  }
68640
68641
0
  return status;
68642
0
}
68643
68644
// -------- func png.decoder.decode_iccp
68645
68646
WUFFS_BASE__GENERATED_C_CODE
68647
static wuffs_base__status
68648
wuffs_png__decoder__decode_iccp(
68649
    wuffs_png__decoder* self,
68650
0
    wuffs_base__io_buffer* a_src) {
68651
0
  wuffs_base__status status = wuffs_base__make_status(NULL);
68652
68653
0
  uint8_t v_c8 = 0;
68654
68655
0
  const uint8_t* iop_a_src = NULL;
68656
0
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
68657
0
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
68658
0
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
68659
0
  if (a_src && a_src->data.ptr) {
68660
0
    io0_a_src = a_src->data.ptr;
68661
0
    io1_a_src = io0_a_src + a_src->meta.ri;
68662
0
    iop_a_src = io1_a_src;
68663
0
    io2_a_src = io0_a_src + a_src->meta.wi;
68664
0
  }
68665
68666
0
  uint32_t coro_susp_point = self->private_impl.p_decode_iccp;
68667
0
  switch (coro_susp_point) {
68668
0
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
68669
68670
0
    while (true) {
68671
0
      if (self->private_impl.f_chunk_length <= 0u) {
68672
0
        status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
68673
0
        goto exit;
68674
0
      }
68675
0
      self->private_impl.f_chunk_length -= 1u;
68676
0
      {
68677
0
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
68678
0
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
68679
0
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
68680
0
          goto suspend;
68681
0
        }
68682
0
        uint8_t t_0 = *iop_a_src++;
68683
0
        v_c8 = t_0;
68684
0
      }
68685
0
      if (v_c8 == 0u) {
68686
0
        break;
68687
0
      }
68688
0
    }
68689
0
    if (self->private_impl.f_chunk_length <= 0u) {
68690
0
      status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
68691
0
      goto exit;
68692
0
    }
68693
0
    self->private_impl.f_chunk_length -= 1u;
68694
0
    {
68695
0
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
68696
0
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
68697
0
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
68698
0
        goto suspend;
68699
0
      }
68700
0
      uint8_t t_1 = *iop_a_src++;
68701
0
      v_c8 = t_1;
68702
0
    }
68703
0
    if (v_c8 != 0u) {
68704
0
      status = wuffs_base__make_status(wuffs_png__error__unsupported_png_compression_method);
68705
0
      goto exit;
68706
0
    }
68707
0
    self->private_impl.f_metadata_is_zlib_compressed = true;
68708
0
    self->private_impl.f_metadata_flavor = 4u;
68709
0
    self->private_impl.f_metadata_fourcc = 1229144912u;
68710
0
    self->private_impl.f_metadata_x = 0u;
68711
0
    self->private_impl.f_metadata_y = 0u;
68712
0
    self->private_impl.f_metadata_z = 0u;
68713
68714
0
    goto ok;
68715
0
    ok:
68716
0
    self->private_impl.p_decode_iccp = 0;
68717
0
    goto exit;
68718
0
  }
68719
68720
0
  goto suspend;
68721
0
  suspend:
68722
0
  self->private_impl.p_decode_iccp = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
68723
68724
0
  goto exit;
68725
0
  exit:
68726
0
  if (a_src && a_src->data.ptr) {
68727
0
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
68728
0
  }
68729
68730
0
  return status;
68731
0
}
68732
68733
// -------- func png.decoder.decode_plte
68734
68735
WUFFS_BASE__GENERATED_C_CODE
68736
static wuffs_base__status
68737
wuffs_png__decoder__decode_plte(
68738
    wuffs_png__decoder* self,
68739
327
    wuffs_base__io_buffer* a_src) {
68740
327
  wuffs_base__status status = wuffs_base__make_status(NULL);
68741
68742
327
  uint32_t v_num_entries = 0;
68743
327
  uint32_t v_i = 0;
68744
327
  uint32_t v_argb = 0;
68745
68746
327
  const uint8_t* iop_a_src = NULL;
68747
327
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
68748
327
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
68749
327
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
68750
327
  if (a_src && a_src->data.ptr) {
68751
327
    io0_a_src = a_src->data.ptr;
68752
327
    io1_a_src = io0_a_src + a_src->meta.ri;
68753
327
    iop_a_src = io1_a_src;
68754
327
    io2_a_src = io0_a_src + a_src->meta.wi;
68755
327
  }
68756
68757
327
  uint32_t coro_susp_point = self->private_impl.p_decode_plte;
68758
327
  if (coro_susp_point) {
68759
0
    v_num_entries = self->private_data.s_decode_plte.v_num_entries;
68760
0
    v_i = self->private_data.s_decode_plte.v_i;
68761
0
  }
68762
327
  switch (coro_susp_point) {
68763
327
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
68764
68765
327
    if ((self->private_impl.f_chunk_length > 768u) || ((self->private_impl.f_chunk_length % 3u) != 0u)) {
68766
30
      status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
68767
30
      goto exit;
68768
30
    }
68769
297
    v_num_entries = (((uint32_t)(self->private_impl.f_chunk_length)) / 3u);
68770
297
    self->private_impl.f_chunk_length = 0u;
68771
6.15k
    while (v_i < v_num_entries) {
68772
5.88k
      {
68773
5.88k
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
68774
5.88k
        uint32_t t_0;
68775
5.88k
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) {
68776
5.85k
          t_0 = ((uint32_t)(wuffs_base__peek_u24be__no_bounds_check(iop_a_src)));
68777
5.85k
          iop_a_src += 3;
68778
5.85k
        } else {
68779
32
          self->private_data.s_decode_plte.scratch = 0;
68780
32
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
68781
51
          while (true) {
68782
51
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
68783
32
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
68784
32
              goto suspend;
68785
32
            }
68786
19
            uint64_t* scratch = &self->private_data.s_decode_plte.scratch;
68787
19
            uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu));
68788
19
            *scratch >>= 8;
68789
19
            *scratch <<= 8;
68790
19
            *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0);
68791
19
            if (num_bits_0 == 16) {
68792
0
              t_0 = ((uint32_t)(*scratch >> 40));
68793
0
              break;
68794
0
            }
68795
19
            num_bits_0 += 8u;
68796
19
            *scratch |= ((uint64_t)(num_bits_0));
68797
19
          }
68798
32
        }
68799
5.85k
        v_argb = t_0;
68800
5.85k
      }
68801
0
      v_argb |= 4278190080u;
68802
5.85k
      self->private_data.f_src_palette[((4u * v_i) + 0u)] = ((uint8_t)((v_argb >> 0u)));
68803
5.85k
      self->private_data.f_src_palette[((4u * v_i) + 1u)] = ((uint8_t)((v_argb >> 8u)));
68804
5.85k
      self->private_data.f_src_palette[((4u * v_i) + 2u)] = ((uint8_t)((v_argb >> 16u)));
68805
5.85k
      self->private_data.f_src_palette[((4u * v_i) + 3u)] = ((uint8_t)((v_argb >> 24u)));
68806
5.85k
      v_i += 1u;
68807
5.85k
    }
68808
62.9k
    while (v_i < 256u) {
68809
62.6k
      self->private_data.f_src_palette[((4u * v_i) + 0u)] = 0u;
68810
62.6k
      self->private_data.f_src_palette[((4u * v_i) + 1u)] = 0u;
68811
62.6k
      self->private_data.f_src_palette[((4u * v_i) + 2u)] = 0u;
68812
62.6k
      self->private_data.f_src_palette[((4u * v_i) + 3u)] = 255u;
68813
62.6k
      v_i += 1u;
68814
62.6k
    }
68815
68816
265
    goto ok;
68817
265
    ok:
68818
265
    self->private_impl.p_decode_plte = 0;
68819
265
    goto exit;
68820
327
  }
68821
68822
0
  goto suspend;
68823
32
  suspend:
68824
32
  self->private_impl.p_decode_plte = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
68825
32
  self->private_data.s_decode_plte.v_num_entries = v_num_entries;
68826
32
  self->private_data.s_decode_plte.v_i = v_i;
68827
68828
32
  goto exit;
68829
327
  exit:
68830
327
  if (a_src && a_src->data.ptr) {
68831
327
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
68832
327
  }
68833
68834
327
  return status;
68835
327
}
68836
68837
// -------- func png.decoder.decode_srgb
68838
68839
WUFFS_BASE__GENERATED_C_CODE
68840
static wuffs_base__status
68841
wuffs_png__decoder__decode_srgb(
68842
    wuffs_png__decoder* self,
68843
0
    wuffs_base__io_buffer* a_src) {
68844
0
  wuffs_base__status status = wuffs_base__make_status(NULL);
68845
68846
0
  const uint8_t* iop_a_src = NULL;
68847
0
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
68848
0
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
68849
0
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
68850
0
  if (a_src && a_src->data.ptr) {
68851
0
    io0_a_src = a_src->data.ptr;
68852
0
    io1_a_src = io0_a_src + a_src->meta.ri;
68853
0
    iop_a_src = io1_a_src;
68854
0
    io2_a_src = io0_a_src + a_src->meta.wi;
68855
0
  }
68856
68857
0
  uint32_t coro_susp_point = self->private_impl.p_decode_srgb;
68858
0
  switch (coro_susp_point) {
68859
0
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
68860
68861
0
    if (self->private_impl.f_chunk_length != 1u) {
68862
0
      status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
68863
0
      goto exit;
68864
0
    }
68865
0
    self->private_impl.f_chunk_length = 0u;
68866
0
    self->private_impl.f_metadata_flavor = 5u;
68867
0
    self->private_impl.f_metadata_fourcc = 1397901122u;
68868
0
    {
68869
0
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
68870
0
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
68871
0
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
68872
0
        goto suspend;
68873
0
      }
68874
0
      uint64_t t_0 = *iop_a_src++;
68875
0
      self->private_impl.f_metadata_x = t_0;
68876
0
    }
68877
0
    self->private_impl.f_metadata_y = 0u;
68878
0
    self->private_impl.f_metadata_z = 0u;
68879
68880
0
    goto ok;
68881
0
    ok:
68882
0
    self->private_impl.p_decode_srgb = 0;
68883
0
    goto exit;
68884
0
  }
68885
68886
0
  goto suspend;
68887
0
  suspend:
68888
0
  self->private_impl.p_decode_srgb = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
68889
68890
0
  goto exit;
68891
0
  exit:
68892
0
  if (a_src && a_src->data.ptr) {
68893
0
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
68894
0
  }
68895
68896
0
  return status;
68897
0
}
68898
68899
// -------- func png.decoder.decode_trns
68900
68901
WUFFS_BASE__GENERATED_C_CODE
68902
static wuffs_base__status
68903
wuffs_png__decoder__decode_trns(
68904
    wuffs_png__decoder* self,
68905
327
    wuffs_base__io_buffer* a_src) {
68906
327
  wuffs_base__status status = wuffs_base__make_status(NULL);
68907
68908
327
  uint32_t v_i = 0;
68909
327
  uint32_t v_n = 0;
68910
327
  uint64_t v_u = 0;
68911
68912
327
  const uint8_t* iop_a_src = NULL;
68913
327
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
68914
327
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
68915
327
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
68916
327
  if (a_src && a_src->data.ptr) {
68917
327
    io0_a_src = a_src->data.ptr;
68918
327
    io1_a_src = io0_a_src + a_src->meta.ri;
68919
327
    iop_a_src = io1_a_src;
68920
327
    io2_a_src = io0_a_src + a_src->meta.wi;
68921
327
  }
68922
68923
327
  uint32_t coro_susp_point = self->private_impl.p_decode_trns;
68924
327
  if (coro_susp_point) {
68925
0
    v_i = self->private_data.s_decode_trns.v_i;
68926
0
    v_n = self->private_data.s_decode_trns.v_n;
68927
0
  }
68928
327
  switch (coro_susp_point) {
68929
327
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
68930
68931
327
    if (self->private_impl.f_color_type == 0u) {
68932
123
      self->private_impl.choosy_filter_and_swizzle = (
68933
123
          &wuffs_png__decoder__filter_and_swizzle_tricky);
68934
123
      if (self->private_impl.f_depth <= 8u) {
68935
95
        self->private_impl.f_dst_pixfmt = 2164295816u;
68936
95
        self->private_impl.f_src_pixfmt = 2164295816u;
68937
95
      } else {
68938
28
        self->private_impl.f_dst_pixfmt = 2164308923u;
68939
28
        self->private_impl.f_src_pixfmt = 2164308923u;
68940
28
      }
68941
123
      if (self->private_impl.f_chunk_length != 2u) {
68942
40
        status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
68943
40
        goto exit;
68944
40
      }
68945
83
      self->private_impl.f_chunk_length = 0u;
68946
83
      {
68947
83
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
68948
83
        uint64_t t_0;
68949
83
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
68950
81
          t_0 = ((uint64_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src)));
68951
81
          iop_a_src += 2;
68952
81
        } else {
68953
2
          self->private_data.s_decode_trns.scratch = 0;
68954
2
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
68955
3
          while (true) {
68956
3
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
68957
2
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
68958
2
              goto suspend;
68959
2
            }
68960
1
            uint64_t* scratch = &self->private_data.s_decode_trns.scratch;
68961
1
            uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu));
68962
1
            *scratch >>= 8;
68963
1
            *scratch <<= 8;
68964
1
            *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0);
68965
1
            if (num_bits_0 == 8) {
68966
0
              t_0 = ((uint64_t)(*scratch >> 48));
68967
0
              break;
68968
0
            }
68969
1
            num_bits_0 += 8u;
68970
1
            *scratch |= ((uint64_t)(num_bits_0));
68971
1
          }
68972
2
        }
68973
81
        v_u = t_0;
68974
81
      }
68975
81
      if (self->private_impl.f_depth <= 1u) {
68976
6
        self->private_impl.f_remap_transparency = (((v_u & 1u) * 16777215u) | 4278190080u);
68977
75
      } else if (self->private_impl.f_depth <= 2u) {
68978
22
        self->private_impl.f_remap_transparency = (((v_u & 3u) * 5592405u) | 4278190080u);
68979
53
      } else if (self->private_impl.f_depth <= 4u) {
68980
14
        self->private_impl.f_remap_transparency = (((v_u & 15u) * 1118481u) | 4278190080u);
68981
39
      } else if (self->private_impl.f_depth <= 8u) {
68982
23
        self->private_impl.f_remap_transparency = (((v_u & 255u) * 65793u) | 4278190080u);
68983
23
      } else {
68984
16
        self->private_impl.f_remap_transparency = ((v_u * 4295032833u) | 18446462598732840960u);
68985
16
      }
68986
204
    } else if (self->private_impl.f_color_type == 2u) {
68987
132
      self->private_impl.choosy_filter_and_swizzle = (
68988
132
          &wuffs_png__decoder__filter_and_swizzle_tricky);
68989
132
      if (self->private_impl.f_depth <= 8u) {
68990
106
        self->private_impl.f_dst_pixfmt = 2164295816u;
68991
106
        self->private_impl.f_src_pixfmt = 2164295816u;
68992
106
      } else {
68993
26
        self->private_impl.f_dst_pixfmt = 2164308923u;
68994
26
        self->private_impl.f_src_pixfmt = 2164308923u;
68995
26
      }
68996
132
      if (self->private_impl.f_chunk_length != 6u) {
68997
43
        status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
68998
43
        goto exit;
68999
43
      }
69000
89
      self->private_impl.f_chunk_length = 0u;
69001
89
      {
69002
89
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
69003
89
        uint64_t t_1;
69004
89
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 6)) {
69005
83
          t_1 = ((uint64_t)(wuffs_base__peek_u48be__no_bounds_check(iop_a_src)));
69006
83
          iop_a_src += 6;
69007
83
        } else {
69008
6
          self->private_data.s_decode_trns.scratch = 0;
69009
6
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
69010
21
          while (true) {
69011
21
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
69012
6
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
69013
6
              goto suspend;
69014
6
            }
69015
15
            uint64_t* scratch = &self->private_data.s_decode_trns.scratch;
69016
15
            uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu));
69017
15
            *scratch >>= 8;
69018
15
            *scratch <<= 8;
69019
15
            *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1);
69020
15
            if (num_bits_1 == 40) {
69021
0
              t_1 = ((uint64_t)(*scratch >> 16));
69022
0
              break;
69023
0
            }
69024
15
            num_bits_1 += 8u;
69025
15
            *scratch |= ((uint64_t)(num_bits_1));
69026
15
          }
69027
6
        }
69028
83
        v_u = t_1;
69029
83
      }
69030
83
      if (self->private_impl.f_depth <= 8u) {
69031
66
        self->private_impl.f_remap_transparency = ((255u & (v_u >> 0u)) |
69032
66
            (65280u & (v_u >> 8u)) |
69033
66
            (16711680u & (v_u >> 16u)) |
69034
66
            4278190080u);
69035
66
      } else {
69036
17
        self->private_impl.f_remap_transparency = (v_u | 18446462598732840960u);
69037
17
      }
69038
83
    } else if (self->private_impl.f_color_type == 3u) {
69039
72
      self->private_impl.f_dst_pixfmt = 2164523016u;
69040
72
      self->private_impl.f_src_pixfmt = 2164523016u;
69041
72
      if (self->private_impl.f_chunk_length > 256u) {
69042
28
        status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
69043
28
        goto exit;
69044
28
      }
69045
44
      v_n = ((uint32_t)(self->private_impl.f_chunk_length));
69046
44
      self->private_impl.f_chunk_length = 0u;
69047
442
      while (v_i < v_n) {
69048
415
        {
69049
415
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
69050
415
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
69051
17
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
69052
17
            goto suspend;
69053
17
          }
69054
398
          uint8_t t_2 = *iop_a_src++;
69055
398
          self->private_data.f_src_palette[((4u * v_i) + 3u)] = t_2;
69056
398
        }
69057
0
        v_i += 1u;
69058
398
      }
69059
44
    } else {
69060
0
      status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
69061
0
      goto exit;
69062
0
    }
69063
69064
191
    goto ok;
69065
191
    ok:
69066
191
    self->private_impl.p_decode_trns = 0;
69067
191
    goto exit;
69068
327
  }
69069
69070
0
  goto suspend;
69071
25
  suspend:
69072
25
  self->private_impl.p_decode_trns = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
69073
25
  self->private_data.s_decode_trns.v_i = v_i;
69074
25
  self->private_data.s_decode_trns.v_n = v_n;
69075
69076
25
  goto exit;
69077
327
  exit:
69078
327
  if (a_src && a_src->data.ptr) {
69079
327
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
69080
327
  }
69081
69082
327
  return status;
69083
327
}
69084
69085
// -------- func png.decoder.decode_frame_config
69086
69087
WUFFS_BASE__GENERATED_C_CODE
69088
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
69089
wuffs_png__decoder__decode_frame_config(
69090
    wuffs_png__decoder* self,
69091
    wuffs_base__frame_config* a_dst,
69092
6.90k
    wuffs_base__io_buffer* a_src) {
69093
6.90k
  if (!self) {
69094
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
69095
0
  }
69096
6.90k
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
69097
0
    return wuffs_base__make_status(
69098
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
69099
0
        ? wuffs_base__error__disabled_by_previous_error
69100
0
        : wuffs_base__error__initialize_not_called);
69101
0
  }
69102
6.90k
  if (!a_src) {
69103
0
    self->private_impl.magic = WUFFS_BASE__DISABLED;
69104
0
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
69105
0
  }
69106
6.90k
  if ((self->private_impl.active_coroutine != 0) &&
69107
6.90k
      (self->private_impl.active_coroutine != 2)) {
69108
0
    self->private_impl.magic = WUFFS_BASE__DISABLED;
69109
0
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
69110
0
  }
69111
6.90k
  self->private_impl.active_coroutine = 0;
69112
6.90k
  wuffs_base__status status = wuffs_base__make_status(NULL);
69113
69114
6.90k
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
69115
69116
6.90k
  uint32_t coro_susp_point = self->private_impl.p_decode_frame_config;
69117
6.90k
  switch (coro_susp_point) {
69118
6.90k
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
69119
69120
6.90k
    while (true) {
69121
6.90k
      {
69122
6.90k
        wuffs_base__status t_0 = wuffs_png__decoder__do_decode_frame_config(self, a_dst, a_src);
69123
6.90k
        v_status = t_0;
69124
6.90k
      }
69125
6.90k
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
69126
67
        status = wuffs_base__make_status(wuffs_png__error__truncated_input);
69127
67
        goto exit;
69128
67
      }
69129
6.84k
      status = v_status;
69130
6.84k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
69131
0
    }
69132
69133
6.52k
    ok:
69134
6.52k
    self->private_impl.p_decode_frame_config = 0;
69135
6.52k
    goto exit;
69136
6.90k
  }
69137
69138
0
  goto suspend;
69139
122
  suspend:
69140
122
  self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
69141
122
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0;
69142
69143
122
  goto exit;
69144
6.90k
  exit:
69145
6.90k
  if (wuffs_base__status__is_error(&status)) {
69146
262
    self->private_impl.magic = WUFFS_BASE__DISABLED;
69147
262
  }
69148
6.90k
  return status;
69149
6.90k
}
69150
69151
// -------- func png.decoder.do_decode_frame_config
69152
69153
WUFFS_BASE__GENERATED_C_CODE
69154
static wuffs_base__status
69155
wuffs_png__decoder__do_decode_frame_config(
69156
    wuffs_png__decoder* self,
69157
    wuffs_base__frame_config* a_dst,
69158
6.90k
    wuffs_base__io_buffer* a_src) {
69159
6.90k
  wuffs_base__status status = wuffs_base__make_status(NULL);
69160
69161
6.90k
  uint32_t v_checksum_have = 0;
69162
6.90k
  wuffs_base__pixel_format v_pixfmt = {0};
69163
69164
6.90k
  const uint8_t* iop_a_src = NULL;
69165
6.90k
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
69166
6.90k
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
69167
6.90k
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
69168
6.90k
  if (a_src && a_src->data.ptr) {
69169
6.90k
    io0_a_src = a_src->data.ptr;
69170
6.90k
    io1_a_src = io0_a_src + a_src->meta.ri;
69171
6.90k
    iop_a_src = io1_a_src;
69172
6.90k
    io2_a_src = io0_a_src + a_src->meta.wi;
69173
6.90k
  }
69174
69175
6.90k
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config;
69176
6.90k
  switch (coro_susp_point) {
69177
6.90k
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
69178
69179
6.90k
    if (((uint8_t)(self->private_impl.f_call_sequence & 16u)) != 0u) {
69180
0
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
69181
0
      goto exit;
69182
6.90k
    } else if (self->private_impl.f_call_sequence == 32u) {
69183
6.90k
    } else if (self->private_impl.f_call_sequence < 32u) {
69184
0
      if (a_src) {
69185
0
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
69186
0
      }
69187
0
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
69188
0
      status = wuffs_png__decoder__do_decode_image_config(self, NULL, a_src);
69189
0
      if (a_src) {
69190
0
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
69191
0
      }
69192
0
      if (status.repr) {
69193
0
        goto suspend;
69194
0
      }
69195
0
    } else if (self->private_impl.f_call_sequence == 40u) {
69196
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)))) {
69197
0
        status = wuffs_base__make_status(wuffs_base__error__bad_restart);
69198
0
        goto exit;
69199
0
      }
69200
0
    } else if (self->private_impl.f_call_sequence == 64u) {
69201
0
      if (a_src) {
69202
0
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
69203
0
      }
69204
0
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
69205
0
      status = wuffs_png__decoder__skip_frame(self, a_src);
69206
0
      if (a_src) {
69207
0
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
69208
0
      }
69209
0
      if (status.repr) {
69210
0
        goto suspend;
69211
0
      }
69212
0
    } else {
69213
0
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
69214
0
      goto ok;
69215
0
    }
69216
6.90k
    if (self->private_impl.f_metadata_fourcc != 0u) {
69217
0
      self->private_impl.f_call_sequence = 48u;
69218
0
      status = wuffs_base__make_status(wuffs_base__note__metadata_reported);
69219
0
      goto ok;
69220
0
    }
69221
6.90k
    if (self->private_impl.f_num_decoded_frame_configs_value == 0u) {
69222
4.02k
      self->private_impl.f_frame_rect_x0 = self->private_impl.f_first_rect_x0;
69223
4.02k
      self->private_impl.f_frame_rect_y0 = self->private_impl.f_first_rect_y0;
69224
4.02k
      self->private_impl.f_frame_rect_x1 = self->private_impl.f_first_rect_x1;
69225
4.02k
      self->private_impl.f_frame_rect_y1 = self->private_impl.f_first_rect_y1;
69226
4.02k
      self->private_impl.f_frame_config_io_position = self->private_impl.f_first_config_io_position;
69227
4.02k
      self->private_impl.f_frame_duration = self->private_impl.f_first_duration;
69228
4.02k
      self->private_impl.f_frame_disposal = self->private_impl.f_first_disposal;
69229
4.02k
      self->private_impl.f_frame_overwrite_instead_of_blend = self->private_impl.f_first_overwrite_instead_of_blend;
69230
4.02k
    } else {
69231
3.49k
      while (true) {
69232
3.49k
        {
69233
3.49k
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
69234
3.49k
          uint32_t t_0;
69235
3.49k
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
69236
3.43k
            t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
69237
3.43k
            iop_a_src += 4;
69238
3.43k
          } else {
69239
62
            self->private_data.s_do_decode_frame_config.scratch = 0;
69240
62
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
69241
81
            while (true) {
69242
81
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
69243
62
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
69244
62
                goto suspend;
69245
62
              }
69246
19
              uint64_t* scratch = &self->private_data.s_do_decode_frame_config.scratch;
69247
19
              uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu));
69248
19
              *scratch >>= 8;
69249
19
              *scratch <<= 8;
69250
19
              *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0);
69251
19
              if (num_bits_0 == 24) {
69252
0
                t_0 = ((uint32_t)(*scratch >> 32));
69253
0
                break;
69254
0
              }
69255
19
              num_bits_0 += 8u;
69256
19
              *scratch |= ((uint64_t)(num_bits_0));
69257
19
            }
69258
62
          }
69259
3.43k
          self->private_impl.f_chunk_length = t_0;
69260
3.43k
        }
69261
0
        {
69262
3.43k
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
69263
3.43k
          uint32_t t_1;
69264
3.43k
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
69265
3.41k
            t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
69266
3.41k
            iop_a_src += 4;
69267
3.41k
          } else {
69268
13
            self->private_data.s_do_decode_frame_config.scratch = 0;
69269
13
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
69270
23
            while (true) {
69271
23
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
69272
13
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
69273
13
                goto suspend;
69274
13
              }
69275
10
              uint64_t* scratch = &self->private_data.s_do_decode_frame_config.scratch;
69276
10
              uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
69277
10
              *scratch <<= 8;
69278
10
              *scratch >>= 8;
69279
10
              *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
69280
10
              if (num_bits_1 == 24) {
69281
0
                t_1 = ((uint32_t)(*scratch));
69282
0
                break;
69283
0
              }
69284
10
              num_bits_1 += 8u;
69285
10
              *scratch |= ((uint64_t)(num_bits_1)) << 56;
69286
10
            }
69287
13
          }
69288
3.41k
          self->private_impl.f_chunk_type = t_1;
69289
3.41k
        }
69290
3.41k
        if (self->private_impl.f_chunk_type == 1145980233u) {
69291
102
          if (self->private_impl.f_chunk_length != 0u) {
69292
40
            status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
69293
40
            goto exit;
69294
40
          }
69295
62
          {
69296
62
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
69297
62
            uint32_t t_2;
69298
62
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
69299
58
              t_2 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
69300
58
              iop_a_src += 4;
69301
58
            } else {
69302
4
              self->private_data.s_do_decode_frame_config.scratch = 0;
69303
4
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
69304
10
              while (true) {
69305
10
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
69306
4
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
69307
4
                  goto suspend;
69308
4
                }
69309
6
                uint64_t* scratch = &self->private_data.s_do_decode_frame_config.scratch;
69310
6
                uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56));
69311
6
                *scratch <<= 8;
69312
6
                *scratch >>= 8;
69313
6
                *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2;
69314
6
                if (num_bits_2 == 24) {
69315
0
                  t_2 = ((uint32_t)(*scratch));
69316
0
                  break;
69317
0
                }
69318
6
                num_bits_2 += 8u;
69319
6
                *scratch |= ((uint64_t)(num_bits_2)) << 56;
69320
6
              }
69321
4
            }
69322
58
            v_checksum_have = t_2;
69323
58
          }
69324
58
          if ( ! self->private_impl.f_ignore_checksum && (v_checksum_have != 2187346606u)) {
69325
55
            status = wuffs_base__make_status(wuffs_png__error__bad_checksum);
69326
55
            goto exit;
69327
55
          }
69328
3
          self->private_impl.f_call_sequence = 96u;
69329
3
          status = wuffs_base__make_status(wuffs_base__note__end_of_data);
69330
3
          goto ok;
69331
3.31k
        } else if (self->private_impl.f_chunk_type == 1413571686u) {
69332
3
          status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
69333
3
          goto exit;
69334
3.31k
        } else if (self->private_impl.f_chunk_type == 1280598886u) {
69335
2.60k
          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));
69336
2.60k
          if (a_src) {
69337
2.60k
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
69338
2.60k
          }
69339
2.60k
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
69340
2.60k
          status = wuffs_png__decoder__decode_fctl(self, a_src);
69341
2.60k
          if (a_src) {
69342
2.60k
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
69343
2.60k
          }
69344
2.60k
          if (status.repr) {
69345
98
            goto suspend;
69346
98
          }
69347
2.50k
          self->private_data.s_do_decode_frame_config.scratch = 4u;
69348
2.50k
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
69349
2.50k
          if (self->private_data.s_do_decode_frame_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
69350
13
            self->private_data.s_do_decode_frame_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
69351
13
            iop_a_src = io2_a_src;
69352
13
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
69353
13
            goto suspend;
69354
13
          }
69355
2.49k
          iop_a_src += self->private_data.s_do_decode_frame_config.scratch;
69356
2.49k
          break;
69357
2.50k
        }
69358
711
        if (a_src) {
69359
711
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
69360
711
        }
69361
711
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11);
69362
711
        status = wuffs_png__decoder__decode_other_chunk(self, a_src, true);
69363
711
        if (a_src) {
69364
711
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
69365
711
        }
69366
711
        if (status.repr) {
69367
85
          goto suspend;
69368
85
        }
69369
626
        if (self->private_impl.f_metadata_fourcc != 0u) {
69370
0
          self->private_impl.f_call_sequence = 48u;
69371
0
          status = wuffs_base__make_status(wuffs_base__note__metadata_reported);
69372
0
          goto ok;
69373
0
        }
69374
626
        self->private_data.s_do_decode_frame_config.scratch = 4u;
69375
626
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12);
69376
626
        if (self->private_data.s_do_decode_frame_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
69377
11
          self->private_data.s_do_decode_frame_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
69378
11
          iop_a_src = io2_a_src;
69379
11
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
69380
11
          goto suspend;
69381
11
        }
69382
615
        iop_a_src += self->private_data.s_do_decode_frame_config.scratch;
69383
615
        self->private_impl.f_chunk_length = 0u;
69384
615
      }
69385
2.87k
    }
69386
6.52k
    if (a_dst != NULL) {
69387
6.52k
      v_pixfmt = wuffs_base__utility__make_pixel_format(self->private_impl.f_src_pixfmt);
69388
6.52k
      wuffs_base__frame_config__set(
69389
6.52k
          a_dst,
69390
6.52k
          wuffs_base__utility__make_rect_ie_u32(
69391
6.52k
          self->private_impl.f_frame_rect_x0,
69392
6.52k
          self->private_impl.f_frame_rect_y0,
69393
6.52k
          self->private_impl.f_frame_rect_x1,
69394
6.52k
          self->private_impl.f_frame_rect_y1),
69395
6.52k
          ((wuffs_base__flicks)(self->private_impl.f_frame_duration)),
69396
6.52k
          ((uint64_t)(self->private_impl.f_num_decoded_frame_configs_value)),
69397
6.52k
          self->private_impl.f_frame_config_io_position,
69398
6.52k
          self->private_impl.f_frame_disposal,
69399
6.52k
          ((self->private_impl.f_color_type <= 3u) &&  ! self->private_impl.f_seen_trns),
69400
6.52k
          self->private_impl.f_frame_overwrite_instead_of_blend,
69401
6.52k
          wuffs_base__pixel_format__default_background_color(&v_pixfmt));
69402
6.52k
    }
69403
6.52k
    wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_num_decoded_frame_configs_value, 1u);
69404
6.52k
    self->private_impl.f_call_sequence = 64u;
69405
69406
6.52k
    ok:
69407
6.52k
    self->private_impl.p_do_decode_frame_config = 0;
69408
6.52k
    goto exit;
69409
6.90k
  }
69410
69411
0
  goto suspend;
69412
286
  suspend:
69413
286
  self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
69414
69415
286
  goto exit;
69416
6.90k
  exit:
69417
6.90k
  if (a_src && a_src->data.ptr) {
69418
6.90k
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
69419
6.90k
  }
69420
69421
6.90k
  return status;
69422
6.90k
}
69423
69424
// -------- func png.decoder.skip_frame
69425
69426
WUFFS_BASE__GENERATED_C_CODE
69427
static wuffs_base__status
69428
wuffs_png__decoder__skip_frame(
69429
    wuffs_png__decoder* self,
69430
0
    wuffs_base__io_buffer* a_src) {
69431
0
  wuffs_base__status status = wuffs_base__make_status(NULL);
69432
69433
0
  uint32_t v_seq_num = 0;
69434
69435
0
  const uint8_t* iop_a_src = NULL;
69436
0
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
69437
0
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
69438
0
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
69439
0
  if (a_src && a_src->data.ptr) {
69440
0
    io0_a_src = a_src->data.ptr;
69441
0
    io1_a_src = io0_a_src + a_src->meta.ri;
69442
0
    iop_a_src = io1_a_src;
69443
0
    io2_a_src = io0_a_src + a_src->meta.wi;
69444
0
  }
69445
69446
0
  uint32_t coro_susp_point = self->private_impl.p_skip_frame;
69447
0
  switch (coro_susp_point) {
69448
0
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
69449
69450
0
    self->private_impl.f_chunk_type_array[0u] = 0u;
69451
0
    self->private_impl.f_chunk_type_array[1u] = 0u;
69452
0
    self->private_impl.f_chunk_type_array[2u] = 0u;
69453
0
    self->private_impl.f_chunk_type_array[3u] = 0u;
69454
0
    while (true) {
69455
0
      if (((uint64_t)(io2_a_src - iop_a_src)) < 8u) {
69456
0
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
69457
0
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
69458
0
        continue;
69459
0
      }
69460
0
      self->private_impl.f_chunk_length = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
69461
0
      self->private_impl.f_chunk_type = ((uint32_t)((wuffs_base__peek_u64le__no_bounds_check(iop_a_src) >> 32u)));
69462
0
      if (self->private_impl.f_chunk_type == 1413563465u) {
69463
0
        if (self->private_impl.f_chunk_type_array[0u] == 102u) {
69464
0
          status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
69465
0
          goto exit;
69466
0
        }
69467
0
        self->private_impl.f_chunk_type_array[0u] = 73u;
69468
0
        self->private_impl.f_chunk_type_array[1u] = 68u;
69469
0
        self->private_impl.f_chunk_type_array[2u] = 65u;
69470
0
        self->private_impl.f_chunk_type_array[3u] = 84u;
69471
0
      } else if (self->private_impl.f_chunk_type == 1413571686u) {
69472
0
        if (self->private_impl.f_chunk_type_array[0u] == 73u) {
69473
0
          status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
69474
0
          goto exit;
69475
0
        }
69476
0
        self->private_impl.f_chunk_type_array[0u] = 102u;
69477
0
        self->private_impl.f_chunk_type_array[1u] = 100u;
69478
0
        self->private_impl.f_chunk_type_array[2u] = 65u;
69479
0
        self->private_impl.f_chunk_type_array[3u] = 84u;
69480
0
        if (self->private_impl.f_chunk_length < 4u) {
69481
0
          status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
69482
0
          goto exit;
69483
0
        }
69484
0
        self->private_impl.f_chunk_length -= 4u;
69485
0
        iop_a_src += 8u;
69486
0
        {
69487
0
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
69488
0
          uint32_t t_0;
69489
0
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
69490
0
            t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
69491
0
            iop_a_src += 4;
69492
0
          } else {
69493
0
            self->private_data.s_skip_frame.scratch = 0;
69494
0
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
69495
0
            while (true) {
69496
0
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
69497
0
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
69498
0
                goto suspend;
69499
0
              }
69500
0
              uint64_t* scratch = &self->private_data.s_skip_frame.scratch;
69501
0
              uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu));
69502
0
              *scratch >>= 8;
69503
0
              *scratch <<= 8;
69504
0
              *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0);
69505
0
              if (num_bits_0 == 24) {
69506
0
                t_0 = ((uint32_t)(*scratch >> 32));
69507
0
                break;
69508
0
              }
69509
0
              num_bits_0 += 8u;
69510
0
              *scratch |= ((uint64_t)(num_bits_0));
69511
0
            }
69512
0
          }
69513
0
          v_seq_num = t_0;
69514
0
        }
69515
0
        if (v_seq_num != self->private_impl.f_next_animation_seq_num) {
69516
0
          status = wuffs_base__make_status(wuffs_png__error__bad_animation_sequence_number);
69517
0
          goto exit;
69518
0
        } else if (self->private_impl.f_next_animation_seq_num >= 4294967295u) {
69519
0
          status = wuffs_base__make_status(wuffs_png__error__unsupported_png_file);
69520
0
          goto exit;
69521
0
        }
69522
0
        self->private_impl.f_next_animation_seq_num += 1u;
69523
0
        self->private_data.s_skip_frame.scratch = (((uint64_t)(self->private_impl.f_chunk_length)) + 4u);
69524
0
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
69525
0
        if (self->private_data.s_skip_frame.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
69526
0
          self->private_data.s_skip_frame.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
69527
0
          iop_a_src = io2_a_src;
69528
0
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
69529
0
          goto suspend;
69530
0
        }
69531
0
        iop_a_src += self->private_data.s_skip_frame.scratch;
69532
0
        self->private_impl.f_chunk_length = 0u;
69533
0
        continue;
69534
0
      } else if (self->private_impl.f_chunk_type_array[0u] != 0u) {
69535
0
        break;
69536
0
      } else if (self->private_impl.f_chunk_type == 1280598886u) {
69537
0
        status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
69538
0
        goto exit;
69539
0
      }
69540
0
      self->private_data.s_skip_frame.scratch = (((uint64_t)(self->private_impl.f_chunk_length)) + 12u);
69541
0
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
69542
0
      if (self->private_data.s_skip_frame.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
69543
0
        self->private_data.s_skip_frame.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
69544
0
        iop_a_src = io2_a_src;
69545
0
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
69546
0
        goto suspend;
69547
0
      }
69548
0
      iop_a_src += self->private_data.s_skip_frame.scratch;
69549
0
      self->private_impl.f_chunk_length = 0u;
69550
0
    }
69551
0
    wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u);
69552
0
    self->private_impl.f_call_sequence = 32u;
69553
69554
0
    ok:
69555
0
    self->private_impl.p_skip_frame = 0;
69556
0
    goto exit;
69557
0
  }
69558
69559
0
  goto suspend;
69560
0
  suspend:
69561
0
  self->private_impl.p_skip_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
69562
69563
0
  goto exit;
69564
0
  exit:
69565
0
  if (a_src && a_src->data.ptr) {
69566
0
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
69567
0
  }
69568
69569
0
  return status;
69570
0
}
69571
69572
// -------- func png.decoder.decode_frame
69573
69574
WUFFS_BASE__GENERATED_C_CODE
69575
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
69576
wuffs_png__decoder__decode_frame(
69577
    wuffs_png__decoder* self,
69578
    wuffs_base__pixel_buffer* a_dst,
69579
    wuffs_base__io_buffer* a_src,
69580
    wuffs_base__pixel_blend a_blend,
69581
    wuffs_base__slice_u8 a_workbuf,
69582
6.52k
    wuffs_base__decode_frame_options* a_opts) {
69583
6.52k
  if (!self) {
69584
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
69585
0
  }
69586
6.52k
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
69587
0
    return wuffs_base__make_status(
69588
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
69589
0
        ? wuffs_base__error__disabled_by_previous_error
69590
0
        : wuffs_base__error__initialize_not_called);
69591
0
  }
69592
6.52k
  if (!a_dst || !a_src) {
69593
0
    self->private_impl.magic = WUFFS_BASE__DISABLED;
69594
0
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
69595
0
  }
69596
6.52k
  if ((self->private_impl.active_coroutine != 0) &&
69597
6.52k
      (self->private_impl.active_coroutine != 3)) {
69598
0
    self->private_impl.magic = WUFFS_BASE__DISABLED;
69599
0
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
69600
0
  }
69601
6.52k
  self->private_impl.active_coroutine = 0;
69602
6.52k
  wuffs_base__status status = wuffs_base__make_status(NULL);
69603
69604
6.52k
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
69605
69606
6.52k
  uint32_t coro_susp_point = self->private_impl.p_decode_frame;
69607
6.52k
  switch (coro_susp_point) {
69608
6.52k
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
69609
69610
6.52k
    while (true) {
69611
6.52k
      {
69612
6.52k
        wuffs_base__status t_0 = wuffs_png__decoder__do_decode_frame(self,
69613
6.52k
            a_dst,
69614
6.52k
            a_src,
69615
6.52k
            a_blend,
69616
6.52k
            a_workbuf,
69617
6.52k
            a_opts);
69618
6.52k
        v_status = t_0;
69619
6.52k
      }
69620
6.52k
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
69621
103
        status = wuffs_base__make_status(wuffs_png__error__truncated_input);
69622
103
        goto exit;
69623
103
      }
69624
6.41k
      status = v_status;
69625
6.41k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
69626
0
    }
69627
69628
2.87k
    ok:
69629
2.87k
    self->private_impl.p_decode_frame = 0;
69630
2.87k
    goto exit;
69631
6.52k
  }
69632
69633
0
  goto suspend;
69634
906
  suspend:
69635
906
  self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
69636
906
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0;
69637
69638
906
  goto exit;
69639
6.52k
  exit:
69640
6.52k
  if (wuffs_base__status__is_error(&status)) {
69641
2.72k
    self->private_impl.magic = WUFFS_BASE__DISABLED;
69642
2.72k
  }
69643
6.52k
  return status;
69644
6.52k
}
69645
69646
// -------- func png.decoder.do_decode_frame
69647
69648
WUFFS_BASE__GENERATED_C_CODE
69649
static wuffs_base__status
69650
wuffs_png__decoder__do_decode_frame(
69651
    wuffs_png__decoder* self,
69652
    wuffs_base__pixel_buffer* a_dst,
69653
    wuffs_base__io_buffer* a_src,
69654
    wuffs_base__pixel_blend a_blend,
69655
    wuffs_base__slice_u8 a_workbuf,
69656
6.52k
    wuffs_base__decode_frame_options* a_opts) {
69657
6.52k
  wuffs_base__status status = wuffs_base__make_status(NULL);
69658
69659
6.52k
  uint32_t v_seq_num = 0;
69660
6.52k
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
69661
6.52k
  uint32_t v_pass_width = 0;
69662
6.52k
  uint32_t v_pass_height = 0;
69663
69664
6.52k
  const uint8_t* iop_a_src = NULL;
69665
6.52k
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
69666
6.52k
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
69667
6.52k
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
69668
6.52k
  if (a_src && a_src->data.ptr) {
69669
6.52k
    io0_a_src = a_src->data.ptr;
69670
6.52k
    io1_a_src = io0_a_src + a_src->meta.ri;
69671
6.52k
    iop_a_src = io1_a_src;
69672
6.52k
    io2_a_src = io0_a_src + a_src->meta.wi;
69673
6.52k
  }
69674
69675
6.52k
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame;
69676
6.52k
  switch (coro_susp_point) {
69677
6.52k
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
69678
69679
6.52k
    if (((uint8_t)(self->private_impl.f_call_sequence & 16u)) != 0u) {
69680
0
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
69681
0
      goto exit;
69682
6.52k
    } else if (self->private_impl.f_call_sequence >= 96u) {
69683
0
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
69684
0
      goto ok;
69685
6.52k
    } else if (self->private_impl.f_call_sequence != 64u) {
69686
0
      if (a_src) {
69687
0
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
69688
0
      }
69689
0
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
69690
0
      status = wuffs_png__decoder__do_decode_frame_config(self, NULL, a_src);
69691
0
      if (a_src) {
69692
0
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
69693
0
      }
69694
0
      if (status.repr) {
69695
0
        goto suspend;
69696
0
      }
69697
0
    }
69698
7.08k
    while (true) {
69699
7.08k
      if (((uint64_t)(io2_a_src - iop_a_src)) < 8u) {
69700
26
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
69701
26
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2);
69702
0
        continue;
69703
26
      }
69704
7.06k
      self->private_impl.f_chunk_length = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
69705
7.06k
      self->private_impl.f_chunk_type = ((uint32_t)((wuffs_base__peek_u64le__no_bounds_check(iop_a_src) >> 32u)));
69706
7.06k
      if (self->private_impl.f_chunk_type == 1413563465u) {
69707
4.41k
        self->private_impl.f_chunk_type_array[0u] = 73u;
69708
4.41k
        self->private_impl.f_chunk_type_array[1u] = 68u;
69709
4.41k
        self->private_impl.f_chunk_type_array[2u] = 65u;
69710
4.41k
        self->private_impl.f_chunk_type_array[3u] = 84u;
69711
4.41k
        iop_a_src += 8u;
69712
4.41k
        if ( ! self->private_impl.f_ignore_checksum) {
69713
4.41k
          wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32,
69714
4.41k
              sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
69715
4.41k
          wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__make_slice_u8(self->private_impl.f_chunk_type_array, 4));
69716
4.41k
        }
69717
4.41k
        break;
69718
4.41k
      } else if (self->private_impl.f_chunk_type == 1413571686u) {
69719
1.94k
        self->private_impl.f_chunk_type_array[0u] = 102u;
69720
1.94k
        self->private_impl.f_chunk_type_array[1u] = 100u;
69721
1.94k
        self->private_impl.f_chunk_type_array[2u] = 65u;
69722
1.94k
        self->private_impl.f_chunk_type_array[3u] = 84u;
69723
1.94k
        if (self->private_impl.f_chunk_length < 4u) {
69724
3
          status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
69725
3
          goto exit;
69726
3
        }
69727
1.94k
        self->private_impl.f_chunk_length -= 4u;
69728
1.94k
        iop_a_src += 8u;
69729
1.94k
        {
69730
1.94k
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
69731
1.94k
          uint32_t t_0;
69732
1.94k
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
69733
1.90k
            t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
69734
1.90k
            iop_a_src += 4;
69735
1.90k
          } else {
69736
42
            self->private_data.s_do_decode_frame.scratch = 0;
69737
42
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
69738
57
            while (true) {
69739
57
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
69740
42
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
69741
42
                goto suspend;
69742
42
              }
69743
15
              uint64_t* scratch = &self->private_data.s_do_decode_frame.scratch;
69744
15
              uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu));
69745
15
              *scratch >>= 8;
69746
15
              *scratch <<= 8;
69747
15
              *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0);
69748
15
              if (num_bits_0 == 24) {
69749
0
                t_0 = ((uint32_t)(*scratch >> 32));
69750
0
                break;
69751
0
              }
69752
15
              num_bits_0 += 8u;
69753
15
              *scratch |= ((uint64_t)(num_bits_0));
69754
15
            }
69755
42
          }
69756
1.90k
          v_seq_num = t_0;
69757
1.90k
        }
69758
1.90k
        if (v_seq_num != self->private_impl.f_next_animation_seq_num) {
69759
61
          status = wuffs_base__make_status(wuffs_png__error__bad_animation_sequence_number);
69760
61
          goto exit;
69761
1.83k
        } else if (self->private_impl.f_next_animation_seq_num >= 4294967295u) {
69762
0
          status = wuffs_base__make_status(wuffs_png__error__unsupported_png_file);
69763
0
          goto exit;
69764
0
        }
69765
1.83k
        self->private_impl.f_next_animation_seq_num += 1u;
69766
1.83k
        break;
69767
1.90k
      } else if (self->private_impl.f_chunk_type == 1280598886u) {
69768
2
        status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
69769
2
        goto exit;
69770
2
      }
69771
701
      self->private_data.s_do_decode_frame.scratch = (((uint64_t)(self->private_impl.f_chunk_length)) + 12u);
69772
701
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
69773
701
      if (self->private_data.s_do_decode_frame.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
69774
132
        self->private_data.s_do_decode_frame.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
69775
132
        iop_a_src = io2_a_src;
69776
132
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
69777
132
        goto suspend;
69778
132
      }
69779
569
      iop_a_src += self->private_data.s_do_decode_frame.scratch;
69780
569
      self->private_impl.f_chunk_length = 0u;
69781
569
    }
69782
6.25k
    if (self->private_impl.f_zlib_is_dirty) {
69783
2.22k
      wuffs_private_impl__ignore_status(wuffs_zlib__decoder__initialize(&self->private_data.f_zlib,
69784
2.22k
          sizeof (wuffs_zlib__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
69785
2.22k
      if (self->private_impl.f_ignore_checksum) {
69786
0
        wuffs_zlib__decoder__set_quirk(&self->private_data.f_zlib, 1u, 1u);
69787
0
      }
69788
2.22k
    }
69789
6.25k
    self->private_impl.f_zlib_is_dirty = true;
69790
6.25k
    v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler,
69791
6.25k
        wuffs_base__pixel_buffer__pixel_format(a_dst),
69792
6.25k
        wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)),
69793
6.25k
        wuffs_base__utility__make_pixel_format(self->private_impl.f_src_pixfmt),
69794
6.25k
        wuffs_base__make_slice_u8(self->private_data.f_src_palette, 1024),
69795
6.25k
        a_blend);
69796
6.25k
    if ( ! wuffs_base__status__is_ok(&v_status)) {
69797
0
      status = v_status;
69798
0
      if (wuffs_base__status__is_error(&status)) {
69799
0
        goto exit;
69800
0
      } else if (wuffs_base__status__is_suspension(&status)) {
69801
0
        status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
69802
0
        goto exit;
69803
0
      }
69804
0
      goto ok;
69805
0
    }
69806
6.25k
    self->private_impl.f_workbuf_hist_pos_base = 0u;
69807
12.7k
    while (true) {
69808
12.7k
      if (self->private_impl.f_chunk_type_array[0u] == 73u) {
69809
10.9k
        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]));
69810
10.9k
        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]));
69811
10.9k
      } else {
69812
1.83k
        v_pass_width = (16777215u & ((uint32_t)(self->private_impl.f_frame_rect_x1 - self->private_impl.f_frame_rect_x0)));
69813
1.83k
        v_pass_height = (16777215u & ((uint32_t)(self->private_impl.f_frame_rect_y1 - self->private_impl.f_frame_rect_y0)));
69814
1.83k
      }
69815
12.7k
      if ((v_pass_width > 0u) && (v_pass_height > 0u)) {
69816
10.3k
        self->private_impl.f_pass_bytes_per_row = wuffs_png__decoder__calculate_bytes_per_row(self, v_pass_width);
69817
10.3k
        self->private_impl.f_pass_workbuf_length = (((uint64_t)(v_pass_height)) * (1u + self->private_impl.f_pass_bytes_per_row));
69818
10.3k
        while (true) {
69819
10.3k
          {
69820
10.3k
            if (a_src) {
69821
10.3k
              a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
69822
10.3k
            }
69823
10.3k
            wuffs_base__status t_1 = wuffs_png__decoder__decode_pass(self, a_src, a_workbuf);
69824
10.3k
            v_status = t_1;
69825
10.3k
            if (a_src) {
69826
10.3k
              iop_a_src = a_src->data.ptr + a_src->meta.ri;
69827
10.3k
            }
69828
10.3k
          }
69829
10.3k
          if (wuffs_base__status__is_ok(&v_status)) {
69830
7.07k
            break;
69831
7.07k
          } else if (wuffs_base__status__is_error(&v_status) || ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed))) {
69832
2.48k
            if (self->private_impl.f_workbuf_wi <= ((uint64_t)(a_workbuf.len))) {
69833
2.48k
              wuffs_png__decoder__filter_and_swizzle(self, a_dst, wuffs_base__slice_u8__subslice_j(a_workbuf, self->private_impl.f_workbuf_wi));
69834
2.48k
            }
69835
2.48k
            if (v_status.repr == wuffs_base__suspension__short_read) {
69836
64
              status = wuffs_base__make_status(wuffs_png__error__truncated_input);
69837
64
              goto exit;
69838
64
            }
69839
2.48k
          }
69840
3.23k
          status = v_status;
69841
3.23k
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6);
69842
0
        }
69843
7.07k
        v_status = wuffs_png__decoder__filter_and_swizzle(self, a_dst, a_workbuf);
69844
7.07k
        if ( ! wuffs_base__status__is_ok(&v_status)) {
69845
75
          status = v_status;
69846
75
          if (wuffs_base__status__is_error(&status)) {
69847
75
            goto exit;
69848
75
          } else if (wuffs_base__status__is_suspension(&status)) {
69849
0
            status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
69850
0
            goto exit;
69851
0
          }
69852
0
          goto ok;
69853
75
        }
69854
6.99k
        self->private_impl.f_workbuf_hist_pos_base += self->private_impl.f_pass_workbuf_length;
69855
6.99k
      }
69856
9.37k
      if ((self->private_impl.f_interlace_pass == 0u) || (self->private_impl.f_interlace_pass >= 7u)) {
69857
2.87k
        break;
69858
2.87k
      }
69859
6.49k
#if defined(__GNUC__)
69860
6.49k
#pragma GCC diagnostic push
69861
6.49k
#pragma GCC diagnostic ignored "-Wconversion"
69862
6.49k
#endif
69863
6.49k
      self->private_impl.f_interlace_pass += 1u;
69864
6.49k
#if defined(__GNUC__)
69865
6.49k
#pragma GCC diagnostic pop
69866
6.49k
#endif
69867
6.49k
    }
69868
2.87k
    wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u);
69869
2.87k
    self->private_impl.f_call_sequence = 32u;
69870
69871
2.87k
    ok:
69872
2.87k
    self->private_impl.p_do_decode_frame = 0;
69873
2.87k
    goto exit;
69874
6.52k
  }
69875
69876
0
  goto suspend;
69877
1.00k
  suspend:
69878
1.00k
  self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
69879
69880
1.00k
  goto exit;
69881
6.52k
  exit:
69882
6.52k
  if (a_src && a_src->data.ptr) {
69883
6.52k
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
69884
6.52k
  }
69885
69886
6.52k
  return status;
69887
6.52k
}
69888
69889
// -------- func png.decoder.decode_pass
69890
69891
WUFFS_BASE__GENERATED_C_CODE
69892
static wuffs_base__status
69893
wuffs_png__decoder__decode_pass(
69894
    wuffs_png__decoder* self,
69895
    wuffs_base__io_buffer* a_src,
69896
10.3k
    wuffs_base__slice_u8 a_workbuf) {
69897
10.3k
  wuffs_base__status status = wuffs_base__make_status(NULL);
69898
69899
10.3k
  wuffs_base__io_buffer u_w = wuffs_base__empty_io_buffer();
69900
10.3k
  wuffs_base__io_buffer* v_w = &u_w;
69901
10.3k
  uint8_t* iop_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
69902
10.3k
  uint8_t* io0_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
69903
10.3k
  uint8_t* io1_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
69904
10.3k
  uint8_t* io2_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
69905
10.3k
  uint64_t v_w_mark = 0;
69906
10.3k
  uint64_t v_r_mark = 0;
69907
10.3k
  wuffs_base__status v_zlib_status = wuffs_base__make_status(NULL);
69908
10.3k
  uint32_t v_checksum_have = 0;
69909
10.3k
  uint32_t v_checksum_want = 0;
69910
10.3k
  uint32_t v_seq_num = 0;
69911
69912
10.3k
  const uint8_t* iop_a_src = NULL;
69913
10.3k
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
69914
10.3k
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
69915
10.3k
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
69916
10.3k
  if (a_src && a_src->data.ptr) {
69917
10.3k
    io0_a_src = a_src->data.ptr;
69918
10.3k
    io1_a_src = io0_a_src + a_src->meta.ri;
69919
10.3k
    iop_a_src = io1_a_src;
69920
10.3k
    io2_a_src = io0_a_src + a_src->meta.wi;
69921
10.3k
  }
69922
69923
10.3k
  uint32_t coro_susp_point = self->private_impl.p_decode_pass;
69924
10.3k
  switch (coro_susp_point) {
69925
10.3k
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
69926
69927
10.3k
    self->private_impl.f_workbuf_wi = 0u;
69928
21.3k
    while (true) {
69929
21.3k
      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)))) {
69930
0
        status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length);
69931
0
        goto exit;
69932
0
      }
69933
21.3k
      {
69934
21.3k
        wuffs_base__io_buffer* o_0_v_w = v_w;
69935
21.3k
        uint8_t* o_0_iop_v_w = iop_v_w;
69936
21.3k
        uint8_t* o_0_io0_v_w = io0_v_w;
69937
21.3k
        uint8_t* o_0_io1_v_w = io1_v_w;
69938
21.3k
        uint8_t* o_0_io2_v_w = io2_v_w;
69939
21.3k
        v_w = wuffs_private_impl__io_writer__set(
69940
21.3k
            &u_w,
69941
21.3k
            &iop_v_w,
69942
21.3k
            &io0_v_w,
69943
21.3k
            &io1_v_w,
69944
21.3k
            &io2_v_w,
69945
21.3k
            wuffs_base__slice_u8__subslice_ij(a_workbuf,
69946
21.3k
            self->private_impl.f_workbuf_wi,
69947
21.3k
            self->private_impl.f_pass_workbuf_length),
69948
21.3k
            ((uint64_t)(self->private_impl.f_workbuf_hist_pos_base + self->private_impl.f_workbuf_wi)));
69949
21.3k
        {
69950
21.3k
          const bool o_1_closed_a_src = a_src->meta.closed;
69951
21.3k
          const uint8_t* o_1_io2_a_src = io2_a_src;
69952
21.3k
          wuffs_private_impl__io_reader__limit(&io2_a_src, iop_a_src,
69953
21.3k
              ((uint64_t)(self->private_impl.f_chunk_length)));
69954
21.3k
          if (a_src) {
69955
21.3k
            size_t n = ((size_t)(io2_a_src - a_src->data.ptr));
69956
21.3k
            a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n);
69957
21.3k
            a_src->meta.wi = n;
69958
21.3k
          }
69959
21.3k
          v_w_mark = ((uint64_t)(iop_v_w - io0_v_w));
69960
21.3k
          v_r_mark = ((uint64_t)(iop_a_src - io0_a_src));
69961
21.3k
          {
69962
21.3k
            u_w.meta.wi = ((size_t)(iop_v_w - u_w.data.ptr));
69963
21.3k
            if (a_src) {
69964
21.3k
              a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
69965
21.3k
            }
69966
21.3k
            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());
69967
21.3k
            v_zlib_status = t_0;
69968
21.3k
            iop_v_w = u_w.data.ptr + u_w.meta.wi;
69969
21.3k
            if (a_src) {
69970
21.3k
              iop_a_src = a_src->data.ptr + a_src->meta.ri;
69971
21.3k
            }
69972
21.3k
          }
69973
21.3k
          if ( ! self->private_impl.f_ignore_checksum) {
69974
21.3k
            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));
69975
21.3k
          }
69976
21.3k
          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))))));
69977
21.3k
          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))));
69978
21.3k
          io2_a_src = o_1_io2_a_src;
69979
21.3k
          if (a_src) {
69980
21.3k
            a_src->meta.closed = o_1_closed_a_src;
69981
21.3k
            a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr));
69982
21.3k
          }
69983
21.3k
        }
69984
21.3k
        v_w = o_0_v_w;
69985
21.3k
        iop_v_w = o_0_iop_v_w;
69986
21.3k
        io0_v_w = o_0_io0_v_w;
69987
21.3k
        io1_v_w = o_0_io1_v_w;
69988
21.3k
        io2_v_w = o_0_io2_v_w;
69989
21.3k
      }
69990
21.3k
      if (wuffs_base__status__is_ok(&v_zlib_status)) {
69991
2.18k
        if (self->private_impl.f_chunk_length > 0u) {
69992
56
          status = wuffs_base__make_status(wuffs_base__error__too_much_data);
69993
56
          goto exit;
69994
56
        }
69995
2.13k
        {
69996
2.13k
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
69997
2.13k
          uint32_t t_1;
69998
2.13k
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
69999
2.12k
            t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
70000
2.12k
            iop_a_src += 4;
70001
2.12k
          } else {
70002
10
            self->private_data.s_decode_pass.scratch = 0;
70003
10
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
70004
20
            while (true) {
70005
20
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
70006
10
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
70007
10
                goto suspend;
70008
10
              }
70009
10
              uint64_t* scratch = &self->private_data.s_decode_pass.scratch;
70010
10
              uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu));
70011
10
              *scratch >>= 8;
70012
10
              *scratch <<= 8;
70013
10
              *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1);
70014
10
              if (num_bits_1 == 24) {
70015
0
                t_1 = ((uint32_t)(*scratch >> 32));
70016
0
                break;
70017
0
              }
70018
10
              num_bits_1 += 8u;
70019
10
              *scratch |= ((uint64_t)(num_bits_1));
70020
10
            }
70021
10
          }
70022
2.12k
          v_checksum_want = t_1;
70023
2.12k
        }
70024
2.12k
        if ( ! self->private_impl.f_ignore_checksum && (self->private_impl.f_chunk_type_array[0u] == 73u)) {
70025
534
          v_checksum_have = wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__utility__empty_slice_u8());
70026
534
          if (v_checksum_have != v_checksum_want) {
70027
57
            status = wuffs_base__make_status(wuffs_png__error__bad_checksum);
70028
57
            goto exit;
70029
57
          }
70030
534
        }
70031
2.06k
        break;
70032
19.1k
      } else if (v_zlib_status.repr == wuffs_base__suspension__short_write) {
70033
5.09k
        if ((1u <= self->private_impl.f_interlace_pass) && (self->private_impl.f_interlace_pass <= 6u)) {
70034
5.01k
          break;
70035
5.01k
        }
70036
79
        status = wuffs_base__make_status(wuffs_base__error__too_much_data);
70037
79
        goto exit;
70038
14.0k
      } else if (v_zlib_status.repr != wuffs_base__suspension__short_read) {
70039
1.95k
        status = v_zlib_status;
70040
1.95k
        if (wuffs_base__status__is_error(&status)) {
70041
1.94k
          goto exit;
70042
1.94k
        } else if (wuffs_base__status__is_suspension(&status)) {
70043
0
          status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
70044
0
          goto exit;
70045
0
        }
70046
10
        goto ok;
70047
12.1k
      } else if (self->private_impl.f_chunk_length == 0u) {
70048
11.4k
        {
70049
11.4k
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
70050
11.4k
          uint32_t t_2;
70051
11.4k
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
70052
11.3k
            t_2 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
70053
11.3k
            iop_a_src += 4;
70054
11.3k
          } else {
70055
102
            self->private_data.s_decode_pass.scratch = 0;
70056
102
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
70057
144
            while (true) {
70058
144
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
70059
102
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
70060
102
                goto suspend;
70061
102
              }
70062
42
              uint64_t* scratch = &self->private_data.s_decode_pass.scratch;
70063
42
              uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu));
70064
42
              *scratch >>= 8;
70065
42
              *scratch <<= 8;
70066
42
              *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2);
70067
42
              if (num_bits_2 == 24) {
70068
0
                t_2 = ((uint32_t)(*scratch >> 32));
70069
0
                break;
70070
0
              }
70071
42
              num_bits_2 += 8u;
70072
42
              *scratch |= ((uint64_t)(num_bits_2));
70073
42
            }
70074
102
          }
70075
11.3k
          v_checksum_want = t_2;
70076
11.3k
        }
70077
11.3k
        if ( ! self->private_impl.f_ignore_checksum && (self->private_impl.f_chunk_type_array[0u] == 73u)) {
70078
10.8k
          v_checksum_have = wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__utility__empty_slice_u8());
70079
10.8k
          if (v_checksum_have != v_checksum_want) {
70080
106
            status = wuffs_base__make_status(wuffs_png__error__bad_checksum);
70081
106
            goto exit;
70082
106
          }
70083
10.8k
        }
70084
11.2k
        {
70085
11.2k
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
70086
11.2k
          uint32_t t_3;
70087
11.2k
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
70088
11.1k
            t_3 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
70089
11.1k
            iop_a_src += 4;
70090
11.1k
          } else {
70091
22
            self->private_data.s_decode_pass.scratch = 0;
70092
22
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
70093
32
            while (true) {
70094
32
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
70095
22
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
70096
22
                goto suspend;
70097
22
              }
70098
10
              uint64_t* scratch = &self->private_data.s_decode_pass.scratch;
70099
10
              uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFFu));
70100
10
              *scratch >>= 8;
70101
10
              *scratch <<= 8;
70102
10
              *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3);
70103
10
              if (num_bits_3 == 24) {
70104
0
                t_3 = ((uint32_t)(*scratch >> 32));
70105
0
                break;
70106
0
              }
70107
10
              num_bits_3 += 8u;
70108
10
              *scratch |= ((uint64_t)(num_bits_3));
70109
10
            }
70110
22
          }
70111
11.1k
          self->private_impl.f_chunk_length = t_3;
70112
11.1k
        }
70113
0
        {
70114
11.1k
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
70115
11.1k
          uint32_t t_4;
70116
11.1k
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
70117
11.1k
            t_4 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
70118
11.1k
            iop_a_src += 4;
70119
11.1k
          } else {
70120
12
            self->private_data.s_decode_pass.scratch = 0;
70121
12
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
70122
19
            while (true) {
70123
19
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
70124
12
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
70125
12
                goto suspend;
70126
12
              }
70127
7
              uint64_t* scratch = &self->private_data.s_decode_pass.scratch;
70128
7
              uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56));
70129
7
              *scratch <<= 8;
70130
7
              *scratch >>= 8;
70131
7
              *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4;
70132
7
              if (num_bits_4 == 24) {
70133
0
                t_4 = ((uint32_t)(*scratch));
70134
0
                break;
70135
0
              }
70136
7
              num_bits_4 += 8u;
70137
7
              *scratch |= ((uint64_t)(num_bits_4)) << 56;
70138
7
            }
70139
12
          }
70140
11.1k
          self->private_impl.f_chunk_type = t_4;
70141
11.1k
        }
70142
11.1k
        if (self->private_impl.f_chunk_type_array[0u] == 73u) {
70143
10.7k
          if (self->private_impl.f_chunk_type != 1413563465u) {
70144
56
            status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
70145
56
            goto exit;
70146
56
          }
70147
10.7k
          if ( ! self->private_impl.f_ignore_checksum) {
70148
10.7k
            wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32,
70149
10.7k
                sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
70150
10.7k
            wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__make_slice_u8(self->private_impl.f_chunk_type_array, 4));
70151
10.7k
          }
70152
10.7k
        } else {
70153
423
          if ((self->private_impl.f_chunk_type != 1413571686u) || (self->private_impl.f_chunk_length < 4u)) {
70154
60
            status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
70155
60
            goto exit;
70156
60
          }
70157
363
          self->private_impl.f_chunk_length -= 4u;
70158
363
          {
70159
363
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
70160
363
            uint32_t t_5;
70161
363
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
70162
333
              t_5 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
70163
333
              iop_a_src += 4;
70164
333
            } else {
70165
30
              self->private_data.s_decode_pass.scratch = 0;
70166
30
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
70167
36
              while (true) {
70168
36
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
70169
30
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
70170
30
                  goto suspend;
70171
30
                }
70172
6
                uint64_t* scratch = &self->private_data.s_decode_pass.scratch;
70173
6
                uint32_t num_bits_5 = ((uint32_t)(*scratch & 0xFFu));
70174
6
                *scratch >>= 8;
70175
6
                *scratch <<= 8;
70176
6
                *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_5);
70177
6
                if (num_bits_5 == 24) {
70178
0
                  t_5 = ((uint32_t)(*scratch >> 32));
70179
0
                  break;
70180
0
                }
70181
6
                num_bits_5 += 8u;
70182
6
                *scratch |= ((uint64_t)(num_bits_5));
70183
6
              }
70184
30
            }
70185
333
            v_seq_num = t_5;
70186
333
          }
70187
333
          if (v_seq_num != self->private_impl.f_next_animation_seq_num) {
70188
53
            status = wuffs_base__make_status(wuffs_png__error__bad_animation_sequence_number);
70189
53
            goto exit;
70190
280
          } else if (self->private_impl.f_next_animation_seq_num >= 4294967295u) {
70191
0
            status = wuffs_base__make_status(wuffs_png__error__unsupported_png_file);
70192
0
            goto exit;
70193
0
          }
70194
280
          self->private_impl.f_next_animation_seq_num += 1u;
70195
280
        }
70196
10.9k
        continue;
70197
11.1k
      } else if (((uint64_t)(io2_a_src - iop_a_src)) > 0u) {
70198
0
        status = wuffs_base__make_status(wuffs_png__error__internal_error_zlib_decoder_did_not_exhaust_its_input);
70199
0
        goto exit;
70200
0
      }
70201
697
      status = wuffs_base__make_status(wuffs_base__suspension__short_read);
70202
697
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(11);
70203
0
    }
70204
7.07k
    if (self->private_impl.f_workbuf_wi != self->private_impl.f_pass_workbuf_length) {
70205
3
      status = wuffs_base__make_status(wuffs_base__error__not_enough_data);
70206
3
      goto exit;
70207
7.07k
    } else if (0u < ((uint64_t)(a_workbuf.len))) {
70208
7.07k
      if (a_workbuf.ptr[0u] == 4u) {
70209
2.77k
        a_workbuf.ptr[0u] = 1u;
70210
2.77k
      }
70211
7.07k
    }
70212
70213
7.08k
    ok:
70214
7.08k
    self->private_impl.p_decode_pass = 0;
70215
7.08k
    goto exit;
70216
10.3k
  }
70217
70218
0
  goto suspend;
70219
873
  suspend:
70220
873
  self->private_impl.p_decode_pass = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
70221
70222
873
  goto exit;
70223
10.3k
  exit:
70224
10.3k
  if (a_src && a_src->data.ptr) {
70225
10.3k
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
70226
10.3k
  }
70227
70228
10.3k
  return status;
70229
10.3k
}
70230
70231
// -------- func png.decoder.frame_dirty_rect
70232
70233
WUFFS_BASE__GENERATED_C_CODE
70234
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
70235
wuffs_png__decoder__frame_dirty_rect(
70236
6.52k
    const wuffs_png__decoder* self) {
70237
6.52k
  if (!self) {
70238
0
    return wuffs_base__utility__empty_rect_ie_u32();
70239
0
  }
70240
6.52k
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
70241
6.52k
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
70242
0
    return wuffs_base__utility__empty_rect_ie_u32();
70243
0
  }
70244
70245
6.52k
  return wuffs_base__utility__make_rect_ie_u32(
70246
6.52k
      self->private_impl.f_frame_rect_x0,
70247
6.52k
      self->private_impl.f_frame_rect_y0,
70248
6.52k
      self->private_impl.f_frame_rect_x1,
70249
6.52k
      self->private_impl.f_frame_rect_y1);
70250
6.52k
}
70251
70252
// -------- func png.decoder.num_animation_loops
70253
70254
WUFFS_BASE__GENERATED_C_CODE
70255
WUFFS_BASE__MAYBE_STATIC uint32_t
70256
wuffs_png__decoder__num_animation_loops(
70257
0
    const wuffs_png__decoder* self) {
70258
0
  if (!self) {
70259
0
    return 0;
70260
0
  }
70261
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
70262
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
70263
0
    return 0;
70264
0
  }
70265
70266
0
  return self->private_impl.f_num_animation_loops_value;
70267
0
}
70268
70269
// -------- func png.decoder.num_decoded_frame_configs
70270
70271
WUFFS_BASE__GENERATED_C_CODE
70272
WUFFS_BASE__MAYBE_STATIC uint64_t
70273
wuffs_png__decoder__num_decoded_frame_configs(
70274
0
    const wuffs_png__decoder* self) {
70275
0
  if (!self) {
70276
0
    return 0;
70277
0
  }
70278
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
70279
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
70280
0
    return 0;
70281
0
  }
70282
70283
0
  return ((uint64_t)(self->private_impl.f_num_decoded_frame_configs_value));
70284
0
}
70285
70286
// -------- func png.decoder.num_decoded_frames
70287
70288
WUFFS_BASE__GENERATED_C_CODE
70289
WUFFS_BASE__MAYBE_STATIC uint64_t
70290
wuffs_png__decoder__num_decoded_frames(
70291
0
    const wuffs_png__decoder* self) {
70292
0
  if (!self) {
70293
0
    return 0;
70294
0
  }
70295
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
70296
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
70297
0
    return 0;
70298
0
  }
70299
70300
0
  return ((uint64_t)(self->private_impl.f_num_decoded_frames_value));
70301
0
}
70302
70303
// -------- func png.decoder.restart_frame
70304
70305
WUFFS_BASE__GENERATED_C_CODE
70306
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
70307
wuffs_png__decoder__restart_frame(
70308
    wuffs_png__decoder* self,
70309
    uint64_t a_index,
70310
0
    uint64_t a_io_position) {
70311
0
  if (!self) {
70312
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
70313
0
  }
70314
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
70315
0
    return wuffs_base__make_status(
70316
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
70317
0
        ? wuffs_base__error__disabled_by_previous_error
70318
0
        : wuffs_base__error__initialize_not_called);
70319
0
  }
70320
70321
0
  if (self->private_impl.f_call_sequence < 32u) {
70322
0
    return wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
70323
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))) {
70324
0
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
70325
0
  }
70326
0
  self->private_impl.f_call_sequence = 40u;
70327
0
  if (self->private_impl.f_interlace_pass >= 1u) {
70328
0
    self->private_impl.f_interlace_pass = 1u;
70329
0
  }
70330
0
  self->private_impl.f_frame_config_io_position = a_io_position;
70331
0
  self->private_impl.f_num_decoded_frame_configs_value = ((uint32_t)(a_index));
70332
0
  self->private_impl.f_num_decoded_frames_value = self->private_impl.f_num_decoded_frame_configs_value;
70333
0
  return wuffs_base__make_status(NULL);
70334
0
}
70335
70336
// -------- func png.decoder.set_report_metadata
70337
70338
WUFFS_BASE__GENERATED_C_CODE
70339
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
70340
wuffs_png__decoder__set_report_metadata(
70341
    wuffs_png__decoder* self,
70342
    uint32_t a_fourcc,
70343
0
    bool a_report) {
70344
0
  if (!self) {
70345
0
    return wuffs_base__make_empty_struct();
70346
0
  }
70347
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
70348
0
    return wuffs_base__make_empty_struct();
70349
0
  }
70350
70351
0
  if (a_fourcc == 1128813133u) {
70352
0
    self->private_impl.f_report_metadata_chrm = a_report;
70353
0
  } else if (a_fourcc == 1163413830u) {
70354
0
    self->private_impl.f_report_metadata_exif = a_report;
70355
0
  } else if (a_fourcc == 1195461953u) {
70356
0
    self->private_impl.f_report_metadata_gama = a_report;
70357
0
  } else if (a_fourcc == 1229144912u) {
70358
0
    self->private_impl.f_report_metadata_iccp = a_report;
70359
0
  } else if (a_fourcc == 1263947808u) {
70360
0
    self->private_impl.f_report_metadata_kvp = a_report;
70361
0
  } else if (a_fourcc == 1397901122u) {
70362
0
    self->private_impl.f_report_metadata_srgb = a_report;
70363
0
  }
70364
0
  return wuffs_base__make_empty_struct();
70365
0
}
70366
70367
// -------- func png.decoder.tell_me_more
70368
70369
WUFFS_BASE__GENERATED_C_CODE
70370
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
70371
wuffs_png__decoder__tell_me_more(
70372
    wuffs_png__decoder* self,
70373
    wuffs_base__io_buffer* a_dst,
70374
    wuffs_base__more_information* a_minfo,
70375
0
    wuffs_base__io_buffer* a_src) {
70376
0
  if (!self) {
70377
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
70378
0
  }
70379
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
70380
0
    return wuffs_base__make_status(
70381
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
70382
0
        ? wuffs_base__error__disabled_by_previous_error
70383
0
        : wuffs_base__error__initialize_not_called);
70384
0
  }
70385
0
  if (!a_dst || !a_src) {
70386
0
    self->private_impl.magic = WUFFS_BASE__DISABLED;
70387
0
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
70388
0
  }
70389
0
  if ((self->private_impl.active_coroutine != 0) &&
70390
0
      (self->private_impl.active_coroutine != 4)) {
70391
0
    self->private_impl.magic = WUFFS_BASE__DISABLED;
70392
0
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
70393
0
  }
70394
0
  self->private_impl.active_coroutine = 0;
70395
0
  wuffs_base__status status = wuffs_base__make_status(NULL);
70396
70397
0
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
70398
70399
0
  uint32_t coro_susp_point = self->private_impl.p_tell_me_more;
70400
0
  switch (coro_susp_point) {
70401
0
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
70402
70403
0
    while (true) {
70404
0
      {
70405
0
        wuffs_base__status t_0 = wuffs_png__decoder__do_tell_me_more(self, a_dst, a_minfo, a_src);
70406
0
        v_status = t_0;
70407
0
      }
70408
0
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
70409
0
        status = wuffs_base__make_status(wuffs_png__error__truncated_input);
70410
0
        goto exit;
70411
0
      }
70412
0
      status = v_status;
70413
0
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
70414
0
    }
70415
70416
0
    ok:
70417
0
    self->private_impl.p_tell_me_more = 0;
70418
0
    goto exit;
70419
0
  }
70420
70421
0
  goto suspend;
70422
0
  suspend:
70423
0
  self->private_impl.p_tell_me_more = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
70424
0
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 4 : 0;
70425
70426
0
  goto exit;
70427
0
  exit:
70428
0
  if (wuffs_base__status__is_error(&status)) {
70429
0
    self->private_impl.magic = WUFFS_BASE__DISABLED;
70430
0
  }
70431
0
  return status;
70432
0
}
70433
70434
// -------- func png.decoder.do_tell_me_more
70435
70436
WUFFS_BASE__GENERATED_C_CODE
70437
static wuffs_base__status
70438
wuffs_png__decoder__do_tell_me_more(
70439
    wuffs_png__decoder* self,
70440
    wuffs_base__io_buffer* a_dst,
70441
    wuffs_base__more_information* a_minfo,
70442
0
    wuffs_base__io_buffer* a_src) {
70443
0
  wuffs_base__status status = wuffs_base__make_status(NULL);
70444
70445
0
  uint8_t v_c8 = 0;
70446
0
  uint16_t v_c16 = 0;
70447
0
  wuffs_base__io_buffer u_w = wuffs_base__empty_io_buffer();
70448
0
  wuffs_base__io_buffer* v_w = &u_w;
70449
0
  uint8_t* iop_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
70450
0
  uint8_t* io0_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
70451
0
  uint8_t* io1_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
70452
0
  uint8_t* io2_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
70453
0
  uint64_t v_num_written = 0;
70454
0
  uint64_t v_w_mark = 0;
70455
0
  uint64_t v_r_mark = 0;
70456
0
  wuffs_base__status v_zlib_status = wuffs_base__make_status(NULL);
70457
70458
0
  uint8_t* iop_a_dst = NULL;
70459
0
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
70460
0
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
70461
0
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
70462
0
  if (a_dst && a_dst->data.ptr) {
70463
0
    io0_a_dst = a_dst->data.ptr;
70464
0
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
70465
0
    iop_a_dst = io1_a_dst;
70466
0
    io2_a_dst = io0_a_dst + a_dst->data.len;
70467
0
    if (a_dst->meta.closed) {
70468
0
      io2_a_dst = iop_a_dst;
70469
0
    }
70470
0
  }
70471
0
  const uint8_t* iop_a_src = NULL;
70472
0
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
70473
0
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
70474
0
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
70475
0
  if (a_src && a_src->data.ptr) {
70476
0
    io0_a_src = a_src->data.ptr;
70477
0
    io1_a_src = io0_a_src + a_src->meta.ri;
70478
0
    iop_a_src = io1_a_src;
70479
0
    io2_a_src = io0_a_src + a_src->meta.wi;
70480
0
  }
70481
70482
0
  uint32_t coro_susp_point = self->private_impl.p_do_tell_me_more;
70483
0
  if (coro_susp_point) {
70484
0
    v_zlib_status = self->private_data.s_do_tell_me_more.v_zlib_status;
70485
0
  }
70486
0
  switch (coro_susp_point) {
70487
0
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
70488
70489
0
    if (((uint8_t)(self->private_impl.f_call_sequence & 16u)) == 0u) {
70490
0
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
70491
0
      goto exit;
70492
0
    }
70493
0
    if (self->private_impl.f_metadata_fourcc == 0u) {
70494
0
      status = wuffs_base__make_status(wuffs_base__error__no_more_information);
70495
0
      goto exit;
70496
0
    }
70497
0
    do {
70498
0
      if (self->private_impl.f_metadata_flavor == 3u) {
70499
0
        while (true) {
70500
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) {
70501
0
            status = wuffs_base__make_status(wuffs_base__error__bad_i_o_position);
70502
0
            goto exit;
70503
0
          } else if (a_minfo != NULL) {
70504
0
            wuffs_base__more_information__set(a_minfo,
70505
0
                self->private_impl.f_metadata_flavor,
70506
0
                self->private_impl.f_metadata_fourcc,
70507
0
                self->private_impl.f_metadata_x,
70508
0
                self->private_impl.f_metadata_y,
70509
0
                self->private_impl.f_metadata_z);
70510
0
          }
70511
0
          if (self->private_impl.f_metadata_y >= self->private_impl.f_metadata_z) {
70512
0
            goto label__goto_done__break;
70513
0
          }
70514
0
          self->private_impl.f_metadata_y = self->private_impl.f_metadata_z;
70515
0
          status = wuffs_base__make_status(wuffs_base__suspension__even_more_information);
70516
0
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
70517
0
        }
70518
0
      }
70519
0
      if (self->private_impl.f_metadata_is_zlib_compressed) {
70520
0
        if (self->private_impl.f_zlib_is_dirty) {
70521
0
          wuffs_private_impl__ignore_status(wuffs_zlib__decoder__initialize(&self->private_data.f_zlib,
70522
0
              sizeof (wuffs_zlib__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
70523
0
          if (self->private_impl.f_ignore_checksum) {
70524
0
            wuffs_zlib__decoder__set_quirk(&self->private_data.f_zlib, 1u, 1u);
70525
0
          }
70526
0
        }
70527
0
        self->private_impl.f_zlib_is_dirty = true;
70528
0
        self->private_impl.f_ztxt_hist_pos = 0u;
70529
0
      }
70530
0
      label__loop__continue:;
70531
0
      while (true) {
70532
0
        if (a_minfo != NULL) {
70533
0
          wuffs_base__more_information__set(a_minfo,
70534
0
              self->private_impl.f_metadata_flavor,
70535
0
              self->private_impl.f_metadata_fourcc,
70536
0
              self->private_impl.f_metadata_x,
70537
0
              self->private_impl.f_metadata_y,
70538
0
              self->private_impl.f_metadata_z);
70539
0
        }
70540
0
        if (self->private_impl.f_metadata_flavor != 4u) {
70541
0
          break;
70542
0
        }
70543
0
        if (self->private_impl.f_metadata_is_zlib_compressed) {
70544
0
          if (self->private_impl.f_chunk_type == 1346585449u) {
70545
0
            {
70546
0
              const bool o_0_closed_a_src = a_src->meta.closed;
70547
0
              const uint8_t* o_0_io2_a_src = io2_a_src;
70548
0
              wuffs_private_impl__io_reader__limit(&io2_a_src, iop_a_src,
70549
0
                  ((uint64_t)(self->private_impl.f_chunk_length)));
70550
0
              if (a_src) {
70551
0
                size_t n = ((size_t)(io2_a_src - a_src->data.ptr));
70552
0
                a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n);
70553
0
                a_src->meta.wi = n;
70554
0
              }
70555
0
              v_r_mark = ((uint64_t)(iop_a_src - io0_a_src));
70556
0
              {
70557
0
                if (a_dst) {
70558
0
                  a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
70559
0
                }
70560
0
                if (a_src) {
70561
0
                  a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
70562
0
                }
70563
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());
70564
0
                v_zlib_status = t_0;
70565
0
                if (a_dst) {
70566
0
                  iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
70567
0
                }
70568
0
                if (a_src) {
70569
0
                  iop_a_src = a_src->data.ptr + a_src->meta.ri;
70570
0
                }
70571
0
              }
70572
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))))));
70573
0
              io2_a_src = o_0_io2_a_src;
70574
0
              if (a_src) {
70575
0
                a_src->meta.closed = o_0_closed_a_src;
70576
0
                a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr));
70577
0
              }
70578
0
            }
70579
0
            if (wuffs_base__status__is_ok(&v_zlib_status)) {
70580
0
              self->private_impl.f_metadata_is_zlib_compressed = false;
70581
0
              break;
70582
0
            } else if ( ! wuffs_base__status__is_suspension(&v_zlib_status)) {
70583
0
              status = v_zlib_status;
70584
0
              if (wuffs_base__status__is_error(&status)) {
70585
0
                goto exit;
70586
0
              } else if (wuffs_base__status__is_suspension(&status)) {
70587
0
                status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
70588
0
                goto exit;
70589
0
              }
70590
0
              goto ok;
70591
0
            }
70592
0
            status = v_zlib_status;
70593
0
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2);
70594
0
          } else if (self->private_impl.f_chunk_type == 1951945833u) {
70595
0
            {
70596
0
              const bool o_1_closed_a_src = a_src->meta.closed;
70597
0
              const uint8_t* o_1_io2_a_src = io2_a_src;
70598
0
              wuffs_private_impl__io_reader__limit(&io2_a_src, iop_a_src,
70599
0
                  ((uint64_t)(self->private_impl.f_chunk_length)));
70600
0
              if (a_src) {
70601
0
                size_t n = ((size_t)(io2_a_src - a_src->data.ptr));
70602
0
                a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n);
70603
0
                a_src->meta.wi = n;
70604
0
              }
70605
0
              v_r_mark = ((uint64_t)(iop_a_src - io0_a_src));
70606
0
              {
70607
0
                if (a_dst) {
70608
0
                  a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
70609
0
                }
70610
0
                if (a_src) {
70611
0
                  a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
70612
0
                }
70613
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());
70614
0
                v_zlib_status = t_1;
70615
0
                if (a_dst) {
70616
0
                  iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
70617
0
                }
70618
0
                if (a_src) {
70619
0
                  iop_a_src = a_src->data.ptr + a_src->meta.ri;
70620
0
                }
70621
0
              }
70622
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))))));
70623
0
              io2_a_src = o_1_io2_a_src;
70624
0
              if (a_src) {
70625
0
                a_src->meta.closed = o_1_closed_a_src;
70626
0
                a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr));
70627
0
              }
70628
0
            }
70629
0
            if (wuffs_base__status__is_ok(&v_zlib_status)) {
70630
0
              self->private_impl.f_metadata_is_zlib_compressed = false;
70631
0
              break;
70632
0
            } else if ( ! wuffs_base__status__is_suspension(&v_zlib_status)) {
70633
0
              status = v_zlib_status;
70634
0
              if (wuffs_base__status__is_error(&status)) {
70635
0
                goto exit;
70636
0
              } else if (wuffs_base__status__is_suspension(&status)) {
70637
0
                status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
70638
0
                goto exit;
70639
0
              }
70640
0
              goto ok;
70641
0
            }
70642
0
            status = v_zlib_status;
70643
0
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3);
70644
0
          } else if (self->private_impl.f_chunk_type == 1951945850u) {
70645
0
            if (self->private_impl.f_ztxt_ri == self->private_impl.f_ztxt_wi) {
70646
0
              {
70647
0
                wuffs_base__io_buffer* o_2_v_w = v_w;
70648
0
                uint8_t* o_2_iop_v_w = iop_v_w;
70649
0
                uint8_t* o_2_io0_v_w = io0_v_w;
70650
0
                uint8_t* o_2_io1_v_w = io1_v_w;
70651
0
                uint8_t* o_2_io2_v_w = io2_v_w;
70652
0
                v_w = wuffs_private_impl__io_writer__set(
70653
0
                    &u_w,
70654
0
                    &iop_v_w,
70655
0
                    &io0_v_w,
70656
0
                    &io1_v_w,
70657
0
                    &io2_v_w,
70658
0
                    wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024),
70659
0
                    self->private_impl.f_ztxt_hist_pos);
70660
0
                {
70661
0
                  const bool o_3_closed_a_src = a_src->meta.closed;
70662
0
                  const uint8_t* o_3_io2_a_src = io2_a_src;
70663
0
                  wuffs_private_impl__io_reader__limit(&io2_a_src, iop_a_src,
70664
0
                      ((uint64_t)(self->private_impl.f_chunk_length)));
70665
0
                  if (a_src) {
70666
0
                    size_t n = ((size_t)(io2_a_src - a_src->data.ptr));
70667
0
                    a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n);
70668
0
                    a_src->meta.wi = n;
70669
0
                  }
70670
0
                  v_w_mark = ((uint64_t)(iop_v_w - io0_v_w));
70671
0
                  v_r_mark = ((uint64_t)(iop_a_src - io0_a_src));
70672
0
                  {
70673
0
                    u_w.meta.wi = ((size_t)(iop_v_w - u_w.data.ptr));
70674
0
                    if (a_src) {
70675
0
                      a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
70676
0
                    }
70677
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());
70678
0
                    v_zlib_status = t_2;
70679
0
                    iop_v_w = u_w.data.ptr + u_w.meta.wi;
70680
0
                    if (a_src) {
70681
0
                      iop_a_src = a_src->data.ptr + a_src->meta.ri;
70682
0
                    }
70683
0
                  }
70684
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))))));
70685
0
                  v_num_written = wuffs_private_impl__io__count_since(v_w_mark, ((uint64_t)(iop_v_w - io0_v_w)));
70686
0
                  io2_a_src = o_3_io2_a_src;
70687
0
                  if (a_src) {
70688
0
                    a_src->meta.closed = o_3_closed_a_src;
70689
0
                    a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr));
70690
0
                  }
70691
0
                }
70692
0
                v_w = o_2_v_w;
70693
0
                iop_v_w = o_2_iop_v_w;
70694
0
                io0_v_w = o_2_io0_v_w;
70695
0
                io1_v_w = o_2_io1_v_w;
70696
0
                io2_v_w = o_2_io2_v_w;
70697
0
              }
70698
0
              if (v_num_written > 1024u) {
70699
0
                status = wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_i_o);
70700
0
                goto exit;
70701
0
              }
70702
0
              self->private_impl.f_ztxt_ri = 0u;
70703
0
              self->private_impl.f_ztxt_wi = ((uint32_t)(v_num_written));
70704
0
              wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_ztxt_hist_pos, v_num_written);
70705
0
            }
70706
0
            while (self->private_impl.f_ztxt_ri < self->private_impl.f_ztxt_wi) {
70707
0
              v_c16 = WUFFS_PNG__LATIN_1[self->private_data.f_dst_palette[self->private_impl.f_ztxt_ri]];
70708
0
              if (v_c16 == 0u) {
70709
0
                status = wuffs_base__make_status(wuffs_png__error__bad_text_chunk_not_latin_1);
70710
0
                goto exit;
70711
0
              } else if (v_c16 <= 127u) {
70712
0
                if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
70713
0
                  status = wuffs_base__make_status(wuffs_base__suspension__short_write);
70714
0
                  WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4);
70715
0
                  goto label__loop__continue;
70716
0
                }
70717
0
                self->private_impl.f_ztxt_ri += 1u;
70718
0
                (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)(v_c16))), iop_a_dst += 1);
70719
0
              } else {
70720
0
                if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 1u) {
70721
0
                  status = wuffs_base__make_status(wuffs_base__suspension__short_write);
70722
0
                  WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5);
70723
0
                  goto label__loop__continue;
70724
0
                }
70725
0
                self->private_impl.f_ztxt_ri += 1u;
70726
0
                (wuffs_base__poke_u16le__no_bounds_check(iop_a_dst, v_c16), iop_a_dst += 2);
70727
0
              }
70728
0
            }
70729
0
            if (wuffs_base__status__is_ok(&v_zlib_status)) {
70730
0
              self->private_impl.f_metadata_is_zlib_compressed = false;
70731
0
              break;
70732
0
            } else if ( ! wuffs_base__status__is_suspension(&v_zlib_status)) {
70733
0
              status = v_zlib_status;
70734
0
              if (wuffs_base__status__is_error(&status)) {
70735
0
                goto exit;
70736
0
              } else if (wuffs_base__status__is_suspension(&status)) {
70737
0
                status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
70738
0
                goto exit;
70739
0
              }
70740
0
              goto ok;
70741
0
            } else if (v_zlib_status.repr != wuffs_base__suspension__short_write) {
70742
0
              status = v_zlib_status;
70743
0
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6);
70744
0
            }
70745
0
          } else {
70746
0
            status = wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_chunk_type);
70747
0
            goto exit;
70748
0
          }
70749
0
        } else if ((self->private_impl.f_chunk_type == 1951945833u) && (self->private_impl.f_metadata_fourcc == 1263947862u)) {
70750
0
          while (true) {
70751
0
            if (self->private_impl.f_chunk_length <= 0u) {
70752
0
              goto label__loop__break;
70753
0
            } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
70754
0
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
70755
0
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7);
70756
0
              goto label__loop__continue;
70757
0
            } else if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
70758
0
              status = wuffs_base__make_status(wuffs_base__suspension__short_write);
70759
0
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8);
70760
0
              goto label__loop__continue;
70761
0
            }
70762
0
            self->private_impl.f_chunk_length -= 1u;
70763
0
            v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
70764
0
            iop_a_src += 1u;
70765
0
            (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, v_c8), iop_a_dst += 1);
70766
0
          }
70767
0
        } else {
70768
0
          while (true) {
70769
0
            if (self->private_impl.f_chunk_length <= 0u) {
70770
0
              if (self->private_impl.f_metadata_fourcc == 1263947851u) {
70771
0
                status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
70772
0
                goto exit;
70773
0
              }
70774
0
              goto label__loop__break;
70775
0
            } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
70776
0
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
70777
0
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9);
70778
0
              goto label__loop__continue;
70779
0
            }
70780
0
            v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
70781
0
            if (v_c8 == 0u) {
70782
0
              self->private_impl.f_chunk_length -= 1u;
70783
0
              iop_a_src += 1u;
70784
0
              goto label__loop__break;
70785
0
            }
70786
0
            v_c16 = WUFFS_PNG__LATIN_1[v_c8];
70787
0
            if (v_c16 == 0u) {
70788
0
              status = wuffs_base__make_status(wuffs_png__error__bad_text_chunk_not_latin_1);
70789
0
              goto exit;
70790
0
            } else if (v_c16 <= 127u) {
70791
0
              if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
70792
0
                status = wuffs_base__make_status(wuffs_base__suspension__short_write);
70793
0
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10);
70794
0
                goto label__loop__continue;
70795
0
              }
70796
0
              self->private_impl.f_chunk_length -= 1u;
70797
0
              iop_a_src += 1u;
70798
0
              (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)(v_c16))), iop_a_dst += 1);
70799
0
            } else {
70800
0
              if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 1u) {
70801
0
                status = wuffs_base__make_status(wuffs_base__suspension__short_write);
70802
0
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(11);
70803
0
                goto label__loop__continue;
70804
0
              }
70805
0
              self->private_impl.f_chunk_length -= 1u;
70806
0
              iop_a_src += 1u;
70807
0
              (wuffs_base__poke_u16le__no_bounds_check(iop_a_dst, v_c16), iop_a_dst += 2);
70808
0
            }
70809
0
          }
70810
0
        }
70811
0
      }
70812
0
      label__loop__break:;
70813
0
      if (self->private_impl.f_metadata_fourcc == 1263947851u) {
70814
0
        self->private_impl.f_metadata_fourcc = 1263947862u;
70815
0
        if (self->private_impl.f_chunk_type == 1951945833u) {
70816
0
          if (self->private_impl.f_chunk_length <= 1u) {
70817
0
            status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
70818
0
            goto exit;
70819
0
          }
70820
0
          self->private_impl.f_chunk_length -= 2u;
70821
0
          {
70822
0
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12);
70823
0
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
70824
0
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
70825
0
              goto suspend;
70826
0
            }
70827
0
            uint8_t t_3 = *iop_a_src++;
70828
0
            v_c8 = t_3;
70829
0
          }
70830
0
          if (v_c8 == 0u) {
70831
0
            self->private_impl.f_metadata_is_zlib_compressed = false;
70832
0
          } else if (v_c8 == 1u) {
70833
0
            self->private_impl.f_metadata_is_zlib_compressed = true;
70834
0
          } else {
70835
0
            status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
70836
0
            goto exit;
70837
0
          }
70838
0
          {
70839
0
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13);
70840
0
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
70841
0
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
70842
0
              goto suspend;
70843
0
            }
70844
0
            uint8_t t_4 = *iop_a_src++;
70845
0
            v_c8 = t_4;
70846
0
          }
70847
0
          if ((v_c8 != 0u) && self->private_impl.f_metadata_is_zlib_compressed) {
70848
0
            status = wuffs_base__make_status(wuffs_png__error__unsupported_png_compression_method);
70849
0
            goto exit;
70850
0
          }
70851
0
          self->private_impl.f_metadata_fourcc -= 2u;
70852
0
          while (self->private_impl.f_metadata_fourcc != 1263947862u) {
70853
0
            self->private_impl.f_metadata_fourcc += 1u;
70854
0
            while (true) {
70855
0
              if (self->private_impl.f_chunk_length <= 0u) {
70856
0
                status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
70857
0
                goto exit;
70858
0
              }
70859
0
              self->private_impl.f_chunk_length -= 1u;
70860
0
              {
70861
0
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14);
70862
0
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
70863
0
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
70864
0
                  goto suspend;
70865
0
                }
70866
0
                uint8_t t_5 = *iop_a_src++;
70867
0
                v_c8 = t_5;
70868
0
              }
70869
0
              if (v_c8 == 0u) {
70870
0
                break;
70871
0
              }
70872
0
            }
70873
0
          }
70874
0
        } else if (self->private_impl.f_chunk_type == 1951945850u) {
70875
0
          if (self->private_impl.f_chunk_length <= 0u) {
70876
0
            status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
70877
0
            goto exit;
70878
0
          }
70879
0
          self->private_impl.f_chunk_length -= 1u;
70880
0
          {
70881
0
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15);
70882
0
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
70883
0
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
70884
0
              goto suspend;
70885
0
            }
70886
0
            uint8_t t_6 = *iop_a_src++;
70887
0
            v_c8 = t_6;
70888
0
          }
70889
0
          if (v_c8 != 0u) {
70890
0
            status = wuffs_base__make_status(wuffs_png__error__unsupported_png_compression_method);
70891
0
            goto exit;
70892
0
          }
70893
0
          self->private_impl.f_metadata_is_zlib_compressed = true;
70894
0
        }
70895
0
        self->private_impl.f_call_sequence &= 239u;
70896
0
        status = wuffs_base__make_status(NULL);
70897
0
        goto ok;
70898
0
      }
70899
0
    } while (0);
70900
0
    label__goto_done__break:;
70901
0
    if (self->private_impl.f_chunk_length != 0u) {
70902
0
      status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
70903
0
      goto exit;
70904
0
    }
70905
0
    self->private_data.s_do_tell_me_more.scratch = 4u;
70906
0
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16);
70907
0
    if (self->private_data.s_do_tell_me_more.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
70908
0
      self->private_data.s_do_tell_me_more.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
70909
0
      iop_a_src = io2_a_src;
70910
0
      status = wuffs_base__make_status(wuffs_base__suspension__short_read);
70911
0
      goto suspend;
70912
0
    }
70913
0
    iop_a_src += self->private_data.s_do_tell_me_more.scratch;
70914
0
    self->private_impl.f_metadata_flavor = 0u;
70915
0
    self->private_impl.f_metadata_fourcc = 0u;
70916
0
    self->private_impl.f_metadata_x = 0u;
70917
0
    self->private_impl.f_metadata_y = 0u;
70918
0
    self->private_impl.f_metadata_z = 0u;
70919
0
    self->private_impl.f_call_sequence &= 239u;
70920
0
    status = wuffs_base__make_status(NULL);
70921
0
    goto ok;
70922
70923
0
    ok:
70924
0
    self->private_impl.p_do_tell_me_more = 0;
70925
0
    goto exit;
70926
0
  }
70927
70928
0
  goto suspend;
70929
0
  suspend:
70930
0
  self->private_impl.p_do_tell_me_more = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
70931
0
  self->private_data.s_do_tell_me_more.v_zlib_status = v_zlib_status;
70932
70933
0
  goto exit;
70934
0
  exit:
70935
0
  if (a_dst && a_dst->data.ptr) {
70936
0
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
70937
0
  }
70938
0
  if (a_src && a_src->data.ptr) {
70939
0
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
70940
0
  }
70941
70942
0
  return status;
70943
0
}
70944
70945
// -------- func png.decoder.workbuf_len
70946
70947
WUFFS_BASE__GENERATED_C_CODE
70948
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
70949
wuffs_png__decoder__workbuf_len(
70950
4.03k
    const wuffs_png__decoder* self) {
70951
4.03k
  if (!self) {
70952
0
    return wuffs_base__utility__empty_range_ii_u64();
70953
0
  }
70954
4.03k
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
70955
4.03k
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
70956
0
    return wuffs_base__utility__empty_range_ii_u64();
70957
0
  }
70958
70959
4.03k
  return wuffs_base__utility__make_range_ii_u64(self->private_impl.f_overall_workbuf_length, self->private_impl.f_overall_workbuf_length);
70960
4.03k
}
70961
70962
// -------- func png.decoder.filter_and_swizzle
70963
70964
WUFFS_BASE__GENERATED_C_CODE
70965
static wuffs_base__status
70966
wuffs_png__decoder__filter_and_swizzle(
70967
    wuffs_png__decoder* self,
70968
    wuffs_base__pixel_buffer* a_dst,
70969
9.55k
    wuffs_base__slice_u8 a_workbuf) {
70970
9.55k
  return (*self->private_impl.choosy_filter_and_swizzle)(self, a_dst, a_workbuf);
70971
9.55k
}
70972
70973
WUFFS_BASE__GENERATED_C_CODE
70974
static wuffs_base__status
70975
wuffs_png__decoder__filter_and_swizzle__choosy_default(
70976
    wuffs_png__decoder* self,
70977
    wuffs_base__pixel_buffer* a_dst,
70978
3.33k
    wuffs_base__slice_u8 a_workbuf) {
70979
3.33k
  wuffs_base__pixel_format v_dst_pixfmt = {0};
70980
3.33k
  uint32_t v_dst_bits_per_pixel = 0;
70981
3.33k
  uint64_t v_dst_bytes_per_pixel = 0;
70982
3.33k
  uint64_t v_dst_bytes_per_row0 = 0;
70983
3.33k
  uint64_t v_dst_bytes_per_row1 = 0;
70984
3.33k
  wuffs_base__slice_u8 v_dst_palette = {0};
70985
3.33k
  wuffs_base__table_u8 v_tab = {0};
70986
3.33k
  uint32_t v_y = 0;
70987
3.33k
  wuffs_base__slice_u8 v_dst = {0};
70988
3.33k
  uint8_t v_filter = 0;
70989
3.33k
  wuffs_base__slice_u8 v_curr_row = {0};
70990
3.33k
  wuffs_base__slice_u8 v_prev_row = {0};
70991
70992
3.33k
  v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
70993
3.33k
  v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
70994
3.33k
  if ((v_dst_bits_per_pixel & 7u) != 0u) {
70995
0
    return wuffs_base__make_status(wuffs_base__error__unsupported_option);
70996
0
  }
70997
3.33k
  v_dst_bytes_per_pixel = ((uint64_t)((v_dst_bits_per_pixel / 8u)));
70998
3.33k
  v_dst_bytes_per_row0 = (((uint64_t)(self->private_impl.f_frame_rect_x0)) * v_dst_bytes_per_pixel);
70999
3.33k
  v_dst_bytes_per_row1 = (((uint64_t)(self->private_impl.f_frame_rect_x1)) * v_dst_bytes_per_pixel);
71000
3.33k
  v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024));
71001
3.33k
  v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
71002
3.33k
  if (v_dst_bytes_per_row1 < ((uint64_t)(v_tab.width))) {
71003
1.32k
    v_tab = wuffs_base__table_u8__subtable_ij(v_tab,
71004
1.32k
        0u,
71005
1.32k
        0u,
71006
1.32k
        v_dst_bytes_per_row1,
71007
1.32k
        ((uint64_t)(v_tab.height)));
71008
1.32k
  }
71009
3.33k
  if (v_dst_bytes_per_row0 < ((uint64_t)(v_tab.width))) {
71010
3.33k
    v_tab = wuffs_base__table_u8__subtable_ij(v_tab,
71011
3.33k
        v_dst_bytes_per_row0,
71012
3.33k
        0u,
71013
3.33k
        ((uint64_t)(v_tab.width)),
71014
3.33k
        ((uint64_t)(v_tab.height)));
71015
3.33k
  } else {
71016
0
    v_tab = wuffs_base__table_u8__subtable_ij(v_tab,
71017
0
        0u,
71018
0
        0u,
71019
0
        0u,
71020
0
        0u);
71021
0
  }
71022
3.33k
  v_y = self->private_impl.f_frame_rect_y0;
71023
847k
  while (v_y < self->private_impl.f_frame_rect_y1) {
71024
845k
    v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_y);
71025
845k
    if (1u > ((uint64_t)(a_workbuf.len))) {
71026
510
      return wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_workbuf_length);
71027
510
    }
71028
844k
    v_filter = a_workbuf.ptr[0u];
71029
844k
    a_workbuf = wuffs_base__slice_u8__subslice_i(a_workbuf, 1u);
71030
844k
    if (self->private_impl.f_pass_bytes_per_row > ((uint64_t)(a_workbuf.len))) {
71031
577
      return wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_workbuf_length);
71032
577
    }
71033
844k
    v_curr_row = wuffs_base__slice_u8__subslice_j(a_workbuf, self->private_impl.f_pass_bytes_per_row);
71034
844k
    a_workbuf = wuffs_base__slice_u8__subslice_i(a_workbuf, self->private_impl.f_pass_bytes_per_row);
71035
844k
    if (v_filter == 0u) {
71036
806k
    } else if (v_filter == 1u) {
71037
5.84k
      wuffs_png__decoder__filter_1(self, v_curr_row);
71038
32.1k
    } else if (v_filter == 2u) {
71039
15.3k
      wuffs_png__decoder__filter_2(self, v_curr_row, v_prev_row);
71040
16.8k
    } else if (v_filter == 3u) {
71041
7.84k
      wuffs_png__decoder__filter_3(self, v_curr_row, v_prev_row);
71042
9.02k
    } else if (v_filter == 4u) {
71043
8.91k
      wuffs_png__decoder__filter_4(self, v_curr_row, v_prev_row);
71044
8.91k
    } else {
71045
105
      return wuffs_base__make_status(wuffs_png__error__bad_filter);
71046
105
    }
71047
844k
    wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, v_curr_row);
71048
844k
    v_prev_row = v_curr_row;
71049
844k
    v_y += 1u;
71050
844k
  }
71051
2.14k
  return wuffs_base__make_status(NULL);
71052
3.33k
}
71053
71054
// -------- func png.decoder.filter_and_swizzle_tricky
71055
71056
WUFFS_BASE__GENERATED_C_CODE
71057
static wuffs_base__status
71058
wuffs_png__decoder__filter_and_swizzle_tricky(
71059
    wuffs_png__decoder* self,
71060
    wuffs_base__pixel_buffer* a_dst,
71061
6.22k
    wuffs_base__slice_u8 a_workbuf) {
71062
6.22k
  wuffs_base__pixel_format v_dst_pixfmt = {0};
71063
6.22k
  uint32_t v_dst_bits_per_pixel = 0;
71064
6.22k
  uint64_t v_dst_bytes_per_pixel = 0;
71065
6.22k
  uint64_t v_dst_bytes_per_row1 = 0;
71066
6.22k
  wuffs_base__slice_u8 v_dst_palette = {0};
71067
6.22k
  wuffs_base__table_u8 v_tab = {0};
71068
6.22k
  uint64_t v_src_bytes_per_pixel = 0;
71069
6.22k
  uint32_t v_x = 0;
71070
6.22k
  uint32_t v_y = 0;
71071
6.22k
  uint64_t v_i = 0;
71072
6.22k
  wuffs_base__slice_u8 v_dst = {0};
71073
6.22k
  uint8_t v_filter = 0;
71074
6.22k
  wuffs_base__slice_u8 v_s = {0};
71075
6.22k
  wuffs_base__slice_u8 v_curr_row = {0};
71076
6.22k
  wuffs_base__slice_u8 v_prev_row = {0};
71077
6.22k
  uint8_t v_bits_unpacked[8] = {0};
71078
6.22k
  uint8_t v_bits_packed = 0;
71079
6.22k
  uint8_t v_packs_remaining = 0;
71080
6.22k
  uint8_t v_multiplier = 0;
71081
6.22k
  uint8_t v_shift = 0;
71082
71083
6.22k
  v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
71084
6.22k
  v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
71085
6.22k
  if ((v_dst_bits_per_pixel & 7u) != 0u) {
71086
0
    return wuffs_base__make_status(wuffs_base__error__unsupported_option);
71087
0
  }
71088
6.22k
  v_dst_bytes_per_pixel = ((uint64_t)((v_dst_bits_per_pixel / 8u)));
71089
6.22k
  v_dst_bytes_per_row1 = (((uint64_t)(self->private_impl.f_frame_rect_x1)) * v_dst_bytes_per_pixel);
71090
6.22k
  v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024));
71091
6.22k
  v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
71092
6.22k
  v_src_bytes_per_pixel = 1u;
71093
6.22k
  if (self->private_impl.f_depth >= 8u) {
71094
2.66k
    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)))));
71095
2.66k
  }
71096
6.22k
  if (self->private_impl.f_chunk_type_array[0u] == 73u) {
71097
6.07k
    v_y = ((uint32_t)(WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][5u]));
71098
6.07k
  } else {
71099
150
    v_y = self->private_impl.f_frame_rect_y0;
71100
150
  }
71101
1.51M
  while (v_y < self->private_impl.f_frame_rect_y1) {
71102
1.50M
    v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_y);
71103
1.50M
    if (v_dst_bytes_per_row1 < ((uint64_t)(v_dst.len))) {
71104
747
      v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row1);
71105
747
    }
71106
1.50M
    if (1u > ((uint64_t)(a_workbuf.len))) {
71107
411
      return wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_workbuf_length);
71108
411
    }
71109
1.50M
    v_filter = a_workbuf.ptr[0u];
71110
1.50M
    a_workbuf = wuffs_base__slice_u8__subslice_i(a_workbuf, 1u);
71111
1.50M
    if (self->private_impl.f_pass_bytes_per_row > ((uint64_t)(a_workbuf.len))) {
71112
661
      return wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_workbuf_length);
71113
661
    }
71114
1.50M
    v_curr_row = wuffs_base__slice_u8__subslice_j(a_workbuf, self->private_impl.f_pass_bytes_per_row);
71115
1.50M
    a_workbuf = wuffs_base__slice_u8__subslice_i(a_workbuf, self->private_impl.f_pass_bytes_per_row);
71116
1.50M
    if (v_filter == 0u) {
71117
1.09M
    } else if (v_filter == 1u) {
71118
46.4k
      wuffs_png__decoder__filter_1(self, v_curr_row);
71119
365k
    } else if (v_filter == 2u) {
71120
2.55k
      wuffs_png__decoder__filter_2(self, v_curr_row, v_prev_row);
71121
362k
    } else if (v_filter == 3u) {
71122
351k
      wuffs_png__decoder__filter_3(self, v_curr_row, v_prev_row);
71123
351k
    } else if (v_filter == 4u) {
71124
10.9k
      wuffs_png__decoder__filter_4(self, v_curr_row, v_prev_row);
71125
10.9k
    } else {
71126
129
      return wuffs_base__make_status(wuffs_png__error__bad_filter);
71127
129
    }
71128
1.50M
    v_s = v_curr_row;
71129
1.50M
    if (self->private_impl.f_chunk_type_array[0u] == 73u) {
71130
1.50M
      v_x = ((uint32_t)(WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][2u]));
71131
1.50M
    } else {
71132
325
      v_x = self->private_impl.f_frame_rect_x0;
71133
325
    }
71134
1.50M
    if (self->private_impl.f_depth == 8u) {
71135
100M
      while (v_x < self->private_impl.f_frame_rect_x1) {
71136
99.8M
        v_i = (((uint64_t)(v_x)) * v_dst_bytes_per_pixel);
71137
99.8M
        if (v_i <= ((uint64_t)(v_dst.len))) {
71138
99.8M
          if (((uint32_t)(self->private_impl.f_remap_transparency)) != 0u) {
71139
8.86M
            if (self->private_impl.f_color_type == 0u) {
71140
3.49k
              if (1u <= ((uint64_t)(v_s.len))) {
71141
3.49k
                v_bits_unpacked[0u] = v_s.ptr[0u];
71142
3.49k
                v_bits_unpacked[1u] = v_s.ptr[0u];
71143
3.49k
                v_bits_unpacked[2u] = v_s.ptr[0u];
71144
3.49k
                v_bits_unpacked[3u] = 255u;
71145
3.49k
                v_s = wuffs_base__slice_u8__subslice_i(v_s, 1u);
71146
3.49k
                if (((uint32_t)(self->private_impl.f_remap_transparency)) == ((((uint32_t)(v_bits_unpacked[0u])) << 0u) |
71147
3.49k
                    (((uint32_t)(v_bits_unpacked[1u])) << 8u) |
71148
3.49k
                    (((uint32_t)(v_bits_unpacked[2u])) << 16u) |
71149
3.49k
                    (((uint32_t)(v_bits_unpacked[3u])) << 24u))) {
71150
273
                  v_bits_unpacked[0u] = 0u;
71151
273
                  v_bits_unpacked[1u] = 0u;
71152
273
                  v_bits_unpacked[2u] = 0u;
71153
273
                  v_bits_unpacked[3u] = 0u;
71154
273
                }
71155
3.49k
                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));
71156
3.49k
              }
71157
8.86M
            } else {
71158
8.86M
              if (3u <= ((uint64_t)(v_s.len))) {
71159
8.86M
                v_bits_unpacked[0u] = v_s.ptr[2u];
71160
8.86M
                v_bits_unpacked[1u] = v_s.ptr[1u];
71161
8.86M
                v_bits_unpacked[2u] = v_s.ptr[0u];
71162
8.86M
                v_bits_unpacked[3u] = 255u;
71163
8.86M
                v_s = wuffs_base__slice_u8__subslice_i(v_s, 3u);
71164
8.86M
                if (((uint32_t)(self->private_impl.f_remap_transparency)) == ((((uint32_t)(v_bits_unpacked[0u])) << 0u) |
71165
8.86M
                    (((uint32_t)(v_bits_unpacked[1u])) << 8u) |
71166
8.86M
                    (((uint32_t)(v_bits_unpacked[2u])) << 16u) |
71167
8.86M
                    (((uint32_t)(v_bits_unpacked[3u])) << 24u))) {
71168
8.88k
                  v_bits_unpacked[0u] = 0u;
71169
8.88k
                  v_bits_unpacked[1u] = 0u;
71170
8.88k
                  v_bits_unpacked[2u] = 0u;
71171
8.88k
                  v_bits_unpacked[3u] = 0u;
71172
8.88k
                }
71173
8.86M
                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));
71174
8.86M
              }
71175
8.86M
            }
71176
90.9M
          } else if (v_src_bytes_per_pixel <= ((uint64_t)(v_s.len))) {
71177
90.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));
71178
90.9M
            v_s = wuffs_base__slice_u8__subslice_i(v_s, v_src_bytes_per_pixel);
71179
90.9M
          }
71180
99.8M
        }
71181
99.8M
        v_x += (((uint32_t)(1u)) << WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][0u]);
71182
99.8M
      }
71183
982k
    } else if (self->private_impl.f_depth < 8u) {
71184
973k
      v_multiplier = 1u;
71185
973k
      if (self->private_impl.f_color_type == 0u) {
71186
973k
        v_multiplier = WUFFS_PNG__LOW_BIT_DEPTH_MULTIPLIERS[self->private_impl.f_depth];
71187
973k
      }
71188
973k
      v_shift = ((uint8_t)(((uint8_t)(8u - self->private_impl.f_depth)) & 7u));
71189
973k
      v_packs_remaining = 0u;
71190
38.0M
      while (v_x < self->private_impl.f_frame_rect_x1) {
71191
37.1M
        v_i = (((uint64_t)(v_x)) * v_dst_bytes_per_pixel);
71192
37.1M
        if (v_i <= ((uint64_t)(v_dst.len))) {
71193
37.1M
          if ((v_packs_remaining == 0u) && (1u <= ((uint64_t)(v_s.len)))) {
71194
13.0M
            v_packs_remaining = WUFFS_PNG__LOW_BIT_DEPTH_NUM_PACKS[self->private_impl.f_depth];
71195
13.0M
            v_bits_packed = v_s.ptr[0u];
71196
13.0M
            v_s = wuffs_base__slice_u8__subslice_i(v_s, 1u);
71197
13.0M
          }
71198
37.1M
          v_bits_unpacked[0u] = ((uint8_t)(((uint8_t)(v_bits_packed >> v_shift)) * v_multiplier));
71199
37.1M
          v_bits_packed = ((uint8_t)(v_bits_packed << self->private_impl.f_depth));
71200
37.1M
          v_packs_remaining = ((uint8_t)(v_packs_remaining - 1u));
71201
37.1M
          if (((uint32_t)(self->private_impl.f_remap_transparency)) != 0u) {
71202
445k
            v_bits_unpacked[1u] = v_bits_unpacked[0u];
71203
445k
            v_bits_unpacked[2u] = v_bits_unpacked[0u];
71204
445k
            v_bits_unpacked[3u] = 255u;
71205
445k
            if (((uint32_t)(self->private_impl.f_remap_transparency)) == ((((uint32_t)(v_bits_unpacked[0u])) << 0u) |
71206
445k
                (((uint32_t)(v_bits_unpacked[1u])) << 8u) |
71207
445k
                (((uint32_t)(v_bits_unpacked[2u])) << 16u) |
71208
445k
                (((uint32_t)(v_bits_unpacked[3u])) << 24u))) {
71209
369k
              v_bits_unpacked[0u] = 0u;
71210
369k
              v_bits_unpacked[1u] = 0u;
71211
369k
              v_bits_unpacked[2u] = 0u;
71212
369k
              v_bits_unpacked[3u] = 0u;
71213
369k
            }
71214
445k
            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));
71215
36.6M
          } else {
71216
36.6M
            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));
71217
36.6M
          }
71218
37.1M
        }
71219
37.1M
        v_x += (((uint32_t)(1u)) << WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][0u]);
71220
37.1M
      }
71221
973k
    } else {
71222
32.4M
      while (v_x < self->private_impl.f_frame_rect_x1) {
71223
32.4M
        v_i = (((uint64_t)(v_x)) * v_dst_bytes_per_pixel);
71224
32.4M
        if (v_i <= ((uint64_t)(v_dst.len))) {
71225
32.4M
          if (self->private_impl.f_color_type == 0u) {
71226
1.44M
            if (2u <= ((uint64_t)(v_s.len))) {
71227
1.44M
              v_bits_unpacked[0u] = v_s.ptr[1u];
71228
1.44M
              v_bits_unpacked[1u] = v_s.ptr[0u];
71229
1.44M
              v_bits_unpacked[2u] = v_s.ptr[1u];
71230
1.44M
              v_bits_unpacked[3u] = v_s.ptr[0u];
71231
1.44M
              v_bits_unpacked[4u] = v_s.ptr[1u];
71232
1.44M
              v_bits_unpacked[5u] = v_s.ptr[0u];
71233
1.44M
              v_bits_unpacked[6u] = 255u;
71234
1.44M
              v_bits_unpacked[7u] = 255u;
71235
1.44M
              v_s = wuffs_base__slice_u8__subslice_i(v_s, 2u);
71236
1.44M
              if (self->private_impl.f_remap_transparency == ((((uint64_t)(v_bits_unpacked[0u])) << 0u) |
71237
1.44M
                  (((uint64_t)(v_bits_unpacked[1u])) << 8u) |
71238
1.44M
                  (((uint64_t)(v_bits_unpacked[2u])) << 16u) |
71239
1.44M
                  (((uint64_t)(v_bits_unpacked[3u])) << 24u) |
71240
1.44M
                  (((uint64_t)(v_bits_unpacked[4u])) << 32u) |
71241
1.44M
                  (((uint64_t)(v_bits_unpacked[5u])) << 40u) |
71242
1.44M
                  (((uint64_t)(v_bits_unpacked[6u])) << 48u) |
71243
1.44M
                  (((uint64_t)(v_bits_unpacked[7u])) << 56u))) {
71244
256
                v_bits_unpacked[0u] = 0u;
71245
256
                v_bits_unpacked[1u] = 0u;
71246
256
                v_bits_unpacked[2u] = 0u;
71247
256
                v_bits_unpacked[3u] = 0u;
71248
256
                v_bits_unpacked[4u] = 0u;
71249
256
                v_bits_unpacked[5u] = 0u;
71250
256
                v_bits_unpacked[6u] = 0u;
71251
256
                v_bits_unpacked[7u] = 0u;
71252
256
              }
71253
1.44M
            }
71254
30.9M
          } else if (self->private_impl.f_color_type == 2u) {
71255
15.8M
            if (6u <= ((uint64_t)(v_s.len))) {
71256
15.8M
              v_bits_unpacked[0u] = v_s.ptr[5u];
71257
15.8M
              v_bits_unpacked[1u] = v_s.ptr[4u];
71258
15.8M
              v_bits_unpacked[2u] = v_s.ptr[3u];
71259
15.8M
              v_bits_unpacked[3u] = v_s.ptr[2u];
71260
15.8M
              v_bits_unpacked[4u] = v_s.ptr[1u];
71261
15.8M
              v_bits_unpacked[5u] = v_s.ptr[0u];
71262
15.8M
              v_bits_unpacked[6u] = 255u;
71263
15.8M
              v_bits_unpacked[7u] = 255u;
71264
15.8M
              v_s = wuffs_base__slice_u8__subslice_i(v_s, 6u);
71265
15.8M
              if (self->private_impl.f_remap_transparency == ((((uint64_t)(v_bits_unpacked[0u])) << 0u) |
71266
15.8M
                  (((uint64_t)(v_bits_unpacked[1u])) << 8u) |
71267
15.8M
                  (((uint64_t)(v_bits_unpacked[2u])) << 16u) |
71268
15.8M
                  (((uint64_t)(v_bits_unpacked[3u])) << 24u) |
71269
15.8M
                  (((uint64_t)(v_bits_unpacked[4u])) << 32u) |
71270
15.8M
                  (((uint64_t)(v_bits_unpacked[5u])) << 40u) |
71271
15.8M
                  (((uint64_t)(v_bits_unpacked[6u])) << 48u) |
71272
15.8M
                  (((uint64_t)(v_bits_unpacked[7u])) << 56u))) {
71273
207
                v_bits_unpacked[0u] = 0u;
71274
207
                v_bits_unpacked[1u] = 0u;
71275
207
                v_bits_unpacked[2u] = 0u;
71276
207
                v_bits_unpacked[3u] = 0u;
71277
207
                v_bits_unpacked[4u] = 0u;
71278
207
                v_bits_unpacked[5u] = 0u;
71279
207
                v_bits_unpacked[6u] = 0u;
71280
207
                v_bits_unpacked[7u] = 0u;
71281
207
              }
71282
15.8M
            }
71283
15.8M
          } else if (self->private_impl.f_color_type == 4u) {
71284
6.78M
            if (4u <= ((uint64_t)(v_s.len))) {
71285
6.78M
              v_bits_unpacked[0u] = v_s.ptr[1u];
71286
6.78M
              v_bits_unpacked[1u] = v_s.ptr[0u];
71287
6.78M
              v_bits_unpacked[2u] = v_s.ptr[1u];
71288
6.78M
              v_bits_unpacked[3u] = v_s.ptr[0u];
71289
6.78M
              v_bits_unpacked[4u] = v_s.ptr[1u];
71290
6.78M
              v_bits_unpacked[5u] = v_s.ptr[0u];
71291
6.78M
              v_bits_unpacked[6u] = v_s.ptr[3u];
71292
6.78M
              v_bits_unpacked[7u] = v_s.ptr[2u];
71293
6.78M
              v_s = wuffs_base__slice_u8__subslice_i(v_s, 4u);
71294
6.78M
            }
71295
8.30M
          } else {
71296
8.30M
            if (8u <= ((uint64_t)(v_s.len))) {
71297
8.30M
              v_bits_unpacked[0u] = v_s.ptr[5u];
71298
8.30M
              v_bits_unpacked[1u] = v_s.ptr[4u];
71299
8.30M
              v_bits_unpacked[2u] = v_s.ptr[3u];
71300
8.30M
              v_bits_unpacked[3u] = v_s.ptr[2u];
71301
8.30M
              v_bits_unpacked[4u] = v_s.ptr[1u];
71302
8.30M
              v_bits_unpacked[5u] = v_s.ptr[0u];
71303
8.30M
              v_bits_unpacked[6u] = v_s.ptr[7u];
71304
8.30M
              v_bits_unpacked[7u] = v_s.ptr[6u];
71305
8.30M
              v_s = wuffs_base__slice_u8__subslice_i(v_s, 8u);
71306
8.30M
            }
71307
8.30M
          }
71308
32.4M
          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));
71309
32.4M
        }
71310
32.4M
        v_x += (((uint32_t)(1u)) << WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][0u]);
71311
32.4M
      }
71312
9.17k
    }
71313
1.50M
    v_prev_row = v_curr_row;
71314
1.50M
    v_y += (((uint32_t)(1u)) << WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][3u]);
71315
1.50M
  }
71316
5.02k
  return wuffs_base__make_status(NULL);
71317
6.22k
}
71318
71319
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__PNG)
71320
71321
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__QOI)
71322
71323
// ---------------- Status Codes Implementations
71324
71325
const char wuffs_qoi__error__bad_footer[] = "#qoi: bad footer";
71326
const char wuffs_qoi__error__bad_header[] = "#qoi: bad header";
71327
const char wuffs_qoi__error__truncated_input[] = "#qoi: truncated input";
71328
71329
// ---------------- Private Consts
71330
71331
// ---------------- Private Initializer Prototypes
71332
71333
// ---------------- Private Function Prototypes
71334
71335
WUFFS_BASE__GENERATED_C_CODE
71336
static wuffs_base__status
71337
wuffs_qoi__decoder__do_decode_image_config(
71338
    wuffs_qoi__decoder* self,
71339
    wuffs_base__image_config* a_dst,
71340
    wuffs_base__io_buffer* a_src);
71341
71342
WUFFS_BASE__GENERATED_C_CODE
71343
static wuffs_base__status
71344
wuffs_qoi__decoder__do_decode_frame_config(
71345
    wuffs_qoi__decoder* self,
71346
    wuffs_base__frame_config* a_dst,
71347
    wuffs_base__io_buffer* a_src);
71348
71349
WUFFS_BASE__GENERATED_C_CODE
71350
static wuffs_base__status
71351
wuffs_qoi__decoder__do_decode_frame(
71352
    wuffs_qoi__decoder* self,
71353
    wuffs_base__pixel_buffer* a_dst,
71354
    wuffs_base__io_buffer* a_src,
71355
    wuffs_base__pixel_blend a_blend,
71356
    wuffs_base__slice_u8 a_workbuf,
71357
    wuffs_base__decode_frame_options* a_opts);
71358
71359
WUFFS_BASE__GENERATED_C_CODE
71360
static wuffs_base__status
71361
wuffs_qoi__decoder__from_src_to_buffer(
71362
    wuffs_qoi__decoder* self,
71363
    wuffs_base__io_buffer* a_src);
71364
71365
WUFFS_BASE__GENERATED_C_CODE
71366
static wuffs_base__status
71367
wuffs_qoi__decoder__from_buffer_to_dst(
71368
    wuffs_qoi__decoder* self,
71369
    wuffs_base__pixel_buffer* a_dst);
71370
71371
// ---------------- VTables
71372
71373
const wuffs_base__image_decoder__func_ptrs
71374
wuffs_qoi__decoder__func_ptrs_for__wuffs_base__image_decoder = {
71375
  (wuffs_base__status(*)(void*,
71376
      wuffs_base__pixel_buffer*,
71377
      wuffs_base__io_buffer*,
71378
      wuffs_base__pixel_blend,
71379
      wuffs_base__slice_u8,
71380
      wuffs_base__decode_frame_options*))(&wuffs_qoi__decoder__decode_frame),
71381
  (wuffs_base__status(*)(void*,
71382
      wuffs_base__frame_config*,
71383
      wuffs_base__io_buffer*))(&wuffs_qoi__decoder__decode_frame_config),
71384
  (wuffs_base__status(*)(void*,
71385
      wuffs_base__image_config*,
71386
      wuffs_base__io_buffer*))(&wuffs_qoi__decoder__decode_image_config),
71387
  (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_qoi__decoder__frame_dirty_rect),
71388
  (uint64_t(*)(const void*,
71389
      uint32_t))(&wuffs_qoi__decoder__get_quirk),
71390
  (uint32_t(*)(const void*))(&wuffs_qoi__decoder__num_animation_loops),
71391
  (uint64_t(*)(const void*))(&wuffs_qoi__decoder__num_decoded_frame_configs),
71392
  (uint64_t(*)(const void*))(&wuffs_qoi__decoder__num_decoded_frames),
71393
  (wuffs_base__status(*)(void*,
71394
      uint64_t,
71395
      uint64_t))(&wuffs_qoi__decoder__restart_frame),
71396
  (wuffs_base__status(*)(void*,
71397
      uint32_t,
71398
      uint64_t))(&wuffs_qoi__decoder__set_quirk),
71399
  (wuffs_base__empty_struct(*)(void*,
71400
      uint32_t,
71401
      bool))(&wuffs_qoi__decoder__set_report_metadata),
71402
  (wuffs_base__status(*)(void*,
71403
      wuffs_base__io_buffer*,
71404
      wuffs_base__more_information*,
71405
      wuffs_base__io_buffer*))(&wuffs_qoi__decoder__tell_me_more),
71406
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_qoi__decoder__workbuf_len),
71407
};
71408
71409
// ---------------- Initializer Implementations
71410
71411
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
71412
wuffs_qoi__decoder__initialize(
71413
    wuffs_qoi__decoder* self,
71414
    size_t sizeof_star_self,
71415
    uint64_t wuffs_version,
71416
    uint32_t options){
71417
  if (!self) {
71418
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
71419
  }
71420
  if (sizeof(*self) != sizeof_star_self) {
71421
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
71422
  }
71423
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
71424
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
71425
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
71426
  }
71427
71428
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
71429
    // The whole point of this if-check is to detect an uninitialized *self.
71430
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
71431
#if !defined(__clang__) && defined(__GNUC__)
71432
#pragma GCC diagnostic push
71433
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
71434
#endif
71435
    if (self->private_impl.magic != 0) {
71436
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
71437
    }
71438
#if !defined(__clang__) && defined(__GNUC__)
71439
#pragma GCC diagnostic pop
71440
#endif
71441
  } else {
71442
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
71443
      memset(self, 0, sizeof(*self));
71444
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
71445
    } else {
71446
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
71447
    }
71448
  }
71449
71450
  self->private_impl.magic = WUFFS_BASE__MAGIC;
71451
  self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name =
71452
      wuffs_base__image_decoder__vtable_name;
71453
  self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers =
71454
      (const void*)(&wuffs_qoi__decoder__func_ptrs_for__wuffs_base__image_decoder);
71455
  return wuffs_base__make_status(NULL);
71456
}
71457
71458
wuffs_qoi__decoder*
71459
wuffs_qoi__decoder__alloc(void) {
71460
  wuffs_qoi__decoder* x =
71461
      (wuffs_qoi__decoder*)(calloc(1, sizeof(wuffs_qoi__decoder)));
71462
  if (!x) {
71463
    return NULL;
71464
  }
71465
  if (wuffs_qoi__decoder__initialize(
71466
      x, sizeof(wuffs_qoi__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
71467
    free(x);
71468
    return NULL;
71469
  }
71470
  return x;
71471
}
71472
71473
size_t
71474
sizeof__wuffs_qoi__decoder(void) {
71475
  return sizeof(wuffs_qoi__decoder);
71476
}
71477
71478
// ---------------- Function Implementations
71479
71480
// -------- func qoi.decoder.get_quirk
71481
71482
WUFFS_BASE__GENERATED_C_CODE
71483
WUFFS_BASE__MAYBE_STATIC uint64_t
71484
wuffs_qoi__decoder__get_quirk(
71485
    const wuffs_qoi__decoder* self,
71486
    uint32_t a_key) {
71487
  if (!self) {
71488
    return 0;
71489
  }
71490
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
71491
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
71492
    return 0;
71493
  }
71494
71495
  return 0u;
71496
}
71497
71498
// -------- func qoi.decoder.set_quirk
71499
71500
WUFFS_BASE__GENERATED_C_CODE
71501
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
71502
wuffs_qoi__decoder__set_quirk(
71503
    wuffs_qoi__decoder* self,
71504
    uint32_t a_key,
71505
    uint64_t a_value) {
71506
  if (!self) {
71507
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
71508
  }
71509
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
71510
    return wuffs_base__make_status(
71511
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
71512
        ? wuffs_base__error__disabled_by_previous_error
71513
        : wuffs_base__error__initialize_not_called);
71514
  }
71515
71516
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
71517
}
71518
71519
// -------- func qoi.decoder.decode_image_config
71520
71521
WUFFS_BASE__GENERATED_C_CODE
71522
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
71523
wuffs_qoi__decoder__decode_image_config(
71524
    wuffs_qoi__decoder* self,
71525
    wuffs_base__image_config* a_dst,
71526
    wuffs_base__io_buffer* a_src) {
71527
  if (!self) {
71528
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
71529
  }
71530
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
71531
    return wuffs_base__make_status(
71532
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
71533
        ? wuffs_base__error__disabled_by_previous_error
71534
        : wuffs_base__error__initialize_not_called);
71535
  }
71536
  if (!a_src) {
71537
    self->private_impl.magic = WUFFS_BASE__DISABLED;
71538
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
71539
  }
71540
  if ((self->private_impl.active_coroutine != 0) &&
71541
      (self->private_impl.active_coroutine != 1)) {
71542
    self->private_impl.magic = WUFFS_BASE__DISABLED;
71543
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
71544
  }
71545
  self->private_impl.active_coroutine = 0;
71546
  wuffs_base__status status = wuffs_base__make_status(NULL);
71547
71548
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
71549
71550
  uint32_t coro_susp_point = self->private_impl.p_decode_image_config;
71551
  switch (coro_susp_point) {
71552
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
71553
71554
    while (true) {
71555
      {
71556
        wuffs_base__status t_0 = wuffs_qoi__decoder__do_decode_image_config(self, a_dst, a_src);
71557
        v_status = t_0;
71558
      }
71559
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
71560
        status = wuffs_base__make_status(wuffs_qoi__error__truncated_input);
71561
        goto exit;
71562
      }
71563
      status = v_status;
71564
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
71565
    }
71566
71567
    ok:
71568
    self->private_impl.p_decode_image_config = 0;
71569
    goto exit;
71570
  }
71571
71572
  goto suspend;
71573
  suspend:
71574
  self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
71575
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
71576
71577
  goto exit;
71578
  exit:
71579
  if (wuffs_base__status__is_error(&status)) {
71580
    self->private_impl.magic = WUFFS_BASE__DISABLED;
71581
  }
71582
  return status;
71583
}
71584
71585
// -------- func qoi.decoder.do_decode_image_config
71586
71587
WUFFS_BASE__GENERATED_C_CODE
71588
static wuffs_base__status
71589
wuffs_qoi__decoder__do_decode_image_config(
71590
    wuffs_qoi__decoder* self,
71591
    wuffs_base__image_config* a_dst,
71592
    wuffs_base__io_buffer* a_src) {
71593
  wuffs_base__status status = wuffs_base__make_status(NULL);
71594
71595
  uint32_t v_a = 0;
71596
71597
  const uint8_t* iop_a_src = NULL;
71598
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
71599
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
71600
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
71601
  if (a_src && a_src->data.ptr) {
71602
    io0_a_src = a_src->data.ptr;
71603
    io1_a_src = io0_a_src + a_src->meta.ri;
71604
    iop_a_src = io1_a_src;
71605
    io2_a_src = io0_a_src + a_src->meta.wi;
71606
  }
71607
71608
  uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config;
71609
  switch (coro_susp_point) {
71610
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
71611
71612
    if (self->private_impl.f_call_sequence != 0u) {
71613
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
71614
      goto exit;
71615
    }
71616
    {
71617
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
71618
      uint32_t t_0;
71619
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
71620
        t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
71621
        iop_a_src += 4;
71622
      } else {
71623
        self->private_data.s_do_decode_image_config.scratch = 0;
71624
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
71625
        while (true) {
71626
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
71627
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
71628
            goto suspend;
71629
          }
71630
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
71631
          uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
71632
          *scratch <<= 8;
71633
          *scratch >>= 8;
71634
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
71635
          if (num_bits_0 == 24) {
71636
            t_0 = ((uint32_t)(*scratch));
71637
            break;
71638
          }
71639
          num_bits_0 += 8u;
71640
          *scratch |= ((uint64_t)(num_bits_0)) << 56;
71641
        }
71642
      }
71643
      v_a = t_0;
71644
    }
71645
    if (v_a != 1718185841u) {
71646
      status = wuffs_base__make_status(wuffs_qoi__error__bad_header);
71647
      goto exit;
71648
    }
71649
    {
71650
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
71651
      uint32_t t_1;
71652
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
71653
        t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
71654
        iop_a_src += 4;
71655
      } else {
71656
        self->private_data.s_do_decode_image_config.scratch = 0;
71657
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
71658
        while (true) {
71659
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
71660
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
71661
            goto suspend;
71662
          }
71663
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
71664
          uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu));
71665
          *scratch >>= 8;
71666
          *scratch <<= 8;
71667
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1);
71668
          if (num_bits_1 == 24) {
71669
            t_1 = ((uint32_t)(*scratch >> 32));
71670
            break;
71671
          }
71672
          num_bits_1 += 8u;
71673
          *scratch |= ((uint64_t)(num_bits_1));
71674
        }
71675
      }
71676
      v_a = t_1;
71677
    }
71678
    if (v_a > 16777215u) {
71679
      status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension);
71680
      goto exit;
71681
    }
71682
    self->private_impl.f_width = v_a;
71683
    {
71684
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
71685
      uint32_t t_2;
71686
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
71687
        t_2 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
71688
        iop_a_src += 4;
71689
      } else {
71690
        self->private_data.s_do_decode_image_config.scratch = 0;
71691
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
71692
        while (true) {
71693
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
71694
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
71695
            goto suspend;
71696
          }
71697
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
71698
          uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu));
71699
          *scratch >>= 8;
71700
          *scratch <<= 8;
71701
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2);
71702
          if (num_bits_2 == 24) {
71703
            t_2 = ((uint32_t)(*scratch >> 32));
71704
            break;
71705
          }
71706
          num_bits_2 += 8u;
71707
          *scratch |= ((uint64_t)(num_bits_2));
71708
        }
71709
      }
71710
      v_a = t_2;
71711
    }
71712
    if (v_a > 16777215u) {
71713
      status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension);
71714
      goto exit;
71715
    }
71716
    self->private_impl.f_height = v_a;
71717
    {
71718
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
71719
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
71720
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
71721
        goto suspend;
71722
      }
71723
      uint32_t t_3 = *iop_a_src++;
71724
      v_a = t_3;
71725
    }
71726
    if (v_a == 3u) {
71727
      self->private_impl.f_pixfmt = 2415954056u;
71728
    } else if (v_a == 4u) {
71729
      self->private_impl.f_pixfmt = 2164295816u;
71730
    } else {
71731
      status = wuffs_base__make_status(wuffs_qoi__error__bad_header);
71732
      goto exit;
71733
    }
71734
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
71735
    if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
71736
      status = wuffs_base__make_status(wuffs_base__suspension__short_read);
71737
      goto suspend;
71738
    }
71739
    iop_a_src++;
71740
    if (a_dst != NULL) {
71741
      wuffs_base__image_config__set(
71742
          a_dst,
71743
          self->private_impl.f_pixfmt,
71744
          0u,
71745
          self->private_impl.f_width,
71746
          self->private_impl.f_height,
71747
          14u,
71748
          (self->private_impl.f_pixfmt == 2415954056u));
71749
    }
71750
    self->private_impl.f_call_sequence = 32u;
71751
71752
    goto ok;
71753
    ok:
71754
    self->private_impl.p_do_decode_image_config = 0;
71755
    goto exit;
71756
  }
71757
71758
  goto suspend;
71759
  suspend:
71760
  self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
71761
71762
  goto exit;
71763
  exit:
71764
  if (a_src && a_src->data.ptr) {
71765
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
71766
  }
71767
71768
  return status;
71769
}
71770
71771
// -------- func qoi.decoder.decode_frame_config
71772
71773
WUFFS_BASE__GENERATED_C_CODE
71774
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
71775
wuffs_qoi__decoder__decode_frame_config(
71776
    wuffs_qoi__decoder* self,
71777
    wuffs_base__frame_config* a_dst,
71778
    wuffs_base__io_buffer* a_src) {
71779
  if (!self) {
71780
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
71781
  }
71782
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
71783
    return wuffs_base__make_status(
71784
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
71785
        ? wuffs_base__error__disabled_by_previous_error
71786
        : wuffs_base__error__initialize_not_called);
71787
  }
71788
  if (!a_src) {
71789
    self->private_impl.magic = WUFFS_BASE__DISABLED;
71790
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
71791
  }
71792
  if ((self->private_impl.active_coroutine != 0) &&
71793
      (self->private_impl.active_coroutine != 2)) {
71794
    self->private_impl.magic = WUFFS_BASE__DISABLED;
71795
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
71796
  }
71797
  self->private_impl.active_coroutine = 0;
71798
  wuffs_base__status status = wuffs_base__make_status(NULL);
71799
71800
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
71801
71802
  uint32_t coro_susp_point = self->private_impl.p_decode_frame_config;
71803
  switch (coro_susp_point) {
71804
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
71805
71806
    while (true) {
71807
      {
71808
        wuffs_base__status t_0 = wuffs_qoi__decoder__do_decode_frame_config(self, a_dst, a_src);
71809
        v_status = t_0;
71810
      }
71811
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
71812
        status = wuffs_base__make_status(wuffs_qoi__error__truncated_input);
71813
        goto exit;
71814
      }
71815
      status = v_status;
71816
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
71817
    }
71818
71819
    ok:
71820
    self->private_impl.p_decode_frame_config = 0;
71821
    goto exit;
71822
  }
71823
71824
  goto suspend;
71825
  suspend:
71826
  self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
71827
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0;
71828
71829
  goto exit;
71830
  exit:
71831
  if (wuffs_base__status__is_error(&status)) {
71832
    self->private_impl.magic = WUFFS_BASE__DISABLED;
71833
  }
71834
  return status;
71835
}
71836
71837
// -------- func qoi.decoder.do_decode_frame_config
71838
71839
WUFFS_BASE__GENERATED_C_CODE
71840
static wuffs_base__status
71841
wuffs_qoi__decoder__do_decode_frame_config(
71842
    wuffs_qoi__decoder* self,
71843
    wuffs_base__frame_config* a_dst,
71844
    wuffs_base__io_buffer* a_src) {
71845
  wuffs_base__status status = wuffs_base__make_status(NULL);
71846
71847
  wuffs_base__pixel_format v_pixfmt = {0};
71848
71849
  const uint8_t* iop_a_src = NULL;
71850
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
71851
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
71852
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
71853
  if (a_src && a_src->data.ptr) {
71854
    io0_a_src = a_src->data.ptr;
71855
    io1_a_src = io0_a_src + a_src->meta.ri;
71856
    iop_a_src = io1_a_src;
71857
    io2_a_src = io0_a_src + a_src->meta.wi;
71858
  }
71859
71860
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config;
71861
  switch (coro_susp_point) {
71862
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
71863
71864
    if (self->private_impl.f_call_sequence == 32u) {
71865
    } else if (self->private_impl.f_call_sequence < 32u) {
71866
      if (a_src) {
71867
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
71868
      }
71869
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
71870
      status = wuffs_qoi__decoder__do_decode_image_config(self, NULL, a_src);
71871
      if (a_src) {
71872
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
71873
      }
71874
      if (status.repr) {
71875
        goto suspend;
71876
      }
71877
    } else if (self->private_impl.f_call_sequence == 40u) {
71878
      if (14u != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) {
71879
        status = wuffs_base__make_status(wuffs_base__error__bad_restart);
71880
        goto exit;
71881
      }
71882
    } else if (self->private_impl.f_call_sequence == 64u) {
71883
      self->private_impl.f_call_sequence = 96u;
71884
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
71885
      goto ok;
71886
    } else {
71887
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
71888
      goto ok;
71889
    }
71890
    if (a_dst != NULL) {
71891
      v_pixfmt = wuffs_base__utility__make_pixel_format(self->private_impl.f_pixfmt);
71892
      wuffs_base__frame_config__set(
71893
          a_dst,
71894
          wuffs_base__utility__make_rect_ie_u32(
71895
          0u,
71896
          0u,
71897
          self->private_impl.f_width,
71898
          self->private_impl.f_height),
71899
          ((wuffs_base__flicks)(0u)),
71900
          0u,
71901
          14u,
71902
          0u,
71903
          (self->private_impl.f_pixfmt == 2415954056u),
71904
          false,
71905
          wuffs_base__pixel_format__default_background_color(&v_pixfmt));
71906
    }
71907
    self->private_impl.f_call_sequence = 64u;
71908
71909
    ok:
71910
    self->private_impl.p_do_decode_frame_config = 0;
71911
    goto exit;
71912
  }
71913
71914
  goto suspend;
71915
  suspend:
71916
  self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
71917
71918
  goto exit;
71919
  exit:
71920
  if (a_src && a_src->data.ptr) {
71921
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
71922
  }
71923
71924
  return status;
71925
}
71926
71927
// -------- func qoi.decoder.decode_frame
71928
71929
WUFFS_BASE__GENERATED_C_CODE
71930
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
71931
wuffs_qoi__decoder__decode_frame(
71932
    wuffs_qoi__decoder* self,
71933
    wuffs_base__pixel_buffer* a_dst,
71934
    wuffs_base__io_buffer* a_src,
71935
    wuffs_base__pixel_blend a_blend,
71936
    wuffs_base__slice_u8 a_workbuf,
71937
    wuffs_base__decode_frame_options* a_opts) {
71938
  if (!self) {
71939
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
71940
  }
71941
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
71942
    return wuffs_base__make_status(
71943
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
71944
        ? wuffs_base__error__disabled_by_previous_error
71945
        : wuffs_base__error__initialize_not_called);
71946
  }
71947
  if (!a_dst || !a_src) {
71948
    self->private_impl.magic = WUFFS_BASE__DISABLED;
71949
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
71950
  }
71951
  if ((self->private_impl.active_coroutine != 0) &&
71952
      (self->private_impl.active_coroutine != 3)) {
71953
    self->private_impl.magic = WUFFS_BASE__DISABLED;
71954
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
71955
  }
71956
  self->private_impl.active_coroutine = 0;
71957
  wuffs_base__status status = wuffs_base__make_status(NULL);
71958
71959
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
71960
71961
  uint32_t coro_susp_point = self->private_impl.p_decode_frame;
71962
  switch (coro_susp_point) {
71963
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
71964
71965
    while (true) {
71966
      {
71967
        wuffs_base__status t_0 = wuffs_qoi__decoder__do_decode_frame(self,
71968
            a_dst,
71969
            a_src,
71970
            a_blend,
71971
            a_workbuf,
71972
            a_opts);
71973
        v_status = t_0;
71974
      }
71975
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
71976
        status = wuffs_base__make_status(wuffs_qoi__error__truncated_input);
71977
        goto exit;
71978
      }
71979
      status = v_status;
71980
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
71981
    }
71982
71983
    ok:
71984
    self->private_impl.p_decode_frame = 0;
71985
    goto exit;
71986
  }
71987
71988
  goto suspend;
71989
  suspend:
71990
  self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
71991
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0;
71992
71993
  goto exit;
71994
  exit:
71995
  if (wuffs_base__status__is_error(&status)) {
71996
    self->private_impl.magic = WUFFS_BASE__DISABLED;
71997
  }
71998
  return status;
71999
}
72000
72001
// -------- func qoi.decoder.do_decode_frame
72002
72003
WUFFS_BASE__GENERATED_C_CODE
72004
static wuffs_base__status
72005
wuffs_qoi__decoder__do_decode_frame(
72006
    wuffs_qoi__decoder* self,
72007
    wuffs_base__pixel_buffer* a_dst,
72008
    wuffs_base__io_buffer* a_src,
72009
    wuffs_base__pixel_blend a_blend,
72010
    wuffs_base__slice_u8 a_workbuf,
72011
    wuffs_base__decode_frame_options* a_opts) {
72012
  wuffs_base__status status = wuffs_base__make_status(NULL);
72013
72014
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
72015
  uint64_t v_c64 = 0;
72016
72017
  const uint8_t* iop_a_src = NULL;
72018
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
72019
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
72020
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
72021
  if (a_src && a_src->data.ptr) {
72022
    io0_a_src = a_src->data.ptr;
72023
    io1_a_src = io0_a_src + a_src->meta.ri;
72024
    iop_a_src = io1_a_src;
72025
    io2_a_src = io0_a_src + a_src->meta.wi;
72026
  }
72027
72028
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame;
72029
  switch (coro_susp_point) {
72030
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
72031
72032
    if (self->private_impl.f_call_sequence == 64u) {
72033
    } else if (self->private_impl.f_call_sequence < 64u) {
72034
      if (a_src) {
72035
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
72036
      }
72037
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
72038
      status = wuffs_qoi__decoder__do_decode_frame_config(self, NULL, a_src);
72039
      if (a_src) {
72040
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
72041
      }
72042
      if (status.repr) {
72043
        goto suspend;
72044
      }
72045
    } else {
72046
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
72047
      goto ok;
72048
    }
72049
    v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler,
72050
        wuffs_base__pixel_buffer__pixel_format(a_dst),
72051
        wuffs_base__pixel_buffer__palette(a_dst),
72052
        wuffs_base__utility__make_pixel_format(self->private_impl.f_pixfmt),
72053
        wuffs_base__utility__empty_slice_u8(),
72054
        a_blend);
72055
    if ( ! wuffs_base__status__is_ok(&v_status)) {
72056
      status = v_status;
72057
      if (wuffs_base__status__is_error(&status)) {
72058
        goto exit;
72059
      } else if (wuffs_base__status__is_suspension(&status)) {
72060
        status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
72061
        goto exit;
72062
      }
72063
      goto ok;
72064
    }
72065
    self->private_impl.f_dst_x = 0u;
72066
    self->private_impl.f_dst_y = 0u;
72067
    self->private_data.f_pixel[0u] = 0u;
72068
    self->private_data.f_pixel[1u] = 0u;
72069
    self->private_data.f_pixel[2u] = 0u;
72070
    self->private_data.f_pixel[3u] = 255u;
72071
    wuffs_private_impl__bulk_memset(&self->private_data.f_cache[0], 256u, 0u);
72072
    self->private_impl.f_remaining_pixels_times_4 = (((uint64_t)(self->private_impl.f_width)) * ((uint64_t)(self->private_impl.f_height)) * 4u);
72073
    while (self->private_impl.f_remaining_pixels_times_4 > 0u) {
72074
      if (a_src) {
72075
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
72076
      }
72077
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
72078
      status = wuffs_qoi__decoder__from_src_to_buffer(self, a_src);
72079
      if (a_src) {
72080
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
72081
      }
72082
      if (status.repr) {
72083
        goto suspend;
72084
      }
72085
      if (self->private_impl.f_remaining_pixels_times_4 < ((uint64_t)(self->private_impl.f_buffer_index))) {
72086
        status = wuffs_base__make_status(wuffs_base__error__too_much_data);
72087
        goto exit;
72088
      }
72089
      self->private_impl.f_remaining_pixels_times_4 -= ((uint64_t)(self->private_impl.f_buffer_index));
72090
      v_status = wuffs_qoi__decoder__from_buffer_to_dst(self, a_dst);
72091
      if ( ! wuffs_base__status__is_ok(&v_status)) {
72092
        status = v_status;
72093
        if (wuffs_base__status__is_error(&status)) {
72094
          goto exit;
72095
        } else if (wuffs_base__status__is_suspension(&status)) {
72096
          status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
72097
          goto exit;
72098
        }
72099
        goto ok;
72100
      }
72101
    }
72102
    {
72103
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
72104
      uint64_t t_0;
72105
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) {
72106
        t_0 = wuffs_base__peek_u64be__no_bounds_check(iop_a_src);
72107
        iop_a_src += 8;
72108
      } else {
72109
        self->private_data.s_do_decode_frame.scratch = 0;
72110
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
72111
        while (true) {
72112
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
72113
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
72114
            goto suspend;
72115
          }
72116
          uint64_t* scratch = &self->private_data.s_do_decode_frame.scratch;
72117
          uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu));
72118
          *scratch >>= 8;
72119
          *scratch <<= 8;
72120
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0);
72121
          if (num_bits_0 == 56) {
72122
            t_0 = ((uint64_t)(*scratch >> 0));
72123
            break;
72124
          }
72125
          num_bits_0 += 8u;
72126
          *scratch |= ((uint64_t)(num_bits_0));
72127
        }
72128
      }
72129
      v_c64 = t_0;
72130
    }
72131
    if (v_c64 != 1u) {
72132
      status = wuffs_base__make_status(wuffs_qoi__error__bad_footer);
72133
      goto exit;
72134
    }
72135
    self->private_impl.f_call_sequence = 96u;
72136
72137
    ok:
72138
    self->private_impl.p_do_decode_frame = 0;
72139
    goto exit;
72140
  }
72141
72142
  goto suspend;
72143
  suspend:
72144
  self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
72145
72146
  goto exit;
72147
  exit:
72148
  if (a_src && a_src->data.ptr) {
72149
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
72150
  }
72151
72152
  return status;
72153
}
72154
72155
// -------- func qoi.decoder.from_src_to_buffer
72156
72157
WUFFS_BASE__GENERATED_C_CODE
72158
static wuffs_base__status
72159
wuffs_qoi__decoder__from_src_to_buffer(
72160
    wuffs_qoi__decoder* self,
72161
    wuffs_base__io_buffer* a_src) {
72162
  wuffs_base__status status = wuffs_base__make_status(NULL);
72163
72164
  uint8_t v_c8 = 0;
72165
  uint8_t v_dg = 0;
72166
  uint32_t v_bi = 0;
72167
  uint32_t v_bj = 0;
72168
  uint32_t v_bk = 0;
72169
  uint32_t v_ci = 0;
72170
  uint32_t v_hash4 = 0;
72171
72172
  const uint8_t* iop_a_src = NULL;
72173
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
72174
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
72175
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
72176
  if (a_src && a_src->data.ptr) {
72177
    io0_a_src = a_src->data.ptr;
72178
    io1_a_src = io0_a_src + a_src->meta.ri;
72179
    iop_a_src = io1_a_src;
72180
    io2_a_src = io0_a_src + a_src->meta.wi;
72181
  }
72182
72183
  uint32_t coro_susp_point = self->private_impl.p_from_src_to_buffer;
72184
  if (coro_susp_point) {
72185
    v_dg = self->private_data.s_from_src_to_buffer.v_dg;
72186
    v_bi = self->private_data.s_from_src_to_buffer.v_bi;
72187
    v_bk = self->private_data.s_from_src_to_buffer.v_bk;
72188
  }
72189
  switch (coro_susp_point) {
72190
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
72191
72192
    v_bk = 7936u;
72193
    if (self->private_impl.f_remaining_pixels_times_4 < 7936u) {
72194
      v_bk = ((uint32_t)(self->private_impl.f_remaining_pixels_times_4));
72195
    }
72196
    while (v_bi < v_bk) {
72197
      {
72198
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
72199
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
72200
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
72201
          goto suspend;
72202
        }
72203
        uint8_t t_0 = *iop_a_src++;
72204
        v_c8 = t_0;
72205
      }
72206
      if (v_c8 == 254u) {
72207
        {
72208
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
72209
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
72210
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
72211
            goto suspend;
72212
          }
72213
          uint8_t t_1 = *iop_a_src++;
72214
          self->private_data.f_pixel[2u] = t_1;
72215
        }
72216
        {
72217
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
72218
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
72219
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
72220
            goto suspend;
72221
          }
72222
          uint8_t t_2 = *iop_a_src++;
72223
          self->private_data.f_pixel[1u] = t_2;
72224
        }
72225
        {
72226
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
72227
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
72228
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
72229
            goto suspend;
72230
          }
72231
          uint8_t t_3 = *iop_a_src++;
72232
          self->private_data.f_pixel[0u] = t_3;
72233
        }
72234
      } else if (v_c8 == 255u) {
72235
        {
72236
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
72237
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
72238
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
72239
            goto suspend;
72240
          }
72241
          uint8_t t_4 = *iop_a_src++;
72242
          self->private_data.f_pixel[2u] = t_4;
72243
        }
72244
        {
72245
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
72246
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
72247
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
72248
            goto suspend;
72249
          }
72250
          uint8_t t_5 = *iop_a_src++;
72251
          self->private_data.f_pixel[1u] = t_5;
72252
        }
72253
        {
72254
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
72255
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
72256
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
72257
            goto suspend;
72258
          }
72259
          uint8_t t_6 = *iop_a_src++;
72260
          self->private_data.f_pixel[0u] = t_6;
72261
        }
72262
        {
72263
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
72264
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
72265
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
72266
            goto suspend;
72267
          }
72268
          uint8_t t_7 = *iop_a_src++;
72269
          self->private_data.f_pixel[3u] = t_7;
72270
        }
72271
      } else if (((uint8_t)(v_c8 >> 6u)) == 0u) {
72272
        v_ci = (4u * ((uint32_t)(((uint8_t)(v_c8 & 63u)))));
72273
        self->private_data.f_pixel[0u] = self->private_data.f_cache[(v_ci + 0u)];
72274
        self->private_data.f_pixel[1u] = self->private_data.f_cache[(v_ci + 1u)];
72275
        self->private_data.f_pixel[2u] = self->private_data.f_cache[(v_ci + 2u)];
72276
        self->private_data.f_pixel[3u] = self->private_data.f_cache[(v_ci + 3u)];
72277
        self->private_data.f_buffer[(v_bi + 0u)] = self->private_data.f_pixel[0u];
72278
        self->private_data.f_buffer[(v_bi + 1u)] = self->private_data.f_pixel[1u];
72279
        self->private_data.f_buffer[(v_bi + 2u)] = self->private_data.f_pixel[2u];
72280
        self->private_data.f_buffer[(v_bi + 3u)] = self->private_data.f_pixel[3u];
72281
        v_bi += 4u;
72282
        continue;
72283
      } else if (((uint8_t)(v_c8 >> 6u)) == 1u) {
72284
#if defined(__GNUC__)
72285
#pragma GCC diagnostic push
72286
#pragma GCC diagnostic ignored "-Wconversion"
72287
#endif
72288
        self->private_data.f_pixel[2u] += ((uint8_t)(((uint8_t)(((uint8_t)(v_c8 >> 4u)) & 3u)) + 254u));
72289
        self->private_data.f_pixel[1u] += ((uint8_t)(((uint8_t)(((uint8_t)(v_c8 >> 2u)) & 3u)) + 254u));
72290
        self->private_data.f_pixel[0u] += ((uint8_t)(((uint8_t)(((uint8_t)(v_c8 >> 0u)) & 3u)) + 254u));
72291
#if defined(__GNUC__)
72292
#pragma GCC diagnostic pop
72293
#endif
72294
      } else if (((uint8_t)(v_c8 >> 6u)) == 2u) {
72295
        v_dg = ((uint8_t)(((uint8_t)(v_c8 & 63u)) + 224u));
72296
        {
72297
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
72298
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
72299
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
72300
            goto suspend;
72301
          }
72302
          uint8_t t_8 = *iop_a_src++;
72303
          v_c8 = t_8;
72304
        }
72305
#if defined(__GNUC__)
72306
#pragma GCC diagnostic push
72307
#pragma GCC diagnostic ignored "-Wconversion"
72308
#endif
72309
        self->private_data.f_pixel[2u] += ((uint8_t)(((uint8_t)(v_dg + 248u)) + ((uint8_t)(15u & ((uint8_t)(v_c8 >> 4u))))));
72310
        self->private_data.f_pixel[1u] += v_dg;
72311
        self->private_data.f_pixel[0u] += ((uint8_t)(((uint8_t)(v_dg + 248u)) + ((uint8_t)(15u & ((uint8_t)(v_c8 >> 0u))))));
72312
#if defined(__GNUC__)
72313
#pragma GCC diagnostic pop
72314
#endif
72315
      } else {
72316
        v_bj = (v_bi + (4u * (63u & (1u + ((uint32_t)(v_c8))))));
72317
        while (v_bi < v_bj) {
72318
          self->private_data.f_buffer[(v_bi + 0u)] = self->private_data.f_pixel[0u];
72319
          self->private_data.f_buffer[(v_bi + 1u)] = self->private_data.f_pixel[1u];
72320
          self->private_data.f_buffer[(v_bi + 2u)] = self->private_data.f_pixel[2u];
72321
          self->private_data.f_buffer[(v_bi + 3u)] = self->private_data.f_pixel[3u];
72322
          v_bi += 4u;
72323
        }
72324
        continue;
72325
      }
72326
      v_hash4 = (4u * (63u & ((((uint32_t)(self->private_data.f_pixel[2u])) * 3u) +
72327
          (((uint32_t)(self->private_data.f_pixel[1u])) * 5u) +
72328
          (((uint32_t)(self->private_data.f_pixel[0u])) * 7u) +
72329
          (((uint32_t)(self->private_data.f_pixel[3u])) * 11u))));
72330
      self->private_data.f_cache[(v_hash4 + 0u)] = self->private_data.f_pixel[0u];
72331
      self->private_data.f_cache[(v_hash4 + 1u)] = self->private_data.f_pixel[1u];
72332
      self->private_data.f_cache[(v_hash4 + 2u)] = self->private_data.f_pixel[2u];
72333
      self->private_data.f_cache[(v_hash4 + 3u)] = self->private_data.f_pixel[3u];
72334
      self->private_data.f_buffer[(v_bi + 0u)] = self->private_data.f_pixel[0u];
72335
      self->private_data.f_buffer[(v_bi + 1u)] = self->private_data.f_pixel[1u];
72336
      self->private_data.f_buffer[(v_bi + 2u)] = self->private_data.f_pixel[2u];
72337
      self->private_data.f_buffer[(v_bi + 3u)] = self->private_data.f_pixel[3u];
72338
      v_bi += 4u;
72339
    }
72340
    self->private_impl.f_buffer_index = v_bi;
72341
72342
    goto ok;
72343
    ok:
72344
    self->private_impl.p_from_src_to_buffer = 0;
72345
    goto exit;
72346
  }
72347
72348
  goto suspend;
72349
  suspend:
72350
  self->private_impl.p_from_src_to_buffer = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
72351
  self->private_data.s_from_src_to_buffer.v_dg = v_dg;
72352
  self->private_data.s_from_src_to_buffer.v_bi = v_bi;
72353
  self->private_data.s_from_src_to_buffer.v_bk = v_bk;
72354
72355
  goto exit;
72356
  exit:
72357
  if (a_src && a_src->data.ptr) {
72358
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
72359
  }
72360
72361
  return status;
72362
}
72363
72364
// -------- func qoi.decoder.from_buffer_to_dst
72365
72366
WUFFS_BASE__GENERATED_C_CODE
72367
static wuffs_base__status
72368
wuffs_qoi__decoder__from_buffer_to_dst(
72369
    wuffs_qoi__decoder* self,
72370
    wuffs_base__pixel_buffer* a_dst) {
72371
  wuffs_base__pixel_format v_dst_pixfmt = {0};
72372
  uint32_t v_dst_bits_per_pixel = 0;
72373
  uint32_t v_dst_bytes_per_pixel = 0;
72374
  uint64_t v_dst_bytes_per_row = 0;
72375
  wuffs_base__table_u8 v_tab = {0};
72376
  uint32_t v_bi = 0;
72377
  uint32_t v_rem_x = 0;
72378
  wuffs_base__slice_u8 v_dst = {0};
72379
  wuffs_base__slice_u8 v_src = {0};
72380
  uint32_t v_src_length = 0;
72381
  uint64_t v_i = 0;
72382
72383
  v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
72384
  v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
72385
  if ((v_dst_bits_per_pixel & 7u) != 0u) {
72386
    return wuffs_base__make_status(wuffs_base__error__unsupported_option);
72387
  }
72388
  v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u);
72389
  v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel)));
72390
  v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
72391
  while (v_bi < self->private_impl.f_buffer_index) {
72392
    if (self->private_impl.f_width <= self->private_impl.f_dst_x) {
72393
      self->private_impl.f_dst_x = 0u;
72394
      self->private_impl.f_dst_y += 1u;
72395
      if (self->private_impl.f_dst_y >= self->private_impl.f_height) {
72396
        break;
72397
      }
72398
      v_rem_x = self->private_impl.f_width;
72399
    } else {
72400
      v_rem_x = (self->private_impl.f_width - self->private_impl.f_dst_x);
72401
    }
72402
    v_src = wuffs_base__make_slice_u8_ij(self->private_data.f_buffer, v_bi, self->private_impl.f_buffer_index);
72403
    if (((uint64_t)((4u * v_rem_x))) < ((uint64_t)(v_src.len))) {
72404
      v_src = wuffs_base__slice_u8__subslice_j(v_src, ((uint64_t)((4u * v_rem_x))));
72405
    }
72406
    v_src_length = ((uint32_t)(((uint64_t)(v_src.len))));
72407
    v_bi += v_src_length;
72408
    v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y);
72409
    if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) {
72410
      v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row);
72411
    }
72412
    v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel)));
72413
    self->private_impl.f_dst_x += (v_src_length / 4u);
72414
    if (v_i < ((uint64_t)(v_dst.len))) {
72415
      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);
72416
    }
72417
  }
72418
  return wuffs_base__make_status(NULL);
72419
}
72420
72421
// -------- func qoi.decoder.frame_dirty_rect
72422
72423
WUFFS_BASE__GENERATED_C_CODE
72424
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
72425
wuffs_qoi__decoder__frame_dirty_rect(
72426
    const wuffs_qoi__decoder* self) {
72427
  if (!self) {
72428
    return wuffs_base__utility__empty_rect_ie_u32();
72429
  }
72430
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
72431
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
72432
    return wuffs_base__utility__empty_rect_ie_u32();
72433
  }
72434
72435
  return wuffs_base__utility__make_rect_ie_u32(
72436
      0u,
72437
      0u,
72438
      self->private_impl.f_width,
72439
      self->private_impl.f_height);
72440
}
72441
72442
// -------- func qoi.decoder.num_animation_loops
72443
72444
WUFFS_BASE__GENERATED_C_CODE
72445
WUFFS_BASE__MAYBE_STATIC uint32_t
72446
wuffs_qoi__decoder__num_animation_loops(
72447
    const wuffs_qoi__decoder* self) {
72448
  if (!self) {
72449
    return 0;
72450
  }
72451
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
72452
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
72453
    return 0;
72454
  }
72455
72456
  return 0u;
72457
}
72458
72459
// -------- func qoi.decoder.num_decoded_frame_configs
72460
72461
WUFFS_BASE__GENERATED_C_CODE
72462
WUFFS_BASE__MAYBE_STATIC uint64_t
72463
wuffs_qoi__decoder__num_decoded_frame_configs(
72464
    const wuffs_qoi__decoder* self) {
72465
  if (!self) {
72466
    return 0;
72467
  }
72468
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
72469
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
72470
    return 0;
72471
  }
72472
72473
  if (self->private_impl.f_call_sequence > 32u) {
72474
    return 1u;
72475
  }
72476
  return 0u;
72477
}
72478
72479
// -------- func qoi.decoder.num_decoded_frames
72480
72481
WUFFS_BASE__GENERATED_C_CODE
72482
WUFFS_BASE__MAYBE_STATIC uint64_t
72483
wuffs_qoi__decoder__num_decoded_frames(
72484
    const wuffs_qoi__decoder* self) {
72485
  if (!self) {
72486
    return 0;
72487
  }
72488
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
72489
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
72490
    return 0;
72491
  }
72492
72493
  if (self->private_impl.f_call_sequence > 64u) {
72494
    return 1u;
72495
  }
72496
  return 0u;
72497
}
72498
72499
// -------- func qoi.decoder.restart_frame
72500
72501
WUFFS_BASE__GENERATED_C_CODE
72502
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
72503
wuffs_qoi__decoder__restart_frame(
72504
    wuffs_qoi__decoder* self,
72505
    uint64_t a_index,
72506
    uint64_t a_io_position) {
72507
  if (!self) {
72508
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
72509
  }
72510
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
72511
    return wuffs_base__make_status(
72512
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
72513
        ? wuffs_base__error__disabled_by_previous_error
72514
        : wuffs_base__error__initialize_not_called);
72515
  }
72516
72517
  if (self->private_impl.f_call_sequence < 32u) {
72518
    return wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
72519
  }
72520
  if ((a_index != 0u) || (a_io_position != 14u)) {
72521
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
72522
  }
72523
  self->private_impl.f_call_sequence = 40u;
72524
  return wuffs_base__make_status(NULL);
72525
}
72526
72527
// -------- func qoi.decoder.set_report_metadata
72528
72529
WUFFS_BASE__GENERATED_C_CODE
72530
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
72531
wuffs_qoi__decoder__set_report_metadata(
72532
    wuffs_qoi__decoder* self,
72533
    uint32_t a_fourcc,
72534
    bool a_report) {
72535
  return wuffs_base__make_empty_struct();
72536
}
72537
72538
// -------- func qoi.decoder.tell_me_more
72539
72540
WUFFS_BASE__GENERATED_C_CODE
72541
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
72542
wuffs_qoi__decoder__tell_me_more(
72543
    wuffs_qoi__decoder* self,
72544
    wuffs_base__io_buffer* a_dst,
72545
    wuffs_base__more_information* a_minfo,
72546
    wuffs_base__io_buffer* a_src) {
72547
  if (!self) {
72548
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
72549
  }
72550
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
72551
    return wuffs_base__make_status(
72552
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
72553
        ? wuffs_base__error__disabled_by_previous_error
72554
        : wuffs_base__error__initialize_not_called);
72555
  }
72556
  if (!a_dst || !a_src) {
72557
    self->private_impl.magic = WUFFS_BASE__DISABLED;
72558
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
72559
  }
72560
  if ((self->private_impl.active_coroutine != 0) &&
72561
      (self->private_impl.active_coroutine != 4)) {
72562
    self->private_impl.magic = WUFFS_BASE__DISABLED;
72563
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
72564
  }
72565
  self->private_impl.active_coroutine = 0;
72566
  wuffs_base__status status = wuffs_base__make_status(NULL);
72567
72568
  status = wuffs_base__make_status(wuffs_base__error__no_more_information);
72569
  goto exit;
72570
72571
  goto ok;
72572
  ok:
72573
  goto exit;
72574
  exit:
72575
  if (wuffs_base__status__is_error(&status)) {
72576
    self->private_impl.magic = WUFFS_BASE__DISABLED;
72577
  }
72578
  return status;
72579
}
72580
72581
// -------- func qoi.decoder.workbuf_len
72582
72583
WUFFS_BASE__GENERATED_C_CODE
72584
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
72585
wuffs_qoi__decoder__workbuf_len(
72586
    const wuffs_qoi__decoder* self) {
72587
  if (!self) {
72588
    return wuffs_base__utility__empty_range_ii_u64();
72589
  }
72590
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
72591
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
72592
    return wuffs_base__utility__empty_range_ii_u64();
72593
  }
72594
72595
  return wuffs_base__utility__make_range_ii_u64(0u, 0u);
72596
}
72597
72598
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__QOI)
72599
72600
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__SHA256)
72601
72602
// ---------------- Status Codes Implementations
72603
72604
// ---------------- Private Consts
72605
72606
static const uint32_t
72607
WUFFS_SHA256__INITIAL_SHA256_H[8] WUFFS_BASE__POTENTIALLY_UNUSED = {
72608
  1779033703u, 3144134277u, 1013904242u, 2773480762u, 1359893119u, 2600822924u, 528734635u, 1541459225u,
72609
};
72610
72611
static const uint32_t
72612
WUFFS_SHA256__K[64] WUFFS_BASE__POTENTIALLY_UNUSED = {
72613
  1116352408u, 1899447441u, 3049323471u, 3921009573u, 961987163u, 1508970993u, 2453635748u, 2870763221u,
72614
  3624381080u, 310598401u, 607225278u, 1426881987u, 1925078388u, 2162078206u, 2614888103u, 3248222580u,
72615
  3835390401u, 4022224774u, 264347078u, 604807628u, 770255983u, 1249150122u, 1555081692u, 1996064986u,
72616
  2554220882u, 2821834349u, 2952996808u, 3210313671u, 3336571891u, 3584528711u, 113926993u, 338241895u,
72617
  666307205u, 773529912u, 1294757372u, 1396182291u, 1695183700u, 1986661051u, 2177026350u, 2456956037u,
72618
  2730485921u, 2820302411u, 3259730800u, 3345764771u, 3516065817u, 3600352804u, 4094571909u, 275423344u,
72619
  430227734u, 506948616u, 659060556u, 883997877u, 958139571u, 1322822218u, 1537002063u, 1747873779u,
72620
  1955562222u, 2024104815u, 2227730452u, 2361852424u, 2428436474u, 2756734187u, 3204031479u, 3329325298u,
72621
};
72622
72623
// ---------------- Private Initializer Prototypes
72624
72625
// ---------------- Private Function Prototypes
72626
72627
WUFFS_BASE__GENERATED_C_CODE
72628
static wuffs_base__empty_struct
72629
wuffs_sha256__hasher__up(
72630
    wuffs_sha256__hasher* self,
72631
    wuffs_base__slice_u8 a_x);
72632
72633
// ---------------- VTables
72634
72635
const wuffs_base__hasher_bitvec256__func_ptrs
72636
wuffs_sha256__hasher__func_ptrs_for__wuffs_base__hasher_bitvec256 = {
72637
  (wuffs_base__bitvec256(*)(const void*))(&wuffs_sha256__hasher__checksum_bitvec256),
72638
  (uint64_t(*)(const void*,
72639
      uint32_t))(&wuffs_sha256__hasher__get_quirk),
72640
  (wuffs_base__status(*)(void*,
72641
      uint32_t,
72642
      uint64_t))(&wuffs_sha256__hasher__set_quirk),
72643
  (wuffs_base__empty_struct(*)(void*,
72644
      wuffs_base__slice_u8))(&wuffs_sha256__hasher__update),
72645
  (wuffs_base__bitvec256(*)(void*,
72646
      wuffs_base__slice_u8))(&wuffs_sha256__hasher__update_bitvec256),
72647
};
72648
72649
// ---------------- Initializer Implementations
72650
72651
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
72652
wuffs_sha256__hasher__initialize(
72653
    wuffs_sha256__hasher* self,
72654
    size_t sizeof_star_self,
72655
    uint64_t wuffs_version,
72656
    uint32_t options){
72657
  if (!self) {
72658
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
72659
  }
72660
  if (sizeof(*self) != sizeof_star_self) {
72661
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
72662
  }
72663
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
72664
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
72665
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
72666
  }
72667
72668
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
72669
    // The whole point of this if-check is to detect an uninitialized *self.
72670
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
72671
#if !defined(__clang__) && defined(__GNUC__)
72672
#pragma GCC diagnostic push
72673
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
72674
#endif
72675
    if (self->private_impl.magic != 0) {
72676
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
72677
    }
72678
#if !defined(__clang__) && defined(__GNUC__)
72679
#pragma GCC diagnostic pop
72680
#endif
72681
  } else {
72682
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
72683
      memset(self, 0, sizeof(*self));
72684
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
72685
    } else {
72686
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
72687
    }
72688
  }
72689
72690
  self->private_impl.magic = WUFFS_BASE__MAGIC;
72691
  self->private_impl.vtable_for__wuffs_base__hasher_bitvec256.vtable_name =
72692
      wuffs_base__hasher_bitvec256__vtable_name;
72693
  self->private_impl.vtable_for__wuffs_base__hasher_bitvec256.function_pointers =
72694
      (const void*)(&wuffs_sha256__hasher__func_ptrs_for__wuffs_base__hasher_bitvec256);
72695
  return wuffs_base__make_status(NULL);
72696
}
72697
72698
wuffs_sha256__hasher*
72699
wuffs_sha256__hasher__alloc(void) {
72700
  wuffs_sha256__hasher* x =
72701
      (wuffs_sha256__hasher*)(calloc(1, sizeof(wuffs_sha256__hasher)));
72702
  if (!x) {
72703
    return NULL;
72704
  }
72705
  if (wuffs_sha256__hasher__initialize(
72706
      x, sizeof(wuffs_sha256__hasher), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
72707
    free(x);
72708
    return NULL;
72709
  }
72710
  return x;
72711
}
72712
72713
size_t
72714
sizeof__wuffs_sha256__hasher(void) {
72715
  return sizeof(wuffs_sha256__hasher);
72716
}
72717
72718
// ---------------- Function Implementations
72719
72720
// -------- func sha256.hasher.get_quirk
72721
72722
WUFFS_BASE__GENERATED_C_CODE
72723
WUFFS_BASE__MAYBE_STATIC uint64_t
72724
wuffs_sha256__hasher__get_quirk(
72725
    const wuffs_sha256__hasher* self,
72726
    uint32_t a_key) {
72727
  if (!self) {
72728
    return 0;
72729
  }
72730
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
72731
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
72732
    return 0;
72733
  }
72734
72735
  return 0u;
72736
}
72737
72738
// -------- func sha256.hasher.set_quirk
72739
72740
WUFFS_BASE__GENERATED_C_CODE
72741
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
72742
wuffs_sha256__hasher__set_quirk(
72743
    wuffs_sha256__hasher* self,
72744
    uint32_t a_key,
72745
    uint64_t a_value) {
72746
  if (!self) {
72747
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
72748
  }
72749
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
72750
    return wuffs_base__make_status(
72751
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
72752
        ? wuffs_base__error__disabled_by_previous_error
72753
        : wuffs_base__error__initialize_not_called);
72754
  }
72755
72756
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
72757
}
72758
72759
// -------- func sha256.hasher.update
72760
72761
WUFFS_BASE__GENERATED_C_CODE
72762
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
72763
wuffs_sha256__hasher__update(
72764
    wuffs_sha256__hasher* self,
72765
    wuffs_base__slice_u8 a_x) {
72766
  if (!self) {
72767
    return wuffs_base__make_empty_struct();
72768
  }
72769
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
72770
    return wuffs_base__make_empty_struct();
72771
  }
72772
72773
  uint64_t v_new_lmu = 0;
72774
72775
  if ((self->private_impl.f_length_modulo_u64 == 0u) &&  ! self->private_impl.f_length_overflows_u64) {
72776
    self->private_impl.f_h0 = WUFFS_SHA256__INITIAL_SHA256_H[0u];
72777
    self->private_impl.f_h1 = WUFFS_SHA256__INITIAL_SHA256_H[1u];
72778
    self->private_impl.f_h2 = WUFFS_SHA256__INITIAL_SHA256_H[2u];
72779
    self->private_impl.f_h3 = WUFFS_SHA256__INITIAL_SHA256_H[3u];
72780
    self->private_impl.f_h4 = WUFFS_SHA256__INITIAL_SHA256_H[4u];
72781
    self->private_impl.f_h5 = WUFFS_SHA256__INITIAL_SHA256_H[5u];
72782
    self->private_impl.f_h6 = WUFFS_SHA256__INITIAL_SHA256_H[6u];
72783
    self->private_impl.f_h7 = WUFFS_SHA256__INITIAL_SHA256_H[7u];
72784
  }
72785
  v_new_lmu = ((uint64_t)(self->private_impl.f_length_modulo_u64 + ((uint64_t)(a_x.len))));
72786
  self->private_impl.f_length_overflows_u64 = ((v_new_lmu < self->private_impl.f_length_modulo_u64) || self->private_impl.f_length_overflows_u64);
72787
  self->private_impl.f_length_modulo_u64 = v_new_lmu;
72788
  if (self->private_impl.f_buf_len != 0u) {
72789
    while (self->private_impl.f_buf_len < 64u) {
72790
      if (((uint64_t)(a_x.len)) <= 0u) {
72791
        return wuffs_base__make_empty_struct();
72792
      }
72793
      self->private_impl.f_buf_data[self->private_impl.f_buf_len] = a_x.ptr[0u];
72794
      self->private_impl.f_buf_len += 1u;
72795
      a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u);
72796
    }
72797
    self->private_impl.f_buf_len = 0u;
72798
    wuffs_sha256__hasher__up(self, wuffs_base__make_slice_u8(self->private_impl.f_buf_data, 64));
72799
  }
72800
  wuffs_sha256__hasher__up(self, a_x);
72801
  return wuffs_base__make_empty_struct();
72802
}
72803
72804
// -------- func sha256.hasher.update_bitvec256
72805
72806
WUFFS_BASE__GENERATED_C_CODE
72807
WUFFS_BASE__MAYBE_STATIC wuffs_base__bitvec256
72808
wuffs_sha256__hasher__update_bitvec256(
72809
    wuffs_sha256__hasher* self,
72810
    wuffs_base__slice_u8 a_x) {
72811
  if (!self) {
72812
    return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u);
72813
  }
72814
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
72815
    return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u);
72816
  }
72817
72818
  wuffs_sha256__hasher__update(self, a_x);
72819
  return wuffs_sha256__hasher__checksum_bitvec256(self);
72820
}
72821
72822
// -------- func sha256.hasher.up
72823
72824
WUFFS_BASE__GENERATED_C_CODE
72825
static wuffs_base__empty_struct
72826
wuffs_sha256__hasher__up(
72827
    wuffs_sha256__hasher* self,
72828
    wuffs_base__slice_u8 a_x) {
72829
  wuffs_base__slice_u8 v_p = {0};
72830
  uint32_t v_w[64] = {0};
72831
  uint32_t v_w2 = 0;
72832
  uint32_t v_w15 = 0;
72833
  uint32_t v_s0 = 0;
72834
  uint32_t v_s1 = 0;
72835
  uint32_t v_t1 = 0;
72836
  uint32_t v_t2 = 0;
72837
  uint32_t v_a = 0;
72838
  uint32_t v_b = 0;
72839
  uint32_t v_c = 0;
72840
  uint32_t v_d = 0;
72841
  uint32_t v_e = 0;
72842
  uint32_t v_f = 0;
72843
  uint32_t v_g = 0;
72844
  uint32_t v_h = 0;
72845
  uint32_t v_i = 0;
72846
  uint32_t v_buf_len = 0;
72847
72848
  v_a = self->private_impl.f_h0;
72849
  v_b = self->private_impl.f_h1;
72850
  v_c = self->private_impl.f_h2;
72851
  v_d = self->private_impl.f_h3;
72852
  v_e = self->private_impl.f_h4;
72853
  v_f = self->private_impl.f_h5;
72854
  v_g = self->private_impl.f_h6;
72855
  v_h = self->private_impl.f_h7;
72856
  {
72857
    wuffs_base__slice_u8 i_slice_p = a_x;
72858
    v_p.ptr = i_slice_p.ptr;
72859
    v_p.len = 64;
72860
    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));
72861
    while (v_p.ptr < i_end0_p) {
72862
      v_w[0u] = ((((uint32_t)(v_p.ptr[0u])) << 24u) |
72863
          (((uint32_t)(v_p.ptr[1u])) << 16u) |
72864
          (((uint32_t)(v_p.ptr[2u])) << 8u) |
72865
          ((uint32_t)(v_p.ptr[3u])));
72866
      v_w[1u] = ((((uint32_t)(v_p.ptr[4u])) << 24u) |
72867
          (((uint32_t)(v_p.ptr[5u])) << 16u) |
72868
          (((uint32_t)(v_p.ptr[6u])) << 8u) |
72869
          ((uint32_t)(v_p.ptr[7u])));
72870
      v_w[2u] = ((((uint32_t)(v_p.ptr[8u])) << 24u) |
72871
          (((uint32_t)(v_p.ptr[9u])) << 16u) |
72872
          (((uint32_t)(v_p.ptr[10u])) << 8u) |
72873
          ((uint32_t)(v_p.ptr[11u])));
72874
      v_w[3u] = ((((uint32_t)(v_p.ptr[12u])) << 24u) |
72875
          (((uint32_t)(v_p.ptr[13u])) << 16u) |
72876
          (((uint32_t)(v_p.ptr[14u])) << 8u) |
72877
          ((uint32_t)(v_p.ptr[15u])));
72878
      v_w[4u] = ((((uint32_t)(v_p.ptr[16u])) << 24u) |
72879
          (((uint32_t)(v_p.ptr[17u])) << 16u) |
72880
          (((uint32_t)(v_p.ptr[18u])) << 8u) |
72881
          ((uint32_t)(v_p.ptr[19u])));
72882
      v_w[5u] = ((((uint32_t)(v_p.ptr[20u])) << 24u) |
72883
          (((uint32_t)(v_p.ptr[21u])) << 16u) |
72884
          (((uint32_t)(v_p.ptr[22u])) << 8u) |
72885
          ((uint32_t)(v_p.ptr[23u])));
72886
      v_w[6u] = ((((uint32_t)(v_p.ptr[24u])) << 24u) |
72887
          (((uint32_t)(v_p.ptr[25u])) << 16u) |
72888
          (((uint32_t)(v_p.ptr[26u])) << 8u) |
72889
          ((uint32_t)(v_p.ptr[27u])));
72890
      v_w[7u] = ((((uint32_t)(v_p.ptr[28u])) << 24u) |
72891
          (((uint32_t)(v_p.ptr[29u])) << 16u) |
72892
          (((uint32_t)(v_p.ptr[30u])) << 8u) |
72893
          ((uint32_t)(v_p.ptr[31u])));
72894
      v_w[8u] = ((((uint32_t)(v_p.ptr[32u])) << 24u) |
72895
          (((uint32_t)(v_p.ptr[33u])) << 16u) |
72896
          (((uint32_t)(v_p.ptr[34u])) << 8u) |
72897
          ((uint32_t)(v_p.ptr[35u])));
72898
      v_w[9u] = ((((uint32_t)(v_p.ptr[36u])) << 24u) |
72899
          (((uint32_t)(v_p.ptr[37u])) << 16u) |
72900
          (((uint32_t)(v_p.ptr[38u])) << 8u) |
72901
          ((uint32_t)(v_p.ptr[39u])));
72902
      v_w[10u] = ((((uint32_t)(v_p.ptr[40u])) << 24u) |
72903
          (((uint32_t)(v_p.ptr[41u])) << 16u) |
72904
          (((uint32_t)(v_p.ptr[42u])) << 8u) |
72905
          ((uint32_t)(v_p.ptr[43u])));
72906
      v_w[11u] = ((((uint32_t)(v_p.ptr[44u])) << 24u) |
72907
          (((uint32_t)(v_p.ptr[45u])) << 16u) |
72908
          (((uint32_t)(v_p.ptr[46u])) << 8u) |
72909
          ((uint32_t)(v_p.ptr[47u])));
72910
      v_w[12u] = ((((uint32_t)(v_p.ptr[48u])) << 24u) |
72911
          (((uint32_t)(v_p.ptr[49u])) << 16u) |
72912
          (((uint32_t)(v_p.ptr[50u])) << 8u) |
72913
          ((uint32_t)(v_p.ptr[51u])));
72914
      v_w[13u] = ((((uint32_t)(v_p.ptr[52u])) << 24u) |
72915
          (((uint32_t)(v_p.ptr[53u])) << 16u) |
72916
          (((uint32_t)(v_p.ptr[54u])) << 8u) |
72917
          ((uint32_t)(v_p.ptr[55u])));
72918
      v_w[14u] = ((((uint32_t)(v_p.ptr[56u])) << 24u) |
72919
          (((uint32_t)(v_p.ptr[57u])) << 16u) |
72920
          (((uint32_t)(v_p.ptr[58u])) << 8u) |
72921
          ((uint32_t)(v_p.ptr[59u])));
72922
      v_w[15u] = ((((uint32_t)(v_p.ptr[60u])) << 24u) |
72923
          (((uint32_t)(v_p.ptr[61u])) << 16u) |
72924
          (((uint32_t)(v_p.ptr[62u])) << 8u) |
72925
          ((uint32_t)(v_p.ptr[63u])));
72926
      v_i = 16u;
72927
      while (v_i < 64u) {
72928
        v_w2 = v_w[(v_i - 2u)];
72929
        v_s1 = ((v_w2 >> 10u) ^ (((uint32_t)(v_w2 << 15u)) | (v_w2 >> 17u)) ^ (((uint32_t)(v_w2 << 13u)) | (v_w2 >> 19u)));
72930
        v_w15 = v_w[(v_i - 15u)];
72931
        v_s0 = ((v_w15 >> 3u) ^ (((uint32_t)(v_w15 << 25u)) | (v_w15 >> 7u)) ^ (((uint32_t)(v_w15 << 14u)) | (v_w15 >> 18u)));
72932
        v_w[v_i] = ((uint32_t)(((uint32_t)(((uint32_t)(v_s1 + v_w[(v_i - 7u)])) + v_s0)) + v_w[(v_i - 16u)]));
72933
        v_i += 1u;
72934
      }
72935
      v_i = 0u;
72936
      while (v_i < 64u) {
72937
        v_t1 = v_h;
72938
        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)));
72939
        v_t1 += ((v_e & v_f) ^ ((4294967295u ^ v_e) & v_g));
72940
        v_t1 += WUFFS_SHA256__K[v_i];
72941
        v_t1 += v_w[v_i];
72942
        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)));
72943
        v_t2 += ((v_a & v_b) ^ (v_a & v_c) ^ (v_b & v_c));
72944
        v_h = v_g;
72945
        v_g = v_f;
72946
        v_f = v_e;
72947
        v_e = ((uint32_t)(v_d + v_t1));
72948
        v_d = v_c;
72949
        v_c = v_b;
72950
        v_b = v_a;
72951
        v_a = ((uint32_t)(v_t1 + v_t2));
72952
        v_i += 1u;
72953
      }
72954
      v_a += self->private_impl.f_h0;
72955
      self->private_impl.f_h0 = v_a;
72956
      v_b += self->private_impl.f_h1;
72957
      self->private_impl.f_h1 = v_b;
72958
      v_c += self->private_impl.f_h2;
72959
      self->private_impl.f_h2 = v_c;
72960
      v_d += self->private_impl.f_h3;
72961
      self->private_impl.f_h3 = v_d;
72962
      v_e += self->private_impl.f_h4;
72963
      self->private_impl.f_h4 = v_e;
72964
      v_f += self->private_impl.f_h5;
72965
      self->private_impl.f_h5 = v_f;
72966
      v_g += self->private_impl.f_h6;
72967
      self->private_impl.f_h6 = v_g;
72968
      v_h += self->private_impl.f_h7;
72969
      self->private_impl.f_h7 = v_h;
72970
      v_p.ptr += 64;
72971
    }
72972
    v_p.len = 1;
72973
    const uint8_t* i_end1_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len);
72974
    while (v_p.ptr < i_end1_p) {
72975
      self->private_impl.f_buf_data[v_buf_len] = v_p.ptr[0u];
72976
      v_buf_len = ((v_buf_len + 1u) & 63u);
72977
      v_p.ptr += 1;
72978
    }
72979
    v_p.len = 0;
72980
  }
72981
  self->private_impl.f_buf_len = ((uint32_t)((((uint64_t)(a_x.len)) & 63u)));
72982
  return wuffs_base__make_empty_struct();
72983
}
72984
72985
// -------- func sha256.hasher.checksum_bitvec256
72986
72987
WUFFS_BASE__GENERATED_C_CODE
72988
WUFFS_BASE__MAYBE_STATIC wuffs_base__bitvec256
72989
wuffs_sha256__hasher__checksum_bitvec256(
72990
    const wuffs_sha256__hasher* self) {
72991
  if (!self) {
72992
    return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u);
72993
  }
72994
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
72995
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
72996
    return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u);
72997
  }
72998
72999
  uint32_t v_buf_len = 0;
73000
  uint8_t v_buf_data[64] = {0};
73001
  uint64_t v_length_in_bits = 0;
73002
  uint32_t v_w[64] = {0};
73003
  uint32_t v_w2 = 0;
73004
  uint32_t v_w15 = 0;
73005
  uint32_t v_s0 = 0;
73006
  uint32_t v_s1 = 0;
73007
  uint32_t v_t1 = 0;
73008
  uint32_t v_t2 = 0;
73009
  uint32_t v_h0 = 0;
73010
  uint32_t v_h1 = 0;
73011
  uint32_t v_h2 = 0;
73012
  uint32_t v_h3 = 0;
73013
  uint32_t v_h4 = 0;
73014
  uint32_t v_h5 = 0;
73015
  uint32_t v_h6 = 0;
73016
  uint32_t v_h7 = 0;
73017
  uint32_t v_a = 0;
73018
  uint32_t v_b = 0;
73019
  uint32_t v_c = 0;
73020
  uint32_t v_d = 0;
73021
  uint32_t v_e = 0;
73022
  uint32_t v_f = 0;
73023
  uint32_t v_g = 0;
73024
  uint32_t v_h = 0;
73025
  uint32_t v_i = 0;
73026
  bool v_final_block = false;
73027
73028
  v_i = 0u;
73029
  while (v_i < 64u) {
73030
    v_buf_data[v_i] = self->private_impl.f_buf_data[v_i];
73031
    v_i += 1u;
73032
  }
73033
  v_buf_len = (self->private_impl.f_buf_len & 63u);
73034
  if (v_buf_len < 56u) {
73035
    v_buf_data[v_buf_len] = 128u;
73036
    v_buf_len += 1u;
73037
    while (v_buf_len < 56u) {
73038
      v_buf_data[v_buf_len] = 0u;
73039
      v_buf_len += 1u;
73040
    }
73041
    v_final_block = true;
73042
  } else {
73043
    v_buf_data[v_buf_len] = 128u;
73044
    v_buf_len += 1u;
73045
    while (v_buf_len < 64u) {
73046
      v_buf_data[v_buf_len] = 0u;
73047
      v_buf_len += 1u;
73048
    }
73049
  }
73050
  v_h0 = self->private_impl.f_h0;
73051
  v_a = v_h0;
73052
  v_h1 = self->private_impl.f_h1;
73053
  v_b = v_h1;
73054
  v_h2 = self->private_impl.f_h2;
73055
  v_c = v_h2;
73056
  v_h3 = self->private_impl.f_h3;
73057
  v_d = v_h3;
73058
  v_h4 = self->private_impl.f_h4;
73059
  v_e = v_h4;
73060
  v_h5 = self->private_impl.f_h5;
73061
  v_f = v_h5;
73062
  v_h6 = self->private_impl.f_h6;
73063
  v_g = v_h6;
73064
  v_h7 = self->private_impl.f_h7;
73065
  v_h = v_h7;
73066
  while (true) {
73067
    if (v_final_block) {
73068
      v_length_in_bits = ((uint64_t)(self->private_impl.f_length_modulo_u64 * 8u));
73069
      v_buf_data[56u] = ((uint8_t)((v_length_in_bits >> 56u)));
73070
      v_buf_data[57u] = ((uint8_t)((v_length_in_bits >> 48u)));
73071
      v_buf_data[58u] = ((uint8_t)((v_length_in_bits >> 40u)));
73072
      v_buf_data[59u] = ((uint8_t)((v_length_in_bits >> 32u)));
73073
      v_buf_data[60u] = ((uint8_t)((v_length_in_bits >> 24u)));
73074
      v_buf_data[61u] = ((uint8_t)((v_length_in_bits >> 16u)));
73075
      v_buf_data[62u] = ((uint8_t)((v_length_in_bits >> 8u)));
73076
      v_buf_data[63u] = ((uint8_t)(v_length_in_bits));
73077
    }
73078
    v_w[0u] = ((((uint32_t)(v_buf_data[0u])) << 24u) |
73079
        (((uint32_t)(v_buf_data[1u])) << 16u) |
73080
        (((uint32_t)(v_buf_data[2u])) << 8u) |
73081
        ((uint32_t)(v_buf_data[3u])));
73082
    v_w[1u] = ((((uint32_t)(v_buf_data[4u])) << 24u) |
73083
        (((uint32_t)(v_buf_data[5u])) << 16u) |
73084
        (((uint32_t)(v_buf_data[6u])) << 8u) |
73085
        ((uint32_t)(v_buf_data[7u])));
73086
    v_w[2u] = ((((uint32_t)(v_buf_data[8u])) << 24u) |
73087
        (((uint32_t)(v_buf_data[9u])) << 16u) |
73088
        (((uint32_t)(v_buf_data[10u])) << 8u) |
73089
        ((uint32_t)(v_buf_data[11u])));
73090
    v_w[3u] = ((((uint32_t)(v_buf_data[12u])) << 24u) |
73091
        (((uint32_t)(v_buf_data[13u])) << 16u) |
73092
        (((uint32_t)(v_buf_data[14u])) << 8u) |
73093
        ((uint32_t)(v_buf_data[15u])));
73094
    v_w[4u] = ((((uint32_t)(v_buf_data[16u])) << 24u) |
73095
        (((uint32_t)(v_buf_data[17u])) << 16u) |
73096
        (((uint32_t)(v_buf_data[18u])) << 8u) |
73097
        ((uint32_t)(v_buf_data[19u])));
73098
    v_w[5u] = ((((uint32_t)(v_buf_data[20u])) << 24u) |
73099
        (((uint32_t)(v_buf_data[21u])) << 16u) |
73100
        (((uint32_t)(v_buf_data[22u])) << 8u) |
73101
        ((uint32_t)(v_buf_data[23u])));
73102
    v_w[6u] = ((((uint32_t)(v_buf_data[24u])) << 24u) |
73103
        (((uint32_t)(v_buf_data[25u])) << 16u) |
73104
        (((uint32_t)(v_buf_data[26u])) << 8u) |
73105
        ((uint32_t)(v_buf_data[27u])));
73106
    v_w[7u] = ((((uint32_t)(v_buf_data[28u])) << 24u) |
73107
        (((uint32_t)(v_buf_data[29u])) << 16u) |
73108
        (((uint32_t)(v_buf_data[30u])) << 8u) |
73109
        ((uint32_t)(v_buf_data[31u])));
73110
    v_w[8u] = ((((uint32_t)(v_buf_data[32u])) << 24u) |
73111
        (((uint32_t)(v_buf_data[33u])) << 16u) |
73112
        (((uint32_t)(v_buf_data[34u])) << 8u) |
73113
        ((uint32_t)(v_buf_data[35u])));
73114
    v_w[9u] = ((((uint32_t)(v_buf_data[36u])) << 24u) |
73115
        (((uint32_t)(v_buf_data[37u])) << 16u) |
73116
        (((uint32_t)(v_buf_data[38u])) << 8u) |
73117
        ((uint32_t)(v_buf_data[39u])));
73118
    v_w[10u] = ((((uint32_t)(v_buf_data[40u])) << 24u) |
73119
        (((uint32_t)(v_buf_data[41u])) << 16u) |
73120
        (((uint32_t)(v_buf_data[42u])) << 8u) |
73121
        ((uint32_t)(v_buf_data[43u])));
73122
    v_w[11u] = ((((uint32_t)(v_buf_data[44u])) << 24u) |
73123
        (((uint32_t)(v_buf_data[45u])) << 16u) |
73124
        (((uint32_t)(v_buf_data[46u])) << 8u) |
73125
        ((uint32_t)(v_buf_data[47u])));
73126
    v_w[12u] = ((((uint32_t)(v_buf_data[48u])) << 24u) |
73127
        (((uint32_t)(v_buf_data[49u])) << 16u) |
73128
        (((uint32_t)(v_buf_data[50u])) << 8u) |
73129
        ((uint32_t)(v_buf_data[51u])));
73130
    v_w[13u] = ((((uint32_t)(v_buf_data[52u])) << 24u) |
73131
        (((uint32_t)(v_buf_data[53u])) << 16u) |
73132
        (((uint32_t)(v_buf_data[54u])) << 8u) |
73133
        ((uint32_t)(v_buf_data[55u])));
73134
    v_w[14u] = ((((uint32_t)(v_buf_data[56u])) << 24u) |
73135
        (((uint32_t)(v_buf_data[57u])) << 16u) |
73136
        (((uint32_t)(v_buf_data[58u])) << 8u) |
73137
        ((uint32_t)(v_buf_data[59u])));
73138
    v_w[15u] = ((((uint32_t)(v_buf_data[60u])) << 24u) |
73139
        (((uint32_t)(v_buf_data[61u])) << 16u) |
73140
        (((uint32_t)(v_buf_data[62u])) << 8u) |
73141
        ((uint32_t)(v_buf_data[63u])));
73142
    v_i = 16u;
73143
    while (v_i < 64u) {
73144
      v_w2 = v_w[(v_i - 2u)];
73145
      v_s1 = ((v_w2 >> 10u) ^ (((uint32_t)(v_w2 << 15u)) | (v_w2 >> 17u)) ^ (((uint32_t)(v_w2 << 13u)) | (v_w2 >> 19u)));
73146
      v_w15 = v_w[(v_i - 15u)];
73147
      v_s0 = ((v_w15 >> 3u) ^ (((uint32_t)(v_w15 << 25u)) | (v_w15 >> 7u)) ^ (((uint32_t)(v_w15 << 14u)) | (v_w15 >> 18u)));
73148
      v_w[v_i] = ((uint32_t)(((uint32_t)(((uint32_t)(v_s1 + v_w[(v_i - 7u)])) + v_s0)) + v_w[(v_i - 16u)]));
73149
      v_i += 1u;
73150
    }
73151
    v_i = 0u;
73152
    while (v_i < 64u) {
73153
      v_t1 = v_h;
73154
      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)));
73155
      v_t1 += ((v_e & v_f) ^ ((4294967295u ^ v_e) & v_g));
73156
      v_t1 += WUFFS_SHA256__K[v_i];
73157
      v_t1 += v_w[v_i];
73158
      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)));
73159
      v_t2 += ((v_a & v_b) ^ (v_a & v_c) ^ (v_b & v_c));
73160
      v_h = v_g;
73161
      v_g = v_f;
73162
      v_f = v_e;
73163
      v_e = ((uint32_t)(v_d + v_t1));
73164
      v_d = v_c;
73165
      v_c = v_b;
73166
      v_b = v_a;
73167
      v_a = ((uint32_t)(v_t1 + v_t2));
73168
      v_i += 1u;
73169
    }
73170
    v_a += v_h0;
73171
    v_b += v_h1;
73172
    v_c += v_h2;
73173
    v_d += v_h3;
73174
    v_e += v_h4;
73175
    v_f += v_h5;
73176
    v_g += v_h6;
73177
    v_h += v_h7;
73178
    if (v_final_block) {
73179
      break;
73180
    }
73181
    v_final_block = true;
73182
    v_h0 = v_a;
73183
    v_h1 = v_b;
73184
    v_h2 = v_c;
73185
    v_h3 = v_d;
73186
    v_h4 = v_e;
73187
    v_h5 = v_f;
73188
    v_h6 = v_g;
73189
    v_h7 = v_h;
73190
    v_buf_len = 0u;
73191
    while (v_buf_len < 56u) {
73192
      v_buf_data[v_buf_len] = 0u;
73193
      v_buf_len += 1u;
73194
    }
73195
  }
73196
  return wuffs_base__utility__make_bitvec256(
73197
      (((uint64_t)(v_h)) | (((uint64_t)(v_g)) << 32u)),
73198
      (((uint64_t)(v_f)) | (((uint64_t)(v_e)) << 32u)),
73199
      (((uint64_t)(v_d)) | (((uint64_t)(v_c)) << 32u)),
73200
      (((uint64_t)(v_b)) | (((uint64_t)(v_a)) << 32u)));
73201
}
73202
73203
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__SHA256)
73204
73205
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__TARGA)
73206
73207
// ---------------- Status Codes Implementations
73208
73209
const char wuffs_targa__error__bad_header[] = "#targa: bad header";
73210
const char wuffs_targa__error__bad_run_length_encoding[] = "#targa: bad run length encoding";
73211
const char wuffs_targa__error__truncated_input[] = "#targa: truncated input";
73212
const char wuffs_targa__error__unsupported_targa_file[] = "#targa: unsupported TARGA file";
73213
73214
// ---------------- Private Consts
73215
73216
// ---------------- Private Initializer Prototypes
73217
73218
// ---------------- Private Function Prototypes
73219
73220
WUFFS_BASE__GENERATED_C_CODE
73221
static wuffs_base__status
73222
wuffs_targa__decoder__do_decode_image_config(
73223
    wuffs_targa__decoder* self,
73224
    wuffs_base__image_config* a_dst,
73225
    wuffs_base__io_buffer* a_src);
73226
73227
WUFFS_BASE__GENERATED_C_CODE
73228
static wuffs_base__status
73229
wuffs_targa__decoder__do_decode_frame_config(
73230
    wuffs_targa__decoder* self,
73231
    wuffs_base__frame_config* a_dst,
73232
    wuffs_base__io_buffer* a_src);
73233
73234
WUFFS_BASE__GENERATED_C_CODE
73235
static wuffs_base__status
73236
wuffs_targa__decoder__do_decode_frame(
73237
    wuffs_targa__decoder* self,
73238
    wuffs_base__pixel_buffer* a_dst,
73239
    wuffs_base__io_buffer* a_src,
73240
    wuffs_base__pixel_blend a_blend,
73241
    wuffs_base__slice_u8 a_workbuf,
73242
    wuffs_base__decode_frame_options* a_opts);
73243
73244
// ---------------- VTables
73245
73246
const wuffs_base__image_decoder__func_ptrs
73247
wuffs_targa__decoder__func_ptrs_for__wuffs_base__image_decoder = {
73248
  (wuffs_base__status(*)(void*,
73249
      wuffs_base__pixel_buffer*,
73250
      wuffs_base__io_buffer*,
73251
      wuffs_base__pixel_blend,
73252
      wuffs_base__slice_u8,
73253
      wuffs_base__decode_frame_options*))(&wuffs_targa__decoder__decode_frame),
73254
  (wuffs_base__status(*)(void*,
73255
      wuffs_base__frame_config*,
73256
      wuffs_base__io_buffer*))(&wuffs_targa__decoder__decode_frame_config),
73257
  (wuffs_base__status(*)(void*,
73258
      wuffs_base__image_config*,
73259
      wuffs_base__io_buffer*))(&wuffs_targa__decoder__decode_image_config),
73260
  (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_targa__decoder__frame_dirty_rect),
73261
  (uint64_t(*)(const void*,
73262
      uint32_t))(&wuffs_targa__decoder__get_quirk),
73263
  (uint32_t(*)(const void*))(&wuffs_targa__decoder__num_animation_loops),
73264
  (uint64_t(*)(const void*))(&wuffs_targa__decoder__num_decoded_frame_configs),
73265
  (uint64_t(*)(const void*))(&wuffs_targa__decoder__num_decoded_frames),
73266
  (wuffs_base__status(*)(void*,
73267
      uint64_t,
73268
      uint64_t))(&wuffs_targa__decoder__restart_frame),
73269
  (wuffs_base__status(*)(void*,
73270
      uint32_t,
73271
      uint64_t))(&wuffs_targa__decoder__set_quirk),
73272
  (wuffs_base__empty_struct(*)(void*,
73273
      uint32_t,
73274
      bool))(&wuffs_targa__decoder__set_report_metadata),
73275
  (wuffs_base__status(*)(void*,
73276
      wuffs_base__io_buffer*,
73277
      wuffs_base__more_information*,
73278
      wuffs_base__io_buffer*))(&wuffs_targa__decoder__tell_me_more),
73279
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_targa__decoder__workbuf_len),
73280
};
73281
73282
// ---------------- Initializer Implementations
73283
73284
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
73285
wuffs_targa__decoder__initialize(
73286
    wuffs_targa__decoder* self,
73287
    size_t sizeof_star_self,
73288
    uint64_t wuffs_version,
73289
    uint32_t options){
73290
  if (!self) {
73291
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
73292
  }
73293
  if (sizeof(*self) != sizeof_star_self) {
73294
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
73295
  }
73296
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
73297
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
73298
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
73299
  }
73300
73301
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
73302
    // The whole point of this if-check is to detect an uninitialized *self.
73303
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
73304
#if !defined(__clang__) && defined(__GNUC__)
73305
#pragma GCC diagnostic push
73306
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
73307
#endif
73308
    if (self->private_impl.magic != 0) {
73309
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
73310
    }
73311
#if !defined(__clang__) && defined(__GNUC__)
73312
#pragma GCC diagnostic pop
73313
#endif
73314
  } else {
73315
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
73316
      memset(self, 0, sizeof(*self));
73317
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
73318
    } else {
73319
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
73320
    }
73321
  }
73322
73323
  self->private_impl.magic = WUFFS_BASE__MAGIC;
73324
  self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name =
73325
      wuffs_base__image_decoder__vtable_name;
73326
  self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers =
73327
      (const void*)(&wuffs_targa__decoder__func_ptrs_for__wuffs_base__image_decoder);
73328
  return wuffs_base__make_status(NULL);
73329
}
73330
73331
wuffs_targa__decoder*
73332
wuffs_targa__decoder__alloc(void) {
73333
  wuffs_targa__decoder* x =
73334
      (wuffs_targa__decoder*)(calloc(1, sizeof(wuffs_targa__decoder)));
73335
  if (!x) {
73336
    return NULL;
73337
  }
73338
  if (wuffs_targa__decoder__initialize(
73339
      x, sizeof(wuffs_targa__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
73340
    free(x);
73341
    return NULL;
73342
  }
73343
  return x;
73344
}
73345
73346
size_t
73347
sizeof__wuffs_targa__decoder(void) {
73348
  return sizeof(wuffs_targa__decoder);
73349
}
73350
73351
// ---------------- Function Implementations
73352
73353
// -------- func targa.decoder.get_quirk
73354
73355
WUFFS_BASE__GENERATED_C_CODE
73356
WUFFS_BASE__MAYBE_STATIC uint64_t
73357
wuffs_targa__decoder__get_quirk(
73358
    const wuffs_targa__decoder* self,
73359
    uint32_t a_key) {
73360
  if (!self) {
73361
    return 0;
73362
  }
73363
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
73364
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
73365
    return 0;
73366
  }
73367
73368
  return 0u;
73369
}
73370
73371
// -------- func targa.decoder.set_quirk
73372
73373
WUFFS_BASE__GENERATED_C_CODE
73374
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
73375
wuffs_targa__decoder__set_quirk(
73376
    wuffs_targa__decoder* self,
73377
    uint32_t a_key,
73378
    uint64_t a_value) {
73379
  if (!self) {
73380
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
73381
  }
73382
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
73383
    return wuffs_base__make_status(
73384
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
73385
        ? wuffs_base__error__disabled_by_previous_error
73386
        : wuffs_base__error__initialize_not_called);
73387
  }
73388
73389
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
73390
}
73391
73392
// -------- func targa.decoder.decode_image_config
73393
73394
WUFFS_BASE__GENERATED_C_CODE
73395
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
73396
wuffs_targa__decoder__decode_image_config(
73397
    wuffs_targa__decoder* self,
73398
    wuffs_base__image_config* a_dst,
73399
    wuffs_base__io_buffer* a_src) {
73400
  if (!self) {
73401
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
73402
  }
73403
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
73404
    return wuffs_base__make_status(
73405
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
73406
        ? wuffs_base__error__disabled_by_previous_error
73407
        : wuffs_base__error__initialize_not_called);
73408
  }
73409
  if (!a_src) {
73410
    self->private_impl.magic = WUFFS_BASE__DISABLED;
73411
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
73412
  }
73413
  if ((self->private_impl.active_coroutine != 0) &&
73414
      (self->private_impl.active_coroutine != 1)) {
73415
    self->private_impl.magic = WUFFS_BASE__DISABLED;
73416
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
73417
  }
73418
  self->private_impl.active_coroutine = 0;
73419
  wuffs_base__status status = wuffs_base__make_status(NULL);
73420
73421
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
73422
73423
  uint32_t coro_susp_point = self->private_impl.p_decode_image_config;
73424
  switch (coro_susp_point) {
73425
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
73426
73427
    while (true) {
73428
      {
73429
        wuffs_base__status t_0 = wuffs_targa__decoder__do_decode_image_config(self, a_dst, a_src);
73430
        v_status = t_0;
73431
      }
73432
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
73433
        status = wuffs_base__make_status(wuffs_targa__error__truncated_input);
73434
        goto exit;
73435
      }
73436
      status = v_status;
73437
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
73438
    }
73439
73440
    ok:
73441
    self->private_impl.p_decode_image_config = 0;
73442
    goto exit;
73443
  }
73444
73445
  goto suspend;
73446
  suspend:
73447
  self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
73448
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
73449
73450
  goto exit;
73451
  exit:
73452
  if (wuffs_base__status__is_error(&status)) {
73453
    self->private_impl.magic = WUFFS_BASE__DISABLED;
73454
  }
73455
  return status;
73456
}
73457
73458
// -------- func targa.decoder.do_decode_image_config
73459
73460
WUFFS_BASE__GENERATED_C_CODE
73461
static wuffs_base__status
73462
wuffs_targa__decoder__do_decode_image_config(
73463
    wuffs_targa__decoder* self,
73464
    wuffs_base__image_config* a_dst,
73465
    wuffs_base__io_buffer* a_src) {
73466
  wuffs_base__status status = wuffs_base__make_status(NULL);
73467
73468
  uint32_t v_c32 = 0;
73469
  uint32_t v_c5 = 0;
73470
  uint32_t v_i = 0;
73471
73472
  const uint8_t* iop_a_src = NULL;
73473
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
73474
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
73475
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
73476
  if (a_src && a_src->data.ptr) {
73477
    io0_a_src = a_src->data.ptr;
73478
    io1_a_src = io0_a_src + a_src->meta.ri;
73479
    iop_a_src = io1_a_src;
73480
    io2_a_src = io0_a_src + a_src->meta.wi;
73481
  }
73482
73483
  uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config;
73484
  if (coro_susp_point) {
73485
    v_i = self->private_data.s_do_decode_image_config.v_i;
73486
  }
73487
  switch (coro_susp_point) {
73488
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
73489
73490
    if (self->private_impl.f_call_sequence != 0u) {
73491
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
73492
      goto exit;
73493
    }
73494
    {
73495
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
73496
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
73497
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
73498
        goto suspend;
73499
      }
73500
      uint8_t t_0 = *iop_a_src++;
73501
      self->private_impl.f_header_id_length = t_0;
73502
    }
73503
    {
73504
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
73505
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
73506
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
73507
        goto suspend;
73508
      }
73509
      uint8_t t_1 = *iop_a_src++;
73510
      self->private_impl.f_header_color_map_type = t_1;
73511
    }
73512
    if (self->private_impl.f_header_color_map_type > 1u) {
73513
      status = wuffs_base__make_status(wuffs_targa__error__bad_header);
73514
      goto exit;
73515
    }
73516
    {
73517
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
73518
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
73519
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
73520
        goto suspend;
73521
      }
73522
      uint8_t t_2 = *iop_a_src++;
73523
      self->private_impl.f_header_image_type = t_2;
73524
    }
73525
    if ((self->private_impl.f_header_image_type == 1u) ||
73526
        (self->private_impl.f_header_image_type == 2u) ||
73527
        (self->private_impl.f_header_image_type == 3u) ||
73528
        (self->private_impl.f_header_image_type == 9u) ||
73529
        (self->private_impl.f_header_image_type == 10u) ||
73530
        (self->private_impl.f_header_image_type == 11u)) {
73531
    } else {
73532
      status = wuffs_base__make_status(wuffs_targa__error__bad_header);
73533
      goto exit;
73534
    }
73535
    {
73536
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
73537
      uint16_t t_3;
73538
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
73539
        t_3 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src);
73540
        iop_a_src += 2;
73541
      } else {
73542
        self->private_data.s_do_decode_image_config.scratch = 0;
73543
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
73544
        while (true) {
73545
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
73546
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
73547
            goto suspend;
73548
          }
73549
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
73550
          uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56));
73551
          *scratch <<= 8;
73552
          *scratch >>= 8;
73553
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3;
73554
          if (num_bits_3 == 8) {
73555
            t_3 = ((uint16_t)(*scratch));
73556
            break;
73557
          }
73558
          num_bits_3 += 8u;
73559
          *scratch |= ((uint64_t)(num_bits_3)) << 56;
73560
        }
73561
      }
73562
      self->private_impl.f_header_color_map_first_entry_index = t_3;
73563
    }
73564
    {
73565
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
73566
      uint16_t t_4;
73567
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
73568
        t_4 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src);
73569
        iop_a_src += 2;
73570
      } else {
73571
        self->private_data.s_do_decode_image_config.scratch = 0;
73572
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
73573
        while (true) {
73574
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
73575
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
73576
            goto suspend;
73577
          }
73578
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
73579
          uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56));
73580
          *scratch <<= 8;
73581
          *scratch >>= 8;
73582
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4;
73583
          if (num_bits_4 == 8) {
73584
            t_4 = ((uint16_t)(*scratch));
73585
            break;
73586
          }
73587
          num_bits_4 += 8u;
73588
          *scratch |= ((uint64_t)(num_bits_4)) << 56;
73589
        }
73590
      }
73591
      self->private_impl.f_header_color_map_length = t_4;
73592
    }
73593
    {
73594
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
73595
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
73596
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
73597
        goto suspend;
73598
      }
73599
      uint8_t t_5 = *iop_a_src++;
73600
      self->private_impl.f_header_color_map_entry_size = t_5;
73601
    }
73602
    if (self->private_impl.f_header_color_map_type != 0u) {
73603
      if ((self->private_impl.f_header_color_map_first_entry_index != 0u) || (self->private_impl.f_header_color_map_length > 256u)) {
73604
        status = wuffs_base__make_status(wuffs_targa__error__unsupported_targa_file);
73605
        goto exit;
73606
      } else if ((self->private_impl.f_header_color_map_entry_size != 15u) &&
73607
          (self->private_impl.f_header_color_map_entry_size != 16u) &&
73608
          (self->private_impl.f_header_color_map_entry_size != 24u) &&
73609
          (self->private_impl.f_header_color_map_entry_size != 32u)) {
73610
        status = wuffs_base__make_status(wuffs_targa__error__bad_header);
73611
        goto exit;
73612
      }
73613
    } else {
73614
      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)) {
73615
        status = wuffs_base__make_status(wuffs_targa__error__bad_header);
73616
        goto exit;
73617
      }
73618
    }
73619
    self->private_data.s_do_decode_image_config.scratch = 4u;
73620
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
73621
    if (self->private_data.s_do_decode_image_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
73622
      self->private_data.s_do_decode_image_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
73623
      iop_a_src = io2_a_src;
73624
      status = wuffs_base__make_status(wuffs_base__suspension__short_read);
73625
      goto suspend;
73626
    }
73627
    iop_a_src += self->private_data.s_do_decode_image_config.scratch;
73628
    {
73629
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
73630
      uint32_t t_6;
73631
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
73632
        t_6 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
73633
        iop_a_src += 2;
73634
      } else {
73635
        self->private_data.s_do_decode_image_config.scratch = 0;
73636
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11);
73637
        while (true) {
73638
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
73639
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
73640
            goto suspend;
73641
          }
73642
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
73643
          uint32_t num_bits_6 = ((uint32_t)(*scratch >> 56));
73644
          *scratch <<= 8;
73645
          *scratch >>= 8;
73646
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_6;
73647
          if (num_bits_6 == 8) {
73648
            t_6 = ((uint32_t)(*scratch));
73649
            break;
73650
          }
73651
          num_bits_6 += 8u;
73652
          *scratch |= ((uint64_t)(num_bits_6)) << 56;
73653
        }
73654
      }
73655
      self->private_impl.f_width = t_6;
73656
    }
73657
    {
73658
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12);
73659
      uint32_t t_7;
73660
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
73661
        t_7 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
73662
        iop_a_src += 2;
73663
      } else {
73664
        self->private_data.s_do_decode_image_config.scratch = 0;
73665
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13);
73666
        while (true) {
73667
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
73668
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
73669
            goto suspend;
73670
          }
73671
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
73672
          uint32_t num_bits_7 = ((uint32_t)(*scratch >> 56));
73673
          *scratch <<= 8;
73674
          *scratch >>= 8;
73675
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_7;
73676
          if (num_bits_7 == 8) {
73677
            t_7 = ((uint32_t)(*scratch));
73678
            break;
73679
          }
73680
          num_bits_7 += 8u;
73681
          *scratch |= ((uint64_t)(num_bits_7)) << 56;
73682
        }
73683
      }
73684
      self->private_impl.f_height = t_7;
73685
    }
73686
    {
73687
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14);
73688
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
73689
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
73690
        goto suspend;
73691
      }
73692
      uint8_t t_8 = *iop_a_src++;
73693
      self->private_impl.f_header_pixel_depth = t_8;
73694
    }
73695
    if ((self->private_impl.f_header_pixel_depth != 1u) &&
73696
        (self->private_impl.f_header_pixel_depth != 8u) &&
73697
        (self->private_impl.f_header_pixel_depth != 15u) &&
73698
        (self->private_impl.f_header_pixel_depth != 16u) &&
73699
        (self->private_impl.f_header_pixel_depth != 24u) &&
73700
        (self->private_impl.f_header_pixel_depth != 32u)) {
73701
      status = wuffs_base__make_status(wuffs_targa__error__bad_header);
73702
      goto exit;
73703
    }
73704
    if (((uint8_t)(self->private_impl.f_header_image_type | 8u)) == 9u) {
73705
      self->private_impl.f_scratch_bytes_per_pixel = 1u;
73706
      self->private_impl.f_src_bytes_per_pixel = 1u;
73707
      self->private_impl.f_src_pixfmt = 2164523016u;
73708
      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));
73709
    } else if (((uint8_t)(self->private_impl.f_header_image_type | 8u)) == 10u) {
73710
      if ((self->private_impl.f_header_pixel_depth == 15u) || (self->private_impl.f_header_pixel_depth == 16u)) {
73711
        self->private_impl.f_scratch_bytes_per_pixel = 4u;
73712
        self->private_impl.f_src_bytes_per_pixel = 0u;
73713
        self->private_impl.f_src_pixfmt = 2164295816u;
73714
      } else if (self->private_impl.f_header_pixel_depth == 24u) {
73715
        self->private_impl.f_scratch_bytes_per_pixel = 3u;
73716
        self->private_impl.f_src_bytes_per_pixel = 3u;
73717
        self->private_impl.f_src_pixfmt = 2147485832u;
73718
        self->private_impl.f_opaque = true;
73719
      } else if (self->private_impl.f_header_pixel_depth == 32u) {
73720
        self->private_impl.f_scratch_bytes_per_pixel = 4u;
73721
        self->private_impl.f_src_bytes_per_pixel = 4u;
73722
        self->private_impl.f_src_pixfmt = 2164295816u;
73723
      } else {
73724
        status = wuffs_base__make_status(wuffs_targa__error__unsupported_targa_file);
73725
        goto exit;
73726
      }
73727
    } else {
73728
      if (self->private_impl.f_header_pixel_depth == 8u) {
73729
        self->private_impl.f_scratch_bytes_per_pixel = 1u;
73730
        self->private_impl.f_src_bytes_per_pixel = 1u;
73731
        self->private_impl.f_src_pixfmt = 536870920u;
73732
        self->private_impl.f_opaque = true;
73733
      } else {
73734
        status = wuffs_base__make_status(wuffs_targa__error__unsupported_targa_file);
73735
        goto exit;
73736
      }
73737
    }
73738
    {
73739
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15);
73740
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
73741
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
73742
        goto suspend;
73743
      }
73744
      uint8_t t_9 = *iop_a_src++;
73745
      self->private_impl.f_header_image_descriptor = t_9;
73746
    }
73747
    if (((uint8_t)(self->private_impl.f_header_image_descriptor & 16u)) != 0u) {
73748
      status = wuffs_base__make_status(wuffs_targa__error__unsupported_targa_file);
73749
      goto exit;
73750
    }
73751
    self->private_data.s_do_decode_image_config.scratch = ((uint32_t)(self->private_impl.f_header_id_length));
73752
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16);
73753
    if (self->private_data.s_do_decode_image_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
73754
      self->private_data.s_do_decode_image_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
73755
      iop_a_src = io2_a_src;
73756
      status = wuffs_base__make_status(wuffs_base__suspension__short_read);
73757
      goto suspend;
73758
    }
73759
    iop_a_src += self->private_data.s_do_decode_image_config.scratch;
73760
    if (self->private_impl.f_header_color_map_type != 0u) {
73761
      while (v_i < ((uint32_t)(self->private_impl.f_header_color_map_length))) {
73762
        if (self->private_impl.f_header_color_map_entry_size == 24u) {
73763
          {
73764
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(17);
73765
            uint32_t t_10;
73766
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) {
73767
              t_10 = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src)));
73768
              iop_a_src += 3;
73769
            } else {
73770
              self->private_data.s_do_decode_image_config.scratch = 0;
73771
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(18);
73772
              while (true) {
73773
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
73774
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
73775
                  goto suspend;
73776
                }
73777
                uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
73778
                uint32_t num_bits_10 = ((uint32_t)(*scratch >> 56));
73779
                *scratch <<= 8;
73780
                *scratch >>= 8;
73781
                *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_10;
73782
                if (num_bits_10 == 16) {
73783
                  t_10 = ((uint32_t)(*scratch));
73784
                  break;
73785
                }
73786
                num_bits_10 += 8u;
73787
                *scratch |= ((uint64_t)(num_bits_10)) << 56;
73788
              }
73789
            }
73790
            v_c32 = t_10;
73791
          }
73792
          self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 0u)] = ((uint8_t)((v_c32 >> 0u)));
73793
          self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 1u)] = ((uint8_t)((v_c32 >> 8u)));
73794
          self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 2u)] = ((uint8_t)((v_c32 >> 16u)));
73795
          self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 3u)] = 255u;
73796
        } else if (self->private_impl.f_header_color_map_entry_size == 32u) {
73797
          {
73798
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(19);
73799
            uint32_t t_11;
73800
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
73801
              t_11 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
73802
              iop_a_src += 4;
73803
            } else {
73804
              self->private_data.s_do_decode_image_config.scratch = 0;
73805
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(20);
73806
              while (true) {
73807
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
73808
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
73809
                  goto suspend;
73810
                }
73811
                uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
73812
                uint32_t num_bits_11 = ((uint32_t)(*scratch >> 56));
73813
                *scratch <<= 8;
73814
                *scratch >>= 8;
73815
                *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_11;
73816
                if (num_bits_11 == 24) {
73817
                  t_11 = ((uint32_t)(*scratch));
73818
                  break;
73819
                }
73820
                num_bits_11 += 8u;
73821
                *scratch |= ((uint64_t)(num_bits_11)) << 56;
73822
              }
73823
            }
73824
            v_c32 = t_11;
73825
          }
73826
          self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 0u)] = ((uint8_t)((v_c32 >> 0u)));
73827
          self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 1u)] = ((uint8_t)((v_c32 >> 8u)));
73828
          self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 2u)] = ((uint8_t)((v_c32 >> 16u)));
73829
          self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 3u)] = ((uint8_t)((v_c32 >> 24u)));
73830
        } else {
73831
          {
73832
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(21);
73833
            uint32_t t_12;
73834
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
73835
              t_12 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
73836
              iop_a_src += 2;
73837
            } else {
73838
              self->private_data.s_do_decode_image_config.scratch = 0;
73839
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(22);
73840
              while (true) {
73841
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
73842
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
73843
                  goto suspend;
73844
                }
73845
                uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
73846
                uint32_t num_bits_12 = ((uint32_t)(*scratch >> 56));
73847
                *scratch <<= 8;
73848
                *scratch >>= 8;
73849
                *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_12;
73850
                if (num_bits_12 == 8) {
73851
                  t_12 = ((uint32_t)(*scratch));
73852
                  break;
73853
                }
73854
                num_bits_12 += 8u;
73855
                *scratch |= ((uint64_t)(num_bits_12)) << 56;
73856
              }
73857
            }
73858
            v_c32 = t_12;
73859
          }
73860
          v_c5 = (31u & (v_c32 >> 0u));
73861
          self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 0u)] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u))));
73862
          v_c5 = (31u & (v_c32 >> 5u));
73863
          self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 1u)] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u))));
73864
          v_c5 = (31u & (v_c32 >> 10u));
73865
          self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 2u)] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u))));
73866
          self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 3u)] = 255u;
73867
        }
73868
        v_i += 1u;
73869
      }
73870
      while (v_i < 256u) {
73871
        self->private_data.f_src_palette[((v_i * 4u) + 0u)] = 0u;
73872
        self->private_data.f_src_palette[((v_i * 4u) + 1u)] = 0u;
73873
        self->private_data.f_src_palette[((v_i * 4u) + 2u)] = 0u;
73874
        self->private_data.f_src_palette[((v_i * 4u) + 3u)] = 255u;
73875
        v_i += 1u;
73876
      }
73877
    }
73878
    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)));
73879
    if (a_dst != NULL) {
73880
      wuffs_base__image_config__set(
73881
          a_dst,
73882
          self->private_impl.f_src_pixfmt,
73883
          0u,
73884
          self->private_impl.f_width,
73885
          self->private_impl.f_height,
73886
          self->private_impl.f_frame_config_io_position,
73887
          self->private_impl.f_opaque);
73888
    }
73889
    self->private_impl.f_call_sequence = 32u;
73890
73891
    goto ok;
73892
    ok:
73893
    self->private_impl.p_do_decode_image_config = 0;
73894
    goto exit;
73895
  }
73896
73897
  goto suspend;
73898
  suspend:
73899
  self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
73900
  self->private_data.s_do_decode_image_config.v_i = v_i;
73901
73902
  goto exit;
73903
  exit:
73904
  if (a_src && a_src->data.ptr) {
73905
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
73906
  }
73907
73908
  return status;
73909
}
73910
73911
// -------- func targa.decoder.decode_frame_config
73912
73913
WUFFS_BASE__GENERATED_C_CODE
73914
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
73915
wuffs_targa__decoder__decode_frame_config(
73916
    wuffs_targa__decoder* self,
73917
    wuffs_base__frame_config* a_dst,
73918
    wuffs_base__io_buffer* a_src) {
73919
  if (!self) {
73920
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
73921
  }
73922
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
73923
    return wuffs_base__make_status(
73924
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
73925
        ? wuffs_base__error__disabled_by_previous_error
73926
        : wuffs_base__error__initialize_not_called);
73927
  }
73928
  if (!a_src) {
73929
    self->private_impl.magic = WUFFS_BASE__DISABLED;
73930
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
73931
  }
73932
  if ((self->private_impl.active_coroutine != 0) &&
73933
      (self->private_impl.active_coroutine != 2)) {
73934
    self->private_impl.magic = WUFFS_BASE__DISABLED;
73935
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
73936
  }
73937
  self->private_impl.active_coroutine = 0;
73938
  wuffs_base__status status = wuffs_base__make_status(NULL);
73939
73940
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
73941
73942
  uint32_t coro_susp_point = self->private_impl.p_decode_frame_config;
73943
  switch (coro_susp_point) {
73944
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
73945
73946
    while (true) {
73947
      {
73948
        wuffs_base__status t_0 = wuffs_targa__decoder__do_decode_frame_config(self, a_dst, a_src);
73949
        v_status = t_0;
73950
      }
73951
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
73952
        status = wuffs_base__make_status(wuffs_targa__error__truncated_input);
73953
        goto exit;
73954
      }
73955
      status = v_status;
73956
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
73957
    }
73958
73959
    ok:
73960
    self->private_impl.p_decode_frame_config = 0;
73961
    goto exit;
73962
  }
73963
73964
  goto suspend;
73965
  suspend:
73966
  self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
73967
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0;
73968
73969
  goto exit;
73970
  exit:
73971
  if (wuffs_base__status__is_error(&status)) {
73972
    self->private_impl.magic = WUFFS_BASE__DISABLED;
73973
  }
73974
  return status;
73975
}
73976
73977
// -------- func targa.decoder.do_decode_frame_config
73978
73979
WUFFS_BASE__GENERATED_C_CODE
73980
static wuffs_base__status
73981
wuffs_targa__decoder__do_decode_frame_config(
73982
    wuffs_targa__decoder* self,
73983
    wuffs_base__frame_config* a_dst,
73984
    wuffs_base__io_buffer* a_src) {
73985
  wuffs_base__status status = wuffs_base__make_status(NULL);
73986
73987
  wuffs_base__pixel_format v_pixfmt = {0};
73988
73989
  const uint8_t* iop_a_src = NULL;
73990
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
73991
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
73992
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
73993
  if (a_src && a_src->data.ptr) {
73994
    io0_a_src = a_src->data.ptr;
73995
    io1_a_src = io0_a_src + a_src->meta.ri;
73996
    iop_a_src = io1_a_src;
73997
    io2_a_src = io0_a_src + a_src->meta.wi;
73998
  }
73999
74000
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config;
74001
  switch (coro_susp_point) {
74002
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
74003
74004
    if (self->private_impl.f_call_sequence == 32u) {
74005
    } else if (self->private_impl.f_call_sequence < 32u) {
74006
      if (a_src) {
74007
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
74008
      }
74009
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
74010
      status = wuffs_targa__decoder__do_decode_image_config(self, NULL, a_src);
74011
      if (a_src) {
74012
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
74013
      }
74014
      if (status.repr) {
74015
        goto suspend;
74016
      }
74017
    } else if (self->private_impl.f_call_sequence == 40u) {
74018
      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)))) {
74019
        status = wuffs_base__make_status(wuffs_base__error__bad_restart);
74020
        goto exit;
74021
      }
74022
    } else if (self->private_impl.f_call_sequence == 64u) {
74023
      self->private_impl.f_call_sequence = 96u;
74024
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
74025
      goto ok;
74026
    } else {
74027
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
74028
      goto ok;
74029
    }
74030
    if (a_dst != NULL) {
74031
      v_pixfmt = wuffs_base__utility__make_pixel_format(self->private_impl.f_src_pixfmt);
74032
      wuffs_base__frame_config__set(
74033
          a_dst,
74034
          wuffs_base__utility__make_rect_ie_u32(
74035
          0u,
74036
          0u,
74037
          self->private_impl.f_width,
74038
          self->private_impl.f_height),
74039
          ((wuffs_base__flicks)(0u)),
74040
          0u,
74041
          self->private_impl.f_frame_config_io_position,
74042
          0u,
74043
          self->private_impl.f_opaque,
74044
          false,
74045
          wuffs_base__pixel_format__default_background_color(&v_pixfmt));
74046
    }
74047
    self->private_impl.f_call_sequence = 64u;
74048
74049
    ok:
74050
    self->private_impl.p_do_decode_frame_config = 0;
74051
    goto exit;
74052
  }
74053
74054
  goto suspend;
74055
  suspend:
74056
  self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
74057
74058
  goto exit;
74059
  exit:
74060
  if (a_src && a_src->data.ptr) {
74061
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
74062
  }
74063
74064
  return status;
74065
}
74066
74067
// -------- func targa.decoder.decode_frame
74068
74069
WUFFS_BASE__GENERATED_C_CODE
74070
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
74071
wuffs_targa__decoder__decode_frame(
74072
    wuffs_targa__decoder* self,
74073
    wuffs_base__pixel_buffer* a_dst,
74074
    wuffs_base__io_buffer* a_src,
74075
    wuffs_base__pixel_blend a_blend,
74076
    wuffs_base__slice_u8 a_workbuf,
74077
    wuffs_base__decode_frame_options* a_opts) {
74078
  if (!self) {
74079
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
74080
  }
74081
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
74082
    return wuffs_base__make_status(
74083
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
74084
        ? wuffs_base__error__disabled_by_previous_error
74085
        : wuffs_base__error__initialize_not_called);
74086
  }
74087
  if (!a_dst || !a_src) {
74088
    self->private_impl.magic = WUFFS_BASE__DISABLED;
74089
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
74090
  }
74091
  if ((self->private_impl.active_coroutine != 0) &&
74092
      (self->private_impl.active_coroutine != 3)) {
74093
    self->private_impl.magic = WUFFS_BASE__DISABLED;
74094
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
74095
  }
74096
  self->private_impl.active_coroutine = 0;
74097
  wuffs_base__status status = wuffs_base__make_status(NULL);
74098
74099
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
74100
74101
  uint32_t coro_susp_point = self->private_impl.p_decode_frame;
74102
  switch (coro_susp_point) {
74103
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
74104
74105
    while (true) {
74106
      {
74107
        wuffs_base__status t_0 = wuffs_targa__decoder__do_decode_frame(self,
74108
            a_dst,
74109
            a_src,
74110
            a_blend,
74111
            a_workbuf,
74112
            a_opts);
74113
        v_status = t_0;
74114
      }
74115
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
74116
        status = wuffs_base__make_status(wuffs_targa__error__truncated_input);
74117
        goto exit;
74118
      }
74119
      status = v_status;
74120
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
74121
    }
74122
74123
    ok:
74124
    self->private_impl.p_decode_frame = 0;
74125
    goto exit;
74126
  }
74127
74128
  goto suspend;
74129
  suspend:
74130
  self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
74131
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0;
74132
74133
  goto exit;
74134
  exit:
74135
  if (wuffs_base__status__is_error(&status)) {
74136
    self->private_impl.magic = WUFFS_BASE__DISABLED;
74137
  }
74138
  return status;
74139
}
74140
74141
// -------- func targa.decoder.do_decode_frame
74142
74143
WUFFS_BASE__GENERATED_C_CODE
74144
static wuffs_base__status
74145
wuffs_targa__decoder__do_decode_frame(
74146
    wuffs_targa__decoder* self,
74147
    wuffs_base__pixel_buffer* a_dst,
74148
    wuffs_base__io_buffer* a_src,
74149
    wuffs_base__pixel_blend a_blend,
74150
    wuffs_base__slice_u8 a_workbuf,
74151
    wuffs_base__decode_frame_options* a_opts) {
74152
  wuffs_base__status status = wuffs_base__make_status(NULL);
74153
74154
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
74155
  wuffs_base__pixel_format v_dst_pixfmt = {0};
74156
  uint32_t v_dst_bits_per_pixel = 0;
74157
  uint64_t v_dst_bytes_per_pixel = 0;
74158
  uint32_t v_dst_x = 0;
74159
  uint32_t v_dst_y = 0;
74160
  wuffs_base__table_u8 v_tab = {0};
74161
  wuffs_base__slice_u8 v_dst_palette = {0};
74162
  wuffs_base__slice_u8 v_dst = {0};
74163
  uint64_t v_dst_start = 0;
74164
  wuffs_base__slice_u8 v_src_palette = {0};
74165
  uint64_t v_mark = 0;
74166
  uint64_t v_num_pixels64 = 0;
74167
  uint32_t v_num_pixels32 = 0;
74168
  uint32_t v_lit_length = 0;
74169
  uint32_t v_run_length = 0;
74170
  uint64_t v_num_dst_bytes = 0;
74171
  uint32_t v_num_src_bytes = 0;
74172
  uint32_t v_c32 = 0;
74173
  uint32_t v_c5 = 0;
74174
74175
  const uint8_t* iop_a_src = NULL;
74176
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
74177
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
74178
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
74179
  if (a_src && a_src->data.ptr) {
74180
    io0_a_src = a_src->data.ptr;
74181
    io1_a_src = io0_a_src + a_src->meta.ri;
74182
    iop_a_src = io1_a_src;
74183
    io2_a_src = io0_a_src + a_src->meta.wi;
74184
  }
74185
74186
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame;
74187
  if (coro_susp_point) {
74188
    v_dst_bytes_per_pixel = self->private_data.s_do_decode_frame.v_dst_bytes_per_pixel;
74189
    v_dst_x = self->private_data.s_do_decode_frame.v_dst_x;
74190
    v_dst_y = self->private_data.s_do_decode_frame.v_dst_y;
74191
    v_mark = self->private_data.s_do_decode_frame.v_mark;
74192
    v_num_pixels32 = self->private_data.s_do_decode_frame.v_num_pixels32;
74193
    v_lit_length = self->private_data.s_do_decode_frame.v_lit_length;
74194
    v_run_length = self->private_data.s_do_decode_frame.v_run_length;
74195
    v_num_dst_bytes = self->private_data.s_do_decode_frame.v_num_dst_bytes;
74196
  }
74197
  switch (coro_susp_point) {
74198
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
74199
74200
    if (self->private_impl.f_call_sequence == 64u) {
74201
    } else if (self->private_impl.f_call_sequence < 64u) {
74202
      if (a_src) {
74203
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
74204
      }
74205
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
74206
      status = wuffs_targa__decoder__do_decode_frame_config(self, NULL, a_src);
74207
      if (a_src) {
74208
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
74209
      }
74210
      if (status.repr) {
74211
        goto suspend;
74212
      }
74213
    } else {
74214
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
74215
      goto ok;
74216
    }
74217
    if (self->private_impl.f_header_color_map_type != 0u) {
74218
      v_src_palette = wuffs_base__make_slice_u8(self->private_data.f_src_palette, 1024);
74219
    }
74220
    v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler,
74221
        wuffs_base__pixel_buffer__pixel_format(a_dst),
74222
        wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)),
74223
        wuffs_base__utility__make_pixel_format(self->private_impl.f_src_pixfmt),
74224
        v_src_palette,
74225
        a_blend);
74226
    if ( ! wuffs_base__status__is_ok(&v_status)) {
74227
      status = v_status;
74228
      if (wuffs_base__status__is_error(&status)) {
74229
        goto exit;
74230
      } else if (wuffs_base__status__is_suspension(&status)) {
74231
        status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
74232
        goto exit;
74233
      }
74234
      goto ok;
74235
    }
74236
    v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
74237
    v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
74238
    if ((v_dst_bits_per_pixel & 7u) != 0u) {
74239
      status = wuffs_base__make_status(wuffs_base__error__unsupported_option);
74240
      goto exit;
74241
    }
74242
    v_dst_bytes_per_pixel = ((uint64_t)((v_dst_bits_per_pixel / 8u)));
74243
    if (((uint8_t)(self->private_impl.f_header_image_descriptor & 32u)) == 0u) {
74244
      v_dst_y = ((uint32_t)(self->private_impl.f_height - 1u));
74245
    }
74246
    if (((uint8_t)(self->private_impl.f_header_image_type & 8u)) == 0u) {
74247
      v_lit_length = self->private_impl.f_width;
74248
    }
74249
    label__resume__continue:;
74250
    while (true) {
74251
      v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
74252
      v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024));
74253
      while (v_dst_y < self->private_impl.f_height) {
74254
        v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_dst_y);
74255
        v_dst_start = (((uint64_t)(v_dst_x)) * v_dst_bytes_per_pixel);
74256
        if (v_dst_start <= ((uint64_t)(v_dst.len))) {
74257
          v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_start);
74258
        } else {
74259
          v_dst = wuffs_base__utility__empty_slice_u8();
74260
        }
74261
        while (v_dst_x < self->private_impl.f_width) {
74262
          if (self->private_impl.f_src_bytes_per_pixel > 0u) {
74263
            if (v_lit_length > 0u) {
74264
              v_mark = ((uint64_t)(iop_a_src - io0_a_src));
74265
              v_num_pixels64 = (((uint64_t)(io2_a_src - iop_a_src)) / ((uint64_t)(self->private_impl.f_src_bytes_per_pixel)));
74266
              v_num_pixels32 = ((uint32_t)(wuffs_base__u64__min(v_num_pixels64, ((uint64_t)(v_lit_length)))));
74267
              v_num_dst_bytes = (((uint64_t)(v_num_pixels32)) * v_dst_bytes_per_pixel);
74268
              v_num_src_bytes = (v_num_pixels32 * self->private_impl.f_src_bytes_per_pixel);
74269
              self->private_data.s_do_decode_frame.scratch = v_num_src_bytes;
74270
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
74271
              if (self->private_data.s_do_decode_frame.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
74272
                self->private_data.s_do_decode_frame.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
74273
                iop_a_src = io2_a_src;
74274
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
74275
                goto suspend;
74276
              }
74277
              iop_a_src += self->private_data.s_do_decode_frame.scratch;
74278
              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));
74279
              if (v_num_dst_bytes <= ((uint64_t)(v_dst.len))) {
74280
                v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_num_dst_bytes);
74281
              } else {
74282
                v_dst = wuffs_base__utility__empty_slice_u8();
74283
              }
74284
              v_dst_x += v_num_pixels32;
74285
              v_lit_length = (((uint32_t)(v_lit_length - v_num_pixels32)) & 65535u);
74286
              if (v_lit_length > 0u) {
74287
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
74288
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3);
74289
                goto label__resume__continue;
74290
              }
74291
            } else if (v_run_length > 0u) {
74292
              v_run_length -= 1u;
74293
              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));
74294
              if (v_dst_bytes_per_pixel <= ((uint64_t)(v_dst.len))) {
74295
                v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_bytes_per_pixel);
74296
              }
74297
              v_dst_x += 1u;
74298
            } else {
74299
              if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
74300
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
74301
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4);
74302
                goto label__resume__continue;
74303
              }
74304
              if (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) < 128u) {
74305
                v_lit_length = (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) + 1u);
74306
                iop_a_src += 1u;
74307
                if ((v_lit_length + v_dst_x) > self->private_impl.f_width) {
74308
                  status = wuffs_base__make_status(wuffs_targa__error__bad_run_length_encoding);
74309
                  goto exit;
74310
                }
74311
              } else {
74312
                if (self->private_impl.f_src_bytes_per_pixel == 1u) {
74313
                  if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) {
74314
                    status = wuffs_base__make_status(wuffs_base__suspension__short_read);
74315
                    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5);
74316
                    goto label__resume__continue;
74317
                  }
74318
                  v_run_length = ((((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) & 127u) + 1u);
74319
                  iop_a_src += 1u;
74320
                  self->private_data.f_scratch[0u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
74321
                  iop_a_src += 1u;
74322
                } else if (self->private_impl.f_src_bytes_per_pixel == 3u) {
74323
                  if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) {
74324
                    status = wuffs_base__make_status(wuffs_base__suspension__short_read);
74325
                    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6);
74326
                    goto label__resume__continue;
74327
                  }
74328
                  v_run_length = ((((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) & 127u) + 1u);
74329
                  iop_a_src += 1u;
74330
                  self->private_data.f_scratch[0u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
74331
                  iop_a_src += 1u;
74332
                  self->private_data.f_scratch[1u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
74333
                  iop_a_src += 1u;
74334
                  self->private_data.f_scratch[2u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
74335
                  iop_a_src += 1u;
74336
                } else {
74337
                  if (((uint64_t)(io2_a_src - iop_a_src)) < 5u) {
74338
                    status = wuffs_base__make_status(wuffs_base__suspension__short_read);
74339
                    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7);
74340
                    goto label__resume__continue;
74341
                  }
74342
                  v_run_length = ((((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) & 127u) + 1u);
74343
                  iop_a_src += 1u;
74344
                  self->private_data.f_scratch[0u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
74345
                  iop_a_src += 1u;
74346
                  self->private_data.f_scratch[1u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
74347
                  iop_a_src += 1u;
74348
                  self->private_data.f_scratch[2u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
74349
                  iop_a_src += 1u;
74350
                  self->private_data.f_scratch[3u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
74351
                  iop_a_src += 1u;
74352
                }
74353
                if ((v_run_length + v_dst_x) > self->private_impl.f_width) {
74354
                  status = wuffs_base__make_status(wuffs_targa__error__bad_run_length_encoding);
74355
                  goto exit;
74356
                }
74357
              }
74358
            }
74359
          } else {
74360
            if (v_lit_length > 0u) {
74361
              if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) {
74362
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
74363
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8);
74364
                goto label__resume__continue;
74365
              }
74366
              v_c32 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
74367
              iop_a_src += 2u;
74368
              v_c5 = (31u & (v_c32 >> 0u));
74369
              self->private_data.f_scratch[0u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u))));
74370
              v_c5 = (31u & (v_c32 >> 5u));
74371
              self->private_data.f_scratch[1u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u))));
74372
              v_c5 = (31u & (v_c32 >> 10u));
74373
              self->private_data.f_scratch[2u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u))));
74374
              self->private_data.f_scratch[3u] = 255u;
74375
              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));
74376
              if (v_dst_bytes_per_pixel <= ((uint64_t)(v_dst.len))) {
74377
                v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_bytes_per_pixel);
74378
              }
74379
              v_dst_x += 1u;
74380
              v_lit_length -= 1u;
74381
            } else if (v_run_length > 0u) {
74382
              v_run_length -= 1u;
74383
              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));
74384
              if (v_dst_bytes_per_pixel <= ((uint64_t)(v_dst.len))) {
74385
                v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_bytes_per_pixel);
74386
              }
74387
              v_dst_x += 1u;
74388
            } else {
74389
              if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
74390
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
74391
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9);
74392
                goto label__resume__continue;
74393
              }
74394
              if (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) < 128u) {
74395
                v_lit_length = (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) + 1u);
74396
                iop_a_src += 1u;
74397
                if ((v_lit_length + v_dst_x) > self->private_impl.f_width) {
74398
                  status = wuffs_base__make_status(wuffs_targa__error__bad_run_length_encoding);
74399
                  goto exit;
74400
                }
74401
              } else {
74402
                if (((uint64_t)(io2_a_src - iop_a_src)) < 3u) {
74403
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
74404
                  WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10);
74405
                  goto label__resume__continue;
74406
                }
74407
                v_run_length = ((((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) & 127u) + 1u);
74408
                iop_a_src += 1u;
74409
                v_c32 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
74410
                iop_a_src += 2u;
74411
                v_c5 = (31u & (v_c32 >> 0u));
74412
                self->private_data.f_scratch[0u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u))));
74413
                v_c5 = (31u & (v_c32 >> 5u));
74414
                self->private_data.f_scratch[1u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u))));
74415
                v_c5 = (31u & (v_c32 >> 10u));
74416
                self->private_data.f_scratch[2u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u))));
74417
                self->private_data.f_scratch[3u] = 255u;
74418
                if ((v_run_length + v_dst_x) > self->private_impl.f_width) {
74419
                  status = wuffs_base__make_status(wuffs_targa__error__bad_run_length_encoding);
74420
                  goto exit;
74421
                }
74422
              }
74423
            }
74424
          }
74425
        }
74426
        v_dst_x = 0u;
74427
        if (((uint8_t)(self->private_impl.f_header_image_descriptor & 32u)) == 0u) {
74428
          v_dst_y -= 1u;
74429
        } else {
74430
          v_dst_y += 1u;
74431
        }
74432
        if (((uint8_t)(self->private_impl.f_header_image_type & 8u)) == 0u) {
74433
          v_lit_length = self->private_impl.f_width;
74434
        }
74435
      }
74436
      break;
74437
    }
74438
    self->private_impl.f_call_sequence = 96u;
74439
74440
    ok:
74441
    self->private_impl.p_do_decode_frame = 0;
74442
    goto exit;
74443
  }
74444
74445
  goto suspend;
74446
  suspend:
74447
  self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
74448
  self->private_data.s_do_decode_frame.v_dst_bytes_per_pixel = v_dst_bytes_per_pixel;
74449
  self->private_data.s_do_decode_frame.v_dst_x = v_dst_x;
74450
  self->private_data.s_do_decode_frame.v_dst_y = v_dst_y;
74451
  self->private_data.s_do_decode_frame.v_mark = v_mark;
74452
  self->private_data.s_do_decode_frame.v_num_pixels32 = v_num_pixels32;
74453
  self->private_data.s_do_decode_frame.v_lit_length = v_lit_length;
74454
  self->private_data.s_do_decode_frame.v_run_length = v_run_length;
74455
  self->private_data.s_do_decode_frame.v_num_dst_bytes = v_num_dst_bytes;
74456
74457
  goto exit;
74458
  exit:
74459
  if (a_src && a_src->data.ptr) {
74460
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
74461
  }
74462
74463
  return status;
74464
}
74465
74466
// -------- func targa.decoder.frame_dirty_rect
74467
74468
WUFFS_BASE__GENERATED_C_CODE
74469
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
74470
wuffs_targa__decoder__frame_dirty_rect(
74471
    const wuffs_targa__decoder* self) {
74472
  if (!self) {
74473
    return wuffs_base__utility__empty_rect_ie_u32();
74474
  }
74475
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
74476
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
74477
    return wuffs_base__utility__empty_rect_ie_u32();
74478
  }
74479
74480
  return wuffs_base__utility__make_rect_ie_u32(
74481
      0u,
74482
      0u,
74483
      self->private_impl.f_width,
74484
      self->private_impl.f_height);
74485
}
74486
74487
// -------- func targa.decoder.num_animation_loops
74488
74489
WUFFS_BASE__GENERATED_C_CODE
74490
WUFFS_BASE__MAYBE_STATIC uint32_t
74491
wuffs_targa__decoder__num_animation_loops(
74492
    const wuffs_targa__decoder* self) {
74493
  if (!self) {
74494
    return 0;
74495
  }
74496
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
74497
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
74498
    return 0;
74499
  }
74500
74501
  return 0u;
74502
}
74503
74504
// -------- func targa.decoder.num_decoded_frame_configs
74505
74506
WUFFS_BASE__GENERATED_C_CODE
74507
WUFFS_BASE__MAYBE_STATIC uint64_t
74508
wuffs_targa__decoder__num_decoded_frame_configs(
74509
    const wuffs_targa__decoder* self) {
74510
  if (!self) {
74511
    return 0;
74512
  }
74513
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
74514
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
74515
    return 0;
74516
  }
74517
74518
  if (self->private_impl.f_call_sequence > 32u) {
74519
    return 1u;
74520
  }
74521
  return 0u;
74522
}
74523
74524
// -------- func targa.decoder.num_decoded_frames
74525
74526
WUFFS_BASE__GENERATED_C_CODE
74527
WUFFS_BASE__MAYBE_STATIC uint64_t
74528
wuffs_targa__decoder__num_decoded_frames(
74529
    const wuffs_targa__decoder* self) {
74530
  if (!self) {
74531
    return 0;
74532
  }
74533
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
74534
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
74535
    return 0;
74536
  }
74537
74538
  if (self->private_impl.f_call_sequence > 64u) {
74539
    return 1u;
74540
  }
74541
  return 0u;
74542
}
74543
74544
// -------- func targa.decoder.restart_frame
74545
74546
WUFFS_BASE__GENERATED_C_CODE
74547
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
74548
wuffs_targa__decoder__restart_frame(
74549
    wuffs_targa__decoder* self,
74550
    uint64_t a_index,
74551
    uint64_t a_io_position) {
74552
  if (!self) {
74553
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
74554
  }
74555
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
74556
    return wuffs_base__make_status(
74557
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
74558
        ? wuffs_base__error__disabled_by_previous_error
74559
        : wuffs_base__error__initialize_not_called);
74560
  }
74561
74562
  if (self->private_impl.f_call_sequence < 32u) {
74563
    return wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
74564
  }
74565
  if (a_index != 0u) {
74566
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
74567
  }
74568
  self->private_impl.f_call_sequence = 40u;
74569
  self->private_impl.f_frame_config_io_position = a_io_position;
74570
  return wuffs_base__make_status(NULL);
74571
}
74572
74573
// -------- func targa.decoder.set_report_metadata
74574
74575
WUFFS_BASE__GENERATED_C_CODE
74576
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
74577
wuffs_targa__decoder__set_report_metadata(
74578
    wuffs_targa__decoder* self,
74579
    uint32_t a_fourcc,
74580
    bool a_report) {
74581
  return wuffs_base__make_empty_struct();
74582
}
74583
74584
// -------- func targa.decoder.tell_me_more
74585
74586
WUFFS_BASE__GENERATED_C_CODE
74587
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
74588
wuffs_targa__decoder__tell_me_more(
74589
    wuffs_targa__decoder* self,
74590
    wuffs_base__io_buffer* a_dst,
74591
    wuffs_base__more_information* a_minfo,
74592
    wuffs_base__io_buffer* a_src) {
74593
  if (!self) {
74594
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
74595
  }
74596
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
74597
    return wuffs_base__make_status(
74598
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
74599
        ? wuffs_base__error__disabled_by_previous_error
74600
        : wuffs_base__error__initialize_not_called);
74601
  }
74602
  if (!a_dst || !a_src) {
74603
    self->private_impl.magic = WUFFS_BASE__DISABLED;
74604
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
74605
  }
74606
  if ((self->private_impl.active_coroutine != 0) &&
74607
      (self->private_impl.active_coroutine != 4)) {
74608
    self->private_impl.magic = WUFFS_BASE__DISABLED;
74609
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
74610
  }
74611
  self->private_impl.active_coroutine = 0;
74612
  wuffs_base__status status = wuffs_base__make_status(NULL);
74613
74614
  status = wuffs_base__make_status(wuffs_base__error__no_more_information);
74615
  goto exit;
74616
74617
  goto ok;
74618
  ok:
74619
  goto exit;
74620
  exit:
74621
  if (wuffs_base__status__is_error(&status)) {
74622
    self->private_impl.magic = WUFFS_BASE__DISABLED;
74623
  }
74624
  return status;
74625
}
74626
74627
// -------- func targa.decoder.workbuf_len
74628
74629
WUFFS_BASE__GENERATED_C_CODE
74630
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
74631
wuffs_targa__decoder__workbuf_len(
74632
    const wuffs_targa__decoder* self) {
74633
  if (!self) {
74634
    return wuffs_base__utility__empty_range_ii_u64();
74635
  }
74636
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
74637
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
74638
    return wuffs_base__utility__empty_range_ii_u64();
74639
  }
74640
74641
  return wuffs_base__utility__make_range_ii_u64(0u, 0u);
74642
}
74643
74644
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__TARGA)
74645
74646
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__THUMBHASH)
74647
74648
// ---------------- Status Codes Implementations
74649
74650
const char wuffs_thumbhash__error__bad_header[] = "#thumbhash: bad header";
74651
const char wuffs_thumbhash__error__truncated_input[] = "#thumbhash: truncated input";
74652
74653
// ---------------- Private Consts
74654
74655
#define WUFFS_THUMBHASH__QUIRKS_BASE 1712283648u
74656
74657
static const uint8_t
74658
WUFFS_THUMBHASH__DIMENSIONS_FROM_DIMENSION_CODES[8] WUFFS_BASE__POTENTIALLY_UNUSED = {
74659
  0u, 14u, 18u, 19u, 23u, 26u, 27u, 32u,
74660
};
74661
74662
static const uint8_t
74663
WUFFS_THUMBHASH__CUMULATIVE_DIMENSIONS[8] WUFFS_BASE__POTENTIALLY_UNUSED = {
74664
  0u, 0u, 14u, 32u, 51u, 74u, 100u, 127u,
74665
};
74666
74667
static const uint8_t
74668
WUFFS_THUMBHASH__DIMENSION_CODES_FROM_HAS_ALPHA_AND_L_COUNT[2][8] WUFFS_BASE__POTENTIALLY_UNUSED = {
74669
  {
74670
    23u, 23u, 23u, 23u, 39u, 71u, 103u, 119u,
74671
  }, {
74672
    55u, 55u, 55u, 55u, 87u, 119u, 118u, 116u,
74673
  },
74674
};
74675
74676
static const uint16_t
74677
WUFFS_THUMBHASH__FROM_4_BITS_TO_PLUS_MINUS_1_00[16] WUFFS_BASE__POTENTIALLY_UNUSED = {
74678
  49152u, 51337u, 53521u, 55706u, 57890u, 60075u, 62259u, 64444u,
74679
  1092u, 3277u, 5461u, 7646u, 9830u, 12015u, 14199u, 16384u,
74680
};
74681
74682
static const uint16_t
74683
WUFFS_THUMBHASH__FROM_4_BITS_TO_PLUS_MINUS_1_25[16] WUFFS_BASE__POTENTIALLY_UNUSED = {
74684
  45056u, 47787u, 50517u, 53248u, 55979u, 58709u, 61440u, 64171u,
74685
  1365u, 4096u, 6827u, 9557u, 12288u, 15019u, 17749u, 20480u,
74686
};
74687
74688
static const uint16_t
74689
WUFFS_THUMBHASH__COSINES[159][6] WUFFS_BASE__POTENTIALLY_UNUSED = {
74690
  {
74691
    16281u, 15973u, 15465u, 14761u, 13873u, 12810u,
74692
  }, {
74693
    15465u, 12810u, 8717u, 3646u, 63702u, 58427u,
74694
  }, {
74695
    13873u, 7109u, 63702u, 55321u, 50071u, 49563u,
74696
  }, {
74697
    11585u, 0u, 53951u, 49152u, 53951u, 0u,
74698
  }, {
74699
    8717u, 58427u, 49255u, 55321u, 5411u, 15973u,
74700
  }, {
74701
    5411u, 52726u, 51663u, 3646u, 16281u, 7109u,
74702
  }, {
74703
    1834u, 49563u, 60125u, 14761u, 8717u, 52726u,
74704
  }, {
74705
    63702u, 49563u, 5411u, 14761u, 56819u, 52726u,
74706
  },
74707
  {
74708
    60125u, 52726u, 13873u, 3646u, 49255u, 7109u,
74709
  }, {
74710
    56819u, 58427u, 16281u, 55321u, 60125u, 15973u,
74711
  }, {
74712
    53951u, 0u, 11585u, 49152u, 11585u, 0u,
74713
  }, {
74714
    51663u, 7109u, 1834u, 55321u, 15465u, 49563u,
74715
  }, {
74716
    50071u, 12810u, 56819u, 3646u, 1834u, 58427u,
74717
  }, {
74718
    49255u, 15973u, 50071u, 14761u, 51663u, 12810u,
74719
  }, {
74720
    16322u, 16135u, 15826u, 15396u, 14849u, 14189u,
74721
  }, {
74722
    15826u, 14189u, 11585u, 8192u, 4240u, 0u,
74723
  },
74724
  {
74725
    14849u, 10531u, 4240u, 62691u, 56139u, 51347u,
74726
  }, {
74727
    13421u, 5604u, 61296u, 52985u, 49214u, 51347u,
74728
  }, {
74729
    11585u, 0u, 53951u, 49152u, 53951u, 0u,
74730
  }, {
74731
    9397u, 59932u, 49710u, 52985u, 1428u, 14189u,
74732
  }, {
74733
    6924u, 55005u, 49710u, 62691u, 13421u, 14189u,
74734
  }, {
74735
    4240u, 51347u, 53951u, 8192u, 15826u, 0u,
74736
  }, {
74737
    1428u, 49401u, 61296u, 15396u, 6924u, 51347u,
74738
  }, {
74739
    64108u, 49401u, 4240u, 15396u, 58612u, 51347u,
74740
  },
74741
  {
74742
    61296u, 51347u, 11585u, 8192u, 49710u, 0u,
74743
  }, {
74744
    58612u, 55005u, 15826u, 62691u, 52115u, 14189u,
74745
  }, {
74746
    56139u, 59932u, 15826u, 52985u, 64108u, 14189u,
74747
  }, {
74748
    53951u, 0u, 11585u, 49152u, 11585u, 0u,
74749
  }, {
74750
    52115u, 5604u, 4240u, 52985u, 16322u, 51347u,
74751
  }, {
74752
    50687u, 10531u, 61296u, 62691u, 9397u, 51347u,
74753
  }, {
74754
    49710u, 14189u, 53951u, 8192u, 61296u, 0u,
74755
  }, {
74756
    49214u, 16135u, 49710u, 15396u, 50687u, 14189u,
74757
  },
74758
  {
74759
    16328u, 16161u, 15883u, 15496u, 15004u, 14409u,
74760
  }, {
74761
    15883u, 14409u, 12054u, 8961u, 5320u, 1353u,
74762
  }, {
74763
    15004u, 11097u, 5320u, 64183u, 57738u, 52607u,
74764
  }, {
74765
    13716u, 6581u, 62839u, 54439u, 49653u, 50040u,
74766
  }, {
74767
    12054u, 1353u, 55473u, 49375u, 51820u, 61514u,
74768
  }, {
74769
    10063u, 61514u, 50532u, 51127u, 62839u, 11097u,
74770
  }, {
74771
    7798u, 56575u, 49208u, 58955u, 10063u, 16161u,
74772
  }, {
74773
    5320u, 52607u, 51820u, 4022u, 16328u, 6581u,
74774
  },
74775
  {
74776
    2697u, 50040u, 57738u, 12929u, 12054u, 56575u,
74777
  }, {
74778
    0u, 49152u, 0u, 16384u, 0u, 49152u,
74779
  }, {
74780
    62839u, 50040u, 7798u, 12929u, 53482u, 56575u,
74781
  }, {
74782
    60216u, 52607u, 13716u, 4022u, 49208u, 6581u,
74783
  }, {
74784
    57738u, 56575u, 16328u, 58955u, 55473u, 16161u,
74785
  }, {
74786
    55473u, 61514u, 15004u, 51127u, 2697u, 11097u,
74787
  }, {
74788
    53482u, 1353u, 10063u, 49375u, 13716u, 61514u,
74789
  }, {
74790
    51820u, 6581u, 2697u, 54439u, 15883u, 50040u,
74791
  },
74792
  {
74793
    50532u, 11097u, 60216u, 64183u, 7798u, 52607u,
74794
  }, {
74795
    49653u, 14409u, 53482u, 8961u, 60216u, 1353u,
74796
  }, {
74797
    49208u, 16161u, 49653u, 15496u, 50532u, 14409u,
74798
  }, {
74799
    16346u, 16231u, 16041u, 15776u, 15438u, 15028u,
74800
  }, {
74801
    16041u, 15028u, 13385u, 11183u, 8513u, 5487u,
74802
  }, {
74803
    15438u, 12709u, 8513u, 3333u, 63305u, 57998u,
74804
  }, {
74805
    14547u, 9448u, 2231u, 60049u, 53562u, 49760u,
74806
  }, {
74807
    13385u, 5487u, 61116u, 52827u, 49190u, 51537u,
74808
  },
74809
  {
74810
    11974u, 1118u, 55196u, 49305u, 52151u, 62203u,
74811
  }, {
74812
    10340u, 62203u, 50989u, 50508u, 61116u, 9448u,
74813
  }, {
74814
    8513u, 57998u, 49190u, 56088u, 6527u, 16231u,
74815
  }, {
74816
    6527u, 54353u, 50098u, 64418u, 14547u, 12709u,
74817
  }, {
74818
    4420u, 51537u, 53562u, 7538u, 16041u, 1118u,
74819
  }, {
74820
    2231u, 49760u, 59009u, 13999u, 10340u, 54353u,
74821
  }, {
74822
    0u, 49152u, 0u, 16384u, 0u, 49152u,
74823
  }, {
74824
    63305u, 49760u, 6527u, 13999u, 55196u, 54353u,
74825
  },
74826
  {
74827
    61116u, 51537u, 11974u, 7538u, 49495u, 1118u,
74828
  }, {
74829
    59009u, 54353u, 15438u, 64418u, 50989u, 12709u,
74830
  }, {
74831
    57023u, 57998u, 16346u, 56088u, 59009u, 16231u,
74832
  }, {
74833
    55196u, 62203u, 14547u, 50508u, 4420u, 9448u,
74834
  }, {
74835
    53562u, 1118u, 10340u, 49305u, 13385u, 62203u,
74836
  }, {
74837
    52151u, 5487u, 4420u, 52827u, 16346u, 51537u,
74838
  }, {
74839
    50989u, 9448u, 63305u, 60049u, 11974u, 49760u,
74840
  }, {
74841
    50098u, 12709u, 57023u, 3333u, 2231u, 57998u,
74842
  },
74843
  {
74844
    49495u, 15028u, 52151u, 11183u, 57023u, 5487u,
74845
  }, {
74846
    49190u, 16231u, 49495u, 15776u, 50098u, 15028u,
74847
  }, {
74848
    16354u, 16265u, 16116u, 15908u, 15642u, 15319u,
74849
  }, {
74850
    16116u, 15319u, 14021u, 12264u, 10104u, 7614u,
74851
  }, {
74852
    15642u, 13484u, 10104u, 5810u, 989u, 61615u,
74853
  }, {
74854
    14941u, 10865u, 4874u, 63561u, 57060u, 52052u,
74855
  }, {
74856
    14021u, 7614u, 64547u, 56229u, 50595u, 49271u,
74857
  }, {
74858
    12897u, 3921u, 58812u, 51029u, 49420u, 54671u,
74859
  },
74860
  {
74861
    11585u, 0u, 53951u, 49152u, 53951u, 0u,
74862
  }, {
74863
    10104u, 61615u, 50595u, 51029u, 62583u, 10865u,
74864
  }, {
74865
    8476u, 57922u, 49182u, 56229u, 6724u, 16265u,
74866
  }, {
74867
    6724u, 54671u, 49894u, 63561u, 14021u, 13484u,
74868
  }, {
74869
    4874u, 52052u, 52639u, 5810u, 16354u, 3921u,
74870
  }, {
74871
    2953u, 50217u, 57060u, 12264u, 12897u, 57922u,
74872
  }, {
74873
    989u, 49271u, 62583u, 15908u, 4874u, 50217u,
74874
  }, {
74875
    64547u, 49271u, 2953u, 15908u, 60662u, 50217u,
74876
  },
74877
  {
74878
    62583u, 50217u, 8476u, 12264u, 52639u, 57922u,
74879
  }, {
74880
    60662u, 52052u, 12897u, 5810u, 49182u, 3921u,
74881
  }, {
74882
    58812u, 54671u, 15642u, 63561u, 51515u, 13484u,
74883
  }, {
74884
    57060u, 57922u, 16354u, 56229u, 58812u, 16265u,
74885
  }, {
74886
    55432u, 61615u, 14941u, 51029u, 2953u, 10865u,
74887
  }, {
74888
    53951u, 0u, 11585u, 49152u, 11585u, 0u,
74889
  }, {
74890
    52639u, 3921u, 6724u, 51029u, 16116u, 54671u,
74891
  }, {
74892
    51515u, 7614u, 989u, 56229u, 14941u, 49271u,
74893
  },
74894
  {
74895
    50595u, 10865u, 60662u, 63561u, 8476u, 52052u,
74896
  }, {
74897
    49894u, 13484u, 55432u, 5810u, 64547u, 61615u,
74898
  }, {
74899
    49420u, 15319u, 51515u, 12264u, 55432u, 7614u,
74900
  }, {
74901
    49182u, 16265u, 49420u, 15908u, 49894u, 15319u,
74902
  }, {
74903
    16356u, 16273u, 16135u, 15942u, 15696u, 15396u,
74904
  }, {
74905
    16135u, 15396u, 14189u, 12551u, 10531u, 8192u,
74906
  }, {
74907
    15696u, 13689u, 10531u, 6489u, 1902u, 62691u,
74908
  }, {
74909
    15044u, 11243u, 5604u, 64583u, 58183u, 52985u,
74910
  },
74911
  {
74912
    14189u, 8192u, 0u, 57344u, 51347u, 49152u,
74913
  }, {
74914
    13142u, 4699u, 59932u, 51847u, 49180u, 52985u,
74915
  }, {
74916
    11917u, 953u, 55005u, 49263u, 52394u, 62691u,
74917
  }, {
74918
    10531u, 62691u, 51347u, 50140u, 59932u, 8192u,
74919
  }, {
74920
    9003u, 59047u, 49401u, 54293u, 3778u, 15396u,
74921
  }, {
74922
    7353u, 55752u, 49401u, 60837u, 11917u, 15396u,
74923
  }, {
74924
    5604u, 52985u, 51347u, 2845u, 16135u, 8192u,
74925
  }, {
74926
    3778u, 50895u, 55005u, 9784u, 15044u, 62691u,
74927
  },
74928
  {
74929
    1902u, 49594u, 59932u, 14641u, 9003u, 52985u,
74930
  }, {
74931
    0u, 49152u, 0u, 16384u, 0u, 49152u,
74932
  }, {
74933
    63634u, 49594u, 5604u, 14641u, 56533u, 52985u,
74934
  }, {
74935
    61758u, 50895u, 10531u, 9784u, 50492u, 62691u,
74936
  }, {
74937
    59932u, 52985u, 14189u, 2845u, 49401u, 8192u,
74938
  }, {
74939
    58183u, 55752u, 16135u, 60837u, 53619u, 15396u,
74940
  }, {
74941
    56533u, 59047u, 16135u, 54293u, 61758u, 15396u,
74942
  }, {
74943
    55005u, 62691u, 14189u, 50140u, 5604u, 8192u,
74944
  },
74945
  {
74946
    53619u, 953u, 10531u, 49263u, 13142u, 62691u,
74947
  }, {
74948
    52394u, 4699u, 5604u, 51847u, 16356u, 52985u,
74949
  }, {
74950
    51347u, 8192u, 0u, 57344u, 14189u, 49152u,
74951
  }, {
74952
    50492u, 11243u, 59932u, 64583u, 7353u, 52985u,
74953
  }, {
74954
    49840u, 13689u, 55005u, 6489u, 63634u, 62691u,
74955
  }, {
74956
    49401u, 15396u, 51347u, 12551u, 55005u, 8192u,
74957
  }, {
74958
    49180u, 16273u, 49401u, 15942u, 49840u, 15396u,
74959
  }, {
74960
    16364u, 16305u, 16207u, 16069u, 15893u, 15679u,
74961
  },
74962
  {
74963
    16207u, 15679u, 14811u, 13623u, 12140u, 10394u,
74964
  }, {
74965
    15893u, 14449u, 12140u, 9102u, 5520u, 1606u,
74966
  }, {
74967
    15426u, 12665u, 8423u, 3196u, 63132u, 57813u,
74968
  }, {
74969
    14811u, 10394u, 3981u, 62340u, 55776u, 51087u,
74970
  }, {
74971
    14053u, 7723u, 64732u, 56434u, 50725u, 49231u,
74972
  }, {
74973
    13160u, 4756u, 60016u, 51913u, 49172u, 52871u,
74974
  }, {
74975
    12140u, 1606u, 55776u, 49467u, 51483u, 60780u,
74976
  }, {
74977
    11003u, 63930u, 52376u, 49467u, 57113u, 4756u,
74978
  },
74979
  {
74980
    9760u, 60780u, 50110u, 51913u, 64732u, 12665u,
74981
  }, {
74982
    8423u, 57813u, 49172u, 56434u, 7005u, 16305u,
74983
  }, {
74984
    7005u, 55142u, 49643u, 62340u, 13160u, 14449u,
74985
  }, {
74986
    5520u, 52871u, 51483u, 3196u, 16207u, 7723u,
74987
  }, {
74988
    3981u, 51087u, 54533u, 9102u, 15426u, 63930u,
74989
  }, {
74990
    2404u, 49857u, 58531u, 13623u, 11003u, 55142u,
74991
  }, {
74992
    804u, 49231u, 63132u, 16069u, 3981u, 49857u,
74993
  }, {
74994
    64732u, 49231u, 2404u, 16069u, 61555u, 49857u,
74995
  },
74996
  {
74997
    63132u, 49857u, 7005u, 13623u, 54533u, 55142u,
74998
  }, {
74999
    61555u, 51087u, 11003u, 9102u, 50110u, 63930u,
75000
  }, {
75001
    60016u, 52871u, 14053u, 3196u, 49329u, 7723u,
75002
  }, {
75003
    58531u, 55142u, 15893u, 62340u, 52376u, 14449u,
75004
  }, {
75005
    57113u, 57813u, 16364u, 56434u, 58531u, 16305u,
75006
  }, {
75007
    55776u, 60780u, 15426u, 51913u, 804u, 12665u,
75008
  }, {
75009
    54533u, 63930u, 13160u, 49467u, 8423u, 4756u,
75010
  }, {
75011
    53396u, 1606u, 9760u, 49467u, 14053u, 60780u,
75012
  },
75013
  {
75014
    52376u, 4756u, 5520u, 51913u, 16364u, 52871u,
75015
  }, {
75016
    51483u, 7723u, 804u, 56434u, 14811u, 49231u,
75017
  }, {
75018
    50725u, 10394u, 61555u, 62340u, 9760u, 51087u,
75019
  }, {
75020
    50110u, 12665u, 57113u, 3196u, 2404u, 57813u,
75021
  }, {
75022
    49643u, 14449u, 53396u, 9102u, 60016u, 1606u,
75023
  }, {
75024
    49329u, 15679u, 50725u, 13623u, 53396u, 10394u,
75025
  }, {
75026
    49172u, 16305u, 49329u, 16069u, 49643u, 15679u,
75027
  },
75028
};
75029
75030
// ---------------- Private Initializer Prototypes
75031
75032
// ---------------- Private Function Prototypes
75033
75034
WUFFS_BASE__GENERATED_C_CODE
75035
static wuffs_base__status
75036
wuffs_thumbhash__decoder__do_decode_image_config(
75037
    wuffs_thumbhash__decoder* self,
75038
    wuffs_base__image_config* a_dst,
75039
    wuffs_base__io_buffer* a_src);
75040
75041
WUFFS_BASE__GENERATED_C_CODE
75042
static wuffs_base__status
75043
wuffs_thumbhash__decoder__do_decode_frame_config(
75044
    wuffs_thumbhash__decoder* self,
75045
    wuffs_base__frame_config* a_dst,
75046
    wuffs_base__io_buffer* a_src);
75047
75048
WUFFS_BASE__GENERATED_C_CODE
75049
static wuffs_base__status
75050
wuffs_thumbhash__decoder__do_decode_frame(
75051
    wuffs_thumbhash__decoder* self,
75052
    wuffs_base__pixel_buffer* a_dst,
75053
    wuffs_base__io_buffer* a_src,
75054
    wuffs_base__pixel_blend a_blend,
75055
    wuffs_base__slice_u8 a_workbuf,
75056
    wuffs_base__decode_frame_options* a_opts);
75057
75058
WUFFS_BASE__GENERATED_C_CODE
75059
static wuffs_base__status
75060
wuffs_thumbhash__decoder__from_src_to_coeffs(
75061
    wuffs_thumbhash__decoder* self,
75062
    wuffs_base__io_buffer* a_src);
75063
75064
WUFFS_BASE__GENERATED_C_CODE
75065
static wuffs_base__empty_struct
75066
wuffs_thumbhash__decoder__from_coeffs_to_pixels(
75067
    wuffs_thumbhash__decoder* self);
75068
75069
WUFFS_BASE__GENERATED_C_CODE
75070
static wuffs_base__status
75071
wuffs_thumbhash__decoder__from_pixels_to_dst(
75072
    wuffs_thumbhash__decoder* self,
75073
    wuffs_base__pixel_buffer* a_dst);
75074
75075
// ---------------- VTables
75076
75077
const wuffs_base__image_decoder__func_ptrs
75078
wuffs_thumbhash__decoder__func_ptrs_for__wuffs_base__image_decoder = {
75079
  (wuffs_base__status(*)(void*,
75080
      wuffs_base__pixel_buffer*,
75081
      wuffs_base__io_buffer*,
75082
      wuffs_base__pixel_blend,
75083
      wuffs_base__slice_u8,
75084
      wuffs_base__decode_frame_options*))(&wuffs_thumbhash__decoder__decode_frame),
75085
  (wuffs_base__status(*)(void*,
75086
      wuffs_base__frame_config*,
75087
      wuffs_base__io_buffer*))(&wuffs_thumbhash__decoder__decode_frame_config),
75088
  (wuffs_base__status(*)(void*,
75089
      wuffs_base__image_config*,
75090
      wuffs_base__io_buffer*))(&wuffs_thumbhash__decoder__decode_image_config),
75091
  (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_thumbhash__decoder__frame_dirty_rect),
75092
  (uint64_t(*)(const void*,
75093
      uint32_t))(&wuffs_thumbhash__decoder__get_quirk),
75094
  (uint32_t(*)(const void*))(&wuffs_thumbhash__decoder__num_animation_loops),
75095
  (uint64_t(*)(const void*))(&wuffs_thumbhash__decoder__num_decoded_frame_configs),
75096
  (uint64_t(*)(const void*))(&wuffs_thumbhash__decoder__num_decoded_frames),
75097
  (wuffs_base__status(*)(void*,
75098
      uint64_t,
75099
      uint64_t))(&wuffs_thumbhash__decoder__restart_frame),
75100
  (wuffs_base__status(*)(void*,
75101
      uint32_t,
75102
      uint64_t))(&wuffs_thumbhash__decoder__set_quirk),
75103
  (wuffs_base__empty_struct(*)(void*,
75104
      uint32_t,
75105
      bool))(&wuffs_thumbhash__decoder__set_report_metadata),
75106
  (wuffs_base__status(*)(void*,
75107
      wuffs_base__io_buffer*,
75108
      wuffs_base__more_information*,
75109
      wuffs_base__io_buffer*))(&wuffs_thumbhash__decoder__tell_me_more),
75110
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_thumbhash__decoder__workbuf_len),
75111
};
75112
75113
// ---------------- Initializer Implementations
75114
75115
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
75116
wuffs_thumbhash__decoder__initialize(
75117
    wuffs_thumbhash__decoder* self,
75118
    size_t sizeof_star_self,
75119
    uint64_t wuffs_version,
75120
    uint32_t options){
75121
  if (!self) {
75122
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
75123
  }
75124
  if (sizeof(*self) != sizeof_star_self) {
75125
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
75126
  }
75127
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
75128
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
75129
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
75130
  }
75131
75132
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
75133
    // The whole point of this if-check is to detect an uninitialized *self.
75134
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
75135
#if !defined(__clang__) && defined(__GNUC__)
75136
#pragma GCC diagnostic push
75137
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
75138
#endif
75139
    if (self->private_impl.magic != 0) {
75140
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
75141
    }
75142
#if !defined(__clang__) && defined(__GNUC__)
75143
#pragma GCC diagnostic pop
75144
#endif
75145
  } else {
75146
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
75147
      memset(self, 0, sizeof(*self));
75148
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
75149
    } else {
75150
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
75151
    }
75152
  }
75153
75154
  self->private_impl.magic = WUFFS_BASE__MAGIC;
75155
  self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name =
75156
      wuffs_base__image_decoder__vtable_name;
75157
  self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers =
75158
      (const void*)(&wuffs_thumbhash__decoder__func_ptrs_for__wuffs_base__image_decoder);
75159
  return wuffs_base__make_status(NULL);
75160
}
75161
75162
wuffs_thumbhash__decoder*
75163
wuffs_thumbhash__decoder__alloc(void) {
75164
  wuffs_thumbhash__decoder* x =
75165
      (wuffs_thumbhash__decoder*)(calloc(1, sizeof(wuffs_thumbhash__decoder)));
75166
  if (!x) {
75167
    return NULL;
75168
  }
75169
  if (wuffs_thumbhash__decoder__initialize(
75170
      x, sizeof(wuffs_thumbhash__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
75171
    free(x);
75172
    return NULL;
75173
  }
75174
  return x;
75175
}
75176
75177
size_t
75178
sizeof__wuffs_thumbhash__decoder(void) {
75179
  return sizeof(wuffs_thumbhash__decoder);
75180
}
75181
75182
// ---------------- Function Implementations
75183
75184
// -------- func thumbhash.decoder.get_quirk
75185
75186
WUFFS_BASE__GENERATED_C_CODE
75187
WUFFS_BASE__MAYBE_STATIC uint64_t
75188
wuffs_thumbhash__decoder__get_quirk(
75189
    const wuffs_thumbhash__decoder* self,
75190
    uint32_t a_key) {
75191
  if (!self) {
75192
    return 0;
75193
  }
75194
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
75195
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
75196
    return 0;
75197
  }
75198
75199
  if ((a_key == 1712283648u) && self->private_impl.f_quirk_just_raw_thumbhash) {
75200
    return 1u;
75201
  }
75202
  return 0u;
75203
}
75204
75205
// -------- func thumbhash.decoder.set_quirk
75206
75207
WUFFS_BASE__GENERATED_C_CODE
75208
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
75209
wuffs_thumbhash__decoder__set_quirk(
75210
    wuffs_thumbhash__decoder* self,
75211
    uint32_t a_key,
75212
    uint64_t a_value) {
75213
  if (!self) {
75214
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
75215
  }
75216
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
75217
    return wuffs_base__make_status(
75218
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
75219
        ? wuffs_base__error__disabled_by_previous_error
75220
        : wuffs_base__error__initialize_not_called);
75221
  }
75222
75223
  if (a_key == 1712283648u) {
75224
    self->private_impl.f_quirk_just_raw_thumbhash = (a_value > 0u);
75225
    return wuffs_base__make_status(NULL);
75226
  }
75227
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
75228
}
75229
75230
// -------- func thumbhash.decoder.decode_image_config
75231
75232
WUFFS_BASE__GENERATED_C_CODE
75233
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
75234
wuffs_thumbhash__decoder__decode_image_config(
75235
    wuffs_thumbhash__decoder* self,
75236
    wuffs_base__image_config* a_dst,
75237
    wuffs_base__io_buffer* a_src) {
75238
  if (!self) {
75239
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
75240
  }
75241
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
75242
    return wuffs_base__make_status(
75243
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
75244
        ? wuffs_base__error__disabled_by_previous_error
75245
        : wuffs_base__error__initialize_not_called);
75246
  }
75247
  if (!a_src) {
75248
    self->private_impl.magic = WUFFS_BASE__DISABLED;
75249
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
75250
  }
75251
  if ((self->private_impl.active_coroutine != 0) &&
75252
      (self->private_impl.active_coroutine != 1)) {
75253
    self->private_impl.magic = WUFFS_BASE__DISABLED;
75254
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
75255
  }
75256
  self->private_impl.active_coroutine = 0;
75257
  wuffs_base__status status = wuffs_base__make_status(NULL);
75258
75259
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
75260
75261
  uint32_t coro_susp_point = self->private_impl.p_decode_image_config;
75262
  switch (coro_susp_point) {
75263
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
75264
75265
    while (true) {
75266
      {
75267
        wuffs_base__status t_0 = wuffs_thumbhash__decoder__do_decode_image_config(self, a_dst, a_src);
75268
        v_status = t_0;
75269
      }
75270
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
75271
        status = wuffs_base__make_status(wuffs_thumbhash__error__truncated_input);
75272
        goto exit;
75273
      }
75274
      status = v_status;
75275
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
75276
    }
75277
75278
    ok:
75279
    self->private_impl.p_decode_image_config = 0;
75280
    goto exit;
75281
  }
75282
75283
  goto suspend;
75284
  suspend:
75285
  self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
75286
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
75287
75288
  goto exit;
75289
  exit:
75290
  if (wuffs_base__status__is_error(&status)) {
75291
    self->private_impl.magic = WUFFS_BASE__DISABLED;
75292
  }
75293
  return status;
75294
}
75295
75296
// -------- func thumbhash.decoder.do_decode_image_config
75297
75298
WUFFS_BASE__GENERATED_C_CODE
75299
static wuffs_base__status
75300
wuffs_thumbhash__decoder__do_decode_image_config(
75301
    wuffs_thumbhash__decoder* self,
75302
    wuffs_base__image_config* a_dst,
75303
    wuffs_base__io_buffer* a_src) {
75304
  wuffs_base__status status = wuffs_base__make_status(NULL);
75305
75306
  uint32_t v_c32 = 0;
75307
  uint8_t v_swap = 0;
75308
75309
  const uint8_t* iop_a_src = NULL;
75310
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
75311
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
75312
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
75313
  if (a_src && a_src->data.ptr) {
75314
    io0_a_src = a_src->data.ptr;
75315
    io1_a_src = io0_a_src + a_src->meta.ri;
75316
    iop_a_src = io1_a_src;
75317
    io2_a_src = io0_a_src + a_src->meta.wi;
75318
  }
75319
75320
  uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config;
75321
  switch (coro_susp_point) {
75322
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
75323
75324
    if (self->private_impl.f_call_sequence != 0u) {
75325
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
75326
      goto exit;
75327
    }
75328
    if ( ! self->private_impl.f_quirk_just_raw_thumbhash) {
75329
      {
75330
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
75331
        uint32_t t_0;
75332
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) {
75333
          t_0 = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src)));
75334
          iop_a_src += 3;
75335
        } else {
75336
          self->private_data.s_do_decode_image_config.scratch = 0;
75337
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
75338
          while (true) {
75339
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
75340
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
75341
              goto suspend;
75342
            }
75343
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
75344
            uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
75345
            *scratch <<= 8;
75346
            *scratch >>= 8;
75347
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
75348
            if (num_bits_0 == 16) {
75349
              t_0 = ((uint32_t)(*scratch));
75350
              break;
75351
            }
75352
            num_bits_0 += 8u;
75353
            *scratch |= ((uint64_t)(num_bits_0)) << 56;
75354
          }
75355
        }
75356
        v_c32 = t_0;
75357
      }
75358
      if (v_c32 != 16694979u) {
75359
        status = wuffs_base__make_status(wuffs_thumbhash__error__bad_header);
75360
        goto exit;
75361
      }
75362
    }
75363
    {
75364
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
75365
      uint32_t t_1;
75366
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) {
75367
        t_1 = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src)));
75368
        iop_a_src += 3;
75369
      } else {
75370
        self->private_data.s_do_decode_image_config.scratch = 0;
75371
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
75372
        while (true) {
75373
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
75374
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
75375
            goto suspend;
75376
          }
75377
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
75378
          uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
75379
          *scratch <<= 8;
75380
          *scratch >>= 8;
75381
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
75382
          if (num_bits_1 == 16) {
75383
            t_1 = ((uint32_t)(*scratch));
75384
            break;
75385
          }
75386
          num_bits_1 += 8u;
75387
          *scratch |= ((uint64_t)(num_bits_1)) << 56;
75388
        }
75389
      }
75390
      v_c32 = t_1;
75391
    }
75392
    self->private_impl.f_l_dc = (((uint64_t)(((v_c32 >> 0u) & 63u))) * 136339441844224u);
75393
    self->private_impl.f_p_dc = ((uint64_t)((((uint64_t)(((v_c32 >> 6u) & 63u))) * 272678883688448u) - 8589384836186112u));
75394
    self->private_impl.f_q_dc = ((uint64_t)((((uint64_t)(((v_c32 >> 12u) & 63u))) * 272678883688448u) - 8589384836186112u));
75395
    self->private_impl.f_l_scale = ((uint8_t)(((v_c32 >> 18u) & 31u)));
75396
    self->private_impl.f_has_alpha = ((uint8_t)(((v_c32 >> 23u) & 1u)));
75397
    {
75398
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
75399
      uint32_t t_2;
75400
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
75401
        t_2 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
75402
        iop_a_src += 2;
75403
      } else {
75404
        self->private_data.s_do_decode_image_config.scratch = 0;
75405
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
75406
        while (true) {
75407
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
75408
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
75409
            goto suspend;
75410
          }
75411
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
75412
          uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56));
75413
          *scratch <<= 8;
75414
          *scratch >>= 8;
75415
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2;
75416
          if (num_bits_2 == 8) {
75417
            t_2 = ((uint32_t)(*scratch));
75418
            break;
75419
          }
75420
          num_bits_2 += 8u;
75421
          *scratch |= ((uint64_t)(num_bits_2)) << 56;
75422
        }
75423
      }
75424
      v_c32 = t_2;
75425
    }
75426
    self->private_impl.f_l_count = ((uint8_t)(((v_c32 >> 0u) & 7u)));
75427
    self->private_impl.f_p_scale = ((uint8_t)(((v_c32 >> 3u) & 63u)));
75428
    self->private_impl.f_q_scale = ((uint8_t)(((v_c32 >> 9u) & 63u)));
75429
    self->private_impl.f_is_landscape = ((uint8_t)(((v_c32 >> 15u) & 1u)));
75430
    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));
75431
    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));
75432
    if (self->private_impl.f_is_landscape != 0u) {
75433
      v_swap = self->private_impl.f_w_dimension_code;
75434
      self->private_impl.f_w_dimension_code = self->private_impl.f_h_dimension_code;
75435
      self->private_impl.f_h_dimension_code = v_swap;
75436
    }
75437
    if (self->private_impl.f_is_landscape != 0u) {
75438
      self->private_impl.f_lx = ((uint32_t)(((uint8_t)(7u - ((uint8_t)(2u * self->private_impl.f_has_alpha))))));
75439
      self->private_impl.f_ly = ((uint32_t)(wuffs_base__u8__max(self->private_impl.f_l_count, 3u)));
75440
    } else {
75441
      self->private_impl.f_lx = ((uint32_t)(wuffs_base__u8__max(self->private_impl.f_l_count, 3u)));
75442
      self->private_impl.f_ly = ((uint32_t)(((uint8_t)(7u - ((uint8_t)(2u * self->private_impl.f_has_alpha))))));
75443
    }
75444
    self->private_impl.f_frame_config_io_position = 8u;
75445
    if (self->private_impl.f_has_alpha != 0u) {
75446
      {
75447
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
75448
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
75449
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
75450
          goto suspend;
75451
        }
75452
        uint32_t t_3 = *iop_a_src++;
75453
        v_c32 = t_3;
75454
      }
75455
      self->private_impl.f_a_dc = (((uint64_t)(((v_c32 >> 0u) & 15u))) << 42u);
75456
      self->private_impl.f_a_scale = ((uint8_t)(((v_c32 >> 4u) & 15u)));
75457
      self->private_impl.f_frame_config_io_position = 9u;
75458
    }
75459
    if (self->private_impl.f_quirk_just_raw_thumbhash) {
75460
#if defined(__GNUC__)
75461
#pragma GCC diagnostic push
75462
#pragma GCC diagnostic ignored "-Wconversion"
75463
#endif
75464
      self->private_impl.f_frame_config_io_position -= 3u;
75465
#if defined(__GNUC__)
75466
#pragma GCC diagnostic pop
75467
#endif
75468
    }
75469
    self->private_impl.f_pixfmt = 2415954056u;
75470
    if (self->private_impl.f_has_alpha != 0u) {
75471
      self->private_impl.f_pixfmt = 2164295816u;
75472
    }
75473
    if (a_dst != NULL) {
75474
      wuffs_base__image_config__set(
75475
          a_dst,
75476
          self->private_impl.f_pixfmt,
75477
          0u,
75478
          ((uint32_t)(WUFFS_THUMBHASH__DIMENSIONS_FROM_DIMENSION_CODES[self->private_impl.f_w_dimension_code])),
75479
          ((uint32_t)(WUFFS_THUMBHASH__DIMENSIONS_FROM_DIMENSION_CODES[self->private_impl.f_h_dimension_code])),
75480
          ((uint64_t)(self->private_impl.f_frame_config_io_position)),
75481
          (self->private_impl.f_has_alpha == 0u));
75482
    }
75483
    self->private_impl.f_call_sequence = 32u;
75484
75485
    goto ok;
75486
    ok:
75487
    self->private_impl.p_do_decode_image_config = 0;
75488
    goto exit;
75489
  }
75490
75491
  goto suspend;
75492
  suspend:
75493
  self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
75494
75495
  goto exit;
75496
  exit:
75497
  if (a_src && a_src->data.ptr) {
75498
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
75499
  }
75500
75501
  return status;
75502
}
75503
75504
// -------- func thumbhash.decoder.decode_frame_config
75505
75506
WUFFS_BASE__GENERATED_C_CODE
75507
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
75508
wuffs_thumbhash__decoder__decode_frame_config(
75509
    wuffs_thumbhash__decoder* self,
75510
    wuffs_base__frame_config* a_dst,
75511
    wuffs_base__io_buffer* a_src) {
75512
  if (!self) {
75513
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
75514
  }
75515
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
75516
    return wuffs_base__make_status(
75517
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
75518
        ? wuffs_base__error__disabled_by_previous_error
75519
        : wuffs_base__error__initialize_not_called);
75520
  }
75521
  if (!a_src) {
75522
    self->private_impl.magic = WUFFS_BASE__DISABLED;
75523
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
75524
  }
75525
  if ((self->private_impl.active_coroutine != 0) &&
75526
      (self->private_impl.active_coroutine != 2)) {
75527
    self->private_impl.magic = WUFFS_BASE__DISABLED;
75528
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
75529
  }
75530
  self->private_impl.active_coroutine = 0;
75531
  wuffs_base__status status = wuffs_base__make_status(NULL);
75532
75533
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
75534
75535
  uint32_t coro_susp_point = self->private_impl.p_decode_frame_config;
75536
  switch (coro_susp_point) {
75537
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
75538
75539
    while (true) {
75540
      {
75541
        wuffs_base__status t_0 = wuffs_thumbhash__decoder__do_decode_frame_config(self, a_dst, a_src);
75542
        v_status = t_0;
75543
      }
75544
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
75545
        status = wuffs_base__make_status(wuffs_thumbhash__error__truncated_input);
75546
        goto exit;
75547
      }
75548
      status = v_status;
75549
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
75550
    }
75551
75552
    ok:
75553
    self->private_impl.p_decode_frame_config = 0;
75554
    goto exit;
75555
  }
75556
75557
  goto suspend;
75558
  suspend:
75559
  self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
75560
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0;
75561
75562
  goto exit;
75563
  exit:
75564
  if (wuffs_base__status__is_error(&status)) {
75565
    self->private_impl.magic = WUFFS_BASE__DISABLED;
75566
  }
75567
  return status;
75568
}
75569
75570
// -------- func thumbhash.decoder.do_decode_frame_config
75571
75572
WUFFS_BASE__GENERATED_C_CODE
75573
static wuffs_base__status
75574
wuffs_thumbhash__decoder__do_decode_frame_config(
75575
    wuffs_thumbhash__decoder* self,
75576
    wuffs_base__frame_config* a_dst,
75577
    wuffs_base__io_buffer* a_src) {
75578
  wuffs_base__status status = wuffs_base__make_status(NULL);
75579
75580
  wuffs_base__pixel_format v_pixfmt = {0};
75581
75582
  const uint8_t* iop_a_src = NULL;
75583
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
75584
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
75585
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
75586
  if (a_src && a_src->data.ptr) {
75587
    io0_a_src = a_src->data.ptr;
75588
    io1_a_src = io0_a_src + a_src->meta.ri;
75589
    iop_a_src = io1_a_src;
75590
    io2_a_src = io0_a_src + a_src->meta.wi;
75591
  }
75592
75593
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config;
75594
  switch (coro_susp_point) {
75595
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
75596
75597
    if (self->private_impl.f_call_sequence == 32u) {
75598
    } else if (self->private_impl.f_call_sequence < 32u) {
75599
      if (a_src) {
75600
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
75601
      }
75602
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
75603
      status = wuffs_thumbhash__decoder__do_decode_image_config(self, NULL, a_src);
75604
      if (a_src) {
75605
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
75606
      }
75607
      if (status.repr) {
75608
        goto suspend;
75609
      }
75610
    } else if (self->private_impl.f_call_sequence == 40u) {
75611
      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)))) {
75612
        status = wuffs_base__make_status(wuffs_base__error__bad_restart);
75613
        goto exit;
75614
      }
75615
    } else if (self->private_impl.f_call_sequence == 64u) {
75616
      self->private_impl.f_call_sequence = 96u;
75617
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
75618
      goto ok;
75619
    } else {
75620
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
75621
      goto ok;
75622
    }
75623
    if (a_dst != NULL) {
75624
      v_pixfmt = wuffs_base__utility__make_pixel_format(self->private_impl.f_pixfmt);
75625
      wuffs_base__frame_config__set(
75626
          a_dst,
75627
          wuffs_base__utility__make_rect_ie_u32(
75628
          0u,
75629
          0u,
75630
          ((uint32_t)(WUFFS_THUMBHASH__DIMENSIONS_FROM_DIMENSION_CODES[self->private_impl.f_w_dimension_code])),
75631
          ((uint32_t)(WUFFS_THUMBHASH__DIMENSIONS_FROM_DIMENSION_CODES[self->private_impl.f_h_dimension_code]))),
75632
          ((wuffs_base__flicks)(0u)),
75633
          0u,
75634
          ((uint64_t)(self->private_impl.f_frame_config_io_position)),
75635
          0u,
75636
          (self->private_impl.f_has_alpha == 0u),
75637
          false,
75638
          wuffs_base__pixel_format__default_background_color(&v_pixfmt));
75639
    }
75640
    self->private_impl.f_call_sequence = 64u;
75641
75642
    ok:
75643
    self->private_impl.p_do_decode_frame_config = 0;
75644
    goto exit;
75645
  }
75646
75647
  goto suspend;
75648
  suspend:
75649
  self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
75650
75651
  goto exit;
75652
  exit:
75653
  if (a_src && a_src->data.ptr) {
75654
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
75655
  }
75656
75657
  return status;
75658
}
75659
75660
// -------- func thumbhash.decoder.decode_frame
75661
75662
WUFFS_BASE__GENERATED_C_CODE
75663
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
75664
wuffs_thumbhash__decoder__decode_frame(
75665
    wuffs_thumbhash__decoder* self,
75666
    wuffs_base__pixel_buffer* a_dst,
75667
    wuffs_base__io_buffer* a_src,
75668
    wuffs_base__pixel_blend a_blend,
75669
    wuffs_base__slice_u8 a_workbuf,
75670
    wuffs_base__decode_frame_options* a_opts) {
75671
  if (!self) {
75672
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
75673
  }
75674
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
75675
    return wuffs_base__make_status(
75676
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
75677
        ? wuffs_base__error__disabled_by_previous_error
75678
        : wuffs_base__error__initialize_not_called);
75679
  }
75680
  if (!a_dst || !a_src) {
75681
    self->private_impl.magic = WUFFS_BASE__DISABLED;
75682
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
75683
  }
75684
  if ((self->private_impl.active_coroutine != 0) &&
75685
      (self->private_impl.active_coroutine != 3)) {
75686
    self->private_impl.magic = WUFFS_BASE__DISABLED;
75687
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
75688
  }
75689
  self->private_impl.active_coroutine = 0;
75690
  wuffs_base__status status = wuffs_base__make_status(NULL);
75691
75692
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
75693
75694
  uint32_t coro_susp_point = self->private_impl.p_decode_frame;
75695
  switch (coro_susp_point) {
75696
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
75697
75698
    while (true) {
75699
      {
75700
        wuffs_base__status t_0 = wuffs_thumbhash__decoder__do_decode_frame(self,
75701
            a_dst,
75702
            a_src,
75703
            a_blend,
75704
            a_workbuf,
75705
            a_opts);
75706
        v_status = t_0;
75707
      }
75708
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
75709
        status = wuffs_base__make_status(wuffs_thumbhash__error__truncated_input);
75710
        goto exit;
75711
      }
75712
      status = v_status;
75713
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
75714
    }
75715
75716
    ok:
75717
    self->private_impl.p_decode_frame = 0;
75718
    goto exit;
75719
  }
75720
75721
  goto suspend;
75722
  suspend:
75723
  self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
75724
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0;
75725
75726
  goto exit;
75727
  exit:
75728
  if (wuffs_base__status__is_error(&status)) {
75729
    self->private_impl.magic = WUFFS_BASE__DISABLED;
75730
  }
75731
  return status;
75732
}
75733
75734
// -------- func thumbhash.decoder.do_decode_frame
75735
75736
WUFFS_BASE__GENERATED_C_CODE
75737
static wuffs_base__status
75738
wuffs_thumbhash__decoder__do_decode_frame(
75739
    wuffs_thumbhash__decoder* self,
75740
    wuffs_base__pixel_buffer* a_dst,
75741
    wuffs_base__io_buffer* a_src,
75742
    wuffs_base__pixel_blend a_blend,
75743
    wuffs_base__slice_u8 a_workbuf,
75744
    wuffs_base__decode_frame_options* a_opts) {
75745
  wuffs_base__status status = wuffs_base__make_status(NULL);
75746
75747
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
75748
75749
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame;
75750
  switch (coro_susp_point) {
75751
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
75752
75753
    if (self->private_impl.f_call_sequence == 64u) {
75754
    } else if (self->private_impl.f_call_sequence < 64u) {
75755
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
75756
      status = wuffs_thumbhash__decoder__do_decode_frame_config(self, NULL, a_src);
75757
      if (status.repr) {
75758
        goto suspend;
75759
      }
75760
    } else {
75761
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
75762
      goto ok;
75763
    }
75764
    v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler,
75765
        wuffs_base__pixel_buffer__pixel_format(a_dst),
75766
        wuffs_base__pixel_buffer__palette(a_dst),
75767
        wuffs_base__utility__make_pixel_format(self->private_impl.f_pixfmt),
75768
        wuffs_base__utility__empty_slice_u8(),
75769
        a_blend);
75770
    if ( ! wuffs_base__status__is_ok(&v_status)) {
75771
      status = v_status;
75772
      if (wuffs_base__status__is_error(&status)) {
75773
        goto exit;
75774
      } else if (wuffs_base__status__is_suspension(&status)) {
75775
        status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
75776
        goto exit;
75777
      }
75778
      goto ok;
75779
    }
75780
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
75781
    status = wuffs_thumbhash__decoder__from_src_to_coeffs(self, a_src);
75782
    if (status.repr) {
75783
      goto suspend;
75784
    }
75785
    wuffs_thumbhash__decoder__from_coeffs_to_pixels(self);
75786
    v_status = wuffs_thumbhash__decoder__from_pixels_to_dst(self, a_dst);
75787
    if ( ! wuffs_base__status__is_ok(&v_status)) {
75788
      status = v_status;
75789
      if (wuffs_base__status__is_error(&status)) {
75790
        goto exit;
75791
      } else if (wuffs_base__status__is_suspension(&status)) {
75792
        status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
75793
        goto exit;
75794
      }
75795
      goto ok;
75796
    }
75797
    self->private_impl.f_call_sequence = 96u;
75798
75799
    ok:
75800
    self->private_impl.p_do_decode_frame = 0;
75801
    goto exit;
75802
  }
75803
75804
  goto suspend;
75805
  suspend:
75806
  self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
75807
75808
  goto exit;
75809
  exit:
75810
  return status;
75811
}
75812
75813
// -------- func thumbhash.decoder.from_src_to_coeffs
75814
75815
WUFFS_BASE__GENERATED_C_CODE
75816
static wuffs_base__status
75817
wuffs_thumbhash__decoder__from_src_to_coeffs(
75818
    wuffs_thumbhash__decoder* self,
75819
    wuffs_base__io_buffer* a_src) {
75820
  wuffs_base__status status = wuffs_base__make_status(NULL);
75821
75822
  uint8_t v_c8 = 0;
75823
  uint32_t v_cy = 0;
75824
  uint32_t v_cx = 0;
75825
  uint32_t v_i = 0;
75826
  bool v_has_bits = false;
75827
75828
  const uint8_t* iop_a_src = NULL;
75829
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
75830
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
75831
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
75832
  if (a_src && a_src->data.ptr) {
75833
    io0_a_src = a_src->data.ptr;
75834
    io1_a_src = io0_a_src + a_src->meta.ri;
75835
    iop_a_src = io1_a_src;
75836
    io2_a_src = io0_a_src + a_src->meta.wi;
75837
  }
75838
75839
  uint32_t coro_susp_point = self->private_impl.p_from_src_to_coeffs;
75840
  if (coro_susp_point) {
75841
    v_cy = self->private_data.s_from_src_to_coeffs.v_cy;
75842
    v_cx = self->private_data.s_from_src_to_coeffs.v_cx;
75843
    v_i = self->private_data.s_from_src_to_coeffs.v_i;
75844
    v_has_bits = self->private_data.s_from_src_to_coeffs.v_has_bits;
75845
  }
75846
  switch (coro_susp_point) {
75847
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
75848
75849
    v_i = 0u;
75850
    v_cy = 0u;
75851
    while (v_cy < self->private_impl.f_ly) {
75852
      v_cx = 0u;
75853
      if (v_cy == 0u) {
75854
        v_cx = 1u;
75855
      }
75856
      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))))) {
75857
        if (v_has_bits) {
75858
          v_has_bits = false;
75859
#if defined(__GNUC__)
75860
#pragma GCC diagnostic push
75861
#pragma GCC diagnostic ignored "-Wconversion"
75862
#endif
75863
          v_c8 >>= 4u;
75864
#if defined(__GNUC__)
75865
#pragma GCC diagnostic pop
75866
#endif
75867
        } else {
75868
          v_has_bits = true;
75869
          {
75870
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
75871
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
75872
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
75873
              goto suspend;
75874
            }
75875
            uint8_t t_0 = *iop_a_src++;
75876
            v_c8 = t_0;
75877
          }
75878
        }
75879
        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))])));
75880
        v_i += 1u;
75881
        v_cx += 1u;
75882
      }
75883
      v_cy += 1u;
75884
    }
75885
    v_i = 0u;
75886
    v_cx = 0u;
75887
    while (v_cx < 5u) {
75888
      if (v_has_bits) {
75889
        v_has_bits = false;
75890
#if defined(__GNUC__)
75891
#pragma GCC diagnostic push
75892
#pragma GCC diagnostic ignored "-Wconversion"
75893
#endif
75894
        v_c8 >>= 4u;
75895
#if defined(__GNUC__)
75896
#pragma GCC diagnostic pop
75897
#endif
75898
      } else {
75899
        v_has_bits = true;
75900
        {
75901
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
75902
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
75903
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
75904
            goto suspend;
75905
          }
75906
          uint8_t t_1 = *iop_a_src++;
75907
          v_c8 = t_1;
75908
        }
75909
      }
75910
      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))])));
75911
      v_i += 1u;
75912
      v_cx += 1u;
75913
    }
75914
    v_i = 0u;
75915
    v_cx = 0u;
75916
    while (v_cx < 5u) {
75917
      if (v_has_bits) {
75918
        v_has_bits = false;
75919
#if defined(__GNUC__)
75920
#pragma GCC diagnostic push
75921
#pragma GCC diagnostic ignored "-Wconversion"
75922
#endif
75923
        v_c8 >>= 4u;
75924
#if defined(__GNUC__)
75925
#pragma GCC diagnostic pop
75926
#endif
75927
      } else {
75928
        v_has_bits = true;
75929
        {
75930
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
75931
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
75932
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
75933
            goto suspend;
75934
          }
75935
          uint8_t t_2 = *iop_a_src++;
75936
          v_c8 = t_2;
75937
        }
75938
      }
75939
      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))])));
75940
      v_i += 1u;
75941
      v_cx += 1u;
75942
    }
75943
    if (self->private_impl.f_has_alpha == 0u) {
75944
      status = wuffs_base__make_status(NULL);
75945
      goto ok;
75946
    }
75947
    v_i = 0u;
75948
    v_cx = 0u;
75949
    while (v_cx < 14u) {
75950
      if (v_has_bits) {
75951
        v_has_bits = false;
75952
#if defined(__GNUC__)
75953
#pragma GCC diagnostic push
75954
#pragma GCC diagnostic ignored "-Wconversion"
75955
#endif
75956
        v_c8 >>= 4u;
75957
#if defined(__GNUC__)
75958
#pragma GCC diagnostic pop
75959
#endif
75960
      } else {
75961
        v_has_bits = true;
75962
        {
75963
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
75964
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
75965
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
75966
            goto suspend;
75967
          }
75968
          uint8_t t_3 = *iop_a_src++;
75969
          v_c8 = t_3;
75970
        }
75971
      }
75972
      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))])));
75973
      v_i += 1u;
75974
      v_cx += 1u;
75975
    }
75976
75977
    ok:
75978
    self->private_impl.p_from_src_to_coeffs = 0;
75979
    goto exit;
75980
  }
75981
75982
  goto suspend;
75983
  suspend:
75984
  self->private_impl.p_from_src_to_coeffs = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
75985
  self->private_data.s_from_src_to_coeffs.v_cy = v_cy;
75986
  self->private_data.s_from_src_to_coeffs.v_cx = v_cx;
75987
  self->private_data.s_from_src_to_coeffs.v_i = v_i;
75988
  self->private_data.s_from_src_to_coeffs.v_has_bits = v_has_bits;
75989
75990
  goto exit;
75991
  exit:
75992
  if (a_src && a_src->data.ptr) {
75993
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
75994
  }
75995
75996
  return status;
75997
}
75998
75999
// -------- func thumbhash.decoder.from_coeffs_to_pixels
76000
76001
WUFFS_BASE__GENERATED_C_CODE
76002
static wuffs_base__empty_struct
76003
wuffs_thumbhash__decoder__from_coeffs_to_pixels(
76004
    wuffs_thumbhash__decoder* self) {
76005
  uint32_t v_h = 0;
76006
  uint32_t v_w = 0;
76007
  uint32_t v_fy[8] = {0};
76008
  uint32_t v_fx[8] = {0};
76009
  uint32_t v_cosines_base_y = 0;
76010
  uint32_t v_cosines_base_x = 0;
76011
  uint32_t v_y = 0;
76012
  uint32_t v_x = 0;
76013
  uint32_t v_f = 0;
76014
  uint64_t v_l = 0;
76015
  uint64_t v_p = 0;
76016
  uint64_t v_q = 0;
76017
  uint64_t v_b = 0;
76018
  uint64_t v_g = 0;
76019
  uint64_t v_r = 0;
76020
  uint64_t v_a = 0;
76021
  uint32_t v_i = 0;
76022
  uint32_t v_cy = 0;
76023
  uint32_t v_cx = 0;
76024
76025
  v_h = ((uint32_t)(WUFFS_THUMBHASH__DIMENSIONS_FROM_DIMENSION_CODES[self->private_impl.f_h_dimension_code]));
76026
  v_w = ((uint32_t)(WUFFS_THUMBHASH__DIMENSIONS_FROM_DIMENSION_CODES[self->private_impl.f_w_dimension_code]));
76027
  v_fy[0u] = 16384u;
76028
  v_fx[0u] = 16384u;
76029
  v_a = 255u;
76030
  v_y = 0u;
76031
  while (v_y < v_h) {
76032
    v_cosines_base_y = ((uint32_t)(WUFFS_THUMBHASH__CUMULATIVE_DIMENSIONS[self->private_impl.f_h_dimension_code]));
76033
    v_fy[1u] = wuffs_base__utility__sign_extend_convert_u16_u32(WUFFS_THUMBHASH__COSINES[(v_cosines_base_y + v_y)][0u]);
76034
    v_fy[2u] = wuffs_base__utility__sign_extend_convert_u16_u32(WUFFS_THUMBHASH__COSINES[(v_cosines_base_y + v_y)][1u]);
76035
    v_fy[3u] = wuffs_base__utility__sign_extend_convert_u16_u32(WUFFS_THUMBHASH__COSINES[(v_cosines_base_y + v_y)][2u]);
76036
    v_fy[4u] = wuffs_base__utility__sign_extend_convert_u16_u32(WUFFS_THUMBHASH__COSINES[(v_cosines_base_y + v_y)][3u]);
76037
    v_fy[5u] = wuffs_base__utility__sign_extend_convert_u16_u32(WUFFS_THUMBHASH__COSINES[(v_cosines_base_y + v_y)][4u]);
76038
    v_fy[6u] = wuffs_base__utility__sign_extend_convert_u16_u32(WUFFS_THUMBHASH__COSINES[(v_cosines_base_y + v_y)][5u]);
76039
    v_x = 0u;
76040
    while (v_x < v_w) {
76041
      v_cosines_base_x = ((uint32_t)(WUFFS_THUMBHASH__CUMULATIVE_DIMENSIONS[self->private_impl.f_w_dimension_code]));
76042
      v_fx[1u] = wuffs_base__utility__sign_extend_convert_u16_u32(WUFFS_THUMBHASH__COSINES[(v_cosines_base_x + v_x)][0u]);
76043
      v_fx[2u] = wuffs_base__utility__sign_extend_convert_u16_u32(WUFFS_THUMBHASH__COSINES[(v_cosines_base_x + v_x)][1u]);
76044
      v_fx[3u] = wuffs_base__utility__sign_extend_convert_u16_u32(WUFFS_THUMBHASH__COSINES[(v_cosines_base_x + v_x)][2u]);
76045
      v_fx[4u] = wuffs_base__utility__sign_extend_convert_u16_u32(WUFFS_THUMBHASH__COSINES[(v_cosines_base_x + v_x)][3u]);
76046
      v_fx[5u] = wuffs_base__utility__sign_extend_convert_u16_u32(WUFFS_THUMBHASH__COSINES[(v_cosines_base_x + v_x)][4u]);
76047
      v_fx[6u] = wuffs_base__utility__sign_extend_convert_u16_u32(WUFFS_THUMBHASH__COSINES[(v_cosines_base_x + v_x)][5u]);
76048
      v_l = self->private_impl.f_l_dc;
76049
      v_i = 0u;
76050
      v_cy = 0u;
76051
      while (v_cy < self->private_impl.f_ly) {
76052
        v_cx = 0u;
76053
        if (v_cy == 0u) {
76054
          v_cx = 1u;
76055
        }
76056
        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))))) {
76057
          v_f = ((uint32_t)(v_fx[(v_cx & 7u)] * v_fy[(v_cy & 7u)]));
76058
          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)])));
76059
          v_i += 1u;
76060
          v_cx += 1u;
76061
        }
76062
        v_cy += 1u;
76063
      }
76064
      v_p = self->private_impl.f_p_dc;
76065
      v_q = self->private_impl.f_q_dc;
76066
      v_i = 0u;
76067
      v_cy = 0u;
76068
      while (v_cy < 3u) {
76069
        v_cx = 0u;
76070
        if (v_cy == 0u) {
76071
          v_cx = 1u;
76072
        }
76073
        while (v_cx < (3u - v_cy)) {
76074
          v_f = ((uint32_t)(v_fx[v_cx] * v_fy[v_cy]));
76075
          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)])));
76076
          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)])));
76077
          v_i += 1u;
76078
          v_cx += 1u;
76079
        }
76080
        v_cy += 1u;
76081
      }
76082
      v_b = ((uint64_t)(v_l - wuffs_base__utility__i64_divide(((uint64_t)(2u * v_p)), 3u)));
76083
      v_r = wuffs_base__utility__sign_extend_rshift_u64(((uint64_t)(((uint64_t)(((uint64_t)(3u * v_l)) + v_q)) - v_b)), 1u);
76084
      v_g = ((uint64_t)(v_r - v_q));
76085
      if ((v_b >> 63u) != 0u) {
76086
        v_b = 0u;
76087
      } else if (v_b >= 8589384836185950u) {
76088
        v_b = 255u;
76089
      } else {
76090
        v_b /= 33683862102690u;
76091
      }
76092
      if ((v_g >> 63u) != 0u) {
76093
        v_g = 0u;
76094
      } else if (v_g >= 8589384836185950u) {
76095
        v_g = 255u;
76096
      } else {
76097
        v_g /= 33683862102690u;
76098
      }
76099
      if ((v_r >> 63u) != 0u) {
76100
        v_r = 0u;
76101
      } else if (v_r >= 8589384836185950u) {
76102
        v_r = 255u;
76103
      } else {
76104
        v_r /= 33683862102690u;
76105
      }
76106
      if (self->private_impl.f_has_alpha != 0u) {
76107
        v_a = self->private_impl.f_a_dc;
76108
        v_i = 0u;
76109
        v_cy = 0u;
76110
        while (v_cy < 5u) {
76111
          v_cx = 0u;
76112
          if (v_cy == 0u) {
76113
            v_cx = 1u;
76114
          }
76115
          while (v_cx < (5u - v_cy)) {
76116
            v_f = ((uint32_t)(v_fx[v_cx] * v_fy[v_cy]));
76117
            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)])));
76118
            v_i += 1u;
76119
            v_cx += 1u;
76120
          }
76121
          v_cy += 1u;
76122
        }
76123
        if ((v_a >> 63u) != 0u) {
76124
          v_a = 0u;
76125
        } else if (v_a >= 65970697666500u) {
76126
          v_a = 255u;
76127
        } else {
76128
          v_a /= 258708618300u;
76129
        }
76130
      }
76131
      self->private_data.f_pixels[v_y][((4u * v_x) + 0u)] = ((uint8_t)(v_b));
76132
      self->private_data.f_pixels[v_y][((4u * v_x) + 1u)] = ((uint8_t)(v_g));
76133
      self->private_data.f_pixels[v_y][((4u * v_x) + 2u)] = ((uint8_t)(v_r));
76134
      self->private_data.f_pixels[v_y][((4u * v_x) + 3u)] = ((uint8_t)(v_a));
76135
      v_x += 1u;
76136
    }
76137
    v_y += 1u;
76138
  }
76139
  return wuffs_base__make_empty_struct();
76140
}
76141
76142
// -------- func thumbhash.decoder.from_pixels_to_dst
76143
76144
WUFFS_BASE__GENERATED_C_CODE
76145
static wuffs_base__status
76146
wuffs_thumbhash__decoder__from_pixels_to_dst(
76147
    wuffs_thumbhash__decoder* self,
76148
    wuffs_base__pixel_buffer* a_dst) {
76149
  uint32_t v_h = 0;
76150
  uint32_t v_w = 0;
76151
  wuffs_base__pixel_format v_dst_pixfmt = {0};
76152
  uint32_t v_dst_bits_per_pixel = 0;
76153
  uint32_t v_dst_bytes_per_pixel = 0;
76154
  uint64_t v_dst_bytes_per_row = 0;
76155
  wuffs_base__table_u8 v_tab = {0};
76156
  uint32_t v_y = 0;
76157
  wuffs_base__slice_u8 v_dst = {0};
76158
  wuffs_base__slice_u8 v_src = {0};
76159
76160
  v_h = ((uint32_t)(WUFFS_THUMBHASH__DIMENSIONS_FROM_DIMENSION_CODES[self->private_impl.f_h_dimension_code]));
76161
  v_w = ((uint32_t)(WUFFS_THUMBHASH__DIMENSIONS_FROM_DIMENSION_CODES[self->private_impl.f_w_dimension_code]));
76162
  v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
76163
  v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
76164
  if ((v_dst_bits_per_pixel & 7u) != 0u) {
76165
    return wuffs_base__make_status(wuffs_base__error__unsupported_option);
76166
  }
76167
  v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u);
76168
  v_dst_bytes_per_row = ((uint64_t)((v_w * v_dst_bytes_per_pixel)));
76169
  v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
76170
  while (v_y < v_h) {
76171
    v_src = wuffs_base__make_slice_u8(self->private_data.f_pixels[v_y], (v_w * 4u));
76172
    v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_y);
76173
    if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) {
76174
      v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row);
76175
    }
76176
    wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, wuffs_base__pixel_buffer__palette(a_dst), v_src);
76177
    v_y += 1u;
76178
  }
76179
  return wuffs_base__make_status(NULL);
76180
}
76181
76182
// -------- func thumbhash.decoder.frame_dirty_rect
76183
76184
WUFFS_BASE__GENERATED_C_CODE
76185
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
76186
wuffs_thumbhash__decoder__frame_dirty_rect(
76187
    const wuffs_thumbhash__decoder* self) {
76188
  if (!self) {
76189
    return wuffs_base__utility__empty_rect_ie_u32();
76190
  }
76191
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
76192
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
76193
    return wuffs_base__utility__empty_rect_ie_u32();
76194
  }
76195
76196
  return wuffs_base__utility__make_rect_ie_u32(
76197
      0u,
76198
      0u,
76199
      ((uint32_t)(WUFFS_THUMBHASH__DIMENSIONS_FROM_DIMENSION_CODES[self->private_impl.f_w_dimension_code])),
76200
      ((uint32_t)(WUFFS_THUMBHASH__DIMENSIONS_FROM_DIMENSION_CODES[self->private_impl.f_h_dimension_code])));
76201
}
76202
76203
// -------- func thumbhash.decoder.num_animation_loops
76204
76205
WUFFS_BASE__GENERATED_C_CODE
76206
WUFFS_BASE__MAYBE_STATIC uint32_t
76207
wuffs_thumbhash__decoder__num_animation_loops(
76208
    const wuffs_thumbhash__decoder* self) {
76209
  if (!self) {
76210
    return 0;
76211
  }
76212
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
76213
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
76214
    return 0;
76215
  }
76216
76217
  return 0u;
76218
}
76219
76220
// -------- func thumbhash.decoder.num_decoded_frame_configs
76221
76222
WUFFS_BASE__GENERATED_C_CODE
76223
WUFFS_BASE__MAYBE_STATIC uint64_t
76224
wuffs_thumbhash__decoder__num_decoded_frame_configs(
76225
    const wuffs_thumbhash__decoder* self) {
76226
  if (!self) {
76227
    return 0;
76228
  }
76229
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
76230
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
76231
    return 0;
76232
  }
76233
76234
  if (self->private_impl.f_call_sequence > 32u) {
76235
    return 1u;
76236
  }
76237
  return 0u;
76238
}
76239
76240
// -------- func thumbhash.decoder.num_decoded_frames
76241
76242
WUFFS_BASE__GENERATED_C_CODE
76243
WUFFS_BASE__MAYBE_STATIC uint64_t
76244
wuffs_thumbhash__decoder__num_decoded_frames(
76245
    const wuffs_thumbhash__decoder* self) {
76246
  if (!self) {
76247
    return 0;
76248
  }
76249
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
76250
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
76251
    return 0;
76252
  }
76253
76254
  if (self->private_impl.f_call_sequence > 64u) {
76255
    return 1u;
76256
  }
76257
  return 0u;
76258
}
76259
76260
// -------- func thumbhash.decoder.restart_frame
76261
76262
WUFFS_BASE__GENERATED_C_CODE
76263
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
76264
wuffs_thumbhash__decoder__restart_frame(
76265
    wuffs_thumbhash__decoder* self,
76266
    uint64_t a_index,
76267
    uint64_t a_io_position) {
76268
  if (!self) {
76269
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
76270
  }
76271
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
76272
    return wuffs_base__make_status(
76273
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
76274
        ? wuffs_base__error__disabled_by_previous_error
76275
        : wuffs_base__error__initialize_not_called);
76276
  }
76277
76278
  if (self->private_impl.f_call_sequence < 32u) {
76279
    return wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
76280
  }
76281
  if ((a_index != 0u) || (a_io_position != ((uint64_t)(self->private_impl.f_frame_config_io_position)))) {
76282
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
76283
  }
76284
  self->private_impl.f_call_sequence = 40u;
76285
  return wuffs_base__make_status(NULL);
76286
}
76287
76288
// -------- func thumbhash.decoder.set_report_metadata
76289
76290
WUFFS_BASE__GENERATED_C_CODE
76291
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
76292
wuffs_thumbhash__decoder__set_report_metadata(
76293
    wuffs_thumbhash__decoder* self,
76294
    uint32_t a_fourcc,
76295
    bool a_report) {
76296
  return wuffs_base__make_empty_struct();
76297
}
76298
76299
// -------- func thumbhash.decoder.tell_me_more
76300
76301
WUFFS_BASE__GENERATED_C_CODE
76302
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
76303
wuffs_thumbhash__decoder__tell_me_more(
76304
    wuffs_thumbhash__decoder* self,
76305
    wuffs_base__io_buffer* a_dst,
76306
    wuffs_base__more_information* a_minfo,
76307
    wuffs_base__io_buffer* a_src) {
76308
  if (!self) {
76309
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
76310
  }
76311
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
76312
    return wuffs_base__make_status(
76313
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
76314
        ? wuffs_base__error__disabled_by_previous_error
76315
        : wuffs_base__error__initialize_not_called);
76316
  }
76317
  if (!a_dst || !a_src) {
76318
    self->private_impl.magic = WUFFS_BASE__DISABLED;
76319
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
76320
  }
76321
  if ((self->private_impl.active_coroutine != 0) &&
76322
      (self->private_impl.active_coroutine != 4)) {
76323
    self->private_impl.magic = WUFFS_BASE__DISABLED;
76324
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
76325
  }
76326
  self->private_impl.active_coroutine = 0;
76327
  wuffs_base__status status = wuffs_base__make_status(NULL);
76328
76329
  status = wuffs_base__make_status(wuffs_base__error__no_more_information);
76330
  goto exit;
76331
76332
  goto ok;
76333
  ok:
76334
  goto exit;
76335
  exit:
76336
  if (wuffs_base__status__is_error(&status)) {
76337
    self->private_impl.magic = WUFFS_BASE__DISABLED;
76338
  }
76339
  return status;
76340
}
76341
76342
// -------- func thumbhash.decoder.workbuf_len
76343
76344
WUFFS_BASE__GENERATED_C_CODE
76345
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
76346
wuffs_thumbhash__decoder__workbuf_len(
76347
    const wuffs_thumbhash__decoder* self) {
76348
  if (!self) {
76349
    return wuffs_base__utility__empty_range_ii_u64();
76350
  }
76351
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
76352
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
76353
    return wuffs_base__utility__empty_range_ii_u64();
76354
  }
76355
76356
  return wuffs_base__utility__make_range_ii_u64(0u, 0u);
76357
}
76358
76359
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__THUMBHASH)
76360
76361
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__VP8)
76362
76363
// ---------------- Status Codes Implementations
76364
76365
const char wuffs_vp8__error__bad_header[] = "#vp8: bad header";
76366
const char wuffs_vp8__error__truncated_input[] = "#vp8: truncated input";
76367
const char wuffs_vp8__error__unsupported_vp8_file[] = "#vp8: unsupported VP8 file";
76368
76369
// ---------------- Private Consts
76370
76371
// ---------------- Private Initializer Prototypes
76372
76373
// ---------------- Private Function Prototypes
76374
76375
WUFFS_BASE__GENERATED_C_CODE
76376
static wuffs_base__status
76377
wuffs_vp8__decoder__do_decode_image_config(
76378
    wuffs_vp8__decoder* self,
76379
    wuffs_base__image_config* a_dst,
76380
    wuffs_base__io_buffer* a_src);
76381
76382
WUFFS_BASE__GENERATED_C_CODE
76383
static wuffs_base__status
76384
wuffs_vp8__decoder__do_decode_frame_config(
76385
    wuffs_vp8__decoder* self,
76386
    wuffs_base__frame_config* a_dst,
76387
    wuffs_base__io_buffer* a_src);
76388
76389
WUFFS_BASE__GENERATED_C_CODE
76390
static wuffs_base__status
76391
wuffs_vp8__decoder__do_decode_frame(
76392
    wuffs_vp8__decoder* self,
76393
    wuffs_base__pixel_buffer* a_dst,
76394
    wuffs_base__io_buffer* a_src,
76395
    wuffs_base__pixel_blend a_blend,
76396
    wuffs_base__slice_u8 a_workbuf,
76397
    wuffs_base__decode_frame_options* a_opts);
76398
76399
WUFFS_BASE__GENERATED_C_CODE
76400
static wuffs_base__status
76401
wuffs_vp8__decoder__make_a_placeholder_gradient(
76402
    wuffs_vp8__decoder* self,
76403
    wuffs_base__pixel_buffer* a_dst);
76404
76405
// ---------------- VTables
76406
76407
const wuffs_base__image_decoder__func_ptrs
76408
wuffs_vp8__decoder__func_ptrs_for__wuffs_base__image_decoder = {
76409
  (wuffs_base__status(*)(void*,
76410
      wuffs_base__pixel_buffer*,
76411
      wuffs_base__io_buffer*,
76412
      wuffs_base__pixel_blend,
76413
      wuffs_base__slice_u8,
76414
      wuffs_base__decode_frame_options*))(&wuffs_vp8__decoder__decode_frame),
76415
  (wuffs_base__status(*)(void*,
76416
      wuffs_base__frame_config*,
76417
      wuffs_base__io_buffer*))(&wuffs_vp8__decoder__decode_frame_config),
76418
  (wuffs_base__status(*)(void*,
76419
      wuffs_base__image_config*,
76420
      wuffs_base__io_buffer*))(&wuffs_vp8__decoder__decode_image_config),
76421
  (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_vp8__decoder__frame_dirty_rect),
76422
  (uint64_t(*)(const void*,
76423
      uint32_t))(&wuffs_vp8__decoder__get_quirk),
76424
  (uint32_t(*)(const void*))(&wuffs_vp8__decoder__num_animation_loops),
76425
  (uint64_t(*)(const void*))(&wuffs_vp8__decoder__num_decoded_frame_configs),
76426
  (uint64_t(*)(const void*))(&wuffs_vp8__decoder__num_decoded_frames),
76427
  (wuffs_base__status(*)(void*,
76428
      uint64_t,
76429
      uint64_t))(&wuffs_vp8__decoder__restart_frame),
76430
  (wuffs_base__status(*)(void*,
76431
      uint32_t,
76432
      uint64_t))(&wuffs_vp8__decoder__set_quirk),
76433
  (wuffs_base__empty_struct(*)(void*,
76434
      uint32_t,
76435
      bool))(&wuffs_vp8__decoder__set_report_metadata),
76436
  (wuffs_base__status(*)(void*,
76437
      wuffs_base__io_buffer*,
76438
      wuffs_base__more_information*,
76439
      wuffs_base__io_buffer*))(&wuffs_vp8__decoder__tell_me_more),
76440
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_vp8__decoder__workbuf_len),
76441
};
76442
76443
// ---------------- Initializer Implementations
76444
76445
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
76446
wuffs_vp8__decoder__initialize(
76447
    wuffs_vp8__decoder* self,
76448
    size_t sizeof_star_self,
76449
    uint64_t wuffs_version,
76450
    uint32_t options){
76451
  if (!self) {
76452
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
76453
  }
76454
  if (sizeof(*self) != sizeof_star_self) {
76455
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
76456
  }
76457
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
76458
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
76459
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
76460
  }
76461
76462
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
76463
    // The whole point of this if-check is to detect an uninitialized *self.
76464
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
76465
#if !defined(__clang__) && defined(__GNUC__)
76466
#pragma GCC diagnostic push
76467
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
76468
#endif
76469
    if (self->private_impl.magic != 0) {
76470
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
76471
    }
76472
#if !defined(__clang__) && defined(__GNUC__)
76473
#pragma GCC diagnostic pop
76474
#endif
76475
  } else {
76476
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
76477
      memset(self, 0, sizeof(*self));
76478
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
76479
    } else {
76480
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
76481
    }
76482
  }
76483
76484
  self->private_impl.magic = WUFFS_BASE__MAGIC;
76485
  self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name =
76486
      wuffs_base__image_decoder__vtable_name;
76487
  self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers =
76488
      (const void*)(&wuffs_vp8__decoder__func_ptrs_for__wuffs_base__image_decoder);
76489
  return wuffs_base__make_status(NULL);
76490
}
76491
76492
wuffs_vp8__decoder*
76493
wuffs_vp8__decoder__alloc(void) {
76494
  wuffs_vp8__decoder* x =
76495
      (wuffs_vp8__decoder*)(calloc(1, sizeof(wuffs_vp8__decoder)));
76496
  if (!x) {
76497
    return NULL;
76498
  }
76499
  if (wuffs_vp8__decoder__initialize(
76500
      x, sizeof(wuffs_vp8__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
76501
    free(x);
76502
    return NULL;
76503
  }
76504
  return x;
76505
}
76506
76507
size_t
76508
sizeof__wuffs_vp8__decoder(void) {
76509
  return sizeof(wuffs_vp8__decoder);
76510
}
76511
76512
// ---------------- Function Implementations
76513
76514
// -------- func vp8.decoder.get_quirk
76515
76516
WUFFS_BASE__GENERATED_C_CODE
76517
WUFFS_BASE__MAYBE_STATIC uint64_t
76518
wuffs_vp8__decoder__get_quirk(
76519
    const wuffs_vp8__decoder* self,
76520
    uint32_t a_key) {
76521
  if (!self) {
76522
    return 0;
76523
  }
76524
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
76525
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
76526
    return 0;
76527
  }
76528
76529
  return 0u;
76530
}
76531
76532
// -------- func vp8.decoder.set_quirk
76533
76534
WUFFS_BASE__GENERATED_C_CODE
76535
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
76536
wuffs_vp8__decoder__set_quirk(
76537
    wuffs_vp8__decoder* self,
76538
    uint32_t a_key,
76539
    uint64_t a_value) {
76540
  if (!self) {
76541
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
76542
  }
76543
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
76544
    return wuffs_base__make_status(
76545
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
76546
        ? wuffs_base__error__disabled_by_previous_error
76547
        : wuffs_base__error__initialize_not_called);
76548
  }
76549
76550
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
76551
}
76552
76553
// -------- func vp8.decoder.decode_image_config
76554
76555
WUFFS_BASE__GENERATED_C_CODE
76556
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
76557
wuffs_vp8__decoder__decode_image_config(
76558
    wuffs_vp8__decoder* self,
76559
    wuffs_base__image_config* a_dst,
76560
    wuffs_base__io_buffer* a_src) {
76561
  if (!self) {
76562
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
76563
  }
76564
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
76565
    return wuffs_base__make_status(
76566
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
76567
        ? wuffs_base__error__disabled_by_previous_error
76568
        : wuffs_base__error__initialize_not_called);
76569
  }
76570
  if (!a_src) {
76571
    self->private_impl.magic = WUFFS_BASE__DISABLED;
76572
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
76573
  }
76574
  if ((self->private_impl.active_coroutine != 0) &&
76575
      (self->private_impl.active_coroutine != 1)) {
76576
    self->private_impl.magic = WUFFS_BASE__DISABLED;
76577
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
76578
  }
76579
  self->private_impl.active_coroutine = 0;
76580
  wuffs_base__status status = wuffs_base__make_status(NULL);
76581
76582
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
76583
76584
  uint32_t coro_susp_point = self->private_impl.p_decode_image_config;
76585
  switch (coro_susp_point) {
76586
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
76587
76588
    while (true) {
76589
      {
76590
        wuffs_base__status t_0 = wuffs_vp8__decoder__do_decode_image_config(self, a_dst, a_src);
76591
        v_status = t_0;
76592
      }
76593
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
76594
        status = wuffs_base__make_status(wuffs_vp8__error__truncated_input);
76595
        goto exit;
76596
      }
76597
      status = v_status;
76598
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
76599
    }
76600
76601
    ok:
76602
    self->private_impl.p_decode_image_config = 0;
76603
    goto exit;
76604
  }
76605
76606
  goto suspend;
76607
  suspend:
76608
  self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
76609
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
76610
76611
  goto exit;
76612
  exit:
76613
  if (wuffs_base__status__is_error(&status)) {
76614
    self->private_impl.magic = WUFFS_BASE__DISABLED;
76615
  }
76616
  return status;
76617
}
76618
76619
// -------- func vp8.decoder.do_decode_image_config
76620
76621
WUFFS_BASE__GENERATED_C_CODE
76622
static wuffs_base__status
76623
wuffs_vp8__decoder__do_decode_image_config(
76624
    wuffs_vp8__decoder* self,
76625
    wuffs_base__image_config* a_dst,
76626
    wuffs_base__io_buffer* a_src) {
76627
  wuffs_base__status status = wuffs_base__make_status(NULL);
76628
76629
  uint32_t v_c32 = 0;
76630
76631
  const uint8_t* iop_a_src = NULL;
76632
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
76633
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
76634
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
76635
  if (a_src && a_src->data.ptr) {
76636
    io0_a_src = a_src->data.ptr;
76637
    io1_a_src = io0_a_src + a_src->meta.ri;
76638
    iop_a_src = io1_a_src;
76639
    io2_a_src = io0_a_src + a_src->meta.wi;
76640
  }
76641
76642
  uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config;
76643
  switch (coro_susp_point) {
76644
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
76645
76646
    if (self->private_impl.f_call_sequence != 0u) {
76647
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
76648
      goto exit;
76649
    }
76650
    {
76651
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
76652
      uint32_t t_0;
76653
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) {
76654
        t_0 = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src)));
76655
        iop_a_src += 3;
76656
      } else {
76657
        self->private_data.s_do_decode_image_config.scratch = 0;
76658
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
76659
        while (true) {
76660
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
76661
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
76662
            goto suspend;
76663
          }
76664
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
76665
          uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
76666
          *scratch <<= 8;
76667
          *scratch >>= 8;
76668
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
76669
          if (num_bits_0 == 16) {
76670
            t_0 = ((uint32_t)(*scratch));
76671
            break;
76672
          }
76673
          num_bits_0 += 8u;
76674
          *scratch |= ((uint64_t)(num_bits_0)) << 56;
76675
        }
76676
      }
76677
      v_c32 = t_0;
76678
    }
76679
    if ((v_c32 & 1u) != 0u) {
76680
      status = wuffs_base__make_status(wuffs_vp8__error__unsupported_vp8_file);
76681
      goto exit;
76682
    }
76683
    {
76684
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
76685
      uint32_t t_1;
76686
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) {
76687
        t_1 = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src)));
76688
        iop_a_src += 3;
76689
      } else {
76690
        self->private_data.s_do_decode_image_config.scratch = 0;
76691
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
76692
        while (true) {
76693
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
76694
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
76695
            goto suspend;
76696
          }
76697
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
76698
          uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
76699
          *scratch <<= 8;
76700
          *scratch >>= 8;
76701
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
76702
          if (num_bits_1 == 16) {
76703
            t_1 = ((uint32_t)(*scratch));
76704
            break;
76705
          }
76706
          num_bits_1 += 8u;
76707
          *scratch |= ((uint64_t)(num_bits_1)) << 56;
76708
        }
76709
      }
76710
      v_c32 = t_1;
76711
    }
76712
    if (v_c32 != 2752925u) {
76713
      status = wuffs_base__make_status(wuffs_vp8__error__bad_header);
76714
      goto exit;
76715
    }
76716
    {
76717
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
76718
      uint32_t t_2;
76719
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
76720
        t_2 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
76721
        iop_a_src += 4;
76722
      } else {
76723
        self->private_data.s_do_decode_image_config.scratch = 0;
76724
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
76725
        while (true) {
76726
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
76727
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
76728
            goto suspend;
76729
          }
76730
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
76731
          uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56));
76732
          *scratch <<= 8;
76733
          *scratch >>= 8;
76734
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2;
76735
          if (num_bits_2 == 24) {
76736
            t_2 = ((uint32_t)(*scratch));
76737
            break;
76738
          }
76739
          num_bits_2 += 8u;
76740
          *scratch |= ((uint64_t)(num_bits_2)) << 56;
76741
        }
76742
      }
76743
      v_c32 = t_2;
76744
    }
76745
    self->private_impl.f_width = (16383u & (v_c32 >> 0u));
76746
    self->private_impl.f_height = (16383u & (v_c32 >> 16u));
76747
    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)));
76748
    if (a_dst != NULL) {
76749
      wuffs_base__image_config__set(
76750
          a_dst,
76751
          2415954056u,
76752
          0u,
76753
          self->private_impl.f_width,
76754
          self->private_impl.f_height,
76755
          self->private_impl.f_frame_config_io_position,
76756
          false);
76757
    }
76758
    self->private_impl.f_call_sequence = 32u;
76759
76760
    goto ok;
76761
    ok:
76762
    self->private_impl.p_do_decode_image_config = 0;
76763
    goto exit;
76764
  }
76765
76766
  goto suspend;
76767
  suspend:
76768
  self->private_impl.p_do_decode_image_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 vp8.decoder.decode_frame_config
76780
76781
WUFFS_BASE__GENERATED_C_CODE
76782
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
76783
wuffs_vp8__decoder__decode_frame_config(
76784
    wuffs_vp8__decoder* self,
76785
    wuffs_base__frame_config* a_dst,
76786
    wuffs_base__io_buffer* a_src) {
76787
  if (!self) {
76788
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
76789
  }
76790
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
76791
    return wuffs_base__make_status(
76792
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
76793
        ? wuffs_base__error__disabled_by_previous_error
76794
        : wuffs_base__error__initialize_not_called);
76795
  }
76796
  if (!a_src) {
76797
    self->private_impl.magic = WUFFS_BASE__DISABLED;
76798
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
76799
  }
76800
  if ((self->private_impl.active_coroutine != 0) &&
76801
      (self->private_impl.active_coroutine != 2)) {
76802
    self->private_impl.magic = WUFFS_BASE__DISABLED;
76803
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
76804
  }
76805
  self->private_impl.active_coroutine = 0;
76806
  wuffs_base__status status = wuffs_base__make_status(NULL);
76807
76808
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
76809
76810
  uint32_t coro_susp_point = self->private_impl.p_decode_frame_config;
76811
  switch (coro_susp_point) {
76812
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
76813
76814
    while (true) {
76815
      {
76816
        wuffs_base__status t_0 = wuffs_vp8__decoder__do_decode_frame_config(self, a_dst, a_src);
76817
        v_status = t_0;
76818
      }
76819
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
76820
        status = wuffs_base__make_status(wuffs_vp8__error__truncated_input);
76821
        goto exit;
76822
      }
76823
      status = v_status;
76824
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
76825
    }
76826
76827
    ok:
76828
    self->private_impl.p_decode_frame_config = 0;
76829
    goto exit;
76830
  }
76831
76832
  goto suspend;
76833
  suspend:
76834
  self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
76835
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0;
76836
76837
  goto exit;
76838
  exit:
76839
  if (wuffs_base__status__is_error(&status)) {
76840
    self->private_impl.magic = WUFFS_BASE__DISABLED;
76841
  }
76842
  return status;
76843
}
76844
76845
// -------- func vp8.decoder.do_decode_frame_config
76846
76847
WUFFS_BASE__GENERATED_C_CODE
76848
static wuffs_base__status
76849
wuffs_vp8__decoder__do_decode_frame_config(
76850
    wuffs_vp8__decoder* self,
76851
    wuffs_base__frame_config* a_dst,
76852
    wuffs_base__io_buffer* a_src) {
76853
  wuffs_base__status status = wuffs_base__make_status(NULL);
76854
76855
  const uint8_t* iop_a_src = NULL;
76856
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
76857
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
76858
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
76859
  if (a_src && a_src->data.ptr) {
76860
    io0_a_src = a_src->data.ptr;
76861
    io1_a_src = io0_a_src + a_src->meta.ri;
76862
    iop_a_src = io1_a_src;
76863
    io2_a_src = io0_a_src + a_src->meta.wi;
76864
  }
76865
76866
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config;
76867
  switch (coro_susp_point) {
76868
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
76869
76870
    if (self->private_impl.f_call_sequence == 32u) {
76871
    } else if (self->private_impl.f_call_sequence < 32u) {
76872
      if (a_src) {
76873
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
76874
      }
76875
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
76876
      status = wuffs_vp8__decoder__do_decode_image_config(self, NULL, a_src);
76877
      if (a_src) {
76878
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
76879
      }
76880
      if (status.repr) {
76881
        goto suspend;
76882
      }
76883
    } else if (self->private_impl.f_call_sequence == 40u) {
76884
      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)))) {
76885
        status = wuffs_base__make_status(wuffs_base__error__bad_restart);
76886
        goto exit;
76887
      }
76888
    } else if (self->private_impl.f_call_sequence == 64u) {
76889
      self->private_impl.f_call_sequence = 96u;
76890
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
76891
      goto ok;
76892
    } else {
76893
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
76894
      goto ok;
76895
    }
76896
    if (a_dst != NULL) {
76897
      wuffs_base__frame_config__set(
76898
          a_dst,
76899
          wuffs_base__utility__make_rect_ie_u32(
76900
          0u,
76901
          0u,
76902
          self->private_impl.f_width,
76903
          self->private_impl.f_height),
76904
          ((wuffs_base__flicks)(0u)),
76905
          0u,
76906
          self->private_impl.f_frame_config_io_position,
76907
          0u,
76908
          false,
76909
          false,
76910
          4278190080u);
76911
    }
76912
    self->private_impl.f_call_sequence = 64u;
76913
76914
    ok:
76915
    self->private_impl.p_do_decode_frame_config = 0;
76916
    goto exit;
76917
  }
76918
76919
  goto suspend;
76920
  suspend:
76921
  self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
76922
76923
  goto exit;
76924
  exit:
76925
  if (a_src && a_src->data.ptr) {
76926
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
76927
  }
76928
76929
  return status;
76930
}
76931
76932
// -------- func vp8.decoder.decode_frame
76933
76934
WUFFS_BASE__GENERATED_C_CODE
76935
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
76936
wuffs_vp8__decoder__decode_frame(
76937
    wuffs_vp8__decoder* self,
76938
    wuffs_base__pixel_buffer* a_dst,
76939
    wuffs_base__io_buffer* a_src,
76940
    wuffs_base__pixel_blend a_blend,
76941
    wuffs_base__slice_u8 a_workbuf,
76942
    wuffs_base__decode_frame_options* a_opts) {
76943
  if (!self) {
76944
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
76945
  }
76946
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
76947
    return wuffs_base__make_status(
76948
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
76949
        ? wuffs_base__error__disabled_by_previous_error
76950
        : wuffs_base__error__initialize_not_called);
76951
  }
76952
  if (!a_dst || !a_src) {
76953
    self->private_impl.magic = WUFFS_BASE__DISABLED;
76954
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
76955
  }
76956
  if ((self->private_impl.active_coroutine != 0) &&
76957
      (self->private_impl.active_coroutine != 3)) {
76958
    self->private_impl.magic = WUFFS_BASE__DISABLED;
76959
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
76960
  }
76961
  self->private_impl.active_coroutine = 0;
76962
  wuffs_base__status status = wuffs_base__make_status(NULL);
76963
76964
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
76965
76966
  uint32_t coro_susp_point = self->private_impl.p_decode_frame;
76967
  switch (coro_susp_point) {
76968
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
76969
76970
    while (true) {
76971
      {
76972
        wuffs_base__status t_0 = wuffs_vp8__decoder__do_decode_frame(self,
76973
            a_dst,
76974
            a_src,
76975
            a_blend,
76976
            a_workbuf,
76977
            a_opts);
76978
        v_status = t_0;
76979
      }
76980
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
76981
        status = wuffs_base__make_status(wuffs_vp8__error__truncated_input);
76982
        goto exit;
76983
      }
76984
      status = v_status;
76985
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
76986
    }
76987
76988
    ok:
76989
    self->private_impl.p_decode_frame = 0;
76990
    goto exit;
76991
  }
76992
76993
  goto suspend;
76994
  suspend:
76995
  self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
76996
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0;
76997
76998
  goto exit;
76999
  exit:
77000
  if (wuffs_base__status__is_error(&status)) {
77001
    self->private_impl.magic = WUFFS_BASE__DISABLED;
77002
  }
77003
  return status;
77004
}
77005
77006
// -------- func vp8.decoder.do_decode_frame
77007
77008
WUFFS_BASE__GENERATED_C_CODE
77009
static wuffs_base__status
77010
wuffs_vp8__decoder__do_decode_frame(
77011
    wuffs_vp8__decoder* self,
77012
    wuffs_base__pixel_buffer* a_dst,
77013
    wuffs_base__io_buffer* a_src,
77014
    wuffs_base__pixel_blend a_blend,
77015
    wuffs_base__slice_u8 a_workbuf,
77016
    wuffs_base__decode_frame_options* a_opts) {
77017
  wuffs_base__status status = wuffs_base__make_status(NULL);
77018
77019
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
77020
77021
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame;
77022
  switch (coro_susp_point) {
77023
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
77024
77025
    if (self->private_impl.f_call_sequence == 64u) {
77026
    } else if (self->private_impl.f_call_sequence < 64u) {
77027
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
77028
      status = wuffs_vp8__decoder__do_decode_frame_config(self, NULL, a_src);
77029
      if (status.repr) {
77030
        goto suspend;
77031
      }
77032
    } else {
77033
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
77034
      goto ok;
77035
    }
77036
    self->private_impl.f_dst_x = 0u;
77037
    self->private_impl.f_dst_y = 0u;
77038
    v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler,
77039
        wuffs_base__pixel_buffer__pixel_format(a_dst),
77040
        wuffs_base__pixel_buffer__palette(a_dst),
77041
        wuffs_base__utility__make_pixel_format(2415954056u),
77042
        wuffs_base__utility__empty_slice_u8(),
77043
        a_blend);
77044
    if ( ! wuffs_base__status__is_ok(&v_status)) {
77045
      status = v_status;
77046
      if (wuffs_base__status__is_error(&status)) {
77047
        goto exit;
77048
      } else if (wuffs_base__status__is_suspension(&status)) {
77049
        status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
77050
        goto exit;
77051
      }
77052
      goto ok;
77053
    }
77054
    v_status = wuffs_vp8__decoder__make_a_placeholder_gradient(self, a_dst);
77055
    if ( ! wuffs_base__status__is_ok(&v_status)) {
77056
      status = v_status;
77057
      if (wuffs_base__status__is_error(&status)) {
77058
        goto exit;
77059
      } else if (wuffs_base__status__is_suspension(&status)) {
77060
        status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
77061
        goto exit;
77062
      }
77063
      goto ok;
77064
    }
77065
    self->private_impl.f_call_sequence = 96u;
77066
77067
    ok:
77068
    self->private_impl.p_do_decode_frame = 0;
77069
    goto exit;
77070
  }
77071
77072
  goto suspend;
77073
  suspend:
77074
  self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
77075
77076
  goto exit;
77077
  exit:
77078
  return status;
77079
}
77080
77081
// -------- func vp8.decoder.make_a_placeholder_gradient
77082
77083
WUFFS_BASE__GENERATED_C_CODE
77084
static wuffs_base__status
77085
wuffs_vp8__decoder__make_a_placeholder_gradient(
77086
    wuffs_vp8__decoder* self,
77087
    wuffs_base__pixel_buffer* a_dst) {
77088
  wuffs_base__pixel_format v_dst_pixfmt = {0};
77089
  uint32_t v_dst_bits_per_pixel = 0;
77090
  uint32_t v_dst_bytes_per_pixel = 0;
77091
  uint64_t v_dst_bytes_per_row = 0;
77092
  wuffs_base__table_u8 v_tab = {0};
77093
  wuffs_base__slice_u8 v_dst = {0};
77094
  uint64_t v_i = 0;
77095
  uint8_t v_bgrx[4] = {0};
77096
77097
  v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
77098
  v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
77099
  if ((v_dst_bits_per_pixel & 7u) != 0u) {
77100
    return wuffs_base__make_status(wuffs_base__error__unsupported_option);
77101
  }
77102
  v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u);
77103
  v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel)));
77104
  v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
77105
  v_bgrx[0u] = 128u;
77106
  while (self->private_impl.f_dst_y < self->private_impl.f_height) {
77107
    v_bgrx[1u] = ((uint8_t)(self->private_impl.f_dst_y));
77108
    self->private_impl.f_dst_x = 0u;
77109
    while (self->private_impl.f_dst_x < self->private_impl.f_width) {
77110
      v_bgrx[2u] = ((uint8_t)(self->private_impl.f_dst_x));
77111
      v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y);
77112
      if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) {
77113
        v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row);
77114
      }
77115
      v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel)));
77116
      if (v_i < ((uint64_t)(v_dst.len))) {
77117
        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));
77118
      }
77119
      self->private_impl.f_dst_x += 1u;
77120
    }
77121
    self->private_impl.f_dst_y += 1u;
77122
  }
77123
  return wuffs_base__make_status(NULL);
77124
}
77125
77126
// -------- func vp8.decoder.frame_dirty_rect
77127
77128
WUFFS_BASE__GENERATED_C_CODE
77129
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
77130
wuffs_vp8__decoder__frame_dirty_rect(
77131
    const wuffs_vp8__decoder* self) {
77132
  if (!self) {
77133
    return wuffs_base__utility__empty_rect_ie_u32();
77134
  }
77135
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
77136
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
77137
    return wuffs_base__utility__empty_rect_ie_u32();
77138
  }
77139
77140
  return wuffs_base__utility__make_rect_ie_u32(
77141
      0u,
77142
      0u,
77143
      self->private_impl.f_width,
77144
      self->private_impl.f_height);
77145
}
77146
77147
// -------- func vp8.decoder.num_animation_loops
77148
77149
WUFFS_BASE__GENERATED_C_CODE
77150
WUFFS_BASE__MAYBE_STATIC uint32_t
77151
wuffs_vp8__decoder__num_animation_loops(
77152
    const wuffs_vp8__decoder* self) {
77153
  if (!self) {
77154
    return 0;
77155
  }
77156
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
77157
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
77158
    return 0;
77159
  }
77160
77161
  return 0u;
77162
}
77163
77164
// -------- func vp8.decoder.num_decoded_frame_configs
77165
77166
WUFFS_BASE__GENERATED_C_CODE
77167
WUFFS_BASE__MAYBE_STATIC uint64_t
77168
wuffs_vp8__decoder__num_decoded_frame_configs(
77169
    const wuffs_vp8__decoder* self) {
77170
  if (!self) {
77171
    return 0;
77172
  }
77173
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
77174
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
77175
    return 0;
77176
  }
77177
77178
  if (self->private_impl.f_call_sequence > 32u) {
77179
    return 1u;
77180
  }
77181
  return 0u;
77182
}
77183
77184
// -------- func vp8.decoder.num_decoded_frames
77185
77186
WUFFS_BASE__GENERATED_C_CODE
77187
WUFFS_BASE__MAYBE_STATIC uint64_t
77188
wuffs_vp8__decoder__num_decoded_frames(
77189
    const wuffs_vp8__decoder* self) {
77190
  if (!self) {
77191
    return 0;
77192
  }
77193
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
77194
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
77195
    return 0;
77196
  }
77197
77198
  if (self->private_impl.f_call_sequence > 64u) {
77199
    return 1u;
77200
  }
77201
  return 0u;
77202
}
77203
77204
// -------- func vp8.decoder.restart_frame
77205
77206
WUFFS_BASE__GENERATED_C_CODE
77207
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
77208
wuffs_vp8__decoder__restart_frame(
77209
    wuffs_vp8__decoder* self,
77210
    uint64_t a_index,
77211
    uint64_t a_io_position) {
77212
  if (!self) {
77213
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
77214
  }
77215
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
77216
    return wuffs_base__make_status(
77217
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
77218
        ? wuffs_base__error__disabled_by_previous_error
77219
        : wuffs_base__error__initialize_not_called);
77220
  }
77221
77222
  if (self->private_impl.f_call_sequence < 32u) {
77223
    return wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
77224
  }
77225
  if ((a_index != 0u) || (a_io_position != self->private_impl.f_frame_config_io_position)) {
77226
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
77227
  }
77228
  self->private_impl.f_call_sequence = 40u;
77229
  return wuffs_base__make_status(NULL);
77230
}
77231
77232
// -------- func vp8.decoder.set_report_metadata
77233
77234
WUFFS_BASE__GENERATED_C_CODE
77235
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
77236
wuffs_vp8__decoder__set_report_metadata(
77237
    wuffs_vp8__decoder* self,
77238
    uint32_t a_fourcc,
77239
    bool a_report) {
77240
  return wuffs_base__make_empty_struct();
77241
}
77242
77243
// -------- func vp8.decoder.tell_me_more
77244
77245
WUFFS_BASE__GENERATED_C_CODE
77246
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
77247
wuffs_vp8__decoder__tell_me_more(
77248
    wuffs_vp8__decoder* self,
77249
    wuffs_base__io_buffer* a_dst,
77250
    wuffs_base__more_information* a_minfo,
77251
    wuffs_base__io_buffer* a_src) {
77252
  if (!self) {
77253
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
77254
  }
77255
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
77256
    return wuffs_base__make_status(
77257
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
77258
        ? wuffs_base__error__disabled_by_previous_error
77259
        : wuffs_base__error__initialize_not_called);
77260
  }
77261
  if (!a_dst || !a_src) {
77262
    self->private_impl.magic = WUFFS_BASE__DISABLED;
77263
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
77264
  }
77265
  if ((self->private_impl.active_coroutine != 0) &&
77266
      (self->private_impl.active_coroutine != 4)) {
77267
    self->private_impl.magic = WUFFS_BASE__DISABLED;
77268
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
77269
  }
77270
  self->private_impl.active_coroutine = 0;
77271
  wuffs_base__status status = wuffs_base__make_status(NULL);
77272
77273
  status = wuffs_base__make_status(wuffs_base__error__no_more_information);
77274
  goto exit;
77275
77276
  goto ok;
77277
  ok:
77278
  goto exit;
77279
  exit:
77280
  if (wuffs_base__status__is_error(&status)) {
77281
    self->private_impl.magic = WUFFS_BASE__DISABLED;
77282
  }
77283
  return status;
77284
}
77285
77286
// -------- func vp8.decoder.workbuf_len
77287
77288
WUFFS_BASE__GENERATED_C_CODE
77289
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
77290
wuffs_vp8__decoder__workbuf_len(
77291
    const wuffs_vp8__decoder* self) {
77292
  if (!self) {
77293
    return wuffs_base__utility__empty_range_ii_u64();
77294
  }
77295
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
77296
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
77297
    return wuffs_base__utility__empty_range_ii_u64();
77298
  }
77299
77300
  return wuffs_base__utility__make_range_ii_u64(0u, 0u);
77301
}
77302
77303
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__VP8)
77304
77305
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WBMP)
77306
77307
// ---------------- Status Codes Implementations
77308
77309
const char wuffs_wbmp__error__bad_header[] = "#wbmp: bad header";
77310
const char wuffs_wbmp__error__truncated_input[] = "#wbmp: truncated input";
77311
77312
// ---------------- Private Consts
77313
77314
// ---------------- Private Initializer Prototypes
77315
77316
// ---------------- Private Function Prototypes
77317
77318
WUFFS_BASE__GENERATED_C_CODE
77319
static wuffs_base__status
77320
wuffs_wbmp__decoder__do_decode_image_config(
77321
    wuffs_wbmp__decoder* self,
77322
    wuffs_base__image_config* a_dst,
77323
    wuffs_base__io_buffer* a_src);
77324
77325
WUFFS_BASE__GENERATED_C_CODE
77326
static wuffs_base__status
77327
wuffs_wbmp__decoder__do_decode_frame_config(
77328
    wuffs_wbmp__decoder* self,
77329
    wuffs_base__frame_config* a_dst,
77330
    wuffs_base__io_buffer* a_src);
77331
77332
WUFFS_BASE__GENERATED_C_CODE
77333
static wuffs_base__status
77334
wuffs_wbmp__decoder__do_decode_frame(
77335
    wuffs_wbmp__decoder* self,
77336
    wuffs_base__pixel_buffer* a_dst,
77337
    wuffs_base__io_buffer* a_src,
77338
    wuffs_base__pixel_blend a_blend,
77339
    wuffs_base__slice_u8 a_workbuf,
77340
    wuffs_base__decode_frame_options* a_opts);
77341
77342
// ---------------- VTables
77343
77344
const wuffs_base__image_decoder__func_ptrs
77345
wuffs_wbmp__decoder__func_ptrs_for__wuffs_base__image_decoder = {
77346
  (wuffs_base__status(*)(void*,
77347
      wuffs_base__pixel_buffer*,
77348
      wuffs_base__io_buffer*,
77349
      wuffs_base__pixel_blend,
77350
      wuffs_base__slice_u8,
77351
      wuffs_base__decode_frame_options*))(&wuffs_wbmp__decoder__decode_frame),
77352
  (wuffs_base__status(*)(void*,
77353
      wuffs_base__frame_config*,
77354
      wuffs_base__io_buffer*))(&wuffs_wbmp__decoder__decode_frame_config),
77355
  (wuffs_base__status(*)(void*,
77356
      wuffs_base__image_config*,
77357
      wuffs_base__io_buffer*))(&wuffs_wbmp__decoder__decode_image_config),
77358
  (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_wbmp__decoder__frame_dirty_rect),
77359
  (uint64_t(*)(const void*,
77360
      uint32_t))(&wuffs_wbmp__decoder__get_quirk),
77361
  (uint32_t(*)(const void*))(&wuffs_wbmp__decoder__num_animation_loops),
77362
  (uint64_t(*)(const void*))(&wuffs_wbmp__decoder__num_decoded_frame_configs),
77363
  (uint64_t(*)(const void*))(&wuffs_wbmp__decoder__num_decoded_frames),
77364
  (wuffs_base__status(*)(void*,
77365
      uint64_t,
77366
      uint64_t))(&wuffs_wbmp__decoder__restart_frame),
77367
  (wuffs_base__status(*)(void*,
77368
      uint32_t,
77369
      uint64_t))(&wuffs_wbmp__decoder__set_quirk),
77370
  (wuffs_base__empty_struct(*)(void*,
77371
      uint32_t,
77372
      bool))(&wuffs_wbmp__decoder__set_report_metadata),
77373
  (wuffs_base__status(*)(void*,
77374
      wuffs_base__io_buffer*,
77375
      wuffs_base__more_information*,
77376
      wuffs_base__io_buffer*))(&wuffs_wbmp__decoder__tell_me_more),
77377
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_wbmp__decoder__workbuf_len),
77378
};
77379
77380
// ---------------- Initializer Implementations
77381
77382
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
77383
wuffs_wbmp__decoder__initialize(
77384
    wuffs_wbmp__decoder* self,
77385
    size_t sizeof_star_self,
77386
    uint64_t wuffs_version,
77387
    uint32_t options){
77388
  if (!self) {
77389
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
77390
  }
77391
  if (sizeof(*self) != sizeof_star_self) {
77392
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
77393
  }
77394
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
77395
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
77396
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
77397
  }
77398
77399
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
77400
    // The whole point of this if-check is to detect an uninitialized *self.
77401
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
77402
#if !defined(__clang__) && defined(__GNUC__)
77403
#pragma GCC diagnostic push
77404
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
77405
#endif
77406
    if (self->private_impl.magic != 0) {
77407
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
77408
    }
77409
#if !defined(__clang__) && defined(__GNUC__)
77410
#pragma GCC diagnostic pop
77411
#endif
77412
  } else {
77413
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
77414
      memset(self, 0, sizeof(*self));
77415
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
77416
    } else {
77417
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
77418
    }
77419
  }
77420
77421
  self->private_impl.magic = WUFFS_BASE__MAGIC;
77422
  self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name =
77423
      wuffs_base__image_decoder__vtable_name;
77424
  self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers =
77425
      (const void*)(&wuffs_wbmp__decoder__func_ptrs_for__wuffs_base__image_decoder);
77426
  return wuffs_base__make_status(NULL);
77427
}
77428
77429
wuffs_wbmp__decoder*
77430
wuffs_wbmp__decoder__alloc(void) {
77431
  wuffs_wbmp__decoder* x =
77432
      (wuffs_wbmp__decoder*)(calloc(1, sizeof(wuffs_wbmp__decoder)));
77433
  if (!x) {
77434
    return NULL;
77435
  }
77436
  if (wuffs_wbmp__decoder__initialize(
77437
      x, sizeof(wuffs_wbmp__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
77438
    free(x);
77439
    return NULL;
77440
  }
77441
  return x;
77442
}
77443
77444
size_t
77445
sizeof__wuffs_wbmp__decoder(void) {
77446
  return sizeof(wuffs_wbmp__decoder);
77447
}
77448
77449
// ---------------- Function Implementations
77450
77451
// -------- func wbmp.decoder.get_quirk
77452
77453
WUFFS_BASE__GENERATED_C_CODE
77454
WUFFS_BASE__MAYBE_STATIC uint64_t
77455
wuffs_wbmp__decoder__get_quirk(
77456
    const wuffs_wbmp__decoder* self,
77457
    uint32_t a_key) {
77458
  if (!self) {
77459
    return 0;
77460
  }
77461
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
77462
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
77463
    return 0;
77464
  }
77465
77466
  return 0u;
77467
}
77468
77469
// -------- func wbmp.decoder.set_quirk
77470
77471
WUFFS_BASE__GENERATED_C_CODE
77472
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
77473
wuffs_wbmp__decoder__set_quirk(
77474
    wuffs_wbmp__decoder* self,
77475
    uint32_t a_key,
77476
    uint64_t a_value) {
77477
  if (!self) {
77478
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
77479
  }
77480
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
77481
    return wuffs_base__make_status(
77482
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
77483
        ? wuffs_base__error__disabled_by_previous_error
77484
        : wuffs_base__error__initialize_not_called);
77485
  }
77486
77487
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
77488
}
77489
77490
// -------- func wbmp.decoder.decode_image_config
77491
77492
WUFFS_BASE__GENERATED_C_CODE
77493
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
77494
wuffs_wbmp__decoder__decode_image_config(
77495
    wuffs_wbmp__decoder* self,
77496
    wuffs_base__image_config* a_dst,
77497
    wuffs_base__io_buffer* a_src) {
77498
  if (!self) {
77499
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
77500
  }
77501
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
77502
    return wuffs_base__make_status(
77503
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
77504
        ? wuffs_base__error__disabled_by_previous_error
77505
        : wuffs_base__error__initialize_not_called);
77506
  }
77507
  if (!a_src) {
77508
    self->private_impl.magic = WUFFS_BASE__DISABLED;
77509
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
77510
  }
77511
  if ((self->private_impl.active_coroutine != 0) &&
77512
      (self->private_impl.active_coroutine != 1)) {
77513
    self->private_impl.magic = WUFFS_BASE__DISABLED;
77514
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
77515
  }
77516
  self->private_impl.active_coroutine = 0;
77517
  wuffs_base__status status = wuffs_base__make_status(NULL);
77518
77519
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
77520
77521
  uint32_t coro_susp_point = self->private_impl.p_decode_image_config;
77522
  switch (coro_susp_point) {
77523
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
77524
77525
    while (true) {
77526
      {
77527
        wuffs_base__status t_0 = wuffs_wbmp__decoder__do_decode_image_config(self, a_dst, a_src);
77528
        v_status = t_0;
77529
      }
77530
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
77531
        status = wuffs_base__make_status(wuffs_wbmp__error__truncated_input);
77532
        goto exit;
77533
      }
77534
      status = v_status;
77535
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
77536
    }
77537
77538
    ok:
77539
    self->private_impl.p_decode_image_config = 0;
77540
    goto exit;
77541
  }
77542
77543
  goto suspend;
77544
  suspend:
77545
  self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
77546
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
77547
77548
  goto exit;
77549
  exit:
77550
  if (wuffs_base__status__is_error(&status)) {
77551
    self->private_impl.magic = WUFFS_BASE__DISABLED;
77552
  }
77553
  return status;
77554
}
77555
77556
// -------- func wbmp.decoder.do_decode_image_config
77557
77558
WUFFS_BASE__GENERATED_C_CODE
77559
static wuffs_base__status
77560
wuffs_wbmp__decoder__do_decode_image_config(
77561
    wuffs_wbmp__decoder* self,
77562
    wuffs_base__image_config* a_dst,
77563
    wuffs_base__io_buffer* a_src) {
77564
  wuffs_base__status status = wuffs_base__make_status(NULL);
77565
77566
  uint8_t v_c8 = 0;
77567
  uint32_t v_i = 0;
77568
  uint32_t v_p = 0;
77569
77570
  const uint8_t* iop_a_src = NULL;
77571
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
77572
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
77573
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
77574
  if (a_src && a_src->data.ptr) {
77575
    io0_a_src = a_src->data.ptr;
77576
    io1_a_src = io0_a_src + a_src->meta.ri;
77577
    iop_a_src = io1_a_src;
77578
    io2_a_src = io0_a_src + a_src->meta.wi;
77579
  }
77580
77581
  uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config;
77582
  if (coro_susp_point) {
77583
    v_i = self->private_data.s_do_decode_image_config.v_i;
77584
    v_p = self->private_data.s_do_decode_image_config.v_p;
77585
  }
77586
  switch (coro_susp_point) {
77587
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
77588
77589
    if (self->private_impl.f_call_sequence != 0u) {
77590
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
77591
      goto exit;
77592
    }
77593
    v_i = 0u;
77594
    while (v_i < 2u) {
77595
      {
77596
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
77597
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
77598
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
77599
          goto suspend;
77600
        }
77601
        uint8_t t_0 = *iop_a_src++;
77602
        v_c8 = t_0;
77603
      }
77604
      if (v_c8 != 0u) {
77605
        status = wuffs_base__make_status(wuffs_wbmp__error__bad_header);
77606
        goto exit;
77607
      }
77608
      v_i += 1u;
77609
    }
77610
    v_i = 0u;
77611
    while (v_i < 2u) {
77612
      v_p = 0u;
77613
      while (true) {
77614
        {
77615
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
77616
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
77617
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
77618
            goto suspend;
77619
          }
77620
          uint8_t t_1 = *iop_a_src++;
77621
          v_c8 = t_1;
77622
        }
77623
        v_p |= ((uint32_t)(((uint8_t)(v_c8 & 127u))));
77624
        if (((uint8_t)(v_c8 >> 7u)) == 0u) {
77625
          break;
77626
        } else if (v_p > 131071u) {
77627
          status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension);
77628
          goto exit;
77629
        }
77630
        v_p <<= 7u;
77631
      }
77632
      if (v_i == 0u) {
77633
        self->private_impl.f_width = v_p;
77634
      } else {
77635
        self->private_impl.f_height = v_p;
77636
      }
77637
      v_i += 1u;
77638
    }
77639
    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)));
77640
    if (a_dst != NULL) {
77641
      wuffs_base__image_config__set(
77642
          a_dst,
77643
          2198077448u,
77644
          0u,
77645
          self->private_impl.f_width,
77646
          self->private_impl.f_height,
77647
          self->private_impl.f_frame_config_io_position,
77648
          true);
77649
    }
77650
    self->private_impl.f_call_sequence = 32u;
77651
77652
    goto ok;
77653
    ok:
77654
    self->private_impl.p_do_decode_image_config = 0;
77655
    goto exit;
77656
  }
77657
77658
  goto suspend;
77659
  suspend:
77660
  self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
77661
  self->private_data.s_do_decode_image_config.v_i = v_i;
77662
  self->private_data.s_do_decode_image_config.v_p = v_p;
77663
77664
  goto exit;
77665
  exit:
77666
  if (a_src && a_src->data.ptr) {
77667
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
77668
  }
77669
77670
  return status;
77671
}
77672
77673
// -------- func wbmp.decoder.decode_frame_config
77674
77675
WUFFS_BASE__GENERATED_C_CODE
77676
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
77677
wuffs_wbmp__decoder__decode_frame_config(
77678
    wuffs_wbmp__decoder* self,
77679
    wuffs_base__frame_config* a_dst,
77680
    wuffs_base__io_buffer* a_src) {
77681
  if (!self) {
77682
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
77683
  }
77684
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
77685
    return wuffs_base__make_status(
77686
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
77687
        ? wuffs_base__error__disabled_by_previous_error
77688
        : wuffs_base__error__initialize_not_called);
77689
  }
77690
  if (!a_src) {
77691
    self->private_impl.magic = WUFFS_BASE__DISABLED;
77692
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
77693
  }
77694
  if ((self->private_impl.active_coroutine != 0) &&
77695
      (self->private_impl.active_coroutine != 2)) {
77696
    self->private_impl.magic = WUFFS_BASE__DISABLED;
77697
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
77698
  }
77699
  self->private_impl.active_coroutine = 0;
77700
  wuffs_base__status status = wuffs_base__make_status(NULL);
77701
77702
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
77703
77704
  uint32_t coro_susp_point = self->private_impl.p_decode_frame_config;
77705
  switch (coro_susp_point) {
77706
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
77707
77708
    while (true) {
77709
      {
77710
        wuffs_base__status t_0 = wuffs_wbmp__decoder__do_decode_frame_config(self, a_dst, a_src);
77711
        v_status = t_0;
77712
      }
77713
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
77714
        status = wuffs_base__make_status(wuffs_wbmp__error__truncated_input);
77715
        goto exit;
77716
      }
77717
      status = v_status;
77718
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
77719
    }
77720
77721
    ok:
77722
    self->private_impl.p_decode_frame_config = 0;
77723
    goto exit;
77724
  }
77725
77726
  goto suspend;
77727
  suspend:
77728
  self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
77729
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0;
77730
77731
  goto exit;
77732
  exit:
77733
  if (wuffs_base__status__is_error(&status)) {
77734
    self->private_impl.magic = WUFFS_BASE__DISABLED;
77735
  }
77736
  return status;
77737
}
77738
77739
// -------- func wbmp.decoder.do_decode_frame_config
77740
77741
WUFFS_BASE__GENERATED_C_CODE
77742
static wuffs_base__status
77743
wuffs_wbmp__decoder__do_decode_frame_config(
77744
    wuffs_wbmp__decoder* self,
77745
    wuffs_base__frame_config* a_dst,
77746
    wuffs_base__io_buffer* a_src) {
77747
  wuffs_base__status status = wuffs_base__make_status(NULL);
77748
77749
  const uint8_t* iop_a_src = NULL;
77750
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
77751
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
77752
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
77753
  if (a_src && a_src->data.ptr) {
77754
    io0_a_src = a_src->data.ptr;
77755
    io1_a_src = io0_a_src + a_src->meta.ri;
77756
    iop_a_src = io1_a_src;
77757
    io2_a_src = io0_a_src + a_src->meta.wi;
77758
  }
77759
77760
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config;
77761
  switch (coro_susp_point) {
77762
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
77763
77764
    if (self->private_impl.f_call_sequence == 32u) {
77765
    } else if (self->private_impl.f_call_sequence < 32u) {
77766
      if (a_src) {
77767
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
77768
      }
77769
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
77770
      status = wuffs_wbmp__decoder__do_decode_image_config(self, NULL, a_src);
77771
      if (a_src) {
77772
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
77773
      }
77774
      if (status.repr) {
77775
        goto suspend;
77776
      }
77777
    } else if (self->private_impl.f_call_sequence == 40u) {
77778
      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)))) {
77779
        status = wuffs_base__make_status(wuffs_base__error__bad_restart);
77780
        goto exit;
77781
      }
77782
    } else if (self->private_impl.f_call_sequence == 64u) {
77783
      self->private_impl.f_call_sequence = 96u;
77784
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
77785
      goto ok;
77786
    } else {
77787
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
77788
      goto ok;
77789
    }
77790
    if (a_dst != NULL) {
77791
      wuffs_base__frame_config__set(
77792
          a_dst,
77793
          wuffs_base__utility__make_rect_ie_u32(
77794
          0u,
77795
          0u,
77796
          self->private_impl.f_width,
77797
          self->private_impl.f_height),
77798
          ((wuffs_base__flicks)(0u)),
77799
          0u,
77800
          self->private_impl.f_frame_config_io_position,
77801
          0u,
77802
          true,
77803
          false,
77804
          4278190080u);
77805
    }
77806
    self->private_impl.f_call_sequence = 64u;
77807
77808
    ok:
77809
    self->private_impl.p_do_decode_frame_config = 0;
77810
    goto exit;
77811
  }
77812
77813
  goto suspend;
77814
  suspend:
77815
  self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
77816
77817
  goto exit;
77818
  exit:
77819
  if (a_src && a_src->data.ptr) {
77820
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
77821
  }
77822
77823
  return status;
77824
}
77825
77826
// -------- func wbmp.decoder.decode_frame
77827
77828
WUFFS_BASE__GENERATED_C_CODE
77829
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
77830
wuffs_wbmp__decoder__decode_frame(
77831
    wuffs_wbmp__decoder* self,
77832
    wuffs_base__pixel_buffer* a_dst,
77833
    wuffs_base__io_buffer* a_src,
77834
    wuffs_base__pixel_blend a_blend,
77835
    wuffs_base__slice_u8 a_workbuf,
77836
    wuffs_base__decode_frame_options* a_opts) {
77837
  if (!self) {
77838
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
77839
  }
77840
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
77841
    return wuffs_base__make_status(
77842
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
77843
        ? wuffs_base__error__disabled_by_previous_error
77844
        : wuffs_base__error__initialize_not_called);
77845
  }
77846
  if (!a_dst || !a_src) {
77847
    self->private_impl.magic = WUFFS_BASE__DISABLED;
77848
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
77849
  }
77850
  if ((self->private_impl.active_coroutine != 0) &&
77851
      (self->private_impl.active_coroutine != 3)) {
77852
    self->private_impl.magic = WUFFS_BASE__DISABLED;
77853
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
77854
  }
77855
  self->private_impl.active_coroutine = 0;
77856
  wuffs_base__status status = wuffs_base__make_status(NULL);
77857
77858
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
77859
77860
  uint32_t coro_susp_point = self->private_impl.p_decode_frame;
77861
  switch (coro_susp_point) {
77862
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
77863
77864
    while (true) {
77865
      {
77866
        wuffs_base__status t_0 = wuffs_wbmp__decoder__do_decode_frame(self,
77867
            a_dst,
77868
            a_src,
77869
            a_blend,
77870
            a_workbuf,
77871
            a_opts);
77872
        v_status = t_0;
77873
      }
77874
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
77875
        status = wuffs_base__make_status(wuffs_wbmp__error__truncated_input);
77876
        goto exit;
77877
      }
77878
      status = v_status;
77879
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
77880
    }
77881
77882
    ok:
77883
    self->private_impl.p_decode_frame = 0;
77884
    goto exit;
77885
  }
77886
77887
  goto suspend;
77888
  suspend:
77889
  self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
77890
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0;
77891
77892
  goto exit;
77893
  exit:
77894
  if (wuffs_base__status__is_error(&status)) {
77895
    self->private_impl.magic = WUFFS_BASE__DISABLED;
77896
  }
77897
  return status;
77898
}
77899
77900
// -------- func wbmp.decoder.do_decode_frame
77901
77902
WUFFS_BASE__GENERATED_C_CODE
77903
static wuffs_base__status
77904
wuffs_wbmp__decoder__do_decode_frame(
77905
    wuffs_wbmp__decoder* self,
77906
    wuffs_base__pixel_buffer* a_dst,
77907
    wuffs_base__io_buffer* a_src,
77908
    wuffs_base__pixel_blend a_blend,
77909
    wuffs_base__slice_u8 a_workbuf,
77910
    wuffs_base__decode_frame_options* a_opts) {
77911
  wuffs_base__status status = wuffs_base__make_status(NULL);
77912
77913
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
77914
  wuffs_base__pixel_format v_dst_pixfmt = {0};
77915
  uint32_t v_dst_bits_per_pixel = 0;
77916
  uint64_t v_dst_bytes_per_pixel = 0;
77917
  uint64_t v_dst_x_in_bytes = 0;
77918
  uint32_t v_dst_x = 0;
77919
  uint32_t v_dst_y = 0;
77920
  wuffs_base__table_u8 v_tab = {0};
77921
  wuffs_base__slice_u8 v_dst = {0};
77922
  uint8_t v_src[1] = {0};
77923
  uint8_t v_c8 = 0;
77924
77925
  const uint8_t* iop_a_src = NULL;
77926
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
77927
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
77928
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
77929
  if (a_src && a_src->data.ptr) {
77930
    io0_a_src = a_src->data.ptr;
77931
    io1_a_src = io0_a_src + a_src->meta.ri;
77932
    iop_a_src = io1_a_src;
77933
    io2_a_src = io0_a_src + a_src->meta.wi;
77934
  }
77935
77936
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame;
77937
  if (coro_susp_point) {
77938
    v_dst_bytes_per_pixel = self->private_data.s_do_decode_frame.v_dst_bytes_per_pixel;
77939
    v_dst_x = self->private_data.s_do_decode_frame.v_dst_x;
77940
    v_dst_y = self->private_data.s_do_decode_frame.v_dst_y;
77941
    memcpy(v_src, self->private_data.s_do_decode_frame.v_src, sizeof(v_src));
77942
    v_c8 = self->private_data.s_do_decode_frame.v_c8;
77943
  }
77944
  switch (coro_susp_point) {
77945
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
77946
77947
    if (self->private_impl.f_call_sequence == 64u) {
77948
    } else if (self->private_impl.f_call_sequence < 64u) {
77949
      if (a_src) {
77950
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
77951
      }
77952
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
77953
      status = wuffs_wbmp__decoder__do_decode_frame_config(self, NULL, a_src);
77954
      if (a_src) {
77955
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
77956
      }
77957
      if (status.repr) {
77958
        goto suspend;
77959
      }
77960
    } else {
77961
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
77962
      goto ok;
77963
    }
77964
    v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler,
77965
        wuffs_base__pixel_buffer__pixel_format(a_dst),
77966
        wuffs_base__pixel_buffer__palette(a_dst),
77967
        wuffs_base__utility__make_pixel_format(536870920u),
77968
        wuffs_base__utility__empty_slice_u8(),
77969
        a_blend);
77970
    if ( ! wuffs_base__status__is_ok(&v_status)) {
77971
      status = v_status;
77972
      if (wuffs_base__status__is_error(&status)) {
77973
        goto exit;
77974
      } else if (wuffs_base__status__is_suspension(&status)) {
77975
        status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
77976
        goto exit;
77977
      }
77978
      goto ok;
77979
    }
77980
    v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
77981
    v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
77982
    if ((v_dst_bits_per_pixel & 7u) != 0u) {
77983
      status = wuffs_base__make_status(wuffs_base__error__unsupported_option);
77984
      goto exit;
77985
    }
77986
    v_dst_bytes_per_pixel = ((uint64_t)((v_dst_bits_per_pixel / 8u)));
77987
    if (self->private_impl.f_width > 0u) {
77988
      v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
77989
      while (v_dst_y < self->private_impl.f_height) {
77990
        v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_dst_y);
77991
        v_dst_x = 0u;
77992
        while (v_dst_x < self->private_impl.f_width) {
77993
          if ((v_dst_x & 7u) == 0u) {
77994
            while (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
77995
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
77996
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2);
77997
              v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
77998
              v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_dst_y);
77999
              v_dst_x_in_bytes = (((uint64_t)(v_dst_x)) * v_dst_bytes_per_pixel);
78000
              if (v_dst_x_in_bytes <= ((uint64_t)(v_dst.len))) {
78001
                v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_x_in_bytes);
78002
              }
78003
            }
78004
            v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
78005
            iop_a_src += 1u;
78006
          }
78007
          if (((uint8_t)(v_c8 & 128u)) == 0u) {
78008
            v_src[0u] = 0u;
78009
          } else {
78010
            v_src[0u] = 255u;
78011
          }
78012
          v_c8 = ((uint8_t)((((uint32_t)(v_c8)) << 1u)));
78013
          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));
78014
          if (v_dst_bytes_per_pixel <= ((uint64_t)(v_dst.len))) {
78015
            v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_bytes_per_pixel);
78016
          }
78017
          v_dst_x += 1u;
78018
        }
78019
        v_dst_y += 1u;
78020
      }
78021
    }
78022
    self->private_impl.f_call_sequence = 96u;
78023
78024
    ok:
78025
    self->private_impl.p_do_decode_frame = 0;
78026
    goto exit;
78027
  }
78028
78029
  goto suspend;
78030
  suspend:
78031
  self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
78032
  self->private_data.s_do_decode_frame.v_dst_bytes_per_pixel = v_dst_bytes_per_pixel;
78033
  self->private_data.s_do_decode_frame.v_dst_x = v_dst_x;
78034
  self->private_data.s_do_decode_frame.v_dst_y = v_dst_y;
78035
  memcpy(self->private_data.s_do_decode_frame.v_src, v_src, sizeof(v_src));
78036
  self->private_data.s_do_decode_frame.v_c8 = v_c8;
78037
78038
  goto exit;
78039
  exit:
78040
  if (a_src && a_src->data.ptr) {
78041
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
78042
  }
78043
78044
  return status;
78045
}
78046
78047
// -------- func wbmp.decoder.frame_dirty_rect
78048
78049
WUFFS_BASE__GENERATED_C_CODE
78050
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
78051
wuffs_wbmp__decoder__frame_dirty_rect(
78052
    const wuffs_wbmp__decoder* self) {
78053
  if (!self) {
78054
    return wuffs_base__utility__empty_rect_ie_u32();
78055
  }
78056
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
78057
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
78058
    return wuffs_base__utility__empty_rect_ie_u32();
78059
  }
78060
78061
  return wuffs_base__utility__make_rect_ie_u32(
78062
      0u,
78063
      0u,
78064
      self->private_impl.f_width,
78065
      self->private_impl.f_height);
78066
}
78067
78068
// -------- func wbmp.decoder.num_animation_loops
78069
78070
WUFFS_BASE__GENERATED_C_CODE
78071
WUFFS_BASE__MAYBE_STATIC uint32_t
78072
wuffs_wbmp__decoder__num_animation_loops(
78073
    const wuffs_wbmp__decoder* self) {
78074
  if (!self) {
78075
    return 0;
78076
  }
78077
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
78078
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
78079
    return 0;
78080
  }
78081
78082
  return 0u;
78083
}
78084
78085
// -------- func wbmp.decoder.num_decoded_frame_configs
78086
78087
WUFFS_BASE__GENERATED_C_CODE
78088
WUFFS_BASE__MAYBE_STATIC uint64_t
78089
wuffs_wbmp__decoder__num_decoded_frame_configs(
78090
    const wuffs_wbmp__decoder* self) {
78091
  if (!self) {
78092
    return 0;
78093
  }
78094
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
78095
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
78096
    return 0;
78097
  }
78098
78099
  if (self->private_impl.f_call_sequence > 32u) {
78100
    return 1u;
78101
  }
78102
  return 0u;
78103
}
78104
78105
// -------- func wbmp.decoder.num_decoded_frames
78106
78107
WUFFS_BASE__GENERATED_C_CODE
78108
WUFFS_BASE__MAYBE_STATIC uint64_t
78109
wuffs_wbmp__decoder__num_decoded_frames(
78110
    const wuffs_wbmp__decoder* self) {
78111
  if (!self) {
78112
    return 0;
78113
  }
78114
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
78115
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
78116
    return 0;
78117
  }
78118
78119
  if (self->private_impl.f_call_sequence > 64u) {
78120
    return 1u;
78121
  }
78122
  return 0u;
78123
}
78124
78125
// -------- func wbmp.decoder.restart_frame
78126
78127
WUFFS_BASE__GENERATED_C_CODE
78128
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
78129
wuffs_wbmp__decoder__restart_frame(
78130
    wuffs_wbmp__decoder* self,
78131
    uint64_t a_index,
78132
    uint64_t a_io_position) {
78133
  if (!self) {
78134
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
78135
  }
78136
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
78137
    return wuffs_base__make_status(
78138
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
78139
        ? wuffs_base__error__disabled_by_previous_error
78140
        : wuffs_base__error__initialize_not_called);
78141
  }
78142
78143
  if (self->private_impl.f_call_sequence < 32u) {
78144
    return wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
78145
  }
78146
  if (a_index != 0u) {
78147
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
78148
  }
78149
  self->private_impl.f_call_sequence = 40u;
78150
  self->private_impl.f_frame_config_io_position = a_io_position;
78151
  return wuffs_base__make_status(NULL);
78152
}
78153
78154
// -------- func wbmp.decoder.set_report_metadata
78155
78156
WUFFS_BASE__GENERATED_C_CODE
78157
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
78158
wuffs_wbmp__decoder__set_report_metadata(
78159
    wuffs_wbmp__decoder* self,
78160
    uint32_t a_fourcc,
78161
    bool a_report) {
78162
  return wuffs_base__make_empty_struct();
78163
}
78164
78165
// -------- func wbmp.decoder.tell_me_more
78166
78167
WUFFS_BASE__GENERATED_C_CODE
78168
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
78169
wuffs_wbmp__decoder__tell_me_more(
78170
    wuffs_wbmp__decoder* self,
78171
    wuffs_base__io_buffer* a_dst,
78172
    wuffs_base__more_information* a_minfo,
78173
    wuffs_base__io_buffer* a_src) {
78174
  if (!self) {
78175
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
78176
  }
78177
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
78178
    return wuffs_base__make_status(
78179
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
78180
        ? wuffs_base__error__disabled_by_previous_error
78181
        : wuffs_base__error__initialize_not_called);
78182
  }
78183
  if (!a_dst || !a_src) {
78184
    self->private_impl.magic = WUFFS_BASE__DISABLED;
78185
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
78186
  }
78187
  if ((self->private_impl.active_coroutine != 0) &&
78188
      (self->private_impl.active_coroutine != 4)) {
78189
    self->private_impl.magic = WUFFS_BASE__DISABLED;
78190
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
78191
  }
78192
  self->private_impl.active_coroutine = 0;
78193
  wuffs_base__status status = wuffs_base__make_status(NULL);
78194
78195
  status = wuffs_base__make_status(wuffs_base__error__no_more_information);
78196
  goto exit;
78197
78198
  goto ok;
78199
  ok:
78200
  goto exit;
78201
  exit:
78202
  if (wuffs_base__status__is_error(&status)) {
78203
    self->private_impl.magic = WUFFS_BASE__DISABLED;
78204
  }
78205
  return status;
78206
}
78207
78208
// -------- func wbmp.decoder.workbuf_len
78209
78210
WUFFS_BASE__GENERATED_C_CODE
78211
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
78212
wuffs_wbmp__decoder__workbuf_len(
78213
    const wuffs_wbmp__decoder* self) {
78214
  if (!self) {
78215
    return wuffs_base__utility__empty_range_ii_u64();
78216
  }
78217
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
78218
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
78219
    return wuffs_base__utility__empty_range_ii_u64();
78220
  }
78221
78222
  return wuffs_base__utility__make_range_ii_u64(0u, 0u);
78223
}
78224
78225
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WBMP)
78226
78227
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WEBP)
78228
78229
// ---------------- Status Codes Implementations
78230
78231
const char wuffs_webp__error__bad_huffman_code_over_subscribed[] = "#webp: bad Huffman code (over-subscribed)";
78232
const char wuffs_webp__error__bad_huffman_code_under_subscribed[] = "#webp: bad Huffman code (under-subscribed)";
78233
const char wuffs_webp__error__bad_huffman_code[] = "#webp: bad Huffman code";
78234
const char wuffs_webp__error__bad_back_reference[] = "#webp: bad back-reference";
78235
const char wuffs_webp__error__bad_color_cache[] = "#webp: bad color cache";
78236
const char wuffs_webp__error__bad_header[] = "#webp: bad header";
78237
const char wuffs_webp__error__bad_transform[] = "#webp: bad transform";
78238
const char wuffs_webp__error__short_chunk[] = "#webp: short chunk";
78239
const char wuffs_webp__error__truncated_input[] = "#webp: truncated input";
78240
const char wuffs_webp__error__unsupported_number_of_huffman_groups[] = "#webp: unsupported number of Huffman groups";
78241
const char wuffs_webp__error__unsupported_transform_after_color_indexing_transform[] = "#webp: unsupported transform after color indexing transform";
78242
const char wuffs_webp__error__unsupported_webp_file[] = "#webp: unsupported WebP file";
78243
const char wuffs_webp__error__internal_error_inconsistent_huffman_code[] = "#webp: internal error: inconsistent Huffman code";
78244
const char wuffs_webp__error__internal_error_inconsistent_dst_buffer[] = "#webp: internal error: inconsistent dst buffer";
78245
const char wuffs_webp__error__internal_error_inconsistent_n_bits[] = "#webp: internal error: inconsistent n_bits";
78246
78247
// ---------------- Private Consts
78248
78249
static const uint8_t
78250
WUFFS_WEBP__CODE_LENGTH_CODE_ORDER[19] WUFFS_BASE__POTENTIALLY_UNUSED = {
78251
  17u, 18u, 0u, 1u, 2u, 3u, 4u, 5u,
78252
  16u, 6u, 7u, 8u, 9u, 10u, 11u, 12u,
78253
  13u, 14u, 15u,
78254
};
78255
78256
static const uint8_t
78257
WUFFS_WEBP__REPEAT_N_BITS[4] WUFFS_BASE__POTENTIALLY_UNUSED = {
78258
  2u, 3u, 7u, 0u,
78259
};
78260
78261
static const uint8_t
78262
WUFFS_WEBP__REPEAT_COUNTS[4] WUFFS_BASE__POTENTIALLY_UNUSED = {
78263
  3u, 3u, 11u, 0u,
78264
};
78265
78266
static const uint16_t
78267
WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[5] WUFFS_BASE__POTENTIALLY_UNUSED = {
78268
  1612u, 0u, 511u, 1022u, 1533u,
78269
};
78270
78271
static const uint8_t
78272
WUFFS_WEBP__DISTANCE_MAP[120] WUFFS_BASE__POTENTIALLY_UNUSED = {
78273
  24u, 7u, 23u, 25u, 40u, 6u, 39u, 41u,
78274
  22u, 26u, 38u, 42u, 56u, 5u, 55u, 57u,
78275
  21u, 27u, 54u, 58u, 37u, 43u, 72u, 4u,
78276
  71u, 73u, 20u, 28u, 53u, 59u, 70u, 74u,
78277
  36u, 44u, 88u, 69u, 75u, 52u, 60u, 3u,
78278
  87u, 89u, 19u, 29u, 86u, 90u, 35u, 45u,
78279
  68u, 76u, 85u, 91u, 51u, 61u, 104u, 2u,
78280
  103u, 105u, 18u, 30u, 102u, 106u, 34u, 46u,
78281
  84u, 92u, 67u, 77u, 101u, 107u, 50u, 62u,
78282
  120u, 1u, 119u, 121u, 83u, 93u, 17u, 31u,
78283
  100u, 108u, 66u, 78u, 118u, 122u, 33u, 47u,
78284
  117u, 123u, 49u, 63u, 99u, 109u, 82u, 94u,
78285
  0u, 116u, 124u, 65u, 79u, 16u, 32u, 98u,
78286
  110u, 48u, 115u, 125u, 81u, 95u, 64u, 114u,
78287
  126u, 97u, 111u, 80u, 113u, 127u, 96u, 112u,
78288
};
78289
78290
// ---------------- Private Initializer Prototypes
78291
78292
// ---------------- Private Function Prototypes
78293
78294
WUFFS_BASE__GENERATED_C_CODE
78295
static wuffs_base__status
78296
wuffs_webp__decoder__decode_huffman_groups(
78297
    wuffs_webp__decoder* self,
78298
    wuffs_base__io_buffer* a_src,
78299
    uint32_t a_n_huffman_groups);
78300
78301
WUFFS_BASE__GENERATED_C_CODE
78302
static wuffs_base__status
78303
wuffs_webp__decoder__decode_huffman_tree(
78304
    wuffs_webp__decoder* self,
78305
    wuffs_base__io_buffer* a_src,
78306
    uint32_t a_hg,
78307
    uint32_t a_ht);
78308
78309
WUFFS_BASE__GENERATED_C_CODE
78310
static wuffs_base__status
78311
wuffs_webp__decoder__decode_huffman_tree_simple(
78312
    wuffs_webp__decoder* self,
78313
    wuffs_base__io_buffer* a_src,
78314
    uint32_t a_hg,
78315
    uint32_t a_ht);
78316
78317
WUFFS_BASE__GENERATED_C_CODE
78318
static wuffs_base__status
78319
wuffs_webp__decoder__decode_code_length_code_lengths(
78320
    wuffs_webp__decoder* self,
78321
    wuffs_base__io_buffer* a_src);
78322
78323
WUFFS_BASE__GENERATED_C_CODE
78324
static wuffs_base__status
78325
wuffs_webp__decoder__build_code_lengths_huffman_nodes(
78326
    wuffs_webp__decoder* self);
78327
78328
WUFFS_BASE__GENERATED_C_CODE
78329
static wuffs_base__status
78330
wuffs_webp__decoder__build_huffman_nodes(
78331
    wuffs_webp__decoder* self,
78332
    uint32_t a_hg,
78333
    uint32_t a_ht);
78334
78335
WUFFS_BASE__GENERATED_C_CODE
78336
static wuffs_base__status
78337
wuffs_webp__decoder__build_code_lengths(
78338
    wuffs_webp__decoder* self,
78339
    wuffs_base__io_buffer* a_src);
78340
78341
WUFFS_BASE__GENERATED_C_CODE
78342
static wuffs_base__status
78343
wuffs_webp__decoder__decode_pixels_slow(
78344
    wuffs_webp__decoder* self,
78345
    wuffs_base__slice_u8 a_dst,
78346
    wuffs_base__io_buffer* a_src,
78347
    uint32_t a_width,
78348
    uint32_t a_height,
78349
    wuffs_base__slice_u8 a_tile_data,
78350
    uint32_t a_tile_size_log2);
78351
78352
WUFFS_BASE__GENERATED_C_CODE
78353
static wuffs_base__empty_struct
78354
wuffs_webp__decoder__apply_transform_predictor(
78355
    wuffs_webp__decoder* self,
78356
    wuffs_base__slice_u8 a_pix,
78357
    wuffs_base__slice_u8 a_tile_data);
78358
78359
WUFFS_BASE__GENERATED_C_CODE
78360
static uint32_t
78361
wuffs_webp__decoder__absolute_difference(
78362
    const wuffs_webp__decoder* self,
78363
    uint32_t a_a,
78364
    uint32_t a_b);
78365
78366
WUFFS_BASE__GENERATED_C_CODE
78367
static uint8_t
78368
wuffs_webp__decoder__mode12(
78369
    const wuffs_webp__decoder* self,
78370
    uint8_t a_l,
78371
    uint8_t a_t,
78372
    uint8_t a_tl);
78373
78374
WUFFS_BASE__GENERATED_C_CODE
78375
static uint8_t
78376
wuffs_webp__decoder__mode13(
78377
    const wuffs_webp__decoder* self,
78378
    uint8_t a_l,
78379
    uint8_t a_t,
78380
    uint8_t a_tl);
78381
78382
WUFFS_BASE__GENERATED_C_CODE
78383
static wuffs_base__empty_struct
78384
wuffs_webp__decoder__apply_transform_cross_color(
78385
    wuffs_webp__decoder* self,
78386
    wuffs_base__slice_u8 a_pix,
78387
    wuffs_base__slice_u8 a_tile_data);
78388
78389
WUFFS_BASE__GENERATED_C_CODE
78390
static wuffs_base__empty_struct
78391
wuffs_webp__decoder__apply_transform_subtract_green(
78392
    wuffs_webp__decoder* self,
78393
    wuffs_base__slice_u8 a_pix);
78394
78395
WUFFS_BASE__GENERATED_C_CODE
78396
static wuffs_base__empty_struct
78397
wuffs_webp__decoder__apply_transform_color_indexing(
78398
    wuffs_webp__decoder* self,
78399
    wuffs_base__slice_u8 a_pix);
78400
78401
WUFFS_BASE__GENERATED_C_CODE
78402
static wuffs_base__status
78403
wuffs_webp__decoder__do_decode_image_config(
78404
    wuffs_webp__decoder* self,
78405
    wuffs_base__image_config* a_dst,
78406
    wuffs_base__io_buffer* a_src);
78407
78408
WUFFS_BASE__GENERATED_C_CODE
78409
static wuffs_base__status
78410
wuffs_webp__decoder__do_decode_image_config_limited(
78411
    wuffs_webp__decoder* self,
78412
    wuffs_base__image_config* a_dst,
78413
    wuffs_base__io_buffer* a_src);
78414
78415
WUFFS_BASE__GENERATED_C_CODE
78416
static wuffs_base__status
78417
wuffs_webp__decoder__do_decode_image_config_limited_vp8l(
78418
    wuffs_webp__decoder* self,
78419
    wuffs_base__io_buffer* a_src);
78420
78421
WUFFS_BASE__GENERATED_C_CODE
78422
static wuffs_base__status
78423
wuffs_webp__decoder__do_decode_frame_config(
78424
    wuffs_webp__decoder* self,
78425
    wuffs_base__frame_config* a_dst,
78426
    wuffs_base__io_buffer* a_src);
78427
78428
WUFFS_BASE__GENERATED_C_CODE
78429
static wuffs_base__status
78430
wuffs_webp__decoder__do_decode_frame(
78431
    wuffs_webp__decoder* self,
78432
    wuffs_base__pixel_buffer* a_dst,
78433
    wuffs_base__io_buffer* a_src,
78434
    wuffs_base__pixel_blend a_blend,
78435
    wuffs_base__slice_u8 a_workbuf,
78436
    wuffs_base__decode_frame_options* a_opts);
78437
78438
WUFFS_BASE__GENERATED_C_CODE
78439
static wuffs_base__status
78440
wuffs_webp__decoder__decode_transform(
78441
    wuffs_webp__decoder* self,
78442
    wuffs_base__io_buffer* a_src,
78443
    wuffs_base__slice_u8 a_workbuf);
78444
78445
WUFFS_BASE__GENERATED_C_CODE
78446
static wuffs_base__status
78447
wuffs_webp__decoder__decode_color_cache_parameters(
78448
    wuffs_webp__decoder* self,
78449
    wuffs_base__io_buffer* a_src);
78450
78451
WUFFS_BASE__GENERATED_C_CODE
78452
static wuffs_base__status
78453
wuffs_webp__decoder__decode_hg_table(
78454
    wuffs_webp__decoder* self,
78455
    wuffs_base__io_buffer* a_src,
78456
    uint32_t a_width,
78457
    wuffs_base__slice_u8 a_workbuf);
78458
78459
WUFFS_BASE__GENERATED_C_CODE
78460
static wuffs_base__status
78461
wuffs_webp__decoder__decode_pixels(
78462
    wuffs_webp__decoder* self,
78463
    wuffs_base__slice_u8 a_dst,
78464
    wuffs_base__io_buffer* a_src,
78465
    uint32_t a_width,
78466
    uint32_t a_height,
78467
    wuffs_base__slice_u8 a_tile_data,
78468
    uint32_t a_tile_size_log2);
78469
78470
WUFFS_BASE__GENERATED_C_CODE
78471
static wuffs_base__status
78472
wuffs_webp__decoder__swizzle(
78473
    wuffs_webp__decoder* self,
78474
    wuffs_base__pixel_buffer* a_dst,
78475
    wuffs_base__slice_u8 a_src,
78476
    wuffs_base__pixel_blend a_blend);
78477
78478
// ---------------- VTables
78479
78480
const wuffs_base__image_decoder__func_ptrs
78481
wuffs_webp__decoder__func_ptrs_for__wuffs_base__image_decoder = {
78482
  (wuffs_base__status(*)(void*,
78483
      wuffs_base__pixel_buffer*,
78484
      wuffs_base__io_buffer*,
78485
      wuffs_base__pixel_blend,
78486
      wuffs_base__slice_u8,
78487
      wuffs_base__decode_frame_options*))(&wuffs_webp__decoder__decode_frame),
78488
  (wuffs_base__status(*)(void*,
78489
      wuffs_base__frame_config*,
78490
      wuffs_base__io_buffer*))(&wuffs_webp__decoder__decode_frame_config),
78491
  (wuffs_base__status(*)(void*,
78492
      wuffs_base__image_config*,
78493
      wuffs_base__io_buffer*))(&wuffs_webp__decoder__decode_image_config),
78494
  (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_webp__decoder__frame_dirty_rect),
78495
  (uint64_t(*)(const void*,
78496
      uint32_t))(&wuffs_webp__decoder__get_quirk),
78497
  (uint32_t(*)(const void*))(&wuffs_webp__decoder__num_animation_loops),
78498
  (uint64_t(*)(const void*))(&wuffs_webp__decoder__num_decoded_frame_configs),
78499
  (uint64_t(*)(const void*))(&wuffs_webp__decoder__num_decoded_frames),
78500
  (wuffs_base__status(*)(void*,
78501
      uint64_t,
78502
      uint64_t))(&wuffs_webp__decoder__restart_frame),
78503
  (wuffs_base__status(*)(void*,
78504
      uint32_t,
78505
      uint64_t))(&wuffs_webp__decoder__set_quirk),
78506
  (wuffs_base__empty_struct(*)(void*,
78507
      uint32_t,
78508
      bool))(&wuffs_webp__decoder__set_report_metadata),
78509
  (wuffs_base__status(*)(void*,
78510
      wuffs_base__io_buffer*,
78511
      wuffs_base__more_information*,
78512
      wuffs_base__io_buffer*))(&wuffs_webp__decoder__tell_me_more),
78513
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_webp__decoder__workbuf_len),
78514
};
78515
78516
// ---------------- Initializer Implementations
78517
78518
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
78519
wuffs_webp__decoder__initialize(
78520
    wuffs_webp__decoder* self,
78521
    size_t sizeof_star_self,
78522
    uint64_t wuffs_version,
78523
    uint32_t options){
78524
  if (!self) {
78525
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
78526
  }
78527
  if (sizeof(*self) != sizeof_star_self) {
78528
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
78529
  }
78530
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
78531
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
78532
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
78533
  }
78534
78535
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
78536
    // The whole point of this if-check is to detect an uninitialized *self.
78537
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
78538
#if !defined(__clang__) && defined(__GNUC__)
78539
#pragma GCC diagnostic push
78540
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
78541
#endif
78542
    if (self->private_impl.magic != 0) {
78543
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
78544
    }
78545
#if !defined(__clang__) && defined(__GNUC__)
78546
#pragma GCC diagnostic pop
78547
#endif
78548
  } else {
78549
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
78550
      memset(self, 0, sizeof(*self));
78551
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
78552
    } else {
78553
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
78554
    }
78555
  }
78556
78557
  {
78558
    wuffs_base__status z = wuffs_vp8__decoder__initialize(
78559
        &self->private_data.f_vp8, sizeof(self->private_data.f_vp8), WUFFS_VERSION, options);
78560
    if (z.repr) {
78561
      return z;
78562
    }
78563
  }
78564
  self->private_impl.magic = WUFFS_BASE__MAGIC;
78565
  self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name =
78566
      wuffs_base__image_decoder__vtable_name;
78567
  self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers =
78568
      (const void*)(&wuffs_webp__decoder__func_ptrs_for__wuffs_base__image_decoder);
78569
  return wuffs_base__make_status(NULL);
78570
}
78571
78572
wuffs_webp__decoder*
78573
wuffs_webp__decoder__alloc(void) {
78574
  wuffs_webp__decoder* x =
78575
      (wuffs_webp__decoder*)(calloc(1, sizeof(wuffs_webp__decoder)));
78576
  if (!x) {
78577
    return NULL;
78578
  }
78579
  if (wuffs_webp__decoder__initialize(
78580
      x, sizeof(wuffs_webp__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
78581
    free(x);
78582
    return NULL;
78583
  }
78584
  return x;
78585
}
78586
78587
size_t
78588
sizeof__wuffs_webp__decoder(void) {
78589
  return sizeof(wuffs_webp__decoder);
78590
}
78591
78592
// ---------------- Function Implementations
78593
78594
// -------- func webp.decoder.decode_huffman_groups
78595
78596
WUFFS_BASE__GENERATED_C_CODE
78597
static wuffs_base__status
78598
wuffs_webp__decoder__decode_huffman_groups(
78599
    wuffs_webp__decoder* self,
78600
    wuffs_base__io_buffer* a_src,
78601
    uint32_t a_n_huffman_groups) {
78602
  wuffs_base__status status = wuffs_base__make_status(NULL);
78603
78604
  uint32_t v_hg = 0;
78605
  uint32_t v_ht = 0;
78606
78607
  uint32_t coro_susp_point = self->private_impl.p_decode_huffman_groups;
78608
  if (coro_susp_point) {
78609
    v_hg = self->private_data.s_decode_huffman_groups.v_hg;
78610
    v_ht = self->private_data.s_decode_huffman_groups.v_ht;
78611
  }
78612
  switch (coro_susp_point) {
78613
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
78614
78615
    v_hg = 0u;
78616
    while (v_hg < a_n_huffman_groups) {
78617
      v_ht = 0u;
78618
      while (v_ht < 5u) {
78619
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
78620
        status = wuffs_webp__decoder__decode_huffman_tree(self, a_src, v_hg, v_ht);
78621
        if (status.repr) {
78622
          goto suspend;
78623
        }
78624
        v_ht += 1u;
78625
      }
78626
      v_hg += 1u;
78627
    }
78628
78629
    goto ok;
78630
    ok:
78631
    self->private_impl.p_decode_huffman_groups = 0;
78632
    goto exit;
78633
  }
78634
78635
  goto suspend;
78636
  suspend:
78637
  self->private_impl.p_decode_huffman_groups = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
78638
  self->private_data.s_decode_huffman_groups.v_hg = v_hg;
78639
  self->private_data.s_decode_huffman_groups.v_ht = v_ht;
78640
78641
  goto exit;
78642
  exit:
78643
  return status;
78644
}
78645
78646
// -------- func webp.decoder.decode_huffman_tree
78647
78648
WUFFS_BASE__GENERATED_C_CODE
78649
static wuffs_base__status
78650
wuffs_webp__decoder__decode_huffman_tree(
78651
    wuffs_webp__decoder* self,
78652
    wuffs_base__io_buffer* a_src,
78653
    uint32_t a_hg,
78654
    uint32_t a_ht) {
78655
  wuffs_base__status status = wuffs_base__make_status(NULL);
78656
78657
  uint8_t v_c8 = 0;
78658
  uint32_t v_use_simple = 0;
78659
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
78660
78661
  const uint8_t* iop_a_src = NULL;
78662
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
78663
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
78664
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
78665
  if (a_src && a_src->data.ptr) {
78666
    io0_a_src = a_src->data.ptr;
78667
    io1_a_src = io0_a_src + a_src->meta.ri;
78668
    iop_a_src = io1_a_src;
78669
    io2_a_src = io0_a_src + a_src->meta.wi;
78670
  }
78671
78672
  uint32_t coro_susp_point = self->private_impl.p_decode_huffman_tree;
78673
  switch (coro_susp_point) {
78674
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
78675
78676
    if (a_ht >= 4u) {
78677
      self->private_impl.f_ht_n_symbols = 40u;
78678
    } else if (a_ht > 0u) {
78679
      self->private_impl.f_ht_n_symbols = 256u;
78680
    } else if (self->private_impl.f_color_cache_bits == 0u) {
78681
      self->private_impl.f_ht_n_symbols = 280u;
78682
    } else {
78683
      self->private_impl.f_ht_n_symbols = (280u + (((uint32_t)(1u)) << self->private_impl.f_color_cache_bits));
78684
    }
78685
    if (self->private_impl.f_n_bits < 1u) {
78686
      {
78687
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
78688
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
78689
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
78690
          goto suspend;
78691
        }
78692
        uint8_t t_0 = *iop_a_src++;
78693
        v_c8 = t_0;
78694
      }
78695
      self->private_impl.f_bits = ((uint32_t)(v_c8));
78696
      self->private_impl.f_n_bits = 8u;
78697
    }
78698
    v_use_simple = (self->private_impl.f_bits & 1u);
78699
    self->private_impl.f_bits >>= 1u;
78700
    self->private_impl.f_n_bits -= 1u;
78701
    if (v_use_simple != 0u) {
78702
      if (a_src) {
78703
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
78704
      }
78705
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
78706
      status = wuffs_webp__decoder__decode_huffman_tree_simple(self, a_src, a_hg, a_ht);
78707
      if (a_src) {
78708
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
78709
      }
78710
      if (status.repr) {
78711
        goto suspend;
78712
      }
78713
    } else {
78714
      if (a_src) {
78715
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
78716
      }
78717
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
78718
      status = wuffs_webp__decoder__decode_code_length_code_lengths(self, a_src);
78719
      if (a_src) {
78720
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
78721
      }
78722
      if (status.repr) {
78723
        goto suspend;
78724
      }
78725
      v_status = wuffs_webp__decoder__build_code_lengths_huffman_nodes(self);
78726
      if ( ! wuffs_base__status__is_ok(&v_status)) {
78727
        status = v_status;
78728
        if (wuffs_base__status__is_error(&status)) {
78729
          goto exit;
78730
        } else if (wuffs_base__status__is_suspension(&status)) {
78731
          status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
78732
          goto exit;
78733
        }
78734
        goto ok;
78735
      }
78736
      if (a_src) {
78737
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
78738
      }
78739
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
78740
      status = wuffs_webp__decoder__build_code_lengths(self, a_src);
78741
      if (a_src) {
78742
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
78743
      }
78744
      if (status.repr) {
78745
        goto suspend;
78746
      }
78747
      v_status = wuffs_webp__decoder__build_huffman_nodes(self, a_hg, a_ht);
78748
      if ( ! wuffs_base__status__is_ok(&v_status)) {
78749
        status = v_status;
78750
        if (wuffs_base__status__is_error(&status)) {
78751
          goto exit;
78752
        } else if (wuffs_base__status__is_suspension(&status)) {
78753
          status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
78754
          goto exit;
78755
        }
78756
        goto ok;
78757
      }
78758
    }
78759
78760
    ok:
78761
    self->private_impl.p_decode_huffman_tree = 0;
78762
    goto exit;
78763
  }
78764
78765
  goto suspend;
78766
  suspend:
78767
  self->private_impl.p_decode_huffman_tree = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
78768
78769
  goto exit;
78770
  exit:
78771
  if (a_src && a_src->data.ptr) {
78772
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
78773
  }
78774
78775
  return status;
78776
}
78777
78778
// -------- func webp.decoder.decode_huffman_tree_simple
78779
78780
WUFFS_BASE__GENERATED_C_CODE
78781
static wuffs_base__status
78782
wuffs_webp__decoder__decode_huffman_tree_simple(
78783
    wuffs_webp__decoder* self,
78784
    wuffs_base__io_buffer* a_src,
78785
    uint32_t a_hg,
78786
    uint32_t a_ht) {
78787
  wuffs_base__status status = wuffs_base__make_status(NULL);
78788
78789
  uint8_t v_c8 = 0;
78790
  uint32_t v_use_second_symbol = 0;
78791
  uint32_t v_first_symbol_n_bits = 0;
78792
  uint32_t v_symbol0 = 0;
78793
  uint32_t v_symbol1 = 0;
78794
  uint32_t v_base_offset = 0;
78795
78796
  const uint8_t* iop_a_src = NULL;
78797
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
78798
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
78799
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
78800
  if (a_src && a_src->data.ptr) {
78801
    io0_a_src = a_src->data.ptr;
78802
    io1_a_src = io0_a_src + a_src->meta.ri;
78803
    iop_a_src = io1_a_src;
78804
    io2_a_src = io0_a_src + a_src->meta.wi;
78805
  }
78806
78807
  uint32_t coro_susp_point = self->private_impl.p_decode_huffman_tree_simple;
78808
  if (coro_susp_point) {
78809
    v_use_second_symbol = self->private_data.s_decode_huffman_tree_simple.v_use_second_symbol;
78810
    v_first_symbol_n_bits = self->private_data.s_decode_huffman_tree_simple.v_first_symbol_n_bits;
78811
    v_symbol0 = self->private_data.s_decode_huffman_tree_simple.v_symbol0;
78812
    v_base_offset = self->private_data.s_decode_huffman_tree_simple.v_base_offset;
78813
  }
78814
  switch (coro_susp_point) {
78815
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
78816
78817
    if (self->private_impl.f_n_bits < 2u) {
78818
      {
78819
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
78820
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
78821
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
78822
          goto suspend;
78823
        }
78824
        uint8_t t_0 = *iop_a_src++;
78825
        v_c8 = t_0;
78826
      }
78827
      if (self->private_impl.f_n_bits >= 2u) {
78828
        status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
78829
        goto exit;
78830
      }
78831
      self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
78832
      self->private_impl.f_n_bits += 8u;
78833
    }
78834
    v_use_second_symbol = (self->private_impl.f_bits & 1u);
78835
    v_first_symbol_n_bits = ((((self->private_impl.f_bits & 2u) >> 1u) * 7u) + 1u);
78836
    self->private_impl.f_bits >>= 2u;
78837
    self->private_impl.f_n_bits -= 2u;
78838
    if (self->private_impl.f_n_bits < v_first_symbol_n_bits) {
78839
      {
78840
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
78841
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
78842
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
78843
          goto suspend;
78844
        }
78845
        uint8_t t_1 = *iop_a_src++;
78846
        v_c8 = t_1;
78847
      }
78848
      if (self->private_impl.f_n_bits >= v_first_symbol_n_bits) {
78849
        status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
78850
        goto exit;
78851
      }
78852
      self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
78853
      self->private_impl.f_n_bits += 8u;
78854
    }
78855
    v_symbol0 = (self->private_impl.f_bits & ((((uint32_t)(1u)) << v_first_symbol_n_bits) - 1u));
78856
    self->private_impl.f_bits >>= v_first_symbol_n_bits;
78857
    self->private_impl.f_n_bits -= v_first_symbol_n_bits;
78858
    v_base_offset = ((uint32_t)(WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[a_ht]));
78859
    if (v_use_second_symbol != 0u) {
78860
      if (self->private_impl.f_n_bits < 8u) {
78861
        {
78862
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
78863
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
78864
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
78865
            goto suspend;
78866
          }
78867
          uint8_t t_2 = *iop_a_src++;
78868
          v_c8 = t_2;
78869
        }
78870
        if (self->private_impl.f_n_bits >= 8u) {
78871
          status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
78872
          goto exit;
78873
        }
78874
        self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
78875
        self->private_impl.f_n_bits += 8u;
78876
      }
78877
      v_symbol1 = (self->private_impl.f_bits & 255u);
78878
      self->private_impl.f_bits >>= 8u;
78879
      self->private_impl.f_n_bits -= 8u;
78880
      self->private_data.f_huffman_nodes[a_hg][(v_base_offset + 0u)] = ((uint16_t)((v_base_offset + 1u)));
78881
      self->private_data.f_huffman_nodes[a_hg][(v_base_offset + 1u)] = ((uint16_t)((v_symbol0 | 32768u)));
78882
      self->private_data.f_huffman_nodes[a_hg][(v_base_offset + 2u)] = ((uint16_t)((v_symbol1 | 32768u)));
78883
    } else {
78884
      self->private_data.f_huffman_nodes[a_hg][v_base_offset] = ((uint16_t)((v_symbol0 | 32768u)));
78885
    }
78886
78887
    goto ok;
78888
    ok:
78889
    self->private_impl.p_decode_huffman_tree_simple = 0;
78890
    goto exit;
78891
  }
78892
78893
  goto suspend;
78894
  suspend:
78895
  self->private_impl.p_decode_huffman_tree_simple = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
78896
  self->private_data.s_decode_huffman_tree_simple.v_use_second_symbol = v_use_second_symbol;
78897
  self->private_data.s_decode_huffman_tree_simple.v_first_symbol_n_bits = v_first_symbol_n_bits;
78898
  self->private_data.s_decode_huffman_tree_simple.v_symbol0 = v_symbol0;
78899
  self->private_data.s_decode_huffman_tree_simple.v_base_offset = v_base_offset;
78900
78901
  goto exit;
78902
  exit:
78903
  if (a_src && a_src->data.ptr) {
78904
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
78905
  }
78906
78907
  return status;
78908
}
78909
78910
// -------- func webp.decoder.decode_code_length_code_lengths
78911
78912
WUFFS_BASE__GENERATED_C_CODE
78913
static wuffs_base__status
78914
wuffs_webp__decoder__decode_code_length_code_lengths(
78915
    wuffs_webp__decoder* self,
78916
    wuffs_base__io_buffer* a_src) {
78917
  wuffs_base__status status = wuffs_base__make_status(NULL);
78918
78919
  uint8_t v_c8 = 0;
78920
  uint32_t v_n_codes = 0;
78921
  uint32_t v_i = 0;
78922
78923
  const uint8_t* iop_a_src = NULL;
78924
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
78925
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
78926
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
78927
  if (a_src && a_src->data.ptr) {
78928
    io0_a_src = a_src->data.ptr;
78929
    io1_a_src = io0_a_src + a_src->meta.ri;
78930
    iop_a_src = io1_a_src;
78931
    io2_a_src = io0_a_src + a_src->meta.wi;
78932
  }
78933
78934
  uint32_t coro_susp_point = self->private_impl.p_decode_code_length_code_lengths;
78935
  if (coro_susp_point) {
78936
    v_n_codes = self->private_data.s_decode_code_length_code_lengths.v_n_codes;
78937
    v_i = self->private_data.s_decode_code_length_code_lengths.v_i;
78938
  }
78939
  switch (coro_susp_point) {
78940
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
78941
78942
    if (self->private_impl.f_n_bits < 4u) {
78943
      {
78944
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
78945
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
78946
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
78947
          goto suspend;
78948
        }
78949
        uint8_t t_0 = *iop_a_src++;
78950
        v_c8 = t_0;
78951
      }
78952
      if (self->private_impl.f_n_bits >= 4u) {
78953
        status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
78954
        goto exit;
78955
      }
78956
      self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
78957
      self->private_impl.f_n_bits += 8u;
78958
    }
78959
    v_n_codes = ((self->private_impl.f_bits & 15u) + 4u);
78960
    self->private_impl.f_bits >>= 4u;
78961
    self->private_impl.f_n_bits -= 4u;
78962
    v_i = 0u;
78963
    while (v_i < v_n_codes) {
78964
      if (self->private_impl.f_n_bits < 3u) {
78965
        {
78966
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
78967
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
78968
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
78969
            goto suspend;
78970
          }
78971
          uint8_t t_1 = *iop_a_src++;
78972
          v_c8 = t_1;
78973
        }
78974
        if (self->private_impl.f_n_bits >= 3u) {
78975
          status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
78976
          goto exit;
78977
        }
78978
        self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
78979
        self->private_impl.f_n_bits += 8u;
78980
      }
78981
      self->private_impl.f_code_length_code_lengths[WUFFS_WEBP__CODE_LENGTH_CODE_ORDER[v_i]] = ((uint8_t)((self->private_impl.f_bits & 7u)));
78982
      self->private_impl.f_bits >>= 3u;
78983
      self->private_impl.f_n_bits -= 3u;
78984
      v_i += 1u;
78985
    }
78986
    while (v_i < 19u) {
78987
      self->private_impl.f_code_length_code_lengths[WUFFS_WEBP__CODE_LENGTH_CODE_ORDER[v_i]] = 0u;
78988
      v_i += 1u;
78989
    }
78990
78991
    goto ok;
78992
    ok:
78993
    self->private_impl.p_decode_code_length_code_lengths = 0;
78994
    goto exit;
78995
  }
78996
78997
  goto suspend;
78998
  suspend:
78999
  self->private_impl.p_decode_code_length_code_lengths = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
79000
  self->private_data.s_decode_code_length_code_lengths.v_n_codes = v_n_codes;
79001
  self->private_data.s_decode_code_length_code_lengths.v_i = v_i;
79002
79003
  goto exit;
79004
  exit:
79005
  if (a_src && a_src->data.ptr) {
79006
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
79007
  }
79008
79009
  return status;
79010
}
79011
79012
// -------- func webp.decoder.build_code_lengths_huffman_nodes
79013
79014
WUFFS_BASE__GENERATED_C_CODE
79015
static wuffs_base__status
79016
wuffs_webp__decoder__build_code_lengths_huffman_nodes(
79017
    wuffs_webp__decoder* self) {
79018
  uint32_t v_code_bits = 0;
79019
  uint32_t v_code_len = 0;
79020
  uint32_t v_symbol = 0;
79021
  uint32_t v_histogram[8] = {0};
79022
  uint32_t v_n_used_symbols = 0;
79023
  uint32_t v_last_used_symbol = 0;
79024
  uint32_t v_subscription_weight = 0;
79025
  uint32_t v_subscription_total = 0;
79026
  uint32_t v_curr_code = 0;
79027
  uint32_t v_next_codes[9] = {0};
79028
  uint32_t v_n_branches = 0;
79029
  uint32_t v_h = 0;
79030
  uint32_t v_children = 0;
79031
  uint16_t v_node = 0;
79032
79033
  v_symbol = 0u;
79034
  while (v_symbol < 19u) {
79035
    v_code_len = ((uint32_t)(self->private_impl.f_code_length_code_lengths[v_symbol]));
79036
    if (v_code_len != 0u) {
79037
      v_histogram[v_code_len] += 1u;
79038
      v_n_used_symbols += 1u;
79039
      v_last_used_symbol = v_symbol;
79040
    }
79041
    v_symbol += 1u;
79042
  }
79043
  if (v_n_used_symbols < 1u) {
79044
    return wuffs_base__make_status(wuffs_webp__error__bad_huffman_code);
79045
  } else if (v_n_used_symbols == 1u) {
79046
    self->private_data.f_code_lengths_huffman_nodes[0u] = ((uint16_t)((v_last_used_symbol | 32768u)));
79047
    return wuffs_base__make_status(NULL);
79048
  }
79049
  v_subscription_weight = 16384u;
79050
  v_code_len = 1u;
79051
  while (true) {
79052
    v_curr_code = ((uint32_t)(((uint32_t)(v_curr_code + v_histogram[v_code_len])) << 1u));
79053
    v_next_codes[(v_code_len + 1u)] = v_curr_code;
79054
    v_subscription_total += ((uint32_t)(v_subscription_weight * v_histogram[v_code_len]));
79055
    v_subscription_weight >>= 1u;
79056
    if (v_code_len >= 7u) {
79057
      break;
79058
    }
79059
    v_code_len += 1u;
79060
  }
79061
  if (v_subscription_total > 32768u) {
79062
    return wuffs_base__make_status(wuffs_webp__error__bad_huffman_code_over_subscribed);
79063
  } else if (v_subscription_total < 32768u) {
79064
    return wuffs_base__make_status(wuffs_webp__error__bad_huffman_code_under_subscribed);
79065
  }
79066
  self->private_data.f_code_lengths_huffman_nodes[0u] = 0u;
79067
  v_symbol = 0u;
79068
  while (v_symbol < 19u) {
79069
    v_code_len = ((uint32_t)(self->private_impl.f_code_length_code_lengths[v_symbol]));
79070
    if (v_code_len > 0u) {
79071
      v_code_bits = v_next_codes[v_code_len];
79072
      v_next_codes[v_code_len] += 1u;
79073
      v_code_bits <<= (32u - v_code_len);
79074
      v_h = 0u;
79075
      while (v_code_len > 0u) {
79076
        v_node = self->private_data.f_code_lengths_huffman_nodes[v_h];
79077
        if (v_node == 0u) {
79078
          v_children = ((uint32_t)(1u + ((uint32_t)(2u * v_n_branches))));
79079
          v_children = wuffs_base__u32__min(v_children, 35u);
79080
          self->private_data.f_code_lengths_huffman_nodes[v_h] = ((uint16_t)(v_children));
79081
          self->private_data.f_code_lengths_huffman_nodes[(v_children + 0u)] = 0u;
79082
          self->private_data.f_code_lengths_huffman_nodes[(v_children + 1u)] = 0u;
79083
          v_h = (v_children + (v_code_bits >> 31u));
79084
          v_n_branches += 1u;
79085
        } else {
79086
          v_children = ((uint32_t)(v_node));
79087
          v_h = (wuffs_base__u32__min(v_children, 35u) + (v_code_bits >> 31u));
79088
        }
79089
        v_code_bits <<= 1u;
79090
        v_code_len -= 1u;
79091
      }
79092
      self->private_data.f_code_lengths_huffman_nodes[v_h] = ((uint16_t)((v_symbol | 32768u)));
79093
    }
79094
    v_symbol += 1u;
79095
  }
79096
  return wuffs_base__make_status(NULL);
79097
}
79098
79099
// -------- func webp.decoder.build_huffman_nodes
79100
79101
WUFFS_BASE__GENERATED_C_CODE
79102
static wuffs_base__status
79103
wuffs_webp__decoder__build_huffman_nodes(
79104
    wuffs_webp__decoder* self,
79105
    uint32_t a_hg,
79106
    uint32_t a_ht) {
79107
  uint32_t v_base_offset = 0;
79108
  uint32_t v_code_bits = 0;
79109
  uint32_t v_code_len = 0;
79110
  uint32_t v_symbol = 0;
79111
  uint32_t v_histogram[16] = {0};
79112
  uint32_t v_n_used_symbols = 0;
79113
  uint32_t v_last_used_symbol = 0;
79114
  uint32_t v_subscription_weight = 0;
79115
  uint32_t v_subscription_total = 0;
79116
  uint32_t v_curr_code = 0;
79117
  uint32_t v_next_codes[17] = {0};
79118
  uint32_t v_n_branches = 0;
79119
  uint32_t v_h = 0;
79120
  uint32_t v_children = 0;
79121
  uint16_t v_node = 0;
79122
79123
  v_base_offset = ((uint32_t)(WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[a_ht]));
79124
  v_symbol = 0u;
79125
  while (v_symbol < self->private_impl.f_ht_n_symbols) {
79126
    v_code_len = ((uint32_t)(((uint16_t)(self->private_data.f_code_lengths[v_symbol] & 15u))));
79127
    if (v_code_len != 0u) {
79128
      v_histogram[v_code_len] += 1u;
79129
      v_n_used_symbols += 1u;
79130
      v_last_used_symbol = v_symbol;
79131
    }
79132
    v_symbol += 1u;
79133
  }
79134
  if (v_n_used_symbols < 1u) {
79135
    return wuffs_base__make_status(wuffs_webp__error__bad_huffman_code);
79136
  } else if (v_n_used_symbols == 1u) {
79137
    self->private_data.f_huffman_nodes[a_hg][v_base_offset] = ((uint16_t)((v_last_used_symbol | 32768u)));
79138
    return wuffs_base__make_status(NULL);
79139
  }
79140
  v_subscription_weight = 16384u;
79141
  v_code_len = 1u;
79142
  while (true) {
79143
    v_curr_code = ((uint32_t)(((uint32_t)(v_curr_code + v_histogram[v_code_len])) << 1u));
79144
    v_next_codes[(v_code_len + 1u)] = v_curr_code;
79145
    v_subscription_total += ((uint32_t)(v_subscription_weight * v_histogram[v_code_len]));
79146
    v_subscription_weight >>= 1u;
79147
    if (v_code_len >= 15u) {
79148
      break;
79149
    }
79150
    v_code_len += 1u;
79151
  }
79152
  if (v_subscription_total > 32768u) {
79153
    return wuffs_base__make_status(wuffs_webp__error__bad_huffman_code_over_subscribed);
79154
  } else if (v_subscription_total < 32768u) {
79155
    return wuffs_base__make_status(wuffs_webp__error__bad_huffman_code_under_subscribed);
79156
  }
79157
  self->private_data.f_huffman_nodes[a_hg][v_base_offset] = 0u;
79158
  v_symbol = 0u;
79159
  while (v_symbol < self->private_impl.f_ht_n_symbols) {
79160
    v_code_len = ((uint32_t)(((uint16_t)(self->private_data.f_code_lengths[v_symbol] & 15u))));
79161
    if (v_code_len != 0u) {
79162
      v_code_bits = v_next_codes[v_code_len];
79163
      v_next_codes[v_code_len] += 1u;
79164
      v_code_bits <<= (32u - v_code_len);
79165
      v_h = v_base_offset;
79166
      while (v_code_len > 0u) {
79167
        v_node = self->private_data.f_huffman_nodes[a_hg][v_h];
79168
        if (v_node == 0u) {
79169
          v_children = ((uint32_t)(v_base_offset + ((uint32_t)(1u + ((uint32_t)(2u * v_n_branches))))));
79170
          v_children = wuffs_base__u32__min(v_children, 6265u);
79171
          self->private_data.f_huffman_nodes[a_hg][v_h] = ((uint16_t)(v_children));
79172
          self->private_data.f_huffman_nodes[a_hg][(v_children + 0u)] = 0u;
79173
          self->private_data.f_huffman_nodes[a_hg][(v_children + 1u)] = 0u;
79174
          v_h = (v_children + (v_code_bits >> 31u));
79175
          v_n_branches += 1u;
79176
        } else {
79177
          v_children = ((uint32_t)(v_node));
79178
          v_h = (wuffs_base__u32__min(v_children, 6265u) + (v_code_bits >> 31u));
79179
        }
79180
        v_code_bits <<= 1u;
79181
        v_code_len -= 1u;
79182
      }
79183
      self->private_data.f_huffman_nodes[a_hg][v_h] = ((uint16_t)((v_symbol | 32768u)));
79184
    }
79185
    v_symbol += 1u;
79186
  }
79187
  return wuffs_base__make_status(NULL);
79188
}
79189
79190
// -------- func webp.decoder.build_code_lengths
79191
79192
WUFFS_BASE__GENERATED_C_CODE
79193
static wuffs_base__status
79194
wuffs_webp__decoder__build_code_lengths(
79195
    wuffs_webp__decoder* self,
79196
    wuffs_base__io_buffer* a_src) {
79197
  wuffs_base__status status = wuffs_base__make_status(NULL);
79198
79199
  uint8_t v_c8 = 0;
79200
  uint32_t v_use_length = 0;
79201
  uint32_t v_length_n_bits = 0;
79202
  uint32_t v_length = 0;
79203
  uint16_t v_prev_code_length = 0;
79204
  uint32_t v_h = 0;
79205
  uint32_t v_s = 0;
79206
  uint32_t v_s_max = 0;
79207
  uint16_t v_node = 0;
79208
  uint32_t v_symbol = 0;
79209
  uint16_t v_repeat_value = 0;
79210
  uint32_t v_repeat_n_bits = 0;
79211
79212
  const uint8_t* iop_a_src = NULL;
79213
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
79214
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
79215
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
79216
  if (a_src && a_src->data.ptr) {
79217
    io0_a_src = a_src->data.ptr;
79218
    io1_a_src = io0_a_src + a_src->meta.ri;
79219
    iop_a_src = io1_a_src;
79220
    io2_a_src = io0_a_src + a_src->meta.wi;
79221
  }
79222
79223
  uint32_t coro_susp_point = self->private_impl.p_build_code_lengths;
79224
  if (coro_susp_point) {
79225
    v_length_n_bits = self->private_data.s_build_code_lengths.v_length_n_bits;
79226
    v_prev_code_length = self->private_data.s_build_code_lengths.v_prev_code_length;
79227
    v_s = self->private_data.s_build_code_lengths.v_s;
79228
    v_s_max = self->private_data.s_build_code_lengths.v_s_max;
79229
    v_node = self->private_data.s_build_code_lengths.v_node;
79230
    v_repeat_value = self->private_data.s_build_code_lengths.v_repeat_value;
79231
    v_repeat_n_bits = self->private_data.s_build_code_lengths.v_repeat_n_bits;
79232
  }
79233
  switch (coro_susp_point) {
79234
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
79235
79236
    if (self->private_impl.f_n_bits < 1u) {
79237
      {
79238
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
79239
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
79240
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
79241
          goto suspend;
79242
        }
79243
        uint8_t t_0 = *iop_a_src++;
79244
        v_c8 = t_0;
79245
      }
79246
      self->private_impl.f_bits = ((uint32_t)(v_c8));
79247
      self->private_impl.f_n_bits = 8u;
79248
    }
79249
    v_use_length = (self->private_impl.f_bits & 1u);
79250
    self->private_impl.f_bits >>= 1u;
79251
    self->private_impl.f_n_bits -= 1u;
79252
    self->private_impl.f_ht_code_lengths_remaining = self->private_impl.f_ht_n_symbols;
79253
    if (v_use_length != 0u) {
79254
      if (self->private_impl.f_n_bits < 3u) {
79255
        {
79256
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
79257
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
79258
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
79259
            goto suspend;
79260
          }
79261
          uint8_t t_1 = *iop_a_src++;
79262
          v_c8 = t_1;
79263
        }
79264
        if (self->private_impl.f_n_bits >= 3u) {
79265
          status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
79266
          goto exit;
79267
        }
79268
        self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
79269
        self->private_impl.f_n_bits += 8u;
79270
      }
79271
      v_length_n_bits = (((self->private_impl.f_bits & 7u) * 2u) + 2u);
79272
      self->private_impl.f_bits >>= 3u;
79273
      self->private_impl.f_n_bits -= 3u;
79274
      while (self->private_impl.f_n_bits < v_length_n_bits) {
79275
        {
79276
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
79277
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
79278
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
79279
            goto suspend;
79280
          }
79281
          uint8_t t_2 = *iop_a_src++;
79282
          v_c8 = t_2;
79283
        }
79284
        if (self->private_impl.f_n_bits >= v_length_n_bits) {
79285
          status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
79286
          goto exit;
79287
        }
79288
        self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
79289
        self->private_impl.f_n_bits += 8u;
79290
      }
79291
      v_length = ((self->private_impl.f_bits & ((((uint32_t)(1u)) << v_length_n_bits) - 1u)) + 2u);
79292
      self->private_impl.f_bits >>= v_length_n_bits;
79293
      self->private_impl.f_n_bits -= v_length_n_bits;
79294
      if (v_length > self->private_impl.f_ht_n_symbols) {
79295
        status = wuffs_base__make_status(wuffs_webp__error__bad_huffman_code);
79296
        goto exit;
79297
      }
79298
      self->private_impl.f_ht_code_lengths_remaining = v_length;
79299
    }
79300
    v_prev_code_length = 8u;
79301
    while (v_s < self->private_impl.f_ht_n_symbols) {
79302
      if (self->private_impl.f_ht_code_lengths_remaining <= 0u) {
79303
        while (v_s < self->private_impl.f_ht_n_symbols) {
79304
          self->private_data.f_code_lengths[v_s] = 0u;
79305
          v_s += 1u;
79306
        }
79307
        break;
79308
      }
79309
      self->private_impl.f_ht_code_lengths_remaining -= 1u;
79310
      v_h = 0u;
79311
      while (true) {
79312
        v_node = self->private_data.f_code_lengths_huffman_nodes[v_h];
79313
        if (v_node >= 32768u) {
79314
          break;
79315
        } else if (v_node > 35u) {
79316
          status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_huffman_code);
79317
          goto exit;
79318
        }
79319
        if (self->private_impl.f_n_bits < 1u) {
79320
          {
79321
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
79322
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
79323
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
79324
              goto suspend;
79325
            }
79326
            uint8_t t_3 = *iop_a_src++;
79327
            v_c8 = t_3;
79328
          }
79329
          self->private_impl.f_bits = ((uint32_t)(v_c8));
79330
          self->private_impl.f_n_bits = 8u;
79331
        }
79332
        v_h = (((uint32_t)(v_node)) + (self->private_impl.f_bits & 1u));
79333
        self->private_impl.f_bits >>= 1u;
79334
        self->private_impl.f_n_bits -= 1u;
79335
      }
79336
      v_symbol = ((uint32_t)(((uint16_t)(v_node & 32767u))));
79337
      if (v_symbol == 0u) {
79338
        self->private_data.f_code_lengths[v_s] = 0u;
79339
        v_s += 1u;
79340
        continue;
79341
      } else if (v_symbol < 16u) {
79342
        v_prev_code_length = ((uint16_t)(v_symbol));
79343
        self->private_data.f_code_lengths[v_s] = v_prev_code_length;
79344
        v_s += 1u;
79345
        continue;
79346
      } else if (v_symbol == 16u) {
79347
        v_repeat_value = v_prev_code_length;
79348
      } else {
79349
        v_repeat_value = 0u;
79350
      }
79351
      v_repeat_n_bits = ((uint32_t)(WUFFS_WEBP__REPEAT_N_BITS[(v_symbol & 3u)]));
79352
      v_s_max = ((uint32_t)(((uint32_t)(WUFFS_WEBP__REPEAT_COUNTS[(v_symbol & 3u)])) + v_s));
79353
      if (self->private_impl.f_n_bits < v_repeat_n_bits) {
79354
        {
79355
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
79356
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
79357
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
79358
            goto suspend;
79359
          }
79360
          uint8_t t_4 = *iop_a_src++;
79361
          v_c8 = t_4;
79362
        }
79363
        if (self->private_impl.f_n_bits >= v_repeat_n_bits) {
79364
          status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
79365
          goto exit;
79366
        }
79367
        self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
79368
        self->private_impl.f_n_bits += 8u;
79369
      }
79370
      v_s_max += (self->private_impl.f_bits & ((((uint32_t)(1u)) << v_repeat_n_bits) - 1u));
79371
      self->private_impl.f_bits >>= v_repeat_n_bits;
79372
      self->private_impl.f_n_bits -= v_repeat_n_bits;
79373
      if (v_s_max > self->private_impl.f_ht_n_symbols) {
79374
        status = wuffs_base__make_status(wuffs_webp__error__bad_huffman_code);
79375
        goto exit;
79376
      }
79377
      while (v_s < v_s_max) {
79378
        self->private_data.f_code_lengths[v_s] = v_repeat_value;
79379
        v_s += 1u;
79380
      }
79381
    }
79382
79383
    goto ok;
79384
    ok:
79385
    self->private_impl.p_build_code_lengths = 0;
79386
    goto exit;
79387
  }
79388
79389
  goto suspend;
79390
  suspend:
79391
  self->private_impl.p_build_code_lengths = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
79392
  self->private_data.s_build_code_lengths.v_length_n_bits = v_length_n_bits;
79393
  self->private_data.s_build_code_lengths.v_prev_code_length = v_prev_code_length;
79394
  self->private_data.s_build_code_lengths.v_s = v_s;
79395
  self->private_data.s_build_code_lengths.v_s_max = v_s_max;
79396
  self->private_data.s_build_code_lengths.v_node = v_node;
79397
  self->private_data.s_build_code_lengths.v_repeat_value = v_repeat_value;
79398
  self->private_data.s_build_code_lengths.v_repeat_n_bits = v_repeat_n_bits;
79399
79400
  goto exit;
79401
  exit:
79402
  if (a_src && a_src->data.ptr) {
79403
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
79404
  }
79405
79406
  return status;
79407
}
79408
79409
// -------- func webp.decoder.decode_pixels_slow
79410
79411
WUFFS_BASE__GENERATED_C_CODE
79412
static wuffs_base__status
79413
wuffs_webp__decoder__decode_pixels_slow(
79414
    wuffs_webp__decoder* self,
79415
    wuffs_base__slice_u8 a_dst,
79416
    wuffs_base__io_buffer* a_src,
79417
    uint32_t a_width,
79418
    uint32_t a_height,
79419
    wuffs_base__slice_u8 a_tile_data,
79420
    uint32_t a_tile_size_log2) {
79421
  wuffs_base__status status = wuffs_base__make_status(NULL);
79422
79423
  uint8_t v_c8 = 0;
79424
  uint64_t v_p = 0;
79425
  uint64_t v_p_max = 0;
79426
  uint32_t v_tile_size_log2 = 0;
79427
  uint32_t v_width_in_tiles = 0;
79428
  uint32_t v_x = 0;
79429
  uint32_t v_y = 0;
79430
  uint32_t v_i = 0;
79431
  uint32_t v_hg = 0;
79432
  uint32_t v_h = 0;
79433
  uint16_t v_node = 0;
79434
  uint32_t v_pixel_g = 0;
79435
  uint32_t v_color = 0;
79436
  wuffs_base__slice_u8 v_dst_pixel = {0};
79437
  uint32_t v_back_ref_len_n_bits = 0;
79438
  uint32_t v_back_ref_len_minus_1 = 0;
79439
  uint32_t v_back_ref_dist_n_bits = 0;
79440
  uint32_t v_back_ref_dist_sym = 0;
79441
  uint32_t v_back_ref_dist_premap_minus_1 = 0;
79442
  uint32_t v_back_ref_dist_minus_1 = 0;
79443
  uint32_t v_dm = 0;
79444
  uint32_t v_dx = 0;
79445
  uint32_t v_dy = 0;
79446
  uint64_t v_p_end = 0;
79447
  uint64_t v_dist4 = 0;
79448
  uint64_t v_q = 0;
79449
  wuffs_base__slice_u8 v_color_cache_pixels = {0};
79450
  uint64_t v_color_cache_p = 0;
79451
  uint32_t v_color_cache_shift = 0;
79452
79453
  const uint8_t* iop_a_src = NULL;
79454
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
79455
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
79456
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
79457
  if (a_src && a_src->data.ptr) {
79458
    io0_a_src = a_src->data.ptr;
79459
    io1_a_src = io0_a_src + a_src->meta.ri;
79460
    iop_a_src = io1_a_src;
79461
    io2_a_src = io0_a_src + a_src->meta.wi;
79462
  }
79463
79464
  uint32_t coro_susp_point = self->private_impl.p_decode_pixels_slow;
79465
  if (coro_susp_point) {
79466
    v_p = self->private_data.s_decode_pixels_slow.v_p;
79467
    v_p_max = self->private_data.s_decode_pixels_slow.v_p_max;
79468
    v_tile_size_log2 = self->private_data.s_decode_pixels_slow.v_tile_size_log2;
79469
    v_width_in_tiles = self->private_data.s_decode_pixels_slow.v_width_in_tiles;
79470
    v_x = self->private_data.s_decode_pixels_slow.v_x;
79471
    v_y = self->private_data.s_decode_pixels_slow.v_y;
79472
    v_hg = self->private_data.s_decode_pixels_slow.v_hg;
79473
    v_node = self->private_data.s_decode_pixels_slow.v_node;
79474
    v_color = self->private_data.s_decode_pixels_slow.v_color;
79475
    v_back_ref_len_n_bits = self->private_data.s_decode_pixels_slow.v_back_ref_len_n_bits;
79476
    v_back_ref_len_minus_1 = self->private_data.s_decode_pixels_slow.v_back_ref_len_minus_1;
79477
    v_back_ref_dist_n_bits = self->private_data.s_decode_pixels_slow.v_back_ref_dist_n_bits;
79478
    v_back_ref_dist_premap_minus_1 = self->private_data.s_decode_pixels_slow.v_back_ref_dist_premap_minus_1;
79479
    v_color_cache_p = self->private_data.s_decode_pixels_slow.v_color_cache_p;
79480
  }
79481
  switch (coro_susp_point) {
79482
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
79483
79484
    v_p_max = ((uint64_t)((4u * a_width * a_height)));
79485
    if (((uint64_t)(a_dst.len)) < v_p_max) {
79486
      status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_dst_buffer);
79487
      goto exit;
79488
    }
79489
    if (a_tile_size_log2 != 0u) {
79490
      v_tile_size_log2 = a_tile_size_log2;
79491
      v_width_in_tiles = ((a_width + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2);
79492
    } else {
79493
      v_tile_size_log2 = 31u;
79494
      v_width_in_tiles = 1u;
79495
    }
79496
    while (v_p < v_p_max) {
79497
      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));
79498
      if (((uint64_t)(v_i)) < ((uint64_t)(a_tile_data.len))) {
79499
        v_hg = ((uint32_t)(a_tile_data.ptr[((uint64_t)(v_i))]));
79500
      }
79501
      v_h = ((uint32_t)(WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[0u]));
79502
      while (true) {
79503
        v_node = self->private_data.f_huffman_nodes[v_hg][v_h];
79504
        if (v_node >= 32768u) {
79505
          break;
79506
        } else if (v_node > 6265u) {
79507
          status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_huffman_code);
79508
          goto exit;
79509
        }
79510
        if (self->private_impl.f_n_bits < 1u) {
79511
          {
79512
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
79513
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
79514
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
79515
              goto suspend;
79516
            }
79517
            uint8_t t_0 = *iop_a_src++;
79518
            v_c8 = t_0;
79519
          }
79520
          self->private_impl.f_bits = ((uint32_t)(v_c8));
79521
          self->private_impl.f_n_bits = 8u;
79522
        }
79523
        v_h = (((uint32_t)(v_node)) + (self->private_impl.f_bits & 1u));
79524
        self->private_impl.f_bits >>= 1u;
79525
        self->private_impl.f_n_bits -= 1u;
79526
      }
79527
      v_pixel_g = ((uint32_t)(((uint16_t)(v_node & 32767u))));
79528
      if (v_pixel_g < 256u) {
79529
        v_color = (v_pixel_g << 8u);
79530
        v_h = ((uint32_t)(WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[1u]));
79531
        while (true) {
79532
          v_node = self->private_data.f_huffman_nodes[v_hg][v_h];
79533
          if (v_node >= 32768u) {
79534
            break;
79535
          }
79536
          if (self->private_impl.f_n_bits < 1u) {
79537
            {
79538
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
79539
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
79540
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
79541
                goto suspend;
79542
              }
79543
              uint8_t t_1 = *iop_a_src++;
79544
              v_c8 = t_1;
79545
            }
79546
            self->private_impl.f_bits = ((uint32_t)(v_c8));
79547
            self->private_impl.f_n_bits = 8u;
79548
          }
79549
          v_h = ((((uint32_t)(v_node)) & 4095u) + (self->private_impl.f_bits & 1u));
79550
          self->private_impl.f_bits >>= 1u;
79551
          self->private_impl.f_n_bits -= 1u;
79552
        }
79553
        v_color |= (((uint32_t)(((uint16_t)(v_node & 255u)))) << 16u);
79554
        v_h = ((uint32_t)(WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[2u]));
79555
        while (true) {
79556
          v_node = self->private_data.f_huffman_nodes[v_hg][v_h];
79557
          if (v_node >= 32768u) {
79558
            break;
79559
          }
79560
          if (self->private_impl.f_n_bits < 1u) {
79561
            {
79562
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
79563
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
79564
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
79565
                goto suspend;
79566
              }
79567
              uint8_t t_2 = *iop_a_src++;
79568
              v_c8 = t_2;
79569
            }
79570
            self->private_impl.f_bits = ((uint32_t)(v_c8));
79571
            self->private_impl.f_n_bits = 8u;
79572
          }
79573
          v_h = ((((uint32_t)(v_node)) & 4095u) + (self->private_impl.f_bits & 1u));
79574
          self->private_impl.f_bits >>= 1u;
79575
          self->private_impl.f_n_bits -= 1u;
79576
        }
79577
        v_color |= (((uint32_t)(((uint16_t)(v_node & 255u)))) << 0u);
79578
        v_h = ((uint32_t)(WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[3u]));
79579
        while (true) {
79580
          v_node = self->private_data.f_huffman_nodes[v_hg][v_h];
79581
          if (v_node >= 32768u) {
79582
            break;
79583
          }
79584
          if (self->private_impl.f_n_bits < 1u) {
79585
            {
79586
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
79587
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
79588
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
79589
                goto suspend;
79590
              }
79591
              uint8_t t_3 = *iop_a_src++;
79592
              v_c8 = t_3;
79593
            }
79594
            self->private_impl.f_bits = ((uint32_t)(v_c8));
79595
            self->private_impl.f_n_bits = 8u;
79596
          }
79597
          v_h = ((((uint32_t)(v_node)) & 4095u) + (self->private_impl.f_bits & 1u));
79598
          self->private_impl.f_bits >>= 1u;
79599
          self->private_impl.f_n_bits -= 1u;
79600
        }
79601
        v_color |= (((uint32_t)(((uint16_t)(v_node & 255u)))) << 24u);
79602
      } else if (v_pixel_g < 280u) {
79603
        if (v_pixel_g < 260u) {
79604
          v_back_ref_len_minus_1 = (v_pixel_g - 256u);
79605
        } else {
79606
          v_back_ref_len_n_bits = ((v_pixel_g - 258u) >> 1u);
79607
          v_back_ref_len_minus_1 = ((((uint32_t)(2u)) + (v_pixel_g & 1u)) << v_back_ref_len_n_bits);
79608
          while (self->private_impl.f_n_bits < v_back_ref_len_n_bits) {
79609
            {
79610
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
79611
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
79612
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
79613
                goto suspend;
79614
              }
79615
              uint8_t t_4 = *iop_a_src++;
79616
              v_c8 = t_4;
79617
            }
79618
            if (self->private_impl.f_n_bits >= v_back_ref_len_n_bits) {
79619
              status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
79620
              goto exit;
79621
            }
79622
            self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
79623
            self->private_impl.f_n_bits += 8u;
79624
          }
79625
          v_back_ref_len_minus_1 += (self->private_impl.f_bits & ((((uint32_t)(1u)) << v_back_ref_len_n_bits) - 1u));
79626
          self->private_impl.f_bits >>= v_back_ref_len_n_bits;
79627
          self->private_impl.f_n_bits -= v_back_ref_len_n_bits;
79628
        }
79629
        v_h = ((uint32_t)(WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[4u]));
79630
        while (true) {
79631
          v_node = self->private_data.f_huffman_nodes[v_hg][v_h];
79632
          if (v_node >= 32768u) {
79633
            break;
79634
          }
79635
          if (self->private_impl.f_n_bits < 1u) {
79636
            {
79637
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
79638
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
79639
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
79640
                goto suspend;
79641
              }
79642
              uint8_t t_5 = *iop_a_src++;
79643
              v_c8 = t_5;
79644
            }
79645
            self->private_impl.f_bits = ((uint32_t)(v_c8));
79646
            self->private_impl.f_n_bits = 8u;
79647
          }
79648
          v_h = ((((uint32_t)(v_node)) & 4095u) + (self->private_impl.f_bits & 1u));
79649
          self->private_impl.f_bits >>= 1u;
79650
          self->private_impl.f_n_bits -= 1u;
79651
        }
79652
        v_back_ref_dist_sym = ((uint32_t)(((uint16_t)(v_node & 32767u))));
79653
        if (v_back_ref_dist_sym < 4u) {
79654
          v_back_ref_dist_premap_minus_1 = v_back_ref_dist_sym;
79655
        } else if (v_back_ref_dist_sym < 40u) {
79656
          v_back_ref_dist_n_bits = ((v_back_ref_dist_sym - 2u) >> 1u);
79657
          v_back_ref_dist_premap_minus_1 = ((((uint32_t)(2u)) + (v_back_ref_dist_sym & 1u)) << v_back_ref_dist_n_bits);
79658
          while (self->private_impl.f_n_bits < v_back_ref_dist_n_bits) {
79659
            {
79660
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
79661
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
79662
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
79663
                goto suspend;
79664
              }
79665
              uint8_t t_6 = *iop_a_src++;
79666
              v_c8 = t_6;
79667
            }
79668
            if (self->private_impl.f_n_bits >= v_back_ref_dist_n_bits) {
79669
              status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
79670
              goto exit;
79671
            }
79672
            self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
79673
            self->private_impl.f_n_bits += 8u;
79674
          }
79675
          v_back_ref_dist_premap_minus_1 += (self->private_impl.f_bits & ((((uint32_t)(1u)) << v_back_ref_dist_n_bits) - 1u));
79676
          self->private_impl.f_bits >>= v_back_ref_dist_n_bits;
79677
          self->private_impl.f_n_bits -= v_back_ref_dist_n_bits;
79678
        }
79679
        if (v_back_ref_dist_premap_minus_1 >= 120u) {
79680
          v_back_ref_dist_minus_1 = (v_back_ref_dist_premap_minus_1 - 120u);
79681
        } else {
79682
          v_dm = ((uint32_t)(WUFFS_WEBP__DISTANCE_MAP[v_back_ref_dist_premap_minus_1]));
79683
          v_dy = (v_dm >> 4u);
79684
          v_dx = ((uint32_t)(7u - (v_dm & 15u)));
79685
          v_back_ref_dist_minus_1 = ((uint32_t)((a_width * v_dy) + v_dx));
79686
        }
79687
        v_p_end = (v_p + ((uint64_t)(((v_back_ref_len_minus_1 + 1u) * 4u))));
79688
        v_dist4 = ((((uint64_t)(v_back_ref_dist_minus_1)) * 4u) + 4u);
79689
        if ((v_p_end > v_p_max) || (v_p_end > ((uint64_t)(a_dst.len))) || (v_p < v_dist4)) {
79690
          status = wuffs_base__make_status(wuffs_webp__error__bad_back_reference);
79691
          goto exit;
79692
        }
79693
        v_q = (v_p - v_dist4);
79694
        while ((v_q < v_p) && (v_p < v_p_end)) {
79695
          a_dst.ptr[v_p] = a_dst.ptr[v_q];
79696
          v_p += 1u;
79697
          v_q += 1u;
79698
        }
79699
        v_x += (v_back_ref_len_minus_1 + 1u);
79700
        while (v_x >= a_width) {
79701
          v_x -= a_width;
79702
          v_y += 1u;
79703
        }
79704
        continue;
79705
      } else {
79706
        if ((v_color_cache_p > v_p) || (v_p > ((uint64_t)(a_dst.len)))) {
79707
          status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_dst_buffer);
79708
          goto exit;
79709
        }
79710
        v_color_cache_pixels = wuffs_base__slice_u8__subslice_ij(a_dst, v_color_cache_p, v_p);
79711
        v_color_cache_p = v_p;
79712
        v_color_cache_shift = ((32u - self->private_impl.f_color_cache_bits) & 31u);
79713
        while (((uint64_t)(v_color_cache_pixels.len)) >= 4u) {
79714
          v_color = wuffs_base__peek_u32le__no_bounds_check(v_color_cache_pixels.ptr);
79715
          self->private_data.f_color_cache[((((uint32_t)(v_color * 506832829u)) >> v_color_cache_shift) & 2047u)] = v_color;
79716
          v_color_cache_pixels = wuffs_base__slice_u8__subslice_i(v_color_cache_pixels, 4u);
79717
        }
79718
        v_color = self->private_data.f_color_cache[((v_pixel_g - 280u) & 2047u)];
79719
      }
79720
      if (v_p > ((uint64_t)(a_dst.len))) {
79721
        status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_dst_buffer);
79722
        goto exit;
79723
      }
79724
      v_dst_pixel = wuffs_base__slice_u8__subslice_i(a_dst, v_p);
79725
      if (((uint64_t)(v_dst_pixel.len)) < 4u) {
79726
        status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_dst_buffer);
79727
        goto exit;
79728
      }
79729
      wuffs_base__poke_u32le__no_bounds_check(v_dst_pixel.ptr, v_color);
79730
      v_p += 4u;
79731
      v_x += 1u;
79732
      if (v_x == a_width) {
79733
        v_x = 0u;
79734
        v_y += 1u;
79735
      }
79736
    }
79737
79738
    goto ok;
79739
    ok:
79740
    self->private_impl.p_decode_pixels_slow = 0;
79741
    goto exit;
79742
  }
79743
79744
  goto suspend;
79745
  suspend:
79746
  self->private_impl.p_decode_pixels_slow = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
79747
  self->private_data.s_decode_pixels_slow.v_p = v_p;
79748
  self->private_data.s_decode_pixels_slow.v_p_max = v_p_max;
79749
  self->private_data.s_decode_pixels_slow.v_tile_size_log2 = v_tile_size_log2;
79750
  self->private_data.s_decode_pixels_slow.v_width_in_tiles = v_width_in_tiles;
79751
  self->private_data.s_decode_pixels_slow.v_x = v_x;
79752
  self->private_data.s_decode_pixels_slow.v_y = v_y;
79753
  self->private_data.s_decode_pixels_slow.v_hg = v_hg;
79754
  self->private_data.s_decode_pixels_slow.v_node = v_node;
79755
  self->private_data.s_decode_pixels_slow.v_color = v_color;
79756
  self->private_data.s_decode_pixels_slow.v_back_ref_len_n_bits = v_back_ref_len_n_bits;
79757
  self->private_data.s_decode_pixels_slow.v_back_ref_len_minus_1 = v_back_ref_len_minus_1;
79758
  self->private_data.s_decode_pixels_slow.v_back_ref_dist_n_bits = v_back_ref_dist_n_bits;
79759
  self->private_data.s_decode_pixels_slow.v_back_ref_dist_premap_minus_1 = v_back_ref_dist_premap_minus_1;
79760
  self->private_data.s_decode_pixels_slow.v_color_cache_p = v_color_cache_p;
79761
79762
  goto exit;
79763
  exit:
79764
  if (a_src && a_src->data.ptr) {
79765
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
79766
  }
79767
79768
  return status;
79769
}
79770
79771
// -------- func webp.decoder.apply_transform_predictor
79772
79773
WUFFS_BASE__GENERATED_C_CODE
79774
static wuffs_base__empty_struct
79775
wuffs_webp__decoder__apply_transform_predictor(
79776
    wuffs_webp__decoder* self,
79777
    wuffs_base__slice_u8 a_pix,
79778
    wuffs_base__slice_u8 a_tile_data) {
79779
  uint64_t v_w4 = 0;
79780
  wuffs_base__slice_u8 v_prev_row = {0};
79781
  wuffs_base__slice_u8 v_curr_row = {0};
79782
  uint32_t v_tile_size_log2 = 0;
79783
  uint32_t v_tiles_per_row = 0;
79784
  uint32_t v_mask = 0;
79785
  uint32_t v_y = 0;
79786
  uint32_t v_x = 0;
79787
  uint64_t v_t = 0;
79788
  wuffs_base__slice_u8 v_tile_data = {0};
79789
  uint8_t v_mode = 0;
79790
  uint32_t v_l0 = 0;
79791
  uint32_t v_l1 = 0;
79792
  uint32_t v_l2 = 0;
79793
  uint32_t v_l3 = 0;
79794
  uint32_t v_c0 = 0;
79795
  uint32_t v_c1 = 0;
79796
  uint32_t v_c2 = 0;
79797
  uint32_t v_c3 = 0;
79798
  uint32_t v_t0 = 0;
79799
  uint32_t v_t1 = 0;
79800
  uint32_t v_t2 = 0;
79801
  uint32_t v_t3 = 0;
79802
  uint32_t v_sum_l = 0;
79803
  uint32_t v_sum_t = 0;
79804
79805
  if ((self->private_impl.f_width <= 0u) || (self->private_impl.f_height <= 0u)) {
79806
    return wuffs_base__make_empty_struct();
79807
  }
79808
  v_w4 = ((uint64_t)((self->private_impl.f_width * 4u)));
79809
  v_curr_row = wuffs_base__utility__empty_slice_u8();
79810
  if (v_w4 <= ((uint64_t)(a_pix.len))) {
79811
    v_curr_row = wuffs_base__slice_u8__subslice_j(a_pix, v_w4);
79812
  }
79813
  if (((uint64_t)(v_curr_row.len)) >= 4u) {
79814
#if defined(__GNUC__)
79815
#pragma GCC diagnostic push
79816
#pragma GCC diagnostic ignored "-Wconversion"
79817
#endif
79818
    v_curr_row.ptr[3u] += 255u;
79819
#if defined(__GNUC__)
79820
#pragma GCC diagnostic pop
79821
#endif
79822
  }
79823
  while (((uint64_t)(v_curr_row.len)) >= 8u) {
79824
#if defined(__GNUC__)
79825
#pragma GCC diagnostic push
79826
#pragma GCC diagnostic ignored "-Wconversion"
79827
#endif
79828
    v_curr_row.ptr[4u] += v_curr_row.ptr[0u];
79829
    v_curr_row.ptr[5u] += v_curr_row.ptr[1u];
79830
    v_curr_row.ptr[6u] += v_curr_row.ptr[2u];
79831
    v_curr_row.ptr[7u] += v_curr_row.ptr[3u];
79832
#if defined(__GNUC__)
79833
#pragma GCC diagnostic pop
79834
#endif
79835
    v_curr_row = wuffs_base__slice_u8__subslice_i(v_curr_row, 4u);
79836
  }
79837
  v_tile_size_log2 = ((uint32_t)(self->private_impl.f_transform_tile_size_log2[0u]));
79838
  v_tiles_per_row = ((self->private_impl.f_width + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2);
79839
  v_mask = ((((uint32_t)(1u)) << v_tile_size_log2) - 1u);
79840
  v_y = 1u;
79841
  while (v_y < self->private_impl.f_height) {
79842
    v_t = ((uint64_t)((4u * (v_y >> v_tile_size_log2) * v_tiles_per_row)));
79843
    v_tile_data = wuffs_base__utility__empty_slice_u8();
79844
    if (v_t <= ((uint64_t)(a_tile_data.len))) {
79845
      v_tile_data = wuffs_base__slice_u8__subslice_i(a_tile_data, v_t);
79846
      if (((uint64_t)(v_tile_data.len)) >= 4u) {
79847
        v_mode = ((uint8_t)(v_tile_data.ptr[1u] & 15u));
79848
        v_tile_data = wuffs_base__slice_u8__subslice_i(v_tile_data, 4u);
79849
      }
79850
    }
79851
    if (v_w4 <= ((uint64_t)(a_pix.len))) {
79852
      v_prev_row = a_pix;
79853
      a_pix = wuffs_base__slice_u8__subslice_i(a_pix, v_w4);
79854
      v_curr_row = a_pix;
79855
    }
79856
    if ((((uint64_t)(v_prev_row.len)) >= 4u) && (((uint64_t)(v_curr_row.len)) >= 4u)) {
79857
#if defined(__GNUC__)
79858
#pragma GCC diagnostic push
79859
#pragma GCC diagnostic ignored "-Wconversion"
79860
#endif
79861
      v_curr_row.ptr[0u] += v_prev_row.ptr[0u];
79862
      v_curr_row.ptr[1u] += v_prev_row.ptr[1u];
79863
      v_curr_row.ptr[2u] += v_prev_row.ptr[2u];
79864
      v_curr_row.ptr[3u] += v_prev_row.ptr[3u];
79865
#if defined(__GNUC__)
79866
#pragma GCC diagnostic pop
79867
#endif
79868
    }
79869
    v_x = 1u;
79870
    while (v_x < self->private_impl.f_width) {
79871
      if (((v_x & v_mask) == 0u) && (((uint64_t)(v_tile_data.len)) >= 4u)) {
79872
        v_mode = ((uint8_t)(v_tile_data.ptr[1u] & 15u));
79873
        v_tile_data = wuffs_base__slice_u8__subslice_i(v_tile_data, 4u);
79874
      }
79875
      if ((((uint64_t)(v_prev_row.len)) < 12u) || (((uint64_t)(v_curr_row.len)) < 8u)) {
79876
        break;
79877
      }
79878
      if (v_mode == 0u) {
79879
#if defined(__GNUC__)
79880
#pragma GCC diagnostic push
79881
#pragma GCC diagnostic ignored "-Wconversion"
79882
#endif
79883
        v_curr_row.ptr[7u] += 255u;
79884
#if defined(__GNUC__)
79885
#pragma GCC diagnostic pop
79886
#endif
79887
      } else if (v_mode == 1u) {
79888
#if defined(__GNUC__)
79889
#pragma GCC diagnostic push
79890
#pragma GCC diagnostic ignored "-Wconversion"
79891
#endif
79892
        v_curr_row.ptr[4u] += v_curr_row.ptr[0u];
79893
        v_curr_row.ptr[5u] += v_curr_row.ptr[1u];
79894
        v_curr_row.ptr[6u] += v_curr_row.ptr[2u];
79895
        v_curr_row.ptr[7u] += v_curr_row.ptr[3u];
79896
#if defined(__GNUC__)
79897
#pragma GCC diagnostic pop
79898
#endif
79899
      } else if (v_mode == 2u) {
79900
#if defined(__GNUC__)
79901
#pragma GCC diagnostic push
79902
#pragma GCC diagnostic ignored "-Wconversion"
79903
#endif
79904
        v_curr_row.ptr[4u] += v_prev_row.ptr[4u];
79905
        v_curr_row.ptr[5u] += v_prev_row.ptr[5u];
79906
        v_curr_row.ptr[6u] += v_prev_row.ptr[6u];
79907
        v_curr_row.ptr[7u] += v_prev_row.ptr[7u];
79908
#if defined(__GNUC__)
79909
#pragma GCC diagnostic pop
79910
#endif
79911
      } else if (v_mode == 3u) {
79912
#if defined(__GNUC__)
79913
#pragma GCC diagnostic push
79914
#pragma GCC diagnostic ignored "-Wconversion"
79915
#endif
79916
        v_curr_row.ptr[4u] += v_prev_row.ptr[8u];
79917
        v_curr_row.ptr[5u] += v_prev_row.ptr[9u];
79918
        v_curr_row.ptr[6u] += v_prev_row.ptr[10u];
79919
        v_curr_row.ptr[7u] += v_prev_row.ptr[11u];
79920
#if defined(__GNUC__)
79921
#pragma GCC diagnostic pop
79922
#endif
79923
      } else if (v_mode == 4u) {
79924
#if defined(__GNUC__)
79925
#pragma GCC diagnostic push
79926
#pragma GCC diagnostic ignored "-Wconversion"
79927
#endif
79928
        v_curr_row.ptr[4u] += v_prev_row.ptr[0u];
79929
        v_curr_row.ptr[5u] += v_prev_row.ptr[1u];
79930
        v_curr_row.ptr[6u] += v_prev_row.ptr[2u];
79931
        v_curr_row.ptr[7u] += v_prev_row.ptr[3u];
79932
#if defined(__GNUC__)
79933
#pragma GCC diagnostic pop
79934
#endif
79935
      } else if (v_mode == 5u) {
79936
        v_l0 = ((((uint32_t)(v_curr_row.ptr[0u])) + ((uint32_t)(v_prev_row.ptr[8u]))) / 2u);
79937
        v_l1 = ((((uint32_t)(v_curr_row.ptr[1u])) + ((uint32_t)(v_prev_row.ptr[9u]))) / 2u);
79938
        v_l2 = ((((uint32_t)(v_curr_row.ptr[2u])) + ((uint32_t)(v_prev_row.ptr[10u]))) / 2u);
79939
        v_l3 = ((((uint32_t)(v_curr_row.ptr[3u])) + ((uint32_t)(v_prev_row.ptr[11u]))) / 2u);
79940
#if defined(__GNUC__)
79941
#pragma GCC diagnostic push
79942
#pragma GCC diagnostic ignored "-Wconversion"
79943
#endif
79944
        v_curr_row.ptr[4u] += ((uint8_t)(((v_l0 + ((uint32_t)(v_prev_row.ptr[4u]))) / 2u)));
79945
        v_curr_row.ptr[5u] += ((uint8_t)(((v_l1 + ((uint32_t)(v_prev_row.ptr[5u]))) / 2u)));
79946
        v_curr_row.ptr[6u] += ((uint8_t)(((v_l2 + ((uint32_t)(v_prev_row.ptr[6u]))) / 2u)));
79947
        v_curr_row.ptr[7u] += ((uint8_t)(((v_l3 + ((uint32_t)(v_prev_row.ptr[7u]))) / 2u)));
79948
#if defined(__GNUC__)
79949
#pragma GCC diagnostic pop
79950
#endif
79951
      } else if (v_mode == 6u) {
79952
#if defined(__GNUC__)
79953
#pragma GCC diagnostic push
79954
#pragma GCC diagnostic ignored "-Wconversion"
79955
#endif
79956
        v_curr_row.ptr[4u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[0u])) + ((uint32_t)(v_prev_row.ptr[0u]))) / 2u)));
79957
        v_curr_row.ptr[5u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[1u])) + ((uint32_t)(v_prev_row.ptr[1u]))) / 2u)));
79958
        v_curr_row.ptr[6u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[2u])) + ((uint32_t)(v_prev_row.ptr[2u]))) / 2u)));
79959
        v_curr_row.ptr[7u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[3u])) + ((uint32_t)(v_prev_row.ptr[3u]))) / 2u)));
79960
#if defined(__GNUC__)
79961
#pragma GCC diagnostic pop
79962
#endif
79963
      } else if (v_mode == 7u) {
79964
#if defined(__GNUC__)
79965
#pragma GCC diagnostic push
79966
#pragma GCC diagnostic ignored "-Wconversion"
79967
#endif
79968
        v_curr_row.ptr[4u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[0u])) + ((uint32_t)(v_prev_row.ptr[4u]))) / 2u)));
79969
        v_curr_row.ptr[5u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[1u])) + ((uint32_t)(v_prev_row.ptr[5u]))) / 2u)));
79970
        v_curr_row.ptr[6u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[2u])) + ((uint32_t)(v_prev_row.ptr[6u]))) / 2u)));
79971
        v_curr_row.ptr[7u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[3u])) + ((uint32_t)(v_prev_row.ptr[7u]))) / 2u)));
79972
#if defined(__GNUC__)
79973
#pragma GCC diagnostic pop
79974
#endif
79975
      } else if (v_mode == 8u) {
79976
#if defined(__GNUC__)
79977
#pragma GCC diagnostic push
79978
#pragma GCC diagnostic ignored "-Wconversion"
79979
#endif
79980
        v_curr_row.ptr[4u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[0u])) + ((uint32_t)(v_prev_row.ptr[4u]))) / 2u)));
79981
        v_curr_row.ptr[5u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[1u])) + ((uint32_t)(v_prev_row.ptr[5u]))) / 2u)));
79982
        v_curr_row.ptr[6u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[2u])) + ((uint32_t)(v_prev_row.ptr[6u]))) / 2u)));
79983
        v_curr_row.ptr[7u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[3u])) + ((uint32_t)(v_prev_row.ptr[7u]))) / 2u)));
79984
#if defined(__GNUC__)
79985
#pragma GCC diagnostic pop
79986
#endif
79987
      } else if (v_mode == 9u) {
79988
#if defined(__GNUC__)
79989
#pragma GCC diagnostic push
79990
#pragma GCC diagnostic ignored "-Wconversion"
79991
#endif
79992
        v_curr_row.ptr[4u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[4u])) + ((uint32_t)(v_prev_row.ptr[8u]))) / 2u)));
79993
        v_curr_row.ptr[5u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[5u])) + ((uint32_t)(v_prev_row.ptr[9u]))) / 2u)));
79994
        v_curr_row.ptr[6u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[6u])) + ((uint32_t)(v_prev_row.ptr[10u]))) / 2u)));
79995
        v_curr_row.ptr[7u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[7u])) + ((uint32_t)(v_prev_row.ptr[11u]))) / 2u)));
79996
#if defined(__GNUC__)
79997
#pragma GCC diagnostic pop
79998
#endif
79999
      } else if (v_mode == 10u) {
80000
        v_l0 = ((((uint32_t)(v_curr_row.ptr[0u])) + ((uint32_t)(v_prev_row.ptr[0u]))) / 2u);
80001
        v_l1 = ((((uint32_t)(v_curr_row.ptr[1u])) + ((uint32_t)(v_prev_row.ptr[1u]))) / 2u);
80002
        v_l2 = ((((uint32_t)(v_curr_row.ptr[2u])) + ((uint32_t)(v_prev_row.ptr[2u]))) / 2u);
80003
        v_l3 = ((((uint32_t)(v_curr_row.ptr[3u])) + ((uint32_t)(v_prev_row.ptr[3u]))) / 2u);
80004
        v_t0 = ((((uint32_t)(v_prev_row.ptr[4u])) + ((uint32_t)(v_prev_row.ptr[8u]))) / 2u);
80005
        v_t1 = ((((uint32_t)(v_prev_row.ptr[5u])) + ((uint32_t)(v_prev_row.ptr[9u]))) / 2u);
80006
        v_t2 = ((((uint32_t)(v_prev_row.ptr[6u])) + ((uint32_t)(v_prev_row.ptr[10u]))) / 2u);
80007
        v_t3 = ((((uint32_t)(v_prev_row.ptr[7u])) + ((uint32_t)(v_prev_row.ptr[11u]))) / 2u);
80008
#if defined(__GNUC__)
80009
#pragma GCC diagnostic push
80010
#pragma GCC diagnostic ignored "-Wconversion"
80011
#endif
80012
        v_curr_row.ptr[4u] += ((uint8_t)(((v_l0 + v_t0) / 2u)));
80013
        v_curr_row.ptr[5u] += ((uint8_t)(((v_l1 + v_t1) / 2u)));
80014
        v_curr_row.ptr[6u] += ((uint8_t)(((v_l2 + v_t2) / 2u)));
80015
        v_curr_row.ptr[7u] += ((uint8_t)(((v_l3 + v_t3) / 2u)));
80016
#if defined(__GNUC__)
80017
#pragma GCC diagnostic pop
80018
#endif
80019
      } else if (v_mode == 11u) {
80020
        v_l0 = ((uint32_t)(v_curr_row.ptr[0u]));
80021
        v_l1 = ((uint32_t)(v_curr_row.ptr[1u]));
80022
        v_l2 = ((uint32_t)(v_curr_row.ptr[2u]));
80023
        v_l3 = ((uint32_t)(v_curr_row.ptr[3u]));
80024
        v_c0 = ((uint32_t)(v_prev_row.ptr[0u]));
80025
        v_c1 = ((uint32_t)(v_prev_row.ptr[1u]));
80026
        v_c2 = ((uint32_t)(v_prev_row.ptr[2u]));
80027
        v_c3 = ((uint32_t)(v_prev_row.ptr[3u]));
80028
        v_t0 = ((uint32_t)(v_prev_row.ptr[4u]));
80029
        v_t1 = ((uint32_t)(v_prev_row.ptr[5u]));
80030
        v_t2 = ((uint32_t)(v_prev_row.ptr[6u]));
80031
        v_t3 = ((uint32_t)(v_prev_row.ptr[7u]));
80032
        v_sum_l = (wuffs_webp__decoder__absolute_difference(self, v_c0, v_t0) +
80033
            wuffs_webp__decoder__absolute_difference(self, v_c1, v_t1) +
80034
            wuffs_webp__decoder__absolute_difference(self, v_c2, v_t2) +
80035
            wuffs_webp__decoder__absolute_difference(self, v_c3, v_t3));
80036
        v_sum_t = (wuffs_webp__decoder__absolute_difference(self, v_c0, v_l0) +
80037
            wuffs_webp__decoder__absolute_difference(self, v_c1, v_l1) +
80038
            wuffs_webp__decoder__absolute_difference(self, v_c2, v_l2) +
80039
            wuffs_webp__decoder__absolute_difference(self, v_c3, v_l3));
80040
        if (v_sum_l < v_sum_t) {
80041
#if defined(__GNUC__)
80042
#pragma GCC diagnostic push
80043
#pragma GCC diagnostic ignored "-Wconversion"
80044
#endif
80045
          v_curr_row.ptr[4u] += ((uint8_t)(v_l0));
80046
          v_curr_row.ptr[5u] += ((uint8_t)(v_l1));
80047
          v_curr_row.ptr[6u] += ((uint8_t)(v_l2));
80048
          v_curr_row.ptr[7u] += ((uint8_t)(v_l3));
80049
#if defined(__GNUC__)
80050
#pragma GCC diagnostic pop
80051
#endif
80052
        } else {
80053
#if defined(__GNUC__)
80054
#pragma GCC diagnostic push
80055
#pragma GCC diagnostic ignored "-Wconversion"
80056
#endif
80057
          v_curr_row.ptr[4u] += ((uint8_t)(v_t0));
80058
          v_curr_row.ptr[5u] += ((uint8_t)(v_t1));
80059
          v_curr_row.ptr[6u] += ((uint8_t)(v_t2));
80060
          v_curr_row.ptr[7u] += ((uint8_t)(v_t3));
80061
#if defined(__GNUC__)
80062
#pragma GCC diagnostic pop
80063
#endif
80064
        }
80065
      } else if (v_mode == 12u) {
80066
#if defined(__GNUC__)
80067
#pragma GCC diagnostic push
80068
#pragma GCC diagnostic ignored "-Wconversion"
80069
#endif
80070
        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]);
80071
        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]);
80072
        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]);
80073
        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]);
80074
#if defined(__GNUC__)
80075
#pragma GCC diagnostic pop
80076
#endif
80077
      } else if (v_mode == 13u) {
80078
#if defined(__GNUC__)
80079
#pragma GCC diagnostic push
80080
#pragma GCC diagnostic ignored "-Wconversion"
80081
#endif
80082
        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]);
80083
        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]);
80084
        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]);
80085
        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]);
80086
#if defined(__GNUC__)
80087
#pragma GCC diagnostic pop
80088
#endif
80089
      }
80090
      v_curr_row = wuffs_base__slice_u8__subslice_i(v_curr_row, 4u);
80091
      v_prev_row = wuffs_base__slice_u8__subslice_i(v_prev_row, 4u);
80092
      v_x += 1u;
80093
    }
80094
    v_y += 1u;
80095
  }
80096
  return wuffs_base__make_empty_struct();
80097
}
80098
80099
// -------- func webp.decoder.absolute_difference
80100
80101
WUFFS_BASE__GENERATED_C_CODE
80102
static uint32_t
80103
wuffs_webp__decoder__absolute_difference(
80104
    const wuffs_webp__decoder* self,
80105
    uint32_t a_a,
80106
    uint32_t a_b) {
80107
  if (a_a < a_b) {
80108
    return (a_b - a_a);
80109
  }
80110
  return (a_a - a_b);
80111
}
80112
80113
// -------- func webp.decoder.mode12
80114
80115
WUFFS_BASE__GENERATED_C_CODE
80116
static uint8_t
80117
wuffs_webp__decoder__mode12(
80118
    const wuffs_webp__decoder* self,
80119
    uint8_t a_l,
80120
    uint8_t a_t,
80121
    uint8_t a_tl) {
80122
  uint32_t v_v = 0;
80123
80124
  v_v = ((uint32_t)((((uint32_t)(a_l)) + ((uint32_t)(a_t))) - ((uint32_t)(a_tl))));
80125
  if (v_v < 256u) {
80126
    return ((uint8_t)(v_v));
80127
  } else if (v_v < 512u) {
80128
    return 255u;
80129
  }
80130
  return 0u;
80131
}
80132
80133
// -------- func webp.decoder.mode13
80134
80135
WUFFS_BASE__GENERATED_C_CODE
80136
static uint8_t
80137
wuffs_webp__decoder__mode13(
80138
    const wuffs_webp__decoder* self,
80139
    uint8_t a_l,
80140
    uint8_t a_t,
80141
    uint8_t a_tl) {
80142
  uint32_t v_x = 0;
80143
  uint32_t v_y = 0;
80144
  uint32_t v_z = 0;
80145
  uint32_t v_v = 0;
80146
80147
  v_x = ((((uint32_t)(a_l)) + ((uint32_t)(a_t))) / 2u);
80148
  v_y = ((uint32_t)(a_tl));
80149
  v_z = ((uint32_t)(v_x - v_y));
80150
  v_v = ((uint32_t)(v_x + wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(v_z + (v_z >> 31u))), 1u)));
80151
  if (v_v < 256u) {
80152
    return ((uint8_t)(v_v));
80153
  } else if (v_v < 512u) {
80154
    return 255u;
80155
  }
80156
  return 0u;
80157
}
80158
80159
// -------- func webp.decoder.apply_transform_cross_color
80160
80161
WUFFS_BASE__GENERATED_C_CODE
80162
static wuffs_base__empty_struct
80163
wuffs_webp__decoder__apply_transform_cross_color(
80164
    wuffs_webp__decoder* self,
80165
    wuffs_base__slice_u8 a_pix,
80166
    wuffs_base__slice_u8 a_tile_data) {
80167
  uint32_t v_tile_size_log2 = 0;
80168
  uint32_t v_tiles_per_row = 0;
80169
  uint32_t v_mask = 0;
80170
  uint32_t v_y = 0;
80171
  uint32_t v_x = 0;
80172
  uint64_t v_t = 0;
80173
  wuffs_base__slice_u8 v_tile_data = {0};
80174
  uint32_t v_g2r = 0;
80175
  uint32_t v_g2b = 0;
80176
  uint32_t v_r2b = 0;
80177
  uint8_t v_b = 0;
80178
  uint8_t v_g = 0;
80179
  uint8_t v_r = 0;
80180
80181
  v_tile_size_log2 = ((uint32_t)(self->private_impl.f_transform_tile_size_log2[1u]));
80182
  v_tiles_per_row = ((self->private_impl.f_width + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2);
80183
  v_mask = ((((uint32_t)(1u)) << v_tile_size_log2) - 1u);
80184
  v_y = 0u;
80185
  while (v_y < self->private_impl.f_height) {
80186
    v_t = ((uint64_t)((4u * (v_y >> v_tile_size_log2) * v_tiles_per_row)));
80187
    v_tile_data = wuffs_base__utility__empty_slice_u8();
80188
    if (v_t <= ((uint64_t)(a_tile_data.len))) {
80189
      v_tile_data = wuffs_base__slice_u8__subslice_i(a_tile_data, v_t);
80190
    }
80191
    v_x = 0u;
80192
    while (v_x < self->private_impl.f_width) {
80193
      if (((v_x & v_mask) == 0u) && (((uint64_t)(v_tile_data.len)) >= 4u)) {
80194
        v_g2r = wuffs_base__utility__sign_extend_convert_u8_u32(v_tile_data.ptr[0u]);
80195
        v_g2b = wuffs_base__utility__sign_extend_convert_u8_u32(v_tile_data.ptr[1u]);
80196
        v_r2b = wuffs_base__utility__sign_extend_convert_u8_u32(v_tile_data.ptr[2u]);
80197
        v_tile_data = wuffs_base__slice_u8__subslice_i(v_tile_data, 4u);
80198
      }
80199
      if (((uint64_t)(a_pix.len)) >= 4u) {
80200
        v_b = a_pix.ptr[0u];
80201
        v_g = a_pix.ptr[1u];
80202
        v_r = a_pix.ptr[2u];
80203
#if defined(__GNUC__)
80204
#pragma GCC diagnostic push
80205
#pragma GCC diagnostic ignored "-Wconversion"
80206
#endif
80207
        v_r += ((uint8_t)((((uint32_t)(wuffs_base__utility__sign_extend_convert_u8_u32(v_g) * v_g2r)) >> 5u)));
80208
        v_b += ((uint8_t)((((uint32_t)(wuffs_base__utility__sign_extend_convert_u8_u32(v_g) * v_g2b)) >> 5u)));
80209
        v_b += ((uint8_t)((((uint32_t)(wuffs_base__utility__sign_extend_convert_u8_u32(v_r) * v_r2b)) >> 5u)));
80210
#if defined(__GNUC__)
80211
#pragma GCC diagnostic pop
80212
#endif
80213
        a_pix.ptr[0u] = v_b;
80214
        a_pix.ptr[2u] = v_r;
80215
        a_pix = wuffs_base__slice_u8__subslice_i(a_pix, 4u);
80216
      }
80217
      v_x += 1u;
80218
    }
80219
    v_y += 1u;
80220
  }
80221
  return wuffs_base__make_empty_struct();
80222
}
80223
80224
// -------- func webp.decoder.apply_transform_subtract_green
80225
80226
WUFFS_BASE__GENERATED_C_CODE
80227
static wuffs_base__empty_struct
80228
wuffs_webp__decoder__apply_transform_subtract_green(
80229
    wuffs_webp__decoder* self,
80230
    wuffs_base__slice_u8 a_pix) {
80231
  wuffs_base__slice_u8 v_p = {0};
80232
  uint8_t v_g = 0;
80233
80234
  {
80235
    wuffs_base__slice_u8 i_slice_p = a_pix;
80236
    v_p.ptr = i_slice_p.ptr;
80237
    v_p.len = 4;
80238
    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));
80239
    while (v_p.ptr < i_end0_p) {
80240
      v_g = v_p.ptr[1u];
80241
#if defined(__GNUC__)
80242
#pragma GCC diagnostic push
80243
#pragma GCC diagnostic ignored "-Wconversion"
80244
#endif
80245
      v_p.ptr[0u] += v_g;
80246
      v_p.ptr[2u] += v_g;
80247
#if defined(__GNUC__)
80248
#pragma GCC diagnostic pop
80249
#endif
80250
      v_p.ptr += 4;
80251
    }
80252
    v_p.len = 0;
80253
  }
80254
  return wuffs_base__make_empty_struct();
80255
}
80256
80257
// -------- func webp.decoder.apply_transform_color_indexing
80258
80259
WUFFS_BASE__GENERATED_C_CODE
80260
static wuffs_base__empty_struct
80261
wuffs_webp__decoder__apply_transform_color_indexing(
80262
    wuffs_webp__decoder* self,
80263
    wuffs_base__slice_u8 a_pix) {
80264
  uint32_t v_tile_size_log2 = 0;
80265
  uint32_t v_bits_per_pixel = 0;
80266
  uint32_t v_x_mask = 0;
80267
  uint32_t v_s_mask = 0;
80268
  uint64_t v_src_index = 0;
80269
  uint32_t v_y = 0;
80270
  uint64_t v_di = 0;
80271
  uint64_t v_dj = 0;
80272
  wuffs_base__slice_u8 v_dst = {0};
80273
  uint32_t v_x = 0;
80274
  uint32_t v_s = 0;
80275
  uint32_t v_p = 0;
80276
  uint8_t v_p0 = 0;
80277
  uint8_t v_p1 = 0;
80278
  uint8_t v_p2 = 0;
80279
  uint8_t v_p3 = 0;
80280
80281
  v_tile_size_log2 = ((uint32_t)(self->private_impl.f_transform_tile_size_log2[3u]));
80282
  if (v_tile_size_log2 == 0u) {
80283
    {
80284
      wuffs_base__slice_u8 i_slice_dst = a_pix;
80285
      v_dst.ptr = i_slice_dst.ptr;
80286
      v_dst.len = 4;
80287
      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));
80288
      while (v_dst.ptr < i_end0_dst) {
80289
        v_p = (((uint32_t)(v_dst.ptr[1u])) * 4u);
80290
        v_p0 = self->private_data.f_palette[(v_p + 0u)];
80291
        v_p1 = self->private_data.f_palette[(v_p + 1u)];
80292
        v_p2 = self->private_data.f_palette[(v_p + 2u)];
80293
        v_p3 = self->private_data.f_palette[(v_p + 3u)];
80294
        v_dst.ptr[0u] = v_p0;
80295
        v_dst.ptr[1u] = v_p1;
80296
        v_dst.ptr[2u] = v_p2;
80297
        v_dst.ptr[3u] = v_p3;
80298
        v_dst.ptr += 4;
80299
      }
80300
      v_dst.len = 0;
80301
    }
80302
    return wuffs_base__make_empty_struct();
80303
  }
80304
  v_bits_per_pixel = (((uint32_t)(8u)) >> v_tile_size_log2);
80305
  v_x_mask = ((((uint32_t)(1u)) << v_tile_size_log2) - 1u);
80306
  v_s_mask = ((((uint32_t)(1u)) << v_bits_per_pixel) - 1u);
80307
  v_src_index = ((uint64_t)((self->private_impl.f_workbuf_offset_for_color_indexing + 1u)));
80308
  v_y = 0u;
80309
  while (v_y < self->private_impl.f_height) {
80310
    v_di = ((uint64_t)((4u * (v_y + 0u) * self->private_impl.f_width)));
80311
    v_dj = ((uint64_t)((4u * (v_y + 1u) * self->private_impl.f_width)));
80312
    if ((v_di > v_dj) || (v_dj > ((uint64_t)(a_pix.len)))) {
80313
      break;
80314
    }
80315
    v_dst = wuffs_base__slice_u8__subslice_ij(a_pix, v_di, v_dj);
80316
    v_x = 0u;
80317
    while (((uint64_t)(v_dst.len)) >= 4u) {
80318
      if (((v_x & v_x_mask) == 0u) && (v_src_index < ((uint64_t)(a_pix.len)))) {
80319
        v_s = ((uint32_t)(a_pix.ptr[v_src_index]));
80320
        v_src_index += 4u;
80321
      }
80322
      v_p = ((v_s & v_s_mask) * 4u);
80323
      v_s >>= v_bits_per_pixel;
80324
      v_p0 = self->private_data.f_palette[(v_p + 0u)];
80325
      v_p1 = self->private_data.f_palette[(v_p + 1u)];
80326
      v_p2 = self->private_data.f_palette[(v_p + 2u)];
80327
      v_p3 = self->private_data.f_palette[(v_p + 3u)];
80328
      v_dst.ptr[0u] = v_p0;
80329
      v_dst.ptr[1u] = v_p1;
80330
      v_dst.ptr[2u] = v_p2;
80331
      v_dst.ptr[3u] = v_p3;
80332
      v_dst = wuffs_base__slice_u8__subslice_i(v_dst, 4u);
80333
      v_x += 1u;
80334
    }
80335
    v_y += 1u;
80336
  }
80337
  return wuffs_base__make_empty_struct();
80338
}
80339
80340
// -------- func webp.decoder.get_quirk
80341
80342
WUFFS_BASE__GENERATED_C_CODE
80343
WUFFS_BASE__MAYBE_STATIC uint64_t
80344
wuffs_webp__decoder__get_quirk(
80345
    const wuffs_webp__decoder* self,
80346
    uint32_t a_key) {
80347
  if (!self) {
80348
    return 0;
80349
  }
80350
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
80351
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
80352
    return 0;
80353
  }
80354
80355
  return 0u;
80356
}
80357
80358
// -------- func webp.decoder.set_quirk
80359
80360
WUFFS_BASE__GENERATED_C_CODE
80361
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
80362
wuffs_webp__decoder__set_quirk(
80363
    wuffs_webp__decoder* self,
80364
    uint32_t a_key,
80365
    uint64_t a_value) {
80366
  if (!self) {
80367
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
80368
  }
80369
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
80370
    return wuffs_base__make_status(
80371
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
80372
        ? wuffs_base__error__disabled_by_previous_error
80373
        : wuffs_base__error__initialize_not_called);
80374
  }
80375
80376
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
80377
}
80378
80379
// -------- func webp.decoder.decode_image_config
80380
80381
WUFFS_BASE__GENERATED_C_CODE
80382
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
80383
wuffs_webp__decoder__decode_image_config(
80384
    wuffs_webp__decoder* self,
80385
    wuffs_base__image_config* a_dst,
80386
    wuffs_base__io_buffer* a_src) {
80387
  if (!self) {
80388
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
80389
  }
80390
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
80391
    return wuffs_base__make_status(
80392
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
80393
        ? wuffs_base__error__disabled_by_previous_error
80394
        : wuffs_base__error__initialize_not_called);
80395
  }
80396
  if (!a_src) {
80397
    self->private_impl.magic = WUFFS_BASE__DISABLED;
80398
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
80399
  }
80400
  if ((self->private_impl.active_coroutine != 0) &&
80401
      (self->private_impl.active_coroutine != 1)) {
80402
    self->private_impl.magic = WUFFS_BASE__DISABLED;
80403
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
80404
  }
80405
  self->private_impl.active_coroutine = 0;
80406
  wuffs_base__status status = wuffs_base__make_status(NULL);
80407
80408
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
80409
80410
  uint32_t coro_susp_point = self->private_impl.p_decode_image_config;
80411
  switch (coro_susp_point) {
80412
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
80413
80414
    while (true) {
80415
      {
80416
        wuffs_base__status t_0 = wuffs_webp__decoder__do_decode_image_config(self, a_dst, a_src);
80417
        v_status = t_0;
80418
      }
80419
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
80420
        status = wuffs_base__make_status(wuffs_webp__error__truncated_input);
80421
        goto exit;
80422
      }
80423
      status = v_status;
80424
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
80425
    }
80426
80427
    ok:
80428
    self->private_impl.p_decode_image_config = 0;
80429
    goto exit;
80430
  }
80431
80432
  goto suspend;
80433
  suspend:
80434
  self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
80435
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
80436
80437
  goto exit;
80438
  exit:
80439
  if (wuffs_base__status__is_error(&status)) {
80440
    self->private_impl.magic = WUFFS_BASE__DISABLED;
80441
  }
80442
  return status;
80443
}
80444
80445
// -------- func webp.decoder.do_decode_image_config
80446
80447
WUFFS_BASE__GENERATED_C_CODE
80448
static wuffs_base__status
80449
wuffs_webp__decoder__do_decode_image_config(
80450
    wuffs_webp__decoder* self,
80451
    wuffs_base__image_config* a_dst,
80452
    wuffs_base__io_buffer* a_src) {
80453
  wuffs_base__status status = wuffs_base__make_status(NULL);
80454
80455
  uint32_t v_c32 = 0;
80456
  uint64_t v_r_mark = 0;
80457
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
80458
80459
  const uint8_t* iop_a_src = NULL;
80460
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
80461
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
80462
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
80463
  if (a_src && a_src->data.ptr) {
80464
    io0_a_src = a_src->data.ptr;
80465
    io1_a_src = io0_a_src + a_src->meta.ri;
80466
    iop_a_src = io1_a_src;
80467
    io2_a_src = io0_a_src + a_src->meta.wi;
80468
  }
80469
80470
  uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config;
80471
  switch (coro_susp_point) {
80472
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
80473
80474
    if (self->private_impl.f_call_sequence != 0u) {
80475
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
80476
      goto exit;
80477
    }
80478
    {
80479
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
80480
      uint32_t t_0;
80481
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
80482
        t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
80483
        iop_a_src += 4;
80484
      } else {
80485
        self->private_data.s_do_decode_image_config.scratch = 0;
80486
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
80487
        while (true) {
80488
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
80489
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
80490
            goto suspend;
80491
          }
80492
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
80493
          uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
80494
          *scratch <<= 8;
80495
          *scratch >>= 8;
80496
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
80497
          if (num_bits_0 == 24) {
80498
            t_0 = ((uint32_t)(*scratch));
80499
            break;
80500
          }
80501
          num_bits_0 += 8u;
80502
          *scratch |= ((uint64_t)(num_bits_0)) << 56;
80503
        }
80504
      }
80505
      v_c32 = t_0;
80506
    }
80507
    if (v_c32 != 1179011410u) {
80508
      status = wuffs_base__make_status(wuffs_webp__error__bad_header);
80509
      goto exit;
80510
    }
80511
    {
80512
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
80513
      uint32_t t_1;
80514
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
80515
        t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
80516
        iop_a_src += 4;
80517
      } else {
80518
        self->private_data.s_do_decode_image_config.scratch = 0;
80519
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
80520
        while (true) {
80521
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
80522
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
80523
            goto suspend;
80524
          }
80525
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
80526
          uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
80527
          *scratch <<= 8;
80528
          *scratch >>= 8;
80529
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
80530
          if (num_bits_1 == 24) {
80531
            t_1 = ((uint32_t)(*scratch));
80532
            break;
80533
          }
80534
          num_bits_1 += 8u;
80535
          *scratch |= ((uint64_t)(num_bits_1)) << 56;
80536
        }
80537
      }
80538
      self->private_impl.f_riff_chunk_length = t_1;
80539
    }
80540
    if ((self->private_impl.f_riff_chunk_length & 1u) != 0u) {
80541
      status = wuffs_base__make_status(wuffs_webp__error__bad_header);
80542
      goto exit;
80543
    }
80544
    while (true) {
80545
      {
80546
        const bool o_0_closed_a_src = a_src->meta.closed;
80547
        const uint8_t* o_0_io2_a_src = io2_a_src;
80548
        wuffs_private_impl__io_reader__limit(&io2_a_src, iop_a_src,
80549
            ((uint64_t)(self->private_impl.f_riff_chunk_length)));
80550
        if (a_src) {
80551
          size_t n = ((size_t)(io2_a_src - a_src->data.ptr));
80552
          a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n);
80553
          a_src->meta.wi = n;
80554
        }
80555
        v_r_mark = ((uint64_t)(iop_a_src - io0_a_src));
80556
        {
80557
          if (a_src) {
80558
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
80559
          }
80560
          wuffs_base__status t_2 = wuffs_webp__decoder__do_decode_image_config_limited(self, a_dst, a_src);
80561
          v_status = t_2;
80562
          if (a_src) {
80563
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
80564
          }
80565
        }
80566
        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))))));
80567
        io2_a_src = o_0_io2_a_src;
80568
        if (a_src) {
80569
          a_src->meta.closed = o_0_closed_a_src;
80570
          a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr));
80571
        }
80572
      }
80573
      if (wuffs_base__status__is_ok(&v_status)) {
80574
        break;
80575
      } else if ( ! wuffs_base__status__is_suspension(&v_status)) {
80576
        status = v_status;
80577
        if (wuffs_base__status__is_error(&status)) {
80578
          goto exit;
80579
        } else if (wuffs_base__status__is_suspension(&status)) {
80580
          status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
80581
          goto exit;
80582
        }
80583
        goto ok;
80584
      } else if ((v_status.repr == wuffs_base__suspension__short_read) && (self->private_impl.f_riff_chunk_length == 0u)) {
80585
        status = wuffs_base__make_status(wuffs_webp__error__short_chunk);
80586
        goto exit;
80587
      }
80588
      status = v_status;
80589
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5);
80590
    }
80591
    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)));
80592
    if ( ! self->private_impl.f_is_vp8_lossy && (a_dst != NULL)) {
80593
      wuffs_base__image_config__set(
80594
          a_dst,
80595
          self->private_impl.f_pixfmt,
80596
          0u,
80597
          self->private_impl.f_width,
80598
          self->private_impl.f_height,
80599
          self->private_impl.f_frame_config_io_position,
80600
          false);
80601
    }
80602
    self->private_impl.f_call_sequence = 32u;
80603
80604
    ok:
80605
    self->private_impl.p_do_decode_image_config = 0;
80606
    goto exit;
80607
  }
80608
80609
  goto suspend;
80610
  suspend:
80611
  self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
80612
80613
  goto exit;
80614
  exit:
80615
  if (a_src && a_src->data.ptr) {
80616
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
80617
  }
80618
80619
  return status;
80620
}
80621
80622
// -------- func webp.decoder.do_decode_image_config_limited
80623
80624
WUFFS_BASE__GENERATED_C_CODE
80625
static wuffs_base__status
80626
wuffs_webp__decoder__do_decode_image_config_limited(
80627
    wuffs_webp__decoder* self,
80628
    wuffs_base__image_config* a_dst,
80629
    wuffs_base__io_buffer* a_src) {
80630
  wuffs_base__status status = wuffs_base__make_status(NULL);
80631
80632
  uint32_t v_c32 = 0;
80633
  uint64_t v_r_mark = 0;
80634
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
80635
80636
  const uint8_t* iop_a_src = NULL;
80637
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
80638
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
80639
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
80640
  if (a_src && a_src->data.ptr) {
80641
    io0_a_src = a_src->data.ptr;
80642
    io1_a_src = io0_a_src + a_src->meta.ri;
80643
    iop_a_src = io1_a_src;
80644
    io2_a_src = io0_a_src + a_src->meta.wi;
80645
  }
80646
80647
  uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config_limited;
80648
  switch (coro_susp_point) {
80649
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
80650
80651
    {
80652
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
80653
      uint32_t t_0;
80654
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
80655
        t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
80656
        iop_a_src += 4;
80657
      } else {
80658
        self->private_data.s_do_decode_image_config_limited.scratch = 0;
80659
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
80660
        while (true) {
80661
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
80662
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
80663
            goto suspend;
80664
          }
80665
          uint64_t* scratch = &self->private_data.s_do_decode_image_config_limited.scratch;
80666
          uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
80667
          *scratch <<= 8;
80668
          *scratch >>= 8;
80669
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
80670
          if (num_bits_0 == 24) {
80671
            t_0 = ((uint32_t)(*scratch));
80672
            break;
80673
          }
80674
          num_bits_0 += 8u;
80675
          *scratch |= ((uint64_t)(num_bits_0)) << 56;
80676
        }
80677
      }
80678
      v_c32 = t_0;
80679
    }
80680
    if (v_c32 != 1346520407u) {
80681
      status = wuffs_base__make_status(wuffs_webp__error__bad_header);
80682
      goto exit;
80683
    }
80684
    {
80685
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
80686
      uint32_t t_1;
80687
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
80688
        t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
80689
        iop_a_src += 4;
80690
      } else {
80691
        self->private_data.s_do_decode_image_config_limited.scratch = 0;
80692
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
80693
        while (true) {
80694
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
80695
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
80696
            goto suspend;
80697
          }
80698
          uint64_t* scratch = &self->private_data.s_do_decode_image_config_limited.scratch;
80699
          uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
80700
          *scratch <<= 8;
80701
          *scratch >>= 8;
80702
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
80703
          if (num_bits_1 == 24) {
80704
            t_1 = ((uint32_t)(*scratch));
80705
            break;
80706
          }
80707
          num_bits_1 += 8u;
80708
          *scratch |= ((uint64_t)(num_bits_1)) << 56;
80709
        }
80710
      }
80711
      v_c32 = t_1;
80712
    }
80713
    if (v_c32 == 540561494u) {
80714
      self->private_impl.f_is_vp8_lossy = true;
80715
    } else if (v_c32 == 1278758998u) {
80716
    } else if (v_c32 == 1480085590u) {
80717
      status = wuffs_base__make_status(wuffs_webp__error__unsupported_webp_file);
80718
      goto exit;
80719
    } else {
80720
      status = wuffs_base__make_status(wuffs_webp__error__bad_header);
80721
      goto exit;
80722
    }
80723
    {
80724
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
80725
      uint32_t t_2;
80726
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
80727
        t_2 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
80728
        iop_a_src += 4;
80729
      } else {
80730
        self->private_data.s_do_decode_image_config_limited.scratch = 0;
80731
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
80732
        while (true) {
80733
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
80734
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
80735
            goto suspend;
80736
          }
80737
          uint64_t* scratch = &self->private_data.s_do_decode_image_config_limited.scratch;
80738
          uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56));
80739
          *scratch <<= 8;
80740
          *scratch >>= 8;
80741
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2;
80742
          if (num_bits_2 == 24) {
80743
            t_2 = ((uint32_t)(*scratch));
80744
            break;
80745
          }
80746
          num_bits_2 += 8u;
80747
          *scratch |= ((uint64_t)(num_bits_2)) << 56;
80748
        }
80749
      }
80750
      self->private_impl.f_sub_chunk_length = t_2;
80751
    }
80752
    if (self->private_impl.f_sub_chunk_length < 4u) {
80753
      status = wuffs_base__make_status(wuffs_webp__error__bad_header);
80754
      goto exit;
80755
    }
80756
    self->private_impl.f_sub_chunk_has_padding = ((self->private_impl.f_sub_chunk_length & 1u) != 0u);
80757
    while (true) {
80758
      {
80759
        const bool o_0_closed_a_src = a_src->meta.closed;
80760
        const uint8_t* o_0_io2_a_src = io2_a_src;
80761
        wuffs_private_impl__io_reader__limit(&io2_a_src, iop_a_src,
80762
            ((uint64_t)(self->private_impl.f_sub_chunk_length)));
80763
        if (a_src) {
80764
          size_t n = ((size_t)(io2_a_src - a_src->data.ptr));
80765
          a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n);
80766
          a_src->meta.wi = n;
80767
        }
80768
        v_r_mark = ((uint64_t)(iop_a_src - io0_a_src));
80769
        if (self->private_impl.f_is_vp8_lossy) {
80770
          {
80771
            if (a_src) {
80772
              a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
80773
            }
80774
            wuffs_base__status t_3 = wuffs_vp8__decoder__decode_image_config(&self->private_data.f_vp8, a_dst, a_src);
80775
            v_status = t_3;
80776
            if (a_src) {
80777
              iop_a_src = a_src->data.ptr + a_src->meta.ri;
80778
            }
80779
          }
80780
        } else {
80781
          {
80782
            if (a_src) {
80783
              a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
80784
            }
80785
            wuffs_base__status t_4 = wuffs_webp__decoder__do_decode_image_config_limited_vp8l(self, a_src);
80786
            v_status = t_4;
80787
            if (a_src) {
80788
              iop_a_src = a_src->data.ptr + a_src->meta.ri;
80789
            }
80790
          }
80791
        }
80792
        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))))));
80793
        io2_a_src = o_0_io2_a_src;
80794
        if (a_src) {
80795
          a_src->meta.closed = o_0_closed_a_src;
80796
          a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr));
80797
        }
80798
      }
80799
      if (wuffs_base__status__is_ok(&v_status)) {
80800
        break;
80801
      } else if ( ! wuffs_base__status__is_suspension(&v_status)) {
80802
        status = v_status;
80803
        if (wuffs_base__status__is_error(&status)) {
80804
          goto exit;
80805
        } else if (wuffs_base__status__is_suspension(&status)) {
80806
          status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
80807
          goto exit;
80808
        }
80809
        goto ok;
80810
      } else if ((v_status.repr == wuffs_base__suspension__short_read) && (self->private_impl.f_sub_chunk_length == 0u)) {
80811
        status = wuffs_base__make_status(wuffs_webp__error__short_chunk);
80812
        goto exit;
80813
      }
80814
      status = v_status;
80815
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7);
80816
    }
80817
80818
    ok:
80819
    self->private_impl.p_do_decode_image_config_limited = 0;
80820
    goto exit;
80821
  }
80822
80823
  goto suspend;
80824
  suspend:
80825
  self->private_impl.p_do_decode_image_config_limited = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
80826
80827
  goto exit;
80828
  exit:
80829
  if (a_src && a_src->data.ptr) {
80830
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
80831
  }
80832
80833
  return status;
80834
}
80835
80836
// -------- func webp.decoder.do_decode_image_config_limited_vp8l
80837
80838
WUFFS_BASE__GENERATED_C_CODE
80839
static wuffs_base__status
80840
wuffs_webp__decoder__do_decode_image_config_limited_vp8l(
80841
    wuffs_webp__decoder* self,
80842
    wuffs_base__io_buffer* a_src) {
80843
  wuffs_base__status status = wuffs_base__make_status(NULL);
80844
80845
  uint32_t v_c32 = 0;
80846
  uint32_t v_transform_size = 0;
80847
80848
  const uint8_t* iop_a_src = NULL;
80849
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
80850
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
80851
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
80852
  if (a_src && a_src->data.ptr) {
80853
    io0_a_src = a_src->data.ptr;
80854
    io1_a_src = io0_a_src + a_src->meta.ri;
80855
    iop_a_src = io1_a_src;
80856
    io2_a_src = io0_a_src + a_src->meta.wi;
80857
  }
80858
80859
  uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config_limited_vp8l;
80860
  switch (coro_susp_point) {
80861
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
80862
80863
    {
80864
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
80865
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
80866
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
80867
        goto suspend;
80868
      }
80869
      uint32_t t_0 = *iop_a_src++;
80870
      v_c32 = t_0;
80871
    }
80872
    if (v_c32 != 47u) {
80873
      status = wuffs_base__make_status(wuffs_webp__error__bad_header);
80874
      goto exit;
80875
    }
80876
    {
80877
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
80878
      uint32_t t_1;
80879
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
80880
        t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
80881
        iop_a_src += 4;
80882
      } else {
80883
        self->private_data.s_do_decode_image_config_limited_vp8l.scratch = 0;
80884
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
80885
        while (true) {
80886
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
80887
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
80888
            goto suspend;
80889
          }
80890
          uint64_t* scratch = &self->private_data.s_do_decode_image_config_limited_vp8l.scratch;
80891
          uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
80892
          *scratch <<= 8;
80893
          *scratch >>= 8;
80894
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
80895
          if (num_bits_1 == 24) {
80896
            t_1 = ((uint32_t)(*scratch));
80897
            break;
80898
          }
80899
          num_bits_1 += 8u;
80900
          *scratch |= ((uint64_t)(num_bits_1)) << 56;
80901
        }
80902
      }
80903
      v_c32 = t_1;
80904
    }
80905
    self->private_impl.f_width = ((v_c32 & 16383u) + 1u);
80906
    v_c32 >>= 14u;
80907
    self->private_impl.f_height = ((v_c32 & 16383u) + 1u);
80908
    v_c32 >>= 14u;
80909
    self->private_impl.f_pixfmt = 2415954056u;
80910
    if ((v_c32 & 1u) != 0u) {
80911
      self->private_impl.f_pixfmt = 2164295816u;
80912
    }
80913
    v_c32 >>= 1u;
80914
    if (v_c32 != 0u) {
80915
      status = wuffs_base__make_status(wuffs_webp__error__bad_header);
80916
      goto exit;
80917
    }
80918
    v_transform_size = (4u * ((self->private_impl.f_width + 3u) >> 2u) * ((self->private_impl.f_height + 3u) >> 2u));
80919
    self->private_impl.f_workbuf_offset_for_transform[0u] = ((4u * self->private_impl.f_width * self->private_impl.f_height) + (0u * v_transform_size));
80920
    self->private_impl.f_workbuf_offset_for_transform[1u] = ((4u * self->private_impl.f_width * self->private_impl.f_height) + (1u * v_transform_size));
80921
    self->private_impl.f_workbuf_offset_for_transform[2u] = ((4u * self->private_impl.f_width * self->private_impl.f_height) + (2u * v_transform_size));
80922
    self->private_impl.f_workbuf_offset_for_transform[3u] = ((4u * self->private_impl.f_width * self->private_impl.f_height) + (3u * v_transform_size));
80923
80924
    goto ok;
80925
    ok:
80926
    self->private_impl.p_do_decode_image_config_limited_vp8l = 0;
80927
    goto exit;
80928
  }
80929
80930
  goto suspend;
80931
  suspend:
80932
  self->private_impl.p_do_decode_image_config_limited_vp8l = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
80933
80934
  goto exit;
80935
  exit:
80936
  if (a_src && a_src->data.ptr) {
80937
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
80938
  }
80939
80940
  return status;
80941
}
80942
80943
// -------- func webp.decoder.decode_frame_config
80944
80945
WUFFS_BASE__GENERATED_C_CODE
80946
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
80947
wuffs_webp__decoder__decode_frame_config(
80948
    wuffs_webp__decoder* self,
80949
    wuffs_base__frame_config* a_dst,
80950
    wuffs_base__io_buffer* a_src) {
80951
  if (!self) {
80952
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
80953
  }
80954
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
80955
    return wuffs_base__make_status(
80956
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
80957
        ? wuffs_base__error__disabled_by_previous_error
80958
        : wuffs_base__error__initialize_not_called);
80959
  }
80960
  if (!a_src) {
80961
    self->private_impl.magic = WUFFS_BASE__DISABLED;
80962
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
80963
  }
80964
  if ((self->private_impl.active_coroutine != 0) &&
80965
      (self->private_impl.active_coroutine != 2)) {
80966
    self->private_impl.magic = WUFFS_BASE__DISABLED;
80967
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
80968
  }
80969
  self->private_impl.active_coroutine = 0;
80970
  wuffs_base__status status = wuffs_base__make_status(NULL);
80971
80972
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
80973
80974
  uint32_t coro_susp_point = self->private_impl.p_decode_frame_config;
80975
  switch (coro_susp_point) {
80976
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
80977
80978
    while (true) {
80979
      if (self->private_impl.f_is_vp8_lossy) {
80980
        {
80981
          wuffs_base__status t_0 = wuffs_vp8__decoder__decode_frame_config(&self->private_data.f_vp8, a_dst, a_src);
80982
          v_status = t_0;
80983
        }
80984
      } else {
80985
        {
80986
          wuffs_base__status t_1 = wuffs_webp__decoder__do_decode_frame_config(self, a_dst, a_src);
80987
          v_status = t_1;
80988
        }
80989
      }
80990
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
80991
        status = wuffs_base__make_status(wuffs_webp__error__truncated_input);
80992
        goto exit;
80993
      }
80994
      status = v_status;
80995
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
80996
    }
80997
80998
    ok:
80999
    self->private_impl.p_decode_frame_config = 0;
81000
    goto exit;
81001
  }
81002
81003
  goto suspend;
81004
  suspend:
81005
  self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
81006
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0;
81007
81008
  goto exit;
81009
  exit:
81010
  if (wuffs_base__status__is_error(&status)) {
81011
    self->private_impl.magic = WUFFS_BASE__DISABLED;
81012
  }
81013
  return status;
81014
}
81015
81016
// -------- func webp.decoder.do_decode_frame_config
81017
81018
WUFFS_BASE__GENERATED_C_CODE
81019
static wuffs_base__status
81020
wuffs_webp__decoder__do_decode_frame_config(
81021
    wuffs_webp__decoder* self,
81022
    wuffs_base__frame_config* a_dst,
81023
    wuffs_base__io_buffer* a_src) {
81024
  wuffs_base__status status = wuffs_base__make_status(NULL);
81025
81026
  wuffs_base__pixel_format v_pixfmt = {0};
81027
81028
  const uint8_t* iop_a_src = NULL;
81029
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
81030
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
81031
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
81032
  if (a_src && a_src->data.ptr) {
81033
    io0_a_src = a_src->data.ptr;
81034
    io1_a_src = io0_a_src + a_src->meta.ri;
81035
    iop_a_src = io1_a_src;
81036
    io2_a_src = io0_a_src + a_src->meta.wi;
81037
  }
81038
81039
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config;
81040
  switch (coro_susp_point) {
81041
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
81042
81043
    if (self->private_impl.f_call_sequence == 32u) {
81044
    } else if (self->private_impl.f_call_sequence < 32u) {
81045
      if (a_src) {
81046
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
81047
      }
81048
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
81049
      status = wuffs_webp__decoder__do_decode_image_config(self, NULL, a_src);
81050
      if (a_src) {
81051
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
81052
      }
81053
      if (status.repr) {
81054
        goto suspend;
81055
      }
81056
    } else if (self->private_impl.f_call_sequence == 40u) {
81057
      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)))) {
81058
        status = wuffs_base__make_status(wuffs_base__error__bad_restart);
81059
        goto exit;
81060
      }
81061
    } else if (self->private_impl.f_call_sequence == 64u) {
81062
      self->private_impl.f_call_sequence = 96u;
81063
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
81064
      goto ok;
81065
    } else {
81066
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
81067
      goto ok;
81068
    }
81069
    if (a_dst != NULL) {
81070
      v_pixfmt = wuffs_base__utility__make_pixel_format(self->private_impl.f_pixfmt);
81071
      wuffs_base__frame_config__set(
81072
          a_dst,
81073
          wuffs_base__utility__make_rect_ie_u32(
81074
          0u,
81075
          0u,
81076
          self->private_impl.f_width,
81077
          self->private_impl.f_height),
81078
          ((wuffs_base__flicks)(0u)),
81079
          0u,
81080
          self->private_impl.f_frame_config_io_position,
81081
          0u,
81082
          false,
81083
          false,
81084
          wuffs_base__pixel_format__default_background_color(&v_pixfmt));
81085
    }
81086
    self->private_impl.f_call_sequence = 64u;
81087
81088
    ok:
81089
    self->private_impl.p_do_decode_frame_config = 0;
81090
    goto exit;
81091
  }
81092
81093
  goto suspend;
81094
  suspend:
81095
  self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
81096
81097
  goto exit;
81098
  exit:
81099
  if (a_src && a_src->data.ptr) {
81100
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
81101
  }
81102
81103
  return status;
81104
}
81105
81106
// -------- func webp.decoder.decode_frame
81107
81108
WUFFS_BASE__GENERATED_C_CODE
81109
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
81110
wuffs_webp__decoder__decode_frame(
81111
    wuffs_webp__decoder* self,
81112
    wuffs_base__pixel_buffer* a_dst,
81113
    wuffs_base__io_buffer* a_src,
81114
    wuffs_base__pixel_blend a_blend,
81115
    wuffs_base__slice_u8 a_workbuf,
81116
    wuffs_base__decode_frame_options* a_opts) {
81117
  if (!self) {
81118
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
81119
  }
81120
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
81121
    return wuffs_base__make_status(
81122
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
81123
        ? wuffs_base__error__disabled_by_previous_error
81124
        : wuffs_base__error__initialize_not_called);
81125
  }
81126
  if (!a_dst || !a_src) {
81127
    self->private_impl.magic = WUFFS_BASE__DISABLED;
81128
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
81129
  }
81130
  if ((self->private_impl.active_coroutine != 0) &&
81131
      (self->private_impl.active_coroutine != 3)) {
81132
    self->private_impl.magic = WUFFS_BASE__DISABLED;
81133
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
81134
  }
81135
  self->private_impl.active_coroutine = 0;
81136
  wuffs_base__status status = wuffs_base__make_status(NULL);
81137
81138
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
81139
81140
  uint32_t coro_susp_point = self->private_impl.p_decode_frame;
81141
  switch (coro_susp_point) {
81142
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
81143
81144
    while (true) {
81145
      if (self->private_impl.f_is_vp8_lossy) {
81146
        {
81147
          wuffs_base__status t_0 = wuffs_vp8__decoder__decode_frame(&self->private_data.f_vp8,
81148
              a_dst,
81149
              a_src,
81150
              a_blend,
81151
              a_workbuf,
81152
              a_opts);
81153
          v_status = t_0;
81154
        }
81155
      } else {
81156
        {
81157
          wuffs_base__status t_1 = wuffs_webp__decoder__do_decode_frame(self,
81158
              a_dst,
81159
              a_src,
81160
              a_blend,
81161
              a_workbuf,
81162
              a_opts);
81163
          v_status = t_1;
81164
        }
81165
      }
81166
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
81167
        status = wuffs_base__make_status(wuffs_webp__error__truncated_input);
81168
        goto exit;
81169
      }
81170
      status = v_status;
81171
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
81172
    }
81173
81174
    ok:
81175
    self->private_impl.p_decode_frame = 0;
81176
    goto exit;
81177
  }
81178
81179
  goto suspend;
81180
  suspend:
81181
  self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
81182
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0;
81183
81184
  goto exit;
81185
  exit:
81186
  if (wuffs_base__status__is_error(&status)) {
81187
    self->private_impl.magic = WUFFS_BASE__DISABLED;
81188
  }
81189
  return status;
81190
}
81191
81192
// -------- func webp.decoder.do_decode_frame
81193
81194
WUFFS_BASE__GENERATED_C_CODE
81195
static wuffs_base__status
81196
wuffs_webp__decoder__do_decode_frame(
81197
    wuffs_webp__decoder* self,
81198
    wuffs_base__pixel_buffer* a_dst,
81199
    wuffs_base__io_buffer* a_src,
81200
    wuffs_base__pixel_blend a_blend,
81201
    wuffs_base__slice_u8 a_workbuf,
81202
    wuffs_base__decode_frame_options* a_opts) {
81203
  wuffs_base__status status = wuffs_base__make_status(NULL);
81204
81205
  uint8_t v_c8 = 0;
81206
  uint32_t v_has_more = 0;
81207
  uint32_t v_width = 0;
81208
  wuffs_base__slice_u8 v_dst = {0};
81209
  wuffs_base__slice_u8 v_tile_data = {0};
81210
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
81211
  wuffs_base__slice_u8 v_pix = {0};
81212
  uint32_t v_which = 0;
81213
  uint32_t v_transform_type = 0;
81214
  uint64_t v_ti = 0;
81215
  uint64_t v_tj = 0;
81216
81217
  const uint8_t* iop_a_src = NULL;
81218
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
81219
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
81220
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
81221
  if (a_src && a_src->data.ptr) {
81222
    io0_a_src = a_src->data.ptr;
81223
    io1_a_src = io0_a_src + a_src->meta.ri;
81224
    iop_a_src = io1_a_src;
81225
    io2_a_src = io0_a_src + a_src->meta.wi;
81226
  }
81227
81228
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame;
81229
  if (coro_susp_point) {
81230
    v_width = self->private_data.s_do_decode_frame.v_width;
81231
  }
81232
  switch (coro_susp_point) {
81233
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
81234
81235
    if (self->private_impl.f_call_sequence == 64u) {
81236
    } else if (self->private_impl.f_call_sequence < 64u) {
81237
      if (a_src) {
81238
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
81239
      }
81240
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
81241
      status = wuffs_webp__decoder__do_decode_frame_config(self, NULL, a_src);
81242
      if (a_src) {
81243
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
81244
      }
81245
      if (status.repr) {
81246
        goto suspend;
81247
      }
81248
    } else {
81249
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
81250
      goto ok;
81251
    }
81252
    self->private_impl.f_seen_transform[0u] = false;
81253
    self->private_impl.f_seen_transform[1u] = false;
81254
    self->private_impl.f_seen_transform[2u] = false;
81255
    self->private_impl.f_seen_transform[3u] = false;
81256
    self->private_impl.f_n_transforms = 0u;
81257
    while (true) {
81258
      if (self->private_impl.f_n_bits < 1u) {
81259
        {
81260
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
81261
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
81262
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
81263
            goto suspend;
81264
          }
81265
          uint8_t t_0 = *iop_a_src++;
81266
          v_c8 = t_0;
81267
        }
81268
        self->private_impl.f_bits = ((uint32_t)(v_c8));
81269
        self->private_impl.f_n_bits = 8u;
81270
      }
81271
      v_has_more = (self->private_impl.f_bits & 1u);
81272
      self->private_impl.f_bits >>= 1u;
81273
      self->private_impl.f_n_bits -= 1u;
81274
      if (v_has_more == 0u) {
81275
        break;
81276
      }
81277
      if (a_src) {
81278
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
81279
      }
81280
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
81281
      status = wuffs_webp__decoder__decode_transform(self, a_src, a_workbuf);
81282
      if (a_src) {
81283
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
81284
      }
81285
      if (status.repr) {
81286
        goto suspend;
81287
      }
81288
    }
81289
    v_width = self->private_impl.f_width;
81290
    if (self->private_impl.f_seen_transform[3u]) {
81291
      v_width = self->private_impl.f_color_indexing_width;
81292
    }
81293
    if (a_src) {
81294
      a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
81295
    }
81296
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
81297
    status = wuffs_webp__decoder__decode_color_cache_parameters(self, a_src);
81298
    if (a_src) {
81299
      iop_a_src = a_src->data.ptr + a_src->meta.ri;
81300
    }
81301
    if (status.repr) {
81302
      goto suspend;
81303
    }
81304
    self->private_impl.f_overall_color_cache_bits = self->private_impl.f_color_cache_bits;
81305
    if (a_src) {
81306
      a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
81307
    }
81308
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
81309
    status = wuffs_webp__decoder__decode_hg_table(self, a_src, v_width, a_workbuf);
81310
    if (a_src) {
81311
      iop_a_src = a_src->data.ptr + a_src->meta.ri;
81312
    }
81313
    if (status.repr) {
81314
      goto suspend;
81315
    }
81316
    self->private_impl.f_color_cache_bits = self->private_impl.f_overall_color_cache_bits;
81317
    if (a_src) {
81318
      a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
81319
    }
81320
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
81321
    status = wuffs_webp__decoder__decode_huffman_groups(self, a_src, self->private_impl.f_overall_n_huffman_groups);
81322
    if (a_src) {
81323
      iop_a_src = a_src->data.ptr + a_src->meta.ri;
81324
    }
81325
    if (status.repr) {
81326
      goto suspend;
81327
    }
81328
    while (true) {
81329
      if ((((uint64_t)(self->private_impl.f_workbuf_offset_for_color_indexing)) > ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u]))) ||
81330
          (((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])) > ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u]))) ||
81331
          (((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u])) > ((uint64_t)(a_workbuf.len))) ||
81332
          (((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])) > ((uint64_t)(a_workbuf.len)))) {
81333
        status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length);
81334
        goto exit;
81335
      }
81336
      v_dst = wuffs_base__slice_u8__subslice_ij(a_workbuf,
81337
          ((uint64_t)(self->private_impl.f_workbuf_offset_for_color_indexing)),
81338
          ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])));
81339
      v_tile_data = wuffs_base__slice_u8__subslice_ij(a_workbuf,
81340
          ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])),
81341
          ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u])));
81342
      {
81343
        if (a_src) {
81344
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
81345
        }
81346
        wuffs_base__status t_1 = wuffs_webp__decoder__decode_pixels(self,
81347
            v_dst,
81348
            a_src,
81349
            v_width,
81350
            self->private_impl.f_height,
81351
            v_tile_data,
81352
            self->private_impl.f_overall_tile_size_log2);
81353
        v_status = t_1;
81354
        if (a_src) {
81355
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
81356
        }
81357
      }
81358
      if (wuffs_base__status__is_ok(&v_status)) {
81359
        break;
81360
      }
81361
      status = v_status;
81362
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7);
81363
    }
81364
    if (((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])) > ((uint64_t)(a_workbuf.len))) {
81365
      status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length);
81366
      goto exit;
81367
    }
81368
    v_pix = wuffs_base__slice_u8__subslice_j(a_workbuf, ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])));
81369
    v_which = self->private_impl.f_n_transforms;
81370
    while (v_which > 0u) {
81371
      v_which -= 1u;
81372
      v_transform_type = ((uint32_t)(self->private_impl.f_transform_type[v_which]));
81373
      v_tile_data = wuffs_base__utility__empty_slice_u8();
81374
      if (v_transform_type < 2u) {
81375
        v_ti = ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[(v_transform_type + 1u)]));
81376
        v_tj = ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[(v_transform_type + 2u)]));
81377
        if ((v_ti <= v_tj) && (v_tj <= ((uint64_t)(a_workbuf.len)))) {
81378
          v_tile_data = wuffs_base__slice_u8__subslice_ij(a_workbuf, v_ti, v_tj);
81379
        }
81380
      }
81381
      if (v_transform_type == 0u) {
81382
        wuffs_webp__decoder__apply_transform_predictor(self, v_pix, v_tile_data);
81383
      } else if (v_transform_type == 1u) {
81384
        wuffs_webp__decoder__apply_transform_cross_color(self, v_pix, v_tile_data);
81385
      } else if (v_transform_type == 2u) {
81386
        wuffs_webp__decoder__apply_transform_subtract_green(self, v_pix);
81387
      } else {
81388
        wuffs_webp__decoder__apply_transform_color_indexing(self, v_pix);
81389
        v_width = self->private_impl.f_width;
81390
      }
81391
    }
81392
    v_status = wuffs_webp__decoder__swizzle(self, a_dst, v_pix, a_blend);
81393
    if ( ! wuffs_base__status__is_ok(&v_status)) {
81394
      status = v_status;
81395
      if (wuffs_base__status__is_error(&status)) {
81396
        goto exit;
81397
      } else if (wuffs_base__status__is_suspension(&status)) {
81398
        status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
81399
        goto exit;
81400
      }
81401
      goto ok;
81402
    }
81403
    self->private_impl.f_call_sequence = 96u;
81404
81405
    ok:
81406
    self->private_impl.p_do_decode_frame = 0;
81407
    goto exit;
81408
  }
81409
81410
  goto suspend;
81411
  suspend:
81412
  self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
81413
  self->private_data.s_do_decode_frame.v_width = v_width;
81414
81415
  goto exit;
81416
  exit:
81417
  if (a_src && a_src->data.ptr) {
81418
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
81419
  }
81420
81421
  return status;
81422
}
81423
81424
// -------- func webp.decoder.decode_transform
81425
81426
WUFFS_BASE__GENERATED_C_CODE
81427
static wuffs_base__status
81428
wuffs_webp__decoder__decode_transform(
81429
    wuffs_webp__decoder* self,
81430
    wuffs_base__io_buffer* a_src,
81431
    wuffs_base__slice_u8 a_workbuf) {
81432
  wuffs_base__status status = wuffs_base__make_status(NULL);
81433
81434
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
81435
  uint8_t v_c8 = 0;
81436
  uint32_t v_transform_type = 0;
81437
  uint32_t v_tile_size_log2 = 0;
81438
  wuffs_base__slice_u8 v_p = {0};
81439
81440
  const uint8_t* iop_a_src = NULL;
81441
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
81442
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
81443
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
81444
  if (a_src && a_src->data.ptr) {
81445
    io0_a_src = a_src->data.ptr;
81446
    io1_a_src = io0_a_src + a_src->meta.ri;
81447
    iop_a_src = io1_a_src;
81448
    io2_a_src = io0_a_src + a_src->meta.wi;
81449
  }
81450
81451
  uint32_t coro_susp_point = self->private_impl.p_decode_transform;
81452
  if (coro_susp_point) {
81453
    v_transform_type = self->private_data.s_decode_transform.v_transform_type;
81454
    v_tile_size_log2 = self->private_data.s_decode_transform.v_tile_size_log2;
81455
  }
81456
  switch (coro_susp_point) {
81457
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
81458
81459
    if (self->private_impl.f_n_bits < 2u) {
81460
      {
81461
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
81462
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
81463
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
81464
          goto suspend;
81465
        }
81466
        uint8_t t_0 = *iop_a_src++;
81467
        v_c8 = t_0;
81468
      }
81469
      if (self->private_impl.f_n_bits >= 2u) {
81470
        status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
81471
        goto exit;
81472
      }
81473
      self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
81474
      self->private_impl.f_n_bits += 8u;
81475
    }
81476
    v_transform_type = (self->private_impl.f_bits & 3u);
81477
    self->private_impl.f_bits >>= 2u;
81478
    self->private_impl.f_n_bits -= 2u;
81479
    if (self->private_impl.f_seen_transform[v_transform_type] || (self->private_impl.f_n_transforms >= 4u)) {
81480
      status = wuffs_base__make_status(wuffs_webp__error__bad_transform);
81481
      goto exit;
81482
    } else if (self->private_impl.f_seen_transform[3u]) {
81483
      status = wuffs_base__make_status(wuffs_webp__error__unsupported_transform_after_color_indexing_transform);
81484
      goto exit;
81485
    }
81486
    self->private_impl.f_seen_transform[v_transform_type] = true;
81487
    self->private_impl.f_transform_type[self->private_impl.f_n_transforms] = ((uint8_t)(v_transform_type));
81488
    self->private_impl.f_n_transforms += 1u;
81489
    if (v_transform_type < 2u) {
81490
      if (self->private_impl.f_n_bits < 3u) {
81491
        {
81492
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
81493
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
81494
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
81495
            goto suspend;
81496
          }
81497
          uint8_t t_1 = *iop_a_src++;
81498
          v_c8 = t_1;
81499
        }
81500
        if (self->private_impl.f_n_bits >= 3u) {
81501
          status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
81502
          goto exit;
81503
        }
81504
        self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
81505
        self->private_impl.f_n_bits += 8u;
81506
      }
81507
      v_tile_size_log2 = ((self->private_impl.f_bits & 7u) + 2u);
81508
      self->private_impl.f_transform_tile_size_log2[v_transform_type] = ((uint8_t)(v_tile_size_log2));
81509
      self->private_impl.f_bits >>= 3u;
81510
      self->private_impl.f_n_bits -= 3u;
81511
      if (a_src) {
81512
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
81513
      }
81514
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
81515
      status = wuffs_webp__decoder__decode_color_cache_parameters(self, a_src);
81516
      if (a_src) {
81517
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
81518
      }
81519
      if (status.repr) {
81520
        goto suspend;
81521
      }
81522
      if (a_src) {
81523
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
81524
      }
81525
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
81526
      status = wuffs_webp__decoder__decode_huffman_groups(self, a_src, 1u);
81527
      if (a_src) {
81528
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
81529
      }
81530
      if (status.repr) {
81531
        goto suspend;
81532
      }
81533
      while (true) {
81534
        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)))) {
81535
          status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length);
81536
          goto exit;
81537
        }
81538
        {
81539
          if (a_src) {
81540
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
81541
          }
81542
          wuffs_base__status t_2 = wuffs_webp__decoder__decode_pixels(self,
81543
              wuffs_base__slice_u8__subslice_ij(a_workbuf,
81544
              ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[(v_transform_type + 1u)])),
81545
              ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[(v_transform_type + 2u)]))),
81546
              a_src,
81547
              ((self->private_impl.f_width + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2),
81548
              ((self->private_impl.f_height + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2),
81549
              wuffs_base__utility__empty_slice_u8(),
81550
              0u);
81551
          v_status = t_2;
81552
          if (a_src) {
81553
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
81554
          }
81555
        }
81556
        if (wuffs_base__status__is_ok(&v_status)) {
81557
          break;
81558
        }
81559
        status = v_status;
81560
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5);
81561
      }
81562
    } else if (v_transform_type == 2u) {
81563
    } else {
81564
      if (self->private_impl.f_n_bits < 8u) {
81565
        {
81566
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
81567
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
81568
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
81569
            goto suspend;
81570
          }
81571
          uint8_t t_3 = *iop_a_src++;
81572
          v_c8 = t_3;
81573
        }
81574
        if (self->private_impl.f_n_bits >= 8u) {
81575
          status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
81576
          goto exit;
81577
        }
81578
        self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
81579
        self->private_impl.f_n_bits += 8u;
81580
      }
81581
      self->private_impl.f_color_indexing_palette_size = ((self->private_impl.f_bits & 255u) + 1u);
81582
      self->private_impl.f_bits >>= 8u;
81583
      self->private_impl.f_n_bits -= 8u;
81584
      if (self->private_impl.f_color_indexing_palette_size <= 2u) {
81585
        self->private_impl.f_color_indexing_width = ((self->private_impl.f_width + 7u) / 8u);
81586
        self->private_impl.f_transform_tile_size_log2[3u] = 3u;
81587
      } else if (self->private_impl.f_color_indexing_palette_size <= 4u) {
81588
        self->private_impl.f_color_indexing_width = ((self->private_impl.f_width + 3u) / 4u);
81589
        self->private_impl.f_transform_tile_size_log2[3u] = 2u;
81590
      } else if (self->private_impl.f_color_indexing_palette_size <= 16u) {
81591
        self->private_impl.f_color_indexing_width = ((self->private_impl.f_width + 1u) / 2u);
81592
        self->private_impl.f_transform_tile_size_log2[3u] = 1u;
81593
      } else {
81594
        self->private_impl.f_color_indexing_width = self->private_impl.f_width;
81595
        self->private_impl.f_transform_tile_size_log2[3u] = 0u;
81596
      }
81597
      if (self->private_impl.f_width >= self->private_impl.f_color_indexing_width) {
81598
        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);
81599
      }
81600
      if (a_src) {
81601
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
81602
      }
81603
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
81604
      status = wuffs_webp__decoder__decode_color_cache_parameters(self, a_src);
81605
      if (a_src) {
81606
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
81607
      }
81608
      if (status.repr) {
81609
        goto suspend;
81610
      }
81611
      if (a_src) {
81612
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
81613
      }
81614
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
81615
      status = wuffs_webp__decoder__decode_huffman_groups(self, a_src, 1u);
81616
      if (a_src) {
81617
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
81618
      }
81619
      if (status.repr) {
81620
        goto suspend;
81621
      }
81622
      if (a_src) {
81623
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
81624
      }
81625
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
81626
      status = wuffs_webp__decoder__decode_pixels(self,
81627
          wuffs_base__make_slice_u8(self->private_data.f_palette, (4u * self->private_impl.f_color_indexing_palette_size)),
81628
          a_src,
81629
          self->private_impl.f_color_indexing_palette_size,
81630
          1u,
81631
          wuffs_base__utility__empty_slice_u8(),
81632
          0u);
81633
      if (a_src) {
81634
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
81635
      }
81636
      if (status.repr) {
81637
        goto suspend;
81638
      }
81639
      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);
81640
      v_p = wuffs_base__make_slice_u8(self->private_data.f_palette, (4u * self->private_impl.f_color_indexing_palette_size));
81641
      while (((uint64_t)(v_p.len)) >= 8u) {
81642
#if defined(__GNUC__)
81643
#pragma GCC diagnostic push
81644
#pragma GCC diagnostic ignored "-Wconversion"
81645
#endif
81646
        v_p.ptr[4u] += v_p.ptr[0u];
81647
        v_p.ptr[5u] += v_p.ptr[1u];
81648
        v_p.ptr[6u] += v_p.ptr[2u];
81649
        v_p.ptr[7u] += v_p.ptr[3u];
81650
#if defined(__GNUC__)
81651
#pragma GCC diagnostic pop
81652
#endif
81653
        v_p = wuffs_base__slice_u8__subslice_i(v_p, 4u);
81654
      }
81655
    }
81656
81657
    ok:
81658
    self->private_impl.p_decode_transform = 0;
81659
    goto exit;
81660
  }
81661
81662
  goto suspend;
81663
  suspend:
81664
  self->private_impl.p_decode_transform = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
81665
  self->private_data.s_decode_transform.v_transform_type = v_transform_type;
81666
  self->private_data.s_decode_transform.v_tile_size_log2 = v_tile_size_log2;
81667
81668
  goto exit;
81669
  exit:
81670
  if (a_src && a_src->data.ptr) {
81671
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
81672
  }
81673
81674
  return status;
81675
}
81676
81677
// -------- func webp.decoder.decode_color_cache_parameters
81678
81679
WUFFS_BASE__GENERATED_C_CODE
81680
static wuffs_base__status
81681
wuffs_webp__decoder__decode_color_cache_parameters(
81682
    wuffs_webp__decoder* self,
81683
    wuffs_base__io_buffer* a_src) {
81684
  wuffs_base__status status = wuffs_base__make_status(NULL);
81685
81686
  uint8_t v_c8 = 0;
81687
  uint32_t v_use_color_cache = 0;
81688
  uint32_t v_color_cache_bits = 0;
81689
81690
  const uint8_t* iop_a_src = NULL;
81691
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
81692
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
81693
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
81694
  if (a_src && a_src->data.ptr) {
81695
    io0_a_src = a_src->data.ptr;
81696
    io1_a_src = io0_a_src + a_src->meta.ri;
81697
    iop_a_src = io1_a_src;
81698
    io2_a_src = io0_a_src + a_src->meta.wi;
81699
  }
81700
81701
  uint32_t coro_susp_point = self->private_impl.p_decode_color_cache_parameters;
81702
  switch (coro_susp_point) {
81703
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
81704
81705
    if (self->private_impl.f_n_bits < 1u) {
81706
      {
81707
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
81708
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
81709
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
81710
          goto suspend;
81711
        }
81712
        uint8_t t_0 = *iop_a_src++;
81713
        v_c8 = t_0;
81714
      }
81715
      self->private_impl.f_bits = ((uint32_t)(v_c8));
81716
      self->private_impl.f_n_bits = 8u;
81717
    }
81718
    v_use_color_cache = (self->private_impl.f_bits & 1u);
81719
    self->private_impl.f_bits >>= 1u;
81720
    self->private_impl.f_n_bits -= 1u;
81721
    self->private_impl.f_color_cache_bits = 0u;
81722
    if (v_use_color_cache != 0u) {
81723
      if (self->private_impl.f_n_bits < 4u) {
81724
        {
81725
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
81726
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
81727
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
81728
            goto suspend;
81729
          }
81730
          uint8_t t_1 = *iop_a_src++;
81731
          v_c8 = t_1;
81732
        }
81733
        if (self->private_impl.f_n_bits >= 4u) {
81734
          status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
81735
          goto exit;
81736
        }
81737
        self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
81738
        self->private_impl.f_n_bits += 8u;
81739
      }
81740
      v_color_cache_bits = (self->private_impl.f_bits & 15u);
81741
      self->private_impl.f_bits >>= 4u;
81742
      self->private_impl.f_n_bits -= 4u;
81743
      if ((v_color_cache_bits < 1u) || (11u < v_color_cache_bits)) {
81744
        status = wuffs_base__make_status(wuffs_webp__error__bad_color_cache);
81745
        goto exit;
81746
      }
81747
      self->private_impl.f_color_cache_bits = v_color_cache_bits;
81748
    }
81749
81750
    goto ok;
81751
    ok:
81752
    self->private_impl.p_decode_color_cache_parameters = 0;
81753
    goto exit;
81754
  }
81755
81756
  goto suspend;
81757
  suspend:
81758
  self->private_impl.p_decode_color_cache_parameters = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
81759
81760
  goto exit;
81761
  exit:
81762
  if (a_src && a_src->data.ptr) {
81763
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
81764
  }
81765
81766
  return status;
81767
}
81768
81769
// -------- func webp.decoder.decode_hg_table
81770
81771
WUFFS_BASE__GENERATED_C_CODE
81772
static wuffs_base__status
81773
wuffs_webp__decoder__decode_hg_table(
81774
    wuffs_webp__decoder* self,
81775
    wuffs_base__io_buffer* a_src,
81776
    uint32_t a_width,
81777
    wuffs_base__slice_u8 a_workbuf) {
81778
  wuffs_base__status status = wuffs_base__make_status(NULL);
81779
81780
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
81781
  uint8_t v_c8 = 0;
81782
  uint32_t v_use_hg_table = 0;
81783
  uint32_t v_tile_size_log2 = 0;
81784
  wuffs_base__slice_u8 v_hg_pixels = {0};
81785
  uint64_t v_n = 0;
81786
  wuffs_base__slice_u8 v_p = {0};
81787
  uint32_t v_hg_plus_1 = 0;
81788
81789
  const uint8_t* iop_a_src = NULL;
81790
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
81791
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
81792
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
81793
  if (a_src && a_src->data.ptr) {
81794
    io0_a_src = a_src->data.ptr;
81795
    io1_a_src = io0_a_src + a_src->meta.ri;
81796
    iop_a_src = io1_a_src;
81797
    io2_a_src = io0_a_src + a_src->meta.wi;
81798
  }
81799
81800
  uint32_t coro_susp_point = self->private_impl.p_decode_hg_table;
81801
  if (coro_susp_point) {
81802
    v_tile_size_log2 = self->private_data.s_decode_hg_table.v_tile_size_log2;
81803
  }
81804
  switch (coro_susp_point) {
81805
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
81806
81807
    if (self->private_impl.f_n_bits < 1u) {
81808
      {
81809
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
81810
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
81811
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
81812
          goto suspend;
81813
        }
81814
        uint8_t t_0 = *iop_a_src++;
81815
        v_c8 = t_0;
81816
      }
81817
      self->private_impl.f_bits = ((uint32_t)(v_c8));
81818
      self->private_impl.f_n_bits = 8u;
81819
    }
81820
    v_use_hg_table = (self->private_impl.f_bits & 1u);
81821
    self->private_impl.f_bits >>= 1u;
81822
    self->private_impl.f_n_bits -= 1u;
81823
    if (v_use_hg_table == 0u) {
81824
      self->private_impl.f_overall_n_huffman_groups = 1u;
81825
      self->private_impl.f_overall_tile_size_log2 = 0u;
81826
      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)))) {
81827
        status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length);
81828
        goto exit;
81829
      }
81830
      v_hg_pixels = wuffs_base__slice_u8__subslice_ij(a_workbuf,
81831
          ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])),
81832
          ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u])));
81833
      if (((uint64_t)(v_hg_pixels.len)) >= 4u) {
81834
        v_hg_pixels.ptr[0u] = 0u;
81835
        v_hg_pixels.ptr[1u] = 0u;
81836
        v_hg_pixels.ptr[2u] = 0u;
81837
        v_hg_pixels.ptr[3u] = 0u;
81838
      }
81839
      status = wuffs_base__make_status(NULL);
81840
      goto ok;
81841
    }
81842
    if (self->private_impl.f_n_bits < 3u) {
81843
      {
81844
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
81845
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
81846
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
81847
          goto suspend;
81848
        }
81849
        uint8_t t_1 = *iop_a_src++;
81850
        v_c8 = t_1;
81851
      }
81852
      if (self->private_impl.f_n_bits >= 3u) {
81853
        status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
81854
        goto exit;
81855
      }
81856
      self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
81857
      self->private_impl.f_n_bits += 8u;
81858
    }
81859
    v_tile_size_log2 = ((self->private_impl.f_bits & 7u) + 2u);
81860
    self->private_impl.f_bits >>= 3u;
81861
    self->private_impl.f_n_bits -= 3u;
81862
    self->private_impl.f_overall_tile_size_log2 = v_tile_size_log2;
81863
    if (a_src) {
81864
      a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
81865
    }
81866
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
81867
    status = wuffs_webp__decoder__decode_color_cache_parameters(self, a_src);
81868
    if (a_src) {
81869
      iop_a_src = a_src->data.ptr + a_src->meta.ri;
81870
    }
81871
    if (status.repr) {
81872
      goto suspend;
81873
    }
81874
    if (a_src) {
81875
      a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
81876
    }
81877
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
81878
    status = wuffs_webp__decoder__decode_huffman_groups(self, a_src, 1u);
81879
    if (a_src) {
81880
      iop_a_src = a_src->data.ptr + a_src->meta.ri;
81881
    }
81882
    if (status.repr) {
81883
      goto suspend;
81884
    }
81885
    while (true) {
81886
      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)))) {
81887
        status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length);
81888
        goto exit;
81889
      }
81890
      {
81891
        if (a_src) {
81892
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
81893
        }
81894
        wuffs_base__status t_2 = wuffs_webp__decoder__decode_pixels(self,
81895
            wuffs_base__slice_u8__subslice_ij(a_workbuf,
81896
            ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])),
81897
            ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u]))),
81898
            a_src,
81899
            ((a_width + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2),
81900
            ((self->private_impl.f_height + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2),
81901
            wuffs_base__utility__empty_slice_u8(),
81902
            0u);
81903
        v_status = t_2;
81904
        if (a_src) {
81905
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
81906
        }
81907
      }
81908
      if (wuffs_base__status__is_ok(&v_status)) {
81909
        break;
81910
      }
81911
      status = v_status;
81912
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5);
81913
    }
81914
    self->private_impl.f_overall_n_huffman_groups = 1u;
81915
    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)))) {
81916
      status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length);
81917
      goto exit;
81918
    }
81919
    v_hg_pixels = wuffs_base__slice_u8__subslice_ij(a_workbuf,
81920
        ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])),
81921
        ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u])));
81922
    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)));
81923
    if (v_n > ((uint64_t)(v_hg_pixels.len))) {
81924
      status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length);
81925
      goto exit;
81926
    }
81927
    v_p = wuffs_base__slice_u8__subslice_j(v_hg_pixels, v_n);
81928
    while (((uint64_t)(v_p.len)) >= 4u) {
81929
      if (v_p.ptr[2u] != 0u) {
81930
        status = wuffs_base__make_status(wuffs_webp__error__unsupported_number_of_huffman_groups);
81931
        goto exit;
81932
      }
81933
      v_hg_plus_1 = (((uint32_t)(v_p.ptr[1u])) + 1u);
81934
      if (self->private_impl.f_overall_n_huffman_groups < v_hg_plus_1) {
81935
        self->private_impl.f_overall_n_huffman_groups = v_hg_plus_1;
81936
      }
81937
      v_p = wuffs_base__slice_u8__subslice_i(v_p, 4u);
81938
    }
81939
81940
    ok:
81941
    self->private_impl.p_decode_hg_table = 0;
81942
    goto exit;
81943
  }
81944
81945
  goto suspend;
81946
  suspend:
81947
  self->private_impl.p_decode_hg_table = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
81948
  self->private_data.s_decode_hg_table.v_tile_size_log2 = v_tile_size_log2;
81949
81950
  goto exit;
81951
  exit:
81952
  if (a_src && a_src->data.ptr) {
81953
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
81954
  }
81955
81956
  return status;
81957
}
81958
81959
// -------- func webp.decoder.decode_pixels
81960
81961
WUFFS_BASE__GENERATED_C_CODE
81962
static wuffs_base__status
81963
wuffs_webp__decoder__decode_pixels(
81964
    wuffs_webp__decoder* self,
81965
    wuffs_base__slice_u8 a_dst,
81966
    wuffs_base__io_buffer* a_src,
81967
    uint32_t a_width,
81968
    uint32_t a_height,
81969
    wuffs_base__slice_u8 a_tile_data,
81970
    uint32_t a_tile_size_log2) {
81971
  wuffs_base__status status = wuffs_base__make_status(NULL);
81972
81973
  uint32_t v_i = 0;
81974
  uint32_t v_n = 0;
81975
81976
  uint32_t coro_susp_point = self->private_impl.p_decode_pixels;
81977
  switch (coro_susp_point) {
81978
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
81979
81980
    v_i = 0u;
81981
    v_n = (((uint32_t)(1u)) << self->private_impl.f_color_cache_bits);
81982
    while (v_i < v_n) {
81983
      self->private_data.f_color_cache[v_i] = 0u;
81984
      v_i += 1u;
81985
    }
81986
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
81987
    status = wuffs_webp__decoder__decode_pixels_slow(self,
81988
        a_dst,
81989
        a_src,
81990
        a_width,
81991
        a_height,
81992
        a_tile_data,
81993
        a_tile_size_log2);
81994
    if (status.repr) {
81995
      goto suspend;
81996
    }
81997
81998
    goto ok;
81999
    ok:
82000
    self->private_impl.p_decode_pixels = 0;
82001
    goto exit;
82002
  }
82003
82004
  goto suspend;
82005
  suspend:
82006
  self->private_impl.p_decode_pixels = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
82007
82008
  goto exit;
82009
  exit:
82010
  return status;
82011
}
82012
82013
// -------- func webp.decoder.swizzle
82014
82015
WUFFS_BASE__GENERATED_C_CODE
82016
static wuffs_base__status
82017
wuffs_webp__decoder__swizzle(
82018
    wuffs_webp__decoder* self,
82019
    wuffs_base__pixel_buffer* a_dst,
82020
    wuffs_base__slice_u8 a_src,
82021
    wuffs_base__pixel_blend a_blend) {
82022
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
82023
  wuffs_base__pixel_format v_dst_pixfmt = {0};
82024
  uint32_t v_dst_bits_per_pixel = 0;
82025
  uint32_t v_dst_bytes_per_pixel = 0;
82026
  uint64_t v_dst_bytes_per_row = 0;
82027
  wuffs_base__slice_u8 v_dst_palette = {0};
82028
  wuffs_base__table_u8 v_tab = {0};
82029
  uint64_t v_src_bytes_per_row = 0;
82030
  wuffs_base__slice_u8 v_dst = {0};
82031
  uint32_t v_y = 0;
82032
82033
  v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler,
82034
      wuffs_base__pixel_buffer__pixel_format(a_dst),
82035
      wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_palette, 1024)),
82036
      wuffs_base__utility__make_pixel_format(self->private_impl.f_pixfmt),
82037
      wuffs_base__utility__empty_slice_u8(),
82038
      a_blend);
82039
  if ( ! wuffs_base__status__is_ok(&v_status)) {
82040
    return wuffs_private_impl__status__ensure_not_a_suspension(v_status);
82041
  }
82042
  v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
82043
  v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
82044
  if ((v_dst_bits_per_pixel & 7u) != 0u) {
82045
    return wuffs_base__make_status(wuffs_base__error__unsupported_option);
82046
  }
82047
  v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u);
82048
  v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel)));
82049
  v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_palette, 1024));
82050
  v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
82051
  v_src_bytes_per_row = ((uint64_t)((self->private_impl.f_width * 4u)));
82052
  while (v_src_bytes_per_row <= ((uint64_t)(a_src.len))) {
82053
    v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_y);
82054
    if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) {
82055
      v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row);
82056
    }
82057
    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));
82058
    a_src = wuffs_base__slice_u8__subslice_i(a_src, v_src_bytes_per_row);
82059
    v_y += 1u;
82060
  }
82061
  return wuffs_base__make_status(NULL);
82062
}
82063
82064
// -------- func webp.decoder.frame_dirty_rect
82065
82066
WUFFS_BASE__GENERATED_C_CODE
82067
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
82068
wuffs_webp__decoder__frame_dirty_rect(
82069
    const wuffs_webp__decoder* self) {
82070
  if (!self) {
82071
    return wuffs_base__utility__empty_rect_ie_u32();
82072
  }
82073
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
82074
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
82075
    return wuffs_base__utility__empty_rect_ie_u32();
82076
  }
82077
82078
  if (self->private_impl.f_is_vp8_lossy) {
82079
    return wuffs_vp8__decoder__frame_dirty_rect(&self->private_data.f_vp8);
82080
  }
82081
  return wuffs_base__utility__make_rect_ie_u32(
82082
      0u,
82083
      0u,
82084
      self->private_impl.f_width,
82085
      self->private_impl.f_height);
82086
}
82087
82088
// -------- func webp.decoder.num_animation_loops
82089
82090
WUFFS_BASE__GENERATED_C_CODE
82091
WUFFS_BASE__MAYBE_STATIC uint32_t
82092
wuffs_webp__decoder__num_animation_loops(
82093
    const wuffs_webp__decoder* self) {
82094
  if (!self) {
82095
    return 0;
82096
  }
82097
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
82098
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
82099
    return 0;
82100
  }
82101
82102
  return 0u;
82103
}
82104
82105
// -------- func webp.decoder.num_decoded_frame_configs
82106
82107
WUFFS_BASE__GENERATED_C_CODE
82108
WUFFS_BASE__MAYBE_STATIC uint64_t
82109
wuffs_webp__decoder__num_decoded_frame_configs(
82110
    const wuffs_webp__decoder* self) {
82111
  if (!self) {
82112
    return 0;
82113
  }
82114
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
82115
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
82116
    return 0;
82117
  }
82118
82119
  if (self->private_impl.f_is_vp8_lossy) {
82120
    return wuffs_vp8__decoder__num_decoded_frame_configs(&self->private_data.f_vp8);
82121
  }
82122
  if (self->private_impl.f_call_sequence > 32u) {
82123
    return 1u;
82124
  }
82125
  return 0u;
82126
}
82127
82128
// -------- func webp.decoder.num_decoded_frames
82129
82130
WUFFS_BASE__GENERATED_C_CODE
82131
WUFFS_BASE__MAYBE_STATIC uint64_t
82132
wuffs_webp__decoder__num_decoded_frames(
82133
    const wuffs_webp__decoder* self) {
82134
  if (!self) {
82135
    return 0;
82136
  }
82137
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
82138
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
82139
    return 0;
82140
  }
82141
82142
  if (self->private_impl.f_is_vp8_lossy) {
82143
    return wuffs_vp8__decoder__num_decoded_frames(&self->private_data.f_vp8);
82144
  }
82145
  if (self->private_impl.f_call_sequence > 64u) {
82146
    return 1u;
82147
  }
82148
  return 0u;
82149
}
82150
82151
// -------- func webp.decoder.restart_frame
82152
82153
WUFFS_BASE__GENERATED_C_CODE
82154
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
82155
wuffs_webp__decoder__restart_frame(
82156
    wuffs_webp__decoder* self,
82157
    uint64_t a_index,
82158
    uint64_t a_io_position) {
82159
  if (!self) {
82160
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
82161
  }
82162
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
82163
    return wuffs_base__make_status(
82164
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
82165
        ? wuffs_base__error__disabled_by_previous_error
82166
        : wuffs_base__error__initialize_not_called);
82167
  }
82168
82169
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
82170
82171
  if (self->private_impl.f_is_vp8_lossy) {
82172
    v_status = wuffs_vp8__decoder__restart_frame(&self->private_data.f_vp8, a_index, a_io_position);
82173
    return wuffs_private_impl__status__ensure_not_a_suspension(v_status);
82174
  }
82175
  if (self->private_impl.f_call_sequence < 32u) {
82176
    return wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
82177
  }
82178
  if ((a_index != 0u) || (a_io_position != self->private_impl.f_frame_config_io_position)) {
82179
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
82180
  }
82181
  self->private_impl.f_call_sequence = 40u;
82182
  return wuffs_base__make_status(NULL);
82183
}
82184
82185
// -------- func webp.decoder.set_report_metadata
82186
82187
WUFFS_BASE__GENERATED_C_CODE
82188
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
82189
wuffs_webp__decoder__set_report_metadata(
82190
    wuffs_webp__decoder* self,
82191
    uint32_t a_fourcc,
82192
    bool a_report) {
82193
  return wuffs_base__make_empty_struct();
82194
}
82195
82196
// -------- func webp.decoder.tell_me_more
82197
82198
WUFFS_BASE__GENERATED_C_CODE
82199
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
82200
wuffs_webp__decoder__tell_me_more(
82201
    wuffs_webp__decoder* self,
82202
    wuffs_base__io_buffer* a_dst,
82203
    wuffs_base__more_information* a_minfo,
82204
    wuffs_base__io_buffer* a_src) {
82205
  if (!self) {
82206
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
82207
  }
82208
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
82209
    return wuffs_base__make_status(
82210
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
82211
        ? wuffs_base__error__disabled_by_previous_error
82212
        : wuffs_base__error__initialize_not_called);
82213
  }
82214
  if (!a_dst || !a_src) {
82215
    self->private_impl.magic = WUFFS_BASE__DISABLED;
82216
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
82217
  }
82218
  if ((self->private_impl.active_coroutine != 0) &&
82219
      (self->private_impl.active_coroutine != 4)) {
82220
    self->private_impl.magic = WUFFS_BASE__DISABLED;
82221
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
82222
  }
82223
  self->private_impl.active_coroutine = 0;
82224
  wuffs_base__status status = wuffs_base__make_status(NULL);
82225
82226
  status = wuffs_base__make_status(wuffs_base__error__no_more_information);
82227
  goto exit;
82228
82229
  goto ok;
82230
  ok:
82231
  goto exit;
82232
  exit:
82233
  if (wuffs_base__status__is_error(&status)) {
82234
    self->private_impl.magic = WUFFS_BASE__DISABLED;
82235
  }
82236
  return status;
82237
}
82238
82239
// -------- func webp.decoder.workbuf_len
82240
82241
WUFFS_BASE__GENERATED_C_CODE
82242
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
82243
wuffs_webp__decoder__workbuf_len(
82244
    const wuffs_webp__decoder* self) {
82245
  if (!self) {
82246
    return wuffs_base__utility__empty_range_ii_u64();
82247
  }
82248
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
82249
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
82250
    return wuffs_base__utility__empty_range_ii_u64();
82251
  }
82252
82253
  if (self->private_impl.f_is_vp8_lossy) {
82254
    return wuffs_vp8__decoder__workbuf_len(&self->private_data.f_vp8);
82255
  }
82256
  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])));
82257
}
82258
82259
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WEBP)
82260
82261
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH32)
82262
82263
// ---------------- Status Codes Implementations
82264
82265
// ---------------- Private Consts
82266
82267
#define WUFFS_XXHASH32__XXH_PRIME32_1 2654435761u
82268
82269
#define WUFFS_XXHASH32__XXH_PRIME32_2 2246822519u
82270
82271
#define WUFFS_XXHASH32__XXH_PRIME32_3 3266489917u
82272
82273
#define WUFFS_XXHASH32__XXH_PRIME32_4 668265263u
82274
82275
#define WUFFS_XXHASH32__XXH_PRIME32_5 374761393u
82276
82277
#define WUFFS_XXHASH32__INITIAL_V0 606290984u
82278
82279
#define WUFFS_XXHASH32__INITIAL_V1 2246822519u
82280
82281
#define WUFFS_XXHASH32__INITIAL_V2 0u
82282
82283
#define WUFFS_XXHASH32__INITIAL_V3 1640531535u
82284
82285
// ---------------- Private Initializer Prototypes
82286
82287
// ---------------- Private Function Prototypes
82288
82289
WUFFS_BASE__GENERATED_C_CODE
82290
static wuffs_base__empty_struct
82291
wuffs_xxhash32__hasher__up(
82292
    wuffs_xxhash32__hasher* self,
82293
    wuffs_base__slice_u8 a_x);
82294
82295
// ---------------- VTables
82296
82297
const wuffs_base__hasher_u32__func_ptrs
82298
wuffs_xxhash32__hasher__func_ptrs_for__wuffs_base__hasher_u32 = {
82299
  (uint32_t(*)(const void*))(&wuffs_xxhash32__hasher__checksum_u32),
82300
  (uint64_t(*)(const void*,
82301
      uint32_t))(&wuffs_xxhash32__hasher__get_quirk),
82302
  (wuffs_base__status(*)(void*,
82303
      uint32_t,
82304
      uint64_t))(&wuffs_xxhash32__hasher__set_quirk),
82305
  (wuffs_base__empty_struct(*)(void*,
82306
      wuffs_base__slice_u8))(&wuffs_xxhash32__hasher__update),
82307
  (uint32_t(*)(void*,
82308
      wuffs_base__slice_u8))(&wuffs_xxhash32__hasher__update_u32),
82309
};
82310
82311
// ---------------- Initializer Implementations
82312
82313
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
82314
wuffs_xxhash32__hasher__initialize(
82315
    wuffs_xxhash32__hasher* self,
82316
    size_t sizeof_star_self,
82317
    uint64_t wuffs_version,
82318
    uint32_t options){
82319
  if (!self) {
82320
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
82321
  }
82322
  if (sizeof(*self) != sizeof_star_self) {
82323
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
82324
  }
82325
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
82326
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
82327
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
82328
  }
82329
82330
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
82331
    // The whole point of this if-check is to detect an uninitialized *self.
82332
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
82333
#if !defined(__clang__) && defined(__GNUC__)
82334
#pragma GCC diagnostic push
82335
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
82336
#endif
82337
    if (self->private_impl.magic != 0) {
82338
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
82339
    }
82340
#if !defined(__clang__) && defined(__GNUC__)
82341
#pragma GCC diagnostic pop
82342
#endif
82343
  } else {
82344
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
82345
      memset(self, 0, sizeof(*self));
82346
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
82347
    } else {
82348
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
82349
    }
82350
  }
82351
82352
  self->private_impl.magic = WUFFS_BASE__MAGIC;
82353
  self->private_impl.vtable_for__wuffs_base__hasher_u32.vtable_name =
82354
      wuffs_base__hasher_u32__vtable_name;
82355
  self->private_impl.vtable_for__wuffs_base__hasher_u32.function_pointers =
82356
      (const void*)(&wuffs_xxhash32__hasher__func_ptrs_for__wuffs_base__hasher_u32);
82357
  return wuffs_base__make_status(NULL);
82358
}
82359
82360
wuffs_xxhash32__hasher*
82361
wuffs_xxhash32__hasher__alloc(void) {
82362
  wuffs_xxhash32__hasher* x =
82363
      (wuffs_xxhash32__hasher*)(calloc(1, sizeof(wuffs_xxhash32__hasher)));
82364
  if (!x) {
82365
    return NULL;
82366
  }
82367
  if (wuffs_xxhash32__hasher__initialize(
82368
      x, sizeof(wuffs_xxhash32__hasher), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
82369
    free(x);
82370
    return NULL;
82371
  }
82372
  return x;
82373
}
82374
82375
size_t
82376
sizeof__wuffs_xxhash32__hasher(void) {
82377
  return sizeof(wuffs_xxhash32__hasher);
82378
}
82379
82380
// ---------------- Function Implementations
82381
82382
// -------- func xxhash32.hasher.get_quirk
82383
82384
WUFFS_BASE__GENERATED_C_CODE
82385
WUFFS_BASE__MAYBE_STATIC uint64_t
82386
wuffs_xxhash32__hasher__get_quirk(
82387
    const wuffs_xxhash32__hasher* self,
82388
    uint32_t a_key) {
82389
  if (!self) {
82390
    return 0;
82391
  }
82392
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
82393
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
82394
    return 0;
82395
  }
82396
82397
  return 0u;
82398
}
82399
82400
// -------- func xxhash32.hasher.set_quirk
82401
82402
WUFFS_BASE__GENERATED_C_CODE
82403
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
82404
wuffs_xxhash32__hasher__set_quirk(
82405
    wuffs_xxhash32__hasher* self,
82406
    uint32_t a_key,
82407
    uint64_t a_value) {
82408
  if (!self) {
82409
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
82410
  }
82411
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
82412
    return wuffs_base__make_status(
82413
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
82414
        ? wuffs_base__error__disabled_by_previous_error
82415
        : wuffs_base__error__initialize_not_called);
82416
  }
82417
82418
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
82419
}
82420
82421
// -------- func xxhash32.hasher.update
82422
82423
WUFFS_BASE__GENERATED_C_CODE
82424
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
82425
wuffs_xxhash32__hasher__update(
82426
    wuffs_xxhash32__hasher* self,
82427
    wuffs_base__slice_u8 a_x) {
82428
  if (!self) {
82429
    return wuffs_base__make_empty_struct();
82430
  }
82431
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
82432
    return wuffs_base__make_empty_struct();
82433
  }
82434
82435
  wuffs_base__slice_u8 v_remaining = {0};
82436
82437
  if ((self->private_impl.f_length_modulo_u32 == 0u) &&  ! self->private_impl.f_length_overflows_u32) {
82438
    self->private_impl.f_v0 = 606290984u;
82439
    self->private_impl.f_v1 = 2246822519u;
82440
    self->private_impl.f_v2 = 0u;
82441
    self->private_impl.f_v3 = 1640531535u;
82442
  }
82443
  while (((uint64_t)(a_x.len)) > 0u) {
82444
    v_remaining = wuffs_base__slice_u8__subslice_j(a_x, 0u);
82445
    if (((uint64_t)(a_x.len)) > 16777216u) {
82446
      v_remaining = wuffs_base__slice_u8__subslice_i(a_x, 16777216u);
82447
      a_x = wuffs_base__slice_u8__subslice_j(a_x, 16777216u);
82448
    }
82449
    wuffs_xxhash32__hasher__up(self, a_x);
82450
    a_x = v_remaining;
82451
  }
82452
  return wuffs_base__make_empty_struct();
82453
}
82454
82455
// -------- func xxhash32.hasher.update_u32
82456
82457
WUFFS_BASE__GENERATED_C_CODE
82458
WUFFS_BASE__MAYBE_STATIC uint32_t
82459
wuffs_xxhash32__hasher__update_u32(
82460
    wuffs_xxhash32__hasher* self,
82461
    wuffs_base__slice_u8 a_x) {
82462
  if (!self) {
82463
    return 0;
82464
  }
82465
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
82466
    return 0;
82467
  }
82468
82469
  wuffs_xxhash32__hasher__update(self, a_x);
82470
  return wuffs_xxhash32__hasher__checksum_u32(self);
82471
}
82472
82473
// -------- func xxhash32.hasher.up
82474
82475
WUFFS_BASE__GENERATED_C_CODE
82476
static wuffs_base__empty_struct
82477
wuffs_xxhash32__hasher__up(
82478
    wuffs_xxhash32__hasher* self,
82479
    wuffs_base__slice_u8 a_x) {
82480
  uint32_t v_new_lmu = 0;
82481
  uint32_t v_buf_u32 = 0;
82482
  uint32_t v_buf_len = 0;
82483
  uint32_t v_v0 = 0;
82484
  uint32_t v_v1 = 0;
82485
  uint32_t v_v2 = 0;
82486
  uint32_t v_v3 = 0;
82487
  wuffs_base__slice_u8 v_p = {0};
82488
82489
  v_new_lmu = ((uint32_t)(self->private_impl.f_length_modulo_u32 + ((uint32_t)(((uint64_t)(a_x.len))))));
82490
  self->private_impl.f_length_overflows_u32 = ((v_new_lmu < self->private_impl.f_length_modulo_u32) || self->private_impl.f_length_overflows_u32);
82491
  self->private_impl.f_length_modulo_u32 = v_new_lmu;
82492
  while (true) {
82493
    if (self->private_impl.f_buf_len >= 16u) {
82494
      v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[0u])) |
82495
          (((uint32_t)(self->private_impl.f_buf_data[1u])) << 8u) |
82496
          (((uint32_t)(self->private_impl.f_buf_data[2u])) << 16u) |
82497
          (((uint32_t)(self->private_impl.f_buf_data[3u])) << 24u));
82498
      v_v0 = ((uint32_t)(self->private_impl.f_v0 + ((uint32_t)(v_buf_u32 * 2246822519u))));
82499
      v_v0 = (((uint32_t)(v_v0 << 13u)) | (v_v0 >> 19u));
82500
      self->private_impl.f_v0 = ((uint32_t)(v_v0 * 2654435761u));
82501
      v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[4u])) |
82502
          (((uint32_t)(self->private_impl.f_buf_data[5u])) << 8u) |
82503
          (((uint32_t)(self->private_impl.f_buf_data[6u])) << 16u) |
82504
          (((uint32_t)(self->private_impl.f_buf_data[7u])) << 24u));
82505
      v_v1 = ((uint32_t)(self->private_impl.f_v1 + ((uint32_t)(v_buf_u32 * 2246822519u))));
82506
      v_v1 = (((uint32_t)(v_v1 << 13u)) | (v_v1 >> 19u));
82507
      self->private_impl.f_v1 = ((uint32_t)(v_v1 * 2654435761u));
82508
      v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[8u])) |
82509
          (((uint32_t)(self->private_impl.f_buf_data[9u])) << 8u) |
82510
          (((uint32_t)(self->private_impl.f_buf_data[10u])) << 16u) |
82511
          (((uint32_t)(self->private_impl.f_buf_data[11u])) << 24u));
82512
      v_v2 = ((uint32_t)(self->private_impl.f_v2 + ((uint32_t)(v_buf_u32 * 2246822519u))));
82513
      v_v2 = (((uint32_t)(v_v2 << 13u)) | (v_v2 >> 19u));
82514
      self->private_impl.f_v2 = ((uint32_t)(v_v2 * 2654435761u));
82515
      v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[12u])) |
82516
          (((uint32_t)(self->private_impl.f_buf_data[13u])) << 8u) |
82517
          (((uint32_t)(self->private_impl.f_buf_data[14u])) << 16u) |
82518
          (((uint32_t)(self->private_impl.f_buf_data[15u])) << 24u));
82519
      v_v3 = ((uint32_t)(self->private_impl.f_v3 + ((uint32_t)(v_buf_u32 * 2246822519u))));
82520
      v_v3 = (((uint32_t)(v_v3 << 13u)) | (v_v3 >> 19u));
82521
      self->private_impl.f_v3 = ((uint32_t)(v_v3 * 2654435761u));
82522
      self->private_impl.f_buf_len = 0u;
82523
      break;
82524
    }
82525
    if (((uint64_t)(a_x.len)) <= 0u) {
82526
      return wuffs_base__make_empty_struct();
82527
    }
82528
    self->private_impl.f_buf_data[self->private_impl.f_buf_len] = a_x.ptr[0u];
82529
#if defined(__GNUC__)
82530
#pragma GCC diagnostic push
82531
#pragma GCC diagnostic ignored "-Wconversion"
82532
#endif
82533
    self->private_impl.f_buf_len += 1u;
82534
#if defined(__GNUC__)
82535
#pragma GCC diagnostic pop
82536
#endif
82537
    a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u);
82538
  }
82539
  v_buf_len = ((uint32_t)(((uint8_t)(self->private_impl.f_buf_len & 15u))));
82540
  v_v0 = self->private_impl.f_v0;
82541
  v_v1 = self->private_impl.f_v1;
82542
  v_v2 = self->private_impl.f_v2;
82543
  v_v3 = self->private_impl.f_v3;
82544
  {
82545
    wuffs_base__slice_u8 i_slice_p = a_x;
82546
    v_p.ptr = i_slice_p.ptr;
82547
    v_p.len = 16;
82548
    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));
82549
    while (v_p.ptr < i_end0_p) {
82550
      v_buf_u32 = (((uint32_t)(v_p.ptr[0u])) |
82551
          (((uint32_t)(v_p.ptr[1u])) << 8u) |
82552
          (((uint32_t)(v_p.ptr[2u])) << 16u) |
82553
          (((uint32_t)(v_p.ptr[3u])) << 24u));
82554
      v_v0 = ((uint32_t)(v_v0 + ((uint32_t)(v_buf_u32 * 2246822519u))));
82555
      v_v0 = (((uint32_t)(v_v0 << 13u)) | (v_v0 >> 19u));
82556
      v_v0 = ((uint32_t)(v_v0 * 2654435761u));
82557
      v_buf_u32 = (((uint32_t)(v_p.ptr[4u])) |
82558
          (((uint32_t)(v_p.ptr[5u])) << 8u) |
82559
          (((uint32_t)(v_p.ptr[6u])) << 16u) |
82560
          (((uint32_t)(v_p.ptr[7u])) << 24u));
82561
      v_v1 = ((uint32_t)(v_v1 + ((uint32_t)(v_buf_u32 * 2246822519u))));
82562
      v_v1 = (((uint32_t)(v_v1 << 13u)) | (v_v1 >> 19u));
82563
      v_v1 = ((uint32_t)(v_v1 * 2654435761u));
82564
      v_buf_u32 = (((uint32_t)(v_p.ptr[8u])) |
82565
          (((uint32_t)(v_p.ptr[9u])) << 8u) |
82566
          (((uint32_t)(v_p.ptr[10u])) << 16u) |
82567
          (((uint32_t)(v_p.ptr[11u])) << 24u));
82568
      v_v2 = ((uint32_t)(v_v2 + ((uint32_t)(v_buf_u32 * 2246822519u))));
82569
      v_v2 = (((uint32_t)(v_v2 << 13u)) | (v_v2 >> 19u));
82570
      v_v2 = ((uint32_t)(v_v2 * 2654435761u));
82571
      v_buf_u32 = (((uint32_t)(v_p.ptr[12u])) |
82572
          (((uint32_t)(v_p.ptr[13u])) << 8u) |
82573
          (((uint32_t)(v_p.ptr[14u])) << 16u) |
82574
          (((uint32_t)(v_p.ptr[15u])) << 24u));
82575
      v_v3 = ((uint32_t)(v_v3 + ((uint32_t)(v_buf_u32 * 2246822519u))));
82576
      v_v3 = (((uint32_t)(v_v3 << 13u)) | (v_v3 >> 19u));
82577
      v_v3 = ((uint32_t)(v_v3 * 2654435761u));
82578
      v_p.ptr += 16;
82579
    }
82580
    v_p.len = 1;
82581
    const uint8_t* i_end1_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len);
82582
    while (v_p.ptr < i_end1_p) {
82583
      self->private_impl.f_buf_data[v_buf_len] = v_p.ptr[0u];
82584
      v_buf_len = ((v_buf_len + 1u) & 15u);
82585
      v_p.ptr += 1;
82586
    }
82587
    v_p.len = 0;
82588
  }
82589
  self->private_impl.f_buf_len = ((uint8_t)(v_buf_len));
82590
  self->private_impl.f_v0 = v_v0;
82591
  self->private_impl.f_v1 = v_v1;
82592
  self->private_impl.f_v2 = v_v2;
82593
  self->private_impl.f_v3 = v_v3;
82594
  return wuffs_base__make_empty_struct();
82595
}
82596
82597
// -------- func xxhash32.hasher.checksum_u32
82598
82599
WUFFS_BASE__GENERATED_C_CODE
82600
WUFFS_BASE__MAYBE_STATIC uint32_t
82601
wuffs_xxhash32__hasher__checksum_u32(
82602
    const wuffs_xxhash32__hasher* self) {
82603
  if (!self) {
82604
    return 0;
82605
  }
82606
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
82607
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
82608
    return 0;
82609
  }
82610
82611
  uint32_t v_ret = 0;
82612
  uint32_t v_i = 0;
82613
  uint32_t v_n = 0;
82614
  uint32_t v_buf_u32 = 0;
82615
82616
  if ((self->private_impl.f_length_modulo_u32 >= 16u) || self->private_impl.f_length_overflows_u32) {
82617
    v_ret += (((uint32_t)(self->private_impl.f_v0 << 1u)) | (self->private_impl.f_v0 >> 31u));
82618
    v_ret += (((uint32_t)(self->private_impl.f_v1 << 7u)) | (self->private_impl.f_v1 >> 25u));
82619
    v_ret += (((uint32_t)(self->private_impl.f_v2 << 12u)) | (self->private_impl.f_v2 >> 20u));
82620
    v_ret += (((uint32_t)(self->private_impl.f_v3 << 18u)) | (self->private_impl.f_v3 >> 14u));
82621
    v_ret += self->private_impl.f_length_modulo_u32;
82622
  } else {
82623
    v_ret += 374761393u;
82624
    v_ret += self->private_impl.f_length_modulo_u32;
82625
  }
82626
  v_n = 16u;
82627
  v_n = wuffs_base__u32__min(v_n, ((uint32_t)(self->private_impl.f_buf_len)));
82628
  if (4u <= v_n) {
82629
    v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[0u])) |
82630
        (((uint32_t)(self->private_impl.f_buf_data[1u])) << 8u) |
82631
        (((uint32_t)(self->private_impl.f_buf_data[2u])) << 16u) |
82632
        (((uint32_t)(self->private_impl.f_buf_data[3u])) << 24u));
82633
    v_ret += ((uint32_t)(v_buf_u32 * 3266489917u));
82634
    v_ret = (((uint32_t)(v_ret << 17u)) | (v_ret >> 15u));
82635
    v_ret *= 668265263u;
82636
    v_i = 4u;
82637
  }
82638
  if (8u <= v_n) {
82639
    v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[4u])) |
82640
        (((uint32_t)(self->private_impl.f_buf_data[5u])) << 8u) |
82641
        (((uint32_t)(self->private_impl.f_buf_data[6u])) << 16u) |
82642
        (((uint32_t)(self->private_impl.f_buf_data[7u])) << 24u));
82643
    v_ret += ((uint32_t)(v_buf_u32 * 3266489917u));
82644
    v_ret = (((uint32_t)(v_ret << 17u)) | (v_ret >> 15u));
82645
    v_ret *= 668265263u;
82646
    v_i = 8u;
82647
  }
82648
  if (12u <= v_n) {
82649
    v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[8u])) |
82650
        (((uint32_t)(self->private_impl.f_buf_data[9u])) << 8u) |
82651
        (((uint32_t)(self->private_impl.f_buf_data[10u])) << 16u) |
82652
        (((uint32_t)(self->private_impl.f_buf_data[11u])) << 24u));
82653
    v_ret += ((uint32_t)(v_buf_u32 * 3266489917u));
82654
    v_ret = (((uint32_t)(v_ret << 17u)) | (v_ret >> 15u));
82655
    v_ret *= 668265263u;
82656
    v_i = 12u;
82657
  }
82658
  while (v_i < v_n) {
82659
    v_ret += ((uint32_t)(((uint32_t)(self->private_impl.f_buf_data[v_i])) * 374761393u));
82660
    v_ret = (((uint32_t)(v_ret << 11u)) | (v_ret >> 21u));
82661
    v_ret *= 2654435761u;
82662
    v_i += 1u;
82663
  }
82664
  v_ret ^= (v_ret >> 15u);
82665
  v_ret *= 2246822519u;
82666
  v_ret ^= (v_ret >> 13u);
82667
  v_ret *= 3266489917u;
82668
  v_ret ^= (v_ret >> 16u);
82669
  return v_ret;
82670
}
82671
82672
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH32)
82673
82674
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH64)
82675
82676
// ---------------- Status Codes Implementations
82677
82678
// ---------------- Private Consts
82679
82680
#define WUFFS_XXHASH64__XXH_PRIME64_1 11400714785074694791u
82681
82682
#define WUFFS_XXHASH64__XXH_PRIME64_2 14029467366897019727u
82683
82684
#define WUFFS_XXHASH64__XXH_PRIME64_3 1609587929392839161u
82685
82686
#define WUFFS_XXHASH64__XXH_PRIME64_4 9650029242287828579u
82687
82688
#define WUFFS_XXHASH64__XXH_PRIME64_5 2870177450012600261u
82689
82690
#define WUFFS_XXHASH64__INITIAL_V0 6983438078262162902u
82691
82692
#define WUFFS_XXHASH64__INITIAL_V1 14029467366897019727u
82693
82694
#define WUFFS_XXHASH64__INITIAL_V2 0u
82695
82696
#define WUFFS_XXHASH64__INITIAL_V3 7046029288634856825u
82697
82698
// ---------------- Private Initializer Prototypes
82699
82700
// ---------------- Private Function Prototypes
82701
82702
WUFFS_BASE__GENERATED_C_CODE
82703
static wuffs_base__empty_struct
82704
wuffs_xxhash64__hasher__up(
82705
    wuffs_xxhash64__hasher* self,
82706
    wuffs_base__slice_u8 a_x);
82707
82708
// ---------------- VTables
82709
82710
const wuffs_base__hasher_u64__func_ptrs
82711
wuffs_xxhash64__hasher__func_ptrs_for__wuffs_base__hasher_u64 = {
82712
  (uint64_t(*)(const void*))(&wuffs_xxhash64__hasher__checksum_u64),
82713
  (uint64_t(*)(const void*,
82714
      uint32_t))(&wuffs_xxhash64__hasher__get_quirk),
82715
  (wuffs_base__status(*)(void*,
82716
      uint32_t,
82717
      uint64_t))(&wuffs_xxhash64__hasher__set_quirk),
82718
  (wuffs_base__empty_struct(*)(void*,
82719
      wuffs_base__slice_u8))(&wuffs_xxhash64__hasher__update),
82720
  (uint64_t(*)(void*,
82721
      wuffs_base__slice_u8))(&wuffs_xxhash64__hasher__update_u64),
82722
};
82723
82724
// ---------------- Initializer Implementations
82725
82726
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
82727
wuffs_xxhash64__hasher__initialize(
82728
    wuffs_xxhash64__hasher* self,
82729
    size_t sizeof_star_self,
82730
    uint64_t wuffs_version,
82731
    uint32_t options){
82732
  if (!self) {
82733
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
82734
  }
82735
  if (sizeof(*self) != sizeof_star_self) {
82736
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
82737
  }
82738
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
82739
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
82740
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
82741
  }
82742
82743
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
82744
    // The whole point of this if-check is to detect an uninitialized *self.
82745
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
82746
#if !defined(__clang__) && defined(__GNUC__)
82747
#pragma GCC diagnostic push
82748
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
82749
#endif
82750
    if (self->private_impl.magic != 0) {
82751
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
82752
    }
82753
#if !defined(__clang__) && defined(__GNUC__)
82754
#pragma GCC diagnostic pop
82755
#endif
82756
  } else {
82757
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
82758
      memset(self, 0, sizeof(*self));
82759
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
82760
    } else {
82761
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
82762
    }
82763
  }
82764
82765
  self->private_impl.magic = WUFFS_BASE__MAGIC;
82766
  self->private_impl.vtable_for__wuffs_base__hasher_u64.vtable_name =
82767
      wuffs_base__hasher_u64__vtable_name;
82768
  self->private_impl.vtable_for__wuffs_base__hasher_u64.function_pointers =
82769
      (const void*)(&wuffs_xxhash64__hasher__func_ptrs_for__wuffs_base__hasher_u64);
82770
  return wuffs_base__make_status(NULL);
82771
}
82772
82773
wuffs_xxhash64__hasher*
82774
wuffs_xxhash64__hasher__alloc(void) {
82775
  wuffs_xxhash64__hasher* x =
82776
      (wuffs_xxhash64__hasher*)(calloc(1, sizeof(wuffs_xxhash64__hasher)));
82777
  if (!x) {
82778
    return NULL;
82779
  }
82780
  if (wuffs_xxhash64__hasher__initialize(
82781
      x, sizeof(wuffs_xxhash64__hasher), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
82782
    free(x);
82783
    return NULL;
82784
  }
82785
  return x;
82786
}
82787
82788
size_t
82789
sizeof__wuffs_xxhash64__hasher(void) {
82790
  return sizeof(wuffs_xxhash64__hasher);
82791
}
82792
82793
// ---------------- Function Implementations
82794
82795
// -------- func xxhash64.hasher.get_quirk
82796
82797
WUFFS_BASE__GENERATED_C_CODE
82798
WUFFS_BASE__MAYBE_STATIC uint64_t
82799
wuffs_xxhash64__hasher__get_quirk(
82800
    const wuffs_xxhash64__hasher* self,
82801
    uint32_t a_key) {
82802
  if (!self) {
82803
    return 0;
82804
  }
82805
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
82806
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
82807
    return 0;
82808
  }
82809
82810
  return 0u;
82811
}
82812
82813
// -------- func xxhash64.hasher.set_quirk
82814
82815
WUFFS_BASE__GENERATED_C_CODE
82816
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
82817
wuffs_xxhash64__hasher__set_quirk(
82818
    wuffs_xxhash64__hasher* self,
82819
    uint32_t a_key,
82820
    uint64_t a_value) {
82821
  if (!self) {
82822
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
82823
  }
82824
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
82825
    return wuffs_base__make_status(
82826
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
82827
        ? wuffs_base__error__disabled_by_previous_error
82828
        : wuffs_base__error__initialize_not_called);
82829
  }
82830
82831
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
82832
}
82833
82834
// -------- func xxhash64.hasher.update
82835
82836
WUFFS_BASE__GENERATED_C_CODE
82837
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
82838
wuffs_xxhash64__hasher__update(
82839
    wuffs_xxhash64__hasher* self,
82840
    wuffs_base__slice_u8 a_x) {
82841
  if (!self) {
82842
    return wuffs_base__make_empty_struct();
82843
  }
82844
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
82845
    return wuffs_base__make_empty_struct();
82846
  }
82847
82848
  if ((self->private_impl.f_length_modulo_u64 == 0u) &&  ! self->private_impl.f_length_overflows_u64) {
82849
    self->private_impl.f_v0 = 6983438078262162902u;
82850
    self->private_impl.f_v1 = 14029467366897019727u;
82851
    self->private_impl.f_v2 = 0u;
82852
    self->private_impl.f_v3 = 7046029288634856825u;
82853
  }
82854
  wuffs_xxhash64__hasher__up(self, a_x);
82855
  return wuffs_base__make_empty_struct();
82856
}
82857
82858
// -------- func xxhash64.hasher.update_u64
82859
82860
WUFFS_BASE__GENERATED_C_CODE
82861
WUFFS_BASE__MAYBE_STATIC uint64_t
82862
wuffs_xxhash64__hasher__update_u64(
82863
    wuffs_xxhash64__hasher* self,
82864
    wuffs_base__slice_u8 a_x) {
82865
  if (!self) {
82866
    return 0;
82867
  }
82868
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
82869
    return 0;
82870
  }
82871
82872
  wuffs_xxhash64__hasher__update(self, a_x);
82873
  return wuffs_xxhash64__hasher__checksum_u64(self);
82874
}
82875
82876
// -------- func xxhash64.hasher.up
82877
82878
WUFFS_BASE__GENERATED_C_CODE
82879
static wuffs_base__empty_struct
82880
wuffs_xxhash64__hasher__up(
82881
    wuffs_xxhash64__hasher* self,
82882
    wuffs_base__slice_u8 a_x) {
82883
  uint64_t v_new_lmu = 0;
82884
  uint64_t v_buf_u64 = 0;
82885
  uint32_t v_buf_len = 0;
82886
  uint64_t v_v0 = 0;
82887
  uint64_t v_v1 = 0;
82888
  uint64_t v_v2 = 0;
82889
  uint64_t v_v3 = 0;
82890
  wuffs_base__slice_u8 v_p = {0};
82891
82892
  v_new_lmu = ((uint64_t)(self->private_impl.f_length_modulo_u64 + ((uint64_t)(a_x.len))));
82893
  self->private_impl.f_length_overflows_u64 = ((v_new_lmu < self->private_impl.f_length_modulo_u64) || self->private_impl.f_length_overflows_u64);
82894
  self->private_impl.f_length_modulo_u64 = v_new_lmu;
82895
  while (true) {
82896
    if (self->private_impl.f_buf_len >= 32u) {
82897
      v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[0u])) |
82898
          (((uint64_t)(self->private_impl.f_buf_data[1u])) << 8u) |
82899
          (((uint64_t)(self->private_impl.f_buf_data[2u])) << 16u) |
82900
          (((uint64_t)(self->private_impl.f_buf_data[3u])) << 24u) |
82901
          (((uint64_t)(self->private_impl.f_buf_data[4u])) << 32u) |
82902
          (((uint64_t)(self->private_impl.f_buf_data[5u])) << 40u) |
82903
          (((uint64_t)(self->private_impl.f_buf_data[6u])) << 48u) |
82904
          (((uint64_t)(self->private_impl.f_buf_data[7u])) << 56u));
82905
      v_v0 = ((uint64_t)(self->private_impl.f_v0 + ((uint64_t)(v_buf_u64 * 14029467366897019727u))));
82906
      v_v0 = (((uint64_t)(v_v0 << 31u)) | (v_v0 >> 33u));
82907
      self->private_impl.f_v0 = ((uint64_t)(v_v0 * 11400714785074694791u));
82908
      v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[8u])) |
82909
          (((uint64_t)(self->private_impl.f_buf_data[9u])) << 8u) |
82910
          (((uint64_t)(self->private_impl.f_buf_data[10u])) << 16u) |
82911
          (((uint64_t)(self->private_impl.f_buf_data[11u])) << 24u) |
82912
          (((uint64_t)(self->private_impl.f_buf_data[12u])) << 32u) |
82913
          (((uint64_t)(self->private_impl.f_buf_data[13u])) << 40u) |
82914
          (((uint64_t)(self->private_impl.f_buf_data[14u])) << 48u) |
82915
          (((uint64_t)(self->private_impl.f_buf_data[15u])) << 56u));
82916
      v_v1 = ((uint64_t)(self->private_impl.f_v1 + ((uint64_t)(v_buf_u64 * 14029467366897019727u))));
82917
      v_v1 = (((uint64_t)(v_v1 << 31u)) | (v_v1 >> 33u));
82918
      self->private_impl.f_v1 = ((uint64_t)(v_v1 * 11400714785074694791u));
82919
      v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[16u])) |
82920
          (((uint64_t)(self->private_impl.f_buf_data[17u])) << 8u) |
82921
          (((uint64_t)(self->private_impl.f_buf_data[18u])) << 16u) |
82922
          (((uint64_t)(self->private_impl.f_buf_data[19u])) << 24u) |
82923
          (((uint64_t)(self->private_impl.f_buf_data[20u])) << 32u) |
82924
          (((uint64_t)(self->private_impl.f_buf_data[21u])) << 40u) |
82925
          (((uint64_t)(self->private_impl.f_buf_data[22u])) << 48u) |
82926
          (((uint64_t)(self->private_impl.f_buf_data[23u])) << 56u));
82927
      v_v2 = ((uint64_t)(self->private_impl.f_v2 + ((uint64_t)(v_buf_u64 * 14029467366897019727u))));
82928
      v_v2 = (((uint64_t)(v_v2 << 31u)) | (v_v2 >> 33u));
82929
      self->private_impl.f_v2 = ((uint64_t)(v_v2 * 11400714785074694791u));
82930
      v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[24u])) |
82931
          (((uint64_t)(self->private_impl.f_buf_data[25u])) << 8u) |
82932
          (((uint64_t)(self->private_impl.f_buf_data[26u])) << 16u) |
82933
          (((uint64_t)(self->private_impl.f_buf_data[27u])) << 24u) |
82934
          (((uint64_t)(self->private_impl.f_buf_data[28u])) << 32u) |
82935
          (((uint64_t)(self->private_impl.f_buf_data[29u])) << 40u) |
82936
          (((uint64_t)(self->private_impl.f_buf_data[30u])) << 48u) |
82937
          (((uint64_t)(self->private_impl.f_buf_data[31u])) << 56u));
82938
      v_v3 = ((uint64_t)(self->private_impl.f_v3 + ((uint64_t)(v_buf_u64 * 14029467366897019727u))));
82939
      v_v3 = (((uint64_t)(v_v3 << 31u)) | (v_v3 >> 33u));
82940
      self->private_impl.f_v3 = ((uint64_t)(v_v3 * 11400714785074694791u));
82941
      self->private_impl.f_buf_len = 0u;
82942
      break;
82943
    }
82944
    if (((uint64_t)(a_x.len)) <= 0u) {
82945
      return wuffs_base__make_empty_struct();
82946
    }
82947
    self->private_impl.f_buf_data[self->private_impl.f_buf_len] = a_x.ptr[0u];
82948
    self->private_impl.f_buf_len += 1u;
82949
    a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u);
82950
  }
82951
  v_buf_len = (self->private_impl.f_buf_len & 31u);
82952
  v_v0 = self->private_impl.f_v0;
82953
  v_v1 = self->private_impl.f_v1;
82954
  v_v2 = self->private_impl.f_v2;
82955
  v_v3 = self->private_impl.f_v3;
82956
  {
82957
    wuffs_base__slice_u8 i_slice_p = a_x;
82958
    v_p.ptr = i_slice_p.ptr;
82959
    v_p.len = 32;
82960
    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));
82961
    while (v_p.ptr < i_end0_p) {
82962
      v_buf_u64 = (((uint64_t)(v_p.ptr[0u])) |
82963
          (((uint64_t)(v_p.ptr[1u])) << 8u) |
82964
          (((uint64_t)(v_p.ptr[2u])) << 16u) |
82965
          (((uint64_t)(v_p.ptr[3u])) << 24u) |
82966
          (((uint64_t)(v_p.ptr[4u])) << 32u) |
82967
          (((uint64_t)(v_p.ptr[5u])) << 40u) |
82968
          (((uint64_t)(v_p.ptr[6u])) << 48u) |
82969
          (((uint64_t)(v_p.ptr[7u])) << 56u));
82970
      v_v0 = ((uint64_t)(v_v0 + ((uint64_t)(v_buf_u64 * 14029467366897019727u))));
82971
      v_v0 = (((uint64_t)(v_v0 << 31u)) | (v_v0 >> 33u));
82972
      v_v0 = ((uint64_t)(v_v0 * 11400714785074694791u));
82973
      v_buf_u64 = (((uint64_t)(v_p.ptr[8u])) |
82974
          (((uint64_t)(v_p.ptr[9u])) << 8u) |
82975
          (((uint64_t)(v_p.ptr[10u])) << 16u) |
82976
          (((uint64_t)(v_p.ptr[11u])) << 24u) |
82977
          (((uint64_t)(v_p.ptr[12u])) << 32u) |
82978
          (((uint64_t)(v_p.ptr[13u])) << 40u) |
82979
          (((uint64_t)(v_p.ptr[14u])) << 48u) |
82980
          (((uint64_t)(v_p.ptr[15u])) << 56u));
82981
      v_v1 = ((uint64_t)(v_v1 + ((uint64_t)(v_buf_u64 * 14029467366897019727u))));
82982
      v_v1 = (((uint64_t)(v_v1 << 31u)) | (v_v1 >> 33u));
82983
      v_v1 = ((uint64_t)(v_v1 * 11400714785074694791u));
82984
      v_buf_u64 = (((uint64_t)(v_p.ptr[16u])) |
82985
          (((uint64_t)(v_p.ptr[17u])) << 8u) |
82986
          (((uint64_t)(v_p.ptr[18u])) << 16u) |
82987
          (((uint64_t)(v_p.ptr[19u])) << 24u) |
82988
          (((uint64_t)(v_p.ptr[20u])) << 32u) |
82989
          (((uint64_t)(v_p.ptr[21u])) << 40u) |
82990
          (((uint64_t)(v_p.ptr[22u])) << 48u) |
82991
          (((uint64_t)(v_p.ptr[23u])) << 56u));
82992
      v_v2 = ((uint64_t)(v_v2 + ((uint64_t)(v_buf_u64 * 14029467366897019727u))));
82993
      v_v2 = (((uint64_t)(v_v2 << 31u)) | (v_v2 >> 33u));
82994
      v_v2 = ((uint64_t)(v_v2 * 11400714785074694791u));
82995
      v_buf_u64 = (((uint64_t)(v_p.ptr[24u])) |
82996
          (((uint64_t)(v_p.ptr[25u])) << 8u) |
82997
          (((uint64_t)(v_p.ptr[26u])) << 16u) |
82998
          (((uint64_t)(v_p.ptr[27u])) << 24u) |
82999
          (((uint64_t)(v_p.ptr[28u])) << 32u) |
83000
          (((uint64_t)(v_p.ptr[29u])) << 40u) |
83001
          (((uint64_t)(v_p.ptr[30u])) << 48u) |
83002
          (((uint64_t)(v_p.ptr[31u])) << 56u));
83003
      v_v3 = ((uint64_t)(v_v3 + ((uint64_t)(v_buf_u64 * 14029467366897019727u))));
83004
      v_v3 = (((uint64_t)(v_v3 << 31u)) | (v_v3 >> 33u));
83005
      v_v3 = ((uint64_t)(v_v3 * 11400714785074694791u));
83006
      v_p.ptr += 32;
83007
    }
83008
    v_p.len = 1;
83009
    const uint8_t* i_end1_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len);
83010
    while (v_p.ptr < i_end1_p) {
83011
      self->private_impl.f_buf_data[v_buf_len] = v_p.ptr[0u];
83012
      v_buf_len = ((v_buf_len + 1u) & 31u);
83013
      v_p.ptr += 1;
83014
    }
83015
    v_p.len = 0;
83016
  }
83017
  self->private_impl.f_buf_len = v_buf_len;
83018
  self->private_impl.f_v0 = v_v0;
83019
  self->private_impl.f_v1 = v_v1;
83020
  self->private_impl.f_v2 = v_v2;
83021
  self->private_impl.f_v3 = v_v3;
83022
  return wuffs_base__make_empty_struct();
83023
}
83024
83025
// -------- func xxhash64.hasher.checksum_u64
83026
83027
WUFFS_BASE__GENERATED_C_CODE
83028
WUFFS_BASE__MAYBE_STATIC uint64_t
83029
wuffs_xxhash64__hasher__checksum_u64(
83030
    const wuffs_xxhash64__hasher* self) {
83031
  if (!self) {
83032
    return 0;
83033
  }
83034
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
83035
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
83036
    return 0;
83037
  }
83038
83039
  uint64_t v_ret = 0;
83040
  uint64_t v_v0 = 0;
83041
  uint64_t v_v1 = 0;
83042
  uint64_t v_v2 = 0;
83043
  uint64_t v_v3 = 0;
83044
  uint32_t v_i = 0;
83045
  uint32_t v_i8 = 0;
83046
  uint32_t v_n = 0;
83047
  uint32_t v_buf_u32 = 0;
83048
  uint64_t v_buf_u64 = 0;
83049
83050
  if ((self->private_impl.f_length_modulo_u64 >= 32u) || self->private_impl.f_length_overflows_u64) {
83051
    v_ret += (((uint64_t)(self->private_impl.f_v0 << 1u)) | (self->private_impl.f_v0 >> 63u));
83052
    v_ret += (((uint64_t)(self->private_impl.f_v1 << 7u)) | (self->private_impl.f_v1 >> 57u));
83053
    v_ret += (((uint64_t)(self->private_impl.f_v2 << 12u)) | (self->private_impl.f_v2 >> 52u));
83054
    v_ret += (((uint64_t)(self->private_impl.f_v3 << 18u)) | (self->private_impl.f_v3 >> 46u));
83055
    v_v0 = ((uint64_t)(self->private_impl.f_v0 * 14029467366897019727u));
83056
    v_v0 = (((uint64_t)(v_v0 << 31u)) | (v_v0 >> 33u));
83057
    v_v0 *= 11400714785074694791u;
83058
    v_v1 = ((uint64_t)(self->private_impl.f_v1 * 14029467366897019727u));
83059
    v_v1 = (((uint64_t)(v_v1 << 31u)) | (v_v1 >> 33u));
83060
    v_v1 *= 11400714785074694791u;
83061
    v_v2 = ((uint64_t)(self->private_impl.f_v2 * 14029467366897019727u));
83062
    v_v2 = (((uint64_t)(v_v2 << 31u)) | (v_v2 >> 33u));
83063
    v_v2 *= 11400714785074694791u;
83064
    v_v3 = ((uint64_t)(self->private_impl.f_v3 * 14029467366897019727u));
83065
    v_v3 = (((uint64_t)(v_v3 << 31u)) | (v_v3 >> 33u));
83066
    v_v3 *= 11400714785074694791u;
83067
    v_ret = ((uint64_t)(((uint64_t)((v_ret ^ v_v0) * 11400714785074694791u)) + 9650029242287828579u));
83068
    v_ret = ((uint64_t)(((uint64_t)((v_ret ^ v_v1) * 11400714785074694791u)) + 9650029242287828579u));
83069
    v_ret = ((uint64_t)(((uint64_t)((v_ret ^ v_v2) * 11400714785074694791u)) + 9650029242287828579u));
83070
    v_ret = ((uint64_t)(((uint64_t)((v_ret ^ v_v3) * 11400714785074694791u)) + 9650029242287828579u));
83071
    v_ret += self->private_impl.f_length_modulo_u64;
83072
  } else {
83073
    v_ret += 2870177450012600261u;
83074
    v_ret += self->private_impl.f_length_modulo_u64;
83075
  }
83076
  v_n = 32u;
83077
  v_n = wuffs_base__u32__min(v_n, self->private_impl.f_buf_len);
83078
  if (8u <= v_n) {
83079
    v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[0u])) |
83080
        (((uint64_t)(self->private_impl.f_buf_data[1u])) << 8u) |
83081
        (((uint64_t)(self->private_impl.f_buf_data[2u])) << 16u) |
83082
        (((uint64_t)(self->private_impl.f_buf_data[3u])) << 24u) |
83083
        (((uint64_t)(self->private_impl.f_buf_data[4u])) << 32u) |
83084
        (((uint64_t)(self->private_impl.f_buf_data[5u])) << 40u) |
83085
        (((uint64_t)(self->private_impl.f_buf_data[6u])) << 48u) |
83086
        (((uint64_t)(self->private_impl.f_buf_data[7u])) << 56u));
83087
    v_buf_u64 *= 14029467366897019727u;
83088
    v_buf_u64 = (((uint64_t)(v_buf_u64 << 31u)) | (v_buf_u64 >> 33u));
83089
    v_buf_u64 *= 11400714785074694791u;
83090
    v_ret ^= v_buf_u64;
83091
    v_ret = (((uint64_t)(v_ret << 27u)) | (v_ret >> 37u));
83092
    v_ret *= 11400714785074694791u;
83093
    v_ret += 9650029242287828579u;
83094
    v_i = 8u;
83095
  }
83096
  if (16u <= v_n) {
83097
    v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[8u])) |
83098
        (((uint64_t)(self->private_impl.f_buf_data[9u])) << 8u) |
83099
        (((uint64_t)(self->private_impl.f_buf_data[10u])) << 16u) |
83100
        (((uint64_t)(self->private_impl.f_buf_data[11u])) << 24u) |
83101
        (((uint64_t)(self->private_impl.f_buf_data[12u])) << 32u) |
83102
        (((uint64_t)(self->private_impl.f_buf_data[13u])) << 40u) |
83103
        (((uint64_t)(self->private_impl.f_buf_data[14u])) << 48u) |
83104
        (((uint64_t)(self->private_impl.f_buf_data[15u])) << 56u));
83105
    v_buf_u64 *= 14029467366897019727u;
83106
    v_buf_u64 = (((uint64_t)(v_buf_u64 << 31u)) | (v_buf_u64 >> 33u));
83107
    v_buf_u64 *= 11400714785074694791u;
83108
    v_ret ^= v_buf_u64;
83109
    v_ret = (((uint64_t)(v_ret << 27u)) | (v_ret >> 37u));
83110
    v_ret *= 11400714785074694791u;
83111
    v_ret += 9650029242287828579u;
83112
    v_i = 16u;
83113
  }
83114
  if (24u <= v_n) {
83115
    v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[16u])) |
83116
        (((uint64_t)(self->private_impl.f_buf_data[17u])) << 8u) |
83117
        (((uint64_t)(self->private_impl.f_buf_data[18u])) << 16u) |
83118
        (((uint64_t)(self->private_impl.f_buf_data[19u])) << 24u) |
83119
        (((uint64_t)(self->private_impl.f_buf_data[20u])) << 32u) |
83120
        (((uint64_t)(self->private_impl.f_buf_data[21u])) << 40u) |
83121
        (((uint64_t)(self->private_impl.f_buf_data[22u])) << 48u) |
83122
        (((uint64_t)(self->private_impl.f_buf_data[23u])) << 56u));
83123
    v_buf_u64 *= 14029467366897019727u;
83124
    v_buf_u64 = (((uint64_t)(v_buf_u64 << 31u)) | (v_buf_u64 >> 33u));
83125
    v_buf_u64 *= 11400714785074694791u;
83126
    v_ret ^= v_buf_u64;
83127
    v_ret = (((uint64_t)(v_ret << 27u)) | (v_ret >> 37u));
83128
    v_ret *= 11400714785074694791u;
83129
    v_ret += 9650029242287828579u;
83130
    v_i = 24u;
83131
  }
83132
  if ((v_n & 4u) != 0u) {
83133
    v_i8 = (v_i & 24u);
83134
    v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[(v_i8 + 0u)])) |
83135
        (((uint32_t)(self->private_impl.f_buf_data[(v_i8 + 1u)])) << 8u) |
83136
        (((uint32_t)(self->private_impl.f_buf_data[(v_i8 + 2u)])) << 16u) |
83137
        (((uint32_t)(self->private_impl.f_buf_data[(v_i8 + 3u)])) << 24u));
83138
    v_ret ^= ((uint64_t)(((uint64_t)(v_buf_u32)) * 11400714785074694791u));
83139
    v_ret = (((uint64_t)(v_ret << 23u)) | (v_ret >> 41u));
83140
    v_ret *= 14029467366897019727u;
83141
    v_ret += 1609587929392839161u;
83142
    v_i = (v_i8 + 4u);
83143
  }
83144
  while (v_i < v_n) {
83145
    v_ret ^= ((uint64_t)(((uint64_t)(self->private_impl.f_buf_data[v_i])) * 2870177450012600261u));
83146
    v_ret = (((uint64_t)(v_ret << 11u)) | (v_ret >> 53u));
83147
    v_ret *= 11400714785074694791u;
83148
    v_i += 1u;
83149
  }
83150
  v_ret ^= (v_ret >> 33u);
83151
  v_ret *= 14029467366897019727u;
83152
  v_ret ^= (v_ret >> 29u);
83153
  v_ret *= 1609587929392839161u;
83154
  v_ret ^= (v_ret >> 32u);
83155
  return ((uint64_t)(v_ret));
83156
}
83157
83158
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH64)
83159
83160
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XZ)
83161
83162
// ---------------- Status Codes Implementations
83163
83164
const char wuffs_xz__error__bad_bcj_offset[] = "#xz: bad BCJ offset";
83165
const char wuffs_xz__error__bad_block_header[] = "#xz: bad block header";
83166
const char wuffs_xz__error__bad_checksum[] = "#xz: bad checksum";
83167
const char wuffs_xz__error__bad_filter[] = "#xz: bad filter";
83168
const char wuffs_xz__error__bad_footer[] = "#xz: bad footer";
83169
const char wuffs_xz__error__bad_header[] = "#xz: bad header";
83170
const char wuffs_xz__error__bad_header_concatenated_stream[] = "#xz: bad header (concatenated stream)";
83171
const char wuffs_xz__error__bad_index[] = "#xz: bad index";
83172
const char wuffs_xz__error__bad_padding[] = "#xz: bad padding";
83173
const char wuffs_xz__error__truncated_input[] = "#xz: truncated input";
83174
const char wuffs_xz__error__unsupported_checksum_algorithm[] = "#xz: unsupported checksum algorithm";
83175
const char wuffs_xz__error__unsupported_filter[] = "#xz: unsupported filter";
83176
const char wuffs_xz__error__unsupported_filter_combination[] = "#xz: unsupported filter combination";
83177
const char wuffs_xz__error__internal_error_inconsistent_bcj_filter_state[] = "#xz: internal error: inconsistent BCJ filter state";
83178
83179
// ---------------- Private Consts
83180
83181
static const bool
83182
WUFFS_XZ__FILTER_04_X86_MASK_TO_ALLOWED_STATUS[8] WUFFS_BASE__POTENTIALLY_UNUSED = {
83183
  1u, 1u, 1u, 0u, 1u, 0u, 0u, 0u,
83184
};
83185
83186
static const uint8_t
83187
WUFFS_XZ__FILTER_04_X86_MASK_TO_BIT_NUM[8] WUFFS_BASE__POTENTIALLY_UNUSED = {
83188
  0u, 1u, 2u, 2u, 3u, 3u, 3u, 3u,
83189
};
83190
83191
static const uint32_t
83192
WUFFS_XZ__FILTER_04_X86_MASK_TO_XOR_OPERAND[8] WUFFS_BASE__POTENTIALLY_UNUSED = {
83193
  4294967295u, 16777215u, 65535u, 65535u, 255u, 255u, 255u, 255u,
83194
};
83195
83196
static const uint8_t
83197
WUFFS_XZ__FILTER_06_IA64_BRANCH_TABLE[32] WUFFS_BASE__POTENTIALLY_UNUSED = {
83198
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
83199
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
83200
  4u, 4u, 6u, 6u, 0u, 0u, 7u, 7u,
83201
  4u, 4u, 0u, 0u, 4u, 4u, 0u, 0u,
83202
};
83203
83204
#define WUFFS_XZ__QUIRKS_BASE 1963655168u
83205
83206
static const uint8_t
83207
WUFFS_XZ__CHECKSUM_LENGTH[4] WUFFS_BASE__POTENTIALLY_UNUSED = {
83208
  0u, 4u, 8u, 32u,
83209
};
83210
83211
static const uint8_t
83212
WUFFS_XZ__ZEROES[3] WUFFS_BASE__POTENTIALLY_UNUSED = {
83213
  0u, 0u, 0u,
83214
};
83215
83216
static const uint8_t
83217
WUFFS_XZ__BCJ_OFFSET_ALIGNMENT[12] WUFFS_BASE__POTENTIALLY_UNUSED = {
83218
  0u, 0u, 0u, 0u, 1u, 4u, 16u, 4u,
83219
  2u, 4u, 4u, 2u,
83220
};
83221
83222
// ---------------- Private Initializer Prototypes
83223
83224
// ---------------- Private Function Prototypes
83225
83226
WUFFS_BASE__GENERATED_C_CODE
83227
static uint8_t
83228
wuffs_xz__decoder__apply_non_final_filters(
83229
    wuffs_xz__decoder* self,
83230
    wuffs_base__slice_u8 a_dst_slice);
83231
83232
WUFFS_BASE__GENERATED_C_CODE
83233
static uint8_t
83234
wuffs_xz__decoder__apply_non_final_filters__choosy_default(
83235
    wuffs_xz__decoder* self,
83236
    wuffs_base__slice_u8 a_dst_slice);
83237
83238
WUFFS_BASE__GENERATED_C_CODE
83239
static uint8_t
83240
wuffs_xz__decoder__apply_filter_04_x86(
83241
    wuffs_xz__decoder* self,
83242
    wuffs_base__slice_u8 a_dst_slice);
83243
83244
WUFFS_BASE__GENERATED_C_CODE
83245
static uint8_t
83246
wuffs_xz__decoder__apply_filter_05_powerpc(
83247
    wuffs_xz__decoder* self,
83248
    wuffs_base__slice_u8 a_dst_slice);
83249
83250
WUFFS_BASE__GENERATED_C_CODE
83251
static uint8_t
83252
wuffs_xz__decoder__apply_filter_06_ia64(
83253
    wuffs_xz__decoder* self,
83254
    wuffs_base__slice_u8 a_dst_slice);
83255
83256
WUFFS_BASE__GENERATED_C_CODE
83257
static uint8_t
83258
wuffs_xz__decoder__apply_filter_07_arm(
83259
    wuffs_xz__decoder* self,
83260
    wuffs_base__slice_u8 a_dst_slice);
83261
83262
WUFFS_BASE__GENERATED_C_CODE
83263
static uint8_t
83264
wuffs_xz__decoder__apply_filter_08_armthumb(
83265
    wuffs_xz__decoder* self,
83266
    wuffs_base__slice_u8 a_dst_slice);
83267
83268
WUFFS_BASE__GENERATED_C_CODE
83269
static uint8_t
83270
wuffs_xz__decoder__apply_filter_09_sparc(
83271
    wuffs_xz__decoder* self,
83272
    wuffs_base__slice_u8 a_dst_slice);
83273
83274
WUFFS_BASE__GENERATED_C_CODE
83275
static uint8_t
83276
wuffs_xz__decoder__apply_filter_0a_arm64(
83277
    wuffs_xz__decoder* self,
83278
    wuffs_base__slice_u8 a_dst_slice);
83279
83280
WUFFS_BASE__GENERATED_C_CODE
83281
static uint8_t
83282
wuffs_xz__decoder__apply_filter_0b_riscv(
83283
    wuffs_xz__decoder* self,
83284
    wuffs_base__slice_u8 a_dst_slice);
83285
83286
WUFFS_BASE__GENERATED_C_CODE
83287
static wuffs_base__status
83288
wuffs_xz__decoder__do_transform_io(
83289
    wuffs_xz__decoder* self,
83290
    wuffs_base__io_buffer* a_dst,
83291
    wuffs_base__io_buffer* a_src,
83292
    wuffs_base__slice_u8 a_workbuf);
83293
83294
WUFFS_BASE__GENERATED_C_CODE
83295
static wuffs_base__status
83296
wuffs_xz__decoder__decode_block_header_with_padding(
83297
    wuffs_xz__decoder* self,
83298
    wuffs_base__io_buffer* a_src);
83299
83300
WUFFS_BASE__GENERATED_C_CODE
83301
static wuffs_base__status
83302
wuffs_xz__decoder__decode_block_header_sans_padding(
83303
    wuffs_xz__decoder* self,
83304
    wuffs_base__io_buffer* a_src);
83305
83306
WUFFS_BASE__GENERATED_C_CODE
83307
static wuffs_base__status
83308
wuffs_xz__decoder__verify_index(
83309
    wuffs_xz__decoder* self,
83310
    wuffs_base__io_buffer* a_src);
83311
83312
WUFFS_BASE__GENERATED_C_CODE
83313
static wuffs_base__status
83314
wuffs_xz__decoder__verify_footer(
83315
    wuffs_xz__decoder* self,
83316
    wuffs_base__io_buffer* a_src);
83317
83318
// ---------------- VTables
83319
83320
const wuffs_base__io_transformer__func_ptrs
83321
wuffs_xz__decoder__func_ptrs_for__wuffs_base__io_transformer = {
83322
  (wuffs_base__optional_u63(*)(const void*))(&wuffs_xz__decoder__dst_history_retain_length),
83323
  (uint64_t(*)(const void*,
83324
      uint32_t))(&wuffs_xz__decoder__get_quirk),
83325
  (wuffs_base__status(*)(void*,
83326
      uint32_t,
83327
      uint64_t))(&wuffs_xz__decoder__set_quirk),
83328
  (wuffs_base__status(*)(void*,
83329
      wuffs_base__io_buffer*,
83330
      wuffs_base__io_buffer*,
83331
      wuffs_base__slice_u8))(&wuffs_xz__decoder__transform_io),
83332
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_xz__decoder__workbuf_len),
83333
};
83334
83335
// ---------------- Initializer Implementations
83336
83337
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
83338
wuffs_xz__decoder__initialize(
83339
    wuffs_xz__decoder* self,
83340
    size_t sizeof_star_self,
83341
    uint64_t wuffs_version,
83342
    uint32_t options){
83343
  if (!self) {
83344
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
83345
  }
83346
  if (sizeof(*self) != sizeof_star_self) {
83347
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
83348
  }
83349
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
83350
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
83351
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
83352
  }
83353
83354
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
83355
    // The whole point of this if-check is to detect an uninitialized *self.
83356
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
83357
#if !defined(__clang__) && defined(__GNUC__)
83358
#pragma GCC diagnostic push
83359
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
83360
#endif
83361
    if (self->private_impl.magic != 0) {
83362
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
83363
    }
83364
#if !defined(__clang__) && defined(__GNUC__)
83365
#pragma GCC diagnostic pop
83366
#endif
83367
  } else {
83368
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
83369
      memset(self, 0, sizeof(*self));
83370
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
83371
    } else {
83372
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
83373
    }
83374
  }
83375
83376
  self->private_impl.choosy_apply_non_final_filters = &wuffs_xz__decoder__apply_non_final_filters__choosy_default;
83377
83378
  {
83379
    wuffs_base__status z = wuffs_crc32__ieee_hasher__initialize(
83380
        &self->private_data.f_crc32, sizeof(self->private_data.f_crc32), WUFFS_VERSION, options);
83381
    if (z.repr) {
83382
      return z;
83383
    }
83384
  }
83385
  {
83386
    wuffs_base__status z = wuffs_crc64__ecma_hasher__initialize(
83387
        &self->private_data.f_crc64, sizeof(self->private_data.f_crc64), WUFFS_VERSION, options);
83388
    if (z.repr) {
83389
      return z;
83390
    }
83391
  }
83392
  {
83393
    wuffs_base__status z = wuffs_sha256__hasher__initialize(
83394
        &self->private_data.f_sha256, sizeof(self->private_data.f_sha256), WUFFS_VERSION, options);
83395
    if (z.repr) {
83396
      return z;
83397
    }
83398
  }
83399
  {
83400
    wuffs_base__status z = wuffs_lzma__decoder__initialize(
83401
        &self->private_data.f_lzma, sizeof(self->private_data.f_lzma), WUFFS_VERSION, options);
83402
    if (z.repr) {
83403
      return z;
83404
    }
83405
  }
83406
  self->private_impl.magic = WUFFS_BASE__MAGIC;
83407
  self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name =
83408
      wuffs_base__io_transformer__vtable_name;
83409
  self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers =
83410
      (const void*)(&wuffs_xz__decoder__func_ptrs_for__wuffs_base__io_transformer);
83411
  return wuffs_base__make_status(NULL);
83412
}
83413
83414
wuffs_xz__decoder*
83415
wuffs_xz__decoder__alloc(void) {
83416
  wuffs_xz__decoder* x =
83417
      (wuffs_xz__decoder*)(calloc(1, sizeof(wuffs_xz__decoder)));
83418
  if (!x) {
83419
    return NULL;
83420
  }
83421
  if (wuffs_xz__decoder__initialize(
83422
      x, sizeof(wuffs_xz__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
83423
    free(x);
83424
    return NULL;
83425
  }
83426
  return x;
83427
}
83428
83429
size_t
83430
sizeof__wuffs_xz__decoder(void) {
83431
  return sizeof(wuffs_xz__decoder);
83432
}
83433
83434
// ---------------- Function Implementations
83435
83436
// -------- func xz.decoder.apply_non_final_filters
83437
83438
WUFFS_BASE__GENERATED_C_CODE
83439
static uint8_t
83440
wuffs_xz__decoder__apply_non_final_filters(
83441
    wuffs_xz__decoder* self,
83442
    wuffs_base__slice_u8 a_dst_slice) {
83443
  return (*self->private_impl.choosy_apply_non_final_filters)(self, a_dst_slice);
83444
}
83445
83446
WUFFS_BASE__GENERATED_C_CODE
83447
static uint8_t
83448
wuffs_xz__decoder__apply_non_final_filters__choosy_default(
83449
    wuffs_xz__decoder* self,
83450
    wuffs_base__slice_u8 a_dst_slice) {
83451
  uint32_t v_f = 0;
83452
  uint64_t v_i = 0;
83453
  uint32_t v_filter_id = 0;
83454
  uint32_t v_delta_dist = 0;
83455
  uint32_t v_delta_pos = 0;
83456
  uint8_t v_c8 = 0;
83457
83458
  if (self->private_impl.f_num_non_final_filters <= 0u) {
83459
    return 0u;
83460
  }
83461
  v_f = (self->private_impl.f_num_non_final_filters - 1u);
83462
  while (true) {
83463
    v_filter_id = (self->private_impl.f_filters[v_f] & 127u);
83464
    if (v_filter_id == 3u) {
83465
      v_delta_dist = (((self->private_impl.f_filters[v_f] >> 8u) & 255u) + 1u);
83466
      v_delta_pos = (self->private_impl.f_filters[v_f] >> 24u);
83467
      v_i = 0u;
83468
      while (v_i < ((uint64_t)(a_dst_slice.len))) {
83469
        v_c8 = a_dst_slice.ptr[v_i];
83470
#if defined(__GNUC__)
83471
#pragma GCC diagnostic push
83472
#pragma GCC diagnostic ignored "-Wconversion"
83473
#endif
83474
        v_c8 += self->private_data.f_filter_data[v_f][(((uint32_t)(v_delta_dist + v_delta_pos)) & 255u)];
83475
#if defined(__GNUC__)
83476
#pragma GCC diagnostic pop
83477
#endif
83478
        self->private_data.f_filter_data[v_f][(v_delta_pos & 255u)] = v_c8;
83479
        v_delta_pos -= 1u;
83480
        a_dst_slice.ptr[v_i] = v_c8;
83481
        v_i += 1u;
83482
      }
83483
      self->private_impl.f_filters[v_f] &= 65535u;
83484
      self->private_impl.f_filters[v_f] |= ((uint32_t)(v_delta_pos << 24u));
83485
    }
83486
    if (v_f <= 0u) {
83487
      break;
83488
    }
83489
    v_f -= 1u;
83490
  }
83491
  return 0u;
83492
}
83493
83494
// -------- func xz.decoder.apply_filter_04_x86
83495
83496
WUFFS_BASE__GENERATED_C_CODE
83497
static uint8_t
83498
wuffs_xz__decoder__apply_filter_04_x86(
83499
    wuffs_xz__decoder* self,
83500
    wuffs_base__slice_u8 a_dst_slice) {
83501
  wuffs_base__slice_u8 v_s = {0};
83502
  uint32_t v_p = 0;
83503
  uint64_t v_i = 0;
83504
  uint64_t v_prev_pos = 0;
83505
  uint32_t v_prev_mask = 0;
83506
  uint8_t v_c8 = 0;
83507
  uint32_t v_src = 0;
83508
  uint32_t v_dst = 0;
83509
  uint32_t v_bit_num = 0;
83510
83511
  v_s = a_dst_slice;
83512
  v_p = ((uint32_t)(self->private_impl.f_bcj_pos + 5u));
83513
  v_prev_pos = 18446744073709551615u;
83514
  v_prev_mask = self->private_impl.f_bcj_x86_prev_mask;
83515
  while (((uint64_t)(v_s.len)) >= 5u) {
83516
    if (((uint8_t)(v_s.ptr[0u] & 254u)) != 232u) {
83517
      v_i += 1u;
83518
      v_p += 1u;
83519
      v_s = wuffs_base__slice_u8__subslice_i(v_s, 1u);
83520
      continue;
83521
    }
83522
    v_prev_pos = ((uint64_t)(v_i - v_prev_pos));
83523
    if (v_prev_pos > 3u) {
83524
      v_prev_mask = 0u;
83525
    } else if (v_prev_pos > 0u) {
83526
      v_prev_mask = (((uint32_t)(v_prev_mask << (v_prev_pos - 1u))) & 7u);
83527
      if (v_prev_mask != 0u) {
83528
        v_c8 = v_s.ptr[((uint8_t)(4u - WUFFS_XZ__FILTER_04_X86_MASK_TO_BIT_NUM[(v_prev_mask & 7u)]))];
83529
        if ( ! WUFFS_XZ__FILTER_04_X86_MASK_TO_ALLOWED_STATUS[(v_prev_mask & 7u)] || (v_c8 == 0u) || (v_c8 == 255u)) {
83530
          v_prev_pos = v_i;
83531
          v_prev_mask = (((uint32_t)(v_prev_mask << 1u)) | 1u);
83532
          v_i += 1u;
83533
          v_p += 1u;
83534
          v_s = wuffs_base__slice_u8__subslice_i(v_s, 1u);
83535
          continue;
83536
        }
83537
      }
83538
    }
83539
    v_prev_pos = v_i;
83540
    v_c8 = v_s.ptr[4u];
83541
    if ((v_c8 != 0u) && (v_c8 != 255u)) {
83542
      v_prev_mask = (((uint32_t)(v_prev_mask << 1u)) | 1u);
83543
      v_i += 1u;
83544
      v_p += 1u;
83545
      v_s = wuffs_base__slice_u8__subslice_i(v_s, 1u);
83546
      continue;
83547
    }
83548
    v_src = ((((uint32_t)(v_s.ptr[1u])) << 0u) |
83549
        (((uint32_t)(v_s.ptr[2u])) << 8u) |
83550
        (((uint32_t)(v_s.ptr[3u])) << 16u) |
83551
        (((uint32_t)(v_s.ptr[4u])) << 24u));
83552
    while (true) {
83553
      v_dst = ((uint32_t)(v_src - v_p));
83554
      if (v_prev_mask == 0u) {
83555
        break;
83556
      }
83557
      v_bit_num = ((uint32_t)(WUFFS_XZ__FILTER_04_X86_MASK_TO_BIT_NUM[(v_prev_mask & 7u)]));
83558
      v_c8 = ((uint8_t)((v_dst >> (24u - (v_bit_num * 8u)))));
83559
      if ((v_c8 != 0u) && (v_c8 != 255u)) {
83560
        break;
83561
      }
83562
      v_src = (v_dst ^ WUFFS_XZ__FILTER_04_X86_MASK_TO_XOR_OPERAND[(v_prev_mask & 7u)]);
83563
    }
83564
    v_dst &= 33554431u;
83565
    v_dst |= ((uint32_t)(0u - (v_dst & 16777216u)));
83566
    v_s.ptr[1u] = ((uint8_t)((v_dst >> 0u)));
83567
    v_s.ptr[2u] = ((uint8_t)((v_dst >> 8u)));
83568
    v_s.ptr[3u] = ((uint8_t)((v_dst >> 16u)));
83569
    v_s.ptr[4u] = ((uint8_t)((v_dst >> 24u)));
83570
    v_i += 5u;
83571
    v_p += 5u;
83572
    v_s = wuffs_base__slice_u8__subslice_i(v_s, 5u);
83573
  }
83574
  v_prev_pos = ((uint64_t)(v_i - v_prev_pos));
83575
  if (v_prev_pos > 3u) {
83576
    self->private_impl.f_bcj_x86_prev_mask = 0u;
83577
  } else if (v_prev_pos > 0u) {
83578
    self->private_impl.f_bcj_x86_prev_mask = ((uint32_t)(v_prev_mask << (v_prev_pos - 1u)));
83579
  }
83580
  self->private_impl.f_bcj_pos = ((uint32_t)(v_p - 5u));
83581
  return ((uint8_t)(((uint64_t)(v_s.len))));
83582
}
83583
83584
// -------- func xz.decoder.apply_filter_05_powerpc
83585
83586
WUFFS_BASE__GENERATED_C_CODE
83587
static uint8_t
83588
wuffs_xz__decoder__apply_filter_05_powerpc(
83589
    wuffs_xz__decoder* self,
83590
    wuffs_base__slice_u8 a_dst_slice) {
83591
  wuffs_base__slice_u8 v_s = {0};
83592
  uint32_t v_p = 0;
83593
  uint32_t v_x = 0;
83594
83595
  v_s = a_dst_slice;
83596
  v_p = self->private_impl.f_bcj_pos;
83597
  while (((uint64_t)(v_s.len)) >= 4u) {
83598
    v_x = ((((uint32_t)(v_s.ptr[0u])) << 24u) |
83599
        (((uint32_t)(v_s.ptr[1u])) << 16u) |
83600
        (((uint32_t)(v_s.ptr[2u])) << 8u) |
83601
        (((uint32_t)(v_s.ptr[3u])) << 0u));
83602
    if ((v_x & 4227858435u) == 1207959553u) {
83603
      v_x = ((((uint32_t)((v_x & 67108860u) - v_p)) & 67108860u) | 1207959553u);
83604
      v_s.ptr[0u] = ((uint8_t)((v_x >> 24u)));
83605
      v_s.ptr[1u] = ((uint8_t)((v_x >> 16u)));
83606
      v_s.ptr[2u] = ((uint8_t)((v_x >> 8u)));
83607
      v_s.ptr[3u] = ((uint8_t)((v_x >> 0u)));
83608
    }
83609
    v_p += 4u;
83610
    v_s = wuffs_base__slice_u8__subslice_i(v_s, 4u);
83611
  }
83612
  self->private_impl.f_bcj_pos = v_p;
83613
  return ((uint8_t)(((uint64_t)(v_s.len))));
83614
}
83615
83616
// -------- func xz.decoder.apply_filter_06_ia64
83617
83618
WUFFS_BASE__GENERATED_C_CODE
83619
static uint8_t
83620
wuffs_xz__decoder__apply_filter_06_ia64(
83621
    wuffs_xz__decoder* self,
83622
    wuffs_base__slice_u8 a_dst_slice) {
83623
  wuffs_base__slice_u8 v_s = {0};
83624
  uint32_t v_p = 0;
83625
  uint32_t v_mask = 0;
83626
  uint32_t v_slot = 0;
83627
  uint32_t v_bit_pos = 0;
83628
  uint32_t v_byte_pos = 0;
83629
  uint32_t v_bit_res = 0;
83630
  uint64_t v_x = 0;
83631
  uint32_t v_j = 0;
83632
  uint64_t v_norm = 0;
83633
  uint32_t v_addr = 0;
83634
83635
  v_s = a_dst_slice;
83636
  v_p = self->private_impl.f_bcj_pos;
83637
  while (((uint64_t)(v_s.len)) >= 16u) {
83638
    v_mask = ((uint32_t)(WUFFS_XZ__FILTER_06_IA64_BRANCH_TABLE[((uint8_t)(v_s.ptr[0u] & 31u))]));
83639
    v_slot = 0u;
83640
    while (true) {
83641
      do {
83642
        if (((v_mask >> v_slot) & 1u) == 0u) {
83643
          break;
83644
        }
83645
        v_bit_pos = ((v_slot * 41u) + 5u);
83646
        v_byte_pos = (v_bit_pos >> 3u);
83647
        v_bit_res = (v_bit_pos & 7u);
83648
        v_x = 0u;
83649
        v_j = 0u;
83650
        while (v_j < 6u) {
83651
          v_x |= (((uint64_t)(v_s.ptr[(v_j + v_byte_pos)])) << (8u * v_j));
83652
          v_j += 1u;
83653
        }
83654
        v_norm = (v_x >> v_bit_res);
83655
        if ((((v_norm >> 37u) & 15u) != 5u) || (((v_norm >> 9u) & 7u) != 0u)) {
83656
          break;
83657
        }
83658
        v_addr = ((uint32_t)(((v_norm >> 13u) & 1048575u)));
83659
        v_addr |= (((uint32_t)(((v_norm >> 36u) & 1u))) << 20u);
83660
        v_addr <<= 4u;
83661
        v_addr -= v_p;
83662
        v_addr >>= 4u;
83663
        v_norm &= 18446743996400148479u;
83664
        v_norm |= (((uint64_t)((v_addr & 1048575u))) << 13u);
83665
        v_norm |= (((uint64_t)((v_addr & 1048576u))) << 16u);
83666
        v_x &= ((((uint64_t)(1u)) << v_bit_res) - 1u);
83667
        v_x |= ((uint64_t)(v_norm << v_bit_res));
83668
        v_j = 0u;
83669
        while (v_j < 6u) {
83670
          v_s.ptr[(v_j + v_byte_pos)] = ((uint8_t)((v_x >> (8u * v_j))));
83671
          v_j += 1u;
83672
        }
83673
      } while (0);
83674
      if (v_slot >= 2u) {
83675
        break;
83676
      }
83677
      v_slot += 1u;
83678
    }
83679
    v_p += 16u;
83680
    v_s = wuffs_base__slice_u8__subslice_i(v_s, 16u);
83681
  }
83682
  self->private_impl.f_bcj_pos = v_p;
83683
  return ((uint8_t)(((uint64_t)(v_s.len))));
83684
}
83685
83686
// -------- func xz.decoder.apply_filter_07_arm
83687
83688
WUFFS_BASE__GENERATED_C_CODE
83689
static uint8_t
83690
wuffs_xz__decoder__apply_filter_07_arm(
83691
    wuffs_xz__decoder* self,
83692
    wuffs_base__slice_u8 a_dst_slice) {
83693
  wuffs_base__slice_u8 v_s = {0};
83694
  uint32_t v_p = 0;
83695
  uint32_t v_x = 0;
83696
83697
  v_s = a_dst_slice;
83698
  v_p = ((uint32_t)(self->private_impl.f_bcj_pos + 8u));
83699
  while (((uint64_t)(v_s.len)) >= 4u) {
83700
    if (v_s.ptr[3u] == 235u) {
83701
      v_x = ((((uint32_t)(v_s.ptr[0u])) << 0u) |
83702
          (((uint32_t)(v_s.ptr[1u])) << 8u) |
83703
          (((uint32_t)(v_s.ptr[2u])) << 16u) |
83704
          (((uint32_t)(v_s.ptr[3u])) << 24u));
83705
      v_x = (((uint32_t)(((v_x & 16777215u) << 2u) - v_p)) >> 2u);
83706
      v_s.ptr[0u] = ((uint8_t)((v_x >> 0u)));
83707
      v_s.ptr[1u] = ((uint8_t)((v_x >> 8u)));
83708
      v_s.ptr[2u] = ((uint8_t)((v_x >> 16u)));
83709
    }
83710
    v_p += 4u;
83711
    v_s = wuffs_base__slice_u8__subslice_i(v_s, 4u);
83712
  }
83713
  self->private_impl.f_bcj_pos = ((uint32_t)(v_p - 8u));
83714
  return ((uint8_t)(((uint64_t)(v_s.len))));
83715
}
83716
83717
// -------- func xz.decoder.apply_filter_08_armthumb
83718
83719
WUFFS_BASE__GENERATED_C_CODE
83720
static uint8_t
83721
wuffs_xz__decoder__apply_filter_08_armthumb(
83722
    wuffs_xz__decoder* self,
83723
    wuffs_base__slice_u8 a_dst_slice) {
83724
  wuffs_base__slice_u8 v_s = {0};
83725
  uint32_t v_p = 0;
83726
  uint32_t v_x = 0;
83727
  uint32_t v_y = 0;
83728
83729
  v_s = a_dst_slice;
83730
  v_p = ((uint32_t)(self->private_impl.f_bcj_pos + 4u));
83731
  while (((uint64_t)(v_s.len)) >= 4u) {
83732
    v_x = ((((uint32_t)(v_s.ptr[0u])) << 0u) |
83733
        (((uint32_t)(v_s.ptr[1u])) << 8u) |
83734
        (((uint32_t)(v_s.ptr[2u])) << 16u) |
83735
        (((uint32_t)(v_s.ptr[3u])) << 24u));
83736
    if ((v_x & 4160813056u) != 4160811008u) {
83737
      v_p += 2u;
83738
      v_s = wuffs_base__slice_u8__subslice_i(v_s, 2u);
83739
      continue;
83740
    }
83741
    v_y = ((((uint32_t)(((uint8_t)(v_s.ptr[0u] & 255u)))) << 11u) |
83742
        (((uint32_t)(((uint8_t)(v_s.ptr[1u] & 7u)))) << 19u) |
83743
        (((uint32_t)(((uint8_t)(v_s.ptr[2u] & 255u)))) << 0u) |
83744
        (((uint32_t)(((uint8_t)(v_s.ptr[3u] & 7u)))) << 8u));
83745
    v_y = (((uint32_t)(((uint32_t)(v_y << 1u)) - v_p)) >> 1u);
83746
    v_s.ptr[0u] = ((uint8_t)((v_y >> 11u)));
83747
    v_s.ptr[1u] = ((uint8_t)((((v_y >> 19u) & 7u) | 240u)));
83748
    v_s.ptr[2u] = ((uint8_t)((v_y >> 0u)));
83749
    v_s.ptr[3u] = ((uint8_t)((((v_y >> 8u) & 7u) | 248u)));
83750
    v_p += 4u;
83751
    v_s = wuffs_base__slice_u8__subslice_i(v_s, 4u);
83752
  }
83753
  self->private_impl.f_bcj_pos = ((uint32_t)(v_p - 4u));
83754
  return ((uint8_t)(((uint64_t)(v_s.len))));
83755
}
83756
83757
// -------- func xz.decoder.apply_filter_09_sparc
83758
83759
WUFFS_BASE__GENERATED_C_CODE
83760
static uint8_t
83761
wuffs_xz__decoder__apply_filter_09_sparc(
83762
    wuffs_xz__decoder* self,
83763
    wuffs_base__slice_u8 a_dst_slice) {
83764
  wuffs_base__slice_u8 v_s = {0};
83765
  uint32_t v_p = 0;
83766
  uint32_t v_x = 0;
83767
83768
  v_s = a_dst_slice;
83769
  v_p = self->private_impl.f_bcj_pos;
83770
  while (((uint64_t)(v_s.len)) >= 4u) {
83771
    v_x = ((((uint32_t)(v_s.ptr[0u])) << 24u) |
83772
        (((uint32_t)(v_s.ptr[1u])) << 16u) |
83773
        (((uint32_t)(v_s.ptr[2u])) << 8u) |
83774
        (((uint32_t)(v_s.ptr[3u])) << 0u));
83775
    if (((v_x >> 22u) == 256u) || ((v_x >> 22u) == 511u)) {
83776
      v_x = (((uint32_t)(((uint32_t)(v_x << 2u)) - v_p)) >> 2u);
83777
      v_x = ((1073741824u - (v_x & 4194304u)) | 1073741824u | (v_x & 4194303u));
83778
      v_s.ptr[0u] = ((uint8_t)((v_x >> 24u)));
83779
      v_s.ptr[1u] = ((uint8_t)((v_x >> 16u)));
83780
      v_s.ptr[2u] = ((uint8_t)((v_x >> 8u)));
83781
      v_s.ptr[3u] = ((uint8_t)((v_x >> 0u)));
83782
    }
83783
    v_p += 4u;
83784
    v_s = wuffs_base__slice_u8__subslice_i(v_s, 4u);
83785
  }
83786
  self->private_impl.f_bcj_pos = v_p;
83787
  return ((uint8_t)(((uint64_t)(v_s.len))));
83788
}
83789
83790
// -------- func xz.decoder.apply_filter_0a_arm64
83791
83792
WUFFS_BASE__GENERATED_C_CODE
83793
static uint8_t
83794
wuffs_xz__decoder__apply_filter_0a_arm64(
83795
    wuffs_xz__decoder* self,
83796
    wuffs_base__slice_u8 a_dst_slice) {
83797
  wuffs_base__slice_u8 v_s = {0};
83798
  uint32_t v_p = 0;
83799
  uint32_t v_x = 0;
83800
  uint32_t v_y = 0;
83801
83802
  v_s = a_dst_slice;
83803
  v_p = self->private_impl.f_bcj_pos;
83804
  while (((uint64_t)(v_s.len)) >= 4u) {
83805
    v_x = ((((uint32_t)(v_s.ptr[0u])) << 0u) |
83806
        (((uint32_t)(v_s.ptr[1u])) << 8u) |
83807
        (((uint32_t)(v_s.ptr[2u])) << 16u) |
83808
        (((uint32_t)(v_s.ptr[3u])) << 24u));
83809
    if ((v_x >> 26u) == 37u) {
83810
      v_y = ((uint32_t)(v_x - (v_p >> 2u)));
83811
      v_x = (2483027968u | (v_y & 67108863u));
83812
      v_s.ptr[0u] = ((uint8_t)((v_x >> 0u)));
83813
      v_s.ptr[1u] = ((uint8_t)((v_x >> 8u)));
83814
      v_s.ptr[2u] = ((uint8_t)((v_x >> 16u)));
83815
      v_s.ptr[3u] = ((uint8_t)((v_x >> 24u)));
83816
    } else if ((v_x & 2667577344u) == 2415919104u) {
83817
      v_y = (((v_x >> 29u) & 3u) | ((v_x >> 3u) & 2097148u));
83818
      if ((((uint32_t)(v_y + 131072u)) & 1835008u) == 0u) {
83819
        v_y -= (v_p >> 12u);
83820
        v_x &= 2415919135u;
83821
        v_x |= ((v_y & 3u) << 29u);
83822
        v_x |= ((v_y & 262140u) << 3u);
83823
        v_x |= (((uint32_t)(0u - (v_y & 131072u))) & 14680064u);
83824
        v_s.ptr[0u] = ((uint8_t)((v_x >> 0u)));
83825
        v_s.ptr[1u] = ((uint8_t)((v_x >> 8u)));
83826
        v_s.ptr[2u] = ((uint8_t)((v_x >> 16u)));
83827
        v_s.ptr[3u] = ((uint8_t)((v_x >> 24u)));
83828
      }
83829
    }
83830
    v_p += 4u;
83831
    v_s = wuffs_base__slice_u8__subslice_i(v_s, 4u);
83832
  }
83833
  self->private_impl.f_bcj_pos = v_p;
83834
  return ((uint8_t)(((uint64_t)(v_s.len))));
83835
}
83836
83837
// -------- func xz.decoder.apply_filter_0b_riscv
83838
83839
WUFFS_BASE__GENERATED_C_CODE
83840
static uint8_t
83841
wuffs_xz__decoder__apply_filter_0b_riscv(
83842
    wuffs_xz__decoder* self,
83843
    wuffs_base__slice_u8 a_dst_slice) {
83844
  wuffs_base__slice_u8 v_s = {0};
83845
  uint32_t v_p = 0;
83846
  uint32_t v_x = 0;
83847
  uint32_t v_x27 = 0;
83848
  uint32_t v_y = 0;
83849
  uint32_t v_addr = 0;
83850
83851
  v_s = a_dst_slice;
83852
  v_p = self->private_impl.f_bcj_pos;
83853
  while (((uint64_t)(v_s.len)) >= 8u) {
83854
    if (v_s.ptr[0u] == 239u) {
83855
      if (((uint8_t)(v_s.ptr[1u] & 13u)) != 0u) {
83856
        v_p += 2u;
83857
        v_s = wuffs_base__slice_u8__subslice_i(v_s, 2u);
83858
        continue;
83859
      }
83860
      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));
83861
      v_addr -= v_p;
83862
      v_s.ptr[1u] = ((uint8_t)(((uint8_t)(v_s.ptr[1u] & 15u)) | ((uint8_t)(((v_addr >> 8u) & 240u)))));
83863
      v_s.ptr[2u] = ((uint8_t)((((v_addr >> 16u) & 15u) | ((v_addr >> 7u) & 16u) | (((uint32_t)(v_addr << 4u)) & 224u))));
83864
      v_s.ptr[3u] = ((uint8_t)((((v_addr >> 4u) & 127u) | ((v_addr >> 13u) & 128u))));
83865
      v_p += 4u;
83866
      v_s = wuffs_base__slice_u8__subslice_i(v_s, 4u);
83867
      continue;
83868
    } else if (((uint8_t)(v_s.ptr[0u] & 127u)) == 23u) {
83869
      v_x = ((((uint32_t)(v_s.ptr[0u])) << 0u) |
83870
          (((uint32_t)(v_s.ptr[1u])) << 8u) |
83871
          (((uint32_t)(v_s.ptr[2u])) << 16u) |
83872
          (((uint32_t)(v_s.ptr[3u])) << 24u));
83873
      if ((v_x & 3712u) != 0u) {
83874
        v_y = ((((uint32_t)(v_s.ptr[4u])) << 0u) |
83875
            (((uint32_t)(v_s.ptr[5u])) << 8u) |
83876
            (((uint32_t)(v_s.ptr[6u])) << 16u) |
83877
            (((uint32_t)(v_s.ptr[7u])) << 24u));
83878
        if (((((uint32_t)(v_x << 8u)) ^ ((uint32_t)(v_y - 3u))) & 1015811u) != 0u) {
83879
          v_p += 6u;
83880
          v_s = wuffs_base__slice_u8__subslice_i(v_s, 6u);
83881
          continue;
83882
        }
83883
        v_addr = ((v_x & 4294963200u) | (v_y >> 20u));
83884
        v_x = (279u | ((uint32_t)(v_y << 12u)));
83885
        v_s.ptr[0u] = ((uint8_t)((v_x >> 0u)));
83886
        v_s.ptr[1u] = ((uint8_t)((v_x >> 8u)));
83887
        v_s.ptr[2u] = ((uint8_t)((v_x >> 16u)));
83888
        v_s.ptr[3u] = ((uint8_t)((v_x >> 24u)));
83889
        v_s.ptr[4u] = ((uint8_t)((v_addr >> 0u)));
83890
        v_s.ptr[5u] = ((uint8_t)((v_addr >> 8u)));
83891
        v_s.ptr[6u] = ((uint8_t)((v_addr >> 16u)));
83892
        v_s.ptr[7u] = ((uint8_t)((v_addr >> 24u)));
83893
        v_p += 8u;
83894
        v_s = wuffs_base__slice_u8__subslice_i(v_s, 8u);
83895
        continue;
83896
      }
83897
      v_x27 = (v_x >> 27u);
83898
      if (((uint32_t)(((uint32_t)(v_x - 12567u)) << 18u)) >= (v_x27 & 29u)) {
83899
        v_p += 4u;
83900
        v_s = wuffs_base__slice_u8__subslice_i(v_s, 4u);
83901
        continue;
83902
      }
83903
      v_addr = ((((uint32_t)(v_s.ptr[4u])) << 24u) |
83904
          (((uint32_t)(v_s.ptr[5u])) << 16u) |
83905
          (((uint32_t)(v_s.ptr[6u])) << 8u) |
83906
          (((uint32_t)(v_s.ptr[7u])) << 0u));
83907
      v_addr -= v_p;
83908
      v_y = ((v_x >> 12u) | ((uint32_t)(v_addr << 20u)));
83909
      v_x = (23u | (v_x27 << 7u) | (((uint32_t)(v_addr + 2048u)) & 4294963200u));
83910
      v_s.ptr[0u] = ((uint8_t)((v_x >> 0u)));
83911
      v_s.ptr[1u] = ((uint8_t)((v_x >> 8u)));
83912
      v_s.ptr[2u] = ((uint8_t)((v_x >> 16u)));
83913
      v_s.ptr[3u] = ((uint8_t)((v_x >> 24u)));
83914
      v_s.ptr[4u] = ((uint8_t)((v_y >> 0u)));
83915
      v_s.ptr[5u] = ((uint8_t)((v_y >> 8u)));
83916
      v_s.ptr[6u] = ((uint8_t)((v_y >> 16u)));
83917
      v_s.ptr[7u] = ((uint8_t)((v_y >> 24u)));
83918
      v_p += 8u;
83919
      v_s = wuffs_base__slice_u8__subslice_i(v_s, 8u);
83920
      continue;
83921
    }
83922
    v_p += 2u;
83923
    v_s = wuffs_base__slice_u8__subslice_i(v_s, 2u);
83924
  }
83925
  self->private_impl.f_bcj_pos = v_p;
83926
  return ((uint8_t)(((uint64_t)(v_s.len))));
83927
}
83928
83929
// -------- func xz.decoder.get_quirk
83930
83931
WUFFS_BASE__GENERATED_C_CODE
83932
WUFFS_BASE__MAYBE_STATIC uint64_t
83933
wuffs_xz__decoder__get_quirk(
83934
    const wuffs_xz__decoder* self,
83935
    uint32_t a_key) {
83936
  if (!self) {
83937
    return 0;
83938
  }
83939
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
83940
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
83941
    return 0;
83942
  }
83943
83944
  if (a_key == 1u) {
83945
    if (self->private_impl.f_ignore_checksum) {
83946
      return 1u;
83947
    }
83948
  } else if (a_key == 1963655168u) {
83949
    if (self->private_impl.f_standalone_format) {
83950
      return 1u;
83951
    }
83952
  }
83953
  return 0u;
83954
}
83955
83956
// -------- func xz.decoder.set_quirk
83957
83958
WUFFS_BASE__GENERATED_C_CODE
83959
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
83960
wuffs_xz__decoder__set_quirk(
83961
    wuffs_xz__decoder* self,
83962
    uint32_t a_key,
83963
    uint64_t a_value) {
83964
  if (!self) {
83965
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
83966
  }
83967
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
83968
    return wuffs_base__make_status(
83969
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
83970
        ? wuffs_base__error__disabled_by_previous_error
83971
        : wuffs_base__error__initialize_not_called);
83972
  }
83973
83974
  if (a_key == 1u) {
83975
    self->private_impl.f_ignore_checksum = (a_value > 0u);
83976
    return wuffs_base__make_status(NULL);
83977
  } else if (a_key == 1963655168u) {
83978
    self->private_impl.f_standalone_format = (a_value > 0u);
83979
    return wuffs_base__make_status(NULL);
83980
  }
83981
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
83982
}
83983
83984
// -------- func xz.decoder.dst_history_retain_length
83985
83986
WUFFS_BASE__GENERATED_C_CODE
83987
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
83988
wuffs_xz__decoder__dst_history_retain_length(
83989
    const wuffs_xz__decoder* self) {
83990
  if (!self) {
83991
    return wuffs_base__utility__make_optional_u63(false, 0u);
83992
  }
83993
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
83994
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
83995
    return wuffs_base__utility__make_optional_u63(false, 0u);
83996
  }
83997
83998
  return wuffs_lzma__decoder__dst_history_retain_length(&self->private_data.f_lzma);
83999
}
84000
84001
// -------- func xz.decoder.workbuf_len
84002
84003
WUFFS_BASE__GENERATED_C_CODE
84004
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
84005
wuffs_xz__decoder__workbuf_len(
84006
    const wuffs_xz__decoder* self) {
84007
  if (!self) {
84008
    return wuffs_base__utility__empty_range_ii_u64();
84009
  }
84010
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
84011
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
84012
    return wuffs_base__utility__empty_range_ii_u64();
84013
  }
84014
84015
  return wuffs_lzma__decoder__workbuf_len(&self->private_data.f_lzma);
84016
}
84017
84018
// -------- func xz.decoder.transform_io
84019
84020
WUFFS_BASE__GENERATED_C_CODE
84021
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
84022
wuffs_xz__decoder__transform_io(
84023
    wuffs_xz__decoder* self,
84024
    wuffs_base__io_buffer* a_dst,
84025
    wuffs_base__io_buffer* a_src,
84026
    wuffs_base__slice_u8 a_workbuf) {
84027
  if (!self) {
84028
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
84029
  }
84030
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
84031
    return wuffs_base__make_status(
84032
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
84033
        ? wuffs_base__error__disabled_by_previous_error
84034
        : wuffs_base__error__initialize_not_called);
84035
  }
84036
  if (!a_dst || !a_src) {
84037
    self->private_impl.magic = WUFFS_BASE__DISABLED;
84038
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
84039
  }
84040
  if ((self->private_impl.active_coroutine != 0) &&
84041
      (self->private_impl.active_coroutine != 1)) {
84042
    self->private_impl.magic = WUFFS_BASE__DISABLED;
84043
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
84044
  }
84045
  self->private_impl.active_coroutine = 0;
84046
  wuffs_base__status status = wuffs_base__make_status(NULL);
84047
84048
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
84049
84050
  uint32_t coro_susp_point = self->private_impl.p_transform_io;
84051
  switch (coro_susp_point) {
84052
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
84053
84054
    while (true) {
84055
      {
84056
        wuffs_base__status t_0 = wuffs_xz__decoder__do_transform_io(self, a_dst, a_src, a_workbuf);
84057
        v_status = t_0;
84058
      }
84059
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
84060
        status = wuffs_base__make_status(wuffs_xz__error__truncated_input);
84061
        goto exit;
84062
      }
84063
      status = v_status;
84064
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
84065
    }
84066
84067
    ok:
84068
    self->private_impl.p_transform_io = 0;
84069
    goto exit;
84070
  }
84071
84072
  goto suspend;
84073
  suspend:
84074
  self->private_impl.p_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
84075
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
84076
84077
  goto exit;
84078
  exit:
84079
  if (wuffs_base__status__is_error(&status)) {
84080
    self->private_impl.magic = WUFFS_BASE__DISABLED;
84081
  }
84082
  return status;
84083
}
84084
84085
// -------- func xz.decoder.do_transform_io
84086
84087
WUFFS_BASE__GENERATED_C_CODE
84088
static wuffs_base__status
84089
wuffs_xz__decoder__do_transform_io(
84090
    wuffs_xz__decoder* self,
84091
    wuffs_base__io_buffer* a_dst,
84092
    wuffs_base__io_buffer* a_src,
84093
    wuffs_base__slice_u8 a_workbuf) {
84094
  wuffs_base__status status = wuffs_base__make_status(NULL);
84095
84096
  uint64_t v_header_magic = 0;
84097
  uint64_t v_dmark = 0;
84098
  uint64_t v_smark = 0;
84099
  uint8_t v_i8 = 0;
84100
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
84101
  uint32_t v_checksum32_have = 0;
84102
  uint32_t v_checksum32_want = 0;
84103
  uint64_t v_checksum64_have = 0;
84104
  uint64_t v_checksum64_want = 0;
84105
  wuffs_base__bitvec256 v_checksum256_have = {0};
84106
  uint64_t v_compressed_size = 0;
84107
  uint64_t v_uncompressed_size = 0;
84108
  uint32_t v_hash = 0;
84109
  uint8_t v_c8 = 0;
84110
  uint32_t v_c32 = 0;
84111
  uint16_t v_footer_magic = 0;
84112
84113
  uint8_t* iop_a_dst = NULL;
84114
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
84115
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
84116
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
84117
  if (a_dst && a_dst->data.ptr) {
84118
    io0_a_dst = a_dst->data.ptr;
84119
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
84120
    iop_a_dst = io1_a_dst;
84121
    io2_a_dst = io0_a_dst + a_dst->data.len;
84122
    if (a_dst->meta.closed) {
84123
      io2_a_dst = iop_a_dst;
84124
    }
84125
  }
84126
  const uint8_t* iop_a_src = NULL;
84127
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
84128
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
84129
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
84130
  if (a_src && a_src->data.ptr) {
84131
    io0_a_src = a_src->data.ptr;
84132
    io1_a_src = io0_a_src + a_src->meta.ri;
84133
    iop_a_src = io1_a_src;
84134
    io2_a_src = io0_a_src + a_src->meta.wi;
84135
  }
84136
84137
  uint32_t coro_susp_point = self->private_impl.p_do_transform_io;
84138
  if (coro_susp_point) {
84139
    v_checksum32_have = self->private_data.s_do_transform_io.v_checksum32_have;
84140
    v_checksum32_want = self->private_data.s_do_transform_io.v_checksum32_want;
84141
    v_checksum256_have = self->private_data.s_do_transform_io.v_checksum256_have;
84142
    v_compressed_size = self->private_data.s_do_transform_io.v_compressed_size;
84143
    v_uncompressed_size = self->private_data.s_do_transform_io.v_uncompressed_size;
84144
  }
84145
  switch (coro_susp_point) {
84146
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
84147
84148
    while (true) {
84149
      {
84150
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
84151
        uint64_t t_0;
84152
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 6)) {
84153
          t_0 = ((uint64_t)(wuffs_base__peek_u48le__no_bounds_check(iop_a_src)));
84154
          iop_a_src += 6;
84155
        } else {
84156
          self->private_data.s_do_transform_io.scratch = 0;
84157
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
84158
          while (true) {
84159
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
84160
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
84161
              goto suspend;
84162
            }
84163
            uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
84164
            uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
84165
            *scratch <<= 8;
84166
            *scratch >>= 8;
84167
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
84168
            if (num_bits_0 == 40) {
84169
              t_0 = ((uint64_t)(*scratch));
84170
              break;
84171
            }
84172
            num_bits_0 += 8u;
84173
            *scratch |= ((uint64_t)(num_bits_0)) << 56;
84174
          }
84175
        }
84176
        v_header_magic = t_0;
84177
      }
84178
      if (v_header_magic != 388031461373u) {
84179
        status = wuffs_base__make_status(wuffs_xz__error__bad_header);
84180
        goto exit;
84181
      }
84182
      {
84183
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
84184
        uint64_t t_1;
84185
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 6)) {
84186
          t_1 = ((uint64_t)(wuffs_base__peek_u48le__no_bounds_check(iop_a_src)));
84187
          iop_a_src += 6;
84188
        } else {
84189
          self->private_data.s_do_transform_io.scratch = 0;
84190
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
84191
          while (true) {
84192
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
84193
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
84194
              goto suspend;
84195
            }
84196
            uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
84197
            uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
84198
            *scratch <<= 8;
84199
            *scratch >>= 8;
84200
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
84201
            if (num_bits_1 == 40) {
84202
              t_1 = ((uint64_t)(*scratch));
84203
              break;
84204
            }
84205
            num_bits_1 += 8u;
84206
            *scratch |= ((uint64_t)(num_bits_1)) << 56;
84207
          }
84208
        }
84209
        v_header_magic = t_1;
84210
      }
84211
      if (v_header_magic == 72400582410240u) {
84212
        self->private_impl.f_checksummer = 0u;
84213
      } else if (v_header_magic == 60327687946496u) {
84214
        self->private_impl.f_checksummer = 1u;
84215
      } else if (v_header_magic == 77742513456128u) {
84216
        self->private_impl.f_checksummer = 2u;
84217
      } else if (v_header_magic == 177077137508864u) {
84218
        self->private_impl.f_checksummer = 3u;
84219
      } else if ((v_header_magic & 61695u) != 0u) {
84220
        status = wuffs_base__make_status(wuffs_xz__error__bad_header);
84221
        goto exit;
84222
      } else {
84223
        v_header_magic = (15u & (v_header_magic >> 8u));
84224
        if ((v_header_magic != 0u) &&
84225
            (v_header_magic != 1u) &&
84226
            (v_header_magic != 4u) &&
84227
            (v_header_magic != 10u)) {
84228
          status = wuffs_base__make_status(wuffs_xz__error__unsupported_checksum_algorithm);
84229
          goto exit;
84230
        }
84231
        status = wuffs_base__make_status(wuffs_xz__error__bad_checksum);
84232
        goto exit;
84233
      }
84234
      self->private_impl.f_flags = ((uint16_t)(v_header_magic));
84235
      self->private_impl.f_num_actual_blocks = 0u;
84236
      while (true) {
84237
        if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
84238
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
84239
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5);
84240
          continue;
84241
        } else if (wuffs_base__peek_u8be__no_bounds_check(iop_a_src) == 0u) {
84242
          break;
84243
        }
84244
        self->private_impl.f_num_actual_blocks += 1u;
84245
        if ( ! self->private_impl.f_ignore_checksum) {
84246
          wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32,
84247
              sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
84248
        }
84249
        self->private_impl.f_compressed_size_for_index = 4u;
84250
        while (true) {
84251
          v_smark = ((uint64_t)(iop_a_src - io0_a_src));
84252
          {
84253
            if (a_src) {
84254
              a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
84255
            }
84256
            wuffs_base__status t_2 = wuffs_xz__decoder__decode_block_header_with_padding(self, a_src);
84257
            v_status = t_2;
84258
            if (a_src) {
84259
              iop_a_src = a_src->data.ptr + a_src->meta.ri;
84260
            }
84261
          }
84262
          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))));
84263
          if ( ! self->private_impl.f_ignore_checksum) {
84264
            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));
84265
          }
84266
          if (wuffs_base__status__is_ok(&v_status)) {
84267
            break;
84268
          }
84269
          status = v_status;
84270
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6);
84271
        }
84272
        {
84273
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
84274
          uint32_t t_3;
84275
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
84276
            t_3 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
84277
            iop_a_src += 4;
84278
          } else {
84279
            self->private_data.s_do_transform_io.scratch = 0;
84280
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
84281
            while (true) {
84282
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
84283
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
84284
                goto suspend;
84285
              }
84286
              uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
84287
              uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56));
84288
              *scratch <<= 8;
84289
              *scratch >>= 8;
84290
              *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3;
84291
              if (num_bits_3 == 24) {
84292
                t_3 = ((uint32_t)(*scratch));
84293
                break;
84294
              }
84295
              num_bits_3 += 8u;
84296
              *scratch |= ((uint64_t)(num_bits_3)) << 56;
84297
            }
84298
          }
84299
          v_checksum32_want = t_3;
84300
        }
84301
        if (self->private_impl.f_ignore_checksum) {
84302
        } else if (v_checksum32_have != v_checksum32_want) {
84303
          status = wuffs_base__make_status(wuffs_xz__error__bad_checksum);
84304
          goto exit;
84305
        } else {
84306
          wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32,
84307
              sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
84308
          wuffs_private_impl__ignore_status(wuffs_crc64__ecma_hasher__initialize(&self->private_data.f_crc64,
84309
              sizeof (wuffs_crc64__ecma_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
84310
          wuffs_private_impl__ignore_status(wuffs_sha256__hasher__initialize(&self->private_data.f_sha256,
84311
              sizeof (wuffs_sha256__hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
84312
        }
84313
        v_compressed_size = 0u;
84314
        v_uncompressed_size = 0u;
84315
        while (true) {
84316
          if (((uint64_t)(self->private_impl.f_bcj_undo_index)) > ((uint64_t)(io2_a_dst - iop_a_dst))) {
84317
            status = wuffs_base__make_status(wuffs_base__suspension__short_write);
84318
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9);
84319
            continue;
84320
          }
84321
          v_dmark = ((uint64_t)(iop_a_dst - io0_a_dst));
84322
          v_smark = ((uint64_t)(iop_a_src - io0_a_src));
84323
          if (self->private_impl.f_num_non_final_filters == 0u) {
84324
            {
84325
              if (a_dst) {
84326
                a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
84327
              }
84328
              if (a_src) {
84329
                a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
84330
              }
84331
              wuffs_base__status t_4 = wuffs_lzma__decoder__transform_io(&self->private_data.f_lzma, a_dst, a_src, a_workbuf);
84332
              v_status = t_4;
84333
              if (a_dst) {
84334
                iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
84335
              }
84336
              if (a_src) {
84337
                iop_a_src = a_src->data.ptr + a_src->meta.ri;
84338
              }
84339
            }
84340
          } else {
84341
            if (self->private_impl.f_bcj_undo_index > 0u) {
84342
              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));
84343
              self->private_impl.f_bcj_undo_index = 0u;
84344
            }
84345
            {
84346
              uint8_t* o_0_io0_a_dst = io0_a_dst;
84347
              uint8_t* o_0_io1_a_dst = io1_a_dst;
84348
              io0_a_dst = iop_a_dst;
84349
              io1_a_dst = iop_a_dst;
84350
              wuffs_base__io_buffer o_0_a_dst;
84351
              if (a_dst) {
84352
                memcpy(&o_0_a_dst, a_dst, sizeof(*a_dst));
84353
                size_t wi0 = a_dst->meta.wi;
84354
                a_dst->data.ptr += wi0;
84355
                a_dst->data.len -= wi0;
84356
                a_dst->meta.ri = 0;
84357
                a_dst->meta.wi = 0;
84358
                a_dst->meta.pos = wuffs_base__u64__sat_add(a_dst->meta.pos, wi0);
84359
              }
84360
              {
84361
                if (a_dst) {
84362
                  a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
84363
                }
84364
                if (a_src) {
84365
                  a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
84366
                }
84367
                wuffs_base__status t_5 = wuffs_lzma__decoder__transform_io(&self->private_data.f_lzma, a_dst, a_src, a_workbuf);
84368
                v_status = t_5;
84369
                if (a_dst) {
84370
                  iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
84371
                }
84372
                if (a_src) {
84373
                  iop_a_src = a_src->data.ptr + a_src->meta.ri;
84374
                }
84375
              }
84376
              if (a_dst) {
84377
                memcpy(a_dst, &o_0_a_dst, sizeof(*a_dst));
84378
                a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
84379
                io0_a_dst = o_0_io0_a_dst;
84380
                io1_a_dst = o_0_io1_a_dst;
84381
              }
84382
            }
84383
            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));
84384
            if ((self->private_impl.f_bcj_undo_index > 0u) &&  ! wuffs_base__status__is_ok(&v_status)) {
84385
              v_i8 = ((uint8_t)(self->private_impl.f_bcj_undo_index - 1u));
84386
              while (true) {
84387
                if ( ! (iop_a_dst > io1_a_dst)) {
84388
                  status = wuffs_base__make_status(wuffs_xz__error__internal_error_inconsistent_bcj_filter_state);
84389
                  goto exit;
84390
                }
84391
                self->private_data.f_filter_data[0u][v_i8] = iop_a_dst[-1];
84392
                iop_a_dst--;
84393
                if (v_i8 <= 0u) {
84394
                  break;
84395
                }
84396
#if defined(__GNUC__)
84397
#pragma GCC diagnostic push
84398
#pragma GCC diagnostic ignored "-Wconversion"
84399
#endif
84400
                v_i8 -= 1u;
84401
#if defined(__GNUC__)
84402
#pragma GCC diagnostic pop
84403
#endif
84404
              }
84405
            }
84406
          }
84407
          v_compressed_size += wuffs_private_impl__io__count_since(v_smark, ((uint64_t)(iop_a_src - io0_a_src)));
84408
          v_uncompressed_size += wuffs_private_impl__io__count_since(v_dmark, ((uint64_t)(iop_a_dst - io0_a_dst)));
84409
          if (self->private_impl.f_ignore_checksum) {
84410
          } else if (self->private_impl.f_checksummer == 1u) {
84411
            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));
84412
          } else if (self->private_impl.f_checksummer == 2u) {
84413
            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));
84414
          } else if (self->private_impl.f_checksummer == 3u) {
84415
            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));
84416
          }
84417
          if (wuffs_base__status__is_ok(&v_status)) {
84418
            break;
84419
          }
84420
          status = v_status;
84421
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10);
84422
        }
84423
        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))) {
84424
          status = wuffs_base__make_status(wuffs_xz__error__bad_block_header);
84425
          goto exit;
84426
        }
84427
        wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_compressed_size_for_index, v_compressed_size);
84428
        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])));
84429
        self->private_impl.f_verification_have_total_sizes[0u] += self->private_impl.f_compressed_size_for_index;
84430
        v_hash = ((uint32_t)((self->private_impl.f_compressed_size_for_index ^ (self->private_impl.f_compressed_size_for_index >> 32u))));
84431
        v_hash *= 3432918353u;
84432
        v_hash = (((uint32_t)(v_hash << 15u)) | (v_hash >> 17u));
84433
        v_hash *= 461845907u;
84434
        v_hash ^= self->private_impl.f_verification_have_hashed_sizes[0u];
84435
        v_hash = (((uint32_t)(v_hash << 13u)) | (v_hash >> 19u));
84436
        self->private_impl.f_verification_have_hashed_sizes[0u] = ((uint32_t)(((uint32_t)(v_hash * 5u)) + 3864292196u));
84437
        self->private_impl.f_verification_have_total_sizes[1u] += v_uncompressed_size;
84438
        v_hash = ((uint32_t)((v_uncompressed_size ^ (v_uncompressed_size >> 32u))));
84439
        v_hash *= 3432918353u;
84440
        v_hash = (((uint32_t)(v_hash << 15u)) | (v_hash >> 17u));
84441
        v_hash *= 461845907u;
84442
        v_hash ^= self->private_impl.f_verification_have_hashed_sizes[1u];
84443
        v_hash = (((uint32_t)(v_hash << 13u)) | (v_hash >> 19u));
84444
        self->private_impl.f_verification_have_hashed_sizes[1u] = ((uint32_t)(((uint32_t)(v_hash * 5u)) + 3864292196u));
84445
        while ((v_compressed_size & 3u) != 0u) {
84446
          {
84447
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11);
84448
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
84449
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
84450
              goto suspend;
84451
            }
84452
            uint8_t t_6 = *iop_a_src++;
84453
            v_c8 = t_6;
84454
          }
84455
          if (v_c8 != 0u) {
84456
            status = wuffs_base__make_status(wuffs_xz__error__bad_padding);
84457
            goto exit;
84458
          }
84459
          v_compressed_size += 1u;
84460
        }
84461
        self->private_impl.f_lzma_needs_reset = true;
84462
        if (self->private_impl.f_ignore_checksum) {
84463
          self->private_data.s_do_transform_io.scratch = ((uint32_t)(WUFFS_XZ__CHECKSUM_LENGTH[self->private_impl.f_checksummer]));
84464
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12);
84465
          if (self->private_data.s_do_transform_io.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
84466
            self->private_data.s_do_transform_io.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
84467
            iop_a_src = io2_a_src;
84468
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
84469
            goto suspend;
84470
          }
84471
          iop_a_src += self->private_data.s_do_transform_io.scratch;
84472
        } else if (self->private_impl.f_checksummer == 1u) {
84473
          {
84474
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13);
84475
            uint32_t t_7;
84476
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
84477
              t_7 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
84478
              iop_a_src += 4;
84479
            } else {
84480
              self->private_data.s_do_transform_io.scratch = 0;
84481
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14);
84482
              while (true) {
84483
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
84484
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
84485
                  goto suspend;
84486
                }
84487
                uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
84488
                uint32_t num_bits_7 = ((uint32_t)(*scratch >> 56));
84489
                *scratch <<= 8;
84490
                *scratch >>= 8;
84491
                *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_7;
84492
                if (num_bits_7 == 24) {
84493
                  t_7 = ((uint32_t)(*scratch));
84494
                  break;
84495
                }
84496
                num_bits_7 += 8u;
84497
                *scratch |= ((uint64_t)(num_bits_7)) << 56;
84498
              }
84499
            }
84500
            v_checksum32_want = t_7;
84501
          }
84502
          v_checksum32_have = wuffs_crc32__ieee_hasher__checksum_u32(&self->private_data.f_crc32);
84503
          if (v_checksum32_have != v_checksum32_want) {
84504
            status = wuffs_base__make_status(wuffs_xz__error__bad_checksum);
84505
            goto exit;
84506
          }
84507
        } else if (self->private_impl.f_checksummer == 2u) {
84508
          {
84509
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15);
84510
            uint64_t t_8;
84511
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) {
84512
              t_8 = wuffs_base__peek_u64le__no_bounds_check(iop_a_src);
84513
              iop_a_src += 8;
84514
            } else {
84515
              self->private_data.s_do_transform_io.scratch = 0;
84516
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16);
84517
              while (true) {
84518
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
84519
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
84520
                  goto suspend;
84521
                }
84522
                uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
84523
                uint32_t num_bits_8 = ((uint32_t)(*scratch >> 56));
84524
                *scratch <<= 8;
84525
                *scratch >>= 8;
84526
                *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_8;
84527
                if (num_bits_8 == 56) {
84528
                  t_8 = ((uint64_t)(*scratch));
84529
                  break;
84530
                }
84531
                num_bits_8 += 8u;
84532
                *scratch |= ((uint64_t)(num_bits_8)) << 56;
84533
              }
84534
            }
84535
            v_checksum64_want = t_8;
84536
          }
84537
          v_checksum64_have = wuffs_crc64__ecma_hasher__checksum_u64(&self->private_data.f_crc64);
84538
          if (v_checksum64_have != v_checksum64_want) {
84539
            status = wuffs_base__make_status(wuffs_xz__error__bad_checksum);
84540
            goto exit;
84541
          }
84542
        } else if (self->private_impl.f_checksummer == 3u) {
84543
          v_checksum256_have = wuffs_sha256__hasher__checksum_bitvec256(&self->private_data.f_sha256);
84544
          {
84545
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(17);
84546
            uint64_t t_9;
84547
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) {
84548
              t_9 = wuffs_base__peek_u64be__no_bounds_check(iop_a_src);
84549
              iop_a_src += 8;
84550
            } else {
84551
              self->private_data.s_do_transform_io.scratch = 0;
84552
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(18);
84553
              while (true) {
84554
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
84555
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
84556
                  goto suspend;
84557
                }
84558
                uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
84559
                uint32_t num_bits_9 = ((uint32_t)(*scratch & 0xFFu));
84560
                *scratch >>= 8;
84561
                *scratch <<= 8;
84562
                *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_9);
84563
                if (num_bits_9 == 56) {
84564
                  t_9 = ((uint64_t)(*scratch >> 0));
84565
                  break;
84566
                }
84567
                num_bits_9 += 8u;
84568
                *scratch |= ((uint64_t)(num_bits_9));
84569
              }
84570
            }
84571
            v_checksum64_want = t_9;
84572
          }
84573
          if (wuffs_base__bitvec256__get_u64(&v_checksum256_have, 3u) != v_checksum64_want) {
84574
            status = wuffs_base__make_status(wuffs_xz__error__bad_checksum);
84575
            goto exit;
84576
          }
84577
          {
84578
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(19);
84579
            uint64_t t_10;
84580
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) {
84581
              t_10 = wuffs_base__peek_u64be__no_bounds_check(iop_a_src);
84582
              iop_a_src += 8;
84583
            } else {
84584
              self->private_data.s_do_transform_io.scratch = 0;
84585
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(20);
84586
              while (true) {
84587
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
84588
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
84589
                  goto suspend;
84590
                }
84591
                uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
84592
                uint32_t num_bits_10 = ((uint32_t)(*scratch & 0xFFu));
84593
                *scratch >>= 8;
84594
                *scratch <<= 8;
84595
                *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_10);
84596
                if (num_bits_10 == 56) {
84597
                  t_10 = ((uint64_t)(*scratch >> 0));
84598
                  break;
84599
                }
84600
                num_bits_10 += 8u;
84601
                *scratch |= ((uint64_t)(num_bits_10));
84602
              }
84603
            }
84604
            v_checksum64_want = t_10;
84605
          }
84606
          if (wuffs_base__bitvec256__get_u64(&v_checksum256_have, 2u) != v_checksum64_want) {
84607
            status = wuffs_base__make_status(wuffs_xz__error__bad_checksum);
84608
            goto exit;
84609
          }
84610
          {
84611
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(21);
84612
            uint64_t t_11;
84613
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) {
84614
              t_11 = wuffs_base__peek_u64be__no_bounds_check(iop_a_src);
84615
              iop_a_src += 8;
84616
            } else {
84617
              self->private_data.s_do_transform_io.scratch = 0;
84618
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(22);
84619
              while (true) {
84620
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
84621
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
84622
                  goto suspend;
84623
                }
84624
                uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
84625
                uint32_t num_bits_11 = ((uint32_t)(*scratch & 0xFFu));
84626
                *scratch >>= 8;
84627
                *scratch <<= 8;
84628
                *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_11);
84629
                if (num_bits_11 == 56) {
84630
                  t_11 = ((uint64_t)(*scratch >> 0));
84631
                  break;
84632
                }
84633
                num_bits_11 += 8u;
84634
                *scratch |= ((uint64_t)(num_bits_11));
84635
              }
84636
            }
84637
            v_checksum64_want = t_11;
84638
          }
84639
          if (wuffs_base__bitvec256__get_u64(&v_checksum256_have, 1u) != v_checksum64_want) {
84640
            status = wuffs_base__make_status(wuffs_xz__error__bad_checksum);
84641
            goto exit;
84642
          }
84643
          {
84644
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(23);
84645
            uint64_t t_12;
84646
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) {
84647
              t_12 = wuffs_base__peek_u64be__no_bounds_check(iop_a_src);
84648
              iop_a_src += 8;
84649
            } else {
84650
              self->private_data.s_do_transform_io.scratch = 0;
84651
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(24);
84652
              while (true) {
84653
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
84654
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
84655
                  goto suspend;
84656
                }
84657
                uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
84658
                uint32_t num_bits_12 = ((uint32_t)(*scratch & 0xFFu));
84659
                *scratch >>= 8;
84660
                *scratch <<= 8;
84661
                *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_12);
84662
                if (num_bits_12 == 56) {
84663
                  t_12 = ((uint64_t)(*scratch >> 0));
84664
                  break;
84665
                }
84666
                num_bits_12 += 8u;
84667
                *scratch |= ((uint64_t)(num_bits_12));
84668
              }
84669
            }
84670
            v_checksum64_want = t_12;
84671
          }
84672
          if (wuffs_base__bitvec256__get_u64(&v_checksum256_have, 0u) != v_checksum64_want) {
84673
            status = wuffs_base__make_status(wuffs_xz__error__bad_checksum);
84674
            goto exit;
84675
          }
84676
        }
84677
      }
84678
      self->private_impl.f_backwards_size = 0u;
84679
      if ( ! self->private_impl.f_ignore_checksum) {
84680
        wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32,
84681
            sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
84682
      }
84683
      while (true) {
84684
        v_smark = ((uint64_t)(iop_a_src - io0_a_src));
84685
        {
84686
          if (a_src) {
84687
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
84688
          }
84689
          wuffs_base__status t_13 = wuffs_xz__decoder__verify_index(self, a_src);
84690
          v_status = t_13;
84691
          if (a_src) {
84692
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
84693
          }
84694
        }
84695
        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))));
84696
        if ( ! self->private_impl.f_ignore_checksum) {
84697
          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));
84698
        }
84699
        if (wuffs_base__status__is_ok(&v_status)) {
84700
          break;
84701
        }
84702
        status = v_status;
84703
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(25);
84704
      }
84705
      if ( ! self->private_impl.f_ignore_checksum) {
84706
        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))))));
84707
      }
84708
      while ((self->private_impl.f_backwards_size & 3u) != 0u) {
84709
        {
84710
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(26);
84711
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
84712
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
84713
            goto suspend;
84714
          }
84715
          uint8_t t_14 = *iop_a_src++;
84716
          v_c8 = t_14;
84717
        }
84718
        if (v_c8 != 0u) {
84719
          status = wuffs_base__make_status(wuffs_xz__error__bad_index);
84720
          goto exit;
84721
        }
84722
        self->private_impl.f_backwards_size += 1u;
84723
      }
84724
      self->private_impl.f_backwards_size >>= 2u;
84725
      if ((self->private_impl.f_backwards_size == 0u) || (self->private_impl.f_backwards_size > 4294967295u)) {
84726
        status = wuffs_base__make_status(wuffs_xz__error__bad_index);
84727
        goto exit;
84728
      }
84729
      {
84730
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(27);
84731
        uint32_t t_15;
84732
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
84733
          t_15 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
84734
          iop_a_src += 4;
84735
        } else {
84736
          self->private_data.s_do_transform_io.scratch = 0;
84737
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(28);
84738
          while (true) {
84739
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
84740
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
84741
              goto suspend;
84742
            }
84743
            uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
84744
            uint32_t num_bits_15 = ((uint32_t)(*scratch >> 56));
84745
            *scratch <<= 8;
84746
            *scratch >>= 8;
84747
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_15;
84748
            if (num_bits_15 == 24) {
84749
              t_15 = ((uint32_t)(*scratch));
84750
              break;
84751
            }
84752
            num_bits_15 += 8u;
84753
            *scratch |= ((uint64_t)(num_bits_15)) << 56;
84754
          }
84755
        }
84756
        v_checksum32_want = t_15;
84757
      }
84758
      if (self->private_impl.f_ignore_checksum) {
84759
      } else if (v_checksum32_want != wuffs_crc32__ieee_hasher__checksum_u32(&self->private_data.f_crc32)) {
84760
        status = wuffs_base__make_status(wuffs_xz__error__bad_checksum);
84761
        goto exit;
84762
      } else {
84763
        wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32,
84764
            sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
84765
      }
84766
      {
84767
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(29);
84768
        uint32_t t_16;
84769
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
84770
          t_16 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
84771
          iop_a_src += 4;
84772
        } else {
84773
          self->private_data.s_do_transform_io.scratch = 0;
84774
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(30);
84775
          while (true) {
84776
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
84777
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
84778
              goto suspend;
84779
            }
84780
            uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
84781
            uint32_t num_bits_16 = ((uint32_t)(*scratch >> 56));
84782
            *scratch <<= 8;
84783
            *scratch >>= 8;
84784
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_16;
84785
            if (num_bits_16 == 24) {
84786
              t_16 = ((uint32_t)(*scratch));
84787
              break;
84788
            }
84789
            num_bits_16 += 8u;
84790
            *scratch |= ((uint64_t)(num_bits_16)) << 56;
84791
          }
84792
        }
84793
        v_checksum32_want = t_16;
84794
      }
84795
      while (true) {
84796
        v_smark = ((uint64_t)(iop_a_src - io0_a_src));
84797
        {
84798
          if (a_src) {
84799
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
84800
          }
84801
          wuffs_base__status t_17 = wuffs_xz__decoder__verify_footer(self, a_src);
84802
          v_status = t_17;
84803
          if (a_src) {
84804
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
84805
          }
84806
        }
84807
        if ( ! self->private_impl.f_ignore_checksum) {
84808
          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));
84809
        }
84810
        if (wuffs_base__status__is_ok(&v_status)) {
84811
          break;
84812
        }
84813
        status = v_status;
84814
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(31);
84815
      }
84816
      if ( ! self->private_impl.f_ignore_checksum && (v_checksum32_want != wuffs_crc32__ieee_hasher__checksum_u32(&self->private_data.f_crc32))) {
84817
        status = wuffs_base__make_status(wuffs_xz__error__bad_checksum);
84818
        goto exit;
84819
      }
84820
      {
84821
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(32);
84822
        uint16_t t_18;
84823
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
84824
          t_18 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src);
84825
          iop_a_src += 2;
84826
        } else {
84827
          self->private_data.s_do_transform_io.scratch = 0;
84828
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(33);
84829
          while (true) {
84830
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
84831
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
84832
              goto suspend;
84833
            }
84834
            uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
84835
            uint32_t num_bits_18 = ((uint32_t)(*scratch >> 56));
84836
            *scratch <<= 8;
84837
            *scratch >>= 8;
84838
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_18;
84839
            if (num_bits_18 == 8) {
84840
              t_18 = ((uint16_t)(*scratch));
84841
              break;
84842
            }
84843
            num_bits_18 += 8u;
84844
            *scratch |= ((uint64_t)(num_bits_18)) << 56;
84845
          }
84846
        }
84847
        v_footer_magic = t_18;
84848
      }
84849
      if (v_footer_magic != 23129u) {
84850
        status = wuffs_base__make_status(wuffs_xz__error__bad_footer);
84851
        goto exit;
84852
      }
84853
      if ( ! self->private_impl.f_standalone_format) {
84854
        break;
84855
      }
84856
      while (true) {
84857
        while (((uint64_t)(io2_a_src - iop_a_src)) < 4u) {
84858
          if (a_src && a_src->meta.closed) {
84859
            if (((uint64_t)(io2_a_src - iop_a_src)) == 0u) {
84860
              goto label__streams__break;
84861
            } else {
84862
              status = wuffs_base__make_status(wuffs_xz__error__truncated_input);
84863
              goto exit;
84864
            }
84865
          }
84866
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
84867
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(34);
84868
        }
84869
        v_c32 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
84870
        if (v_c32 == 1484404733u) {
84871
          break;
84872
        } else if (v_c32 != 0u) {
84873
          status = wuffs_base__make_status(wuffs_xz__error__bad_header_concatenated_stream);
84874
          goto exit;
84875
        }
84876
        iop_a_src += 4u;
84877
      }
84878
      self->private_impl.f_started_verify_index = false;
84879
    }
84880
    label__streams__break:;
84881
84882
    ok:
84883
    self->private_impl.p_do_transform_io = 0;
84884
    goto exit;
84885
  }
84886
84887
  goto suspend;
84888
  suspend:
84889
  self->private_impl.p_do_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
84890
  self->private_data.s_do_transform_io.v_checksum32_have = v_checksum32_have;
84891
  self->private_data.s_do_transform_io.v_checksum32_want = v_checksum32_want;
84892
  self->private_data.s_do_transform_io.v_checksum256_have = v_checksum256_have;
84893
  self->private_data.s_do_transform_io.v_compressed_size = v_compressed_size;
84894
  self->private_data.s_do_transform_io.v_uncompressed_size = v_uncompressed_size;
84895
84896
  goto exit;
84897
  exit:
84898
  if (a_dst && a_dst->data.ptr) {
84899
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
84900
  }
84901
  if (a_src && a_src->data.ptr) {
84902
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
84903
  }
84904
84905
  return status;
84906
}
84907
84908
// -------- func xz.decoder.decode_block_header_with_padding
84909
84910
WUFFS_BASE__GENERATED_C_CODE
84911
static wuffs_base__status
84912
wuffs_xz__decoder__decode_block_header_with_padding(
84913
    wuffs_xz__decoder* self,
84914
    wuffs_base__io_buffer* a_src) {
84915
  wuffs_base__status status = wuffs_base__make_status(NULL);
84916
84917
  uint8_t v_c8 = 0;
84918
  uint64_t v_padded_size_have = 0;
84919
  uint64_t v_padded_size_want = 0;
84920
  uint64_t v_smark = 0;
84921
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
84922
84923
  const uint8_t* iop_a_src = NULL;
84924
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
84925
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
84926
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
84927
  if (a_src && a_src->data.ptr) {
84928
    io0_a_src = a_src->data.ptr;
84929
    io1_a_src = io0_a_src + a_src->meta.ri;
84930
    iop_a_src = io1_a_src;
84931
    io2_a_src = io0_a_src + a_src->meta.wi;
84932
  }
84933
84934
  uint32_t coro_susp_point = self->private_impl.p_decode_block_header_with_padding;
84935
  if (coro_susp_point) {
84936
    v_padded_size_have = self->private_data.s_decode_block_header_with_padding.v_padded_size_have;
84937
    v_padded_size_want = self->private_data.s_decode_block_header_with_padding.v_padded_size_want;
84938
  }
84939
  switch (coro_susp_point) {
84940
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
84941
84942
    {
84943
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
84944
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
84945
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
84946
        goto suspend;
84947
      }
84948
      uint8_t t_0 = *iop_a_src++;
84949
      v_c8 = t_0;
84950
    }
84951
    v_padded_size_want = ((uint64_t)((((uint64_t)(v_c8)) * 4u) - 1u));
84952
    while (true) {
84953
      v_smark = ((uint64_t)(iop_a_src - io0_a_src));
84954
      {
84955
        if (a_src) {
84956
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
84957
        }
84958
        wuffs_base__status t_1 = wuffs_xz__decoder__decode_block_header_sans_padding(self, a_src);
84959
        v_status = t_1;
84960
        if (a_src) {
84961
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
84962
        }
84963
      }
84964
      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))));
84965
      if (wuffs_base__status__is_ok(&v_status)) {
84966
        break;
84967
      }
84968
      status = v_status;
84969
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2);
84970
    }
84971
    if (v_padded_size_have > v_padded_size_want) {
84972
      status = wuffs_base__make_status(wuffs_xz__error__bad_block_header);
84973
      goto exit;
84974
    }
84975
    while (v_padded_size_have < v_padded_size_want) {
84976
      {
84977
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
84978
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
84979
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
84980
          goto suspend;
84981
        }
84982
        uint8_t t_2 = *iop_a_src++;
84983
        v_c8 = t_2;
84984
      }
84985
      if (v_c8 != 0u) {
84986
        status = wuffs_base__make_status(wuffs_xz__error__bad_block_header);
84987
        goto exit;
84988
      }
84989
      v_padded_size_have += 1u;
84990
    }
84991
84992
    ok:
84993
    self->private_impl.p_decode_block_header_with_padding = 0;
84994
    goto exit;
84995
  }
84996
84997
  goto suspend;
84998
  suspend:
84999
  self->private_impl.p_decode_block_header_with_padding = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
85000
  self->private_data.s_decode_block_header_with_padding.v_padded_size_have = v_padded_size_have;
85001
  self->private_data.s_decode_block_header_with_padding.v_padded_size_want = v_padded_size_want;
85002
85003
  goto exit;
85004
  exit:
85005
  if (a_src && a_src->data.ptr) {
85006
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
85007
  }
85008
85009
  return status;
85010
}
85011
85012
// -------- func xz.decoder.decode_block_header_sans_padding
85013
85014
WUFFS_BASE__GENERATED_C_CODE
85015
static wuffs_base__status
85016
wuffs_xz__decoder__decode_block_header_sans_padding(
85017
    wuffs_xz__decoder* self,
85018
    wuffs_base__io_buffer* a_src) {
85019
  wuffs_base__status status = wuffs_base__make_status(NULL);
85020
85021
  uint8_t v_c8 = 0;
85022
  uint32_t v_c32 = 0;
85023
  uint32_t v_alignment = 0;
85024
  uint8_t v_flags = 0;
85025
  uint8_t v_filter_id = 0;
85026
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
85027
  uint32_t v_shift = 0;
85028
  uint32_t v_f = 0;
85029
  uint32_t v_k = 0;
85030
85031
  const uint8_t* iop_a_src = NULL;
85032
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
85033
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
85034
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
85035
  if (a_src && a_src->data.ptr) {
85036
    io0_a_src = a_src->data.ptr;
85037
    io1_a_src = io0_a_src + a_src->meta.ri;
85038
    iop_a_src = io1_a_src;
85039
    io2_a_src = io0_a_src + a_src->meta.wi;
85040
  }
85041
85042
  uint32_t coro_susp_point = self->private_impl.p_decode_block_header_sans_padding;
85043
  if (coro_susp_point) {
85044
    v_flags = self->private_data.s_decode_block_header_sans_padding.v_flags;
85045
    v_filter_id = self->private_data.s_decode_block_header_sans_padding.v_filter_id;
85046
    v_shift = self->private_data.s_decode_block_header_sans_padding.v_shift;
85047
    v_f = self->private_data.s_decode_block_header_sans_padding.v_f;
85048
  }
85049
  switch (coro_susp_point) {
85050
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
85051
85052
    {
85053
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
85054
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
85055
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
85056
        goto suspend;
85057
      }
85058
      uint8_t t_0 = *iop_a_src++;
85059
      v_flags = t_0;
85060
    }
85061
    self->private_impl.f_num_non_final_filters = ((uint32_t)(((uint8_t)(v_flags & 3u))));
85062
    if (((uint8_t)(v_flags & 60u)) != 0u) {
85063
      status = wuffs_base__make_status(wuffs_xz__error__bad_block_header);
85064
      goto exit;
85065
    }
85066
    self->private_impl.f_block_has_compressed_size = (((uint8_t)(v_flags & 64u)) != 0u);
85067
    if (self->private_impl.f_block_has_compressed_size) {
85068
      self->private_impl.f_block_compressed_size = 0u;
85069
      v_shift = 0u;
85070
      while (true) {
85071
        {
85072
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
85073
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
85074
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
85075
            goto suspend;
85076
          }
85077
          uint8_t t_1 = *iop_a_src++;
85078
          v_c8 = t_1;
85079
        }
85080
        if (v_shift <= 56u) {
85081
          self->private_impl.f_block_compressed_size |= (((uint64_t)(((uint8_t)(v_c8 & 127u)))) << v_shift);
85082
          if (v_c8 >= 128u) {
85083
            v_shift += 7u;
85084
            continue;
85085
          } else if ((v_c8 == 0u) && (v_shift > 0u)) {
85086
            status = wuffs_base__make_status(wuffs_xz__error__bad_block_header);
85087
            goto exit;
85088
          }
85089
          break;
85090
        } else if (v_c8 != 1u) {
85091
          status = wuffs_base__make_status(wuffs_xz__error__bad_block_header);
85092
          goto exit;
85093
        }
85094
        self->private_impl.f_block_compressed_size |= (((uint64_t)(1u)) << 63u);
85095
        break;
85096
      }
85097
    }
85098
    self->private_impl.f_block_has_uncompressed_size = (((uint8_t)(v_flags & 128u)) != 0u);
85099
    if (self->private_impl.f_block_has_uncompressed_size) {
85100
      self->private_impl.f_block_uncompressed_size = 0u;
85101
      v_shift = 0u;
85102
      while (true) {
85103
        {
85104
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
85105
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
85106
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
85107
            goto suspend;
85108
          }
85109
          uint8_t t_2 = *iop_a_src++;
85110
          v_c8 = t_2;
85111
        }
85112
        if (v_shift <= 56u) {
85113
          self->private_impl.f_block_uncompressed_size |= (((uint64_t)(((uint8_t)(v_c8 & 127u)))) << v_shift);
85114
          if (v_c8 >= 128u) {
85115
            v_shift += 7u;
85116
            continue;
85117
          } else if ((v_c8 == 0u) && (v_shift > 0u)) {
85118
            status = wuffs_base__make_status(wuffs_xz__error__bad_block_header);
85119
            goto exit;
85120
          }
85121
          break;
85122
        } else if (v_c8 != 1u) {
85123
          status = wuffs_base__make_status(wuffs_xz__error__bad_block_header);
85124
          goto exit;
85125
        }
85126
        self->private_impl.f_block_uncompressed_size |= (((uint64_t)(1u)) << 63u);
85127
        break;
85128
      }
85129
    }
85130
    self->private_impl.f_bcj_x86_prev_mask = 0u;
85131
    self->private_impl.choosy_apply_non_final_filters = (
85132
        &wuffs_xz__decoder__apply_non_final_filters__choosy_default);
85133
    v_f = 0u;
85134
    while (v_f < self->private_impl.f_num_non_final_filters) {
85135
      {
85136
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
85137
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
85138
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
85139
          goto suspend;
85140
        }
85141
        uint8_t t_3 = *iop_a_src++;
85142
        v_filter_id = t_3;
85143
      }
85144
      if (v_filter_id == 33u) {
85145
        status = wuffs_base__make_status(wuffs_xz__error__bad_filter);
85146
        goto exit;
85147
      } else if (v_filter_id == 3u) {
85148
        {
85149
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
85150
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
85151
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
85152
            goto suspend;
85153
          }
85154
          uint8_t t_4 = *iop_a_src++;
85155
          v_c8 = t_4;
85156
        }
85157
        if (v_c8 != 1u) {
85158
          status = wuffs_base__make_status(wuffs_xz__error__bad_filter);
85159
          goto exit;
85160
        }
85161
        {
85162
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
85163
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
85164
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
85165
            goto suspend;
85166
          }
85167
          uint8_t t_5 = *iop_a_src++;
85168
          v_c8 = t_5;
85169
        }
85170
        self->private_impl.f_filters[v_f] = ((((uint32_t)(v_c8)) << 8u) | 3u);
85171
        v_k = 0u;
85172
        while (v_k < 256u) {
85173
          self->private_data.f_filter_data[v_f][v_k] = 0u;
85174
          v_k += 1u;
85175
        }
85176
      } else if ((v_filter_id < 3u) || (11u < v_filter_id)) {
85177
        status = wuffs_base__make_status(wuffs_xz__error__unsupported_filter);
85178
        goto exit;
85179
      } else if (v_f != 0u) {
85180
        status = wuffs_base__make_status(wuffs_xz__error__unsupported_filter_combination);
85181
        goto exit;
85182
      } else {
85183
        self->private_impl.f_filters[v_f] = ((uint32_t)(v_filter_id));
85184
        if (v_filter_id == 4u) {
85185
          self->private_impl.choosy_apply_non_final_filters = (
85186
              &wuffs_xz__decoder__apply_filter_04_x86);
85187
        } else if (v_filter_id == 5u) {
85188
          self->private_impl.choosy_apply_non_final_filters = (
85189
              &wuffs_xz__decoder__apply_filter_05_powerpc);
85190
        } else if (v_filter_id == 6u) {
85191
          self->private_impl.choosy_apply_non_final_filters = (
85192
              &wuffs_xz__decoder__apply_filter_06_ia64);
85193
        } else if (v_filter_id == 7u) {
85194
          self->private_impl.choosy_apply_non_final_filters = (
85195
              &wuffs_xz__decoder__apply_filter_07_arm);
85196
        } else if (v_filter_id == 8u) {
85197
          self->private_impl.choosy_apply_non_final_filters = (
85198
              &wuffs_xz__decoder__apply_filter_08_armthumb);
85199
        } else if (v_filter_id == 9u) {
85200
          self->private_impl.choosy_apply_non_final_filters = (
85201
              &wuffs_xz__decoder__apply_filter_09_sparc);
85202
        } else if (v_filter_id == 10u) {
85203
          self->private_impl.choosy_apply_non_final_filters = (
85204
              &wuffs_xz__decoder__apply_filter_0a_arm64);
85205
        } else {
85206
          self->private_impl.choosy_apply_non_final_filters = (
85207
              &wuffs_xz__decoder__apply_filter_0b_riscv);
85208
        }
85209
        {
85210
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
85211
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
85212
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
85213
            goto suspend;
85214
          }
85215
          uint8_t t_6 = *iop_a_src++;
85216
          v_c8 = t_6;
85217
        }
85218
        if (v_c8 == 0u) {
85219
          self->private_impl.f_bcj_pos = 0u;
85220
        } else if (v_c8 == 4u) {
85221
          {
85222
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
85223
            uint32_t t_7;
85224
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
85225
              t_7 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
85226
              iop_a_src += 4;
85227
            } else {
85228
              self->private_data.s_decode_block_header_sans_padding.scratch = 0;
85229
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
85230
              while (true) {
85231
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
85232
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
85233
                  goto suspend;
85234
                }
85235
                uint64_t* scratch = &self->private_data.s_decode_block_header_sans_padding.scratch;
85236
                uint32_t num_bits_7 = ((uint32_t)(*scratch >> 56));
85237
                *scratch <<= 8;
85238
                *scratch >>= 8;
85239
                *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_7;
85240
                if (num_bits_7 == 24) {
85241
                  t_7 = ((uint32_t)(*scratch));
85242
                  break;
85243
                }
85244
                num_bits_7 += 8u;
85245
                *scratch |= ((uint64_t)(num_bits_7)) << 56;
85246
              }
85247
            }
85248
            v_c32 = t_7;
85249
          }
85250
          v_alignment = ((uint32_t)(WUFFS_XZ__BCJ_OFFSET_ALIGNMENT[v_filter_id]));
85251
          if (v_alignment > 0u) {
85252
            if ((v_c32 % v_alignment) != 0u) {
85253
              status = wuffs_base__make_status(wuffs_xz__error__bad_bcj_offset);
85254
              goto exit;
85255
            }
85256
          }
85257
          self->private_impl.f_bcj_pos = v_c32;
85258
        } else {
85259
          status = wuffs_base__make_status(wuffs_xz__error__unsupported_filter);
85260
          goto exit;
85261
        }
85262
      }
85263
      v_f += 1u;
85264
    }
85265
    {
85266
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
85267
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
85268
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
85269
        goto suspend;
85270
      }
85271
      uint8_t t_8 = *iop_a_src++;
85272
      v_filter_id = t_8;
85273
    }
85274
    if (v_filter_id == 33u) {
85275
      if (self->private_impl.f_lzma_needs_reset) {
85276
        wuffs_private_impl__ignore_status(wuffs_lzma__decoder__initialize(&self->private_data.f_lzma,
85277
            sizeof (wuffs_lzma__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
85278
      }
85279
      {
85280
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11);
85281
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
85282
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
85283
          goto suspend;
85284
        }
85285
        uint8_t t_9 = *iop_a_src++;
85286
        v_c8 = t_9;
85287
      }
85288
      if (v_c8 != 1u) {
85289
        status = wuffs_base__make_status(wuffs_xz__error__bad_filter);
85290
        goto exit;
85291
      }
85292
      {
85293
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12);
85294
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
85295
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
85296
          goto suspend;
85297
        }
85298
        uint8_t t_10 = *iop_a_src++;
85299
        v_c8 = t_10;
85300
      }
85301
      v_status = wuffs_lzma__decoder__set_quirk(&self->private_data.f_lzma, 1290294273u, (2u | (((uint64_t)(v_c8)) << 8u)));
85302
      if ( ! wuffs_base__status__is_ok(&v_status)) {
85303
        status = wuffs_base__make_status(wuffs_xz__error__bad_filter);
85304
        goto exit;
85305
      }
85306
    } else if ((v_filter_id < 3u) || (11u < v_filter_id)) {
85307
      status = wuffs_base__make_status(wuffs_xz__error__unsupported_filter);
85308
      goto exit;
85309
    } else {
85310
      status = wuffs_base__make_status(wuffs_xz__error__bad_filter);
85311
      goto exit;
85312
    }
85313
85314
    goto ok;
85315
    ok:
85316
    self->private_impl.p_decode_block_header_sans_padding = 0;
85317
    goto exit;
85318
  }
85319
85320
  goto suspend;
85321
  suspend:
85322
  self->private_impl.p_decode_block_header_sans_padding = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
85323
  self->private_data.s_decode_block_header_sans_padding.v_flags = v_flags;
85324
  self->private_data.s_decode_block_header_sans_padding.v_filter_id = v_filter_id;
85325
  self->private_data.s_decode_block_header_sans_padding.v_shift = v_shift;
85326
  self->private_data.s_decode_block_header_sans_padding.v_f = v_f;
85327
85328
  goto exit;
85329
  exit:
85330
  if (a_src && a_src->data.ptr) {
85331
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
85332
  }
85333
85334
  return status;
85335
}
85336
85337
// -------- func xz.decoder.verify_index
85338
85339
WUFFS_BASE__GENERATED_C_CODE
85340
static wuffs_base__status
85341
wuffs_xz__decoder__verify_index(
85342
    wuffs_xz__decoder* self,
85343
    wuffs_base__io_buffer* a_src) {
85344
  wuffs_base__status status = wuffs_base__make_status(NULL);
85345
85346
  uint8_t v_c8 = 0;
85347
  uint32_t v_shift = 0;
85348
  uint32_t v_hash = 0;
85349
85350
  const uint8_t* iop_a_src = NULL;
85351
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
85352
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
85353
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
85354
  if (a_src && a_src->data.ptr) {
85355
    io0_a_src = a_src->data.ptr;
85356
    io1_a_src = io0_a_src + a_src->meta.ri;
85357
    iop_a_src = io1_a_src;
85358
    io2_a_src = io0_a_src + a_src->meta.wi;
85359
  }
85360
85361
  uint32_t coro_susp_point = self->private_impl.p_verify_index;
85362
  if (coro_susp_point) {
85363
    v_shift = self->private_data.s_verify_index.v_shift;
85364
  }
85365
  switch (coro_susp_point) {
85366
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
85367
85368
    if ( ! self->private_impl.f_started_verify_index) {
85369
      self->private_impl.f_started_verify_index = true;
85370
      {
85371
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
85372
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
85373
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
85374
          goto suspend;
85375
        }
85376
        uint8_t t_0 = *iop_a_src++;
85377
        v_c8 = t_0;
85378
      }
85379
      if (v_c8 != 0u) {
85380
        status = wuffs_base__make_status(wuffs_xz__error__bad_index);
85381
        goto exit;
85382
      }
85383
      self->private_impl.f_num_index_blocks = 0u;
85384
      v_shift = 0u;
85385
      while (true) {
85386
        {
85387
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
85388
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
85389
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
85390
            goto suspend;
85391
          }
85392
          uint8_t t_1 = *iop_a_src++;
85393
          v_c8 = t_1;
85394
        }
85395
        if (v_shift <= 56u) {
85396
          self->private_impl.f_num_index_blocks |= (((uint64_t)(((uint8_t)(v_c8 & 127u)))) << v_shift);
85397
          if (v_c8 >= 128u) {
85398
            v_shift += 7u;
85399
            continue;
85400
          } else if ((v_c8 == 0u) && (v_shift > 0u)) {
85401
            status = wuffs_base__make_status(wuffs_xz__error__bad_index);
85402
            goto exit;
85403
          }
85404
          break;
85405
        } else if (v_c8 != 1u) {
85406
          status = wuffs_base__make_status(wuffs_xz__error__bad_index);
85407
          goto exit;
85408
        }
85409
        self->private_impl.f_num_index_blocks |= (((uint64_t)(1u)) << 63u);
85410
        break;
85411
      }
85412
      if (self->private_impl.f_num_index_blocks != self->private_impl.f_num_actual_blocks) {
85413
        status = wuffs_base__make_status(wuffs_xz__error__bad_index);
85414
        goto exit;
85415
      }
85416
    }
85417
    while (self->private_impl.f_num_index_blocks > 0u) {
85418
      self->private_impl.f_num_index_blocks -= 1u;
85419
      self->private_impl.f_index_block_compressed_size = 0u;
85420
      v_shift = 0u;
85421
      while (true) {
85422
        {
85423
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
85424
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
85425
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
85426
            goto suspend;
85427
          }
85428
          uint8_t t_2 = *iop_a_src++;
85429
          v_c8 = t_2;
85430
        }
85431
        if (v_shift <= 56u) {
85432
          self->private_impl.f_index_block_compressed_size |= (((uint64_t)(((uint8_t)(v_c8 & 127u)))) << v_shift);
85433
          if (v_c8 >= 128u) {
85434
            v_shift += 7u;
85435
            continue;
85436
          } else if ((v_c8 == 0u) && (v_shift > 0u)) {
85437
            status = wuffs_base__make_status(wuffs_xz__error__bad_index);
85438
            goto exit;
85439
          }
85440
          break;
85441
        } else if (v_c8 != 1u) {
85442
          status = wuffs_base__make_status(wuffs_xz__error__bad_index);
85443
          goto exit;
85444
        }
85445
        self->private_impl.f_index_block_compressed_size |= (((uint64_t)(1u)) << 63u);
85446
        break;
85447
      }
85448
      self->private_impl.f_index_block_uncompressed_size = 0u;
85449
      v_shift = 0u;
85450
      while (true) {
85451
        {
85452
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
85453
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
85454
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
85455
            goto suspend;
85456
          }
85457
          uint8_t t_3 = *iop_a_src++;
85458
          v_c8 = t_3;
85459
        }
85460
        if (v_shift <= 56u) {
85461
          self->private_impl.f_index_block_uncompressed_size |= (((uint64_t)(((uint8_t)(v_c8 & 127u)))) << v_shift);
85462
          if (v_c8 >= 128u) {
85463
            v_shift += 7u;
85464
            continue;
85465
          } else if ((v_c8 == 0u) && (v_shift > 0u)) {
85466
            status = wuffs_base__make_status(wuffs_xz__error__bad_index);
85467
            goto exit;
85468
          }
85469
          break;
85470
        } else if (v_c8 != 1u) {
85471
          status = wuffs_base__make_status(wuffs_xz__error__bad_index);
85472
          goto exit;
85473
        }
85474
        self->private_impl.f_index_block_uncompressed_size |= (((uint64_t)(1u)) << 63u);
85475
        break;
85476
      }
85477
      self->private_impl.f_verification_want_total_sizes[0u] += self->private_impl.f_index_block_compressed_size;
85478
      v_hash = ((uint32_t)((self->private_impl.f_index_block_compressed_size ^ (self->private_impl.f_index_block_compressed_size >> 32u))));
85479
      v_hash *= 3432918353u;
85480
      v_hash = (((uint32_t)(v_hash << 15u)) | (v_hash >> 17u));
85481
      v_hash *= 461845907u;
85482
      v_hash ^= self->private_impl.f_verification_want_hashed_sizes[0u];
85483
      v_hash = (((uint32_t)(v_hash << 13u)) | (v_hash >> 19u));
85484
      self->private_impl.f_verification_want_hashed_sizes[0u] = ((uint32_t)(((uint32_t)(v_hash * 5u)) + 3864292196u));
85485
      self->private_impl.f_verification_want_total_sizes[1u] += self->private_impl.f_index_block_uncompressed_size;
85486
      v_hash = ((uint32_t)((self->private_impl.f_index_block_uncompressed_size ^ (self->private_impl.f_index_block_uncompressed_size >> 32u))));
85487
      v_hash *= 3432918353u;
85488
      v_hash = (((uint32_t)(v_hash << 15u)) | (v_hash >> 17u));
85489
      v_hash *= 461845907u;
85490
      v_hash ^= self->private_impl.f_verification_want_hashed_sizes[1u];
85491
      v_hash = (((uint32_t)(v_hash << 13u)) | (v_hash >> 19u));
85492
      self->private_impl.f_verification_want_hashed_sizes[1u] = ((uint32_t)(((uint32_t)(v_hash * 5u)) + 3864292196u));
85493
    }
85494
    if ((self->private_impl.f_verification_have_hashed_sizes[0u] != self->private_impl.f_verification_want_hashed_sizes[0u]) ||
85495
        (self->private_impl.f_verification_have_hashed_sizes[1u] != self->private_impl.f_verification_want_hashed_sizes[1u]) ||
85496
        (self->private_impl.f_verification_have_total_sizes[0u] != self->private_impl.f_verification_want_total_sizes[0u]) ||
85497
        (self->private_impl.f_verification_have_total_sizes[1u] != self->private_impl.f_verification_want_total_sizes[1u])) {
85498
      status = wuffs_base__make_status(wuffs_xz__error__bad_index);
85499
      goto exit;
85500
    }
85501
85502
    goto ok;
85503
    ok:
85504
    self->private_impl.p_verify_index = 0;
85505
    goto exit;
85506
  }
85507
85508
  goto suspend;
85509
  suspend:
85510
  self->private_impl.p_verify_index = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
85511
  self->private_data.s_verify_index.v_shift = v_shift;
85512
85513
  goto exit;
85514
  exit:
85515
  if (a_src && a_src->data.ptr) {
85516
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
85517
  }
85518
85519
  return status;
85520
}
85521
85522
// -------- func xz.decoder.verify_footer
85523
85524
WUFFS_BASE__GENERATED_C_CODE
85525
static wuffs_base__status
85526
wuffs_xz__decoder__verify_footer(
85527
    wuffs_xz__decoder* self,
85528
    wuffs_base__io_buffer* a_src) {
85529
  wuffs_base__status status = wuffs_base__make_status(NULL);
85530
85531
  uint32_t v_c32 = 0;
85532
85533
  const uint8_t* iop_a_src = NULL;
85534
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
85535
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
85536
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
85537
  if (a_src && a_src->data.ptr) {
85538
    io0_a_src = a_src->data.ptr;
85539
    io1_a_src = io0_a_src + a_src->meta.ri;
85540
    iop_a_src = io1_a_src;
85541
    io2_a_src = io0_a_src + a_src->meta.wi;
85542
  }
85543
85544
  uint32_t coro_susp_point = self->private_impl.p_verify_footer;
85545
  switch (coro_susp_point) {
85546
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
85547
85548
    {
85549
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
85550
      uint32_t t_0;
85551
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
85552
        t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
85553
        iop_a_src += 4;
85554
      } else {
85555
        self->private_data.s_verify_footer.scratch = 0;
85556
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
85557
        while (true) {
85558
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
85559
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
85560
            goto suspend;
85561
          }
85562
          uint64_t* scratch = &self->private_data.s_verify_footer.scratch;
85563
          uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
85564
          *scratch <<= 8;
85565
          *scratch >>= 8;
85566
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
85567
          if (num_bits_0 == 24) {
85568
            t_0 = ((uint32_t)(*scratch));
85569
            break;
85570
          }
85571
          num_bits_0 += 8u;
85572
          *scratch |= ((uint64_t)(num_bits_0)) << 56;
85573
        }
85574
      }
85575
      v_c32 = t_0;
85576
    }
85577
    if (v_c32 != ((uint32_t)(self->private_impl.f_backwards_size))) {
85578
      status = wuffs_base__make_status(wuffs_xz__error__bad_footer);
85579
      goto exit;
85580
    }
85581
    {
85582
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
85583
      uint32_t t_1;
85584
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
85585
        t_1 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
85586
        iop_a_src += 2;
85587
      } else {
85588
        self->private_data.s_verify_footer.scratch = 0;
85589
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
85590
        while (true) {
85591
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
85592
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
85593
            goto suspend;
85594
          }
85595
          uint64_t* scratch = &self->private_data.s_verify_footer.scratch;
85596
          uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
85597
          *scratch <<= 8;
85598
          *scratch >>= 8;
85599
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
85600
          if (num_bits_1 == 8) {
85601
            t_1 = ((uint32_t)(*scratch));
85602
            break;
85603
          }
85604
          num_bits_1 += 8u;
85605
          *scratch |= ((uint64_t)(num_bits_1)) << 56;
85606
        }
85607
      }
85608
      v_c32 = t_1;
85609
    }
85610
    if (v_c32 != ((uint32_t)(self->private_impl.f_flags))) {
85611
      status = wuffs_base__make_status(wuffs_xz__error__bad_footer);
85612
      goto exit;
85613
    }
85614
85615
    goto ok;
85616
    ok:
85617
    self->private_impl.p_verify_footer = 0;
85618
    goto exit;
85619
  }
85620
85621
  goto suspend;
85622
  suspend:
85623
  self->private_impl.p_verify_footer = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
85624
85625
  goto exit;
85626
  exit:
85627
  if (a_src && a_src->data.ptr) {
85628
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
85629
  }
85630
85631
  return status;
85632
}
85633
85634
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XZ)
85635
85636
#if defined(__cplusplus) && defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
85637
85638
// ---------------- Auxiliary - Base
85639
85640
// Auxiliary code is discussed at
85641
// https://github.com/google/wuffs/blob/main/doc/note/auxiliary-code.md
85642
85643
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__AUX__BASE)
85644
85645
namespace wuffs_aux {
85646
85647
namespace sync_io {
85648
85649
// --------
85650
85651
DynIOBuffer::DynIOBuffer(uint64_t max_incl)
85652
    : m_buf(wuffs_base__empty_io_buffer()), m_max_incl(max_incl) {}
85653
85654
DynIOBuffer::~DynIOBuffer() {
85655
  free(m_buf.data.ptr);
85656
}
85657
85658
void  //
85659
DynIOBuffer::drop() {
85660
  free(m_buf.data.ptr);
85661
  m_buf = wuffs_base__empty_io_buffer();
85662
}
85663
85664
DynIOBuffer::GrowResult  //
85665
DynIOBuffer::grow(uint64_t min_incl) {
85666
  uint64_t n = round_up(min_incl, m_max_incl);
85667
  if (n == 0) {
85668
    return ((min_incl == 0) && (m_max_incl == 0))
85669
               ? DynIOBuffer::GrowResult::OK
85670
               : DynIOBuffer::GrowResult::FailedMaxInclExceeded;
85671
  } else if (n > SIZE_MAX) {
85672
    return DynIOBuffer::GrowResult::FailedOutOfMemory;
85673
  } else if (n > m_buf.data.len) {
85674
    uint8_t* ptr =
85675
        static_cast<uint8_t*>(realloc(m_buf.data.ptr, static_cast<size_t>(n)));
85676
    if (!ptr) {
85677
      return DynIOBuffer::GrowResult::FailedOutOfMemory;
85678
    }
85679
    m_buf.data.ptr = ptr;
85680
    m_buf.data.len = static_cast<size_t>(n);
85681
  }
85682
  return DynIOBuffer::GrowResult::OK;
85683
}
85684
85685
// round_up rounds min_incl up, returning the smallest value x satisfying
85686
// (min_incl <= x) and (x <= max_incl) and some other constraints. It returns 0
85687
// if there is no such x.
85688
//
85689
// When max_incl <= 4096, the other constraints are:
85690
//  - (x == max_incl)
85691
//
85692
// When max_incl >  4096, the other constraints are:
85693
//  - (x == max_incl) or (x is a power of 2)
85694
//  - (x >= 4096)
85695
uint64_t  //
85696
DynIOBuffer::round_up(uint64_t min_incl, uint64_t max_incl) {
85697
  if (min_incl > max_incl) {
85698
    return 0;
85699
  }
85700
  uint64_t n = 4096;
85701
  if (n >= max_incl) {
85702
    return max_incl;
85703
  }
85704
  while (n < min_incl) {
85705
    if (n >= (max_incl / 2)) {
85706
      return max_incl;
85707
    }
85708
    n *= 2;
85709
  }
85710
  return n;
85711
}
85712
85713
// --------
85714
85715
Input::~Input() {}
85716
85717
IOBuffer*  //
85718
Input::BringsItsOwnIOBuffer() {
85719
  return nullptr;
85720
}
85721
85722
// --------
85723
85724
FileInput::FileInput(FILE* f) : m_f(f) {}
85725
85726
std::string  //
85727
FileInput::CopyIn(IOBuffer* dst) {
85728
  if (!m_f) {
85729
    return "wuffs_aux::sync_io::FileInput: nullptr file";
85730
  } else if (!dst) {
85731
    return "wuffs_aux::sync_io::FileInput: nullptr IOBuffer";
85732
  } else if (dst->meta.closed) {
85733
    return "wuffs_aux::sync_io::FileInput: end of file";
85734
  } else {
85735
    dst->compact();
85736
    size_t n = fread(dst->writer_pointer(), 1, dst->writer_length(), m_f);
85737
    dst->meta.wi += n;
85738
    dst->meta.closed = feof(m_f);
85739
    if (ferror(m_f)) {
85740
      return "wuffs_aux::sync_io::FileInput: error reading file";
85741
    }
85742
  }
85743
  return "";
85744
}
85745
85746
// --------
85747
85748
MemoryInput::MemoryInput(const char* ptr, size_t len)
85749
    : m_io(wuffs_base__ptr_u8__reader(
85750
          static_cast<uint8_t*>(static_cast<void*>(const_cast<char*>(ptr))),
85751
          len,
85752
          true)) {}
85753
85754
MemoryInput::MemoryInput(const uint8_t* ptr, size_t len)
85755
    : m_io(wuffs_base__ptr_u8__reader(const_cast<uint8_t*>(ptr), len, true)) {}
85756
85757
IOBuffer*  //
85758
MemoryInput::BringsItsOwnIOBuffer() {
85759
  return &m_io;
85760
}
85761
85762
std::string  //
85763
MemoryInput::CopyIn(IOBuffer* dst) {
85764
  if (!dst) {
85765
    return "wuffs_aux::sync_io::MemoryInput: nullptr IOBuffer";
85766
  } else if (dst->meta.closed) {
85767
    return "wuffs_aux::sync_io::MemoryInput: end of file";
85768
  } else if (wuffs_base__slice_u8__overlaps(dst->data, m_io.data)) {
85769
    // Treat m_io's data as immutable, so don't compact dst or otherwise write
85770
    // to it.
85771
    return "wuffs_aux::sync_io::MemoryInput: overlapping buffers";
85772
  } else {
85773
    dst->compact();
85774
    size_t nd = dst->writer_length();
85775
    size_t ns = m_io.reader_length();
85776
    size_t n = (nd < ns) ? nd : ns;
85777
    memcpy(dst->writer_pointer(), m_io.reader_pointer(), n);
85778
    m_io.meta.ri += n;
85779
    dst->meta.wi += n;
85780
    dst->meta.closed = m_io.reader_length() == 0;
85781
  }
85782
  return "";
85783
}
85784
85785
// --------
85786
85787
}  // namespace sync_io
85788
85789
namespace private_impl {
85790
85791
struct ErrorMessages {
85792
  const char* max_incl_metadata_length_exceeded;
85793
  const char* out_of_memory;
85794
  const char* unexpected_end_of_file;
85795
  const char* unsupported_metadata;
85796
  const char* unsupported_negative_advance;
85797
85798
  // If adding new "const char*" typed fields to this struct, either add them
85799
  // after existing fields or, if re-ordering fields, make sure that you update
85800
  // all of the "const private_impl::ErrorMessages FooBarErrorMessages" values
85801
  // in all of the sibling *.cc files.
85802
85803
  static inline const char* resolve(const char* s) {
85804
    return s ? s : "wuffs_aux::private_impl: unknown error";
85805
  };
85806
};
85807
85808
std::string  //
85809
AdvanceIOBufferTo(const ErrorMessages& error_messages,
85810
                  sync_io::Input& input,
85811
                  IOBuffer& io_buf,
85812
                  uint64_t absolute_position) {
85813
  if (absolute_position < io_buf.reader_position()) {
85814
    return error_messages.resolve(error_messages.unsupported_negative_advance);
85815
  }
85816
  while (true) {
85817
    uint64_t relative_position = absolute_position - io_buf.reader_position();
85818
    if (relative_position <= io_buf.reader_length()) {
85819
      io_buf.meta.ri += (size_t)relative_position;
85820
      break;
85821
    } else if (io_buf.meta.closed) {
85822
      return error_messages.resolve(error_messages.unexpected_end_of_file);
85823
    }
85824
    io_buf.meta.ri = io_buf.meta.wi;
85825
    if (!input.BringsItsOwnIOBuffer()) {
85826
      io_buf.compact();
85827
    }
85828
    std::string error_message = input.CopyIn(&io_buf);
85829
    if (!error_message.empty()) {
85830
      return error_message;
85831
    }
85832
  }
85833
  return "";
85834
}
85835
85836
std::string  //
85837
HandleMetadata(
85838
    const ErrorMessages& error_messages,
85839
    sync_io::Input& input,
85840
    wuffs_base__io_buffer& io_buf,
85841
    sync_io::DynIOBuffer& raw,
85842
    wuffs_base__status (*tell_me_more_func)(void*,
85843
                                            wuffs_base__io_buffer*,
85844
                                            wuffs_base__more_information*,
85845
                                            wuffs_base__io_buffer*),
85846
    void* tell_me_more_receiver,
85847
    std::string (*handle_metadata_func)(void*,
85848
                                        const wuffs_base__more_information*,
85849
                                        wuffs_base__slice_u8),
85850
    void* handle_metadata_receiver) {
85851
  wuffs_base__more_information minfo = wuffs_base__empty_more_information();
85852
  // Reset raw but keep its backing array (the raw.m_buf.data slice).
85853
  raw.m_buf.meta = wuffs_base__empty_io_buffer_meta();
85854
85855
  while (true) {
85856
    minfo = wuffs_base__empty_more_information();
85857
    wuffs_base__status status = (*tell_me_more_func)(
85858
        tell_me_more_receiver, &raw.m_buf, &minfo, &io_buf);
85859
    switch (minfo.flavor) {
85860
      case 0:
85861
      case WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA_RAW_TRANSFORM:
85862
      case WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA_PARSED:
85863
        break;
85864
85865
      case WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA_RAW_PASSTHROUGH: {
85866
        wuffs_base__range_ie_u64 r = minfo.metadata_raw_passthrough__range();
85867
        if (r.is_empty()) {
85868
          break;
85869
        }
85870
        uint64_t num_to_copy = r.length();
85871
        if (num_to_copy > (raw.m_max_incl - raw.m_buf.meta.wi)) {
85872
          return error_messages.resolve(
85873
              error_messages.max_incl_metadata_length_exceeded);
85874
        } else if (num_to_copy > (raw.m_buf.data.len - raw.m_buf.meta.wi)) {
85875
          switch (raw.grow(num_to_copy + raw.m_buf.meta.wi)) {
85876
            case sync_io::DynIOBuffer::GrowResult::OK:
85877
              break;
85878
            case sync_io::DynIOBuffer::GrowResult::FailedMaxInclExceeded:
85879
              return error_messages.resolve(
85880
                  error_messages.max_incl_metadata_length_exceeded);
85881
            case sync_io::DynIOBuffer::GrowResult::FailedOutOfMemory:
85882
              return error_messages.resolve(error_messages.out_of_memory);
85883
          }
85884
        }
85885
85886
        if (io_buf.reader_position() > r.min_incl) {
85887
          return error_messages.resolve(error_messages.unsupported_metadata);
85888
        } else {
85889
          std::string error_message =
85890
              AdvanceIOBufferTo(error_messages, input, io_buf, r.min_incl);
85891
          if (!error_message.empty()) {
85892
            return error_message;
85893
          }
85894
        }
85895
85896
        while (true) {
85897
          uint64_t n =
85898
              wuffs_base__u64__min(num_to_copy, io_buf.reader_length());
85899
          memcpy(raw.m_buf.writer_pointer(), io_buf.reader_pointer(), n);
85900
          raw.m_buf.meta.wi += n;
85901
          io_buf.meta.ri += n;
85902
          num_to_copy -= n;
85903
          if (num_to_copy == 0) {
85904
            break;
85905
          } else if (io_buf.meta.closed) {
85906
            return error_messages.resolve(
85907
                error_messages.unexpected_end_of_file);
85908
          } else if (!input.BringsItsOwnIOBuffer()) {
85909
            io_buf.compact();
85910
          }
85911
          std::string error_message = input.CopyIn(&io_buf);
85912
          if (!error_message.empty()) {
85913
            return error_message;
85914
          }
85915
        }
85916
        break;
85917
      }
85918
85919
      default:
85920
        return error_messages.resolve(error_messages.unsupported_metadata);
85921
    }
85922
85923
    if (status.repr == nullptr) {
85924
      break;
85925
    } else if (status.repr != wuffs_base__suspension__even_more_information) {
85926
      if (status.repr != wuffs_base__suspension__short_write) {
85927
        return status.message();
85928
      }
85929
      switch (raw.grow(wuffs_base__u64__sat_add(raw.m_buf.data.len, 1))) {
85930
        case sync_io::DynIOBuffer::GrowResult::OK:
85931
          break;
85932
        case sync_io::DynIOBuffer::GrowResult::FailedMaxInclExceeded:
85933
          return error_messages.resolve(
85934
              error_messages.max_incl_metadata_length_exceeded);
85935
        case sync_io::DynIOBuffer::GrowResult::FailedOutOfMemory:
85936
          return error_messages.resolve(error_messages.out_of_memory);
85937
      }
85938
    }
85939
  }
85940
85941
  return (*handle_metadata_func)(handle_metadata_receiver, &minfo,
85942
                                 raw.m_buf.reader_slice());
85943
}
85944
85945
}  // namespace private_impl
85946
85947
}  // namespace wuffs_aux
85948
85949
#endif  // !defined(WUFFS_CONFIG__MODULES) ||
85950
        // defined(WUFFS_CONFIG__MODULE__AUX__BASE)
85951
85952
// ---------------- Auxiliary - CBOR
85953
85954
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__AUX__CBOR)
85955
85956
#include <utility>
85957
85958
namespace wuffs_aux {
85959
85960
DecodeCborResult::DecodeCborResult(std::string&& error_message0,
85961
                                   uint64_t cursor_position0)
85962
    : error_message(std::move(error_message0)),
85963
      cursor_position(cursor_position0) {}
85964
85965
DecodeCborCallbacks::~DecodeCborCallbacks() {}
85966
85967
void  //
85968
DecodeCborCallbacks::Done(DecodeCborResult& result,
85969
                          sync_io::Input& input,
85970
                          IOBuffer& buffer) {}
85971
85972
DecodeCborArgQuirks::DecodeCborArgQuirks(const QuirkKeyValuePair* ptr0,
85973
                                         const size_t len0)
85974
    : ptr(ptr0), len(len0) {}
85975
85976
DecodeCborArgQuirks  //
85977
DecodeCborArgQuirks::DefaultValue() {
85978
  return DecodeCborArgQuirks(nullptr, 0);
85979
}
85980
85981
DecodeCborResult  //
85982
DecodeCbor(DecodeCborCallbacks& callbacks,
85983
           sync_io::Input& input,
85984
           DecodeCborArgQuirks quirks) {
85985
  // Prepare the wuffs_base__io_buffer and the resultant error_message.
85986
  wuffs_base__io_buffer* io_buf = input.BringsItsOwnIOBuffer();
85987
  wuffs_base__io_buffer fallback_io_buf = wuffs_base__empty_io_buffer();
85988
  std::unique_ptr<uint8_t[]> fallback_io_array(nullptr);
85989
  if (!io_buf) {
85990
    fallback_io_array = std::unique_ptr<uint8_t[]>(new uint8_t[4096]);
85991
    fallback_io_buf = wuffs_base__ptr_u8__writer(fallback_io_array.get(), 4096);
85992
    io_buf = &fallback_io_buf;
85993
  }
85994
  // cursor_index is discussed at
85995
  // https://nigeltao.github.io/blog/2020/jsonptr.html#the-cursor-index
85996
  size_t cursor_index = 0;
85997
  std::string ret_error_message;
85998
  std::string io_error_message;
85999
86000
  do {
86001
    // Prepare the low-level CBOR decoder.
86002
    wuffs_cbor__decoder::unique_ptr dec = wuffs_cbor__decoder::alloc();
86003
    if (!dec) {
86004
      ret_error_message = "wuffs_aux::DecodeCbor: out of memory";
86005
      goto done;
86006
    }
86007
    for (size_t i = 0; i < quirks.len; i++) {
86008
      dec->set_quirk(quirks.ptr[i].first, quirks.ptr[i].second);
86009
    }
86010
86011
    // Prepare the wuffs_base__tok_buffer. 256 tokens is 2KiB.
86012
    wuffs_base__token tok_array[256];
86013
    wuffs_base__token_buffer tok_buf =
86014
        wuffs_base__slice_token__writer(wuffs_base__make_slice_token(
86015
            &tok_array[0], (sizeof(tok_array) / sizeof(tok_array[0]))));
86016
    wuffs_base__status tok_status = wuffs_base__make_status(nullptr);
86017
86018
    // Prepare other state.
86019
    int32_t depth = 0;
86020
    std::string str;
86021
    int64_t extension_category = 0;
86022
    uint64_t extension_detail = 0;
86023
86024
    // Valid token's VBCs range in 0 ..= 15. Values over that are for tokens
86025
    // from outside of the base package, such as the CBOR package.
86026
    constexpr int64_t EXT_CAT__CBOR_TAG = 16;
86027
86028
    // Loop, doing these two things:
86029
    //  1. Get the next token.
86030
    //  2. Process that token.
86031
    while (true) {
86032
      // 1. Get the next token.
86033
86034
      while (tok_buf.meta.ri >= tok_buf.meta.wi) {
86035
        if (tok_status.repr == nullptr) {
86036
          // No-op.
86037
        } else if (tok_status.repr == wuffs_base__suspension__short_write) {
86038
          tok_buf.compact();
86039
        } else if (tok_status.repr == wuffs_base__suspension__short_read) {
86040
          // Read from input to io_buf.
86041
          if (!io_error_message.empty()) {
86042
            ret_error_message = std::move(io_error_message);
86043
            goto done;
86044
          } else if (cursor_index != io_buf->meta.ri) {
86045
            ret_error_message =
86046
                "wuffs_aux::DecodeCbor: internal error: bad cursor_index";
86047
            goto done;
86048
          } else if (io_buf->meta.closed) {
86049
            ret_error_message =
86050
                "wuffs_aux::DecodeCbor: internal error: io_buf is closed";
86051
            goto done;
86052
          }
86053
          io_buf->compact();
86054
          if (io_buf->meta.wi >= io_buf->data.len) {
86055
            ret_error_message =
86056
                "wuffs_aux::DecodeCbor: internal error: io_buf is full";
86057
            goto done;
86058
          }
86059
          cursor_index = io_buf->meta.ri;
86060
          io_error_message = input.CopyIn(io_buf);
86061
        } else {
86062
          ret_error_message = tok_status.message();
86063
          goto done;
86064
        }
86065
86066
        if (WUFFS_CBOR__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE != 0) {
86067
          ret_error_message =
86068
              "wuffs_aux::DecodeCbor: internal error: bad WORKBUF_LEN";
86069
          goto done;
86070
        }
86071
        wuffs_base__slice_u8 work_buf = wuffs_base__empty_slice_u8();
86072
        tok_status = dec->decode_tokens(&tok_buf, io_buf, work_buf);
86073
        if ((tok_buf.meta.ri > tok_buf.meta.wi) ||
86074
            (tok_buf.meta.wi > tok_buf.data.len) ||
86075
            (io_buf->meta.ri > io_buf->meta.wi) ||
86076
            (io_buf->meta.wi > io_buf->data.len)) {
86077
          ret_error_message =
86078
              "wuffs_aux::DecodeCbor: internal error: bad buffer indexes";
86079
          goto done;
86080
        }
86081
      }
86082
86083
      wuffs_base__token token = tok_buf.data.ptr[tok_buf.meta.ri++];
86084
      uint64_t token_len = token.length();
86085
      if ((io_buf->meta.ri < cursor_index) ||
86086
          ((io_buf->meta.ri - cursor_index) < token_len)) {
86087
        ret_error_message =
86088
            "wuffs_aux::DecodeCbor: internal error: bad token indexes";
86089
        goto done;
86090
      }
86091
      uint8_t* token_ptr = io_buf->data.ptr + cursor_index;
86092
      cursor_index += static_cast<size_t>(token_len);
86093
86094
      // 2. Process that token.
86095
86096
      uint64_t vbd = token.value_base_detail();
86097
86098
      if (extension_category != 0) {
86099
        int64_t ext = token.value_extension();
86100
        if ((ext >= 0) && !token.continued()) {
86101
          extension_detail = (extension_detail
86102
                              << WUFFS_BASE__TOKEN__VALUE_EXTENSION__NUM_BITS) |
86103
                             static_cast<uint64_t>(ext);
86104
          switch (extension_category) {
86105
            case WUFFS_BASE__TOKEN__VBC__INLINE_INTEGER_SIGNED:
86106
              extension_category = 0;
86107
              ret_error_message =
86108
                  callbacks.AppendI64(static_cast<int64_t>(extension_detail));
86109
              goto parsed_a_value;
86110
            case WUFFS_BASE__TOKEN__VBC__INLINE_INTEGER_UNSIGNED:
86111
              extension_category = 0;
86112
              ret_error_message = callbacks.AppendU64(extension_detail);
86113
              goto parsed_a_value;
86114
            case EXT_CAT__CBOR_TAG:
86115
              extension_category = 0;
86116
              ret_error_message = callbacks.AppendCborTag(extension_detail);
86117
              if (!ret_error_message.empty()) {
86118
                goto done;
86119
              }
86120
              continue;
86121
          }
86122
        }
86123
        ret_error_message =
86124
            "wuffs_aux::DecodeCbor: internal error: bad extended token";
86125
        goto done;
86126
      }
86127
86128
      switch (token.value_base_category()) {
86129
        case WUFFS_BASE__TOKEN__VBC__FILLER:
86130
          continue;
86131
86132
        case WUFFS_BASE__TOKEN__VBC__STRUCTURE: {
86133
          if (vbd & WUFFS_BASE__TOKEN__VBD__STRUCTURE__PUSH) {
86134
            ret_error_message = callbacks.Push(static_cast<uint32_t>(vbd));
86135
            if (!ret_error_message.empty()) {
86136
              goto done;
86137
            }
86138
            depth++;
86139
            if (depth > (int32_t)WUFFS_CBOR__DECODER_DEPTH_MAX_INCL) {
86140
              ret_error_message =
86141
                  "wuffs_aux::DecodeCbor: internal error: bad depth";
86142
              goto done;
86143
            }
86144
            continue;
86145
          }
86146
          ret_error_message = callbacks.Pop(static_cast<uint32_t>(vbd));
86147
          depth--;
86148
          if (depth < 0) {
86149
            ret_error_message =
86150
                "wuffs_aux::DecodeCbor: internal error: bad depth";
86151
            goto done;
86152
          }
86153
          goto parsed_a_value;
86154
        }
86155
86156
        case WUFFS_BASE__TOKEN__VBC__STRING: {
86157
          if (vbd & WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_0_DST_1_SRC_DROP) {
86158
            // No-op.
86159
          } else if (vbd &
86160
                     WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_1_DST_1_SRC_COPY) {
86161
            const char* ptr =  // Convert from (uint8_t*).
86162
                static_cast<const char*>(static_cast<void*>(token_ptr));
86163
            str.append(ptr, static_cast<size_t>(token_len));
86164
          } else {
86165
            goto fail;
86166
          }
86167
          if (token.continued()) {
86168
            continue;
86169
          }
86170
          ret_error_message =
86171
              (vbd & WUFFS_BASE__TOKEN__VBD__STRING__CHAIN_MUST_BE_UTF_8)
86172
                  ? callbacks.AppendTextString(std::move(str))
86173
                  : callbacks.AppendByteString(std::move(str));
86174
          str.clear();
86175
          goto parsed_a_value;
86176
        }
86177
86178
        case WUFFS_BASE__TOKEN__VBC__UNICODE_CODE_POINT: {
86179
          uint8_t u[WUFFS_BASE__UTF_8__BYTE_LENGTH__MAX_INCL];
86180
          size_t n = wuffs_base__utf_8__encode(
86181
              wuffs_base__make_slice_u8(
86182
                  &u[0], WUFFS_BASE__UTF_8__BYTE_LENGTH__MAX_INCL),
86183
              static_cast<uint32_t>(vbd));
86184
          const char* ptr =  // Convert from (uint8_t*).
86185
              static_cast<const char*>(static_cast<void*>(&u[0]));
86186
          str.append(ptr, n);
86187
          if (token.continued()) {
86188
            continue;
86189
          }
86190
          goto fail;
86191
        }
86192
86193
        case WUFFS_BASE__TOKEN__VBC__LITERAL: {
86194
          if (vbd & WUFFS_BASE__TOKEN__VBD__LITERAL__NULL) {
86195
            ret_error_message = callbacks.AppendNull();
86196
          } else if (vbd & WUFFS_BASE__TOKEN__VBD__LITERAL__UNDEFINED) {
86197
            ret_error_message = callbacks.AppendUndefined();
86198
          } else {
86199
            ret_error_message = callbacks.AppendBool(
86200
                vbd & WUFFS_BASE__TOKEN__VBD__LITERAL__TRUE);
86201
          }
86202
          goto parsed_a_value;
86203
        }
86204
86205
        case WUFFS_BASE__TOKEN__VBC__NUMBER: {
86206
          const uint64_t cfp_fbbe_fifb =
86207
              WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_FLOATING_POINT |
86208
              WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_BINARY_BIG_ENDIAN |
86209
              WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_IGNORE_FIRST_BYTE;
86210
          if ((vbd & cfp_fbbe_fifb) == cfp_fbbe_fifb) {
86211
            double f;
86212
            switch (token_len) {
86213
              case 3:
86214
                f = wuffs_base__ieee_754_bit_representation__from_u16_to_f64(
86215
                    wuffs_base__peek_u16be__no_bounds_check(token_ptr + 1));
86216
                break;
86217
              case 5:
86218
                f = wuffs_base__ieee_754_bit_representation__from_u32_to_f64(
86219
                    wuffs_base__peek_u32be__no_bounds_check(token_ptr + 1));
86220
                break;
86221
              case 9:
86222
                f = wuffs_base__ieee_754_bit_representation__from_u64_to_f64(
86223
                    wuffs_base__peek_u64be__no_bounds_check(token_ptr + 1));
86224
                break;
86225
              default:
86226
                goto fail;
86227
            }
86228
            ret_error_message = callbacks.AppendF64(f);
86229
            goto parsed_a_value;
86230
          }
86231
          goto fail;
86232
        }
86233
86234
        case WUFFS_BASE__TOKEN__VBC__INLINE_INTEGER_SIGNED: {
86235
          if (token.continued()) {
86236
            extension_category = WUFFS_BASE__TOKEN__VBC__INLINE_INTEGER_SIGNED;
86237
            extension_detail =
86238
                static_cast<uint64_t>(token.value_base_detail__sign_extended());
86239
            continue;
86240
          }
86241
          ret_error_message =
86242
              callbacks.AppendI64(token.value_base_detail__sign_extended());
86243
          goto parsed_a_value;
86244
        }
86245
86246
        case WUFFS_BASE__TOKEN__VBC__INLINE_INTEGER_UNSIGNED: {
86247
          if (token.continued()) {
86248
            extension_category =
86249
                WUFFS_BASE__TOKEN__VBC__INLINE_INTEGER_UNSIGNED;
86250
            extension_detail = vbd;
86251
            continue;
86252
          }
86253
          ret_error_message = callbacks.AppendU64(vbd);
86254
          goto parsed_a_value;
86255
        }
86256
      }
86257
86258
      if (token.value_major() == WUFFS_CBOR__TOKEN_VALUE_MAJOR) {
86259
        uint64_t value_minor = token.value_minor();
86260
        if (value_minor & WUFFS_CBOR__TOKEN_VALUE_MINOR__MINUS_1_MINUS_X) {
86261
          if (token_len == 9) {
86262
            ret_error_message = callbacks.AppendMinus1MinusX(
86263
                wuffs_base__peek_u64be__no_bounds_check(token_ptr + 1));
86264
            goto parsed_a_value;
86265
          }
86266
        } else if (value_minor & WUFFS_CBOR__TOKEN_VALUE_MINOR__SIMPLE_VALUE) {
86267
          ret_error_message =
86268
              callbacks.AppendCborSimpleValue(static_cast<uint8_t>(
86269
                  value_minor & WUFFS_CBOR__TOKEN_VALUE_MINOR__DETAIL_MASK));
86270
          goto parsed_a_value;
86271
        } else if (value_minor & WUFFS_CBOR__TOKEN_VALUE_MINOR__TAG) {
86272
          if (token.continued()) {
86273
            extension_category = EXT_CAT__CBOR_TAG;
86274
            extension_detail =
86275
                value_minor & WUFFS_CBOR__TOKEN_VALUE_MINOR__DETAIL_MASK;
86276
            continue;
86277
          }
86278
          ret_error_message = callbacks.AppendCborTag(
86279
              value_minor & WUFFS_CBOR__TOKEN_VALUE_MINOR__DETAIL_MASK);
86280
          if (!ret_error_message.empty()) {
86281
            goto done;
86282
          }
86283
          continue;
86284
        }
86285
      }
86286
86287
    fail:
86288
      ret_error_message =
86289
          "wuffs_aux::DecodeCbor: internal error: unexpected token";
86290
      goto done;
86291
86292
    parsed_a_value:
86293
      if (!ret_error_message.empty() || (depth == 0)) {
86294
        goto done;
86295
      }
86296
    }
86297
  } while (false);
86298
86299
done:
86300
  DecodeCborResult result(
86301
      std::move(ret_error_message),
86302
      wuffs_base__u64__sat_add(io_buf->meta.pos, cursor_index));
86303
  callbacks.Done(result, input, *io_buf);
86304
  return result;
86305
}
86306
86307
}  // namespace wuffs_aux
86308
86309
#endif  // !defined(WUFFS_CONFIG__MODULES) ||
86310
        // defined(WUFFS_CONFIG__MODULE__AUX__CBOR)
86311
86312
// ---------------- Auxiliary - Image
86313
86314
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__AUX__IMAGE)
86315
86316
#include <utility>
86317
86318
namespace wuffs_aux {
86319
86320
DecodeImageResult::DecodeImageResult(MemOwner&& pixbuf_mem_owner0,
86321
                                     wuffs_base__pixel_buffer pixbuf0,
86322
                                     std::string&& error_message0)
86323
    : pixbuf_mem_owner(std::move(pixbuf_mem_owner0)),
86324
      pixbuf(pixbuf0),
86325
      error_message(std::move(error_message0)) {}
86326
86327
DecodeImageResult::DecodeImageResult(std::string&& error_message0)
86328
    : pixbuf_mem_owner(nullptr, &free),
86329
      pixbuf(wuffs_base__null_pixel_buffer()),
86330
      error_message(std::move(error_message0)) {}
86331
86332
DecodeImageCallbacks::~DecodeImageCallbacks() {}
86333
86334
DecodeImageCallbacks::AllocPixbufResult::AllocPixbufResult(
86335
    MemOwner&& mem_owner0,
86336
    wuffs_base__pixel_buffer pixbuf0)
86337
    : mem_owner(std::move(mem_owner0)), pixbuf(pixbuf0), error_message("") {}
86338
86339
DecodeImageCallbacks::AllocPixbufResult::AllocPixbufResult(
86340
    std::string&& error_message0)
86341
    : mem_owner(nullptr, &free),
86342
      pixbuf(wuffs_base__null_pixel_buffer()),
86343
      error_message(std::move(error_message0)) {}
86344
86345
DecodeImageCallbacks::AllocWorkbufResult::AllocWorkbufResult(
86346
    MemOwner&& mem_owner0,
86347
    wuffs_base__slice_u8 workbuf0)
86348
    : mem_owner(std::move(mem_owner0)), workbuf(workbuf0), error_message("") {}
86349
86350
DecodeImageCallbacks::AllocWorkbufResult::AllocWorkbufResult(
86351
    std::string&& error_message0)
86352
    : mem_owner(nullptr, &free),
86353
      workbuf(wuffs_base__empty_slice_u8()),
86354
      error_message(std::move(error_message0)) {}
86355
86356
wuffs_base__image_decoder::unique_ptr  //
86357
DecodeImageCallbacks::SelectDecoder(uint32_t fourcc,
86358
                                    wuffs_base__slice_u8 prefix_data,
86359
                                    bool prefix_closed) {
86360
  switch (fourcc) {
86361
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BMP)
86362
    case WUFFS_BASE__FOURCC__BMP:
86363
      return wuffs_bmp__decoder::alloc_as__wuffs_base__image_decoder();
86364
#endif
86365
86366
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ETC2)
86367
    case WUFFS_BASE__FOURCC__ETC2:
86368
      return wuffs_etc2__decoder::alloc_as__wuffs_base__image_decoder();
86369
#endif
86370
86371
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GIF)
86372
    case WUFFS_BASE__FOURCC__GIF:
86373
      return wuffs_gif__decoder::alloc_as__wuffs_base__image_decoder();
86374
#endif
86375
86376
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JPEG)
86377
    case WUFFS_BASE__FOURCC__JPEG:
86378
      return wuffs_jpeg__decoder::alloc_as__wuffs_base__image_decoder();
86379
#endif
86380
86381
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NIE)
86382
    case WUFFS_BASE__FOURCC__NIE:
86383
      return wuffs_nie__decoder::alloc_as__wuffs_base__image_decoder();
86384
#endif
86385
86386
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NETPBM)
86387
    case WUFFS_BASE__FOURCC__NPBM:
86388
      return wuffs_netpbm__decoder::alloc_as__wuffs_base__image_decoder();
86389
#endif
86390
86391
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__PNG)
86392
    case WUFFS_BASE__FOURCC__PNG: {
86393
      auto dec = wuffs_png__decoder::alloc_as__wuffs_base__image_decoder();
86394
      // Favor faster decodes over rejecting invalid checksums.
86395
      dec->set_quirk(WUFFS_BASE__QUIRK_IGNORE_CHECKSUM, 1);
86396
      return dec;
86397
    }
86398
#endif
86399
86400
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__QOI)
86401
    case WUFFS_BASE__FOURCC__QOI:
86402
      return wuffs_qoi__decoder::alloc_as__wuffs_base__image_decoder();
86403
#endif
86404
86405
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__TARGA)
86406
    case WUFFS_BASE__FOURCC__TGA:
86407
      return wuffs_targa__decoder::alloc_as__wuffs_base__image_decoder();
86408
#endif
86409
86410
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__THUMBHASH)
86411
    case WUFFS_BASE__FOURCC__TH:
86412
      return wuffs_thumbhash__decoder::alloc_as__wuffs_base__image_decoder();
86413
#endif
86414
86415
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WBMP)
86416
    case WUFFS_BASE__FOURCC__WBMP:
86417
      return wuffs_wbmp__decoder::alloc_as__wuffs_base__image_decoder();
86418
#endif
86419
86420
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WEBP)
86421
    case WUFFS_BASE__FOURCC__WEBP:
86422
      return wuffs_webp__decoder::alloc_as__wuffs_base__image_decoder();
86423
#endif
86424
  }
86425
86426
  return wuffs_base__image_decoder::unique_ptr(nullptr);
86427
}
86428
86429
std::string  //
86430
DecodeImageCallbacks::HandleMetadata(const wuffs_base__more_information& minfo,
86431
                                     wuffs_base__slice_u8 raw) {
86432
  return "";
86433
}
86434
86435
wuffs_base__pixel_format  //
86436
DecodeImageCallbacks::SelectPixfmt(
86437
    const wuffs_base__image_config& image_config) {
86438
  return wuffs_base__make_pixel_format(WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL);
86439
}
86440
86441
DecodeImageCallbacks::AllocPixbufResult  //
86442
DecodeImageCallbacks::AllocPixbuf(const wuffs_base__image_config& image_config,
86443
                                  bool allow_uninitialized_memory) {
86444
  uint32_t w = image_config.pixcfg.width();
86445
  uint32_t h = image_config.pixcfg.height();
86446
  if ((w == 0) || (h == 0)) {
86447
    return AllocPixbufResult("");
86448
  }
86449
  uint64_t len = image_config.pixcfg.pixbuf_len();
86450
  if ((len == 0) || (SIZE_MAX < len)) {
86451
    return AllocPixbufResult(DecodeImage_UnsupportedPixelConfiguration);
86452
  }
86453
  void* ptr =
86454
      allow_uninitialized_memory ? malloc((size_t)len) : calloc(1, (size_t)len);
86455
  if (!ptr) {
86456
    return AllocPixbufResult(DecodeImage_OutOfMemory);
86457
  }
86458
  wuffs_base__pixel_buffer pixbuf;
86459
  wuffs_base__status status = pixbuf.set_from_slice(
86460
      &image_config.pixcfg,
86461
      wuffs_base__make_slice_u8((uint8_t*)ptr, (size_t)len));
86462
  if (!status.is_ok()) {
86463
    free(ptr);
86464
    return AllocPixbufResult(status.message());
86465
  }
86466
  return AllocPixbufResult(MemOwner(ptr, &free), pixbuf);
86467
}
86468
86469
DecodeImageCallbacks::AllocWorkbufResult  //
86470
DecodeImageCallbacks::AllocWorkbuf(wuffs_base__range_ii_u64 len_range,
86471
                                   bool allow_uninitialized_memory) {
86472
  uint64_t len = len_range.max_incl;
86473
  if (len == 0) {
86474
    return AllocWorkbufResult("");
86475
  } else if (SIZE_MAX < len) {
86476
    return AllocWorkbufResult(DecodeImage_OutOfMemory);
86477
  }
86478
  void* ptr =
86479
      allow_uninitialized_memory ? malloc((size_t)len) : calloc(1, (size_t)len);
86480
  if (!ptr) {
86481
    return AllocWorkbufResult(DecodeImage_OutOfMemory);
86482
  }
86483
  return AllocWorkbufResult(
86484
      MemOwner(ptr, &free),
86485
      wuffs_base__make_slice_u8((uint8_t*)ptr, (size_t)len));
86486
}
86487
86488
void  //
86489
DecodeImageCallbacks::Done(
86490
    DecodeImageResult& result,
86491
    sync_io::Input& input,
86492
    IOBuffer& buffer,
86493
    wuffs_base__image_decoder::unique_ptr image_decoder) {}
86494
86495
const char DecodeImage_BufferIsTooShort[] =  //
86496
    "wuffs_aux::DecodeImage: buffer is too short";
86497
const char DecodeImage_MaxInclDimensionExceeded[] =  //
86498
    "wuffs_aux::DecodeImage: max_incl_dimension exceeded";
86499
const char DecodeImage_MaxInclMetadataLengthExceeded[] =  //
86500
    "wuffs_aux::DecodeImage: max_incl_metadata_length exceeded";
86501
const char DecodeImage_OutOfMemory[] =  //
86502
    "wuffs_aux::DecodeImage: out of memory";
86503
const char DecodeImage_UnexpectedEndOfFile[] =  //
86504
    "wuffs_aux::DecodeImage: unexpected end of file";
86505
const char DecodeImage_UnsupportedImageFormat[] =  //
86506
    "wuffs_aux::DecodeImage: unsupported image format";
86507
const char DecodeImage_UnsupportedMetadata[] =  //
86508
    "wuffs_aux::DecodeImage: unsupported metadata";
86509
const char DecodeImage_UnsupportedPixelBlend[] =  //
86510
    "wuffs_aux::DecodeImage: unsupported pixel blend";
86511
const char DecodeImage_UnsupportedPixelConfiguration[] =  //
86512
    "wuffs_aux::DecodeImage: unsupported pixel configuration";
86513
const char DecodeImage_UnsupportedPixelFormat[] =  //
86514
    "wuffs_aux::DecodeImage: unsupported pixel format";
86515
86516
DecodeImageArgQuirks::DecodeImageArgQuirks(const QuirkKeyValuePair* ptr0,
86517
                                           const size_t len0)
86518
    : ptr(ptr0), len(len0) {}
86519
86520
DecodeImageArgQuirks  //
86521
DecodeImageArgQuirks::DefaultValue() {
86522
  return DecodeImageArgQuirks(nullptr, 0);
86523
}
86524
86525
DecodeImageArgFlags::DecodeImageArgFlags(uint64_t repr0) : repr(repr0) {}
86526
86527
DecodeImageArgFlags  //
86528
DecodeImageArgFlags::DefaultValue() {
86529
  return DecodeImageArgFlags(0);
86530
}
86531
86532
DecodeImageArgPixelBlend::DecodeImageArgPixelBlend(
86533
    wuffs_base__pixel_blend repr0)
86534
    : repr(repr0) {}
86535
86536
DecodeImageArgPixelBlend  //
86537
DecodeImageArgPixelBlend::DefaultValue() {
86538
  return DecodeImageArgPixelBlend(WUFFS_BASE__PIXEL_BLEND__SRC);
86539
}
86540
86541
DecodeImageArgBackgroundColor::DecodeImageArgBackgroundColor(
86542
    wuffs_base__color_u32_argb_premul repr0)
86543
    : repr(repr0) {}
86544
86545
DecodeImageArgBackgroundColor  //
86546
DecodeImageArgBackgroundColor::DefaultValue() {
86547
  return DecodeImageArgBackgroundColor(1);
86548
}
86549
86550
DecodeImageArgMaxInclDimension::DecodeImageArgMaxInclDimension(uint32_t repr0)
86551
    : repr(repr0) {}
86552
86553
DecodeImageArgMaxInclDimension  //
86554
DecodeImageArgMaxInclDimension::DefaultValue() {
86555
  return DecodeImageArgMaxInclDimension(1048575);
86556
}
86557
86558
DecodeImageArgMaxInclMetadataLength::DecodeImageArgMaxInclMetadataLength(
86559
    uint64_t repr0)
86560
    : repr(repr0) {}
86561
86562
DecodeImageArgMaxInclMetadataLength  //
86563
DecodeImageArgMaxInclMetadataLength::DefaultValue() {
86564
  return DecodeImageArgMaxInclMetadataLength(16777215);
86565
}
86566
86567
// --------
86568
86569
namespace {
86570
86571
const private_impl::ErrorMessages DecodeImageErrorMessages = {
86572
    DecodeImage_MaxInclMetadataLengthExceeded,  //
86573
    DecodeImage_OutOfMemory,                    //
86574
    DecodeImage_UnexpectedEndOfFile,            //
86575
    DecodeImage_UnsupportedMetadata,            //
86576
    DecodeImage_UnsupportedImageFormat,         //
86577
};
86578
86579
std::string  //
86580
DecodeImageAdvanceIOBufferTo(sync_io::Input& input,
86581
                             wuffs_base__io_buffer& io_buf,
86582
                             uint64_t absolute_position) {
86583
  return private_impl::AdvanceIOBufferTo(DecodeImageErrorMessages, input,
86584
                                         io_buf, absolute_position);
86585
}
86586
86587
wuffs_base__status  //
86588
DIHM0(void* self,
86589
      wuffs_base__io_buffer* a_dst,
86590
      wuffs_base__more_information* a_minfo,
86591
      wuffs_base__io_buffer* a_src) {
86592
  return wuffs_base__image_decoder__tell_me_more(
86593
      static_cast<wuffs_base__image_decoder*>(self), a_dst, a_minfo, a_src);
86594
}
86595
86596
std::string  //
86597
DIHM1(void* self,
86598
      const wuffs_base__more_information* minfo,
86599
      wuffs_base__slice_u8 raw) {
86600
  return static_cast<DecodeImageCallbacks*>(self)->HandleMetadata(*minfo, raw);
86601
}
86602
86603
std::string  //
86604
DecodeImageHandleMetadata(wuffs_base__image_decoder::unique_ptr& image_decoder,
86605
                          DecodeImageCallbacks& callbacks,
86606
                          sync_io::Input& input,
86607
                          wuffs_base__io_buffer& io_buf,
86608
                          sync_io::DynIOBuffer& raw_metadata_buf) {
86609
  return private_impl::HandleMetadata(DecodeImageErrorMessages, input, io_buf,
86610
                                      raw_metadata_buf, DIHM0,
86611
                                      static_cast<void*>(image_decoder.get()),
86612
                                      DIHM1, static_cast<void*>(&callbacks));
86613
}
86614
86615
DecodeImageResult  //
86616
DecodeImage0(wuffs_base__image_decoder::unique_ptr& image_decoder,
86617
             DecodeImageCallbacks& callbacks,
86618
             sync_io::Input& input,
86619
             wuffs_base__io_buffer& io_buf,
86620
             const QuirkKeyValuePair* quirks_ptr,
86621
             const size_t quirks_len,
86622
             uint64_t flags,
86623
             wuffs_base__pixel_blend pixel_blend,
86624
             wuffs_base__color_u32_argb_premul background_color,
86625
             uint32_t max_incl_dimension,
86626
             uint64_t max_incl_metadata_length) {
86627
  // Check args.
86628
  switch (pixel_blend) {
86629
    case WUFFS_BASE__PIXEL_BLEND__SRC:
86630
    case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
86631
      break;
86632
    default:
86633
      return DecodeImageResult(DecodeImage_UnsupportedPixelBlend);
86634
  }
86635
86636
  wuffs_base__image_config image_config = wuffs_base__null_image_config();
86637
  sync_io::DynIOBuffer raw_metadata_buf(max_incl_metadata_length);
86638
  uint64_t start_pos = io_buf.reader_position();
86639
  bool interested_in_metadata_after_the_frame = false;
86640
  bool redirected = false;
86641
  int32_t fourcc = 0;
86642
redirect:
86643
  do {
86644
    // Determine the image format.
86645
    if (!redirected) {
86646
      while (true) {
86647
        fourcc = wuffs_base__magic_number_guess_fourcc(io_buf.reader_slice(),
86648
                                                       io_buf.meta.closed);
86649
        if (fourcc > 0) {
86650
          break;
86651
        } else if ((fourcc == 0) && (io_buf.reader_length() >= 64)) {
86652
          // Having (fourcc == 0) means that Wuffs' built in MIME sniffer
86653
          // didn't recognize the image format. Nonetheless, custom callbacks
86654
          // may still be able to do their own MIME sniffing, for exotic image
86655
          // types. We try to give them at least 64 bytes of prefix data when
86656
          // one-shot-calling callbacks.SelectDecoder. There is no mechanism
86657
          // for the callbacks to request a longer prefix.
86658
          break;
86659
        } else if (io_buf.meta.closed || (io_buf.writer_length() == 0)) {
86660
          fourcc = 0;
86661
          break;
86662
        }
86663
        std::string error_message = input.CopyIn(&io_buf);
86664
        if (!error_message.empty()) {
86665
          return DecodeImageResult(std::move(error_message));
86666
        }
86667
      }
86668
    } else {
86669
      wuffs_base__io_buffer empty = wuffs_base__empty_io_buffer();
86670
      wuffs_base__more_information minfo = wuffs_base__empty_more_information();
86671
      wuffs_base__status tmm_status =
86672
          image_decoder->tell_me_more(&empty, &minfo, &io_buf);
86673
      if (tmm_status.repr != nullptr) {
86674
        return DecodeImageResult(tmm_status.message());
86675
      }
86676
      if (minfo.flavor != WUFFS_BASE__MORE_INFORMATION__FLAVOR__IO_REDIRECT) {
86677
        return DecodeImageResult(DecodeImage_UnsupportedImageFormat);
86678
      }
86679
      uint64_t pos = minfo.io_redirect__range().min_incl;
86680
      if (pos <= start_pos) {
86681
        // Redirects must go forward.
86682
        return DecodeImageResult(DecodeImage_UnsupportedImageFormat);
86683
      }
86684
      std::string error_message =
86685
          DecodeImageAdvanceIOBufferTo(input, io_buf, pos);
86686
      if (!error_message.empty()) {
86687
        return DecodeImageResult(std::move(error_message));
86688
      }
86689
      fourcc = (int32_t)(minfo.io_redirect__fourcc());
86690
      if (fourcc == 0) {
86691
        return DecodeImageResult(DecodeImage_UnsupportedImageFormat);
86692
      }
86693
      image_decoder.reset();
86694
    }
86695
86696
    // Select the image decoder.
86697
    image_decoder = callbacks.SelectDecoder(
86698
        (uint32_t)fourcc, io_buf.reader_slice(), io_buf.meta.closed);
86699
    if (!image_decoder) {
86700
      return DecodeImageResult(DecodeImage_UnsupportedImageFormat);
86701
    }
86702
86703
    // Apply quirks.
86704
    for (size_t i = 0; i < quirks_len; i++) {
86705
      image_decoder->set_quirk(quirks_ptr[i].first, quirks_ptr[i].second);
86706
    }
86707
86708
    // Apply flags.
86709
    if (flags != 0) {
86710
      if (flags & DecodeImageArgFlags::REPORT_METADATA_CHRM) {
86711
        image_decoder->set_report_metadata(WUFFS_BASE__FOURCC__CHRM, true);
86712
      }
86713
      if (flags & DecodeImageArgFlags::REPORT_METADATA_EXIF) {
86714
        interested_in_metadata_after_the_frame = true;
86715
        image_decoder->set_report_metadata(WUFFS_BASE__FOURCC__EXIF, true);
86716
      }
86717
      if (flags & DecodeImageArgFlags::REPORT_METADATA_GAMA) {
86718
        image_decoder->set_report_metadata(WUFFS_BASE__FOURCC__GAMA, true);
86719
      }
86720
      if (flags & DecodeImageArgFlags::REPORT_METADATA_ICCP) {
86721
        image_decoder->set_report_metadata(WUFFS_BASE__FOURCC__ICCP, true);
86722
      }
86723
      if (flags & DecodeImageArgFlags::REPORT_METADATA_KVP) {
86724
        interested_in_metadata_after_the_frame = true;
86725
        image_decoder->set_report_metadata(WUFFS_BASE__FOURCC__KVP, true);
86726
      }
86727
      if (flags & DecodeImageArgFlags::REPORT_METADATA_SRGB) {
86728
        image_decoder->set_report_metadata(WUFFS_BASE__FOURCC__SRGB, true);
86729
      }
86730
      if (flags & DecodeImageArgFlags::REPORT_METADATA_XMP) {
86731
        interested_in_metadata_after_the_frame = true;
86732
        image_decoder->set_report_metadata(WUFFS_BASE__FOURCC__XMP, true);
86733
      }
86734
    }
86735
86736
    // Decode the image config.
86737
    while (true) {
86738
      wuffs_base__status id_dic_status =
86739
          image_decoder->decode_image_config(&image_config, &io_buf);
86740
      if (id_dic_status.repr == nullptr) {
86741
        break;
86742
      } else if (id_dic_status.repr == wuffs_base__note__i_o_redirect) {
86743
        if (redirected) {
86744
          return DecodeImageResult(DecodeImage_UnsupportedImageFormat);
86745
        }
86746
        redirected = true;
86747
        goto redirect;
86748
      } else if (id_dic_status.repr == wuffs_base__note__metadata_reported) {
86749
        std::string error_message = DecodeImageHandleMetadata(
86750
            image_decoder, callbacks, input, io_buf, raw_metadata_buf);
86751
        if (!error_message.empty()) {
86752
          return DecodeImageResult(std::move(error_message));
86753
        }
86754
      } else if (id_dic_status.repr != wuffs_base__suspension__short_read) {
86755
        return DecodeImageResult(id_dic_status.message());
86756
      } else if (io_buf.meta.closed) {
86757
        return DecodeImageResult(DecodeImage_UnexpectedEndOfFile);
86758
      } else {
86759
        std::string error_message = input.CopyIn(&io_buf);
86760
        if (!error_message.empty()) {
86761
          return DecodeImageResult(std::move(error_message));
86762
        }
86763
      }
86764
    }
86765
  } while (false);
86766
  if (!interested_in_metadata_after_the_frame) {
86767
    raw_metadata_buf.drop();
86768
  }
86769
86770
  // Select the pixel format.
86771
  uint32_t w = image_config.pixcfg.width();
86772
  uint32_t h = image_config.pixcfg.height();
86773
  if ((w > max_incl_dimension) || (h > max_incl_dimension)) {
86774
    return DecodeImageResult(DecodeImage_MaxInclDimensionExceeded);
86775
  }
86776
  wuffs_base__pixel_format pixel_format = callbacks.SelectPixfmt(image_config);
86777
  if (pixel_format.repr != image_config.pixcfg.pixel_format().repr) {
86778
    switch (pixel_format.repr) {
86779
      case WUFFS_BASE__PIXEL_FORMAT__Y:
86780
      case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
86781
      case WUFFS_BASE__PIXEL_FORMAT__BGR:
86782
      case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
86783
      case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
86784
      case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
86785
      case WUFFS_BASE__PIXEL_FORMAT__RGB:
86786
      case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
86787
      case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
86788
        break;
86789
      default:
86790
        return DecodeImageResult(DecodeImage_UnsupportedPixelFormat);
86791
    }
86792
    image_config.pixcfg.set(pixel_format.repr,
86793
                            WUFFS_BASE__PIXEL_SUBSAMPLING__NONE, w, h);
86794
  }
86795
86796
  // Allocate the pixel buffer.
86797
  bool valid_background_color =
86798
      wuffs_base__color_u32_argb_premul__is_valid(background_color);
86799
  DecodeImageCallbacks::AllocPixbufResult alloc_pixbuf_result =
86800
      callbacks.AllocPixbuf(image_config, valid_background_color);
86801
  if (!alloc_pixbuf_result.error_message.empty()) {
86802
    return DecodeImageResult(std::move(alloc_pixbuf_result.error_message));
86803
  }
86804
  wuffs_base__pixel_buffer pixel_buffer = alloc_pixbuf_result.pixbuf;
86805
  if (valid_background_color) {
86806
    wuffs_base__status pb_scufr_status = pixel_buffer.set_color_u32_fill_rect(
86807
        pixel_buffer.pixcfg.bounds(), background_color);
86808
    if (pb_scufr_status.repr != nullptr) {
86809
      return DecodeImageResult(pb_scufr_status.message());
86810
    }
86811
  }
86812
86813
  // Allocate the work buffer. Wuffs' decoders conventionally assume that this
86814
  // can be uninitialized memory.
86815
  wuffs_base__range_ii_u64 workbuf_len = image_decoder->workbuf_len();
86816
  DecodeImageCallbacks::AllocWorkbufResult alloc_workbuf_result =
86817
      callbacks.AllocWorkbuf(workbuf_len, true);
86818
  if (!alloc_workbuf_result.error_message.empty()) {
86819
    return DecodeImageResult(std::move(alloc_workbuf_result.error_message));
86820
  } else if (alloc_workbuf_result.workbuf.len < workbuf_len.min_incl) {
86821
    return DecodeImageResult(DecodeImage_BufferIsTooShort);
86822
  }
86823
86824
  // Decode the frame config.
86825
  wuffs_base__frame_config frame_config = wuffs_base__null_frame_config();
86826
  while (true) {
86827
    wuffs_base__status id_dfc_status =
86828
        image_decoder->decode_frame_config(&frame_config, &io_buf);
86829
    if (id_dfc_status.repr == nullptr) {
86830
      break;
86831
    } else if (id_dfc_status.repr == wuffs_base__note__metadata_reported) {
86832
      std::string error_message = DecodeImageHandleMetadata(
86833
          image_decoder, callbacks, input, io_buf, raw_metadata_buf);
86834
      if (!error_message.empty()) {
86835
        return DecodeImageResult(std::move(error_message));
86836
      }
86837
    } else if (id_dfc_status.repr != wuffs_base__suspension__short_read) {
86838
      return DecodeImageResult(id_dfc_status.message());
86839
    } else if (io_buf.meta.closed) {
86840
      return DecodeImageResult(DecodeImage_UnexpectedEndOfFile);
86841
    } else {
86842
      std::string error_message = input.CopyIn(&io_buf);
86843
      if (!error_message.empty()) {
86844
        return DecodeImageResult(std::move(error_message));
86845
      }
86846
    }
86847
  }
86848
86849
  // Decode the frame (the pixels).
86850
  //
86851
  // From here on, always returns the pixel_buffer. If we get this far, we can
86852
  // still display a partial image, even if we encounter an error.
86853
  std::string message("");
86854
  if ((pixel_blend == WUFFS_BASE__PIXEL_BLEND__SRC_OVER) &&
86855
      frame_config.overwrite_instead_of_blend()) {
86856
    pixel_blend = WUFFS_BASE__PIXEL_BLEND__SRC;
86857
  }
86858
  while (true) {
86859
    wuffs_base__status id_df_status =
86860
        image_decoder->decode_frame(&pixel_buffer, &io_buf, pixel_blend,
86861
                                    alloc_workbuf_result.workbuf, nullptr);
86862
    if (id_df_status.repr == nullptr) {
86863
      break;
86864
    } else if (id_df_status.repr != wuffs_base__suspension__short_read) {
86865
      message = id_df_status.message();
86866
      break;
86867
    } else if (io_buf.meta.closed) {
86868
      message = DecodeImage_UnexpectedEndOfFile;
86869
      break;
86870
    } else {
86871
      std::string error_message = input.CopyIn(&io_buf);
86872
      if (!error_message.empty()) {
86873
        message = std::move(error_message);
86874
        break;
86875
      }
86876
    }
86877
  }
86878
86879
  // Decode any metadata after the frame.
86880
  if (interested_in_metadata_after_the_frame) {
86881
    while (true) {
86882
      wuffs_base__status id_dfc_status =
86883
          image_decoder->decode_frame_config(NULL, &io_buf);
86884
      if (id_dfc_status.repr == wuffs_base__note__end_of_data) {
86885
        break;
86886
      } else if (id_dfc_status.repr == nullptr) {
86887
        continue;
86888
      } else if (id_dfc_status.repr == wuffs_base__note__metadata_reported) {
86889
        std::string error_message = DecodeImageHandleMetadata(
86890
            image_decoder, callbacks, input, io_buf, raw_metadata_buf);
86891
        if (!error_message.empty()) {
86892
          return DecodeImageResult(std::move(error_message));
86893
        }
86894
      } else if (id_dfc_status.repr != wuffs_base__suspension__short_read) {
86895
        return DecodeImageResult(id_dfc_status.message());
86896
      } else if (io_buf.meta.closed) {
86897
        return DecodeImageResult(DecodeImage_UnexpectedEndOfFile);
86898
      } else {
86899
        std::string error_message = input.CopyIn(&io_buf);
86900
        if (!error_message.empty()) {
86901
          return DecodeImageResult(std::move(error_message));
86902
        }
86903
      }
86904
    }
86905
  }
86906
86907
  return DecodeImageResult(std::move(alloc_pixbuf_result.mem_owner),
86908
                           pixel_buffer, std::move(message));
86909
}
86910
86911
}  // namespace
86912
86913
DecodeImageResult  //
86914
DecodeImage(DecodeImageCallbacks& callbacks,
86915
            sync_io::Input& input,
86916
            DecodeImageArgQuirks quirks,
86917
            DecodeImageArgFlags flags,
86918
            DecodeImageArgPixelBlend pixel_blend,
86919
            DecodeImageArgBackgroundColor background_color,
86920
            DecodeImageArgMaxInclDimension max_incl_dimension,
86921
            DecodeImageArgMaxInclMetadataLength max_incl_metadata_length) {
86922
  wuffs_base__io_buffer* io_buf = input.BringsItsOwnIOBuffer();
86923
  wuffs_base__io_buffer fallback_io_buf = wuffs_base__empty_io_buffer();
86924
  std::unique_ptr<uint8_t[]> fallback_io_array(nullptr);
86925
  if (!io_buf) {
86926
    fallback_io_array = std::unique_ptr<uint8_t[]>(new uint8_t[32768]);
86927
    fallback_io_buf =
86928
        wuffs_base__ptr_u8__writer(fallback_io_array.get(), 32768);
86929
    io_buf = &fallback_io_buf;
86930
  }
86931
86932
  wuffs_base__image_decoder::unique_ptr image_decoder(nullptr);
86933
  DecodeImageResult result = DecodeImage0(
86934
      image_decoder, callbacks, input, *io_buf, quirks.ptr, quirks.len,
86935
      flags.repr, pixel_blend.repr, background_color.repr,
86936
      max_incl_dimension.repr, max_incl_metadata_length.repr);
86937
  callbacks.Done(result, input, *io_buf, std::move(image_decoder));
86938
  return result;
86939
}
86940
86941
}  // namespace wuffs_aux
86942
86943
#endif  // !defined(WUFFS_CONFIG__MODULES) ||
86944
        // defined(WUFFS_CONFIG__MODULE__AUX__IMAGE)
86945
86946
// ---------------- Auxiliary - JSON
86947
86948
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__AUX__JSON)
86949
86950
#include <utility>
86951
86952
namespace wuffs_aux {
86953
86954
DecodeJsonResult::DecodeJsonResult(std::string&& error_message0,
86955
                                   uint64_t cursor_position0)
86956
    : error_message(std::move(error_message0)),
86957
      cursor_position(cursor_position0) {}
86958
86959
DecodeJsonCallbacks::~DecodeJsonCallbacks() {}
86960
86961
void  //
86962
DecodeJsonCallbacks::Done(DecodeJsonResult& result,
86963
                          sync_io::Input& input,
86964
                          IOBuffer& buffer) {}
86965
86966
const char DecodeJson_BadJsonPointer[] =  //
86967
    "wuffs_aux::DecodeJson: bad JSON Pointer";
86968
const char DecodeJson_NoMatch[] =  //
86969
    "wuffs_aux::DecodeJson: no match";
86970
86971
DecodeJsonArgQuirks::DecodeJsonArgQuirks(const QuirkKeyValuePair* ptr0,
86972
                                         const size_t len0)
86973
    : ptr(ptr0), len(len0) {}
86974
86975
DecodeJsonArgQuirks  //
86976
DecodeJsonArgQuirks::DefaultValue() {
86977
  return DecodeJsonArgQuirks(nullptr, 0);
86978
}
86979
86980
DecodeJsonArgJsonPointer::DecodeJsonArgJsonPointer(std::string repr0)
86981
    : repr(repr0) {}
86982
86983
DecodeJsonArgJsonPointer  //
86984
DecodeJsonArgJsonPointer::DefaultValue() {
86985
  return DecodeJsonArgJsonPointer(std::string());
86986
}
86987
86988
// --------
86989
86990
#define WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN                          \
86991
  while (tok_buf.meta.ri >= tok_buf.meta.wi) {                              \
86992
    if (tok_status.repr == nullptr) {                                       \
86993
      goto done;                                                            \
86994
    } else if (tok_status.repr == wuffs_base__suspension__short_write) {    \
86995
      tok_buf.compact();                                                    \
86996
    } else if (tok_status.repr == wuffs_base__suspension__short_read) {     \
86997
      if (!io_error_message.empty()) {                                      \
86998
        ret_error_message = std::move(io_error_message);                    \
86999
        goto done;                                                          \
87000
      } else if (cursor_index != io_buf->meta.ri) {                         \
87001
        ret_error_message =                                                 \
87002
            "wuffs_aux::DecodeJson: internal error: bad cursor_index";      \
87003
        goto done;                                                          \
87004
      } else if (io_buf->meta.closed) {                                     \
87005
        ret_error_message =                                                 \
87006
            "wuffs_aux::DecodeJson: internal error: io_buf is closed";      \
87007
        goto done;                                                          \
87008
      }                                                                     \
87009
      io_buf->compact();                                                    \
87010
      if (io_buf->meta.wi >= io_buf->data.len) {                            \
87011
        ret_error_message =                                                 \
87012
            "wuffs_aux::DecodeJson: internal error: io_buf is full";        \
87013
        goto done;                                                          \
87014
      }                                                                     \
87015
      cursor_index = io_buf->meta.ri;                                       \
87016
      io_error_message = input.CopyIn(io_buf);                              \
87017
    } else {                                                                \
87018
      ret_error_message = tok_status.message();                             \
87019
      goto done;                                                            \
87020
    }                                                                       \
87021
    tok_status =                                                            \
87022
        dec->decode_tokens(&tok_buf, io_buf, wuffs_base__empty_slice_u8()); \
87023
    if ((tok_buf.meta.ri > tok_buf.meta.wi) ||                              \
87024
        (tok_buf.meta.wi > tok_buf.data.len) ||                             \
87025
        (io_buf->meta.ri > io_buf->meta.wi) ||                              \
87026
        (io_buf->meta.wi > io_buf->data.len)) {                             \
87027
      ret_error_message =                                                   \
87028
          "wuffs_aux::DecodeJson: internal error: bad buffer indexes";      \
87029
      goto done;                                                            \
87030
    }                                                                       \
87031
  }                                                                         \
87032
  wuffs_base__token token = tok_buf.data.ptr[tok_buf.meta.ri++];            \
87033
  uint64_t token_len = token.length();                                      \
87034
  if ((io_buf->meta.ri < cursor_index) ||                                   \
87035
      ((io_buf->meta.ri - cursor_index) < token_len)) {                     \
87036
    ret_error_message =                                                     \
87037
        "wuffs_aux::DecodeJson: internal error: bad token indexes";         \
87038
    goto done;                                                              \
87039
  }                                                                         \
87040
  uint8_t* token_ptr = io_buf->data.ptr + cursor_index;                     \
87041
  (void)(token_ptr);                                                        \
87042
  cursor_index += static_cast<size_t>(token_len)
87043
87044
// --------
87045
87046
namespace {
87047
87048
// DecodeJson_SplitJsonPointer returns ("bar", 8) for ("/foo/bar/b~1z/qux", 5,
87049
// etc). It returns a 0 size_t when s has invalid JSON Pointer syntax or i is
87050
// out of bounds.
87051
//
87052
// The string returned is unescaped. If calling it again, this time with i=8,
87053
// the "b~1z" substring would be returned as "b/z".
87054
std::pair<std::string, size_t>  //
87055
DecodeJson_SplitJsonPointer(std::string& s,
87056
                            size_t i,
87057
                            bool allow_tilde_n_tilde_r_tilde_t) {
87058
  std::string fragment;
87059
  if (i > s.size()) {
87060
    return std::make_pair(std::string(), 0);
87061
  }
87062
  while (i < s.size()) {
87063
    char c = s[i];
87064
    if (c == '/') {
87065
      break;
87066
    } else if (c != '~') {
87067
      fragment.push_back(c);
87068
      i++;
87069
      continue;
87070
    }
87071
    i++;
87072
    if (i >= s.size()) {
87073
      return std::make_pair(std::string(), 0);
87074
    }
87075
    c = s[i];
87076
    if (c == '0') {
87077
      fragment.push_back('~');
87078
      i++;
87079
      continue;
87080
    } else if (c == '1') {
87081
      fragment.push_back('/');
87082
      i++;
87083
      continue;
87084
    } else if (allow_tilde_n_tilde_r_tilde_t) {
87085
      if (c == 'n') {
87086
        fragment.push_back('\n');
87087
        i++;
87088
        continue;
87089
      } else if (c == 'r') {
87090
        fragment.push_back('\r');
87091
        i++;
87092
        continue;
87093
      } else if (c == 't') {
87094
        fragment.push_back('\t');
87095
        i++;
87096
        continue;
87097
      }
87098
    }
87099
    return std::make_pair(std::string(), 0);
87100
  }
87101
  return std::make_pair(std::move(fragment), i);
87102
}
87103
87104
// --------
87105
87106
std::string  //
87107
DecodeJson_WalkJsonPointerFragment(wuffs_base__token_buffer& tok_buf,
87108
                                   wuffs_base__status& tok_status,
87109
                                   wuffs_json__decoder::unique_ptr& dec,
87110
                                   wuffs_base__io_buffer* io_buf,
87111
                                   std::string& io_error_message,
87112
                                   size_t& cursor_index,
87113
                                   sync_io::Input& input,
87114
                                   std::string& json_pointer_fragment) {
87115
  std::string ret_error_message;
87116
  while (true) {
87117
    WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN;
87118
87119
    int64_t vbc = token.value_base_category();
87120
    uint64_t vbd = token.value_base_detail();
87121
    if (vbc == WUFFS_BASE__TOKEN__VBC__FILLER) {
87122
      continue;
87123
    } else if ((vbc != WUFFS_BASE__TOKEN__VBC__STRUCTURE) ||
87124
               !(vbd & WUFFS_BASE__TOKEN__VBD__STRUCTURE__PUSH)) {
87125
      return DecodeJson_NoMatch;
87126
    } else if (vbd & WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_LIST) {
87127
      goto do_list;
87128
    }
87129
    goto do_dict;
87130
  }
87131
87132
do_dict:
87133
  // Alternate between these two things:
87134
  //  1. Decode the next dict key (a string). If it matches the fragment, we're
87135
  //    done (success). If we've reached the dict's end (VBD__STRUCTURE__POP)
87136
  //    so that there was no next dict key, we're done (failure).
87137
  //  2. Otherwise, skip the next dict value.
87138
  while (true) {
87139
    for (std::string str; true;) {
87140
      WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN;
87141
87142
      int64_t vbc = token.value_base_category();
87143
      uint64_t vbd = token.value_base_detail();
87144
      switch (vbc) {
87145
        case WUFFS_BASE__TOKEN__VBC__FILLER:
87146
          continue;
87147
87148
        case WUFFS_BASE__TOKEN__VBC__STRUCTURE:
87149
          if (vbd & WUFFS_BASE__TOKEN__VBD__STRUCTURE__PUSH) {
87150
            goto fail;
87151
          }
87152
          return DecodeJson_NoMatch;
87153
87154
        case WUFFS_BASE__TOKEN__VBC__STRING: {
87155
          if (vbd & WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_0_DST_1_SRC_DROP) {
87156
            // No-op.
87157
          } else if (vbd &
87158
                     WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_1_DST_1_SRC_COPY) {
87159
            const char* ptr =  // Convert from (uint8_t*).
87160
                static_cast<const char*>(static_cast<void*>(token_ptr));
87161
            str.append(ptr, static_cast<size_t>(token_len));
87162
          } else {
87163
            goto fail;
87164
          }
87165
          break;
87166
        }
87167
87168
        case WUFFS_BASE__TOKEN__VBC__UNICODE_CODE_POINT: {
87169
          uint8_t u[WUFFS_BASE__UTF_8__BYTE_LENGTH__MAX_INCL];
87170
          size_t n = wuffs_base__utf_8__encode(
87171
              wuffs_base__make_slice_u8(
87172
                  &u[0], WUFFS_BASE__UTF_8__BYTE_LENGTH__MAX_INCL),
87173
              static_cast<uint32_t>(vbd));
87174
          const char* ptr =  // Convert from (uint8_t*).
87175
              static_cast<const char*>(static_cast<void*>(&u[0]));
87176
          str.append(ptr, n);
87177
          break;
87178
        }
87179
87180
        default:
87181
          goto fail;
87182
      }
87183
87184
      if (token.continued()) {
87185
        continue;
87186
      }
87187
      if (str == json_pointer_fragment) {
87188
        return "";
87189
      }
87190
      goto skip_the_next_dict_value;
87191
    }
87192
87193
  skip_the_next_dict_value:
87194
    for (uint32_t skip_depth = 0; true;) {
87195
      WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN;
87196
87197
      int64_t vbc = token.value_base_category();
87198
      uint64_t vbd = token.value_base_detail();
87199
      if (token.continued() || (vbc == WUFFS_BASE__TOKEN__VBC__FILLER)) {
87200
        continue;
87201
      } else if (vbc == WUFFS_BASE__TOKEN__VBC__STRUCTURE) {
87202
        if (vbd & WUFFS_BASE__TOKEN__VBD__STRUCTURE__PUSH) {
87203
          skip_depth++;
87204
          continue;
87205
        }
87206
        skip_depth--;
87207
      }
87208
87209
      if (skip_depth == 0) {
87210
        break;
87211
      }
87212
    }  // skip_the_next_dict_value
87213
  }    // do_dict
87214
87215
do_list:
87216
  do {
87217
    wuffs_base__result_u64 result_u64 = wuffs_base__parse_number_u64(
87218
        wuffs_base__make_slice_u8(
87219
            static_cast<uint8_t*>(static_cast<void*>(
87220
                const_cast<char*>(json_pointer_fragment.data()))),
87221
            json_pointer_fragment.size()),
87222
        WUFFS_BASE__PARSE_NUMBER_XXX__DEFAULT_OPTIONS);
87223
    if (!result_u64.status.is_ok()) {
87224
      return DecodeJson_NoMatch;
87225
    }
87226
    uint64_t remaining = result_u64.value;
87227
    if (remaining == 0) {
87228
      goto check_that_a_value_follows;
87229
    }
87230
    for (uint32_t skip_depth = 0; true;) {
87231
      WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN;
87232
87233
      int64_t vbc = token.value_base_category();
87234
      uint64_t vbd = token.value_base_detail();
87235
      if (token.continued() || (vbc == WUFFS_BASE__TOKEN__VBC__FILLER)) {
87236
        continue;
87237
      } else if (vbc == WUFFS_BASE__TOKEN__VBC__STRUCTURE) {
87238
        if (vbd & WUFFS_BASE__TOKEN__VBD__STRUCTURE__PUSH) {
87239
          skip_depth++;
87240
          continue;
87241
        }
87242
        if (skip_depth == 0) {
87243
          return DecodeJson_NoMatch;
87244
        }
87245
        skip_depth--;
87246
      }
87247
87248
      if (skip_depth > 0) {
87249
        continue;
87250
      }
87251
      remaining--;
87252
      if (remaining == 0) {
87253
        goto check_that_a_value_follows;
87254
      }
87255
    }
87256
  } while (false);  // do_list
87257
87258
check_that_a_value_follows:
87259
  while (true) {
87260
    WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN;
87261
87262
    int64_t vbc = token.value_base_category();
87263
    uint64_t vbd = token.value_base_detail();
87264
    if (vbc == WUFFS_BASE__TOKEN__VBC__FILLER) {
87265
      continue;
87266
    }
87267
87268
    // Undo the last part of WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN, so
87269
    // that we're only peeking at the next token.
87270
    tok_buf.meta.ri--;
87271
    cursor_index -= static_cast<size_t>(token_len);
87272
87273
    if ((vbc == WUFFS_BASE__TOKEN__VBC__STRUCTURE) &&
87274
        (vbd & WUFFS_BASE__TOKEN__VBD__STRUCTURE__POP)) {
87275
      return DecodeJson_NoMatch;
87276
    }
87277
    return "";
87278
  }  // check_that_a_value_follows
87279
87280
fail:
87281
  return "wuffs_aux::DecodeJson: internal error: unexpected token";
87282
done:
87283
  return ret_error_message;
87284
}
87285
87286
}  // namespace
87287
87288
// --------
87289
87290
DecodeJsonResult  //
87291
DecodeJson(DecodeJsonCallbacks& callbacks,
87292
           sync_io::Input& input,
87293
           DecodeJsonArgQuirks quirks,
87294
           DecodeJsonArgJsonPointer json_pointer) {
87295
  // Prepare the wuffs_base__io_buffer and the resultant error_message.
87296
  wuffs_base__io_buffer* io_buf = input.BringsItsOwnIOBuffer();
87297
  wuffs_base__io_buffer fallback_io_buf = wuffs_base__empty_io_buffer();
87298
  std::unique_ptr<uint8_t[]> fallback_io_array(nullptr);
87299
  if (!io_buf) {
87300
    fallback_io_array = std::unique_ptr<uint8_t[]>(new uint8_t[4096]);
87301
    fallback_io_buf = wuffs_base__ptr_u8__writer(fallback_io_array.get(), 4096);
87302
    io_buf = &fallback_io_buf;
87303
  }
87304
  // cursor_index is discussed at
87305
  // https://nigeltao.github.io/blog/2020/jsonptr.html#the-cursor-index
87306
  size_t cursor_index = 0;
87307
  std::string ret_error_message;
87308
  std::string io_error_message;
87309
87310
  do {
87311
    // Prepare the low-level JSON decoder.
87312
    wuffs_json__decoder::unique_ptr dec = wuffs_json__decoder::alloc();
87313
    if (!dec) {
87314
      ret_error_message = "wuffs_aux::DecodeJson: out of memory";
87315
      goto done;
87316
    } else if (WUFFS_JSON__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE != 0) {
87317
      ret_error_message =
87318
          "wuffs_aux::DecodeJson: internal error: bad WORKBUF_LEN";
87319
      goto done;
87320
    }
87321
    bool allow_tilde_n_tilde_r_tilde_t = false;
87322
    for (size_t i = 0; i < quirks.len; i++) {
87323
      dec->set_quirk(quirks.ptr[i].first, quirks.ptr[i].second);
87324
      if (quirks.ptr[i].first ==
87325
          WUFFS_JSON__QUIRK_JSON_POINTER_ALLOW_TILDE_N_TILDE_R_TILDE_T) {
87326
        allow_tilde_n_tilde_r_tilde_t = (quirks.ptr[i].second != 0);
87327
      }
87328
    }
87329
87330
    // Prepare the wuffs_base__tok_buffer. 256 tokens is 2KiB.
87331
    wuffs_base__token tok_array[256];
87332
    wuffs_base__token_buffer tok_buf =
87333
        wuffs_base__slice_token__writer(wuffs_base__make_slice_token(
87334
            &tok_array[0], (sizeof(tok_array) / sizeof(tok_array[0]))));
87335
    wuffs_base__status tok_status =
87336
        dec->decode_tokens(&tok_buf, io_buf, wuffs_base__empty_slice_u8());
87337
87338
    // Prepare other state.
87339
    int32_t depth = 0;
87340
    std::string str;
87341
87342
    // Walk the (optional) JSON Pointer.
87343
    for (size_t i = 0; i < json_pointer.repr.size();) {
87344
      if (json_pointer.repr[i] != '/') {
87345
        ret_error_message = DecodeJson_BadJsonPointer;
87346
        goto done;
87347
      }
87348
      std::pair<std::string, size_t> split = DecodeJson_SplitJsonPointer(
87349
          json_pointer.repr, i + 1, allow_tilde_n_tilde_r_tilde_t);
87350
      i = split.second;
87351
      if (i == 0) {
87352
        ret_error_message = DecodeJson_BadJsonPointer;
87353
        goto done;
87354
      }
87355
      ret_error_message = DecodeJson_WalkJsonPointerFragment(
87356
          tok_buf, tok_status, dec, io_buf, io_error_message, cursor_index,
87357
          input, split.first);
87358
      if (!ret_error_message.empty()) {
87359
        goto done;
87360
      }
87361
    }
87362
87363
    // Loop, doing these two things:
87364
    //  1. Get the next token.
87365
    //  2. Process that token.
87366
    while (true) {
87367
      WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN;
87368
87369
      int64_t vbc = token.value_base_category();
87370
      uint64_t vbd = token.value_base_detail();
87371
      switch (vbc) {
87372
        case WUFFS_BASE__TOKEN__VBC__FILLER:
87373
          continue;
87374
87375
        case WUFFS_BASE__TOKEN__VBC__STRUCTURE: {
87376
          if (vbd & WUFFS_BASE__TOKEN__VBD__STRUCTURE__PUSH) {
87377
            ret_error_message = callbacks.Push(static_cast<uint32_t>(vbd));
87378
            if (!ret_error_message.empty()) {
87379
              goto done;
87380
            }
87381
            depth++;
87382
            if (depth > (int32_t)WUFFS_JSON__DECODER_DEPTH_MAX_INCL) {
87383
              ret_error_message =
87384
                  "wuffs_aux::DecodeJson: internal error: bad depth";
87385
              goto done;
87386
            }
87387
            continue;
87388
          }
87389
          ret_error_message = callbacks.Pop(static_cast<uint32_t>(vbd));
87390
          depth--;
87391
          if (depth < 0) {
87392
            ret_error_message =
87393
                "wuffs_aux::DecodeJson: internal error: bad depth";
87394
            goto done;
87395
          }
87396
          goto parsed_a_value;
87397
        }
87398
87399
        case WUFFS_BASE__TOKEN__VBC__STRING: {
87400
          if (vbd & WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_0_DST_1_SRC_DROP) {
87401
            // No-op.
87402
          } else if (vbd &
87403
                     WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_1_DST_1_SRC_COPY) {
87404
            const char* ptr =  // Convert from (uint8_t*).
87405
                static_cast<const char*>(static_cast<void*>(token_ptr));
87406
            str.append(ptr, static_cast<size_t>(token_len));
87407
          } else {
87408
            goto fail;
87409
          }
87410
          if (token.continued()) {
87411
            continue;
87412
          }
87413
          ret_error_message = callbacks.AppendTextString(std::move(str));
87414
          str.clear();
87415
          goto parsed_a_value;
87416
        }
87417
87418
        case WUFFS_BASE__TOKEN__VBC__UNICODE_CODE_POINT: {
87419
          uint8_t u[WUFFS_BASE__UTF_8__BYTE_LENGTH__MAX_INCL];
87420
          size_t n = wuffs_base__utf_8__encode(
87421
              wuffs_base__make_slice_u8(
87422
                  &u[0], WUFFS_BASE__UTF_8__BYTE_LENGTH__MAX_INCL),
87423
              static_cast<uint32_t>(vbd));
87424
          const char* ptr =  // Convert from (uint8_t*).
87425
              static_cast<const char*>(static_cast<void*>(&u[0]));
87426
          str.append(ptr, n);
87427
          if (token.continued()) {
87428
            continue;
87429
          }
87430
          goto fail;
87431
        }
87432
87433
        case WUFFS_BASE__TOKEN__VBC__LITERAL: {
87434
          ret_error_message =
87435
              (vbd & WUFFS_BASE__TOKEN__VBD__LITERAL__NULL)
87436
                  ? callbacks.AppendNull()
87437
                  : callbacks.AppendBool(vbd &
87438
                                         WUFFS_BASE__TOKEN__VBD__LITERAL__TRUE);
87439
          goto parsed_a_value;
87440
        }
87441
87442
        case WUFFS_BASE__TOKEN__VBC__NUMBER: {
87443
          if (vbd & WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_TEXT) {
87444
            if (vbd & WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_INTEGER_SIGNED) {
87445
              wuffs_base__result_i64 r = wuffs_base__parse_number_i64(
87446
                  wuffs_base__make_slice_u8(token_ptr,
87447
                                            static_cast<size_t>(token_len)),
87448
                  WUFFS_BASE__PARSE_NUMBER_XXX__DEFAULT_OPTIONS);
87449
              if (r.status.is_ok()) {
87450
                ret_error_message = callbacks.AppendI64(r.value);
87451
                goto parsed_a_value;
87452
              }
87453
            }
87454
            if (vbd & WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_FLOATING_POINT) {
87455
              wuffs_base__result_f64 r = wuffs_base__parse_number_f64(
87456
                  wuffs_base__make_slice_u8(token_ptr,
87457
                                            static_cast<size_t>(token_len)),
87458
                  WUFFS_BASE__PARSE_NUMBER_XXX__DEFAULT_OPTIONS);
87459
              if (r.status.is_ok()) {
87460
                ret_error_message = callbacks.AppendF64(r.value);
87461
                goto parsed_a_value;
87462
              }
87463
            }
87464
          } else if (vbd & WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_NEG_INF) {
87465
            ret_error_message = callbacks.AppendF64(
87466
                wuffs_base__ieee_754_bit_representation__from_u64_to_f64(
87467
                    0xFFF0000000000000ul));
87468
            goto parsed_a_value;
87469
          } else if (vbd & WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_POS_INF) {
87470
            ret_error_message = callbacks.AppendF64(
87471
                wuffs_base__ieee_754_bit_representation__from_u64_to_f64(
87472
                    0x7FF0000000000000ul));
87473
            goto parsed_a_value;
87474
          } else if (vbd & WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_NEG_NAN) {
87475
            ret_error_message = callbacks.AppendF64(
87476
                wuffs_base__ieee_754_bit_representation__from_u64_to_f64(
87477
                    0xFFFFFFFFFFFFFFFFul));
87478
            goto parsed_a_value;
87479
          } else if (vbd & WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_POS_NAN) {
87480
            ret_error_message = callbacks.AppendF64(
87481
                wuffs_base__ieee_754_bit_representation__from_u64_to_f64(
87482
                    0x7FFFFFFFFFFFFFFFul));
87483
            goto parsed_a_value;
87484
          }
87485
          goto fail;
87486
        }
87487
      }
87488
87489
    fail:
87490
      ret_error_message =
87491
          "wuffs_aux::DecodeJson: internal error: unexpected token";
87492
      goto done;
87493
87494
    parsed_a_value:
87495
      // If an error was encountered, we are done. Otherwise, (depth == 0)
87496
      // after parsing a value is equivalent to having decoded the entire JSON
87497
      // value (for an empty json_pointer query) or having decoded the
87498
      // pointed-to JSON value (for a non-empty json_pointer query). In the
87499
      // latter case, we are also done.
87500
      //
87501
      // However, if quirks like WUFFS_JSON__QUIRK_ALLOW_TRAILING_FILLER or
87502
      // WUFFS_JSON__QUIRK_EXPECT_TRAILING_NEW_LINE_OR_EOF are passed, decoding
87503
      // the entire JSON value should also consume any trailing filler, in case
87504
      // the DecodeJson caller wants to subsequently check that the input is
87505
      // completely exhausted (and otherwise raise "valid JSON followed by
87506
      // further (unexpected) data"). We aren't done yet. Instead, keep the
87507
      // loop running until WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN's
87508
      // decode_tokens returns an ok status.
87509
      if (!ret_error_message.empty() ||
87510
          ((depth == 0) && !json_pointer.repr.empty())) {
87511
        goto done;
87512
      }
87513
    }
87514
  } while (false);
87515
87516
done:
87517
  DecodeJsonResult result(
87518
      std::move(ret_error_message),
87519
      wuffs_base__u64__sat_add(io_buf->meta.pos, cursor_index));
87520
  callbacks.Done(result, input, *io_buf);
87521
  return result;
87522
}
87523
87524
#undef WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN
87525
87526
}  // namespace wuffs_aux
87527
87528
#endif  // !defined(WUFFS_CONFIG__MODULES) ||
87529
        // defined(WUFFS_CONFIG__MODULE__AUX__JSON)
87530
87531
#endif  // defined(__cplusplus) && defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
87532
87533
87534
// ---------------- Wuffs' reimplementation of the STB API.
87535
//
87536
// This is a drop-in replacement of that third-party library.
87537
//
87538
// Disabled by default, unless you #define the
87539
// WUFFS_CONFIG__ENABLE_DROP_IN_REPLACEMENT__STB macro beforehand.
87540
//
87541
// For API docs, see https://github.com/nothings/stb
87542
87543
#if defined(WUFFS_CONFIG__ENABLE_DROP_IN_REPLACEMENT__STB)
87544
87545
#include <limits.h>
87546
#include <stdlib.h>
87547
87548
#ifdef __cplusplus
87549
extern "C" {
87550
#endif
87551
87552
// --------
87553
87554
#if defined(__GNUC__)
87555
__thread const char*  //
87556
    wuffs_drop_in__stb__g_failure_reason = NULL;
87557
#elif defined(_MSC_VER)
87558
__declspec(thread) const char*  //
87559
    wuffs_drop_in__stb__g_failure_reason = NULL;
87560
#else
87561
const char*  //
87562
    wuffs_drop_in__stb__g_failure_reason = NULL;
87563
#endif
87564
87565
// --------
87566
87567
static void                         //
87568
wuffs_drop_in__stb__read(           //
87569
    wuffs_base__io_buffer* srcbuf,  //
87570
    stbi_io_callbacks const* clbk,  //
87571
    void* user) {
87572
  uint8_t* ptr = wuffs_base__io_buffer__writer_pointer(srcbuf);
87573
  size_t len = wuffs_base__io_buffer__writer_length(srcbuf);
87574
  if (len > INT_MAX) {
87575
    len = INT_MAX;
87576
  }
87577
  int n = clbk->read(user, (char*)ptr, (int)len);
87578
  if (n > 0) {
87579
    srcbuf->meta.wi += (size_t)n;
87580
  } else {
87581
    srcbuf->meta.closed = clbk->eof(user);
87582
  }
87583
}
87584
87585
static wuffs_base__image_decoder*   //
87586
wuffs_drop_in__stb__make_decoder(   //
87587
    wuffs_base__io_buffer* srcbuf,  //
87588
    stbi_io_callbacks const* clbk,  //
87589
    void* user) {
87590
  while (1) {
87591
    int32_t fourcc = wuffs_base__magic_number_guess_fourcc(
87592
        wuffs_base__io_buffer__reader_slice(srcbuf), srcbuf->meta.closed);
87593
    if (fourcc < 0) {
87594
      if (srcbuf->meta.closed || !clbk) {
87595
        break;
87596
      }
87597
      wuffs_drop_in__stb__read(srcbuf, clbk, user);
87598
      continue;
87599
    }
87600
87601
    switch (fourcc) {
87602
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BMP)
87603
      case WUFFS_BASE__FOURCC__BMP:
87604
        return wuffs_bmp__decoder__alloc_as__wuffs_base__image_decoder();
87605
#endif
87606
87607
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ETC2)
87608
      case WUFFS_BASE__FOURCC__ETC2:
87609
        return wuffs_etc2__decoder__alloc_as__wuffs_base__image_decoder();
87610
#endif
87611
87612
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GIF)
87613
      case WUFFS_BASE__FOURCC__GIF:
87614
        return wuffs_gif__decoder__alloc_as__wuffs_base__image_decoder();
87615
#endif
87616
87617
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JPEG)
87618
      case WUFFS_BASE__FOURCC__JPEG:
87619
        return wuffs_jpeg__decoder__alloc_as__wuffs_base__image_decoder();
87620
#endif
87621
87622
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NIE)
87623
      case WUFFS_BASE__FOURCC__NIE:
87624
        return wuffs_nie__decoder__alloc_as__wuffs_base__image_decoder();
87625
#endif
87626
87627
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NETPBM)
87628
      case WUFFS_BASE__FOURCC__NPBM:
87629
        return wuffs_netpbm__decoder__alloc_as__wuffs_base__image_decoder();
87630
#endif
87631
87632
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__PNG)
87633
      case WUFFS_BASE__FOURCC__PNG:
87634
        return wuffs_png__decoder__alloc_as__wuffs_base__image_decoder();
87635
#endif
87636
87637
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__QOI)
87638
      case WUFFS_BASE__FOURCC__QOI:
87639
        return wuffs_qoi__decoder__alloc_as__wuffs_base__image_decoder();
87640
#endif
87641
87642
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__TARGA)
87643
      case WUFFS_BASE__FOURCC__TGA:
87644
        return wuffs_targa__decoder__alloc_as__wuffs_base__image_decoder();
87645
#endif
87646
87647
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__THUMBHASH)
87648
      case WUFFS_BASE__FOURCC__TH:
87649
        return wuffs_thumbhash__decoder__alloc_as__wuffs_base__image_decoder();
87650
#endif
87651
87652
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WBMP)
87653
      case WUFFS_BASE__FOURCC__WBMP:
87654
        return wuffs_wbmp__decoder__alloc_as__wuffs_base__image_decoder();
87655
#endif
87656
87657
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WEBP)
87658
      case WUFFS_BASE__FOURCC__WEBP:
87659
        return wuffs_webp__decoder__alloc_as__wuffs_base__image_decoder();
87660
#endif
87661
    }
87662
87663
    wuffs_drop_in__stb__g_failure_reason = "unknown image type";
87664
    break;
87665
  }
87666
  return NULL;
87667
}
87668
87669
// --------
87670
87671
static void*                         //
87672
wuffs_drop_in__stb__load1(           //
87673
    wuffs_base__io_buffer* srcbuf,   //
87674
    stbi_io_callbacks const* clbk,   //
87675
    void* user,                      //
87676
    wuffs_base__image_decoder* dec,  //
87677
    wuffs_base__image_config* ic,    //
87678
    uint32_t dst_pixfmt,             //
87679
    int desired_channels,            //
87680
    int info_only) {
87681
  // Favor faster decodes over rejecting invalid checksums.
87682
  wuffs_base__image_decoder__set_quirk(dec, WUFFS_BASE__QUIRK_IGNORE_CHECKSUM,
87683
                                       1);
87684
87685
  while (1) {
87686
    wuffs_base__status status =
87687
        wuffs_base__image_decoder__decode_image_config(dec, ic, srcbuf);
87688
    if (status.repr == NULL) {
87689
      break;
87690
    } else if ((status.repr != wuffs_base__suspension__short_read) || !clbk) {
87691
      wuffs_drop_in__stb__g_failure_reason = status.repr;
87692
      return NULL;
87693
    }
87694
87695
    if (wuffs_base__io_buffer__compact(srcbuf) <= 0) {
87696
      wuffs_drop_in__stb__g_failure_reason = "I/O buffer is too small";
87697
      return NULL;
87698
    }
87699
    wuffs_drop_in__stb__read(srcbuf, clbk, user);
87700
  }
87701
87702
  uint32_t w = wuffs_base__pixel_config__width(&ic->pixcfg);
87703
  uint32_t h = wuffs_base__pixel_config__height(&ic->pixcfg);
87704
  if ((w > 0xFFFFFF) || (h > 0xFFFFFF)) {
87705
    wuffs_drop_in__stb__g_failure_reason = "image is too large";
87706
    return NULL;
87707
  } else if (info_only) {
87708
    return NULL;
87709
  }
87710
87711
  uint64_t pixbuf_len = (uint64_t)w * (uint64_t)h * (uint64_t)desired_channels;
87712
  uint64_t workbuf_len = wuffs_base__image_decoder__workbuf_len(dec).max_incl;
87713
#if SIZE_MAX < 0xFFFFFFFFFFFFFFFFull
87714
  if ((pixbuf_len > ((uint64_t)SIZE_MAX)) ||
87715
      (workbuf_len > ((uint64_t)SIZE_MAX))) {
87716
    wuffs_drop_in__stb__g_failure_reason = "image is too large";
87717
    return NULL;
87718
  }
87719
#endif
87720
  void* pixbuf_ptr = malloc((size_t)pixbuf_len);
87721
  if (!pixbuf_ptr) {
87722
    wuffs_drop_in__stb__g_failure_reason = "out of memory";
87723
    return NULL;
87724
  }
87725
  void* workbuf_ptr = malloc((size_t)workbuf_len);
87726
  if (!workbuf_ptr) {
87727
    free(pixbuf_ptr);
87728
    wuffs_drop_in__stb__g_failure_reason = "out of memory";
87729
    return NULL;
87730
  }
87731
  wuffs_base__slice_u8 workbuf =
87732
      wuffs_base__make_slice_u8(workbuf_ptr, (size_t)workbuf_len);
87733
87734
  wuffs_base__pixel_config pc = ((wuffs_base__pixel_config){});
87735
  wuffs_base__pixel_config__set(&pc, dst_pixfmt,
87736
                                WUFFS_BASE__PIXEL_SUBSAMPLING__NONE, w, h);
87737
87738
  wuffs_base__pixel_buffer pb = ((wuffs_base__pixel_buffer){});
87739
  {
87740
    wuffs_base__status status = wuffs_base__pixel_buffer__set_from_slice(
87741
        &pb, &pc, wuffs_base__make_slice_u8(pixbuf_ptr, (size_t)pixbuf_len));
87742
    if (status.repr) {
87743
      free(workbuf_ptr);
87744
      free(pixbuf_ptr);
87745
      wuffs_drop_in__stb__g_failure_reason = status.repr;
87746
      return NULL;
87747
    }
87748
  }
87749
87750
  while (1) {
87751
    wuffs_base__status status = wuffs_base__image_decoder__decode_frame(
87752
        dec, &pb, srcbuf, WUFFS_BASE__PIXEL_BLEND__SRC, workbuf, NULL);
87753
    if (status.repr == NULL) {
87754
      break;
87755
    } else if ((status.repr != wuffs_base__suspension__short_read) || !clbk) {
87756
      free(workbuf_ptr);
87757
      free(pixbuf_ptr);
87758
      wuffs_drop_in__stb__g_failure_reason = status.repr;
87759
      return NULL;
87760
    }
87761
87762
    if (wuffs_base__io_buffer__compact(srcbuf) <= 0) {
87763
      free(workbuf_ptr);
87764
      free(pixbuf_ptr);
87765
      wuffs_drop_in__stb__g_failure_reason = "I/O buffer is too small";
87766
      return NULL;
87767
    }
87768
    wuffs_drop_in__stb__read(srcbuf, clbk, user);
87769
  }
87770
87771
  free(workbuf_ptr);
87772
  return pixbuf_ptr;
87773
}
87774
87775
static void*                        //
87776
wuffs_drop_in__stb__load0(          //
87777
    wuffs_base__io_buffer* srcbuf,  //
87778
    stbi_io_callbacks const* clbk,  //
87779
    void* user,                     //
87780
    int* x,                         //
87781
    int* y,                         //
87782
    int* channels_in_file,          //
87783
    int desired_channels,           //
87784
    int info_only) {
87785
  uint32_t dst_pixfmt = 0;
87786
  switch (desired_channels) {
87787
    case 1:
87788
      dst_pixfmt = WUFFS_BASE__PIXEL_FORMAT__Y;
87789
      break;
87790
    case 3:
87791
      dst_pixfmt = WUFFS_BASE__PIXEL_FORMAT__RGB;
87792
      break;
87793
    case 4:
87794
      dst_pixfmt = WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL;
87795
      break;
87796
    default:
87797
      wuffs_drop_in__stb__g_failure_reason = "unsupported format conversion";
87798
      return NULL;
87799
  }
87800
87801
  wuffs_base__image_decoder* dec =
87802
      wuffs_drop_in__stb__make_decoder(srcbuf, clbk, user);
87803
  if (!dec) {
87804
    if (wuffs_drop_in__stb__g_failure_reason == NULL) {
87805
      wuffs_drop_in__stb__g_failure_reason = "couldn't allocate image decoder";
87806
    }
87807
    return NULL;
87808
  }
87809
87810
  wuffs_base__image_config ic = ((wuffs_base__image_config){});
87811
  stbi_uc* ret = wuffs_drop_in__stb__load1(
87812
      srcbuf, clbk, user, dec, &ic, dst_pixfmt, desired_channels, info_only);
87813
  free(dec);
87814
87815
  if (!info_only && !ret) {
87816
    return NULL;
87817
  }
87818
87819
  if (x) {
87820
    *x = (int)wuffs_base__pixel_config__width(&ic.pixcfg);
87821
  }
87822
  if (y) {
87823
    *y = (int)wuffs_base__pixel_config__height(&ic.pixcfg);
87824
  }
87825
  if (channels_in_file) {
87826
    wuffs_base__pixel_format src_pixfmt =
87827
        wuffs_base__pixel_config__pixel_format(&ic.pixcfg);
87828
    uint32_t n_color = wuffs_base__pixel_format__coloration(&src_pixfmt);
87829
    uint32_t n_alpha = wuffs_base__pixel_format__transparency(&src_pixfmt) !=
87830
                       WUFFS_BASE__PIXEL_ALPHA_TRANSPARENCY__OPAQUE;
87831
    *channels_in_file = (int)(n_color + n_alpha);
87832
  }
87833
87834
  return ret;
87835
}
87836
87837
// --------
87838
87839
WUFFS_DROP_IN__STB__MAYBE_STATIC int  //
87840
stbi_info_from_memory(                //
87841
    stbi_uc const* buffer,            //
87842
    int len,                          //
87843
    int* x,                           //
87844
    int* y,                           //
87845
    int* comp) {
87846
  wuffs_drop_in__stb__g_failure_reason = NULL;
87847
  if (len < 0) {
87848
    wuffs_drop_in__stb__g_failure_reason = "negative buffer length";
87849
    return 0;
87850
  } else if (len == 0) {
87851
    wuffs_drop_in__stb__g_failure_reason = "empty buffer";
87852
    return 0;
87853
  }
87854
  wuffs_base__io_buffer srcbuf =
87855
      wuffs_base__ptr_u8__reader((uint8_t*)(stbi_uc*)buffer, (size_t)len, true);
87856
  wuffs_drop_in__stb__load0(&srcbuf, NULL, NULL, x, y, comp, 1, 1);
87857
  return wuffs_drop_in__stb__g_failure_reason == NULL;
87858
}
87859
87860
WUFFS_DROP_IN__STB__MAYBE_STATIC stbi_uc*  //
87861
stbi_load_from_memory(                     //
87862
    stbi_uc const* buffer,                 //
87863
    int len,                               //
87864
    int* x,                                //
87865
    int* y,                                //
87866
    int* channels_in_file,                 //
87867
    int desired_channels) {
87868
  wuffs_drop_in__stb__g_failure_reason = NULL;
87869
  if (len < 0) {
87870
    wuffs_drop_in__stb__g_failure_reason = "negative buffer length";
87871
    return NULL;
87872
  } else if (len == 0) {
87873
    wuffs_drop_in__stb__g_failure_reason = "empty buffer";
87874
    return NULL;
87875
  }
87876
  wuffs_base__io_buffer srcbuf =
87877
      wuffs_base__ptr_u8__reader((uint8_t*)(stbi_uc*)buffer, (size_t)len, true);
87878
  return wuffs_drop_in__stb__load0(&srcbuf, NULL, NULL, x, y, channels_in_file,
87879
                                   desired_channels, 0);
87880
}
87881
87882
WUFFS_DROP_IN__STB__MAYBE_STATIC int  //
87883
stbi_info_from_callbacks(             //
87884
    stbi_io_callbacks const* clbk,    //
87885
    void* user,                       //
87886
    int* x,                           //
87887
    int* y,                           //
87888
    int* comp) {
87889
  wuffs_drop_in__stb__g_failure_reason = NULL;
87890
  void* iobuf_ptr = malloc(65536u);
87891
  if (!iobuf_ptr) {
87892
    wuffs_drop_in__stb__g_failure_reason = "out of memory";
87893
    return 0;
87894
  }
87895
  wuffs_base__io_buffer srcbuf =
87896
      wuffs_base__ptr_u8__writer((uint8_t*)iobuf_ptr, 65536u);
87897
  wuffs_drop_in__stb__load0(&srcbuf, clbk, user, x, y, comp, 1, 1);
87898
  free(iobuf_ptr);
87899
  return wuffs_drop_in__stb__g_failure_reason == NULL;
87900
}
87901
87902
WUFFS_DROP_IN__STB__MAYBE_STATIC stbi_uc*  //
87903
stbi_load_from_callbacks(                  //
87904
    stbi_io_callbacks const* clbk,         //
87905
    void* user,                            //
87906
    int* x,                                //
87907
    int* y,                                //
87908
    int* channels_in_file,                 //
87909
    int desired_channels) {
87910
  wuffs_drop_in__stb__g_failure_reason = NULL;
87911
  void* iobuf_ptr = malloc(65536u);
87912
  if (!iobuf_ptr) {
87913
    wuffs_drop_in__stb__g_failure_reason = "out of memory";
87914
    return NULL;
87915
  }
87916
  wuffs_base__io_buffer srcbuf =
87917
      wuffs_base__ptr_u8__writer((uint8_t*)iobuf_ptr, 65536u);
87918
  stbi_uc* ret = wuffs_drop_in__stb__load0(
87919
      &srcbuf, clbk, user, x, y, channels_in_file, desired_channels, 0);
87920
  free(iobuf_ptr);
87921
  return ret;
87922
}
87923
87924
WUFFS_DROP_IN__STB__MAYBE_STATIC void  //
87925
stbi_image_free(                       //
87926
    void* retval_from_stbi_load) {
87927
  wuffs_drop_in__stb__g_failure_reason = NULL;
87928
  free(retval_from_stbi_load);
87929
}
87930
87931
WUFFS_DROP_IN__STB__MAYBE_STATIC const char*  //
87932
stbi_failure_reason(void) {
87933
  return wuffs_drop_in__stb__g_failure_reason
87934
             ? wuffs_drop_in__stb__g_failure_reason
87935
             : "ok";
87936
}
87937
87938
// --------
87939
87940
#if !defined(STBI_NO_STDIO)
87941
87942
#include <stdio.h>
87943
87944
// TODO: retry after EINTR?
87945
87946
static int                                 //
87947
wuffs_drop_in__stb__file_callbacks__read(  //
87948
    void* user,                            //
87949
    char* data,                            //
87950
    int size) {
87951
  return (int)fread(data, 1u, (size_t)size, (FILE*)user);
87952
}
87953
87954
static void                                //
87955
wuffs_drop_in__stb__file_callbacks__skip(  //
87956
    void* user,                            //
87957
    int n) {
87958
  fseek((FILE*)user, (long)n, SEEK_CUR);
87959
}
87960
87961
static int                                //
87962
wuffs_drop_in__stb__file_callbacks__eof(  //
87963
    void* user) {
87964
  return feof((FILE*)user);
87965
}
87966
87967
WUFFS_DROP_IN__STB__MAYBE_STATIC int  //
87968
stbi_info(                            //
87969
    char const* filename,             //
87970
    int* x,                           //
87971
    int* y,                           //
87972
    int* comp) {
87973
  wuffs_drop_in__stb__g_failure_reason = NULL;
87974
  FILE* f = fopen(filename, "rb");
87975
  if (!f) {
87976
    wuffs_drop_in__stb__g_failure_reason = "could not open file";
87977
    return 0;
87978
  }
87979
  int ret = stbi_info_from_file(f, x, y, comp);
87980
  fclose(f);
87981
  return ret;
87982
}
87983
87984
WUFFS_DROP_IN__STB__MAYBE_STATIC stbi_uc*  //
87985
stbi_load(                                 //
87986
    char const* filename,                  //
87987
    int* x,                                //
87988
    int* y,                                //
87989
    int* channels_in_file,                 //
87990
    int desired_channels) {
87991
  wuffs_drop_in__stb__g_failure_reason = NULL;
87992
  FILE* f = fopen(filename, "rb");
87993
  if (!f) {
87994
    wuffs_drop_in__stb__g_failure_reason = "could not open file";
87995
    return NULL;
87996
  }
87997
  stbi_uc* ret =
87998
      stbi_load_from_file(f, x, y, channels_in_file, desired_channels);
87999
  fclose(f);
88000
  return ret;
88001
}
88002
88003
WUFFS_DROP_IN__STB__MAYBE_STATIC int  //
88004
stbi_info_from_file(                  //
88005
    FILE* f,                          //
88006
    int* x,                           //
88007
    int* y,                           //
88008
    int* comp) {
88009
  wuffs_drop_in__stb__g_failure_reason = NULL;
88010
  void* iobuf_ptr = malloc(65536u);
88011
  if (!iobuf_ptr) {
88012
    wuffs_drop_in__stb__g_failure_reason = "out of memory";
88013
    return 0;
88014
  }
88015
  wuffs_base__io_buffer srcbuf =
88016
      wuffs_base__ptr_u8__writer((uint8_t*)iobuf_ptr, 65536u);
88017
  stbi_io_callbacks clbk;
88018
  clbk.read = &wuffs_drop_in__stb__file_callbacks__read;
88019
  clbk.skip = &wuffs_drop_in__stb__file_callbacks__skip;
88020
  clbk.eof = &wuffs_drop_in__stb__file_callbacks__eof;
88021
  wuffs_drop_in__stb__load0(&srcbuf, &clbk, f, x, y, comp, 1, 1);
88022
  free(iobuf_ptr);
88023
  return wuffs_drop_in__stb__g_failure_reason == NULL;
88024
}
88025
88026
WUFFS_DROP_IN__STB__MAYBE_STATIC stbi_uc*  //
88027
stbi_load_from_file(                       //
88028
    FILE* f,                               //
88029
    int* x,                                //
88030
    int* y,                                //
88031
    int* channels_in_file,                 //
88032
    int desired_channels) {
88033
  wuffs_drop_in__stb__g_failure_reason = NULL;
88034
  void* iobuf_ptr = malloc(65536u);
88035
  if (!iobuf_ptr) {
88036
    wuffs_drop_in__stb__g_failure_reason = "out of memory";
88037
    return NULL;
88038
  }
88039
  wuffs_base__io_buffer srcbuf =
88040
      wuffs_base__ptr_u8__writer((uint8_t*)iobuf_ptr, 65536u);
88041
  stbi_io_callbacks clbk;
88042
  clbk.read = &wuffs_drop_in__stb__file_callbacks__read;
88043
  clbk.skip = &wuffs_drop_in__stb__file_callbacks__skip;
88044
  clbk.eof = &wuffs_drop_in__stb__file_callbacks__eof;
88045
  stbi_uc* ret = wuffs_drop_in__stb__load0(
88046
      &srcbuf, &clbk, f, x, y, channels_in_file, desired_channels, 0);
88047
  free(iobuf_ptr);
88048
  return ret;
88049
}
88050
88051
#endif  // !defined(STBI_NO_STDIO)
88052
88053
// --------
88054
88055
#ifdef __cplusplus
88056
}  // extern "C"
88057
#endif
88058
88059
#endif  // defined (WUFFS_CONFIG__ENABLE_DROP_IN_REPLACEMENT__STB)
88060
#endif  // WUFFS_IMPLEMENTATION
88061
88062
#if defined(__GNUC__)
88063
#pragma GCC diagnostic pop
88064
#elif defined(__clang__)
88065
#pragma clang diagnostic pop
88066
#endif
88067
88068
#endif  // WUFFS_INCLUDE_GUARD