Coverage Report

Created: 2025-08-24 06:48

/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
3.72k
#define WUFFS_VERSION 0
85
3.72k
#define WUFFS_VERSION_MAJOR 0
86
3.72k
#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
3.66k
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
3.66k
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64)
305
  // GCC defines these macros but MSVC does not.
306
  //  - bit_AVX2 = (1 <<  5)
307
3.66k
  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
3.66k
  const unsigned int avx2_ecx1 = 0x00900002;
313
314
  // clang defines __GNUC__ and clang-cl defines _MSC_VER (but not __GNUC__).
315
3.66k
#if defined(__GNUC__)
316
3.66k
  unsigned int eax7 = 0;
317
3.66k
  unsigned int ebx7 = 0;
318
3.66k
  unsigned int ecx7 = 0;
319
3.66k
  unsigned int edx7 = 0;
320
3.66k
  if (__get_cpuid_count(7, 0, &eax7, &ebx7, &ecx7, &edx7) &&
321
3.66k
      ((ebx7 & avx2_ebx7) == avx2_ebx7)) {
322
3.66k
    unsigned int eax1 = 0;
323
3.66k
    unsigned int ebx1 = 0;
324
3.66k
    unsigned int ecx1 = 0;
325
3.66k
    unsigned int edx1 = 0;
326
3.66k
    if (__get_cpuid(1, &eax1, &ebx1, &ecx1, &edx1) &&
327
3.66k
        ((ecx1 & avx2_ecx1) == avx2_ecx1)) {
328
3.66k
      return true;
329
3.66k
    }
330
3.66k
  }
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
3.66k
#endif  // defined(__PCLMUL__) && defined(__POPCNT__) && defined(__SSE4_2__) &&
347
        // defined(__AVX2__)
348
3.66k
}
349
350
static inline bool  //
351
0
wuffs_base__cpu_arch__have_x86_bmi2(void) {
352
0
#if defined(__BMI2__)
353
0
  return true;
354
0
#else
355
0
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64)
356
0
  // GCC defines these macros but MSVC does not.
357
0
  //  - bit_BMI2 = (1 <<  8)
358
0
  const unsigned int bmi2_ebx7 = 0x00000100;
359
0
360
0
  // clang defines __GNUC__ and clang-cl defines _MSC_VER (but not __GNUC__).
361
0
#if defined(__GNUC__)
362
0
  unsigned int eax7 = 0;
363
0
  unsigned int ebx7 = 0;
364
0
  unsigned int ecx7 = 0;
365
0
  unsigned int edx7 = 0;
366
0
  if (__get_cpuid_count(7, 0, &eax7, &ebx7, &ecx7, &edx7) &&
367
0
      ((ebx7 & bmi2_ebx7) == bmi2_ebx7)) {
368
0
    return true;
369
0
  }
370
0
#elif defined(_MSC_VER)  // defined(__GNUC__)
371
0
  int x7[4];
372
0
  __cpuidex(x7, 7, 0);
373
0
  if ((((unsigned int)(x7[1])) & bmi2_ebx7) == bmi2_ebx7) {
374
0
    return true;
375
0
  }
376
0
#else
377
0
#error "WUFFS_PRIVATE_IMPL__CPU_ARCH__ETC combined with an unsupported compiler"
378
0
#endif  // defined(__GNUC__); defined(_MSC_VER)
379
0
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64)
380
0
  return false;
381
0
#endif  // defined(__BMI2__)
382
0
}
383
384
static inline bool  //
385
946
wuffs_base__cpu_arch__have_x86_sse42(void) {
386
#if defined(__PCLMUL__) && defined(__POPCNT__) && defined(__SSE4_2__)
387
  return true;
388
#else
389
946
#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
946
  const unsigned int sse42_ecx1 = 0x00900002;
395
396
  // clang defines __GNUC__ and clang-cl defines _MSC_VER (but not __GNUC__).
397
946
#if defined(__GNUC__)
398
946
  unsigned int eax1 = 0;
399
946
  unsigned int ebx1 = 0;
400
946
  unsigned int ecx1 = 0;
401
946
  unsigned int edx1 = 0;
402
946
  if (__get_cpuid(1, &eax1, &ebx1, &ecx1, &edx1) &&
403
946
      ((ecx1 & sse42_ecx1) == sse42_ecx1)) {
404
946
    return true;
405
946
  }
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
946
#endif  // defined(__PCLMUL__) && defined(__POPCNT__) && defined(__SSE4_2__)
418
946
}
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
5.62k
#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
5.56k
  ((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
2.54k
wuffs_base__strip_const_from_u8_ptr(const uint8_t* ptr) {
512
2.54k
  return (uint8_t*)ptr;
513
2.54k
}
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
1.25G
wuffs_base__make_empty_struct(void) {
554
1.25G
  wuffs_base__empty_struct ret;
555
1.25G
  ret.private_impl = 0;
556
1.25G
  return ret;
557
1.25G
}
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
911M
wuffs_base__make_status(const char* repr) {
635
911M
  wuffs_base__status z;
636
911M
  z.repr = repr;
637
911M
  return z;
638
911M
}
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
17.0k
wuffs_base__status__is_error(const wuffs_base__status* z) {
647
17.0k
  return z->repr && (*z->repr == '#');
648
17.0k
}
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
18.1k
wuffs_base__status__is_ok(const wuffs_base__status* z) {
657
18.1k
  return z->repr == NULL;
658
18.1k
}
659
660
static inline bool  //
661
9.71k
wuffs_base__status__is_suspension(const wuffs_base__status* z) {
662
9.71k
  return z->repr && (*z->repr == '$');
663
9.71k
}
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
3.70k
wuffs_base__status__message(const wuffs_base__status* z) {
685
3.70k
  if (z->repr) {
686
3.70k
    if ((*z->repr == '$') || (*z->repr == '#') || (*z->repr == '@')) {
687
3.70k
      return z->repr + 1;
688
3.70k
    }
689
3.70k
  }
690
0
  return z->repr;
691
3.70k
}
692
693
#ifdef __cplusplus
694
695
inline bool  //
696
wuffs_base__status::is_complete() const {
697
  return wuffs_base__status__is_complete(this);
698
}
699
700
inline bool  //
701
wuffs_base__status::is_error() const {
702
  return wuffs_base__status__is_error(this);
703
}
704
705
inline bool  //
706
wuffs_base__status::is_note() const {
707
  return wuffs_base__status__is_note(this);
708
}
709
710
inline bool  //
711
wuffs_base__status::is_ok() const {
712
  return wuffs_base__status__is_ok(this);
713
}
714
715
inline bool  //
716
wuffs_base__status::is_suspension() const {
717
  return wuffs_base__status__is_suspension(this);
718
}
719
720
inline bool  //
721
wuffs_base__status::is_truncated_input_error() const {
722
  return wuffs_base__status__is_truncated_input_error(this);
723
}
724
725
inline const char*  //
726
wuffs_base__status::message() const {
727
  return wuffs_base__status__message(this);
728
}
729
730
#endif  // __cplusplus
731
732
// --------
733
734
// WUFFS_BASE__RESULT is a result type: either a status (an error) or a value.
735
//
736
// A result with all fields NULL or zero is as valid as a zero-valued T.
737
#define WUFFS_BASE__RESULT(T)  \
738
  struct {                     \
739
    wuffs_base__status status; \
740
    T value;                   \
741
  }
742
743
typedef WUFFS_BASE__RESULT(double) wuffs_base__result_f64;
744
typedef WUFFS_BASE__RESULT(int64_t) wuffs_base__result_i64;
745
typedef WUFFS_BASE__RESULT(uint64_t) wuffs_base__result_u64;
746
747
// --------
748
749
// wuffs_base__transform__output is the result of transforming from a src slice
750
// to a dst slice.
751
typedef struct wuffs_base__transform__output__struct {
752
  wuffs_base__status status;
753
  size_t num_dst;
754
  size_t num_src;
755
} wuffs_base__transform__output;
756
757
// --------
758
759
// FourCC constants. Four Character Codes are literally four ASCII characters
760
// (sometimes padded with ' ' spaces) that pack neatly into a signed or
761
// unsigned 32-bit integer. ASCII letters are conventionally upper case.
762
//
763
// They are often used to identify video codecs (e.g. "H265") and pixel formats
764
// (e.g. "YV12"). Wuffs uses them for that but also generally for naming
765
// various things: compression formats (e.g. "BZ2 "), image metadata (e.g.
766
// "EXIF"), file formats (e.g. "HTML"), etc.
767
//
768
// Wuffs' u32 values are big-endian ("JPEG" is 0x4A504547 not 0x4745504A) to
769
// preserve ordering: "JPEG" < "MP3 " and 0x4A504547 < 0x4D503320.
770
771
// Android Binary XML (for resources; see AndroidBinXmlParser.java).
772
#define WUFFS_BASE__FOURCC__ABXR 0x41425852
773
774
// Android Binary XML (for system_server; see BinaryXmlSerializer.java).
775
#define WUFFS_BASE__FOURCC__ABXS 0x41425853
776
777
// Background Color.
778
#define WUFFS_BASE__FOURCC__BGCL 0x4247434C
779
780
// Bitmap.
781
#define WUFFS_BASE__FOURCC__BMP 0x424D5020
782
783
// Brotli.
784
#define WUFFS_BASE__FOURCC__BRTL 0x4252544C
785
786
// Bzip2.
787
#define WUFFS_BASE__FOURCC__BZ2 0x425A3220
788
789
// Concise Binary Object Representation.
790
#define WUFFS_BASE__FOURCC__CBOR 0x43424F52
791
792
// Primary Chromaticities and White Point.
793
#define WUFFS_BASE__FOURCC__CHRM 0x4348524D
794
795
// Cascading Style Sheets.
796
#define WUFFS_BASE__FOURCC__CSS 0x43535320
797
798
// Encapsulated PostScript.
799
#define WUFFS_BASE__FOURCC__EPS 0x45505320
800
801
// Ericsson Texture Compression 2 (iPACKMAN).
802
#define WUFFS_BASE__FOURCC__ETC2 0x45544332
803
804
// Exchangeable Image File Format.
805
#define WUFFS_BASE__FOURCC__EXIF 0x45584946
806
807
// Free Lossless Audio Codec.
808
#define WUFFS_BASE__FOURCC__FLAC 0x464C4143
809
810
// Gamma Correction.
811
#define WUFFS_BASE__FOURCC__GAMA 0x47414D41
812
813
// Graphics Interchange Format.
814
#define WUFFS_BASE__FOURCC__GIF 0x47494620
815
816
// GNU Zip.
817
#define WUFFS_BASE__FOURCC__GZ 0x475A2020
818
819
// High Efficiency Image File.
820
#define WUFFS_BASE__FOURCC__HEIF 0x48454946
821
822
// Handsum.
823
#define WUFFS_BASE__FOURCC__HNSM 0x484E534D
824
825
// Hypertext Markup Language.
826
#define WUFFS_BASE__FOURCC__HTML 0x48544D4C
827
828
// International Color Consortium Profile.
829
#define WUFFS_BASE__FOURCC__ICCP 0x49434350
830
831
// Icon.
832
#define WUFFS_BASE__FOURCC__ICO 0x49434F20
833
834
// Icon Vector Graphics.
835
#define WUFFS_BASE__FOURCC__ICVG 0x49435647
836
837
// Initialization.
838
#define WUFFS_BASE__FOURCC__INI 0x494E4920
839
840
// Joint Photographic Experts Group.
841
#define WUFFS_BASE__FOURCC__JPEG 0x4A504547
842
843
// JavaScript.
844
#define WUFFS_BASE__FOURCC__JS 0x4A532020
845
846
// JavaScript Object Notation.
847
#define WUFFS_BASE__FOURCC__JSON 0x4A534F4E
848
849
// JSON With Commas and Comments.
850
#define WUFFS_BASE__FOURCC__JWCC 0x4A574343
851
852
// Key-Value Pair.
853
#define WUFFS_BASE__FOURCC__KVP 0x4B565020
854
855
// Key-Value Pair (Key).
856
#define WUFFS_BASE__FOURCC__KVPK 0x4B56504B
857
858
// Key-Value Pair (Value).
859
#define WUFFS_BASE__FOURCC__KVPV 0x4B565056
860
861
// Lempelโ€“Ziv 4.
862
#define WUFFS_BASE__FOURCC__LZ4 0x4C5A3420
863
864
// Lzip.
865
#define WUFFS_BASE__FOURCC__LZIP 0x4C5A4950
866
867
// Lempelโ€“Ziv Markov-chain Algorithm.
868
#define WUFFS_BASE__FOURCC__LZMA 0x4C5A4D41
869
870
// Markdown.
871
#define WUFFS_BASE__FOURCC__MD 0x4D442020
872
873
// Modification Time.
874
#define WUFFS_BASE__FOURCC__MTIM 0x4D54494D
875
876
// MPEG-1 Audio Layer III.
877
#define WUFFS_BASE__FOURCC__MP3 0x4D503320
878
879
// Naive Image.
880
#define WUFFS_BASE__FOURCC__NIE 0x4E494520
881
882
// Netpbm (Portable Anymap).
883
#define WUFFS_BASE__FOURCC__NPBM 0x4E50424D
884
885
// Offset (2-Dimensional).
886
#define WUFFS_BASE__FOURCC__OFS2 0x4F465332
887
888
// Open Type Format.
889
#define WUFFS_BASE__FOURCC__OTF 0x4F544620
890
891
// Portable Document Format.
892
#define WUFFS_BASE__FOURCC__PDF 0x50444620
893
894
// Physical Dimensions.
895
#define WUFFS_BASE__FOURCC__PHYD 0x50485944
896
897
// Portable Network Graphics.
898
#define WUFFS_BASE__FOURCC__PNG 0x504E4720
899
900
// PostScript.
901
#define WUFFS_BASE__FOURCC__PS 0x50532020
902
903
// Quite OK Image.
904
#define WUFFS_BASE__FOURCC__QOI 0x514F4920
905
906
// Random Access Compression.
907
#define WUFFS_BASE__FOURCC__RAC 0x52414320
908
909
// Raw.
910
#define WUFFS_BASE__FOURCC__RAW 0x52415720
911
912
// Resource Interchange File Format.
913
#define WUFFS_BASE__FOURCC__RIFF 0x52494646
914
915
// Riegeli Records.
916
#define WUFFS_BASE__FOURCC__RIGL 0x5249474C
917
918
// Snappy.
919
#define WUFFS_BASE__FOURCC__SNPY 0x534E5059
920
921
// Standard Red Green Blue (Rendering Intent).
922
#define WUFFS_BASE__FOURCC__SRGB 0x53524742
923
924
// Scalable Vector Graphics.
925
#define WUFFS_BASE__FOURCC__SVG 0x53564720
926
927
// Tape Archive.
928
#define WUFFS_BASE__FOURCC__TAR 0x54415220
929
930
// Text.
931
#define WUFFS_BASE__FOURCC__TEXT 0x54455854
932
933
// Truevision Advanced Raster Graphics Adapter.
934
#define WUFFS_BASE__FOURCC__TGA 0x54474120
935
936
// Thumbhash.
937
#define WUFFS_BASE__FOURCC__TH 0x54482020
938
939
// Tagged Image File Format.
940
#define WUFFS_BASE__FOURCC__TIFF 0x54494646
941
942
// Tom's Obvious Minimal Language.
943
#define WUFFS_BASE__FOURCC__TOML 0x544F4D4C
944
945
// Waveform.
946
#define WUFFS_BASE__FOURCC__WAVE 0x57415645
947
948
// Wireless Bitmap.
949
#define WUFFS_BASE__FOURCC__WBMP 0x57424D50
950
951
// Web Picture.
952
#define WUFFS_BASE__FOURCC__WEBP 0x57454250
953
954
// Web Open Font Format.
955
#define WUFFS_BASE__FOURCC__WOFF 0x574F4646
956
957
// Extensible Markup Language.
958
#define WUFFS_BASE__FOURCC__XML 0x584D4C20
959
960
// Extensible Metadata Platform.
961
#define WUFFS_BASE__FOURCC__XMP 0x584D5020
962
963
// Xz.
964
#define WUFFS_BASE__FOURCC__XZ 0x585A2020
965
966
// Zip.
967
#define WUFFS_BASE__FOURCC__ZIP 0x5A495020
968
969
// Zlib.
970
#define WUFFS_BASE__FOURCC__ZLIB 0x5A4C4942
971
972
// Zstandard.
973
#define WUFFS_BASE__FOURCC__ZSTD 0x5A535444
974
975
// --------
976
977
// Quirks.
978
979
#define WUFFS_BASE__QUIRK_IGNORE_CHECKSUM 1
980
981
#define WUFFS_BASE__QUIRK_QUALITY 2
982
983
// --------
984
985
// Flicks are a unit of time. One flick (frame-tick) is 1 / 705_600_000 of a
986
// second. See https://github.com/OculusVR/Flicks
987
typedef int64_t wuffs_base__flicks;
988
989
#define WUFFS_BASE__FLICKS_PER_SECOND ((uint64_t)705600000)
990
#define WUFFS_BASE__FLICKS_PER_MILLISECOND ((uint64_t)705600)
991
992
// ---------------- Numeric Types
993
994
// The helpers below are functions, instead of macros, because their arguments
995
// can be an expression that we shouldn't evaluate more than once.
996
//
997
// They are static, so that linking multiple wuffs .o files won't complain about
998
// duplicate function definitions.
999
//
1000
// They are explicitly marked inline, even if modern compilers don't use the
1001
// inline attribute to guide optimizations such as inlining, to avoid the
1002
// -Wunused-function warning, and we like to compile with -Wall -Werror.
1003
1004
static inline int8_t  //
1005
0
wuffs_base__i8__min(int8_t x, int8_t y) {
1006
0
  return x < y ? x : y;
1007
0
}
1008
1009
static inline int8_t  //
1010
0
wuffs_base__i8__max(int8_t x, int8_t y) {
1011
0
  return x > y ? x : y;
1012
0
}
1013
1014
static inline int16_t  //
1015
0
wuffs_base__i16__min(int16_t x, int16_t y) {
1016
0
  return x < y ? x : y;
1017
0
}
1018
1019
static inline int16_t  //
1020
0
wuffs_base__i16__max(int16_t x, int16_t y) {
1021
0
  return x > y ? x : y;
1022
0
}
1023
1024
static inline int32_t  //
1025
0
wuffs_base__i32__min(int32_t x, int32_t y) {
1026
0
  return x < y ? x : y;
1027
0
}
1028
1029
static inline int32_t  //
1030
0
wuffs_base__i32__max(int32_t x, int32_t y) {
1031
0
  return x > y ? x : y;
1032
0
}
1033
1034
static inline int64_t  //
1035
0
wuffs_base__i64__min(int64_t x, int64_t y) {
1036
0
  return x < y ? x : y;
1037
0
}
1038
1039
static inline int64_t  //
1040
0
wuffs_base__i64__max(int64_t x, int64_t y) {
1041
0
  return x > y ? x : y;
1042
0
}
1043
1044
static inline uint8_t  //
1045
4.30k
wuffs_base__u8__min(uint8_t x, uint8_t y) {
1046
4.30k
  return x < y ? x : y;
1047
4.30k
}
1048
1049
static inline uint8_t  //
1050
0
wuffs_base__u8__max(uint8_t x, uint8_t y) {
1051
0
  return x > y ? x : y;
1052
0
}
1053
1054
static inline uint16_t  //
1055
0
wuffs_base__u16__min(uint16_t x, uint16_t y) {
1056
0
  return x < y ? x : y;
1057
0
}
1058
1059
static inline uint16_t  //
1060
0
wuffs_base__u16__max(uint16_t x, uint16_t y) {
1061
0
  return x > y ? x : y;
1062
0
}
1063
1064
static inline uint32_t  //
1065
1.01G
wuffs_base__u32__min(uint32_t x, uint32_t y) {
1066
1.01G
  return x < y ? x : y;
1067
1.01G
}
1068
1069
static inline uint32_t  //
1070
9.46k
wuffs_base__u32__max(uint32_t x, uint32_t y) {
1071
9.46k
  return x > y ? x : y;
1072
9.46k
}
1073
1074
static inline uint64_t  //
1075
0
wuffs_base__u64__min(uint64_t x, uint64_t y) {
1076
0
  return x < y ? x : y;
1077
0
}
1078
1079
static inline uint64_t  //
1080
0
wuffs_base__u64__max(uint64_t x, uint64_t y) {
1081
0
  return x > y ? x : y;
1082
0
}
1083
1084
// --------
1085
1086
static inline uint8_t  //
1087
0
wuffs_base__u8__rotate_left(uint8_t x, uint32_t n) {
1088
0
  n &= 7;
1089
0
  return ((uint8_t)(x << n)) | ((uint8_t)(x >> (8 - n)));
1090
0
}
1091
1092
static inline uint8_t  //
1093
0
wuffs_base__u8__rotate_right(uint8_t x, uint32_t n) {
1094
0
  n &= 7;
1095
0
  return ((uint8_t)(x >> n)) | ((uint8_t)(x << (8 - n)));
1096
0
}
1097
1098
static inline uint16_t  //
1099
0
wuffs_base__u16__rotate_left(uint16_t x, uint32_t n) {
1100
0
  n &= 15;
1101
0
  return ((uint16_t)(x << n)) | ((uint16_t)(x >> (16 - n)));
1102
0
}
1103
1104
static inline uint16_t  //
1105
0
wuffs_base__u16__rotate_right(uint16_t x, uint32_t n) {
1106
0
  n &= 15;
1107
0
  return ((uint16_t)(x >> n)) | ((uint16_t)(x << (16 - n)));
1108
0
}
1109
1110
static inline uint32_t  //
1111
0
wuffs_base__u32__rotate_left(uint32_t x, uint32_t n) {
1112
0
  n &= 31;
1113
0
  return ((uint32_t)(x << n)) | ((uint32_t)(x >> (32 - n)));
1114
0
}
1115
1116
static inline uint32_t  //
1117
0
wuffs_base__u32__rotate_right(uint32_t x, uint32_t n) {
1118
0
  n &= 31;
1119
0
  return ((uint32_t)(x >> n)) | ((uint32_t)(x << (32 - n)));
1120
0
}
1121
1122
static inline uint64_t  //
1123
0
wuffs_base__u64__rotate_left(uint64_t x, uint32_t n) {
1124
0
  n &= 63;
1125
0
  return ((uint64_t)(x << n)) | ((uint64_t)(x >> (64 - n)));
1126
0
}
1127
1128
static inline uint64_t  //
1129
3.72k
wuffs_base__u64__rotate_right(uint64_t x, uint32_t n) {
1130
3.72k
  n &= 63;
1131
3.72k
  return ((uint64_t)(x >> n)) | ((uint64_t)(x << (64 - n)));
1132
3.72k
}
1133
1134
// --------
1135
1136
// Saturating arithmetic (sat_add, sat_sub) branchless bit-twiddling algorithms
1137
// are per https://locklessinc.com/articles/sat_arithmetic/
1138
//
1139
// It is important that the underlying types are unsigned integers, as signed
1140
// integer arithmetic overflow is undefined behavior in C.
1141
1142
static inline uint8_t  //
1143
0
wuffs_base__u8__sat_add(uint8_t x, uint8_t y) {
1144
0
  uint8_t res = (uint8_t)(x + y);
1145
0
  res |= (uint8_t)(-(res < x));
1146
0
  return res;
1147
0
}
1148
1149
static inline uint8_t  //
1150
0
wuffs_base__u8__sat_sub(uint8_t x, uint8_t y) {
1151
0
  uint8_t res = (uint8_t)(x - y);
1152
0
  res &= (uint8_t)(-(res <= x));
1153
0
  return res;
1154
0
}
1155
1156
static inline uint16_t  //
1157
0
wuffs_base__u16__sat_add(uint16_t x, uint16_t y) {
1158
0
  uint16_t res = (uint16_t)(x + y);
1159
0
  res |= (uint16_t)(-(res < x));
1160
0
  return res;
1161
0
}
1162
1163
static inline uint16_t  //
1164
0
wuffs_base__u16__sat_sub(uint16_t x, uint16_t y) {
1165
0
  uint16_t res = (uint16_t)(x - y);
1166
0
  res &= (uint16_t)(-(res <= x));
1167
0
  return res;
1168
0
}
1169
1170
static inline uint32_t  //
1171
1.80k
wuffs_base__u32__sat_add(uint32_t x, uint32_t y) {
1172
1.80k
  uint32_t res = (uint32_t)(x + y);
1173
1.80k
  res |= (uint32_t)(-(res < x));
1174
1.80k
  return res;
1175
1.80k
}
1176
1177
static inline uint32_t  //
1178
996M
wuffs_base__u32__sat_sub(uint32_t x, uint32_t y) {
1179
996M
  uint32_t res = (uint32_t)(x - y);
1180
996M
  res &= (uint32_t)(-(res <= x));
1181
996M
  return res;
1182
996M
}
1183
1184
static inline uint64_t  //
1185
24.7M
wuffs_base__u64__sat_add(uint64_t x, uint64_t y) {
1186
24.7M
  uint64_t res = (uint64_t)(x + y);
1187
24.7M
  res |= (uint64_t)(-(res < x));
1188
24.7M
  return res;
1189
24.7M
}
1190
1191
static inline uint64_t  //
1192
0
wuffs_base__u64__sat_sub(uint64_t x, uint64_t y) {
1193
0
  uint64_t res = (uint64_t)(x - y);
1194
0
  res &= (uint64_t)(-(res <= x));
1195
0
  return res;
1196
0
}
1197
1198
// --------
1199
1200
typedef struct wuffs_base__multiply_u64__output__struct {
1201
  uint64_t lo;
1202
  uint64_t hi;
1203
} wuffs_base__multiply_u64__output;
1204
1205
// wuffs_base__multiply_u64 returns x*y as a 128-bit value.
1206
//
1207
// The maximum inclusive output hi_lo is 0xFFFFFFFFFFFFFFFE_0000000000000001.
1208
static inline wuffs_base__multiply_u64__output  //
1209
0
wuffs_base__multiply_u64(uint64_t x, uint64_t y) {
1210
0
#if defined(__SIZEOF_INT128__)
1211
0
  __uint128_t z = ((__uint128_t)x) * ((__uint128_t)y);
1212
0
  wuffs_base__multiply_u64__output o;
1213
0
  o.lo = ((uint64_t)(z));
1214
0
  o.hi = ((uint64_t)(z >> 64));
1215
0
  return o;
1216
#else
1217
  // TODO: consider using the _mul128 intrinsic if defined(_MSC_VER).
1218
  uint64_t x0 = x & 0xFFFFFFFF;
1219
  uint64_t x1 = x >> 32;
1220
  uint64_t y0 = y & 0xFFFFFFFF;
1221
  uint64_t y1 = y >> 32;
1222
  uint64_t w0 = x0 * y0;
1223
  uint64_t t = (x1 * y0) + (w0 >> 32);
1224
  uint64_t w1 = t & 0xFFFFFFFF;
1225
  uint64_t w2 = t >> 32;
1226
  w1 += x0 * y1;
1227
  wuffs_base__multiply_u64__output o;
1228
  o.lo = x * y;
1229
  o.hi = (x1 * y1) + w2 + (w1 >> 32);
1230
  return o;
1231
#endif
1232
0
}
1233
1234
// --------
1235
1236
typedef struct wuffs_base__bitvec256__struct {
1237
  // elements_u64[0] holds the LSBs (least significant bits) and
1238
  // elements_u64[3] holds the MSBs (most significant bits).
1239
  uint64_t elements_u64[4];
1240
} wuffs_base__bitvec256;
1241
1242
static inline wuffs_base__bitvec256  //
1243
wuffs_base__make_bitvec256(uint64_t e00,
1244
                           uint64_t e01,
1245
                           uint64_t e02,
1246
0
                           uint64_t e03) {
1247
0
  wuffs_base__bitvec256 res;
1248
0
  res.elements_u64[0] = e00;
1249
0
  res.elements_u64[1] = e01;
1250
0
  res.elements_u64[2] = e02;
1251
0
  res.elements_u64[3] = e03;
1252
0
  return res;
1253
0
}
1254
1255
static inline uint64_t  //
1256
0
wuffs_base__bitvec256__get_u64(const wuffs_base__bitvec256* b, uint32_t i) {
1257
0
  return b->elements_u64[i & 3];
1258
0
}
1259
1260
// --------
1261
1262
// wuffs_base__optional_u63 is like a std::optional<uint64_t>, but for C (not
1263
// just C++) and the value can only hold 63 bits (not 64).
1264
//
1265
// Do not manipulate repr directly; it is a private implementation detail.
1266
typedef struct wuffs_base__optional_u63__struct {
1267
  uint64_t repr;
1268
1269
#ifdef __cplusplus
1270
  inline bool has_value() const;
1271
  inline uint64_t value() const;
1272
  inline uint64_t value_or(uint64_t default_value) const;
1273
#endif  // __cplusplus
1274
1275
} wuffs_base__optional_u63;
1276
1277
// wuffs_base__make_optional_u63 ignores value when has_value is false.
1278
//
1279
// Preconditions:
1280
//  - value < (1 << 63).
1281
static inline wuffs_base__optional_u63  //
1282
0
wuffs_base__make_optional_u63(bool has_value, uint64_t value) {
1283
0
  wuffs_base__optional_u63 res;
1284
0
  res.repr = has_value ? ((value << 1u) | 1u) : 0u;
1285
0
  return res;
1286
0
}
1287
1288
static inline bool  //
1289
0
wuffs_base__optional_u63__has_value(const wuffs_base__optional_u63* o) {
1290
0
  return o->repr;
1291
0
}
1292
1293
// wuffs_base__optional_u63__value returns zero when o does not have a value.
1294
static inline uint64_t  //
1295
0
wuffs_base__optional_u63__value(const wuffs_base__optional_u63* o) {
1296
0
  return o->repr >> 1u;
1297
0
}
1298
1299
static inline uint64_t  //
1300
wuffs_base__optional_u63__value_or(const wuffs_base__optional_u63* o,
1301
0
                                   uint64_t default_value) {
1302
0
  return o->repr ? (o->repr >> 1u) : default_value;
1303
0
}
1304
1305
#ifdef __cplusplus
1306
1307
inline bool  //
1308
wuffs_base__optional_u63::has_value() const {
1309
  return wuffs_base__optional_u63__has_value(this);
1310
}
1311
1312
inline uint64_t  //
1313
wuffs_base__optional_u63::value() const {
1314
  return wuffs_base__optional_u63__value(this);
1315
}
1316
1317
inline uint64_t  //
1318
wuffs_base__optional_u63::value_or(uint64_t default_value) const {
1319
  return wuffs_base__optional_u63__value_or(this, default_value);
1320
}
1321
1322
#endif  // __cplusplus
1323
1324
// --------
1325
1326
// The "defined(__clang__)" isn't redundant. While vanilla clang defines
1327
// __GNUC__, clang-cl (which mimics MSVC's cl.exe) does not.
1328
#if (defined(__GNUC__) || defined(__clang__)) && (__SIZEOF_LONG__ == 8)
1329
1330
static inline uint32_t  //
1331
0
wuffs_base__count_leading_zeroes_u64(uint64_t u) {
1332
0
  return u ? ((uint32_t)(__builtin_clzl(u))) : 64u;
1333
0
}
1334
1335
#else
1336
// TODO: consider using the _BitScanReverse intrinsic if defined(_MSC_VER).
1337
1338
static inline uint32_t  //
1339
wuffs_base__count_leading_zeroes_u64(uint64_t u) {
1340
  if (u == 0) {
1341
    return 64;
1342
  }
1343
1344
  uint32_t n = 0;
1345
  if ((u >> 32) == 0) {
1346
    n |= 32;
1347
    u <<= 32;
1348
  }
1349
  if ((u >> 48) == 0) {
1350
    n |= 16;
1351
    u <<= 16;
1352
  }
1353
  if ((u >> 56) == 0) {
1354
    n |= 8;
1355
    u <<= 8;
1356
  }
1357
  if ((u >> 60) == 0) {
1358
    n |= 4;
1359
    u <<= 4;
1360
  }
1361
  if ((u >> 62) == 0) {
1362
    n |= 2;
1363
    u <<= 2;
1364
  }
1365
  if ((u >> 63) == 0) {
1366
    n |= 1;
1367
    u <<= 1;
1368
  }
1369
  return n;
1370
}
1371
1372
#endif  // (defined(__GNUC__) || defined(__clang__)) && (__SIZEOF_LONG__ == 8)
1373
1374
// --------
1375
1376
// Normally, the wuffs_base__peek_etc and wuffs_base__poke_etc implementations
1377
// are both (1) correct regardless of CPU endianness and (2) very fast (e.g. an
1378
// inlined wuffs_base__peek_u32le__no_bounds_check call, in an optimized clang
1379
// or gcc build, is a single MOV instruction on x86_64).
1380
//
1381
// However, the endian-agnostic implementations are slow on Microsoft's C
1382
// compiler (MSC). Alternative memcpy-based implementations restore speed, but
1383
// they are only correct on little-endian CPU architectures. Defining
1384
// WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE opts in to these implementations.
1385
//
1386
// https://godbolt.org/z/q4MfjzTPh
1387
#if defined(_MSC_VER) && !defined(__clang__) && \
1388
    (defined(_M_ARM64) || defined(_M_X64))
1389
#define WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE
1390
#endif
1391
1392
#define wuffs_base__peek_u8be__no_bounds_check \
1393
7.82M
  wuffs_base__peek_u8__no_bounds_check
1394
#define wuffs_base__peek_u8le__no_bounds_check \
1395
  wuffs_base__peek_u8__no_bounds_check
1396
1397
static inline uint8_t  //
1398
7.82M
wuffs_base__peek_u8__no_bounds_check(const uint8_t* p) {
1399
7.82M
  return p[0];
1400
7.82M
}
1401
1402
static inline uint16_t  //
1403
45.5k
wuffs_base__peek_u16be__no_bounds_check(const uint8_t* p) {
1404
#if defined(WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE)
1405
  uint16_t x;
1406
  memcpy(&x, p, 2);
1407
  return _byteswap_ushort(x);
1408
#else
1409
45.5k
  return (uint16_t)(((uint16_t)(p[0]) << 8) | ((uint16_t)(p[1]) << 0));
1410
45.5k
#endif
1411
45.5k
}
1412
1413
static inline uint16_t  //
1414
276k
wuffs_base__peek_u16le__no_bounds_check(const uint8_t* p) {
1415
#if defined(WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE)
1416
  uint16_t x;
1417
  memcpy(&x, p, 2);
1418
  return x;
1419
#else
1420
276k
  return (uint16_t)(((uint16_t)(p[0]) << 0) | ((uint16_t)(p[1]) << 8));
1421
276k
#endif
1422
276k
}
1423
1424
static inline uint32_t  //
1425
0
wuffs_base__peek_u24be__no_bounds_check(const uint8_t* p) {
1426
0
  return ((uint32_t)(p[0]) << 16) | ((uint32_t)(p[1]) << 8) |
1427
0
         ((uint32_t)(p[2]) << 0);
1428
0
}
1429
1430
static inline uint32_t  //
1431
0
wuffs_base__peek_u24le__no_bounds_check(const uint8_t* p) {
1432
0
  return ((uint32_t)(p[0]) << 0) | ((uint32_t)(p[1]) << 8) |
1433
0
         ((uint32_t)(p[2]) << 16);
1434
0
}
1435
1436
static inline uint32_t  //
1437
0
wuffs_base__peek_u32be__no_bounds_check(const uint8_t* p) {
1438
#if defined(WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE)
1439
  uint32_t x;
1440
  memcpy(&x, p, 4);
1441
  return _byteswap_ulong(x);
1442
#else
1443
0
  return ((uint32_t)(p[0]) << 24) | ((uint32_t)(p[1]) << 16) |
1444
0
         ((uint32_t)(p[2]) << 8) | ((uint32_t)(p[3]) << 0);
1445
0
#endif
1446
0
}
1447
1448
static inline uint32_t  //
1449
815M
wuffs_base__peek_u32le__no_bounds_check(const uint8_t* p) {
1450
#if defined(WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE)
1451
  uint32_t x;
1452
  memcpy(&x, p, 4);
1453
  return x;
1454
#else
1455
815M
  return ((uint32_t)(p[0]) << 0) | ((uint32_t)(p[1]) << 8) |
1456
815M
         ((uint32_t)(p[2]) << 16) | ((uint32_t)(p[3]) << 24);
1457
815M
#endif
1458
815M
}
1459
1460
static inline uint64_t  //
1461
0
wuffs_base__peek_u40be__no_bounds_check(const uint8_t* p) {
1462
0
  return ((uint64_t)(p[0]) << 32) | ((uint64_t)(p[1]) << 24) |
1463
0
         ((uint64_t)(p[2]) << 16) | ((uint64_t)(p[3]) << 8) |
1464
0
         ((uint64_t)(p[4]) << 0);
1465
0
}
1466
1467
static inline uint64_t  //
1468
0
wuffs_base__peek_u40le__no_bounds_check(const uint8_t* p) {
1469
0
  return ((uint64_t)(p[0]) << 0) | ((uint64_t)(p[1]) << 8) |
1470
0
         ((uint64_t)(p[2]) << 16) | ((uint64_t)(p[3]) << 24) |
1471
0
         ((uint64_t)(p[4]) << 32);
1472
0
}
1473
1474
static inline uint64_t  //
1475
0
wuffs_base__peek_u48be__no_bounds_check(const uint8_t* p) {
1476
0
  return ((uint64_t)(p[0]) << 40) | ((uint64_t)(p[1]) << 32) |
1477
0
         ((uint64_t)(p[2]) << 24) | ((uint64_t)(p[3]) << 16) |
1478
0
         ((uint64_t)(p[4]) << 8) | ((uint64_t)(p[5]) << 0);
1479
0
}
1480
1481
static inline uint64_t  //
1482
0
wuffs_base__peek_u48le__no_bounds_check(const uint8_t* p) {
1483
0
  return ((uint64_t)(p[0]) << 0) | ((uint64_t)(p[1]) << 8) |
1484
0
         ((uint64_t)(p[2]) << 16) | ((uint64_t)(p[3]) << 24) |
1485
0
         ((uint64_t)(p[4]) << 32) | ((uint64_t)(p[5]) << 40);
1486
0
}
1487
1488
static inline uint64_t  //
1489
0
wuffs_base__peek_u56be__no_bounds_check(const uint8_t* p) {
1490
0
  return ((uint64_t)(p[0]) << 48) | ((uint64_t)(p[1]) << 40) |
1491
0
         ((uint64_t)(p[2]) << 32) | ((uint64_t)(p[3]) << 24) |
1492
0
         ((uint64_t)(p[4]) << 16) | ((uint64_t)(p[5]) << 8) |
1493
0
         ((uint64_t)(p[6]) << 0);
1494
0
}
1495
1496
static inline uint64_t  //
1497
0
wuffs_base__peek_u56le__no_bounds_check(const uint8_t* p) {
1498
0
  return ((uint64_t)(p[0]) << 0) | ((uint64_t)(p[1]) << 8) |
1499
0
         ((uint64_t)(p[2]) << 16) | ((uint64_t)(p[3]) << 24) |
1500
0
         ((uint64_t)(p[4]) << 32) | ((uint64_t)(p[5]) << 40) |
1501
0
         ((uint64_t)(p[6]) << 48);
1502
0
}
1503
1504
static inline uint64_t  //
1505
94.1M
wuffs_base__peek_u64be__no_bounds_check(const uint8_t* p) {
1506
#if defined(WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE)
1507
  uint64_t x;
1508
  memcpy(&x, p, 8);
1509
  return _byteswap_uint64(x);
1510
#else
1511
94.1M
  return ((uint64_t)(p[0]) << 56) | ((uint64_t)(p[1]) << 48) |
1512
94.1M
         ((uint64_t)(p[2]) << 40) | ((uint64_t)(p[3]) << 32) |
1513
94.1M
         ((uint64_t)(p[4]) << 24) | ((uint64_t)(p[5]) << 16) |
1514
94.1M
         ((uint64_t)(p[6]) << 8) | ((uint64_t)(p[7]) << 0);
1515
94.1M
#endif
1516
94.1M
}
1517
1518
static inline uint64_t  //
1519
218M
wuffs_base__peek_u64le__no_bounds_check(const uint8_t* p) {
1520
#if defined(WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE)
1521
  uint64_t x;
1522
  memcpy(&x, p, 8);
1523
  return x;
1524
#else
1525
218M
  return ((uint64_t)(p[0]) << 0) | ((uint64_t)(p[1]) << 8) |
1526
218M
         ((uint64_t)(p[2]) << 16) | ((uint64_t)(p[3]) << 24) |
1527
218M
         ((uint64_t)(p[4]) << 32) | ((uint64_t)(p[5]) << 40) |
1528
218M
         ((uint64_t)(p[6]) << 48) | ((uint64_t)(p[7]) << 56);
1529
218M
#endif
1530
218M
}
1531
1532
// --------
1533
1534
#define wuffs_base__poke_u8be__no_bounds_check \
1535
  wuffs_base__poke_u8__no_bounds_check
1536
#define wuffs_base__poke_u8le__no_bounds_check \
1537
  wuffs_base__poke_u8__no_bounds_check
1538
1539
static inline void  //
1540
0
wuffs_base__poke_u8__no_bounds_check(uint8_t* p, uint8_t x) {
1541
0
  p[0] = x;
1542
0
}
1543
1544
static inline void  //
1545
0
wuffs_base__poke_u16be__no_bounds_check(uint8_t* p, uint16_t x) {
1546
0
  p[0] = (uint8_t)(x >> 8);
1547
0
  p[1] = (uint8_t)(x >> 0);
1548
0
}
1549
1550
static inline void  //
1551
0
wuffs_base__poke_u16le__no_bounds_check(uint8_t* p, uint16_t x) {
1552
#if defined(WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE) || \
1553
    (defined(__GNUC__) && !defined(__clang__) && defined(__x86_64__))
1554
  // This seems to perform better on gcc 10 (but not clang 9). Clang also
1555
  // defines "__GNUC__".
1556
  memcpy(p, &x, 2);
1557
#else
1558
0
  p[0] = (uint8_t)(x >> 0);
1559
0
  p[1] = (uint8_t)(x >> 8);
1560
0
#endif
1561
0
}
1562
1563
static inline void  //
1564
0
wuffs_base__poke_u24be__no_bounds_check(uint8_t* p, uint32_t x) {
1565
0
  p[0] = (uint8_t)(x >> 16);
1566
0
  p[1] = (uint8_t)(x >> 8);
1567
0
  p[2] = (uint8_t)(x >> 0);
1568
0
}
1569
1570
static inline void  //
1571
0
wuffs_base__poke_u24le__no_bounds_check(uint8_t* p, uint32_t x) {
1572
0
  p[0] = (uint8_t)(x >> 0);
1573
0
  p[1] = (uint8_t)(x >> 8);
1574
0
  p[2] = (uint8_t)(x >> 16);
1575
0
}
1576
1577
static inline void  //
1578
0
wuffs_base__poke_u32be__no_bounds_check(uint8_t* p, uint32_t x) {
1579
0
  p[0] = (uint8_t)(x >> 24);
1580
0
  p[1] = (uint8_t)(x >> 16);
1581
0
  p[2] = (uint8_t)(x >> 8);
1582
0
  p[3] = (uint8_t)(x >> 0);
1583
0
}
1584
1585
static inline void  //
1586
974M
wuffs_base__poke_u32le__no_bounds_check(uint8_t* p, uint32_t x) {
1587
#if defined(WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE) || \
1588
    (defined(__GNUC__) && !defined(__clang__) && defined(__x86_64__))
1589
  // This seems to perform better on gcc 10 (but not clang 9). Clang also
1590
  // defines "__GNUC__".
1591
  memcpy(p, &x, 4);
1592
#else
1593
974M
  p[0] = (uint8_t)(x >> 0);
1594
974M
  p[1] = (uint8_t)(x >> 8);
1595
974M
  p[2] = (uint8_t)(x >> 16);
1596
974M
  p[3] = (uint8_t)(x >> 24);
1597
974M
#endif
1598
974M
}
1599
1600
static inline void  //
1601
0
wuffs_base__poke_u40be__no_bounds_check(uint8_t* p, uint64_t x) {
1602
0
  p[0] = (uint8_t)(x >> 32);
1603
0
  p[1] = (uint8_t)(x >> 24);
1604
0
  p[2] = (uint8_t)(x >> 16);
1605
0
  p[3] = (uint8_t)(x >> 8);
1606
0
  p[4] = (uint8_t)(x >> 0);
1607
0
}
1608
1609
static inline void  //
1610
0
wuffs_base__poke_u40le__no_bounds_check(uint8_t* p, uint64_t x) {
1611
0
  p[0] = (uint8_t)(x >> 0);
1612
0
  p[1] = (uint8_t)(x >> 8);
1613
0
  p[2] = (uint8_t)(x >> 16);
1614
0
  p[3] = (uint8_t)(x >> 24);
1615
0
  p[4] = (uint8_t)(x >> 32);
1616
0
}
1617
1618
static inline void  //
1619
0
wuffs_base__poke_u48be__no_bounds_check(uint8_t* p, uint64_t x) {
1620
0
  p[0] = (uint8_t)(x >> 40);
1621
0
  p[1] = (uint8_t)(x >> 32);
1622
0
  p[2] = (uint8_t)(x >> 24);
1623
0
  p[3] = (uint8_t)(x >> 16);
1624
0
  p[4] = (uint8_t)(x >> 8);
1625
0
  p[5] = (uint8_t)(x >> 0);
1626
0
}
1627
1628
static inline void  //
1629
0
wuffs_base__poke_u48le__no_bounds_check(uint8_t* p, uint64_t x) {
1630
0
  p[0] = (uint8_t)(x >> 0);
1631
0
  p[1] = (uint8_t)(x >> 8);
1632
0
  p[2] = (uint8_t)(x >> 16);
1633
0
  p[3] = (uint8_t)(x >> 24);
1634
0
  p[4] = (uint8_t)(x >> 32);
1635
0
  p[5] = (uint8_t)(x >> 40);
1636
0
}
1637
1638
static inline void  //
1639
0
wuffs_base__poke_u56be__no_bounds_check(uint8_t* p, uint64_t x) {
1640
0
  p[0] = (uint8_t)(x >> 48);
1641
0
  p[1] = (uint8_t)(x >> 40);
1642
0
  p[2] = (uint8_t)(x >> 32);
1643
0
  p[3] = (uint8_t)(x >> 24);
1644
0
  p[4] = (uint8_t)(x >> 16);
1645
0
  p[5] = (uint8_t)(x >> 8);
1646
0
  p[6] = (uint8_t)(x >> 0);
1647
0
}
1648
1649
static inline void  //
1650
0
wuffs_base__poke_u56le__no_bounds_check(uint8_t* p, uint64_t x) {
1651
0
  p[0] = (uint8_t)(x >> 0);
1652
0
  p[1] = (uint8_t)(x >> 8);
1653
0
  p[2] = (uint8_t)(x >> 16);
1654
0
  p[3] = (uint8_t)(x >> 24);
1655
0
  p[4] = (uint8_t)(x >> 32);
1656
0
  p[5] = (uint8_t)(x >> 40);
1657
0
  p[6] = (uint8_t)(x >> 48);
1658
0
}
1659
1660
static inline void  //
1661
0
wuffs_base__poke_u64be__no_bounds_check(uint8_t* p, uint64_t x) {
1662
0
  p[0] = (uint8_t)(x >> 56);
1663
0
  p[1] = (uint8_t)(x >> 48);
1664
0
  p[2] = (uint8_t)(x >> 40);
1665
0
  p[3] = (uint8_t)(x >> 32);
1666
0
  p[4] = (uint8_t)(x >> 24);
1667
0
  p[5] = (uint8_t)(x >> 16);
1668
0
  p[6] = (uint8_t)(x >> 8);
1669
0
  p[7] = (uint8_t)(x >> 0);
1670
0
}
1671
1672
static inline void  //
1673
873M
wuffs_base__poke_u64le__no_bounds_check(uint8_t* p, uint64_t x) {
1674
#if defined(WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE) || \
1675
    (defined(__GNUC__) && !defined(__clang__) && defined(__x86_64__))
1676
  // This seems to perform better on gcc 10 (but not clang 9). Clang also
1677
  // defines "__GNUC__".
1678
  memcpy(p, &x, 8);
1679
#else
1680
873M
  p[0] = (uint8_t)(x >> 0);
1681
873M
  p[1] = (uint8_t)(x >> 8);
1682
873M
  p[2] = (uint8_t)(x >> 16);
1683
873M
  p[3] = (uint8_t)(x >> 24);
1684
873M
  p[4] = (uint8_t)(x >> 32);
1685
873M
  p[5] = (uint8_t)(x >> 40);
1686
873M
  p[6] = (uint8_t)(x >> 48);
1687
873M
  p[7] = (uint8_t)(x >> 56);
1688
873M
#endif
1689
873M
}
1690
1691
// ---------------- Slices and Tables
1692
1693
// WUFFS_BASE__SLICE is a 1-dimensional buffer.
1694
//
1695
// len measures a number of elements, not necessarily a size in bytes.
1696
//
1697
// A value with all fields NULL or zero is a valid, empty slice.
1698
#define WUFFS_BASE__SLICE(T) \
1699
  struct {                   \
1700
    T* ptr;                  \
1701
    size_t len;              \
1702
  }
1703
1704
// WUFFS_BASE__TABLE is a 2-dimensional buffer.
1705
//
1706
// width, height and stride measure a number of elements, not necessarily a
1707
// size in bytes.
1708
//
1709
// A value with all fields NULL or zero is a valid, empty table.
1710
#define WUFFS_BASE__TABLE(T) \
1711
  struct {                   \
1712
    T* ptr;                  \
1713
    size_t width;            \
1714
    size_t height;           \
1715
    size_t stride;           \
1716
  }
1717
1718
typedef WUFFS_BASE__SLICE(uint8_t) wuffs_base__slice_u8;
1719
typedef WUFFS_BASE__SLICE(uint16_t) wuffs_base__slice_u16;
1720
typedef WUFFS_BASE__SLICE(uint32_t) wuffs_base__slice_u32;
1721
typedef WUFFS_BASE__SLICE(uint64_t) wuffs_base__slice_u64;
1722
1723
typedef WUFFS_BASE__TABLE(uint8_t) wuffs_base__table_u8;
1724
typedef WUFFS_BASE__TABLE(uint16_t) wuffs_base__table_u16;
1725
typedef WUFFS_BASE__TABLE(uint32_t) wuffs_base__table_u32;
1726
typedef WUFFS_BASE__TABLE(uint64_t) wuffs_base__table_u64;
1727
1728
static inline wuffs_base__slice_u8  //
1729
1.92G
wuffs_base__make_slice_u8(uint8_t* ptr, size_t len) {
1730
1.92G
  wuffs_base__slice_u8 ret;
1731
1.92G
  ret.ptr = ptr;
1732
1.92G
  ret.len = len;
1733
1.92G
  return ret;
1734
1.92G
}
1735
1736
static inline wuffs_base__slice_u16  //
1737
0
wuffs_base__make_slice_u16(uint16_t* ptr, size_t len) {
1738
0
  wuffs_base__slice_u16 ret;
1739
0
  ret.ptr = ptr;
1740
0
  ret.len = len;
1741
0
  return ret;
1742
0
}
1743
1744
static inline wuffs_base__slice_u32  //
1745
0
wuffs_base__make_slice_u32(uint32_t* ptr, size_t len) {
1746
0
  wuffs_base__slice_u32 ret;
1747
0
  ret.ptr = ptr;
1748
0
  ret.len = len;
1749
0
  return ret;
1750
0
}
1751
1752
static inline wuffs_base__slice_u64  //
1753
0
wuffs_base__make_slice_u64(uint64_t* ptr, size_t len) {
1754
0
  wuffs_base__slice_u64 ret;
1755
0
  ret.ptr = ptr;
1756
0
  ret.len = len;
1757
0
  return ret;
1758
0
}
1759
1760
static inline wuffs_base__slice_u8  //
1761
24.8M
wuffs_base__make_slice_u8_ij(uint8_t* ptr, size_t i, size_t j) {
1762
24.8M
  wuffs_base__slice_u8 ret;
1763
24.8M
  ret.ptr = ptr ? (ptr + i) : NULL;
1764
24.8M
  ret.len = (j >= i) ? (j - i) : 0;
1765
24.8M
  return ret;
1766
24.8M
}
1767
1768
static inline wuffs_base__slice_u16  //
1769
0
wuffs_base__make_slice_u16_ij(uint16_t* ptr, size_t i, size_t j) {
1770
0
  wuffs_base__slice_u16 ret;
1771
0
  ret.ptr = ptr ? (ptr + i) : NULL;
1772
0
  ret.len = (j >= i) ? (j - i) : 0;
1773
0
  return ret;
1774
0
}
1775
1776
static inline wuffs_base__slice_u32  //
1777
0
wuffs_base__make_slice_u32_ij(uint32_t* ptr, size_t i, size_t j) {
1778
0
  wuffs_base__slice_u32 ret;
1779
0
  ret.ptr = ptr ? (ptr + i) : NULL;
1780
0
  ret.len = (j >= i) ? (j - i) : 0;
1781
0
  return ret;
1782
0
}
1783
1784
static inline wuffs_base__slice_u64  //
1785
0
wuffs_base__make_slice_u64_ij(uint64_t* ptr, size_t i, size_t j) {
1786
0
  wuffs_base__slice_u64 ret;
1787
0
  ret.ptr = ptr ? (ptr + i) : NULL;
1788
0
  ret.len = (j >= i) ? (j - i) : 0;
1789
0
  return ret;
1790
0
}
1791
1792
static inline wuffs_base__slice_u8  //
1793
2.66k
wuffs_base__empty_slice_u8(void) {
1794
2.66k
  wuffs_base__slice_u8 ret;
1795
2.66k
  ret.ptr = NULL;
1796
2.66k
  ret.len = 0;
1797
2.66k
  return ret;
1798
2.66k
}
1799
1800
static inline wuffs_base__slice_u16  //
1801
0
wuffs_base__empty_slice_u16(void) {
1802
0
  wuffs_base__slice_u16 ret;
1803
0
  ret.ptr = NULL;
1804
0
  ret.len = 0;
1805
0
  return ret;
1806
0
}
1807
1808
static inline wuffs_base__slice_u32  //
1809
0
wuffs_base__empty_slice_u32(void) {
1810
0
  wuffs_base__slice_u32 ret;
1811
0
  ret.ptr = NULL;
1812
0
  ret.len = 0;
1813
0
  return ret;
1814
0
}
1815
1816
static inline wuffs_base__slice_u64  //
1817
0
wuffs_base__empty_slice_u64(void) {
1818
0
  wuffs_base__slice_u64 ret;
1819
0
  ret.ptr = NULL;
1820
0
  ret.len = 0;
1821
0
  return ret;
1822
0
}
1823
1824
static inline wuffs_base__table_u8  //
1825
wuffs_base__make_table_u8(uint8_t* ptr,
1826
                          size_t width,
1827
                          size_t height,
1828
0
                          size_t stride) {
1829
0
  wuffs_base__table_u8 ret;
1830
0
  ret.ptr = ptr;
1831
0
  ret.width = width;
1832
0
  ret.height = height;
1833
0
  ret.stride = stride;
1834
0
  return ret;
1835
0
}
1836
1837
static inline wuffs_base__table_u16  //
1838
wuffs_base__make_table_u16(uint16_t* ptr,
1839
                           size_t width,
1840
                           size_t height,
1841
0
                           size_t stride) {
1842
0
  wuffs_base__table_u16 ret;
1843
0
  ret.ptr = ptr;
1844
0
  ret.width = width;
1845
0
  ret.height = height;
1846
0
  ret.stride = stride;
1847
0
  return ret;
1848
0
}
1849
1850
static inline wuffs_base__table_u32  //
1851
wuffs_base__make_table_u32(uint32_t* ptr,
1852
                           size_t width,
1853
                           size_t height,
1854
0
                           size_t stride) {
1855
0
  wuffs_base__table_u32 ret;
1856
0
  ret.ptr = ptr;
1857
0
  ret.width = width;
1858
0
  ret.height = height;
1859
0
  ret.stride = stride;
1860
0
  return ret;
1861
0
}
1862
1863
static inline wuffs_base__table_u64  //
1864
wuffs_base__make_table_u64(uint64_t* ptr,
1865
                           size_t width,
1866
                           size_t height,
1867
0
                           size_t stride) {
1868
0
  wuffs_base__table_u64 ret;
1869
0
  ret.ptr = ptr;
1870
0
  ret.width = width;
1871
0
  ret.height = height;
1872
0
  ret.stride = stride;
1873
0
  return ret;
1874
0
}
1875
1876
static inline wuffs_base__table_u8  //
1877
0
wuffs_base__empty_table_u8(void) {
1878
0
  wuffs_base__table_u8 ret;
1879
0
  ret.ptr = NULL;
1880
0
  ret.width = 0;
1881
0
  ret.height = 0;
1882
0
  ret.stride = 0;
1883
0
  return ret;
1884
0
}
1885
1886
static inline wuffs_base__table_u16  //
1887
0
wuffs_base__empty_table_u16(void) {
1888
0
  wuffs_base__table_u16 ret;
1889
0
  ret.ptr = NULL;
1890
0
  ret.width = 0;
1891
0
  ret.height = 0;
1892
0
  ret.stride = 0;
1893
0
  return ret;
1894
0
}
1895
1896
static inline wuffs_base__table_u32  //
1897
0
wuffs_base__empty_table_u32(void) {
1898
0
  wuffs_base__table_u32 ret;
1899
0
  ret.ptr = NULL;
1900
0
  ret.width = 0;
1901
0
  ret.height = 0;
1902
0
  ret.stride = 0;
1903
0
  return ret;
1904
0
}
1905
1906
static inline wuffs_base__table_u64  //
1907
0
wuffs_base__empty_table_u64(void) {
1908
0
  wuffs_base__table_u64 ret;
1909
0
  ret.ptr = NULL;
1910
0
  ret.width = 0;
1911
0
  ret.height = 0;
1912
0
  ret.stride = 0;
1913
0
  return ret;
1914
0
}
1915
1916
static inline bool  //
1917
0
wuffs_base__slice_u8__overlaps(wuffs_base__slice_u8 s, wuffs_base__slice_u8 t) {
1918
0
  return ((s.ptr <= t.ptr) && (t.ptr < (s.ptr + s.len))) ||
1919
0
         ((t.ptr <= s.ptr) && (s.ptr < (t.ptr + t.len)));
1920
0
}
1921
1922
// wuffs_base__slice_u8__subslice_i returns s[i:].
1923
//
1924
// It returns an empty slice if i is out of bounds.
1925
static inline wuffs_base__slice_u8  //
1926
1.89G
wuffs_base__slice_u8__subslice_i(wuffs_base__slice_u8 s, uint64_t i) {
1927
1.89G
  if ((i <= SIZE_MAX) && (i <= s.len)) {
1928
1.89G
    return wuffs_base__make_slice_u8(s.ptr + i, ((size_t)(s.len - i)));
1929
1.89G
  }
1930
0
  return wuffs_base__empty_slice_u8();
1931
1.89G
}
1932
1933
// wuffs_base__slice_u8__subslice_j returns s[:j].
1934
//
1935
// It returns an empty slice if j is out of bounds.
1936
static inline wuffs_base__slice_u8  //
1937
0
wuffs_base__slice_u8__subslice_j(wuffs_base__slice_u8 s, uint64_t j) {
1938
0
  if ((j <= SIZE_MAX) && (j <= s.len)) {
1939
0
    return wuffs_base__make_slice_u8(s.ptr, ((size_t)j));
1940
0
  }
1941
0
  return wuffs_base__empty_slice_u8();
1942
0
}
1943
1944
// wuffs_base__slice_u8__subslice_ij returns s[i:j].
1945
//
1946
// It returns an empty slice if i or j is out of bounds.
1947
static inline wuffs_base__slice_u8  //
1948
wuffs_base__slice_u8__subslice_ij(wuffs_base__slice_u8 s,
1949
                                  uint64_t i,
1950
2.75k
                                  uint64_t j) {
1951
2.75k
  if ((i <= j) && (j <= SIZE_MAX) && (j <= s.len)) {
1952
2.75k
    return wuffs_base__make_slice_u8(s.ptr + i, ((size_t)(j - i)));
1953
2.75k
  }
1954
0
  return wuffs_base__empty_slice_u8();
1955
2.75k
}
1956
1957
// wuffs_base__table_u8__subtable_ij returns t[ix:jx, iy:jy].
1958
//
1959
// It returns an empty table if i or j is out of bounds.
1960
static inline wuffs_base__table_u8  //
1961
wuffs_base__table_u8__subtable_ij(wuffs_base__table_u8 t,
1962
                                  uint64_t ix,
1963
                                  uint64_t iy,
1964
                                  uint64_t jx,
1965
0
                                  uint64_t jy) {
1966
0
  if ((ix <= jx) && (jx <= SIZE_MAX) && (jx <= t.width) &&  //
1967
0
      (iy <= jy) && (jy <= SIZE_MAX) && (jy <= t.height)) {
1968
0
    return wuffs_base__make_table_u8(t.ptr + ix + (iy * t.stride),  //
1969
0
                                     ((size_t)(jx - ix)),           //
1970
0
                                     ((size_t)(jy - iy)),           //
1971
0
                                     t.stride);                     //
1972
0
  }
1973
0
  return wuffs_base__make_table_u8(NULL, 0, 0, 0);
1974
0
}
1975
1976
// wuffs_base__table__flattened_length returns the number of elements covered
1977
// by the 1-dimensional span that backs a 2-dimensional table. This counts the
1978
// elements inside the table and, when width != stride, the elements outside
1979
// the table but between its rows.
1980
//
1981
// For example, consider a width 10, height 4, stride 10 table. Mark its first
1982
// and last (inclusive) elements with 'a' and 'z'. This function returns 40.
1983
//
1984
//    a123456789
1985
//    0123456789
1986
//    0123456789
1987
//    012345678z
1988
//
1989
// Now consider the sub-table of that from (2, 1) inclusive to (8, 4) exclusive.
1990
//
1991
//    a123456789
1992
//    01iiiiiioo
1993
//    ooiiiiiioo
1994
//    ooiiiiii8z
1995
//
1996
// This function (called with width 6, height 3, stride 10) returns 26: 18 'i'
1997
// inside elements plus 8 'o' outside elements. Note that 26 is less than a
1998
// naive (height * stride = 30) computation. Indeed, advancing 29 elements from
1999
// the first 'i' would venture past 'z', out of bounds of the original table.
2000
//
2001
// It does not check for overflow, but if the arguments come from a table that
2002
// exists in memory and each element occupies a positive number of bytes then
2003
// the result should be bounded by the amount of allocatable memory (which
2004
// shouldn't overflow SIZE_MAX).
2005
static inline size_t  //
2006
wuffs_base__table__flattened_length(size_t width,
2007
                                    size_t height,
2008
0
                                    size_t stride) {
2009
0
  if (height == 0) {
2010
0
    return 0;
2011
0
  }
2012
0
  return ((height - 1) * stride) + width;
2013
0
}
2014
2015
// ---------------- Magic Numbers
2016
2017
// wuffs_base__magic_number_guess_fourcc guesses the file format of some data,
2018
// given its starting bytes (the prefix_data argument) and whether or not there
2019
// may be further bytes (the prefix_closed argument; true means that
2020
// prefix_data is the entire data).
2021
//
2022
// It returns a positive FourCC value on success.
2023
//
2024
// It returns zero if nothing matches its hard-coded list of 'magic numbers'.
2025
//
2026
// It returns a negative value if prefix_closed is false and a longer prefix is
2027
// required for a conclusive result. For example, a single 'B' byte (without
2028
// further data) is not enough to discriminate the BMP and BPG image file
2029
// formats. Similarly, a single '\xFF' byte might be the start of JPEG data or
2030
// it might be the start of some other binary data.
2031
//
2032
// It does not do a full validity check. Like any guess made from a short
2033
// prefix of the data, it may return false positives. Data that starts with 99
2034
// bytes of valid JPEG followed by corruption or truncation is an invalid JPEG
2035
// image overall, but this function will still return WUFFS_BASE__FOURCC__JPEG.
2036
//
2037
// Another source of false positives is that some 'magic numbers' are valid
2038
// ASCII data. A file starting with "GIF87a and GIF89a are the two versions of
2039
// GIF" will match GIF's 'magic number' even if it's plain text, not an image.
2040
//
2041
// For modular builds that divide the base module into sub-modules, using this
2042
// function requires the WUFFS_CONFIG__MODULE__BASE__MAGIC sub-module, not just
2043
// WUFFS_CONFIG__MODULE__BASE__CORE.
2044
WUFFS_BASE__MAYBE_STATIC int32_t  //
2045
wuffs_base__magic_number_guess_fourcc(wuffs_base__slice_u8 prefix_data,
2046
                                      bool prefix_closed);
2047
2048
// ---------------- Quirk Values
2049
2050
// These constants are the value half of a key-value pair, where the key is
2051
// WUFFS_BASE__QUIRK_QUALITY.
2052
//
2053
// In the Wuffs API, set_quirk takes a u64 value. These macro definitions are
2054
// likewise unsigned values (uint64_t) but for this particular key, they are
2055
// best interpreted as signed values (int64_t). "Lower-than-default quality"
2056
// and "higher-than-default quality", as signed values, are -1 and +1.
2057
//
2058
// See doc/note/quirks.md for some more discussion about trade-offs.
2059
#define WUFFS_BASE__QUIRK_QUALITY__VALUE__LOWER_QUALITY UINT64_MAX
2060
#define WUFFS_BASE__QUIRK_QUALITY__VALUE__HIGHER_QUALITY ((uint64_t)1)
2061
2062
// ---------------- Ranges and Rects
2063
2064
// See https://github.com/google/wuffs/blob/main/doc/note/ranges-and-rects.md
2065
2066
// --------
2067
2068
typedef struct wuffs_base__range_ie_i32__struct {
2069
  int32_t min_incl;
2070
  int32_t max_excl;
2071
2072
#ifdef __cplusplus
2073
  inline bool is_empty() const;
2074
  inline bool equals(wuffs_base__range_ie_i32__struct s) const;
2075
  inline wuffs_base__range_ie_i32__struct intersect(
2076
      wuffs_base__range_ie_i32__struct s) const;
2077
  inline wuffs_base__range_ie_i32__struct unite(
2078
      wuffs_base__range_ie_i32__struct s) const;
2079
  inline bool contains(int32_t x) const;
2080
  inline bool contains_range(wuffs_base__range_ie_i32__struct s) const;
2081
  inline uint32_t length() const;
2082
#endif  // __cplusplus
2083
2084
} wuffs_base__range_ie_i32;
2085
2086
static inline wuffs_base__range_ie_i32  //
2087
0
wuffs_base__empty_range_ie_i32(void) {
2088
0
  wuffs_base__range_ie_i32 ret;
2089
0
  ret.min_incl = 0;
2090
0
  ret.max_excl = 0;
2091
0
  return ret;
2092
0
}
2093
2094
static inline wuffs_base__range_ie_i32  //
2095
0
wuffs_base__make_range_ie_i32(int32_t min_incl, int32_t max_excl) {
2096
0
  wuffs_base__range_ie_i32 ret;
2097
0
  ret.min_incl = min_incl;
2098
0
  ret.max_excl = max_excl;
2099
0
  return ret;
2100
0
}
2101
2102
static inline bool  //
2103
0
wuffs_base__range_ie_i32__is_empty(const wuffs_base__range_ie_i32* r) {
2104
0
  return r->min_incl >= r->max_excl;
2105
0
}
2106
2107
static inline bool  //
2108
wuffs_base__range_ie_i32__equals(const wuffs_base__range_ie_i32* r,
2109
0
                                 wuffs_base__range_ie_i32 s) {
2110
0
  return (r->min_incl == s.min_incl && r->max_excl == s.max_excl) ||
2111
0
         (wuffs_base__range_ie_i32__is_empty(r) &&
2112
0
          wuffs_base__range_ie_i32__is_empty(&s));
2113
0
}
2114
2115
static inline wuffs_base__range_ie_i32  //
2116
wuffs_base__range_ie_i32__intersect(const wuffs_base__range_ie_i32* r,
2117
0
                                    wuffs_base__range_ie_i32 s) {
2118
0
  wuffs_base__range_ie_i32 t;
2119
0
  t.min_incl = wuffs_base__i32__max(r->min_incl, s.min_incl);
2120
0
  t.max_excl = wuffs_base__i32__min(r->max_excl, s.max_excl);
2121
0
  return t;
2122
0
}
2123
2124
static inline wuffs_base__range_ie_i32  //
2125
wuffs_base__range_ie_i32__unite(const wuffs_base__range_ie_i32* r,
2126
0
                                wuffs_base__range_ie_i32 s) {
2127
0
  if (wuffs_base__range_ie_i32__is_empty(r)) {
2128
0
    return s;
2129
0
  }
2130
0
  if (wuffs_base__range_ie_i32__is_empty(&s)) {
2131
0
    return *r;
2132
0
  }
2133
0
  wuffs_base__range_ie_i32 t;
2134
0
  t.min_incl = wuffs_base__i32__min(r->min_incl, s.min_incl);
2135
0
  t.max_excl = wuffs_base__i32__max(r->max_excl, s.max_excl);
2136
0
  return t;
2137
0
}
2138
2139
static inline bool  //
2140
wuffs_base__range_ie_i32__contains(const wuffs_base__range_ie_i32* r,
2141
0
                                   int32_t x) {
2142
0
  return (r->min_incl <= x) && (x < r->max_excl);
2143
0
}
2144
2145
static inline bool  //
2146
wuffs_base__range_ie_i32__contains_range(const wuffs_base__range_ie_i32* r,
2147
0
                                         wuffs_base__range_ie_i32 s) {
2148
0
  return wuffs_base__range_ie_i32__equals(
2149
0
      &s, wuffs_base__range_ie_i32__intersect(r, s));
2150
0
}
2151
2152
static inline uint32_t  //
2153
0
wuffs_base__range_ie_i32__length(const wuffs_base__range_ie_i32* r) {
2154
0
  return (r->max_excl > r->min_incl)
2155
0
             ? (((uint32_t)(r->max_excl)) - ((uint32_t)(r->min_incl)))
2156
0
             : 0;
2157
0
}
2158
2159
#ifdef __cplusplus
2160
2161
inline bool  //
2162
wuffs_base__range_ie_i32::is_empty() const {
2163
  return wuffs_base__range_ie_i32__is_empty(this);
2164
}
2165
2166
inline bool  //
2167
wuffs_base__range_ie_i32::equals(wuffs_base__range_ie_i32 s) const {
2168
  return wuffs_base__range_ie_i32__equals(this, s);
2169
}
2170
2171
inline wuffs_base__range_ie_i32  //
2172
wuffs_base__range_ie_i32::intersect(wuffs_base__range_ie_i32 s) const {
2173
  return wuffs_base__range_ie_i32__intersect(this, s);
2174
}
2175
2176
inline wuffs_base__range_ie_i32  //
2177
wuffs_base__range_ie_i32::unite(wuffs_base__range_ie_i32 s) const {
2178
  return wuffs_base__range_ie_i32__unite(this, s);
2179
}
2180
2181
inline bool  //
2182
wuffs_base__range_ie_i32::contains(int32_t x) const {
2183
  return wuffs_base__range_ie_i32__contains(this, x);
2184
}
2185
2186
inline bool  //
2187
wuffs_base__range_ie_i32::contains_range(wuffs_base__range_ie_i32 s) const {
2188
  return wuffs_base__range_ie_i32__contains_range(this, s);
2189
}
2190
2191
inline uint32_t  //
2192
wuffs_base__range_ie_i32::length() const {
2193
  return wuffs_base__range_ie_i32__length(this);
2194
}
2195
2196
#endif  // __cplusplus
2197
2198
// --------
2199
2200
typedef struct wuffs_base__range_ie_u32__struct {
2201
  uint32_t min_incl;
2202
  uint32_t max_excl;
2203
2204
#ifdef __cplusplus
2205
  inline bool is_empty() const;
2206
  inline bool equals(wuffs_base__range_ie_u32__struct s) const;
2207
  inline wuffs_base__range_ie_u32__struct intersect(
2208
      wuffs_base__range_ie_u32__struct s) const;
2209
  inline wuffs_base__range_ie_u32__struct unite(
2210
      wuffs_base__range_ie_u32__struct s) const;
2211
  inline bool contains(uint32_t x) const;
2212
  inline bool contains_range(wuffs_base__range_ie_u32__struct s) const;
2213
  inline uint32_t length() const;
2214
#endif  // __cplusplus
2215
2216
} wuffs_base__range_ie_u32;
2217
2218
static inline wuffs_base__range_ie_u32  //
2219
0
wuffs_base__empty_range_ie_u32(void) {
2220
0
  wuffs_base__range_ie_u32 ret;
2221
0
  ret.min_incl = 0;
2222
0
  ret.max_excl = 0;
2223
0
  return ret;
2224
0
}
2225
2226
static inline wuffs_base__range_ie_u32  //
2227
0
wuffs_base__make_range_ie_u32(uint32_t min_incl, uint32_t max_excl) {
2228
0
  wuffs_base__range_ie_u32 ret;
2229
0
  ret.min_incl = min_incl;
2230
0
  ret.max_excl = max_excl;
2231
0
  return ret;
2232
0
}
2233
2234
static inline bool  //
2235
0
wuffs_base__range_ie_u32__is_empty(const wuffs_base__range_ie_u32* r) {
2236
0
  return r->min_incl >= r->max_excl;
2237
0
}
2238
2239
static inline bool  //
2240
wuffs_base__range_ie_u32__equals(const wuffs_base__range_ie_u32* r,
2241
0
                                 wuffs_base__range_ie_u32 s) {
2242
0
  return (r->min_incl == s.min_incl && r->max_excl == s.max_excl) ||
2243
0
         (wuffs_base__range_ie_u32__is_empty(r) &&
2244
0
          wuffs_base__range_ie_u32__is_empty(&s));
2245
0
}
2246
2247
static inline wuffs_base__range_ie_u32  //
2248
wuffs_base__range_ie_u32__intersect(const wuffs_base__range_ie_u32* r,
2249
0
                                    wuffs_base__range_ie_u32 s) {
2250
0
  wuffs_base__range_ie_u32 t;
2251
0
  t.min_incl = wuffs_base__u32__max(r->min_incl, s.min_incl);
2252
0
  t.max_excl = wuffs_base__u32__min(r->max_excl, s.max_excl);
2253
0
  return t;
2254
0
}
2255
2256
static inline wuffs_base__range_ie_u32  //
2257
wuffs_base__range_ie_u32__unite(const wuffs_base__range_ie_u32* r,
2258
0
                                wuffs_base__range_ie_u32 s) {
2259
0
  if (wuffs_base__range_ie_u32__is_empty(r)) {
2260
0
    return s;
2261
0
  }
2262
0
  if (wuffs_base__range_ie_u32__is_empty(&s)) {
2263
0
    return *r;
2264
0
  }
2265
0
  wuffs_base__range_ie_u32 t;
2266
0
  t.min_incl = wuffs_base__u32__min(r->min_incl, s.min_incl);
2267
0
  t.max_excl = wuffs_base__u32__max(r->max_excl, s.max_excl);
2268
0
  return t;
2269
0
}
2270
2271
static inline bool  //
2272
wuffs_base__range_ie_u32__contains(const wuffs_base__range_ie_u32* r,
2273
0
                                   uint32_t x) {
2274
0
  return (r->min_incl <= x) && (x < r->max_excl);
2275
0
}
2276
2277
static inline bool  //
2278
wuffs_base__range_ie_u32__contains_range(const wuffs_base__range_ie_u32* r,
2279
0
                                         wuffs_base__range_ie_u32 s) {
2280
0
  return wuffs_base__range_ie_u32__equals(
2281
0
      &s, wuffs_base__range_ie_u32__intersect(r, s));
2282
0
}
2283
2284
static inline uint32_t  //
2285
0
wuffs_base__range_ie_u32__length(const wuffs_base__range_ie_u32* r) {
2286
0
  return wuffs_base__u32__sat_sub(r->max_excl, r->min_incl);
2287
0
}
2288
2289
#ifdef __cplusplus
2290
2291
inline bool  //
2292
wuffs_base__range_ie_u32::is_empty() const {
2293
  return wuffs_base__range_ie_u32__is_empty(this);
2294
}
2295
2296
inline bool  //
2297
wuffs_base__range_ie_u32::equals(wuffs_base__range_ie_u32 s) const {
2298
  return wuffs_base__range_ie_u32__equals(this, s);
2299
}
2300
2301
inline wuffs_base__range_ie_u32  //
2302
wuffs_base__range_ie_u32::intersect(wuffs_base__range_ie_u32 s) const {
2303
  return wuffs_base__range_ie_u32__intersect(this, s);
2304
}
2305
2306
inline wuffs_base__range_ie_u32  //
2307
wuffs_base__range_ie_u32::unite(wuffs_base__range_ie_u32 s) const {
2308
  return wuffs_base__range_ie_u32__unite(this, s);
2309
}
2310
2311
inline bool  //
2312
wuffs_base__range_ie_u32::contains(uint32_t x) const {
2313
  return wuffs_base__range_ie_u32__contains(this, x);
2314
}
2315
2316
inline bool  //
2317
wuffs_base__range_ie_u32::contains_range(wuffs_base__range_ie_u32 s) const {
2318
  return wuffs_base__range_ie_u32__contains_range(this, s);
2319
}
2320
2321
inline uint32_t  //
2322
wuffs_base__range_ie_u32::length() const {
2323
  return wuffs_base__range_ie_u32__length(this);
2324
}
2325
2326
#endif  // __cplusplus
2327
2328
// --------
2329
2330
typedef struct wuffs_base__range_ie_u64__struct {
2331
  uint64_t min_incl;
2332
  uint64_t max_excl;
2333
2334
#ifdef __cplusplus
2335
  inline bool is_empty() const;
2336
  inline bool equals(wuffs_base__range_ie_u64__struct s) const;
2337
  inline wuffs_base__range_ie_u64__struct intersect(
2338
      wuffs_base__range_ie_u64__struct s) const;
2339
  inline wuffs_base__range_ie_u64__struct unite(
2340
      wuffs_base__range_ie_u64__struct s) const;
2341
  inline bool contains(uint64_t x) const;
2342
  inline bool contains_range(wuffs_base__range_ie_u64__struct s) const;
2343
  inline uint64_t length() const;
2344
#endif  // __cplusplus
2345
2346
} wuffs_base__range_ie_u64;
2347
2348
static inline wuffs_base__range_ie_u64  //
2349
0
wuffs_base__empty_range_ie_u64(void) {
2350
0
  wuffs_base__range_ie_u64 ret;
2351
0
  ret.min_incl = 0;
2352
0
  ret.max_excl = 0;
2353
0
  return ret;
2354
0
}
2355
2356
static inline wuffs_base__range_ie_u64  //
2357
0
wuffs_base__make_range_ie_u64(uint64_t min_incl, uint64_t max_excl) {
2358
0
  wuffs_base__range_ie_u64 ret;
2359
0
  ret.min_incl = min_incl;
2360
0
  ret.max_excl = max_excl;
2361
0
  return ret;
2362
0
}
2363
2364
static inline bool  //
2365
0
wuffs_base__range_ie_u64__is_empty(const wuffs_base__range_ie_u64* r) {
2366
0
  return r->min_incl >= r->max_excl;
2367
0
}
2368
2369
static inline bool  //
2370
wuffs_base__range_ie_u64__equals(const wuffs_base__range_ie_u64* r,
2371
0
                                 wuffs_base__range_ie_u64 s) {
2372
0
  return (r->min_incl == s.min_incl && r->max_excl == s.max_excl) ||
2373
0
         (wuffs_base__range_ie_u64__is_empty(r) &&
2374
0
          wuffs_base__range_ie_u64__is_empty(&s));
2375
0
}
2376
2377
static inline wuffs_base__range_ie_u64  //
2378
wuffs_base__range_ie_u64__intersect(const wuffs_base__range_ie_u64* r,
2379
0
                                    wuffs_base__range_ie_u64 s) {
2380
0
  wuffs_base__range_ie_u64 t;
2381
0
  t.min_incl = wuffs_base__u64__max(r->min_incl, s.min_incl);
2382
0
  t.max_excl = wuffs_base__u64__min(r->max_excl, s.max_excl);
2383
0
  return t;
2384
0
}
2385
2386
static inline wuffs_base__range_ie_u64  //
2387
wuffs_base__range_ie_u64__unite(const wuffs_base__range_ie_u64* r,
2388
0
                                wuffs_base__range_ie_u64 s) {
2389
0
  if (wuffs_base__range_ie_u64__is_empty(r)) {
2390
0
    return s;
2391
0
  }
2392
0
  if (wuffs_base__range_ie_u64__is_empty(&s)) {
2393
0
    return *r;
2394
0
  }
2395
0
  wuffs_base__range_ie_u64 t;
2396
0
  t.min_incl = wuffs_base__u64__min(r->min_incl, s.min_incl);
2397
0
  t.max_excl = wuffs_base__u64__max(r->max_excl, s.max_excl);
2398
0
  return t;
2399
0
}
2400
2401
static inline bool  //
2402
wuffs_base__range_ie_u64__contains(const wuffs_base__range_ie_u64* r,
2403
0
                                   uint64_t x) {
2404
0
  return (r->min_incl <= x) && (x < r->max_excl);
2405
0
}
2406
2407
static inline bool  //
2408
wuffs_base__range_ie_u64__contains_range(const wuffs_base__range_ie_u64* r,
2409
0
                                         wuffs_base__range_ie_u64 s) {
2410
0
  return wuffs_base__range_ie_u64__equals(
2411
0
      &s, wuffs_base__range_ie_u64__intersect(r, s));
2412
0
}
2413
2414
static inline uint64_t  //
2415
0
wuffs_base__range_ie_u64__length(const wuffs_base__range_ie_u64* r) {
2416
0
  return wuffs_base__u64__sat_sub(r->max_excl, r->min_incl);
2417
0
}
2418
2419
#ifdef __cplusplus
2420
2421
inline bool  //
2422
wuffs_base__range_ie_u64::is_empty() const {
2423
  return wuffs_base__range_ie_u64__is_empty(this);
2424
}
2425
2426
inline bool  //
2427
wuffs_base__range_ie_u64::equals(wuffs_base__range_ie_u64 s) const {
2428
  return wuffs_base__range_ie_u64__equals(this, s);
2429
}
2430
2431
inline wuffs_base__range_ie_u64  //
2432
wuffs_base__range_ie_u64::intersect(wuffs_base__range_ie_u64 s) const {
2433
  return wuffs_base__range_ie_u64__intersect(this, s);
2434
}
2435
2436
inline wuffs_base__range_ie_u64  //
2437
wuffs_base__range_ie_u64::unite(wuffs_base__range_ie_u64 s) const {
2438
  return wuffs_base__range_ie_u64__unite(this, s);
2439
}
2440
2441
inline bool  //
2442
wuffs_base__range_ie_u64::contains(uint64_t x) const {
2443
  return wuffs_base__range_ie_u64__contains(this, x);
2444
}
2445
2446
inline bool  //
2447
wuffs_base__range_ie_u64::contains_range(wuffs_base__range_ie_u64 s) const {
2448
  return wuffs_base__range_ie_u64__contains_range(this, s);
2449
}
2450
2451
inline uint64_t  //
2452
wuffs_base__range_ie_u64::length() const {
2453
  return wuffs_base__range_ie_u64__length(this);
2454
}
2455
2456
#endif  // __cplusplus
2457
2458
// --------
2459
2460
typedef struct wuffs_base__range_ii_u32__struct {
2461
  uint32_t min_incl;
2462
  uint32_t max_incl;
2463
2464
#ifdef __cplusplus
2465
  inline bool is_empty() const;
2466
  inline bool equals(wuffs_base__range_ii_u32__struct s) const;
2467
  inline wuffs_base__range_ii_u32__struct intersect(
2468
      wuffs_base__range_ii_u32__struct s) const;
2469
  inline wuffs_base__range_ii_u32__struct unite(
2470
      wuffs_base__range_ii_u32__struct s) const;
2471
  inline bool contains(uint32_t x) const;
2472
  inline bool contains_range(wuffs_base__range_ii_u32__struct s) const;
2473
#endif  // __cplusplus
2474
2475
} wuffs_base__range_ii_u32;
2476
2477
static inline wuffs_base__range_ii_u32  //
2478
0
wuffs_base__empty_range_ii_u32(void) {
2479
0
  wuffs_base__range_ii_u32 ret;
2480
0
  ret.min_incl = 0;
2481
0
  ret.max_incl = 0;
2482
0
  return ret;
2483
0
}
2484
2485
static inline wuffs_base__range_ii_u32  //
2486
0
wuffs_base__make_range_ii_u32(uint32_t min_incl, uint32_t max_incl) {
2487
0
  wuffs_base__range_ii_u32 ret;
2488
0
  ret.min_incl = min_incl;
2489
0
  ret.max_incl = max_incl;
2490
0
  return ret;
2491
0
}
2492
2493
static inline bool  //
2494
0
wuffs_base__range_ii_u32__is_empty(const wuffs_base__range_ii_u32* r) {
2495
0
  return r->min_incl > r->max_incl;
2496
0
}
2497
2498
static inline bool  //
2499
wuffs_base__range_ii_u32__equals(const wuffs_base__range_ii_u32* r,
2500
0
                                 wuffs_base__range_ii_u32 s) {
2501
0
  return (r->min_incl == s.min_incl && r->max_incl == s.max_incl) ||
2502
0
         (wuffs_base__range_ii_u32__is_empty(r) &&
2503
0
          wuffs_base__range_ii_u32__is_empty(&s));
2504
0
}
2505
2506
static inline wuffs_base__range_ii_u32  //
2507
wuffs_base__range_ii_u32__intersect(const wuffs_base__range_ii_u32* r,
2508
0
                                    wuffs_base__range_ii_u32 s) {
2509
0
  wuffs_base__range_ii_u32 t;
2510
0
  t.min_incl = wuffs_base__u32__max(r->min_incl, s.min_incl);
2511
0
  t.max_incl = wuffs_base__u32__min(r->max_incl, s.max_incl);
2512
0
  return t;
2513
0
}
2514
2515
static inline wuffs_base__range_ii_u32  //
2516
wuffs_base__range_ii_u32__unite(const wuffs_base__range_ii_u32* r,
2517
0
                                wuffs_base__range_ii_u32 s) {
2518
0
  if (wuffs_base__range_ii_u32__is_empty(r)) {
2519
0
    return s;
2520
0
  }
2521
0
  if (wuffs_base__range_ii_u32__is_empty(&s)) {
2522
0
    return *r;
2523
0
  }
2524
0
  wuffs_base__range_ii_u32 t;
2525
0
  t.min_incl = wuffs_base__u32__min(r->min_incl, s.min_incl);
2526
0
  t.max_incl = wuffs_base__u32__max(r->max_incl, s.max_incl);
2527
0
  return t;
2528
0
}
2529
2530
static inline bool  //
2531
wuffs_base__range_ii_u32__contains(const wuffs_base__range_ii_u32* r,
2532
0
                                   uint32_t x) {
2533
0
  return (r->min_incl <= x) && (x <= r->max_incl);
2534
0
}
2535
2536
static inline bool  //
2537
wuffs_base__range_ii_u32__contains_range(const wuffs_base__range_ii_u32* r,
2538
0
                                         wuffs_base__range_ii_u32 s) {
2539
0
  return wuffs_base__range_ii_u32__equals(
2540
0
      &s, wuffs_base__range_ii_u32__intersect(r, s));
2541
0
}
2542
2543
#ifdef __cplusplus
2544
2545
inline bool  //
2546
wuffs_base__range_ii_u32::is_empty() const {
2547
  return wuffs_base__range_ii_u32__is_empty(this);
2548
}
2549
2550
inline bool  //
2551
wuffs_base__range_ii_u32::equals(wuffs_base__range_ii_u32 s) const {
2552
  return wuffs_base__range_ii_u32__equals(this, s);
2553
}
2554
2555
inline wuffs_base__range_ii_u32  //
2556
wuffs_base__range_ii_u32::intersect(wuffs_base__range_ii_u32 s) const {
2557
  return wuffs_base__range_ii_u32__intersect(this, s);
2558
}
2559
2560
inline wuffs_base__range_ii_u32  //
2561
wuffs_base__range_ii_u32::unite(wuffs_base__range_ii_u32 s) const {
2562
  return wuffs_base__range_ii_u32__unite(this, s);
2563
}
2564
2565
inline bool  //
2566
wuffs_base__range_ii_u32::contains(uint32_t x) const {
2567
  return wuffs_base__range_ii_u32__contains(this, x);
2568
}
2569
2570
inline bool  //
2571
wuffs_base__range_ii_u32::contains_range(wuffs_base__range_ii_u32 s) const {
2572
  return wuffs_base__range_ii_u32__contains_range(this, s);
2573
}
2574
2575
#endif  // __cplusplus
2576
2577
// --------
2578
2579
typedef struct wuffs_base__range_ii_u64__struct {
2580
  uint64_t min_incl;
2581
  uint64_t max_incl;
2582
2583
#ifdef __cplusplus
2584
  inline bool is_empty() const;
2585
  inline bool equals(wuffs_base__range_ii_u64__struct s) const;
2586
  inline wuffs_base__range_ii_u64__struct intersect(
2587
      wuffs_base__range_ii_u64__struct s) const;
2588
  inline wuffs_base__range_ii_u64__struct unite(
2589
      wuffs_base__range_ii_u64__struct s) const;
2590
  inline bool contains(uint64_t x) const;
2591
  inline bool contains_range(wuffs_base__range_ii_u64__struct s) const;
2592
#endif  // __cplusplus
2593
2594
} wuffs_base__range_ii_u64;
2595
2596
static inline wuffs_base__range_ii_u64  //
2597
0
wuffs_base__empty_range_ii_u64(void) {
2598
0
  wuffs_base__range_ii_u64 ret;
2599
0
  ret.min_incl = 0;
2600
0
  ret.max_incl = 0;
2601
0
  return ret;
2602
0
}
2603
2604
static inline wuffs_base__range_ii_u64  //
2605
2.68k
wuffs_base__make_range_ii_u64(uint64_t min_incl, uint64_t max_incl) {
2606
2.68k
  wuffs_base__range_ii_u64 ret;
2607
2.68k
  ret.min_incl = min_incl;
2608
2.68k
  ret.max_incl = max_incl;
2609
2.68k
  return ret;
2610
2.68k
}
2611
2612
static inline bool  //
2613
0
wuffs_base__range_ii_u64__is_empty(const wuffs_base__range_ii_u64* r) {
2614
0
  return r->min_incl > r->max_incl;
2615
0
}
2616
2617
static inline bool  //
2618
wuffs_base__range_ii_u64__equals(const wuffs_base__range_ii_u64* r,
2619
0
                                 wuffs_base__range_ii_u64 s) {
2620
0
  return (r->min_incl == s.min_incl && r->max_incl == s.max_incl) ||
2621
0
         (wuffs_base__range_ii_u64__is_empty(r) &&
2622
0
          wuffs_base__range_ii_u64__is_empty(&s));
2623
0
}
2624
2625
static inline wuffs_base__range_ii_u64  //
2626
wuffs_base__range_ii_u64__intersect(const wuffs_base__range_ii_u64* r,
2627
0
                                    wuffs_base__range_ii_u64 s) {
2628
0
  wuffs_base__range_ii_u64 t;
2629
0
  t.min_incl = wuffs_base__u64__max(r->min_incl, s.min_incl);
2630
0
  t.max_incl = wuffs_base__u64__min(r->max_incl, s.max_incl);
2631
0
  return t;
2632
0
}
2633
2634
static inline wuffs_base__range_ii_u64  //
2635
wuffs_base__range_ii_u64__unite(const wuffs_base__range_ii_u64* r,
2636
0
                                wuffs_base__range_ii_u64 s) {
2637
0
  if (wuffs_base__range_ii_u64__is_empty(r)) {
2638
0
    return s;
2639
0
  }
2640
0
  if (wuffs_base__range_ii_u64__is_empty(&s)) {
2641
0
    return *r;
2642
0
  }
2643
0
  wuffs_base__range_ii_u64 t;
2644
0
  t.min_incl = wuffs_base__u64__min(r->min_incl, s.min_incl);
2645
0
  t.max_incl = wuffs_base__u64__max(r->max_incl, s.max_incl);
2646
0
  return t;
2647
0
}
2648
2649
static inline bool  //
2650
wuffs_base__range_ii_u64__contains(const wuffs_base__range_ii_u64* r,
2651
0
                                   uint64_t x) {
2652
0
  return (r->min_incl <= x) && (x <= r->max_incl);
2653
0
}
2654
2655
static inline bool  //
2656
wuffs_base__range_ii_u64__contains_range(const wuffs_base__range_ii_u64* r,
2657
0
                                         wuffs_base__range_ii_u64 s) {
2658
0
  return wuffs_base__range_ii_u64__equals(
2659
0
      &s, wuffs_base__range_ii_u64__intersect(r, s));
2660
0
}
2661
2662
#ifdef __cplusplus
2663
2664
inline bool  //
2665
wuffs_base__range_ii_u64::is_empty() const {
2666
  return wuffs_base__range_ii_u64__is_empty(this);
2667
}
2668
2669
inline bool  //
2670
wuffs_base__range_ii_u64::equals(wuffs_base__range_ii_u64 s) const {
2671
  return wuffs_base__range_ii_u64__equals(this, s);
2672
}
2673
2674
inline wuffs_base__range_ii_u64  //
2675
wuffs_base__range_ii_u64::intersect(wuffs_base__range_ii_u64 s) const {
2676
  return wuffs_base__range_ii_u64__intersect(this, s);
2677
}
2678
2679
inline wuffs_base__range_ii_u64  //
2680
wuffs_base__range_ii_u64::unite(wuffs_base__range_ii_u64 s) const {
2681
  return wuffs_base__range_ii_u64__unite(this, s);
2682
}
2683
2684
inline bool  //
2685
wuffs_base__range_ii_u64::contains(uint64_t x) const {
2686
  return wuffs_base__range_ii_u64__contains(this, x);
2687
}
2688
2689
inline bool  //
2690
wuffs_base__range_ii_u64::contains_range(wuffs_base__range_ii_u64 s) const {
2691
  return wuffs_base__range_ii_u64__contains_range(this, s);
2692
}
2693
2694
#endif  // __cplusplus
2695
2696
// --------
2697
2698
typedef struct wuffs_base__rect_ie_i32__struct {
2699
  int32_t min_incl_x;
2700
  int32_t min_incl_y;
2701
  int32_t max_excl_x;
2702
  int32_t max_excl_y;
2703
2704
#ifdef __cplusplus
2705
  inline bool is_empty() const;
2706
  inline bool equals(wuffs_base__rect_ie_i32__struct s) const;
2707
  inline wuffs_base__rect_ie_i32__struct intersect(
2708
      wuffs_base__rect_ie_i32__struct s) const;
2709
  inline wuffs_base__rect_ie_i32__struct unite(
2710
      wuffs_base__rect_ie_i32__struct s) const;
2711
  inline bool contains(int32_t x, int32_t y) const;
2712
  inline bool contains_rect(wuffs_base__rect_ie_i32__struct s) const;
2713
  inline uint32_t width() const;
2714
  inline uint32_t height() const;
2715
#endif  // __cplusplus
2716
2717
} wuffs_base__rect_ie_i32;
2718
2719
static inline wuffs_base__rect_ie_i32  //
2720
0
wuffs_base__empty_rect_ie_i32(void) {
2721
0
  wuffs_base__rect_ie_i32 ret;
2722
0
  ret.min_incl_x = 0;
2723
0
  ret.min_incl_y = 0;
2724
0
  ret.max_excl_x = 0;
2725
0
  ret.max_excl_y = 0;
2726
0
  return ret;
2727
0
}
2728
2729
static inline wuffs_base__rect_ie_i32  //
2730
wuffs_base__make_rect_ie_i32(int32_t min_incl_x,
2731
                             int32_t min_incl_y,
2732
                             int32_t max_excl_x,
2733
0
                             int32_t max_excl_y) {
2734
0
  wuffs_base__rect_ie_i32 ret;
2735
0
  ret.min_incl_x = min_incl_x;
2736
0
  ret.min_incl_y = min_incl_y;
2737
0
  ret.max_excl_x = max_excl_x;
2738
0
  ret.max_excl_y = max_excl_y;
2739
0
  return ret;
2740
0
}
2741
2742
static inline bool  //
2743
0
wuffs_base__rect_ie_i32__is_empty(const wuffs_base__rect_ie_i32* r) {
2744
0
  return (r->min_incl_x >= r->max_excl_x) || (r->min_incl_y >= r->max_excl_y);
2745
0
}
2746
2747
static inline bool  //
2748
wuffs_base__rect_ie_i32__equals(const wuffs_base__rect_ie_i32* r,
2749
0
                                wuffs_base__rect_ie_i32 s) {
2750
0
  return (r->min_incl_x == s.min_incl_x && r->min_incl_y == s.min_incl_y &&
2751
0
          r->max_excl_x == s.max_excl_x && r->max_excl_y == s.max_excl_y) ||
2752
0
         (wuffs_base__rect_ie_i32__is_empty(r) &&
2753
0
          wuffs_base__rect_ie_i32__is_empty(&s));
2754
0
}
2755
2756
static inline wuffs_base__rect_ie_i32  //
2757
wuffs_base__rect_ie_i32__intersect(const wuffs_base__rect_ie_i32* r,
2758
0
                                   wuffs_base__rect_ie_i32 s) {
2759
0
  wuffs_base__rect_ie_i32 t;
2760
0
  t.min_incl_x = wuffs_base__i32__max(r->min_incl_x, s.min_incl_x);
2761
0
  t.min_incl_y = wuffs_base__i32__max(r->min_incl_y, s.min_incl_y);
2762
0
  t.max_excl_x = wuffs_base__i32__min(r->max_excl_x, s.max_excl_x);
2763
0
  t.max_excl_y = wuffs_base__i32__min(r->max_excl_y, s.max_excl_y);
2764
0
  return t;
2765
0
}
2766
2767
static inline wuffs_base__rect_ie_i32  //
2768
wuffs_base__rect_ie_i32__unite(const wuffs_base__rect_ie_i32* r,
2769
0
                               wuffs_base__rect_ie_i32 s) {
2770
0
  if (wuffs_base__rect_ie_i32__is_empty(r)) {
2771
0
    return s;
2772
0
  }
2773
0
  if (wuffs_base__rect_ie_i32__is_empty(&s)) {
2774
0
    return *r;
2775
0
  }
2776
0
  wuffs_base__rect_ie_i32 t;
2777
0
  t.min_incl_x = wuffs_base__i32__min(r->min_incl_x, s.min_incl_x);
2778
0
  t.min_incl_y = wuffs_base__i32__min(r->min_incl_y, s.min_incl_y);
2779
0
  t.max_excl_x = wuffs_base__i32__max(r->max_excl_x, s.max_excl_x);
2780
0
  t.max_excl_y = wuffs_base__i32__max(r->max_excl_y, s.max_excl_y);
2781
0
  return t;
2782
0
}
2783
2784
static inline bool  //
2785
wuffs_base__rect_ie_i32__contains(const wuffs_base__rect_ie_i32* r,
2786
                                  int32_t x,
2787
0
                                  int32_t y) {
2788
0
  return (r->min_incl_x <= x) && (x < r->max_excl_x) && (r->min_incl_y <= y) &&
2789
0
         (y < r->max_excl_y);
2790
0
}
2791
2792
static inline bool  //
2793
wuffs_base__rect_ie_i32__contains_rect(const wuffs_base__rect_ie_i32* r,
2794
0
                                       wuffs_base__rect_ie_i32 s) {
2795
0
  return wuffs_base__rect_ie_i32__equals(
2796
0
      &s, wuffs_base__rect_ie_i32__intersect(r, s));
2797
0
}
2798
2799
static inline uint32_t  //
2800
0
wuffs_base__rect_ie_i32__width(const wuffs_base__rect_ie_i32* r) {
2801
0
  return (r->max_excl_x > r->min_incl_x)
2802
0
             ? (((uint32_t)(r->max_excl_x)) - ((uint32_t)(r->min_incl_x)))
2803
0
             : 0;
2804
0
}
2805
2806
static inline uint32_t  //
2807
0
wuffs_base__rect_ie_i32__height(const wuffs_base__rect_ie_i32* r) {
2808
0
  return (r->max_excl_y > r->min_incl_y)
2809
0
             ? (((uint32_t)(r->max_excl_y)) - ((uint32_t)(r->min_incl_y)))
2810
0
             : 0;
2811
0
}
2812
2813
#ifdef __cplusplus
2814
2815
inline bool  //
2816
wuffs_base__rect_ie_i32::is_empty() const {
2817
  return wuffs_base__rect_ie_i32__is_empty(this);
2818
}
2819
2820
inline bool  //
2821
wuffs_base__rect_ie_i32::equals(wuffs_base__rect_ie_i32 s) const {
2822
  return wuffs_base__rect_ie_i32__equals(this, s);
2823
}
2824
2825
inline wuffs_base__rect_ie_i32  //
2826
wuffs_base__rect_ie_i32::intersect(wuffs_base__rect_ie_i32 s) const {
2827
  return wuffs_base__rect_ie_i32__intersect(this, s);
2828
}
2829
2830
inline wuffs_base__rect_ie_i32  //
2831
wuffs_base__rect_ie_i32::unite(wuffs_base__rect_ie_i32 s) const {
2832
  return wuffs_base__rect_ie_i32__unite(this, s);
2833
}
2834
2835
inline bool  //
2836
wuffs_base__rect_ie_i32::contains(int32_t x, int32_t y) const {
2837
  return wuffs_base__rect_ie_i32__contains(this, x, y);
2838
}
2839
2840
inline bool  //
2841
wuffs_base__rect_ie_i32::contains_rect(wuffs_base__rect_ie_i32 s) const {
2842
  return wuffs_base__rect_ie_i32__contains_rect(this, s);
2843
}
2844
2845
inline uint32_t  //
2846
wuffs_base__rect_ie_i32::width() const {
2847
  return wuffs_base__rect_ie_i32__width(this);
2848
}
2849
2850
inline uint32_t  //
2851
wuffs_base__rect_ie_i32::height() const {
2852
  return wuffs_base__rect_ie_i32__height(this);
2853
}
2854
2855
#endif  // __cplusplus
2856
2857
// --------
2858
2859
typedef struct wuffs_base__rect_ie_u32__struct {
2860
  uint32_t min_incl_x;
2861
  uint32_t min_incl_y;
2862
  uint32_t max_excl_x;
2863
  uint32_t max_excl_y;
2864
2865
#ifdef __cplusplus
2866
  inline bool is_empty() const;
2867
  inline bool equals(wuffs_base__rect_ie_u32__struct s) const;
2868
  inline wuffs_base__rect_ie_u32__struct intersect(
2869
      wuffs_base__rect_ie_u32__struct s) const;
2870
  inline wuffs_base__rect_ie_u32__struct unite(
2871
      wuffs_base__rect_ie_u32__struct s) const;
2872
  inline bool contains(uint32_t x, uint32_t y) const;
2873
  inline bool contains_rect(wuffs_base__rect_ie_u32__struct s) const;
2874
  inline uint32_t width() const;
2875
  inline uint32_t height() const;
2876
#endif  // __cplusplus
2877
2878
} wuffs_base__rect_ie_u32;
2879
2880
static inline wuffs_base__rect_ie_u32  //
2881
0
wuffs_base__empty_rect_ie_u32(void) {
2882
0
  wuffs_base__rect_ie_u32 ret;
2883
0
  ret.min_incl_x = 0;
2884
0
  ret.min_incl_y = 0;
2885
0
  ret.max_excl_x = 0;
2886
0
  ret.max_excl_y = 0;
2887
0
  return ret;
2888
0
}
2889
2890
static inline wuffs_base__rect_ie_u32  //
2891
wuffs_base__make_rect_ie_u32(uint32_t min_incl_x,
2892
                             uint32_t min_incl_y,
2893
                             uint32_t max_excl_x,
2894
5.33k
                             uint32_t max_excl_y) {
2895
5.33k
  wuffs_base__rect_ie_u32 ret;
2896
5.33k
  ret.min_incl_x = min_incl_x;
2897
5.33k
  ret.min_incl_y = min_incl_y;
2898
5.33k
  ret.max_excl_x = max_excl_x;
2899
5.33k
  ret.max_excl_y = max_excl_y;
2900
5.33k
  return ret;
2901
5.33k
}
2902
2903
static inline bool  //
2904
0
wuffs_base__rect_ie_u32__is_empty(const wuffs_base__rect_ie_u32* r) {
2905
0
  return (r->min_incl_x >= r->max_excl_x) || (r->min_incl_y >= r->max_excl_y);
2906
0
}
2907
2908
static inline bool  //
2909
wuffs_base__rect_ie_u32__equals(const wuffs_base__rect_ie_u32* r,
2910
2.67k
                                wuffs_base__rect_ie_u32 s) {
2911
2.67k
  return (r->min_incl_x == s.min_incl_x && r->min_incl_y == s.min_incl_y &&
2912
2.67k
          r->max_excl_x == s.max_excl_x && r->max_excl_y == s.max_excl_y) ||
2913
2.67k
         (wuffs_base__rect_ie_u32__is_empty(r) &&
2914
0
          wuffs_base__rect_ie_u32__is_empty(&s));
2915
2.67k
}
2916
2917
static inline wuffs_base__rect_ie_u32  //
2918
wuffs_base__rect_ie_u32__intersect(const wuffs_base__rect_ie_u32* r,
2919
2.66k
                                   wuffs_base__rect_ie_u32 s) {
2920
2.66k
  wuffs_base__rect_ie_u32 t;
2921
2.66k
  t.min_incl_x = wuffs_base__u32__max(r->min_incl_x, s.min_incl_x);
2922
2.66k
  t.min_incl_y = wuffs_base__u32__max(r->min_incl_y, s.min_incl_y);
2923
2.66k
  t.max_excl_x = wuffs_base__u32__min(r->max_excl_x, s.max_excl_x);
2924
2.66k
  t.max_excl_y = wuffs_base__u32__min(r->max_excl_y, s.max_excl_y);
2925
2.66k
  return t;
2926
2.66k
}
2927
2928
static inline wuffs_base__rect_ie_u32  //
2929
wuffs_base__rect_ie_u32__unite(const wuffs_base__rect_ie_u32* r,
2930
0
                               wuffs_base__rect_ie_u32 s) {
2931
0
  if (wuffs_base__rect_ie_u32__is_empty(r)) {
2932
0
    return s;
2933
0
  }
2934
0
  if (wuffs_base__rect_ie_u32__is_empty(&s)) {
2935
0
    return *r;
2936
0
  }
2937
0
  wuffs_base__rect_ie_u32 t;
2938
0
  t.min_incl_x = wuffs_base__u32__min(r->min_incl_x, s.min_incl_x);
2939
0
  t.min_incl_y = wuffs_base__u32__min(r->min_incl_y, s.min_incl_y);
2940
0
  t.max_excl_x = wuffs_base__u32__max(r->max_excl_x, s.max_excl_x);
2941
0
  t.max_excl_y = wuffs_base__u32__max(r->max_excl_y, s.max_excl_y);
2942
0
  return t;
2943
0
}
2944
2945
static inline bool  //
2946
wuffs_base__rect_ie_u32__contains(const wuffs_base__rect_ie_u32* r,
2947
                                  uint32_t x,
2948
0
                                  uint32_t y) {
2949
0
  return (r->min_incl_x <= x) && (x < r->max_excl_x) && (r->min_incl_y <= y) &&
2950
0
         (y < r->max_excl_y);
2951
0
}
2952
2953
static inline bool  //
2954
wuffs_base__rect_ie_u32__contains_rect(const wuffs_base__rect_ie_u32* r,
2955
2.66k
                                       wuffs_base__rect_ie_u32 s) {
2956
2.66k
  return wuffs_base__rect_ie_u32__equals(
2957
2.66k
      &s, wuffs_base__rect_ie_u32__intersect(r, s));
2958
2.66k
}
2959
2960
static inline uint32_t  //
2961
0
wuffs_base__rect_ie_u32__width(const wuffs_base__rect_ie_u32* r) {
2962
0
  return wuffs_base__u32__sat_sub(r->max_excl_x, r->min_incl_x);
2963
0
}
2964
2965
static inline uint32_t  //
2966
0
wuffs_base__rect_ie_u32__height(const wuffs_base__rect_ie_u32* r) {
2967
0
  return wuffs_base__u32__sat_sub(r->max_excl_y, r->min_incl_y);
2968
0
}
2969
2970
#ifdef __cplusplus
2971
2972
inline bool  //
2973
wuffs_base__rect_ie_u32::is_empty() const {
2974
  return wuffs_base__rect_ie_u32__is_empty(this);
2975
}
2976
2977
inline bool  //
2978
wuffs_base__rect_ie_u32::equals(wuffs_base__rect_ie_u32 s) const {
2979
  return wuffs_base__rect_ie_u32__equals(this, s);
2980
}
2981
2982
inline wuffs_base__rect_ie_u32  //
2983
wuffs_base__rect_ie_u32::intersect(wuffs_base__rect_ie_u32 s) const {
2984
  return wuffs_base__rect_ie_u32__intersect(this, s);
2985
}
2986
2987
inline wuffs_base__rect_ie_u32  //
2988
wuffs_base__rect_ie_u32::unite(wuffs_base__rect_ie_u32 s) const {
2989
  return wuffs_base__rect_ie_u32__unite(this, s);
2990
}
2991
2992
inline bool  //
2993
wuffs_base__rect_ie_u32::contains(uint32_t x, uint32_t y) const {
2994
  return wuffs_base__rect_ie_u32__contains(this, x, y);
2995
}
2996
2997
inline bool  //
2998
wuffs_base__rect_ie_u32::contains_rect(wuffs_base__rect_ie_u32 s) const {
2999
  return wuffs_base__rect_ie_u32__contains_rect(this, s);
3000
}
3001
3002
inline uint32_t  //
3003
wuffs_base__rect_ie_u32::width() const {
3004
  return wuffs_base__rect_ie_u32__width(this);
3005
}
3006
3007
inline uint32_t  //
3008
wuffs_base__rect_ie_u32::height() const {
3009
  return wuffs_base__rect_ie_u32__height(this);
3010
}
3011
3012
#endif  // __cplusplus
3013
3014
// --------
3015
3016
typedef struct wuffs_base__rect_ii_u32__struct {
3017
  uint32_t min_incl_x;
3018
  uint32_t min_incl_y;
3019
  uint32_t max_incl_x;
3020
  uint32_t max_incl_y;
3021
3022
#ifdef __cplusplus
3023
  inline bool is_empty() const;
3024
  inline bool equals(wuffs_base__rect_ii_u32__struct s) const;
3025
  inline wuffs_base__rect_ii_u32__struct intersect(
3026
      wuffs_base__rect_ii_u32__struct s) const;
3027
  inline wuffs_base__rect_ii_u32__struct unite(
3028
      wuffs_base__rect_ii_u32__struct s) const;
3029
  inline bool contains(uint32_t x, uint32_t y) const;
3030
  inline bool contains_rect(wuffs_base__rect_ii_u32__struct s) const;
3031
#endif  // __cplusplus
3032
3033
} wuffs_base__rect_ii_u32;
3034
3035
static inline wuffs_base__rect_ii_u32  //
3036
0
wuffs_base__empty_rect_ii_u32(void) {
3037
0
  wuffs_base__rect_ii_u32 ret;
3038
0
  ret.min_incl_x = 0;
3039
0
  ret.min_incl_y = 0;
3040
0
  ret.max_incl_x = 0;
3041
0
  ret.max_incl_y = 0;
3042
0
  return ret;
3043
0
}
3044
3045
static inline wuffs_base__rect_ii_u32  //
3046
wuffs_base__make_rect_ii_u32(uint32_t min_incl_x,
3047
                             uint32_t min_incl_y,
3048
                             uint32_t max_incl_x,
3049
0
                             uint32_t max_incl_y) {
3050
0
  wuffs_base__rect_ii_u32 ret;
3051
0
  ret.min_incl_x = min_incl_x;
3052
0
  ret.min_incl_y = min_incl_y;
3053
0
  ret.max_incl_x = max_incl_x;
3054
0
  ret.max_incl_y = max_incl_y;
3055
0
  return ret;
3056
0
}
3057
3058
static inline bool  //
3059
0
wuffs_base__rect_ii_u32__is_empty(const wuffs_base__rect_ii_u32* r) {
3060
0
  return (r->min_incl_x > r->max_incl_x) || (r->min_incl_y > r->max_incl_y);
3061
0
}
3062
3063
static inline bool  //
3064
wuffs_base__rect_ii_u32__equals(const wuffs_base__rect_ii_u32* r,
3065
0
                                wuffs_base__rect_ii_u32 s) {
3066
0
  return (r->min_incl_x == s.min_incl_x && r->min_incl_y == s.min_incl_y &&
3067
0
          r->max_incl_x == s.max_incl_x && r->max_incl_y == s.max_incl_y) ||
3068
0
         (wuffs_base__rect_ii_u32__is_empty(r) &&
3069
0
          wuffs_base__rect_ii_u32__is_empty(&s));
3070
0
}
3071
3072
static inline wuffs_base__rect_ii_u32  //
3073
wuffs_base__rect_ii_u32__intersect(const wuffs_base__rect_ii_u32* r,
3074
0
                                   wuffs_base__rect_ii_u32 s) {
3075
0
  wuffs_base__rect_ii_u32 t;
3076
0
  t.min_incl_x = wuffs_base__u32__max(r->min_incl_x, s.min_incl_x);
3077
0
  t.min_incl_y = wuffs_base__u32__max(r->min_incl_y, s.min_incl_y);
3078
0
  t.max_incl_x = wuffs_base__u32__min(r->max_incl_x, s.max_incl_x);
3079
0
  t.max_incl_y = wuffs_base__u32__min(r->max_incl_y, s.max_incl_y);
3080
0
  return t;
3081
0
}
3082
3083
static inline wuffs_base__rect_ii_u32  //
3084
wuffs_base__rect_ii_u32__unite(const wuffs_base__rect_ii_u32* r,
3085
0
                               wuffs_base__rect_ii_u32 s) {
3086
0
  if (wuffs_base__rect_ii_u32__is_empty(r)) {
3087
0
    return s;
3088
0
  }
3089
0
  if (wuffs_base__rect_ii_u32__is_empty(&s)) {
3090
0
    return *r;
3091
0
  }
3092
0
  wuffs_base__rect_ii_u32 t;
3093
0
  t.min_incl_x = wuffs_base__u32__min(r->min_incl_x, s.min_incl_x);
3094
0
  t.min_incl_y = wuffs_base__u32__min(r->min_incl_y, s.min_incl_y);
3095
0
  t.max_incl_x = wuffs_base__u32__max(r->max_incl_x, s.max_incl_x);
3096
0
  t.max_incl_y = wuffs_base__u32__max(r->max_incl_y, s.max_incl_y);
3097
0
  return t;
3098
0
}
3099
3100
static inline bool  //
3101
wuffs_base__rect_ii_u32__contains(const wuffs_base__rect_ii_u32* r,
3102
                                  uint32_t x,
3103
0
                                  uint32_t y) {
3104
0
  return (r->min_incl_x <= x) && (x <= r->max_incl_x) && (r->min_incl_y <= y) &&
3105
0
         (y <= r->max_incl_y);
3106
0
}
3107
3108
static inline bool  //
3109
wuffs_base__rect_ii_u32__contains_rect(const wuffs_base__rect_ii_u32* r,
3110
0
                                       wuffs_base__rect_ii_u32 s) {
3111
0
  return wuffs_base__rect_ii_u32__equals(
3112
0
      &s, wuffs_base__rect_ii_u32__intersect(r, s));
3113
0
}
3114
3115
#ifdef __cplusplus
3116
3117
inline bool  //
3118
wuffs_base__rect_ii_u32::is_empty() const {
3119
  return wuffs_base__rect_ii_u32__is_empty(this);
3120
}
3121
3122
inline bool  //
3123
wuffs_base__rect_ii_u32::equals(wuffs_base__rect_ii_u32 s) const {
3124
  return wuffs_base__rect_ii_u32__equals(this, s);
3125
}
3126
3127
inline wuffs_base__rect_ii_u32  //
3128
wuffs_base__rect_ii_u32::intersect(wuffs_base__rect_ii_u32 s) const {
3129
  return wuffs_base__rect_ii_u32__intersect(this, s);
3130
}
3131
3132
inline wuffs_base__rect_ii_u32  //
3133
wuffs_base__rect_ii_u32::unite(wuffs_base__rect_ii_u32 s) const {
3134
  return wuffs_base__rect_ii_u32__unite(this, s);
3135
}
3136
3137
inline bool  //
3138
wuffs_base__rect_ii_u32::contains(uint32_t x, uint32_t y) const {
3139
  return wuffs_base__rect_ii_u32__contains(this, x, y);
3140
}
3141
3142
inline bool  //
3143
wuffs_base__rect_ii_u32::contains_rect(wuffs_base__rect_ii_u32 s) const {
3144
  return wuffs_base__rect_ii_u32__contains_rect(this, s);
3145
}
3146
3147
#endif  // __cplusplus
3148
3149
// ---------------- More Information
3150
3151
// wuffs_base__more_information holds additional fields, typically when a Wuffs
3152
// method returns a [note status](/doc/note/statuses.md).
3153
//
3154
// The flavor field follows the base38 namespace
3155
// convention](/doc/note/base38-and-fourcc.md). The other fields' semantics
3156
// depends on the flavor.
3157
typedef struct wuffs_base__more_information__struct {
3158
  uint32_t flavor;
3159
  uint32_t w;
3160
  uint64_t x;
3161
  uint64_t y;
3162
  uint64_t z;
3163
3164
#ifdef __cplusplus
3165
  inline void set(uint32_t flavor_arg,
3166
                  uint32_t w_arg,
3167
                  uint64_t x_arg,
3168
                  uint64_t y_arg,
3169
                  uint64_t z_arg);
3170
  inline uint32_t io_redirect__fourcc() const;
3171
  inline wuffs_base__range_ie_u64 io_redirect__range() const;
3172
  inline uint64_t io_seek__position() const;
3173
  inline uint32_t metadata__fourcc() const;
3174
  inline wuffs_base__range_ie_u64 metadata_raw_passthrough__range() const;
3175
  inline int32_t metadata_parsed__chrm(uint32_t component) const;
3176
  inline uint32_t metadata_parsed__gama() const;
3177
  inline uint32_t metadata_parsed__srgb() const;
3178
#endif  // __cplusplus
3179
3180
} wuffs_base__more_information;
3181
3182
#define WUFFS_BASE__MORE_INFORMATION__FLAVOR__IO_REDIRECT 1
3183
#define WUFFS_BASE__MORE_INFORMATION__FLAVOR__IO_SEEK 2
3184
#define WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA_RAW_PASSTHROUGH 3
3185
#define WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA_RAW_TRANSFORM 4
3186
#define WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA_PARSED 5
3187
3188
static inline wuffs_base__more_information  //
3189
0
wuffs_base__empty_more_information(void) {
3190
0
  wuffs_base__more_information ret;
3191
0
  ret.flavor = 0;
3192
0
  ret.w = 0;
3193
0
  ret.x = 0;
3194
0
  ret.y = 0;
3195
0
  ret.z = 0;
3196
0
  return ret;
3197
0
}
3198
3199
static inline void  //
3200
wuffs_base__more_information__set(wuffs_base__more_information* m,
3201
                                  uint32_t flavor,
3202
                                  uint32_t w,
3203
                                  uint64_t x,
3204
                                  uint64_t y,
3205
0
                                  uint64_t z) {
3206
0
  if (!m) {
3207
0
    return;
3208
0
  }
3209
0
  m->flavor = flavor;
3210
0
  m->w = w;
3211
0
  m->x = x;
3212
0
  m->y = y;
3213
0
  m->z = z;
3214
0
}
3215
3216
static inline uint32_t  //
3217
wuffs_base__more_information__io_redirect__fourcc(
3218
0
    const wuffs_base__more_information* m) {
3219
0
  return m->w;
3220
0
}
3221
3222
static inline wuffs_base__range_ie_u64  //
3223
wuffs_base__more_information__io_redirect__range(
3224
0
    const wuffs_base__more_information* m) {
3225
0
  wuffs_base__range_ie_u64 ret;
3226
0
  ret.min_incl = m->y;
3227
0
  ret.max_excl = m->z;
3228
0
  return ret;
3229
0
}
3230
3231
static inline uint64_t  //
3232
wuffs_base__more_information__io_seek__position(
3233
0
    const wuffs_base__more_information* m) {
3234
0
  return m->x;
3235
0
}
3236
3237
static inline uint32_t  //
3238
wuffs_base__more_information__metadata__fourcc(
3239
0
    const wuffs_base__more_information* m) {
3240
0
  return m->w;
3241
0
}
3242
3243
static inline wuffs_base__range_ie_u64  //
3244
wuffs_base__more_information__metadata_raw_passthrough__range(
3245
0
    const wuffs_base__more_information* m) {
3246
0
  wuffs_base__range_ie_u64 ret;
3247
0
  ret.min_incl = m->y;
3248
0
  ret.max_excl = m->z;
3249
0
  return ret;
3250
0
}
3251
3252
#define WUFFS_BASE__MORE_INFORMATION__METADATA_PARSED__CHRM__WHITE_X 0
3253
#define WUFFS_BASE__MORE_INFORMATION__METADATA_PARSED__CHRM__WHITE_Y 1
3254
#define WUFFS_BASE__MORE_INFORMATION__METADATA_PARSED__CHRM__RED_X 2
3255
#define WUFFS_BASE__MORE_INFORMATION__METADATA_PARSED__CHRM__RED_Y 3
3256
#define WUFFS_BASE__MORE_INFORMATION__METADATA_PARSED__CHRM__GREEN_X 4
3257
#define WUFFS_BASE__MORE_INFORMATION__METADATA_PARSED__CHRM__GREEN_Y 5
3258
#define WUFFS_BASE__MORE_INFORMATION__METADATA_PARSED__CHRM__BLUE_X 6
3259
#define WUFFS_BASE__MORE_INFORMATION__METADATA_PARSED__CHRM__BLUE_Y 7
3260
3261
// wuffs_base__more_information__metadata_parsed__chrm returns chromaticity
3262
// values (scaled by 100000) like the PNG "cHRM" chunk. For example, the sRGB
3263
// color space corresponds to:
3264
//  - ETC__CHRM__WHITE_X 31270
3265
//  - ETC__CHRM__WHITE_Y 32900
3266
//  - ETC__CHRM__RED_X   64000
3267
//  - ETC__CHRM__RED_Y   33000
3268
//  - ETC__CHRM__GREEN_X 30000
3269
//  - ETC__CHRM__GREEN_Y 60000
3270
//  - ETC__CHRM__BLUE_X  15000
3271
//  - ETC__CHRM__BLUE_Y   6000
3272
//
3273
// See
3274
// https://ciechanow.ski/color-spaces/#chromaticity-and-white-point-coordinates
3275
static inline int32_t  //
3276
wuffs_base__more_information__metadata_parsed__chrm(
3277
    const wuffs_base__more_information* m,
3278
0
    uint32_t component) {
3279
0
  // After the flavor and the w field (holding a FourCC), a
3280
0
  // wuffs_base__more_information holds 24 bytes of data in three uint64_t
3281
0
  // typed fields (x, y and z). We pack the eight chromaticity values (wx, wy,
3282
0
  // rx, ..., by), basically int24_t values, into 24 bytes like this:
3283
0
  //  -    LSB                 MSB
3284
0
  //  - x: wx wx wx wy wy wy rx rx
3285
0
  //  - y: rx ry ry ry gx gx gx gy
3286
0
  //  - z: gy gy bx bx bx by by by
3287
0
  uint32_t u = 0;
3288
0
  switch (component & 7) {
3289
0
    case 0:
3290
0
      u = ((uint32_t)(m->x >> 0));
3291
0
      break;
3292
0
    case 1:
3293
0
      u = ((uint32_t)(m->x >> 24));
3294
0
      break;
3295
0
    case 2:
3296
0
      u = ((uint32_t)((m->x >> 48) | (m->y << 16)));
3297
0
      break;
3298
0
    case 3:
3299
0
      u = ((uint32_t)(m->y >> 8));
3300
0
      break;
3301
0
    case 4:
3302
0
      u = ((uint32_t)(m->y >> 32));
3303
0
      break;
3304
0
    case 5:
3305
0
      u = ((uint32_t)((m->y >> 56) | (m->z << 8)));
3306
0
      break;
3307
0
    case 6:
3308
0
      u = ((uint32_t)(m->z >> 16));
3309
0
      break;
3310
0
    case 7:
3311
0
      u = ((uint32_t)(m->z >> 40));
3312
0
      break;
3313
0
  }
3314
0
  // The left-right shifts sign-extend from 24-bit to 32-bit integers.
3315
0
  return ((int32_t)(u << 8)) >> 8;
3316
0
}
3317
3318
// wuffs_base__more_information__metadata_parsed__gama returns inverse gamma
3319
// correction values (scaled by 100000) like the PNG "gAMA" chunk. For example,
3320
// for gamma = 2.2, this returns 45455 (approximating 100000 / 2.2).
3321
static inline uint32_t  //
3322
wuffs_base__more_information__metadata_parsed__gama(
3323
0
    const wuffs_base__more_information* m) {
3324
0
  return ((uint32_t)(m->x));
3325
0
}
3326
3327
#define WUFFS_BASE__SRGB_RENDERING_INTENT__PERCEPTUAL 0
3328
#define WUFFS_BASE__SRGB_RENDERING_INTENT__RELATIVE_COLORIMETRIC 1
3329
#define WUFFS_BASE__SRGB_RENDERING_INTENT__SATURATION 2
3330
#define WUFFS_BASE__SRGB_RENDERING_INTENT__ABSOLUTE_COLORIMETRIC 3
3331
3332
// wuffs_base__more_information__metadata_parsed__srgb returns the sRGB
3333
// rendering intent like the PNG "sRGB" chunk.
3334
static inline uint32_t  //
3335
wuffs_base__more_information__metadata_parsed__srgb(
3336
0
    const wuffs_base__more_information* m) {
3337
0
  return m->x & 3;
3338
0
}
3339
3340
#ifdef __cplusplus
3341
3342
inline void  //
3343
wuffs_base__more_information::set(uint32_t flavor_arg,
3344
                                  uint32_t w_arg,
3345
                                  uint64_t x_arg,
3346
                                  uint64_t y_arg,
3347
                                  uint64_t z_arg) {
3348
  wuffs_base__more_information__set(this, flavor_arg, w_arg, x_arg, y_arg,
3349
                                    z_arg);
3350
}
3351
3352
inline uint32_t  //
3353
wuffs_base__more_information::io_redirect__fourcc() const {
3354
  return wuffs_base__more_information__io_redirect__fourcc(this);
3355
}
3356
3357
inline wuffs_base__range_ie_u64  //
3358
wuffs_base__more_information::io_redirect__range() const {
3359
  return wuffs_base__more_information__io_redirect__range(this);
3360
}
3361
3362
inline uint64_t  //
3363
wuffs_base__more_information::io_seek__position() const {
3364
  return wuffs_base__more_information__io_seek__position(this);
3365
}
3366
3367
inline uint32_t  //
3368
wuffs_base__more_information::metadata__fourcc() const {
3369
  return wuffs_base__more_information__metadata__fourcc(this);
3370
}
3371
3372
inline wuffs_base__range_ie_u64  //
3373
wuffs_base__more_information::metadata_raw_passthrough__range() const {
3374
  return wuffs_base__more_information__metadata_raw_passthrough__range(this);
3375
}
3376
3377
inline int32_t  //
3378
wuffs_base__more_information::metadata_parsed__chrm(uint32_t component) const {
3379
  return wuffs_base__more_information__metadata_parsed__chrm(this, component);
3380
}
3381
3382
inline uint32_t  //
3383
wuffs_base__more_information::metadata_parsed__gama() const {
3384
  return wuffs_base__more_information__metadata_parsed__gama(this);
3385
}
3386
3387
inline uint32_t  //
3388
wuffs_base__more_information::metadata_parsed__srgb() const {
3389
  return wuffs_base__more_information__metadata_parsed__srgb(this);
3390
}
3391
3392
#endif  // __cplusplus
3393
3394
// ---------------- I/O
3395
//
3396
// See (/doc/note/io-input-output.md).
3397
3398
// wuffs_base__io_buffer_meta is the metadata for a wuffs_base__io_buffer's
3399
// data.
3400
typedef struct wuffs_base__io_buffer_meta__struct {
3401
  size_t wi;     // Write index. Invariant: wi <= len.
3402
  size_t ri;     // Read  index. Invariant: ri <= wi.
3403
  uint64_t pos;  // Buffer position (relative to the start of stream).
3404
  bool closed;   // No further writes are expected.
3405
} wuffs_base__io_buffer_meta;
3406
3407
// wuffs_base__io_buffer is a 1-dimensional buffer (a pointer and length) plus
3408
// additional metadata.
3409
//
3410
// A value with all fields zero is a valid, empty buffer.
3411
typedef struct wuffs_base__io_buffer__struct {
3412
  wuffs_base__slice_u8 data;
3413
  wuffs_base__io_buffer_meta meta;
3414
3415
#ifdef __cplusplus
3416
  inline bool is_valid() const;
3417
  inline size_t compact();
3418
  inline size_t compact_retaining(uint64_t history_retain_length);
3419
  inline size_t reader_length() const;
3420
  inline uint8_t* reader_pointer() const;
3421
  inline uint64_t reader_position() const;
3422
  inline wuffs_base__slice_u8 reader_slice() const;
3423
  inline size_t writer_length() const;
3424
  inline uint8_t* writer_pointer() const;
3425
  inline uint64_t writer_position() const;
3426
  inline wuffs_base__slice_u8 writer_slice() const;
3427
#endif  // __cplusplus
3428
3429
} wuffs_base__io_buffer;
3430
3431
static inline wuffs_base__io_buffer  //
3432
wuffs_base__make_io_buffer(wuffs_base__slice_u8 data,
3433
0
                           wuffs_base__io_buffer_meta meta) {
3434
0
  wuffs_base__io_buffer ret;
3435
0
  ret.data = data;
3436
0
  ret.meta = meta;
3437
0
  return ret;
3438
0
}
3439
3440
static inline wuffs_base__io_buffer_meta  //
3441
wuffs_base__make_io_buffer_meta(size_t wi,
3442
                                size_t ri,
3443
                                uint64_t pos,
3444
0
                                bool closed) {
3445
0
  wuffs_base__io_buffer_meta ret;
3446
0
  ret.wi = wi;
3447
0
  ret.ri = ri;
3448
0
  ret.pos = pos;
3449
0
  ret.closed = closed;
3450
0
  return ret;
3451
0
}
3452
3453
static inline wuffs_base__io_buffer  //
3454
3.72k
wuffs_base__ptr_u8__reader(uint8_t* ptr, size_t len, bool closed) {
3455
3.72k
  wuffs_base__io_buffer ret;
3456
3.72k
  ret.data.ptr = ptr;
3457
3.72k
  ret.data.len = len;
3458
3.72k
  ret.meta.wi = len;
3459
3.72k
  ret.meta.ri = 0;
3460
3.72k
  ret.meta.pos = 0;
3461
3.72k
  ret.meta.closed = closed;
3462
3.72k
  return ret;
3463
3.72k
}
3464
3465
static inline wuffs_base__io_buffer  //
3466
0
wuffs_base__ptr_u8__writer(uint8_t* ptr, size_t len) {
3467
0
  wuffs_base__io_buffer ret;
3468
0
  ret.data.ptr = ptr;
3469
0
  ret.data.len = len;
3470
0
  ret.meta.wi = 0;
3471
0
  ret.meta.ri = 0;
3472
0
  ret.meta.pos = 0;
3473
0
  ret.meta.closed = false;
3474
0
  return ret;
3475
0
}
3476
3477
static inline wuffs_base__io_buffer  //
3478
0
wuffs_base__slice_u8__reader(wuffs_base__slice_u8 s, bool closed) {
3479
0
  wuffs_base__io_buffer ret;
3480
0
  ret.data.ptr = s.ptr;
3481
0
  ret.data.len = s.len;
3482
0
  ret.meta.wi = s.len;
3483
0
  ret.meta.ri = 0;
3484
0
  ret.meta.pos = 0;
3485
0
  ret.meta.closed = closed;
3486
0
  return ret;
3487
0
}
3488
3489
static inline wuffs_base__io_buffer  //
3490
0
wuffs_base__slice_u8__writer(wuffs_base__slice_u8 s) {
3491
0
  wuffs_base__io_buffer ret;
3492
0
  ret.data.ptr = s.ptr;
3493
0
  ret.data.len = s.len;
3494
0
  ret.meta.wi = 0;
3495
0
  ret.meta.ri = 0;
3496
0
  ret.meta.pos = 0;
3497
0
  ret.meta.closed = false;
3498
0
  return ret;
3499
0
}
3500
3501
static inline wuffs_base__io_buffer  //
3502
24.7M
wuffs_base__empty_io_buffer(void) {
3503
24.7M
  wuffs_base__io_buffer ret;
3504
24.7M
  ret.data.ptr = NULL;
3505
24.7M
  ret.data.len = 0;
3506
24.7M
  ret.meta.wi = 0;
3507
24.7M
  ret.meta.ri = 0;
3508
24.7M
  ret.meta.pos = 0;
3509
24.7M
  ret.meta.closed = false;
3510
24.7M
  return ret;
3511
24.7M
}
3512
3513
static inline wuffs_base__io_buffer_meta  //
3514
0
wuffs_base__empty_io_buffer_meta(void) {
3515
0
  wuffs_base__io_buffer_meta ret;
3516
0
  ret.wi = 0;
3517
0
  ret.ri = 0;
3518
0
  ret.pos = 0;
3519
0
  ret.closed = false;
3520
0
  return ret;
3521
0
}
3522
3523
static inline bool  //
3524
0
wuffs_base__io_buffer__is_valid(const wuffs_base__io_buffer* buf) {
3525
0
  if (buf) {
3526
0
    if (buf->data.ptr) {
3527
0
      return (buf->meta.ri <= buf->meta.wi) && (buf->meta.wi <= buf->data.len);
3528
0
    } else {
3529
0
      return (buf->meta.ri == 0) && (buf->meta.wi == 0) && (buf->data.len == 0);
3530
0
    }
3531
0
  }
3532
0
  return false;
3533
0
}
3534
3535
// wuffs_base__io_buffer__compact moves any written but unread bytes to the
3536
// start of the buffer.
3537
//
3538
// It returns the increase in the writer length: how much meta.wi fell by.
3539
static inline size_t  //
3540
0
wuffs_base__io_buffer__compact(wuffs_base__io_buffer* buf) {
3541
0
  if (!buf || (buf->meta.ri == 0)) {
3542
0
    return 0;
3543
0
  }
3544
0
  size_t old_ri = buf->meta.ri;
3545
0
  buf->meta.pos = wuffs_base__u64__sat_add(buf->meta.pos, buf->meta.ri);
3546
0
  size_t new_wi = buf->meta.wi - buf->meta.ri;
3547
0
  if (new_wi != 0) {
3548
0
    memmove(buf->data.ptr, buf->data.ptr + buf->meta.ri, new_wi);
3549
0
  }
3550
0
  buf->meta.wi = new_wi;
3551
0
  buf->meta.ri = 0;
3552
0
  return old_ri;
3553
0
}
3554
3555
// wuffs_base__io_buffer__compact_retaining moves any written but unread bytes
3556
// closer to the start of the buffer. It retains H bytes of history (the most
3557
// recently read bytes), where H is min(buf->meta.ri, history_retain_length).
3558
// It is therefore a no-op if history_retain_length is UINT64_MAX. A
3559
// postcondition is that buf->meta.ri == H.
3560
//
3561
// It returns the increase in the writer length: how much meta.wi fell by.
3562
//
3563
// wuffs_base__io_buffer__compact_retaining(0) is equivalent to
3564
// wuffs_base__io_buffer__compact().
3565
//
3566
// For example, if buf started like this:
3567
//
3568
//        +--- ri = 3
3569
//        v
3570
//     abcdefgh??    len = 10, pos = 900
3571
//             ^
3572
//             +--- wi = 8
3573
//
3574
// Then, depending on history_retain_length, the resultant buf would be:
3575
//
3576
// HRL = 0     defgh?????    ri = 0    wi = 5    pos = 903    return = 3
3577
// HRL = 1     cdefgh????    ri = 1    wi = 6    pos = 902    return = 2
3578
// HRL = 2     bcdefgh???    ri = 2    wi = 7    pos = 901    return = 1
3579
// HRL = 3     abcdefgh??    ri = 3    wi = 8    pos = 900    return = 0
3580
// HRL = 4+    abcdefgh??    ri = 3    wi = 8    pos = 900    return = 0
3581
static inline size_t  //
3582
wuffs_base__io_buffer__compact_retaining(wuffs_base__io_buffer* buf,
3583
0
                                         uint64_t history_retain_length) {
3584
0
  if (!buf || (buf->meta.ri == 0)) {
3585
0
    return 0;
3586
0
  }
3587
0
  size_t old_ri = buf->meta.ri;
3588
0
  size_t new_ri = (size_t)(wuffs_base__u64__min(old_ri, history_retain_length));
3589
0
  size_t memmove_start = old_ri - new_ri;
3590
0
  buf->meta.pos = wuffs_base__u64__sat_add(buf->meta.pos, memmove_start);
3591
0
  size_t new_wi = buf->meta.wi - memmove_start;
3592
0
  if ((new_wi != 0) && (memmove_start != 0)) {
3593
0
    memmove(buf->data.ptr, buf->data.ptr + memmove_start, new_wi);
3594
0
  }
3595
0
  buf->meta.wi = new_wi;
3596
0
  buf->meta.ri = new_ri;
3597
0
  return memmove_start;
3598
0
}
3599
3600
static inline size_t  //
3601
0
wuffs_base__io_buffer__reader_length(const wuffs_base__io_buffer* buf) {
3602
0
  return buf ? buf->meta.wi - buf->meta.ri : 0;
3603
0
}
3604
3605
static inline uint8_t*  //
3606
0
wuffs_base__io_buffer__reader_pointer(const wuffs_base__io_buffer* buf) {
3607
0
  return (buf && buf->data.ptr) ? (buf->data.ptr + buf->meta.ri) : NULL;
3608
0
}
3609
3610
static inline uint64_t  //
3611
0
wuffs_base__io_buffer__reader_position(const wuffs_base__io_buffer* buf) {
3612
0
  return buf ? wuffs_base__u64__sat_add(buf->meta.pos, buf->meta.ri) : 0;
3613
0
}
3614
3615
static inline wuffs_base__slice_u8  //
3616
0
wuffs_base__io_buffer__reader_slice(const wuffs_base__io_buffer* buf) {
3617
0
  return (buf && buf->data.ptr)
3618
0
             ? wuffs_base__make_slice_u8(buf->data.ptr + buf->meta.ri,
3619
0
                                         buf->meta.wi - buf->meta.ri)
3620
0
             : wuffs_base__empty_slice_u8();
3621
0
}
3622
3623
static inline size_t  //
3624
0
wuffs_base__io_buffer__writer_length(const wuffs_base__io_buffer* buf) {
3625
0
  return buf ? buf->data.len - buf->meta.wi : 0;
3626
0
}
3627
3628
static inline uint8_t*  //
3629
0
wuffs_base__io_buffer__writer_pointer(const wuffs_base__io_buffer* buf) {
3630
0
  return (buf && buf->data.ptr) ? (buf->data.ptr + buf->meta.wi) : NULL;
3631
0
}
3632
3633
static inline uint64_t  //
3634
0
wuffs_base__io_buffer__writer_position(const wuffs_base__io_buffer* buf) {
3635
0
  return buf ? wuffs_base__u64__sat_add(buf->meta.pos, buf->meta.wi) : 0;
3636
0
}
3637
3638
static inline wuffs_base__slice_u8  //
3639
0
wuffs_base__io_buffer__writer_slice(const wuffs_base__io_buffer* buf) {
3640
0
  return (buf && buf->data.ptr)
3641
0
             ? wuffs_base__make_slice_u8(buf->data.ptr + buf->meta.wi,
3642
0
                                         buf->data.len - buf->meta.wi)
3643
0
             : wuffs_base__empty_slice_u8();
3644
0
}
3645
3646
#ifdef __cplusplus
3647
3648
inline bool  //
3649
wuffs_base__io_buffer::is_valid() const {
3650
  return wuffs_base__io_buffer__is_valid(this);
3651
}
3652
3653
inline size_t  //
3654
wuffs_base__io_buffer::compact() {
3655
  return wuffs_base__io_buffer__compact(this);
3656
}
3657
3658
inline size_t  //
3659
wuffs_base__io_buffer::compact_retaining(uint64_t history_retain_length) {
3660
  return wuffs_base__io_buffer__compact_retaining(this, history_retain_length);
3661
}
3662
3663
inline size_t  //
3664
wuffs_base__io_buffer::reader_length() const {
3665
  return wuffs_base__io_buffer__reader_length(this);
3666
}
3667
3668
inline uint8_t*  //
3669
wuffs_base__io_buffer::reader_pointer() const {
3670
  return wuffs_base__io_buffer__reader_pointer(this);
3671
}
3672
3673
inline uint64_t  //
3674
wuffs_base__io_buffer::reader_position() const {
3675
  return wuffs_base__io_buffer__reader_position(this);
3676
}
3677
3678
inline wuffs_base__slice_u8  //
3679
wuffs_base__io_buffer::reader_slice() const {
3680
  return wuffs_base__io_buffer__reader_slice(this);
3681
}
3682
3683
inline size_t  //
3684
wuffs_base__io_buffer::writer_length() const {
3685
  return wuffs_base__io_buffer__writer_length(this);
3686
}
3687
3688
inline uint8_t*  //
3689
wuffs_base__io_buffer::writer_pointer() const {
3690
  return wuffs_base__io_buffer__writer_pointer(this);
3691
}
3692
3693
inline uint64_t  //
3694
wuffs_base__io_buffer::writer_position() const {
3695
  return wuffs_base__io_buffer__writer_position(this);
3696
}
3697
3698
inline wuffs_base__slice_u8  //
3699
wuffs_base__io_buffer::writer_slice() const {
3700
  return wuffs_base__io_buffer__writer_slice(this);
3701
}
3702
3703
#endif  // __cplusplus
3704
3705
// ---------------- Tokens
3706
3707
// wuffs_base__token is an element of a byte stream's tokenization.
3708
//
3709
// See https://github.com/google/wuffs/blob/main/doc/note/tokens.md
3710
typedef struct wuffs_base__token__struct {
3711
  uint64_t repr;
3712
3713
#ifdef __cplusplus
3714
  inline int64_t value() const;
3715
  inline int64_t value_extension() const;
3716
  inline int64_t value_major() const;
3717
  inline int64_t value_base_category() const;
3718
  inline uint64_t value_minor() const;
3719
  inline uint64_t value_base_detail() const;
3720
  inline int64_t value_base_detail__sign_extended() const;
3721
  inline bool continued() const;
3722
  inline uint64_t length() const;
3723
#endif  // __cplusplus
3724
3725
} wuffs_base__token;
3726
3727
static inline wuffs_base__token  //
3728
0
wuffs_base__make_token(uint64_t repr) {
3729
0
  wuffs_base__token ret;
3730
0
  ret.repr = repr;
3731
0
  return ret;
3732
0
}
3733
3734
// --------
3735
3736
// clang-format off
3737
3738
// --------
3739
3740
#define WUFFS_BASE__TOKEN__LENGTH__MAX_INCL 0xFFFF
3741
3742
#define WUFFS_BASE__TOKEN__VALUE__SHIFT               17
3743
#define WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT     17
3744
#define WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT         42
3745
#define WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT         17
3746
#define WUFFS_BASE__TOKEN__VALUE_BASE_CATEGORY__SHIFT 38
3747
#define WUFFS_BASE__TOKEN__VALUE_BASE_DETAIL__SHIFT   17
3748
#define WUFFS_BASE__TOKEN__CONTINUED__SHIFT           16
3749
#define WUFFS_BASE__TOKEN__LENGTH__SHIFT               0
3750
3751
#define WUFFS_BASE__TOKEN__VALUE_EXTENSION__NUM_BITS  46
3752
3753
// --------
3754
3755
#define WUFFS_BASE__TOKEN__VBC__FILLER                  0
3756
#define WUFFS_BASE__TOKEN__VBC__STRUCTURE               1
3757
#define WUFFS_BASE__TOKEN__VBC__STRING                  2
3758
#define WUFFS_BASE__TOKEN__VBC__UNICODE_CODE_POINT      3
3759
#define WUFFS_BASE__TOKEN__VBC__LITERAL                 4
3760
#define WUFFS_BASE__TOKEN__VBC__NUMBER                  5
3761
#define WUFFS_BASE__TOKEN__VBC__INLINE_INTEGER_SIGNED   6
3762
#define WUFFS_BASE__TOKEN__VBC__INLINE_INTEGER_UNSIGNED 7
3763
3764
// --------
3765
3766
#define WUFFS_BASE__TOKEN__VBD__FILLER__PUNCTUATION   0x00001
3767
#define WUFFS_BASE__TOKEN__VBD__FILLER__COMMENT_BLOCK 0x00002
3768
#define WUFFS_BASE__TOKEN__VBD__FILLER__COMMENT_LINE  0x00004
3769
3770
// COMMENT_ANY is a bit-wise or of COMMENT_BLOCK AND COMMENT_LINE.
3771
#define WUFFS_BASE__TOKEN__VBD__FILLER__COMMENT_ANY   0x00006
3772
3773
// --------
3774
3775
#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__PUSH      0x00001
3776
#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__POP       0x00002
3777
#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_NONE 0x00010
3778
#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_LIST 0x00020
3779
#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_DICT 0x00040
3780
#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_NONE   0x01000
3781
#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_LIST   0x02000
3782
#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_DICT   0x04000
3783
3784
// --------
3785
3786
// DEFINITELY_FOO means that the destination bytes (and also the source bytes,
3787
// for 1_DST_1_SRC_COPY) are in the FOO format. Definitely means that the lack
3788
// of the bit means "maybe FOO". It does not necessarily mean "not FOO".
3789
//
3790
// CHAIN_ETC means that decoding the entire token chain forms a UTF-8 or ASCII
3791
// string, not just this current token. CHAIN_ETC_UTF_8 therefore distinguishes
3792
// Unicode (UTF-8) strings from byte strings. MUST means that the the token
3793
// producer (e.g. parser) must verify this. SHOULD means that the token
3794
// consumer (e.g. renderer) should verify this.
3795
//
3796
// When a CHAIN_ETC_UTF_8 bit is set, the parser must ensure that non-ASCII
3797
// code points (with multi-byte UTF-8 encodings) do not straddle token
3798
// boundaries. Checking UTF-8 validity can inspect each token separately.
3799
//
3800
// The lack of any particular bit is conservative: it is valid for all-ASCII
3801
// strings, in a single- or multi-token chain, to have none of these bits set.
3802
#define WUFFS_BASE__TOKEN__VBD__STRING__DEFINITELY_UTF_8      0x00001
3803
#define WUFFS_BASE__TOKEN__VBD__STRING__CHAIN_MUST_BE_UTF_8   0x00002
3804
#define WUFFS_BASE__TOKEN__VBD__STRING__CHAIN_SHOULD_BE_UTF_8 0x00004
3805
#define WUFFS_BASE__TOKEN__VBD__STRING__DEFINITELY_ASCII      0x00010
3806
#define WUFFS_BASE__TOKEN__VBD__STRING__CHAIN_MUST_BE_ASCII   0x00020
3807
#define WUFFS_BASE__TOKEN__VBD__STRING__CHAIN_SHOULD_BE_ASCII 0x00040
3808
3809
// CONVERT_D_DST_S_SRC means that multiples of S source bytes (possibly padded)
3810
// produces multiples of D destination bytes. For example,
3811
// CONVERT_1_DST_4_SRC_BACKSLASH_X means a source like "\\x23\\x67\\xAB", where
3812
// 12 src bytes encode 3 dst bytes.
3813
//
3814
// Post-processing may further transform those D destination bytes (e.g. treat
3815
// "\\xFF" as the Unicode code point U+00FF instead of the byte 0xFF), but that
3816
// is out of scope of this VBD's semantics.
3817
//
3818
// When src is the empty string, multiple conversion algorithms are applicable
3819
// (so these bits are not necessarily mutually exclusive), all producing the
3820
// same empty dst string.
3821
#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_0_DST_1_SRC_DROP        0x00100
3822
#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_1_DST_1_SRC_COPY        0x00200
3823
#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_1_DST_2_SRC_HEXADECIMAL 0x00400
3824
#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_1_DST_4_SRC_BACKSLASH_X 0x00800
3825
#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_3_DST_4_SRC_BASE_64_STD 0x01000
3826
#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_3_DST_4_SRC_BASE_64_URL 0x02000
3827
#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_4_DST_5_SRC_ASCII_85    0x04000
3828
#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_5_DST_8_SRC_BASE_32_HEX 0x08000
3829
#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_5_DST_8_SRC_BASE_32_STD 0x10000
3830
3831
// --------
3832
3833
#define WUFFS_BASE__TOKEN__VBD__LITERAL__UNDEFINED 0x00001
3834
#define WUFFS_BASE__TOKEN__VBD__LITERAL__NULL      0x00002
3835
#define WUFFS_BASE__TOKEN__VBD__LITERAL__FALSE     0x00004
3836
#define WUFFS_BASE__TOKEN__VBD__LITERAL__TRUE      0x00008
3837
3838
// --------
3839
3840
// For a source string of "123" or "0x9A", it is valid for a tokenizer to
3841
// return any combination of:
3842
//  - WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_FLOATING_POINT.
3843
//  - WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_INTEGER_SIGNED.
3844
//  - WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_INTEGER_UNSIGNED.
3845
//
3846
// For a source string of "+123" or "-0x9A", only the first two are valid.
3847
//
3848
// For a source string of "123.", only the first one is valid.
3849
#define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_FLOATING_POINT   0x00001
3850
#define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_INTEGER_SIGNED   0x00002
3851
#define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_INTEGER_UNSIGNED 0x00004
3852
3853
#define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_NEG_INF 0x00010
3854
#define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_POS_INF 0x00020
3855
#define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_NEG_NAN 0x00040
3856
#define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_POS_NAN 0x00080
3857
3858
// The number 300 might be represented as "\x01\x2C", "\x2C\x01\x00\x00" or
3859
// "300", which are big-endian, little-endian or text. For binary formats, the
3860
// token length (after adjusting for FORMAT_IGNORE_ETC) discriminates
3861
// e.g. u16 little-endian vs u32 little-endian.
3862
#define WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_BINARY_BIG_ENDIAN    0x00100
3863
#define WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_BINARY_LITTLE_ENDIAN 0x00200
3864
#define WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_TEXT                 0x00400
3865
3866
#define WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_IGNORE_FIRST_BYTE    0x01000
3867
3868
// --------
3869
3870
// clang-format on
3871
3872
// --------
3873
3874
// wuffs_base__token__value returns the token's high 46 bits, sign-extended. A
3875
// negative value means an extended token, non-negative means a simple token.
3876
static inline int64_t  //
3877
0
wuffs_base__token__value(const wuffs_base__token* t) {
3878
0
  return ((int64_t)(t->repr)) >> WUFFS_BASE__TOKEN__VALUE__SHIFT;
3879
0
}
3880
3881
// wuffs_base__token__value_extension returns a negative value if the token was
3882
// not an extended token.
3883
static inline int64_t  //
3884
0
wuffs_base__token__value_extension(const wuffs_base__token* t) {
3885
0
  return (~(int64_t)(t->repr)) >> WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT;
3886
0
}
3887
3888
// wuffs_base__token__value_major returns a negative value if the token was not
3889
// a simple token.
3890
static inline int64_t  //
3891
0
wuffs_base__token__value_major(const wuffs_base__token* t) {
3892
0
  return ((int64_t)(t->repr)) >> WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT;
3893
0
}
3894
3895
// wuffs_base__token__value_base_category returns a negative value if the token
3896
// was not a simple token.
3897
static inline int64_t  //
3898
0
wuffs_base__token__value_base_category(const wuffs_base__token* t) {
3899
0
  return ((int64_t)(t->repr)) >> WUFFS_BASE__TOKEN__VALUE_BASE_CATEGORY__SHIFT;
3900
0
}
3901
3902
static inline uint64_t  //
3903
0
wuffs_base__token__value_minor(const wuffs_base__token* t) {
3904
0
  return (t->repr >> WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) & 0x1FFFFFF;
3905
0
}
3906
3907
static inline uint64_t  //
3908
0
wuffs_base__token__value_base_detail(const wuffs_base__token* t) {
3909
0
  return (t->repr >> WUFFS_BASE__TOKEN__VALUE_BASE_DETAIL__SHIFT) & 0x1FFFFF;
3910
0
}
3911
3912
static inline int64_t  //
3913
wuffs_base__token__value_base_detail__sign_extended(
3914
0
    const wuffs_base__token* t) {
3915
0
  // The VBD is 21 bits in the middle of t->repr. Left shift the high (64 - 21
3916
0
  // - ETC__SHIFT) bits off, then right shift (sign-extending) back down.
3917
0
  uint64_t u = t->repr << (43 - WUFFS_BASE__TOKEN__VALUE_BASE_DETAIL__SHIFT);
3918
0
  return ((int64_t)u) >> 43;
3919
0
}
3920
3921
static inline bool  //
3922
0
wuffs_base__token__continued(const wuffs_base__token* t) {
3923
0
  return t->repr & 0x10000;
3924
0
}
3925
3926
static inline uint64_t  //
3927
0
wuffs_base__token__length(const wuffs_base__token* t) {
3928
0
  return (t->repr >> WUFFS_BASE__TOKEN__LENGTH__SHIFT) & 0xFFFF;
3929
0
}
3930
3931
#ifdef __cplusplus
3932
3933
inline int64_t  //
3934
wuffs_base__token::value() const {
3935
  return wuffs_base__token__value(this);
3936
}
3937
3938
inline int64_t  //
3939
wuffs_base__token::value_extension() const {
3940
  return wuffs_base__token__value_extension(this);
3941
}
3942
3943
inline int64_t  //
3944
wuffs_base__token::value_major() const {
3945
  return wuffs_base__token__value_major(this);
3946
}
3947
3948
inline int64_t  //
3949
wuffs_base__token::value_base_category() const {
3950
  return wuffs_base__token__value_base_category(this);
3951
}
3952
3953
inline uint64_t  //
3954
wuffs_base__token::value_minor() const {
3955
  return wuffs_base__token__value_minor(this);
3956
}
3957
3958
inline uint64_t  //
3959
wuffs_base__token::value_base_detail() const {
3960
  return wuffs_base__token__value_base_detail(this);
3961
}
3962
3963
inline int64_t  //
3964
wuffs_base__token::value_base_detail__sign_extended() const {
3965
  return wuffs_base__token__value_base_detail__sign_extended(this);
3966
}
3967
3968
inline bool  //
3969
wuffs_base__token::continued() const {
3970
  return wuffs_base__token__continued(this);
3971
}
3972
3973
inline uint64_t  //
3974
wuffs_base__token::length() const {
3975
  return wuffs_base__token__length(this);
3976
}
3977
3978
#endif  // __cplusplus
3979
3980
// --------
3981
3982
#if defined(__GNUC__)
3983
#pragma GCC diagnostic push
3984
#pragma GCC diagnostic ignored "-Wcast-qual"
3985
#endif
3986
3987
static inline wuffs_base__token*  //
3988
0
wuffs_base__strip_const_from_token_ptr(const wuffs_base__token* ptr) {
3989
0
  return (wuffs_base__token*)ptr;
3990
0
}
3991
3992
#if defined(__GNUC__)
3993
#pragma GCC diagnostic pop
3994
#endif
3995
3996
// --------
3997
3998
typedef WUFFS_BASE__SLICE(wuffs_base__token) wuffs_base__slice_token;
3999
4000
static inline wuffs_base__slice_token  //
4001
0
wuffs_base__make_slice_token(wuffs_base__token* ptr, size_t len) {
4002
0
  wuffs_base__slice_token ret;
4003
0
  ret.ptr = ptr;
4004
0
  ret.len = len;
4005
0
  return ret;
4006
0
}
4007
4008
static inline wuffs_base__slice_token  //
4009
0
wuffs_base__empty_slice_token(void) {
4010
0
  wuffs_base__slice_token ret;
4011
0
  ret.ptr = NULL;
4012
0
  ret.len = 0;
4013
0
  return ret;
4014
0
}
4015
4016
// --------
4017
4018
// wuffs_base__token_buffer_meta is the metadata for a
4019
// wuffs_base__token_buffer's data.
4020
typedef struct wuffs_base__token_buffer_meta__struct {
4021
  size_t wi;     // Write index. Invariant: wi <= len.
4022
  size_t ri;     // Read  index. Invariant: ri <= wi.
4023
  uint64_t pos;  // Position of the buffer start relative to the stream start.
4024
  bool closed;   // No further writes are expected.
4025
} wuffs_base__token_buffer_meta;
4026
4027
// wuffs_base__token_buffer is a 1-dimensional buffer (a pointer and length)
4028
// plus additional metadata.
4029
//
4030
// A value with all fields zero is a valid, empty buffer.
4031
typedef struct wuffs_base__token_buffer__struct {
4032
  wuffs_base__slice_token data;
4033
  wuffs_base__token_buffer_meta meta;
4034
4035
#ifdef __cplusplus
4036
  inline bool is_valid() const;
4037
  inline size_t compact();
4038
  inline size_t compact_retaining(uint64_t history_retain_length);
4039
  inline uint64_t reader_length() const;
4040
  inline wuffs_base__token* reader_pointer() const;
4041
  inline wuffs_base__slice_token reader_slice() const;
4042
  inline uint64_t reader_token_position() const;
4043
  inline uint64_t writer_length() const;
4044
  inline uint64_t writer_token_position() const;
4045
  inline wuffs_base__token* writer_pointer() const;
4046
  inline wuffs_base__slice_token writer_slice() const;
4047
#endif  // __cplusplus
4048
4049
} wuffs_base__token_buffer;
4050
4051
static inline wuffs_base__token_buffer  //
4052
wuffs_base__make_token_buffer(wuffs_base__slice_token data,
4053
0
                              wuffs_base__token_buffer_meta meta) {
4054
0
  wuffs_base__token_buffer ret;
4055
0
  ret.data = data;
4056
0
  ret.meta = meta;
4057
0
  return ret;
4058
0
}
4059
4060
static inline wuffs_base__token_buffer_meta  //
4061
wuffs_base__make_token_buffer_meta(size_t wi,
4062
                                   size_t ri,
4063
                                   uint64_t pos,
4064
0
                                   bool closed) {
4065
0
  wuffs_base__token_buffer_meta ret;
4066
0
  ret.wi = wi;
4067
0
  ret.ri = ri;
4068
0
  ret.pos = pos;
4069
0
  ret.closed = closed;
4070
0
  return ret;
4071
0
}
4072
4073
static inline wuffs_base__token_buffer  //
4074
0
wuffs_base__slice_token__reader(wuffs_base__slice_token s, bool closed) {
4075
0
  wuffs_base__token_buffer ret;
4076
0
  ret.data.ptr = s.ptr;
4077
0
  ret.data.len = s.len;
4078
0
  ret.meta.wi = s.len;
4079
0
  ret.meta.ri = 0;
4080
0
  ret.meta.pos = 0;
4081
0
  ret.meta.closed = closed;
4082
0
  return ret;
4083
0
}
4084
4085
static inline wuffs_base__token_buffer  //
4086
0
wuffs_base__slice_token__writer(wuffs_base__slice_token s) {
4087
0
  wuffs_base__token_buffer ret;
4088
0
  ret.data.ptr = s.ptr;
4089
0
  ret.data.len = s.len;
4090
0
  ret.meta.wi = 0;
4091
0
  ret.meta.ri = 0;
4092
0
  ret.meta.pos = 0;
4093
0
  ret.meta.closed = false;
4094
0
  return ret;
4095
0
}
4096
4097
static inline wuffs_base__token_buffer  //
4098
0
wuffs_base__empty_token_buffer(void) {
4099
0
  wuffs_base__token_buffer ret;
4100
0
  ret.data.ptr = NULL;
4101
0
  ret.data.len = 0;
4102
0
  ret.meta.wi = 0;
4103
0
  ret.meta.ri = 0;
4104
0
  ret.meta.pos = 0;
4105
0
  ret.meta.closed = false;
4106
0
  return ret;
4107
0
}
4108
4109
static inline wuffs_base__token_buffer_meta  //
4110
0
wuffs_base__empty_token_buffer_meta(void) {
4111
0
  wuffs_base__token_buffer_meta ret;
4112
0
  ret.wi = 0;
4113
0
  ret.ri = 0;
4114
0
  ret.pos = 0;
4115
0
  ret.closed = false;
4116
0
  return ret;
4117
0
}
4118
4119
static inline bool  //
4120
0
wuffs_base__token_buffer__is_valid(const wuffs_base__token_buffer* buf) {
4121
0
  if (buf) {
4122
0
    if (buf->data.ptr) {
4123
0
      return (buf->meta.ri <= buf->meta.wi) && (buf->meta.wi <= buf->data.len);
4124
0
    } else {
4125
0
      return (buf->meta.ri == 0) && (buf->meta.wi == 0) && (buf->data.len == 0);
4126
0
    }
4127
0
  }
4128
0
  return false;
4129
0
}
4130
4131
// wuffs_base__token_buffer__compact moves any written but unread tokens to the
4132
// start of the buffer.
4133
//
4134
// It returns the increase in the writer length: how much meta.wi fell by.
4135
static inline size_t  //
4136
0
wuffs_base__token_buffer__compact(wuffs_base__token_buffer* buf) {
4137
0
  if (!buf || (buf->meta.ri == 0)) {
4138
0
    return 0;
4139
0
  }
4140
0
  size_t old_ri = buf->meta.ri;
4141
0
  buf->meta.pos = wuffs_base__u64__sat_add(buf->meta.pos, buf->meta.ri);
4142
0
  size_t new_wi = buf->meta.wi - buf->meta.ri;
4143
0
  if (new_wi != 0) {
4144
0
    memmove(buf->data.ptr, buf->data.ptr + buf->meta.ri,
4145
0
            new_wi * sizeof(wuffs_base__token));
4146
0
  }
4147
0
  buf->meta.wi = new_wi;
4148
0
  buf->meta.ri = 0;
4149
0
  return old_ri;
4150
0
}
4151
4152
// wuffs_base__token_buffer__compact_retaining moves any written but unread
4153
// tokens closer to the start of the buffer. It retains H tokens of history
4154
// (the most recently read tokens), where H is min(buf->meta.ri,
4155
// history_retain_length). It is therefore a no-op if history_retain_length is
4156
// UINT64_MAX. A postcondition is that buf->meta.ri == H.
4157
//
4158
// It returns the increase in the writer length: how much meta.wi fell by.
4159
//
4160
// wuffs_base__token_buffer__compact_retaining(0) is equivalent to
4161
// wuffs_base__token_buffer__compact().
4162
//
4163
// For example, if buf started like this:
4164
//
4165
//        +--- ri = 3
4166
//        v
4167
//     abcdefgh??    len = 10, pos = 900
4168
//             ^
4169
//             +--- wi = 8
4170
//
4171
// Then, depending on history_retain_length, the resultant buf would be:
4172
//
4173
// HRL = 0     defgh?????    ri = 0    wi = 5    pos = 903    return = 3
4174
// HRL = 1     cdefgh????    ri = 1    wi = 6    pos = 902    return = 2
4175
// HRL = 2     bcdefgh???    ri = 2    wi = 7    pos = 901    return = 1
4176
// HRL = 3     abcdefgh??    ri = 3    wi = 8    pos = 900    return = 0
4177
// HRL = 4+    abcdefgh??    ri = 3    wi = 8    pos = 900    return = 0
4178
static inline size_t  //
4179
wuffs_base__token_buffer__compact_retaining(wuffs_base__token_buffer* buf,
4180
0
                                            uint64_t history_retain_length) {
4181
0
  if (!buf || (buf->meta.ri == 0)) {
4182
0
    return 0;
4183
0
  }
4184
0
  size_t old_ri = buf->meta.ri;
4185
0
  size_t new_ri = (size_t)(wuffs_base__u64__min(old_ri, history_retain_length));
4186
0
  size_t memmove_start = old_ri - new_ri;
4187
0
  buf->meta.pos = wuffs_base__u64__sat_add(buf->meta.pos, memmove_start);
4188
0
  size_t new_wi = buf->meta.wi - memmove_start;
4189
0
  if ((new_wi != 0) && (memmove_start != 0)) {
4190
0
    memmove(buf->data.ptr, buf->data.ptr + memmove_start,
4191
0
            new_wi * sizeof(wuffs_base__token));
4192
0
  }
4193
0
  buf->meta.wi = new_wi;
4194
0
  buf->meta.ri = new_ri;
4195
0
  return memmove_start;
4196
0
}
4197
4198
static inline uint64_t  //
4199
0
wuffs_base__token_buffer__reader_length(const wuffs_base__token_buffer* buf) {
4200
0
  return buf ? buf->meta.wi - buf->meta.ri : 0;
4201
0
}
4202
4203
static inline wuffs_base__token*  //
4204
0
wuffs_base__token_buffer__reader_pointer(const wuffs_base__token_buffer* buf) {
4205
0
  return buf ? (buf->data.ptr + buf->meta.ri) : NULL;
4206
0
}
4207
4208
static inline wuffs_base__slice_token  //
4209
0
wuffs_base__token_buffer__reader_slice(const wuffs_base__token_buffer* buf) {
4210
0
  return buf ? wuffs_base__make_slice_token(buf->data.ptr + buf->meta.ri,
4211
0
                                            buf->meta.wi - buf->meta.ri)
4212
0
             : wuffs_base__empty_slice_token();
4213
0
}
4214
4215
static inline uint64_t  //
4216
wuffs_base__token_buffer__reader_token_position(
4217
0
    const wuffs_base__token_buffer* buf) {
4218
0
  return buf ? wuffs_base__u64__sat_add(buf->meta.pos, buf->meta.ri) : 0;
4219
0
}
4220
4221
static inline uint64_t  //
4222
0
wuffs_base__token_buffer__writer_length(const wuffs_base__token_buffer* buf) {
4223
0
  return buf ? buf->data.len - buf->meta.wi : 0;
4224
0
}
4225
4226
static inline wuffs_base__token*  //
4227
0
wuffs_base__token_buffer__writer_pointer(const wuffs_base__token_buffer* buf) {
4228
0
  return buf ? (buf->data.ptr + buf->meta.wi) : NULL;
4229
0
}
4230
4231
static inline wuffs_base__slice_token  //
4232
0
wuffs_base__token_buffer__writer_slice(const wuffs_base__token_buffer* buf) {
4233
0
  return buf ? wuffs_base__make_slice_token(buf->data.ptr + buf->meta.wi,
4234
0
                                            buf->data.len - buf->meta.wi)
4235
0
             : wuffs_base__empty_slice_token();
4236
0
}
4237
4238
static inline uint64_t  //
4239
wuffs_base__token_buffer__writer_token_position(
4240
0
    const wuffs_base__token_buffer* buf) {
4241
0
  return buf ? wuffs_base__u64__sat_add(buf->meta.pos, buf->meta.wi) : 0;
4242
0
}
4243
4244
#ifdef __cplusplus
4245
4246
inline bool  //
4247
wuffs_base__token_buffer::is_valid() const {
4248
  return wuffs_base__token_buffer__is_valid(this);
4249
}
4250
4251
inline size_t  //
4252
wuffs_base__token_buffer::compact() {
4253
  return wuffs_base__token_buffer__compact(this);
4254
}
4255
4256
inline size_t  //
4257
wuffs_base__token_buffer::compact_retaining(uint64_t history_retain_length) {
4258
  return wuffs_base__token_buffer__compact_retaining(this,
4259
                                                     history_retain_length);
4260
}
4261
4262
inline uint64_t  //
4263
wuffs_base__token_buffer::reader_length() const {
4264
  return wuffs_base__token_buffer__reader_length(this);
4265
}
4266
4267
inline wuffs_base__token*  //
4268
wuffs_base__token_buffer::reader_pointer() const {
4269
  return wuffs_base__token_buffer__reader_pointer(this);
4270
}
4271
4272
inline wuffs_base__slice_token  //
4273
wuffs_base__token_buffer::reader_slice() const {
4274
  return wuffs_base__token_buffer__reader_slice(this);
4275
}
4276
4277
inline uint64_t  //
4278
wuffs_base__token_buffer::reader_token_position() const {
4279
  return wuffs_base__token_buffer__reader_token_position(this);
4280
}
4281
4282
inline uint64_t  //
4283
wuffs_base__token_buffer::writer_length() const {
4284
  return wuffs_base__token_buffer__writer_length(this);
4285
}
4286
4287
inline wuffs_base__token*  //
4288
wuffs_base__token_buffer::writer_pointer() const {
4289
  return wuffs_base__token_buffer__writer_pointer(this);
4290
}
4291
4292
inline wuffs_base__slice_token  //
4293
wuffs_base__token_buffer::writer_slice() const {
4294
  return wuffs_base__token_buffer__writer_slice(this);
4295
}
4296
4297
inline uint64_t  //
4298
wuffs_base__token_buffer::writer_token_position() const {
4299
  return wuffs_base__token_buffer__writer_token_position(this);
4300
}
4301
4302
#endif  // __cplusplus
4303
4304
// ---------------- Memory Allocation
4305
4306
// The memory allocation related functions in this section aren't used by Wuffs
4307
// per se, but they may be helpful to the code that uses Wuffs.
4308
4309
// wuffs_base__malloc_slice_uxx wraps calling a malloc-like function, except
4310
// that it takes a uint64_t number of elements instead of a size_t size in
4311
// bytes, and it returns a slice (a pointer and a length) instead of just a
4312
// pointer.
4313
//
4314
// You can pass the C stdlib's malloc as the malloc_func.
4315
//
4316
// It returns an empty slice (containing a NULL ptr field) if num_uxx is zero
4317
// or if (num_uxx * sizeof(uintxx_t)) would overflow SIZE_MAX.
4318
4319
static inline wuffs_base__slice_u8  //
4320
5.33k
wuffs_base__malloc_slice_u8(void* (*malloc_func)(size_t), uint64_t num_u8) {
4321
5.33k
  if (malloc_func && num_u8 && (num_u8 <= (SIZE_MAX / sizeof(uint8_t)))) {
4322
5.33k
    void* p = (*malloc_func)((size_t)(num_u8 * sizeof(uint8_t)));
4323
5.33k
    if (p) {
4324
5.33k
      return wuffs_base__make_slice_u8((uint8_t*)(p), (size_t)num_u8);
4325
5.33k
    }
4326
5.33k
  }
4327
0
  return wuffs_base__empty_slice_u8();
4328
5.33k
}
4329
4330
static inline wuffs_base__slice_u16  //
4331
0
wuffs_base__malloc_slice_u16(void* (*malloc_func)(size_t), uint64_t num_u16) {
4332
0
  if (malloc_func && num_u16 && (num_u16 <= (SIZE_MAX / sizeof(uint16_t)))) {
4333
0
    void* p = (*malloc_func)((size_t)(num_u16 * sizeof(uint16_t)));
4334
0
    if (p) {
4335
0
      return wuffs_base__make_slice_u16((uint16_t*)(p), (size_t)num_u16);
4336
0
    }
4337
0
  }
4338
0
  return wuffs_base__empty_slice_u16();
4339
0
}
4340
4341
static inline wuffs_base__slice_u32  //
4342
0
wuffs_base__malloc_slice_u32(void* (*malloc_func)(size_t), uint64_t num_u32) {
4343
0
  if (malloc_func && num_u32 && (num_u32 <= (SIZE_MAX / sizeof(uint32_t)))) {
4344
0
    void* p = (*malloc_func)((size_t)(num_u32 * sizeof(uint32_t)));
4345
0
    if (p) {
4346
0
      return wuffs_base__make_slice_u32((uint32_t*)(p), (size_t)num_u32);
4347
0
    }
4348
0
  }
4349
0
  return wuffs_base__empty_slice_u32();
4350
0
}
4351
4352
static inline wuffs_base__slice_u64  //
4353
0
wuffs_base__malloc_slice_u64(void* (*malloc_func)(size_t), uint64_t num_u64) {
4354
0
  if (malloc_func && num_u64 && (num_u64 <= (SIZE_MAX / sizeof(uint64_t)))) {
4355
0
    void* p = (*malloc_func)((size_t)(num_u64 * sizeof(uint64_t)));
4356
0
    if (p) {
4357
0
      return wuffs_base__make_slice_u64((uint64_t*)(p), (size_t)num_u64);
4358
0
    }
4359
0
  }
4360
0
  return wuffs_base__empty_slice_u64();
4361
0
}
4362
4363
// ---------------- Images
4364
4365
// WUFFS_BASE__IMAGE__DIMENSION_MAX_INCL is the largest width or height
4366
// (measured in pixels) supported by Wuffs' standard library's image codecs.
4367
//
4368
// Any non-negative integer N less than or equal to ((1 << 24) - 1) can be
4369
// losslessly converted to and from single-precision floating point (what C
4370
// calls the "float" type and what Go calls "float32").
4371
//
4372
// A Wuffs image can have up to 4 channels and up to 8 bytes per channel (8 is
4373
// also known as sizeof(double)), combining for up to 32 bytes per pixel. When
4374
// calculating memory requirements, the 0xFFFFFF upper bound also means that:
4375
//   - (32 * N)     will not overflow an int32_t or uint32_t.
4376
//   - (32 * N * N) will not overflow an int64_t or uint64_t, provided that N
4377
//     already has a 64-bit type.
4378
//
4379
// 0xFFFFFF in decimal is 16777215.
4380
#define WUFFS_BASE__IMAGE__DIMENSION_MAX_INCL 0xFFFFFF
4381
4382
// wuffs_base__color_u32_argb_premul is an 8 bit per channel premultiplied
4383
// Alpha, Red, Green, Blue color, as a uint32_t value. Its value is always
4384
// 0xAARRGGBB (Alpha most significant, Blue least), regardless of endianness.
4385
typedef uint32_t wuffs_base__color_u32_argb_premul;
4386
4387
// wuffs_base__color_u32_argb_premul__is_valid returns whether c's Red, Green
4388
// and Blue channels are all less than or equal to its Alpha channel. c uses
4389
// premultiplied alpha, so 50% opaque 100% saturated red is 0x7F7F_0000 and a
4390
// value like 0x7F80_0000 is invalid.
4391
static inline bool  //
4392
wuffs_base__color_u32_argb_premul__is_valid(
4393
0
    wuffs_base__color_u32_argb_premul c) {
4394
0
  uint32_t a = 0xFF & (c >> 24);
4395
0
  uint32_t r = 0xFF & (c >> 16);
4396
0
  uint32_t g = 0xFF & (c >> 8);
4397
0
  uint32_t b = 0xFF & (c >> 0);
4398
0
  return (a >= r) && (a >= g) && (a >= b);
4399
0
}
4400
4401
static inline uint16_t  //
4402
wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(
4403
0
    wuffs_base__color_u32_argb_premul c) {
4404
0
  uint32_t r5 = 0xF800 & (c >> 8);
4405
0
  uint32_t g6 = 0x07E0 & (c >> 5);
4406
0
  uint32_t b5 = 0x001F & (c >> 3);
4407
0
  return (uint16_t)(r5 | g6 | b5);
4408
0
}
4409
4410
static inline wuffs_base__color_u32_argb_premul  //
4411
0
wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul(uint16_t rgb_565) {
4412
0
  uint32_t b5 = 0x1F & (rgb_565 >> 0);
4413
0
  uint32_t b = (b5 << 3) | (b5 >> 2);
4414
0
  uint32_t g6 = 0x3F & (rgb_565 >> 5);
4415
0
  uint32_t g = (g6 << 2) | (g6 >> 4);
4416
0
  uint32_t r5 = 0x1F & (rgb_565 >> 11);
4417
0
  uint32_t r = (r5 << 3) | (r5 >> 2);
4418
0
  return 0xFF000000 | (r << 16) | (g << 8) | (b << 0);
4419
0
}
4420
4421
static inline uint8_t  //
4422
wuffs_base__color_u32_argb_premul__as__color_u8_gray(
4423
0
    wuffs_base__color_u32_argb_premul c) {
4424
  // Work in 16-bit color.
4425
0
  uint32_t cr = 0x101 * (0xFF & (c >> 16));
4426
0
  uint32_t cg = 0x101 * (0xFF & (c >> 8));
4427
0
  uint32_t cb = 0x101 * (0xFF & (c >> 0));
4428
4429
  // These coefficients (the fractions 0.299, 0.587 and 0.114) are the same
4430
  // as those given by the JFIF specification.
4431
  //
4432
  // Note that 19595 + 38470 + 7471 equals 65536, also known as (1 << 16). We
4433
  // shift by 24, not just by 16, because the return value is 8-bit color, not
4434
  // 16-bit color.
4435
0
  uint32_t weighted_average = (19595 * cr) + (38470 * cg) + (7471 * cb) + 32768;
4436
0
  return (uint8_t)(weighted_average >> 24);
4437
0
}
4438
4439
static inline uint16_t  //
4440
wuffs_base__color_u32_argb_premul__as__color_u16_alpha_gray_nonpremul(
4441
0
    wuffs_base__color_u32_argb_premul c) {
4442
0
  uint32_t a = 0xFF & (c >> 24);
4443
0
  if (a == 0) {
4444
0
    return 0;
4445
0
  }
4446
0
  uint32_t a16 = a * 0x101;
4447
4448
0
  uint32_t cr = 0xFF & (c >> 16);
4449
0
  cr = (cr * (0x101 * 0xFFFF)) / a16;
4450
0
  uint32_t cg = 0xFF & (c >> 8);
4451
0
  cg = (cg * (0x101 * 0xFFFF)) / a16;
4452
0
  uint32_t cb = 0xFF & (c >> 0);
4453
0
  cb = (cb * (0x101 * 0xFFFF)) / a16;
4454
4455
0
  uint32_t weighted_average = (19595 * cr) + (38470 * cg) + (7471 * cb) + 32768;
4456
0
  return (uint16_t)((a16 & 0xFF00) | (weighted_average >> 24));
4457
0
}
4458
4459
static inline uint16_t  //
4460
wuffs_base__color_u32_argb_premul__as__color_u16_gray(
4461
0
    wuffs_base__color_u32_argb_premul c) {
4462
  // Work in 16-bit color.
4463
0
  uint32_t cr = 0x101 * (0xFF & (c >> 16));
4464
0
  uint32_t cg = 0x101 * (0xFF & (c >> 8));
4465
0
  uint32_t cb = 0x101 * (0xFF & (c >> 0));
4466
4467
  // These coefficients (the fractions 0.299, 0.587 and 0.114) are the same
4468
  // as those given by the JFIF specification.
4469
  //
4470
  // Note that 19595 + 38470 + 7471 equals 65536, also known as (1 << 16).
4471
0
  uint32_t weighted_average = (19595 * cr) + (38470 * cg) + (7471 * cb) + 32768;
4472
0
  return (uint16_t)(weighted_average >> 16);
4473
0
}
4474
4475
// wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul converts
4476
// from non-premultiplied alpha to premultiplied alpha.
4477
static inline wuffs_base__color_u32_argb_premul  //
4478
wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(
4479
0
    uint32_t argb_nonpremul) {
4480
  // Multiplying by 0x101 (twice, once for alpha and once for color) converts
4481
  // from 8-bit to 16-bit color. Shifting right by 8 undoes that.
4482
  //
4483
  // Working in the higher bit depth can produce slightly different (and
4484
  // arguably slightly more accurate) results. For example, given 8-bit blue
4485
  // and alpha of 0x80 and 0x81:
4486
  //
4487
  //  - ((0x80   * 0x81  ) / 0xFF  )      = 0x40        = 0x40
4488
  //  - ((0x8080 * 0x8181) / 0xFFFF) >> 8 = 0x4101 >> 8 = 0x41
4489
0
  uint32_t a = 0xFF & (argb_nonpremul >> 24);
4490
0
  uint32_t a16 = a * (0x101 * 0x101);
4491
4492
0
  uint32_t r = 0xFF & (argb_nonpremul >> 16);
4493
0
  r = ((r * a16) / 0xFFFF) >> 8;
4494
0
  uint32_t g = 0xFF & (argb_nonpremul >> 8);
4495
0
  g = ((g * a16) / 0xFFFF) >> 8;
4496
0
  uint32_t b = 0xFF & (argb_nonpremul >> 0);
4497
0
  b = ((b * a16) / 0xFFFF) >> 8;
4498
4499
0
  return (a << 24) | (r << 16) | (g << 8) | (b << 0);
4500
0
}
4501
4502
// wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul converts
4503
// from premultiplied alpha to non-premultiplied alpha.
4504
static inline uint32_t  //
4505
wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul(
4506
0
    wuffs_base__color_u32_argb_premul c) {
4507
0
  uint32_t a = 0xFF & (c >> 24);
4508
0
  if (a == 0xFF) {
4509
0
    return c;
4510
0
  } else if (a == 0) {
4511
0
    return 0;
4512
0
  }
4513
0
  uint32_t a16 = a * 0x101;
4514
4515
0
  uint32_t r = 0xFF & (c >> 16);
4516
0
  r = ((r * (0x101 * 0xFFFF)) / a16) >> 8;
4517
0
  uint32_t g = 0xFF & (c >> 8);
4518
0
  g = ((g * (0x101 * 0xFFFF)) / a16) >> 8;
4519
0
  uint32_t b = 0xFF & (c >> 0);
4520
0
  b = ((b * (0x101 * 0xFFFF)) / a16) >> 8;
4521
4522
0
  return (a << 24) | (r << 16) | (g << 8) | (b << 0);
4523
0
}
4524
4525
// wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul converts
4526
// from 4x16LE non-premultiplied alpha to 4x8 premultiplied alpha.
4527
static inline wuffs_base__color_u32_argb_premul  //
4528
wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul(
4529
0
    uint64_t argb_nonpremul) {
4530
0
  uint32_t a16 = ((uint32_t)(0xFFFF & (argb_nonpremul >> 48)));
4531
4532
0
  uint32_t r16 = ((uint32_t)(0xFFFF & (argb_nonpremul >> 32)));
4533
0
  r16 = (r16 * a16) / 0xFFFF;
4534
0
  uint32_t g16 = ((uint32_t)(0xFFFF & (argb_nonpremul >> 16)));
4535
0
  g16 = (g16 * a16) / 0xFFFF;
4536
0
  uint32_t b16 = ((uint32_t)(0xFFFF & (argb_nonpremul >> 0)));
4537
0
  b16 = (b16 * a16) / 0xFFFF;
4538
4539
0
  return ((a16 >> 8) << 24) | ((r16 >> 8) << 16) | ((g16 >> 8) << 8) |
4540
0
         ((b16 >> 8) << 0);
4541
0
}
4542
4543
// wuffs_base__color_u32_argb_premul__as__color_u64_argb_nonpremul converts
4544
// from 4x8 premultiplied alpha to 4x16LE non-premultiplied alpha.
4545
static inline uint64_t  //
4546
wuffs_base__color_u32_argb_premul__as__color_u64_argb_nonpremul(
4547
0
    wuffs_base__color_u32_argb_premul c) {
4548
0
  uint32_t a = 0xFF & (c >> 24);
4549
0
  if (a == 0xFF) {
4550
0
    uint64_t r16 = 0x101 * (0xFF & (c >> 16));
4551
0
    uint64_t g16 = 0x101 * (0xFF & (c >> 8));
4552
0
    uint64_t b16 = 0x101 * (0xFF & (c >> 0));
4553
0
    return 0xFFFF000000000000u | (r16 << 32) | (g16 << 16) | (b16 << 0);
4554
0
  } else if (a == 0) {
4555
0
    return 0;
4556
0
  }
4557
0
  uint64_t a16 = a * 0x101;
4558
4559
0
  uint64_t r = 0xFF & (c >> 16);
4560
0
  uint64_t r16 = (r * (0x101 * 0xFFFF)) / a16;
4561
0
  uint64_t g = 0xFF & (c >> 8);
4562
0
  uint64_t g16 = (g * (0x101 * 0xFFFF)) / a16;
4563
0
  uint64_t b = 0xFF & (c >> 0);
4564
0
  uint64_t b16 = (b * (0x101 * 0xFFFF)) / a16;
4565
4566
0
  return (a16 << 48) | (r16 << 32) | (g16 << 16) | (b16 << 0);
4567
0
}
4568
4569
static inline uint8_t  //
4570
0
wuffs_base__color_u64_argb_premul__as__color_u8_gray(uint64_t argb_premul) {
4571
0
  uint32_t r16 = ((uint32_t)(0xFFFF & (argb_premul >> 32)));
4572
0
  uint32_t g16 = ((uint32_t)(0xFFFF & (argb_premul >> 16)));
4573
0
  uint32_t b16 = ((uint32_t)(0xFFFF & (argb_premul >> 0)));
4574
4575
  // These coefficients (the fractions 0.299, 0.587 and 0.114) are the same
4576
  // as those given by the JFIF specification.
4577
  //
4578
  // Note that 19595 + 38470 + 7471 equals 65536, also known as (1 << 16). We
4579
  // shift by 24, not just by 16, because the return value is 8-bit color, not
4580
  // 16-bit color.
4581
0
  uint32_t weighted_average =
4582
0
      (19595 * r16) + (38470 * g16) + (7471 * b16) + 32768;
4583
0
  return (uint8_t)(weighted_average >> 24);
4584
0
}
4585
4586
static inline uint64_t  //
4587
wuffs_base__color_u64_argb_premul__as__color_u64_argb_nonpremul(
4588
0
    uint64_t argb_premul) {
4589
0
  uint64_t a = 0xFFFF & (argb_premul >> 48);
4590
0
  if (a == 0xFFFF) {
4591
0
    return argb_premul;
4592
0
  } else if (a == 0) {
4593
0
    return 0;
4594
0
  }
4595
4596
0
  uint64_t r = 0xFFFF & (argb_premul >> 32);
4597
0
  r = (r * 0xFFFF) / a;
4598
0
  uint64_t g = 0xFFFF & (argb_premul >> 16);
4599
0
  g = (g * 0xFFFF) / a;
4600
0
  uint64_t b = 0xFFFF & (argb_premul >> 0);
4601
0
  b = (b * 0xFFFF) / a;
4602
4603
0
  return (a << 48) | (r << 32) | (g << 16) | (b << 0);
4604
0
}
4605
4606
static inline uint8_t  //
4607
wuffs_base__color_u64_argb_nonpremul__as__color_u8_gray(
4608
0
    uint64_t argb_nonpremul) {
4609
0
  uint32_t a16 = ((uint32_t)(0xFFFF & (argb_nonpremul >> 48)));
4610
4611
0
  uint32_t r16 = ((uint32_t)(0xFFFF & (argb_nonpremul >> 32)));
4612
0
  r16 = (r16 * a16) / 0xFFFF;
4613
0
  uint32_t g16 = ((uint32_t)(0xFFFF & (argb_nonpremul >> 16)));
4614
0
  g16 = (g16 * a16) / 0xFFFF;
4615
0
  uint32_t b16 = ((uint32_t)(0xFFFF & (argb_nonpremul >> 0)));
4616
0
  b16 = (b16 * a16) / 0xFFFF;
4617
4618
  // These coefficients (the fractions 0.299, 0.587 and 0.114) are the same
4619
  // as those given by the JFIF specification.
4620
  //
4621
  // Note that 19595 + 38470 + 7471 equals 65536, also known as (1 << 16). We
4622
  // shift by 24, not just by 16, because the return value is 8-bit color, not
4623
  // 16-bit color.
4624
0
  uint32_t weighted_average =
4625
0
      (19595 * r16) + (38470 * g16) + (7471 * b16) + 32768;
4626
0
  return (uint8_t)(weighted_average >> 24);
4627
0
}
4628
4629
static inline uint64_t  //
4630
0
wuffs_base__color_u32__as__color_u64(uint32_t c) {
4631
0
  uint64_t a16 = 0x101 * (0xFF & (c >> 24));
4632
0
  uint64_t r16 = 0x101 * (0xFF & (c >> 16));
4633
0
  uint64_t g16 = 0x101 * (0xFF & (c >> 8));
4634
0
  uint64_t b16 = 0x101 * (0xFF & (c >> 0));
4635
0
  return (a16 << 48) | (r16 << 32) | (g16 << 16) | (b16 << 0);
4636
0
}
4637
4638
static inline uint32_t  //
4639
0
wuffs_base__color_u64__as__color_u32(uint64_t c) {
4640
0
  uint32_t a = ((uint32_t)(0xFF & (c >> 56)));
4641
0
  uint32_t r = ((uint32_t)(0xFF & (c >> 40)));
4642
0
  uint32_t g = ((uint32_t)(0xFF & (c >> 24)));
4643
0
  uint32_t b = ((uint32_t)(0xFF & (c >> 8)));
4644
0
  return (a << 24) | (r << 16) | (g << 8) | (b << 0);
4645
0
}
4646
4647
// wuffs_base__color_ycc__as__color_u32 converts from YCbCr to 0xAARRGGBB. The
4648
// alpha bits are always 0xFF.
4649
static inline wuffs_base__color_u32_argb_premul  //
4650
151M
wuffs_base__color_ycc__as__color_u32(uint8_t yy, uint8_t cb, uint8_t cr) {
4651
  // Work in 16.16 fixed point arithmetic (so that 'one half' is (1 << 15)) and
4652
  // bias the chroma values by 0x80.
4653
151M
  uint32_t yy32 = (((uint32_t)yy) << 16) | (1 << 15);
4654
151M
  uint32_t cb32 = (((uint32_t)cb) - 0x80);
4655
151M
  uint32_t cr32 = (((uint32_t)cr) - 0x80);
4656
4657
  // The formulae:
4658
  //
4659
  //  R = Y                + 1.40200 * Cr
4660
  //  G = Y - 0.34414 * Cb - 0.71414 * Cr
4661
  //  B = Y + 1.77200 * Cb
4662
  //
4663
  // When scaled by 1<<16:
4664
  //
4665
  //  0.34414 becomes 0x0581A =  22554.
4666
  //  0.71414 becomes 0x0B6D2 =  46802.
4667
  //  1.40200 becomes 0x166E9 =  91881.
4668
  //  1.77200 becomes 0x1C5A2 = 116130.
4669
  //
4670
  // Since we're working in 16.16 fixed point arithmetic, masking by 0x00FF0000
4671
  // (possibly followed by a shift) gives the relevant 8 bits per channel.
4672
  //
4673
  // However, we need to saturate for overflow (above 0x00FFFFFF, but not so
4674
  // high that the MSB Most Significant Bit is set) or for underflow (below
4675
  // 0x00000000 as int32_t, which means that the MSB is set as uint32_t). In
4676
  // both cases, some of the high 8 bits (bits 24 ..= 31) will be set.
4677
  //
4678
  // "((uint32_t)(((int32_t)x) >> 31))" just replicates x's MSB across all 32
4679
  // bits. Prepending that with "~" inverts those bits. Thus, "~(etc)" is
4680
  // either 0xFFFFFFFF (for overflow) or 0x00000000 (for underflow).
4681
151M
  uint32_t rr32 = yy32 + (0x166E9 * cr32);
4682
151M
  uint32_t gg32 = yy32 - (0x0581A * cb32) - (0x0B6D2 * cr32);
4683
151M
  uint32_t bb32 = yy32 + (0x1C5A2 * cb32);
4684
151M
  if (rr32 >> 24) {
4685
481k
    rr32 = ~((uint32_t)(((int32_t)rr32) >> 31));
4686
481k
  }
4687
151M
  if (gg32 >> 24) {
4688
281k
    gg32 = ~((uint32_t)(((int32_t)gg32) >> 31));
4689
281k
  }
4690
151M
  if (bb32 >> 24) {
4691
1.62M
    bb32 = ~((uint32_t)(((int32_t)bb32) >> 31));
4692
1.62M
  }
4693
151M
  return 0xFF000000 |                  //
4694
151M
         ((0x00FF0000 & rr32) >> 0) |  //
4695
151M
         ((0x00FF0000 & gg32) >> 8) |  //
4696
151M
         ((0x00FF0000 & bb32) >> 16);
4697
151M
}
4698
4699
// wuffs_base__color_ycc__as__color_u32_abgr is like
4700
// wuffs_base__color_ycc__as__color_u32 but the uint32_t returned is in
4701
// 0xAABBGGRR order, not 0xAARRGGBB.
4702
static inline uint32_t  //
4703
0
wuffs_base__color_ycc__as__color_u32_abgr(uint8_t yy, uint8_t cb, uint8_t cr) {
4704
0
  uint32_t yy32 = (((uint32_t)yy) << 16) | (1 << 15);
4705
0
  uint32_t cb32 = (((uint32_t)cb) - 0x80);
4706
0
  uint32_t cr32 = (((uint32_t)cr) - 0x80);
4707
0
  uint32_t rr32 = yy32 + (0x166E9 * cr32);
4708
0
  uint32_t gg32 = yy32 - (0x0581A * cb32) - (0x0B6D2 * cr32);
4709
0
  uint32_t bb32 = yy32 + (0x1C5A2 * cb32);
4710
0
  if (rr32 >> 24) {
4711
0
    rr32 = ~((uint32_t)(((int32_t)rr32) >> 31));
4712
0
  }
4713
0
  if (gg32 >> 24) {
4714
0
    gg32 = ~((uint32_t)(((int32_t)gg32) >> 31));
4715
0
  }
4716
0
  if (bb32 >> 24) {
4717
0
    bb32 = ~((uint32_t)(((int32_t)bb32) >> 31));
4718
0
  }
4719
0
  return 0xFF000000 |                  //
4720
0
         ((0x00FF0000 & bb32) >> 0) |  //
4721
0
         ((0x00FF0000 & gg32) >> 8) |  //
4722
0
         ((0x00FF0000 & rr32) >> 16);
4723
0
}
4724
4725
// --------
4726
4727
typedef uint8_t wuffs_base__pixel_blend;
4728
4729
// wuffs_base__pixel_blend encodes how to blend source and destination pixels,
4730
// accounting for transparency. It encompasses the Porter-Duff compositing
4731
// operators as well as the other blending modes defined by PDF.
4732
//
4733
// TODO: implement the other modes.
4734
5.33k
#define WUFFS_BASE__PIXEL_BLEND__SRC ((wuffs_base__pixel_blend)0)
4735
0
#define WUFFS_BASE__PIXEL_BLEND__SRC_OVER ((wuffs_base__pixel_blend)1)
4736
4737
// --------
4738
4739
// wuffs_base__pixel_alpha_transparency is a pixel format's alpha channel
4740
// model. It is a property of the pixel format in general, not of a specific
4741
// pixel. An RGBA pixel format (with alpha) can still have fully opaque pixels.
4742
typedef uint32_t wuffs_base__pixel_alpha_transparency;
4743
4744
0
#define WUFFS_BASE__PIXEL_ALPHA_TRANSPARENCY__OPAQUE 0
4745
#define WUFFS_BASE__PIXEL_ALPHA_TRANSPARENCY__NONPREMULTIPLIED_ALPHA 1
4746
#define WUFFS_BASE__PIXEL_ALPHA_TRANSPARENCY__PREMULTIPLIED_ALPHA 2
4747
#define WUFFS_BASE__PIXEL_ALPHA_TRANSPARENCY__BINARY_ALPHA 3
4748
4749
// --------
4750
4751
// wuffs_base__pixel_coloration is whether a pixel format's color model has no
4752
// color (alpha only), gray color or rich (non-gray) color. Rich color includes
4753
// RGB, BGR, YCC, YCCK, CMY and CMYK.
4754
//
4755
// Coloration does not capture the alpha aspect of the color model. It does not
4756
// distinguish RGB from RGBA.
4757
typedef uint32_t wuffs_base__pixel_coloration;
4758
4759
#define WUFFS_BASE__PIXEL_COLORATION__NONE 0
4760
#define WUFFS_BASE__PIXEL_COLORATION__GRAY 1
4761
#define WUFFS_BASE__PIXEL_COLORATION__RICH 3
4762
4763
// --------
4764
4765
// Deprecated: use WUFFS_BASE__PIXEL_FORMAT__NUM_PLANES_MAX_INCL.
4766
#define WUFFS_BASE__PIXEL_FORMAT__NUM_PLANES_MAX 4
4767
4768
1.83k
#define WUFFS_BASE__PIXEL_FORMAT__NUM_PLANES_MAX_INCL 4
4769
4770
#define WUFFS_BASE__PIXEL_FORMAT__INDEXED__INDEX_PLANE 0
4771
0
#define WUFFS_BASE__PIXEL_FORMAT__INDEXED__COLOR_PLANE 3
4772
4773
// A palette is 256 entries ร— 4 bytes per entry (e.g. BGRA).
4774
0
#define WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH 1024
4775
4776
// wuffs_base__pixel_format encodes the format of the bytes that constitute an
4777
// image frame's pixel data.
4778
//
4779
// See https://github.com/google/wuffs/blob/main/doc/note/pixel-formats.md
4780
//
4781
// Do not manipulate its bits directly; they are private implementation
4782
// details. Use methods such as wuffs_base__pixel_format__num_planes instead.
4783
typedef struct wuffs_base__pixel_format__struct {
4784
  uint32_t repr;
4785
4786
#ifdef __cplusplus
4787
  inline bool is_valid() const;
4788
  inline uint32_t bits_per_pixel() const;
4789
  inline uint32_t default_background_color() const;
4790
  inline bool is_direct() const;
4791
  inline bool is_indexed() const;
4792
  inline bool is_interleaved() const;
4793
  inline bool is_planar() const;
4794
  inline uint32_t coloration() const;
4795
  inline uint32_t num_planes() const;
4796
  inline wuffs_base__pixel_alpha_transparency transparency() const;
4797
#endif  // __cplusplus
4798
4799
} wuffs_base__pixel_format;
4800
4801
static inline wuffs_base__pixel_format  //
4802
2.66k
wuffs_base__make_pixel_format(uint32_t repr) {
4803
2.66k
  wuffs_base__pixel_format f;
4804
2.66k
  f.repr = repr;
4805
2.66k
  return f;
4806
2.66k
}
4807
4808
// Common 8-bit-depth pixel formats. This list is not exhaustive; not all valid
4809
// wuffs_base__pixel_format values are present.
4810
4811
// clang-format off
4812
4813
0
#define WUFFS_BASE__PIXEL_FORMAT__INVALID                   0x00000000
4814
4815
#define WUFFS_BASE__PIXEL_FORMAT__A                         0x02000008
4816
4817
2.95k
#define WUFFS_BASE__PIXEL_FORMAT__Y                         0x20000008
4818
0
#define WUFFS_BASE__PIXEL_FORMAT__Y_16LE                    0x2000000B
4819
0
#define WUFFS_BASE__PIXEL_FORMAT__Y_16BE                    0x2010000B
4820
0
#define WUFFS_BASE__PIXEL_FORMAT__YA_NONPREMUL              0x21000088
4821
#define WUFFS_BASE__PIXEL_FORMAT__YA_PREMUL                 0x22000088
4822
#define WUFFS_BASE__PIXEL_FORMAT__YXXX                      0x30008888
4823
4824
#define WUFFS_BASE__PIXEL_FORMAT__YCBCR                     0x40020888
4825
#define WUFFS_BASE__PIXEL_FORMAT__YCBCRA_NONPREMUL          0x41038888
4826
#define WUFFS_BASE__PIXEL_FORMAT__YCBCRK                    0x50038888
4827
4828
#define WUFFS_BASE__PIXEL_FORMAT__YCOCG                     0x60020888
4829
#define WUFFS_BASE__PIXEL_FORMAT__YCOCGA_NONPREMUL          0x61038888
4830
#define WUFFS_BASE__PIXEL_FORMAT__YCOCGK                    0x70038888
4831
4832
0
#define WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL   0x81040008
4833
0
#define WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL      0x82040008
4834
0
#define WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY      0x83040008
4835
4836
0
#define WUFFS_BASE__PIXEL_FORMAT__BGR_565                   0x80000565
4837
0
#define WUFFS_BASE__PIXEL_FORMAT__BGR                       0x80000888
4838
0
#define WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL            0x81008888
4839
0
#define WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE     0x8100BBBB
4840
502M
#define WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL               0x82008888
4841
0
#define WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE        0x8200BBBB
4842
1.29k
#define WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY               0x83008888
4843
910M
#define WUFFS_BASE__PIXEL_FORMAT__BGRX                      0x90008888
4844
4845
689
#define WUFFS_BASE__PIXEL_FORMAT__RGB                       0xA0000888
4846
1.63k
#define WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL            0xA1008888
4847
0
#define WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL_4X16LE     0xA100BBBB
4848
1.63k
#define WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL               0xA2008888
4849
0
#define WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL_4X16LE        0xA200BBBB
4850
946
#define WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY               0xA3008888
4851
1.63k
#define WUFFS_BASE__PIXEL_FORMAT__RGBX                      0xB0008888
4852
4853
#define WUFFS_BASE__PIXEL_FORMAT__CMY                       0xC0020888
4854
#define WUFFS_BASE__PIXEL_FORMAT__CMYK                      0xD0038888
4855
4856
// clang-format on
4857
4858
extern const uint32_t wuffs_private_impl__pixel_format__bits_per_channel[16];
4859
4860
static inline bool  //
4861
0
wuffs_base__pixel_format__is_valid(const wuffs_base__pixel_format* f) {
4862
0
  return f->repr != 0;
4863
0
}
4864
4865
// wuffs_base__pixel_format__bits_per_pixel returns the number of bits per
4866
// pixel for interleaved pixel formats, and returns 0 for planar pixel formats.
4867
static inline uint32_t  //
4868
12.5k
wuffs_base__pixel_format__bits_per_pixel(const wuffs_base__pixel_format* f) {
4869
12.5k
  if (((f->repr >> 16) & 0x03) != 0) {
4870
0
    return 0;
4871
0
  }
4872
12.5k
  return wuffs_private_impl__pixel_format__bits_per_channel[0x0F &
4873
12.5k
                                                            (f->repr >> 0)] +
4874
12.5k
         wuffs_private_impl__pixel_format__bits_per_channel[0x0F &
4875
12.5k
                                                            (f->repr >> 4)] +
4876
12.5k
         wuffs_private_impl__pixel_format__bits_per_channel[0x0F &
4877
12.5k
                                                            (f->repr >> 8)] +
4878
12.5k
         wuffs_private_impl__pixel_format__bits_per_channel[0x0F &
4879
12.5k
                                                            (f->repr >> 12)];
4880
12.5k
}
4881
4882
static inline uint32_t  //
4883
wuffs_base__pixel_format__default_background_color(
4884
0
    const wuffs_base__pixel_format* f) {
4885
0
  return ((f->repr & 0x03000000) == 0) ? 0xFF000000   // Opaque black.
4886
0
                                       : 0x00000000;  // Transparent black.
4887
0
}
4888
4889
static inline bool  //
4890
0
wuffs_base__pixel_format__is_direct(const wuffs_base__pixel_format* f) {
4891
0
  return ((f->repr >> 18) & 0x01) == 0;
4892
0
}
4893
4894
static inline bool  //
4895
14.4M
wuffs_base__pixel_format__is_indexed(const wuffs_base__pixel_format* f) {
4896
14.4M
  return ((f->repr >> 18) & 0x01) != 0;
4897
14.4M
}
4898
4899
static inline bool  //
4900
0
wuffs_base__pixel_format__is_interleaved(const wuffs_base__pixel_format* f) {
4901
0
  return ((f->repr >> 16) & 0x03) == 0;
4902
0
}
4903
4904
static inline bool  //
4905
910M
wuffs_base__pixel_format__is_planar(const wuffs_base__pixel_format* f) {
4906
910M
  return ((f->repr >> 16) & 0x03) != 0;
4907
910M
}
4908
4909
static inline uint32_t  //
4910
0
wuffs_base__pixel_format__coloration(const wuffs_base__pixel_format* f) {
4911
0
  uint32_t n = (f->repr) >> 29;
4912
0
  return (n <= 1) ? n : 3;
4913
0
}
4914
4915
static inline uint32_t  //
4916
0
wuffs_base__pixel_format__num_planes(const wuffs_base__pixel_format* f) {
4917
0
  return ((f->repr >> 16) & 0x03) + 1;
4918
0
}
4919
4920
static inline wuffs_base__pixel_alpha_transparency  //
4921
0
wuffs_base__pixel_format__transparency(const wuffs_base__pixel_format* f) {
4922
0
  return (wuffs_base__pixel_alpha_transparency)((f->repr >> 24) & 0x03);
4923
0
}
4924
4925
#ifdef __cplusplus
4926
4927
inline bool  //
4928
wuffs_base__pixel_format::is_valid() const {
4929
  return wuffs_base__pixel_format__is_valid(this);
4930
}
4931
4932
inline uint32_t  //
4933
wuffs_base__pixel_format::bits_per_pixel() const {
4934
  return wuffs_base__pixel_format__bits_per_pixel(this);
4935
}
4936
4937
inline uint32_t  //
4938
wuffs_base__pixel_format::default_background_color() const {
4939
  return wuffs_base__pixel_format__default_background_color(this);
4940
}
4941
4942
inline bool  //
4943
wuffs_base__pixel_format::is_direct() const {
4944
  return wuffs_base__pixel_format__is_direct(this);
4945
}
4946
4947
inline bool  //
4948
wuffs_base__pixel_format::is_indexed() const {
4949
  return wuffs_base__pixel_format__is_indexed(this);
4950
}
4951
4952
inline bool  //
4953
wuffs_base__pixel_format::is_interleaved() const {
4954
  return wuffs_base__pixel_format__is_interleaved(this);
4955
}
4956
4957
inline bool  //
4958
wuffs_base__pixel_format::is_planar() const {
4959
  return wuffs_base__pixel_format__is_planar(this);
4960
}
4961
4962
inline uint32_t  //
4963
wuffs_base__pixel_format::coloration() const {
4964
  return wuffs_base__pixel_format__coloration(this);
4965
}
4966
4967
inline uint32_t  //
4968
wuffs_base__pixel_format::num_planes() const {
4969
  return wuffs_base__pixel_format__num_planes(this);
4970
}
4971
4972
inline wuffs_base__pixel_alpha_transparency  //
4973
wuffs_base__pixel_format::transparency() const {
4974
  return wuffs_base__pixel_format__transparency(this);
4975
}
4976
4977
#endif  // __cplusplus
4978
4979
// --------
4980
4981
// wuffs_base__pixel_subsampling encodes whether sample values cover one pixel
4982
// or cover multiple pixels.
4983
//
4984
// See https://github.com/google/wuffs/blob/main/doc/note/pixel-subsampling.md
4985
//
4986
// Do not manipulate its bits directly; they are private implementation
4987
// details. Use methods such as wuffs_base__pixel_subsampling__bias_x instead.
4988
typedef struct wuffs_base__pixel_subsampling__struct {
4989
  uint32_t repr;
4990
4991
#ifdef __cplusplus
4992
  inline uint32_t bias_x(uint32_t plane) const;
4993
  inline uint32_t denominator_x(uint32_t plane) const;
4994
  inline uint32_t bias_y(uint32_t plane) const;
4995
  inline uint32_t denominator_y(uint32_t plane) const;
4996
#endif  // __cplusplus
4997
4998
} wuffs_base__pixel_subsampling;
4999
5000
static inline wuffs_base__pixel_subsampling  //
5001
0
wuffs_base__make_pixel_subsampling(uint32_t repr) {
5002
0
  wuffs_base__pixel_subsampling s;
5003
0
  s.repr = repr;
5004
0
  return s;
5005
0
}
5006
5007
1.30k
#define WUFFS_BASE__PIXEL_SUBSAMPLING__NONE 0x00000000
5008
5009
#define WUFFS_BASE__PIXEL_SUBSAMPLING__444 0x000000
5010
#define WUFFS_BASE__PIXEL_SUBSAMPLING__440 0x010100
5011
#define WUFFS_BASE__PIXEL_SUBSAMPLING__422 0x101000
5012
#define WUFFS_BASE__PIXEL_SUBSAMPLING__420 0x111100
5013
#define WUFFS_BASE__PIXEL_SUBSAMPLING__411 0x303000
5014
#define WUFFS_BASE__PIXEL_SUBSAMPLING__410 0x313100
5015
5016
static inline uint32_t  //
5017
wuffs_base__pixel_subsampling__bias_x(const wuffs_base__pixel_subsampling* s,
5018
0
                                      uint32_t plane) {
5019
0
  uint32_t shift = ((plane & 0x03) * 8) + 6;
5020
0
  return (s->repr >> shift) & 0x03;
5021
0
}
5022
5023
static inline uint32_t  //
5024
wuffs_base__pixel_subsampling__denominator_x(
5025
    const wuffs_base__pixel_subsampling* s,
5026
0
    uint32_t plane) {
5027
0
  uint32_t shift = ((plane & 0x03) * 8) + 4;
5028
0
  return ((s->repr >> shift) & 0x03) + 1;
5029
0
}
5030
5031
static inline uint32_t  //
5032
wuffs_base__pixel_subsampling__bias_y(const wuffs_base__pixel_subsampling* s,
5033
0
                                      uint32_t plane) {
5034
0
  uint32_t shift = ((plane & 0x03) * 8) + 2;
5035
0
  return (s->repr >> shift) & 0x03;
5036
0
}
5037
5038
static inline uint32_t  //
5039
wuffs_base__pixel_subsampling__denominator_y(
5040
    const wuffs_base__pixel_subsampling* s,
5041
0
    uint32_t plane) {
5042
0
  uint32_t shift = ((plane & 0x03) * 8) + 0;
5043
0
  return ((s->repr >> shift) & 0x03) + 1;
5044
0
}
5045
5046
#ifdef __cplusplus
5047
5048
inline uint32_t  //
5049
wuffs_base__pixel_subsampling::bias_x(uint32_t plane) const {
5050
  return wuffs_base__pixel_subsampling__bias_x(this, plane);
5051
}
5052
5053
inline uint32_t  //
5054
wuffs_base__pixel_subsampling::denominator_x(uint32_t plane) const {
5055
  return wuffs_base__pixel_subsampling__denominator_x(this, plane);
5056
}
5057
5058
inline uint32_t  //
5059
wuffs_base__pixel_subsampling::bias_y(uint32_t plane) const {
5060
  return wuffs_base__pixel_subsampling__bias_y(this, plane);
5061
}
5062
5063
inline uint32_t  //
5064
wuffs_base__pixel_subsampling::denominator_y(uint32_t plane) const {
5065
  return wuffs_base__pixel_subsampling__denominator_y(this, plane);
5066
}
5067
5068
#endif  // __cplusplus
5069
5070
// --------
5071
5072
typedef struct wuffs_base__pixel_config__struct {
5073
  // Do not access the private_impl's fields directly. There is no API/ABI
5074
  // compatibility or safety guarantee if you do so.
5075
  struct {
5076
    wuffs_base__pixel_format pixfmt;
5077
    wuffs_base__pixel_subsampling pixsub;
5078
    uint32_t width;
5079
    uint32_t height;
5080
  } private_impl;
5081
5082
#ifdef __cplusplus
5083
  inline void set(uint32_t pixfmt_repr,
5084
                  uint32_t pixsub_repr,
5085
                  uint32_t width,
5086
                  uint32_t height);
5087
  inline void invalidate();
5088
  inline bool is_valid() const;
5089
  inline wuffs_base__pixel_format pixel_format() const;
5090
  inline wuffs_base__pixel_subsampling pixel_subsampling() const;
5091
  inline wuffs_base__rect_ie_u32 bounds() const;
5092
  inline uint32_t width() const;
5093
  inline uint32_t height() const;
5094
  inline uint64_t pixbuf_len() const;
5095
#endif  // __cplusplus
5096
5097
} wuffs_base__pixel_config;
5098
5099
static inline wuffs_base__pixel_config  //
5100
0
wuffs_base__null_pixel_config(void) {
5101
0
  wuffs_base__pixel_config ret;
5102
0
  ret.private_impl.pixfmt.repr = 0;
5103
0
  ret.private_impl.pixsub.repr = 0;
5104
0
  ret.private_impl.width = 0;
5105
0
  ret.private_impl.height = 0;
5106
0
  return ret;
5107
0
}
5108
5109
// TODO: Should this function return bool? An error type?
5110
static inline void  //
5111
wuffs_base__pixel_config__set(wuffs_base__pixel_config* c,
5112
                              uint32_t pixfmt_repr,
5113
                              uint32_t pixsub_repr,
5114
                              uint32_t width,
5115
1.30k
                              uint32_t height) {
5116
1.30k
  if (!c) {
5117
0
    return;
5118
0
  }
5119
1.30k
  if (pixfmt_repr) {
5120
1.30k
    do {
5121
#if SIZE_MAX < 0xFFFFFFFFFFFFFFFFull
5122
      uint64_t wh = ((uint64_t)width) * ((uint64_t)height);
5123
      // TODO: handle things other than 1 byte per pixel.
5124
      if (wh > ((uint64_t)SIZE_MAX)) {
5125
        break;
5126
      }
5127
#endif
5128
1.30k
      c->private_impl.pixfmt.repr = pixfmt_repr;
5129
1.30k
      c->private_impl.pixsub.repr = pixsub_repr;
5130
1.30k
      c->private_impl.width = width;
5131
1.30k
      c->private_impl.height = height;
5132
1.30k
      return;
5133
1.30k
    } while (0);
5134
1.30k
  }
5135
5136
0
  c->private_impl.pixfmt.repr = 0;
5137
0
  c->private_impl.pixsub.repr = 0;
5138
0
  c->private_impl.width = 0;
5139
0
  c->private_impl.height = 0;
5140
0
}
5141
5142
static inline void  //
5143
0
wuffs_base__pixel_config__invalidate(wuffs_base__pixel_config* c) {
5144
0
  if (c) {
5145
0
    c->private_impl.pixfmt.repr = 0;
5146
0
    c->private_impl.pixsub.repr = 0;
5147
0
    c->private_impl.width = 0;
5148
0
    c->private_impl.height = 0;
5149
0
  }
5150
0
}
5151
5152
static inline bool  //
5153
2.68k
wuffs_base__pixel_config__is_valid(const wuffs_base__pixel_config* c) {
5154
2.68k
  return c && c->private_impl.pixfmt.repr;
5155
2.68k
}
5156
5157
static inline wuffs_base__pixel_format  //
5158
0
wuffs_base__pixel_config__pixel_format(const wuffs_base__pixel_config* c) {
5159
0
  return c ? c->private_impl.pixfmt : wuffs_base__make_pixel_format(0);
5160
0
}
5161
5162
static inline wuffs_base__pixel_subsampling  //
5163
0
wuffs_base__pixel_config__pixel_subsampling(const wuffs_base__pixel_config* c) {
5164
0
  return c ? c->private_impl.pixsub : wuffs_base__make_pixel_subsampling(0);
5165
0
}
5166
5167
static inline wuffs_base__rect_ie_u32  //
5168
0
wuffs_base__pixel_config__bounds(const wuffs_base__pixel_config* c) {
5169
0
  if (c) {
5170
0
    wuffs_base__rect_ie_u32 ret;
5171
0
    ret.min_incl_x = 0;
5172
0
    ret.min_incl_y = 0;
5173
0
    ret.max_excl_x = c->private_impl.width;
5174
0
    ret.max_excl_y = c->private_impl.height;
5175
0
    return ret;
5176
0
  }
5177
5178
0
  wuffs_base__rect_ie_u32 ret;
5179
0
  ret.min_incl_x = 0;
5180
0
  ret.min_incl_y = 0;
5181
0
  ret.max_excl_x = 0;
5182
0
  ret.max_excl_y = 0;
5183
0
  return ret;
5184
0
}
5185
5186
static inline uint32_t  //
5187
1.99k
wuffs_base__pixel_config__width(const wuffs_base__pixel_config* c) {
5188
1.99k
  return c ? c->private_impl.width : 0;
5189
1.99k
}
5190
5191
static inline uint32_t  //
5192
1.99k
wuffs_base__pixel_config__height(const wuffs_base__pixel_config* c) {
5193
1.99k
  return c ? c->private_impl.height : 0;
5194
1.99k
}
5195
5196
// TODO: this is the right API for planar (not interleaved) pixbufs? Should it
5197
// allow decoding into a color model different from the format's intrinsic one?
5198
// For example, decoding a JPEG image straight to RGBA instead of to YCbCr?
5199
static inline uint64_t  //
5200
2.67k
wuffs_base__pixel_config__pixbuf_len(const wuffs_base__pixel_config* c) {
5201
2.67k
  if (!c) {
5202
0
    return 0;
5203
0
  }
5204
2.67k
  if (wuffs_base__pixel_format__is_planar(&c->private_impl.pixfmt)) {
5205
    // TODO: support planar pixel formats, concious of pixel subsampling.
5206
0
    return 0;
5207
0
  }
5208
2.67k
  uint32_t bits_per_pixel =
5209
2.67k
      wuffs_base__pixel_format__bits_per_pixel(&c->private_impl.pixfmt);
5210
2.67k
  if ((bits_per_pixel == 0) || ((bits_per_pixel % 8) != 0)) {
5211
    // TODO: support fraction-of-byte pixels, e.g. 1 bit per pixel?
5212
0
    return 0;
5213
0
  }
5214
2.67k
  uint64_t bytes_per_pixel = bits_per_pixel / 8;
5215
5216
2.67k
  uint64_t n =
5217
2.67k
      ((uint64_t)c->private_impl.width) * ((uint64_t)c->private_impl.height);
5218
2.67k
  if (n > (UINT64_MAX / bytes_per_pixel)) {
5219
0
    return 0;
5220
0
  }
5221
2.67k
  n *= bytes_per_pixel;
5222
5223
2.67k
  if (wuffs_base__pixel_format__is_indexed(&c->private_impl.pixfmt)) {
5224
0
    if (n >
5225
0
        (UINT64_MAX - WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH)) {
5226
0
      return 0;
5227
0
    }
5228
0
    n += WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH;
5229
0
  }
5230
5231
2.67k
  return n;
5232
2.67k
}
5233
5234
#ifdef __cplusplus
5235
5236
inline void  //
5237
wuffs_base__pixel_config::set(uint32_t pixfmt_repr,
5238
                              uint32_t pixsub_repr,
5239
                              uint32_t width,
5240
                              uint32_t height) {
5241
  wuffs_base__pixel_config__set(this, pixfmt_repr, pixsub_repr, width, height);
5242
}
5243
5244
inline void  //
5245
wuffs_base__pixel_config::invalidate() {
5246
  wuffs_base__pixel_config__invalidate(this);
5247
}
5248
5249
inline bool  //
5250
wuffs_base__pixel_config::is_valid() const {
5251
  return wuffs_base__pixel_config__is_valid(this);
5252
}
5253
5254
inline wuffs_base__pixel_format  //
5255
wuffs_base__pixel_config::pixel_format() const {
5256
  return wuffs_base__pixel_config__pixel_format(this);
5257
}
5258
5259
inline wuffs_base__pixel_subsampling  //
5260
wuffs_base__pixel_config::pixel_subsampling() const {
5261
  return wuffs_base__pixel_config__pixel_subsampling(this);
5262
}
5263
5264
inline wuffs_base__rect_ie_u32  //
5265
wuffs_base__pixel_config::bounds() const {
5266
  return wuffs_base__pixel_config__bounds(this);
5267
}
5268
5269
inline uint32_t  //
5270
wuffs_base__pixel_config::width() const {
5271
  return wuffs_base__pixel_config__width(this);
5272
}
5273
5274
inline uint32_t  //
5275
wuffs_base__pixel_config::height() const {
5276
  return wuffs_base__pixel_config__height(this);
5277
}
5278
5279
inline uint64_t  //
5280
wuffs_base__pixel_config::pixbuf_len() const {
5281
  return wuffs_base__pixel_config__pixbuf_len(this);
5282
}
5283
5284
#endif  // __cplusplus
5285
5286
// --------
5287
5288
typedef struct wuffs_base__image_config__struct {
5289
  wuffs_base__pixel_config pixcfg;
5290
5291
  // Do not access the private_impl's fields directly. There is no API/ABI
5292
  // compatibility or safety guarantee if you do so.
5293
  struct {
5294
    uint64_t first_frame_io_position;
5295
    bool first_frame_is_opaque;
5296
  } private_impl;
5297
5298
#ifdef __cplusplus
5299
  inline void set(uint32_t pixfmt_repr,
5300
                  uint32_t pixsub_repr,
5301
                  uint32_t width,
5302
                  uint32_t height,
5303
                  uint64_t first_frame_io_position,
5304
                  bool first_frame_is_opaque);
5305
  inline void invalidate();
5306
  inline bool is_valid() const;
5307
  inline uint64_t first_frame_io_position() const;
5308
  inline bool first_frame_is_opaque() const;
5309
#endif  // __cplusplus
5310
5311
} wuffs_base__image_config;
5312
5313
static inline wuffs_base__image_config  //
5314
0
wuffs_base__null_image_config(void) {
5315
0
  wuffs_base__image_config ret;
5316
0
  ret.pixcfg = wuffs_base__null_pixel_config();
5317
0
  ret.private_impl.first_frame_io_position = 0;
5318
0
  ret.private_impl.first_frame_is_opaque = false;
5319
0
  return ret;
5320
0
}
5321
5322
// TODO: Should this function return bool? An error type?
5323
static inline void  //
5324
wuffs_base__image_config__set(wuffs_base__image_config* c,
5325
                              uint32_t pixfmt_repr,
5326
                              uint32_t pixsub_repr,
5327
                              uint32_t width,
5328
                              uint32_t height,
5329
                              uint64_t first_frame_io_position,
5330
2.68k
                              bool first_frame_is_opaque) {
5331
2.68k
  if (!c) {
5332
0
    return;
5333
0
  }
5334
2.68k
  if (pixfmt_repr) {
5335
2.68k
    c->pixcfg.private_impl.pixfmt.repr = pixfmt_repr;
5336
2.68k
    c->pixcfg.private_impl.pixsub.repr = pixsub_repr;
5337
2.68k
    c->pixcfg.private_impl.width = width;
5338
2.68k
    c->pixcfg.private_impl.height = height;
5339
2.68k
    c->private_impl.first_frame_io_position = first_frame_io_position;
5340
2.68k
    c->private_impl.first_frame_is_opaque = first_frame_is_opaque;
5341
2.68k
    return;
5342
2.68k
  }
5343
5344
0
  c->pixcfg.private_impl.pixfmt.repr = 0;
5345
0
  c->pixcfg.private_impl.pixsub.repr = 0;
5346
0
  c->pixcfg.private_impl.width = 0;
5347
0
  c->pixcfg.private_impl.height = 0;
5348
0
  c->private_impl.first_frame_io_position = 0;
5349
0
  c->private_impl.first_frame_is_opaque = 0;
5350
0
}
5351
5352
static inline void  //
5353
0
wuffs_base__image_config__invalidate(wuffs_base__image_config* c) {
5354
0
  if (c) {
5355
0
    c->pixcfg.private_impl.pixfmt.repr = 0;
5356
0
    c->pixcfg.private_impl.pixsub.repr = 0;
5357
0
    c->pixcfg.private_impl.width = 0;
5358
0
    c->pixcfg.private_impl.height = 0;
5359
0
    c->private_impl.first_frame_io_position = 0;
5360
0
    c->private_impl.first_frame_is_opaque = 0;
5361
0
  }
5362
0
}
5363
5364
static inline bool  //
5365
2.68k
wuffs_base__image_config__is_valid(const wuffs_base__image_config* c) {
5366
2.68k
  return c && wuffs_base__pixel_config__is_valid(&(c->pixcfg));
5367
2.68k
}
5368
5369
static inline uint64_t  //
5370
wuffs_base__image_config__first_frame_io_position(
5371
0
    const wuffs_base__image_config* c) {
5372
0
  return c ? c->private_impl.first_frame_io_position : 0;
5373
0
}
5374
5375
static inline bool  //
5376
wuffs_base__image_config__first_frame_is_opaque(
5377
0
    const wuffs_base__image_config* c) {
5378
0
  return c ? c->private_impl.first_frame_is_opaque : false;
5379
0
}
5380
5381
#ifdef __cplusplus
5382
5383
inline void  //
5384
wuffs_base__image_config::set(uint32_t pixfmt_repr,
5385
                              uint32_t pixsub_repr,
5386
                              uint32_t width,
5387
                              uint32_t height,
5388
                              uint64_t first_frame_io_position,
5389
                              bool first_frame_is_opaque) {
5390
  wuffs_base__image_config__set(this, pixfmt_repr, pixsub_repr, width, height,
5391
                                first_frame_io_position, first_frame_is_opaque);
5392
}
5393
5394
inline void  //
5395
wuffs_base__image_config::invalidate() {
5396
  wuffs_base__image_config__invalidate(this);
5397
}
5398
5399
inline bool  //
5400
wuffs_base__image_config::is_valid() const {
5401
  return wuffs_base__image_config__is_valid(this);
5402
}
5403
5404
inline uint64_t  //
5405
wuffs_base__image_config::first_frame_io_position() const {
5406
  return wuffs_base__image_config__first_frame_io_position(this);
5407
}
5408
5409
inline bool  //
5410
wuffs_base__image_config::first_frame_is_opaque() const {
5411
  return wuffs_base__image_config__first_frame_is_opaque(this);
5412
}
5413
5414
#endif  // __cplusplus
5415
5416
// --------
5417
5418
// wuffs_base__animation_disposal encodes, for an animated image, how to
5419
// dispose of a frame after displaying it:
5420
//  - None means to draw the next frame on top of this one.
5421
//  - Restore Background means to clear the frame's dirty rectangle to "the
5422
//    background color" (in practice, this means transparent black) before
5423
//    drawing the next frame.
5424
//  - Restore Previous means to undo the current frame, so that the next frame
5425
//    is drawn on top of the previous one.
5426
typedef uint8_t wuffs_base__animation_disposal;
5427
5428
#define WUFFS_BASE__ANIMATION_DISPOSAL__NONE ((wuffs_base__animation_disposal)0)
5429
#define WUFFS_BASE__ANIMATION_DISPOSAL__RESTORE_BACKGROUND \
5430
  ((wuffs_base__animation_disposal)1)
5431
#define WUFFS_BASE__ANIMATION_DISPOSAL__RESTORE_PREVIOUS \
5432
  ((wuffs_base__animation_disposal)2)
5433
5434
// --------
5435
5436
typedef struct wuffs_base__frame_config__struct {
5437
  // Do not access the private_impl's fields directly. There is no API/ABI
5438
  // compatibility or safety guarantee if you do so.
5439
  struct {
5440
    wuffs_base__rect_ie_u32 bounds;
5441
    wuffs_base__flicks duration;
5442
    uint64_t index;
5443
    uint64_t io_position;
5444
    wuffs_base__animation_disposal disposal;
5445
    bool opaque_within_bounds;
5446
    bool overwrite_instead_of_blend;
5447
    wuffs_base__color_u32_argb_premul background_color;
5448
  } private_impl;
5449
5450
#ifdef __cplusplus
5451
  inline void set(wuffs_base__rect_ie_u32 bounds,
5452
                  wuffs_base__flicks duration,
5453
                  uint64_t index,
5454
                  uint64_t io_position,
5455
                  wuffs_base__animation_disposal disposal,
5456
                  bool opaque_within_bounds,
5457
                  bool overwrite_instead_of_blend,
5458
                  wuffs_base__color_u32_argb_premul background_color);
5459
  inline wuffs_base__rect_ie_u32 bounds() const;
5460
  inline uint32_t width() const;
5461
  inline uint32_t height() const;
5462
  inline wuffs_base__flicks duration() const;
5463
  inline uint64_t index() const;
5464
  inline uint64_t io_position() const;
5465
  inline wuffs_base__animation_disposal disposal() const;
5466
  inline bool opaque_within_bounds() const;
5467
  inline bool overwrite_instead_of_blend() const;
5468
  inline wuffs_base__color_u32_argb_premul background_color() const;
5469
#endif  // __cplusplus
5470
5471
} wuffs_base__frame_config;
5472
5473
static inline wuffs_base__frame_config  //
5474
0
wuffs_base__null_frame_config(void) {
5475
0
  wuffs_base__frame_config ret;
5476
0
  ret.private_impl.bounds = wuffs_base__make_rect_ie_u32(0, 0, 0, 0);
5477
0
  ret.private_impl.duration = 0;
5478
0
  ret.private_impl.index = 0;
5479
0
  ret.private_impl.io_position = 0;
5480
0
  ret.private_impl.disposal = 0;
5481
0
  ret.private_impl.opaque_within_bounds = false;
5482
0
  ret.private_impl.overwrite_instead_of_blend = false;
5483
0
  return ret;
5484
0
}
5485
5486
static inline void  //
5487
wuffs_base__frame_config__set(
5488
    wuffs_base__frame_config* c,
5489
    wuffs_base__rect_ie_u32 bounds,
5490
    wuffs_base__flicks duration,
5491
    uint64_t index,
5492
    uint64_t io_position,
5493
    wuffs_base__animation_disposal disposal,
5494
    bool opaque_within_bounds,
5495
    bool overwrite_instead_of_blend,
5496
2.66k
    wuffs_base__color_u32_argb_premul background_color) {
5497
2.66k
  if (!c) {
5498
0
    return;
5499
0
  }
5500
5501
2.66k
  c->private_impl.bounds = bounds;
5502
2.66k
  c->private_impl.duration = duration;
5503
2.66k
  c->private_impl.index = index;
5504
2.66k
  c->private_impl.io_position = io_position;
5505
2.66k
  c->private_impl.disposal = disposal;
5506
2.66k
  c->private_impl.opaque_within_bounds = opaque_within_bounds;
5507
2.66k
  c->private_impl.overwrite_instead_of_blend = overwrite_instead_of_blend;
5508
2.66k
  c->private_impl.background_color = background_color;
5509
2.66k
}
5510
5511
static inline wuffs_base__rect_ie_u32  //
5512
2.66k
wuffs_base__frame_config__bounds(const wuffs_base__frame_config* c) {
5513
2.66k
  if (c) {
5514
2.66k
    return c->private_impl.bounds;
5515
2.66k
  }
5516
5517
0
  wuffs_base__rect_ie_u32 ret;
5518
0
  ret.min_incl_x = 0;
5519
0
  ret.min_incl_y = 0;
5520
0
  ret.max_excl_x = 0;
5521
0
  ret.max_excl_y = 0;
5522
0
  return ret;
5523
2.66k
}
5524
5525
static inline uint32_t  //
5526
0
wuffs_base__frame_config__width(const wuffs_base__frame_config* c) {
5527
0
  return c ? wuffs_base__rect_ie_u32__width(&c->private_impl.bounds) : 0;
5528
0
}
5529
5530
static inline uint32_t  //
5531
0
wuffs_base__frame_config__height(const wuffs_base__frame_config* c) {
5532
0
  return c ? wuffs_base__rect_ie_u32__height(&c->private_impl.bounds) : 0;
5533
0
}
5534
5535
// wuffs_base__frame_config__duration returns the amount of time to display
5536
// this frame. Zero means to display forever - a still (non-animated) image.
5537
static inline wuffs_base__flicks  //
5538
0
wuffs_base__frame_config__duration(const wuffs_base__frame_config* c) {
5539
0
  return c ? c->private_impl.duration : 0;
5540
0
}
5541
5542
// wuffs_base__frame_config__index returns the index of this frame. The first
5543
// frame in an image has index 0, the second frame has index 1, and so on.
5544
static inline uint64_t  //
5545
0
wuffs_base__frame_config__index(const wuffs_base__frame_config* c) {
5546
0
  return c ? c->private_impl.index : 0;
5547
0
}
5548
5549
// wuffs_base__frame_config__io_position returns the I/O stream position before
5550
// the frame config.
5551
static inline uint64_t  //
5552
0
wuffs_base__frame_config__io_position(const wuffs_base__frame_config* c) {
5553
0
  return c ? c->private_impl.io_position : 0;
5554
0
}
5555
5556
// wuffs_base__frame_config__disposal returns, for an animated image, how to
5557
// dispose of this frame after displaying it.
5558
static inline wuffs_base__animation_disposal  //
5559
0
wuffs_base__frame_config__disposal(const wuffs_base__frame_config* c) {
5560
0
  return c ? c->private_impl.disposal : 0;
5561
0
}
5562
5563
// wuffs_base__frame_config__opaque_within_bounds returns whether all pixels
5564
// within the frame's bounds are fully opaque. It makes no claim about pixels
5565
// outside the frame bounds but still inside the overall image. The two
5566
// bounding rectangles can differ for animated images.
5567
//
5568
// Its semantics are conservative. It is valid for a fully opaque frame to have
5569
// this value be false: a false negative.
5570
//
5571
// If true, drawing the frame with WUFFS_BASE__PIXEL_BLEND__SRC and
5572
// WUFFS_BASE__PIXEL_BLEND__SRC_OVER should be equivalent, in terms of
5573
// resultant pixels, but the former may be faster.
5574
static inline bool  //
5575
wuffs_base__frame_config__opaque_within_bounds(
5576
0
    const wuffs_base__frame_config* c) {
5577
0
  return c && c->private_impl.opaque_within_bounds;
5578
0
}
5579
5580
// wuffs_base__frame_config__overwrite_instead_of_blend returns, for an
5581
// animated image, whether to ignore the previous image state (within the frame
5582
// bounds) when drawing this incremental frame. Equivalently, whether to use
5583
// WUFFS_BASE__PIXEL_BLEND__SRC instead of WUFFS_BASE__PIXEL_BLEND__SRC_OVER.
5584
//
5585
// The WebP spec (https://developers.google.com/speed/webp/docs/riff_container)
5586
// calls this the "Blending method" bit. WebP's "Do not blend" corresponds to
5587
// Wuffs' "overwrite_instead_of_blend".
5588
static inline bool  //
5589
wuffs_base__frame_config__overwrite_instead_of_blend(
5590
0
    const wuffs_base__frame_config* c) {
5591
0
  return c && c->private_impl.overwrite_instead_of_blend;
5592
0
}
5593
5594
static inline wuffs_base__color_u32_argb_premul  //
5595
0
wuffs_base__frame_config__background_color(const wuffs_base__frame_config* c) {
5596
0
  return c ? c->private_impl.background_color : 0;
5597
0
}
5598
5599
#ifdef __cplusplus
5600
5601
inline void  //
5602
wuffs_base__frame_config::set(
5603
    wuffs_base__rect_ie_u32 bounds,
5604
    wuffs_base__flicks duration,
5605
    uint64_t index,
5606
    uint64_t io_position,
5607
    wuffs_base__animation_disposal disposal,
5608
    bool opaque_within_bounds,
5609
    bool overwrite_instead_of_blend,
5610
    wuffs_base__color_u32_argb_premul background_color) {
5611
  wuffs_base__frame_config__set(this, bounds, duration, index, io_position,
5612
                                disposal, opaque_within_bounds,
5613
                                overwrite_instead_of_blend, background_color);
5614
}
5615
5616
inline wuffs_base__rect_ie_u32  //
5617
wuffs_base__frame_config::bounds() const {
5618
  return wuffs_base__frame_config__bounds(this);
5619
}
5620
5621
inline uint32_t  //
5622
wuffs_base__frame_config::width() const {
5623
  return wuffs_base__frame_config__width(this);
5624
}
5625
5626
inline uint32_t  //
5627
wuffs_base__frame_config::height() const {
5628
  return wuffs_base__frame_config__height(this);
5629
}
5630
5631
inline wuffs_base__flicks  //
5632
wuffs_base__frame_config::duration() const {
5633
  return wuffs_base__frame_config__duration(this);
5634
}
5635
5636
inline uint64_t  //
5637
wuffs_base__frame_config::index() const {
5638
  return wuffs_base__frame_config__index(this);
5639
}
5640
5641
inline uint64_t  //
5642
wuffs_base__frame_config::io_position() const {
5643
  return wuffs_base__frame_config__io_position(this);
5644
}
5645
5646
inline wuffs_base__animation_disposal  //
5647
wuffs_base__frame_config::disposal() const {
5648
  return wuffs_base__frame_config__disposal(this);
5649
}
5650
5651
inline bool  //
5652
wuffs_base__frame_config::opaque_within_bounds() const {
5653
  return wuffs_base__frame_config__opaque_within_bounds(this);
5654
}
5655
5656
inline bool  //
5657
wuffs_base__frame_config::overwrite_instead_of_blend() const {
5658
  return wuffs_base__frame_config__overwrite_instead_of_blend(this);
5659
}
5660
5661
inline wuffs_base__color_u32_argb_premul  //
5662
wuffs_base__frame_config::background_color() const {
5663
  return wuffs_base__frame_config__background_color(this);
5664
}
5665
5666
#endif  // __cplusplus
5667
5668
// --------
5669
5670
typedef struct wuffs_base__pixel_buffer__struct {
5671
  wuffs_base__pixel_config pixcfg;
5672
5673
  // Do not access the private_impl's fields directly. There is no API/ABI
5674
  // compatibility or safety guarantee if you do so.
5675
  struct {
5676
    wuffs_base__table_u8 planes[WUFFS_BASE__PIXEL_FORMAT__NUM_PLANES_MAX_INCL];
5677
    // TODO: color spaces.
5678
  } private_impl;
5679
5680
#ifdef __cplusplus
5681
  inline wuffs_base__status set_interleaved(
5682
      const wuffs_base__pixel_config* pixcfg,
5683
      wuffs_base__table_u8 primary_memory,
5684
      wuffs_base__slice_u8 palette_memory);
5685
  inline wuffs_base__status set_from_slice(
5686
      const wuffs_base__pixel_config* pixcfg,
5687
      wuffs_base__slice_u8 pixbuf_memory);
5688
  inline wuffs_base__slice_u8 palette();
5689
  inline wuffs_base__slice_u8 palette_or_else(wuffs_base__slice_u8 fallback);
5690
  inline wuffs_base__pixel_format pixel_format() const;
5691
  inline wuffs_base__table_u8 plane(uint32_t p);
5692
  inline wuffs_base__color_u32_argb_premul color_u32_at(uint32_t x,
5693
                                                        uint32_t y) const;
5694
  inline wuffs_base__status set_color_u32_at(
5695
      uint32_t x,
5696
      uint32_t y,
5697
      wuffs_base__color_u32_argb_premul color);
5698
  inline wuffs_base__status set_color_u32_fill_rect(
5699
      wuffs_base__rect_ie_u32 rect,
5700
      wuffs_base__color_u32_argb_premul color);
5701
  inline bool is_opaque();
5702
#endif  // __cplusplus
5703
5704
} wuffs_base__pixel_buffer;
5705
5706
static inline wuffs_base__pixel_buffer  //
5707
0
wuffs_base__null_pixel_buffer(void) {
5708
0
  wuffs_base__pixel_buffer ret;
5709
0
  ret.pixcfg = wuffs_base__null_pixel_config();
5710
0
  ret.private_impl.planes[0] = wuffs_base__empty_table_u8();
5711
0
  ret.private_impl.planes[1] = wuffs_base__empty_table_u8();
5712
0
  ret.private_impl.planes[2] = wuffs_base__empty_table_u8();
5713
0
  ret.private_impl.planes[3] = wuffs_base__empty_table_u8();
5714
0
  return ret;
5715
0
}
5716
5717
static inline wuffs_base__status  //
5718
wuffs_base__pixel_buffer__set_interleaved(
5719
    wuffs_base__pixel_buffer* pb,
5720
    const wuffs_base__pixel_config* pixcfg,
5721
    wuffs_base__table_u8 primary_memory,
5722
0
    wuffs_base__slice_u8 palette_memory) {
5723
0
  if (!pb) {
5724
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
5725
0
  }
5726
0
  memset(pb, 0, sizeof(*pb));
5727
0
  if (!pixcfg ||
5728
0
      wuffs_base__pixel_format__is_planar(&pixcfg->private_impl.pixfmt)) {
5729
0
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
5730
0
  }
5731
0
  if (wuffs_base__pixel_format__is_indexed(&pixcfg->private_impl.pixfmt) &&
5732
0
      (palette_memory.len <
5733
0
       WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH)) {
5734
0
    return wuffs_base__make_status(
5735
0
        wuffs_base__error__bad_argument_length_too_short);
5736
0
  }
5737
0
  uint32_t bits_per_pixel =
5738
0
      wuffs_base__pixel_format__bits_per_pixel(&pixcfg->private_impl.pixfmt);
5739
0
  if ((bits_per_pixel == 0) || ((bits_per_pixel % 8) != 0)) {
5740
0
    // TODO: support fraction-of-byte pixels, e.g. 1 bit per pixel?
5741
0
    return wuffs_base__make_status(wuffs_base__error__unsupported_option);
5742
0
  }
5743
0
  uint64_t bytes_per_pixel = bits_per_pixel / 8;
5744
0
5745
0
  uint64_t width_in_bytes =
5746
0
      ((uint64_t)pixcfg->private_impl.width) * bytes_per_pixel;
5747
0
  if ((width_in_bytes > primary_memory.width) ||
5748
0
      (pixcfg->private_impl.height > primary_memory.height)) {
5749
0
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
5750
0
  }
5751
0
5752
0
  pb->pixcfg = *pixcfg;
5753
0
  pb->private_impl.planes[0] = primary_memory;
5754
0
  if (wuffs_base__pixel_format__is_indexed(&pixcfg->private_impl.pixfmt)) {
5755
0
    wuffs_base__table_u8* tab =
5756
0
        &pb->private_impl
5757
0
             .planes[WUFFS_BASE__PIXEL_FORMAT__INDEXED__COLOR_PLANE];
5758
0
    tab->ptr = palette_memory.ptr;
5759
0
    tab->width = WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH;
5760
0
    tab->height = 1;
5761
0
    tab->stride = WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH;
5762
0
  }
5763
0
  return wuffs_base__make_status(NULL);
5764
0
}
5765
5766
static inline wuffs_base__status  //
5767
wuffs_base__pixel_buffer__set_from_slice(wuffs_base__pixel_buffer* pb,
5768
                                         const wuffs_base__pixel_config* pixcfg,
5769
2.66k
                                         wuffs_base__slice_u8 pixbuf_memory) {
5770
2.66k
  if (!pb) {
5771
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
5772
0
  }
5773
2.66k
  memset(pb, 0, sizeof(*pb));
5774
2.66k
  if (!pixcfg) {
5775
0
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
5776
0
  }
5777
2.66k
  if (wuffs_base__pixel_format__is_planar(&pixcfg->private_impl.pixfmt)) {
5778
    // TODO: support planar pixel formats, concious of pixel subsampling.
5779
0
    return wuffs_base__make_status(wuffs_base__error__unsupported_option);
5780
0
  }
5781
2.66k
  uint32_t bits_per_pixel =
5782
2.66k
      wuffs_base__pixel_format__bits_per_pixel(&pixcfg->private_impl.pixfmt);
5783
2.66k
  if ((bits_per_pixel == 0) || ((bits_per_pixel % 8) != 0)) {
5784
    // TODO: support fraction-of-byte pixels, e.g. 1 bit per pixel?
5785
0
    return wuffs_base__make_status(wuffs_base__error__unsupported_option);
5786
0
  }
5787
2.66k
  uint64_t bytes_per_pixel = bits_per_pixel / 8;
5788
5789
2.66k
  uint8_t* ptr = pixbuf_memory.ptr;
5790
2.66k
  uint64_t len = pixbuf_memory.len;
5791
2.66k
  if (wuffs_base__pixel_format__is_indexed(&pixcfg->private_impl.pixfmt)) {
5792
    // Split a WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH byte
5793
    // chunk (1024 bytes = 256 palette entries ร— 4 bytes per entry) from the
5794
    // start of pixbuf_memory. We split from the start, not the end, so that
5795
    // the both chunks' pointers have the same alignment as the original
5796
    // pointer, up to an alignment of 1024.
5797
0
    if (len < WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
5798
0
      return wuffs_base__make_status(
5799
0
          wuffs_base__error__bad_argument_length_too_short);
5800
0
    }
5801
0
    wuffs_base__table_u8* tab =
5802
0
        &pb->private_impl
5803
0
             .planes[WUFFS_BASE__PIXEL_FORMAT__INDEXED__COLOR_PLANE];
5804
0
    tab->ptr = ptr;
5805
0
    tab->width = WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH;
5806
0
    tab->height = 1;
5807
0
    tab->stride = WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH;
5808
0
    ptr += WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH;
5809
0
    len -= WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH;
5810
0
  }
5811
5812
2.66k
  uint64_t wh = ((uint64_t)pixcfg->private_impl.width) *
5813
2.66k
                ((uint64_t)pixcfg->private_impl.height);
5814
2.66k
  size_t width = (size_t)(pixcfg->private_impl.width);
5815
2.66k
  if ((wh > (UINT64_MAX / bytes_per_pixel)) ||
5816
2.66k
      (width > (SIZE_MAX / bytes_per_pixel))) {
5817
0
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
5818
0
  }
5819
2.66k
  wh *= bytes_per_pixel;
5820
2.66k
  width = ((size_t)(width * bytes_per_pixel));
5821
2.66k
  if (wh > len) {
5822
0
    return wuffs_base__make_status(
5823
0
        wuffs_base__error__bad_argument_length_too_short);
5824
0
  }
5825
5826
2.66k
  pb->pixcfg = *pixcfg;
5827
2.66k
  wuffs_base__table_u8* tab = &pb->private_impl.planes[0];
5828
2.66k
  tab->ptr = ptr;
5829
2.66k
  tab->width = width;
5830
2.66k
  tab->height = pixcfg->private_impl.height;
5831
2.66k
  tab->stride = width;
5832
2.66k
  return wuffs_base__make_status(NULL);
5833
2.66k
}
5834
5835
// wuffs_base__pixel_buffer__palette returns the palette color data. If
5836
// non-empty, it will have length
5837
// WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH.
5838
static inline wuffs_base__slice_u8  //
5839
0
wuffs_base__pixel_buffer__palette(wuffs_base__pixel_buffer* pb) {
5840
0
  if (pb &&
5841
0
      wuffs_base__pixel_format__is_indexed(&pb->pixcfg.private_impl.pixfmt)) {
5842
0
    wuffs_base__table_u8* tab =
5843
0
        &pb->private_impl
5844
0
             .planes[WUFFS_BASE__PIXEL_FORMAT__INDEXED__COLOR_PLANE];
5845
0
    if ((tab->width ==
5846
0
         WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) &&
5847
0
        (tab->height == 1)) {
5848
0
      return wuffs_base__make_slice_u8(
5849
0
          tab->ptr, WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH);
5850
0
    }
5851
0
  }
5852
0
  return wuffs_base__empty_slice_u8();
5853
0
}
5854
5855
static inline wuffs_base__slice_u8  //
5856
wuffs_base__pixel_buffer__palette_or_else(wuffs_base__pixel_buffer* pb,
5857
14.4M
                                          wuffs_base__slice_u8 fallback) {
5858
14.4M
  if (pb &&
5859
14.4M
      wuffs_base__pixel_format__is_indexed(&pb->pixcfg.private_impl.pixfmt)) {
5860
0
    wuffs_base__table_u8* tab =
5861
0
        &pb->private_impl
5862
0
             .planes[WUFFS_BASE__PIXEL_FORMAT__INDEXED__COLOR_PLANE];
5863
0
    if ((tab->width ==
5864
0
         WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) &&
5865
0
        (tab->height == 1)) {
5866
0
      return wuffs_base__make_slice_u8(
5867
0
          tab->ptr, WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH);
5868
0
    }
5869
0
  }
5870
14.4M
  return fallback;
5871
14.4M
}
5872
5873
static inline wuffs_base__pixel_format  //
5874
4.49k
wuffs_base__pixel_buffer__pixel_format(const wuffs_base__pixel_buffer* pb) {
5875
4.49k
  if (pb) {
5876
4.49k
    return pb->pixcfg.private_impl.pixfmt;
5877
4.49k
  }
5878
0
  return wuffs_base__make_pixel_format(WUFFS_BASE__PIXEL_FORMAT__INVALID);
5879
4.49k
}
5880
5881
static inline wuffs_base__table_u8  //
5882
1.83k
wuffs_base__pixel_buffer__plane(wuffs_base__pixel_buffer* pb, uint32_t p) {
5883
1.83k
  if (pb && (p < WUFFS_BASE__PIXEL_FORMAT__NUM_PLANES_MAX_INCL)) {
5884
1.83k
    return pb->private_impl.planes[p];
5885
1.83k
  }
5886
5887
0
  wuffs_base__table_u8 ret;
5888
0
  ret.ptr = NULL;
5889
0
  ret.width = 0;
5890
0
  ret.height = 0;
5891
0
  ret.stride = 0;
5892
0
  return ret;
5893
1.83k
}
5894
5895
WUFFS_BASE__MAYBE_STATIC wuffs_base__color_u32_argb_premul  //
5896
wuffs_base__pixel_buffer__color_u32_at(const wuffs_base__pixel_buffer* pb,
5897
                                       uint32_t x,
5898
                                       uint32_t y);
5899
5900
WUFFS_BASE__MAYBE_STATIC wuffs_base__status  //
5901
wuffs_base__pixel_buffer__set_color_u32_at(
5902
    wuffs_base__pixel_buffer* pb,
5903
    uint32_t x,
5904
    uint32_t y,
5905
    wuffs_base__color_u32_argb_premul color);
5906
5907
WUFFS_BASE__MAYBE_STATIC wuffs_base__status  //
5908
wuffs_base__pixel_buffer__set_color_u32_fill_rect(
5909
    wuffs_base__pixel_buffer* pb,
5910
    wuffs_base__rect_ie_u32 rect,
5911
    wuffs_base__color_u32_argb_premul color);
5912
5913
WUFFS_BASE__MAYBE_STATIC bool  //
5914
wuffs_base__pixel_buffer__is_opaque(const wuffs_base__pixel_buffer* pb);
5915
5916
#ifdef __cplusplus
5917
5918
inline wuffs_base__status  //
5919
wuffs_base__pixel_buffer::set_interleaved(
5920
    const wuffs_base__pixel_config* pixcfg_arg,
5921
    wuffs_base__table_u8 primary_memory,
5922
    wuffs_base__slice_u8 palette_memory) {
5923
  return wuffs_base__pixel_buffer__set_interleaved(
5924
      this, pixcfg_arg, primary_memory, palette_memory);
5925
}
5926
5927
inline wuffs_base__status  //
5928
wuffs_base__pixel_buffer::set_from_slice(
5929
    const wuffs_base__pixel_config* pixcfg_arg,
5930
    wuffs_base__slice_u8 pixbuf_memory) {
5931
  return wuffs_base__pixel_buffer__set_from_slice(this, pixcfg_arg,
5932
                                                  pixbuf_memory);
5933
}
5934
5935
inline wuffs_base__slice_u8  //
5936
wuffs_base__pixel_buffer::palette() {
5937
  return wuffs_base__pixel_buffer__palette(this);
5938
}
5939
5940
inline wuffs_base__slice_u8  //
5941
wuffs_base__pixel_buffer::palette_or_else(wuffs_base__slice_u8 fallback) {
5942
  return wuffs_base__pixel_buffer__palette_or_else(this, fallback);
5943
}
5944
5945
inline wuffs_base__pixel_format  //
5946
wuffs_base__pixel_buffer::pixel_format() const {
5947
  return wuffs_base__pixel_buffer__pixel_format(this);
5948
}
5949
5950
inline wuffs_base__table_u8  //
5951
wuffs_base__pixel_buffer::plane(uint32_t p) {
5952
  return wuffs_base__pixel_buffer__plane(this, p);
5953
}
5954
5955
inline wuffs_base__color_u32_argb_premul  //
5956
wuffs_base__pixel_buffer::color_u32_at(uint32_t x, uint32_t y) const {
5957
  return wuffs_base__pixel_buffer__color_u32_at(this, x, y);
5958
}
5959
5960
inline wuffs_base__status  //
5961
wuffs_base__pixel_buffer::set_color_u32_at(
5962
    uint32_t x,
5963
    uint32_t y,
5964
    wuffs_base__color_u32_argb_premul color) {
5965
  return wuffs_base__pixel_buffer__set_color_u32_at(this, x, y, color);
5966
}
5967
5968
inline wuffs_base__status  //
5969
wuffs_base__pixel_buffer::set_color_u32_fill_rect(
5970
    wuffs_base__rect_ie_u32 rect,
5971
    wuffs_base__color_u32_argb_premul color) {
5972
  return wuffs_base__pixel_buffer__set_color_u32_fill_rect(this, rect, color);
5973
}
5974
5975
inline bool  //
5976
wuffs_base__pixel_buffer::is_opaque() {
5977
  return wuffs_base__pixel_buffer__is_opaque(this);
5978
}
5979
5980
#endif  // __cplusplus
5981
5982
// --------
5983
5984
typedef struct wuffs_base__decode_frame_options__struct {
5985
  // Do not access the private_impl's fields directly. There is no API/ABI
5986
  // compatibility or safety guarantee if you do so.
5987
  struct {
5988
    uint8_t TODO;
5989
  } private_impl;
5990
5991
#ifdef __cplusplus
5992
#endif  // __cplusplus
5993
5994
} wuffs_base__decode_frame_options;
5995
5996
#ifdef __cplusplus
5997
5998
#endif  // __cplusplus
5999
6000
// --------
6001
6002
// wuffs_base__pixel_palette__closest_element returns the index of the palette
6003
// element that minimizes the sum of squared differences of the four ARGB
6004
// channels, working in premultiplied alpha. Ties favor the smaller index.
6005
//
6006
// The palette_slice.len may equal (N*4), for N less than 256, which means that
6007
// only the first N palette elements are considered. It returns 0 when N is 0.
6008
//
6009
// Applying this function on a per-pixel basis will not produce whole-of-image
6010
// dithering.
6011
WUFFS_BASE__MAYBE_STATIC uint8_t  //
6012
wuffs_base__pixel_palette__closest_element(
6013
    wuffs_base__slice_u8 palette_slice,
6014
    wuffs_base__pixel_format palette_format,
6015
    wuffs_base__color_u32_argb_premul c);
6016
6017
// --------
6018
6019
// TODO: should the func type take restrict pointers?
6020
typedef uint64_t (*wuffs_base__pixel_swizzler__func)(uint8_t* dst_ptr,
6021
                                                     size_t dst_len,
6022
                                                     uint8_t* dst_palette_ptr,
6023
                                                     size_t dst_palette_len,
6024
                                                     const uint8_t* src_ptr,
6025
                                                     size_t src_len);
6026
6027
typedef uint64_t (*wuffs_base__pixel_swizzler__transparent_black_func)(
6028
    uint8_t* dst_ptr,
6029
    size_t dst_len,
6030
    uint8_t* dst_palette_ptr,
6031
    size_t dst_palette_len,
6032
    uint64_t num_pixels,
6033
    uint32_t dst_pixfmt_bytes_per_pixel);
6034
6035
typedef struct wuffs_base__pixel_swizzler__struct {
6036
  // Do not access the private_impl's fields directly. There is no API/ABI
6037
  // compatibility or safety guarantee if you do so.
6038
  struct {
6039
    wuffs_base__pixel_swizzler__func func;
6040
    wuffs_base__pixel_swizzler__transparent_black_func transparent_black_func;
6041
    uint32_t dst_pixfmt_bytes_per_pixel;
6042
    uint32_t src_pixfmt_bytes_per_pixel;
6043
  } private_impl;
6044
6045
#ifdef __cplusplus
6046
  inline wuffs_base__status prepare(wuffs_base__pixel_format dst_pixfmt,
6047
                                    wuffs_base__slice_u8 dst_palette,
6048
                                    wuffs_base__pixel_format src_pixfmt,
6049
                                    wuffs_base__slice_u8 src_palette,
6050
                                    wuffs_base__pixel_blend blend);
6051
  inline uint64_t swizzle_interleaved_from_slice(
6052
      wuffs_base__slice_u8 dst,
6053
      wuffs_base__slice_u8 dst_palette,
6054
      wuffs_base__slice_u8 src) const;
6055
#endif  // __cplusplus
6056
6057
} wuffs_base__pixel_swizzler;
6058
6059
// wuffs_base__pixel_swizzler__prepare readies the pixel swizzler so that its
6060
// other methods may be called.
6061
//
6062
// For modular builds that divide the base module into sub-modules, using this
6063
// function requires the WUFFS_CONFIG__MODULE__BASE__PIXCONV sub-module, not
6064
// just WUFFS_CONFIG__MODULE__BASE__CORE.
6065
WUFFS_BASE__MAYBE_STATIC wuffs_base__status  //
6066
wuffs_base__pixel_swizzler__prepare(wuffs_base__pixel_swizzler* p,
6067
                                    wuffs_base__pixel_format dst_pixfmt,
6068
                                    wuffs_base__slice_u8 dst_palette,
6069
                                    wuffs_base__pixel_format src_pixfmt,
6070
                                    wuffs_base__slice_u8 src_palette,
6071
                                    wuffs_base__pixel_blend blend);
6072
6073
// wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice converts pixels
6074
// from a source format to a destination format.
6075
//
6076
// For modular builds that divide the base module into sub-modules, using this
6077
// function requires the WUFFS_CONFIG__MODULE__BASE__PIXCONV sub-module, not
6078
// just WUFFS_CONFIG__MODULE__BASE__CORE.
6079
WUFFS_BASE__MAYBE_STATIC uint64_t  //
6080
wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(
6081
    const wuffs_base__pixel_swizzler* p,
6082
    wuffs_base__slice_u8 dst,
6083
    wuffs_base__slice_u8 dst_palette,
6084
    wuffs_base__slice_u8 src);
6085
6086
#ifdef __cplusplus
6087
6088
inline wuffs_base__status  //
6089
wuffs_base__pixel_swizzler::prepare(wuffs_base__pixel_format dst_pixfmt,
6090
                                    wuffs_base__slice_u8 dst_palette,
6091
                                    wuffs_base__pixel_format src_pixfmt,
6092
                                    wuffs_base__slice_u8 src_palette,
6093
                                    wuffs_base__pixel_blend blend) {
6094
  return wuffs_base__pixel_swizzler__prepare(this, dst_pixfmt, dst_palette,
6095
                                             src_pixfmt, src_palette, blend);
6096
}
6097
6098
uint64_t  //
6099
wuffs_base__pixel_swizzler::swizzle_interleaved_from_slice(
6100
    wuffs_base__slice_u8 dst,
6101
    wuffs_base__slice_u8 dst_palette,
6102
    wuffs_base__slice_u8 src) const {
6103
  return wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(
6104
      this, dst, dst_palette, src);
6105
}
6106
6107
#endif  // __cplusplus
6108
6109
// ---------------- String Conversions
6110
6111
// Options (bitwise or'ed together) for wuffs_base__parse_number_xxx
6112
// functions. The XXX options apply to both integer and floating point. The FXX
6113
// options apply only to floating point.
6114
6115
#define WUFFS_BASE__PARSE_NUMBER_XXX__DEFAULT_OPTIONS ((uint32_t)0x00000000)
6116
6117
// WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_MULTIPLE_LEADING_ZEROES means to accept
6118
// inputs like "00", "0644" and "00.7". By default, they are rejected.
6119
#define WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_MULTIPLE_LEADING_ZEROES \
6120
0
  ((uint32_t)0x00000001)
6121
6122
// WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES means to accept inputs like
6123
// "1__2" and "_3.141_592". By default, they are rejected.
6124
0
#define WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES ((uint32_t)0x00000002)
6125
6126
// WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA means to accept
6127
// "1,5" and not "1.5" as one-and-a-half.
6128
//
6129
// If the caller wants to accept either, it is responsible for canonicalizing
6130
// the input before calling wuffs_base__parse_number_fxx. The caller also has
6131
// more context on e.g. exactly how to treat something like "$1,234".
6132
#define WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA \
6133
0
  ((uint32_t)0x00000010)
6134
6135
// WUFFS_BASE__PARSE_NUMBER_FXX__REJECT_INF_AND_NAN means to reject inputs that
6136
// would lead to infinite or Not-a-Number floating point values. By default,
6137
// they are accepted.
6138
//
6139
// This affects the literal "inf" as input, but also affects inputs like
6140
// "1e999" that would overflow double-precision floating point.
6141
0
#define WUFFS_BASE__PARSE_NUMBER_FXX__REJECT_INF_AND_NAN ((uint32_t)0x00000020)
6142
6143
// --------
6144
6145
// Options (bitwise or'ed together) for wuffs_base__render_number_xxx
6146
// functions. The XXX options apply to both integer and floating point. The FXX
6147
// options apply only to floating point.
6148
6149
#define WUFFS_BASE__RENDER_NUMBER_XXX__DEFAULT_OPTIONS ((uint32_t)0x00000000)
6150
6151
// WUFFS_BASE__RENDER_NUMBER_XXX__ALIGN_RIGHT means to render to the right side
6152
// (higher indexes) of the destination slice, leaving any untouched bytes on
6153
// the left side (lower indexes). The default is vice versa: rendering on the
6154
// left with slack on the right.
6155
0
#define WUFFS_BASE__RENDER_NUMBER_XXX__ALIGN_RIGHT ((uint32_t)0x00000100)
6156
6157
// WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN means to render the leading
6158
// "+" for non-negative numbers: "+0" and "+12.3" instead of "0" and "12.3".
6159
0
#define WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN ((uint32_t)0x00000200)
6160
6161
// WUFFS_BASE__RENDER_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA means to render
6162
// one-and-a-half as "1,5" instead of "1.5".
6163
#define WUFFS_BASE__RENDER_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA \
6164
0
  ((uint32_t)0x00001000)
6165
6166
// WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_ETC means whether to never
6167
// (EXPONENT_ABSENT, equivalent to printf's "%f") or to always
6168
// (EXPONENT_PRESENT, equivalent to printf's "%e") render a floating point
6169
// number as "1.23e+05" instead of "123000".
6170
//
6171
// Having both bits set is the same has having neither bit set, where the
6172
// notation used depends on whether the exponent is sufficiently large: "0.5"
6173
// is preferred over "5e-01" but "5e-09" is preferred over "0.000000005".
6174
0
#define WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_ABSENT ((uint32_t)0x00002000)
6175
0
#define WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_PRESENT ((uint32_t)0x00004000)
6176
6177
// WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION means to render the
6178
// smallest number of digits so that parsing the resultant string will recover
6179
// the same double-precision floating point number.
6180
//
6181
// For example, double-precision cannot distinguish between 0.3 and
6182
// 0.299999999999999988897769753748434595763683319091796875, so when this bit
6183
// is set, rendering the latter will produce "0.3" but rendering
6184
// 0.3000000000000000444089209850062616169452667236328125 will produce
6185
// "0.30000000000000004".
6186
#define WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION \
6187
0
  ((uint32_t)0x00008000)
6188
6189
// ---------------- IEEE 754 Floating Point
6190
6191
// wuffs_base__ieee_754_bit_representation__etc converts between a double
6192
// precision numerical value and its IEEE 754 representations:
6193
//  - 16-bit: 1 sign bit,  5 exponent bits, 10 explicit significand bits.
6194
//  - 32-bit: 1 sign bit,  8 exponent bits, 23 explicit significand bits.
6195
//  - 64-bit: 1 sign bit, 11 exponent bits, 52 explicit significand bits.
6196
//
6197
// For example, it converts between:
6198
//  - +1.0 and 0x3C00, 0x3F80_0000 or 0x3FF0_0000_0000_0000.
6199
//  - +5.5 and 0x4580, 0x40B0_0000 or 0x4016_0000_0000_0000.
6200
//  - -inf and 0xFC00, 0xFF80_0000 or 0xFFF0_0000_0000_0000.
6201
//
6202
// Converting from f64 to shorter formats (f16 or f32, represented in C as
6203
// uint16_t and uint32_t) may be lossy. Such functions have names that look
6204
// like etc_truncate, as converting finite numbers produce equal or smaller
6205
// (closer-to-zero) finite numbers. For example, 1048576.0 is a perfectly valid
6206
// f64 number, but converting it to a f16 (with truncation) produces 65504.0,
6207
// the largest finite f16 number. Truncating a f64-typed value d to f32 does
6208
// not always produce the same result as the C-style cast ((float)d), as
6209
// casting can convert from finite numbers to infinite ones.
6210
//
6211
// Converting infinities or NaNs produces infinities or NaNs and always report
6212
// no loss, even though there a multiple NaN representations so that round-
6213
// tripping a f64-typed NaN may produce a different 64 bits. Nonetheless, the
6214
// etc_truncate functions preserve a NaN's "quiet vs signaling" bit.
6215
//
6216
// See https://en.wikipedia.org/wiki/Double-precision_floating-point_format
6217
6218
typedef struct wuffs_base__lossy_value_u16__struct {
6219
  uint16_t value;
6220
  bool lossy;
6221
} wuffs_base__lossy_value_u16;
6222
6223
typedef struct wuffs_base__lossy_value_u32__struct {
6224
  uint32_t value;
6225
  bool lossy;
6226
} wuffs_base__lossy_value_u32;
6227
6228
WUFFS_BASE__MAYBE_STATIC wuffs_base__lossy_value_u16  //
6229
wuffs_base__ieee_754_bit_representation__from_f64_to_u16_truncate(double f);
6230
6231
WUFFS_BASE__MAYBE_STATIC wuffs_base__lossy_value_u32  //
6232
wuffs_base__ieee_754_bit_representation__from_f64_to_u32_truncate(double f);
6233
6234
static inline uint64_t  //
6235
0
wuffs_base__ieee_754_bit_representation__from_f64_to_u64(double f) {
6236
0
  uint64_t u = 0;
6237
0
  if (sizeof(uint64_t) == sizeof(double)) {
6238
0
    memcpy(&u, &f, sizeof(uint64_t));
6239
0
  }
6240
0
  return u;
6241
0
}
6242
6243
static inline double  //
6244
0
wuffs_base__ieee_754_bit_representation__from_u16_to_f64(uint16_t u) {
6245
0
  uint64_t v = ((uint64_t)(u & 0x8000)) << 48;
6246
0
6247
0
  do {
6248
0
    uint64_t exp = (u >> 10) & 0x1F;
6249
0
    uint64_t man = u & 0x3FF;
6250
0
    if (exp == 0x1F) {  // Infinity or NaN.
6251
0
      exp = 2047;
6252
0
    } else if (exp != 0) {  // Normal.
6253
0
      exp += 1008;          // 1008 = 1023 - 15, the difference in biases.
6254
0
    } else if (man != 0) {  // Subnormal but non-zero.
6255
0
      uint32_t clz = wuffs_base__count_leading_zeroes_u64(man);
6256
0
      exp = 1062 - clz;  // 1062 = 1008 + 64 - 10.
6257
0
      man = 0x3FF & (man << (clz - 53));
6258
0
    } else {  // Zero.
6259
0
      break;
6260
0
    }
6261
0
    v |= (exp << 52) | (man << 42);
6262
0
  } while (0);
6263
0
6264
0
  double f = 0;
6265
0
  if (sizeof(uint64_t) == sizeof(double)) {
6266
0
    memcpy(&f, &v, sizeof(uint64_t));
6267
0
  }
6268
0
  return f;
6269
0
}
6270
6271
static inline double  //
6272
0
wuffs_base__ieee_754_bit_representation__from_u32_to_f64(uint32_t u) {
6273
0
  float f = 0;
6274
0
  if (sizeof(uint32_t) == sizeof(float)) {
6275
0
    memcpy(&f, &u, sizeof(uint32_t));
6276
0
  }
6277
0
  return (double)f;
6278
0
}
6279
6280
static inline double  //
6281
0
wuffs_base__ieee_754_bit_representation__from_u64_to_f64(uint64_t u) {
6282
0
  double f = 0;
6283
0
  if (sizeof(uint64_t) == sizeof(double)) {
6284
0
    memcpy(&f, &u, sizeof(uint64_t));
6285
0
  }
6286
0
  return f;
6287
0
}
6288
6289
// ---------------- Parsing and Rendering Numbers
6290
6291
// wuffs_base__parse_number_f64 parses the floating point number in s. For
6292
// example, if s contains the bytes "1.5" then it will return the double 1.5.
6293
//
6294
// It returns an error if s does not contain a floating point number.
6295
//
6296
// It does not necessarily return an error if the conversion is lossy, e.g. if
6297
// s is "0.3", which double-precision floating point cannot represent exactly.
6298
//
6299
// Similarly, the returned value may be infinite (and no error returned) even
6300
// if s was not "inf", when the input is nominally finite but sufficiently
6301
// larger than DBL_MAX, about 1.8e+308.
6302
//
6303
// It is similar to the C standard library's strtod function, but:
6304
//  - Errors are returned in-band (in a result type), not out-of-band (errno).
6305
//  - It takes a slice (a pointer and length), not a NUL-terminated C string.
6306
//  - It does not take an optional endptr argument. It does not allow a partial
6307
//    parse: it returns an error unless all of s is consumed.
6308
//  - It does not allow whitespace, leading or otherwise.
6309
//  - It does not allow hexadecimal floating point numbers.
6310
//  - It is not affected by i18n / l10n settings such as environment variables.
6311
//
6312
// The options argument can change these, but by default, it:
6313
//  - Allows "inf", "+Infinity" and "-NAN", case insensitive. Similarly,
6314
//    without an explicit opt-out, it would successfully parse "1e999" as
6315
//    infinity, even though it overflows double-precision floating point.
6316
//  - Rejects underscores. With an explicit opt-in, "_3.141_592" would
6317
//    successfully parse as an approximation to ฯ€.
6318
//  - Rejects unnecessary leading zeroes: "00", "0644" and "00.7".
6319
//  - Uses a dot '1.5' instead of a comma '1,5' for the decimal separator.
6320
//
6321
// For modular builds that divide the base module into sub-modules, using this
6322
// function requires the WUFFS_CONFIG__MODULE__BASE__FLOATCONV sub-module, not
6323
// just WUFFS_CONFIG__MODULE__BASE__CORE.
6324
WUFFS_BASE__MAYBE_STATIC wuffs_base__result_f64  //
6325
wuffs_base__parse_number_f64(wuffs_base__slice_u8 s, uint32_t options);
6326
6327
// wuffs_base__parse_number_i64 parses the ASCII integer in s. For example, if
6328
// s contains the bytes "-123" then it will return the int64_t -123.
6329
//
6330
// It returns an error if s does not contain an integer or if the integer
6331
// within would overflow an int64_t.
6332
//
6333
// It is similar to wuffs_base__parse_number_u64 but it returns a signed
6334
// integer, not an unsigned integer. It also allows a leading '+' or '-'.
6335
//
6336
// For modular builds that divide the base module into sub-modules, using this
6337
// function requires the WUFFS_CONFIG__MODULE__BASE__INTCONV sub-module, not
6338
// just WUFFS_CONFIG__MODULE__BASE__CORE.
6339
WUFFS_BASE__MAYBE_STATIC wuffs_base__result_i64  //
6340
wuffs_base__parse_number_i64(wuffs_base__slice_u8 s, uint32_t options);
6341
6342
// wuffs_base__parse_number_u64 parses the ASCII integer in s. For example, if
6343
// s contains the bytes "123" then it will return the uint64_t 123.
6344
//
6345
// It returns an error if s does not contain an integer or if the integer
6346
// within would overflow a uint64_t.
6347
//
6348
// It is similar to the C standard library's strtoull function, but:
6349
//  - Errors are returned in-band (in a result type), not out-of-band (errno).
6350
//  - It takes a slice (a pointer and length), not a NUL-terminated C string.
6351
//  - It does not take an optional endptr argument. It does not allow a partial
6352
//    parse: it returns an error unless all of s is consumed.
6353
//  - It does not allow whitespace, leading or otherwise.
6354
//  - It does not allow a leading '+' or '-'.
6355
//  - It does not take a base argument (e.g. base 10 vs base 16). Instead, it
6356
//    always accepts both decimal (e.g "1234", "0d5678") and hexadecimal (e.g.
6357
//    "0x9aBC"). The caller is responsible for prior filtering of e.g. hex
6358
//    numbers if they are unwanted. For example, Wuffs' JSON decoder will only
6359
//    produce a wuffs_base__token for decimal numbers, not hexadecimal.
6360
//  - It is not affected by i18n / l10n settings such as environment variables.
6361
//
6362
// The options argument can change these, but by default, it:
6363
//  - Rejects underscores. With an explicit opt-in, "__0D_1_002" would
6364
//    successfully parse as "one thousand and two". Underscores are still
6365
//    rejected inside the optional 2-byte opening "0d" or "0X" that denotes
6366
//    base-10 or base-16.
6367
//  - Rejects unnecessary leading zeroes: "00" and "0644".
6368
//
6369
// For modular builds that divide the base module into sub-modules, using this
6370
// function requires the WUFFS_CONFIG__MODULE__BASE__INTCONV sub-module, not
6371
// just WUFFS_CONFIG__MODULE__BASE__CORE.
6372
WUFFS_BASE__MAYBE_STATIC wuffs_base__result_u64  //
6373
wuffs_base__parse_number_u64(wuffs_base__slice_u8 s, uint32_t options);
6374
6375
// --------
6376
6377
// WUFFS_BASE__I64__BYTE_LENGTH__MAX_INCL is the string length of
6378
// "-9223372036854775808" and "+9223372036854775807", INT64_MIN and INT64_MAX.
6379
#define WUFFS_BASE__I64__BYTE_LENGTH__MAX_INCL 20
6380
6381
// WUFFS_BASE__U64__BYTE_LENGTH__MAX_INCL is the string length of
6382
// "+18446744073709551615", UINT64_MAX.
6383
#define WUFFS_BASE__U64__BYTE_LENGTH__MAX_INCL 21
6384
6385
// wuffs_base__render_number_f64 writes the decimal encoding of x to dst and
6386
// returns the number of bytes written. If dst is shorter than the entire
6387
// encoding, it returns 0 (and no bytes are written).
6388
//
6389
// For those familiar with C's printf or Go's fmt.Printf functions:
6390
//  - "%e" means the WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_PRESENT option.
6391
//  - "%f" means the WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_ABSENT  option.
6392
//  - "%g" means neither or both bits are set.
6393
//
6394
// The precision argument controls the number of digits rendered, excluding the
6395
// exponent (the "e+05" in "1.23e+05"):
6396
//  - for "%e" and "%f" it is the number of digits after the decimal separator,
6397
//  - for "%g" it is the number of significant digits (and trailing zeroes are
6398
//    removed).
6399
//
6400
// A precision of 6 gives similar output to printf's defaults.
6401
//
6402
// A precision greater than 4095 is equivalent to 4095.
6403
//
6404
// The precision argument is ignored when the
6405
// WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION option is set. This is
6406
// similar to Go's strconv.FormatFloat with a negative (i.e. non-sensical)
6407
// precision, but there is no corresponding feature in C's printf.
6408
//
6409
// Extreme values of x will be rendered as "NaN", "Inf" (or "+Inf" if the
6410
// WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN option is set) or "-Inf".
6411
//
6412
// For modular builds that divide the base module into sub-modules, using this
6413
// function requires the WUFFS_CONFIG__MODULE__BASE__FLOATCONV sub-module, not
6414
// just WUFFS_CONFIG__MODULE__BASE__CORE.
6415
WUFFS_BASE__MAYBE_STATIC size_t  //
6416
wuffs_base__render_number_f64(wuffs_base__slice_u8 dst,
6417
                              double x,
6418
                              uint32_t precision,
6419
                              uint32_t options);
6420
6421
// wuffs_base__render_number_i64 writes the decimal encoding of x to dst and
6422
// returns the number of bytes written. If dst is shorter than the entire
6423
// encoding, it returns 0 (and no bytes are written).
6424
//
6425
// dst will never be too short if its length is at least 20, also known as
6426
// WUFFS_BASE__I64__BYTE_LENGTH__MAX_INCL.
6427
//
6428
// For modular builds that divide the base module into sub-modules, using this
6429
// function requires the WUFFS_CONFIG__MODULE__BASE__INTCONV sub-module, not
6430
// just WUFFS_CONFIG__MODULE__BASE__CORE.
6431
WUFFS_BASE__MAYBE_STATIC size_t  //
6432
wuffs_base__render_number_i64(wuffs_base__slice_u8 dst,
6433
                              int64_t x,
6434
                              uint32_t options);
6435
6436
// wuffs_base__render_number_u64 writes the decimal encoding of x to dst and
6437
// returns the number of bytes written. If dst is shorter than the entire
6438
// encoding, it returns 0 (and no bytes are written).
6439
//
6440
// dst will never be too short if its length is at least 21, also known as
6441
// WUFFS_BASE__U64__BYTE_LENGTH__MAX_INCL.
6442
//
6443
// For modular builds that divide the base module into sub-modules, using this
6444
// function requires the WUFFS_CONFIG__MODULE__BASE__INTCONV sub-module, not
6445
// just WUFFS_CONFIG__MODULE__BASE__CORE.
6446
WUFFS_BASE__MAYBE_STATIC size_t  //
6447
wuffs_base__render_number_u64(wuffs_base__slice_u8 dst,
6448
                              uint64_t x,
6449
                              uint32_t options);
6450
6451
// ---------------- Base-16
6452
6453
// Options (bitwise or'ed together) for wuffs_base__base_16__xxx functions.
6454
6455
#define WUFFS_BASE__BASE_16__DEFAULT_OPTIONS ((uint32_t)0x00000000)
6456
6457
// wuffs_base__base_16__decode2 converts "6A6b" to "jk", where e.g. 'j' is
6458
// U+006A. There are 2 src bytes for every dst byte.
6459
//
6460
// It assumes that the src bytes are two hexadecimal digits (0-9, A-F, a-f),
6461
// repeated. It may write nonsense bytes if not, although it will not read or
6462
// write out of bounds.
6463
//
6464
// For modular builds that divide the base module into sub-modules, using this
6465
// function requires the WUFFS_CONFIG__MODULE__BASE__INTCONV sub-module, not
6466
// just WUFFS_CONFIG__MODULE__BASE__CORE.
6467
WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output  //
6468
wuffs_base__base_16__decode2(wuffs_base__slice_u8 dst,
6469
                             wuffs_base__slice_u8 src,
6470
                             bool src_closed,
6471
                             uint32_t options);
6472
6473
// wuffs_base__base_16__decode4 converts both "\\x6A\\x6b" and "??6a??6B" to
6474
// "jk", where e.g. 'j' is U+006A. There are 4 src bytes for every dst byte.
6475
//
6476
// It assumes that the src bytes are two ignored bytes and then two hexadecimal
6477
// digits (0-9, A-F, a-f), repeated. It may write nonsense bytes if not,
6478
// although it will not read or write out of bounds.
6479
//
6480
// For modular builds that divide the base module into sub-modules, using this
6481
// function requires the WUFFS_CONFIG__MODULE__BASE__INTCONV sub-module, not
6482
// just WUFFS_CONFIG__MODULE__BASE__CORE.
6483
WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output  //
6484
wuffs_base__base_16__decode4(wuffs_base__slice_u8 dst,
6485
                             wuffs_base__slice_u8 src,
6486
                             bool src_closed,
6487
                             uint32_t options);
6488
6489
// wuffs_base__base_16__encode2 converts "jk" to "6A6B", where e.g. 'j' is
6490
// U+006A. There are 2 dst bytes for every src byte.
6491
//
6492
// For modular builds that divide the base module into sub-modules, using this
6493
// function requires the WUFFS_CONFIG__MODULE__BASE__INTCONV sub-module, not
6494
// just WUFFS_CONFIG__MODULE__BASE__CORE.
6495
WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output  //
6496
wuffs_base__base_16__encode2(wuffs_base__slice_u8 dst,
6497
                             wuffs_base__slice_u8 src,
6498
                             bool src_closed,
6499
                             uint32_t options);
6500
6501
// wuffs_base__base_16__encode4 converts "jk" to "\\x6A\\x6B", where e.g. 'j'
6502
// is U+006A. There are 4 dst bytes for every src byte.
6503
//
6504
// For modular builds that divide the base module into sub-modules, using this
6505
// function requires the WUFFS_CONFIG__MODULE__BASE__INTCONV sub-module, not
6506
// just WUFFS_CONFIG__MODULE__BASE__CORE.
6507
WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output  //
6508
wuffs_base__base_16__encode4(wuffs_base__slice_u8 dst,
6509
                             wuffs_base__slice_u8 src,
6510
                             bool src_closed,
6511
                             uint32_t options);
6512
6513
// ---------------- Base-64
6514
6515
// Options (bitwise or'ed together) for wuffs_base__base_64__xxx functions.
6516
6517
#define WUFFS_BASE__BASE_64__DEFAULT_OPTIONS ((uint32_t)0x00000000)
6518
6519
// WUFFS_BASE__BASE_64__DECODE_ALLOW_PADDING means that, when decoding base-64,
6520
// the input may (but does not need to) be padded with '=' bytes so that the
6521
// overall encoded length in bytes is a multiple of 4. A successful decoding
6522
// will return a num_src that includes those padding bytes.
6523
//
6524
// Excess padding (e.g. three final '='s) will be rejected as bad data.
6525
0
#define WUFFS_BASE__BASE_64__DECODE_ALLOW_PADDING ((uint32_t)0x00000001)
6526
6527
// WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING means that, when encoding base-64,
6528
// the output will be padded with '=' bytes so that the overall encoded length
6529
// in bytes is a multiple of 4.
6530
0
#define WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING ((uint32_t)0x00000002)
6531
6532
// WUFFS_BASE__BASE_64__URL_ALPHABET means that, for base-64, the URL-friendly
6533
// and file-name-friendly alphabet be used, as per RFC 4648 section 5. When
6534
// this option bit is off, the standard alphabet from section 4 is used.
6535
0
#define WUFFS_BASE__BASE_64__URL_ALPHABET ((uint32_t)0x00000100)
6536
6537
// wuffs_base__base_64__decode transforms base-64 encoded bytes from src to
6538
// arbitrary bytes in dst.
6539
//
6540
// It will not permit line breaks or other whitespace in src. Filtering those
6541
// out is the responsibility of the caller.
6542
//
6543
// For modular builds that divide the base module into sub-modules, using this
6544
// function requires the WUFFS_CONFIG__MODULE__BASE__INTCONV sub-module, not
6545
// just WUFFS_CONFIG__MODULE__BASE__CORE.
6546
WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output  //
6547
wuffs_base__base_64__decode(wuffs_base__slice_u8 dst,
6548
                            wuffs_base__slice_u8 src,
6549
                            bool src_closed,
6550
                            uint32_t options);
6551
6552
// wuffs_base__base_64__encode transforms arbitrary bytes from src to base-64
6553
// encoded bytes in dst.
6554
//
6555
// For modular builds that divide the base module into sub-modules, using this
6556
// function requires the WUFFS_CONFIG__MODULE__BASE__INTCONV sub-module, not
6557
// just WUFFS_CONFIG__MODULE__BASE__CORE.
6558
WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output  //
6559
wuffs_base__base_64__encode(wuffs_base__slice_u8 dst,
6560
                            wuffs_base__slice_u8 src,
6561
                            bool src_closed,
6562
                            uint32_t options);
6563
6564
// ---------------- Unicode and UTF-8
6565
6566
#define WUFFS_BASE__UNICODE_CODE_POINT__MIN_INCL 0x00000000
6567
#define WUFFS_BASE__UNICODE_CODE_POINT__MAX_INCL 0x0010FFFF
6568
6569
0
#define WUFFS_BASE__UNICODE_REPLACEMENT_CHARACTER 0x0000FFFD
6570
6571
#define WUFFS_BASE__UNICODE_SURROGATE__MIN_INCL 0x0000D800
6572
#define WUFFS_BASE__UNICODE_SURROGATE__MAX_INCL 0x0000DFFF
6573
6574
#define WUFFS_BASE__ASCII__MIN_INCL 0x00
6575
#define WUFFS_BASE__ASCII__MAX_INCL 0x7F
6576
6577
#define WUFFS_BASE__UTF_8__BYTE_LENGTH__MIN_INCL 1
6578
#define WUFFS_BASE__UTF_8__BYTE_LENGTH__MAX_INCL 4
6579
6580
#define WUFFS_BASE__UTF_8__BYTE_LENGTH_1__CODE_POINT__MIN_INCL 0x00000000
6581
#define WUFFS_BASE__UTF_8__BYTE_LENGTH_1__CODE_POINT__MAX_INCL 0x0000007F
6582
#define WUFFS_BASE__UTF_8__BYTE_LENGTH_2__CODE_POINT__MIN_INCL 0x00000080
6583
#define WUFFS_BASE__UTF_8__BYTE_LENGTH_2__CODE_POINT__MAX_INCL 0x000007FF
6584
#define WUFFS_BASE__UTF_8__BYTE_LENGTH_3__CODE_POINT__MIN_INCL 0x00000800
6585
#define WUFFS_BASE__UTF_8__BYTE_LENGTH_3__CODE_POINT__MAX_INCL 0x0000FFFF
6586
#define WUFFS_BASE__UTF_8__BYTE_LENGTH_4__CODE_POINT__MIN_INCL 0x00010000
6587
#define WUFFS_BASE__UTF_8__BYTE_LENGTH_4__CODE_POINT__MAX_INCL 0x0010FFFF
6588
6589
// --------
6590
6591
// wuffs_base__utf_8__next__output is the type returned by
6592
// wuffs_base__utf_8__next.
6593
typedef struct wuffs_base__utf_8__next__output__struct {
6594
  uint32_t code_point;
6595
  uint32_t byte_length;
6596
6597
#ifdef __cplusplus
6598
  inline bool is_valid() const;
6599
#endif  // __cplusplus
6600
6601
} wuffs_base__utf_8__next__output;
6602
6603
static inline wuffs_base__utf_8__next__output  //
6604
wuffs_base__make_utf_8__next__output(uint32_t code_point,
6605
0
                                     uint32_t byte_length) {
6606
0
  wuffs_base__utf_8__next__output ret;
6607
0
  ret.code_point = code_point;
6608
0
  ret.byte_length = byte_length;
6609
0
  return ret;
6610
0
}
6611
6612
static inline bool  //
6613
wuffs_base__utf_8__next__output__is_valid(
6614
0
    const wuffs_base__utf_8__next__output* o) {
6615
0
  if (o) {
6616
0
    uint32_t cp = o->code_point;
6617
0
    switch (o->byte_length) {
6618
0
      case 1:
6619
0
        return (cp <= 0x7F);
6620
0
      case 2:
6621
0
        return (0x080 <= cp) && (cp <= 0x7FF);
6622
0
      case 3:
6623
0
        // Avoid the 0xD800 ..= 0xDFFF surrogate range.
6624
0
        return ((0x0800 <= cp) && (cp <= 0xD7FF)) ||
6625
0
               ((0xE000 <= cp) && (cp <= 0xFFFF));
6626
0
      case 4:
6627
0
        return (0x00010000 <= cp) && (cp <= 0x0010FFFF);
6628
0
    }
6629
0
  }
6630
0
  return false;
6631
0
}
6632
6633
#ifdef __cplusplus
6634
6635
inline bool  //
6636
wuffs_base__utf_8__next__output::is_valid() const {
6637
  return wuffs_base__utf_8__next__output__is_valid(this);
6638
}
6639
6640
#endif  // __cplusplus
6641
6642
// --------
6643
6644
// wuffs_base__utf_8__encode writes the UTF-8 encoding of code_point to s and
6645
// returns the number of bytes written. If code_point is invalid, or if s is
6646
// shorter than the entire encoding, it returns 0 (and no bytes are written).
6647
//
6648
// s will never be too short if its length is at least 4, also known as
6649
// WUFFS_BASE__UTF_8__BYTE_LENGTH__MAX_INCL.
6650
//
6651
// For modular builds that divide the base module into sub-modules, using this
6652
// function requires the WUFFS_CONFIG__MODULE__BASE__UTF8 sub-module, not just
6653
// WUFFS_CONFIG__MODULE__BASE__CORE.
6654
WUFFS_BASE__MAYBE_STATIC size_t  //
6655
wuffs_base__utf_8__encode(wuffs_base__slice_u8 dst, uint32_t code_point);
6656
6657
// wuffs_base__utf_8__next returns the next UTF-8 code point (and that code
6658
// point's byte length) at the start of the read-only slice (s_ptr, s_len).
6659
//
6660
// There are exactly two cases in which this function returns something where
6661
// wuffs_base__utf_8__next__output__is_valid is false:
6662
//  - If s is empty then it returns {.code_point=0, .byte_length=0}.
6663
//  - If s is non-empty and starts with invalid UTF-8 then it returns
6664
//    {.code_point=WUFFS_BASE__UNICODE_REPLACEMENT_CHARACTER, .byte_length=1}.
6665
//
6666
// Otherwise, it returns something where
6667
// wuffs_base__utf_8__next__output__is_valid is true.
6668
//
6669
// In any case, it always returns an output that satisfies both of:
6670
//  - (output.code_point  <= WUFFS_BASE__UNICODE_CODE_POINT__MAX_INCL).
6671
//  - (output.byte_length <= s_len).
6672
//
6673
// If s is a sub-slice of a larger slice of valid UTF-8, but that sub-slice
6674
// boundary occurs in the middle of a multi-byte UTF-8 encoding of a single
6675
// code point, then this function may return something invalid. It is the
6676
// caller's responsibility to split on or otherwise manage UTF-8 boundaries.
6677
//
6678
// For modular builds that divide the base module into sub-modules, using this
6679
// function requires the WUFFS_CONFIG__MODULE__BASE__UTF8 sub-module, not just
6680
// WUFFS_CONFIG__MODULE__BASE__CORE.
6681
WUFFS_BASE__MAYBE_STATIC wuffs_base__utf_8__next__output  //
6682
wuffs_base__utf_8__next(const uint8_t* s_ptr, size_t s_len);
6683
6684
// wuffs_base__utf_8__next_from_end is like wuffs_base__utf_8__next except that
6685
// it looks at the end of (s_ptr, s_len) instead of the start.
6686
//
6687
// For modular builds that divide the base module into sub-modules, using this
6688
// function requires the WUFFS_CONFIG__MODULE__BASE__UTF8 sub-module, not just
6689
// WUFFS_CONFIG__MODULE__BASE__CORE.
6690
WUFFS_BASE__MAYBE_STATIC wuffs_base__utf_8__next__output  //
6691
wuffs_base__utf_8__next_from_end(const uint8_t* s_ptr, size_t s_len);
6692
6693
// wuffs_base__utf_8__longest_valid_prefix returns the largest n such that the
6694
// sub-slice s[..n] is valid UTF-8, where s is the read-only slice (s_ptr,
6695
// s_len).
6696
//
6697
// In particular, it returns s_len if and only if all of s is valid UTF-8.
6698
//
6699
// If s is a sub-slice of a larger slice of valid UTF-8, but that sub-slice
6700
// boundary occurs in the middle of a multi-byte UTF-8 encoding of a single
6701
// code point, then this function will return less than s_len. It is the
6702
// caller's responsibility to split on or otherwise manage UTF-8 boundaries.
6703
//
6704
// For modular builds that divide the base module into sub-modules, using this
6705
// function requires the WUFFS_CONFIG__MODULE__BASE__UTF8 sub-module, not just
6706
// WUFFS_CONFIG__MODULE__BASE__CORE.
6707
WUFFS_BASE__MAYBE_STATIC size_t  //
6708
wuffs_base__utf_8__longest_valid_prefix(const uint8_t* s_ptr, size_t s_len);
6709
6710
// wuffs_base__ascii__longest_valid_prefix returns the largest n such that the
6711
// sub-slice s[..n] is valid ASCII, where s is the read-only slice (s_ptr,
6712
// s_len).
6713
//
6714
// In particular, it returns s_len if and only if all of s is valid ASCII.
6715
// Equivalently, when none of the bytes in s have the 0x80 high bit set.
6716
//
6717
// For modular builds that divide the base module into sub-modules, using this
6718
// function requires the WUFFS_CONFIG__MODULE__BASE__UTF8 sub-module, not just
6719
// WUFFS_CONFIG__MODULE__BASE__CORE.
6720
WUFFS_BASE__MAYBE_STATIC size_t  //
6721
wuffs_base__ascii__longest_valid_prefix(const uint8_t* s_ptr, size_t s_len);
6722
6723
// ---------------- Interface Declarations.
6724
6725
// For modular builds that divide the base module into sub-modules, using these
6726
// functions require the WUFFS_CONFIG__MODULE__BASE__INTERFACES sub-module, not
6727
// just WUFFS_CONFIG__MODULE__BASE__CORE.
6728
6729
// --------
6730
6731
extern const char wuffs_base__hasher_u32__vtable_name[];
6732
6733
typedef struct wuffs_base__hasher_u32__func_ptrs__struct {
6734
  uint32_t (*checksum_u32)(
6735
    const void* self);
6736
  uint64_t (*get_quirk)(
6737
    const void* self,
6738
    uint32_t a_key);
6739
  wuffs_base__status (*set_quirk)(
6740
    void* self,
6741
    uint32_t a_key,
6742
    uint64_t a_value);
6743
  wuffs_base__empty_struct (*update)(
6744
    void* self,
6745
    wuffs_base__slice_u8 a_x);
6746
  uint32_t (*update_u32)(
6747
    void* self,
6748
    wuffs_base__slice_u8 a_x);
6749
} wuffs_base__hasher_u32__func_ptrs;
6750
6751
typedef struct wuffs_base__hasher_u32__struct wuffs_base__hasher_u32;
6752
6753
WUFFS_BASE__GENERATED_C_CODE
6754
WUFFS_BASE__MAYBE_STATIC uint32_t
6755
wuffs_base__hasher_u32__checksum_u32(
6756
    const wuffs_base__hasher_u32* self);
6757
6758
WUFFS_BASE__GENERATED_C_CODE
6759
WUFFS_BASE__MAYBE_STATIC uint64_t
6760
wuffs_base__hasher_u32__get_quirk(
6761
    const wuffs_base__hasher_u32* self,
6762
    uint32_t a_key);
6763
6764
WUFFS_BASE__GENERATED_C_CODE
6765
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
6766
wuffs_base__hasher_u32__set_quirk(
6767
    wuffs_base__hasher_u32* self,
6768
    uint32_t a_key,
6769
    uint64_t a_value);
6770
6771
WUFFS_BASE__GENERATED_C_CODE
6772
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
6773
wuffs_base__hasher_u32__update(
6774
    wuffs_base__hasher_u32* self,
6775
    wuffs_base__slice_u8 a_x);
6776
6777
WUFFS_BASE__GENERATED_C_CODE
6778
WUFFS_BASE__MAYBE_STATIC uint32_t
6779
wuffs_base__hasher_u32__update_u32(
6780
    wuffs_base__hasher_u32* self,
6781
    wuffs_base__slice_u8 a_x);
6782
6783
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
6784
6785
struct wuffs_base__hasher_u32__struct {
6786
  struct {
6787
    uint32_t magic;
6788
    uint32_t active_coroutine;
6789
    wuffs_base__vtable first_vtable;
6790
  } private_impl;
6791
6792
#ifdef __cplusplus
6793
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
6794
  using unique_ptr = std::unique_ptr<wuffs_base__hasher_u32, wuffs_unique_ptr_deleter>;
6795
#endif
6796
6797
  inline uint32_t
6798
  checksum_u32() const {
6799
    return wuffs_base__hasher_u32__checksum_u32(this);
6800
  }
6801
6802
  inline uint64_t
6803
  get_quirk(
6804
      uint32_t a_key) const {
6805
    return wuffs_base__hasher_u32__get_quirk(
6806
        this, a_key);
6807
  }
6808
6809
  inline wuffs_base__status
6810
  set_quirk(
6811
      uint32_t a_key,
6812
      uint64_t a_value) {
6813
    return wuffs_base__hasher_u32__set_quirk(
6814
        this, a_key, a_value);
6815
  }
6816
6817
  inline wuffs_base__empty_struct
6818
  update(
6819
      wuffs_base__slice_u8 a_x) {
6820
    return wuffs_base__hasher_u32__update(
6821
        this, a_x);
6822
  }
6823
6824
  inline uint32_t
6825
  update_u32(
6826
      wuffs_base__slice_u8 a_x) {
6827
    return wuffs_base__hasher_u32__update_u32(
6828
        this, a_x);
6829
  }
6830
6831
#endif  // __cplusplus
6832
};  // struct wuffs_base__hasher_u32__struct
6833
6834
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
6835
6836
// --------
6837
6838
extern const char wuffs_base__hasher_u64__vtable_name[];
6839
6840
typedef struct wuffs_base__hasher_u64__func_ptrs__struct {
6841
  uint64_t (*checksum_u64)(
6842
    const void* self);
6843
  uint64_t (*get_quirk)(
6844
    const void* self,
6845
    uint32_t a_key);
6846
  wuffs_base__status (*set_quirk)(
6847
    void* self,
6848
    uint32_t a_key,
6849
    uint64_t a_value);
6850
  wuffs_base__empty_struct (*update)(
6851
    void* self,
6852
    wuffs_base__slice_u8 a_x);
6853
  uint64_t (*update_u64)(
6854
    void* self,
6855
    wuffs_base__slice_u8 a_x);
6856
} wuffs_base__hasher_u64__func_ptrs;
6857
6858
typedef struct wuffs_base__hasher_u64__struct wuffs_base__hasher_u64;
6859
6860
WUFFS_BASE__GENERATED_C_CODE
6861
WUFFS_BASE__MAYBE_STATIC uint64_t
6862
wuffs_base__hasher_u64__checksum_u64(
6863
    const wuffs_base__hasher_u64* self);
6864
6865
WUFFS_BASE__GENERATED_C_CODE
6866
WUFFS_BASE__MAYBE_STATIC uint64_t
6867
wuffs_base__hasher_u64__get_quirk(
6868
    const wuffs_base__hasher_u64* self,
6869
    uint32_t a_key);
6870
6871
WUFFS_BASE__GENERATED_C_CODE
6872
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
6873
wuffs_base__hasher_u64__set_quirk(
6874
    wuffs_base__hasher_u64* self,
6875
    uint32_t a_key,
6876
    uint64_t a_value);
6877
6878
WUFFS_BASE__GENERATED_C_CODE
6879
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
6880
wuffs_base__hasher_u64__update(
6881
    wuffs_base__hasher_u64* self,
6882
    wuffs_base__slice_u8 a_x);
6883
6884
WUFFS_BASE__GENERATED_C_CODE
6885
WUFFS_BASE__MAYBE_STATIC uint64_t
6886
wuffs_base__hasher_u64__update_u64(
6887
    wuffs_base__hasher_u64* self,
6888
    wuffs_base__slice_u8 a_x);
6889
6890
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
6891
6892
struct wuffs_base__hasher_u64__struct {
6893
  struct {
6894
    uint32_t magic;
6895
    uint32_t active_coroutine;
6896
    wuffs_base__vtable first_vtable;
6897
  } private_impl;
6898
6899
#ifdef __cplusplus
6900
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
6901
  using unique_ptr = std::unique_ptr<wuffs_base__hasher_u64, wuffs_unique_ptr_deleter>;
6902
#endif
6903
6904
  inline uint64_t
6905
  checksum_u64() const {
6906
    return wuffs_base__hasher_u64__checksum_u64(this);
6907
  }
6908
6909
  inline uint64_t
6910
  get_quirk(
6911
      uint32_t a_key) const {
6912
    return wuffs_base__hasher_u64__get_quirk(
6913
        this, a_key);
6914
  }
6915
6916
  inline wuffs_base__status
6917
  set_quirk(
6918
      uint32_t a_key,
6919
      uint64_t a_value) {
6920
    return wuffs_base__hasher_u64__set_quirk(
6921
        this, a_key, a_value);
6922
  }
6923
6924
  inline wuffs_base__empty_struct
6925
  update(
6926
      wuffs_base__slice_u8 a_x) {
6927
    return wuffs_base__hasher_u64__update(
6928
        this, a_x);
6929
  }
6930
6931
  inline uint64_t
6932
  update_u64(
6933
      wuffs_base__slice_u8 a_x) {
6934
    return wuffs_base__hasher_u64__update_u64(
6935
        this, a_x);
6936
  }
6937
6938
#endif  // __cplusplus
6939
};  // struct wuffs_base__hasher_u64__struct
6940
6941
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
6942
6943
// --------
6944
6945
extern const char wuffs_base__hasher_bitvec256__vtable_name[];
6946
6947
typedef struct wuffs_base__hasher_bitvec256__func_ptrs__struct {
6948
  wuffs_base__bitvec256 (*checksum_bitvec256)(
6949
    const void* self);
6950
  uint64_t (*get_quirk)(
6951
    const void* self,
6952
    uint32_t a_key);
6953
  wuffs_base__status (*set_quirk)(
6954
    void* self,
6955
    uint32_t a_key,
6956
    uint64_t a_value);
6957
  wuffs_base__empty_struct (*update)(
6958
    void* self,
6959
    wuffs_base__slice_u8 a_x);
6960
  wuffs_base__bitvec256 (*update_bitvec256)(
6961
    void* self,
6962
    wuffs_base__slice_u8 a_x);
6963
} wuffs_base__hasher_bitvec256__func_ptrs;
6964
6965
typedef struct wuffs_base__hasher_bitvec256__struct wuffs_base__hasher_bitvec256;
6966
6967
WUFFS_BASE__GENERATED_C_CODE
6968
WUFFS_BASE__MAYBE_STATIC wuffs_base__bitvec256
6969
wuffs_base__hasher_bitvec256__checksum_bitvec256(
6970
    const wuffs_base__hasher_bitvec256* self);
6971
6972
WUFFS_BASE__GENERATED_C_CODE
6973
WUFFS_BASE__MAYBE_STATIC uint64_t
6974
wuffs_base__hasher_bitvec256__get_quirk(
6975
    const wuffs_base__hasher_bitvec256* self,
6976
    uint32_t a_key);
6977
6978
WUFFS_BASE__GENERATED_C_CODE
6979
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
6980
wuffs_base__hasher_bitvec256__set_quirk(
6981
    wuffs_base__hasher_bitvec256* self,
6982
    uint32_t a_key,
6983
    uint64_t a_value);
6984
6985
WUFFS_BASE__GENERATED_C_CODE
6986
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
6987
wuffs_base__hasher_bitvec256__update(
6988
    wuffs_base__hasher_bitvec256* self,
6989
    wuffs_base__slice_u8 a_x);
6990
6991
WUFFS_BASE__GENERATED_C_CODE
6992
WUFFS_BASE__MAYBE_STATIC wuffs_base__bitvec256
6993
wuffs_base__hasher_bitvec256__update_bitvec256(
6994
    wuffs_base__hasher_bitvec256* self,
6995
    wuffs_base__slice_u8 a_x);
6996
6997
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
6998
6999
struct wuffs_base__hasher_bitvec256__struct {
7000
  struct {
7001
    uint32_t magic;
7002
    uint32_t active_coroutine;
7003
    wuffs_base__vtable first_vtable;
7004
  } private_impl;
7005
7006
#ifdef __cplusplus
7007
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
7008
  using unique_ptr = std::unique_ptr<wuffs_base__hasher_bitvec256, wuffs_unique_ptr_deleter>;
7009
#endif
7010
7011
  inline wuffs_base__bitvec256
7012
  checksum_bitvec256() const {
7013
    return wuffs_base__hasher_bitvec256__checksum_bitvec256(this);
7014
  }
7015
7016
  inline uint64_t
7017
  get_quirk(
7018
      uint32_t a_key) const {
7019
    return wuffs_base__hasher_bitvec256__get_quirk(
7020
        this, a_key);
7021
  }
7022
7023
  inline wuffs_base__status
7024
  set_quirk(
7025
      uint32_t a_key,
7026
      uint64_t a_value) {
7027
    return wuffs_base__hasher_bitvec256__set_quirk(
7028
        this, a_key, a_value);
7029
  }
7030
7031
  inline wuffs_base__empty_struct
7032
  update(
7033
      wuffs_base__slice_u8 a_x) {
7034
    return wuffs_base__hasher_bitvec256__update(
7035
        this, a_x);
7036
  }
7037
7038
  inline wuffs_base__bitvec256
7039
  update_bitvec256(
7040
      wuffs_base__slice_u8 a_x) {
7041
    return wuffs_base__hasher_bitvec256__update_bitvec256(
7042
        this, a_x);
7043
  }
7044
7045
#endif  // __cplusplus
7046
};  // struct wuffs_base__hasher_bitvec256__struct
7047
7048
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
7049
7050
// --------
7051
7052
extern const char wuffs_base__image_decoder__vtable_name[];
7053
7054
typedef struct wuffs_base__image_decoder__func_ptrs__struct {
7055
  wuffs_base__status (*decode_frame)(
7056
    void* self,
7057
    wuffs_base__pixel_buffer* a_dst,
7058
    wuffs_base__io_buffer* a_src,
7059
    wuffs_base__pixel_blend a_blend,
7060
    wuffs_base__slice_u8 a_workbuf,
7061
    wuffs_base__decode_frame_options* a_opts);
7062
  wuffs_base__status (*decode_frame_config)(
7063
    void* self,
7064
    wuffs_base__frame_config* a_dst,
7065
    wuffs_base__io_buffer* a_src);
7066
  wuffs_base__status (*decode_image_config)(
7067
    void* self,
7068
    wuffs_base__image_config* a_dst,
7069
    wuffs_base__io_buffer* a_src);
7070
  wuffs_base__rect_ie_u32 (*frame_dirty_rect)(
7071
    const void* self);
7072
  uint64_t (*get_quirk)(
7073
    const void* self,
7074
    uint32_t a_key);
7075
  uint32_t (*num_animation_loops)(
7076
    const void* self);
7077
  uint64_t (*num_decoded_frame_configs)(
7078
    const void* self);
7079
  uint64_t (*num_decoded_frames)(
7080
    const void* self);
7081
  wuffs_base__status (*restart_frame)(
7082
    void* self,
7083
    uint64_t a_index,
7084
    uint64_t a_io_position);
7085
  wuffs_base__status (*set_quirk)(
7086
    void* self,
7087
    uint32_t a_key,
7088
    uint64_t a_value);
7089
  wuffs_base__empty_struct (*set_report_metadata)(
7090
    void* self,
7091
    uint32_t a_fourcc,
7092
    bool a_report);
7093
  wuffs_base__status (*tell_me_more)(
7094
    void* self,
7095
    wuffs_base__io_buffer* a_dst,
7096
    wuffs_base__more_information* a_minfo,
7097
    wuffs_base__io_buffer* a_src);
7098
  wuffs_base__range_ii_u64 (*workbuf_len)(
7099
    const void* self);
7100
} wuffs_base__image_decoder__func_ptrs;
7101
7102
typedef struct wuffs_base__image_decoder__struct wuffs_base__image_decoder;
7103
7104
WUFFS_BASE__GENERATED_C_CODE
7105
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
7106
wuffs_base__image_decoder__decode_frame(
7107
    wuffs_base__image_decoder* self,
7108
    wuffs_base__pixel_buffer* a_dst,
7109
    wuffs_base__io_buffer* a_src,
7110
    wuffs_base__pixel_blend a_blend,
7111
    wuffs_base__slice_u8 a_workbuf,
7112
    wuffs_base__decode_frame_options* a_opts);
7113
7114
WUFFS_BASE__GENERATED_C_CODE
7115
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
7116
wuffs_base__image_decoder__decode_frame_config(
7117
    wuffs_base__image_decoder* self,
7118
    wuffs_base__frame_config* a_dst,
7119
    wuffs_base__io_buffer* a_src);
7120
7121
WUFFS_BASE__GENERATED_C_CODE
7122
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
7123
wuffs_base__image_decoder__decode_image_config(
7124
    wuffs_base__image_decoder* self,
7125
    wuffs_base__image_config* a_dst,
7126
    wuffs_base__io_buffer* a_src);
7127
7128
WUFFS_BASE__GENERATED_C_CODE
7129
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
7130
wuffs_base__image_decoder__frame_dirty_rect(
7131
    const wuffs_base__image_decoder* self);
7132
7133
WUFFS_BASE__GENERATED_C_CODE
7134
WUFFS_BASE__MAYBE_STATIC uint64_t
7135
wuffs_base__image_decoder__get_quirk(
7136
    const wuffs_base__image_decoder* self,
7137
    uint32_t a_key);
7138
7139
WUFFS_BASE__GENERATED_C_CODE
7140
WUFFS_BASE__MAYBE_STATIC uint32_t
7141
wuffs_base__image_decoder__num_animation_loops(
7142
    const wuffs_base__image_decoder* self);
7143
7144
WUFFS_BASE__GENERATED_C_CODE
7145
WUFFS_BASE__MAYBE_STATIC uint64_t
7146
wuffs_base__image_decoder__num_decoded_frame_configs(
7147
    const wuffs_base__image_decoder* self);
7148
7149
WUFFS_BASE__GENERATED_C_CODE
7150
WUFFS_BASE__MAYBE_STATIC uint64_t
7151
wuffs_base__image_decoder__num_decoded_frames(
7152
    const wuffs_base__image_decoder* self);
7153
7154
WUFFS_BASE__GENERATED_C_CODE
7155
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
7156
wuffs_base__image_decoder__restart_frame(
7157
    wuffs_base__image_decoder* self,
7158
    uint64_t a_index,
7159
    uint64_t a_io_position);
7160
7161
WUFFS_BASE__GENERATED_C_CODE
7162
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
7163
wuffs_base__image_decoder__set_quirk(
7164
    wuffs_base__image_decoder* self,
7165
    uint32_t a_key,
7166
    uint64_t a_value);
7167
7168
WUFFS_BASE__GENERATED_C_CODE
7169
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
7170
wuffs_base__image_decoder__set_report_metadata(
7171
    wuffs_base__image_decoder* self,
7172
    uint32_t a_fourcc,
7173
    bool a_report);
7174
7175
WUFFS_BASE__GENERATED_C_CODE
7176
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
7177
wuffs_base__image_decoder__tell_me_more(
7178
    wuffs_base__image_decoder* self,
7179
    wuffs_base__io_buffer* a_dst,
7180
    wuffs_base__more_information* a_minfo,
7181
    wuffs_base__io_buffer* a_src);
7182
7183
WUFFS_BASE__GENERATED_C_CODE
7184
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
7185
wuffs_base__image_decoder__workbuf_len(
7186
    const wuffs_base__image_decoder* self);
7187
7188
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
7189
7190
struct wuffs_base__image_decoder__struct {
7191
  struct {
7192
    uint32_t magic;
7193
    uint32_t active_coroutine;
7194
    wuffs_base__vtable first_vtable;
7195
  } private_impl;
7196
7197
#ifdef __cplusplus
7198
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
7199
  using unique_ptr = std::unique_ptr<wuffs_base__image_decoder, wuffs_unique_ptr_deleter>;
7200
#endif
7201
7202
  inline wuffs_base__status
7203
  decode_frame(
7204
      wuffs_base__pixel_buffer* a_dst,
7205
      wuffs_base__io_buffer* a_src,
7206
      wuffs_base__pixel_blend a_blend,
7207
      wuffs_base__slice_u8 a_workbuf,
7208
      wuffs_base__decode_frame_options* a_opts) {
7209
    return wuffs_base__image_decoder__decode_frame(
7210
        this, a_dst, a_src, a_blend, a_workbuf, a_opts);
7211
  }
7212
7213
  inline wuffs_base__status
7214
  decode_frame_config(
7215
      wuffs_base__frame_config* a_dst,
7216
      wuffs_base__io_buffer* a_src) {
7217
    return wuffs_base__image_decoder__decode_frame_config(
7218
        this, a_dst, a_src);
7219
  }
7220
7221
  inline wuffs_base__status
7222
  decode_image_config(
7223
      wuffs_base__image_config* a_dst,
7224
      wuffs_base__io_buffer* a_src) {
7225
    return wuffs_base__image_decoder__decode_image_config(
7226
        this, a_dst, a_src);
7227
  }
7228
7229
  inline wuffs_base__rect_ie_u32
7230
  frame_dirty_rect() const {
7231
    return wuffs_base__image_decoder__frame_dirty_rect(this);
7232
  }
7233
7234
  inline uint64_t
7235
  get_quirk(
7236
      uint32_t a_key) const {
7237
    return wuffs_base__image_decoder__get_quirk(
7238
        this, a_key);
7239
  }
7240
7241
  inline uint32_t
7242
  num_animation_loops() const {
7243
    return wuffs_base__image_decoder__num_animation_loops(this);
7244
  }
7245
7246
  inline uint64_t
7247
  num_decoded_frame_configs() const {
7248
    return wuffs_base__image_decoder__num_decoded_frame_configs(this);
7249
  }
7250
7251
  inline uint64_t
7252
  num_decoded_frames() const {
7253
    return wuffs_base__image_decoder__num_decoded_frames(this);
7254
  }
7255
7256
  inline wuffs_base__status
7257
  restart_frame(
7258
      uint64_t a_index,
7259
      uint64_t a_io_position) {
7260
    return wuffs_base__image_decoder__restart_frame(
7261
        this, a_index, a_io_position);
7262
  }
7263
7264
  inline wuffs_base__status
7265
  set_quirk(
7266
      uint32_t a_key,
7267
      uint64_t a_value) {
7268
    return wuffs_base__image_decoder__set_quirk(
7269
        this, a_key, a_value);
7270
  }
7271
7272
  inline wuffs_base__empty_struct
7273
  set_report_metadata(
7274
      uint32_t a_fourcc,
7275
      bool a_report) {
7276
    return wuffs_base__image_decoder__set_report_metadata(
7277
        this, a_fourcc, a_report);
7278
  }
7279
7280
  inline wuffs_base__status
7281
  tell_me_more(
7282
      wuffs_base__io_buffer* a_dst,
7283
      wuffs_base__more_information* a_minfo,
7284
      wuffs_base__io_buffer* a_src) {
7285
    return wuffs_base__image_decoder__tell_me_more(
7286
        this, a_dst, a_minfo, a_src);
7287
  }
7288
7289
  inline wuffs_base__range_ii_u64
7290
  workbuf_len() const {
7291
    return wuffs_base__image_decoder__workbuf_len(this);
7292
  }
7293
7294
#endif  // __cplusplus
7295
};  // struct wuffs_base__image_decoder__struct
7296
7297
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
7298
7299
// --------
7300
7301
extern const char wuffs_base__io_transformer__vtable_name[];
7302
7303
typedef struct wuffs_base__io_transformer__func_ptrs__struct {
7304
  wuffs_base__optional_u63 (*dst_history_retain_length)(
7305
    const void* self);
7306
  uint64_t (*get_quirk)(
7307
    const void* self,
7308
    uint32_t a_key);
7309
  wuffs_base__status (*set_quirk)(
7310
    void* self,
7311
    uint32_t a_key,
7312
    uint64_t a_value);
7313
  wuffs_base__status (*transform_io)(
7314
    void* self,
7315
    wuffs_base__io_buffer* a_dst,
7316
    wuffs_base__io_buffer* a_src,
7317
    wuffs_base__slice_u8 a_workbuf);
7318
  wuffs_base__range_ii_u64 (*workbuf_len)(
7319
    const void* self);
7320
} wuffs_base__io_transformer__func_ptrs;
7321
7322
typedef struct wuffs_base__io_transformer__struct wuffs_base__io_transformer;
7323
7324
WUFFS_BASE__GENERATED_C_CODE
7325
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
7326
wuffs_base__io_transformer__dst_history_retain_length(
7327
    const wuffs_base__io_transformer* self);
7328
7329
WUFFS_BASE__GENERATED_C_CODE
7330
WUFFS_BASE__MAYBE_STATIC uint64_t
7331
wuffs_base__io_transformer__get_quirk(
7332
    const wuffs_base__io_transformer* self,
7333
    uint32_t a_key);
7334
7335
WUFFS_BASE__GENERATED_C_CODE
7336
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
7337
wuffs_base__io_transformer__set_quirk(
7338
    wuffs_base__io_transformer* self,
7339
    uint32_t a_key,
7340
    uint64_t a_value);
7341
7342
WUFFS_BASE__GENERATED_C_CODE
7343
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
7344
wuffs_base__io_transformer__transform_io(
7345
    wuffs_base__io_transformer* self,
7346
    wuffs_base__io_buffer* a_dst,
7347
    wuffs_base__io_buffer* a_src,
7348
    wuffs_base__slice_u8 a_workbuf);
7349
7350
WUFFS_BASE__GENERATED_C_CODE
7351
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
7352
wuffs_base__io_transformer__workbuf_len(
7353
    const wuffs_base__io_transformer* self);
7354
7355
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
7356
7357
struct wuffs_base__io_transformer__struct {
7358
  struct {
7359
    uint32_t magic;
7360
    uint32_t active_coroutine;
7361
    wuffs_base__vtable first_vtable;
7362
  } private_impl;
7363
7364
#ifdef __cplusplus
7365
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
7366
  using unique_ptr = std::unique_ptr<wuffs_base__io_transformer, wuffs_unique_ptr_deleter>;
7367
#endif
7368
7369
  inline wuffs_base__optional_u63
7370
  dst_history_retain_length() const {
7371
    return wuffs_base__io_transformer__dst_history_retain_length(this);
7372
  }
7373
7374
  inline uint64_t
7375
  get_quirk(
7376
      uint32_t a_key) const {
7377
    return wuffs_base__io_transformer__get_quirk(
7378
        this, a_key);
7379
  }
7380
7381
  inline wuffs_base__status
7382
  set_quirk(
7383
      uint32_t a_key,
7384
      uint64_t a_value) {
7385
    return wuffs_base__io_transformer__set_quirk(
7386
        this, a_key, a_value);
7387
  }
7388
7389
  inline wuffs_base__status
7390
  transform_io(
7391
      wuffs_base__io_buffer* a_dst,
7392
      wuffs_base__io_buffer* a_src,
7393
      wuffs_base__slice_u8 a_workbuf) {
7394
    return wuffs_base__io_transformer__transform_io(
7395
        this, a_dst, a_src, a_workbuf);
7396
  }
7397
7398
  inline wuffs_base__range_ii_u64
7399
  workbuf_len() const {
7400
    return wuffs_base__io_transformer__workbuf_len(this);
7401
  }
7402
7403
#endif  // __cplusplus
7404
};  // struct wuffs_base__io_transformer__struct
7405
7406
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
7407
7408
// --------
7409
7410
extern const char wuffs_base__token_decoder__vtable_name[];
7411
7412
typedef struct wuffs_base__token_decoder__func_ptrs__struct {
7413
  wuffs_base__status (*decode_tokens)(
7414
    void* self,
7415
    wuffs_base__token_buffer* a_dst,
7416
    wuffs_base__io_buffer* a_src,
7417
    wuffs_base__slice_u8 a_workbuf);
7418
  uint64_t (*get_quirk)(
7419
    const void* self,
7420
    uint32_t a_key);
7421
  wuffs_base__status (*set_quirk)(
7422
    void* self,
7423
    uint32_t a_key,
7424
    uint64_t a_value);
7425
  wuffs_base__range_ii_u64 (*workbuf_len)(
7426
    const void* self);
7427
} wuffs_base__token_decoder__func_ptrs;
7428
7429
typedef struct wuffs_base__token_decoder__struct wuffs_base__token_decoder;
7430
7431
WUFFS_BASE__GENERATED_C_CODE
7432
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
7433
wuffs_base__token_decoder__decode_tokens(
7434
    wuffs_base__token_decoder* self,
7435
    wuffs_base__token_buffer* a_dst,
7436
    wuffs_base__io_buffer* a_src,
7437
    wuffs_base__slice_u8 a_workbuf);
7438
7439
WUFFS_BASE__GENERATED_C_CODE
7440
WUFFS_BASE__MAYBE_STATIC uint64_t
7441
wuffs_base__token_decoder__get_quirk(
7442
    const wuffs_base__token_decoder* self,
7443
    uint32_t a_key);
7444
7445
WUFFS_BASE__GENERATED_C_CODE
7446
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
7447
wuffs_base__token_decoder__set_quirk(
7448
    wuffs_base__token_decoder* self,
7449
    uint32_t a_key,
7450
    uint64_t a_value);
7451
7452
WUFFS_BASE__GENERATED_C_CODE
7453
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
7454
wuffs_base__token_decoder__workbuf_len(
7455
    const wuffs_base__token_decoder* self);
7456
7457
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
7458
7459
struct wuffs_base__token_decoder__struct {
7460
  struct {
7461
    uint32_t magic;
7462
    uint32_t active_coroutine;
7463
    wuffs_base__vtable first_vtable;
7464
  } private_impl;
7465
7466
#ifdef __cplusplus
7467
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
7468
  using unique_ptr = std::unique_ptr<wuffs_base__token_decoder, wuffs_unique_ptr_deleter>;
7469
#endif
7470
7471
  inline wuffs_base__status
7472
  decode_tokens(
7473
      wuffs_base__token_buffer* a_dst,
7474
      wuffs_base__io_buffer* a_src,
7475
      wuffs_base__slice_u8 a_workbuf) {
7476
    return wuffs_base__token_decoder__decode_tokens(
7477
        this, a_dst, a_src, a_workbuf);
7478
  }
7479
7480
  inline uint64_t
7481
  get_quirk(
7482
      uint32_t a_key) const {
7483
    return wuffs_base__token_decoder__get_quirk(
7484
        this, a_key);
7485
  }
7486
7487
  inline wuffs_base__status
7488
  set_quirk(
7489
      uint32_t a_key,
7490
      uint64_t a_value) {
7491
    return wuffs_base__token_decoder__set_quirk(
7492
        this, a_key, a_value);
7493
  }
7494
7495
  inline wuffs_base__range_ii_u64
7496
  workbuf_len() const {
7497
    return wuffs_base__token_decoder__workbuf_len(this);
7498
  }
7499
7500
#endif  // __cplusplus
7501
};  // struct wuffs_base__token_decoder__struct
7502
7503
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
7504
7505
// ----------------
7506
7507
#ifdef __cplusplus
7508
}  // extern "C"
7509
#endif
7510
7511
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ADLER32) || defined(WUFFS_NONMONOLITHIC)
7512
7513
// ---------------- Status Codes
7514
7515
// ---------------- Public Consts
7516
7517
// ---------------- Struct Declarations
7518
7519
typedef struct wuffs_adler32__hasher__struct wuffs_adler32__hasher;
7520
7521
#ifdef __cplusplus
7522
extern "C" {
7523
#endif
7524
7525
// ---------------- Public Initializer Prototypes
7526
7527
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
7528
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
7529
//
7530
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
7531
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
7532
7533
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
7534
wuffs_adler32__hasher__initialize(
7535
    wuffs_adler32__hasher* self,
7536
    size_t sizeof_star_self,
7537
    uint64_t wuffs_version,
7538
    uint32_t options);
7539
7540
size_t
7541
sizeof__wuffs_adler32__hasher(void);
7542
7543
// ---------------- Allocs
7544
7545
// These functions allocate and initialize Wuffs structs. They return NULL if
7546
// memory allocation fails. If they return non-NULL, there is no need to call
7547
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
7548
// calling free on the returned pointer. That pointer is effectively a C++
7549
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
7550
7551
wuffs_adler32__hasher*
7552
wuffs_adler32__hasher__alloc(void);
7553
7554
static inline wuffs_base__hasher_u32*
7555
wuffs_adler32__hasher__alloc_as__wuffs_base__hasher_u32(void) {
7556
  return (wuffs_base__hasher_u32*)(wuffs_adler32__hasher__alloc());
7557
}
7558
7559
// ---------------- Upcasts
7560
7561
static inline wuffs_base__hasher_u32*
7562
wuffs_adler32__hasher__upcast_as__wuffs_base__hasher_u32(
7563
    wuffs_adler32__hasher* p) {
7564
  return (wuffs_base__hasher_u32*)p;
7565
}
7566
7567
// ---------------- Public Function Prototypes
7568
7569
WUFFS_BASE__GENERATED_C_CODE
7570
WUFFS_BASE__MAYBE_STATIC uint64_t
7571
wuffs_adler32__hasher__get_quirk(
7572
    const wuffs_adler32__hasher* self,
7573
    uint32_t a_key);
7574
7575
WUFFS_BASE__GENERATED_C_CODE
7576
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
7577
wuffs_adler32__hasher__set_quirk(
7578
    wuffs_adler32__hasher* self,
7579
    uint32_t a_key,
7580
    uint64_t a_value);
7581
7582
WUFFS_BASE__GENERATED_C_CODE
7583
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
7584
wuffs_adler32__hasher__update(
7585
    wuffs_adler32__hasher* self,
7586
    wuffs_base__slice_u8 a_x);
7587
7588
WUFFS_BASE__GENERATED_C_CODE
7589
WUFFS_BASE__MAYBE_STATIC uint32_t
7590
wuffs_adler32__hasher__update_u32(
7591
    wuffs_adler32__hasher* self,
7592
    wuffs_base__slice_u8 a_x);
7593
7594
WUFFS_BASE__GENERATED_C_CODE
7595
WUFFS_BASE__MAYBE_STATIC uint32_t
7596
wuffs_adler32__hasher__checksum_u32(
7597
    const wuffs_adler32__hasher* self);
7598
7599
#ifdef __cplusplus
7600
}  // extern "C"
7601
#endif
7602
7603
// ---------------- Struct Definitions
7604
7605
// These structs' fields, and the sizeof them, are private implementation
7606
// details that aren't guaranteed to be stable across Wuffs versions.
7607
//
7608
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
7609
7610
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
7611
7612
struct wuffs_adler32__hasher__struct {
7613
  // Do not access the private_impl's or private_data's fields directly. There
7614
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
7615
  // the wuffs_foo__bar__baz functions.
7616
  //
7617
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
7618
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
7619
7620
  struct {
7621
    uint32_t magic;
7622
    uint32_t active_coroutine;
7623
    wuffs_base__vtable vtable_for__wuffs_base__hasher_u32;
7624
    wuffs_base__vtable null_vtable;
7625
7626
    uint32_t f_state;
7627
    bool f_started;
7628
7629
    wuffs_base__empty_struct (*choosy_up)(
7630
        wuffs_adler32__hasher* self,
7631
        wuffs_base__slice_u8 a_x);
7632
  } private_impl;
7633
7634
#ifdef __cplusplus
7635
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
7636
  using unique_ptr = std::unique_ptr<wuffs_adler32__hasher, wuffs_unique_ptr_deleter>;
7637
7638
  // On failure, the alloc_etc functions return nullptr. They don't throw.
7639
7640
  static inline unique_ptr
7641
  alloc() {
7642
    return unique_ptr(wuffs_adler32__hasher__alloc());
7643
  }
7644
7645
  static inline wuffs_base__hasher_u32::unique_ptr
7646
  alloc_as__wuffs_base__hasher_u32() {
7647
    return wuffs_base__hasher_u32::unique_ptr(
7648
        wuffs_adler32__hasher__alloc_as__wuffs_base__hasher_u32());
7649
  }
7650
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
7651
7652
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
7653
  // Disallow constructing or copying an object via standard C++ mechanisms,
7654
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
7655
  // size and field layout is not part of the public, stable, memory-safe API.
7656
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
7657
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
7658
  // their first argument) rather than tweaking bar.private_impl.qux fields.
7659
  //
7660
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
7661
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
7662
  // order to provide convenience methods. These forward on "this", so that you
7663
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
7664
  wuffs_adler32__hasher__struct() = delete;
7665
  wuffs_adler32__hasher__struct(const wuffs_adler32__hasher__struct&) = delete;
7666
  wuffs_adler32__hasher__struct& operator=(
7667
      const wuffs_adler32__hasher__struct&) = delete;
7668
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
7669
7670
#if !defined(WUFFS_IMPLEMENTATION)
7671
  // As above, the size of the struct is not part of the public API, and unless
7672
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
7673
  // allocated, not stack allocated. Its size is not intended to be known at
7674
  // compile time, but it is unfortunately divulged as a side effect of
7675
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
7676
  // instead of "sizeof T", invoking the operator. To make the two values
7677
  // different, so that passing the latter will be rejected by the initialize
7678
  // function, we add an arbitrary amount of dead weight.
7679
  uint8_t dead_weight[123000000];  // 123 MB.
7680
#endif  // !defined(WUFFS_IMPLEMENTATION)
7681
7682
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
7683
  initialize(
7684
      size_t sizeof_star_self,
7685
      uint64_t wuffs_version,
7686
      uint32_t options) {
7687
    return wuffs_adler32__hasher__initialize(
7688
        this, sizeof_star_self, wuffs_version, options);
7689
  }
7690
7691
  inline wuffs_base__hasher_u32*
7692
  upcast_as__wuffs_base__hasher_u32() {
7693
    return (wuffs_base__hasher_u32*)this;
7694
  }
7695
7696
  inline uint64_t
7697
  get_quirk(
7698
      uint32_t a_key) const {
7699
    return wuffs_adler32__hasher__get_quirk(this, a_key);
7700
  }
7701
7702
  inline wuffs_base__status
7703
  set_quirk(
7704
      uint32_t a_key,
7705
      uint64_t a_value) {
7706
    return wuffs_adler32__hasher__set_quirk(this, a_key, a_value);
7707
  }
7708
7709
  inline wuffs_base__empty_struct
7710
  update(
7711
      wuffs_base__slice_u8 a_x) {
7712
    return wuffs_adler32__hasher__update(this, a_x);
7713
  }
7714
7715
  inline uint32_t
7716
  update_u32(
7717
      wuffs_base__slice_u8 a_x) {
7718
    return wuffs_adler32__hasher__update_u32(this, a_x);
7719
  }
7720
7721
  inline uint32_t
7722
  checksum_u32() const {
7723
    return wuffs_adler32__hasher__checksum_u32(this);
7724
  }
7725
7726
#endif  // __cplusplus
7727
};  // struct wuffs_adler32__hasher__struct
7728
7729
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
7730
7731
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ADLER32) || defined(WUFFS_NONMONOLITHIC)
7732
7733
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BMP) || defined(WUFFS_NONMONOLITHIC)
7734
7735
// ---------------- Status Codes
7736
7737
extern const char wuffs_bmp__error__bad_header[];
7738
extern const char wuffs_bmp__error__bad_rle_compression[];
7739
extern const char wuffs_bmp__error__truncated_input[];
7740
extern const char wuffs_bmp__error__unsupported_bmp_file[];
7741
7742
// ---------------- Public Consts
7743
7744
#define WUFFS_BMP__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u
7745
7746
// ---------------- Struct Declarations
7747
7748
typedef struct wuffs_bmp__decoder__struct wuffs_bmp__decoder;
7749
7750
#ifdef __cplusplus
7751
extern "C" {
7752
#endif
7753
7754
// ---------------- Public Initializer Prototypes
7755
7756
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
7757
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
7758
//
7759
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
7760
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
7761
7762
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
7763
wuffs_bmp__decoder__initialize(
7764
    wuffs_bmp__decoder* self,
7765
    size_t sizeof_star_self,
7766
    uint64_t wuffs_version,
7767
    uint32_t options);
7768
7769
size_t
7770
sizeof__wuffs_bmp__decoder(void);
7771
7772
// ---------------- Allocs
7773
7774
// These functions allocate and initialize Wuffs structs. They return NULL if
7775
// memory allocation fails. If they return non-NULL, there is no need to call
7776
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
7777
// calling free on the returned pointer. That pointer is effectively a C++
7778
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
7779
7780
wuffs_bmp__decoder*
7781
wuffs_bmp__decoder__alloc(void);
7782
7783
static inline wuffs_base__image_decoder*
7784
wuffs_bmp__decoder__alloc_as__wuffs_base__image_decoder(void) {
7785
  return (wuffs_base__image_decoder*)(wuffs_bmp__decoder__alloc());
7786
}
7787
7788
// ---------------- Upcasts
7789
7790
static inline wuffs_base__image_decoder*
7791
wuffs_bmp__decoder__upcast_as__wuffs_base__image_decoder(
7792
    wuffs_bmp__decoder* p) {
7793
  return (wuffs_base__image_decoder*)p;
7794
}
7795
7796
// ---------------- Public Function Prototypes
7797
7798
WUFFS_BASE__GENERATED_C_CODE
7799
WUFFS_BASE__MAYBE_STATIC uint64_t
7800
wuffs_bmp__decoder__get_quirk(
7801
    const wuffs_bmp__decoder* self,
7802
    uint32_t a_key);
7803
7804
WUFFS_BASE__GENERATED_C_CODE
7805
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
7806
wuffs_bmp__decoder__set_quirk(
7807
    wuffs_bmp__decoder* self,
7808
    uint32_t a_key,
7809
    uint64_t a_value);
7810
7811
WUFFS_BASE__GENERATED_C_CODE
7812
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
7813
wuffs_bmp__decoder__decode_image_config(
7814
    wuffs_bmp__decoder* self,
7815
    wuffs_base__image_config* a_dst,
7816
    wuffs_base__io_buffer* a_src);
7817
7818
WUFFS_BASE__GENERATED_C_CODE
7819
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
7820
wuffs_bmp__decoder__decode_frame_config(
7821
    wuffs_bmp__decoder* self,
7822
    wuffs_base__frame_config* a_dst,
7823
    wuffs_base__io_buffer* a_src);
7824
7825
WUFFS_BASE__GENERATED_C_CODE
7826
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
7827
wuffs_bmp__decoder__decode_frame(
7828
    wuffs_bmp__decoder* self,
7829
    wuffs_base__pixel_buffer* a_dst,
7830
    wuffs_base__io_buffer* a_src,
7831
    wuffs_base__pixel_blend a_blend,
7832
    wuffs_base__slice_u8 a_workbuf,
7833
    wuffs_base__decode_frame_options* a_opts);
7834
7835
WUFFS_BASE__GENERATED_C_CODE
7836
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
7837
wuffs_bmp__decoder__frame_dirty_rect(
7838
    const wuffs_bmp__decoder* self);
7839
7840
WUFFS_BASE__GENERATED_C_CODE
7841
WUFFS_BASE__MAYBE_STATIC uint32_t
7842
wuffs_bmp__decoder__num_animation_loops(
7843
    const wuffs_bmp__decoder* self);
7844
7845
WUFFS_BASE__GENERATED_C_CODE
7846
WUFFS_BASE__MAYBE_STATIC uint64_t
7847
wuffs_bmp__decoder__num_decoded_frame_configs(
7848
    const wuffs_bmp__decoder* self);
7849
7850
WUFFS_BASE__GENERATED_C_CODE
7851
WUFFS_BASE__MAYBE_STATIC uint64_t
7852
wuffs_bmp__decoder__num_decoded_frames(
7853
    const wuffs_bmp__decoder* self);
7854
7855
WUFFS_BASE__GENERATED_C_CODE
7856
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
7857
wuffs_bmp__decoder__restart_frame(
7858
    wuffs_bmp__decoder* self,
7859
    uint64_t a_index,
7860
    uint64_t a_io_position);
7861
7862
WUFFS_BASE__GENERATED_C_CODE
7863
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
7864
wuffs_bmp__decoder__set_report_metadata(
7865
    wuffs_bmp__decoder* self,
7866
    uint32_t a_fourcc,
7867
    bool a_report);
7868
7869
WUFFS_BASE__GENERATED_C_CODE
7870
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
7871
wuffs_bmp__decoder__tell_me_more(
7872
    wuffs_bmp__decoder* self,
7873
    wuffs_base__io_buffer* a_dst,
7874
    wuffs_base__more_information* a_minfo,
7875
    wuffs_base__io_buffer* a_src);
7876
7877
WUFFS_BASE__GENERATED_C_CODE
7878
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
7879
wuffs_bmp__decoder__workbuf_len(
7880
    const wuffs_bmp__decoder* self);
7881
7882
#ifdef __cplusplus
7883
}  // extern "C"
7884
#endif
7885
7886
// ---------------- Struct Definitions
7887
7888
// These structs' fields, and the sizeof them, are private implementation
7889
// details that aren't guaranteed to be stable across Wuffs versions.
7890
//
7891
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
7892
7893
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
7894
7895
struct wuffs_bmp__decoder__struct {
7896
  // Do not access the private_impl's or private_data's fields directly. There
7897
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
7898
  // the wuffs_foo__bar__baz functions.
7899
  //
7900
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
7901
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
7902
7903
  struct {
7904
    uint32_t magic;
7905
    uint32_t active_coroutine;
7906
    wuffs_base__vtable vtable_for__wuffs_base__image_decoder;
7907
    wuffs_base__vtable null_vtable;
7908
7909
    uint32_t f_width;
7910
    uint32_t f_height;
7911
    uint8_t f_call_sequence;
7912
    bool f_top_down;
7913
    uint32_t f_pad_per_row;
7914
    uint32_t f_src_pixfmt;
7915
    uint32_t f_io_redirect_fourcc;
7916
    uint64_t f_io_redirect_pos;
7917
    uint64_t f_frame_config_io_position;
7918
    uint32_t f_bitmap_info_len;
7919
    uint32_t f_padding;
7920
    uint32_t f_bits_per_pixel;
7921
    uint32_t f_compression;
7922
    uint32_t f_channel_masks[4];
7923
    uint8_t f_channel_shifts[4];
7924
    uint8_t f_channel_num_bits[4];
7925
    uint32_t f_dst_x;
7926
    uint32_t f_dst_y;
7927
    uint32_t f_dst_y_inc;
7928
    uint32_t f_pending_pad;
7929
    uint32_t f_rle_state;
7930
    uint32_t f_rle_length;
7931
    uint8_t f_rle_delta_x;
7932
    bool f_rle_padded;
7933
    wuffs_base__pixel_swizzler f_swizzler;
7934
7935
    uint32_t p_decode_image_config;
7936
    uint32_t p_do_decode_image_config;
7937
    uint32_t p_decode_frame_config;
7938
    uint32_t p_do_decode_frame_config;
7939
    uint32_t p_decode_frame;
7940
    uint32_t p_do_decode_frame;
7941
    uint32_t p_tell_me_more;
7942
    uint32_t p_read_palette;
7943
  } private_impl;
7944
7945
  struct {
7946
    uint8_t f_scratch[2048];
7947
    uint8_t f_src_palette[1024];
7948
7949
    struct {
7950
      uint64_t scratch;
7951
    } s_do_decode_image_config;
7952
    struct {
7953
      uint64_t scratch;
7954
    } s_do_decode_frame;
7955
    struct {
7956
      uint32_t v_i;
7957
      uint64_t scratch;
7958
    } s_read_palette;
7959
  } private_data;
7960
7961
#ifdef __cplusplus
7962
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
7963
  using unique_ptr = std::unique_ptr<wuffs_bmp__decoder, wuffs_unique_ptr_deleter>;
7964
7965
  // On failure, the alloc_etc functions return nullptr. They don't throw.
7966
7967
  static inline unique_ptr
7968
  alloc() {
7969
    return unique_ptr(wuffs_bmp__decoder__alloc());
7970
  }
7971
7972
  static inline wuffs_base__image_decoder::unique_ptr
7973
  alloc_as__wuffs_base__image_decoder() {
7974
    return wuffs_base__image_decoder::unique_ptr(
7975
        wuffs_bmp__decoder__alloc_as__wuffs_base__image_decoder());
7976
  }
7977
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
7978
7979
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
7980
  // Disallow constructing or copying an object via standard C++ mechanisms,
7981
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
7982
  // size and field layout is not part of the public, stable, memory-safe API.
7983
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
7984
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
7985
  // their first argument) rather than tweaking bar.private_impl.qux fields.
7986
  //
7987
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
7988
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
7989
  // order to provide convenience methods. These forward on "this", so that you
7990
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
7991
  wuffs_bmp__decoder__struct() = delete;
7992
  wuffs_bmp__decoder__struct(const wuffs_bmp__decoder__struct&) = delete;
7993
  wuffs_bmp__decoder__struct& operator=(
7994
      const wuffs_bmp__decoder__struct&) = delete;
7995
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
7996
7997
#if !defined(WUFFS_IMPLEMENTATION)
7998
  // As above, the size of the struct is not part of the public API, and unless
7999
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
8000
  // allocated, not stack allocated. Its size is not intended to be known at
8001
  // compile time, but it is unfortunately divulged as a side effect of
8002
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
8003
  // instead of "sizeof T", invoking the operator. To make the two values
8004
  // different, so that passing the latter will be rejected by the initialize
8005
  // function, we add an arbitrary amount of dead weight.
8006
  uint8_t dead_weight[123000000];  // 123 MB.
8007
#endif  // !defined(WUFFS_IMPLEMENTATION)
8008
8009
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
8010
  initialize(
8011
      size_t sizeof_star_self,
8012
      uint64_t wuffs_version,
8013
      uint32_t options) {
8014
    return wuffs_bmp__decoder__initialize(
8015
        this, sizeof_star_self, wuffs_version, options);
8016
  }
8017
8018
  inline wuffs_base__image_decoder*
8019
  upcast_as__wuffs_base__image_decoder() {
8020
    return (wuffs_base__image_decoder*)this;
8021
  }
8022
8023
  inline uint64_t
8024
  get_quirk(
8025
      uint32_t a_key) const {
8026
    return wuffs_bmp__decoder__get_quirk(this, a_key);
8027
  }
8028
8029
  inline wuffs_base__status
8030
  set_quirk(
8031
      uint32_t a_key,
8032
      uint64_t a_value) {
8033
    return wuffs_bmp__decoder__set_quirk(this, a_key, a_value);
8034
  }
8035
8036
  inline wuffs_base__status
8037
  decode_image_config(
8038
      wuffs_base__image_config* a_dst,
8039
      wuffs_base__io_buffer* a_src) {
8040
    return wuffs_bmp__decoder__decode_image_config(this, a_dst, a_src);
8041
  }
8042
8043
  inline wuffs_base__status
8044
  decode_frame_config(
8045
      wuffs_base__frame_config* a_dst,
8046
      wuffs_base__io_buffer* a_src) {
8047
    return wuffs_bmp__decoder__decode_frame_config(this, a_dst, a_src);
8048
  }
8049
8050
  inline wuffs_base__status
8051
  decode_frame(
8052
      wuffs_base__pixel_buffer* a_dst,
8053
      wuffs_base__io_buffer* a_src,
8054
      wuffs_base__pixel_blend a_blend,
8055
      wuffs_base__slice_u8 a_workbuf,
8056
      wuffs_base__decode_frame_options* a_opts) {
8057
    return wuffs_bmp__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts);
8058
  }
8059
8060
  inline wuffs_base__rect_ie_u32
8061
  frame_dirty_rect() const {
8062
    return wuffs_bmp__decoder__frame_dirty_rect(this);
8063
  }
8064
8065
  inline uint32_t
8066
  num_animation_loops() const {
8067
    return wuffs_bmp__decoder__num_animation_loops(this);
8068
  }
8069
8070
  inline uint64_t
8071
  num_decoded_frame_configs() const {
8072
    return wuffs_bmp__decoder__num_decoded_frame_configs(this);
8073
  }
8074
8075
  inline uint64_t
8076
  num_decoded_frames() const {
8077
    return wuffs_bmp__decoder__num_decoded_frames(this);
8078
  }
8079
8080
  inline wuffs_base__status
8081
  restart_frame(
8082
      uint64_t a_index,
8083
      uint64_t a_io_position) {
8084
    return wuffs_bmp__decoder__restart_frame(this, a_index, a_io_position);
8085
  }
8086
8087
  inline wuffs_base__empty_struct
8088
  set_report_metadata(
8089
      uint32_t a_fourcc,
8090
      bool a_report) {
8091
    return wuffs_bmp__decoder__set_report_metadata(this, a_fourcc, a_report);
8092
  }
8093
8094
  inline wuffs_base__status
8095
  tell_me_more(
8096
      wuffs_base__io_buffer* a_dst,
8097
      wuffs_base__more_information* a_minfo,
8098
      wuffs_base__io_buffer* a_src) {
8099
    return wuffs_bmp__decoder__tell_me_more(this, a_dst, a_minfo, a_src);
8100
  }
8101
8102
  inline wuffs_base__range_ii_u64
8103
  workbuf_len() const {
8104
    return wuffs_bmp__decoder__workbuf_len(this);
8105
  }
8106
8107
#endif  // __cplusplus
8108
};  // struct wuffs_bmp__decoder__struct
8109
8110
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
8111
8112
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BMP) || defined(WUFFS_NONMONOLITHIC)
8113
8114
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BZIP2) || defined(WUFFS_NONMONOLITHIC)
8115
8116
// ---------------- Status Codes
8117
8118
extern const char wuffs_bzip2__error__bad_huffman_code_over_subscribed[];
8119
extern const char wuffs_bzip2__error__bad_huffman_code_under_subscribed[];
8120
extern const char wuffs_bzip2__error__bad_block_header[];
8121
extern const char wuffs_bzip2__error__bad_block_length[];
8122
extern const char wuffs_bzip2__error__bad_checksum[];
8123
extern const char wuffs_bzip2__error__bad_header[];
8124
extern const char wuffs_bzip2__error__bad_number_of_sections[];
8125
extern const char wuffs_bzip2__error__truncated_input[];
8126
extern const char wuffs_bzip2__error__unsupported_block_randomization[];
8127
8128
// ---------------- Public Consts
8129
8130
#define WUFFS_BZIP2__DECODER_DST_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0u
8131
8132
#define WUFFS_BZIP2__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u
8133
8134
// ---------------- Struct Declarations
8135
8136
typedef struct wuffs_bzip2__decoder__struct wuffs_bzip2__decoder;
8137
8138
#ifdef __cplusplus
8139
extern "C" {
8140
#endif
8141
8142
// ---------------- Public Initializer Prototypes
8143
8144
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
8145
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
8146
//
8147
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
8148
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
8149
8150
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
8151
wuffs_bzip2__decoder__initialize(
8152
    wuffs_bzip2__decoder* self,
8153
    size_t sizeof_star_self,
8154
    uint64_t wuffs_version,
8155
    uint32_t options);
8156
8157
size_t
8158
sizeof__wuffs_bzip2__decoder(void);
8159
8160
// ---------------- Allocs
8161
8162
// These functions allocate and initialize Wuffs structs. They return NULL if
8163
// memory allocation fails. If they return non-NULL, there is no need to call
8164
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
8165
// calling free on the returned pointer. That pointer is effectively a C++
8166
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
8167
8168
wuffs_bzip2__decoder*
8169
wuffs_bzip2__decoder__alloc(void);
8170
8171
static inline wuffs_base__io_transformer*
8172
wuffs_bzip2__decoder__alloc_as__wuffs_base__io_transformer(void) {
8173
  return (wuffs_base__io_transformer*)(wuffs_bzip2__decoder__alloc());
8174
}
8175
8176
// ---------------- Upcasts
8177
8178
static inline wuffs_base__io_transformer*
8179
wuffs_bzip2__decoder__upcast_as__wuffs_base__io_transformer(
8180
    wuffs_bzip2__decoder* p) {
8181
  return (wuffs_base__io_transformer*)p;
8182
}
8183
8184
// ---------------- Public Function Prototypes
8185
8186
WUFFS_BASE__GENERATED_C_CODE
8187
WUFFS_BASE__MAYBE_STATIC uint64_t
8188
wuffs_bzip2__decoder__get_quirk(
8189
    const wuffs_bzip2__decoder* self,
8190
    uint32_t a_key);
8191
8192
WUFFS_BASE__GENERATED_C_CODE
8193
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
8194
wuffs_bzip2__decoder__set_quirk(
8195
    wuffs_bzip2__decoder* self,
8196
    uint32_t a_key,
8197
    uint64_t a_value);
8198
8199
WUFFS_BASE__GENERATED_C_CODE
8200
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
8201
wuffs_bzip2__decoder__dst_history_retain_length(
8202
    const wuffs_bzip2__decoder* self);
8203
8204
WUFFS_BASE__GENERATED_C_CODE
8205
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
8206
wuffs_bzip2__decoder__workbuf_len(
8207
    const wuffs_bzip2__decoder* self);
8208
8209
WUFFS_BASE__GENERATED_C_CODE
8210
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
8211
wuffs_bzip2__decoder__transform_io(
8212
    wuffs_bzip2__decoder* self,
8213
    wuffs_base__io_buffer* a_dst,
8214
    wuffs_base__io_buffer* a_src,
8215
    wuffs_base__slice_u8 a_workbuf);
8216
8217
#ifdef __cplusplus
8218
}  // extern "C"
8219
#endif
8220
8221
// ---------------- Struct Definitions
8222
8223
// These structs' fields, and the sizeof them, are private implementation
8224
// details that aren't guaranteed to be stable across Wuffs versions.
8225
//
8226
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
8227
8228
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
8229
8230
struct wuffs_bzip2__decoder__struct {
8231
  // Do not access the private_impl's or private_data's fields directly. There
8232
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
8233
  // the wuffs_foo__bar__baz functions.
8234
  //
8235
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
8236
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
8237
8238
  struct {
8239
    uint32_t magic;
8240
    uint32_t active_coroutine;
8241
    wuffs_base__vtable vtable_for__wuffs_base__io_transformer;
8242
    wuffs_base__vtable null_vtable;
8243
8244
    uint32_t f_bits;
8245
    uint32_t f_n_bits;
8246
    uint32_t f_max_incl_block_size;
8247
    uint32_t f_block_size;
8248
    bool f_decode_huffman_finished;
8249
    uint8_t f_decode_huffman_which;
8250
    uint32_t f_decode_huffman_ticks;
8251
    uint32_t f_decode_huffman_section;
8252
    uint32_t f_decode_huffman_run_shift;
8253
    uint32_t f_flush_pointer;
8254
    uint32_t f_flush_repeat_count;
8255
    uint8_t f_flush_prev;
8256
    bool f_ignore_checksum;
8257
    uint32_t f_final_checksum_have;
8258
    uint32_t f_block_checksum_have;
8259
    uint32_t f_block_checksum_want;
8260
    uint32_t f_original_pointer;
8261
    uint32_t f_num_symbols;
8262
    uint32_t f_num_huffman_codes;
8263
    uint32_t f_num_sections;
8264
    uint32_t f_code_lengths_bitmask;
8265
8266
    uint32_t p_transform_io;
8267
    uint32_t p_do_transform_io;
8268
    uint32_t p_prepare_block;
8269
    uint32_t p_read_code_lengths;
8270
    uint32_t p_flush_slow;
8271
    uint32_t p_decode_huffman_slow;
8272
  } private_impl;
8273
8274
  struct {
8275
    uint32_t f_scratch;
8276
    uint32_t f_letter_counts[256];
8277
    uint8_t f_presence[256];
8278
    uint8_t f_mtft[256];
8279
    uint8_t f_huffman_selectors[32768];
8280
    uint16_t f_huffman_trees[6][257][2];
8281
    uint16_t f_huffman_tables[6][256];
8282
    uint32_t f_bwt[1048576];
8283
8284
    struct {
8285
      uint32_t v_i;
8286
      uint64_t v_tag;
8287
      uint32_t v_final_checksum_want;
8288
    } s_do_transform_io;
8289
    struct {
8290
      uint32_t v_i;
8291
      uint32_t v_selector;
8292
    } s_prepare_block;
8293
    struct {
8294
      uint32_t v_i;
8295
      uint32_t v_code_length;
8296
    } s_read_code_lengths;
8297
    struct {
8298
      uint32_t v_flush_pointer;
8299
      uint32_t v_flush_repeat_count;
8300
      uint8_t v_flush_prev;
8301
      uint32_t v_block_checksum_have;
8302
      uint32_t v_block_size;
8303
      uint8_t v_curr;
8304
      uint64_t scratch;
8305
    } s_flush_slow;
8306
    struct {
8307
      uint32_t v_node_index;
8308
    } s_decode_huffman_slow;
8309
  } private_data;
8310
8311
#ifdef __cplusplus
8312
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
8313
  using unique_ptr = std::unique_ptr<wuffs_bzip2__decoder, wuffs_unique_ptr_deleter>;
8314
8315
  // On failure, the alloc_etc functions return nullptr. They don't throw.
8316
8317
  static inline unique_ptr
8318
  alloc() {
8319
    return unique_ptr(wuffs_bzip2__decoder__alloc());
8320
  }
8321
8322
  static inline wuffs_base__io_transformer::unique_ptr
8323
  alloc_as__wuffs_base__io_transformer() {
8324
    return wuffs_base__io_transformer::unique_ptr(
8325
        wuffs_bzip2__decoder__alloc_as__wuffs_base__io_transformer());
8326
  }
8327
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
8328
8329
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
8330
  // Disallow constructing or copying an object via standard C++ mechanisms,
8331
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
8332
  // size and field layout is not part of the public, stable, memory-safe API.
8333
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
8334
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
8335
  // their first argument) rather than tweaking bar.private_impl.qux fields.
8336
  //
8337
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
8338
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
8339
  // order to provide convenience methods. These forward on "this", so that you
8340
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
8341
  wuffs_bzip2__decoder__struct() = delete;
8342
  wuffs_bzip2__decoder__struct(const wuffs_bzip2__decoder__struct&) = delete;
8343
  wuffs_bzip2__decoder__struct& operator=(
8344
      const wuffs_bzip2__decoder__struct&) = delete;
8345
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
8346
8347
#if !defined(WUFFS_IMPLEMENTATION)
8348
  // As above, the size of the struct is not part of the public API, and unless
8349
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
8350
  // allocated, not stack allocated. Its size is not intended to be known at
8351
  // compile time, but it is unfortunately divulged as a side effect of
8352
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
8353
  // instead of "sizeof T", invoking the operator. To make the two values
8354
  // different, so that passing the latter will be rejected by the initialize
8355
  // function, we add an arbitrary amount of dead weight.
8356
  uint8_t dead_weight[123000000];  // 123 MB.
8357
#endif  // !defined(WUFFS_IMPLEMENTATION)
8358
8359
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
8360
  initialize(
8361
      size_t sizeof_star_self,
8362
      uint64_t wuffs_version,
8363
      uint32_t options) {
8364
    return wuffs_bzip2__decoder__initialize(
8365
        this, sizeof_star_self, wuffs_version, options);
8366
  }
8367
8368
  inline wuffs_base__io_transformer*
8369
  upcast_as__wuffs_base__io_transformer() {
8370
    return (wuffs_base__io_transformer*)this;
8371
  }
8372
8373
  inline uint64_t
8374
  get_quirk(
8375
      uint32_t a_key) const {
8376
    return wuffs_bzip2__decoder__get_quirk(this, a_key);
8377
  }
8378
8379
  inline wuffs_base__status
8380
  set_quirk(
8381
      uint32_t a_key,
8382
      uint64_t a_value) {
8383
    return wuffs_bzip2__decoder__set_quirk(this, a_key, a_value);
8384
  }
8385
8386
  inline wuffs_base__optional_u63
8387
  dst_history_retain_length() const {
8388
    return wuffs_bzip2__decoder__dst_history_retain_length(this);
8389
  }
8390
8391
  inline wuffs_base__range_ii_u64
8392
  workbuf_len() const {
8393
    return wuffs_bzip2__decoder__workbuf_len(this);
8394
  }
8395
8396
  inline wuffs_base__status
8397
  transform_io(
8398
      wuffs_base__io_buffer* a_dst,
8399
      wuffs_base__io_buffer* a_src,
8400
      wuffs_base__slice_u8 a_workbuf) {
8401
    return wuffs_bzip2__decoder__transform_io(this, a_dst, a_src, a_workbuf);
8402
  }
8403
8404
#endif  // __cplusplus
8405
};  // struct wuffs_bzip2__decoder__struct
8406
8407
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
8408
8409
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BZIP2) || defined(WUFFS_NONMONOLITHIC)
8410
8411
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CBOR) || defined(WUFFS_NONMONOLITHIC)
8412
8413
// ---------------- Status Codes
8414
8415
extern const char wuffs_cbor__error__bad_input[];
8416
extern const char wuffs_cbor__error__unsupported_recursion_depth[];
8417
8418
// ---------------- Public Consts
8419
8420
#define WUFFS_CBOR__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u
8421
8422
#define WUFFS_CBOR__DECODER_DEPTH_MAX_INCL 1024u
8423
8424
#define WUFFS_CBOR__DECODER_DST_TOKEN_BUFFER_LENGTH_MIN_INCL 2u
8425
8426
#define WUFFS_CBOR__DECODER_SRC_IO_BUFFER_LENGTH_MIN_INCL 9u
8427
8428
#define WUFFS_CBOR__TOKEN_VALUE_MAJOR 731642u
8429
8430
#define WUFFS_CBOR__TOKEN_VALUE_MINOR__DETAIL_MASK 262143u
8431
8432
#define WUFFS_CBOR__TOKEN_VALUE_MINOR__MINUS_1_MINUS_X 16777216u
8433
8434
#define WUFFS_CBOR__TOKEN_VALUE_MINOR__SIMPLE_VALUE 8388608u
8435
8436
#define WUFFS_CBOR__TOKEN_VALUE_MINOR__TAG 4194304u
8437
8438
// ---------------- Struct Declarations
8439
8440
typedef struct wuffs_cbor__decoder__struct wuffs_cbor__decoder;
8441
8442
#ifdef __cplusplus
8443
extern "C" {
8444
#endif
8445
8446
// ---------------- Public Initializer Prototypes
8447
8448
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
8449
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
8450
//
8451
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
8452
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
8453
8454
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
8455
wuffs_cbor__decoder__initialize(
8456
    wuffs_cbor__decoder* self,
8457
    size_t sizeof_star_self,
8458
    uint64_t wuffs_version,
8459
    uint32_t options);
8460
8461
size_t
8462
sizeof__wuffs_cbor__decoder(void);
8463
8464
// ---------------- Allocs
8465
8466
// These functions allocate and initialize Wuffs structs. They return NULL if
8467
// memory allocation fails. If they return non-NULL, there is no need to call
8468
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
8469
// calling free on the returned pointer. That pointer is effectively a C++
8470
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
8471
8472
wuffs_cbor__decoder*
8473
wuffs_cbor__decoder__alloc(void);
8474
8475
static inline wuffs_base__token_decoder*
8476
wuffs_cbor__decoder__alloc_as__wuffs_base__token_decoder(void) {
8477
  return (wuffs_base__token_decoder*)(wuffs_cbor__decoder__alloc());
8478
}
8479
8480
// ---------------- Upcasts
8481
8482
static inline wuffs_base__token_decoder*
8483
wuffs_cbor__decoder__upcast_as__wuffs_base__token_decoder(
8484
    wuffs_cbor__decoder* p) {
8485
  return (wuffs_base__token_decoder*)p;
8486
}
8487
8488
// ---------------- Public Function Prototypes
8489
8490
WUFFS_BASE__GENERATED_C_CODE
8491
WUFFS_BASE__MAYBE_STATIC uint64_t
8492
wuffs_cbor__decoder__get_quirk(
8493
    const wuffs_cbor__decoder* self,
8494
    uint32_t a_key);
8495
8496
WUFFS_BASE__GENERATED_C_CODE
8497
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
8498
wuffs_cbor__decoder__set_quirk(
8499
    wuffs_cbor__decoder* self,
8500
    uint32_t a_key,
8501
    uint64_t a_value);
8502
8503
WUFFS_BASE__GENERATED_C_CODE
8504
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
8505
wuffs_cbor__decoder__workbuf_len(
8506
    const wuffs_cbor__decoder* self);
8507
8508
WUFFS_BASE__GENERATED_C_CODE
8509
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
8510
wuffs_cbor__decoder__decode_tokens(
8511
    wuffs_cbor__decoder* self,
8512
    wuffs_base__token_buffer* a_dst,
8513
    wuffs_base__io_buffer* a_src,
8514
    wuffs_base__slice_u8 a_workbuf);
8515
8516
#ifdef __cplusplus
8517
}  // extern "C"
8518
#endif
8519
8520
// ---------------- Struct Definitions
8521
8522
// These structs' fields, and the sizeof them, are private implementation
8523
// details that aren't guaranteed to be stable across Wuffs versions.
8524
//
8525
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
8526
8527
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
8528
8529
struct wuffs_cbor__decoder__struct {
8530
  // Do not access the private_impl's or private_data's fields directly. There
8531
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
8532
  // the wuffs_foo__bar__baz functions.
8533
  //
8534
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
8535
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
8536
8537
  struct {
8538
    uint32_t magic;
8539
    uint32_t active_coroutine;
8540
    wuffs_base__vtable vtable_for__wuffs_base__token_decoder;
8541
    wuffs_base__vtable null_vtable;
8542
8543
    bool f_end_of_data;
8544
8545
    uint32_t p_decode_tokens;
8546
  } private_impl;
8547
8548
  struct {
8549
    uint32_t f_stack[64];
8550
    uint64_t f_container_num_remaining[1024];
8551
8552
    struct {
8553
      uint64_t v_string_length;
8554
      uint32_t v_depth;
8555
      bool v_tagged;
8556
      uint8_t v_indefinite_string_major_type;
8557
    } s_decode_tokens;
8558
  } private_data;
8559
8560
#ifdef __cplusplus
8561
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
8562
  using unique_ptr = std::unique_ptr<wuffs_cbor__decoder, wuffs_unique_ptr_deleter>;
8563
8564
  // On failure, the alloc_etc functions return nullptr. They don't throw.
8565
8566
  static inline unique_ptr
8567
  alloc() {
8568
    return unique_ptr(wuffs_cbor__decoder__alloc());
8569
  }
8570
8571
  static inline wuffs_base__token_decoder::unique_ptr
8572
  alloc_as__wuffs_base__token_decoder() {
8573
    return wuffs_base__token_decoder::unique_ptr(
8574
        wuffs_cbor__decoder__alloc_as__wuffs_base__token_decoder());
8575
  }
8576
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
8577
8578
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
8579
  // Disallow constructing or copying an object via standard C++ mechanisms,
8580
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
8581
  // size and field layout is not part of the public, stable, memory-safe API.
8582
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
8583
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
8584
  // their first argument) rather than tweaking bar.private_impl.qux fields.
8585
  //
8586
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
8587
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
8588
  // order to provide convenience methods. These forward on "this", so that you
8589
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
8590
  wuffs_cbor__decoder__struct() = delete;
8591
  wuffs_cbor__decoder__struct(const wuffs_cbor__decoder__struct&) = delete;
8592
  wuffs_cbor__decoder__struct& operator=(
8593
      const wuffs_cbor__decoder__struct&) = delete;
8594
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
8595
8596
#if !defined(WUFFS_IMPLEMENTATION)
8597
  // As above, the size of the struct is not part of the public API, and unless
8598
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
8599
  // allocated, not stack allocated. Its size is not intended to be known at
8600
  // compile time, but it is unfortunately divulged as a side effect of
8601
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
8602
  // instead of "sizeof T", invoking the operator. To make the two values
8603
  // different, so that passing the latter will be rejected by the initialize
8604
  // function, we add an arbitrary amount of dead weight.
8605
  uint8_t dead_weight[123000000];  // 123 MB.
8606
#endif  // !defined(WUFFS_IMPLEMENTATION)
8607
8608
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
8609
  initialize(
8610
      size_t sizeof_star_self,
8611
      uint64_t wuffs_version,
8612
      uint32_t options) {
8613
    return wuffs_cbor__decoder__initialize(
8614
        this, sizeof_star_self, wuffs_version, options);
8615
  }
8616
8617
  inline wuffs_base__token_decoder*
8618
  upcast_as__wuffs_base__token_decoder() {
8619
    return (wuffs_base__token_decoder*)this;
8620
  }
8621
8622
  inline uint64_t
8623
  get_quirk(
8624
      uint32_t a_key) const {
8625
    return wuffs_cbor__decoder__get_quirk(this, a_key);
8626
  }
8627
8628
  inline wuffs_base__status
8629
  set_quirk(
8630
      uint32_t a_key,
8631
      uint64_t a_value) {
8632
    return wuffs_cbor__decoder__set_quirk(this, a_key, a_value);
8633
  }
8634
8635
  inline wuffs_base__range_ii_u64
8636
  workbuf_len() const {
8637
    return wuffs_cbor__decoder__workbuf_len(this);
8638
  }
8639
8640
  inline wuffs_base__status
8641
  decode_tokens(
8642
      wuffs_base__token_buffer* a_dst,
8643
      wuffs_base__io_buffer* a_src,
8644
      wuffs_base__slice_u8 a_workbuf) {
8645
    return wuffs_cbor__decoder__decode_tokens(this, a_dst, a_src, a_workbuf);
8646
  }
8647
8648
#endif  // __cplusplus
8649
};  // struct wuffs_cbor__decoder__struct
8650
8651
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
8652
8653
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CBOR) || defined(WUFFS_NONMONOLITHIC)
8654
8655
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC32) || defined(WUFFS_NONMONOLITHIC)
8656
8657
// ---------------- Status Codes
8658
8659
// ---------------- Public Consts
8660
8661
// ---------------- Struct Declarations
8662
8663
typedef struct wuffs_crc32__ieee_hasher__struct wuffs_crc32__ieee_hasher;
8664
8665
#ifdef __cplusplus
8666
extern "C" {
8667
#endif
8668
8669
// ---------------- Public Initializer Prototypes
8670
8671
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
8672
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
8673
//
8674
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
8675
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
8676
8677
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
8678
wuffs_crc32__ieee_hasher__initialize(
8679
    wuffs_crc32__ieee_hasher* self,
8680
    size_t sizeof_star_self,
8681
    uint64_t wuffs_version,
8682
    uint32_t options);
8683
8684
size_t
8685
sizeof__wuffs_crc32__ieee_hasher(void);
8686
8687
// ---------------- Allocs
8688
8689
// These functions allocate and initialize Wuffs structs. They return NULL if
8690
// memory allocation fails. If they return non-NULL, there is no need to call
8691
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
8692
// calling free on the returned pointer. That pointer is effectively a C++
8693
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
8694
8695
wuffs_crc32__ieee_hasher*
8696
wuffs_crc32__ieee_hasher__alloc(void);
8697
8698
static inline wuffs_base__hasher_u32*
8699
wuffs_crc32__ieee_hasher__alloc_as__wuffs_base__hasher_u32(void) {
8700
  return (wuffs_base__hasher_u32*)(wuffs_crc32__ieee_hasher__alloc());
8701
}
8702
8703
// ---------------- Upcasts
8704
8705
static inline wuffs_base__hasher_u32*
8706
wuffs_crc32__ieee_hasher__upcast_as__wuffs_base__hasher_u32(
8707
    wuffs_crc32__ieee_hasher* p) {
8708
  return (wuffs_base__hasher_u32*)p;
8709
}
8710
8711
// ---------------- Public Function Prototypes
8712
8713
WUFFS_BASE__GENERATED_C_CODE
8714
WUFFS_BASE__MAYBE_STATIC uint64_t
8715
wuffs_crc32__ieee_hasher__get_quirk(
8716
    const wuffs_crc32__ieee_hasher* self,
8717
    uint32_t a_key);
8718
8719
WUFFS_BASE__GENERATED_C_CODE
8720
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
8721
wuffs_crc32__ieee_hasher__set_quirk(
8722
    wuffs_crc32__ieee_hasher* self,
8723
    uint32_t a_key,
8724
    uint64_t a_value);
8725
8726
WUFFS_BASE__GENERATED_C_CODE
8727
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
8728
wuffs_crc32__ieee_hasher__update(
8729
    wuffs_crc32__ieee_hasher* self,
8730
    wuffs_base__slice_u8 a_x);
8731
8732
WUFFS_BASE__GENERATED_C_CODE
8733
WUFFS_BASE__MAYBE_STATIC uint32_t
8734
wuffs_crc32__ieee_hasher__update_u32(
8735
    wuffs_crc32__ieee_hasher* self,
8736
    wuffs_base__slice_u8 a_x);
8737
8738
WUFFS_BASE__GENERATED_C_CODE
8739
WUFFS_BASE__MAYBE_STATIC uint32_t
8740
wuffs_crc32__ieee_hasher__checksum_u32(
8741
    const wuffs_crc32__ieee_hasher* self);
8742
8743
#ifdef __cplusplus
8744
}  // extern "C"
8745
#endif
8746
8747
// ---------------- Struct Definitions
8748
8749
// These structs' fields, and the sizeof them, are private implementation
8750
// details that aren't guaranteed to be stable across Wuffs versions.
8751
//
8752
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
8753
8754
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
8755
8756
struct wuffs_crc32__ieee_hasher__struct {
8757
  // Do not access the private_impl's or private_data's fields directly. There
8758
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
8759
  // the wuffs_foo__bar__baz functions.
8760
  //
8761
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
8762
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
8763
8764
  struct {
8765
    uint32_t magic;
8766
    uint32_t active_coroutine;
8767
    wuffs_base__vtable vtable_for__wuffs_base__hasher_u32;
8768
    wuffs_base__vtable null_vtable;
8769
8770
    uint32_t f_state;
8771
8772
    wuffs_base__empty_struct (*choosy_up)(
8773
        wuffs_crc32__ieee_hasher* self,
8774
        wuffs_base__slice_u8 a_x);
8775
  } private_impl;
8776
8777
#ifdef __cplusplus
8778
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
8779
  using unique_ptr = std::unique_ptr<wuffs_crc32__ieee_hasher, wuffs_unique_ptr_deleter>;
8780
8781
  // On failure, the alloc_etc functions return nullptr. They don't throw.
8782
8783
  static inline unique_ptr
8784
  alloc() {
8785
    return unique_ptr(wuffs_crc32__ieee_hasher__alloc());
8786
  }
8787
8788
  static inline wuffs_base__hasher_u32::unique_ptr
8789
  alloc_as__wuffs_base__hasher_u32() {
8790
    return wuffs_base__hasher_u32::unique_ptr(
8791
        wuffs_crc32__ieee_hasher__alloc_as__wuffs_base__hasher_u32());
8792
  }
8793
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
8794
8795
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
8796
  // Disallow constructing or copying an object via standard C++ mechanisms,
8797
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
8798
  // size and field layout is not part of the public, stable, memory-safe API.
8799
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
8800
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
8801
  // their first argument) rather than tweaking bar.private_impl.qux fields.
8802
  //
8803
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
8804
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
8805
  // order to provide convenience methods. These forward on "this", so that you
8806
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
8807
  wuffs_crc32__ieee_hasher__struct() = delete;
8808
  wuffs_crc32__ieee_hasher__struct(const wuffs_crc32__ieee_hasher__struct&) = delete;
8809
  wuffs_crc32__ieee_hasher__struct& operator=(
8810
      const wuffs_crc32__ieee_hasher__struct&) = delete;
8811
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
8812
8813
#if !defined(WUFFS_IMPLEMENTATION)
8814
  // As above, the size of the struct is not part of the public API, and unless
8815
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
8816
  // allocated, not stack allocated. Its size is not intended to be known at
8817
  // compile time, but it is unfortunately divulged as a side effect of
8818
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
8819
  // instead of "sizeof T", invoking the operator. To make the two values
8820
  // different, so that passing the latter will be rejected by the initialize
8821
  // function, we add an arbitrary amount of dead weight.
8822
  uint8_t dead_weight[123000000];  // 123 MB.
8823
#endif  // !defined(WUFFS_IMPLEMENTATION)
8824
8825
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
8826
  initialize(
8827
      size_t sizeof_star_self,
8828
      uint64_t wuffs_version,
8829
      uint32_t options) {
8830
    return wuffs_crc32__ieee_hasher__initialize(
8831
        this, sizeof_star_self, wuffs_version, options);
8832
  }
8833
8834
  inline wuffs_base__hasher_u32*
8835
  upcast_as__wuffs_base__hasher_u32() {
8836
    return (wuffs_base__hasher_u32*)this;
8837
  }
8838
8839
  inline uint64_t
8840
  get_quirk(
8841
      uint32_t a_key) const {
8842
    return wuffs_crc32__ieee_hasher__get_quirk(this, a_key);
8843
  }
8844
8845
  inline wuffs_base__status
8846
  set_quirk(
8847
      uint32_t a_key,
8848
      uint64_t a_value) {
8849
    return wuffs_crc32__ieee_hasher__set_quirk(this, a_key, a_value);
8850
  }
8851
8852
  inline wuffs_base__empty_struct
8853
  update(
8854
      wuffs_base__slice_u8 a_x) {
8855
    return wuffs_crc32__ieee_hasher__update(this, a_x);
8856
  }
8857
8858
  inline uint32_t
8859
  update_u32(
8860
      wuffs_base__slice_u8 a_x) {
8861
    return wuffs_crc32__ieee_hasher__update_u32(this, a_x);
8862
  }
8863
8864
  inline uint32_t
8865
  checksum_u32() const {
8866
    return wuffs_crc32__ieee_hasher__checksum_u32(this);
8867
  }
8868
8869
#endif  // __cplusplus
8870
};  // struct wuffs_crc32__ieee_hasher__struct
8871
8872
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
8873
8874
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC32) || defined(WUFFS_NONMONOLITHIC)
8875
8876
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC64) || defined(WUFFS_NONMONOLITHIC)
8877
8878
// ---------------- Status Codes
8879
8880
// ---------------- Public Consts
8881
8882
// ---------------- Struct Declarations
8883
8884
typedef struct wuffs_crc64__ecma_hasher__struct wuffs_crc64__ecma_hasher;
8885
8886
#ifdef __cplusplus
8887
extern "C" {
8888
#endif
8889
8890
// ---------------- Public Initializer Prototypes
8891
8892
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
8893
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
8894
//
8895
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
8896
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
8897
8898
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
8899
wuffs_crc64__ecma_hasher__initialize(
8900
    wuffs_crc64__ecma_hasher* self,
8901
    size_t sizeof_star_self,
8902
    uint64_t wuffs_version,
8903
    uint32_t options);
8904
8905
size_t
8906
sizeof__wuffs_crc64__ecma_hasher(void);
8907
8908
// ---------------- Allocs
8909
8910
// These functions allocate and initialize Wuffs structs. They return NULL if
8911
// memory allocation fails. If they return non-NULL, there is no need to call
8912
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
8913
// calling free on the returned pointer. That pointer is effectively a C++
8914
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
8915
8916
wuffs_crc64__ecma_hasher*
8917
wuffs_crc64__ecma_hasher__alloc(void);
8918
8919
static inline wuffs_base__hasher_u64*
8920
wuffs_crc64__ecma_hasher__alloc_as__wuffs_base__hasher_u64(void) {
8921
  return (wuffs_base__hasher_u64*)(wuffs_crc64__ecma_hasher__alloc());
8922
}
8923
8924
// ---------------- Upcasts
8925
8926
static inline wuffs_base__hasher_u64*
8927
wuffs_crc64__ecma_hasher__upcast_as__wuffs_base__hasher_u64(
8928
    wuffs_crc64__ecma_hasher* p) {
8929
  return (wuffs_base__hasher_u64*)p;
8930
}
8931
8932
// ---------------- Public Function Prototypes
8933
8934
WUFFS_BASE__GENERATED_C_CODE
8935
WUFFS_BASE__MAYBE_STATIC uint64_t
8936
wuffs_crc64__ecma_hasher__get_quirk(
8937
    const wuffs_crc64__ecma_hasher* self,
8938
    uint32_t a_key);
8939
8940
WUFFS_BASE__GENERATED_C_CODE
8941
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
8942
wuffs_crc64__ecma_hasher__set_quirk(
8943
    wuffs_crc64__ecma_hasher* self,
8944
    uint32_t a_key,
8945
    uint64_t a_value);
8946
8947
WUFFS_BASE__GENERATED_C_CODE
8948
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
8949
wuffs_crc64__ecma_hasher__update(
8950
    wuffs_crc64__ecma_hasher* self,
8951
    wuffs_base__slice_u8 a_x);
8952
8953
WUFFS_BASE__GENERATED_C_CODE
8954
WUFFS_BASE__MAYBE_STATIC uint64_t
8955
wuffs_crc64__ecma_hasher__update_u64(
8956
    wuffs_crc64__ecma_hasher* self,
8957
    wuffs_base__slice_u8 a_x);
8958
8959
WUFFS_BASE__GENERATED_C_CODE
8960
WUFFS_BASE__MAYBE_STATIC uint64_t
8961
wuffs_crc64__ecma_hasher__checksum_u64(
8962
    const wuffs_crc64__ecma_hasher* self);
8963
8964
#ifdef __cplusplus
8965
}  // extern "C"
8966
#endif
8967
8968
// ---------------- Struct Definitions
8969
8970
// These structs' fields, and the sizeof them, are private implementation
8971
// details that aren't guaranteed to be stable across Wuffs versions.
8972
//
8973
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
8974
8975
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
8976
8977
struct wuffs_crc64__ecma_hasher__struct {
8978
  // Do not access the private_impl's or private_data's fields directly. There
8979
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
8980
  // the wuffs_foo__bar__baz functions.
8981
  //
8982
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
8983
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
8984
8985
  struct {
8986
    uint32_t magic;
8987
    uint32_t active_coroutine;
8988
    wuffs_base__vtable vtable_for__wuffs_base__hasher_u64;
8989
    wuffs_base__vtable null_vtable;
8990
8991
    uint64_t f_state;
8992
8993
    wuffs_base__empty_struct (*choosy_up)(
8994
        wuffs_crc64__ecma_hasher* self,
8995
        wuffs_base__slice_u8 a_x);
8996
  } private_impl;
8997
8998
#ifdef __cplusplus
8999
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
9000
  using unique_ptr = std::unique_ptr<wuffs_crc64__ecma_hasher, wuffs_unique_ptr_deleter>;
9001
9002
  // On failure, the alloc_etc functions return nullptr. They don't throw.
9003
9004
  static inline unique_ptr
9005
  alloc() {
9006
    return unique_ptr(wuffs_crc64__ecma_hasher__alloc());
9007
  }
9008
9009
  static inline wuffs_base__hasher_u64::unique_ptr
9010
  alloc_as__wuffs_base__hasher_u64() {
9011
    return wuffs_base__hasher_u64::unique_ptr(
9012
        wuffs_crc64__ecma_hasher__alloc_as__wuffs_base__hasher_u64());
9013
  }
9014
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
9015
9016
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
9017
  // Disallow constructing or copying an object via standard C++ mechanisms,
9018
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
9019
  // size and field layout is not part of the public, stable, memory-safe API.
9020
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
9021
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
9022
  // their first argument) rather than tweaking bar.private_impl.qux fields.
9023
  //
9024
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
9025
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
9026
  // order to provide convenience methods. These forward on "this", so that you
9027
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
9028
  wuffs_crc64__ecma_hasher__struct() = delete;
9029
  wuffs_crc64__ecma_hasher__struct(const wuffs_crc64__ecma_hasher__struct&) = delete;
9030
  wuffs_crc64__ecma_hasher__struct& operator=(
9031
      const wuffs_crc64__ecma_hasher__struct&) = delete;
9032
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
9033
9034
#if !defined(WUFFS_IMPLEMENTATION)
9035
  // As above, the size of the struct is not part of the public API, and unless
9036
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
9037
  // allocated, not stack allocated. Its size is not intended to be known at
9038
  // compile time, but it is unfortunately divulged as a side effect of
9039
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
9040
  // instead of "sizeof T", invoking the operator. To make the two values
9041
  // different, so that passing the latter will be rejected by the initialize
9042
  // function, we add an arbitrary amount of dead weight.
9043
  uint8_t dead_weight[123000000];  // 123 MB.
9044
#endif  // !defined(WUFFS_IMPLEMENTATION)
9045
9046
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
9047
  initialize(
9048
      size_t sizeof_star_self,
9049
      uint64_t wuffs_version,
9050
      uint32_t options) {
9051
    return wuffs_crc64__ecma_hasher__initialize(
9052
        this, sizeof_star_self, wuffs_version, options);
9053
  }
9054
9055
  inline wuffs_base__hasher_u64*
9056
  upcast_as__wuffs_base__hasher_u64() {
9057
    return (wuffs_base__hasher_u64*)this;
9058
  }
9059
9060
  inline uint64_t
9061
  get_quirk(
9062
      uint32_t a_key) const {
9063
    return wuffs_crc64__ecma_hasher__get_quirk(this, a_key);
9064
  }
9065
9066
  inline wuffs_base__status
9067
  set_quirk(
9068
      uint32_t a_key,
9069
      uint64_t a_value) {
9070
    return wuffs_crc64__ecma_hasher__set_quirk(this, a_key, a_value);
9071
  }
9072
9073
  inline wuffs_base__empty_struct
9074
  update(
9075
      wuffs_base__slice_u8 a_x) {
9076
    return wuffs_crc64__ecma_hasher__update(this, a_x);
9077
  }
9078
9079
  inline uint64_t
9080
  update_u64(
9081
      wuffs_base__slice_u8 a_x) {
9082
    return wuffs_crc64__ecma_hasher__update_u64(this, a_x);
9083
  }
9084
9085
  inline uint64_t
9086
  checksum_u64() const {
9087
    return wuffs_crc64__ecma_hasher__checksum_u64(this);
9088
  }
9089
9090
#endif  // __cplusplus
9091
};  // struct wuffs_crc64__ecma_hasher__struct
9092
9093
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
9094
9095
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC64) || defined(WUFFS_NONMONOLITHIC)
9096
9097
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__DEFLATE) || defined(WUFFS_NONMONOLITHIC)
9098
9099
// ---------------- Status Codes
9100
9101
extern const char wuffs_deflate__error__bad_huffman_code_over_subscribed[];
9102
extern const char wuffs_deflate__error__bad_huffman_code_under_subscribed[];
9103
extern const char wuffs_deflate__error__bad_huffman_code_length_count[];
9104
extern const char wuffs_deflate__error__bad_huffman_code_length_repetition[];
9105
extern const char wuffs_deflate__error__bad_huffman_code[];
9106
extern const char wuffs_deflate__error__bad_huffman_minimum_code_length[];
9107
extern const char wuffs_deflate__error__bad_block[];
9108
extern const char wuffs_deflate__error__bad_distance[];
9109
extern const char wuffs_deflate__error__bad_distance_code_count[];
9110
extern const char wuffs_deflate__error__bad_literal_length_code_count[];
9111
extern const char wuffs_deflate__error__inconsistent_stored_block_length[];
9112
extern const char wuffs_deflate__error__missing_end_of_block_code[];
9113
extern const char wuffs_deflate__error__no_huffman_codes[];
9114
extern const char wuffs_deflate__error__truncated_input[];
9115
9116
// ---------------- Public Consts
9117
9118
#define WUFFS_DEFLATE__DECODER_DST_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0u
9119
9120
#define WUFFS_DEFLATE__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 1u
9121
9122
// ---------------- Struct Declarations
9123
9124
typedef struct wuffs_deflate__decoder__struct wuffs_deflate__decoder;
9125
9126
#ifdef __cplusplus
9127
extern "C" {
9128
#endif
9129
9130
// ---------------- Public Initializer Prototypes
9131
9132
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
9133
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
9134
//
9135
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
9136
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
9137
9138
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
9139
wuffs_deflate__decoder__initialize(
9140
    wuffs_deflate__decoder* self,
9141
    size_t sizeof_star_self,
9142
    uint64_t wuffs_version,
9143
    uint32_t options);
9144
9145
size_t
9146
sizeof__wuffs_deflate__decoder(void);
9147
9148
// ---------------- Allocs
9149
9150
// These functions allocate and initialize Wuffs structs. They return NULL if
9151
// memory allocation fails. If they return non-NULL, there is no need to call
9152
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
9153
// calling free on the returned pointer. That pointer is effectively a C++
9154
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
9155
9156
wuffs_deflate__decoder*
9157
wuffs_deflate__decoder__alloc(void);
9158
9159
static inline wuffs_base__io_transformer*
9160
wuffs_deflate__decoder__alloc_as__wuffs_base__io_transformer(void) {
9161
  return (wuffs_base__io_transformer*)(wuffs_deflate__decoder__alloc());
9162
}
9163
9164
// ---------------- Upcasts
9165
9166
static inline wuffs_base__io_transformer*
9167
wuffs_deflate__decoder__upcast_as__wuffs_base__io_transformer(
9168
    wuffs_deflate__decoder* p) {
9169
  return (wuffs_base__io_transformer*)p;
9170
}
9171
9172
// ---------------- Public Function Prototypes
9173
9174
WUFFS_BASE__GENERATED_C_CODE
9175
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
9176
wuffs_deflate__decoder__add_history(
9177
    wuffs_deflate__decoder* self,
9178
    wuffs_base__slice_u8 a_hist);
9179
9180
WUFFS_BASE__GENERATED_C_CODE
9181
WUFFS_BASE__MAYBE_STATIC uint64_t
9182
wuffs_deflate__decoder__get_quirk(
9183
    const wuffs_deflate__decoder* self,
9184
    uint32_t a_key);
9185
9186
WUFFS_BASE__GENERATED_C_CODE
9187
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
9188
wuffs_deflate__decoder__set_quirk(
9189
    wuffs_deflate__decoder* self,
9190
    uint32_t a_key,
9191
    uint64_t a_value);
9192
9193
WUFFS_BASE__GENERATED_C_CODE
9194
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
9195
wuffs_deflate__decoder__dst_history_retain_length(
9196
    const wuffs_deflate__decoder* self);
9197
9198
WUFFS_BASE__GENERATED_C_CODE
9199
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
9200
wuffs_deflate__decoder__workbuf_len(
9201
    const wuffs_deflate__decoder* self);
9202
9203
WUFFS_BASE__GENERATED_C_CODE
9204
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
9205
wuffs_deflate__decoder__transform_io(
9206
    wuffs_deflate__decoder* self,
9207
    wuffs_base__io_buffer* a_dst,
9208
    wuffs_base__io_buffer* a_src,
9209
    wuffs_base__slice_u8 a_workbuf);
9210
9211
#ifdef __cplusplus
9212
}  // extern "C"
9213
#endif
9214
9215
// ---------------- Struct Definitions
9216
9217
// These structs' fields, and the sizeof them, are private implementation
9218
// details that aren't guaranteed to be stable across Wuffs versions.
9219
//
9220
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
9221
9222
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
9223
9224
struct wuffs_deflate__decoder__struct {
9225
  // Do not access the private_impl's or private_data's fields directly. There
9226
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
9227
  // the wuffs_foo__bar__baz functions.
9228
  //
9229
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
9230
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
9231
9232
  struct {
9233
    uint32_t magic;
9234
    uint32_t active_coroutine;
9235
    wuffs_base__vtable vtable_for__wuffs_base__io_transformer;
9236
    wuffs_base__vtable null_vtable;
9237
9238
    uint32_t f_bits;
9239
    uint32_t f_n_bits;
9240
    uint64_t f_transformed_history_count;
9241
    uint32_t f_history_index;
9242
    uint32_t f_n_huffs_bits[2];
9243
    bool f_end_of_block;
9244
9245
    uint32_t p_transform_io;
9246
    uint32_t p_do_transform_io;
9247
    uint32_t p_decode_blocks;
9248
    uint32_t p_decode_uncompressed;
9249
    uint32_t p_init_dynamic_huffman;
9250
    wuffs_base__status (*choosy_decode_huffman_fast64)(
9251
        wuffs_deflate__decoder* self,
9252
        wuffs_base__io_buffer* a_dst,
9253
        wuffs_base__io_buffer* a_src);
9254
    uint32_t p_decode_huffman_slow;
9255
  } private_impl;
9256
9257
  struct {
9258
    uint32_t f_huffs[2][1024];
9259
    uint8_t f_history[33025];
9260
    uint8_t f_code_lengths[320];
9261
9262
    struct {
9263
      uint32_t v_final;
9264
    } s_decode_blocks;
9265
    struct {
9266
      uint32_t v_length;
9267
      uint64_t scratch;
9268
    } s_decode_uncompressed;
9269
    struct {
9270
      uint32_t v_bits;
9271
      uint32_t v_n_bits;
9272
      uint32_t v_n_lit;
9273
      uint32_t v_n_dist;
9274
      uint32_t v_n_clen;
9275
      uint32_t v_i;
9276
      uint32_t v_mask;
9277
      uint32_t v_n_extra_bits;
9278
      uint8_t v_rep_symbol;
9279
      uint32_t v_rep_count;
9280
    } s_init_dynamic_huffman;
9281
    struct {
9282
      uint32_t v_bits;
9283
      uint32_t v_n_bits;
9284
      uint32_t v_table_entry_n_bits;
9285
      uint32_t v_lmask;
9286
      uint32_t v_dmask;
9287
      uint32_t v_redir_top;
9288
      uint32_t v_redir_mask;
9289
      uint32_t v_length;
9290
      uint32_t v_dist_minus_1;
9291
      uint64_t scratch;
9292
    } s_decode_huffman_slow;
9293
  } private_data;
9294
9295
#ifdef __cplusplus
9296
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
9297
  using unique_ptr = std::unique_ptr<wuffs_deflate__decoder, wuffs_unique_ptr_deleter>;
9298
9299
  // On failure, the alloc_etc functions return nullptr. They don't throw.
9300
9301
  static inline unique_ptr
9302
  alloc() {
9303
    return unique_ptr(wuffs_deflate__decoder__alloc());
9304
  }
9305
9306
  static inline wuffs_base__io_transformer::unique_ptr
9307
  alloc_as__wuffs_base__io_transformer() {
9308
    return wuffs_base__io_transformer::unique_ptr(
9309
        wuffs_deflate__decoder__alloc_as__wuffs_base__io_transformer());
9310
  }
9311
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
9312
9313
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
9314
  // Disallow constructing or copying an object via standard C++ mechanisms,
9315
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
9316
  // size and field layout is not part of the public, stable, memory-safe API.
9317
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
9318
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
9319
  // their first argument) rather than tweaking bar.private_impl.qux fields.
9320
  //
9321
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
9322
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
9323
  // order to provide convenience methods. These forward on "this", so that you
9324
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
9325
  wuffs_deflate__decoder__struct() = delete;
9326
  wuffs_deflate__decoder__struct(const wuffs_deflate__decoder__struct&) = delete;
9327
  wuffs_deflate__decoder__struct& operator=(
9328
      const wuffs_deflate__decoder__struct&) = delete;
9329
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
9330
9331
#if !defined(WUFFS_IMPLEMENTATION)
9332
  // As above, the size of the struct is not part of the public API, and unless
9333
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
9334
  // allocated, not stack allocated. Its size is not intended to be known at
9335
  // compile time, but it is unfortunately divulged as a side effect of
9336
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
9337
  // instead of "sizeof T", invoking the operator. To make the two values
9338
  // different, so that passing the latter will be rejected by the initialize
9339
  // function, we add an arbitrary amount of dead weight.
9340
  uint8_t dead_weight[123000000];  // 123 MB.
9341
#endif  // !defined(WUFFS_IMPLEMENTATION)
9342
9343
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
9344
  initialize(
9345
      size_t sizeof_star_self,
9346
      uint64_t wuffs_version,
9347
      uint32_t options) {
9348
    return wuffs_deflate__decoder__initialize(
9349
        this, sizeof_star_self, wuffs_version, options);
9350
  }
9351
9352
  inline wuffs_base__io_transformer*
9353
  upcast_as__wuffs_base__io_transformer() {
9354
    return (wuffs_base__io_transformer*)this;
9355
  }
9356
9357
  inline wuffs_base__empty_struct
9358
  add_history(
9359
      wuffs_base__slice_u8 a_hist) {
9360
    return wuffs_deflate__decoder__add_history(this, a_hist);
9361
  }
9362
9363
  inline uint64_t
9364
  get_quirk(
9365
      uint32_t a_key) const {
9366
    return wuffs_deflate__decoder__get_quirk(this, a_key);
9367
  }
9368
9369
  inline wuffs_base__status
9370
  set_quirk(
9371
      uint32_t a_key,
9372
      uint64_t a_value) {
9373
    return wuffs_deflate__decoder__set_quirk(this, a_key, a_value);
9374
  }
9375
9376
  inline wuffs_base__optional_u63
9377
  dst_history_retain_length() const {
9378
    return wuffs_deflate__decoder__dst_history_retain_length(this);
9379
  }
9380
9381
  inline wuffs_base__range_ii_u64
9382
  workbuf_len() const {
9383
    return wuffs_deflate__decoder__workbuf_len(this);
9384
  }
9385
9386
  inline wuffs_base__status
9387
  transform_io(
9388
      wuffs_base__io_buffer* a_dst,
9389
      wuffs_base__io_buffer* a_src,
9390
      wuffs_base__slice_u8 a_workbuf) {
9391
    return wuffs_deflate__decoder__transform_io(this, a_dst, a_src, a_workbuf);
9392
  }
9393
9394
#endif  // __cplusplus
9395
};  // struct wuffs_deflate__decoder__struct
9396
9397
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
9398
9399
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__DEFLATE) || defined(WUFFS_NONMONOLITHIC)
9400
9401
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ETC2) || defined(WUFFS_NONMONOLITHIC)
9402
9403
// ---------------- Status Codes
9404
9405
extern const char wuffs_etc2__error__bad_header[];
9406
extern const char wuffs_etc2__error__truncated_input[];
9407
9408
// ---------------- Public Consts
9409
9410
#define WUFFS_ETC2__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u
9411
9412
// ---------------- Struct Declarations
9413
9414
typedef struct wuffs_etc2__decoder__struct wuffs_etc2__decoder;
9415
9416
#ifdef __cplusplus
9417
extern "C" {
9418
#endif
9419
9420
// ---------------- Public Initializer Prototypes
9421
9422
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
9423
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
9424
//
9425
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
9426
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
9427
9428
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
9429
wuffs_etc2__decoder__initialize(
9430
    wuffs_etc2__decoder* self,
9431
    size_t sizeof_star_self,
9432
    uint64_t wuffs_version,
9433
    uint32_t options);
9434
9435
size_t
9436
sizeof__wuffs_etc2__decoder(void);
9437
9438
// ---------------- Allocs
9439
9440
// These functions allocate and initialize Wuffs structs. They return NULL if
9441
// memory allocation fails. If they return non-NULL, there is no need to call
9442
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
9443
// calling free on the returned pointer. That pointer is effectively a C++
9444
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
9445
9446
wuffs_etc2__decoder*
9447
wuffs_etc2__decoder__alloc(void);
9448
9449
static inline wuffs_base__image_decoder*
9450
wuffs_etc2__decoder__alloc_as__wuffs_base__image_decoder(void) {
9451
  return (wuffs_base__image_decoder*)(wuffs_etc2__decoder__alloc());
9452
}
9453
9454
// ---------------- Upcasts
9455
9456
static inline wuffs_base__image_decoder*
9457
wuffs_etc2__decoder__upcast_as__wuffs_base__image_decoder(
9458
    wuffs_etc2__decoder* p) {
9459
  return (wuffs_base__image_decoder*)p;
9460
}
9461
9462
// ---------------- Public Function Prototypes
9463
9464
WUFFS_BASE__GENERATED_C_CODE
9465
WUFFS_BASE__MAYBE_STATIC uint64_t
9466
wuffs_etc2__decoder__get_quirk(
9467
    const wuffs_etc2__decoder* self,
9468
    uint32_t a_key);
9469
9470
WUFFS_BASE__GENERATED_C_CODE
9471
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
9472
wuffs_etc2__decoder__set_quirk(
9473
    wuffs_etc2__decoder* self,
9474
    uint32_t a_key,
9475
    uint64_t a_value);
9476
9477
WUFFS_BASE__GENERATED_C_CODE
9478
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
9479
wuffs_etc2__decoder__decode_image_config(
9480
    wuffs_etc2__decoder* self,
9481
    wuffs_base__image_config* a_dst,
9482
    wuffs_base__io_buffer* a_src);
9483
9484
WUFFS_BASE__GENERATED_C_CODE
9485
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
9486
wuffs_etc2__decoder__decode_frame_config(
9487
    wuffs_etc2__decoder* self,
9488
    wuffs_base__frame_config* a_dst,
9489
    wuffs_base__io_buffer* a_src);
9490
9491
WUFFS_BASE__GENERATED_C_CODE
9492
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
9493
wuffs_etc2__decoder__decode_frame(
9494
    wuffs_etc2__decoder* self,
9495
    wuffs_base__pixel_buffer* a_dst,
9496
    wuffs_base__io_buffer* a_src,
9497
    wuffs_base__pixel_blend a_blend,
9498
    wuffs_base__slice_u8 a_workbuf,
9499
    wuffs_base__decode_frame_options* a_opts);
9500
9501
WUFFS_BASE__GENERATED_C_CODE
9502
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
9503
wuffs_etc2__decoder__frame_dirty_rect(
9504
    const wuffs_etc2__decoder* self);
9505
9506
WUFFS_BASE__GENERATED_C_CODE
9507
WUFFS_BASE__MAYBE_STATIC uint32_t
9508
wuffs_etc2__decoder__num_animation_loops(
9509
    const wuffs_etc2__decoder* self);
9510
9511
WUFFS_BASE__GENERATED_C_CODE
9512
WUFFS_BASE__MAYBE_STATIC uint64_t
9513
wuffs_etc2__decoder__num_decoded_frame_configs(
9514
    const wuffs_etc2__decoder* self);
9515
9516
WUFFS_BASE__GENERATED_C_CODE
9517
WUFFS_BASE__MAYBE_STATIC uint64_t
9518
wuffs_etc2__decoder__num_decoded_frames(
9519
    const wuffs_etc2__decoder* self);
9520
9521
WUFFS_BASE__GENERATED_C_CODE
9522
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
9523
wuffs_etc2__decoder__restart_frame(
9524
    wuffs_etc2__decoder* self,
9525
    uint64_t a_index,
9526
    uint64_t a_io_position);
9527
9528
WUFFS_BASE__GENERATED_C_CODE
9529
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
9530
wuffs_etc2__decoder__set_report_metadata(
9531
    wuffs_etc2__decoder* self,
9532
    uint32_t a_fourcc,
9533
    bool a_report);
9534
9535
WUFFS_BASE__GENERATED_C_CODE
9536
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
9537
wuffs_etc2__decoder__tell_me_more(
9538
    wuffs_etc2__decoder* self,
9539
    wuffs_base__io_buffer* a_dst,
9540
    wuffs_base__more_information* a_minfo,
9541
    wuffs_base__io_buffer* a_src);
9542
9543
WUFFS_BASE__GENERATED_C_CODE
9544
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
9545
wuffs_etc2__decoder__workbuf_len(
9546
    const wuffs_etc2__decoder* self);
9547
9548
#ifdef __cplusplus
9549
}  // extern "C"
9550
#endif
9551
9552
// ---------------- Struct Definitions
9553
9554
// These structs' fields, and the sizeof them, are private implementation
9555
// details that aren't guaranteed to be stable across Wuffs versions.
9556
//
9557
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
9558
9559
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
9560
9561
struct wuffs_etc2__decoder__struct {
9562
  // Do not access the private_impl's or private_data's fields directly. There
9563
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
9564
  // the wuffs_foo__bar__baz functions.
9565
  //
9566
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
9567
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
9568
9569
  struct {
9570
    uint32_t magic;
9571
    uint32_t active_coroutine;
9572
    wuffs_base__vtable vtable_for__wuffs_base__image_decoder;
9573
    wuffs_base__vtable null_vtable;
9574
9575
    uint32_t f_pixfmt;
9576
    uint32_t f_width;
9577
    uint32_t f_height;
9578
    uint8_t f_call_sequence;
9579
    bool f_srgb;
9580
    uint32_t f_num_buffered_blocks;
9581
    uint32_t f_dst_x;
9582
    uint32_t f_dst_y;
9583
    wuffs_base__pixel_swizzler f_swizzler;
9584
9585
    uint32_t p_decode_image_config;
9586
    uint32_t p_do_decode_image_config;
9587
    uint32_t p_decode_frame_config;
9588
    uint32_t p_do_decode_frame_config;
9589
    uint32_t p_decode_frame;
9590
    uint32_t p_do_decode_frame;
9591
    uint32_t p_from_src_to_colors;
9592
    wuffs_base__empty_struct (*choosy_from_colors_to_buffer)(
9593
        wuffs_etc2__decoder* self);
9594
  } private_impl;
9595
9596
  struct {
9597
    uint64_t f_colors[2][64];
9598
    uint8_t f_buffer[4096];
9599
9600
    struct {
9601
      uint16_t v_rounded_up_width;
9602
      uint16_t v_rounded_up_height;
9603
      uint64_t scratch;
9604
    } s_do_decode_image_config;
9605
    struct {
9606
      uint32_t v_remaining;
9607
    } s_do_decode_frame;
9608
    struct {
9609
      uint32_t v_bi;
9610
      uint64_t scratch;
9611
    } s_from_src_to_colors;
9612
  } private_data;
9613
9614
#ifdef __cplusplus
9615
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
9616
  using unique_ptr = std::unique_ptr<wuffs_etc2__decoder, wuffs_unique_ptr_deleter>;
9617
9618
  // On failure, the alloc_etc functions return nullptr. They don't throw.
9619
9620
  static inline unique_ptr
9621
  alloc() {
9622
    return unique_ptr(wuffs_etc2__decoder__alloc());
9623
  }
9624
9625
  static inline wuffs_base__image_decoder::unique_ptr
9626
  alloc_as__wuffs_base__image_decoder() {
9627
    return wuffs_base__image_decoder::unique_ptr(
9628
        wuffs_etc2__decoder__alloc_as__wuffs_base__image_decoder());
9629
  }
9630
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
9631
9632
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
9633
  // Disallow constructing or copying an object via standard C++ mechanisms,
9634
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
9635
  // size and field layout is not part of the public, stable, memory-safe API.
9636
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
9637
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
9638
  // their first argument) rather than tweaking bar.private_impl.qux fields.
9639
  //
9640
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
9641
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
9642
  // order to provide convenience methods. These forward on "this", so that you
9643
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
9644
  wuffs_etc2__decoder__struct() = delete;
9645
  wuffs_etc2__decoder__struct(const wuffs_etc2__decoder__struct&) = delete;
9646
  wuffs_etc2__decoder__struct& operator=(
9647
      const wuffs_etc2__decoder__struct&) = delete;
9648
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
9649
9650
#if !defined(WUFFS_IMPLEMENTATION)
9651
  // As above, the size of the struct is not part of the public API, and unless
9652
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
9653
  // allocated, not stack allocated. Its size is not intended to be known at
9654
  // compile time, but it is unfortunately divulged as a side effect of
9655
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
9656
  // instead of "sizeof T", invoking the operator. To make the two values
9657
  // different, so that passing the latter will be rejected by the initialize
9658
  // function, we add an arbitrary amount of dead weight.
9659
  uint8_t dead_weight[123000000];  // 123 MB.
9660
#endif  // !defined(WUFFS_IMPLEMENTATION)
9661
9662
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
9663
  initialize(
9664
      size_t sizeof_star_self,
9665
      uint64_t wuffs_version,
9666
      uint32_t options) {
9667
    return wuffs_etc2__decoder__initialize(
9668
        this, sizeof_star_self, wuffs_version, options);
9669
  }
9670
9671
  inline wuffs_base__image_decoder*
9672
  upcast_as__wuffs_base__image_decoder() {
9673
    return (wuffs_base__image_decoder*)this;
9674
  }
9675
9676
  inline uint64_t
9677
  get_quirk(
9678
      uint32_t a_key) const {
9679
    return wuffs_etc2__decoder__get_quirk(this, a_key);
9680
  }
9681
9682
  inline wuffs_base__status
9683
  set_quirk(
9684
      uint32_t a_key,
9685
      uint64_t a_value) {
9686
    return wuffs_etc2__decoder__set_quirk(this, a_key, a_value);
9687
  }
9688
9689
  inline wuffs_base__status
9690
  decode_image_config(
9691
      wuffs_base__image_config* a_dst,
9692
      wuffs_base__io_buffer* a_src) {
9693
    return wuffs_etc2__decoder__decode_image_config(this, a_dst, a_src);
9694
  }
9695
9696
  inline wuffs_base__status
9697
  decode_frame_config(
9698
      wuffs_base__frame_config* a_dst,
9699
      wuffs_base__io_buffer* a_src) {
9700
    return wuffs_etc2__decoder__decode_frame_config(this, a_dst, a_src);
9701
  }
9702
9703
  inline wuffs_base__status
9704
  decode_frame(
9705
      wuffs_base__pixel_buffer* a_dst,
9706
      wuffs_base__io_buffer* a_src,
9707
      wuffs_base__pixel_blend a_blend,
9708
      wuffs_base__slice_u8 a_workbuf,
9709
      wuffs_base__decode_frame_options* a_opts) {
9710
    return wuffs_etc2__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts);
9711
  }
9712
9713
  inline wuffs_base__rect_ie_u32
9714
  frame_dirty_rect() const {
9715
    return wuffs_etc2__decoder__frame_dirty_rect(this);
9716
  }
9717
9718
  inline uint32_t
9719
  num_animation_loops() const {
9720
    return wuffs_etc2__decoder__num_animation_loops(this);
9721
  }
9722
9723
  inline uint64_t
9724
  num_decoded_frame_configs() const {
9725
    return wuffs_etc2__decoder__num_decoded_frame_configs(this);
9726
  }
9727
9728
  inline uint64_t
9729
  num_decoded_frames() const {
9730
    return wuffs_etc2__decoder__num_decoded_frames(this);
9731
  }
9732
9733
  inline wuffs_base__status
9734
  restart_frame(
9735
      uint64_t a_index,
9736
      uint64_t a_io_position) {
9737
    return wuffs_etc2__decoder__restart_frame(this, a_index, a_io_position);
9738
  }
9739
9740
  inline wuffs_base__empty_struct
9741
  set_report_metadata(
9742
      uint32_t a_fourcc,
9743
      bool a_report) {
9744
    return wuffs_etc2__decoder__set_report_metadata(this, a_fourcc, a_report);
9745
  }
9746
9747
  inline wuffs_base__status
9748
  tell_me_more(
9749
      wuffs_base__io_buffer* a_dst,
9750
      wuffs_base__more_information* a_minfo,
9751
      wuffs_base__io_buffer* a_src) {
9752
    return wuffs_etc2__decoder__tell_me_more(this, a_dst, a_minfo, a_src);
9753
  }
9754
9755
  inline wuffs_base__range_ii_u64
9756
  workbuf_len() const {
9757
    return wuffs_etc2__decoder__workbuf_len(this);
9758
  }
9759
9760
#endif  // __cplusplus
9761
};  // struct wuffs_etc2__decoder__struct
9762
9763
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
9764
9765
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ETC2) || defined(WUFFS_NONMONOLITHIC)
9766
9767
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GIF) || defined(WUFFS_NONMONOLITHIC)
9768
9769
// ---------------- Status Codes
9770
9771
extern const char wuffs_gif__error__bad_lzw_code[];
9772
extern const char wuffs_gif__error__bad_extension_label[];
9773
extern const char wuffs_gif__error__bad_frame_size[];
9774
extern const char wuffs_gif__error__bad_graphic_control[];
9775
extern const char wuffs_gif__error__bad_header[];
9776
extern const char wuffs_gif__error__bad_literal_width[];
9777
extern const char wuffs_gif__error__bad_palette[];
9778
extern const char wuffs_gif__error__truncated_input[];
9779
9780
// ---------------- Public Consts
9781
9782
#define WUFFS_GIF__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u
9783
9784
#define WUFFS_GIF__QUIRK_DELAY_NUM_DECODED_FRAMES 983928832u
9785
9786
#define WUFFS_GIF__QUIRK_FIRST_FRAME_LOCAL_PALETTE_MEANS_BLACK_BACKGROUND 983928833u
9787
9788
#define WUFFS_GIF__QUIRK_HONOR_BACKGROUND_COLOR 983928834u
9789
9790
#define WUFFS_GIF__QUIRK_IGNORE_TOO_MUCH_PIXEL_DATA 983928835u
9791
9792
#define WUFFS_GIF__QUIRK_IMAGE_BOUNDS_ARE_STRICT 983928836u
9793
9794
#define WUFFS_GIF__QUIRK_REJECT_EMPTY_FRAME 983928837u
9795
9796
#define WUFFS_GIF__QUIRK_REJECT_EMPTY_PALETTE 983928838u
9797
9798
// ---------------- Struct Declarations
9799
9800
typedef struct wuffs_gif__decoder__struct wuffs_gif__decoder;
9801
9802
#ifdef __cplusplus
9803
extern "C" {
9804
#endif
9805
9806
// ---------------- Public Initializer Prototypes
9807
9808
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
9809
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
9810
//
9811
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
9812
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
9813
9814
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
9815
wuffs_gif__decoder__initialize(
9816
    wuffs_gif__decoder* self,
9817
    size_t sizeof_star_self,
9818
    uint64_t wuffs_version,
9819
    uint32_t options);
9820
9821
size_t
9822
sizeof__wuffs_gif__decoder(void);
9823
9824
// ---------------- Allocs
9825
9826
// These functions allocate and initialize Wuffs structs. They return NULL if
9827
// memory allocation fails. If they return non-NULL, there is no need to call
9828
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
9829
// calling free on the returned pointer. That pointer is effectively a C++
9830
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
9831
9832
wuffs_gif__decoder*
9833
wuffs_gif__decoder__alloc(void);
9834
9835
static inline wuffs_base__image_decoder*
9836
wuffs_gif__decoder__alloc_as__wuffs_base__image_decoder(void) {
9837
  return (wuffs_base__image_decoder*)(wuffs_gif__decoder__alloc());
9838
}
9839
9840
// ---------------- Upcasts
9841
9842
static inline wuffs_base__image_decoder*
9843
wuffs_gif__decoder__upcast_as__wuffs_base__image_decoder(
9844
    wuffs_gif__decoder* p) {
9845
  return (wuffs_base__image_decoder*)p;
9846
}
9847
9848
// ---------------- Public Function Prototypes
9849
9850
WUFFS_BASE__GENERATED_C_CODE
9851
WUFFS_BASE__MAYBE_STATIC uint64_t
9852
wuffs_gif__decoder__get_quirk(
9853
    const wuffs_gif__decoder* self,
9854
    uint32_t a_key);
9855
9856
WUFFS_BASE__GENERATED_C_CODE
9857
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
9858
wuffs_gif__decoder__set_quirk(
9859
    wuffs_gif__decoder* self,
9860
    uint32_t a_key,
9861
    uint64_t a_value);
9862
9863
WUFFS_BASE__GENERATED_C_CODE
9864
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
9865
wuffs_gif__decoder__decode_image_config(
9866
    wuffs_gif__decoder* self,
9867
    wuffs_base__image_config* a_dst,
9868
    wuffs_base__io_buffer* a_src);
9869
9870
WUFFS_BASE__GENERATED_C_CODE
9871
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
9872
wuffs_gif__decoder__set_report_metadata(
9873
    wuffs_gif__decoder* self,
9874
    uint32_t a_fourcc,
9875
    bool a_report);
9876
9877
WUFFS_BASE__GENERATED_C_CODE
9878
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
9879
wuffs_gif__decoder__tell_me_more(
9880
    wuffs_gif__decoder* self,
9881
    wuffs_base__io_buffer* a_dst,
9882
    wuffs_base__more_information* a_minfo,
9883
    wuffs_base__io_buffer* a_src);
9884
9885
WUFFS_BASE__GENERATED_C_CODE
9886
WUFFS_BASE__MAYBE_STATIC uint32_t
9887
wuffs_gif__decoder__num_animation_loops(
9888
    const wuffs_gif__decoder* self);
9889
9890
WUFFS_BASE__GENERATED_C_CODE
9891
WUFFS_BASE__MAYBE_STATIC uint64_t
9892
wuffs_gif__decoder__num_decoded_frame_configs(
9893
    const wuffs_gif__decoder* self);
9894
9895
WUFFS_BASE__GENERATED_C_CODE
9896
WUFFS_BASE__MAYBE_STATIC uint64_t
9897
wuffs_gif__decoder__num_decoded_frames(
9898
    const wuffs_gif__decoder* self);
9899
9900
WUFFS_BASE__GENERATED_C_CODE
9901
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
9902
wuffs_gif__decoder__frame_dirty_rect(
9903
    const wuffs_gif__decoder* self);
9904
9905
WUFFS_BASE__GENERATED_C_CODE
9906
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
9907
wuffs_gif__decoder__workbuf_len(
9908
    const wuffs_gif__decoder* self);
9909
9910
WUFFS_BASE__GENERATED_C_CODE
9911
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
9912
wuffs_gif__decoder__restart_frame(
9913
    wuffs_gif__decoder* self,
9914
    uint64_t a_index,
9915
    uint64_t a_io_position);
9916
9917
WUFFS_BASE__GENERATED_C_CODE
9918
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
9919
wuffs_gif__decoder__decode_frame_config(
9920
    wuffs_gif__decoder* self,
9921
    wuffs_base__frame_config* a_dst,
9922
    wuffs_base__io_buffer* a_src);
9923
9924
WUFFS_BASE__GENERATED_C_CODE
9925
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
9926
wuffs_gif__decoder__decode_frame(
9927
    wuffs_gif__decoder* self,
9928
    wuffs_base__pixel_buffer* a_dst,
9929
    wuffs_base__io_buffer* a_src,
9930
    wuffs_base__pixel_blend a_blend,
9931
    wuffs_base__slice_u8 a_workbuf,
9932
    wuffs_base__decode_frame_options* a_opts);
9933
9934
#ifdef __cplusplus
9935
}  // extern "C"
9936
#endif
9937
9938
// ---------------- Struct Definitions
9939
9940
// These structs' fields, and the sizeof them, are private implementation
9941
// details that aren't guaranteed to be stable across Wuffs versions.
9942
//
9943
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
9944
9945
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
9946
9947
struct wuffs_gif__decoder__struct {
9948
  // Do not access the private_impl's or private_data's fields directly. There
9949
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
9950
  // the wuffs_foo__bar__baz functions.
9951
  //
9952
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
9953
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
9954
9955
  struct {
9956
    uint32_t magic;
9957
    uint32_t active_coroutine;
9958
    wuffs_base__vtable vtable_for__wuffs_base__image_decoder;
9959
    wuffs_base__vtable null_vtable;
9960
9961
    uint32_t f_width;
9962
    uint32_t f_height;
9963
    uint8_t f_call_sequence;
9964
    bool f_report_metadata_iccp;
9965
    bool f_report_metadata_xmp;
9966
    uint32_t f_metadata_fourcc;
9967
    uint64_t f_metadata_io_position;
9968
    bool f_quirks[7];
9969
    bool f_delayed_num_decoded_frames;
9970
    bool f_seen_header;
9971
    bool f_ignored_but_affects_benchmarks;
9972
    bool f_has_global_palette;
9973
    uint8_t f_interlace;
9974
    bool f_seen_num_animation_loops_value;
9975
    uint32_t f_num_animation_loops_value;
9976
    uint32_t f_background_color_u32_argb_premul;
9977
    uint32_t f_black_color_u32_argb_premul;
9978
    bool f_gc_has_transparent_index;
9979
    uint8_t f_gc_transparent_index;
9980
    uint8_t f_gc_disposal;
9981
    uint64_t f_gc_duration;
9982
    uint64_t f_frame_config_io_position;
9983
    uint64_t f_num_decoded_frame_configs_value;
9984
    uint64_t f_num_decoded_frames_value;
9985
    uint32_t f_frame_rect_x0;
9986
    uint32_t f_frame_rect_y0;
9987
    uint32_t f_frame_rect_x1;
9988
    uint32_t f_frame_rect_y1;
9989
    uint32_t f_dst_x;
9990
    uint32_t f_dst_y;
9991
    uint32_t f_dirty_max_excl_y;
9992
    uint64_t f_compressed_ri;
9993
    uint64_t f_compressed_wi;
9994
    wuffs_base__pixel_swizzler f_swizzler;
9995
    uint32_t f_lzw_pending_literal_width_plus_one;
9996
    uint32_t f_lzw_literal_width;
9997
    uint32_t f_lzw_clear_code;
9998
    uint32_t f_lzw_end_code;
9999
    uint32_t f_lzw_save_code;
10000
    uint32_t f_lzw_prev_code;
10001
    uint32_t f_lzw_width;
10002
    uint32_t f_lzw_bits;
10003
    uint32_t f_lzw_n_bits;
10004
    uint32_t f_lzw_output_ri;
10005
    uint32_t f_lzw_output_wi;
10006
    uint32_t f_lzw_read_from_return_value;
10007
    uint16_t f_lzw_prefixes[4096];
10008
10009
    uint32_t p_decode_image_config;
10010
    uint32_t p_do_decode_image_config;
10011
    uint32_t p_tell_me_more;
10012
    uint32_t p_do_tell_me_more;
10013
    uint32_t p_decode_frame_config;
10014
    uint32_t p_do_decode_frame_config;
10015
    uint32_t p_skip_frame;
10016
    uint32_t p_decode_frame;
10017
    uint32_t p_do_decode_frame;
10018
    uint32_t p_decode_up_to_id_part1;
10019
    uint32_t p_decode_header;
10020
    uint32_t p_decode_lsd;
10021
    uint32_t p_decode_extension;
10022
    uint32_t p_skip_blocks;
10023
    uint32_t p_decode_ae;
10024
    uint32_t p_decode_gc;
10025
    uint32_t p_decode_id_part0;
10026
    uint32_t p_decode_id_part1;
10027
    uint32_t p_decode_id_part2;
10028
  } private_impl;
10029
10030
  struct {
10031
    uint8_t f_compressed[4096];
10032
    uint8_t f_palettes[2][1024];
10033
    uint8_t f_dst_palette[1024];
10034
    uint8_t f_lzw_suffixes[4096][8];
10035
    uint16_t f_lzw_lm1s[4096];
10036
    uint8_t f_lzw_output[8199];
10037
10038
    struct {
10039
      uint32_t v_background_color;
10040
    } s_do_decode_frame_config;
10041
    struct {
10042
      uint64_t scratch;
10043
    } s_skip_frame;
10044
    struct {
10045
      uint64_t scratch;
10046
    } s_decode_header;
10047
    struct {
10048
      uint8_t v_flags;
10049
      uint8_t v_background_color_index;
10050
      uint32_t v_num_palette_entries;
10051
      uint32_t v_i;
10052
      uint64_t scratch;
10053
    } s_decode_lsd;
10054
    struct {
10055
      uint64_t scratch;
10056
    } s_skip_blocks;
10057
    struct {
10058
      uint8_t v_block_size;
10059
      bool v_is_animexts;
10060
      bool v_is_netscape;
10061
      bool v_is_iccp;
10062
      bool v_is_xmp;
10063
      uint64_t scratch;
10064
    } s_decode_ae;
10065
    struct {
10066
      uint64_t scratch;
10067
    } s_decode_gc;
10068
    struct {
10069
      uint64_t scratch;
10070
    } s_decode_id_part0;
10071
    struct {
10072
      uint8_t v_which_palette;
10073
      uint32_t v_num_palette_entries;
10074
      uint32_t v_i;
10075
      uint64_t scratch;
10076
    } s_decode_id_part1;
10077
    struct {
10078
      uint64_t v_block_size;
10079
      bool v_need_block_size;
10080
      uint64_t scratch;
10081
    } s_decode_id_part2;
10082
  } private_data;
10083
10084
#ifdef __cplusplus
10085
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
10086
  using unique_ptr = std::unique_ptr<wuffs_gif__decoder, wuffs_unique_ptr_deleter>;
10087
10088
  // On failure, the alloc_etc functions return nullptr. They don't throw.
10089
10090
  static inline unique_ptr
10091
  alloc() {
10092
    return unique_ptr(wuffs_gif__decoder__alloc());
10093
  }
10094
10095
  static inline wuffs_base__image_decoder::unique_ptr
10096
  alloc_as__wuffs_base__image_decoder() {
10097
    return wuffs_base__image_decoder::unique_ptr(
10098
        wuffs_gif__decoder__alloc_as__wuffs_base__image_decoder());
10099
  }
10100
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
10101
10102
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
10103
  // Disallow constructing or copying an object via standard C++ mechanisms,
10104
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
10105
  // size and field layout is not part of the public, stable, memory-safe API.
10106
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
10107
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
10108
  // their first argument) rather than tweaking bar.private_impl.qux fields.
10109
  //
10110
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
10111
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
10112
  // order to provide convenience methods. These forward on "this", so that you
10113
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
10114
  wuffs_gif__decoder__struct() = delete;
10115
  wuffs_gif__decoder__struct(const wuffs_gif__decoder__struct&) = delete;
10116
  wuffs_gif__decoder__struct& operator=(
10117
      const wuffs_gif__decoder__struct&) = delete;
10118
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
10119
10120
#if !defined(WUFFS_IMPLEMENTATION)
10121
  // As above, the size of the struct is not part of the public API, and unless
10122
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
10123
  // allocated, not stack allocated. Its size is not intended to be known at
10124
  // compile time, but it is unfortunately divulged as a side effect of
10125
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
10126
  // instead of "sizeof T", invoking the operator. To make the two values
10127
  // different, so that passing the latter will be rejected by the initialize
10128
  // function, we add an arbitrary amount of dead weight.
10129
  uint8_t dead_weight[123000000];  // 123 MB.
10130
#endif  // !defined(WUFFS_IMPLEMENTATION)
10131
10132
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
10133
  initialize(
10134
      size_t sizeof_star_self,
10135
      uint64_t wuffs_version,
10136
      uint32_t options) {
10137
    return wuffs_gif__decoder__initialize(
10138
        this, sizeof_star_self, wuffs_version, options);
10139
  }
10140
10141
  inline wuffs_base__image_decoder*
10142
  upcast_as__wuffs_base__image_decoder() {
10143
    return (wuffs_base__image_decoder*)this;
10144
  }
10145
10146
  inline uint64_t
10147
  get_quirk(
10148
      uint32_t a_key) const {
10149
    return wuffs_gif__decoder__get_quirk(this, a_key);
10150
  }
10151
10152
  inline wuffs_base__status
10153
  set_quirk(
10154
      uint32_t a_key,
10155
      uint64_t a_value) {
10156
    return wuffs_gif__decoder__set_quirk(this, a_key, a_value);
10157
  }
10158
10159
  inline wuffs_base__status
10160
  decode_image_config(
10161
      wuffs_base__image_config* a_dst,
10162
      wuffs_base__io_buffer* a_src) {
10163
    return wuffs_gif__decoder__decode_image_config(this, a_dst, a_src);
10164
  }
10165
10166
  inline wuffs_base__empty_struct
10167
  set_report_metadata(
10168
      uint32_t a_fourcc,
10169
      bool a_report) {
10170
    return wuffs_gif__decoder__set_report_metadata(this, a_fourcc, a_report);
10171
  }
10172
10173
  inline wuffs_base__status
10174
  tell_me_more(
10175
      wuffs_base__io_buffer* a_dst,
10176
      wuffs_base__more_information* a_minfo,
10177
      wuffs_base__io_buffer* a_src) {
10178
    return wuffs_gif__decoder__tell_me_more(this, a_dst, a_minfo, a_src);
10179
  }
10180
10181
  inline uint32_t
10182
  num_animation_loops() const {
10183
    return wuffs_gif__decoder__num_animation_loops(this);
10184
  }
10185
10186
  inline uint64_t
10187
  num_decoded_frame_configs() const {
10188
    return wuffs_gif__decoder__num_decoded_frame_configs(this);
10189
  }
10190
10191
  inline uint64_t
10192
  num_decoded_frames() const {
10193
    return wuffs_gif__decoder__num_decoded_frames(this);
10194
  }
10195
10196
  inline wuffs_base__rect_ie_u32
10197
  frame_dirty_rect() const {
10198
    return wuffs_gif__decoder__frame_dirty_rect(this);
10199
  }
10200
10201
  inline wuffs_base__range_ii_u64
10202
  workbuf_len() const {
10203
    return wuffs_gif__decoder__workbuf_len(this);
10204
  }
10205
10206
  inline wuffs_base__status
10207
  restart_frame(
10208
      uint64_t a_index,
10209
      uint64_t a_io_position) {
10210
    return wuffs_gif__decoder__restart_frame(this, a_index, a_io_position);
10211
  }
10212
10213
  inline wuffs_base__status
10214
  decode_frame_config(
10215
      wuffs_base__frame_config* a_dst,
10216
      wuffs_base__io_buffer* a_src) {
10217
    return wuffs_gif__decoder__decode_frame_config(this, a_dst, a_src);
10218
  }
10219
10220
  inline wuffs_base__status
10221
  decode_frame(
10222
      wuffs_base__pixel_buffer* a_dst,
10223
      wuffs_base__io_buffer* a_src,
10224
      wuffs_base__pixel_blend a_blend,
10225
      wuffs_base__slice_u8 a_workbuf,
10226
      wuffs_base__decode_frame_options* a_opts) {
10227
    return wuffs_gif__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts);
10228
  }
10229
10230
#endif  // __cplusplus
10231
};  // struct wuffs_gif__decoder__struct
10232
10233
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
10234
10235
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GIF) || defined(WUFFS_NONMONOLITHIC)
10236
10237
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GZIP) || defined(WUFFS_NONMONOLITHIC)
10238
10239
// ---------------- Status Codes
10240
10241
extern const char wuffs_gzip__error__bad_checksum[];
10242
extern const char wuffs_gzip__error__bad_compression_method[];
10243
extern const char wuffs_gzip__error__bad_encoding_flags[];
10244
extern const char wuffs_gzip__error__bad_header[];
10245
extern const char wuffs_gzip__error__truncated_input[];
10246
10247
// ---------------- Public Consts
10248
10249
#define WUFFS_GZIP__DECODER_DST_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0u
10250
10251
#define WUFFS_GZIP__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 1u
10252
10253
// ---------------- Struct Declarations
10254
10255
typedef struct wuffs_gzip__decoder__struct wuffs_gzip__decoder;
10256
10257
#ifdef __cplusplus
10258
extern "C" {
10259
#endif
10260
10261
// ---------------- Public Initializer Prototypes
10262
10263
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
10264
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
10265
//
10266
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
10267
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
10268
10269
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
10270
wuffs_gzip__decoder__initialize(
10271
    wuffs_gzip__decoder* self,
10272
    size_t sizeof_star_self,
10273
    uint64_t wuffs_version,
10274
    uint32_t options);
10275
10276
size_t
10277
sizeof__wuffs_gzip__decoder(void);
10278
10279
// ---------------- Allocs
10280
10281
// These functions allocate and initialize Wuffs structs. They return NULL if
10282
// memory allocation fails. If they return non-NULL, there is no need to call
10283
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
10284
// calling free on the returned pointer. That pointer is effectively a C++
10285
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
10286
10287
wuffs_gzip__decoder*
10288
wuffs_gzip__decoder__alloc(void);
10289
10290
static inline wuffs_base__io_transformer*
10291
wuffs_gzip__decoder__alloc_as__wuffs_base__io_transformer(void) {
10292
  return (wuffs_base__io_transformer*)(wuffs_gzip__decoder__alloc());
10293
}
10294
10295
// ---------------- Upcasts
10296
10297
static inline wuffs_base__io_transformer*
10298
wuffs_gzip__decoder__upcast_as__wuffs_base__io_transformer(
10299
    wuffs_gzip__decoder* p) {
10300
  return (wuffs_base__io_transformer*)p;
10301
}
10302
10303
// ---------------- Public Function Prototypes
10304
10305
WUFFS_BASE__GENERATED_C_CODE
10306
WUFFS_BASE__MAYBE_STATIC uint64_t
10307
wuffs_gzip__decoder__get_quirk(
10308
    const wuffs_gzip__decoder* self,
10309
    uint32_t a_key);
10310
10311
WUFFS_BASE__GENERATED_C_CODE
10312
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
10313
wuffs_gzip__decoder__set_quirk(
10314
    wuffs_gzip__decoder* self,
10315
    uint32_t a_key,
10316
    uint64_t a_value);
10317
10318
WUFFS_BASE__GENERATED_C_CODE
10319
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
10320
wuffs_gzip__decoder__dst_history_retain_length(
10321
    const wuffs_gzip__decoder* self);
10322
10323
WUFFS_BASE__GENERATED_C_CODE
10324
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
10325
wuffs_gzip__decoder__workbuf_len(
10326
    const wuffs_gzip__decoder* self);
10327
10328
WUFFS_BASE__GENERATED_C_CODE
10329
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
10330
wuffs_gzip__decoder__transform_io(
10331
    wuffs_gzip__decoder* self,
10332
    wuffs_base__io_buffer* a_dst,
10333
    wuffs_base__io_buffer* a_src,
10334
    wuffs_base__slice_u8 a_workbuf);
10335
10336
#ifdef __cplusplus
10337
}  // extern "C"
10338
#endif
10339
10340
// ---------------- Struct Definitions
10341
10342
// These structs' fields, and the sizeof them, are private implementation
10343
// details that aren't guaranteed to be stable across Wuffs versions.
10344
//
10345
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
10346
10347
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
10348
10349
struct wuffs_gzip__decoder__struct {
10350
  // Do not access the private_impl's or private_data's fields directly. There
10351
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
10352
  // the wuffs_foo__bar__baz functions.
10353
  //
10354
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
10355
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
10356
10357
  struct {
10358
    uint32_t magic;
10359
    uint32_t active_coroutine;
10360
    wuffs_base__vtable vtable_for__wuffs_base__io_transformer;
10361
    wuffs_base__vtable null_vtable;
10362
10363
    bool f_ignore_checksum;
10364
10365
    uint32_t p_transform_io;
10366
    uint32_t p_do_transform_io;
10367
  } private_impl;
10368
10369
  struct {
10370
    wuffs_crc32__ieee_hasher f_checksum;
10371
    wuffs_deflate__decoder f_flate;
10372
10373
    struct {
10374
      uint8_t v_flags;
10375
      uint32_t v_checksum_have;
10376
      uint32_t v_decoded_length_have;
10377
      uint32_t v_checksum_want;
10378
      uint64_t scratch;
10379
    } s_do_transform_io;
10380
  } private_data;
10381
10382
#ifdef __cplusplus
10383
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
10384
  using unique_ptr = std::unique_ptr<wuffs_gzip__decoder, wuffs_unique_ptr_deleter>;
10385
10386
  // On failure, the alloc_etc functions return nullptr. They don't throw.
10387
10388
  static inline unique_ptr
10389
  alloc() {
10390
    return unique_ptr(wuffs_gzip__decoder__alloc());
10391
  }
10392
10393
  static inline wuffs_base__io_transformer::unique_ptr
10394
  alloc_as__wuffs_base__io_transformer() {
10395
    return wuffs_base__io_transformer::unique_ptr(
10396
        wuffs_gzip__decoder__alloc_as__wuffs_base__io_transformer());
10397
  }
10398
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
10399
10400
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
10401
  // Disallow constructing or copying an object via standard C++ mechanisms,
10402
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
10403
  // size and field layout is not part of the public, stable, memory-safe API.
10404
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
10405
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
10406
  // their first argument) rather than tweaking bar.private_impl.qux fields.
10407
  //
10408
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
10409
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
10410
  // order to provide convenience methods. These forward on "this", so that you
10411
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
10412
  wuffs_gzip__decoder__struct() = delete;
10413
  wuffs_gzip__decoder__struct(const wuffs_gzip__decoder__struct&) = delete;
10414
  wuffs_gzip__decoder__struct& operator=(
10415
      const wuffs_gzip__decoder__struct&) = delete;
10416
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
10417
10418
#if !defined(WUFFS_IMPLEMENTATION)
10419
  // As above, the size of the struct is not part of the public API, and unless
10420
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
10421
  // allocated, not stack allocated. Its size is not intended to be known at
10422
  // compile time, but it is unfortunately divulged as a side effect of
10423
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
10424
  // instead of "sizeof T", invoking the operator. To make the two values
10425
  // different, so that passing the latter will be rejected by the initialize
10426
  // function, we add an arbitrary amount of dead weight.
10427
  uint8_t dead_weight[123000000];  // 123 MB.
10428
#endif  // !defined(WUFFS_IMPLEMENTATION)
10429
10430
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
10431
  initialize(
10432
      size_t sizeof_star_self,
10433
      uint64_t wuffs_version,
10434
      uint32_t options) {
10435
    return wuffs_gzip__decoder__initialize(
10436
        this, sizeof_star_self, wuffs_version, options);
10437
  }
10438
10439
  inline wuffs_base__io_transformer*
10440
  upcast_as__wuffs_base__io_transformer() {
10441
    return (wuffs_base__io_transformer*)this;
10442
  }
10443
10444
  inline uint64_t
10445
  get_quirk(
10446
      uint32_t a_key) const {
10447
    return wuffs_gzip__decoder__get_quirk(this, a_key);
10448
  }
10449
10450
  inline wuffs_base__status
10451
  set_quirk(
10452
      uint32_t a_key,
10453
      uint64_t a_value) {
10454
    return wuffs_gzip__decoder__set_quirk(this, a_key, a_value);
10455
  }
10456
10457
  inline wuffs_base__optional_u63
10458
  dst_history_retain_length() const {
10459
    return wuffs_gzip__decoder__dst_history_retain_length(this);
10460
  }
10461
10462
  inline wuffs_base__range_ii_u64
10463
  workbuf_len() const {
10464
    return wuffs_gzip__decoder__workbuf_len(this);
10465
  }
10466
10467
  inline wuffs_base__status
10468
  transform_io(
10469
      wuffs_base__io_buffer* a_dst,
10470
      wuffs_base__io_buffer* a_src,
10471
      wuffs_base__slice_u8 a_workbuf) {
10472
    return wuffs_gzip__decoder__transform_io(this, a_dst, a_src, a_workbuf);
10473
  }
10474
10475
#endif  // __cplusplus
10476
};  // struct wuffs_gzip__decoder__struct
10477
10478
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
10479
10480
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GZIP) || defined(WUFFS_NONMONOLITHIC)
10481
10482
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__HANDSUM) || defined(WUFFS_NONMONOLITHIC)
10483
10484
// ---------------- Status Codes
10485
10486
extern const char wuffs_handsum__error__bad_header[];
10487
extern const char wuffs_handsum__error__truncated_input[];
10488
extern const char wuffs_handsum__error__unsupported_handsum_file[];
10489
10490
// ---------------- Public Consts
10491
10492
#define WUFFS_HANDSUM__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u
10493
10494
// ---------------- Struct Declarations
10495
10496
typedef struct wuffs_handsum__decoder__struct wuffs_handsum__decoder;
10497
10498
#ifdef __cplusplus
10499
extern "C" {
10500
#endif
10501
10502
// ---------------- Public Initializer Prototypes
10503
10504
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
10505
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
10506
//
10507
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
10508
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
10509
10510
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
10511
wuffs_handsum__decoder__initialize(
10512
    wuffs_handsum__decoder* self,
10513
    size_t sizeof_star_self,
10514
    uint64_t wuffs_version,
10515
    uint32_t options);
10516
10517
size_t
10518
sizeof__wuffs_handsum__decoder(void);
10519
10520
// ---------------- Allocs
10521
10522
// These functions allocate and initialize Wuffs structs. They return NULL if
10523
// memory allocation fails. If they return non-NULL, there is no need to call
10524
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
10525
// calling free on the returned pointer. That pointer is effectively a C++
10526
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
10527
10528
wuffs_handsum__decoder*
10529
wuffs_handsum__decoder__alloc(void);
10530
10531
static inline wuffs_base__image_decoder*
10532
wuffs_handsum__decoder__alloc_as__wuffs_base__image_decoder(void) {
10533
  return (wuffs_base__image_decoder*)(wuffs_handsum__decoder__alloc());
10534
}
10535
10536
// ---------------- Upcasts
10537
10538
static inline wuffs_base__image_decoder*
10539
wuffs_handsum__decoder__upcast_as__wuffs_base__image_decoder(
10540
    wuffs_handsum__decoder* p) {
10541
  return (wuffs_base__image_decoder*)p;
10542
}
10543
10544
// ---------------- Public Function Prototypes
10545
10546
WUFFS_BASE__GENERATED_C_CODE
10547
WUFFS_BASE__MAYBE_STATIC uint64_t
10548
wuffs_handsum__decoder__get_quirk(
10549
    const wuffs_handsum__decoder* self,
10550
    uint32_t a_key);
10551
10552
WUFFS_BASE__GENERATED_C_CODE
10553
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
10554
wuffs_handsum__decoder__set_quirk(
10555
    wuffs_handsum__decoder* self,
10556
    uint32_t a_key,
10557
    uint64_t a_value);
10558
10559
WUFFS_BASE__GENERATED_C_CODE
10560
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
10561
wuffs_handsum__decoder__decode_image_config(
10562
    wuffs_handsum__decoder* self,
10563
    wuffs_base__image_config* a_dst,
10564
    wuffs_base__io_buffer* a_src);
10565
10566
WUFFS_BASE__GENERATED_C_CODE
10567
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
10568
wuffs_handsum__decoder__decode_frame_config(
10569
    wuffs_handsum__decoder* self,
10570
    wuffs_base__frame_config* a_dst,
10571
    wuffs_base__io_buffer* a_src);
10572
10573
WUFFS_BASE__GENERATED_C_CODE
10574
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
10575
wuffs_handsum__decoder__decode_frame(
10576
    wuffs_handsum__decoder* self,
10577
    wuffs_base__pixel_buffer* a_dst,
10578
    wuffs_base__io_buffer* a_src,
10579
    wuffs_base__pixel_blend a_blend,
10580
    wuffs_base__slice_u8 a_workbuf,
10581
    wuffs_base__decode_frame_options* a_opts);
10582
10583
WUFFS_BASE__GENERATED_C_CODE
10584
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
10585
wuffs_handsum__decoder__frame_dirty_rect(
10586
    const wuffs_handsum__decoder* self);
10587
10588
WUFFS_BASE__GENERATED_C_CODE
10589
WUFFS_BASE__MAYBE_STATIC uint32_t
10590
wuffs_handsum__decoder__num_animation_loops(
10591
    const wuffs_handsum__decoder* self);
10592
10593
WUFFS_BASE__GENERATED_C_CODE
10594
WUFFS_BASE__MAYBE_STATIC uint64_t
10595
wuffs_handsum__decoder__num_decoded_frame_configs(
10596
    const wuffs_handsum__decoder* self);
10597
10598
WUFFS_BASE__GENERATED_C_CODE
10599
WUFFS_BASE__MAYBE_STATIC uint64_t
10600
wuffs_handsum__decoder__num_decoded_frames(
10601
    const wuffs_handsum__decoder* self);
10602
10603
WUFFS_BASE__GENERATED_C_CODE
10604
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
10605
wuffs_handsum__decoder__restart_frame(
10606
    wuffs_handsum__decoder* self,
10607
    uint64_t a_index,
10608
    uint64_t a_io_position);
10609
10610
WUFFS_BASE__GENERATED_C_CODE
10611
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
10612
wuffs_handsum__decoder__set_report_metadata(
10613
    wuffs_handsum__decoder* self,
10614
    uint32_t a_fourcc,
10615
    bool a_report);
10616
10617
WUFFS_BASE__GENERATED_C_CODE
10618
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
10619
wuffs_handsum__decoder__tell_me_more(
10620
    wuffs_handsum__decoder* self,
10621
    wuffs_base__io_buffer* a_dst,
10622
    wuffs_base__more_information* a_minfo,
10623
    wuffs_base__io_buffer* a_src);
10624
10625
WUFFS_BASE__GENERATED_C_CODE
10626
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
10627
wuffs_handsum__decoder__workbuf_len(
10628
    const wuffs_handsum__decoder* self);
10629
10630
#ifdef __cplusplus
10631
}  // extern "C"
10632
#endif
10633
10634
// ---------------- Struct Definitions
10635
10636
// These structs' fields, and the sizeof them, are private implementation
10637
// details that aren't guaranteed to be stable across Wuffs versions.
10638
//
10639
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
10640
10641
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
10642
10643
struct wuffs_handsum__decoder__struct {
10644
  // Do not access the private_impl's or private_data's fields directly. There
10645
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
10646
  // the wuffs_foo__bar__baz functions.
10647
  //
10648
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
10649
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
10650
10651
  struct {
10652
    uint32_t magic;
10653
    uint32_t active_coroutine;
10654
    wuffs_base__vtable vtable_for__wuffs_base__image_decoder;
10655
    wuffs_base__vtable null_vtable;
10656
10657
    uint32_t f_width;
10658
    uint32_t f_height;
10659
    uint8_t f_call_sequence;
10660
    uint16_t f_bit_offset;
10661
    uint16_t f_coeffs[40];
10662
    wuffs_base__pixel_swizzler f_swizzler;
10663
10664
    uint32_t p_decode_image_config;
10665
    uint32_t p_do_decode_image_config;
10666
    uint32_t p_decode_frame_config;
10667
    uint32_t p_do_decode_frame_config;
10668
    uint32_t p_decode_frame;
10669
    uint32_t p_do_decode_frame;
10670
  } private_impl;
10671
10672
  struct {
10673
    uint8_t f_bits[64];
10674
    uint8_t f_buffers[2][32][128];
10675
10676
    struct {
10677
      uint64_t scratch;
10678
    } s_do_decode_image_config;
10679
    struct {
10680
      uint32_t v_num_read;
10681
    } s_do_decode_frame;
10682
  } private_data;
10683
10684
#ifdef __cplusplus
10685
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
10686
  using unique_ptr = std::unique_ptr<wuffs_handsum__decoder, wuffs_unique_ptr_deleter>;
10687
10688
  // On failure, the alloc_etc functions return nullptr. They don't throw.
10689
10690
  static inline unique_ptr
10691
  alloc() {
10692
    return unique_ptr(wuffs_handsum__decoder__alloc());
10693
  }
10694
10695
  static inline wuffs_base__image_decoder::unique_ptr
10696
  alloc_as__wuffs_base__image_decoder() {
10697
    return wuffs_base__image_decoder::unique_ptr(
10698
        wuffs_handsum__decoder__alloc_as__wuffs_base__image_decoder());
10699
  }
10700
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
10701
10702
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
10703
  // Disallow constructing or copying an object via standard C++ mechanisms,
10704
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
10705
  // size and field layout is not part of the public, stable, memory-safe API.
10706
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
10707
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
10708
  // their first argument) rather than tweaking bar.private_impl.qux fields.
10709
  //
10710
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
10711
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
10712
  // order to provide convenience methods. These forward on "this", so that you
10713
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
10714
  wuffs_handsum__decoder__struct() = delete;
10715
  wuffs_handsum__decoder__struct(const wuffs_handsum__decoder__struct&) = delete;
10716
  wuffs_handsum__decoder__struct& operator=(
10717
      const wuffs_handsum__decoder__struct&) = delete;
10718
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
10719
10720
#if !defined(WUFFS_IMPLEMENTATION)
10721
  // As above, the size of the struct is not part of the public API, and unless
10722
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
10723
  // allocated, not stack allocated. Its size is not intended to be known at
10724
  // compile time, but it is unfortunately divulged as a side effect of
10725
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
10726
  // instead of "sizeof T", invoking the operator. To make the two values
10727
  // different, so that passing the latter will be rejected by the initialize
10728
  // function, we add an arbitrary amount of dead weight.
10729
  uint8_t dead_weight[123000000];  // 123 MB.
10730
#endif  // !defined(WUFFS_IMPLEMENTATION)
10731
10732
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
10733
  initialize(
10734
      size_t sizeof_star_self,
10735
      uint64_t wuffs_version,
10736
      uint32_t options) {
10737
    return wuffs_handsum__decoder__initialize(
10738
        this, sizeof_star_self, wuffs_version, options);
10739
  }
10740
10741
  inline wuffs_base__image_decoder*
10742
  upcast_as__wuffs_base__image_decoder() {
10743
    return (wuffs_base__image_decoder*)this;
10744
  }
10745
10746
  inline uint64_t
10747
  get_quirk(
10748
      uint32_t a_key) const {
10749
    return wuffs_handsum__decoder__get_quirk(this, a_key);
10750
  }
10751
10752
  inline wuffs_base__status
10753
  set_quirk(
10754
      uint32_t a_key,
10755
      uint64_t a_value) {
10756
    return wuffs_handsum__decoder__set_quirk(this, a_key, a_value);
10757
  }
10758
10759
  inline wuffs_base__status
10760
  decode_image_config(
10761
      wuffs_base__image_config* a_dst,
10762
      wuffs_base__io_buffer* a_src) {
10763
    return wuffs_handsum__decoder__decode_image_config(this, a_dst, a_src);
10764
  }
10765
10766
  inline wuffs_base__status
10767
  decode_frame_config(
10768
      wuffs_base__frame_config* a_dst,
10769
      wuffs_base__io_buffer* a_src) {
10770
    return wuffs_handsum__decoder__decode_frame_config(this, a_dst, a_src);
10771
  }
10772
10773
  inline wuffs_base__status
10774
  decode_frame(
10775
      wuffs_base__pixel_buffer* a_dst,
10776
      wuffs_base__io_buffer* a_src,
10777
      wuffs_base__pixel_blend a_blend,
10778
      wuffs_base__slice_u8 a_workbuf,
10779
      wuffs_base__decode_frame_options* a_opts) {
10780
    return wuffs_handsum__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts);
10781
  }
10782
10783
  inline wuffs_base__rect_ie_u32
10784
  frame_dirty_rect() const {
10785
    return wuffs_handsum__decoder__frame_dirty_rect(this);
10786
  }
10787
10788
  inline uint32_t
10789
  num_animation_loops() const {
10790
    return wuffs_handsum__decoder__num_animation_loops(this);
10791
  }
10792
10793
  inline uint64_t
10794
  num_decoded_frame_configs() const {
10795
    return wuffs_handsum__decoder__num_decoded_frame_configs(this);
10796
  }
10797
10798
  inline uint64_t
10799
  num_decoded_frames() const {
10800
    return wuffs_handsum__decoder__num_decoded_frames(this);
10801
  }
10802
10803
  inline wuffs_base__status
10804
  restart_frame(
10805
      uint64_t a_index,
10806
      uint64_t a_io_position) {
10807
    return wuffs_handsum__decoder__restart_frame(this, a_index, a_io_position);
10808
  }
10809
10810
  inline wuffs_base__empty_struct
10811
  set_report_metadata(
10812
      uint32_t a_fourcc,
10813
      bool a_report) {
10814
    return wuffs_handsum__decoder__set_report_metadata(this, a_fourcc, a_report);
10815
  }
10816
10817
  inline wuffs_base__status
10818
  tell_me_more(
10819
      wuffs_base__io_buffer* a_dst,
10820
      wuffs_base__more_information* a_minfo,
10821
      wuffs_base__io_buffer* a_src) {
10822
    return wuffs_handsum__decoder__tell_me_more(this, a_dst, a_minfo, a_src);
10823
  }
10824
10825
  inline wuffs_base__range_ii_u64
10826
  workbuf_len() const {
10827
    return wuffs_handsum__decoder__workbuf_len(this);
10828
  }
10829
10830
#endif  // __cplusplus
10831
};  // struct wuffs_handsum__decoder__struct
10832
10833
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
10834
10835
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__HANDSUM) || defined(WUFFS_NONMONOLITHIC)
10836
10837
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JPEG) || defined(WUFFS_NONMONOLITHIC)
10838
10839
// ---------------- Status Codes
10840
10841
extern const char wuffs_jpeg__error__bad_dht_marker[];
10842
extern const char wuffs_jpeg__error__bad_dqt_marker[];
10843
extern const char wuffs_jpeg__error__bad_dri_marker[];
10844
extern const char wuffs_jpeg__error__bad_sof_marker[];
10845
extern const char wuffs_jpeg__error__bad_sos_marker[];
10846
extern const char wuffs_jpeg__error__bad_header[];
10847
extern const char wuffs_jpeg__error__bad_marker[];
10848
extern const char wuffs_jpeg__error__bad_scan_count[];
10849
extern const char wuffs_jpeg__error__missing_huffman_table[];
10850
extern const char wuffs_jpeg__error__missing_quantization_table[];
10851
extern const char wuffs_jpeg__error__rejected_progressive_jpeg[];
10852
extern const char wuffs_jpeg__error__short_sos_bitstream[];
10853
extern const char wuffs_jpeg__error__truncated_input[];
10854
extern const char wuffs_jpeg__error__unsupported_arithmetic_coding[];
10855
extern const char wuffs_jpeg__error__unsupported_color_model[];
10856
extern const char wuffs_jpeg__error__unsupported_fractional_sampling[];
10857
extern const char wuffs_jpeg__error__unsupported_hierarchical_coding[];
10858
extern const char wuffs_jpeg__error__unsupported_implicit_height[];
10859
extern const char wuffs_jpeg__error__unsupported_lossless_coding[];
10860
extern const char wuffs_jpeg__error__unsupported_marker[];
10861
extern const char wuffs_jpeg__error__unsupported_precision_12_bits[];
10862
extern const char wuffs_jpeg__error__unsupported_precision_16_bits[];
10863
extern const char wuffs_jpeg__error__unsupported_precision[];
10864
extern const char wuffs_jpeg__error__unsupported_scan_count[];
10865
10866
// ---------------- Public Consts
10867
10868
#define WUFFS_JPEG__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 51552191232u
10869
10870
#define WUFFS_JPEG__QUIRK_REJECT_PROGRESSIVE_JPEGS 1162824704u
10871
10872
// ---------------- Struct Declarations
10873
10874
typedef struct wuffs_jpeg__decoder__struct wuffs_jpeg__decoder;
10875
10876
#ifdef __cplusplus
10877
extern "C" {
10878
#endif
10879
10880
// ---------------- Public Initializer Prototypes
10881
10882
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
10883
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
10884
//
10885
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
10886
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
10887
10888
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
10889
wuffs_jpeg__decoder__initialize(
10890
    wuffs_jpeg__decoder* self,
10891
    size_t sizeof_star_self,
10892
    uint64_t wuffs_version,
10893
    uint32_t options);
10894
10895
size_t
10896
sizeof__wuffs_jpeg__decoder(void);
10897
10898
// ---------------- Allocs
10899
10900
// These functions allocate and initialize Wuffs structs. They return NULL if
10901
// memory allocation fails. If they return non-NULL, there is no need to call
10902
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
10903
// calling free on the returned pointer. That pointer is effectively a C++
10904
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
10905
10906
wuffs_jpeg__decoder*
10907
wuffs_jpeg__decoder__alloc(void);
10908
10909
static inline wuffs_base__image_decoder*
10910
0
wuffs_jpeg__decoder__alloc_as__wuffs_base__image_decoder(void) {
10911
0
  return (wuffs_base__image_decoder*)(wuffs_jpeg__decoder__alloc());
10912
0
}
10913
10914
// ---------------- Upcasts
10915
10916
static inline wuffs_base__image_decoder*
10917
wuffs_jpeg__decoder__upcast_as__wuffs_base__image_decoder(
10918
3.72k
    wuffs_jpeg__decoder* p) {
10919
3.72k
  return (wuffs_base__image_decoder*)p;
10920
3.72k
}
10921
10922
// ---------------- Public Function Prototypes
10923
10924
WUFFS_BASE__GENERATED_C_CODE
10925
WUFFS_BASE__MAYBE_STATIC uint64_t
10926
wuffs_jpeg__decoder__get_quirk(
10927
    const wuffs_jpeg__decoder* self,
10928
    uint32_t a_key);
10929
10930
WUFFS_BASE__GENERATED_C_CODE
10931
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
10932
wuffs_jpeg__decoder__set_quirk(
10933
    wuffs_jpeg__decoder* self,
10934
    uint32_t a_key,
10935
    uint64_t a_value);
10936
10937
WUFFS_BASE__GENERATED_C_CODE
10938
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
10939
wuffs_jpeg__decoder__decode_image_config(
10940
    wuffs_jpeg__decoder* self,
10941
    wuffs_base__image_config* a_dst,
10942
    wuffs_base__io_buffer* a_src);
10943
10944
WUFFS_BASE__GENERATED_C_CODE
10945
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
10946
wuffs_jpeg__decoder__decode_frame_config(
10947
    wuffs_jpeg__decoder* self,
10948
    wuffs_base__frame_config* a_dst,
10949
    wuffs_base__io_buffer* a_src);
10950
10951
WUFFS_BASE__GENERATED_C_CODE
10952
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
10953
wuffs_jpeg__decoder__decode_frame(
10954
    wuffs_jpeg__decoder* self,
10955
    wuffs_base__pixel_buffer* a_dst,
10956
    wuffs_base__io_buffer* a_src,
10957
    wuffs_base__pixel_blend a_blend,
10958
    wuffs_base__slice_u8 a_workbuf,
10959
    wuffs_base__decode_frame_options* a_opts);
10960
10961
WUFFS_BASE__GENERATED_C_CODE
10962
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
10963
wuffs_jpeg__decoder__frame_dirty_rect(
10964
    const wuffs_jpeg__decoder* self);
10965
10966
WUFFS_BASE__GENERATED_C_CODE
10967
WUFFS_BASE__MAYBE_STATIC uint32_t
10968
wuffs_jpeg__decoder__num_animation_loops(
10969
    const wuffs_jpeg__decoder* self);
10970
10971
WUFFS_BASE__GENERATED_C_CODE
10972
WUFFS_BASE__MAYBE_STATIC uint64_t
10973
wuffs_jpeg__decoder__num_decoded_frame_configs(
10974
    const wuffs_jpeg__decoder* self);
10975
10976
WUFFS_BASE__GENERATED_C_CODE
10977
WUFFS_BASE__MAYBE_STATIC uint64_t
10978
wuffs_jpeg__decoder__num_decoded_frames(
10979
    const wuffs_jpeg__decoder* self);
10980
10981
WUFFS_BASE__GENERATED_C_CODE
10982
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
10983
wuffs_jpeg__decoder__restart_frame(
10984
    wuffs_jpeg__decoder* self,
10985
    uint64_t a_index,
10986
    uint64_t a_io_position);
10987
10988
WUFFS_BASE__GENERATED_C_CODE
10989
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
10990
wuffs_jpeg__decoder__set_report_metadata(
10991
    wuffs_jpeg__decoder* self,
10992
    uint32_t a_fourcc,
10993
    bool a_report);
10994
10995
WUFFS_BASE__GENERATED_C_CODE
10996
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
10997
wuffs_jpeg__decoder__tell_me_more(
10998
    wuffs_jpeg__decoder* self,
10999
    wuffs_base__io_buffer* a_dst,
11000
    wuffs_base__more_information* a_minfo,
11001
    wuffs_base__io_buffer* a_src);
11002
11003
WUFFS_BASE__GENERATED_C_CODE
11004
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
11005
wuffs_jpeg__decoder__workbuf_len(
11006
    const wuffs_jpeg__decoder* self);
11007
11008
#ifdef __cplusplus
11009
}  // extern "C"
11010
#endif
11011
11012
// ---------------- Struct Definitions
11013
11014
// These structs' fields, and the sizeof them, are private implementation
11015
// details that aren't guaranteed to be stable across Wuffs versions.
11016
//
11017
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
11018
11019
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
11020
11021
struct wuffs_jpeg__decoder__struct {
11022
  // Do not access the private_impl's or private_data's fields directly. There
11023
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
11024
  // the wuffs_foo__bar__baz functions.
11025
  //
11026
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
11027
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
11028
11029
  struct {
11030
    uint32_t magic;
11031
    uint32_t active_coroutine;
11032
    wuffs_base__vtable vtable_for__wuffs_base__image_decoder;
11033
    wuffs_base__vtable null_vtable;
11034
11035
    uint32_t f_width;
11036
    uint32_t f_height;
11037
    uint32_t f_width_in_mcus;
11038
    uint32_t f_height_in_mcus;
11039
    uint8_t f_call_sequence;
11040
    bool f_test_only_interrupt_decode_mcu;
11041
    bool f_is_jfif;
11042
    uint8_t f_is_adobe;
11043
    bool f_is_rgb_or_cmyk;
11044
    uint8_t f_sof_marker;
11045
    uint8_t f_next_restart_marker;
11046
    uint8_t f_max_incl_components_h;
11047
    uint8_t f_max_incl_components_v;
11048
    uint32_t f_num_components;
11049
    uint8_t f_components_c[4];
11050
    uint8_t f_components_h[4];
11051
    uint8_t f_components_v[4];
11052
    uint8_t f_components_tq[4];
11053
    uint32_t f_components_workbuf_widths[4];
11054
    uint32_t f_components_workbuf_heights[4];
11055
    uint64_t f_components_workbuf_offsets[9];
11056
    uint32_t f_scan_count;
11057
    uint32_t f_scan_num_components;
11058
    uint8_t f_scan_comps_cselector[4];
11059
    uint8_t f_scan_comps_td[4];
11060
    uint8_t f_scan_comps_ta[4];
11061
    uint8_t f_scan_ss;
11062
    uint8_t f_scan_se;
11063
    uint8_t f_scan_ah;
11064
    uint8_t f_scan_al;
11065
    uint32_t f_scan_width_in_mcus;
11066
    uint32_t f_scan_height_in_mcus;
11067
    uint8_t f_scan_comps_bx_offset[16];
11068
    uint8_t f_scan_comps_by_offset[16];
11069
    uint32_t f_mcu_num_blocks;
11070
    uint32_t f_mcu_current_block;
11071
    uint32_t f_mcu_zig_index;
11072
    uint8_t f_mcu_blocks_sselector[16];
11073
    uint64_t f_mcu_blocks_offset[10];
11074
    uint32_t f_mcu_blocks_mx_mul[10];
11075
    uint32_t f_mcu_blocks_my_mul[10];
11076
    uint8_t f_mcu_blocks_dc_hselector[10];
11077
    uint8_t f_mcu_blocks_ac_hselector[10];
11078
    uint16_t f_mcu_previous_dc_values[4];
11079
    uint8_t f_block_smoothing_lowest_scan_al[4][10];
11080
    uint16_t f_block_smoothing_dc_values[5][5];
11081
    uint32_t f_block_smoothing_mx_max_incl;
11082
    uint32_t f_block_smoothing_my_max_incl;
11083
    uint16_t f_restart_interval;
11084
    uint16_t f_saved_restart_interval;
11085
    uint16_t f_restarts_remaining;
11086
    uint16_t f_eob_run;
11087
    uint64_t f_frame_config_io_position;
11088
    uint32_t f_payload_length;
11089
    bool f_seen_dqt[4];
11090
    bool f_saved_seen_dqt[4];
11091
    bool f_seen_dht[8];
11092
    uint64_t f_bitstream_bits;
11093
    uint32_t f_bitstream_n_bits;
11094
    uint32_t f_bitstream_ri;
11095
    uint32_t f_bitstream_wi;
11096
    bool f_bitstream_is_closed;
11097
    bool f_expect_multiple_scans;
11098
    bool f_use_lower_quality;
11099
    bool f_reject_progressive_jpegs;
11100
    bool f_swizzle_immediately;
11101
    wuffs_base__status f_swizzle_immediately_status;
11102
    uint32_t f_swizzle_immediately_b_offsets[10];
11103
    uint32_t f_swizzle_immediately_c_offsets[5];
11104
    uint32_t f_bitstream_padding;
11105
    uint16_t f_quant_tables[4][64];
11106
    uint16_t f_saved_quant_tables[4][64];
11107
    uint8_t f_huff_tables_symbols[8][256];
11108
    uint32_t f_huff_tables_slow[8][16];
11109
    uint16_t f_huff_tables_fast[8][256];
11110
    wuffs_base__pixel_swizzler f_swizzler;
11111
11112
    wuffs_base__empty_struct (*choosy_decode_idct)(
11113
        wuffs_jpeg__decoder* self,
11114
        wuffs_base__slice_u8 a_dst_buffer,
11115
        uint64_t a_dst_stride,
11116
        uint32_t a_q);
11117
    uint32_t p_decode_image_config;
11118
    uint32_t p_do_decode_image_config;
11119
    uint32_t p_decode_dqt;
11120
    uint32_t p_decode_dri;
11121
    uint32_t p_decode_appn;
11122
    uint32_t p_decode_sof;
11123
    uint32_t p_decode_frame_config;
11124
    uint32_t p_do_decode_frame_config;
11125
    uint32_t p_decode_frame;
11126
    uint32_t p_do_decode_frame;
11127
    uint32_t p_decode_dht;
11128
    uint32_t p_decode_sos;
11129
    uint32_t p_prepare_scan;
11130
    wuffs_base__empty_struct (*choosy_load_mcu_blocks_for_single_component)(
11131
        wuffs_jpeg__decoder* self,
11132
        uint32_t a_mx,
11133
        uint32_t a_my,
11134
        wuffs_base__slice_u8 a_workbuf,
11135
        uint32_t a_csel);
11136
    uint32_t p_skip_past_the_next_restart_marker;
11137
    uint32_t (*choosy_decode_mcu)(
11138
        wuffs_jpeg__decoder* self,
11139
        wuffs_base__pixel_buffer* a_dst,
11140
        wuffs_base__slice_u8 a_workbuf,
11141
        uint32_t a_mx,
11142
        uint32_t a_my);
11143
  } private_impl;
11144
11145
  struct {
11146
    uint8_t f_bitstream_buffer[2048];
11147
    uint16_t f_mcu_blocks[10][64];
11148
    uint8_t f_swizzle_immediately_buffer[640];
11149
    uint8_t f_swizzle_ycck_scratch_buffer_2k[2048];
11150
    uint8_t f_dht_temp_counts[16];
11151
    uint8_t f_dht_temp_bit_lengths[256];
11152
    uint16_t f_dht_temp_bit_strings[256];
11153
    uint8_t f_dst_palette[1024];
11154
11155
    struct {
11156
      uint8_t v_marker;
11157
      uint64_t scratch;
11158
    } s_do_decode_image_config;
11159
    struct {
11160
      uint8_t v_q;
11161
      uint32_t v_i;
11162
    } s_decode_dqt;
11163
    struct {
11164
      uint64_t scratch;
11165
    } s_decode_dri;
11166
    struct {
11167
      uint64_t scratch;
11168
    } s_decode_appn;
11169
    struct {
11170
      uint32_t v_i;
11171
      uint64_t scratch;
11172
    } s_decode_sof;
11173
    struct {
11174
      uint8_t v_marker;
11175
      uint64_t scratch;
11176
    } s_do_decode_frame;
11177
    struct {
11178
      uint8_t v_tc4_th;
11179
      uint32_t v_total_count;
11180
      uint32_t v_i;
11181
    } s_decode_dht;
11182
    struct {
11183
      uint32_t v_my;
11184
      uint32_t v_mx;
11185
    } s_decode_sos;
11186
    struct {
11187
      uint32_t v_i;
11188
      uint64_t scratch;
11189
    } s_prepare_scan;
11190
  } private_data;
11191
11192
#ifdef __cplusplus
11193
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
11194
  using unique_ptr = std::unique_ptr<wuffs_jpeg__decoder, wuffs_unique_ptr_deleter>;
11195
11196
  // On failure, the alloc_etc functions return nullptr. They don't throw.
11197
11198
  static inline unique_ptr
11199
  alloc() {
11200
    return unique_ptr(wuffs_jpeg__decoder__alloc());
11201
  }
11202
11203
  static inline wuffs_base__image_decoder::unique_ptr
11204
  alloc_as__wuffs_base__image_decoder() {
11205
    return wuffs_base__image_decoder::unique_ptr(
11206
        wuffs_jpeg__decoder__alloc_as__wuffs_base__image_decoder());
11207
  }
11208
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
11209
11210
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
11211
  // Disallow constructing or copying an object via standard C++ mechanisms,
11212
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
11213
  // size and field layout is not part of the public, stable, memory-safe API.
11214
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
11215
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
11216
  // their first argument) rather than tweaking bar.private_impl.qux fields.
11217
  //
11218
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
11219
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
11220
  // order to provide convenience methods. These forward on "this", so that you
11221
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
11222
  wuffs_jpeg__decoder__struct() = delete;
11223
  wuffs_jpeg__decoder__struct(const wuffs_jpeg__decoder__struct&) = delete;
11224
  wuffs_jpeg__decoder__struct& operator=(
11225
      const wuffs_jpeg__decoder__struct&) = delete;
11226
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
11227
11228
#if !defined(WUFFS_IMPLEMENTATION)
11229
  // As above, the size of the struct is not part of the public API, and unless
11230
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
11231
  // allocated, not stack allocated. Its size is not intended to be known at
11232
  // compile time, but it is unfortunately divulged as a side effect of
11233
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
11234
  // instead of "sizeof T", invoking the operator. To make the two values
11235
  // different, so that passing the latter will be rejected by the initialize
11236
  // function, we add an arbitrary amount of dead weight.
11237
  uint8_t dead_weight[123000000];  // 123 MB.
11238
#endif  // !defined(WUFFS_IMPLEMENTATION)
11239
11240
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
11241
  initialize(
11242
      size_t sizeof_star_self,
11243
      uint64_t wuffs_version,
11244
      uint32_t options) {
11245
    return wuffs_jpeg__decoder__initialize(
11246
        this, sizeof_star_self, wuffs_version, options);
11247
  }
11248
11249
  inline wuffs_base__image_decoder*
11250
  upcast_as__wuffs_base__image_decoder() {
11251
    return (wuffs_base__image_decoder*)this;
11252
  }
11253
11254
  inline uint64_t
11255
  get_quirk(
11256
      uint32_t a_key) const {
11257
    return wuffs_jpeg__decoder__get_quirk(this, a_key);
11258
  }
11259
11260
  inline wuffs_base__status
11261
  set_quirk(
11262
      uint32_t a_key,
11263
      uint64_t a_value) {
11264
    return wuffs_jpeg__decoder__set_quirk(this, a_key, a_value);
11265
  }
11266
11267
  inline wuffs_base__status
11268
  decode_image_config(
11269
      wuffs_base__image_config* a_dst,
11270
      wuffs_base__io_buffer* a_src) {
11271
    return wuffs_jpeg__decoder__decode_image_config(this, a_dst, a_src);
11272
  }
11273
11274
  inline wuffs_base__status
11275
  decode_frame_config(
11276
      wuffs_base__frame_config* a_dst,
11277
      wuffs_base__io_buffer* a_src) {
11278
    return wuffs_jpeg__decoder__decode_frame_config(this, a_dst, a_src);
11279
  }
11280
11281
  inline wuffs_base__status
11282
  decode_frame(
11283
      wuffs_base__pixel_buffer* a_dst,
11284
      wuffs_base__io_buffer* a_src,
11285
      wuffs_base__pixel_blend a_blend,
11286
      wuffs_base__slice_u8 a_workbuf,
11287
      wuffs_base__decode_frame_options* a_opts) {
11288
    return wuffs_jpeg__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts);
11289
  }
11290
11291
  inline wuffs_base__rect_ie_u32
11292
  frame_dirty_rect() const {
11293
    return wuffs_jpeg__decoder__frame_dirty_rect(this);
11294
  }
11295
11296
  inline uint32_t
11297
  num_animation_loops() const {
11298
    return wuffs_jpeg__decoder__num_animation_loops(this);
11299
  }
11300
11301
  inline uint64_t
11302
  num_decoded_frame_configs() const {
11303
    return wuffs_jpeg__decoder__num_decoded_frame_configs(this);
11304
  }
11305
11306
  inline uint64_t
11307
  num_decoded_frames() const {
11308
    return wuffs_jpeg__decoder__num_decoded_frames(this);
11309
  }
11310
11311
  inline wuffs_base__status
11312
  restart_frame(
11313
      uint64_t a_index,
11314
      uint64_t a_io_position) {
11315
    return wuffs_jpeg__decoder__restart_frame(this, a_index, a_io_position);
11316
  }
11317
11318
  inline wuffs_base__empty_struct
11319
  set_report_metadata(
11320
      uint32_t a_fourcc,
11321
      bool a_report) {
11322
    return wuffs_jpeg__decoder__set_report_metadata(this, a_fourcc, a_report);
11323
  }
11324
11325
  inline wuffs_base__status
11326
  tell_me_more(
11327
      wuffs_base__io_buffer* a_dst,
11328
      wuffs_base__more_information* a_minfo,
11329
      wuffs_base__io_buffer* a_src) {
11330
    return wuffs_jpeg__decoder__tell_me_more(this, a_dst, a_minfo, a_src);
11331
  }
11332
11333
  inline wuffs_base__range_ii_u64
11334
  workbuf_len() const {
11335
    return wuffs_jpeg__decoder__workbuf_len(this);
11336
  }
11337
11338
#endif  // __cplusplus
11339
};  // struct wuffs_jpeg__decoder__struct
11340
11341
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
11342
11343
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JPEG) || defined(WUFFS_NONMONOLITHIC)
11344
11345
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JSON) || defined(WUFFS_NONMONOLITHIC)
11346
11347
// ---------------- Status Codes
11348
11349
extern const char wuffs_json__error__bad_c0_control_code[];
11350
extern const char wuffs_json__error__bad_utf_8[];
11351
extern const char wuffs_json__error__bad_backslash_escape[];
11352
extern const char wuffs_json__error__bad_input[];
11353
extern const char wuffs_json__error__bad_new_line_in_a_string[];
11354
extern const char wuffs_json__error__bad_quirk_combination[];
11355
extern const char wuffs_json__error__unsupported_number_length[];
11356
extern const char wuffs_json__error__unsupported_recursion_depth[];
11357
11358
// ---------------- Public Consts
11359
11360
#define WUFFS_JSON__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u
11361
11362
#define WUFFS_JSON__DECODER_DEPTH_MAX_INCL 1024u
11363
11364
#define WUFFS_JSON__DECODER_DST_TOKEN_BUFFER_LENGTH_MIN_INCL 1u
11365
11366
#define WUFFS_JSON__DECODER_SRC_IO_BUFFER_LENGTH_MIN_INCL 100u
11367
11368
#define WUFFS_JSON__QUIRK_ALLOW_ASCII_CONTROL_CODES 1167656960u
11369
11370
#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_A 1167656961u
11371
11372
#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_CAPITAL_U 1167656962u
11373
11374
#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_E 1167656963u
11375
11376
#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_NEW_LINE 1167656964u
11377
11378
#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_QUESTION_MARK 1167656965u
11379
11380
#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_SINGLE_QUOTE 1167656966u
11381
11382
#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_V 1167656967u
11383
11384
#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_X_AS_CODE_POINTS 1167656969u
11385
11386
#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_ZERO 1167656970u
11387
11388
#define WUFFS_JSON__QUIRK_ALLOW_COMMENT_BLOCK 1167656971u
11389
11390
#define WUFFS_JSON__QUIRK_ALLOW_COMMENT_LINE 1167656972u
11391
11392
#define WUFFS_JSON__QUIRK_ALLOW_EXTRA_COMMA 1167656973u
11393
11394
#define WUFFS_JSON__QUIRK_ALLOW_INF_NAN_NUMBERS 1167656974u
11395
11396
#define WUFFS_JSON__QUIRK_ALLOW_LEADING_ASCII_RECORD_SEPARATOR 1167656975u
11397
11398
#define WUFFS_JSON__QUIRK_ALLOW_LEADING_UNICODE_BYTE_ORDER_MARK 1167656976u
11399
11400
#define WUFFS_JSON__QUIRK_ALLOW_TRAILING_FILLER 1167656977u
11401
11402
#define WUFFS_JSON__QUIRK_EXPECT_TRAILING_NEW_LINE_OR_EOF 1167656978u
11403
11404
#define WUFFS_JSON__QUIRK_JSON_POINTER_ALLOW_TILDE_N_TILDE_R_TILDE_T 1167656979u
11405
11406
#define WUFFS_JSON__QUIRK_REPLACE_INVALID_UNICODE 1167656980u
11407
11408
// ---------------- Struct Declarations
11409
11410
typedef struct wuffs_json__decoder__struct wuffs_json__decoder;
11411
11412
#ifdef __cplusplus
11413
extern "C" {
11414
#endif
11415
11416
// ---------------- Public Initializer Prototypes
11417
11418
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
11419
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
11420
//
11421
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
11422
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
11423
11424
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
11425
wuffs_json__decoder__initialize(
11426
    wuffs_json__decoder* self,
11427
    size_t sizeof_star_self,
11428
    uint64_t wuffs_version,
11429
    uint32_t options);
11430
11431
size_t
11432
sizeof__wuffs_json__decoder(void);
11433
11434
// ---------------- Allocs
11435
11436
// These functions allocate and initialize Wuffs structs. They return NULL if
11437
// memory allocation fails. If they return non-NULL, there is no need to call
11438
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
11439
// calling free on the returned pointer. That pointer is effectively a C++
11440
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
11441
11442
wuffs_json__decoder*
11443
wuffs_json__decoder__alloc(void);
11444
11445
static inline wuffs_base__token_decoder*
11446
wuffs_json__decoder__alloc_as__wuffs_base__token_decoder(void) {
11447
  return (wuffs_base__token_decoder*)(wuffs_json__decoder__alloc());
11448
}
11449
11450
// ---------------- Upcasts
11451
11452
static inline wuffs_base__token_decoder*
11453
wuffs_json__decoder__upcast_as__wuffs_base__token_decoder(
11454
    wuffs_json__decoder* p) {
11455
  return (wuffs_base__token_decoder*)p;
11456
}
11457
11458
// ---------------- Public Function Prototypes
11459
11460
WUFFS_BASE__GENERATED_C_CODE
11461
WUFFS_BASE__MAYBE_STATIC uint64_t
11462
wuffs_json__decoder__get_quirk(
11463
    const wuffs_json__decoder* self,
11464
    uint32_t a_key);
11465
11466
WUFFS_BASE__GENERATED_C_CODE
11467
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
11468
wuffs_json__decoder__set_quirk(
11469
    wuffs_json__decoder* self,
11470
    uint32_t a_key,
11471
    uint64_t a_value);
11472
11473
WUFFS_BASE__GENERATED_C_CODE
11474
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
11475
wuffs_json__decoder__workbuf_len(
11476
    const wuffs_json__decoder* self);
11477
11478
WUFFS_BASE__GENERATED_C_CODE
11479
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
11480
wuffs_json__decoder__decode_tokens(
11481
    wuffs_json__decoder* self,
11482
    wuffs_base__token_buffer* a_dst,
11483
    wuffs_base__io_buffer* a_src,
11484
    wuffs_base__slice_u8 a_workbuf);
11485
11486
#ifdef __cplusplus
11487
}  // extern "C"
11488
#endif
11489
11490
// ---------------- Struct Definitions
11491
11492
// These structs' fields, and the sizeof them, are private implementation
11493
// details that aren't guaranteed to be stable across Wuffs versions.
11494
//
11495
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
11496
11497
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
11498
11499
struct wuffs_json__decoder__struct {
11500
  // Do not access the private_impl's or private_data's fields directly. There
11501
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
11502
  // the wuffs_foo__bar__baz functions.
11503
  //
11504
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
11505
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
11506
11507
  struct {
11508
    uint32_t magic;
11509
    uint32_t active_coroutine;
11510
    wuffs_base__vtable vtable_for__wuffs_base__token_decoder;
11511
    wuffs_base__vtable null_vtable;
11512
11513
    bool f_quirks[21];
11514
    bool f_allow_leading_ars;
11515
    bool f_allow_leading_ubom;
11516
    bool f_end_of_data;
11517
    uint8_t f_trailer_stop;
11518
    uint8_t f_comment_type;
11519
11520
    uint32_t p_decode_tokens;
11521
    uint32_t p_decode_leading;
11522
    uint32_t p_decode_comment;
11523
    uint32_t p_decode_inf_nan;
11524
    uint32_t p_decode_trailer;
11525
  } private_impl;
11526
11527
  struct {
11528
    uint32_t f_stack[32];
11529
11530
    struct {
11531
      uint32_t v_depth;
11532
      uint32_t v_expect;
11533
      uint32_t v_expect_after_value;
11534
    } s_decode_tokens;
11535
  } private_data;
11536
11537
#ifdef __cplusplus
11538
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
11539
  using unique_ptr = std::unique_ptr<wuffs_json__decoder, wuffs_unique_ptr_deleter>;
11540
11541
  // On failure, the alloc_etc functions return nullptr. They don't throw.
11542
11543
  static inline unique_ptr
11544
  alloc() {
11545
    return unique_ptr(wuffs_json__decoder__alloc());
11546
  }
11547
11548
  static inline wuffs_base__token_decoder::unique_ptr
11549
  alloc_as__wuffs_base__token_decoder() {
11550
    return wuffs_base__token_decoder::unique_ptr(
11551
        wuffs_json__decoder__alloc_as__wuffs_base__token_decoder());
11552
  }
11553
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
11554
11555
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
11556
  // Disallow constructing or copying an object via standard C++ mechanisms,
11557
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
11558
  // size and field layout is not part of the public, stable, memory-safe API.
11559
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
11560
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
11561
  // their first argument) rather than tweaking bar.private_impl.qux fields.
11562
  //
11563
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
11564
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
11565
  // order to provide convenience methods. These forward on "this", so that you
11566
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
11567
  wuffs_json__decoder__struct() = delete;
11568
  wuffs_json__decoder__struct(const wuffs_json__decoder__struct&) = delete;
11569
  wuffs_json__decoder__struct& operator=(
11570
      const wuffs_json__decoder__struct&) = delete;
11571
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
11572
11573
#if !defined(WUFFS_IMPLEMENTATION)
11574
  // As above, the size of the struct is not part of the public API, and unless
11575
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
11576
  // allocated, not stack allocated. Its size is not intended to be known at
11577
  // compile time, but it is unfortunately divulged as a side effect of
11578
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
11579
  // instead of "sizeof T", invoking the operator. To make the two values
11580
  // different, so that passing the latter will be rejected by the initialize
11581
  // function, we add an arbitrary amount of dead weight.
11582
  uint8_t dead_weight[123000000];  // 123 MB.
11583
#endif  // !defined(WUFFS_IMPLEMENTATION)
11584
11585
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
11586
  initialize(
11587
      size_t sizeof_star_self,
11588
      uint64_t wuffs_version,
11589
      uint32_t options) {
11590
    return wuffs_json__decoder__initialize(
11591
        this, sizeof_star_self, wuffs_version, options);
11592
  }
11593
11594
  inline wuffs_base__token_decoder*
11595
  upcast_as__wuffs_base__token_decoder() {
11596
    return (wuffs_base__token_decoder*)this;
11597
  }
11598
11599
  inline uint64_t
11600
  get_quirk(
11601
      uint32_t a_key) const {
11602
    return wuffs_json__decoder__get_quirk(this, a_key);
11603
  }
11604
11605
  inline wuffs_base__status
11606
  set_quirk(
11607
      uint32_t a_key,
11608
      uint64_t a_value) {
11609
    return wuffs_json__decoder__set_quirk(this, a_key, a_value);
11610
  }
11611
11612
  inline wuffs_base__range_ii_u64
11613
  workbuf_len() const {
11614
    return wuffs_json__decoder__workbuf_len(this);
11615
  }
11616
11617
  inline wuffs_base__status
11618
  decode_tokens(
11619
      wuffs_base__token_buffer* a_dst,
11620
      wuffs_base__io_buffer* a_src,
11621
      wuffs_base__slice_u8 a_workbuf) {
11622
    return wuffs_json__decoder__decode_tokens(this, a_dst, a_src, a_workbuf);
11623
  }
11624
11625
#endif  // __cplusplus
11626
};  // struct wuffs_json__decoder__struct
11627
11628
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
11629
11630
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JSON) || defined(WUFFS_NONMONOLITHIC)
11631
11632
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZMA) || defined(WUFFS_NONMONOLITHIC)
11633
11634
// ---------------- Status Codes
11635
11636
extern const char wuffs_lzma__error__bad_lzma2_header[];
11637
extern const char wuffs_lzma__error__bad_bitstream_trailer[];
11638
extern const char wuffs_lzma__error__bad_code[];
11639
extern const char wuffs_lzma__error__bad_decoded_length[];
11640
extern const char wuffs_lzma__error__bad_distance[];
11641
extern const char wuffs_lzma__error__bad_header[];
11642
extern const char wuffs_lzma__error__truncated_input[];
11643
extern const char wuffs_lzma__error__unsupported_decoded_length[];
11644
extern const char wuffs_lzma__error__unsupported_properties[];
11645
11646
// ---------------- Public Consts
11647
11648
#define WUFFS_LZMA__DECODER_DST_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0u
11649
11650
#define WUFFS_LZMA__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 4294967568u
11651
11652
#define WUFFS_LZMA__QUIRK_ALLOW_NON_ZERO_INITIAL_BYTE 1290294272u
11653
11654
#define WUFFS_LZMA__QUIRK_FORMAT_EXTENSION 1290294273u
11655
11656
// ---------------- Struct Declarations
11657
11658
typedef struct wuffs_lzma__decoder__struct wuffs_lzma__decoder;
11659
11660
#ifdef __cplusplus
11661
extern "C" {
11662
#endif
11663
11664
// ---------------- Public Initializer Prototypes
11665
11666
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
11667
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
11668
//
11669
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
11670
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
11671
11672
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
11673
wuffs_lzma__decoder__initialize(
11674
    wuffs_lzma__decoder* self,
11675
    size_t sizeof_star_self,
11676
    uint64_t wuffs_version,
11677
    uint32_t options);
11678
11679
size_t
11680
sizeof__wuffs_lzma__decoder(void);
11681
11682
// ---------------- Allocs
11683
11684
// These functions allocate and initialize Wuffs structs. They return NULL if
11685
// memory allocation fails. If they return non-NULL, there is no need to call
11686
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
11687
// calling free on the returned pointer. That pointer is effectively a C++
11688
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
11689
11690
wuffs_lzma__decoder*
11691
wuffs_lzma__decoder__alloc(void);
11692
11693
static inline wuffs_base__io_transformer*
11694
wuffs_lzma__decoder__alloc_as__wuffs_base__io_transformer(void) {
11695
  return (wuffs_base__io_transformer*)(wuffs_lzma__decoder__alloc());
11696
}
11697
11698
// ---------------- Upcasts
11699
11700
static inline wuffs_base__io_transformer*
11701
wuffs_lzma__decoder__upcast_as__wuffs_base__io_transformer(
11702
    wuffs_lzma__decoder* p) {
11703
  return (wuffs_base__io_transformer*)p;
11704
}
11705
11706
// ---------------- Public Function Prototypes
11707
11708
WUFFS_BASE__GENERATED_C_CODE
11709
WUFFS_BASE__MAYBE_STATIC uint64_t
11710
wuffs_lzma__decoder__get_quirk(
11711
    const wuffs_lzma__decoder* self,
11712
    uint32_t a_key);
11713
11714
WUFFS_BASE__GENERATED_C_CODE
11715
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
11716
wuffs_lzma__decoder__set_quirk(
11717
    wuffs_lzma__decoder* self,
11718
    uint32_t a_key,
11719
    uint64_t a_value);
11720
11721
WUFFS_BASE__GENERATED_C_CODE
11722
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
11723
wuffs_lzma__decoder__dst_history_retain_length(
11724
    const wuffs_lzma__decoder* self);
11725
11726
WUFFS_BASE__GENERATED_C_CODE
11727
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
11728
wuffs_lzma__decoder__workbuf_len(
11729
    const wuffs_lzma__decoder* self);
11730
11731
WUFFS_BASE__GENERATED_C_CODE
11732
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
11733
wuffs_lzma__decoder__transform_io(
11734
    wuffs_lzma__decoder* self,
11735
    wuffs_base__io_buffer* a_dst,
11736
    wuffs_base__io_buffer* a_src,
11737
    wuffs_base__slice_u8 a_workbuf);
11738
11739
#ifdef __cplusplus
11740
}  // extern "C"
11741
#endif
11742
11743
// ---------------- Struct Definitions
11744
11745
// These structs' fields, and the sizeof them, are private implementation
11746
// details that aren't guaranteed to be stable across Wuffs versions.
11747
//
11748
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
11749
11750
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
11751
11752
struct wuffs_lzma__decoder__struct {
11753
  // Do not access the private_impl's or private_data's fields directly. There
11754
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
11755
  // the wuffs_foo__bar__baz functions.
11756
  //
11757
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
11758
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
11759
11760
  struct {
11761
    uint32_t magic;
11762
    uint32_t active_coroutine;
11763
    wuffs_base__vtable vtable_for__wuffs_base__io_transformer;
11764
    wuffs_base__vtable null_vtable;
11765
11766
    uint32_t f_lc;
11767
    uint32_t f_lp;
11768
    uint32_t f_pb;
11769
    uint32_t f_format_extension;
11770
    uint32_t f_dict_size;
11771
    uint32_t f_dict_workbuf_index;
11772
    uint32_t f_dict_seen;
11773
    uint64_t f_decoded_length;
11774
    uint64_t f_lzma2_encoded_length_have;
11775
    uint64_t f_lzma2_encoded_length_want;
11776
    bool f_lzma2_need_prob_reset;
11777
    bool f_lzma2_need_properties;
11778
    bool f_lzma2_need_dict_reset;
11779
    bool f_prev_lzma2_chunk_was_uncompressed;
11780
    bool f_allow_non_zero_initial_byte;
11781
    bool f_end_of_chunk;
11782
    uint8_t f_stashed_bytes[2];
11783
    uint32_t f_stashed_bits;
11784
    uint32_t f_stashed_range;
11785
    uint32_t f_stashed_state;
11786
    uint32_t f_stashed_rep0;
11787
    uint32_t f_stashed_rep1;
11788
    uint32_t f_stashed_rep2;
11789
    uint32_t f_stashed_rep3;
11790
    uint64_t f_stashed_pos;
11791
    uint64_t f_stashed_pos_end;
11792
11793
    uint32_t p_decode_bitstream_slow;
11794
    uint32_t p_transform_io;
11795
    uint32_t p_do_transform_io;
11796
    uint32_t p_decode_bitstream;
11797
    uint32_t p_update_stashed_bytes;
11798
    uint32_t p_decode_optional_end_of_stream;
11799
  } private_impl;
11800
11801
  struct {
11802
    uint16_t f_probs_ao00[192];
11803
    uint16_t f_probs_ao20[12];
11804
    uint16_t f_probs_ao40[12];
11805
    uint16_t f_probs_ao41[192];
11806
    uint16_t f_probs_ao60[12];
11807
    uint16_t f_probs_ao63[12];
11808
    uint16_t f_probs_match_len_low[16][8];
11809
    uint16_t f_probs_match_len_mid[16][8];
11810
    uint16_t f_probs_match_len_high[1][256];
11811
    uint16_t f_probs_longrep_len_low[16][8];
11812
    uint16_t f_probs_longrep_len_mid[16][8];
11813
    uint16_t f_probs_longrep_len_high[1][256];
11814
    uint16_t f_probs_slot[4][64];
11815
    uint16_t f_probs_small_dist[128];
11816
    uint16_t f_probs_large_dist[16];
11817
    uint16_t f_probs_lit[16][768];
11818
11819
    struct {
11820
      uint32_t v_bits;
11821
      uint32_t v_range;
11822
      uint32_t v_state;
11823
      uint32_t v_rep0;
11824
      uint32_t v_rep1;
11825
      uint32_t v_rep2;
11826
      uint32_t v_rep3;
11827
      uint32_t v_rep;
11828
      uint64_t v_pos;
11829
      uint64_t v_pos_end;
11830
      uint32_t v_lc;
11831
      uint64_t v_lp_mask;
11832
      uint64_t v_pb_mask;
11833
      uint32_t v_tree_node;
11834
      uint8_t v_prev_byte;
11835
      uint32_t v_match_byte;
11836
      uint32_t v_len_state;
11837
      uint32_t v_slot;
11838
      uint32_t v_len;
11839
      uint32_t v_lanl_offset;
11840
      uint32_t v_num_extra_bits;
11841
      uint32_t v_dist_extra_bits;
11842
      uint32_t v_i;
11843
      uint32_t v_index_lit;
11844
      uint32_t v_index_len;
11845
      uint32_t v_index_small_dist_base;
11846
      uint32_t v_index_small_dist_extra;
11847
      uint32_t v_index_large_dist;
11848
      uint32_t v_dist;
11849
      uint64_t scratch;
11850
    } s_decode_bitstream_slow;
11851
    struct {
11852
      uint8_t v_header_byte;
11853
      uint32_t v_length;
11854
      uint64_t scratch;
11855
    } s_do_transform_io;
11856
  } private_data;
11857
11858
#ifdef __cplusplus
11859
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
11860
  using unique_ptr = std::unique_ptr<wuffs_lzma__decoder, wuffs_unique_ptr_deleter>;
11861
11862
  // On failure, the alloc_etc functions return nullptr. They don't throw.
11863
11864
  static inline unique_ptr
11865
  alloc() {
11866
    return unique_ptr(wuffs_lzma__decoder__alloc());
11867
  }
11868
11869
  static inline wuffs_base__io_transformer::unique_ptr
11870
  alloc_as__wuffs_base__io_transformer() {
11871
    return wuffs_base__io_transformer::unique_ptr(
11872
        wuffs_lzma__decoder__alloc_as__wuffs_base__io_transformer());
11873
  }
11874
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
11875
11876
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
11877
  // Disallow constructing or copying an object via standard C++ mechanisms,
11878
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
11879
  // size and field layout is not part of the public, stable, memory-safe API.
11880
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
11881
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
11882
  // their first argument) rather than tweaking bar.private_impl.qux fields.
11883
  //
11884
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
11885
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
11886
  // order to provide convenience methods. These forward on "this", so that you
11887
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
11888
  wuffs_lzma__decoder__struct() = delete;
11889
  wuffs_lzma__decoder__struct(const wuffs_lzma__decoder__struct&) = delete;
11890
  wuffs_lzma__decoder__struct& operator=(
11891
      const wuffs_lzma__decoder__struct&) = delete;
11892
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
11893
11894
#if !defined(WUFFS_IMPLEMENTATION)
11895
  // As above, the size of the struct is not part of the public API, and unless
11896
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
11897
  // allocated, not stack allocated. Its size is not intended to be known at
11898
  // compile time, but it is unfortunately divulged as a side effect of
11899
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
11900
  // instead of "sizeof T", invoking the operator. To make the two values
11901
  // different, so that passing the latter will be rejected by the initialize
11902
  // function, we add an arbitrary amount of dead weight.
11903
  uint8_t dead_weight[123000000];  // 123 MB.
11904
#endif  // !defined(WUFFS_IMPLEMENTATION)
11905
11906
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
11907
  initialize(
11908
      size_t sizeof_star_self,
11909
      uint64_t wuffs_version,
11910
      uint32_t options) {
11911
    return wuffs_lzma__decoder__initialize(
11912
        this, sizeof_star_self, wuffs_version, options);
11913
  }
11914
11915
  inline wuffs_base__io_transformer*
11916
  upcast_as__wuffs_base__io_transformer() {
11917
    return (wuffs_base__io_transformer*)this;
11918
  }
11919
11920
  inline uint64_t
11921
  get_quirk(
11922
      uint32_t a_key) const {
11923
    return wuffs_lzma__decoder__get_quirk(this, a_key);
11924
  }
11925
11926
  inline wuffs_base__status
11927
  set_quirk(
11928
      uint32_t a_key,
11929
      uint64_t a_value) {
11930
    return wuffs_lzma__decoder__set_quirk(this, a_key, a_value);
11931
  }
11932
11933
  inline wuffs_base__optional_u63
11934
  dst_history_retain_length() const {
11935
    return wuffs_lzma__decoder__dst_history_retain_length(this);
11936
  }
11937
11938
  inline wuffs_base__range_ii_u64
11939
  workbuf_len() const {
11940
    return wuffs_lzma__decoder__workbuf_len(this);
11941
  }
11942
11943
  inline wuffs_base__status
11944
  transform_io(
11945
      wuffs_base__io_buffer* a_dst,
11946
      wuffs_base__io_buffer* a_src,
11947
      wuffs_base__slice_u8 a_workbuf) {
11948
    return wuffs_lzma__decoder__transform_io(this, a_dst, a_src, a_workbuf);
11949
  }
11950
11951
#endif  // __cplusplus
11952
};  // struct wuffs_lzma__decoder__struct
11953
11954
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
11955
11956
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZMA) || defined(WUFFS_NONMONOLITHIC)
11957
11958
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZIP) || defined(WUFFS_NONMONOLITHIC)
11959
11960
// ---------------- Status Codes
11961
11962
extern const char wuffs_lzip__error__bad_checksum[];
11963
extern const char wuffs_lzip__error__bad_footer[];
11964
extern const char wuffs_lzip__error__bad_header[];
11965
extern const char wuffs_lzip__error__truncated_input[];
11966
11967
// ---------------- Public Consts
11968
11969
#define WUFFS_LZIP__DECODER_DST_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0u
11970
11971
#define WUFFS_LZIP__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 4294967568u
11972
11973
// ---------------- Struct Declarations
11974
11975
typedef struct wuffs_lzip__decoder__struct wuffs_lzip__decoder;
11976
11977
#ifdef __cplusplus
11978
extern "C" {
11979
#endif
11980
11981
// ---------------- Public Initializer Prototypes
11982
11983
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
11984
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
11985
//
11986
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
11987
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
11988
11989
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
11990
wuffs_lzip__decoder__initialize(
11991
    wuffs_lzip__decoder* self,
11992
    size_t sizeof_star_self,
11993
    uint64_t wuffs_version,
11994
    uint32_t options);
11995
11996
size_t
11997
sizeof__wuffs_lzip__decoder(void);
11998
11999
// ---------------- Allocs
12000
12001
// These functions allocate and initialize Wuffs structs. They return NULL if
12002
// memory allocation fails. If they return non-NULL, there is no need to call
12003
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
12004
// calling free on the returned pointer. That pointer is effectively a C++
12005
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
12006
12007
wuffs_lzip__decoder*
12008
wuffs_lzip__decoder__alloc(void);
12009
12010
static inline wuffs_base__io_transformer*
12011
wuffs_lzip__decoder__alloc_as__wuffs_base__io_transformer(void) {
12012
  return (wuffs_base__io_transformer*)(wuffs_lzip__decoder__alloc());
12013
}
12014
12015
// ---------------- Upcasts
12016
12017
static inline wuffs_base__io_transformer*
12018
wuffs_lzip__decoder__upcast_as__wuffs_base__io_transformer(
12019
    wuffs_lzip__decoder* p) {
12020
  return (wuffs_base__io_transformer*)p;
12021
}
12022
12023
// ---------------- Public Function Prototypes
12024
12025
WUFFS_BASE__GENERATED_C_CODE
12026
WUFFS_BASE__MAYBE_STATIC uint64_t
12027
wuffs_lzip__decoder__get_quirk(
12028
    const wuffs_lzip__decoder* self,
12029
    uint32_t a_key);
12030
12031
WUFFS_BASE__GENERATED_C_CODE
12032
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
12033
wuffs_lzip__decoder__set_quirk(
12034
    wuffs_lzip__decoder* self,
12035
    uint32_t a_key,
12036
    uint64_t a_value);
12037
12038
WUFFS_BASE__GENERATED_C_CODE
12039
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
12040
wuffs_lzip__decoder__dst_history_retain_length(
12041
    const wuffs_lzip__decoder* self);
12042
12043
WUFFS_BASE__GENERATED_C_CODE
12044
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
12045
wuffs_lzip__decoder__workbuf_len(
12046
    const wuffs_lzip__decoder* self);
12047
12048
WUFFS_BASE__GENERATED_C_CODE
12049
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
12050
wuffs_lzip__decoder__transform_io(
12051
    wuffs_lzip__decoder* self,
12052
    wuffs_base__io_buffer* a_dst,
12053
    wuffs_base__io_buffer* a_src,
12054
    wuffs_base__slice_u8 a_workbuf);
12055
12056
#ifdef __cplusplus
12057
}  // extern "C"
12058
#endif
12059
12060
// ---------------- Struct Definitions
12061
12062
// These structs' fields, and the sizeof them, are private implementation
12063
// details that aren't guaranteed to be stable across Wuffs versions.
12064
//
12065
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
12066
12067
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
12068
12069
struct wuffs_lzip__decoder__struct {
12070
  // Do not access the private_impl's or private_data's fields directly. There
12071
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
12072
  // the wuffs_foo__bar__baz functions.
12073
  //
12074
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
12075
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
12076
12077
  struct {
12078
    uint32_t magic;
12079
    uint32_t active_coroutine;
12080
    wuffs_base__vtable vtable_for__wuffs_base__io_transformer;
12081
    wuffs_base__vtable null_vtable;
12082
12083
    bool f_ignore_checksum;
12084
    uint64_t f_dsize_have;
12085
    uint64_t f_ssize_have;
12086
12087
    uint32_t p_transform_io;
12088
    uint32_t p_do_transform_io;
12089
  } private_impl;
12090
12091
  struct {
12092
    wuffs_crc32__ieee_hasher f_crc32;
12093
    wuffs_lzma__decoder f_lzma;
12094
12095
    struct {
12096
      uint64_t scratch;
12097
    } s_do_transform_io;
12098
  } private_data;
12099
12100
#ifdef __cplusplus
12101
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
12102
  using unique_ptr = std::unique_ptr<wuffs_lzip__decoder, wuffs_unique_ptr_deleter>;
12103
12104
  // On failure, the alloc_etc functions return nullptr. They don't throw.
12105
12106
  static inline unique_ptr
12107
  alloc() {
12108
    return unique_ptr(wuffs_lzip__decoder__alloc());
12109
  }
12110
12111
  static inline wuffs_base__io_transformer::unique_ptr
12112
  alloc_as__wuffs_base__io_transformer() {
12113
    return wuffs_base__io_transformer::unique_ptr(
12114
        wuffs_lzip__decoder__alloc_as__wuffs_base__io_transformer());
12115
  }
12116
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
12117
12118
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
12119
  // Disallow constructing or copying an object via standard C++ mechanisms,
12120
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
12121
  // size and field layout is not part of the public, stable, memory-safe API.
12122
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
12123
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
12124
  // their first argument) rather than tweaking bar.private_impl.qux fields.
12125
  //
12126
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
12127
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
12128
  // order to provide convenience methods. These forward on "this", so that you
12129
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
12130
  wuffs_lzip__decoder__struct() = delete;
12131
  wuffs_lzip__decoder__struct(const wuffs_lzip__decoder__struct&) = delete;
12132
  wuffs_lzip__decoder__struct& operator=(
12133
      const wuffs_lzip__decoder__struct&) = delete;
12134
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
12135
12136
#if !defined(WUFFS_IMPLEMENTATION)
12137
  // As above, the size of the struct is not part of the public API, and unless
12138
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
12139
  // allocated, not stack allocated. Its size is not intended to be known at
12140
  // compile time, but it is unfortunately divulged as a side effect of
12141
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
12142
  // instead of "sizeof T", invoking the operator. To make the two values
12143
  // different, so that passing the latter will be rejected by the initialize
12144
  // function, we add an arbitrary amount of dead weight.
12145
  uint8_t dead_weight[123000000];  // 123 MB.
12146
#endif  // !defined(WUFFS_IMPLEMENTATION)
12147
12148
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
12149
  initialize(
12150
      size_t sizeof_star_self,
12151
      uint64_t wuffs_version,
12152
      uint32_t options) {
12153
    return wuffs_lzip__decoder__initialize(
12154
        this, sizeof_star_self, wuffs_version, options);
12155
  }
12156
12157
  inline wuffs_base__io_transformer*
12158
  upcast_as__wuffs_base__io_transformer() {
12159
    return (wuffs_base__io_transformer*)this;
12160
  }
12161
12162
  inline uint64_t
12163
  get_quirk(
12164
      uint32_t a_key) const {
12165
    return wuffs_lzip__decoder__get_quirk(this, a_key);
12166
  }
12167
12168
  inline wuffs_base__status
12169
  set_quirk(
12170
      uint32_t a_key,
12171
      uint64_t a_value) {
12172
    return wuffs_lzip__decoder__set_quirk(this, a_key, a_value);
12173
  }
12174
12175
  inline wuffs_base__optional_u63
12176
  dst_history_retain_length() const {
12177
    return wuffs_lzip__decoder__dst_history_retain_length(this);
12178
  }
12179
12180
  inline wuffs_base__range_ii_u64
12181
  workbuf_len() const {
12182
    return wuffs_lzip__decoder__workbuf_len(this);
12183
  }
12184
12185
  inline wuffs_base__status
12186
  transform_io(
12187
      wuffs_base__io_buffer* a_dst,
12188
      wuffs_base__io_buffer* a_src,
12189
      wuffs_base__slice_u8 a_workbuf) {
12190
    return wuffs_lzip__decoder__transform_io(this, a_dst, a_src, a_workbuf);
12191
  }
12192
12193
#endif  // __cplusplus
12194
};  // struct wuffs_lzip__decoder__struct
12195
12196
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
12197
12198
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZIP) || defined(WUFFS_NONMONOLITHIC)
12199
12200
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZW) || defined(WUFFS_NONMONOLITHIC)
12201
12202
// ---------------- Status Codes
12203
12204
extern const char wuffs_lzw__error__bad_code[];
12205
extern const char wuffs_lzw__error__truncated_input[];
12206
12207
// ---------------- Public Consts
12208
12209
#define WUFFS_LZW__DECODER_DST_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0u
12210
12211
#define WUFFS_LZW__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u
12212
12213
#define WUFFS_LZW__QUIRK_LITERAL_WIDTH_PLUS_ONE 1290672128u
12214
12215
// ---------------- Struct Declarations
12216
12217
typedef struct wuffs_lzw__decoder__struct wuffs_lzw__decoder;
12218
12219
#ifdef __cplusplus
12220
extern "C" {
12221
#endif
12222
12223
// ---------------- Public Initializer Prototypes
12224
12225
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
12226
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
12227
//
12228
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
12229
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
12230
12231
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
12232
wuffs_lzw__decoder__initialize(
12233
    wuffs_lzw__decoder* self,
12234
    size_t sizeof_star_self,
12235
    uint64_t wuffs_version,
12236
    uint32_t options);
12237
12238
size_t
12239
sizeof__wuffs_lzw__decoder(void);
12240
12241
// ---------------- Allocs
12242
12243
// These functions allocate and initialize Wuffs structs. They return NULL if
12244
// memory allocation fails. If they return non-NULL, there is no need to call
12245
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
12246
// calling free on the returned pointer. That pointer is effectively a C++
12247
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
12248
12249
wuffs_lzw__decoder*
12250
wuffs_lzw__decoder__alloc(void);
12251
12252
static inline wuffs_base__io_transformer*
12253
wuffs_lzw__decoder__alloc_as__wuffs_base__io_transformer(void) {
12254
  return (wuffs_base__io_transformer*)(wuffs_lzw__decoder__alloc());
12255
}
12256
12257
// ---------------- Upcasts
12258
12259
static inline wuffs_base__io_transformer*
12260
wuffs_lzw__decoder__upcast_as__wuffs_base__io_transformer(
12261
    wuffs_lzw__decoder* p) {
12262
  return (wuffs_base__io_transformer*)p;
12263
}
12264
12265
// ---------------- Public Function Prototypes
12266
12267
WUFFS_BASE__GENERATED_C_CODE
12268
WUFFS_BASE__MAYBE_STATIC uint64_t
12269
wuffs_lzw__decoder__get_quirk(
12270
    const wuffs_lzw__decoder* self,
12271
    uint32_t a_key);
12272
12273
WUFFS_BASE__GENERATED_C_CODE
12274
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
12275
wuffs_lzw__decoder__set_quirk(
12276
    wuffs_lzw__decoder* self,
12277
    uint32_t a_key,
12278
    uint64_t a_value);
12279
12280
WUFFS_BASE__GENERATED_C_CODE
12281
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
12282
wuffs_lzw__decoder__dst_history_retain_length(
12283
    const wuffs_lzw__decoder* self);
12284
12285
WUFFS_BASE__GENERATED_C_CODE
12286
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
12287
wuffs_lzw__decoder__workbuf_len(
12288
    const wuffs_lzw__decoder* self);
12289
12290
WUFFS_BASE__GENERATED_C_CODE
12291
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
12292
wuffs_lzw__decoder__transform_io(
12293
    wuffs_lzw__decoder* self,
12294
    wuffs_base__io_buffer* a_dst,
12295
    wuffs_base__io_buffer* a_src,
12296
    wuffs_base__slice_u8 a_workbuf);
12297
12298
WUFFS_BASE__GENERATED_C_CODE
12299
WUFFS_BASE__MAYBE_STATIC wuffs_base__slice_u8
12300
wuffs_lzw__decoder__flush(
12301
    wuffs_lzw__decoder* self);
12302
12303
#ifdef __cplusplus
12304
}  // extern "C"
12305
#endif
12306
12307
// ---------------- Struct Definitions
12308
12309
// These structs' fields, and the sizeof them, are private implementation
12310
// details that aren't guaranteed to be stable across Wuffs versions.
12311
//
12312
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
12313
12314
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
12315
12316
struct wuffs_lzw__decoder__struct {
12317
  // Do not access the private_impl's or private_data's fields directly. There
12318
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
12319
  // the wuffs_foo__bar__baz functions.
12320
  //
12321
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
12322
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
12323
12324
  struct {
12325
    uint32_t magic;
12326
    uint32_t active_coroutine;
12327
    wuffs_base__vtable vtable_for__wuffs_base__io_transformer;
12328
    wuffs_base__vtable null_vtable;
12329
12330
    uint32_t f_pending_literal_width_plus_one;
12331
    uint32_t f_literal_width;
12332
    uint32_t f_clear_code;
12333
    uint32_t f_end_code;
12334
    uint32_t f_save_code;
12335
    uint32_t f_prev_code;
12336
    uint32_t f_width;
12337
    uint32_t f_bits;
12338
    uint32_t f_n_bits;
12339
    uint32_t f_output_ri;
12340
    uint32_t f_output_wi;
12341
    uint32_t f_read_from_return_value;
12342
    uint16_t f_prefixes[4096];
12343
12344
    uint32_t p_transform_io;
12345
    uint32_t p_write_to;
12346
  } private_impl;
12347
12348
  struct {
12349
    uint8_t f_suffixes[4096][8];
12350
    uint16_t f_lm1s[4096];
12351
    uint8_t f_output[8199];
12352
  } private_data;
12353
12354
#ifdef __cplusplus
12355
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
12356
  using unique_ptr = std::unique_ptr<wuffs_lzw__decoder, wuffs_unique_ptr_deleter>;
12357
12358
  // On failure, the alloc_etc functions return nullptr. They don't throw.
12359
12360
  static inline unique_ptr
12361
  alloc() {
12362
    return unique_ptr(wuffs_lzw__decoder__alloc());
12363
  }
12364
12365
  static inline wuffs_base__io_transformer::unique_ptr
12366
  alloc_as__wuffs_base__io_transformer() {
12367
    return wuffs_base__io_transformer::unique_ptr(
12368
        wuffs_lzw__decoder__alloc_as__wuffs_base__io_transformer());
12369
  }
12370
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
12371
12372
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
12373
  // Disallow constructing or copying an object via standard C++ mechanisms,
12374
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
12375
  // size and field layout is not part of the public, stable, memory-safe API.
12376
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
12377
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
12378
  // their first argument) rather than tweaking bar.private_impl.qux fields.
12379
  //
12380
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
12381
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
12382
  // order to provide convenience methods. These forward on "this", so that you
12383
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
12384
  wuffs_lzw__decoder__struct() = delete;
12385
  wuffs_lzw__decoder__struct(const wuffs_lzw__decoder__struct&) = delete;
12386
  wuffs_lzw__decoder__struct& operator=(
12387
      const wuffs_lzw__decoder__struct&) = delete;
12388
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
12389
12390
#if !defined(WUFFS_IMPLEMENTATION)
12391
  // As above, the size of the struct is not part of the public API, and unless
12392
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
12393
  // allocated, not stack allocated. Its size is not intended to be known at
12394
  // compile time, but it is unfortunately divulged as a side effect of
12395
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
12396
  // instead of "sizeof T", invoking the operator. To make the two values
12397
  // different, so that passing the latter will be rejected by the initialize
12398
  // function, we add an arbitrary amount of dead weight.
12399
  uint8_t dead_weight[123000000];  // 123 MB.
12400
#endif  // !defined(WUFFS_IMPLEMENTATION)
12401
12402
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
12403
  initialize(
12404
      size_t sizeof_star_self,
12405
      uint64_t wuffs_version,
12406
      uint32_t options) {
12407
    return wuffs_lzw__decoder__initialize(
12408
        this, sizeof_star_self, wuffs_version, options);
12409
  }
12410
12411
  inline wuffs_base__io_transformer*
12412
  upcast_as__wuffs_base__io_transformer() {
12413
    return (wuffs_base__io_transformer*)this;
12414
  }
12415
12416
  inline uint64_t
12417
  get_quirk(
12418
      uint32_t a_key) const {
12419
    return wuffs_lzw__decoder__get_quirk(this, a_key);
12420
  }
12421
12422
  inline wuffs_base__status
12423
  set_quirk(
12424
      uint32_t a_key,
12425
      uint64_t a_value) {
12426
    return wuffs_lzw__decoder__set_quirk(this, a_key, a_value);
12427
  }
12428
12429
  inline wuffs_base__optional_u63
12430
  dst_history_retain_length() const {
12431
    return wuffs_lzw__decoder__dst_history_retain_length(this);
12432
  }
12433
12434
  inline wuffs_base__range_ii_u64
12435
  workbuf_len() const {
12436
    return wuffs_lzw__decoder__workbuf_len(this);
12437
  }
12438
12439
  inline wuffs_base__status
12440
  transform_io(
12441
      wuffs_base__io_buffer* a_dst,
12442
      wuffs_base__io_buffer* a_src,
12443
      wuffs_base__slice_u8 a_workbuf) {
12444
    return wuffs_lzw__decoder__transform_io(this, a_dst, a_src, a_workbuf);
12445
  }
12446
12447
  inline wuffs_base__slice_u8
12448
  flush() {
12449
    return wuffs_lzw__decoder__flush(this);
12450
  }
12451
12452
#endif  // __cplusplus
12453
};  // struct wuffs_lzw__decoder__struct
12454
12455
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
12456
12457
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZW) || defined(WUFFS_NONMONOLITHIC)
12458
12459
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NETPBM) || defined(WUFFS_NONMONOLITHIC)
12460
12461
// ---------------- Status Codes
12462
12463
extern const char wuffs_netpbm__error__bad_header[];
12464
extern const char wuffs_netpbm__error__truncated_input[];
12465
extern const char wuffs_netpbm__error__unsupported_netpbm_file[];
12466
12467
// ---------------- Public Consts
12468
12469
#define WUFFS_NETPBM__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u
12470
12471
// ---------------- Struct Declarations
12472
12473
typedef struct wuffs_netpbm__decoder__struct wuffs_netpbm__decoder;
12474
12475
#ifdef __cplusplus
12476
extern "C" {
12477
#endif
12478
12479
// ---------------- Public Initializer Prototypes
12480
12481
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
12482
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
12483
//
12484
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
12485
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
12486
12487
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
12488
wuffs_netpbm__decoder__initialize(
12489
    wuffs_netpbm__decoder* self,
12490
    size_t sizeof_star_self,
12491
    uint64_t wuffs_version,
12492
    uint32_t options);
12493
12494
size_t
12495
sizeof__wuffs_netpbm__decoder(void);
12496
12497
// ---------------- Allocs
12498
12499
// These functions allocate and initialize Wuffs structs. They return NULL if
12500
// memory allocation fails. If they return non-NULL, there is no need to call
12501
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
12502
// calling free on the returned pointer. That pointer is effectively a C++
12503
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
12504
12505
wuffs_netpbm__decoder*
12506
wuffs_netpbm__decoder__alloc(void);
12507
12508
static inline wuffs_base__image_decoder*
12509
wuffs_netpbm__decoder__alloc_as__wuffs_base__image_decoder(void) {
12510
  return (wuffs_base__image_decoder*)(wuffs_netpbm__decoder__alloc());
12511
}
12512
12513
// ---------------- Upcasts
12514
12515
static inline wuffs_base__image_decoder*
12516
wuffs_netpbm__decoder__upcast_as__wuffs_base__image_decoder(
12517
    wuffs_netpbm__decoder* p) {
12518
  return (wuffs_base__image_decoder*)p;
12519
}
12520
12521
// ---------------- Public Function Prototypes
12522
12523
WUFFS_BASE__GENERATED_C_CODE
12524
WUFFS_BASE__MAYBE_STATIC uint64_t
12525
wuffs_netpbm__decoder__get_quirk(
12526
    const wuffs_netpbm__decoder* self,
12527
    uint32_t a_key);
12528
12529
WUFFS_BASE__GENERATED_C_CODE
12530
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
12531
wuffs_netpbm__decoder__set_quirk(
12532
    wuffs_netpbm__decoder* self,
12533
    uint32_t a_key,
12534
    uint64_t a_value);
12535
12536
WUFFS_BASE__GENERATED_C_CODE
12537
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
12538
wuffs_netpbm__decoder__decode_image_config(
12539
    wuffs_netpbm__decoder* self,
12540
    wuffs_base__image_config* a_dst,
12541
    wuffs_base__io_buffer* a_src);
12542
12543
WUFFS_BASE__GENERATED_C_CODE
12544
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
12545
wuffs_netpbm__decoder__decode_frame_config(
12546
    wuffs_netpbm__decoder* self,
12547
    wuffs_base__frame_config* a_dst,
12548
    wuffs_base__io_buffer* a_src);
12549
12550
WUFFS_BASE__GENERATED_C_CODE
12551
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
12552
wuffs_netpbm__decoder__decode_frame(
12553
    wuffs_netpbm__decoder* self,
12554
    wuffs_base__pixel_buffer* a_dst,
12555
    wuffs_base__io_buffer* a_src,
12556
    wuffs_base__pixel_blend a_blend,
12557
    wuffs_base__slice_u8 a_workbuf,
12558
    wuffs_base__decode_frame_options* a_opts);
12559
12560
WUFFS_BASE__GENERATED_C_CODE
12561
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
12562
wuffs_netpbm__decoder__frame_dirty_rect(
12563
    const wuffs_netpbm__decoder* self);
12564
12565
WUFFS_BASE__GENERATED_C_CODE
12566
WUFFS_BASE__MAYBE_STATIC uint32_t
12567
wuffs_netpbm__decoder__num_animation_loops(
12568
    const wuffs_netpbm__decoder* self);
12569
12570
WUFFS_BASE__GENERATED_C_CODE
12571
WUFFS_BASE__MAYBE_STATIC uint64_t
12572
wuffs_netpbm__decoder__num_decoded_frame_configs(
12573
    const wuffs_netpbm__decoder* self);
12574
12575
WUFFS_BASE__GENERATED_C_CODE
12576
WUFFS_BASE__MAYBE_STATIC uint64_t
12577
wuffs_netpbm__decoder__num_decoded_frames(
12578
    const wuffs_netpbm__decoder* self);
12579
12580
WUFFS_BASE__GENERATED_C_CODE
12581
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
12582
wuffs_netpbm__decoder__restart_frame(
12583
    wuffs_netpbm__decoder* self,
12584
    uint64_t a_index,
12585
    uint64_t a_io_position);
12586
12587
WUFFS_BASE__GENERATED_C_CODE
12588
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
12589
wuffs_netpbm__decoder__set_report_metadata(
12590
    wuffs_netpbm__decoder* self,
12591
    uint32_t a_fourcc,
12592
    bool a_report);
12593
12594
WUFFS_BASE__GENERATED_C_CODE
12595
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
12596
wuffs_netpbm__decoder__tell_me_more(
12597
    wuffs_netpbm__decoder* self,
12598
    wuffs_base__io_buffer* a_dst,
12599
    wuffs_base__more_information* a_minfo,
12600
    wuffs_base__io_buffer* a_src);
12601
12602
WUFFS_BASE__GENERATED_C_CODE
12603
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
12604
wuffs_netpbm__decoder__workbuf_len(
12605
    const wuffs_netpbm__decoder* self);
12606
12607
#ifdef __cplusplus
12608
}  // extern "C"
12609
#endif
12610
12611
// ---------------- Struct Definitions
12612
12613
// These structs' fields, and the sizeof them, are private implementation
12614
// details that aren't guaranteed to be stable across Wuffs versions.
12615
//
12616
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
12617
12618
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
12619
12620
struct wuffs_netpbm__decoder__struct {
12621
  // Do not access the private_impl's or private_data's fields directly. There
12622
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
12623
  // the wuffs_foo__bar__baz functions.
12624
  //
12625
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
12626
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
12627
12628
  struct {
12629
    uint32_t magic;
12630
    uint32_t active_coroutine;
12631
    wuffs_base__vtable vtable_for__wuffs_base__image_decoder;
12632
    wuffs_base__vtable null_vtable;
12633
12634
    uint32_t f_pixfmt;
12635
    uint32_t f_width;
12636
    uint32_t f_height;
12637
    uint32_t f_max_value;
12638
    uint8_t f_call_sequence;
12639
    uint64_t f_frame_config_io_position;
12640
    uint32_t f_dst_x;
12641
    uint32_t f_dst_y;
12642
    wuffs_base__pixel_swizzler f_swizzler;
12643
12644
    uint32_t p_decode_image_config;
12645
    uint32_t p_do_decode_image_config;
12646
    uint32_t p_decode_frame_config;
12647
    uint32_t p_do_decode_frame_config;
12648
    uint32_t p_decode_frame;
12649
    uint32_t p_do_decode_frame;
12650
  } private_impl;
12651
12652
  struct {
12653
    uint8_t f_buffer[8];
12654
  } private_data;
12655
12656
#ifdef __cplusplus
12657
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
12658
  using unique_ptr = std::unique_ptr<wuffs_netpbm__decoder, wuffs_unique_ptr_deleter>;
12659
12660
  // On failure, the alloc_etc functions return nullptr. They don't throw.
12661
12662
  static inline unique_ptr
12663
  alloc() {
12664
    return unique_ptr(wuffs_netpbm__decoder__alloc());
12665
  }
12666
12667
  static inline wuffs_base__image_decoder::unique_ptr
12668
  alloc_as__wuffs_base__image_decoder() {
12669
    return wuffs_base__image_decoder::unique_ptr(
12670
        wuffs_netpbm__decoder__alloc_as__wuffs_base__image_decoder());
12671
  }
12672
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
12673
12674
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
12675
  // Disallow constructing or copying an object via standard C++ mechanisms,
12676
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
12677
  // size and field layout is not part of the public, stable, memory-safe API.
12678
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
12679
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
12680
  // their first argument) rather than tweaking bar.private_impl.qux fields.
12681
  //
12682
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
12683
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
12684
  // order to provide convenience methods. These forward on "this", so that you
12685
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
12686
  wuffs_netpbm__decoder__struct() = delete;
12687
  wuffs_netpbm__decoder__struct(const wuffs_netpbm__decoder__struct&) = delete;
12688
  wuffs_netpbm__decoder__struct& operator=(
12689
      const wuffs_netpbm__decoder__struct&) = delete;
12690
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
12691
12692
#if !defined(WUFFS_IMPLEMENTATION)
12693
  // As above, the size of the struct is not part of the public API, and unless
12694
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
12695
  // allocated, not stack allocated. Its size is not intended to be known at
12696
  // compile time, but it is unfortunately divulged as a side effect of
12697
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
12698
  // instead of "sizeof T", invoking the operator. To make the two values
12699
  // different, so that passing the latter will be rejected by the initialize
12700
  // function, we add an arbitrary amount of dead weight.
12701
  uint8_t dead_weight[123000000];  // 123 MB.
12702
#endif  // !defined(WUFFS_IMPLEMENTATION)
12703
12704
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
12705
  initialize(
12706
      size_t sizeof_star_self,
12707
      uint64_t wuffs_version,
12708
      uint32_t options) {
12709
    return wuffs_netpbm__decoder__initialize(
12710
        this, sizeof_star_self, wuffs_version, options);
12711
  }
12712
12713
  inline wuffs_base__image_decoder*
12714
  upcast_as__wuffs_base__image_decoder() {
12715
    return (wuffs_base__image_decoder*)this;
12716
  }
12717
12718
  inline uint64_t
12719
  get_quirk(
12720
      uint32_t a_key) const {
12721
    return wuffs_netpbm__decoder__get_quirk(this, a_key);
12722
  }
12723
12724
  inline wuffs_base__status
12725
  set_quirk(
12726
      uint32_t a_key,
12727
      uint64_t a_value) {
12728
    return wuffs_netpbm__decoder__set_quirk(this, a_key, a_value);
12729
  }
12730
12731
  inline wuffs_base__status
12732
  decode_image_config(
12733
      wuffs_base__image_config* a_dst,
12734
      wuffs_base__io_buffer* a_src) {
12735
    return wuffs_netpbm__decoder__decode_image_config(this, a_dst, a_src);
12736
  }
12737
12738
  inline wuffs_base__status
12739
  decode_frame_config(
12740
      wuffs_base__frame_config* a_dst,
12741
      wuffs_base__io_buffer* a_src) {
12742
    return wuffs_netpbm__decoder__decode_frame_config(this, a_dst, a_src);
12743
  }
12744
12745
  inline wuffs_base__status
12746
  decode_frame(
12747
      wuffs_base__pixel_buffer* a_dst,
12748
      wuffs_base__io_buffer* a_src,
12749
      wuffs_base__pixel_blend a_blend,
12750
      wuffs_base__slice_u8 a_workbuf,
12751
      wuffs_base__decode_frame_options* a_opts) {
12752
    return wuffs_netpbm__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts);
12753
  }
12754
12755
  inline wuffs_base__rect_ie_u32
12756
  frame_dirty_rect() const {
12757
    return wuffs_netpbm__decoder__frame_dirty_rect(this);
12758
  }
12759
12760
  inline uint32_t
12761
  num_animation_loops() const {
12762
    return wuffs_netpbm__decoder__num_animation_loops(this);
12763
  }
12764
12765
  inline uint64_t
12766
  num_decoded_frame_configs() const {
12767
    return wuffs_netpbm__decoder__num_decoded_frame_configs(this);
12768
  }
12769
12770
  inline uint64_t
12771
  num_decoded_frames() const {
12772
    return wuffs_netpbm__decoder__num_decoded_frames(this);
12773
  }
12774
12775
  inline wuffs_base__status
12776
  restart_frame(
12777
      uint64_t a_index,
12778
      uint64_t a_io_position) {
12779
    return wuffs_netpbm__decoder__restart_frame(this, a_index, a_io_position);
12780
  }
12781
12782
  inline wuffs_base__empty_struct
12783
  set_report_metadata(
12784
      uint32_t a_fourcc,
12785
      bool a_report) {
12786
    return wuffs_netpbm__decoder__set_report_metadata(this, a_fourcc, a_report);
12787
  }
12788
12789
  inline wuffs_base__status
12790
  tell_me_more(
12791
      wuffs_base__io_buffer* a_dst,
12792
      wuffs_base__more_information* a_minfo,
12793
      wuffs_base__io_buffer* a_src) {
12794
    return wuffs_netpbm__decoder__tell_me_more(this, a_dst, a_minfo, a_src);
12795
  }
12796
12797
  inline wuffs_base__range_ii_u64
12798
  workbuf_len() const {
12799
    return wuffs_netpbm__decoder__workbuf_len(this);
12800
  }
12801
12802
#endif  // __cplusplus
12803
};  // struct wuffs_netpbm__decoder__struct
12804
12805
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
12806
12807
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NETPBM) || defined(WUFFS_NONMONOLITHIC)
12808
12809
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NIE) || defined(WUFFS_NONMONOLITHIC)
12810
12811
// ---------------- Status Codes
12812
12813
extern const char wuffs_nie__error__bad_frame[];
12814
extern const char wuffs_nie__error__bad_header[];
12815
extern const char wuffs_nie__error__truncated_input[];
12816
extern const char wuffs_nie__error__unsupported_restart_frame_index[];
12817
12818
// ---------------- Public Consts
12819
12820
#define WUFFS_NIE__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u
12821
12822
// ---------------- Struct Declarations
12823
12824
typedef struct wuffs_nie__decoder__struct wuffs_nie__decoder;
12825
12826
#ifdef __cplusplus
12827
extern "C" {
12828
#endif
12829
12830
// ---------------- Public Initializer Prototypes
12831
12832
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
12833
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
12834
//
12835
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
12836
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
12837
12838
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
12839
wuffs_nie__decoder__initialize(
12840
    wuffs_nie__decoder* self,
12841
    size_t sizeof_star_self,
12842
    uint64_t wuffs_version,
12843
    uint32_t options);
12844
12845
size_t
12846
sizeof__wuffs_nie__decoder(void);
12847
12848
// ---------------- Allocs
12849
12850
// These functions allocate and initialize Wuffs structs. They return NULL if
12851
// memory allocation fails. If they return non-NULL, there is no need to call
12852
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
12853
// calling free on the returned pointer. That pointer is effectively a C++
12854
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
12855
12856
wuffs_nie__decoder*
12857
wuffs_nie__decoder__alloc(void);
12858
12859
static inline wuffs_base__image_decoder*
12860
wuffs_nie__decoder__alloc_as__wuffs_base__image_decoder(void) {
12861
  return (wuffs_base__image_decoder*)(wuffs_nie__decoder__alloc());
12862
}
12863
12864
// ---------------- Upcasts
12865
12866
static inline wuffs_base__image_decoder*
12867
wuffs_nie__decoder__upcast_as__wuffs_base__image_decoder(
12868
    wuffs_nie__decoder* p) {
12869
  return (wuffs_base__image_decoder*)p;
12870
}
12871
12872
// ---------------- Public Function Prototypes
12873
12874
WUFFS_BASE__GENERATED_C_CODE
12875
WUFFS_BASE__MAYBE_STATIC uint64_t
12876
wuffs_nie__decoder__get_quirk(
12877
    const wuffs_nie__decoder* self,
12878
    uint32_t a_key);
12879
12880
WUFFS_BASE__GENERATED_C_CODE
12881
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
12882
wuffs_nie__decoder__set_quirk(
12883
    wuffs_nie__decoder* self,
12884
    uint32_t a_key,
12885
    uint64_t a_value);
12886
12887
WUFFS_BASE__GENERATED_C_CODE
12888
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
12889
wuffs_nie__decoder__decode_image_config(
12890
    wuffs_nie__decoder* self,
12891
    wuffs_base__image_config* a_dst,
12892
    wuffs_base__io_buffer* a_src);
12893
12894
WUFFS_BASE__GENERATED_C_CODE
12895
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
12896
wuffs_nie__decoder__decode_frame_config(
12897
    wuffs_nie__decoder* self,
12898
    wuffs_base__frame_config* a_dst,
12899
    wuffs_base__io_buffer* a_src);
12900
12901
WUFFS_BASE__GENERATED_C_CODE
12902
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
12903
wuffs_nie__decoder__decode_frame(
12904
    wuffs_nie__decoder* self,
12905
    wuffs_base__pixel_buffer* a_dst,
12906
    wuffs_base__io_buffer* a_src,
12907
    wuffs_base__pixel_blend a_blend,
12908
    wuffs_base__slice_u8 a_workbuf,
12909
    wuffs_base__decode_frame_options* a_opts);
12910
12911
WUFFS_BASE__GENERATED_C_CODE
12912
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
12913
wuffs_nie__decoder__frame_dirty_rect(
12914
    const wuffs_nie__decoder* self);
12915
12916
WUFFS_BASE__GENERATED_C_CODE
12917
WUFFS_BASE__MAYBE_STATIC uint32_t
12918
wuffs_nie__decoder__num_animation_loops(
12919
    const wuffs_nie__decoder* self);
12920
12921
WUFFS_BASE__GENERATED_C_CODE
12922
WUFFS_BASE__MAYBE_STATIC uint64_t
12923
wuffs_nie__decoder__num_decoded_frame_configs(
12924
    const wuffs_nie__decoder* self);
12925
12926
WUFFS_BASE__GENERATED_C_CODE
12927
WUFFS_BASE__MAYBE_STATIC uint64_t
12928
wuffs_nie__decoder__num_decoded_frames(
12929
    const wuffs_nie__decoder* self);
12930
12931
WUFFS_BASE__GENERATED_C_CODE
12932
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
12933
wuffs_nie__decoder__restart_frame(
12934
    wuffs_nie__decoder* self,
12935
    uint64_t a_index,
12936
    uint64_t a_io_position);
12937
12938
WUFFS_BASE__GENERATED_C_CODE
12939
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
12940
wuffs_nie__decoder__set_report_metadata(
12941
    wuffs_nie__decoder* self,
12942
    uint32_t a_fourcc,
12943
    bool a_report);
12944
12945
WUFFS_BASE__GENERATED_C_CODE
12946
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
12947
wuffs_nie__decoder__tell_me_more(
12948
    wuffs_nie__decoder* self,
12949
    wuffs_base__io_buffer* a_dst,
12950
    wuffs_base__more_information* a_minfo,
12951
    wuffs_base__io_buffer* a_src);
12952
12953
WUFFS_BASE__GENERATED_C_CODE
12954
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
12955
wuffs_nie__decoder__workbuf_len(
12956
    const wuffs_nie__decoder* self);
12957
12958
#ifdef __cplusplus
12959
}  // extern "C"
12960
#endif
12961
12962
// ---------------- Struct Definitions
12963
12964
// These structs' fields, and the sizeof them, are private implementation
12965
// details that aren't guaranteed to be stable across Wuffs versions.
12966
//
12967
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
12968
12969
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
12970
12971
struct wuffs_nie__decoder__struct {
12972
  // Do not access the private_impl's or private_data's fields directly. There
12973
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
12974
  // the wuffs_foo__bar__baz functions.
12975
  //
12976
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
12977
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
12978
12979
  struct {
12980
    uint32_t magic;
12981
    uint32_t active_coroutine;
12982
    wuffs_base__vtable vtable_for__wuffs_base__image_decoder;
12983
    wuffs_base__vtable null_vtable;
12984
12985
    uint32_t f_pixfmt;
12986
    uint32_t f_width;
12987
    uint32_t f_height;
12988
    uint8_t f_call_sequence;
12989
    bool f_animated;
12990
    uint32_t f_nie_config;
12991
    uint32_t f_num_animation_loops_value;
12992
    uint64_t f_prev_duration;
12993
    uint64_t f_curr_duration;
12994
    uint64_t f_num_decoded_frame_configs_value;
12995
    uint64_t f_num_decoded_frames_value;
12996
    uint32_t f_dst_x;
12997
    uint32_t f_dst_y;
12998
    wuffs_base__pixel_swizzler f_swizzler;
12999
13000
    uint32_t p_decode_image_config;
13001
    uint32_t p_do_decode_image_config;
13002
    uint32_t p_decode_frame_config;
13003
    uint32_t p_do_decode_frame_config;
13004
    uint32_t p_decode_animation_info;
13005
    uint32_t p_skip_frame;
13006
    uint32_t p_decode_frame;
13007
    uint32_t p_do_decode_frame;
13008
  } private_impl;
13009
13010
  struct {
13011
    struct {
13012
      uint64_t scratch;
13013
    } s_do_decode_image_config;
13014
    struct {
13015
      uint64_t scratch;
13016
    } s_decode_animation_info;
13017
    struct {
13018
      uint64_t scratch;
13019
    } s_skip_frame;
13020
  } private_data;
13021
13022
#ifdef __cplusplus
13023
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
13024
  using unique_ptr = std::unique_ptr<wuffs_nie__decoder, wuffs_unique_ptr_deleter>;
13025
13026
  // On failure, the alloc_etc functions return nullptr. They don't throw.
13027
13028
  static inline unique_ptr
13029
  alloc() {
13030
    return unique_ptr(wuffs_nie__decoder__alloc());
13031
  }
13032
13033
  static inline wuffs_base__image_decoder::unique_ptr
13034
  alloc_as__wuffs_base__image_decoder() {
13035
    return wuffs_base__image_decoder::unique_ptr(
13036
        wuffs_nie__decoder__alloc_as__wuffs_base__image_decoder());
13037
  }
13038
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
13039
13040
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
13041
  // Disallow constructing or copying an object via standard C++ mechanisms,
13042
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
13043
  // size and field layout is not part of the public, stable, memory-safe API.
13044
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
13045
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
13046
  // their first argument) rather than tweaking bar.private_impl.qux fields.
13047
  //
13048
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
13049
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
13050
  // order to provide convenience methods. These forward on "this", so that you
13051
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
13052
  wuffs_nie__decoder__struct() = delete;
13053
  wuffs_nie__decoder__struct(const wuffs_nie__decoder__struct&) = delete;
13054
  wuffs_nie__decoder__struct& operator=(
13055
      const wuffs_nie__decoder__struct&) = delete;
13056
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
13057
13058
#if !defined(WUFFS_IMPLEMENTATION)
13059
  // As above, the size of the struct is not part of the public API, and unless
13060
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
13061
  // allocated, not stack allocated. Its size is not intended to be known at
13062
  // compile time, but it is unfortunately divulged as a side effect of
13063
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
13064
  // instead of "sizeof T", invoking the operator. To make the two values
13065
  // different, so that passing the latter will be rejected by the initialize
13066
  // function, we add an arbitrary amount of dead weight.
13067
  uint8_t dead_weight[123000000];  // 123 MB.
13068
#endif  // !defined(WUFFS_IMPLEMENTATION)
13069
13070
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
13071
  initialize(
13072
      size_t sizeof_star_self,
13073
      uint64_t wuffs_version,
13074
      uint32_t options) {
13075
    return wuffs_nie__decoder__initialize(
13076
        this, sizeof_star_self, wuffs_version, options);
13077
  }
13078
13079
  inline wuffs_base__image_decoder*
13080
  upcast_as__wuffs_base__image_decoder() {
13081
    return (wuffs_base__image_decoder*)this;
13082
  }
13083
13084
  inline uint64_t
13085
  get_quirk(
13086
      uint32_t a_key) const {
13087
    return wuffs_nie__decoder__get_quirk(this, a_key);
13088
  }
13089
13090
  inline wuffs_base__status
13091
  set_quirk(
13092
      uint32_t a_key,
13093
      uint64_t a_value) {
13094
    return wuffs_nie__decoder__set_quirk(this, a_key, a_value);
13095
  }
13096
13097
  inline wuffs_base__status
13098
  decode_image_config(
13099
      wuffs_base__image_config* a_dst,
13100
      wuffs_base__io_buffer* a_src) {
13101
    return wuffs_nie__decoder__decode_image_config(this, a_dst, a_src);
13102
  }
13103
13104
  inline wuffs_base__status
13105
  decode_frame_config(
13106
      wuffs_base__frame_config* a_dst,
13107
      wuffs_base__io_buffer* a_src) {
13108
    return wuffs_nie__decoder__decode_frame_config(this, a_dst, a_src);
13109
  }
13110
13111
  inline wuffs_base__status
13112
  decode_frame(
13113
      wuffs_base__pixel_buffer* a_dst,
13114
      wuffs_base__io_buffer* a_src,
13115
      wuffs_base__pixel_blend a_blend,
13116
      wuffs_base__slice_u8 a_workbuf,
13117
      wuffs_base__decode_frame_options* a_opts) {
13118
    return wuffs_nie__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts);
13119
  }
13120
13121
  inline wuffs_base__rect_ie_u32
13122
  frame_dirty_rect() const {
13123
    return wuffs_nie__decoder__frame_dirty_rect(this);
13124
  }
13125
13126
  inline uint32_t
13127
  num_animation_loops() const {
13128
    return wuffs_nie__decoder__num_animation_loops(this);
13129
  }
13130
13131
  inline uint64_t
13132
  num_decoded_frame_configs() const {
13133
    return wuffs_nie__decoder__num_decoded_frame_configs(this);
13134
  }
13135
13136
  inline uint64_t
13137
  num_decoded_frames() const {
13138
    return wuffs_nie__decoder__num_decoded_frames(this);
13139
  }
13140
13141
  inline wuffs_base__status
13142
  restart_frame(
13143
      uint64_t a_index,
13144
      uint64_t a_io_position) {
13145
    return wuffs_nie__decoder__restart_frame(this, a_index, a_io_position);
13146
  }
13147
13148
  inline wuffs_base__empty_struct
13149
  set_report_metadata(
13150
      uint32_t a_fourcc,
13151
      bool a_report) {
13152
    return wuffs_nie__decoder__set_report_metadata(this, a_fourcc, a_report);
13153
  }
13154
13155
  inline wuffs_base__status
13156
  tell_me_more(
13157
      wuffs_base__io_buffer* a_dst,
13158
      wuffs_base__more_information* a_minfo,
13159
      wuffs_base__io_buffer* a_src) {
13160
    return wuffs_nie__decoder__tell_me_more(this, a_dst, a_minfo, a_src);
13161
  }
13162
13163
  inline wuffs_base__range_ii_u64
13164
  workbuf_len() const {
13165
    return wuffs_nie__decoder__workbuf_len(this);
13166
  }
13167
13168
#endif  // __cplusplus
13169
};  // struct wuffs_nie__decoder__struct
13170
13171
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
13172
13173
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NIE) || defined(WUFFS_NONMONOLITHIC)
13174
13175
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ZLIB) || defined(WUFFS_NONMONOLITHIC)
13176
13177
// ---------------- Status Codes
13178
13179
extern const char wuffs_zlib__note__dictionary_required[];
13180
extern const char wuffs_zlib__error__bad_checksum[];
13181
extern const char wuffs_zlib__error__bad_compression_method[];
13182
extern const char wuffs_zlib__error__bad_compression_window_size[];
13183
extern const char wuffs_zlib__error__bad_parity_check[];
13184
extern const char wuffs_zlib__error__incorrect_dictionary[];
13185
extern const char wuffs_zlib__error__truncated_input[];
13186
13187
// ---------------- Public Consts
13188
13189
#define WUFFS_ZLIB__QUIRK_JUST_RAW_DEFLATE 2056083456u
13190
13191
#define WUFFS_ZLIB__DECODER_DST_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0u
13192
13193
#define WUFFS_ZLIB__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 1u
13194
13195
// ---------------- Struct Declarations
13196
13197
typedef struct wuffs_zlib__decoder__struct wuffs_zlib__decoder;
13198
13199
#ifdef __cplusplus
13200
extern "C" {
13201
#endif
13202
13203
// ---------------- Public Initializer Prototypes
13204
13205
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
13206
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
13207
//
13208
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
13209
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
13210
13211
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
13212
wuffs_zlib__decoder__initialize(
13213
    wuffs_zlib__decoder* self,
13214
    size_t sizeof_star_self,
13215
    uint64_t wuffs_version,
13216
    uint32_t options);
13217
13218
size_t
13219
sizeof__wuffs_zlib__decoder(void);
13220
13221
// ---------------- Allocs
13222
13223
// These functions allocate and initialize Wuffs structs. They return NULL if
13224
// memory allocation fails. If they return non-NULL, there is no need to call
13225
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
13226
// calling free on the returned pointer. That pointer is effectively a C++
13227
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
13228
13229
wuffs_zlib__decoder*
13230
wuffs_zlib__decoder__alloc(void);
13231
13232
static inline wuffs_base__io_transformer*
13233
wuffs_zlib__decoder__alloc_as__wuffs_base__io_transformer(void) {
13234
  return (wuffs_base__io_transformer*)(wuffs_zlib__decoder__alloc());
13235
}
13236
13237
// ---------------- Upcasts
13238
13239
static inline wuffs_base__io_transformer*
13240
wuffs_zlib__decoder__upcast_as__wuffs_base__io_transformer(
13241
    wuffs_zlib__decoder* p) {
13242
  return (wuffs_base__io_transformer*)p;
13243
}
13244
13245
// ---------------- Public Function Prototypes
13246
13247
WUFFS_BASE__GENERATED_C_CODE
13248
WUFFS_BASE__MAYBE_STATIC uint32_t
13249
wuffs_zlib__decoder__dictionary_id(
13250
    const wuffs_zlib__decoder* self);
13251
13252
WUFFS_BASE__GENERATED_C_CODE
13253
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
13254
wuffs_zlib__decoder__add_dictionary(
13255
    wuffs_zlib__decoder* self,
13256
    wuffs_base__slice_u8 a_dict);
13257
13258
WUFFS_BASE__GENERATED_C_CODE
13259
WUFFS_BASE__MAYBE_STATIC uint64_t
13260
wuffs_zlib__decoder__get_quirk(
13261
    const wuffs_zlib__decoder* self,
13262
    uint32_t a_key);
13263
13264
WUFFS_BASE__GENERATED_C_CODE
13265
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
13266
wuffs_zlib__decoder__set_quirk(
13267
    wuffs_zlib__decoder* self,
13268
    uint32_t a_key,
13269
    uint64_t a_value);
13270
13271
WUFFS_BASE__GENERATED_C_CODE
13272
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
13273
wuffs_zlib__decoder__dst_history_retain_length(
13274
    const wuffs_zlib__decoder* self);
13275
13276
WUFFS_BASE__GENERATED_C_CODE
13277
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
13278
wuffs_zlib__decoder__workbuf_len(
13279
    const wuffs_zlib__decoder* self);
13280
13281
WUFFS_BASE__GENERATED_C_CODE
13282
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
13283
wuffs_zlib__decoder__transform_io(
13284
    wuffs_zlib__decoder* self,
13285
    wuffs_base__io_buffer* a_dst,
13286
    wuffs_base__io_buffer* a_src,
13287
    wuffs_base__slice_u8 a_workbuf);
13288
13289
#ifdef __cplusplus
13290
}  // extern "C"
13291
#endif
13292
13293
// ---------------- Struct Definitions
13294
13295
// These structs' fields, and the sizeof them, are private implementation
13296
// details that aren't guaranteed to be stable across Wuffs versions.
13297
//
13298
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
13299
13300
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
13301
13302
struct wuffs_zlib__decoder__struct {
13303
  // Do not access the private_impl's or private_data's fields directly. There
13304
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
13305
  // the wuffs_foo__bar__baz functions.
13306
  //
13307
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
13308
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
13309
13310
  struct {
13311
    uint32_t magic;
13312
    uint32_t active_coroutine;
13313
    wuffs_base__vtable vtable_for__wuffs_base__io_transformer;
13314
    wuffs_base__vtable null_vtable;
13315
13316
    bool f_bad_call_sequence;
13317
    bool f_header_complete;
13318
    bool f_got_dictionary;
13319
    bool f_want_dictionary;
13320
    bool f_quirks[1];
13321
    bool f_ignore_checksum;
13322
    uint32_t f_dict_id_have;
13323
    uint32_t f_dict_id_want;
13324
13325
    uint32_t p_transform_io;
13326
    uint32_t p_do_transform_io;
13327
  } private_impl;
13328
13329
  struct {
13330
    wuffs_adler32__hasher f_checksum;
13331
    wuffs_adler32__hasher f_dict_id_hasher;
13332
    wuffs_deflate__decoder f_flate;
13333
13334
    struct {
13335
      uint32_t v_checksum_have;
13336
      uint64_t scratch;
13337
    } s_do_transform_io;
13338
  } private_data;
13339
13340
#ifdef __cplusplus
13341
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
13342
  using unique_ptr = std::unique_ptr<wuffs_zlib__decoder, wuffs_unique_ptr_deleter>;
13343
13344
  // On failure, the alloc_etc functions return nullptr. They don't throw.
13345
13346
  static inline unique_ptr
13347
  alloc() {
13348
    return unique_ptr(wuffs_zlib__decoder__alloc());
13349
  }
13350
13351
  static inline wuffs_base__io_transformer::unique_ptr
13352
  alloc_as__wuffs_base__io_transformer() {
13353
    return wuffs_base__io_transformer::unique_ptr(
13354
        wuffs_zlib__decoder__alloc_as__wuffs_base__io_transformer());
13355
  }
13356
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
13357
13358
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
13359
  // Disallow constructing or copying an object via standard C++ mechanisms,
13360
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
13361
  // size and field layout is not part of the public, stable, memory-safe API.
13362
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
13363
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
13364
  // their first argument) rather than tweaking bar.private_impl.qux fields.
13365
  //
13366
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
13367
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
13368
  // order to provide convenience methods. These forward on "this", so that you
13369
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
13370
  wuffs_zlib__decoder__struct() = delete;
13371
  wuffs_zlib__decoder__struct(const wuffs_zlib__decoder__struct&) = delete;
13372
  wuffs_zlib__decoder__struct& operator=(
13373
      const wuffs_zlib__decoder__struct&) = delete;
13374
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
13375
13376
#if !defined(WUFFS_IMPLEMENTATION)
13377
  // As above, the size of the struct is not part of the public API, and unless
13378
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
13379
  // allocated, not stack allocated. Its size is not intended to be known at
13380
  // compile time, but it is unfortunately divulged as a side effect of
13381
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
13382
  // instead of "sizeof T", invoking the operator. To make the two values
13383
  // different, so that passing the latter will be rejected by the initialize
13384
  // function, we add an arbitrary amount of dead weight.
13385
  uint8_t dead_weight[123000000];  // 123 MB.
13386
#endif  // !defined(WUFFS_IMPLEMENTATION)
13387
13388
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
13389
  initialize(
13390
      size_t sizeof_star_self,
13391
      uint64_t wuffs_version,
13392
      uint32_t options) {
13393
    return wuffs_zlib__decoder__initialize(
13394
        this, sizeof_star_self, wuffs_version, options);
13395
  }
13396
13397
  inline wuffs_base__io_transformer*
13398
  upcast_as__wuffs_base__io_transformer() {
13399
    return (wuffs_base__io_transformer*)this;
13400
  }
13401
13402
  inline uint32_t
13403
  dictionary_id() const {
13404
    return wuffs_zlib__decoder__dictionary_id(this);
13405
  }
13406
13407
  inline wuffs_base__empty_struct
13408
  add_dictionary(
13409
      wuffs_base__slice_u8 a_dict) {
13410
    return wuffs_zlib__decoder__add_dictionary(this, a_dict);
13411
  }
13412
13413
  inline uint64_t
13414
  get_quirk(
13415
      uint32_t a_key) const {
13416
    return wuffs_zlib__decoder__get_quirk(this, a_key);
13417
  }
13418
13419
  inline wuffs_base__status
13420
  set_quirk(
13421
      uint32_t a_key,
13422
      uint64_t a_value) {
13423
    return wuffs_zlib__decoder__set_quirk(this, a_key, a_value);
13424
  }
13425
13426
  inline wuffs_base__optional_u63
13427
  dst_history_retain_length() const {
13428
    return wuffs_zlib__decoder__dst_history_retain_length(this);
13429
  }
13430
13431
  inline wuffs_base__range_ii_u64
13432
  workbuf_len() const {
13433
    return wuffs_zlib__decoder__workbuf_len(this);
13434
  }
13435
13436
  inline wuffs_base__status
13437
  transform_io(
13438
      wuffs_base__io_buffer* a_dst,
13439
      wuffs_base__io_buffer* a_src,
13440
      wuffs_base__slice_u8 a_workbuf) {
13441
    return wuffs_zlib__decoder__transform_io(this, a_dst, a_src, a_workbuf);
13442
  }
13443
13444
#endif  // __cplusplus
13445
};  // struct wuffs_zlib__decoder__struct
13446
13447
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
13448
13449
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ZLIB) || defined(WUFFS_NONMONOLITHIC)
13450
13451
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__PNG) || defined(WUFFS_NONMONOLITHIC)
13452
13453
// ---------------- Status Codes
13454
13455
extern const char wuffs_png__error__bad_animation_sequence_number[];
13456
extern const char wuffs_png__error__bad_checksum[];
13457
extern const char wuffs_png__error__bad_chunk[];
13458
extern const char wuffs_png__error__bad_filter[];
13459
extern const char wuffs_png__error__bad_header[];
13460
extern const char wuffs_png__error__bad_text_chunk_not_latin_1[];
13461
extern const char wuffs_png__error__missing_palette[];
13462
extern const char wuffs_png__error__truncated_input[];
13463
extern const char wuffs_png__error__unsupported_cgbi_extension[];
13464
extern const char wuffs_png__error__unsupported_png_compression_method[];
13465
extern const char wuffs_png__error__unsupported_png_file[];
13466
13467
// ---------------- Public Consts
13468
13469
#define WUFFS_PNG__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 2251799562027015u
13470
13471
#define WUFFS_PNG__DECODER_SRC_IO_BUFFER_LENGTH_MIN_INCL 8u
13472
13473
// ---------------- Struct Declarations
13474
13475
typedef struct wuffs_png__decoder__struct wuffs_png__decoder;
13476
13477
#ifdef __cplusplus
13478
extern "C" {
13479
#endif
13480
13481
// ---------------- Public Initializer Prototypes
13482
13483
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
13484
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
13485
//
13486
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
13487
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
13488
13489
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
13490
wuffs_png__decoder__initialize(
13491
    wuffs_png__decoder* self,
13492
    size_t sizeof_star_self,
13493
    uint64_t wuffs_version,
13494
    uint32_t options);
13495
13496
size_t
13497
sizeof__wuffs_png__decoder(void);
13498
13499
// ---------------- Allocs
13500
13501
// These functions allocate and initialize Wuffs structs. They return NULL if
13502
// memory allocation fails. If they return non-NULL, there is no need to call
13503
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
13504
// calling free on the returned pointer. That pointer is effectively a C++
13505
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
13506
13507
wuffs_png__decoder*
13508
wuffs_png__decoder__alloc(void);
13509
13510
static inline wuffs_base__image_decoder*
13511
wuffs_png__decoder__alloc_as__wuffs_base__image_decoder(void) {
13512
  return (wuffs_base__image_decoder*)(wuffs_png__decoder__alloc());
13513
}
13514
13515
// ---------------- Upcasts
13516
13517
static inline wuffs_base__image_decoder*
13518
wuffs_png__decoder__upcast_as__wuffs_base__image_decoder(
13519
    wuffs_png__decoder* p) {
13520
  return (wuffs_base__image_decoder*)p;
13521
}
13522
13523
// ---------------- Public Function Prototypes
13524
13525
WUFFS_BASE__GENERATED_C_CODE
13526
WUFFS_BASE__MAYBE_STATIC uint64_t
13527
wuffs_png__decoder__get_quirk(
13528
    const wuffs_png__decoder* self,
13529
    uint32_t a_key);
13530
13531
WUFFS_BASE__GENERATED_C_CODE
13532
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
13533
wuffs_png__decoder__set_quirk(
13534
    wuffs_png__decoder* self,
13535
    uint32_t a_key,
13536
    uint64_t a_value);
13537
13538
WUFFS_BASE__GENERATED_C_CODE
13539
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
13540
wuffs_png__decoder__decode_image_config(
13541
    wuffs_png__decoder* self,
13542
    wuffs_base__image_config* a_dst,
13543
    wuffs_base__io_buffer* a_src);
13544
13545
WUFFS_BASE__GENERATED_C_CODE
13546
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
13547
wuffs_png__decoder__decode_frame_config(
13548
    wuffs_png__decoder* self,
13549
    wuffs_base__frame_config* a_dst,
13550
    wuffs_base__io_buffer* a_src);
13551
13552
WUFFS_BASE__GENERATED_C_CODE
13553
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
13554
wuffs_png__decoder__decode_frame(
13555
    wuffs_png__decoder* self,
13556
    wuffs_base__pixel_buffer* a_dst,
13557
    wuffs_base__io_buffer* a_src,
13558
    wuffs_base__pixel_blend a_blend,
13559
    wuffs_base__slice_u8 a_workbuf,
13560
    wuffs_base__decode_frame_options* a_opts);
13561
13562
WUFFS_BASE__GENERATED_C_CODE
13563
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
13564
wuffs_png__decoder__frame_dirty_rect(
13565
    const wuffs_png__decoder* self);
13566
13567
WUFFS_BASE__GENERATED_C_CODE
13568
WUFFS_BASE__MAYBE_STATIC uint32_t
13569
wuffs_png__decoder__num_animation_loops(
13570
    const wuffs_png__decoder* self);
13571
13572
WUFFS_BASE__GENERATED_C_CODE
13573
WUFFS_BASE__MAYBE_STATIC uint64_t
13574
wuffs_png__decoder__num_decoded_frame_configs(
13575
    const wuffs_png__decoder* self);
13576
13577
WUFFS_BASE__GENERATED_C_CODE
13578
WUFFS_BASE__MAYBE_STATIC uint64_t
13579
wuffs_png__decoder__num_decoded_frames(
13580
    const wuffs_png__decoder* self);
13581
13582
WUFFS_BASE__GENERATED_C_CODE
13583
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
13584
wuffs_png__decoder__restart_frame(
13585
    wuffs_png__decoder* self,
13586
    uint64_t a_index,
13587
    uint64_t a_io_position);
13588
13589
WUFFS_BASE__GENERATED_C_CODE
13590
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
13591
wuffs_png__decoder__set_report_metadata(
13592
    wuffs_png__decoder* self,
13593
    uint32_t a_fourcc,
13594
    bool a_report);
13595
13596
WUFFS_BASE__GENERATED_C_CODE
13597
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
13598
wuffs_png__decoder__tell_me_more(
13599
    wuffs_png__decoder* self,
13600
    wuffs_base__io_buffer* a_dst,
13601
    wuffs_base__more_information* a_minfo,
13602
    wuffs_base__io_buffer* a_src);
13603
13604
WUFFS_BASE__GENERATED_C_CODE
13605
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
13606
wuffs_png__decoder__workbuf_len(
13607
    const wuffs_png__decoder* self);
13608
13609
#ifdef __cplusplus
13610
}  // extern "C"
13611
#endif
13612
13613
// ---------------- Struct Definitions
13614
13615
// These structs' fields, and the sizeof them, are private implementation
13616
// details that aren't guaranteed to be stable across Wuffs versions.
13617
//
13618
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
13619
13620
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
13621
13622
struct wuffs_png__decoder__struct {
13623
  // Do not access the private_impl's or private_data's fields directly. There
13624
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
13625
  // the wuffs_foo__bar__baz functions.
13626
  //
13627
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
13628
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
13629
13630
  struct {
13631
    uint32_t magic;
13632
    uint32_t active_coroutine;
13633
    wuffs_base__vtable vtable_for__wuffs_base__image_decoder;
13634
    wuffs_base__vtable null_vtable;
13635
13636
    uint32_t f_width;
13637
    uint32_t f_height;
13638
    uint64_t f_pass_bytes_per_row;
13639
    uint64_t f_workbuf_wi;
13640
    uint64_t f_workbuf_hist_pos_base;
13641
    uint64_t f_overall_workbuf_length;
13642
    uint64_t f_pass_workbuf_length;
13643
    uint8_t f_call_sequence;
13644
    bool f_report_metadata_chrm;
13645
    bool f_report_metadata_exif;
13646
    bool f_report_metadata_gama;
13647
    bool f_report_metadata_iccp;
13648
    bool f_report_metadata_kvp;
13649
    bool f_report_metadata_srgb;
13650
    bool f_ignore_checksum;
13651
    uint8_t f_depth;
13652
    uint8_t f_color_type;
13653
    uint8_t f_filter_distance;
13654
    uint8_t f_interlace_pass;
13655
    bool f_seen_actl;
13656
    bool f_seen_chrm;
13657
    bool f_seen_fctl;
13658
    bool f_seen_exif;
13659
    bool f_seen_gama;
13660
    bool f_seen_iccp;
13661
    bool f_seen_idat;
13662
    bool f_seen_ihdr;
13663
    bool f_seen_plte;
13664
    bool f_seen_srgb;
13665
    bool f_seen_trns;
13666
    bool f_metadata_is_zlib_compressed;
13667
    bool f_zlib_is_dirty;
13668
    uint32_t f_chunk_type;
13669
    uint8_t f_chunk_type_array[4];
13670
    uint32_t f_chunk_length;
13671
    uint64_t f_remap_transparency;
13672
    uint32_t f_dst_pixfmt;
13673
    uint32_t f_src_pixfmt;
13674
    uint32_t f_num_animation_frames_value;
13675
    uint32_t f_num_animation_loops_value;
13676
    uint32_t f_num_decoded_frame_configs_value;
13677
    uint32_t f_num_decoded_frames_value;
13678
    uint32_t f_frame_rect_x0;
13679
    uint32_t f_frame_rect_y0;
13680
    uint32_t f_frame_rect_x1;
13681
    uint32_t f_frame_rect_y1;
13682
    uint32_t f_first_rect_x0;
13683
    uint32_t f_first_rect_y0;
13684
    uint32_t f_first_rect_x1;
13685
    uint32_t f_first_rect_y1;
13686
    uint64_t f_frame_config_io_position;
13687
    uint64_t f_first_config_io_position;
13688
    uint64_t f_frame_duration;
13689
    uint64_t f_first_duration;
13690
    uint8_t f_frame_disposal;
13691
    uint8_t f_first_disposal;
13692
    bool f_frame_overwrite_instead_of_blend;
13693
    bool f_first_overwrite_instead_of_blend;
13694
    uint32_t f_next_animation_seq_num;
13695
    uint32_t f_metadata_flavor;
13696
    uint32_t f_metadata_fourcc;
13697
    uint64_t f_metadata_x;
13698
    uint64_t f_metadata_y;
13699
    uint64_t f_metadata_z;
13700
    uint32_t f_ztxt_ri;
13701
    uint32_t f_ztxt_wi;
13702
    uint64_t f_ztxt_hist_pos;
13703
    wuffs_base__pixel_swizzler f_swizzler;
13704
13705
    wuffs_base__empty_struct (*choosy_filter_1)(
13706
        wuffs_png__decoder* self,
13707
        wuffs_base__slice_u8 a_curr);
13708
    wuffs_base__empty_struct (*choosy_filter_3)(
13709
        wuffs_png__decoder* self,
13710
        wuffs_base__slice_u8 a_curr,
13711
        wuffs_base__slice_u8 a_prev);
13712
    wuffs_base__empty_struct (*choosy_filter_4)(
13713
        wuffs_png__decoder* self,
13714
        wuffs_base__slice_u8 a_curr,
13715
        wuffs_base__slice_u8 a_prev);
13716
    uint32_t p_decode_image_config;
13717
    uint32_t p_do_decode_image_config;
13718
    uint32_t p_decode_ihdr;
13719
    uint32_t p_decode_other_chunk;
13720
    uint32_t p_decode_actl;
13721
    uint32_t p_decode_chrm;
13722
    uint32_t p_decode_fctl;
13723
    uint32_t p_decode_gama;
13724
    uint32_t p_decode_iccp;
13725
    uint32_t p_decode_plte;
13726
    uint32_t p_decode_srgb;
13727
    uint32_t p_decode_trns;
13728
    uint32_t p_decode_frame_config;
13729
    uint32_t p_do_decode_frame_config;
13730
    uint32_t p_skip_frame;
13731
    uint32_t p_decode_frame;
13732
    uint32_t p_do_decode_frame;
13733
    uint32_t p_decode_pass;
13734
    uint32_t p_tell_me_more;
13735
    uint32_t p_do_tell_me_more;
13736
    wuffs_base__status (*choosy_filter_and_swizzle)(
13737
        wuffs_png__decoder* self,
13738
        wuffs_base__pixel_buffer* a_dst,
13739
        wuffs_base__slice_u8 a_workbuf);
13740
  } private_impl;
13741
13742
  struct {
13743
    wuffs_crc32__ieee_hasher f_crc32;
13744
    wuffs_zlib__decoder f_zlib;
13745
    uint8_t f_dst_palette[1024];
13746
    uint8_t f_src_palette[1024];
13747
13748
    struct {
13749
      uint32_t v_checksum_have;
13750
      uint64_t scratch;
13751
    } s_do_decode_image_config;
13752
    struct {
13753
      uint64_t scratch;
13754
    } s_decode_ihdr;
13755
    struct {
13756
      uint64_t scratch;
13757
    } s_decode_other_chunk;
13758
    struct {
13759
      uint64_t scratch;
13760
    } s_decode_actl;
13761
    struct {
13762
      uint64_t scratch;
13763
    } s_decode_chrm;
13764
    struct {
13765
      uint32_t v_x0;
13766
      uint32_t v_x1;
13767
      uint32_t v_y1;
13768
      uint64_t scratch;
13769
    } s_decode_fctl;
13770
    struct {
13771
      uint64_t scratch;
13772
    } s_decode_gama;
13773
    struct {
13774
      uint32_t v_num_entries;
13775
      uint32_t v_i;
13776
      uint64_t scratch;
13777
    } s_decode_plte;
13778
    struct {
13779
      uint32_t v_i;
13780
      uint32_t v_n;
13781
      uint64_t scratch;
13782
    } s_decode_trns;
13783
    struct {
13784
      uint64_t scratch;
13785
    } s_do_decode_frame_config;
13786
    struct {
13787
      uint64_t scratch;
13788
    } s_skip_frame;
13789
    struct {
13790
      uint64_t scratch;
13791
    } s_do_decode_frame;
13792
    struct {
13793
      uint64_t scratch;
13794
    } s_decode_pass;
13795
    struct {
13796
      wuffs_base__status v_zlib_status;
13797
      uint64_t scratch;
13798
    } s_do_tell_me_more;
13799
  } private_data;
13800
13801
#ifdef __cplusplus
13802
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
13803
  using unique_ptr = std::unique_ptr<wuffs_png__decoder, wuffs_unique_ptr_deleter>;
13804
13805
  // On failure, the alloc_etc functions return nullptr. They don't throw.
13806
13807
  static inline unique_ptr
13808
  alloc() {
13809
    return unique_ptr(wuffs_png__decoder__alloc());
13810
  }
13811
13812
  static inline wuffs_base__image_decoder::unique_ptr
13813
  alloc_as__wuffs_base__image_decoder() {
13814
    return wuffs_base__image_decoder::unique_ptr(
13815
        wuffs_png__decoder__alloc_as__wuffs_base__image_decoder());
13816
  }
13817
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
13818
13819
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
13820
  // Disallow constructing or copying an object via standard C++ mechanisms,
13821
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
13822
  // size and field layout is not part of the public, stable, memory-safe API.
13823
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
13824
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
13825
  // their first argument) rather than tweaking bar.private_impl.qux fields.
13826
  //
13827
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
13828
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
13829
  // order to provide convenience methods. These forward on "this", so that you
13830
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
13831
  wuffs_png__decoder__struct() = delete;
13832
  wuffs_png__decoder__struct(const wuffs_png__decoder__struct&) = delete;
13833
  wuffs_png__decoder__struct& operator=(
13834
      const wuffs_png__decoder__struct&) = delete;
13835
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
13836
13837
#if !defined(WUFFS_IMPLEMENTATION)
13838
  // As above, the size of the struct is not part of the public API, and unless
13839
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
13840
  // allocated, not stack allocated. Its size is not intended to be known at
13841
  // compile time, but it is unfortunately divulged as a side effect of
13842
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
13843
  // instead of "sizeof T", invoking the operator. To make the two values
13844
  // different, so that passing the latter will be rejected by the initialize
13845
  // function, we add an arbitrary amount of dead weight.
13846
  uint8_t dead_weight[123000000];  // 123 MB.
13847
#endif  // !defined(WUFFS_IMPLEMENTATION)
13848
13849
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
13850
  initialize(
13851
      size_t sizeof_star_self,
13852
      uint64_t wuffs_version,
13853
      uint32_t options) {
13854
    return wuffs_png__decoder__initialize(
13855
        this, sizeof_star_self, wuffs_version, options);
13856
  }
13857
13858
  inline wuffs_base__image_decoder*
13859
  upcast_as__wuffs_base__image_decoder() {
13860
    return (wuffs_base__image_decoder*)this;
13861
  }
13862
13863
  inline uint64_t
13864
  get_quirk(
13865
      uint32_t a_key) const {
13866
    return wuffs_png__decoder__get_quirk(this, a_key);
13867
  }
13868
13869
  inline wuffs_base__status
13870
  set_quirk(
13871
      uint32_t a_key,
13872
      uint64_t a_value) {
13873
    return wuffs_png__decoder__set_quirk(this, a_key, a_value);
13874
  }
13875
13876
  inline wuffs_base__status
13877
  decode_image_config(
13878
      wuffs_base__image_config* a_dst,
13879
      wuffs_base__io_buffer* a_src) {
13880
    return wuffs_png__decoder__decode_image_config(this, a_dst, a_src);
13881
  }
13882
13883
  inline wuffs_base__status
13884
  decode_frame_config(
13885
      wuffs_base__frame_config* a_dst,
13886
      wuffs_base__io_buffer* a_src) {
13887
    return wuffs_png__decoder__decode_frame_config(this, a_dst, a_src);
13888
  }
13889
13890
  inline wuffs_base__status
13891
  decode_frame(
13892
      wuffs_base__pixel_buffer* a_dst,
13893
      wuffs_base__io_buffer* a_src,
13894
      wuffs_base__pixel_blend a_blend,
13895
      wuffs_base__slice_u8 a_workbuf,
13896
      wuffs_base__decode_frame_options* a_opts) {
13897
    return wuffs_png__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts);
13898
  }
13899
13900
  inline wuffs_base__rect_ie_u32
13901
  frame_dirty_rect() const {
13902
    return wuffs_png__decoder__frame_dirty_rect(this);
13903
  }
13904
13905
  inline uint32_t
13906
  num_animation_loops() const {
13907
    return wuffs_png__decoder__num_animation_loops(this);
13908
  }
13909
13910
  inline uint64_t
13911
  num_decoded_frame_configs() const {
13912
    return wuffs_png__decoder__num_decoded_frame_configs(this);
13913
  }
13914
13915
  inline uint64_t
13916
  num_decoded_frames() const {
13917
    return wuffs_png__decoder__num_decoded_frames(this);
13918
  }
13919
13920
  inline wuffs_base__status
13921
  restart_frame(
13922
      uint64_t a_index,
13923
      uint64_t a_io_position) {
13924
    return wuffs_png__decoder__restart_frame(this, a_index, a_io_position);
13925
  }
13926
13927
  inline wuffs_base__empty_struct
13928
  set_report_metadata(
13929
      uint32_t a_fourcc,
13930
      bool a_report) {
13931
    return wuffs_png__decoder__set_report_metadata(this, a_fourcc, a_report);
13932
  }
13933
13934
  inline wuffs_base__status
13935
  tell_me_more(
13936
      wuffs_base__io_buffer* a_dst,
13937
      wuffs_base__more_information* a_minfo,
13938
      wuffs_base__io_buffer* a_src) {
13939
    return wuffs_png__decoder__tell_me_more(this, a_dst, a_minfo, a_src);
13940
  }
13941
13942
  inline wuffs_base__range_ii_u64
13943
  workbuf_len() const {
13944
    return wuffs_png__decoder__workbuf_len(this);
13945
  }
13946
13947
#endif  // __cplusplus
13948
};  // struct wuffs_png__decoder__struct
13949
13950
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
13951
13952
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__PNG) || defined(WUFFS_NONMONOLITHIC)
13953
13954
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__QOI) || defined(WUFFS_NONMONOLITHIC)
13955
13956
// ---------------- Status Codes
13957
13958
extern const char wuffs_qoi__error__bad_footer[];
13959
extern const char wuffs_qoi__error__bad_header[];
13960
extern const char wuffs_qoi__error__truncated_input[];
13961
13962
// ---------------- Public Consts
13963
13964
#define WUFFS_QOI__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u
13965
13966
// ---------------- Struct Declarations
13967
13968
typedef struct wuffs_qoi__decoder__struct wuffs_qoi__decoder;
13969
13970
#ifdef __cplusplus
13971
extern "C" {
13972
#endif
13973
13974
// ---------------- Public Initializer Prototypes
13975
13976
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
13977
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
13978
//
13979
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
13980
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
13981
13982
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
13983
wuffs_qoi__decoder__initialize(
13984
    wuffs_qoi__decoder* self,
13985
    size_t sizeof_star_self,
13986
    uint64_t wuffs_version,
13987
    uint32_t options);
13988
13989
size_t
13990
sizeof__wuffs_qoi__decoder(void);
13991
13992
// ---------------- Allocs
13993
13994
// These functions allocate and initialize Wuffs structs. They return NULL if
13995
// memory allocation fails. If they return non-NULL, there is no need to call
13996
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
13997
// calling free on the returned pointer. That pointer is effectively a C++
13998
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
13999
14000
wuffs_qoi__decoder*
14001
wuffs_qoi__decoder__alloc(void);
14002
14003
static inline wuffs_base__image_decoder*
14004
wuffs_qoi__decoder__alloc_as__wuffs_base__image_decoder(void) {
14005
  return (wuffs_base__image_decoder*)(wuffs_qoi__decoder__alloc());
14006
}
14007
14008
// ---------------- Upcasts
14009
14010
static inline wuffs_base__image_decoder*
14011
wuffs_qoi__decoder__upcast_as__wuffs_base__image_decoder(
14012
    wuffs_qoi__decoder* p) {
14013
  return (wuffs_base__image_decoder*)p;
14014
}
14015
14016
// ---------------- Public Function Prototypes
14017
14018
WUFFS_BASE__GENERATED_C_CODE
14019
WUFFS_BASE__MAYBE_STATIC uint64_t
14020
wuffs_qoi__decoder__get_quirk(
14021
    const wuffs_qoi__decoder* self,
14022
    uint32_t a_key);
14023
14024
WUFFS_BASE__GENERATED_C_CODE
14025
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
14026
wuffs_qoi__decoder__set_quirk(
14027
    wuffs_qoi__decoder* self,
14028
    uint32_t a_key,
14029
    uint64_t a_value);
14030
14031
WUFFS_BASE__GENERATED_C_CODE
14032
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
14033
wuffs_qoi__decoder__decode_image_config(
14034
    wuffs_qoi__decoder* self,
14035
    wuffs_base__image_config* a_dst,
14036
    wuffs_base__io_buffer* a_src);
14037
14038
WUFFS_BASE__GENERATED_C_CODE
14039
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
14040
wuffs_qoi__decoder__decode_frame_config(
14041
    wuffs_qoi__decoder* self,
14042
    wuffs_base__frame_config* a_dst,
14043
    wuffs_base__io_buffer* a_src);
14044
14045
WUFFS_BASE__GENERATED_C_CODE
14046
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
14047
wuffs_qoi__decoder__decode_frame(
14048
    wuffs_qoi__decoder* self,
14049
    wuffs_base__pixel_buffer* a_dst,
14050
    wuffs_base__io_buffer* a_src,
14051
    wuffs_base__pixel_blend a_blend,
14052
    wuffs_base__slice_u8 a_workbuf,
14053
    wuffs_base__decode_frame_options* a_opts);
14054
14055
WUFFS_BASE__GENERATED_C_CODE
14056
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
14057
wuffs_qoi__decoder__frame_dirty_rect(
14058
    const wuffs_qoi__decoder* self);
14059
14060
WUFFS_BASE__GENERATED_C_CODE
14061
WUFFS_BASE__MAYBE_STATIC uint32_t
14062
wuffs_qoi__decoder__num_animation_loops(
14063
    const wuffs_qoi__decoder* self);
14064
14065
WUFFS_BASE__GENERATED_C_CODE
14066
WUFFS_BASE__MAYBE_STATIC uint64_t
14067
wuffs_qoi__decoder__num_decoded_frame_configs(
14068
    const wuffs_qoi__decoder* self);
14069
14070
WUFFS_BASE__GENERATED_C_CODE
14071
WUFFS_BASE__MAYBE_STATIC uint64_t
14072
wuffs_qoi__decoder__num_decoded_frames(
14073
    const wuffs_qoi__decoder* self);
14074
14075
WUFFS_BASE__GENERATED_C_CODE
14076
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
14077
wuffs_qoi__decoder__restart_frame(
14078
    wuffs_qoi__decoder* self,
14079
    uint64_t a_index,
14080
    uint64_t a_io_position);
14081
14082
WUFFS_BASE__GENERATED_C_CODE
14083
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
14084
wuffs_qoi__decoder__set_report_metadata(
14085
    wuffs_qoi__decoder* self,
14086
    uint32_t a_fourcc,
14087
    bool a_report);
14088
14089
WUFFS_BASE__GENERATED_C_CODE
14090
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
14091
wuffs_qoi__decoder__tell_me_more(
14092
    wuffs_qoi__decoder* self,
14093
    wuffs_base__io_buffer* a_dst,
14094
    wuffs_base__more_information* a_minfo,
14095
    wuffs_base__io_buffer* a_src);
14096
14097
WUFFS_BASE__GENERATED_C_CODE
14098
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
14099
wuffs_qoi__decoder__workbuf_len(
14100
    const wuffs_qoi__decoder* self);
14101
14102
#ifdef __cplusplus
14103
}  // extern "C"
14104
#endif
14105
14106
// ---------------- Struct Definitions
14107
14108
// These structs' fields, and the sizeof them, are private implementation
14109
// details that aren't guaranteed to be stable across Wuffs versions.
14110
//
14111
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
14112
14113
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
14114
14115
struct wuffs_qoi__decoder__struct {
14116
  // Do not access the private_impl's or private_data's fields directly. There
14117
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
14118
  // the wuffs_foo__bar__baz functions.
14119
  //
14120
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
14121
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
14122
14123
  struct {
14124
    uint32_t magic;
14125
    uint32_t active_coroutine;
14126
    wuffs_base__vtable vtable_for__wuffs_base__image_decoder;
14127
    wuffs_base__vtable null_vtable;
14128
14129
    uint32_t f_pixfmt;
14130
    uint32_t f_width;
14131
    uint32_t f_height;
14132
    uint64_t f_remaining_pixels_times_4;
14133
    uint8_t f_call_sequence;
14134
    uint32_t f_buffer_index;
14135
    uint32_t f_dst_x;
14136
    uint32_t f_dst_y;
14137
    wuffs_base__pixel_swizzler f_swizzler;
14138
14139
    uint32_t p_decode_image_config;
14140
    uint32_t p_do_decode_image_config;
14141
    uint32_t p_decode_frame_config;
14142
    uint32_t p_do_decode_frame_config;
14143
    uint32_t p_decode_frame;
14144
    uint32_t p_do_decode_frame;
14145
    uint32_t p_from_src_to_buffer;
14146
  } private_impl;
14147
14148
  struct {
14149
    uint8_t f_pixel[4];
14150
    uint8_t f_cache[256];
14151
    uint8_t f_buffer[8196];
14152
14153
    struct {
14154
      uint64_t scratch;
14155
    } s_do_decode_image_config;
14156
    struct {
14157
      uint64_t scratch;
14158
    } s_do_decode_frame;
14159
    struct {
14160
      uint8_t v_dg;
14161
      uint32_t v_bi;
14162
      uint32_t v_bk;
14163
    } s_from_src_to_buffer;
14164
  } private_data;
14165
14166
#ifdef __cplusplus
14167
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
14168
  using unique_ptr = std::unique_ptr<wuffs_qoi__decoder, wuffs_unique_ptr_deleter>;
14169
14170
  // On failure, the alloc_etc functions return nullptr. They don't throw.
14171
14172
  static inline unique_ptr
14173
  alloc() {
14174
    return unique_ptr(wuffs_qoi__decoder__alloc());
14175
  }
14176
14177
  static inline wuffs_base__image_decoder::unique_ptr
14178
  alloc_as__wuffs_base__image_decoder() {
14179
    return wuffs_base__image_decoder::unique_ptr(
14180
        wuffs_qoi__decoder__alloc_as__wuffs_base__image_decoder());
14181
  }
14182
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
14183
14184
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
14185
  // Disallow constructing or copying an object via standard C++ mechanisms,
14186
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
14187
  // size and field layout is not part of the public, stable, memory-safe API.
14188
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
14189
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
14190
  // their first argument) rather than tweaking bar.private_impl.qux fields.
14191
  //
14192
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
14193
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
14194
  // order to provide convenience methods. These forward on "this", so that you
14195
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
14196
  wuffs_qoi__decoder__struct() = delete;
14197
  wuffs_qoi__decoder__struct(const wuffs_qoi__decoder__struct&) = delete;
14198
  wuffs_qoi__decoder__struct& operator=(
14199
      const wuffs_qoi__decoder__struct&) = delete;
14200
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
14201
14202
#if !defined(WUFFS_IMPLEMENTATION)
14203
  // As above, the size of the struct is not part of the public API, and unless
14204
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
14205
  // allocated, not stack allocated. Its size is not intended to be known at
14206
  // compile time, but it is unfortunately divulged as a side effect of
14207
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
14208
  // instead of "sizeof T", invoking the operator. To make the two values
14209
  // different, so that passing the latter will be rejected by the initialize
14210
  // function, we add an arbitrary amount of dead weight.
14211
  uint8_t dead_weight[123000000];  // 123 MB.
14212
#endif  // !defined(WUFFS_IMPLEMENTATION)
14213
14214
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
14215
  initialize(
14216
      size_t sizeof_star_self,
14217
      uint64_t wuffs_version,
14218
      uint32_t options) {
14219
    return wuffs_qoi__decoder__initialize(
14220
        this, sizeof_star_self, wuffs_version, options);
14221
  }
14222
14223
  inline wuffs_base__image_decoder*
14224
  upcast_as__wuffs_base__image_decoder() {
14225
    return (wuffs_base__image_decoder*)this;
14226
  }
14227
14228
  inline uint64_t
14229
  get_quirk(
14230
      uint32_t a_key) const {
14231
    return wuffs_qoi__decoder__get_quirk(this, a_key);
14232
  }
14233
14234
  inline wuffs_base__status
14235
  set_quirk(
14236
      uint32_t a_key,
14237
      uint64_t a_value) {
14238
    return wuffs_qoi__decoder__set_quirk(this, a_key, a_value);
14239
  }
14240
14241
  inline wuffs_base__status
14242
  decode_image_config(
14243
      wuffs_base__image_config* a_dst,
14244
      wuffs_base__io_buffer* a_src) {
14245
    return wuffs_qoi__decoder__decode_image_config(this, a_dst, a_src);
14246
  }
14247
14248
  inline wuffs_base__status
14249
  decode_frame_config(
14250
      wuffs_base__frame_config* a_dst,
14251
      wuffs_base__io_buffer* a_src) {
14252
    return wuffs_qoi__decoder__decode_frame_config(this, a_dst, a_src);
14253
  }
14254
14255
  inline wuffs_base__status
14256
  decode_frame(
14257
      wuffs_base__pixel_buffer* a_dst,
14258
      wuffs_base__io_buffer* a_src,
14259
      wuffs_base__pixel_blend a_blend,
14260
      wuffs_base__slice_u8 a_workbuf,
14261
      wuffs_base__decode_frame_options* a_opts) {
14262
    return wuffs_qoi__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts);
14263
  }
14264
14265
  inline wuffs_base__rect_ie_u32
14266
  frame_dirty_rect() const {
14267
    return wuffs_qoi__decoder__frame_dirty_rect(this);
14268
  }
14269
14270
  inline uint32_t
14271
  num_animation_loops() const {
14272
    return wuffs_qoi__decoder__num_animation_loops(this);
14273
  }
14274
14275
  inline uint64_t
14276
  num_decoded_frame_configs() const {
14277
    return wuffs_qoi__decoder__num_decoded_frame_configs(this);
14278
  }
14279
14280
  inline uint64_t
14281
  num_decoded_frames() const {
14282
    return wuffs_qoi__decoder__num_decoded_frames(this);
14283
  }
14284
14285
  inline wuffs_base__status
14286
  restart_frame(
14287
      uint64_t a_index,
14288
      uint64_t a_io_position) {
14289
    return wuffs_qoi__decoder__restart_frame(this, a_index, a_io_position);
14290
  }
14291
14292
  inline wuffs_base__empty_struct
14293
  set_report_metadata(
14294
      uint32_t a_fourcc,
14295
      bool a_report) {
14296
    return wuffs_qoi__decoder__set_report_metadata(this, a_fourcc, a_report);
14297
  }
14298
14299
  inline wuffs_base__status
14300
  tell_me_more(
14301
      wuffs_base__io_buffer* a_dst,
14302
      wuffs_base__more_information* a_minfo,
14303
      wuffs_base__io_buffer* a_src) {
14304
    return wuffs_qoi__decoder__tell_me_more(this, a_dst, a_minfo, a_src);
14305
  }
14306
14307
  inline wuffs_base__range_ii_u64
14308
  workbuf_len() const {
14309
    return wuffs_qoi__decoder__workbuf_len(this);
14310
  }
14311
14312
#endif  // __cplusplus
14313
};  // struct wuffs_qoi__decoder__struct
14314
14315
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
14316
14317
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__QOI) || defined(WUFFS_NONMONOLITHIC)
14318
14319
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__SHA256) || defined(WUFFS_NONMONOLITHIC)
14320
14321
// ---------------- Status Codes
14322
14323
// ---------------- Public Consts
14324
14325
// ---------------- Struct Declarations
14326
14327
typedef struct wuffs_sha256__hasher__struct wuffs_sha256__hasher;
14328
14329
#ifdef __cplusplus
14330
extern "C" {
14331
#endif
14332
14333
// ---------------- Public Initializer Prototypes
14334
14335
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
14336
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
14337
//
14338
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
14339
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
14340
14341
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
14342
wuffs_sha256__hasher__initialize(
14343
    wuffs_sha256__hasher* self,
14344
    size_t sizeof_star_self,
14345
    uint64_t wuffs_version,
14346
    uint32_t options);
14347
14348
size_t
14349
sizeof__wuffs_sha256__hasher(void);
14350
14351
// ---------------- Allocs
14352
14353
// These functions allocate and initialize Wuffs structs. They return NULL if
14354
// memory allocation fails. If they return non-NULL, there is no need to call
14355
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
14356
// calling free on the returned pointer. That pointer is effectively a C++
14357
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
14358
14359
wuffs_sha256__hasher*
14360
wuffs_sha256__hasher__alloc(void);
14361
14362
static inline wuffs_base__hasher_bitvec256*
14363
wuffs_sha256__hasher__alloc_as__wuffs_base__hasher_bitvec256(void) {
14364
  return (wuffs_base__hasher_bitvec256*)(wuffs_sha256__hasher__alloc());
14365
}
14366
14367
// ---------------- Upcasts
14368
14369
static inline wuffs_base__hasher_bitvec256*
14370
wuffs_sha256__hasher__upcast_as__wuffs_base__hasher_bitvec256(
14371
    wuffs_sha256__hasher* p) {
14372
  return (wuffs_base__hasher_bitvec256*)p;
14373
}
14374
14375
// ---------------- Public Function Prototypes
14376
14377
WUFFS_BASE__GENERATED_C_CODE
14378
WUFFS_BASE__MAYBE_STATIC uint64_t
14379
wuffs_sha256__hasher__get_quirk(
14380
    const wuffs_sha256__hasher* self,
14381
    uint32_t a_key);
14382
14383
WUFFS_BASE__GENERATED_C_CODE
14384
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
14385
wuffs_sha256__hasher__set_quirk(
14386
    wuffs_sha256__hasher* self,
14387
    uint32_t a_key,
14388
    uint64_t a_value);
14389
14390
WUFFS_BASE__GENERATED_C_CODE
14391
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
14392
wuffs_sha256__hasher__update(
14393
    wuffs_sha256__hasher* self,
14394
    wuffs_base__slice_u8 a_x);
14395
14396
WUFFS_BASE__GENERATED_C_CODE
14397
WUFFS_BASE__MAYBE_STATIC wuffs_base__bitvec256
14398
wuffs_sha256__hasher__update_bitvec256(
14399
    wuffs_sha256__hasher* self,
14400
    wuffs_base__slice_u8 a_x);
14401
14402
WUFFS_BASE__GENERATED_C_CODE
14403
WUFFS_BASE__MAYBE_STATIC wuffs_base__bitvec256
14404
wuffs_sha256__hasher__checksum_bitvec256(
14405
    const wuffs_sha256__hasher* self);
14406
14407
#ifdef __cplusplus
14408
}  // extern "C"
14409
#endif
14410
14411
// ---------------- Struct Definitions
14412
14413
// These structs' fields, and the sizeof them, are private implementation
14414
// details that aren't guaranteed to be stable across Wuffs versions.
14415
//
14416
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
14417
14418
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
14419
14420
struct wuffs_sha256__hasher__struct {
14421
  // Do not access the private_impl's or private_data's fields directly. There
14422
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
14423
  // the wuffs_foo__bar__baz functions.
14424
  //
14425
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
14426
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
14427
14428
  struct {
14429
    uint32_t magic;
14430
    uint32_t active_coroutine;
14431
    wuffs_base__vtable vtable_for__wuffs_base__hasher_bitvec256;
14432
    wuffs_base__vtable null_vtable;
14433
14434
    uint64_t f_length_modulo_u64;
14435
    bool f_length_overflows_u64;
14436
    uint8_t f_padding0;
14437
    uint8_t f_padding1;
14438
    uint8_t f_padding2;
14439
    uint32_t f_buf_len;
14440
    uint8_t f_buf_data[64];
14441
    uint32_t f_h0;
14442
    uint32_t f_h1;
14443
    uint32_t f_h2;
14444
    uint32_t f_h3;
14445
    uint32_t f_h4;
14446
    uint32_t f_h5;
14447
    uint32_t f_h6;
14448
    uint32_t f_h7;
14449
  } private_impl;
14450
14451
#ifdef __cplusplus
14452
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
14453
  using unique_ptr = std::unique_ptr<wuffs_sha256__hasher, wuffs_unique_ptr_deleter>;
14454
14455
  // On failure, the alloc_etc functions return nullptr. They don't throw.
14456
14457
  static inline unique_ptr
14458
  alloc() {
14459
    return unique_ptr(wuffs_sha256__hasher__alloc());
14460
  }
14461
14462
  static inline wuffs_base__hasher_bitvec256::unique_ptr
14463
  alloc_as__wuffs_base__hasher_bitvec256() {
14464
    return wuffs_base__hasher_bitvec256::unique_ptr(
14465
        wuffs_sha256__hasher__alloc_as__wuffs_base__hasher_bitvec256());
14466
  }
14467
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
14468
14469
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
14470
  // Disallow constructing or copying an object via standard C++ mechanisms,
14471
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
14472
  // size and field layout is not part of the public, stable, memory-safe API.
14473
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
14474
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
14475
  // their first argument) rather than tweaking bar.private_impl.qux fields.
14476
  //
14477
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
14478
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
14479
  // order to provide convenience methods. These forward on "this", so that you
14480
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
14481
  wuffs_sha256__hasher__struct() = delete;
14482
  wuffs_sha256__hasher__struct(const wuffs_sha256__hasher__struct&) = delete;
14483
  wuffs_sha256__hasher__struct& operator=(
14484
      const wuffs_sha256__hasher__struct&) = delete;
14485
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
14486
14487
#if !defined(WUFFS_IMPLEMENTATION)
14488
  // As above, the size of the struct is not part of the public API, and unless
14489
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
14490
  // allocated, not stack allocated. Its size is not intended to be known at
14491
  // compile time, but it is unfortunately divulged as a side effect of
14492
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
14493
  // instead of "sizeof T", invoking the operator. To make the two values
14494
  // different, so that passing the latter will be rejected by the initialize
14495
  // function, we add an arbitrary amount of dead weight.
14496
  uint8_t dead_weight[123000000];  // 123 MB.
14497
#endif  // !defined(WUFFS_IMPLEMENTATION)
14498
14499
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
14500
  initialize(
14501
      size_t sizeof_star_self,
14502
      uint64_t wuffs_version,
14503
      uint32_t options) {
14504
    return wuffs_sha256__hasher__initialize(
14505
        this, sizeof_star_self, wuffs_version, options);
14506
  }
14507
14508
  inline wuffs_base__hasher_bitvec256*
14509
  upcast_as__wuffs_base__hasher_bitvec256() {
14510
    return (wuffs_base__hasher_bitvec256*)this;
14511
  }
14512
14513
  inline uint64_t
14514
  get_quirk(
14515
      uint32_t a_key) const {
14516
    return wuffs_sha256__hasher__get_quirk(this, a_key);
14517
  }
14518
14519
  inline wuffs_base__status
14520
  set_quirk(
14521
      uint32_t a_key,
14522
      uint64_t a_value) {
14523
    return wuffs_sha256__hasher__set_quirk(this, a_key, a_value);
14524
  }
14525
14526
  inline wuffs_base__empty_struct
14527
  update(
14528
      wuffs_base__slice_u8 a_x) {
14529
    return wuffs_sha256__hasher__update(this, a_x);
14530
  }
14531
14532
  inline wuffs_base__bitvec256
14533
  update_bitvec256(
14534
      wuffs_base__slice_u8 a_x) {
14535
    return wuffs_sha256__hasher__update_bitvec256(this, a_x);
14536
  }
14537
14538
  inline wuffs_base__bitvec256
14539
  checksum_bitvec256() const {
14540
    return wuffs_sha256__hasher__checksum_bitvec256(this);
14541
  }
14542
14543
#endif  // __cplusplus
14544
};  // struct wuffs_sha256__hasher__struct
14545
14546
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
14547
14548
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__SHA256) || defined(WUFFS_NONMONOLITHIC)
14549
14550
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__TARGA) || defined(WUFFS_NONMONOLITHIC)
14551
14552
// ---------------- Status Codes
14553
14554
extern const char wuffs_targa__error__bad_header[];
14555
extern const char wuffs_targa__error__bad_run_length_encoding[];
14556
extern const char wuffs_targa__error__truncated_input[];
14557
extern const char wuffs_targa__error__unsupported_targa_file[];
14558
14559
// ---------------- Public Consts
14560
14561
#define WUFFS_TARGA__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u
14562
14563
// ---------------- Struct Declarations
14564
14565
typedef struct wuffs_targa__decoder__struct wuffs_targa__decoder;
14566
14567
#ifdef __cplusplus
14568
extern "C" {
14569
#endif
14570
14571
// ---------------- Public Initializer Prototypes
14572
14573
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
14574
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
14575
//
14576
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
14577
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
14578
14579
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
14580
wuffs_targa__decoder__initialize(
14581
    wuffs_targa__decoder* self,
14582
    size_t sizeof_star_self,
14583
    uint64_t wuffs_version,
14584
    uint32_t options);
14585
14586
size_t
14587
sizeof__wuffs_targa__decoder(void);
14588
14589
// ---------------- Allocs
14590
14591
// These functions allocate and initialize Wuffs structs. They return NULL if
14592
// memory allocation fails. If they return non-NULL, there is no need to call
14593
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
14594
// calling free on the returned pointer. That pointer is effectively a C++
14595
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
14596
14597
wuffs_targa__decoder*
14598
wuffs_targa__decoder__alloc(void);
14599
14600
static inline wuffs_base__image_decoder*
14601
wuffs_targa__decoder__alloc_as__wuffs_base__image_decoder(void) {
14602
  return (wuffs_base__image_decoder*)(wuffs_targa__decoder__alloc());
14603
}
14604
14605
// ---------------- Upcasts
14606
14607
static inline wuffs_base__image_decoder*
14608
wuffs_targa__decoder__upcast_as__wuffs_base__image_decoder(
14609
    wuffs_targa__decoder* p) {
14610
  return (wuffs_base__image_decoder*)p;
14611
}
14612
14613
// ---------------- Public Function Prototypes
14614
14615
WUFFS_BASE__GENERATED_C_CODE
14616
WUFFS_BASE__MAYBE_STATIC uint64_t
14617
wuffs_targa__decoder__get_quirk(
14618
    const wuffs_targa__decoder* self,
14619
    uint32_t a_key);
14620
14621
WUFFS_BASE__GENERATED_C_CODE
14622
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
14623
wuffs_targa__decoder__set_quirk(
14624
    wuffs_targa__decoder* self,
14625
    uint32_t a_key,
14626
    uint64_t a_value);
14627
14628
WUFFS_BASE__GENERATED_C_CODE
14629
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
14630
wuffs_targa__decoder__decode_image_config(
14631
    wuffs_targa__decoder* self,
14632
    wuffs_base__image_config* a_dst,
14633
    wuffs_base__io_buffer* a_src);
14634
14635
WUFFS_BASE__GENERATED_C_CODE
14636
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
14637
wuffs_targa__decoder__decode_frame_config(
14638
    wuffs_targa__decoder* self,
14639
    wuffs_base__frame_config* a_dst,
14640
    wuffs_base__io_buffer* a_src);
14641
14642
WUFFS_BASE__GENERATED_C_CODE
14643
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
14644
wuffs_targa__decoder__decode_frame(
14645
    wuffs_targa__decoder* self,
14646
    wuffs_base__pixel_buffer* a_dst,
14647
    wuffs_base__io_buffer* a_src,
14648
    wuffs_base__pixel_blend a_blend,
14649
    wuffs_base__slice_u8 a_workbuf,
14650
    wuffs_base__decode_frame_options* a_opts);
14651
14652
WUFFS_BASE__GENERATED_C_CODE
14653
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
14654
wuffs_targa__decoder__frame_dirty_rect(
14655
    const wuffs_targa__decoder* self);
14656
14657
WUFFS_BASE__GENERATED_C_CODE
14658
WUFFS_BASE__MAYBE_STATIC uint32_t
14659
wuffs_targa__decoder__num_animation_loops(
14660
    const wuffs_targa__decoder* self);
14661
14662
WUFFS_BASE__GENERATED_C_CODE
14663
WUFFS_BASE__MAYBE_STATIC uint64_t
14664
wuffs_targa__decoder__num_decoded_frame_configs(
14665
    const wuffs_targa__decoder* self);
14666
14667
WUFFS_BASE__GENERATED_C_CODE
14668
WUFFS_BASE__MAYBE_STATIC uint64_t
14669
wuffs_targa__decoder__num_decoded_frames(
14670
    const wuffs_targa__decoder* self);
14671
14672
WUFFS_BASE__GENERATED_C_CODE
14673
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
14674
wuffs_targa__decoder__restart_frame(
14675
    wuffs_targa__decoder* self,
14676
    uint64_t a_index,
14677
    uint64_t a_io_position);
14678
14679
WUFFS_BASE__GENERATED_C_CODE
14680
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
14681
wuffs_targa__decoder__set_report_metadata(
14682
    wuffs_targa__decoder* self,
14683
    uint32_t a_fourcc,
14684
    bool a_report);
14685
14686
WUFFS_BASE__GENERATED_C_CODE
14687
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
14688
wuffs_targa__decoder__tell_me_more(
14689
    wuffs_targa__decoder* self,
14690
    wuffs_base__io_buffer* a_dst,
14691
    wuffs_base__more_information* a_minfo,
14692
    wuffs_base__io_buffer* a_src);
14693
14694
WUFFS_BASE__GENERATED_C_CODE
14695
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
14696
wuffs_targa__decoder__workbuf_len(
14697
    const wuffs_targa__decoder* self);
14698
14699
#ifdef __cplusplus
14700
}  // extern "C"
14701
#endif
14702
14703
// ---------------- Struct Definitions
14704
14705
// These structs' fields, and the sizeof them, are private implementation
14706
// details that aren't guaranteed to be stable across Wuffs versions.
14707
//
14708
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
14709
14710
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
14711
14712
struct wuffs_targa__decoder__struct {
14713
  // Do not access the private_impl's or private_data's fields directly. There
14714
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
14715
  // the wuffs_foo__bar__baz functions.
14716
  //
14717
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
14718
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
14719
14720
  struct {
14721
    uint32_t magic;
14722
    uint32_t active_coroutine;
14723
    wuffs_base__vtable vtable_for__wuffs_base__image_decoder;
14724
    wuffs_base__vtable null_vtable;
14725
14726
    uint32_t f_width;
14727
    uint32_t f_height;
14728
    uint8_t f_call_sequence;
14729
    uint8_t f_header_id_length;
14730
    uint8_t f_header_color_map_type;
14731
    uint8_t f_header_image_type;
14732
    uint16_t f_header_color_map_first_entry_index;
14733
    uint16_t f_header_color_map_length;
14734
    uint8_t f_header_color_map_entry_size;
14735
    uint8_t f_header_pixel_depth;
14736
    uint8_t f_header_image_descriptor;
14737
    bool f_opaque;
14738
    uint32_t f_scratch_bytes_per_pixel;
14739
    uint32_t f_src_bytes_per_pixel;
14740
    uint32_t f_src_pixfmt;
14741
    uint64_t f_frame_config_io_position;
14742
    wuffs_base__pixel_swizzler f_swizzler;
14743
14744
    uint32_t p_decode_image_config;
14745
    uint32_t p_do_decode_image_config;
14746
    uint32_t p_decode_frame_config;
14747
    uint32_t p_do_decode_frame_config;
14748
    uint32_t p_decode_frame;
14749
    uint32_t p_do_decode_frame;
14750
  } private_impl;
14751
14752
  struct {
14753
    uint8_t f_dst_palette[1024];
14754
    uint8_t f_src_palette[1024];
14755
    uint8_t f_scratch[4];
14756
14757
    struct {
14758
      uint32_t v_i;
14759
      uint64_t scratch;
14760
    } s_do_decode_image_config;
14761
    struct {
14762
      uint64_t v_dst_bytes_per_pixel;
14763
      uint32_t v_dst_x;
14764
      uint32_t v_dst_y;
14765
      uint64_t v_mark;
14766
      uint32_t v_num_pixels32;
14767
      uint32_t v_lit_length;
14768
      uint32_t v_run_length;
14769
      uint64_t v_num_dst_bytes;
14770
      uint64_t scratch;
14771
    } s_do_decode_frame;
14772
  } private_data;
14773
14774
#ifdef __cplusplus
14775
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
14776
  using unique_ptr = std::unique_ptr<wuffs_targa__decoder, wuffs_unique_ptr_deleter>;
14777
14778
  // On failure, the alloc_etc functions return nullptr. They don't throw.
14779
14780
  static inline unique_ptr
14781
  alloc() {
14782
    return unique_ptr(wuffs_targa__decoder__alloc());
14783
  }
14784
14785
  static inline wuffs_base__image_decoder::unique_ptr
14786
  alloc_as__wuffs_base__image_decoder() {
14787
    return wuffs_base__image_decoder::unique_ptr(
14788
        wuffs_targa__decoder__alloc_as__wuffs_base__image_decoder());
14789
  }
14790
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
14791
14792
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
14793
  // Disallow constructing or copying an object via standard C++ mechanisms,
14794
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
14795
  // size and field layout is not part of the public, stable, memory-safe API.
14796
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
14797
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
14798
  // their first argument) rather than tweaking bar.private_impl.qux fields.
14799
  //
14800
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
14801
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
14802
  // order to provide convenience methods. These forward on "this", so that you
14803
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
14804
  wuffs_targa__decoder__struct() = delete;
14805
  wuffs_targa__decoder__struct(const wuffs_targa__decoder__struct&) = delete;
14806
  wuffs_targa__decoder__struct& operator=(
14807
      const wuffs_targa__decoder__struct&) = delete;
14808
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
14809
14810
#if !defined(WUFFS_IMPLEMENTATION)
14811
  // As above, the size of the struct is not part of the public API, and unless
14812
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
14813
  // allocated, not stack allocated. Its size is not intended to be known at
14814
  // compile time, but it is unfortunately divulged as a side effect of
14815
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
14816
  // instead of "sizeof T", invoking the operator. To make the two values
14817
  // different, so that passing the latter will be rejected by the initialize
14818
  // function, we add an arbitrary amount of dead weight.
14819
  uint8_t dead_weight[123000000];  // 123 MB.
14820
#endif  // !defined(WUFFS_IMPLEMENTATION)
14821
14822
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
14823
  initialize(
14824
      size_t sizeof_star_self,
14825
      uint64_t wuffs_version,
14826
      uint32_t options) {
14827
    return wuffs_targa__decoder__initialize(
14828
        this, sizeof_star_self, wuffs_version, options);
14829
  }
14830
14831
  inline wuffs_base__image_decoder*
14832
  upcast_as__wuffs_base__image_decoder() {
14833
    return (wuffs_base__image_decoder*)this;
14834
  }
14835
14836
  inline uint64_t
14837
  get_quirk(
14838
      uint32_t a_key) const {
14839
    return wuffs_targa__decoder__get_quirk(this, a_key);
14840
  }
14841
14842
  inline wuffs_base__status
14843
  set_quirk(
14844
      uint32_t a_key,
14845
      uint64_t a_value) {
14846
    return wuffs_targa__decoder__set_quirk(this, a_key, a_value);
14847
  }
14848
14849
  inline wuffs_base__status
14850
  decode_image_config(
14851
      wuffs_base__image_config* a_dst,
14852
      wuffs_base__io_buffer* a_src) {
14853
    return wuffs_targa__decoder__decode_image_config(this, a_dst, a_src);
14854
  }
14855
14856
  inline wuffs_base__status
14857
  decode_frame_config(
14858
      wuffs_base__frame_config* a_dst,
14859
      wuffs_base__io_buffer* a_src) {
14860
    return wuffs_targa__decoder__decode_frame_config(this, a_dst, a_src);
14861
  }
14862
14863
  inline wuffs_base__status
14864
  decode_frame(
14865
      wuffs_base__pixel_buffer* a_dst,
14866
      wuffs_base__io_buffer* a_src,
14867
      wuffs_base__pixel_blend a_blend,
14868
      wuffs_base__slice_u8 a_workbuf,
14869
      wuffs_base__decode_frame_options* a_opts) {
14870
    return wuffs_targa__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts);
14871
  }
14872
14873
  inline wuffs_base__rect_ie_u32
14874
  frame_dirty_rect() const {
14875
    return wuffs_targa__decoder__frame_dirty_rect(this);
14876
  }
14877
14878
  inline uint32_t
14879
  num_animation_loops() const {
14880
    return wuffs_targa__decoder__num_animation_loops(this);
14881
  }
14882
14883
  inline uint64_t
14884
  num_decoded_frame_configs() const {
14885
    return wuffs_targa__decoder__num_decoded_frame_configs(this);
14886
  }
14887
14888
  inline uint64_t
14889
  num_decoded_frames() const {
14890
    return wuffs_targa__decoder__num_decoded_frames(this);
14891
  }
14892
14893
  inline wuffs_base__status
14894
  restart_frame(
14895
      uint64_t a_index,
14896
      uint64_t a_io_position) {
14897
    return wuffs_targa__decoder__restart_frame(this, a_index, a_io_position);
14898
  }
14899
14900
  inline wuffs_base__empty_struct
14901
  set_report_metadata(
14902
      uint32_t a_fourcc,
14903
      bool a_report) {
14904
    return wuffs_targa__decoder__set_report_metadata(this, a_fourcc, a_report);
14905
  }
14906
14907
  inline wuffs_base__status
14908
  tell_me_more(
14909
      wuffs_base__io_buffer* a_dst,
14910
      wuffs_base__more_information* a_minfo,
14911
      wuffs_base__io_buffer* a_src) {
14912
    return wuffs_targa__decoder__tell_me_more(this, a_dst, a_minfo, a_src);
14913
  }
14914
14915
  inline wuffs_base__range_ii_u64
14916
  workbuf_len() const {
14917
    return wuffs_targa__decoder__workbuf_len(this);
14918
  }
14919
14920
#endif  // __cplusplus
14921
};  // struct wuffs_targa__decoder__struct
14922
14923
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
14924
14925
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__TARGA) || defined(WUFFS_NONMONOLITHIC)
14926
14927
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__THUMBHASH) || defined(WUFFS_NONMONOLITHIC)
14928
14929
// ---------------- Status Codes
14930
14931
extern const char wuffs_thumbhash__error__bad_header[];
14932
extern const char wuffs_thumbhash__error__truncated_input[];
14933
14934
// ---------------- Public Consts
14935
14936
#define WUFFS_THUMBHASH__QUIRK_JUST_RAW_THUMBHASH 1712283648u
14937
14938
#define WUFFS_THUMBHASH__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u
14939
14940
// ---------------- Struct Declarations
14941
14942
typedef struct wuffs_thumbhash__decoder__struct wuffs_thumbhash__decoder;
14943
14944
#ifdef __cplusplus
14945
extern "C" {
14946
#endif
14947
14948
// ---------------- Public Initializer Prototypes
14949
14950
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
14951
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
14952
//
14953
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
14954
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
14955
14956
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
14957
wuffs_thumbhash__decoder__initialize(
14958
    wuffs_thumbhash__decoder* self,
14959
    size_t sizeof_star_self,
14960
    uint64_t wuffs_version,
14961
    uint32_t options);
14962
14963
size_t
14964
sizeof__wuffs_thumbhash__decoder(void);
14965
14966
// ---------------- Allocs
14967
14968
// These functions allocate and initialize Wuffs structs. They return NULL if
14969
// memory allocation fails. If they return non-NULL, there is no need to call
14970
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
14971
// calling free on the returned pointer. That pointer is effectively a C++
14972
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
14973
14974
wuffs_thumbhash__decoder*
14975
wuffs_thumbhash__decoder__alloc(void);
14976
14977
static inline wuffs_base__image_decoder*
14978
wuffs_thumbhash__decoder__alloc_as__wuffs_base__image_decoder(void) {
14979
  return (wuffs_base__image_decoder*)(wuffs_thumbhash__decoder__alloc());
14980
}
14981
14982
// ---------------- Upcasts
14983
14984
static inline wuffs_base__image_decoder*
14985
wuffs_thumbhash__decoder__upcast_as__wuffs_base__image_decoder(
14986
    wuffs_thumbhash__decoder* p) {
14987
  return (wuffs_base__image_decoder*)p;
14988
}
14989
14990
// ---------------- Public Function Prototypes
14991
14992
WUFFS_BASE__GENERATED_C_CODE
14993
WUFFS_BASE__MAYBE_STATIC uint64_t
14994
wuffs_thumbhash__decoder__get_quirk(
14995
    const wuffs_thumbhash__decoder* self,
14996
    uint32_t a_key);
14997
14998
WUFFS_BASE__GENERATED_C_CODE
14999
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
15000
wuffs_thumbhash__decoder__set_quirk(
15001
    wuffs_thumbhash__decoder* self,
15002
    uint32_t a_key,
15003
    uint64_t a_value);
15004
15005
WUFFS_BASE__GENERATED_C_CODE
15006
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
15007
wuffs_thumbhash__decoder__decode_image_config(
15008
    wuffs_thumbhash__decoder* self,
15009
    wuffs_base__image_config* a_dst,
15010
    wuffs_base__io_buffer* a_src);
15011
15012
WUFFS_BASE__GENERATED_C_CODE
15013
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
15014
wuffs_thumbhash__decoder__decode_frame_config(
15015
    wuffs_thumbhash__decoder* self,
15016
    wuffs_base__frame_config* a_dst,
15017
    wuffs_base__io_buffer* a_src);
15018
15019
WUFFS_BASE__GENERATED_C_CODE
15020
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
15021
wuffs_thumbhash__decoder__decode_frame(
15022
    wuffs_thumbhash__decoder* self,
15023
    wuffs_base__pixel_buffer* a_dst,
15024
    wuffs_base__io_buffer* a_src,
15025
    wuffs_base__pixel_blend a_blend,
15026
    wuffs_base__slice_u8 a_workbuf,
15027
    wuffs_base__decode_frame_options* a_opts);
15028
15029
WUFFS_BASE__GENERATED_C_CODE
15030
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
15031
wuffs_thumbhash__decoder__frame_dirty_rect(
15032
    const wuffs_thumbhash__decoder* self);
15033
15034
WUFFS_BASE__GENERATED_C_CODE
15035
WUFFS_BASE__MAYBE_STATIC uint32_t
15036
wuffs_thumbhash__decoder__num_animation_loops(
15037
    const wuffs_thumbhash__decoder* self);
15038
15039
WUFFS_BASE__GENERATED_C_CODE
15040
WUFFS_BASE__MAYBE_STATIC uint64_t
15041
wuffs_thumbhash__decoder__num_decoded_frame_configs(
15042
    const wuffs_thumbhash__decoder* self);
15043
15044
WUFFS_BASE__GENERATED_C_CODE
15045
WUFFS_BASE__MAYBE_STATIC uint64_t
15046
wuffs_thumbhash__decoder__num_decoded_frames(
15047
    const wuffs_thumbhash__decoder* self);
15048
15049
WUFFS_BASE__GENERATED_C_CODE
15050
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
15051
wuffs_thumbhash__decoder__restart_frame(
15052
    wuffs_thumbhash__decoder* self,
15053
    uint64_t a_index,
15054
    uint64_t a_io_position);
15055
15056
WUFFS_BASE__GENERATED_C_CODE
15057
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
15058
wuffs_thumbhash__decoder__set_report_metadata(
15059
    wuffs_thumbhash__decoder* self,
15060
    uint32_t a_fourcc,
15061
    bool a_report);
15062
15063
WUFFS_BASE__GENERATED_C_CODE
15064
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
15065
wuffs_thumbhash__decoder__tell_me_more(
15066
    wuffs_thumbhash__decoder* self,
15067
    wuffs_base__io_buffer* a_dst,
15068
    wuffs_base__more_information* a_minfo,
15069
    wuffs_base__io_buffer* a_src);
15070
15071
WUFFS_BASE__GENERATED_C_CODE
15072
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
15073
wuffs_thumbhash__decoder__workbuf_len(
15074
    const wuffs_thumbhash__decoder* self);
15075
15076
#ifdef __cplusplus
15077
}  // extern "C"
15078
#endif
15079
15080
// ---------------- Struct Definitions
15081
15082
// These structs' fields, and the sizeof them, are private implementation
15083
// details that aren't guaranteed to be stable across Wuffs versions.
15084
//
15085
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
15086
15087
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
15088
15089
struct wuffs_thumbhash__decoder__struct {
15090
  // Do not access the private_impl's or private_data's fields directly. There
15091
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
15092
  // the wuffs_foo__bar__baz functions.
15093
  //
15094
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
15095
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
15096
15097
  struct {
15098
    uint32_t magic;
15099
    uint32_t active_coroutine;
15100
    wuffs_base__vtable vtable_for__wuffs_base__image_decoder;
15101
    wuffs_base__vtable null_vtable;
15102
15103
    uint32_t f_pixfmt;
15104
    uint8_t f_w_dimension_code;
15105
    uint8_t f_h_dimension_code;
15106
    uint8_t f_call_sequence;
15107
    uint8_t f_frame_config_io_position;
15108
    uint64_t f_l_dc;
15109
    uint64_t f_p_dc;
15110
    uint64_t f_q_dc;
15111
    uint64_t f_a_dc;
15112
    bool f_quirk_just_raw_thumbhash;
15113
    uint8_t f_l_scale;
15114
    uint8_t f_p_scale;
15115
    uint8_t f_q_scale;
15116
    uint8_t f_a_scale;
15117
    uint8_t f_has_alpha;
15118
    uint8_t f_l_count;
15119
    uint8_t f_is_landscape;
15120
    uint32_t f_lx;
15121
    uint32_t f_ly;
15122
    wuffs_base__pixel_swizzler f_swizzler;
15123
15124
    uint32_t p_decode_image_config;
15125
    uint32_t p_do_decode_image_config;
15126
    uint32_t p_decode_frame_config;
15127
    uint32_t p_do_decode_frame_config;
15128
    uint32_t p_decode_frame;
15129
    uint32_t p_do_decode_frame;
15130
    uint32_t p_from_src_to_coeffs;
15131
  } private_impl;
15132
15133
  struct {
15134
    uint32_t f_lac[32];
15135
    uint32_t f_pac[8];
15136
    uint32_t f_qac[8];
15137
    uint32_t f_aac[16];
15138
    uint8_t f_pixels[32][128];
15139
15140
    struct {
15141
      uint64_t scratch;
15142
    } s_do_decode_image_config;
15143
    struct {
15144
      uint32_t v_cy;
15145
      uint32_t v_cx;
15146
      uint32_t v_i;
15147
      bool v_has_bits;
15148
    } s_from_src_to_coeffs;
15149
  } private_data;
15150
15151
#ifdef __cplusplus
15152
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
15153
  using unique_ptr = std::unique_ptr<wuffs_thumbhash__decoder, wuffs_unique_ptr_deleter>;
15154
15155
  // On failure, the alloc_etc functions return nullptr. They don't throw.
15156
15157
  static inline unique_ptr
15158
  alloc() {
15159
    return unique_ptr(wuffs_thumbhash__decoder__alloc());
15160
  }
15161
15162
  static inline wuffs_base__image_decoder::unique_ptr
15163
  alloc_as__wuffs_base__image_decoder() {
15164
    return wuffs_base__image_decoder::unique_ptr(
15165
        wuffs_thumbhash__decoder__alloc_as__wuffs_base__image_decoder());
15166
  }
15167
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
15168
15169
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
15170
  // Disallow constructing or copying an object via standard C++ mechanisms,
15171
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
15172
  // size and field layout is not part of the public, stable, memory-safe API.
15173
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
15174
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
15175
  // their first argument) rather than tweaking bar.private_impl.qux fields.
15176
  //
15177
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
15178
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
15179
  // order to provide convenience methods. These forward on "this", so that you
15180
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
15181
  wuffs_thumbhash__decoder__struct() = delete;
15182
  wuffs_thumbhash__decoder__struct(const wuffs_thumbhash__decoder__struct&) = delete;
15183
  wuffs_thumbhash__decoder__struct& operator=(
15184
      const wuffs_thumbhash__decoder__struct&) = delete;
15185
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
15186
15187
#if !defined(WUFFS_IMPLEMENTATION)
15188
  // As above, the size of the struct is not part of the public API, and unless
15189
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
15190
  // allocated, not stack allocated. Its size is not intended to be known at
15191
  // compile time, but it is unfortunately divulged as a side effect of
15192
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
15193
  // instead of "sizeof T", invoking the operator. To make the two values
15194
  // different, so that passing the latter will be rejected by the initialize
15195
  // function, we add an arbitrary amount of dead weight.
15196
  uint8_t dead_weight[123000000];  // 123 MB.
15197
#endif  // !defined(WUFFS_IMPLEMENTATION)
15198
15199
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
15200
  initialize(
15201
      size_t sizeof_star_self,
15202
      uint64_t wuffs_version,
15203
      uint32_t options) {
15204
    return wuffs_thumbhash__decoder__initialize(
15205
        this, sizeof_star_self, wuffs_version, options);
15206
  }
15207
15208
  inline wuffs_base__image_decoder*
15209
  upcast_as__wuffs_base__image_decoder() {
15210
    return (wuffs_base__image_decoder*)this;
15211
  }
15212
15213
  inline uint64_t
15214
  get_quirk(
15215
      uint32_t a_key) const {
15216
    return wuffs_thumbhash__decoder__get_quirk(this, a_key);
15217
  }
15218
15219
  inline wuffs_base__status
15220
  set_quirk(
15221
      uint32_t a_key,
15222
      uint64_t a_value) {
15223
    return wuffs_thumbhash__decoder__set_quirk(this, a_key, a_value);
15224
  }
15225
15226
  inline wuffs_base__status
15227
  decode_image_config(
15228
      wuffs_base__image_config* a_dst,
15229
      wuffs_base__io_buffer* a_src) {
15230
    return wuffs_thumbhash__decoder__decode_image_config(this, a_dst, a_src);
15231
  }
15232
15233
  inline wuffs_base__status
15234
  decode_frame_config(
15235
      wuffs_base__frame_config* a_dst,
15236
      wuffs_base__io_buffer* a_src) {
15237
    return wuffs_thumbhash__decoder__decode_frame_config(this, a_dst, a_src);
15238
  }
15239
15240
  inline wuffs_base__status
15241
  decode_frame(
15242
      wuffs_base__pixel_buffer* a_dst,
15243
      wuffs_base__io_buffer* a_src,
15244
      wuffs_base__pixel_blend a_blend,
15245
      wuffs_base__slice_u8 a_workbuf,
15246
      wuffs_base__decode_frame_options* a_opts) {
15247
    return wuffs_thumbhash__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts);
15248
  }
15249
15250
  inline wuffs_base__rect_ie_u32
15251
  frame_dirty_rect() const {
15252
    return wuffs_thumbhash__decoder__frame_dirty_rect(this);
15253
  }
15254
15255
  inline uint32_t
15256
  num_animation_loops() const {
15257
    return wuffs_thumbhash__decoder__num_animation_loops(this);
15258
  }
15259
15260
  inline uint64_t
15261
  num_decoded_frame_configs() const {
15262
    return wuffs_thumbhash__decoder__num_decoded_frame_configs(this);
15263
  }
15264
15265
  inline uint64_t
15266
  num_decoded_frames() const {
15267
    return wuffs_thumbhash__decoder__num_decoded_frames(this);
15268
  }
15269
15270
  inline wuffs_base__status
15271
  restart_frame(
15272
      uint64_t a_index,
15273
      uint64_t a_io_position) {
15274
    return wuffs_thumbhash__decoder__restart_frame(this, a_index, a_io_position);
15275
  }
15276
15277
  inline wuffs_base__empty_struct
15278
  set_report_metadata(
15279
      uint32_t a_fourcc,
15280
      bool a_report) {
15281
    return wuffs_thumbhash__decoder__set_report_metadata(this, a_fourcc, a_report);
15282
  }
15283
15284
  inline wuffs_base__status
15285
  tell_me_more(
15286
      wuffs_base__io_buffer* a_dst,
15287
      wuffs_base__more_information* a_minfo,
15288
      wuffs_base__io_buffer* a_src) {
15289
    return wuffs_thumbhash__decoder__tell_me_more(this, a_dst, a_minfo, a_src);
15290
  }
15291
15292
  inline wuffs_base__range_ii_u64
15293
  workbuf_len() const {
15294
    return wuffs_thumbhash__decoder__workbuf_len(this);
15295
  }
15296
15297
#endif  // __cplusplus
15298
};  // struct wuffs_thumbhash__decoder__struct
15299
15300
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
15301
15302
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__THUMBHASH) || defined(WUFFS_NONMONOLITHIC)
15303
15304
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__VP8) || defined(WUFFS_NONMONOLITHIC)
15305
15306
// ---------------- Status Codes
15307
15308
extern const char wuffs_vp8__error__bad_header[];
15309
extern const char wuffs_vp8__error__truncated_input[];
15310
extern const char wuffs_vp8__error__unsupported_vp8_file[];
15311
15312
// ---------------- Public Consts
15313
15314
#define WUFFS_VP8__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u
15315
15316
// ---------------- Struct Declarations
15317
15318
typedef struct wuffs_vp8__decoder__struct wuffs_vp8__decoder;
15319
15320
#ifdef __cplusplus
15321
extern "C" {
15322
#endif
15323
15324
// ---------------- Public Initializer Prototypes
15325
15326
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
15327
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
15328
//
15329
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
15330
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
15331
15332
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
15333
wuffs_vp8__decoder__initialize(
15334
    wuffs_vp8__decoder* self,
15335
    size_t sizeof_star_self,
15336
    uint64_t wuffs_version,
15337
    uint32_t options);
15338
15339
size_t
15340
sizeof__wuffs_vp8__decoder(void);
15341
15342
// ---------------- Allocs
15343
15344
// These functions allocate and initialize Wuffs structs. They return NULL if
15345
// memory allocation fails. If they return non-NULL, there is no need to call
15346
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
15347
// calling free on the returned pointer. That pointer is effectively a C++
15348
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
15349
15350
wuffs_vp8__decoder*
15351
wuffs_vp8__decoder__alloc(void);
15352
15353
static inline wuffs_base__image_decoder*
15354
wuffs_vp8__decoder__alloc_as__wuffs_base__image_decoder(void) {
15355
  return (wuffs_base__image_decoder*)(wuffs_vp8__decoder__alloc());
15356
}
15357
15358
// ---------------- Upcasts
15359
15360
static inline wuffs_base__image_decoder*
15361
wuffs_vp8__decoder__upcast_as__wuffs_base__image_decoder(
15362
    wuffs_vp8__decoder* p) {
15363
  return (wuffs_base__image_decoder*)p;
15364
}
15365
15366
// ---------------- Public Function Prototypes
15367
15368
WUFFS_BASE__GENERATED_C_CODE
15369
WUFFS_BASE__MAYBE_STATIC uint64_t
15370
wuffs_vp8__decoder__get_quirk(
15371
    const wuffs_vp8__decoder* self,
15372
    uint32_t a_key);
15373
15374
WUFFS_BASE__GENERATED_C_CODE
15375
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
15376
wuffs_vp8__decoder__set_quirk(
15377
    wuffs_vp8__decoder* self,
15378
    uint32_t a_key,
15379
    uint64_t a_value);
15380
15381
WUFFS_BASE__GENERATED_C_CODE
15382
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
15383
wuffs_vp8__decoder__decode_image_config(
15384
    wuffs_vp8__decoder* self,
15385
    wuffs_base__image_config* a_dst,
15386
    wuffs_base__io_buffer* a_src);
15387
15388
WUFFS_BASE__GENERATED_C_CODE
15389
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
15390
wuffs_vp8__decoder__decode_frame_config(
15391
    wuffs_vp8__decoder* self,
15392
    wuffs_base__frame_config* a_dst,
15393
    wuffs_base__io_buffer* a_src);
15394
15395
WUFFS_BASE__GENERATED_C_CODE
15396
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
15397
wuffs_vp8__decoder__decode_frame(
15398
    wuffs_vp8__decoder* self,
15399
    wuffs_base__pixel_buffer* a_dst,
15400
    wuffs_base__io_buffer* a_src,
15401
    wuffs_base__pixel_blend a_blend,
15402
    wuffs_base__slice_u8 a_workbuf,
15403
    wuffs_base__decode_frame_options* a_opts);
15404
15405
WUFFS_BASE__GENERATED_C_CODE
15406
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
15407
wuffs_vp8__decoder__frame_dirty_rect(
15408
    const wuffs_vp8__decoder* self);
15409
15410
WUFFS_BASE__GENERATED_C_CODE
15411
WUFFS_BASE__MAYBE_STATIC uint32_t
15412
wuffs_vp8__decoder__num_animation_loops(
15413
    const wuffs_vp8__decoder* self);
15414
15415
WUFFS_BASE__GENERATED_C_CODE
15416
WUFFS_BASE__MAYBE_STATIC uint64_t
15417
wuffs_vp8__decoder__num_decoded_frame_configs(
15418
    const wuffs_vp8__decoder* self);
15419
15420
WUFFS_BASE__GENERATED_C_CODE
15421
WUFFS_BASE__MAYBE_STATIC uint64_t
15422
wuffs_vp8__decoder__num_decoded_frames(
15423
    const wuffs_vp8__decoder* self);
15424
15425
WUFFS_BASE__GENERATED_C_CODE
15426
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
15427
wuffs_vp8__decoder__restart_frame(
15428
    wuffs_vp8__decoder* self,
15429
    uint64_t a_index,
15430
    uint64_t a_io_position);
15431
15432
WUFFS_BASE__GENERATED_C_CODE
15433
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
15434
wuffs_vp8__decoder__set_report_metadata(
15435
    wuffs_vp8__decoder* self,
15436
    uint32_t a_fourcc,
15437
    bool a_report);
15438
15439
WUFFS_BASE__GENERATED_C_CODE
15440
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
15441
wuffs_vp8__decoder__tell_me_more(
15442
    wuffs_vp8__decoder* self,
15443
    wuffs_base__io_buffer* a_dst,
15444
    wuffs_base__more_information* a_minfo,
15445
    wuffs_base__io_buffer* a_src);
15446
15447
WUFFS_BASE__GENERATED_C_CODE
15448
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
15449
wuffs_vp8__decoder__workbuf_len(
15450
    const wuffs_vp8__decoder* self);
15451
15452
#ifdef __cplusplus
15453
}  // extern "C"
15454
#endif
15455
15456
// ---------------- Struct Definitions
15457
15458
// These structs' fields, and the sizeof them, are private implementation
15459
// details that aren't guaranteed to be stable across Wuffs versions.
15460
//
15461
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
15462
15463
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
15464
15465
struct wuffs_vp8__decoder__struct {
15466
  // Do not access the private_impl's or private_data's fields directly. There
15467
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
15468
  // the wuffs_foo__bar__baz functions.
15469
  //
15470
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
15471
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
15472
15473
  struct {
15474
    uint32_t magic;
15475
    uint32_t active_coroutine;
15476
    wuffs_base__vtable vtable_for__wuffs_base__image_decoder;
15477
    wuffs_base__vtable null_vtable;
15478
15479
    uint32_t f_width;
15480
    uint32_t f_height;
15481
    uint8_t f_call_sequence;
15482
    uint64_t f_frame_config_io_position;
15483
    uint32_t f_dst_x;
15484
    uint32_t f_dst_y;
15485
    wuffs_base__pixel_swizzler f_swizzler;
15486
15487
    uint32_t p_decode_image_config;
15488
    uint32_t p_do_decode_image_config;
15489
    uint32_t p_decode_frame_config;
15490
    uint32_t p_do_decode_frame_config;
15491
    uint32_t p_decode_frame;
15492
    uint32_t p_do_decode_frame;
15493
  } private_impl;
15494
15495
  struct {
15496
    struct {
15497
      uint64_t scratch;
15498
    } s_do_decode_image_config;
15499
  } private_data;
15500
15501
#ifdef __cplusplus
15502
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
15503
  using unique_ptr = std::unique_ptr<wuffs_vp8__decoder, wuffs_unique_ptr_deleter>;
15504
15505
  // On failure, the alloc_etc functions return nullptr. They don't throw.
15506
15507
  static inline unique_ptr
15508
  alloc() {
15509
    return unique_ptr(wuffs_vp8__decoder__alloc());
15510
  }
15511
15512
  static inline wuffs_base__image_decoder::unique_ptr
15513
  alloc_as__wuffs_base__image_decoder() {
15514
    return wuffs_base__image_decoder::unique_ptr(
15515
        wuffs_vp8__decoder__alloc_as__wuffs_base__image_decoder());
15516
  }
15517
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
15518
15519
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
15520
  // Disallow constructing or copying an object via standard C++ mechanisms,
15521
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
15522
  // size and field layout is not part of the public, stable, memory-safe API.
15523
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
15524
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
15525
  // their first argument) rather than tweaking bar.private_impl.qux fields.
15526
  //
15527
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
15528
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
15529
  // order to provide convenience methods. These forward on "this", so that you
15530
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
15531
  wuffs_vp8__decoder__struct() = delete;
15532
  wuffs_vp8__decoder__struct(const wuffs_vp8__decoder__struct&) = delete;
15533
  wuffs_vp8__decoder__struct& operator=(
15534
      const wuffs_vp8__decoder__struct&) = delete;
15535
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
15536
15537
#if !defined(WUFFS_IMPLEMENTATION)
15538
  // As above, the size of the struct is not part of the public API, and unless
15539
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
15540
  // allocated, not stack allocated. Its size is not intended to be known at
15541
  // compile time, but it is unfortunately divulged as a side effect of
15542
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
15543
  // instead of "sizeof T", invoking the operator. To make the two values
15544
  // different, so that passing the latter will be rejected by the initialize
15545
  // function, we add an arbitrary amount of dead weight.
15546
  uint8_t dead_weight[123000000];  // 123 MB.
15547
#endif  // !defined(WUFFS_IMPLEMENTATION)
15548
15549
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
15550
  initialize(
15551
      size_t sizeof_star_self,
15552
      uint64_t wuffs_version,
15553
      uint32_t options) {
15554
    return wuffs_vp8__decoder__initialize(
15555
        this, sizeof_star_self, wuffs_version, options);
15556
  }
15557
15558
  inline wuffs_base__image_decoder*
15559
  upcast_as__wuffs_base__image_decoder() {
15560
    return (wuffs_base__image_decoder*)this;
15561
  }
15562
15563
  inline uint64_t
15564
  get_quirk(
15565
      uint32_t a_key) const {
15566
    return wuffs_vp8__decoder__get_quirk(this, a_key);
15567
  }
15568
15569
  inline wuffs_base__status
15570
  set_quirk(
15571
      uint32_t a_key,
15572
      uint64_t a_value) {
15573
    return wuffs_vp8__decoder__set_quirk(this, a_key, a_value);
15574
  }
15575
15576
  inline wuffs_base__status
15577
  decode_image_config(
15578
      wuffs_base__image_config* a_dst,
15579
      wuffs_base__io_buffer* a_src) {
15580
    return wuffs_vp8__decoder__decode_image_config(this, a_dst, a_src);
15581
  }
15582
15583
  inline wuffs_base__status
15584
  decode_frame_config(
15585
      wuffs_base__frame_config* a_dst,
15586
      wuffs_base__io_buffer* a_src) {
15587
    return wuffs_vp8__decoder__decode_frame_config(this, a_dst, a_src);
15588
  }
15589
15590
  inline wuffs_base__status
15591
  decode_frame(
15592
      wuffs_base__pixel_buffer* a_dst,
15593
      wuffs_base__io_buffer* a_src,
15594
      wuffs_base__pixel_blend a_blend,
15595
      wuffs_base__slice_u8 a_workbuf,
15596
      wuffs_base__decode_frame_options* a_opts) {
15597
    return wuffs_vp8__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts);
15598
  }
15599
15600
  inline wuffs_base__rect_ie_u32
15601
  frame_dirty_rect() const {
15602
    return wuffs_vp8__decoder__frame_dirty_rect(this);
15603
  }
15604
15605
  inline uint32_t
15606
  num_animation_loops() const {
15607
    return wuffs_vp8__decoder__num_animation_loops(this);
15608
  }
15609
15610
  inline uint64_t
15611
  num_decoded_frame_configs() const {
15612
    return wuffs_vp8__decoder__num_decoded_frame_configs(this);
15613
  }
15614
15615
  inline uint64_t
15616
  num_decoded_frames() const {
15617
    return wuffs_vp8__decoder__num_decoded_frames(this);
15618
  }
15619
15620
  inline wuffs_base__status
15621
  restart_frame(
15622
      uint64_t a_index,
15623
      uint64_t a_io_position) {
15624
    return wuffs_vp8__decoder__restart_frame(this, a_index, a_io_position);
15625
  }
15626
15627
  inline wuffs_base__empty_struct
15628
  set_report_metadata(
15629
      uint32_t a_fourcc,
15630
      bool a_report) {
15631
    return wuffs_vp8__decoder__set_report_metadata(this, a_fourcc, a_report);
15632
  }
15633
15634
  inline wuffs_base__status
15635
  tell_me_more(
15636
      wuffs_base__io_buffer* a_dst,
15637
      wuffs_base__more_information* a_minfo,
15638
      wuffs_base__io_buffer* a_src) {
15639
    return wuffs_vp8__decoder__tell_me_more(this, a_dst, a_minfo, a_src);
15640
  }
15641
15642
  inline wuffs_base__range_ii_u64
15643
  workbuf_len() const {
15644
    return wuffs_vp8__decoder__workbuf_len(this);
15645
  }
15646
15647
#endif  // __cplusplus
15648
};  // struct wuffs_vp8__decoder__struct
15649
15650
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
15651
15652
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__VP8) || defined(WUFFS_NONMONOLITHIC)
15653
15654
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WBMP) || defined(WUFFS_NONMONOLITHIC)
15655
15656
// ---------------- Status Codes
15657
15658
extern const char wuffs_wbmp__error__bad_header[];
15659
extern const char wuffs_wbmp__error__truncated_input[];
15660
15661
// ---------------- Public Consts
15662
15663
#define WUFFS_WBMP__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u
15664
15665
// ---------------- Struct Declarations
15666
15667
typedef struct wuffs_wbmp__decoder__struct wuffs_wbmp__decoder;
15668
15669
#ifdef __cplusplus
15670
extern "C" {
15671
#endif
15672
15673
// ---------------- Public Initializer Prototypes
15674
15675
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
15676
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
15677
//
15678
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
15679
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
15680
15681
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
15682
wuffs_wbmp__decoder__initialize(
15683
    wuffs_wbmp__decoder* self,
15684
    size_t sizeof_star_self,
15685
    uint64_t wuffs_version,
15686
    uint32_t options);
15687
15688
size_t
15689
sizeof__wuffs_wbmp__decoder(void);
15690
15691
// ---------------- Allocs
15692
15693
// These functions allocate and initialize Wuffs structs. They return NULL if
15694
// memory allocation fails. If they return non-NULL, there is no need to call
15695
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
15696
// calling free on the returned pointer. That pointer is effectively a C++
15697
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
15698
15699
wuffs_wbmp__decoder*
15700
wuffs_wbmp__decoder__alloc(void);
15701
15702
static inline wuffs_base__image_decoder*
15703
wuffs_wbmp__decoder__alloc_as__wuffs_base__image_decoder(void) {
15704
  return (wuffs_base__image_decoder*)(wuffs_wbmp__decoder__alloc());
15705
}
15706
15707
// ---------------- Upcasts
15708
15709
static inline wuffs_base__image_decoder*
15710
wuffs_wbmp__decoder__upcast_as__wuffs_base__image_decoder(
15711
    wuffs_wbmp__decoder* p) {
15712
  return (wuffs_base__image_decoder*)p;
15713
}
15714
15715
// ---------------- Public Function Prototypes
15716
15717
WUFFS_BASE__GENERATED_C_CODE
15718
WUFFS_BASE__MAYBE_STATIC uint64_t
15719
wuffs_wbmp__decoder__get_quirk(
15720
    const wuffs_wbmp__decoder* self,
15721
    uint32_t a_key);
15722
15723
WUFFS_BASE__GENERATED_C_CODE
15724
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
15725
wuffs_wbmp__decoder__set_quirk(
15726
    wuffs_wbmp__decoder* self,
15727
    uint32_t a_key,
15728
    uint64_t a_value);
15729
15730
WUFFS_BASE__GENERATED_C_CODE
15731
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
15732
wuffs_wbmp__decoder__decode_image_config(
15733
    wuffs_wbmp__decoder* self,
15734
    wuffs_base__image_config* a_dst,
15735
    wuffs_base__io_buffer* a_src);
15736
15737
WUFFS_BASE__GENERATED_C_CODE
15738
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
15739
wuffs_wbmp__decoder__decode_frame_config(
15740
    wuffs_wbmp__decoder* self,
15741
    wuffs_base__frame_config* a_dst,
15742
    wuffs_base__io_buffer* a_src);
15743
15744
WUFFS_BASE__GENERATED_C_CODE
15745
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
15746
wuffs_wbmp__decoder__decode_frame(
15747
    wuffs_wbmp__decoder* self,
15748
    wuffs_base__pixel_buffer* a_dst,
15749
    wuffs_base__io_buffer* a_src,
15750
    wuffs_base__pixel_blend a_blend,
15751
    wuffs_base__slice_u8 a_workbuf,
15752
    wuffs_base__decode_frame_options* a_opts);
15753
15754
WUFFS_BASE__GENERATED_C_CODE
15755
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
15756
wuffs_wbmp__decoder__frame_dirty_rect(
15757
    const wuffs_wbmp__decoder* self);
15758
15759
WUFFS_BASE__GENERATED_C_CODE
15760
WUFFS_BASE__MAYBE_STATIC uint32_t
15761
wuffs_wbmp__decoder__num_animation_loops(
15762
    const wuffs_wbmp__decoder* self);
15763
15764
WUFFS_BASE__GENERATED_C_CODE
15765
WUFFS_BASE__MAYBE_STATIC uint64_t
15766
wuffs_wbmp__decoder__num_decoded_frame_configs(
15767
    const wuffs_wbmp__decoder* self);
15768
15769
WUFFS_BASE__GENERATED_C_CODE
15770
WUFFS_BASE__MAYBE_STATIC uint64_t
15771
wuffs_wbmp__decoder__num_decoded_frames(
15772
    const wuffs_wbmp__decoder* self);
15773
15774
WUFFS_BASE__GENERATED_C_CODE
15775
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
15776
wuffs_wbmp__decoder__restart_frame(
15777
    wuffs_wbmp__decoder* self,
15778
    uint64_t a_index,
15779
    uint64_t a_io_position);
15780
15781
WUFFS_BASE__GENERATED_C_CODE
15782
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
15783
wuffs_wbmp__decoder__set_report_metadata(
15784
    wuffs_wbmp__decoder* self,
15785
    uint32_t a_fourcc,
15786
    bool a_report);
15787
15788
WUFFS_BASE__GENERATED_C_CODE
15789
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
15790
wuffs_wbmp__decoder__tell_me_more(
15791
    wuffs_wbmp__decoder* self,
15792
    wuffs_base__io_buffer* a_dst,
15793
    wuffs_base__more_information* a_minfo,
15794
    wuffs_base__io_buffer* a_src);
15795
15796
WUFFS_BASE__GENERATED_C_CODE
15797
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
15798
wuffs_wbmp__decoder__workbuf_len(
15799
    const wuffs_wbmp__decoder* self);
15800
15801
#ifdef __cplusplus
15802
}  // extern "C"
15803
#endif
15804
15805
// ---------------- Struct Definitions
15806
15807
// These structs' fields, and the sizeof them, are private implementation
15808
// details that aren't guaranteed to be stable across Wuffs versions.
15809
//
15810
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
15811
15812
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
15813
15814
struct wuffs_wbmp__decoder__struct {
15815
  // Do not access the private_impl's or private_data's fields directly. There
15816
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
15817
  // the wuffs_foo__bar__baz functions.
15818
  //
15819
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
15820
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
15821
15822
  struct {
15823
    uint32_t magic;
15824
    uint32_t active_coroutine;
15825
    wuffs_base__vtable vtable_for__wuffs_base__image_decoder;
15826
    wuffs_base__vtable null_vtable;
15827
15828
    uint32_t f_width;
15829
    uint32_t f_height;
15830
    uint8_t f_call_sequence;
15831
    uint64_t f_frame_config_io_position;
15832
    wuffs_base__pixel_swizzler f_swizzler;
15833
15834
    uint32_t p_decode_image_config;
15835
    uint32_t p_do_decode_image_config;
15836
    uint32_t p_decode_frame_config;
15837
    uint32_t p_do_decode_frame_config;
15838
    uint32_t p_decode_frame;
15839
    uint32_t p_do_decode_frame;
15840
  } private_impl;
15841
15842
  struct {
15843
    struct {
15844
      uint32_t v_i;
15845
      uint32_t v_p;
15846
    } s_do_decode_image_config;
15847
    struct {
15848
      uint64_t v_dst_bytes_per_pixel;
15849
      uint32_t v_dst_x;
15850
      uint32_t v_dst_y;
15851
      uint8_t v_src[1];
15852
      uint8_t v_c8;
15853
    } s_do_decode_frame;
15854
  } private_data;
15855
15856
#ifdef __cplusplus
15857
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
15858
  using unique_ptr = std::unique_ptr<wuffs_wbmp__decoder, wuffs_unique_ptr_deleter>;
15859
15860
  // On failure, the alloc_etc functions return nullptr. They don't throw.
15861
15862
  static inline unique_ptr
15863
  alloc() {
15864
    return unique_ptr(wuffs_wbmp__decoder__alloc());
15865
  }
15866
15867
  static inline wuffs_base__image_decoder::unique_ptr
15868
  alloc_as__wuffs_base__image_decoder() {
15869
    return wuffs_base__image_decoder::unique_ptr(
15870
        wuffs_wbmp__decoder__alloc_as__wuffs_base__image_decoder());
15871
  }
15872
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
15873
15874
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
15875
  // Disallow constructing or copying an object via standard C++ mechanisms,
15876
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
15877
  // size and field layout is not part of the public, stable, memory-safe API.
15878
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
15879
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
15880
  // their first argument) rather than tweaking bar.private_impl.qux fields.
15881
  //
15882
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
15883
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
15884
  // order to provide convenience methods. These forward on "this", so that you
15885
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
15886
  wuffs_wbmp__decoder__struct() = delete;
15887
  wuffs_wbmp__decoder__struct(const wuffs_wbmp__decoder__struct&) = delete;
15888
  wuffs_wbmp__decoder__struct& operator=(
15889
      const wuffs_wbmp__decoder__struct&) = delete;
15890
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
15891
15892
#if !defined(WUFFS_IMPLEMENTATION)
15893
  // As above, the size of the struct is not part of the public API, and unless
15894
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
15895
  // allocated, not stack allocated. Its size is not intended to be known at
15896
  // compile time, but it is unfortunately divulged as a side effect of
15897
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
15898
  // instead of "sizeof T", invoking the operator. To make the two values
15899
  // different, so that passing the latter will be rejected by the initialize
15900
  // function, we add an arbitrary amount of dead weight.
15901
  uint8_t dead_weight[123000000];  // 123 MB.
15902
#endif  // !defined(WUFFS_IMPLEMENTATION)
15903
15904
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
15905
  initialize(
15906
      size_t sizeof_star_self,
15907
      uint64_t wuffs_version,
15908
      uint32_t options) {
15909
    return wuffs_wbmp__decoder__initialize(
15910
        this, sizeof_star_self, wuffs_version, options);
15911
  }
15912
15913
  inline wuffs_base__image_decoder*
15914
  upcast_as__wuffs_base__image_decoder() {
15915
    return (wuffs_base__image_decoder*)this;
15916
  }
15917
15918
  inline uint64_t
15919
  get_quirk(
15920
      uint32_t a_key) const {
15921
    return wuffs_wbmp__decoder__get_quirk(this, a_key);
15922
  }
15923
15924
  inline wuffs_base__status
15925
  set_quirk(
15926
      uint32_t a_key,
15927
      uint64_t a_value) {
15928
    return wuffs_wbmp__decoder__set_quirk(this, a_key, a_value);
15929
  }
15930
15931
  inline wuffs_base__status
15932
  decode_image_config(
15933
      wuffs_base__image_config* a_dst,
15934
      wuffs_base__io_buffer* a_src) {
15935
    return wuffs_wbmp__decoder__decode_image_config(this, a_dst, a_src);
15936
  }
15937
15938
  inline wuffs_base__status
15939
  decode_frame_config(
15940
      wuffs_base__frame_config* a_dst,
15941
      wuffs_base__io_buffer* a_src) {
15942
    return wuffs_wbmp__decoder__decode_frame_config(this, a_dst, a_src);
15943
  }
15944
15945
  inline wuffs_base__status
15946
  decode_frame(
15947
      wuffs_base__pixel_buffer* a_dst,
15948
      wuffs_base__io_buffer* a_src,
15949
      wuffs_base__pixel_blend a_blend,
15950
      wuffs_base__slice_u8 a_workbuf,
15951
      wuffs_base__decode_frame_options* a_opts) {
15952
    return wuffs_wbmp__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts);
15953
  }
15954
15955
  inline wuffs_base__rect_ie_u32
15956
  frame_dirty_rect() const {
15957
    return wuffs_wbmp__decoder__frame_dirty_rect(this);
15958
  }
15959
15960
  inline uint32_t
15961
  num_animation_loops() const {
15962
    return wuffs_wbmp__decoder__num_animation_loops(this);
15963
  }
15964
15965
  inline uint64_t
15966
  num_decoded_frame_configs() const {
15967
    return wuffs_wbmp__decoder__num_decoded_frame_configs(this);
15968
  }
15969
15970
  inline uint64_t
15971
  num_decoded_frames() const {
15972
    return wuffs_wbmp__decoder__num_decoded_frames(this);
15973
  }
15974
15975
  inline wuffs_base__status
15976
  restart_frame(
15977
      uint64_t a_index,
15978
      uint64_t a_io_position) {
15979
    return wuffs_wbmp__decoder__restart_frame(this, a_index, a_io_position);
15980
  }
15981
15982
  inline wuffs_base__empty_struct
15983
  set_report_metadata(
15984
      uint32_t a_fourcc,
15985
      bool a_report) {
15986
    return wuffs_wbmp__decoder__set_report_metadata(this, a_fourcc, a_report);
15987
  }
15988
15989
  inline wuffs_base__status
15990
  tell_me_more(
15991
      wuffs_base__io_buffer* a_dst,
15992
      wuffs_base__more_information* a_minfo,
15993
      wuffs_base__io_buffer* a_src) {
15994
    return wuffs_wbmp__decoder__tell_me_more(this, a_dst, a_minfo, a_src);
15995
  }
15996
15997
  inline wuffs_base__range_ii_u64
15998
  workbuf_len() const {
15999
    return wuffs_wbmp__decoder__workbuf_len(this);
16000
  }
16001
16002
#endif  // __cplusplus
16003
};  // struct wuffs_wbmp__decoder__struct
16004
16005
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
16006
16007
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WBMP) || defined(WUFFS_NONMONOLITHIC)
16008
16009
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WEBP) || defined(WUFFS_NONMONOLITHIC)
16010
16011
// ---------------- Status Codes
16012
16013
extern const char wuffs_webp__error__bad_huffman_code_over_subscribed[];
16014
extern const char wuffs_webp__error__bad_huffman_code_under_subscribed[];
16015
extern const char wuffs_webp__error__bad_huffman_code[];
16016
extern const char wuffs_webp__error__bad_back_reference[];
16017
extern const char wuffs_webp__error__bad_color_cache[];
16018
extern const char wuffs_webp__error__bad_header[];
16019
extern const char wuffs_webp__error__bad_transform[];
16020
extern const char wuffs_webp__error__short_chunk[];
16021
extern const char wuffs_webp__error__truncated_input[];
16022
extern const char wuffs_webp__error__unsupported_number_of_huffman_groups[];
16023
extern const char wuffs_webp__error__unsupported_transform_after_color_indexing_transform[];
16024
extern const char wuffs_webp__error__unsupported_webp_file[];
16025
16026
// ---------------- Public Consts
16027
16028
#define WUFFS_WEBP__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u
16029
16030
// ---------------- Struct Declarations
16031
16032
typedef struct wuffs_webp__decoder__struct wuffs_webp__decoder;
16033
16034
#ifdef __cplusplus
16035
extern "C" {
16036
#endif
16037
16038
// ---------------- Public Initializer Prototypes
16039
16040
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
16041
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
16042
//
16043
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
16044
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
16045
16046
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
16047
wuffs_webp__decoder__initialize(
16048
    wuffs_webp__decoder* self,
16049
    size_t sizeof_star_self,
16050
    uint64_t wuffs_version,
16051
    uint32_t options);
16052
16053
size_t
16054
sizeof__wuffs_webp__decoder(void);
16055
16056
// ---------------- Allocs
16057
16058
// These functions allocate and initialize Wuffs structs. They return NULL if
16059
// memory allocation fails. If they return non-NULL, there is no need to call
16060
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
16061
// calling free on the returned pointer. That pointer is effectively a C++
16062
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
16063
16064
wuffs_webp__decoder*
16065
wuffs_webp__decoder__alloc(void);
16066
16067
static inline wuffs_base__image_decoder*
16068
wuffs_webp__decoder__alloc_as__wuffs_base__image_decoder(void) {
16069
  return (wuffs_base__image_decoder*)(wuffs_webp__decoder__alloc());
16070
}
16071
16072
// ---------------- Upcasts
16073
16074
static inline wuffs_base__image_decoder*
16075
wuffs_webp__decoder__upcast_as__wuffs_base__image_decoder(
16076
    wuffs_webp__decoder* p) {
16077
  return (wuffs_base__image_decoder*)p;
16078
}
16079
16080
// ---------------- Public Function Prototypes
16081
16082
WUFFS_BASE__GENERATED_C_CODE
16083
WUFFS_BASE__MAYBE_STATIC uint64_t
16084
wuffs_webp__decoder__get_quirk(
16085
    const wuffs_webp__decoder* self,
16086
    uint32_t a_key);
16087
16088
WUFFS_BASE__GENERATED_C_CODE
16089
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
16090
wuffs_webp__decoder__set_quirk(
16091
    wuffs_webp__decoder* self,
16092
    uint32_t a_key,
16093
    uint64_t a_value);
16094
16095
WUFFS_BASE__GENERATED_C_CODE
16096
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
16097
wuffs_webp__decoder__decode_image_config(
16098
    wuffs_webp__decoder* self,
16099
    wuffs_base__image_config* a_dst,
16100
    wuffs_base__io_buffer* a_src);
16101
16102
WUFFS_BASE__GENERATED_C_CODE
16103
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
16104
wuffs_webp__decoder__decode_frame_config(
16105
    wuffs_webp__decoder* self,
16106
    wuffs_base__frame_config* a_dst,
16107
    wuffs_base__io_buffer* a_src);
16108
16109
WUFFS_BASE__GENERATED_C_CODE
16110
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
16111
wuffs_webp__decoder__decode_frame(
16112
    wuffs_webp__decoder* self,
16113
    wuffs_base__pixel_buffer* a_dst,
16114
    wuffs_base__io_buffer* a_src,
16115
    wuffs_base__pixel_blend a_blend,
16116
    wuffs_base__slice_u8 a_workbuf,
16117
    wuffs_base__decode_frame_options* a_opts);
16118
16119
WUFFS_BASE__GENERATED_C_CODE
16120
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
16121
wuffs_webp__decoder__frame_dirty_rect(
16122
    const wuffs_webp__decoder* self);
16123
16124
WUFFS_BASE__GENERATED_C_CODE
16125
WUFFS_BASE__MAYBE_STATIC uint32_t
16126
wuffs_webp__decoder__num_animation_loops(
16127
    const wuffs_webp__decoder* self);
16128
16129
WUFFS_BASE__GENERATED_C_CODE
16130
WUFFS_BASE__MAYBE_STATIC uint64_t
16131
wuffs_webp__decoder__num_decoded_frame_configs(
16132
    const wuffs_webp__decoder* self);
16133
16134
WUFFS_BASE__GENERATED_C_CODE
16135
WUFFS_BASE__MAYBE_STATIC uint64_t
16136
wuffs_webp__decoder__num_decoded_frames(
16137
    const wuffs_webp__decoder* self);
16138
16139
WUFFS_BASE__GENERATED_C_CODE
16140
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
16141
wuffs_webp__decoder__restart_frame(
16142
    wuffs_webp__decoder* self,
16143
    uint64_t a_index,
16144
    uint64_t a_io_position);
16145
16146
WUFFS_BASE__GENERATED_C_CODE
16147
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
16148
wuffs_webp__decoder__set_report_metadata(
16149
    wuffs_webp__decoder* self,
16150
    uint32_t a_fourcc,
16151
    bool a_report);
16152
16153
WUFFS_BASE__GENERATED_C_CODE
16154
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
16155
wuffs_webp__decoder__tell_me_more(
16156
    wuffs_webp__decoder* self,
16157
    wuffs_base__io_buffer* a_dst,
16158
    wuffs_base__more_information* a_minfo,
16159
    wuffs_base__io_buffer* a_src);
16160
16161
WUFFS_BASE__GENERATED_C_CODE
16162
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
16163
wuffs_webp__decoder__workbuf_len(
16164
    const wuffs_webp__decoder* self);
16165
16166
#ifdef __cplusplus
16167
}  // extern "C"
16168
#endif
16169
16170
// ---------------- Struct Definitions
16171
16172
// These structs' fields, and the sizeof them, are private implementation
16173
// details that aren't guaranteed to be stable across Wuffs versions.
16174
//
16175
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
16176
16177
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
16178
16179
struct wuffs_webp__decoder__struct {
16180
  // Do not access the private_impl's or private_data's fields directly. There
16181
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
16182
  // the wuffs_foo__bar__baz functions.
16183
  //
16184
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
16185
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
16186
16187
  struct {
16188
    uint32_t magic;
16189
    uint32_t active_coroutine;
16190
    wuffs_base__vtable vtable_for__wuffs_base__image_decoder;
16191
    wuffs_base__vtable null_vtable;
16192
16193
    uint32_t f_pixfmt;
16194
    uint32_t f_width;
16195
    uint32_t f_height;
16196
    uint8_t f_call_sequence;
16197
    uint8_t f_code_length_code_lengths[19];
16198
    bool f_sub_chunk_has_padding;
16199
    bool f_is_vp8_lossy;
16200
    uint64_t f_frame_config_io_position;
16201
    uint32_t f_riff_chunk_length;
16202
    uint32_t f_sub_chunk_length;
16203
    uint32_t f_bits;
16204
    uint32_t f_n_bits;
16205
    bool f_seen_transform[4];
16206
    uint8_t f_transform_type[4];
16207
    uint8_t f_transform_tile_size_log2[4];
16208
    uint32_t f_n_transforms;
16209
    uint32_t f_color_cache_bits;
16210
    uint32_t f_overall_color_cache_bits;
16211
    uint32_t f_overall_tile_size_log2;
16212
    uint32_t f_overall_n_huffman_groups;
16213
    uint32_t f_ht_n_symbols;
16214
    uint32_t f_ht_code_lengths_remaining;
16215
    uint32_t f_color_indexing_palette_size;
16216
    uint32_t f_color_indexing_width;
16217
    uint32_t f_workbuf_offset_for_transform[4];
16218
    uint32_t f_workbuf_offset_for_color_indexing;
16219
    wuffs_base__pixel_swizzler f_swizzler;
16220
16221
    uint32_t p_decode_huffman_groups;
16222
    uint32_t p_decode_huffman_tree;
16223
    uint32_t p_decode_huffman_tree_simple;
16224
    uint32_t p_decode_code_length_code_lengths;
16225
    uint32_t p_build_code_lengths;
16226
    uint32_t p_decode_pixels_slow;
16227
    uint32_t p_decode_image_config;
16228
    uint32_t p_do_decode_image_config;
16229
    uint32_t p_do_decode_image_config_limited;
16230
    uint32_t p_do_decode_image_config_limited_vp8l;
16231
    uint32_t p_decode_frame_config;
16232
    uint32_t p_do_decode_frame_config;
16233
    uint32_t p_decode_frame;
16234
    uint32_t p_do_decode_frame;
16235
    uint32_t p_decode_transform;
16236
    uint32_t p_decode_color_cache_parameters;
16237
    uint32_t p_decode_hg_table;
16238
    uint32_t p_decode_pixels;
16239
  } private_impl;
16240
16241
  struct {
16242
    wuffs_vp8__decoder f_vp8;
16243
    uint8_t f_palette[1024];
16244
    uint32_t f_color_cache[2048];
16245
    uint16_t f_codes[2328];
16246
    uint16_t f_code_lengths[2328];
16247
    uint16_t f_code_lengths_huffman_nodes[37];
16248
    uint16_t f_huffman_nodes[256][6267];
16249
16250
    struct {
16251
      uint32_t v_hg;
16252
      uint32_t v_ht;
16253
    } s_decode_huffman_groups;
16254
    struct {
16255
      uint32_t v_use_second_symbol;
16256
      uint32_t v_first_symbol_n_bits;
16257
      uint32_t v_symbol0;
16258
      uint32_t v_base_offset;
16259
    } s_decode_huffman_tree_simple;
16260
    struct {
16261
      uint32_t v_n_codes;
16262
      uint32_t v_i;
16263
    } s_decode_code_length_code_lengths;
16264
    struct {
16265
      uint32_t v_length_n_bits;
16266
      uint16_t v_prev_code_length;
16267
      uint32_t v_s;
16268
      uint32_t v_s_max;
16269
      uint16_t v_node;
16270
      uint16_t v_repeat_value;
16271
      uint32_t v_repeat_n_bits;
16272
    } s_build_code_lengths;
16273
    struct {
16274
      uint64_t v_p;
16275
      uint64_t v_p_max;
16276
      uint32_t v_tile_size_log2;
16277
      uint32_t v_width_in_tiles;
16278
      uint32_t v_x;
16279
      uint32_t v_y;
16280
      uint32_t v_hg;
16281
      uint16_t v_node;
16282
      uint32_t v_color;
16283
      uint32_t v_back_ref_len_n_bits;
16284
      uint32_t v_back_ref_len_minus_1;
16285
      uint32_t v_back_ref_dist_n_bits;
16286
      uint32_t v_back_ref_dist_premap_minus_1;
16287
      uint64_t v_color_cache_p;
16288
    } s_decode_pixels_slow;
16289
    struct {
16290
      uint64_t scratch;
16291
    } s_do_decode_image_config;
16292
    struct {
16293
      uint64_t scratch;
16294
    } s_do_decode_image_config_limited;
16295
    struct {
16296
      uint64_t scratch;
16297
    } s_do_decode_image_config_limited_vp8l;
16298
    struct {
16299
      uint32_t v_width;
16300
    } s_do_decode_frame;
16301
    struct {
16302
      uint32_t v_transform_type;
16303
      uint32_t v_tile_size_log2;
16304
    } s_decode_transform;
16305
    struct {
16306
      uint32_t v_tile_size_log2;
16307
    } s_decode_hg_table;
16308
  } private_data;
16309
16310
#ifdef __cplusplus
16311
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
16312
  using unique_ptr = std::unique_ptr<wuffs_webp__decoder, wuffs_unique_ptr_deleter>;
16313
16314
  // On failure, the alloc_etc functions return nullptr. They don't throw.
16315
16316
  static inline unique_ptr
16317
  alloc() {
16318
    return unique_ptr(wuffs_webp__decoder__alloc());
16319
  }
16320
16321
  static inline wuffs_base__image_decoder::unique_ptr
16322
  alloc_as__wuffs_base__image_decoder() {
16323
    return wuffs_base__image_decoder::unique_ptr(
16324
        wuffs_webp__decoder__alloc_as__wuffs_base__image_decoder());
16325
  }
16326
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
16327
16328
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
16329
  // Disallow constructing or copying an object via standard C++ mechanisms,
16330
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
16331
  // size and field layout is not part of the public, stable, memory-safe API.
16332
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
16333
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
16334
  // their first argument) rather than tweaking bar.private_impl.qux fields.
16335
  //
16336
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
16337
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
16338
  // order to provide convenience methods. These forward on "this", so that you
16339
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
16340
  wuffs_webp__decoder__struct() = delete;
16341
  wuffs_webp__decoder__struct(const wuffs_webp__decoder__struct&) = delete;
16342
  wuffs_webp__decoder__struct& operator=(
16343
      const wuffs_webp__decoder__struct&) = delete;
16344
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
16345
16346
#if !defined(WUFFS_IMPLEMENTATION)
16347
  // As above, the size of the struct is not part of the public API, and unless
16348
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
16349
  // allocated, not stack allocated. Its size is not intended to be known at
16350
  // compile time, but it is unfortunately divulged as a side effect of
16351
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
16352
  // instead of "sizeof T", invoking the operator. To make the two values
16353
  // different, so that passing the latter will be rejected by the initialize
16354
  // function, we add an arbitrary amount of dead weight.
16355
  uint8_t dead_weight[123000000];  // 123 MB.
16356
#endif  // !defined(WUFFS_IMPLEMENTATION)
16357
16358
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
16359
  initialize(
16360
      size_t sizeof_star_self,
16361
      uint64_t wuffs_version,
16362
      uint32_t options) {
16363
    return wuffs_webp__decoder__initialize(
16364
        this, sizeof_star_self, wuffs_version, options);
16365
  }
16366
16367
  inline wuffs_base__image_decoder*
16368
  upcast_as__wuffs_base__image_decoder() {
16369
    return (wuffs_base__image_decoder*)this;
16370
  }
16371
16372
  inline uint64_t
16373
  get_quirk(
16374
      uint32_t a_key) const {
16375
    return wuffs_webp__decoder__get_quirk(this, a_key);
16376
  }
16377
16378
  inline wuffs_base__status
16379
  set_quirk(
16380
      uint32_t a_key,
16381
      uint64_t a_value) {
16382
    return wuffs_webp__decoder__set_quirk(this, a_key, a_value);
16383
  }
16384
16385
  inline wuffs_base__status
16386
  decode_image_config(
16387
      wuffs_base__image_config* a_dst,
16388
      wuffs_base__io_buffer* a_src) {
16389
    return wuffs_webp__decoder__decode_image_config(this, a_dst, a_src);
16390
  }
16391
16392
  inline wuffs_base__status
16393
  decode_frame_config(
16394
      wuffs_base__frame_config* a_dst,
16395
      wuffs_base__io_buffer* a_src) {
16396
    return wuffs_webp__decoder__decode_frame_config(this, a_dst, a_src);
16397
  }
16398
16399
  inline wuffs_base__status
16400
  decode_frame(
16401
      wuffs_base__pixel_buffer* a_dst,
16402
      wuffs_base__io_buffer* a_src,
16403
      wuffs_base__pixel_blend a_blend,
16404
      wuffs_base__slice_u8 a_workbuf,
16405
      wuffs_base__decode_frame_options* a_opts) {
16406
    return wuffs_webp__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts);
16407
  }
16408
16409
  inline wuffs_base__rect_ie_u32
16410
  frame_dirty_rect() const {
16411
    return wuffs_webp__decoder__frame_dirty_rect(this);
16412
  }
16413
16414
  inline uint32_t
16415
  num_animation_loops() const {
16416
    return wuffs_webp__decoder__num_animation_loops(this);
16417
  }
16418
16419
  inline uint64_t
16420
  num_decoded_frame_configs() const {
16421
    return wuffs_webp__decoder__num_decoded_frame_configs(this);
16422
  }
16423
16424
  inline uint64_t
16425
  num_decoded_frames() const {
16426
    return wuffs_webp__decoder__num_decoded_frames(this);
16427
  }
16428
16429
  inline wuffs_base__status
16430
  restart_frame(
16431
      uint64_t a_index,
16432
      uint64_t a_io_position) {
16433
    return wuffs_webp__decoder__restart_frame(this, a_index, a_io_position);
16434
  }
16435
16436
  inline wuffs_base__empty_struct
16437
  set_report_metadata(
16438
      uint32_t a_fourcc,
16439
      bool a_report) {
16440
    return wuffs_webp__decoder__set_report_metadata(this, a_fourcc, a_report);
16441
  }
16442
16443
  inline wuffs_base__status
16444
  tell_me_more(
16445
      wuffs_base__io_buffer* a_dst,
16446
      wuffs_base__more_information* a_minfo,
16447
      wuffs_base__io_buffer* a_src) {
16448
    return wuffs_webp__decoder__tell_me_more(this, a_dst, a_minfo, a_src);
16449
  }
16450
16451
  inline wuffs_base__range_ii_u64
16452
  workbuf_len() const {
16453
    return wuffs_webp__decoder__workbuf_len(this);
16454
  }
16455
16456
#endif  // __cplusplus
16457
};  // struct wuffs_webp__decoder__struct
16458
16459
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
16460
16461
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WEBP) || defined(WUFFS_NONMONOLITHIC)
16462
16463
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH32) || defined(WUFFS_NONMONOLITHIC)
16464
16465
// ---------------- Status Codes
16466
16467
// ---------------- Public Consts
16468
16469
// ---------------- Struct Declarations
16470
16471
typedef struct wuffs_xxhash32__hasher__struct wuffs_xxhash32__hasher;
16472
16473
#ifdef __cplusplus
16474
extern "C" {
16475
#endif
16476
16477
// ---------------- Public Initializer Prototypes
16478
16479
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
16480
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
16481
//
16482
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
16483
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
16484
16485
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
16486
wuffs_xxhash32__hasher__initialize(
16487
    wuffs_xxhash32__hasher* self,
16488
    size_t sizeof_star_self,
16489
    uint64_t wuffs_version,
16490
    uint32_t options);
16491
16492
size_t
16493
sizeof__wuffs_xxhash32__hasher(void);
16494
16495
// ---------------- Allocs
16496
16497
// These functions allocate and initialize Wuffs structs. They return NULL if
16498
// memory allocation fails. If they return non-NULL, there is no need to call
16499
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
16500
// calling free on the returned pointer. That pointer is effectively a C++
16501
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
16502
16503
wuffs_xxhash32__hasher*
16504
wuffs_xxhash32__hasher__alloc(void);
16505
16506
static inline wuffs_base__hasher_u32*
16507
wuffs_xxhash32__hasher__alloc_as__wuffs_base__hasher_u32(void) {
16508
  return (wuffs_base__hasher_u32*)(wuffs_xxhash32__hasher__alloc());
16509
}
16510
16511
// ---------------- Upcasts
16512
16513
static inline wuffs_base__hasher_u32*
16514
wuffs_xxhash32__hasher__upcast_as__wuffs_base__hasher_u32(
16515
    wuffs_xxhash32__hasher* p) {
16516
  return (wuffs_base__hasher_u32*)p;
16517
}
16518
16519
// ---------------- Public Function Prototypes
16520
16521
WUFFS_BASE__GENERATED_C_CODE
16522
WUFFS_BASE__MAYBE_STATIC uint64_t
16523
wuffs_xxhash32__hasher__get_quirk(
16524
    const wuffs_xxhash32__hasher* self,
16525
    uint32_t a_key);
16526
16527
WUFFS_BASE__GENERATED_C_CODE
16528
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
16529
wuffs_xxhash32__hasher__set_quirk(
16530
    wuffs_xxhash32__hasher* self,
16531
    uint32_t a_key,
16532
    uint64_t a_value);
16533
16534
WUFFS_BASE__GENERATED_C_CODE
16535
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
16536
wuffs_xxhash32__hasher__update(
16537
    wuffs_xxhash32__hasher* self,
16538
    wuffs_base__slice_u8 a_x);
16539
16540
WUFFS_BASE__GENERATED_C_CODE
16541
WUFFS_BASE__MAYBE_STATIC uint32_t
16542
wuffs_xxhash32__hasher__update_u32(
16543
    wuffs_xxhash32__hasher* self,
16544
    wuffs_base__slice_u8 a_x);
16545
16546
WUFFS_BASE__GENERATED_C_CODE
16547
WUFFS_BASE__MAYBE_STATIC uint32_t
16548
wuffs_xxhash32__hasher__checksum_u32(
16549
    const wuffs_xxhash32__hasher* self);
16550
16551
#ifdef __cplusplus
16552
}  // extern "C"
16553
#endif
16554
16555
// ---------------- Struct Definitions
16556
16557
// These structs' fields, and the sizeof them, are private implementation
16558
// details that aren't guaranteed to be stable across Wuffs versions.
16559
//
16560
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
16561
16562
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
16563
16564
struct wuffs_xxhash32__hasher__struct {
16565
  // Do not access the private_impl's or private_data's fields directly. There
16566
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
16567
  // the wuffs_foo__bar__baz functions.
16568
  //
16569
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
16570
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
16571
16572
  struct {
16573
    uint32_t magic;
16574
    uint32_t active_coroutine;
16575
    wuffs_base__vtable vtable_for__wuffs_base__hasher_u32;
16576
    wuffs_base__vtable null_vtable;
16577
16578
    uint32_t f_length_modulo_u32;
16579
    bool f_length_overflows_u32;
16580
    uint8_t f_padding0;
16581
    uint8_t f_padding1;
16582
    uint8_t f_buf_len;
16583
    uint8_t f_buf_data[16];
16584
    uint32_t f_v0;
16585
    uint32_t f_v1;
16586
    uint32_t f_v2;
16587
    uint32_t f_v3;
16588
  } private_impl;
16589
16590
#ifdef __cplusplus
16591
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
16592
  using unique_ptr = std::unique_ptr<wuffs_xxhash32__hasher, wuffs_unique_ptr_deleter>;
16593
16594
  // On failure, the alloc_etc functions return nullptr. They don't throw.
16595
16596
  static inline unique_ptr
16597
  alloc() {
16598
    return unique_ptr(wuffs_xxhash32__hasher__alloc());
16599
  }
16600
16601
  static inline wuffs_base__hasher_u32::unique_ptr
16602
  alloc_as__wuffs_base__hasher_u32() {
16603
    return wuffs_base__hasher_u32::unique_ptr(
16604
        wuffs_xxhash32__hasher__alloc_as__wuffs_base__hasher_u32());
16605
  }
16606
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
16607
16608
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
16609
  // Disallow constructing or copying an object via standard C++ mechanisms,
16610
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
16611
  // size and field layout is not part of the public, stable, memory-safe API.
16612
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
16613
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
16614
  // their first argument) rather than tweaking bar.private_impl.qux fields.
16615
  //
16616
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
16617
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
16618
  // order to provide convenience methods. These forward on "this", so that you
16619
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
16620
  wuffs_xxhash32__hasher__struct() = delete;
16621
  wuffs_xxhash32__hasher__struct(const wuffs_xxhash32__hasher__struct&) = delete;
16622
  wuffs_xxhash32__hasher__struct& operator=(
16623
      const wuffs_xxhash32__hasher__struct&) = delete;
16624
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
16625
16626
#if !defined(WUFFS_IMPLEMENTATION)
16627
  // As above, the size of the struct is not part of the public API, and unless
16628
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
16629
  // allocated, not stack allocated. Its size is not intended to be known at
16630
  // compile time, but it is unfortunately divulged as a side effect of
16631
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
16632
  // instead of "sizeof T", invoking the operator. To make the two values
16633
  // different, so that passing the latter will be rejected by the initialize
16634
  // function, we add an arbitrary amount of dead weight.
16635
  uint8_t dead_weight[123000000];  // 123 MB.
16636
#endif  // !defined(WUFFS_IMPLEMENTATION)
16637
16638
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
16639
  initialize(
16640
      size_t sizeof_star_self,
16641
      uint64_t wuffs_version,
16642
      uint32_t options) {
16643
    return wuffs_xxhash32__hasher__initialize(
16644
        this, sizeof_star_self, wuffs_version, options);
16645
  }
16646
16647
  inline wuffs_base__hasher_u32*
16648
  upcast_as__wuffs_base__hasher_u32() {
16649
    return (wuffs_base__hasher_u32*)this;
16650
  }
16651
16652
  inline uint64_t
16653
  get_quirk(
16654
      uint32_t a_key) const {
16655
    return wuffs_xxhash32__hasher__get_quirk(this, a_key);
16656
  }
16657
16658
  inline wuffs_base__status
16659
  set_quirk(
16660
      uint32_t a_key,
16661
      uint64_t a_value) {
16662
    return wuffs_xxhash32__hasher__set_quirk(this, a_key, a_value);
16663
  }
16664
16665
  inline wuffs_base__empty_struct
16666
  update(
16667
      wuffs_base__slice_u8 a_x) {
16668
    return wuffs_xxhash32__hasher__update(this, a_x);
16669
  }
16670
16671
  inline uint32_t
16672
  update_u32(
16673
      wuffs_base__slice_u8 a_x) {
16674
    return wuffs_xxhash32__hasher__update_u32(this, a_x);
16675
  }
16676
16677
  inline uint32_t
16678
  checksum_u32() const {
16679
    return wuffs_xxhash32__hasher__checksum_u32(this);
16680
  }
16681
16682
#endif  // __cplusplus
16683
};  // struct wuffs_xxhash32__hasher__struct
16684
16685
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
16686
16687
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH32) || defined(WUFFS_NONMONOLITHIC)
16688
16689
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH64) || defined(WUFFS_NONMONOLITHIC)
16690
16691
// ---------------- Status Codes
16692
16693
// ---------------- Public Consts
16694
16695
// ---------------- Struct Declarations
16696
16697
typedef struct wuffs_xxhash64__hasher__struct wuffs_xxhash64__hasher;
16698
16699
#ifdef __cplusplus
16700
extern "C" {
16701
#endif
16702
16703
// ---------------- Public Initializer Prototypes
16704
16705
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
16706
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
16707
//
16708
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
16709
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
16710
16711
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
16712
wuffs_xxhash64__hasher__initialize(
16713
    wuffs_xxhash64__hasher* self,
16714
    size_t sizeof_star_self,
16715
    uint64_t wuffs_version,
16716
    uint32_t options);
16717
16718
size_t
16719
sizeof__wuffs_xxhash64__hasher(void);
16720
16721
// ---------------- Allocs
16722
16723
// These functions allocate and initialize Wuffs structs. They return NULL if
16724
// memory allocation fails. If they return non-NULL, there is no need to call
16725
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
16726
// calling free on the returned pointer. That pointer is effectively a C++
16727
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
16728
16729
wuffs_xxhash64__hasher*
16730
wuffs_xxhash64__hasher__alloc(void);
16731
16732
static inline wuffs_base__hasher_u64*
16733
wuffs_xxhash64__hasher__alloc_as__wuffs_base__hasher_u64(void) {
16734
  return (wuffs_base__hasher_u64*)(wuffs_xxhash64__hasher__alloc());
16735
}
16736
16737
// ---------------- Upcasts
16738
16739
static inline wuffs_base__hasher_u64*
16740
wuffs_xxhash64__hasher__upcast_as__wuffs_base__hasher_u64(
16741
    wuffs_xxhash64__hasher* p) {
16742
  return (wuffs_base__hasher_u64*)p;
16743
}
16744
16745
// ---------------- Public Function Prototypes
16746
16747
WUFFS_BASE__GENERATED_C_CODE
16748
WUFFS_BASE__MAYBE_STATIC uint64_t
16749
wuffs_xxhash64__hasher__get_quirk(
16750
    const wuffs_xxhash64__hasher* self,
16751
    uint32_t a_key);
16752
16753
WUFFS_BASE__GENERATED_C_CODE
16754
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
16755
wuffs_xxhash64__hasher__set_quirk(
16756
    wuffs_xxhash64__hasher* self,
16757
    uint32_t a_key,
16758
    uint64_t a_value);
16759
16760
WUFFS_BASE__GENERATED_C_CODE
16761
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
16762
wuffs_xxhash64__hasher__update(
16763
    wuffs_xxhash64__hasher* self,
16764
    wuffs_base__slice_u8 a_x);
16765
16766
WUFFS_BASE__GENERATED_C_CODE
16767
WUFFS_BASE__MAYBE_STATIC uint64_t
16768
wuffs_xxhash64__hasher__update_u64(
16769
    wuffs_xxhash64__hasher* self,
16770
    wuffs_base__slice_u8 a_x);
16771
16772
WUFFS_BASE__GENERATED_C_CODE
16773
WUFFS_BASE__MAYBE_STATIC uint64_t
16774
wuffs_xxhash64__hasher__checksum_u64(
16775
    const wuffs_xxhash64__hasher* self);
16776
16777
#ifdef __cplusplus
16778
}  // extern "C"
16779
#endif
16780
16781
// ---------------- Struct Definitions
16782
16783
// These structs' fields, and the sizeof them, are private implementation
16784
// details that aren't guaranteed to be stable across Wuffs versions.
16785
//
16786
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
16787
16788
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
16789
16790
struct wuffs_xxhash64__hasher__struct {
16791
  // Do not access the private_impl's or private_data's fields directly. There
16792
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
16793
  // the wuffs_foo__bar__baz functions.
16794
  //
16795
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
16796
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
16797
16798
  struct {
16799
    uint32_t magic;
16800
    uint32_t active_coroutine;
16801
    wuffs_base__vtable vtable_for__wuffs_base__hasher_u64;
16802
    wuffs_base__vtable null_vtable;
16803
16804
    uint64_t f_length_modulo_u64;
16805
    bool f_length_overflows_u64;
16806
    uint8_t f_padding0;
16807
    uint8_t f_padding1;
16808
    uint8_t f_padding2;
16809
    uint32_t f_buf_len;
16810
    uint8_t f_buf_data[32];
16811
    uint64_t f_v0;
16812
    uint64_t f_v1;
16813
    uint64_t f_v2;
16814
    uint64_t f_v3;
16815
  } private_impl;
16816
16817
#ifdef __cplusplus
16818
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
16819
  using unique_ptr = std::unique_ptr<wuffs_xxhash64__hasher, wuffs_unique_ptr_deleter>;
16820
16821
  // On failure, the alloc_etc functions return nullptr. They don't throw.
16822
16823
  static inline unique_ptr
16824
  alloc() {
16825
    return unique_ptr(wuffs_xxhash64__hasher__alloc());
16826
  }
16827
16828
  static inline wuffs_base__hasher_u64::unique_ptr
16829
  alloc_as__wuffs_base__hasher_u64() {
16830
    return wuffs_base__hasher_u64::unique_ptr(
16831
        wuffs_xxhash64__hasher__alloc_as__wuffs_base__hasher_u64());
16832
  }
16833
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
16834
16835
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
16836
  // Disallow constructing or copying an object via standard C++ mechanisms,
16837
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
16838
  // size and field layout is not part of the public, stable, memory-safe API.
16839
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
16840
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
16841
  // their first argument) rather than tweaking bar.private_impl.qux fields.
16842
  //
16843
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
16844
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
16845
  // order to provide convenience methods. These forward on "this", so that you
16846
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
16847
  wuffs_xxhash64__hasher__struct() = delete;
16848
  wuffs_xxhash64__hasher__struct(const wuffs_xxhash64__hasher__struct&) = delete;
16849
  wuffs_xxhash64__hasher__struct& operator=(
16850
      const wuffs_xxhash64__hasher__struct&) = delete;
16851
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
16852
16853
#if !defined(WUFFS_IMPLEMENTATION)
16854
  // As above, the size of the struct is not part of the public API, and unless
16855
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
16856
  // allocated, not stack allocated. Its size is not intended to be known at
16857
  // compile time, but it is unfortunately divulged as a side effect of
16858
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
16859
  // instead of "sizeof T", invoking the operator. To make the two values
16860
  // different, so that passing the latter will be rejected by the initialize
16861
  // function, we add an arbitrary amount of dead weight.
16862
  uint8_t dead_weight[123000000];  // 123 MB.
16863
#endif  // !defined(WUFFS_IMPLEMENTATION)
16864
16865
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
16866
  initialize(
16867
      size_t sizeof_star_self,
16868
      uint64_t wuffs_version,
16869
      uint32_t options) {
16870
    return wuffs_xxhash64__hasher__initialize(
16871
        this, sizeof_star_self, wuffs_version, options);
16872
  }
16873
16874
  inline wuffs_base__hasher_u64*
16875
  upcast_as__wuffs_base__hasher_u64() {
16876
    return (wuffs_base__hasher_u64*)this;
16877
  }
16878
16879
  inline uint64_t
16880
  get_quirk(
16881
      uint32_t a_key) const {
16882
    return wuffs_xxhash64__hasher__get_quirk(this, a_key);
16883
  }
16884
16885
  inline wuffs_base__status
16886
  set_quirk(
16887
      uint32_t a_key,
16888
      uint64_t a_value) {
16889
    return wuffs_xxhash64__hasher__set_quirk(this, a_key, a_value);
16890
  }
16891
16892
  inline wuffs_base__empty_struct
16893
  update(
16894
      wuffs_base__slice_u8 a_x) {
16895
    return wuffs_xxhash64__hasher__update(this, a_x);
16896
  }
16897
16898
  inline uint64_t
16899
  update_u64(
16900
      wuffs_base__slice_u8 a_x) {
16901
    return wuffs_xxhash64__hasher__update_u64(this, a_x);
16902
  }
16903
16904
  inline uint64_t
16905
  checksum_u64() const {
16906
    return wuffs_xxhash64__hasher__checksum_u64(this);
16907
  }
16908
16909
#endif  // __cplusplus
16910
};  // struct wuffs_xxhash64__hasher__struct
16911
16912
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
16913
16914
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH64) || defined(WUFFS_NONMONOLITHIC)
16915
16916
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XZ) || defined(WUFFS_NONMONOLITHIC)
16917
16918
// ---------------- Status Codes
16919
16920
extern const char wuffs_xz__error__bad_bcj_offset[];
16921
extern const char wuffs_xz__error__bad_block_header[];
16922
extern const char wuffs_xz__error__bad_checksum[];
16923
extern const char wuffs_xz__error__bad_filter[];
16924
extern const char wuffs_xz__error__bad_footer[];
16925
extern const char wuffs_xz__error__bad_header[];
16926
extern const char wuffs_xz__error__bad_header_concatenated_stream[];
16927
extern const char wuffs_xz__error__bad_index[];
16928
extern const char wuffs_xz__error__bad_padding[];
16929
extern const char wuffs_xz__error__truncated_input[];
16930
extern const char wuffs_xz__error__unsupported_checksum_algorithm[];
16931
extern const char wuffs_xz__error__unsupported_filter[];
16932
extern const char wuffs_xz__error__unsupported_filter_combination[];
16933
16934
// ---------------- Public Consts
16935
16936
#define WUFFS_XZ__QUIRK_DECODE_STANDALONE_CONCATENATED_STREAMS 1963655168u
16937
16938
#define WUFFS_XZ__DECODER_DST_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0u
16939
16940
#define WUFFS_XZ__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 4294967568u
16941
16942
// ---------------- Struct Declarations
16943
16944
typedef struct wuffs_xz__decoder__struct wuffs_xz__decoder;
16945
16946
#ifdef __cplusplus
16947
extern "C" {
16948
#endif
16949
16950
// ---------------- Public Initializer Prototypes
16951
16952
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
16953
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
16954
//
16955
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
16956
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
16957
16958
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
16959
wuffs_xz__decoder__initialize(
16960
    wuffs_xz__decoder* self,
16961
    size_t sizeof_star_self,
16962
    uint64_t wuffs_version,
16963
    uint32_t options);
16964
16965
size_t
16966
sizeof__wuffs_xz__decoder(void);
16967
16968
// ---------------- Allocs
16969
16970
// These functions allocate and initialize Wuffs structs. They return NULL if
16971
// memory allocation fails. If they return non-NULL, there is no need to call
16972
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
16973
// calling free on the returned pointer. That pointer is effectively a C++
16974
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
16975
16976
wuffs_xz__decoder*
16977
wuffs_xz__decoder__alloc(void);
16978
16979
static inline wuffs_base__io_transformer*
16980
wuffs_xz__decoder__alloc_as__wuffs_base__io_transformer(void) {
16981
  return (wuffs_base__io_transformer*)(wuffs_xz__decoder__alloc());
16982
}
16983
16984
// ---------------- Upcasts
16985
16986
static inline wuffs_base__io_transformer*
16987
wuffs_xz__decoder__upcast_as__wuffs_base__io_transformer(
16988
    wuffs_xz__decoder* p) {
16989
  return (wuffs_base__io_transformer*)p;
16990
}
16991
16992
// ---------------- Public Function Prototypes
16993
16994
WUFFS_BASE__GENERATED_C_CODE
16995
WUFFS_BASE__MAYBE_STATIC uint64_t
16996
wuffs_xz__decoder__get_quirk(
16997
    const wuffs_xz__decoder* self,
16998
    uint32_t a_key);
16999
17000
WUFFS_BASE__GENERATED_C_CODE
17001
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
17002
wuffs_xz__decoder__set_quirk(
17003
    wuffs_xz__decoder* self,
17004
    uint32_t a_key,
17005
    uint64_t a_value);
17006
17007
WUFFS_BASE__GENERATED_C_CODE
17008
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
17009
wuffs_xz__decoder__dst_history_retain_length(
17010
    const wuffs_xz__decoder* self);
17011
17012
WUFFS_BASE__GENERATED_C_CODE
17013
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
17014
wuffs_xz__decoder__workbuf_len(
17015
    const wuffs_xz__decoder* self);
17016
17017
WUFFS_BASE__GENERATED_C_CODE
17018
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
17019
wuffs_xz__decoder__transform_io(
17020
    wuffs_xz__decoder* self,
17021
    wuffs_base__io_buffer* a_dst,
17022
    wuffs_base__io_buffer* a_src,
17023
    wuffs_base__slice_u8 a_workbuf);
17024
17025
#ifdef __cplusplus
17026
}  // extern "C"
17027
#endif
17028
17029
// ---------------- Struct Definitions
17030
17031
// These structs' fields, and the sizeof them, are private implementation
17032
// details that aren't guaranteed to be stable across Wuffs versions.
17033
//
17034
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
17035
17036
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
17037
17038
struct wuffs_xz__decoder__struct {
17039
  // Do not access the private_impl's or private_data's fields directly. There
17040
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
17041
  // the wuffs_foo__bar__baz functions.
17042
  //
17043
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
17044
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
17045
17046
  struct {
17047
    uint32_t magic;
17048
    uint32_t active_coroutine;
17049
    wuffs_base__vtable vtable_for__wuffs_base__io_transformer;
17050
    wuffs_base__vtable null_vtable;
17051
17052
    uint32_t f_filters[3];
17053
    uint32_t f_num_non_final_filters;
17054
    uint8_t f_checksummer;
17055
    bool f_ignore_checksum;
17056
    bool f_standalone_format;
17057
    bool f_lzma_needs_reset;
17058
    bool f_block_has_compressed_size;
17059
    bool f_block_has_uncompressed_size;
17060
    uint8_t f_bcj_undo_index;
17061
    uint32_t f_bcj_pos;
17062
    uint32_t f_bcj_x86_prev_mask;
17063
    uint64_t f_block_compressed_size;
17064
    uint64_t f_block_uncompressed_size;
17065
    uint64_t f_compressed_size_for_index;
17066
    uint32_t f_verification_have_hashed_sizes[2];
17067
    uint32_t f_verification_want_hashed_sizes[2];
17068
    uint64_t f_verification_have_total_sizes[2];
17069
    uint64_t f_verification_want_total_sizes[2];
17070
    uint64_t f_num_actual_blocks;
17071
    uint64_t f_num_index_blocks;
17072
    uint64_t f_index_block_compressed_size;
17073
    uint64_t f_index_block_uncompressed_size;
17074
    uint64_t f_backwards_size;
17075
    bool f_started_verify_index;
17076
    uint16_t f_flags;
17077
17078
    uint8_t (*choosy_apply_non_final_filters)(
17079
        wuffs_xz__decoder* self,
17080
        wuffs_base__slice_u8 a_dst_slice);
17081
    uint32_t p_transform_io;
17082
    uint32_t p_do_transform_io;
17083
    uint32_t p_decode_block_header_with_padding;
17084
    uint32_t p_decode_block_header_sans_padding;
17085
    uint32_t p_verify_index;
17086
    uint32_t p_verify_footer;
17087
  } private_impl;
17088
17089
  struct {
17090
    uint8_t f_filter_data[3][256];
17091
    wuffs_crc32__ieee_hasher f_crc32;
17092
    wuffs_crc64__ecma_hasher f_crc64;
17093
    wuffs_sha256__hasher f_sha256;
17094
    wuffs_lzma__decoder f_lzma;
17095
17096
    struct {
17097
      uint32_t v_checksum32_have;
17098
      uint32_t v_checksum32_want;
17099
      wuffs_base__bitvec256 v_checksum256_have;
17100
      uint64_t v_compressed_size;
17101
      uint64_t v_uncompressed_size;
17102
      uint64_t scratch;
17103
    } s_do_transform_io;
17104
    struct {
17105
      uint64_t v_padded_size_have;
17106
      uint64_t v_padded_size_want;
17107
    } s_decode_block_header_with_padding;
17108
    struct {
17109
      uint8_t v_flags;
17110
      uint8_t v_filter_id;
17111
      uint32_t v_shift;
17112
      uint32_t v_f;
17113
      uint64_t scratch;
17114
    } s_decode_block_header_sans_padding;
17115
    struct {
17116
      uint32_t v_shift;
17117
    } s_verify_index;
17118
    struct {
17119
      uint64_t scratch;
17120
    } s_verify_footer;
17121
  } private_data;
17122
17123
#ifdef __cplusplus
17124
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
17125
  using unique_ptr = std::unique_ptr<wuffs_xz__decoder, wuffs_unique_ptr_deleter>;
17126
17127
  // On failure, the alloc_etc functions return nullptr. They don't throw.
17128
17129
  static inline unique_ptr
17130
  alloc() {
17131
    return unique_ptr(wuffs_xz__decoder__alloc());
17132
  }
17133
17134
  static inline wuffs_base__io_transformer::unique_ptr
17135
  alloc_as__wuffs_base__io_transformer() {
17136
    return wuffs_base__io_transformer::unique_ptr(
17137
        wuffs_xz__decoder__alloc_as__wuffs_base__io_transformer());
17138
  }
17139
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
17140
17141
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
17142
  // Disallow constructing or copying an object via standard C++ mechanisms,
17143
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
17144
  // size and field layout is not part of the public, stable, memory-safe API.
17145
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
17146
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
17147
  // their first argument) rather than tweaking bar.private_impl.qux fields.
17148
  //
17149
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
17150
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
17151
  // order to provide convenience methods. These forward on "this", so that you
17152
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
17153
  wuffs_xz__decoder__struct() = delete;
17154
  wuffs_xz__decoder__struct(const wuffs_xz__decoder__struct&) = delete;
17155
  wuffs_xz__decoder__struct& operator=(
17156
      const wuffs_xz__decoder__struct&) = delete;
17157
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
17158
17159
#if !defined(WUFFS_IMPLEMENTATION)
17160
  // As above, the size of the struct is not part of the public API, and unless
17161
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
17162
  // allocated, not stack allocated. Its size is not intended to be known at
17163
  // compile time, but it is unfortunately divulged as a side effect of
17164
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
17165
  // instead of "sizeof T", invoking the operator. To make the two values
17166
  // different, so that passing the latter will be rejected by the initialize
17167
  // function, we add an arbitrary amount of dead weight.
17168
  uint8_t dead_weight[123000000];  // 123 MB.
17169
#endif  // !defined(WUFFS_IMPLEMENTATION)
17170
17171
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
17172
  initialize(
17173
      size_t sizeof_star_self,
17174
      uint64_t wuffs_version,
17175
      uint32_t options) {
17176
    return wuffs_xz__decoder__initialize(
17177
        this, sizeof_star_self, wuffs_version, options);
17178
  }
17179
17180
  inline wuffs_base__io_transformer*
17181
  upcast_as__wuffs_base__io_transformer() {
17182
    return (wuffs_base__io_transformer*)this;
17183
  }
17184
17185
  inline uint64_t
17186
  get_quirk(
17187
      uint32_t a_key) const {
17188
    return wuffs_xz__decoder__get_quirk(this, a_key);
17189
  }
17190
17191
  inline wuffs_base__status
17192
  set_quirk(
17193
      uint32_t a_key,
17194
      uint64_t a_value) {
17195
    return wuffs_xz__decoder__set_quirk(this, a_key, a_value);
17196
  }
17197
17198
  inline wuffs_base__optional_u63
17199
  dst_history_retain_length() const {
17200
    return wuffs_xz__decoder__dst_history_retain_length(this);
17201
  }
17202
17203
  inline wuffs_base__range_ii_u64
17204
  workbuf_len() const {
17205
    return wuffs_xz__decoder__workbuf_len(this);
17206
  }
17207
17208
  inline wuffs_base__status
17209
  transform_io(
17210
      wuffs_base__io_buffer* a_dst,
17211
      wuffs_base__io_buffer* a_src,
17212
      wuffs_base__slice_u8 a_workbuf) {
17213
    return wuffs_xz__decoder__transform_io(this, a_dst, a_src, a_workbuf);
17214
  }
17215
17216
#endif  // __cplusplus
17217
};  // struct wuffs_xz__decoder__struct
17218
17219
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
17220
17221
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XZ) || defined(WUFFS_NONMONOLITHIC)
17222
17223
#if defined(__cplusplus) && defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
17224
17225
// ---------------- Auxiliary - Base
17226
17227
// Auxiliary code is discussed at
17228
// https://github.com/google/wuffs/blob/main/doc/note/auxiliary-code.md
17229
17230
#include <stdio.h>
17231
17232
#include <string>
17233
#include <utility>
17234
17235
namespace wuffs_aux {
17236
17237
using IOBuffer = wuffs_base__io_buffer;
17238
17239
// MemOwner represents ownership of some memory. Dynamically allocated memory
17240
// (e.g. from malloc or new) is typically paired with free or delete, invoked
17241
// when the std::unique_ptr is destroyed. Statically allocated memory might use
17242
// MemOwner(nullptr, &free), even if that statically allocated memory is not
17243
// nullptr, since calling free(nullptr) is a no-op.
17244
using MemOwner = std::unique_ptr<void, decltype(&free)>;
17245
17246
using QuirkKeyValuePair = std::pair<uint32_t, uint64_t>;
17247
17248
namespace sync_io {
17249
17250
// --------
17251
17252
// DynIOBuffer is an IOBuffer that is backed by a dynamically sized byte array.
17253
// It owns that backing array and will free it in its destructor.
17254
//
17255
// The array size can be explicitly extended (by calling the grow method) but,
17256
// unlike a C++ std::vector, there is no implicit extension (e.g. by calling
17257
// std::vector::insert) and its maximum size is capped by the max_incl
17258
// constructor argument.
17259
//
17260
// It contains an IOBuffer-typed field whose reader side provides access to
17261
// previously written bytes and whose writer side provides access to the
17262
// allocated but not-yet-written-to slack space. For Go programmers, this slack
17263
// space is roughly analogous to the s[len(s):cap(s)] space of a slice s.
17264
class DynIOBuffer {
17265
 public:
17266
  enum GrowResult {
17267
    OK = 0,
17268
    FailedMaxInclExceeded = 1,
17269
    FailedOutOfMemory = 2,
17270
  };
17271
17272
  // m_buf holds the dynamically sized byte array and its read/write indexes:
17273
  //  - m_buf.meta.wi  is roughly analogous to a Go slice's length.
17274
  //  - m_buf.data.len is roughly analogous to a Go slice's capacity. It is
17275
  //    also equal to the m_buf.data.ptr malloc/realloc size.
17276
  //
17277
  // Users should not modify the m_buf.data.ptr or m_buf.data.len fields (as
17278
  // they are conceptually private to this class), but they can modify the
17279
  // bytes referenced by that pointer-length pair (e.g. compactions).
17280
  IOBuffer m_buf;
17281
17282
  // m_max_incl is an inclusive upper bound on the backing array size.
17283
  const uint64_t m_max_incl;
17284
17285
  // Constructor and destructor.
17286
  explicit DynIOBuffer(uint64_t max_incl);
17287
  ~DynIOBuffer();
17288
17289
  // Drop frees the byte array and resets m_buf. The DynIOBuffer can still be
17290
  // used after a drop call. It just restarts from zero.
17291
  void drop();
17292
17293
  // grow ensures that the byte array size is at least min_incl and at most
17294
  // max_incl. It returns FailedMaxInclExceeded if that would require
17295
  // allocating more than max_incl bytes, including the case where (min_incl >
17296
  // max_incl). It returns FailedOutOfMemory if memory allocation failed.
17297
  GrowResult grow(uint64_t min_incl);
17298
17299
 private:
17300
  // Delete the copy and assign constructors.
17301
  DynIOBuffer(const DynIOBuffer&) = delete;
17302
  DynIOBuffer& operator=(const DynIOBuffer&) = delete;
17303
17304
  static uint64_t round_up(uint64_t min_incl, uint64_t max_incl);
17305
};
17306
17307
// --------
17308
17309
class Input {
17310
 public:
17311
  virtual ~Input();
17312
17313
  virtual IOBuffer* BringsItsOwnIOBuffer();
17314
  virtual std::string CopyIn(IOBuffer* dst) = 0;
17315
};
17316
17317
// --------
17318
17319
// FileInput is an Input that reads from a file source.
17320
//
17321
// It does not take responsibility for closing the file when done.
17322
class FileInput : public Input {
17323
 public:
17324
  FileInput(FILE* f);
17325
17326
  virtual std::string CopyIn(IOBuffer* dst);
17327
17328
 private:
17329
  FILE* m_f;
17330
17331
  // Delete the copy and assign constructors.
17332
  FileInput(const FileInput&) = delete;
17333
  FileInput& operator=(const FileInput&) = delete;
17334
};
17335
17336
// --------
17337
17338
// MemoryInput is an Input that reads from an in-memory source.
17339
//
17340
// It does not take responsibility for freeing the memory when done.
17341
class MemoryInput : public Input {
17342
 public:
17343
  MemoryInput(const char* ptr, size_t len);
17344
  MemoryInput(const uint8_t* ptr, size_t len);
17345
17346
  virtual IOBuffer* BringsItsOwnIOBuffer();
17347
  virtual std::string CopyIn(IOBuffer* dst);
17348
17349
 private:
17350
  IOBuffer m_io;
17351
17352
  // Delete the copy and assign constructors.
17353
  MemoryInput(const MemoryInput&) = delete;
17354
  MemoryInput& operator=(const MemoryInput&) = delete;
17355
};
17356
17357
// --------
17358
17359
}  // namespace sync_io
17360
17361
}  // namespace wuffs_aux
17362
17363
// ---------------- Auxiliary - CBOR
17364
17365
namespace wuffs_aux {
17366
17367
struct DecodeCborResult {
17368
  DecodeCborResult(std::string&& error_message0, uint64_t cursor_position0);
17369
17370
  std::string error_message;
17371
  uint64_t cursor_position;
17372
};
17373
17374
class DecodeCborCallbacks {
17375
 public:
17376
  virtual ~DecodeCborCallbacks();
17377
17378
  // AppendXxx are called for leaf nodes: literals, numbers, strings, etc.
17379
17380
  virtual std::string AppendNull() = 0;
17381
  virtual std::string AppendUndefined() = 0;
17382
  virtual std::string AppendBool(bool val) = 0;
17383
  virtual std::string AppendF64(double val) = 0;
17384
  virtual std::string AppendI64(int64_t val) = 0;
17385
  virtual std::string AppendU64(uint64_t val) = 0;
17386
  virtual std::string AppendByteString(std::string&& val) = 0;
17387
  virtual std::string AppendTextString(std::string&& val) = 0;
17388
  virtual std::string AppendMinus1MinusX(uint64_t val) = 0;
17389
  virtual std::string AppendCborSimpleValue(uint8_t val) = 0;
17390
  virtual std::string AppendCborTag(uint64_t val) = 0;
17391
17392
  // Push and Pop are called for container nodes: CBOR arrays (lists) and CBOR
17393
  // maps (dictionaries).
17394
  //
17395
  // The flags bits combine exactly one of:
17396
  //  - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_NONE
17397
  //  - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_LIST
17398
  //  - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_DICT
17399
  // and exactly one of:
17400
  //  - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_NONE
17401
  //  - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_LIST
17402
  //  - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_DICT
17403
17404
  virtual std::string Push(uint32_t flags) = 0;
17405
  virtual std::string Pop(uint32_t flags) = 0;
17406
17407
  // Done is always the last Callback method called by DecodeCbor, whether or
17408
  // not parsing the input as CBOR encountered an error. Even when successful,
17409
  // trailing data may remain in input and buffer.
17410
  //
17411
  // Do not keep a reference to buffer or buffer.data.ptr after Done returns,
17412
  // as DecodeCbor may then de-allocate the backing array.
17413
  //
17414
  // The default Done implementation is a no-op.
17415
  virtual void  //
17416
  Done(DecodeCborResult& result, sync_io::Input& input, IOBuffer& buffer);
17417
};
17418
17419
// The FooArgBar types add structure to Foo's optional arguments. They wrap
17420
// inner representations for several reasons:
17421
//  - It provides a home for the DefaultValue static method, for Foo callers
17422
//    that want to override some but not all optional arguments.
17423
//  - It provides the "Bar" name at Foo call sites, which can help self-
17424
//    document Foo calls with many arguemnts.
17425
//  - It provides some type safety against accidentally transposing or omitting
17426
//    adjacent fundamentally-numeric-typed optional arguments.
17427
17428
// DecodeCborArgQuirks wraps an optional argument to DecodeCbor.
17429
struct DecodeCborArgQuirks {
17430
  explicit DecodeCborArgQuirks(const QuirkKeyValuePair* ptr0,
17431
                               const size_t len0);
17432
17433
  // DefaultValue returns an empty slice.
17434
  static DecodeCborArgQuirks DefaultValue();
17435
17436
  const QuirkKeyValuePair* ptr;
17437
  const size_t len;
17438
};
17439
17440
// DecodeCbor calls callbacks based on the CBOR-formatted data in input.
17441
//
17442
// On success, the returned error_message is empty and cursor_position counts
17443
// the number of bytes consumed. On failure, error_message is non-empty and
17444
// cursor_position is the location of the error. That error may be a content
17445
// error (invalid CBOR) or an input error (e.g. network failure).
17446
DecodeCborResult  //
17447
DecodeCbor(DecodeCborCallbacks& callbacks,
17448
           sync_io::Input& input,
17449
           DecodeCborArgQuirks quirks = DecodeCborArgQuirks::DefaultValue());
17450
17451
}  // namespace wuffs_aux
17452
17453
// ---------------- Auxiliary - Image
17454
17455
namespace wuffs_aux {
17456
17457
struct DecodeImageResult {
17458
  DecodeImageResult(MemOwner&& pixbuf_mem_owner0,
17459
                    wuffs_base__pixel_buffer pixbuf0,
17460
                    std::string&& error_message0);
17461
  DecodeImageResult(std::string&& error_message0);
17462
17463
  MemOwner pixbuf_mem_owner;
17464
  wuffs_base__pixel_buffer pixbuf;
17465
  std::string error_message;
17466
};
17467
17468
// DecodeImageCallbacks are the callbacks given to DecodeImage. They are always
17469
// called in this order:
17470
//  1. SelectDecoder
17471
//  2. HandleMetadata
17472
//  3. SelectPixfmt
17473
//  4. AllocPixbuf
17474
//  5. AllocWorkbuf
17475
//  6. Done
17476
//
17477
// It may return early - the third callback might not be invoked if the second
17478
// one fails - but the final callback (Done) is always invoked.
17479
class DecodeImageCallbacks {
17480
 public:
17481
  // AllocPixbufResult holds a memory allocation (the result of malloc or new,
17482
  // a statically allocated pointer, etc), or an error message. The memory is
17483
  // de-allocated when mem_owner goes out of scope and is destroyed.
17484
  struct AllocPixbufResult {
17485
    AllocPixbufResult(MemOwner&& mem_owner0, wuffs_base__pixel_buffer pixbuf0);
17486
    AllocPixbufResult(std::string&& error_message0);
17487
17488
    MemOwner mem_owner;
17489
    wuffs_base__pixel_buffer pixbuf;
17490
    std::string error_message;
17491
  };
17492
17493
  // AllocWorkbufResult holds a memory allocation (the result of malloc or new,
17494
  // a statically allocated pointer, etc), or an error message. The memory is
17495
  // de-allocated when mem_owner goes out of scope and is destroyed.
17496
  struct AllocWorkbufResult {
17497
    AllocWorkbufResult(MemOwner&& mem_owner0, wuffs_base__slice_u8 workbuf0);
17498
    AllocWorkbufResult(std::string&& error_message0);
17499
17500
    MemOwner mem_owner;
17501
    wuffs_base__slice_u8 workbuf;
17502
    std::string error_message;
17503
  };
17504
17505
  virtual ~DecodeImageCallbacks();
17506
17507
  // SelectDecoder returns the image decoder for the input data's file format.
17508
  // Returning a nullptr means failure (DecodeImage_UnsupportedImageFormat).
17509
  //
17510
  // Common formats will have a FourCC value in the range [1 ..= 0x7FFF_FFFF],
17511
  // such as WUFFS_BASE__FOURCC__JPEG. A zero FourCC value means that Wuffs'
17512
  // standard library did not recognize the image format but if SelectDecoder
17513
  // was overridden, it may examine the input data's starting bytes and still
17514
  // provide its own image decoder, e.g. for an exotic image file format that's
17515
  // not in Wuffs' standard library. The prefix_etc fields have the same
17516
  // meaning as wuffs_base__magic_number_guess_fourcc arguments. SelectDecoder
17517
  // implementations should not modify prefix_data's contents.
17518
  //
17519
  // SelectDecoder might be called more than once, since some image file
17520
  // formats can wrap others. For example, a nominal BMP file can actually
17521
  // contain a JPEG or a PNG.
17522
  //
17523
  // The default SelectDecoder accepts the FOURCC codes listed below. For
17524
  // modular builds (i.e. when #define'ing WUFFS_CONFIG__MODULES), acceptance
17525
  // of the FOO file format is optional (for each value of FOO) and depends on
17526
  // the corresponding module to be enabled at compile time (i.e. #define'ing
17527
  // WUFFS_CONFIG__MODULE__FOO).
17528
  //
17529
  //  - WUFFS_BASE__FOURCC__BMP
17530
  //  - WUFFS_BASE__FOURCC__ETC2
17531
  //  - WUFFS_BASE__FOURCC__GIF
17532
  //  - WUFFS_BASE__FOURCC__HNSM
17533
  //  - WUFFS_BASE__FOURCC__JPEG
17534
  //  - WUFFS_BASE__FOURCC__NIE
17535
  //  - WUFFS_BASE__FOURCC__NPBM
17536
  //  - WUFFS_BASE__FOURCC__PNG
17537
  //  - WUFFS_BASE__FOURCC__QOI
17538
  //  - WUFFS_BASE__FOURCC__TGA
17539
  //  - WUFFS_BASE__FOURCC__TH
17540
  //  - WUFFS_BASE__FOURCC__WBMP
17541
  //  - WUFFS_BASE__FOURCC__WEBP
17542
  //
17543
  // The FOOBAR in WUFFS_BASE__FOURCC__FOBA is limited to four characters, but
17544
  // the FOOBAR in the corresponding WUFFS_CONFIG__MODULE__FOOBAR macro might
17545
  // be fuller and longer. For example, NPBM / NETPBM or TH / THUMBHASH.
17546
  virtual wuffs_base__image_decoder::unique_ptr  //
17547
  SelectDecoder(uint32_t fourcc,
17548
                wuffs_base__slice_u8 prefix_data,
17549
                bool prefix_closed);
17550
17551
  // HandleMetadata acknowledges image metadata. minfo.flavor will be one of:
17552
  //  - WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA_RAW_PASSTHROUGH
17553
  //  - WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA_PARSED
17554
  // If it is METADATA_RAW_PASSTHROUGH then raw contains the metadata bytes.
17555
  // Those bytes should not be retained beyond the the HandleMetadata call.
17556
  //
17557
  // minfo.metadata__fourcc() will typically match one of the
17558
  // DecodeImageArgFlags bits. For example, if (REPORT_METADATA_CHRM |
17559
  // REPORT_METADATA_GAMA) was passed to DecodeImage then the metadata FourCC
17560
  // will be either WUFFS_BASE__FOURCC__CHRM or WUFFS_BASE__FOURCC__GAMA.
17561
  //
17562
  // It returns an error message, or an empty string on success.
17563
  virtual std::string  //
17564
  HandleMetadata(const wuffs_base__more_information& minfo,
17565
                 wuffs_base__slice_u8 raw);
17566
17567
  // SelectPixfmt returns the destination pixel format for AllocPixbuf. It
17568
  // should return wuffs_base__make_pixel_format(etc) called with one of:
17569
  //  - WUFFS_BASE__PIXEL_FORMAT__Y
17570
  //  - WUFFS_BASE__PIXEL_FORMAT__BGR_565
17571
  //  - WUFFS_BASE__PIXEL_FORMAT__BGR
17572
  //  - WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL
17573
  //  - WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE
17574
  //  - WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL
17575
  //  - WUFFS_BASE__PIXEL_FORMAT__RGB
17576
  //  - WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL
17577
  //  - WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL
17578
  // or return image_config.pixcfg.pixel_format(). The latter means to use the
17579
  // image file's natural pixel format. For example, GIF images' natural pixel
17580
  // format is an indexed one.
17581
  //
17582
  // Returning otherwise means failure (DecodeImage_UnsupportedPixelFormat).
17583
  //
17584
  // The default SelectPixfmt implementation returns
17585
  // wuffs_base__make_pixel_format(WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL) which
17586
  // is 4 bytes per pixel (8 bits per channel ร— 4 channels).
17587
  virtual wuffs_base__pixel_format  //
17588
  SelectPixfmt(const wuffs_base__image_config& image_config);
17589
17590
  // AllocPixbuf allocates the pixel buffer.
17591
  //
17592
  // allow_uninitialized_memory will be true if a valid background_color was
17593
  // passed to DecodeImage, since the pixel buffer's contents will be
17594
  // overwritten with that color after AllocPixbuf returns.
17595
  //
17596
  // The default AllocPixbuf implementation allocates either uninitialized or
17597
  // zeroed memory. Zeroed memory typically corresponds to filling with opaque
17598
  // black or transparent black, depending on the pixel format.
17599
  virtual AllocPixbufResult  //
17600
  AllocPixbuf(const wuffs_base__image_config& image_config,
17601
              bool allow_uninitialized_memory);
17602
17603
  // AllocWorkbuf allocates the work buffer. The allocated buffer's length
17604
  // should be at least len_range.min_incl, but larger allocations (up to
17605
  // len_range.max_incl) may have better performance (by using more memory).
17606
  //
17607
  // The default AllocWorkbuf implementation allocates len_range.max_incl bytes
17608
  // of either uninitialized or zeroed memory.
17609
  virtual AllocWorkbufResult  //
17610
  AllocWorkbuf(wuffs_base__range_ii_u64 len_range,
17611
               bool allow_uninitialized_memory);
17612
17613
  // Done is always the last Callback method called by DecodeImage, whether or
17614
  // not parsing the input encountered an error. Even when successful, trailing
17615
  // data may remain in input and buffer.
17616
  //
17617
  // The image_decoder is the one returned by SelectDecoder (if SelectDecoder
17618
  // was successful), or a no-op unique_ptr otherwise. Like any unique_ptr,
17619
  // ownership moves to the Done implementation.
17620
  //
17621
  // Do not keep a reference to buffer or buffer.data.ptr after Done returns,
17622
  // as DecodeImage may then de-allocate the backing array.
17623
  //
17624
  // The default Done implementation is a no-op, other than running the
17625
  // image_decoder unique_ptr destructor.
17626
  virtual void  //
17627
  Done(DecodeImageResult& result,
17628
       sync_io::Input& input,
17629
       IOBuffer& buffer,
17630
       wuffs_base__image_decoder::unique_ptr image_decoder);
17631
};
17632
17633
extern const char DecodeImage_BufferIsTooShort[];
17634
extern const char DecodeImage_MaxInclDimensionExceeded[];
17635
extern const char DecodeImage_MaxInclMetadataLengthExceeded[];
17636
extern const char DecodeImage_OutOfMemory[];
17637
extern const char DecodeImage_UnexpectedEndOfFile[];
17638
extern const char DecodeImage_UnsupportedImageFormat[];
17639
extern const char DecodeImage_UnsupportedMetadata[];
17640
extern const char DecodeImage_UnsupportedPixelBlend[];
17641
extern const char DecodeImage_UnsupportedPixelConfiguration[];
17642
extern const char DecodeImage_UnsupportedPixelFormat[];
17643
17644
// The FooArgBar types add structure to Foo's optional arguments. They wrap
17645
// inner representations for several reasons:
17646
//  - It provides a home for the DefaultValue static method, for Foo callers
17647
//    that want to override some but not all optional arguments.
17648
//  - It provides the "Bar" name at Foo call sites, which can help self-
17649
//    document Foo calls with many arguemnts.
17650
//  - It provides some type safety against accidentally transposing or omitting
17651
//    adjacent fundamentally-numeric-typed optional arguments.
17652
17653
// DecodeImageArgQuirks wraps an optional argument to DecodeImage.
17654
struct DecodeImageArgQuirks {
17655
  explicit DecodeImageArgQuirks(const QuirkKeyValuePair* ptr0,
17656
                                const size_t len0);
17657
17658
  // DefaultValue returns an empty slice.
17659
  static DecodeImageArgQuirks DefaultValue();
17660
17661
  const QuirkKeyValuePair* ptr;
17662
  const size_t len;
17663
};
17664
17665
// DecodeImageArgFlags wraps an optional argument to DecodeImage.
17666
struct DecodeImageArgFlags {
17667
  explicit DecodeImageArgFlags(uint64_t repr0);
17668
17669
  // DefaultValue returns 0.
17670
  static DecodeImageArgFlags DefaultValue();
17671
17672
  // TODO: support all of the REPORT_METADATA_FOO flags, not just CHRM, EXIF,
17673
  // GAMA, ICCP, KVP, SRGB and XMP.
17674
17675
  // Background Color.
17676
  static constexpr uint64_t REPORT_METADATA_BGCL = 0x0001;
17677
  // Primary Chromaticities and White Point.
17678
  static constexpr uint64_t REPORT_METADATA_CHRM = 0x0002;
17679
  // Exchangeable Image File Format.
17680
  static constexpr uint64_t REPORT_METADATA_EXIF = 0x0004;
17681
  // Gamma Correction.
17682
  static constexpr uint64_t REPORT_METADATA_GAMA = 0x0008;
17683
  // International Color Consortium Profile.
17684
  static constexpr uint64_t REPORT_METADATA_ICCP = 0x0010;
17685
  // Key-Value Pair.
17686
  //
17687
  // For PNG files, this includes iTXt, tEXt and zTXt chunks. In the
17688
  // HandleMetadata callback, the raw argument contains UTF-8 strings.
17689
  static constexpr uint64_t REPORT_METADATA_KVP = 0x0020;
17690
  // Modification Time.
17691
  static constexpr uint64_t REPORT_METADATA_MTIM = 0x0040;
17692
  // Offset (2-Dimensional).
17693
  static constexpr uint64_t REPORT_METADATA_OFS2 = 0x0080;
17694
  // Physical Dimensions.
17695
  static constexpr uint64_t REPORT_METADATA_PHYD = 0x0100;
17696
  // Standard Red Green Blue (Rendering Intent).
17697
  static constexpr uint64_t REPORT_METADATA_SRGB = 0x0200;
17698
  // Extensible Metadata Platform.
17699
  static constexpr uint64_t REPORT_METADATA_XMP = 0x0400;
17700
17701
  uint64_t repr;
17702
};
17703
17704
// DecodeImageArgPixelBlend wraps an optional argument to DecodeImage.
17705
struct DecodeImageArgPixelBlend {
17706
  explicit DecodeImageArgPixelBlend(wuffs_base__pixel_blend repr0);
17707
17708
  // DefaultValue returns WUFFS_BASE__PIXEL_BLEND__SRC.
17709
  static DecodeImageArgPixelBlend DefaultValue();
17710
17711
  wuffs_base__pixel_blend repr;
17712
};
17713
17714
// DecodeImageArgBackgroundColor wraps an optional argument to DecodeImage.
17715
struct DecodeImageArgBackgroundColor {
17716
  explicit DecodeImageArgBackgroundColor(
17717
      wuffs_base__color_u32_argb_premul repr0);
17718
17719
  // DefaultValue returns 1, an invalid wuffs_base__color_u32_argb_premul.
17720
  static DecodeImageArgBackgroundColor DefaultValue();
17721
17722
  wuffs_base__color_u32_argb_premul repr;
17723
};
17724
17725
// DecodeImageArgMaxInclDimension wraps an optional argument to DecodeImage.
17726
struct DecodeImageArgMaxInclDimension {
17727
  explicit DecodeImageArgMaxInclDimension(uint32_t repr0);
17728
17729
  // DefaultValue returns 1048575 = 0x000F_FFFF, more than 1 million pixels.
17730
  static DecodeImageArgMaxInclDimension DefaultValue();
17731
17732
  uint32_t repr;
17733
};
17734
17735
// DecodeImageArgMaxInclMetadataLength wraps an optional argument to
17736
// DecodeImage.
17737
struct DecodeImageArgMaxInclMetadataLength {
17738
  explicit DecodeImageArgMaxInclMetadataLength(uint64_t repr0);
17739
17740
  // DefaultValue returns 16777215 = 0x00FF_FFFF, one less than 16 MiB.
17741
  static DecodeImageArgMaxInclMetadataLength DefaultValue();
17742
17743
  uint64_t repr;
17744
};
17745
17746
// DecodeImage decodes the image data in input. A variety of image file formats
17747
// can be decoded, depending on what callbacks.SelectDecoder returns.
17748
//
17749
// For animated formats, only the first frame is returned, since the API is
17750
// simpler for synchronous I/O and having DecodeImage only return when
17751
// completely done, but rendering animation often involves handling other
17752
// events in between animation frames. To decode multiple frames of animated
17753
// images, or for asynchronous I/O (e.g. when decoding an image streamed over
17754
// the network), use Wuffs' lower level C API instead of its higher level,
17755
// simplified C++ API (the wuffs_aux API).
17756
//
17757
// The DecodeImageResult's fields depend on whether decoding succeeded:
17758
//  - On total success, the error_message is empty and pixbuf.pixcfg.is_valid()
17759
//    is true.
17760
//  - On partial success (e.g. the input file was truncated but we are still
17761
//    able to decode some of the pixels), error_message is non-empty but
17762
//    pixbuf.pixcfg.is_valid() is still true. It is up to the caller whether to
17763
//    accept or reject partial success.
17764
//  - On failure, the error_message is non_empty and pixbuf.pixcfg.is_valid()
17765
//    is false.
17766
//
17767
// The callbacks allocate the pixel buffer memory and work buffer memory. On
17768
// success, pixel buffer memory ownership is passed to the DecodeImage caller
17769
// as the returned pixbuf_mem_owner. Regardless of success or failure, the work
17770
// buffer memory is deleted.
17771
//
17772
// The pixel_blend (one of the constants listed below) determines how to
17773
// composite the decoded image over the pixel buffer's original pixels (as
17774
// returned by callbacks.AllocPixbuf):
17775
//  - WUFFS_BASE__PIXEL_BLEND__SRC
17776
//  - WUFFS_BASE__PIXEL_BLEND__SRC_OVER
17777
//
17778
// The background_color is used to fill the pixel buffer after
17779
// callbacks.AllocPixbuf returns, if it is valid in the
17780
// wuffs_base__color_u32_argb_premul__is_valid sense. The default value,
17781
// 0x0000_0001, is not valid since its Blue channel value (0x01) is greater
17782
// than its Alpha channel value (0x00). A valid background_color will typically
17783
// be overwritten when pixel_blend is WUFFS_BASE__PIXEL_BLEND__SRC, but might
17784
// still be visible on partial (not total) success or when pixel_blend is
17785
// WUFFS_BASE__PIXEL_BLEND__SRC_OVER and the decoded image is not fully opaque.
17786
//
17787
// Decoding fails (with DecodeImage_MaxInclDimensionExceeded) if the image's
17788
// width or height is greater than max_incl_dimension or if any opted-in (via
17789
// flags bits) metadata is longer than max_incl_metadata_length.
17790
DecodeImageResult  //
17791
DecodeImage(DecodeImageCallbacks& callbacks,
17792
            sync_io::Input& input,
17793
            DecodeImageArgQuirks quirks = DecodeImageArgQuirks::DefaultValue(),
17794
            DecodeImageArgFlags flags = DecodeImageArgFlags::DefaultValue(),
17795
            DecodeImageArgPixelBlend pixel_blend =
17796
                DecodeImageArgPixelBlend::DefaultValue(),
17797
            DecodeImageArgBackgroundColor background_color =
17798
                DecodeImageArgBackgroundColor::DefaultValue(),
17799
            DecodeImageArgMaxInclDimension max_incl_dimension =
17800
                DecodeImageArgMaxInclDimension::DefaultValue(),
17801
            DecodeImageArgMaxInclMetadataLength max_incl_metadata_length =
17802
                DecodeImageArgMaxInclMetadataLength::DefaultValue());
17803
17804
}  // namespace wuffs_aux
17805
17806
// ---------------- Auxiliary - JSON
17807
17808
namespace wuffs_aux {
17809
17810
struct DecodeJsonResult {
17811
  DecodeJsonResult(std::string&& error_message0, uint64_t cursor_position0);
17812
17813
  std::string error_message;
17814
  uint64_t cursor_position;
17815
};
17816
17817
class DecodeJsonCallbacks {
17818
 public:
17819
  virtual ~DecodeJsonCallbacks();
17820
17821
  // AppendXxx are called for leaf nodes: literals, numbers and strings. For
17822
  // strings, the Callbacks implementation is responsible for tracking map keys
17823
  // versus other values.
17824
17825
  virtual std::string AppendNull() = 0;
17826
  virtual std::string AppendBool(bool val) = 0;
17827
  virtual std::string AppendF64(double val) = 0;
17828
  virtual std::string AppendI64(int64_t val) = 0;
17829
  virtual std::string AppendTextString(std::string&& val) = 0;
17830
17831
  // Push and Pop are called for container nodes: JSON arrays (lists) and JSON
17832
  // objects (dictionaries).
17833
  //
17834
  // The flags bits combine exactly one of:
17835
  //  - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_NONE
17836
  //  - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_LIST
17837
  //  - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_DICT
17838
  // and exactly one of:
17839
  //  - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_NONE
17840
  //  - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_LIST
17841
  //  - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_DICT
17842
17843
  virtual std::string Push(uint32_t flags) = 0;
17844
  virtual std::string Pop(uint32_t flags) = 0;
17845
17846
  // Done is always the last Callback method called by DecodeJson, whether or
17847
  // not parsing the input as JSON encountered an error. Even when successful,
17848
  // trailing data may remain in input and buffer. See "Unintuitive JSON
17849
  // Parsing" (https://nullprogram.com/blog/2019/12/28/) which discusses JSON
17850
  // parsing and when it stops.
17851
  //
17852
  // Do not keep a reference to buffer or buffer.data.ptr after Done returns,
17853
  // as DecodeJson may then de-allocate the backing array.
17854
  //
17855
  // The default Done implementation is a no-op.
17856
  virtual void  //
17857
  Done(DecodeJsonResult& result, sync_io::Input& input, IOBuffer& buffer);
17858
};
17859
17860
extern const char DecodeJson_BadJsonPointer[];
17861
extern const char DecodeJson_NoMatch[];
17862
17863
// The FooArgBar types add structure to Foo's optional arguments. They wrap
17864
// inner representations for several reasons:
17865
//  - It provides a home for the DefaultValue static method, for Foo callers
17866
//    that want to override some but not all optional arguments.
17867
//  - It provides the "Bar" name at Foo call sites, which can help self-
17868
//    document Foo calls with many arguemnts.
17869
//  - It provides some type safety against accidentally transposing or omitting
17870
//    adjacent fundamentally-numeric-typed optional arguments.
17871
17872
// DecodeJsonArgQuirks wraps an optional argument to DecodeJson.
17873
struct DecodeJsonArgQuirks {
17874
  explicit DecodeJsonArgQuirks(const QuirkKeyValuePair* ptr0,
17875
                               const size_t len0);
17876
17877
  // DefaultValue returns an empty slice.
17878
  static DecodeJsonArgQuirks DefaultValue();
17879
17880
  const QuirkKeyValuePair* ptr;
17881
  const size_t len;
17882
};
17883
17884
// DecodeJsonArgJsonPointer wraps an optional argument to DecodeJson.
17885
struct DecodeJsonArgJsonPointer {
17886
  explicit DecodeJsonArgJsonPointer(std::string repr0);
17887
17888
  // DefaultValue returns an empty string.
17889
  static DecodeJsonArgJsonPointer DefaultValue();
17890
17891
  std::string repr;
17892
};
17893
17894
// DecodeJson calls callbacks based on the JSON-formatted data in input.
17895
//
17896
// On success, the returned error_message is empty and cursor_position counts
17897
// the number of bytes consumed. On failure, error_message is non-empty and
17898
// cursor_position is the location of the error. That error may be a content
17899
// error (invalid JSON) or an input error (e.g. network failure).
17900
//
17901
// json_pointer is a query in the JSON Pointer (RFC 6901) syntax. The callbacks
17902
// run for the input's sub-node that matches the query. DecodeJson_NoMatch is
17903
// returned if no matching sub-node was found. The empty query matches the
17904
// input's root node, consistent with JSON Pointer semantics.
17905
//
17906
// The JSON Pointer implementation is greedy: duplicate keys are not rejected
17907
// but only the first match for each '/'-separated fragment is followed.
17908
DecodeJsonResult  //
17909
DecodeJson(DecodeJsonCallbacks& callbacks,
17910
           sync_io::Input& input,
17911
           DecodeJsonArgQuirks quirks = DecodeJsonArgQuirks::DefaultValue(),
17912
           DecodeJsonArgJsonPointer json_pointer =
17913
               DecodeJsonArgJsonPointer::DefaultValue());
17914
17915
}  // namespace wuffs_aux
17916
17917
#endif  // defined(__cplusplus) && defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
17918
17919
// ---------------- Wuffs' reimplementation of the STB API.
17920
//
17921
// This is a drop-in replacement of that third-party library.
17922
//
17923
// Disabled by default, unless you #define the
17924
// WUFFS_CONFIG__ENABLE_DROP_IN_REPLACEMENT__STB macro beforehand.
17925
//
17926
// For API docs, see https://github.com/nothings/stb
17927
17928
#if defined(WUFFS_CONFIG__ENABLE_DROP_IN_REPLACEMENT__STB)
17929
17930
#ifdef __cplusplus
17931
extern "C" {
17932
#endif
17933
17934
#if defined(WUFFS_CONFIG__STATIC_FUNCTIONS) || defined(STB_IMAGE_STATIC)
17935
#define WUFFS_DROP_IN__STB__MAYBE_STATIC static
17936
#else
17937
#define WUFFS_DROP_IN__STB__MAYBE_STATIC
17938
#endif
17939
17940
enum {
17941
  STBI_default = 0,
17942
  STBI_grey = 1,
17943
  STBI_grey_alpha = 2,
17944
  STBI_rgb = 3,
17945
  STBI_rgb_alpha = 4
17946
};
17947
17948
typedef unsigned char stbi_uc;
17949
typedef unsigned short stbi_us;
17950
17951
typedef struct {
17952
  int (*read)(void* user, char* data, int size);
17953
  void (*skip)(void* user, int n);
17954
  int (*eof)(void* user);
17955
} stbi_io_callbacks;
17956
17957
// --------
17958
17959
WUFFS_DROP_IN__STB__MAYBE_STATIC int  //
17960
stbi_info_from_memory(                //
17961
    stbi_uc const* buffer,            //
17962
    int len,                          //
17963
    int* x,                           //
17964
    int* y,                           //
17965
    int* comp);
17966
17967
WUFFS_DROP_IN__STB__MAYBE_STATIC stbi_uc*  //
17968
stbi_load_from_memory(                     //
17969
    stbi_uc const* buffer,                 //
17970
    int len,                               //
17971
    int* x,                                //
17972
    int* y,                                //
17973
    int* channels_in_file,                 //
17974
    int desired_channels);
17975
17976
WUFFS_DROP_IN__STB__MAYBE_STATIC int  //
17977
stbi_info_from_callbacks(             //
17978
    stbi_io_callbacks const* clbk,    //
17979
    void* user,                       //
17980
    int* x,                           //
17981
    int* y,                           //
17982
    int* comp);
17983
17984
WUFFS_DROP_IN__STB__MAYBE_STATIC stbi_uc*  //
17985
stbi_load_from_callbacks(                  //
17986
    stbi_io_callbacks const* clbk,         //
17987
    void* user,                            //
17988
    int* x,                                //
17989
    int* y,                                //
17990
    int* channels_in_file,                 //
17991
    int desired_channels);
17992
17993
// --------
17994
17995
#if !defined(STBI_NO_STDIO)
17996
17997
WUFFS_DROP_IN__STB__MAYBE_STATIC int  //
17998
stbi_info(                            //
17999
    char const* filename,             //
18000
    int* x,                           //
18001
    int* y,                           //
18002
    int* comp);
18003
18004
WUFFS_DROP_IN__STB__MAYBE_STATIC stbi_uc*  //
18005
stbi_load(                                 //
18006
    char const* filename,                  //
18007
    int* x,                                //
18008
    int* y,                                //
18009
    int* channels_in_file,                 //
18010
    int desired_channels);
18011
18012
WUFFS_DROP_IN__STB__MAYBE_STATIC int  //
18013
stbi_info_from_file(                  //
18014
    FILE* f,                          //
18015
    int* x,                           //
18016
    int* y,                           //
18017
    int* comp);
18018
18019
WUFFS_DROP_IN__STB__MAYBE_STATIC stbi_uc*  //
18020
stbi_load_from_file(                       //
18021
    FILE* f,                               //
18022
    int* x,                                //
18023
    int* y,                                //
18024
    int* channels_in_file,                 //
18025
    int desired_channels);
18026
18027
#endif  // !defined(STBI_NO_STDIO)
18028
18029
// --------
18030
18031
WUFFS_DROP_IN__STB__MAYBE_STATIC void  //
18032
stbi_image_free(                       //
18033
    void* retval_from_stbi_load);
18034
18035
WUFFS_DROP_IN__STB__MAYBE_STATIC const char*  //
18036
stbi_failure_reason(void);
18037
18038
#ifdef __cplusplus
18039
}
18040
#endif
18041
18042
#endif  // defined (WUFFS_CONFIG__ENABLE_DROP_IN_REPLACEMENT__STB)
18043
18044
// โ€ผ WUFFS C HEADER ENDS HERE.
18045
#ifdef WUFFS_IMPLEMENTATION
18046
18047
#ifdef __cplusplus
18048
extern "C" {
18049
#endif
18050
18051
// ---------------- Fundamentals
18052
18053
// WUFFS_BASE__MAGIC is a magic number to check that initializers are called.
18054
// It's not foolproof, given C doesn't automatically zero memory before use,
18055
// but it should catch 99.99% of cases.
18056
//
18057
// Its (non-zero) value is arbitrary, based on md5sum("wuffs").
18058
32.5k
#define WUFFS_BASE__MAGIC ((uint32_t)0x3CCB6C71)
18059
18060
// WUFFS_BASE__DISABLED is a magic number to indicate that a non-recoverable
18061
// error was previously encountered.
18062
//
18063
// Its (non-zero) value is arbitrary, based on md5sum("disabled").
18064
7.54k
#define WUFFS_BASE__DISABLED ((uint32_t)0x075AE3D2)
18065
18066
// Use switch cases for coroutine suspension points, similar to the technique
18067
// in https://www.chiark.greenend.org.uk/~sgtatham/coroutines.html
18068
//
18069
// The implicit fallthrough is intentional.
18070
//
18071
// We use trivial macros instead of an explicit assignment and case statement
18072
// so that clang-format doesn't get confused by the unusual "case"s.
18073
110k
#define WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0 case 0:;
18074
#define WUFFS_BASE__COROUTINE_SUSPENSION_POINT(n) \
18075
1.36M
  coro_susp_point = n;                            \
18076
1.36M
  case n:;
18077
18078
#define WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(n) \
18079
7.57k
  if (!status.repr) {                                           \
18080
5.35k
    goto ok;                                                    \
18081
5.35k
  } else if (*status.repr != '$') {                             \
18082
260
    goto exit;                                                  \
18083
260
  }                                                             \
18084
1.96k
  coro_susp_point = n;                                          \
18085
1.96k
  goto suspend;                                                 \
18086
1.96k
  case n:;
18087
18088
// The "defined(__clang__)" isn't redundant. While vanilla clang defines
18089
// __GNUC__, clang-cl (which mimics MSVC's cl.exe) does not.
18090
#if defined(__GNUC__) || defined(__clang__)
18091
65.1k
#define WUFFS_BASE__LIKELY(expr) (__builtin_expect(!!(expr), 1))
18092
1.17M
#define WUFFS_BASE__UNLIKELY(expr) (__builtin_expect(!!(expr), 0))
18093
#else
18094
#define WUFFS_BASE__LIKELY(expr) (expr)
18095
#define WUFFS_BASE__UNLIKELY(expr) (expr)
18096
#endif
18097
18098
// --------
18099
18100
static inline wuffs_base__empty_struct  //
18101
0
wuffs_private_impl__ignore_status(wuffs_base__status z) {
18102
0
  return wuffs_base__make_empty_struct();
18103
0
}
18104
18105
static inline wuffs_base__status  //
18106
689
wuffs_private_impl__status__ensure_not_a_suspension(wuffs_base__status z) {
18107
689
  if (z.repr && (*z.repr == '$')) {
18108
0
    z.repr = wuffs_base__error__cannot_return_a_suspension;
18109
0
  }
18110
689
  return z;
18111
689
}
18112
18113
// --------
18114
18115
// wuffs_private_impl__iterate_total_advance returns the exclusive
18116
// pointer-offset at which iteration should stop. The overall slice has length
18117
// total_len, each iteration's sub-slice has length iter_len and are placed
18118
// iter_advance apart.
18119
//
18120
// The iter_advance may not be larger than iter_len. The iter_advance may be
18121
// smaller than iter_len, in which case the sub-slices will overlap.
18122
//
18123
// The return value r satisfies ((0 <= r) && (r <= total_len)).
18124
//
18125
// For example, if total_len = 15, iter_len = 5 and iter_advance = 3, there are
18126
// four iterations at offsets 0, 3, 6 and 9. This function returns 12.
18127
//
18128
// 0123456789012345
18129
// [....]
18130
//    [....]
18131
//       [....]
18132
//          [....]
18133
//             $
18134
// 0123456789012345
18135
//
18136
// For example, if total_len = 15, iter_len = 5 and iter_advance = 5, there are
18137
// three iterations at offsets 0, 5 and 10. This function returns 15.
18138
//
18139
// 0123456789012345
18140
// [....]
18141
//      [....]
18142
//           [....]
18143
//                $
18144
// 0123456789012345
18145
static inline size_t  //
18146
wuffs_private_impl__iterate_total_advance(size_t total_len,
18147
                                          size_t iter_len,
18148
0
                                          size_t iter_advance) {
18149
0
  if (total_len >= iter_len) {
18150
0
    size_t n = total_len - iter_len;
18151
0
    return ((n / iter_advance) * iter_advance) + iter_advance;
18152
0
  }
18153
0
  return 0;
18154
0
}
18155
18156
// ---------------- Numeric Types
18157
18158
extern const uint8_t wuffs_private_impl__low_bits_mask__u8[8];
18159
extern const uint16_t wuffs_private_impl__low_bits_mask__u16[16];
18160
extern const uint32_t wuffs_private_impl__low_bits_mask__u32[32];
18161
extern const uint64_t wuffs_private_impl__low_bits_mask__u64[64];
18162
18163
#define WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U8(n) \
18164
  (wuffs_private_impl__low_bits_mask__u8[n])
18165
#define WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U16(n) \
18166
  (wuffs_private_impl__low_bits_mask__u16[n])
18167
#define WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(n) \
18168
  (wuffs_private_impl__low_bits_mask__u32[n])
18169
#define WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U64(n) \
18170
  (wuffs_private_impl__low_bits_mask__u64[n])
18171
18172
// --------
18173
18174
static inline void  //
18175
0
wuffs_private_impl__u8__sat_add_indirect(uint8_t* x, uint8_t y) {
18176
0
  *x = wuffs_base__u8__sat_add(*x, y);
18177
0
}
18178
18179
static inline void  //
18180
0
wuffs_private_impl__u8__sat_sub_indirect(uint8_t* x, uint8_t y) {
18181
0
  *x = wuffs_base__u8__sat_sub(*x, y);
18182
0
}
18183
18184
static inline void  //
18185
0
wuffs_private_impl__u16__sat_add_indirect(uint16_t* x, uint16_t y) {
18186
0
  *x = wuffs_base__u16__sat_add(*x, y);
18187
0
}
18188
18189
static inline void  //
18190
0
wuffs_private_impl__u16__sat_sub_indirect(uint16_t* x, uint16_t y) {
18191
0
  *x = wuffs_base__u16__sat_sub(*x, y);
18192
0
}
18193
18194
static inline void  //
18195
1.80k
wuffs_private_impl__u32__sat_add_indirect(uint32_t* x, uint32_t y) {
18196
1.80k
  *x = wuffs_base__u32__sat_add(*x, y);
18197
1.80k
}
18198
18199
static inline void  //
18200
205k
wuffs_private_impl__u32__sat_sub_indirect(uint32_t* x, uint32_t y) {
18201
205k
  *x = wuffs_base__u32__sat_sub(*x, y);
18202
205k
}
18203
18204
static inline void  //
18205
0
wuffs_private_impl__u64__sat_add_indirect(uint64_t* x, uint64_t y) {
18206
0
  *x = wuffs_base__u64__sat_add(*x, y);
18207
0
}
18208
18209
static inline void  //
18210
0
wuffs_private_impl__u64__sat_sub_indirect(uint64_t* x, uint64_t y) {
18211
0
  *x = wuffs_base__u64__sat_sub(*x, y);
18212
0
}
18213
18214
// ---------------- Numeric Types (Utility)
18215
18216
#define wuffs_base__utility__i64_divide(a, b) \
18217
  ((uint64_t)(((int64_t)(a)) / ((int64_t)(b))))
18218
18219
#define wuffs_base__utility__sign_extend_convert_u8_u32(a) \
18220
  ((uint32_t)(int32_t)(int8_t)(a))
18221
18222
#define wuffs_base__utility__sign_extend_convert_u8_u64(a) \
18223
  ((uint64_t)(int64_t)(int8_t)(a))
18224
18225
#define wuffs_base__utility__sign_extend_convert_u16_u32(a) \
18226
7.72G
  ((uint32_t)(int32_t)(int16_t)(a))
18227
18228
#define wuffs_base__utility__sign_extend_convert_u16_u64(a) \
18229
  ((uint64_t)(int64_t)(int16_t)(a))
18230
18231
#define wuffs_base__utility__sign_extend_convert_u32_u64(a) \
18232
  ((uint64_t)(int64_t)(int32_t)(a))
18233
18234
#define wuffs_base__utility__sign_extend_rshift_u32(a, n) \
18235
0
  ((uint32_t)(((int32_t)(a)) >> (n)))
18236
18237
#define wuffs_base__utility__sign_extend_rshift_u64(a, n) \
18238
73.7M
  ((uint64_t)(((int64_t)(a)) >> (n)))
18239
18240
#define wuffs_base__utility__make_bitvec256(e00, e01, e02, e03) \
18241
0
  wuffs_base__make_bitvec256(e00, e01, e02, e03)
18242
18243
#define wuffs_base__utility__make_optional_u63(h, v) \
18244
0
  wuffs_base__make_optional_u63(h, v)
18245
18246
// ---------------- Slices and Tables
18247
18248
// This function basically returns (ptr + len), except that that expression is
18249
// Undefined Behavior in C (but not C++) when ptr is NULL, even if len is zero.
18250
//
18251
// Precondition: (ptr != NULL) || (len == 0).
18252
static inline const uint8_t*  //
18253
0
wuffs_private_impl__ptr_u8_plus_len(const uint8_t* ptr, size_t len) {
18254
0
  return ptr ? (ptr + len) : NULL;
18255
0
}
18256
18257
// --------
18258
18259
// wuffs_private_impl__slice_u8__prefix returns up to the first up_to bytes of
18260
// s.
18261
static inline wuffs_base__slice_u8  //
18262
0
wuffs_private_impl__slice_u8__prefix(wuffs_base__slice_u8 s, uint64_t up_to) {
18263
0
  if (((uint64_t)(s.len)) > up_to) {
18264
0
    s.len = ((size_t)up_to);
18265
0
  }
18266
0
  return s;
18267
0
}
18268
18269
// wuffs_private_impl__slice_u8__suffix returns up to the last up_to bytes of
18270
// s.
18271
static inline wuffs_base__slice_u8  //
18272
0
wuffs_private_impl__slice_u8__suffix(wuffs_base__slice_u8 s, uint64_t up_to) {
18273
0
  if (((uint64_t)(s.len)) > up_to) {
18274
0
    s.ptr += ((uint64_t)(s.len)) - up_to;
18275
0
    s.len = ((size_t)up_to);
18276
0
  }
18277
0
  return s;
18278
0
}
18279
18280
// wuffs_private_impl__slice_u8__copy_from_slice calls memmove(dst.ptr,
18281
// src.ptr, len) where len is the minimum of dst.len and src.len.
18282
//
18283
// Passing a wuffs_base__slice_u8 with all fields NULL or zero (a valid, empty
18284
// slice) is valid and results in a no-op.
18285
static inline uint64_t  //
18286
wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__slice_u8 dst,
18287
141k
                                              wuffs_base__slice_u8 src) {
18288
141k
  size_t len = dst.len < src.len ? dst.len : src.len;
18289
141k
  if (len > 0) {
18290
141k
    memmove(dst.ptr, src.ptr, len);
18291
141k
  }
18292
141k
  return len;
18293
141k
}
18294
18295
static inline wuffs_base__empty_struct  //
18296
wuffs_private_impl__bulk_load_host_endian(void* ptr,
18297
                                          size_t len,
18298
963M
                                          wuffs_base__slice_u8 src) {
18299
963M
  if (len && (len <= src.len)) {
18300
963M
    memmove(ptr, src.ptr, len);
18301
963M
  }
18302
963M
  return wuffs_base__make_empty_struct();
18303
963M
}
18304
18305
static inline wuffs_base__empty_struct  //
18306
3.02M
wuffs_private_impl__bulk_memset(void* ptr, size_t len, uint8_t byte_value) {
18307
3.02M
  if (len) {
18308
3.02M
    memset(ptr, byte_value, len);
18309
3.02M
  }
18310
3.02M
  return wuffs_base__make_empty_struct();
18311
3.02M
}
18312
18313
static inline wuffs_base__empty_struct  //
18314
wuffs_private_impl__bulk_save_host_endian(void* ptr,
18315
                                          size_t len,
18316
26.1M
                                          wuffs_base__slice_u8 dst) {
18317
26.1M
  if (len && (len <= dst.len)) {
18318
26.1M
    memmove(dst.ptr, ptr, len);
18319
26.1M
  }
18320
26.1M
  return wuffs_base__make_empty_struct();
18321
26.1M
}
18322
18323
// --------
18324
18325
static inline wuffs_base__slice_u8  //
18326
14.4M
wuffs_private_impl__table_u8__row_u32(wuffs_base__table_u8 t, uint32_t y) {
18327
14.4M
  if (t.ptr && (y < t.height)) {
18328
14.4M
    return wuffs_base__make_slice_u8(t.ptr + (t.stride * y), t.width);
18329
14.4M
  }
18330
0
  return wuffs_base__empty_slice_u8();
18331
14.4M
}
18332
18333
// ---------------- Slices and Tables (Utility)
18334
18335
2.66k
#define wuffs_base__utility__empty_slice_u8 wuffs_base__empty_slice_u8
18336
18337
// ---------------- Ranges and Rects
18338
18339
static inline uint32_t  //
18340
wuffs_private_impl__range_ii_u32__get_min_incl(
18341
0
    const wuffs_base__range_ii_u32* r) {
18342
0
  return r->min_incl;
18343
0
}
18344
18345
static inline uint32_t  //
18346
wuffs_private_impl__range_ii_u32__get_max_incl(
18347
0
    const wuffs_base__range_ii_u32* r) {
18348
0
  return r->max_incl;
18349
0
}
18350
18351
static inline uint32_t  //
18352
wuffs_private_impl__range_ie_u32__get_min_incl(
18353
0
    const wuffs_base__range_ie_u32* r) {
18354
0
  return r->min_incl;
18355
0
}
18356
18357
static inline uint32_t  //
18358
wuffs_private_impl__range_ie_u32__get_max_excl(
18359
0
    const wuffs_base__range_ie_u32* r) {
18360
0
  return r->max_excl;
18361
0
}
18362
18363
static inline uint64_t  //
18364
wuffs_private_impl__range_ii_u64__get_min_incl(
18365
0
    const wuffs_base__range_ii_u64* r) {
18366
0
  return r->min_incl;
18367
0
}
18368
18369
static inline uint64_t  //
18370
wuffs_private_impl__range_ii_u64__get_max_incl(
18371
0
    const wuffs_base__range_ii_u64* r) {
18372
0
  return r->max_incl;
18373
0
}
18374
18375
static inline uint64_t  //
18376
wuffs_private_impl__range_ie_u64__get_min_incl(
18377
0
    const wuffs_base__range_ie_u64* r) {
18378
0
  return r->min_incl;
18379
0
}
18380
18381
static inline uint64_t  //
18382
wuffs_private_impl__range_ie_u64__get_max_excl(
18383
0
    const wuffs_base__range_ie_u64* r) {
18384
0
  return r->max_excl;
18385
0
}
18386
18387
// ---------------- Ranges and Rects (Utility)
18388
18389
#define wuffs_base__utility__empty_range_ii_u32 wuffs_base__empty_range_ii_u32
18390
#define wuffs_base__utility__empty_range_ie_u32 wuffs_base__empty_range_ie_u32
18391
0
#define wuffs_base__utility__empty_range_ii_u64 wuffs_base__empty_range_ii_u64
18392
#define wuffs_base__utility__empty_range_ie_u64 wuffs_base__empty_range_ie_u64
18393
#define wuffs_base__utility__empty_rect_ii_u32 wuffs_base__empty_rect_ii_u32
18394
0
#define wuffs_base__utility__empty_rect_ie_u32 wuffs_base__empty_rect_ie_u32
18395
#define wuffs_base__utility__make_range_ii_u32 wuffs_base__make_range_ii_u32
18396
#define wuffs_base__utility__make_range_ie_u32 wuffs_base__make_range_ie_u32
18397
2.68k
#define wuffs_base__utility__make_range_ii_u64 wuffs_base__make_range_ii_u64
18398
#define wuffs_base__utility__make_range_ie_u64 wuffs_base__make_range_ie_u64
18399
#define wuffs_base__utility__make_rect_ii_u32 wuffs_base__make_rect_ii_u32
18400
5.33k
#define wuffs_base__utility__make_rect_ie_u32 wuffs_base__make_rect_ie_u32
18401
18402
// ---------------- I/O
18403
18404
static inline uint64_t  //
18405
0
wuffs_private_impl__io__count_since(uint64_t mark, uint64_t index) {
18406
0
  if (index >= mark) {
18407
0
    return index - mark;
18408
0
  }
18409
0
  return 0;
18410
0
}
18411
18412
// TODO: drop the "const" in "const uint8_t* ptr". Some though required about
18413
// the base.io_reader.since method returning a mutable "slice base.u8".
18414
#if defined(__GNUC__)
18415
#pragma GCC diagnostic push
18416
#pragma GCC diagnostic ignored "-Wcast-qual"
18417
#endif
18418
static inline wuffs_base__slice_u8  //
18419
wuffs_private_impl__io__since(uint64_t mark,
18420
                              uint64_t index,
18421
0
                              const uint8_t* ptr) {
18422
0
  if (index >= mark) {
18423
0
    return wuffs_base__make_slice_u8(((uint8_t*)ptr) + mark,
18424
0
                                     ((size_t)(index - mark)));
18425
0
  }
18426
0
  return wuffs_base__empty_slice_u8();
18427
0
}
18428
#if defined(__GNUC__)
18429
#pragma GCC diagnostic pop
18430
#endif
18431
18432
// --------
18433
18434
static inline void  //
18435
wuffs_private_impl__io_reader__limit(const uint8_t** ptr_io2_r,
18436
                                     const uint8_t* iop_r,
18437
0
                                     uint64_t limit) {
18438
0
  if (((uint64_t)(*ptr_io2_r - iop_r)) > limit) {
18439
0
    *ptr_io2_r = iop_r + limit;
18440
0
  }
18441
0
}
18442
18443
static inline uint32_t  //
18444
wuffs_private_impl__io_reader__limited_copy_u32_to_slice(
18445
    const uint8_t** ptr_iop_r,
18446
    const uint8_t* io2_r,
18447
    uint32_t length,
18448
0
    wuffs_base__slice_u8 dst) {
18449
0
  const uint8_t* iop_r = *ptr_iop_r;
18450
0
  size_t n = dst.len;
18451
0
  if (n > length) {
18452
0
    n = length;
18453
0
  }
18454
0
  if (n > ((size_t)(io2_r - iop_r))) {
18455
0
    n = (size_t)(io2_r - iop_r);
18456
0
  }
18457
0
  if (n > 0) {
18458
0
    memmove(dst.ptr, iop_r, n);
18459
0
    *ptr_iop_r += n;
18460
0
  }
18461
0
  return (uint32_t)(n);
18462
0
}
18463
18464
// wuffs_private_impl__io_reader__match7 returns whether the io_reader's
18465
// upcoming bytes start with the given prefix (up to 7 bytes long). It is
18466
// peek-like, not read-like, in that there are no side-effects.
18467
//
18468
// The low 3 bits of a hold the prefix length, n.
18469
//
18470
// The high 56 bits of a hold the prefix itself, in little-endian order. The
18471
// first prefix byte is in bits 8..=15, the second prefix byte is in bits
18472
// 16..=23, etc. The high (8 * (7 - n)) bits are ignored.
18473
//
18474
// There are three possible return values:
18475
//  - 0 means success.
18476
//  - 1 means inconclusive, equivalent to "$short read".
18477
//  - 2 means failure.
18478
static inline uint32_t  //
18479
wuffs_private_impl__io_reader__match7(const uint8_t* iop_r,
18480
                                      const uint8_t* io2_r,
18481
                                      wuffs_base__io_buffer* r,
18482
0
                                      uint64_t a) {
18483
0
  uint32_t n = a & 7;
18484
0
  a >>= 8;
18485
0
  if ((io2_r - iop_r) >= 8) {
18486
0
    uint64_t x = wuffs_base__peek_u64le__no_bounds_check(iop_r);
18487
0
    uint32_t shift = 8 * (8 - n);
18488
0
    return ((a << shift) == (x << shift)) ? 0 : 2;
18489
0
  }
18490
0
  for (; n > 0; n--) {
18491
0
    if (iop_r >= io2_r) {
18492
0
      return (r && r->meta.closed) ? 2 : 1;
18493
0
    } else if (*iop_r != ((uint8_t)(a))) {
18494
0
      return 2;
18495
0
    }
18496
0
    iop_r++;
18497
0
    a >>= 8;
18498
0
  }
18499
0
  return 0;
18500
0
}
18501
18502
static inline wuffs_base__io_buffer*  //
18503
wuffs_private_impl__io_reader__set(wuffs_base__io_buffer* b,
18504
                                   const uint8_t** ptr_iop_r,
18505
                                   const uint8_t** ptr_io0_r,
18506
                                   const uint8_t** ptr_io1_r,
18507
                                   const uint8_t** ptr_io2_r,
18508
                                   wuffs_base__slice_u8 data,
18509
24.7M
                                   uint64_t history_position) {
18510
24.7M
  b->data = data;
18511
24.7M
  b->meta.wi = data.len;
18512
24.7M
  b->meta.ri = 0;
18513
24.7M
  b->meta.pos = history_position;
18514
24.7M
  b->meta.closed = false;
18515
18516
24.7M
  *ptr_iop_r = data.ptr;
18517
24.7M
  *ptr_io0_r = data.ptr;
18518
24.7M
  *ptr_io1_r = data.ptr;
18519
24.7M
  *ptr_io2_r = data.ptr + data.len;
18520
18521
24.7M
  return b;
18522
24.7M
}
18523
18524
// --------
18525
18526
static inline uint64_t  //
18527
wuffs_private_impl__io_writer__copy_from_slice(uint8_t** ptr_iop_w,
18528
                                               uint8_t* io2_w,
18529
0
                                               wuffs_base__slice_u8 src) {
18530
0
  uint8_t* iop_w = *ptr_iop_w;
18531
0
  size_t n = src.len;
18532
0
  if (n > ((size_t)(io2_w - iop_w))) {
18533
0
    n = (size_t)(io2_w - iop_w);
18534
0
  }
18535
0
  if (n > 0) {
18536
0
    memmove(iop_w, src.ptr, n);
18537
0
    *ptr_iop_w += n;
18538
0
  }
18539
0
  return (uint64_t)(n);
18540
0
}
18541
18542
static inline void  //
18543
wuffs_private_impl__io_writer__limit(uint8_t** ptr_io2_w,
18544
                                     uint8_t* iop_w,
18545
0
                                     uint64_t limit) {
18546
0
  if (((uint64_t)(*ptr_io2_w - iop_w)) > limit) {
18547
0
    *ptr_io2_w = iop_w + limit;
18548
0
  }
18549
0
}
18550
18551
static inline uint32_t  //
18552
wuffs_private_impl__io_writer__limited_copy_u32_from_history(
18553
    uint8_t** ptr_iop_w,
18554
    uint8_t* io0_w,
18555
    uint8_t* io2_w,
18556
    uint32_t length,
18557
0
    uint32_t distance) {
18558
0
  if (!distance) {
18559
0
    return 0;
18560
0
  }
18561
0
  uint8_t* p = *ptr_iop_w;
18562
0
  if ((size_t)(p - io0_w) < (size_t)(distance)) {
18563
0
    return 0;
18564
0
  }
18565
0
  uint8_t* q = p - distance;
18566
0
  size_t n = (size_t)(io2_w - p);
18567
0
  if ((size_t)(length) > n) {
18568
0
    length = (uint32_t)(n);
18569
0
  } else {
18570
0
    n = (size_t)(length);
18571
0
  }
18572
0
  // TODO: unrolling by 3 seems best for the std/deflate benchmarks, but that
18573
0
  // is mostly because 3 is the minimum length for the deflate format. This
18574
0
  // function implementation shouldn't overfit to that one format. Perhaps the
18575
0
  // limited_copy_u32_from_history Wuffs method should also take an unroll hint
18576
0
  // argument, and the cgen can look if that argument is the constant
18577
0
  // expression '3'.
18578
0
  //
18579
0
  // See also wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast
18580
0
  // below.
18581
0
  for (; n >= 3; n -= 3) {
18582
0
    *p++ = *q++;
18583
0
    *p++ = *q++;
18584
0
    *p++ = *q++;
18585
0
  }
18586
0
  for (; n; n--) {
18587
0
    *p++ = *q++;
18588
0
  }
18589
0
  *ptr_iop_w = p;
18590
0
  return length;
18591
0
}
18592
18593
// wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast is like
18594
// the wuffs_private_impl__io_writer__limited_copy_u32_from_history function
18595
// above, but has stronger pre-conditions.
18596
//
18597
// The caller needs to prove that:
18598
//  - length   >= 1
18599
//  - length   <= (io2_w      - *ptr_iop_w)
18600
//  - distance >= 1
18601
//  - distance <= (*ptr_iop_w - io0_w)
18602
static inline uint32_t  //
18603
wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast(
18604
    uint8_t** ptr_iop_w,
18605
    uint8_t* io0_w,
18606
    uint8_t* io2_w,
18607
    uint32_t length,
18608
0
    uint32_t distance) {
18609
0
  uint8_t* p = *ptr_iop_w;
18610
0
  uint8_t* q = p - distance;
18611
0
  uint32_t n = length;
18612
0
  for (; n >= 3; n -= 3) {
18613
0
    *p++ = *q++;
18614
0
    *p++ = *q++;
18615
0
    *p++ = *q++;
18616
0
  }
18617
0
  for (; n; n--) {
18618
0
    *p++ = *q++;
18619
0
  }
18620
0
  *ptr_iop_w = p;
18621
0
  return length;
18622
0
}
18623
18624
// wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast_return_cusp
18625
// is like the
18626
// wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast function,
18627
// but also returns the cusp: a byte pair (as a u16le) being the last byte of
18628
// and next byte after the copied history.
18629
//
18630
// For example, if history was [10, 11, 12, 13, 14, 15, 16, 17, 18] then:
18631
//  - copying l=3, d=8 produces [11, 12, 13] and the cusp is (13, 14).
18632
//  - copying l=3, d=2 produces [17, 18, 17] and the cusp is (17, 18).
18633
//
18634
// The caller needs to prove that:
18635
//  - length   >= 1
18636
//  - length   <= (io2_w      - *ptr_iop_w)
18637
//  - distance >= 1
18638
//  - distance <= (*ptr_iop_w - io0_w)
18639
static inline uint32_t  //
18640
wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast_return_cusp(
18641
    uint8_t** ptr_iop_w,
18642
    uint8_t* io0_w,
18643
    uint8_t* io2_w,
18644
    uint32_t length,
18645
0
    uint32_t distance) {
18646
0
  uint8_t* p = *ptr_iop_w;
18647
0
  uint8_t* q = p - distance;
18648
0
  uint32_t n = length;
18649
0
  for (; n >= 3; n -= 3) {
18650
0
    *p++ = *q++;
18651
0
    *p++ = *q++;
18652
0
    *p++ = *q++;
18653
0
  }
18654
0
  for (; n; n--) {
18655
0
    *p++ = *q++;
18656
0
  }
18657
0
  *ptr_iop_w = p;
18658
0
  return (uint32_t)wuffs_base__peek_u16le__no_bounds_check(q - 1);
18659
0
}
18660
18661
// wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast
18662
// copies the previous byte (the one immediately before *ptr_iop_w), copying 8
18663
// byte chunks at a time. Each chunk contains 8 repetitions of the same byte.
18664
//
18665
// In terms of number of bytes copied, length is rounded up to a multiple of 8.
18666
// As a special case, a zero length rounds up to 8 (even though 0 is already a
18667
// multiple of 8), since there is always at least one 8 byte chunk copied.
18668
//
18669
// In terms of advancing *ptr_iop_w, length is not rounded up.
18670
//
18671
// The caller needs to prove that:
18672
//  - length       >= 1
18673
//  - (length + 8) <= (io2_w      - *ptr_iop_w)
18674
//  - distance     == 1
18675
//  - distance     <= (*ptr_iop_w - io0_w)
18676
static inline uint32_t  //
18677
wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast(
18678
    uint8_t** ptr_iop_w,
18679
    uint8_t* io0_w,
18680
    uint8_t* io2_w,
18681
    uint32_t length,
18682
0
    uint32_t distance) {
18683
0
  uint8_t* p = *ptr_iop_w;
18684
0
  uint64_t x = p[-1];
18685
0
  x |= x << 8;
18686
0
  x |= x << 16;
18687
0
  x |= x << 32;
18688
0
  uint32_t n = length;
18689
0
  while (1) {
18690
0
    wuffs_base__poke_u64le__no_bounds_check(p, x);
18691
0
    if (n <= 8) {
18692
0
      p += n;
18693
0
      break;
18694
0
    }
18695
0
    p += 8;
18696
0
    n -= 8;
18697
0
  }
18698
0
  *ptr_iop_w = p;
18699
0
  return length;
18700
0
}
18701
18702
// wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast_return_cusp
18703
// copies the previous byte (the one immediately before *ptr_iop_w), copying 8
18704
// byte chunks at a time. Each chunk contains 8 repetitions of the same byte.
18705
// It also returns the cusp: a byte pair (as a u16le) being the last byte of
18706
// and next byte after the copied history.
18707
//
18708
// In terms of number of bytes copied, length is rounded up to a multiple of 8.
18709
// As a special case, a zero length rounds up to 8 (even though 0 is already a
18710
// multiple of 8), since there is always at least one 8 byte chunk copied.
18711
//
18712
// In terms of advancing *ptr_iop_w, length is not rounded up.
18713
//
18714
// The caller needs to prove that:
18715
//  - length       >= 1
18716
//  - (length + 8) <= (io2_w      - *ptr_iop_w)
18717
//  - distance     == 1
18718
//  - distance     <= (*ptr_iop_w - io0_w)
18719
static inline uint32_t  //
18720
wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast_return_cusp(
18721
    uint8_t** ptr_iop_w,
18722
    uint8_t* io0_w,
18723
    uint8_t* io2_w,
18724
    uint32_t length,
18725
0
    uint32_t distance) {
18726
0
  uint8_t* p = *ptr_iop_w;
18727
0
  uint8_t* q = p - distance;
18728
0
  uint64_t x = p[-1];
18729
0
  x |= x << 8;
18730
0
  x |= x << 16;
18731
0
  x |= x << 32;
18732
0
  uint32_t n = length;
18733
0
  while (1) {
18734
0
    wuffs_base__poke_u64le__no_bounds_check(p, x);
18735
0
    if (n <= 8) {
18736
0
      p += n;
18737
0
      q += n;
18738
0
      break;
18739
0
    }
18740
0
    p += 8;
18741
0
    q += 8;
18742
0
    n -= 8;
18743
0
  }
18744
0
  *ptr_iop_w = p;
18745
0
  return (uint32_t)wuffs_base__peek_u16le__no_bounds_check(q - 1);
18746
0
}
18747
18748
// wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast
18749
// is like the
18750
// wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast function
18751
// above, but copies 8 byte chunks at a time.
18752
//
18753
// In terms of number of bytes copied, length is rounded up to a multiple of 8.
18754
// As a special case, a zero length rounds up to 8 (even though 0 is already a
18755
// multiple of 8), since there is always at least one 8 byte chunk copied.
18756
//
18757
// In terms of advancing *ptr_iop_w, length is not rounded up.
18758
//
18759
// The caller needs to prove that:
18760
//  - length       >= 1
18761
//  - (length + 8) <= (io2_w      - *ptr_iop_w)
18762
//  - distance     >= 8
18763
//  - distance     <= (*ptr_iop_w - io0_w)
18764
static inline uint32_t  //
18765
wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast(
18766
    uint8_t** ptr_iop_w,
18767
    uint8_t* io0_w,
18768
    uint8_t* io2_w,
18769
    uint32_t length,
18770
0
    uint32_t distance) {
18771
0
  uint8_t* p = *ptr_iop_w;
18772
0
  uint8_t* q = p - distance;
18773
0
  uint32_t n = length;
18774
0
  while (1) {
18775
0
    memcpy(p, q, 8);
18776
0
    if (n <= 8) {
18777
0
      p += n;
18778
0
      break;
18779
0
    }
18780
0
    p += 8;
18781
0
    q += 8;
18782
0
    n -= 8;
18783
0
  }
18784
0
  *ptr_iop_w = p;
18785
0
  return length;
18786
0
}
18787
18788
// wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast_return_cusp
18789
// is like the
18790
// wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast function
18791
// above, but copies 8 byte chunks at a time. It also returns the cusp: a byte
18792
// pair (as a u16le) being the last byte of and next byte after the copied
18793
// history.
18794
//
18795
// In terms of number of bytes copied, length is rounded up to a multiple of 8.
18796
// As a special case, a zero length rounds up to 8 (even though 0 is already a
18797
// multiple of 8), since there is always at least one 8 byte chunk copied.
18798
//
18799
// In terms of advancing *ptr_iop_w, length is not rounded up.
18800
//
18801
// The caller needs to prove that:
18802
//  - length       >= 1
18803
//  - (length + 8) <= (io2_w      - *ptr_iop_w)
18804
//  - distance     >= 8
18805
//  - distance     <= (*ptr_iop_w - io0_w)
18806
static inline uint32_t  //
18807
wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast_return_cusp(
18808
    uint8_t** ptr_iop_w,
18809
    uint8_t* io0_w,
18810
    uint8_t* io2_w,
18811
    uint32_t length,
18812
0
    uint32_t distance) {
18813
0
  uint8_t* p = *ptr_iop_w;
18814
0
  uint8_t* q = p - distance;
18815
0
  uint32_t n = length;
18816
0
  while (1) {
18817
0
    memcpy(p, q, 8);
18818
0
    if (n <= 8) {
18819
0
      p += n;
18820
0
      q += n;
18821
0
      break;
18822
0
    }
18823
0
    p += 8;
18824
0
    q += 8;
18825
0
    n -= 8;
18826
0
  }
18827
0
  *ptr_iop_w = p;
18828
0
  return (uint32_t)wuffs_base__peek_u16le__no_bounds_check(q - 1);
18829
0
}
18830
18831
static inline uint32_t  //
18832
wuffs_private_impl__io_writer__limited_copy_u32_from_reader(
18833
    uint8_t** ptr_iop_w,
18834
    uint8_t* io2_w,
18835
    uint32_t length,
18836
    const uint8_t** ptr_iop_r,
18837
0
    const uint8_t* io2_r) {
18838
0
  uint8_t* iop_w = *ptr_iop_w;
18839
0
  size_t n = length;
18840
0
  if (n > ((size_t)(io2_w - iop_w))) {
18841
0
    n = (size_t)(io2_w - iop_w);
18842
0
  }
18843
0
  const uint8_t* iop_r = *ptr_iop_r;
18844
0
  if (n > ((size_t)(io2_r - iop_r))) {
18845
0
    n = (size_t)(io2_r - iop_r);
18846
0
  }
18847
0
  if (n > 0) {
18848
0
    memmove(iop_w, iop_r, n);
18849
0
    *ptr_iop_w += n;
18850
0
    *ptr_iop_r += n;
18851
0
  }
18852
0
  return (uint32_t)(n);
18853
0
}
18854
18855
static inline uint32_t  //
18856
wuffs_private_impl__io_writer__limited_copy_u32_from_slice(
18857
    uint8_t** ptr_iop_w,
18858
    uint8_t* io2_w,
18859
    uint32_t length,
18860
0
    wuffs_base__slice_u8 src) {
18861
0
  uint8_t* iop_w = *ptr_iop_w;
18862
0
  size_t n = src.len;
18863
0
  if (n > length) {
18864
0
    n = length;
18865
0
  }
18866
0
  if (n > ((size_t)(io2_w - iop_w))) {
18867
0
    n = (size_t)(io2_w - iop_w);
18868
0
  }
18869
0
  if (n > 0) {
18870
0
    memmove(iop_w, src.ptr, n);
18871
0
    *ptr_iop_w += n;
18872
0
  }
18873
0
  return (uint32_t)(n);
18874
0
}
18875
18876
static inline wuffs_base__io_buffer*  //
18877
wuffs_private_impl__io_writer__set(wuffs_base__io_buffer* b,
18878
                                   uint8_t** ptr_iop_w,
18879
                                   uint8_t** ptr_io0_w,
18880
                                   uint8_t** ptr_io1_w,
18881
                                   uint8_t** ptr_io2_w,
18882
                                   wuffs_base__slice_u8 data,
18883
0
                                   uint64_t history_position) {
18884
0
  b->data = data;
18885
0
  b->meta.wi = 0;
18886
0
  b->meta.ri = 0;
18887
0
  b->meta.pos = history_position;
18888
0
  b->meta.closed = false;
18889
0
18890
0
  *ptr_iop_w = data.ptr;
18891
0
  *ptr_io0_w = data.ptr;
18892
0
  *ptr_io1_w = data.ptr;
18893
0
  *ptr_io2_w = data.ptr + data.len;
18894
0
18895
0
  return b;
18896
0
}
18897
18898
// ---------------- I/O (Utility)
18899
18900
#define wuffs_base__utility__empty_io_reader wuffs_base__empty_io_reader
18901
#define wuffs_base__utility__empty_io_writer wuffs_base__empty_io_writer
18902
18903
// ---------------- Tokens
18904
18905
// ---------------- Tokens (Utility)
18906
18907
// ---------------- Memory Allocation
18908
18909
// ---------------- Images
18910
18911
WUFFS_BASE__MAYBE_STATIC uint64_t  //
18912
wuffs_base__pixel_swizzler__limited_swizzle_u32_interleaved_from_reader(
18913
    const wuffs_base__pixel_swizzler* p,
18914
    uint32_t up_to_num_pixels,
18915
    wuffs_base__slice_u8 dst,
18916
    wuffs_base__slice_u8 dst_palette,
18917
    const uint8_t** ptr_iop_r,
18918
    const uint8_t* io2_r);
18919
18920
WUFFS_BASE__MAYBE_STATIC uint64_t  //
18921
wuffs_base__pixel_swizzler__swizzle_interleaved_from_reader(
18922
    const wuffs_base__pixel_swizzler* p,
18923
    wuffs_base__slice_u8 dst,
18924
    wuffs_base__slice_u8 dst_palette,
18925
    const uint8_t** ptr_iop_r,
18926
    const uint8_t* io2_r);
18927
18928
WUFFS_BASE__MAYBE_STATIC uint64_t  //
18929
wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(
18930
    const wuffs_base__pixel_swizzler* p,
18931
    wuffs_base__slice_u8 dst,
18932
    wuffs_base__slice_u8 dst_palette,
18933
    uint64_t num_pixels);
18934
18935
WUFFS_BASE__MAYBE_STATIC wuffs_base__status  //
18936
wuffs_base__pixel_swizzler__swizzle_ycck(
18937
    const wuffs_base__pixel_swizzler* p,
18938
    wuffs_base__pixel_buffer* dst,
18939
    wuffs_base__slice_u8 dst_palette,
18940
    uint32_t x_min_incl,
18941
    uint32_t x_max_excl,
18942
    uint32_t y_min_incl,
18943
    uint32_t y_max_excl,
18944
    wuffs_base__slice_u8 src0,
18945
    wuffs_base__slice_u8 src1,
18946
    wuffs_base__slice_u8 src2,
18947
    wuffs_base__slice_u8 src3,
18948
    uint32_t width0,
18949
    uint32_t width1,
18950
    uint32_t width2,
18951
    uint32_t width3,
18952
    uint32_t height0,
18953
    uint32_t height1,
18954
    uint32_t height2,
18955
    uint32_t height3,
18956
    uint32_t stride0,
18957
    uint32_t stride1,
18958
    uint32_t stride2,
18959
    uint32_t stride3,
18960
    uint8_t h0,
18961
    uint8_t h1,
18962
    uint8_t h2,
18963
    uint8_t h3,
18964
    uint8_t v0,
18965
    uint8_t v1,
18966
    uint8_t v2,
18967
    uint8_t v3,
18968
    bool is_rgb_or_cmyk,
18969
    bool triangle_filter_for_2to1,
18970
    wuffs_base__slice_u8 scratch_buffer_2k);
18971
18972
// ---------------- Images (Utility)
18973
18974
2.66k
#define wuffs_base__utility__make_pixel_format wuffs_base__make_pixel_format
18975
18976
// ---------------- String Conversions
18977
18978
// ---------------- Unicode and UTF-8
18979
18980
// ----------------
18981
18982
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \
18983
    defined(WUFFS_CONFIG__MODULE__BASE__CORE)
18984
18985
const uint8_t wuffs_private_impl__low_bits_mask__u8[8] = {
18986
    0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F,
18987
};
18988
18989
const uint16_t wuffs_private_impl__low_bits_mask__u16[16] = {
18990
    0x0000, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F, 0x003F, 0x007F,
18991
    0x00FF, 0x01FF, 0x03FF, 0x07FF, 0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF,
18992
};
18993
18994
const uint32_t wuffs_private_impl__low_bits_mask__u32[32] = {
18995
    0x00000000, 0x00000001, 0x00000003, 0x00000007, 0x0000000F, 0x0000001F,
18996
    0x0000003F, 0x0000007F, 0x000000FF, 0x000001FF, 0x000003FF, 0x000007FF,
18997
    0x00000FFF, 0x00001FFF, 0x00003FFF, 0x00007FFF, 0x0000FFFF, 0x0001FFFF,
18998
    0x0003FFFF, 0x0007FFFF, 0x000FFFFF, 0x001FFFFF, 0x003FFFFF, 0x007FFFFF,
18999
    0x00FFFFFF, 0x01FFFFFF, 0x03FFFFFF, 0x07FFFFFF, 0x0FFFFFFF, 0x1FFFFFFF,
19000
    0x3FFFFFFF, 0x7FFFFFFF,
19001
};
19002
19003
const uint64_t wuffs_private_impl__low_bits_mask__u64[64] = {
19004
    0x0000000000000000, 0x0000000000000001, 0x0000000000000003,
19005
    0x0000000000000007, 0x000000000000000F, 0x000000000000001F,
19006
    0x000000000000003F, 0x000000000000007F, 0x00000000000000FF,
19007
    0x00000000000001FF, 0x00000000000003FF, 0x00000000000007FF,
19008
    0x0000000000000FFF, 0x0000000000001FFF, 0x0000000000003FFF,
19009
    0x0000000000007FFF, 0x000000000000FFFF, 0x000000000001FFFF,
19010
    0x000000000003FFFF, 0x000000000007FFFF, 0x00000000000FFFFF,
19011
    0x00000000001FFFFF, 0x00000000003FFFFF, 0x00000000007FFFFF,
19012
    0x0000000000FFFFFF, 0x0000000001FFFFFF, 0x0000000003FFFFFF,
19013
    0x0000000007FFFFFF, 0x000000000FFFFFFF, 0x000000001FFFFFFF,
19014
    0x000000003FFFFFFF, 0x000000007FFFFFFF, 0x00000000FFFFFFFF,
19015
    0x00000001FFFFFFFF, 0x00000003FFFFFFFF, 0x00000007FFFFFFFF,
19016
    0x0000000FFFFFFFFF, 0x0000001FFFFFFFFF, 0x0000003FFFFFFFFF,
19017
    0x0000007FFFFFFFFF, 0x000000FFFFFFFFFF, 0x000001FFFFFFFFFF,
19018
    0x000003FFFFFFFFFF, 0x000007FFFFFFFFFF, 0x00000FFFFFFFFFFF,
19019
    0x00001FFFFFFFFFFF, 0x00003FFFFFFFFFFF, 0x00007FFFFFFFFFFF,
19020
    0x0000FFFFFFFFFFFF, 0x0001FFFFFFFFFFFF, 0x0003FFFFFFFFFFFF,
19021
    0x0007FFFFFFFFFFFF, 0x000FFFFFFFFFFFFF, 0x001FFFFFFFFFFFFF,
19022
    0x003FFFFFFFFFFFFF, 0x007FFFFFFFFFFFFF, 0x00FFFFFFFFFFFFFF,
19023
    0x01FFFFFFFFFFFFFF, 0x03FFFFFFFFFFFFFF, 0x07FFFFFFFFFFFFFF,
19024
    0x0FFFFFFFFFFFFFFF, 0x1FFFFFFFFFFFFFFF, 0x3FFFFFFFFFFFFFFF,
19025
    0x7FFFFFFFFFFFFFFF,
19026
};
19027
19028
const uint32_t wuffs_private_impl__pixel_format__bits_per_channel[16] = {
19029
    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
19030
    0x08, 0x0A, 0x0C, 0x10, 0x18, 0x20, 0x30, 0x40,
19031
};
19032
19033
const char wuffs_base__note__i_o_redirect[] = "@base: I/O redirect";
19034
const char wuffs_base__note__end_of_data[] = "@base: end of data";
19035
const char wuffs_base__note__metadata_reported[] = "@base: metadata reported";
19036
const char wuffs_base__suspension__even_more_information[] = "$base: even more information";
19037
const char wuffs_base__suspension__mispositioned_read[] = "$base: mispositioned read";
19038
const char wuffs_base__suspension__mispositioned_write[] = "$base: mispositioned write";
19039
const char wuffs_base__suspension__short_read[] = "$base: short read";
19040
const char wuffs_base__suspension__short_workbuf[] = "$base: short workbuf";
19041
const char wuffs_base__suspension__short_write[] = "$base: short write";
19042
const char wuffs_base__error__bad_i_o_position[] = "#base: bad I/O position";
19043
const char wuffs_base__error__bad_argument_length_too_short[] = "#base: bad argument (length too short)";
19044
const char wuffs_base__error__bad_argument[] = "#base: bad argument";
19045
const char wuffs_base__error__bad_call_sequence[] = "#base: bad call sequence";
19046
const char wuffs_base__error__bad_data[] = "#base: bad data";
19047
const char wuffs_base__error__bad_receiver[] = "#base: bad receiver";
19048
const char wuffs_base__error__bad_restart[] = "#base: bad restart";
19049
const char wuffs_base__error__bad_sizeof_receiver[] = "#base: bad sizeof receiver";
19050
const char wuffs_base__error__bad_vtable[] = "#base: bad vtable";
19051
const char wuffs_base__error__bad_workbuf_length[] = "#base: bad workbuf length";
19052
const char wuffs_base__error__bad_wuffs_version[] = "#base: bad wuffs version";
19053
const char wuffs_base__error__cannot_return_a_suspension[] = "#base: cannot return a suspension";
19054
const char wuffs_base__error__disabled_by_wuffs_config_dst_pixel_format_enable_allowlist[] = "#base: disabled by WUFFS_CONFIG__DST_PIXEL_FORMAT__ENABLE_ALLOWLIST";
19055
const char wuffs_base__error__disabled_by_previous_error[] = "#base: disabled by previous error";
19056
const char wuffs_base__error__initialize_falsely_claimed_already_zeroed[] = "#base: initialize falsely claimed already zeroed";
19057
const char wuffs_base__error__initialize_not_called[] = "#base: initialize not called";
19058
const char wuffs_base__error__insufficient_history[] = "#base: insufficient history";
19059
const char wuffs_base__error__interleaved_coroutine_calls[] = "#base: interleaved coroutine calls";
19060
const char wuffs_base__error__no_more_information[] = "#base: no more information";
19061
const char wuffs_base__error__not_enough_data[] = "#base: not enough data";
19062
const char wuffs_base__error__out_of_bounds[] = "#base: out of bounds";
19063
const char wuffs_base__error__unsupported_image_dimension[] = "#base: unsupported image dimension";
19064
const char wuffs_base__error__unsupported_method[] = "#base: unsupported method";
19065
const char wuffs_base__error__unsupported_option[] = "#base: unsupported option";
19066
const char wuffs_base__error__unsupported_pixel_swizzler_option[] = "#base: unsupported pixel swizzler option";
19067
const char wuffs_base__error__too_much_data[] = "#base: too much data";
19068
19069
const char wuffs_base__hasher_u32__vtable_name[] = "{vtable}wuffs_base__hasher_u32";
19070
const char wuffs_base__hasher_u64__vtable_name[] = "{vtable}wuffs_base__hasher_u64";
19071
const char wuffs_base__hasher_bitvec256__vtable_name[] = "{vtable}wuffs_base__hasher_bitvec256";
19072
const char wuffs_base__image_decoder__vtable_name[] = "{vtable}wuffs_base__image_decoder";
19073
const char wuffs_base__io_transformer__vtable_name[] = "{vtable}wuffs_base__io_transformer";
19074
const char wuffs_base__token_decoder__vtable_name[] = "{vtable}wuffs_base__token_decoder";
19075
19076
#endif  // !defined(WUFFS_CONFIG__MODULES) ||
19077
        // defined(WUFFS_CONFIG__MODULE__BASE)  ||
19078
        // defined(WUFFS_CONFIG__MODULE__BASE__CORE)
19079
19080
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \
19081
    defined(WUFFS_CONFIG__MODULE__BASE__INTERFACES)
19082
19083
// ---------------- Interface Definitions.
19084
19085
WUFFS_BASE__GENERATED_C_CODE
19086
WUFFS_BASE__MAYBE_STATIC uint32_t
19087
wuffs_base__hasher_u32__checksum_u32(
19088
0
    const wuffs_base__hasher_u32* self) {
19089
0
  if (!self) {
19090
0
    return 0;
19091
0
  }
19092
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
19093
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
19094
0
    return 0;
19095
0
  }
19096
19097
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19098
0
  int i;
19099
0
  for (i = 0; i < 63; i++) {
19100
0
    if (v->vtable_name == wuffs_base__hasher_u32__vtable_name) {
19101
0
      const wuffs_base__hasher_u32__func_ptrs* func_ptrs =
19102
0
          (const wuffs_base__hasher_u32__func_ptrs*)(v->function_pointers);
19103
0
      return (*func_ptrs->checksum_u32)(self);
19104
0
    } else if (v->vtable_name == NULL) {
19105
0
      break;
19106
0
    }
19107
0
    v++;
19108
0
  }
19109
19110
0
  return 0;
19111
0
}
19112
19113
WUFFS_BASE__GENERATED_C_CODE
19114
WUFFS_BASE__MAYBE_STATIC uint64_t
19115
wuffs_base__hasher_u32__get_quirk(
19116
    const wuffs_base__hasher_u32* self,
19117
0
    uint32_t a_key) {
19118
0
  if (!self) {
19119
0
    return 0;
19120
0
  }
19121
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
19122
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
19123
0
    return 0;
19124
0
  }
19125
19126
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19127
0
  int i;
19128
0
  for (i = 0; i < 63; i++) {
19129
0
    if (v->vtable_name == wuffs_base__hasher_u32__vtable_name) {
19130
0
      const wuffs_base__hasher_u32__func_ptrs* func_ptrs =
19131
0
          (const wuffs_base__hasher_u32__func_ptrs*)(v->function_pointers);
19132
0
      return (*func_ptrs->get_quirk)(self, a_key);
19133
0
    } else if (v->vtable_name == NULL) {
19134
0
      break;
19135
0
    }
19136
0
    v++;
19137
0
  }
19138
19139
0
  return 0;
19140
0
}
19141
19142
WUFFS_BASE__GENERATED_C_CODE
19143
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
19144
wuffs_base__hasher_u32__set_quirk(
19145
    wuffs_base__hasher_u32* self,
19146
    uint32_t a_key,
19147
0
    uint64_t a_value) {
19148
0
  if (!self) {
19149
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
19150
0
  }
19151
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
19152
0
    return wuffs_base__make_status(
19153
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
19154
0
            ? wuffs_base__error__disabled_by_previous_error
19155
0
            : wuffs_base__error__initialize_not_called);
19156
0
  }
19157
19158
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19159
0
  int i;
19160
0
  for (i = 0; i < 63; i++) {
19161
0
    if (v->vtable_name == wuffs_base__hasher_u32__vtable_name) {
19162
0
      const wuffs_base__hasher_u32__func_ptrs* func_ptrs =
19163
0
          (const wuffs_base__hasher_u32__func_ptrs*)(v->function_pointers);
19164
0
      return (*func_ptrs->set_quirk)(self, a_key, a_value);
19165
0
    } else if (v->vtable_name == NULL) {
19166
0
      break;
19167
0
    }
19168
0
    v++;
19169
0
  }
19170
19171
0
  return wuffs_base__make_status(wuffs_base__error__bad_vtable);
19172
0
}
19173
19174
WUFFS_BASE__GENERATED_C_CODE
19175
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
19176
wuffs_base__hasher_u32__update(
19177
    wuffs_base__hasher_u32* self,
19178
0
    wuffs_base__slice_u8 a_x) {
19179
0
  if (!self) {
19180
0
    return wuffs_base__make_empty_struct();
19181
0
  }
19182
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
19183
0
    return wuffs_base__make_empty_struct();
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__hasher_u32__vtable_name) {
19190
0
      const wuffs_base__hasher_u32__func_ptrs* func_ptrs =
19191
0
          (const wuffs_base__hasher_u32__func_ptrs*)(v->function_pointers);
19192
0
      return (*func_ptrs->update)(self, a_x);
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_empty_struct();
19200
0
}
19201
19202
WUFFS_BASE__GENERATED_C_CODE
19203
WUFFS_BASE__MAYBE_STATIC uint32_t
19204
wuffs_base__hasher_u32__update_u32(
19205
    wuffs_base__hasher_u32* self,
19206
0
    wuffs_base__slice_u8 a_x) {
19207
0
  if (!self) {
19208
0
    return 0;
19209
0
  }
19210
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
19211
0
    return 0;
19212
0
  }
19213
19214
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19215
0
  int i;
19216
0
  for (i = 0; i < 63; i++) {
19217
0
    if (v->vtable_name == wuffs_base__hasher_u32__vtable_name) {
19218
0
      const wuffs_base__hasher_u32__func_ptrs* func_ptrs =
19219
0
          (const wuffs_base__hasher_u32__func_ptrs*)(v->function_pointers);
19220
0
      return (*func_ptrs->update_u32)(self, a_x);
19221
0
    } else if (v->vtable_name == NULL) {
19222
0
      break;
19223
0
    }
19224
0
    v++;
19225
0
  }
19226
19227
0
  return 0;
19228
0
}
19229
19230
// --------
19231
19232
WUFFS_BASE__GENERATED_C_CODE
19233
WUFFS_BASE__MAYBE_STATIC uint64_t
19234
wuffs_base__hasher_u64__checksum_u64(
19235
0
    const wuffs_base__hasher_u64* self) {
19236
0
  if (!self) {
19237
0
    return 0;
19238
0
  }
19239
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
19240
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
19241
0
    return 0;
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__hasher_u64__vtable_name) {
19248
0
      const wuffs_base__hasher_u64__func_ptrs* func_ptrs =
19249
0
          (const wuffs_base__hasher_u64__func_ptrs*)(v->function_pointers);
19250
0
      return (*func_ptrs->checksum_u64)(self);
19251
0
    } else if (v->vtable_name == NULL) {
19252
0
      break;
19253
0
    }
19254
0
    v++;
19255
0
  }
19256
19257
0
  return 0;
19258
0
}
19259
19260
WUFFS_BASE__GENERATED_C_CODE
19261
WUFFS_BASE__MAYBE_STATIC uint64_t
19262
wuffs_base__hasher_u64__get_quirk(
19263
    const wuffs_base__hasher_u64* 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__hasher_u64__vtable_name) {
19277
0
      const wuffs_base__hasher_u64__func_ptrs* func_ptrs =
19278
0
          (const wuffs_base__hasher_u64__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__hasher_u64__set_quirk(
19292
    wuffs_base__hasher_u64* 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__hasher_u64__vtable_name) {
19309
0
      const wuffs_base__hasher_u64__func_ptrs* func_ptrs =
19310
0
          (const wuffs_base__hasher_u64__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__empty_struct
19323
wuffs_base__hasher_u64__update(
19324
    wuffs_base__hasher_u64* self,
19325
0
    wuffs_base__slice_u8 a_x) {
19326
0
  if (!self) {
19327
0
    return wuffs_base__make_empty_struct();
19328
0
  }
19329
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
19330
0
    return wuffs_base__make_empty_struct();
19331
0
  }
19332
19333
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19334
0
  int i;
19335
0
  for (i = 0; i < 63; i++) {
19336
0
    if (v->vtable_name == wuffs_base__hasher_u64__vtable_name) {
19337
0
      const wuffs_base__hasher_u64__func_ptrs* func_ptrs =
19338
0
          (const wuffs_base__hasher_u64__func_ptrs*)(v->function_pointers);
19339
0
      return (*func_ptrs->update)(self, a_x);
19340
0
    } else if (v->vtable_name == NULL) {
19341
0
      break;
19342
0
    }
19343
0
    v++;
19344
0
  }
19345
19346
0
  return wuffs_base__make_empty_struct();
19347
0
}
19348
19349
WUFFS_BASE__GENERATED_C_CODE
19350
WUFFS_BASE__MAYBE_STATIC uint64_t
19351
wuffs_base__hasher_u64__update_u64(
19352
    wuffs_base__hasher_u64* self,
19353
0
    wuffs_base__slice_u8 a_x) {
19354
0
  if (!self) {
19355
0
    return 0;
19356
0
  }
19357
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
19358
0
    return 0;
19359
0
  }
19360
19361
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19362
0
  int i;
19363
0
  for (i = 0; i < 63; i++) {
19364
0
    if (v->vtable_name == wuffs_base__hasher_u64__vtable_name) {
19365
0
      const wuffs_base__hasher_u64__func_ptrs* func_ptrs =
19366
0
          (const wuffs_base__hasher_u64__func_ptrs*)(v->function_pointers);
19367
0
      return (*func_ptrs->update_u64)(self, a_x);
19368
0
    } else if (v->vtable_name == NULL) {
19369
0
      break;
19370
0
    }
19371
0
    v++;
19372
0
  }
19373
19374
0
  return 0;
19375
0
}
19376
19377
// --------
19378
19379
WUFFS_BASE__GENERATED_C_CODE
19380
WUFFS_BASE__MAYBE_STATIC wuffs_base__bitvec256
19381
wuffs_base__hasher_bitvec256__checksum_bitvec256(
19382
0
    const wuffs_base__hasher_bitvec256* self) {
19383
0
  if (!self) {
19384
0
    return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u);
19385
0
  }
19386
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
19387
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
19388
0
    return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u);
19389
0
  }
19390
19391
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19392
0
  int i;
19393
0
  for (i = 0; i < 63; i++) {
19394
0
    if (v->vtable_name == wuffs_base__hasher_bitvec256__vtable_name) {
19395
0
      const wuffs_base__hasher_bitvec256__func_ptrs* func_ptrs =
19396
0
          (const wuffs_base__hasher_bitvec256__func_ptrs*)(v->function_pointers);
19397
0
      return (*func_ptrs->checksum_bitvec256)(self);
19398
0
    } else if (v->vtable_name == NULL) {
19399
0
      break;
19400
0
    }
19401
0
    v++;
19402
0
  }
19403
19404
0
  return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u);
19405
0
}
19406
19407
WUFFS_BASE__GENERATED_C_CODE
19408
WUFFS_BASE__MAYBE_STATIC uint64_t
19409
wuffs_base__hasher_bitvec256__get_quirk(
19410
    const wuffs_base__hasher_bitvec256* self,
19411
0
    uint32_t a_key) {
19412
0
  if (!self) {
19413
0
    return 0;
19414
0
  }
19415
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
19416
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
19417
0
    return 0;
19418
0
  }
19419
19420
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19421
0
  int i;
19422
0
  for (i = 0; i < 63; i++) {
19423
0
    if (v->vtable_name == wuffs_base__hasher_bitvec256__vtable_name) {
19424
0
      const wuffs_base__hasher_bitvec256__func_ptrs* func_ptrs =
19425
0
          (const wuffs_base__hasher_bitvec256__func_ptrs*)(v->function_pointers);
19426
0
      return (*func_ptrs->get_quirk)(self, a_key);
19427
0
    } else if (v->vtable_name == NULL) {
19428
0
      break;
19429
0
    }
19430
0
    v++;
19431
0
  }
19432
19433
0
  return 0;
19434
0
}
19435
19436
WUFFS_BASE__GENERATED_C_CODE
19437
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
19438
wuffs_base__hasher_bitvec256__set_quirk(
19439
    wuffs_base__hasher_bitvec256* self,
19440
    uint32_t a_key,
19441
0
    uint64_t a_value) {
19442
0
  if (!self) {
19443
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
19444
0
  }
19445
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
19446
0
    return wuffs_base__make_status(
19447
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
19448
0
            ? wuffs_base__error__disabled_by_previous_error
19449
0
            : wuffs_base__error__initialize_not_called);
19450
0
  }
19451
19452
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19453
0
  int i;
19454
0
  for (i = 0; i < 63; i++) {
19455
0
    if (v->vtable_name == wuffs_base__hasher_bitvec256__vtable_name) {
19456
0
      const wuffs_base__hasher_bitvec256__func_ptrs* func_ptrs =
19457
0
          (const wuffs_base__hasher_bitvec256__func_ptrs*)(v->function_pointers);
19458
0
      return (*func_ptrs->set_quirk)(self, a_key, a_value);
19459
0
    } else if (v->vtable_name == NULL) {
19460
0
      break;
19461
0
    }
19462
0
    v++;
19463
0
  }
19464
19465
0
  return wuffs_base__make_status(wuffs_base__error__bad_vtable);
19466
0
}
19467
19468
WUFFS_BASE__GENERATED_C_CODE
19469
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
19470
wuffs_base__hasher_bitvec256__update(
19471
    wuffs_base__hasher_bitvec256* self,
19472
0
    wuffs_base__slice_u8 a_x) {
19473
0
  if (!self) {
19474
0
    return wuffs_base__make_empty_struct();
19475
0
  }
19476
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
19477
0
    return wuffs_base__make_empty_struct();
19478
0
  }
19479
19480
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19481
0
  int i;
19482
0
  for (i = 0; i < 63; i++) {
19483
0
    if (v->vtable_name == wuffs_base__hasher_bitvec256__vtable_name) {
19484
0
      const wuffs_base__hasher_bitvec256__func_ptrs* func_ptrs =
19485
0
          (const wuffs_base__hasher_bitvec256__func_ptrs*)(v->function_pointers);
19486
0
      return (*func_ptrs->update)(self, a_x);
19487
0
    } else if (v->vtable_name == NULL) {
19488
0
      break;
19489
0
    }
19490
0
    v++;
19491
0
  }
19492
19493
0
  return wuffs_base__make_empty_struct();
19494
0
}
19495
19496
WUFFS_BASE__GENERATED_C_CODE
19497
WUFFS_BASE__MAYBE_STATIC wuffs_base__bitvec256
19498
wuffs_base__hasher_bitvec256__update_bitvec256(
19499
    wuffs_base__hasher_bitvec256* self,
19500
0
    wuffs_base__slice_u8 a_x) {
19501
0
  if (!self) {
19502
0
    return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u);
19503
0
  }
19504
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
19505
0
    return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u);
19506
0
  }
19507
19508
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19509
0
  int i;
19510
0
  for (i = 0; i < 63; i++) {
19511
0
    if (v->vtable_name == wuffs_base__hasher_bitvec256__vtable_name) {
19512
0
      const wuffs_base__hasher_bitvec256__func_ptrs* func_ptrs =
19513
0
          (const wuffs_base__hasher_bitvec256__func_ptrs*)(v->function_pointers);
19514
0
      return (*func_ptrs->update_bitvec256)(self, a_x);
19515
0
    } else if (v->vtable_name == NULL) {
19516
0
      break;
19517
0
    }
19518
0
    v++;
19519
0
  }
19520
19521
0
  return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u);
19522
0
}
19523
19524
// --------
19525
19526
WUFFS_BASE__GENERATED_C_CODE
19527
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
19528
wuffs_base__image_decoder__decode_frame(
19529
    wuffs_base__image_decoder* self,
19530
    wuffs_base__pixel_buffer* a_dst,
19531
    wuffs_base__io_buffer* a_src,
19532
    wuffs_base__pixel_blend a_blend,
19533
    wuffs_base__slice_u8 a_workbuf,
19534
2.66k
    wuffs_base__decode_frame_options* a_opts) {
19535
2.66k
  if (!self) {
19536
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
19537
0
  }
19538
2.66k
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
19539
0
    return wuffs_base__make_status(
19540
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
19541
0
            ? wuffs_base__error__disabled_by_previous_error
19542
0
            : wuffs_base__error__initialize_not_called);
19543
0
  }
19544
19545
2.66k
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19546
2.66k
  int i;
19547
2.66k
  for (i = 0; i < 63; i++) {
19548
2.66k
    if (v->vtable_name == wuffs_base__image_decoder__vtable_name) {
19549
2.66k
      const wuffs_base__image_decoder__func_ptrs* func_ptrs =
19550
2.66k
          (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers);
19551
2.66k
      return (*func_ptrs->decode_frame)(self, a_dst, a_src, a_blend, a_workbuf, a_opts);
19552
2.66k
    } else if (v->vtable_name == NULL) {
19553
0
      break;
19554
0
    }
19555
0
    v++;
19556
0
  }
19557
19558
0
  return wuffs_base__make_status(wuffs_base__error__bad_vtable);
19559
2.66k
}
19560
19561
WUFFS_BASE__GENERATED_C_CODE
19562
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
19563
wuffs_base__image_decoder__decode_frame_config(
19564
    wuffs_base__image_decoder* self,
19565
    wuffs_base__frame_config* a_dst,
19566
2.67k
    wuffs_base__io_buffer* a_src) {
19567
2.67k
  if (!self) {
19568
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
19569
0
  }
19570
2.67k
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
19571
0
    return wuffs_base__make_status(
19572
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
19573
0
            ? wuffs_base__error__disabled_by_previous_error
19574
0
            : wuffs_base__error__initialize_not_called);
19575
0
  }
19576
19577
2.67k
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19578
2.67k
  int i;
19579
2.67k
  for (i = 0; i < 63; i++) {
19580
2.67k
    if (v->vtable_name == wuffs_base__image_decoder__vtable_name) {
19581
2.67k
      const wuffs_base__image_decoder__func_ptrs* func_ptrs =
19582
2.67k
          (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers);
19583
2.67k
      return (*func_ptrs->decode_frame_config)(self, a_dst, a_src);
19584
2.67k
    } else if (v->vtable_name == NULL) {
19585
0
      break;
19586
0
    }
19587
0
    v++;
19588
0
  }
19589
19590
0
  return wuffs_base__make_status(wuffs_base__error__bad_vtable);
19591
2.67k
}
19592
19593
WUFFS_BASE__GENERATED_C_CODE
19594
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
19595
wuffs_base__image_decoder__decode_image_config(
19596
    wuffs_base__image_decoder* self,
19597
    wuffs_base__image_config* a_dst,
19598
3.72k
    wuffs_base__io_buffer* a_src) {
19599
3.72k
  if (!self) {
19600
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
19601
0
  }
19602
3.72k
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
19603
0
    return wuffs_base__make_status(
19604
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
19605
0
            ? wuffs_base__error__disabled_by_previous_error
19606
0
            : wuffs_base__error__initialize_not_called);
19607
0
  }
19608
19609
3.72k
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19610
3.72k
  int i;
19611
3.72k
  for (i = 0; i < 63; i++) {
19612
3.72k
    if (v->vtable_name == wuffs_base__image_decoder__vtable_name) {
19613
3.72k
      const wuffs_base__image_decoder__func_ptrs* func_ptrs =
19614
3.72k
          (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers);
19615
3.72k
      return (*func_ptrs->decode_image_config)(self, a_dst, a_src);
19616
3.72k
    } else if (v->vtable_name == NULL) {
19617
0
      break;
19618
0
    }
19619
0
    v++;
19620
0
  }
19621
19622
0
  return wuffs_base__make_status(wuffs_base__error__bad_vtable);
19623
3.72k
}
19624
19625
WUFFS_BASE__GENERATED_C_CODE
19626
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
19627
wuffs_base__image_decoder__frame_dirty_rect(
19628
2.66k
    const wuffs_base__image_decoder* self) {
19629
2.66k
  if (!self) {
19630
0
    return wuffs_base__utility__empty_rect_ie_u32();
19631
0
  }
19632
2.66k
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
19633
2.66k
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
19634
0
    return wuffs_base__utility__empty_rect_ie_u32();
19635
0
  }
19636
19637
2.66k
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19638
2.66k
  int i;
19639
2.66k
  for (i = 0; i < 63; i++) {
19640
2.66k
    if (v->vtable_name == wuffs_base__image_decoder__vtable_name) {
19641
2.66k
      const wuffs_base__image_decoder__func_ptrs* func_ptrs =
19642
2.66k
          (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers);
19643
2.66k
      return (*func_ptrs->frame_dirty_rect)(self);
19644
2.66k
    } else if (v->vtable_name == NULL) {
19645
0
      break;
19646
0
    }
19647
0
    v++;
19648
0
  }
19649
19650
0
  return wuffs_base__utility__empty_rect_ie_u32();
19651
2.66k
}
19652
19653
WUFFS_BASE__GENERATED_C_CODE
19654
WUFFS_BASE__MAYBE_STATIC uint64_t
19655
wuffs_base__image_decoder__get_quirk(
19656
    const wuffs_base__image_decoder* self,
19657
0
    uint32_t a_key) {
19658
0
  if (!self) {
19659
0
    return 0;
19660
0
  }
19661
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
19662
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
19663
0
    return 0;
19664
0
  }
19665
19666
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19667
0
  int i;
19668
0
  for (i = 0; i < 63; i++) {
19669
0
    if (v->vtable_name == wuffs_base__image_decoder__vtable_name) {
19670
0
      const wuffs_base__image_decoder__func_ptrs* func_ptrs =
19671
0
          (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers);
19672
0
      return (*func_ptrs->get_quirk)(self, a_key);
19673
0
    } else if (v->vtable_name == NULL) {
19674
0
      break;
19675
0
    }
19676
0
    v++;
19677
0
  }
19678
19679
0
  return 0;
19680
0
}
19681
19682
WUFFS_BASE__GENERATED_C_CODE
19683
WUFFS_BASE__MAYBE_STATIC uint32_t
19684
wuffs_base__image_decoder__num_animation_loops(
19685
0
    const wuffs_base__image_decoder* self) {
19686
0
  if (!self) {
19687
0
    return 0;
19688
0
  }
19689
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
19690
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
19691
0
    return 0;
19692
0
  }
19693
19694
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19695
0
  int i;
19696
0
  for (i = 0; i < 63; i++) {
19697
0
    if (v->vtable_name == wuffs_base__image_decoder__vtable_name) {
19698
0
      const wuffs_base__image_decoder__func_ptrs* func_ptrs =
19699
0
          (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers);
19700
0
      return (*func_ptrs->num_animation_loops)(self);
19701
0
    } else if (v->vtable_name == NULL) {
19702
0
      break;
19703
0
    }
19704
0
    v++;
19705
0
  }
19706
19707
0
  return 0;
19708
0
}
19709
19710
WUFFS_BASE__GENERATED_C_CODE
19711
WUFFS_BASE__MAYBE_STATIC uint64_t
19712
wuffs_base__image_decoder__num_decoded_frame_configs(
19713
0
    const wuffs_base__image_decoder* self) {
19714
0
  if (!self) {
19715
0
    return 0;
19716
0
  }
19717
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
19718
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
19719
0
    return 0;
19720
0
  }
19721
19722
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19723
0
  int i;
19724
0
  for (i = 0; i < 63; i++) {
19725
0
    if (v->vtable_name == wuffs_base__image_decoder__vtable_name) {
19726
0
      const wuffs_base__image_decoder__func_ptrs* func_ptrs =
19727
0
          (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers);
19728
0
      return (*func_ptrs->num_decoded_frame_configs)(self);
19729
0
    } else if (v->vtable_name == NULL) {
19730
0
      break;
19731
0
    }
19732
0
    v++;
19733
0
  }
19734
19735
0
  return 0;
19736
0
}
19737
19738
WUFFS_BASE__GENERATED_C_CODE
19739
WUFFS_BASE__MAYBE_STATIC uint64_t
19740
wuffs_base__image_decoder__num_decoded_frames(
19741
0
    const wuffs_base__image_decoder* self) {
19742
0
  if (!self) {
19743
0
    return 0;
19744
0
  }
19745
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
19746
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
19747
0
    return 0;
19748
0
  }
19749
19750
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19751
0
  int i;
19752
0
  for (i = 0; i < 63; i++) {
19753
0
    if (v->vtable_name == wuffs_base__image_decoder__vtable_name) {
19754
0
      const wuffs_base__image_decoder__func_ptrs* func_ptrs =
19755
0
          (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers);
19756
0
      return (*func_ptrs->num_decoded_frames)(self);
19757
0
    } else if (v->vtable_name == NULL) {
19758
0
      break;
19759
0
    }
19760
0
    v++;
19761
0
  }
19762
19763
0
  return 0;
19764
0
}
19765
19766
WUFFS_BASE__GENERATED_C_CODE
19767
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
19768
wuffs_base__image_decoder__restart_frame(
19769
    wuffs_base__image_decoder* self,
19770
    uint64_t a_index,
19771
0
    uint64_t a_io_position) {
19772
0
  if (!self) {
19773
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
19774
0
  }
19775
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
19776
0
    return wuffs_base__make_status(
19777
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
19778
0
            ? wuffs_base__error__disabled_by_previous_error
19779
0
            : wuffs_base__error__initialize_not_called);
19780
0
  }
19781
19782
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19783
0
  int i;
19784
0
  for (i = 0; i < 63; i++) {
19785
0
    if (v->vtable_name == wuffs_base__image_decoder__vtable_name) {
19786
0
      const wuffs_base__image_decoder__func_ptrs* func_ptrs =
19787
0
          (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers);
19788
0
      return (*func_ptrs->restart_frame)(self, a_index, a_io_position);
19789
0
    } else if (v->vtable_name == NULL) {
19790
0
      break;
19791
0
    }
19792
0
    v++;
19793
0
  }
19794
19795
0
  return wuffs_base__make_status(wuffs_base__error__bad_vtable);
19796
0
}
19797
19798
WUFFS_BASE__GENERATED_C_CODE
19799
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
19800
wuffs_base__image_decoder__set_quirk(
19801
    wuffs_base__image_decoder* self,
19802
    uint32_t a_key,
19803
0
    uint64_t a_value) {
19804
0
  if (!self) {
19805
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
19806
0
  }
19807
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
19808
0
    return wuffs_base__make_status(
19809
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
19810
0
            ? wuffs_base__error__disabled_by_previous_error
19811
0
            : wuffs_base__error__initialize_not_called);
19812
0
  }
19813
19814
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19815
0
  int i;
19816
0
  for (i = 0; i < 63; i++) {
19817
0
    if (v->vtable_name == wuffs_base__image_decoder__vtable_name) {
19818
0
      const wuffs_base__image_decoder__func_ptrs* func_ptrs =
19819
0
          (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers);
19820
0
      return (*func_ptrs->set_quirk)(self, a_key, a_value);
19821
0
    } else if (v->vtable_name == NULL) {
19822
0
      break;
19823
0
    }
19824
0
    v++;
19825
0
  }
19826
19827
0
  return wuffs_base__make_status(wuffs_base__error__bad_vtable);
19828
0
}
19829
19830
WUFFS_BASE__GENERATED_C_CODE
19831
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
19832
wuffs_base__image_decoder__set_report_metadata(
19833
    wuffs_base__image_decoder* self,
19834
    uint32_t a_fourcc,
19835
0
    bool a_report) {
19836
0
  if (!self) {
19837
0
    return wuffs_base__make_empty_struct();
19838
0
  }
19839
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
19840
0
    return wuffs_base__make_empty_struct();
19841
0
  }
19842
19843
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19844
0
  int i;
19845
0
  for (i = 0; i < 63; i++) {
19846
0
    if (v->vtable_name == wuffs_base__image_decoder__vtable_name) {
19847
0
      const wuffs_base__image_decoder__func_ptrs* func_ptrs =
19848
0
          (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers);
19849
0
      return (*func_ptrs->set_report_metadata)(self, a_fourcc, a_report);
19850
0
    } else if (v->vtable_name == NULL) {
19851
0
      break;
19852
0
    }
19853
0
    v++;
19854
0
  }
19855
19856
0
  return wuffs_base__make_empty_struct();
19857
0
}
19858
19859
WUFFS_BASE__GENERATED_C_CODE
19860
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
19861
wuffs_base__image_decoder__tell_me_more(
19862
    wuffs_base__image_decoder* self,
19863
    wuffs_base__io_buffer* a_dst,
19864
    wuffs_base__more_information* a_minfo,
19865
0
    wuffs_base__io_buffer* a_src) {
19866
0
  if (!self) {
19867
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
19868
0
  }
19869
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
19870
0
    return wuffs_base__make_status(
19871
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
19872
0
            ? wuffs_base__error__disabled_by_previous_error
19873
0
            : wuffs_base__error__initialize_not_called);
19874
0
  }
19875
19876
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19877
0
  int i;
19878
0
  for (i = 0; i < 63; i++) {
19879
0
    if (v->vtable_name == wuffs_base__image_decoder__vtable_name) {
19880
0
      const wuffs_base__image_decoder__func_ptrs* func_ptrs =
19881
0
          (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers);
19882
0
      return (*func_ptrs->tell_me_more)(self, a_dst, a_minfo, a_src);
19883
0
    } else if (v->vtable_name == NULL) {
19884
0
      break;
19885
0
    }
19886
0
    v++;
19887
0
  }
19888
19889
0
  return wuffs_base__make_status(wuffs_base__error__bad_vtable);
19890
0
}
19891
19892
WUFFS_BASE__GENERATED_C_CODE
19893
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
19894
wuffs_base__image_decoder__workbuf_len(
19895
2.68k
    const wuffs_base__image_decoder* self) {
19896
2.68k
  if (!self) {
19897
0
    return wuffs_base__utility__empty_range_ii_u64();
19898
0
  }
19899
2.68k
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
19900
2.68k
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
19901
0
    return wuffs_base__utility__empty_range_ii_u64();
19902
0
  }
19903
19904
2.68k
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19905
2.68k
  int i;
19906
2.68k
  for (i = 0; i < 63; i++) {
19907
2.68k
    if (v->vtable_name == wuffs_base__image_decoder__vtable_name) {
19908
2.68k
      const wuffs_base__image_decoder__func_ptrs* func_ptrs =
19909
2.68k
          (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers);
19910
2.68k
      return (*func_ptrs->workbuf_len)(self);
19911
2.68k
    } else if (v->vtable_name == NULL) {
19912
0
      break;
19913
0
    }
19914
0
    v++;
19915
0
  }
19916
19917
0
  return wuffs_base__utility__empty_range_ii_u64();
19918
2.68k
}
19919
19920
// --------
19921
19922
WUFFS_BASE__GENERATED_C_CODE
19923
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
19924
wuffs_base__io_transformer__dst_history_retain_length(
19925
0
    const wuffs_base__io_transformer* self) {
19926
0
  if (!self) {
19927
0
    return wuffs_base__utility__make_optional_u63(false, 0u);
19928
0
  }
19929
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
19930
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
19931
0
    return wuffs_base__utility__make_optional_u63(false, 0u);
19932
0
  }
19933
19934
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19935
0
  int i;
19936
0
  for (i = 0; i < 63; i++) {
19937
0
    if (v->vtable_name == wuffs_base__io_transformer__vtable_name) {
19938
0
      const wuffs_base__io_transformer__func_ptrs* func_ptrs =
19939
0
          (const wuffs_base__io_transformer__func_ptrs*)(v->function_pointers);
19940
0
      return (*func_ptrs->dst_history_retain_length)(self);
19941
0
    } else if (v->vtable_name == NULL) {
19942
0
      break;
19943
0
    }
19944
0
    v++;
19945
0
  }
19946
19947
0
  return wuffs_base__utility__make_optional_u63(false, 0u);
19948
0
}
19949
19950
WUFFS_BASE__GENERATED_C_CODE
19951
WUFFS_BASE__MAYBE_STATIC uint64_t
19952
wuffs_base__io_transformer__get_quirk(
19953
    const wuffs_base__io_transformer* self,
19954
0
    uint32_t a_key) {
19955
0
  if (!self) {
19956
0
    return 0;
19957
0
  }
19958
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
19959
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
19960
0
    return 0;
19961
0
  }
19962
19963
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19964
0
  int i;
19965
0
  for (i = 0; i < 63; i++) {
19966
0
    if (v->vtable_name == wuffs_base__io_transformer__vtable_name) {
19967
0
      const wuffs_base__io_transformer__func_ptrs* func_ptrs =
19968
0
          (const wuffs_base__io_transformer__func_ptrs*)(v->function_pointers);
19969
0
      return (*func_ptrs->get_quirk)(self, a_key);
19970
0
    } else if (v->vtable_name == NULL) {
19971
0
      break;
19972
0
    }
19973
0
    v++;
19974
0
  }
19975
19976
0
  return 0;
19977
0
}
19978
19979
WUFFS_BASE__GENERATED_C_CODE
19980
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
19981
wuffs_base__io_transformer__set_quirk(
19982
    wuffs_base__io_transformer* self,
19983
    uint32_t a_key,
19984
0
    uint64_t a_value) {
19985
0
  if (!self) {
19986
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
19987
0
  }
19988
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
19989
0
    return wuffs_base__make_status(
19990
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
19991
0
            ? wuffs_base__error__disabled_by_previous_error
19992
0
            : wuffs_base__error__initialize_not_called);
19993
0
  }
19994
19995
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19996
0
  int i;
19997
0
  for (i = 0; i < 63; i++) {
19998
0
    if (v->vtable_name == wuffs_base__io_transformer__vtable_name) {
19999
0
      const wuffs_base__io_transformer__func_ptrs* func_ptrs =
20000
0
          (const wuffs_base__io_transformer__func_ptrs*)(v->function_pointers);
20001
0
      return (*func_ptrs->set_quirk)(self, a_key, a_value);
20002
0
    } else if (v->vtable_name == NULL) {
20003
0
      break;
20004
0
    }
20005
0
    v++;
20006
0
  }
20007
20008
0
  return wuffs_base__make_status(wuffs_base__error__bad_vtable);
20009
0
}
20010
20011
WUFFS_BASE__GENERATED_C_CODE
20012
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
20013
wuffs_base__io_transformer__transform_io(
20014
    wuffs_base__io_transformer* self,
20015
    wuffs_base__io_buffer* a_dst,
20016
    wuffs_base__io_buffer* a_src,
20017
0
    wuffs_base__slice_u8 a_workbuf) {
20018
0
  if (!self) {
20019
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
20020
0
  }
20021
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
20022
0
    return wuffs_base__make_status(
20023
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
20024
0
            ? wuffs_base__error__disabled_by_previous_error
20025
0
            : wuffs_base__error__initialize_not_called);
20026
0
  }
20027
20028
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
20029
0
  int i;
20030
0
  for (i = 0; i < 63; i++) {
20031
0
    if (v->vtable_name == wuffs_base__io_transformer__vtable_name) {
20032
0
      const wuffs_base__io_transformer__func_ptrs* func_ptrs =
20033
0
          (const wuffs_base__io_transformer__func_ptrs*)(v->function_pointers);
20034
0
      return (*func_ptrs->transform_io)(self, a_dst, a_src, a_workbuf);
20035
0
    } else if (v->vtable_name == NULL) {
20036
0
      break;
20037
0
    }
20038
0
    v++;
20039
0
  }
20040
20041
0
  return wuffs_base__make_status(wuffs_base__error__bad_vtable);
20042
0
}
20043
20044
WUFFS_BASE__GENERATED_C_CODE
20045
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
20046
wuffs_base__io_transformer__workbuf_len(
20047
0
    const wuffs_base__io_transformer* self) {
20048
0
  if (!self) {
20049
0
    return wuffs_base__utility__empty_range_ii_u64();
20050
0
  }
20051
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
20052
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
20053
0
    return wuffs_base__utility__empty_range_ii_u64();
20054
0
  }
20055
20056
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
20057
0
  int i;
20058
0
  for (i = 0; i < 63; i++) {
20059
0
    if (v->vtable_name == wuffs_base__io_transformer__vtable_name) {
20060
0
      const wuffs_base__io_transformer__func_ptrs* func_ptrs =
20061
0
          (const wuffs_base__io_transformer__func_ptrs*)(v->function_pointers);
20062
0
      return (*func_ptrs->workbuf_len)(self);
20063
0
    } else if (v->vtable_name == NULL) {
20064
0
      break;
20065
0
    }
20066
0
    v++;
20067
0
  }
20068
20069
0
  return wuffs_base__utility__empty_range_ii_u64();
20070
0
}
20071
20072
// --------
20073
20074
WUFFS_BASE__GENERATED_C_CODE
20075
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
20076
wuffs_base__token_decoder__decode_tokens(
20077
    wuffs_base__token_decoder* self,
20078
    wuffs_base__token_buffer* a_dst,
20079
    wuffs_base__io_buffer* a_src,
20080
0
    wuffs_base__slice_u8 a_workbuf) {
20081
0
  if (!self) {
20082
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
20083
0
  }
20084
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
20085
0
    return wuffs_base__make_status(
20086
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
20087
0
            ? wuffs_base__error__disabled_by_previous_error
20088
0
            : wuffs_base__error__initialize_not_called);
20089
0
  }
20090
20091
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
20092
0
  int i;
20093
0
  for (i = 0; i < 63; i++) {
20094
0
    if (v->vtable_name == wuffs_base__token_decoder__vtable_name) {
20095
0
      const wuffs_base__token_decoder__func_ptrs* func_ptrs =
20096
0
          (const wuffs_base__token_decoder__func_ptrs*)(v->function_pointers);
20097
0
      return (*func_ptrs->decode_tokens)(self, a_dst, a_src, a_workbuf);
20098
0
    } else if (v->vtable_name == NULL) {
20099
0
      break;
20100
0
    }
20101
0
    v++;
20102
0
  }
20103
20104
0
  return wuffs_base__make_status(wuffs_base__error__bad_vtable);
20105
0
}
20106
20107
WUFFS_BASE__GENERATED_C_CODE
20108
WUFFS_BASE__MAYBE_STATIC uint64_t
20109
wuffs_base__token_decoder__get_quirk(
20110
    const wuffs_base__token_decoder* self,
20111
0
    uint32_t a_key) {
20112
0
  if (!self) {
20113
0
    return 0;
20114
0
  }
20115
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
20116
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
20117
0
    return 0;
20118
0
  }
20119
20120
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
20121
0
  int i;
20122
0
  for (i = 0; i < 63; i++) {
20123
0
    if (v->vtable_name == wuffs_base__token_decoder__vtable_name) {
20124
0
      const wuffs_base__token_decoder__func_ptrs* func_ptrs =
20125
0
          (const wuffs_base__token_decoder__func_ptrs*)(v->function_pointers);
20126
0
      return (*func_ptrs->get_quirk)(self, a_key);
20127
0
    } else if (v->vtable_name == NULL) {
20128
0
      break;
20129
0
    }
20130
0
    v++;
20131
0
  }
20132
20133
0
  return 0;
20134
0
}
20135
20136
WUFFS_BASE__GENERATED_C_CODE
20137
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
20138
wuffs_base__token_decoder__set_quirk(
20139
    wuffs_base__token_decoder* self,
20140
    uint32_t a_key,
20141
0
    uint64_t a_value) {
20142
0
  if (!self) {
20143
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
20144
0
  }
20145
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
20146
0
    return wuffs_base__make_status(
20147
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
20148
0
            ? wuffs_base__error__disabled_by_previous_error
20149
0
            : wuffs_base__error__initialize_not_called);
20150
0
  }
20151
20152
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
20153
0
  int i;
20154
0
  for (i = 0; i < 63; i++) {
20155
0
    if (v->vtable_name == wuffs_base__token_decoder__vtable_name) {
20156
0
      const wuffs_base__token_decoder__func_ptrs* func_ptrs =
20157
0
          (const wuffs_base__token_decoder__func_ptrs*)(v->function_pointers);
20158
0
      return (*func_ptrs->set_quirk)(self, a_key, a_value);
20159
0
    } else if (v->vtable_name == NULL) {
20160
0
      break;
20161
0
    }
20162
0
    v++;
20163
0
  }
20164
20165
0
  return wuffs_base__make_status(wuffs_base__error__bad_vtable);
20166
0
}
20167
20168
WUFFS_BASE__GENERATED_C_CODE
20169
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
20170
wuffs_base__token_decoder__workbuf_len(
20171
0
    const wuffs_base__token_decoder* self) {
20172
0
  if (!self) {
20173
0
    return wuffs_base__utility__empty_range_ii_u64();
20174
0
  }
20175
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
20176
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
20177
0
    return wuffs_base__utility__empty_range_ii_u64();
20178
0
  }
20179
20180
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
20181
0
  int i;
20182
0
  for (i = 0; i < 63; i++) {
20183
0
    if (v->vtable_name == wuffs_base__token_decoder__vtable_name) {
20184
0
      const wuffs_base__token_decoder__func_ptrs* func_ptrs =
20185
0
          (const wuffs_base__token_decoder__func_ptrs*)(v->function_pointers);
20186
0
      return (*func_ptrs->workbuf_len)(self);
20187
0
    } else if (v->vtable_name == NULL) {
20188
0
      break;
20189
0
    }
20190
0
    v++;
20191
0
  }
20192
20193
0
  return wuffs_base__utility__empty_range_ii_u64();
20194
0
}
20195
20196
#endif  // !defined(WUFFS_CONFIG__MODULES) ||
20197
        // defined(WUFFS_CONFIG__MODULE__BASE) ||
20198
        // defined(WUFFS_CONFIG__MODULE__BASE__INTERFACES)
20199
20200
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \
20201
    defined(WUFFS_CONFIG__MODULE__BASE__FLOATCONV)
20202
20203
// ---------------- IEEE 754 Floating Point
20204
20205
// The etc__hpd_left_shift and etc__powers_of_5 tables were printed by
20206
// script/print-hpd-left-shift.go. That script has an optional -comments flag,
20207
// whose output is not copied here, which prints further detail.
20208
//
20209
// These tables are used in
20210
// wuffs_private_impl__high_prec_dec__lshift_num_new_digits.
20211
20212
// wuffs_private_impl__hpd_left_shift[i] encodes the number of new digits
20213
// created after multiplying a positive integer by (1 << i): the additional
20214
// length in the decimal representation. For example, shifting "234" by 3
20215
// (equivalent to multiplying by 8) will produce "1872". Going from a 3-length
20216
// string to a 4-length string means that 1 new digit was added (and existing
20217
// digits may have changed).
20218
//
20219
// Shifting by i can add either N or N-1 new digits, depending on whether the
20220
// original positive integer compares >= or < to the i'th power of 5 (as 10
20221
// equals 2 * 5). Comparison is lexicographic, not numerical.
20222
//
20223
// For example, shifting by 4 (i.e. multiplying by 16) can add 1 or 2 new
20224
// digits, depending on a lexicographic comparison to (5 ** 4), i.e. "625":
20225
//  - ("1"      << 4) is "16",       which adds 1 new digit.
20226
//  - ("5678"   << 4) is "90848",    which adds 1 new digit.
20227
//  - ("624"    << 4) is "9984",     which adds 1 new digit.
20228
//  - ("62498"  << 4) is "999968",   which adds 1 new digit.
20229
//  - ("625"    << 4) is "10000",    which adds 2 new digits.
20230
//  - ("625001" << 4) is "10000016", which adds 2 new digits.
20231
//  - ("7008"   << 4) is "112128",   which adds 2 new digits.
20232
//  - ("99"     << 4) is "1584",     which adds 2 new digits.
20233
//
20234
// Thus, when i is 4, N is 2 and (5 ** i) is "625". This etc__hpd_left_shift
20235
// array encodes this as:
20236
//  - etc__hpd_left_shift[4] is 0x1006 = (2 << 11) | 0x0006.
20237
//  - etc__hpd_left_shift[5] is 0x1009 = (? << 11) | 0x0009.
20238
// where the ? isn't relevant for i == 4.
20239
//
20240
// The high 5 bits of etc__hpd_left_shift[i] is N, the higher of the two
20241
// possible number of new digits. The low 11 bits are an offset into the
20242
// etc__powers_of_5 array (of length 0x051C, so offsets fit in 11 bits). When i
20243
// is 4, its offset and the next one is 6 and 9, and etc__powers_of_5[6 .. 9]
20244
// is the string "\x06\x02\x05", so the relevant power of 5 is "625".
20245
//
20246
// Thanks to Ken Thompson for the original idea.
20247
static const uint16_t wuffs_private_impl__hpd_left_shift[65] = {
20248
    0x0000, 0x0800, 0x0801, 0x0803, 0x1006, 0x1009, 0x100D, 0x1812, 0x1817,
20249
    0x181D, 0x2024, 0x202B, 0x2033, 0x203C, 0x2846, 0x2850, 0x285B, 0x3067,
20250
    0x3073, 0x3080, 0x388E, 0x389C, 0x38AB, 0x38BB, 0x40CC, 0x40DD, 0x40EF,
20251
    0x4902, 0x4915, 0x4929, 0x513E, 0x5153, 0x5169, 0x5180, 0x5998, 0x59B0,
20252
    0x59C9, 0x61E3, 0x61FD, 0x6218, 0x6A34, 0x6A50, 0x6A6D, 0x6A8B, 0x72AA,
20253
    0x72C9, 0x72E9, 0x7B0A, 0x7B2B, 0x7B4D, 0x8370, 0x8393, 0x83B7, 0x83DC,
20254
    0x8C02, 0x8C28, 0x8C4F, 0x9477, 0x949F, 0x94C8, 0x9CF2, 0x051C, 0x051C,
20255
    0x051C, 0x051C,
20256
};
20257
20258
// wuffs_private_impl__powers_of_5 contains the powers of 5, concatenated
20259
// together: "5", "25", "125", "625", "3125", etc.
20260
static const uint8_t wuffs_private_impl__powers_of_5[0x051C] = {
20261
    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,
20262
    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,
20263
    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,
20264
    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,
20265
    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,
20266
    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,
20267
    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,
20268
    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,
20269
    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,
20270
    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,
20271
    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,
20272
    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,
20273
    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,
20274
    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,
20275
    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,
20276
    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,
20277
    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,
20278
    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,
20279
    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,
20280
    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,
20281
    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,
20282
    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,
20283
    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,
20284
    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,
20285
    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,
20286
    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,
20287
    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,
20288
    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,
20289
    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,
20290
    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,
20291
    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,
20292
    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,
20293
    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,
20294
    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,
20295
    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,
20296
    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,
20297
    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,
20298
    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,
20299
    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,
20300
    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,
20301
    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,
20302
    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,
20303
    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,
20304
    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,
20305
    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,
20306
    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,
20307
    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,
20308
    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,
20309
    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,
20310
    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,
20311
    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,
20312
    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,
20313
    6, 9, 1, 4, 0, 6, 2, 5,
20314
};
20315
20316
// --------
20317
20318
// wuffs_private_impl__powers_of_10 contains truncated approximations to the
20319
// powers of 10, ranging from 1e-307 to 1e+288 inclusive, as 596 pairs of
20320
// uint64_t values (a 128-bit mantissa).
20321
//
20322
// There's also an implicit third column (implied by a linear formula involving
20323
// the base-10 exponent) that is the base-2 exponent, biased by a magic
20324
// constant. That constant (1214 or 0x04BE) equals 1023 + 191. 1023 is the bias
20325
// for IEEE 754 double-precision floating point. 191 is ((3 * 64) - 1) and
20326
// wuffs_private_impl__parse_number_f64_eisel_lemire works with
20327
// multiples-of-64-bit mantissas.
20328
//
20329
// For example, the third row holds the approximation to 1e-305:
20330
//   0xE0B62E29_29ABA83C_331ACDAB_FE94DE87 * (2 ** (0x0049 - 0x04BE))
20331
//
20332
// Similarly, 1e+4 is approximated by:
20333
//   0x9C400000_00000000_00000000_00000000 * (2 ** (0x044C - 0x04BE))
20334
//
20335
// Similarly, 1e+68 is approximated by:
20336
//   0xED63A231_D4C4FB27_4CA7AAA8_63EE4BDD * (2 ** (0x0520 - 0x04BE))
20337
//
20338
// This table was generated by by script/print-mpb-powers-of-10.go
20339
static const uint64_t wuffs_private_impl__powers_of_10[596][2] = {
20340
    {0xA5D3B6D479F8E056, 0x8FD0C16206306BAB},  // 1e-307
20341
    {0x8F48A4899877186C, 0xB3C4F1BA87BC8696},  // 1e-306
20342
    {0x331ACDABFE94DE87, 0xE0B62E2929ABA83C},  // 1e-305
20343
    {0x9FF0C08B7F1D0B14, 0x8C71DCD9BA0B4925},  // 1e-304
20344
    {0x07ECF0AE5EE44DD9, 0xAF8E5410288E1B6F},  // 1e-303
20345
    {0xC9E82CD9F69D6150, 0xDB71E91432B1A24A},  // 1e-302
20346
    {0xBE311C083A225CD2, 0x892731AC9FAF056E},  // 1e-301
20347
    {0x6DBD630A48AAF406, 0xAB70FE17C79AC6CA},  // 1e-300
20348
    {0x092CBBCCDAD5B108, 0xD64D3D9DB981787D},  // 1e-299
20349
    {0x25BBF56008C58EA5, 0x85F0468293F0EB4E},  // 1e-298
20350
    {0xAF2AF2B80AF6F24E, 0xA76C582338ED2621},  // 1e-297
20351
    {0x1AF5AF660DB4AEE1, 0xD1476E2C07286FAA},  // 1e-296
20352
    {0x50D98D9FC890ED4D, 0x82CCA4DB847945CA},  // 1e-295
20353
    {0xE50FF107BAB528A0, 0xA37FCE126597973C},  // 1e-294
20354
    {0x1E53ED49A96272C8, 0xCC5FC196FEFD7D0C},  // 1e-293
20355
    {0x25E8E89C13BB0F7A, 0xFF77B1FCBEBCDC4F},  // 1e-292
20356
    {0x77B191618C54E9AC, 0x9FAACF3DF73609B1},  // 1e-291
20357
    {0xD59DF5B9EF6A2417, 0xC795830D75038C1D},  // 1e-290
20358
    {0x4B0573286B44AD1D, 0xF97AE3D0D2446F25},  // 1e-289
20359
    {0x4EE367F9430AEC32, 0x9BECCE62836AC577},  // 1e-288
20360
    {0x229C41F793CDA73F, 0xC2E801FB244576D5},  // 1e-287
20361
    {0x6B43527578C1110F, 0xF3A20279ED56D48A},  // 1e-286
20362
    {0x830A13896B78AAA9, 0x9845418C345644D6},  // 1e-285
20363
    {0x23CC986BC656D553, 0xBE5691EF416BD60C},  // 1e-284
20364
    {0x2CBFBE86B7EC8AA8, 0xEDEC366B11C6CB8F},  // 1e-283
20365
    {0x7BF7D71432F3D6A9, 0x94B3A202EB1C3F39},  // 1e-282
20366
    {0xDAF5CCD93FB0CC53, 0xB9E08A83A5E34F07},  // 1e-281
20367
    {0xD1B3400F8F9CFF68, 0xE858AD248F5C22C9},  // 1e-280
20368
    {0x23100809B9C21FA1, 0x91376C36D99995BE},  // 1e-279
20369
    {0xABD40A0C2832A78A, 0xB58547448FFFFB2D},  // 1e-278
20370
    {0x16C90C8F323F516C, 0xE2E69915B3FFF9F9},  // 1e-277
20371
    {0xAE3DA7D97F6792E3, 0x8DD01FAD907FFC3B},  // 1e-276
20372
    {0x99CD11CFDF41779C, 0xB1442798F49FFB4A},  // 1e-275
20373
    {0x40405643D711D583, 0xDD95317F31C7FA1D},  // 1e-274
20374
    {0x482835EA666B2572, 0x8A7D3EEF7F1CFC52},  // 1e-273
20375
    {0xDA3243650005EECF, 0xAD1C8EAB5EE43B66},  // 1e-272
20376
    {0x90BED43E40076A82, 0xD863B256369D4A40},  // 1e-271
20377
    {0x5A7744A6E804A291, 0x873E4F75E2224E68},  // 1e-270
20378
    {0x711515D0A205CB36, 0xA90DE3535AAAE202},  // 1e-269
20379
    {0x0D5A5B44CA873E03, 0xD3515C2831559A83},  // 1e-268
20380
    {0xE858790AFE9486C2, 0x8412D9991ED58091},  // 1e-267
20381
    {0x626E974DBE39A872, 0xA5178FFF668AE0B6},  // 1e-266
20382
    {0xFB0A3D212DC8128F, 0xCE5D73FF402D98E3},  // 1e-265
20383
    {0x7CE66634BC9D0B99, 0x80FA687F881C7F8E},  // 1e-264
20384
    {0x1C1FFFC1EBC44E80, 0xA139029F6A239F72},  // 1e-263
20385
    {0xA327FFB266B56220, 0xC987434744AC874E},  // 1e-262
20386
    {0x4BF1FF9F0062BAA8, 0xFBE9141915D7A922},  // 1e-261
20387
    {0x6F773FC3603DB4A9, 0x9D71AC8FADA6C9B5},  // 1e-260
20388
    {0xCB550FB4384D21D3, 0xC4CE17B399107C22},  // 1e-259
20389
    {0x7E2A53A146606A48, 0xF6019DA07F549B2B},  // 1e-258
20390
    {0x2EDA7444CBFC426D, 0x99C102844F94E0FB},  // 1e-257
20391
    {0xFA911155FEFB5308, 0xC0314325637A1939},  // 1e-256
20392
    {0x793555AB7EBA27CA, 0xF03D93EEBC589F88},  // 1e-255
20393
    {0x4BC1558B2F3458DE, 0x96267C7535B763B5},  // 1e-254
20394
    {0x9EB1AAEDFB016F16, 0xBBB01B9283253CA2},  // 1e-253
20395
    {0x465E15A979C1CADC, 0xEA9C227723EE8BCB},  // 1e-252
20396
    {0x0BFACD89EC191EC9, 0x92A1958A7675175F},  // 1e-251
20397
    {0xCEF980EC671F667B, 0xB749FAED14125D36},  // 1e-250
20398
    {0x82B7E12780E7401A, 0xE51C79A85916F484},  // 1e-249
20399
    {0xD1B2ECB8B0908810, 0x8F31CC0937AE58D2},  // 1e-248
20400
    {0x861FA7E6DCB4AA15, 0xB2FE3F0B8599EF07},  // 1e-247
20401
    {0x67A791E093E1D49A, 0xDFBDCECE67006AC9},  // 1e-246
20402
    {0xE0C8BB2C5C6D24E0, 0x8BD6A141006042BD},  // 1e-245
20403
    {0x58FAE9F773886E18, 0xAECC49914078536D},  // 1e-244
20404
    {0xAF39A475506A899E, 0xDA7F5BF590966848},  // 1e-243
20405
    {0x6D8406C952429603, 0x888F99797A5E012D},  // 1e-242
20406
    {0xC8E5087BA6D33B83, 0xAAB37FD7D8F58178},  // 1e-241
20407
    {0xFB1E4A9A90880A64, 0xD5605FCDCF32E1D6},  // 1e-240
20408
    {0x5CF2EEA09A55067F, 0x855C3BE0A17FCD26},  // 1e-239
20409
    {0xF42FAA48C0EA481E, 0xA6B34AD8C9DFC06F},  // 1e-238
20410
    {0xF13B94DAF124DA26, 0xD0601D8EFC57B08B},  // 1e-237
20411
    {0x76C53D08D6B70858, 0x823C12795DB6CE57},  // 1e-236
20412
    {0x54768C4B0C64CA6E, 0xA2CB1717B52481ED},  // 1e-235
20413
    {0xA9942F5DCF7DFD09, 0xCB7DDCDDA26DA268},  // 1e-234
20414
    {0xD3F93B35435D7C4C, 0xFE5D54150B090B02},  // 1e-233
20415
    {0xC47BC5014A1A6DAF, 0x9EFA548D26E5A6E1},  // 1e-232
20416
    {0x359AB6419CA1091B, 0xC6B8E9B0709F109A},  // 1e-231
20417
    {0xC30163D203C94B62, 0xF867241C8CC6D4C0},  // 1e-230
20418
    {0x79E0DE63425DCF1D, 0x9B407691D7FC44F8},  // 1e-229
20419
    {0x985915FC12F542E4, 0xC21094364DFB5636},  // 1e-228
20420
    {0x3E6F5B7B17B2939D, 0xF294B943E17A2BC4},  // 1e-227
20421
    {0xA705992CEECF9C42, 0x979CF3CA6CEC5B5A},  // 1e-226
20422
    {0x50C6FF782A838353, 0xBD8430BD08277231},  // 1e-225
20423
    {0xA4F8BF5635246428, 0xECE53CEC4A314EBD},  // 1e-224
20424
    {0x871B7795E136BE99, 0x940F4613AE5ED136},  // 1e-223
20425
    {0x28E2557B59846E3F, 0xB913179899F68584},  // 1e-222
20426
    {0x331AEADA2FE589CF, 0xE757DD7EC07426E5},  // 1e-221
20427
    {0x3FF0D2C85DEF7621, 0x9096EA6F3848984F},  // 1e-220
20428
    {0x0FED077A756B53A9, 0xB4BCA50B065ABE63},  // 1e-219
20429
    {0xD3E8495912C62894, 0xE1EBCE4DC7F16DFB},  // 1e-218
20430
    {0x64712DD7ABBBD95C, 0x8D3360F09CF6E4BD},  // 1e-217
20431
    {0xBD8D794D96AACFB3, 0xB080392CC4349DEC},  // 1e-216
20432
    {0xECF0D7A0FC5583A0, 0xDCA04777F541C567},  // 1e-215
20433
    {0xF41686C49DB57244, 0x89E42CAAF9491B60},  // 1e-214
20434
    {0x311C2875C522CED5, 0xAC5D37D5B79B6239},  // 1e-213
20435
    {0x7D633293366B828B, 0xD77485CB25823AC7},  // 1e-212
20436
    {0xAE5DFF9C02033197, 0x86A8D39EF77164BC},  // 1e-211
20437
    {0xD9F57F830283FDFC, 0xA8530886B54DBDEB},  // 1e-210
20438
    {0xD072DF63C324FD7B, 0xD267CAA862A12D66},  // 1e-209
20439
    {0x4247CB9E59F71E6D, 0x8380DEA93DA4BC60},  // 1e-208
20440
    {0x52D9BE85F074E608, 0xA46116538D0DEB78},  // 1e-207
20441
    {0x67902E276C921F8B, 0xCD795BE870516656},  // 1e-206
20442
    {0x00BA1CD8A3DB53B6, 0x806BD9714632DFF6},  // 1e-205
20443
    {0x80E8A40ECCD228A4, 0xA086CFCD97BF97F3},  // 1e-204
20444
    {0x6122CD128006B2CD, 0xC8A883C0FDAF7DF0},  // 1e-203
20445
    {0x796B805720085F81, 0xFAD2A4B13D1B5D6C},  // 1e-202
20446
    {0xCBE3303674053BB0, 0x9CC3A6EEC6311A63},  // 1e-201
20447
    {0xBEDBFC4411068A9C, 0xC3F490AA77BD60FC},  // 1e-200
20448
    {0xEE92FB5515482D44, 0xF4F1B4D515ACB93B},  // 1e-199
20449
    {0x751BDD152D4D1C4A, 0x991711052D8BF3C5},  // 1e-198
20450
    {0xD262D45A78A0635D, 0xBF5CD54678EEF0B6},  // 1e-197
20451
    {0x86FB897116C87C34, 0xEF340A98172AACE4},  // 1e-196
20452
    {0xD45D35E6AE3D4DA0, 0x9580869F0E7AAC0E},  // 1e-195
20453
    {0x8974836059CCA109, 0xBAE0A846D2195712},  // 1e-194
20454
    {0x2BD1A438703FC94B, 0xE998D258869FACD7},  // 1e-193
20455
    {0x7B6306A34627DDCF, 0x91FF83775423CC06},  // 1e-192
20456
    {0x1A3BC84C17B1D542, 0xB67F6455292CBF08},  // 1e-191
20457
    {0x20CABA5F1D9E4A93, 0xE41F3D6A7377EECA},  // 1e-190
20458
    {0x547EB47B7282EE9C, 0x8E938662882AF53E},  // 1e-189
20459
    {0xE99E619A4F23AA43, 0xB23867FB2A35B28D},  // 1e-188
20460
    {0x6405FA00E2EC94D4, 0xDEC681F9F4C31F31},  // 1e-187
20461
    {0xDE83BC408DD3DD04, 0x8B3C113C38F9F37E},  // 1e-186
20462
    {0x9624AB50B148D445, 0xAE0B158B4738705E},  // 1e-185
20463
    {0x3BADD624DD9B0957, 0xD98DDAEE19068C76},  // 1e-184
20464
    {0xE54CA5D70A80E5D6, 0x87F8A8D4CFA417C9},  // 1e-183
20465
    {0x5E9FCF4CCD211F4C, 0xA9F6D30A038D1DBC},  // 1e-182
20466
    {0x7647C3200069671F, 0xD47487CC8470652B},  // 1e-181
20467
    {0x29ECD9F40041E073, 0x84C8D4DFD2C63F3B},  // 1e-180
20468
    {0xF468107100525890, 0xA5FB0A17C777CF09},  // 1e-179
20469
    {0x7182148D4066EEB4, 0xCF79CC9DB955C2CC},  // 1e-178
20470
    {0xC6F14CD848405530, 0x81AC1FE293D599BF},  // 1e-177
20471
    {0xB8ADA00E5A506A7C, 0xA21727DB38CB002F},  // 1e-176
20472
    {0xA6D90811F0E4851C, 0xCA9CF1D206FDC03B},  // 1e-175
20473
    {0x908F4A166D1DA663, 0xFD442E4688BD304A},  // 1e-174
20474
    {0x9A598E4E043287FE, 0x9E4A9CEC15763E2E},  // 1e-173
20475
    {0x40EFF1E1853F29FD, 0xC5DD44271AD3CDBA},  // 1e-172
20476
    {0xD12BEE59E68EF47C, 0xF7549530E188C128},  // 1e-171
20477
    {0x82BB74F8301958CE, 0x9A94DD3E8CF578B9},  // 1e-170
20478
    {0xE36A52363C1FAF01, 0xC13A148E3032D6E7},  // 1e-169
20479
    {0xDC44E6C3CB279AC1, 0xF18899B1BC3F8CA1},  // 1e-168
20480
    {0x29AB103A5EF8C0B9, 0x96F5600F15A7B7E5},  // 1e-167
20481
    {0x7415D448F6B6F0E7, 0xBCB2B812DB11A5DE},  // 1e-166
20482
    {0x111B495B3464AD21, 0xEBDF661791D60F56},  // 1e-165
20483
    {0xCAB10DD900BEEC34, 0x936B9FCEBB25C995},  // 1e-164
20484
    {0x3D5D514F40EEA742, 0xB84687C269EF3BFB},  // 1e-163
20485
    {0x0CB4A5A3112A5112, 0xE65829B3046B0AFA},  // 1e-162
20486
    {0x47F0E785EABA72AB, 0x8FF71A0FE2C2E6DC},  // 1e-161
20487
    {0x59ED216765690F56, 0xB3F4E093DB73A093},  // 1e-160
20488
    {0x306869C13EC3532C, 0xE0F218B8D25088B8},  // 1e-159
20489
    {0x1E414218C73A13FB, 0x8C974F7383725573},  // 1e-158
20490
    {0xE5D1929EF90898FA, 0xAFBD2350644EEACF},  // 1e-157
20491
    {0xDF45F746B74ABF39, 0xDBAC6C247D62A583},  // 1e-156
20492
    {0x6B8BBA8C328EB783, 0x894BC396CE5DA772},  // 1e-155
20493
    {0x066EA92F3F326564, 0xAB9EB47C81F5114F},  // 1e-154
20494
    {0xC80A537B0EFEFEBD, 0xD686619BA27255A2},  // 1e-153
20495
    {0xBD06742CE95F5F36, 0x8613FD0145877585},  // 1e-152
20496
    {0x2C48113823B73704, 0xA798FC4196E952E7},  // 1e-151
20497
    {0xF75A15862CA504C5, 0xD17F3B51FCA3A7A0},  // 1e-150
20498
    {0x9A984D73DBE722FB, 0x82EF85133DE648C4},  // 1e-149
20499
    {0xC13E60D0D2E0EBBA, 0xA3AB66580D5FDAF5},  // 1e-148
20500
    {0x318DF905079926A8, 0xCC963FEE10B7D1B3},  // 1e-147
20501
    {0xFDF17746497F7052, 0xFFBBCFE994E5C61F},  // 1e-146
20502
    {0xFEB6EA8BEDEFA633, 0x9FD561F1FD0F9BD3},  // 1e-145
20503
    {0xFE64A52EE96B8FC0, 0xC7CABA6E7C5382C8},  // 1e-144
20504
    {0x3DFDCE7AA3C673B0, 0xF9BD690A1B68637B},  // 1e-143
20505
    {0x06BEA10CA65C084E, 0x9C1661A651213E2D},  // 1e-142
20506
    {0x486E494FCFF30A62, 0xC31BFA0FE5698DB8},  // 1e-141
20507
    {0x5A89DBA3C3EFCCFA, 0xF3E2F893DEC3F126},  // 1e-140
20508
    {0xF89629465A75E01C, 0x986DDB5C6B3A76B7},  // 1e-139
20509
    {0xF6BBB397F1135823, 0xBE89523386091465},  // 1e-138
20510
    {0x746AA07DED582E2C, 0xEE2BA6C0678B597F},  // 1e-137
20511
    {0xA8C2A44EB4571CDC, 0x94DB483840B717EF},  // 1e-136
20512
    {0x92F34D62616CE413, 0xBA121A4650E4DDEB},  // 1e-135
20513
    {0x77B020BAF9C81D17, 0xE896A0D7E51E1566},  // 1e-134
20514
    {0x0ACE1474DC1D122E, 0x915E2486EF32CD60},  // 1e-133
20515
    {0x0D819992132456BA, 0xB5B5ADA8AAFF80B8},  // 1e-132
20516
    {0x10E1FFF697ED6C69, 0xE3231912D5BF60E6},  // 1e-131
20517
    {0xCA8D3FFA1EF463C1, 0x8DF5EFABC5979C8F},  // 1e-130
20518
    {0xBD308FF8A6B17CB2, 0xB1736B96B6FD83B3},  // 1e-129
20519
    {0xAC7CB3F6D05DDBDE, 0xDDD0467C64BCE4A0},  // 1e-128
20520
    {0x6BCDF07A423AA96B, 0x8AA22C0DBEF60EE4},  // 1e-127
20521
    {0x86C16C98D2C953C6, 0xAD4AB7112EB3929D},  // 1e-126
20522
    {0xE871C7BF077BA8B7, 0xD89D64D57A607744},  // 1e-125
20523
    {0x11471CD764AD4972, 0x87625F056C7C4A8B},  // 1e-124
20524
    {0xD598E40D3DD89BCF, 0xA93AF6C6C79B5D2D},  // 1e-123
20525
    {0x4AFF1D108D4EC2C3, 0xD389B47879823479},  // 1e-122
20526
    {0xCEDF722A585139BA, 0x843610CB4BF160CB},  // 1e-121
20527
    {0xC2974EB4EE658828, 0xA54394FE1EEDB8FE},  // 1e-120
20528
    {0x733D226229FEEA32, 0xCE947A3DA6A9273E},  // 1e-119
20529
    {0x0806357D5A3F525F, 0x811CCC668829B887},  // 1e-118
20530
    {0xCA07C2DCB0CF26F7, 0xA163FF802A3426A8},  // 1e-117
20531
    {0xFC89B393DD02F0B5, 0xC9BCFF6034C13052},  // 1e-116
20532
    {0xBBAC2078D443ACE2, 0xFC2C3F3841F17C67},  // 1e-115
20533
    {0xD54B944B84AA4C0D, 0x9D9BA7832936EDC0},  // 1e-114
20534
    {0x0A9E795E65D4DF11, 0xC5029163F384A931},  // 1e-113
20535
    {0x4D4617B5FF4A16D5, 0xF64335BCF065D37D},  // 1e-112
20536
    {0x504BCED1BF8E4E45, 0x99EA0196163FA42E},  // 1e-111
20537
    {0xE45EC2862F71E1D6, 0xC06481FB9BCF8D39},  // 1e-110
20538
    {0x5D767327BB4E5A4C, 0xF07DA27A82C37088},  // 1e-109
20539
    {0x3A6A07F8D510F86F, 0x964E858C91BA2655},  // 1e-108
20540
    {0x890489F70A55368B, 0xBBE226EFB628AFEA},  // 1e-107
20541
    {0x2B45AC74CCEA842E, 0xEADAB0ABA3B2DBE5},  // 1e-106
20542
    {0x3B0B8BC90012929D, 0x92C8AE6B464FC96F},  // 1e-105
20543
    {0x09CE6EBB40173744, 0xB77ADA0617E3BBCB},  // 1e-104
20544
    {0xCC420A6A101D0515, 0xE55990879DDCAABD},  // 1e-103
20545
    {0x9FA946824A12232D, 0x8F57FA54C2A9EAB6},  // 1e-102
20546
    {0x47939822DC96ABF9, 0xB32DF8E9F3546564},  // 1e-101
20547
    {0x59787E2B93BC56F7, 0xDFF9772470297EBD},  // 1e-100
20548
    {0x57EB4EDB3C55B65A, 0x8BFBEA76C619EF36},  // 1e-99
20549
    {0xEDE622920B6B23F1, 0xAEFAE51477A06B03},  // 1e-98
20550
    {0xE95FAB368E45ECED, 0xDAB99E59958885C4},  // 1e-97
20551
    {0x11DBCB0218EBB414, 0x88B402F7FD75539B},  // 1e-96
20552
    {0xD652BDC29F26A119, 0xAAE103B5FCD2A881},  // 1e-95
20553
    {0x4BE76D3346F0495F, 0xD59944A37C0752A2},  // 1e-94
20554
    {0x6F70A4400C562DDB, 0x857FCAE62D8493A5},  // 1e-93
20555
    {0xCB4CCD500F6BB952, 0xA6DFBD9FB8E5B88E},  // 1e-92
20556
    {0x7E2000A41346A7A7, 0xD097AD07A71F26B2},  // 1e-91
20557
    {0x8ED400668C0C28C8, 0x825ECC24C873782F},  // 1e-90
20558
    {0x728900802F0F32FA, 0xA2F67F2DFA90563B},  // 1e-89
20559
    {0x4F2B40A03AD2FFB9, 0xCBB41EF979346BCA},  // 1e-88
20560
    {0xE2F610C84987BFA8, 0xFEA126B7D78186BC},  // 1e-87
20561
    {0x0DD9CA7D2DF4D7C9, 0x9F24B832E6B0F436},  // 1e-86
20562
    {0x91503D1C79720DBB, 0xC6EDE63FA05D3143},  // 1e-85
20563
    {0x75A44C6397CE912A, 0xF8A95FCF88747D94},  // 1e-84
20564
    {0xC986AFBE3EE11ABA, 0x9B69DBE1B548CE7C},  // 1e-83
20565
    {0xFBE85BADCE996168, 0xC24452DA229B021B},  // 1e-82
20566
    {0xFAE27299423FB9C3, 0xF2D56790AB41C2A2},  // 1e-81
20567
    {0xDCCD879FC967D41A, 0x97C560BA6B0919A5},  // 1e-80
20568
    {0x5400E987BBC1C920, 0xBDB6B8E905CB600F},  // 1e-79
20569
    {0x290123E9AAB23B68, 0xED246723473E3813},  // 1e-78
20570
    {0xF9A0B6720AAF6521, 0x9436C0760C86E30B},  // 1e-77
20571
    {0xF808E40E8D5B3E69, 0xB94470938FA89BCE},  // 1e-76
20572
    {0xB60B1D1230B20E04, 0xE7958CB87392C2C2},  // 1e-75
20573
    {0xB1C6F22B5E6F48C2, 0x90BD77F3483BB9B9},  // 1e-74
20574
    {0x1E38AEB6360B1AF3, 0xB4ECD5F01A4AA828},  // 1e-73
20575
    {0x25C6DA63C38DE1B0, 0xE2280B6C20DD5232},  // 1e-72
20576
    {0x579C487E5A38AD0E, 0x8D590723948A535F},  // 1e-71
20577
    {0x2D835A9DF0C6D851, 0xB0AF48EC79ACE837},  // 1e-70
20578
    {0xF8E431456CF88E65, 0xDCDB1B2798182244},  // 1e-69
20579
    {0x1B8E9ECB641B58FF, 0x8A08F0F8BF0F156B},  // 1e-68
20580
    {0xE272467E3D222F3F, 0xAC8B2D36EED2DAC5},  // 1e-67
20581
    {0x5B0ED81DCC6ABB0F, 0xD7ADF884AA879177},  // 1e-66
20582
    {0x98E947129FC2B4E9, 0x86CCBB52EA94BAEA},  // 1e-65
20583
    {0x3F2398D747B36224, 0xA87FEA27A539E9A5},  // 1e-64
20584
    {0x8EEC7F0D19A03AAD, 0xD29FE4B18E88640E},  // 1e-63
20585
    {0x1953CF68300424AC, 0x83A3EEEEF9153E89},  // 1e-62
20586
    {0x5FA8C3423C052DD7, 0xA48CEAAAB75A8E2B},  // 1e-61
20587
    {0x3792F412CB06794D, 0xCDB02555653131B6},  // 1e-60
20588
    {0xE2BBD88BBEE40BD0, 0x808E17555F3EBF11},  // 1e-59
20589
    {0x5B6ACEAEAE9D0EC4, 0xA0B19D2AB70E6ED6},  // 1e-58
20590
    {0xF245825A5A445275, 0xC8DE047564D20A8B},  // 1e-57
20591
    {0xEED6E2F0F0D56712, 0xFB158592BE068D2E},  // 1e-56
20592
    {0x55464DD69685606B, 0x9CED737BB6C4183D},  // 1e-55
20593
    {0xAA97E14C3C26B886, 0xC428D05AA4751E4C},  // 1e-54
20594
    {0xD53DD99F4B3066A8, 0xF53304714D9265DF},  // 1e-53
20595
    {0xE546A8038EFE4029, 0x993FE2C6D07B7FAB},  // 1e-52
20596
    {0xDE98520472BDD033, 0xBF8FDB78849A5F96},  // 1e-51
20597
    {0x963E66858F6D4440, 0xEF73D256A5C0F77C},  // 1e-50
20598
    {0xDDE7001379A44AA8, 0x95A8637627989AAD},  // 1e-49
20599
    {0x5560C018580D5D52, 0xBB127C53B17EC159},  // 1e-48
20600
    {0xAAB8F01E6E10B4A6, 0xE9D71B689DDE71AF},  // 1e-47
20601
    {0xCAB3961304CA70E8, 0x9226712162AB070D},  // 1e-46
20602
    {0x3D607B97C5FD0D22, 0xB6B00D69BB55C8D1},  // 1e-45
20603
    {0x8CB89A7DB77C506A, 0xE45C10C42A2B3B05},  // 1e-44
20604
    {0x77F3608E92ADB242, 0x8EB98A7A9A5B04E3},  // 1e-43
20605
    {0x55F038B237591ED3, 0xB267ED1940F1C61C},  // 1e-42
20606
    {0x6B6C46DEC52F6688, 0xDF01E85F912E37A3},  // 1e-41
20607
    {0x2323AC4B3B3DA015, 0x8B61313BBABCE2C6},  // 1e-40
20608
    {0xABEC975E0A0D081A, 0xAE397D8AA96C1B77},  // 1e-39
20609
    {0x96E7BD358C904A21, 0xD9C7DCED53C72255},  // 1e-38
20610
    {0x7E50D64177DA2E54, 0x881CEA14545C7575},  // 1e-37
20611
    {0xDDE50BD1D5D0B9E9, 0xAA242499697392D2},  // 1e-36
20612
    {0x955E4EC64B44E864, 0xD4AD2DBFC3D07787},  // 1e-35
20613
    {0xBD5AF13BEF0B113E, 0x84EC3C97DA624AB4},  // 1e-34
20614
    {0xECB1AD8AEACDD58E, 0xA6274BBDD0FADD61},  // 1e-33
20615
    {0x67DE18EDA5814AF2, 0xCFB11EAD453994BA},  // 1e-32
20616
    {0x80EACF948770CED7, 0x81CEB32C4B43FCF4},  // 1e-31
20617
    {0xA1258379A94D028D, 0xA2425FF75E14FC31},  // 1e-30
20618
    {0x096EE45813A04330, 0xCAD2F7F5359A3B3E},  // 1e-29
20619
    {0x8BCA9D6E188853FC, 0xFD87B5F28300CA0D},  // 1e-28
20620
    {0x775EA264CF55347D, 0x9E74D1B791E07E48},  // 1e-27
20621
    {0x95364AFE032A819D, 0xC612062576589DDA},  // 1e-26
20622
    {0x3A83DDBD83F52204, 0xF79687AED3EEC551},  // 1e-25
20623
    {0xC4926A9672793542, 0x9ABE14CD44753B52},  // 1e-24
20624
    {0x75B7053C0F178293, 0xC16D9A0095928A27},  // 1e-23
20625
    {0x5324C68B12DD6338, 0xF1C90080BAF72CB1},  // 1e-22
20626
    {0xD3F6FC16EBCA5E03, 0x971DA05074DA7BEE},  // 1e-21
20627
    {0x88F4BB1CA6BCF584, 0xBCE5086492111AEA},  // 1e-20
20628
    {0x2B31E9E3D06C32E5, 0xEC1E4A7DB69561A5},  // 1e-19
20629
    {0x3AFF322E62439FCF, 0x9392EE8E921D5D07},  // 1e-18
20630
    {0x09BEFEB9FAD487C2, 0xB877AA3236A4B449},  // 1e-17
20631
    {0x4C2EBE687989A9B3, 0xE69594BEC44DE15B},  // 1e-16
20632
    {0x0F9D37014BF60A10, 0x901D7CF73AB0ACD9},  // 1e-15
20633
    {0x538484C19EF38C94, 0xB424DC35095CD80F},  // 1e-14
20634
    {0x2865A5F206B06FB9, 0xE12E13424BB40E13},  // 1e-13
20635
    {0xF93F87B7442E45D3, 0x8CBCCC096F5088CB},  // 1e-12
20636
    {0xF78F69A51539D748, 0xAFEBFF0BCB24AAFE},  // 1e-11
20637
    {0xB573440E5A884D1B, 0xDBE6FECEBDEDD5BE},  // 1e-10
20638
    {0x31680A88F8953030, 0x89705F4136B4A597},  // 1e-9
20639
    {0xFDC20D2B36BA7C3D, 0xABCC77118461CEFC},  // 1e-8
20640
    {0x3D32907604691B4C, 0xD6BF94D5E57A42BC},  // 1e-7
20641
    {0xA63F9A49C2C1B10F, 0x8637BD05AF6C69B5},  // 1e-6
20642
    {0x0FCF80DC33721D53, 0xA7C5AC471B478423},  // 1e-5
20643
    {0xD3C36113404EA4A8, 0xD1B71758E219652B},  // 1e-4
20644
    {0x645A1CAC083126E9, 0x83126E978D4FDF3B},  // 1e-3
20645
    {0x3D70A3D70A3D70A3, 0xA3D70A3D70A3D70A},  // 1e-2
20646
    {0xCCCCCCCCCCCCCCCC, 0xCCCCCCCCCCCCCCCC},  // 1e-1
20647
    {0x0000000000000000, 0x8000000000000000},  // 1e0
20648
    {0x0000000000000000, 0xA000000000000000},  // 1e1
20649
    {0x0000000000000000, 0xC800000000000000},  // 1e2
20650
    {0x0000000000000000, 0xFA00000000000000},  // 1e3
20651
    {0x0000000000000000, 0x9C40000000000000},  // 1e4
20652
    {0x0000000000000000, 0xC350000000000000},  // 1e5
20653
    {0x0000000000000000, 0xF424000000000000},  // 1e6
20654
    {0x0000000000000000, 0x9896800000000000},  // 1e7
20655
    {0x0000000000000000, 0xBEBC200000000000},  // 1e8
20656
    {0x0000000000000000, 0xEE6B280000000000},  // 1e9
20657
    {0x0000000000000000, 0x9502F90000000000},  // 1e10
20658
    {0x0000000000000000, 0xBA43B74000000000},  // 1e11
20659
    {0x0000000000000000, 0xE8D4A51000000000},  // 1e12
20660
    {0x0000000000000000, 0x9184E72A00000000},  // 1e13
20661
    {0x0000000000000000, 0xB5E620F480000000},  // 1e14
20662
    {0x0000000000000000, 0xE35FA931A0000000},  // 1e15
20663
    {0x0000000000000000, 0x8E1BC9BF04000000},  // 1e16
20664
    {0x0000000000000000, 0xB1A2BC2EC5000000},  // 1e17
20665
    {0x0000000000000000, 0xDE0B6B3A76400000},  // 1e18
20666
    {0x0000000000000000, 0x8AC7230489E80000},  // 1e19
20667
    {0x0000000000000000, 0xAD78EBC5AC620000},  // 1e20
20668
    {0x0000000000000000, 0xD8D726B7177A8000},  // 1e21
20669
    {0x0000000000000000, 0x878678326EAC9000},  // 1e22
20670
    {0x0000000000000000, 0xA968163F0A57B400},  // 1e23
20671
    {0x0000000000000000, 0xD3C21BCECCEDA100},  // 1e24
20672
    {0x0000000000000000, 0x84595161401484A0},  // 1e25
20673
    {0x0000000000000000, 0xA56FA5B99019A5C8},  // 1e26
20674
    {0x0000000000000000, 0xCECB8F27F4200F3A},  // 1e27
20675
    {0x4000000000000000, 0x813F3978F8940984},  // 1e28
20676
    {0x5000000000000000, 0xA18F07D736B90BE5},  // 1e29
20677
    {0xA400000000000000, 0xC9F2C9CD04674EDE},  // 1e30
20678
    {0x4D00000000000000, 0xFC6F7C4045812296},  // 1e31
20679
    {0xF020000000000000, 0x9DC5ADA82B70B59D},  // 1e32
20680
    {0x6C28000000000000, 0xC5371912364CE305},  // 1e33
20681
    {0xC732000000000000, 0xF684DF56C3E01BC6},  // 1e34
20682
    {0x3C7F400000000000, 0x9A130B963A6C115C},  // 1e35
20683
    {0x4B9F100000000000, 0xC097CE7BC90715B3},  // 1e36
20684
    {0x1E86D40000000000, 0xF0BDC21ABB48DB20},  // 1e37
20685
    {0x1314448000000000, 0x96769950B50D88F4},  // 1e38
20686
    {0x17D955A000000000, 0xBC143FA4E250EB31},  // 1e39
20687
    {0x5DCFAB0800000000, 0xEB194F8E1AE525FD},  // 1e40
20688
    {0x5AA1CAE500000000, 0x92EFD1B8D0CF37BE},  // 1e41
20689
    {0xF14A3D9E40000000, 0xB7ABC627050305AD},  // 1e42
20690
    {0x6D9CCD05D0000000, 0xE596B7B0C643C719},  // 1e43
20691
    {0xE4820023A2000000, 0x8F7E32CE7BEA5C6F},  // 1e44
20692
    {0xDDA2802C8A800000, 0xB35DBF821AE4F38B},  // 1e45
20693
    {0xD50B2037AD200000, 0xE0352F62A19E306E},  // 1e46
20694
    {0x4526F422CC340000, 0x8C213D9DA502DE45},  // 1e47
20695
    {0x9670B12B7F410000, 0xAF298D050E4395D6},  // 1e48
20696
    {0x3C0CDD765F114000, 0xDAF3F04651D47B4C},  // 1e49
20697
    {0xA5880A69FB6AC800, 0x88D8762BF324CD0F},  // 1e50
20698
    {0x8EEA0D047A457A00, 0xAB0E93B6EFEE0053},  // 1e51
20699
    {0x72A4904598D6D880, 0xD5D238A4ABE98068},  // 1e52
20700
    {0x47A6DA2B7F864750, 0x85A36366EB71F041},  // 1e53
20701
    {0x999090B65F67D924, 0xA70C3C40A64E6C51},  // 1e54
20702
    {0xFFF4B4E3F741CF6D, 0xD0CF4B50CFE20765},  // 1e55
20703
    {0xBFF8F10E7A8921A4, 0x82818F1281ED449F},  // 1e56
20704
    {0xAFF72D52192B6A0D, 0xA321F2D7226895C7},  // 1e57
20705
    {0x9BF4F8A69F764490, 0xCBEA6F8CEB02BB39},  // 1e58
20706
    {0x02F236D04753D5B4, 0xFEE50B7025C36A08},  // 1e59
20707
    {0x01D762422C946590, 0x9F4F2726179A2245},  // 1e60
20708
    {0x424D3AD2B7B97EF5, 0xC722F0EF9D80AAD6},  // 1e61
20709
    {0xD2E0898765A7DEB2, 0xF8EBAD2B84E0D58B},  // 1e62
20710
    {0x63CC55F49F88EB2F, 0x9B934C3B330C8577},  // 1e63
20711
    {0x3CBF6B71C76B25FB, 0xC2781F49FFCFA6D5},  // 1e64
20712
    {0x8BEF464E3945EF7A, 0xF316271C7FC3908A},  // 1e65
20713
    {0x97758BF0E3CBB5AC, 0x97EDD871CFDA3A56},  // 1e66
20714
    {0x3D52EEED1CBEA317, 0xBDE94E8E43D0C8EC},  // 1e67
20715
    {0x4CA7AAA863EE4BDD, 0xED63A231D4C4FB27},  // 1e68
20716
    {0x8FE8CAA93E74EF6A, 0x945E455F24FB1CF8},  // 1e69
20717
    {0xB3E2FD538E122B44, 0xB975D6B6EE39E436},  // 1e70
20718
    {0x60DBBCA87196B616, 0xE7D34C64A9C85D44},  // 1e71
20719
    {0xBC8955E946FE31CD, 0x90E40FBEEA1D3A4A},  // 1e72
20720
    {0x6BABAB6398BDBE41, 0xB51D13AEA4A488DD},  // 1e73
20721
    {0xC696963C7EED2DD1, 0xE264589A4DCDAB14},  // 1e74
20722
    {0xFC1E1DE5CF543CA2, 0x8D7EB76070A08AEC},  // 1e75
20723
    {0x3B25A55F43294BCB, 0xB0DE65388CC8ADA8},  // 1e76
20724
    {0x49EF0EB713F39EBE, 0xDD15FE86AFFAD912},  // 1e77
20725
    {0x6E3569326C784337, 0x8A2DBF142DFCC7AB},  // 1e78
20726
    {0x49C2C37F07965404, 0xACB92ED9397BF996},  // 1e79
20727
    {0xDC33745EC97BE906, 0xD7E77A8F87DAF7FB},  // 1e80
20728
    {0x69A028BB3DED71A3, 0x86F0AC99B4E8DAFD},  // 1e81
20729
    {0xC40832EA0D68CE0C, 0xA8ACD7C0222311BC},  // 1e82
20730
    {0xF50A3FA490C30190, 0xD2D80DB02AABD62B},  // 1e83
20731
    {0x792667C6DA79E0FA, 0x83C7088E1AAB65DB},  // 1e84
20732
    {0x577001B891185938, 0xA4B8CAB1A1563F52},  // 1e85
20733
    {0xED4C0226B55E6F86, 0xCDE6FD5E09ABCF26},  // 1e86
20734
    {0x544F8158315B05B4, 0x80B05E5AC60B6178},  // 1e87
20735
    {0x696361AE3DB1C721, 0xA0DC75F1778E39D6},  // 1e88
20736
    {0x03BC3A19CD1E38E9, 0xC913936DD571C84C},  // 1e89
20737
    {0x04AB48A04065C723, 0xFB5878494ACE3A5F},  // 1e90
20738
    {0x62EB0D64283F9C76, 0x9D174B2DCEC0E47B},  // 1e91
20739
    {0x3BA5D0BD324F8394, 0xC45D1DF942711D9A},  // 1e92
20740
    {0xCA8F44EC7EE36479, 0xF5746577930D6500},  // 1e93
20741
    {0x7E998B13CF4E1ECB, 0x9968BF6ABBE85F20},  // 1e94
20742
    {0x9E3FEDD8C321A67E, 0xBFC2EF456AE276E8},  // 1e95
20743
    {0xC5CFE94EF3EA101E, 0xEFB3AB16C59B14A2},  // 1e96
20744
    {0xBBA1F1D158724A12, 0x95D04AEE3B80ECE5},  // 1e97
20745
    {0x2A8A6E45AE8EDC97, 0xBB445DA9CA61281F},  // 1e98
20746
    {0xF52D09D71A3293BD, 0xEA1575143CF97226},  // 1e99
20747
    {0x593C2626705F9C56, 0x924D692CA61BE758},  // 1e100
20748
    {0x6F8B2FB00C77836C, 0xB6E0C377CFA2E12E},  // 1e101
20749
    {0x0B6DFB9C0F956447, 0xE498F455C38B997A},  // 1e102
20750
    {0x4724BD4189BD5EAC, 0x8EDF98B59A373FEC},  // 1e103
20751
    {0x58EDEC91EC2CB657, 0xB2977EE300C50FE7},  // 1e104
20752
    {0x2F2967B66737E3ED, 0xDF3D5E9BC0F653E1},  // 1e105
20753
    {0xBD79E0D20082EE74, 0x8B865B215899F46C},  // 1e106
20754
    {0xECD8590680A3AA11, 0xAE67F1E9AEC07187},  // 1e107
20755
    {0xE80E6F4820CC9495, 0xDA01EE641A708DE9},  // 1e108
20756
    {0x3109058D147FDCDD, 0x884134FE908658B2},  // 1e109
20757
    {0xBD4B46F0599FD415, 0xAA51823E34A7EEDE},  // 1e110
20758
    {0x6C9E18AC7007C91A, 0xD4E5E2CDC1D1EA96},  // 1e111
20759
    {0x03E2CF6BC604DDB0, 0x850FADC09923329E},  // 1e112
20760
    {0x84DB8346B786151C, 0xA6539930BF6BFF45},  // 1e113
20761
    {0xE612641865679A63, 0xCFE87F7CEF46FF16},  // 1e114
20762
    {0x4FCB7E8F3F60C07E, 0x81F14FAE158C5F6E},  // 1e115
20763
    {0xE3BE5E330F38F09D, 0xA26DA3999AEF7749},  // 1e116
20764
    {0x5CADF5BFD3072CC5, 0xCB090C8001AB551C},  // 1e117
20765
    {0x73D9732FC7C8F7F6, 0xFDCB4FA002162A63},  // 1e118
20766
    {0x2867E7FDDCDD9AFA, 0x9E9F11C4014DDA7E},  // 1e119
20767
    {0xB281E1FD541501B8, 0xC646D63501A1511D},  // 1e120
20768
    {0x1F225A7CA91A4226, 0xF7D88BC24209A565},  // 1e121
20769
    {0x3375788DE9B06958, 0x9AE757596946075F},  // 1e122
20770
    {0x0052D6B1641C83AE, 0xC1A12D2FC3978937},  // 1e123
20771
    {0xC0678C5DBD23A49A, 0xF209787BB47D6B84},  // 1e124
20772
    {0xF840B7BA963646E0, 0x9745EB4D50CE6332},  // 1e125
20773
    {0xB650E5A93BC3D898, 0xBD176620A501FBFF},  // 1e126
20774
    {0xA3E51F138AB4CEBE, 0xEC5D3FA8CE427AFF},  // 1e127
20775
    {0xC66F336C36B10137, 0x93BA47C980E98CDF},  // 1e128
20776
    {0xB80B0047445D4184, 0xB8A8D9BBE123F017},  // 1e129
20777
    {0xA60DC059157491E5, 0xE6D3102AD96CEC1D},  // 1e130
20778
    {0x87C89837AD68DB2F, 0x9043EA1AC7E41392},  // 1e131
20779
    {0x29BABE4598C311FB, 0xB454E4A179DD1877},  // 1e132
20780
    {0xF4296DD6FEF3D67A, 0xE16A1DC9D8545E94},  // 1e133
20781
    {0x1899E4A65F58660C, 0x8CE2529E2734BB1D},  // 1e134
20782
    {0x5EC05DCFF72E7F8F, 0xB01AE745B101E9E4},  // 1e135
20783
    {0x76707543F4FA1F73, 0xDC21A1171D42645D},  // 1e136
20784
    {0x6A06494A791C53A8, 0x899504AE72497EBA},  // 1e137
20785
    {0x0487DB9D17636892, 0xABFA45DA0EDBDE69},  // 1e138
20786
    {0x45A9D2845D3C42B6, 0xD6F8D7509292D603},  // 1e139
20787
    {0x0B8A2392BA45A9B2, 0x865B86925B9BC5C2},  // 1e140
20788
    {0x8E6CAC7768D7141E, 0xA7F26836F282B732},  // 1e141
20789
    {0x3207D795430CD926, 0xD1EF0244AF2364FF},  // 1e142
20790
    {0x7F44E6BD49E807B8, 0x8335616AED761F1F},  // 1e143
20791
    {0x5F16206C9C6209A6, 0xA402B9C5A8D3A6E7},  // 1e144
20792
    {0x36DBA887C37A8C0F, 0xCD036837130890A1},  // 1e145
20793
    {0xC2494954DA2C9789, 0x802221226BE55A64},  // 1e146
20794
    {0xF2DB9BAA10B7BD6C, 0xA02AA96B06DEB0FD},  // 1e147
20795
    {0x6F92829494E5ACC7, 0xC83553C5C8965D3D},  // 1e148
20796
    {0xCB772339BA1F17F9, 0xFA42A8B73ABBF48C},  // 1e149
20797
    {0xFF2A760414536EFB, 0x9C69A97284B578D7},  // 1e150
20798
    {0xFEF5138519684ABA, 0xC38413CF25E2D70D},  // 1e151
20799
    {0x7EB258665FC25D69, 0xF46518C2EF5B8CD1},  // 1e152
20800
    {0xEF2F773FFBD97A61, 0x98BF2F79D5993802},  // 1e153
20801
    {0xAAFB550FFACFD8FA, 0xBEEEFB584AFF8603},  // 1e154
20802
    {0x95BA2A53F983CF38, 0xEEAABA2E5DBF6784},  // 1e155
20803
    {0xDD945A747BF26183, 0x952AB45CFA97A0B2},  // 1e156
20804
    {0x94F971119AEEF9E4, 0xBA756174393D88DF},  // 1e157
20805
    {0x7A37CD5601AAB85D, 0xE912B9D1478CEB17},  // 1e158
20806
    {0xAC62E055C10AB33A, 0x91ABB422CCB812EE},  // 1e159
20807
    {0x577B986B314D6009, 0xB616A12B7FE617AA},  // 1e160
20808
    {0xED5A7E85FDA0B80B, 0xE39C49765FDF9D94},  // 1e161
20809
    {0x14588F13BE847307, 0x8E41ADE9FBEBC27D},  // 1e162
20810
    {0x596EB2D8AE258FC8, 0xB1D219647AE6B31C},  // 1e163
20811
    {0x6FCA5F8ED9AEF3BB, 0xDE469FBD99A05FE3},  // 1e164
20812
    {0x25DE7BB9480D5854, 0x8AEC23D680043BEE},  // 1e165
20813
    {0xAF561AA79A10AE6A, 0xADA72CCC20054AE9},  // 1e166
20814
    {0x1B2BA1518094DA04, 0xD910F7FF28069DA4},  // 1e167
20815
    {0x90FB44D2F05D0842, 0x87AA9AFF79042286},  // 1e168
20816
    {0x353A1607AC744A53, 0xA99541BF57452B28},  // 1e169
20817
    {0x42889B8997915CE8, 0xD3FA922F2D1675F2},  // 1e170
20818
    {0x69956135FEBADA11, 0x847C9B5D7C2E09B7},  // 1e171
20819
    {0x43FAB9837E699095, 0xA59BC234DB398C25},  // 1e172
20820
    {0x94F967E45E03F4BB, 0xCF02B2C21207EF2E},  // 1e173
20821
    {0x1D1BE0EEBAC278F5, 0x8161AFB94B44F57D},  // 1e174
20822
    {0x6462D92A69731732, 0xA1BA1BA79E1632DC},  // 1e175
20823
    {0x7D7B8F7503CFDCFE, 0xCA28A291859BBF93},  // 1e176
20824
    {0x5CDA735244C3D43E, 0xFCB2CB35E702AF78},  // 1e177
20825
    {0x3A0888136AFA64A7, 0x9DEFBF01B061ADAB},  // 1e178
20826
    {0x088AAA1845B8FDD0, 0xC56BAEC21C7A1916},  // 1e179
20827
    {0x8AAD549E57273D45, 0xF6C69A72A3989F5B},  // 1e180
20828
    {0x36AC54E2F678864B, 0x9A3C2087A63F6399},  // 1e181
20829
    {0x84576A1BB416A7DD, 0xC0CB28A98FCF3C7F},  // 1e182
20830
    {0x656D44A2A11C51D5, 0xF0FDF2D3F3C30B9F},  // 1e183
20831
    {0x9F644AE5A4B1B325, 0x969EB7C47859E743},  // 1e184
20832
    {0x873D5D9F0DDE1FEE, 0xBC4665B596706114},  // 1e185
20833
    {0xA90CB506D155A7EA, 0xEB57FF22FC0C7959},  // 1e186
20834
    {0x09A7F12442D588F2, 0x9316FF75DD87CBD8},  // 1e187
20835
    {0x0C11ED6D538AEB2F, 0xB7DCBF5354E9BECE},  // 1e188
20836
    {0x8F1668C8A86DA5FA, 0xE5D3EF282A242E81},  // 1e189
20837
    {0xF96E017D694487BC, 0x8FA475791A569D10},  // 1e190
20838
    {0x37C981DCC395A9AC, 0xB38D92D760EC4455},  // 1e191
20839
    {0x85BBE253F47B1417, 0xE070F78D3927556A},  // 1e192
20840
    {0x93956D7478CCEC8E, 0x8C469AB843B89562},  // 1e193
20841
    {0x387AC8D1970027B2, 0xAF58416654A6BABB},  // 1e194
20842
    {0x06997B05FCC0319E, 0xDB2E51BFE9D0696A},  // 1e195
20843
    {0x441FECE3BDF81F03, 0x88FCF317F22241E2},  // 1e196
20844
    {0xD527E81CAD7626C3, 0xAB3C2FDDEEAAD25A},  // 1e197
20845
    {0x8A71E223D8D3B074, 0xD60B3BD56A5586F1},  // 1e198
20846
    {0xF6872D5667844E49, 0x85C7056562757456},  // 1e199
20847
    {0xB428F8AC016561DB, 0xA738C6BEBB12D16C},  // 1e200
20848
    {0xE13336D701BEBA52, 0xD106F86E69D785C7},  // 1e201
20849
    {0xECC0024661173473, 0x82A45B450226B39C},  // 1e202
20850
    {0x27F002D7F95D0190, 0xA34D721642B06084},  // 1e203
20851
    {0x31EC038DF7B441F4, 0xCC20CE9BD35C78A5},  // 1e204
20852
    {0x7E67047175A15271, 0xFF290242C83396CE},  // 1e205
20853
    {0x0F0062C6E984D386, 0x9F79A169BD203E41},  // 1e206
20854
    {0x52C07B78A3E60868, 0xC75809C42C684DD1},  // 1e207
20855
    {0xA7709A56CCDF8A82, 0xF92E0C3537826145},  // 1e208
20856
    {0x88A66076400BB691, 0x9BBCC7A142B17CCB},  // 1e209
20857
    {0x6ACFF893D00EA435, 0xC2ABF989935DDBFE},  // 1e210
20858
    {0x0583F6B8C4124D43, 0xF356F7EBF83552FE},  // 1e211
20859
    {0xC3727A337A8B704A, 0x98165AF37B2153DE},  // 1e212
20860
    {0x744F18C0592E4C5C, 0xBE1BF1B059E9A8D6},  // 1e213
20861
    {0x1162DEF06F79DF73, 0xEDA2EE1C7064130C},  // 1e214
20862
    {0x8ADDCB5645AC2BA8, 0x9485D4D1C63E8BE7},  // 1e215
20863
    {0x6D953E2BD7173692, 0xB9A74A0637CE2EE1},  // 1e216
20864
    {0xC8FA8DB6CCDD0437, 0xE8111C87C5C1BA99},  // 1e217
20865
    {0x1D9C9892400A22A2, 0x910AB1D4DB9914A0},  // 1e218
20866
    {0x2503BEB6D00CAB4B, 0xB54D5E4A127F59C8},  // 1e219
20867
    {0x2E44AE64840FD61D, 0xE2A0B5DC971F303A},  // 1e220
20868
    {0x5CEAECFED289E5D2, 0x8DA471A9DE737E24},  // 1e221
20869
    {0x7425A83E872C5F47, 0xB10D8E1456105DAD},  // 1e222
20870
    {0xD12F124E28F77719, 0xDD50F1996B947518},  // 1e223
20871
    {0x82BD6B70D99AAA6F, 0x8A5296FFE33CC92F},  // 1e224
20872
    {0x636CC64D1001550B, 0xACE73CBFDC0BFB7B},  // 1e225
20873
    {0x3C47F7E05401AA4E, 0xD8210BEFD30EFA5A},  // 1e226
20874
    {0x65ACFAEC34810A71, 0x8714A775E3E95C78},  // 1e227
20875
    {0x7F1839A741A14D0D, 0xA8D9D1535CE3B396},  // 1e228
20876
    {0x1EDE48111209A050, 0xD31045A8341CA07C},  // 1e229
20877
    {0x934AED0AAB460432, 0x83EA2B892091E44D},  // 1e230
20878
    {0xF81DA84D5617853F, 0xA4E4B66B68B65D60},  // 1e231
20879
    {0x36251260AB9D668E, 0xCE1DE40642E3F4B9},  // 1e232
20880
    {0xC1D72B7C6B426019, 0x80D2AE83E9CE78F3},  // 1e233
20881
    {0xB24CF65B8612F81F, 0xA1075A24E4421730},  // 1e234
20882
    {0xDEE033F26797B627, 0xC94930AE1D529CFC},  // 1e235
20883
    {0x169840EF017DA3B1, 0xFB9B7CD9A4A7443C},  // 1e236
20884
    {0x8E1F289560EE864E, 0x9D412E0806E88AA5},  // 1e237
20885
    {0xF1A6F2BAB92A27E2, 0xC491798A08A2AD4E},  // 1e238
20886
    {0xAE10AF696774B1DB, 0xF5B5D7EC8ACB58A2},  // 1e239
20887
    {0xACCA6DA1E0A8EF29, 0x9991A6F3D6BF1765},  // 1e240
20888
    {0x17FD090A58D32AF3, 0xBFF610B0CC6EDD3F},  // 1e241
20889
    {0xDDFC4B4CEF07F5B0, 0xEFF394DCFF8A948E},  // 1e242
20890
    {0x4ABDAF101564F98E, 0x95F83D0A1FB69CD9},  // 1e243
20891
    {0x9D6D1AD41ABE37F1, 0xBB764C4CA7A4440F},  // 1e244
20892
    {0x84C86189216DC5ED, 0xEA53DF5FD18D5513},  // 1e245
20893
    {0x32FD3CF5B4E49BB4, 0x92746B9BE2F8552C},  // 1e246
20894
    {0x3FBC8C33221DC2A1, 0xB7118682DBB66A77},  // 1e247
20895
    {0x0FABAF3FEAA5334A, 0xE4D5E82392A40515},  // 1e248
20896
    {0x29CB4D87F2A7400E, 0x8F05B1163BA6832D},  // 1e249
20897
    {0x743E20E9EF511012, 0xB2C71D5BCA9023F8},  // 1e250
20898
    {0x914DA9246B255416, 0xDF78E4B2BD342CF6},  // 1e251
20899
    {0x1AD089B6C2F7548E, 0x8BAB8EEFB6409C1A},  // 1e252
20900
    {0xA184AC2473B529B1, 0xAE9672ABA3D0C320},  // 1e253
20901
    {0xC9E5D72D90A2741E, 0xDA3C0F568CC4F3E8},  // 1e254
20902
    {0x7E2FA67C7A658892, 0x8865899617FB1871},  // 1e255
20903
    {0xDDBB901B98FEEAB7, 0xAA7EEBFB9DF9DE8D},  // 1e256
20904
    {0x552A74227F3EA565, 0xD51EA6FA85785631},  // 1e257
20905
    {0xD53A88958F87275F, 0x8533285C936B35DE},  // 1e258
20906
    {0x8A892ABAF368F137, 0xA67FF273B8460356},  // 1e259
20907
    {0x2D2B7569B0432D85, 0xD01FEF10A657842C},  // 1e260
20908
    {0x9C3B29620E29FC73, 0x8213F56A67F6B29B},  // 1e261
20909
    {0x8349F3BA91B47B8F, 0xA298F2C501F45F42},  // 1e262
20910
    {0x241C70A936219A73, 0xCB3F2F7642717713},  // 1e263
20911
    {0xED238CD383AA0110, 0xFE0EFB53D30DD4D7},  // 1e264
20912
    {0xF4363804324A40AA, 0x9EC95D1463E8A506},  // 1e265
20913
    {0xB143C6053EDCD0D5, 0xC67BB4597CE2CE48},  // 1e266
20914
    {0xDD94B7868E94050A, 0xF81AA16FDC1B81DA},  // 1e267
20915
    {0xCA7CF2B4191C8326, 0x9B10A4E5E9913128},  // 1e268
20916
    {0xFD1C2F611F63A3F0, 0xC1D4CE1F63F57D72},  // 1e269
20917
    {0xBC633B39673C8CEC, 0xF24A01A73CF2DCCF},  // 1e270
20918
    {0xD5BE0503E085D813, 0x976E41088617CA01},  // 1e271
20919
    {0x4B2D8644D8A74E18, 0xBD49D14AA79DBC82},  // 1e272
20920
    {0xDDF8E7D60ED1219E, 0xEC9C459D51852BA2},  // 1e273
20921
    {0xCABB90E5C942B503, 0x93E1AB8252F33B45},  // 1e274
20922
    {0x3D6A751F3B936243, 0xB8DA1662E7B00A17},  // 1e275
20923
    {0x0CC512670A783AD4, 0xE7109BFBA19C0C9D},  // 1e276
20924
    {0x27FB2B80668B24C5, 0x906A617D450187E2},  // 1e277
20925
    {0xB1F9F660802DEDF6, 0xB484F9DC9641E9DA},  // 1e278
20926
    {0x5E7873F8A0396973, 0xE1A63853BBD26451},  // 1e279
20927
    {0xDB0B487B6423E1E8, 0x8D07E33455637EB2},  // 1e280
20928
    {0x91CE1A9A3D2CDA62, 0xB049DC016ABC5E5F},  // 1e281
20929
    {0x7641A140CC7810FB, 0xDC5C5301C56B75F7},  // 1e282
20930
    {0xA9E904C87FCB0A9D, 0x89B9B3E11B6329BA},  // 1e283
20931
    {0x546345FA9FBDCD44, 0xAC2820D9623BF429},  // 1e284
20932
    {0xA97C177947AD4095, 0xD732290FBACAF133},  // 1e285
20933
    {0x49ED8EABCCCC485D, 0x867F59A9D4BED6C0},  // 1e286
20934
    {0x5C68F256BFFF5A74, 0xA81F301449EE8C70},  // 1e287
20935
    {0x73832EEC6FFF3111, 0xD226FC195C6A2F8C},  // 1e288
20936
};
20937
20938
// wuffs_private_impl__f64_powers_of_10 holds powers of 10 that can be exactly
20939
// represented by a float64 (what C calls a double).
20940
static const double wuffs_private_impl__f64_powers_of_10[23] = {
20941
    1e0,  1e1,  1e2,  1e3,  1e4,  1e5,  1e6,  1e7,  1e8,  1e9,  1e10, 1e11,
20942
    1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19, 1e20, 1e21, 1e22,
20943
};
20944
20945
// ---------------- IEEE 754 Floating Point
20946
20947
WUFFS_BASE__MAYBE_STATIC wuffs_base__lossy_value_u16  //
20948
0
wuffs_base__ieee_754_bit_representation__from_f64_to_u16_truncate(double f) {
20949
0
  uint64_t u = 0;
20950
0
  if (sizeof(uint64_t) == sizeof(double)) {
20951
0
    memcpy(&u, &f, sizeof(uint64_t));
20952
0
  }
20953
0
  uint16_t neg = ((uint16_t)((u >> 63) << 15));
20954
0
  u &= 0x7FFFFFFFFFFFFFFF;
20955
0
  uint64_t exp = u >> 52;
20956
0
  uint64_t man = u & 0x000FFFFFFFFFFFFF;
20957
20958
0
  if (exp == 0x7FF) {
20959
0
    if (man == 0) {  // Infinity.
20960
0
      wuffs_base__lossy_value_u16 ret;
20961
0
      ret.value = neg | 0x7C00;
20962
0
      ret.lossy = false;
20963
0
      return ret;
20964
0
    }
20965
    // NaN. Shift the 52 mantissa bits to 10 mantissa bits, keeping the most
20966
    // significant mantissa bit (quiet vs signaling NaNs). Also set the low 9
20967
    // bits of ret.value so that the 10-bit mantissa is non-zero.
20968
0
    wuffs_base__lossy_value_u16 ret;
20969
0
    ret.value = neg | 0x7DFF | ((uint16_t)(man >> 42));
20970
0
    ret.lossy = false;
20971
0
    return ret;
20972
20973
0
  } else if (exp > 0x40E) {  // Truncate to the largest finite f16.
20974
0
    wuffs_base__lossy_value_u16 ret;
20975
0
    ret.value = neg | 0x7BFF;
20976
0
    ret.lossy = true;
20977
0
    return ret;
20978
20979
0
  } else if (exp <= 0x3E6) {  // Truncate to zero.
20980
0
    wuffs_base__lossy_value_u16 ret;
20981
0
    ret.value = neg;
20982
0
    ret.lossy = (u != 0);
20983
0
    return ret;
20984
20985
0
  } else if (exp <= 0x3F0) {  // Normal f64, subnormal f16.
20986
    // Convert from a 53-bit mantissa (after realizing the implicit bit) to a
20987
    // 10-bit mantissa and then adjust for the exponent.
20988
0
    man |= 0x0010000000000000;
20989
0
    uint32_t shift = ((uint32_t)(1051 - exp));  // 1051 = 0x3F0 + 53 - 10.
20990
0
    uint64_t shifted_man = man >> shift;
20991
0
    wuffs_base__lossy_value_u16 ret;
20992
0
    ret.value = neg | ((uint16_t)shifted_man);
20993
0
    ret.lossy = (shifted_man << shift) != man;
20994
0
    return ret;
20995
0
  }
20996
20997
  // Normal f64, normal f16.
20998
20999
  // Re-bias from 1023 to 15 and shift above f16's 10 mantissa bits.
21000
0
  exp = (exp - 1008) << 10;  // 1008 = 1023 - 15 = 0x3FF - 0xF.
21001
21002
  // Convert from a 52-bit mantissa (excluding the implicit bit) to a 10-bit
21003
  // mantissa (again excluding the implicit bit). We lose some information if
21004
  // any of the bottom 42 bits are non-zero.
21005
0
  wuffs_base__lossy_value_u16 ret;
21006
0
  ret.value = neg | ((uint16_t)exp) | ((uint16_t)(man >> 42));
21007
0
  ret.lossy = (man << 22) != 0;
21008
0
  return ret;
21009
0
}
21010
21011
WUFFS_BASE__MAYBE_STATIC wuffs_base__lossy_value_u32  //
21012
0
wuffs_base__ieee_754_bit_representation__from_f64_to_u32_truncate(double f) {
21013
0
  uint64_t u = 0;
21014
0
  if (sizeof(uint64_t) == sizeof(double)) {
21015
0
    memcpy(&u, &f, sizeof(uint64_t));
21016
0
  }
21017
0
  uint32_t neg = ((uint32_t)(u >> 63)) << 31;
21018
0
  u &= 0x7FFFFFFFFFFFFFFF;
21019
0
  uint64_t exp = u >> 52;
21020
0
  uint64_t man = u & 0x000FFFFFFFFFFFFF;
21021
21022
0
  if (exp == 0x7FF) {
21023
0
    if (man == 0) {  // Infinity.
21024
0
      wuffs_base__lossy_value_u32 ret;
21025
0
      ret.value = neg | 0x7F800000;
21026
0
      ret.lossy = false;
21027
0
      return ret;
21028
0
    }
21029
    // NaN. Shift the 52 mantissa bits to 23 mantissa bits, keeping the most
21030
    // significant mantissa bit (quiet vs signaling NaNs). Also set the low 22
21031
    // bits of ret.value so that the 23-bit mantissa is non-zero.
21032
0
    wuffs_base__lossy_value_u32 ret;
21033
0
    ret.value = neg | 0x7FBFFFFF | ((uint32_t)(man >> 29));
21034
0
    ret.lossy = false;
21035
0
    return ret;
21036
21037
0
  } else if (exp > 0x47E) {  // Truncate to the largest finite f32.
21038
0
    wuffs_base__lossy_value_u32 ret;
21039
0
    ret.value = neg | 0x7F7FFFFF;
21040
0
    ret.lossy = true;
21041
0
    return ret;
21042
21043
0
  } else if (exp <= 0x369) {  // Truncate to zero.
21044
0
    wuffs_base__lossy_value_u32 ret;
21045
0
    ret.value = neg;
21046
0
    ret.lossy = (u != 0);
21047
0
    return ret;
21048
21049
0
  } else if (exp <= 0x380) {  // Normal f64, subnormal f32.
21050
    // Convert from a 53-bit mantissa (after realizing the implicit bit) to a
21051
    // 23-bit mantissa and then adjust for the exponent.
21052
0
    man |= 0x0010000000000000;
21053
0
    uint32_t shift = ((uint32_t)(926 - exp));  // 926 = 0x380 + 53 - 23.
21054
0
    uint64_t shifted_man = man >> shift;
21055
0
    wuffs_base__lossy_value_u32 ret;
21056
0
    ret.value = neg | ((uint32_t)shifted_man);
21057
0
    ret.lossy = (shifted_man << shift) != man;
21058
0
    return ret;
21059
0
  }
21060
21061
  // Normal f64, normal f32.
21062
21063
  // Re-bias from 1023 to 127 and shift above f32's 23 mantissa bits.
21064
0
  exp = (exp - 896) << 23;  // 896 = 1023 - 127 = 0x3FF - 0x7F.
21065
21066
  // Convert from a 52-bit mantissa (excluding the implicit bit) to a 23-bit
21067
  // mantissa (again excluding the implicit bit). We lose some information if
21068
  // any of the bottom 29 bits are non-zero.
21069
0
  wuffs_base__lossy_value_u32 ret;
21070
0
  ret.value = neg | ((uint32_t)exp) | ((uint32_t)(man >> 29));
21071
0
  ret.lossy = (man << 35) != 0;
21072
0
  return ret;
21073
0
}
21074
21075
// --------
21076
21077
0
#define WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE 2047
21078
0
#define WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION 800
21079
21080
// WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL is the largest N such that
21081
// ((10 << N) < (1 << 64)).
21082
0
#define WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL 60
21083
21084
// wuffs_private_impl__high_prec_dec (abbreviated as HPD) is a fixed precision
21085
// floating point decimal number, augmented with ยฑinfinity values, but it
21086
// cannot represent NaN (Not a Number).
21087
//
21088
// "High precision" means that the mantissa holds 800 decimal digits. 800 is
21089
// WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION.
21090
//
21091
// An HPD isn't for general purpose arithmetic, only for conversions to and
21092
// from IEEE 754 double-precision floating point, where the largest and
21093
// smallest positive, finite values are approximately 1.8e+308 and 4.9e-324.
21094
// HPD exponents above +2047 mean infinity, below -2047 mean zero. The ยฑ2047
21095
// bounds are further away from zero than ยฑ(324 + 800), where 800 and 2047 is
21096
// WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION and
21097
// WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE.
21098
//
21099
// digits[.. num_digits] are the number's digits in big-endian order. The
21100
// uint8_t values are in the range [0 ..= 9], not ['0' ..= '9'], where e.g. '7'
21101
// is the ASCII value 0x37.
21102
//
21103
// decimal_point is the index (within digits) of the decimal point. It may be
21104
// negative or be larger than num_digits, in which case the explicit digits are
21105
// padded with implicit zeroes.
21106
//
21107
// For example, if num_digits is 3 and digits is "\x07\x08\x09":
21108
//  - A decimal_point of -2 means ".00789"
21109
//  - A decimal_point of -1 means ".0789"
21110
//  - A decimal_point of +0 means ".789"
21111
//  - A decimal_point of +1 means "7.89"
21112
//  - A decimal_point of +2 means "78.9"
21113
//  - A decimal_point of +3 means "789."
21114
//  - A decimal_point of +4 means "7890."
21115
//  - A decimal_point of +5 means "78900."
21116
//
21117
// As above, a decimal_point higher than +2047 means that the overall value is
21118
// infinity, lower than -2047 means zero.
21119
//
21120
// negative is a sign bit. An HPD can distinguish positive and negative zero.
21121
//
21122
// truncated is whether there are more than
21123
// WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION digits, and at least one of those
21124
// extra digits are non-zero. The existence of long-tail digits can affect
21125
// rounding.
21126
//
21127
// The "all fields are zero" value is valid, and represents the number +0.
21128
typedef struct wuffs_private_impl__high_prec_dec__struct {
21129
  uint32_t num_digits;
21130
  int32_t decimal_point;
21131
  bool negative;
21132
  bool truncated;
21133
  uint8_t digits[WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION];
21134
} wuffs_private_impl__high_prec_dec;
21135
21136
// wuffs_private_impl__high_prec_dec__trim trims trailing zeroes from the
21137
// h->digits[.. h->num_digits] slice. They have no benefit, since we explicitly
21138
// track h->decimal_point.
21139
//
21140
// Preconditions:
21141
//  - h is non-NULL.
21142
static inline void  //
21143
0
wuffs_private_impl__high_prec_dec__trim(wuffs_private_impl__high_prec_dec* h) {
21144
0
  while ((h->num_digits > 0) && (h->digits[h->num_digits - 1] == 0)) {
21145
0
    h->num_digits--;
21146
0
  }
21147
0
}
21148
21149
// wuffs_private_impl__high_prec_dec__assign sets h to represent the number x.
21150
//
21151
// Preconditions:
21152
//  - h is non-NULL.
21153
static void  //
21154
wuffs_private_impl__high_prec_dec__assign(wuffs_private_impl__high_prec_dec* h,
21155
                                          uint64_t x,
21156
0
                                          bool negative) {
21157
0
  uint32_t n = 0;
21158
21159
  // Set h->digits.
21160
0
  if (x > 0) {
21161
    // Calculate the digits, working right-to-left. After we determine n (how
21162
    // many digits there are), copy from buf to h->digits.
21163
    //
21164
    // UINT64_MAX, 18446744073709551615, is 20 digits long. It can be faster to
21165
    // copy a constant number of bytes than a variable number (20 instead of
21166
    // n). Make buf large enough (and start writing to it from the middle) so
21167
    // that can we always copy 20 bytes: the slice buf[(20-n) .. (40-n)].
21168
0
    uint8_t buf[40] = {0};
21169
0
    uint8_t* ptr = &buf[20];
21170
0
    do {
21171
0
      uint64_t remaining = x / 10;
21172
0
      x -= remaining * 10;
21173
0
      ptr--;
21174
0
      *ptr = (uint8_t)x;
21175
0
      n++;
21176
0
      x = remaining;
21177
0
    } while (x > 0);
21178
0
    memcpy(h->digits, ptr, 20);
21179
0
  }
21180
21181
  // Set h's other fields.
21182
0
  h->num_digits = n;
21183
0
  h->decimal_point = (int32_t)n;
21184
0
  h->negative = negative;
21185
0
  h->truncated = false;
21186
0
  wuffs_private_impl__high_prec_dec__trim(h);
21187
0
}
21188
21189
static wuffs_base__status  //
21190
wuffs_private_impl__high_prec_dec__parse(wuffs_private_impl__high_prec_dec* h,
21191
                                         wuffs_base__slice_u8 s,
21192
0
                                         uint32_t options) {
21193
0
  if (!h) {
21194
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
21195
0
  }
21196
0
  h->num_digits = 0;
21197
0
  h->decimal_point = 0;
21198
0
  h->negative = false;
21199
0
  h->truncated = false;
21200
21201
0
  uint8_t* p = s.ptr;
21202
0
  uint8_t* q = s.ptr + s.len;
21203
21204
0
  if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) {
21205
0
    for (;; p++) {
21206
0
      if (p >= q) {
21207
0
        return wuffs_base__make_status(wuffs_base__error__bad_argument);
21208
0
      } else if (*p != '_') {
21209
0
        break;
21210
0
      }
21211
0
    }
21212
0
  }
21213
21214
  // Parse sign.
21215
0
  do {
21216
0
    if (*p == '+') {
21217
0
      p++;
21218
0
    } else if (*p == '-') {
21219
0
      h->negative = true;
21220
0
      p++;
21221
0
    } else {
21222
0
      break;
21223
0
    }
21224
0
    if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) {
21225
0
      for (;; p++) {
21226
0
        if (p >= q) {
21227
0
          return wuffs_base__make_status(wuffs_base__error__bad_argument);
21228
0
        } else if (*p != '_') {
21229
0
          break;
21230
0
        }
21231
0
      }
21232
0
    }
21233
0
  } while (0);
21234
21235
  // Parse digits, up to (and including) a '.', 'E' or 'e'. Examples for each
21236
  // limb in this if-else chain:
21237
  //  - "0.789"
21238
  //  - "1002.789"
21239
  //  - ".789"
21240
  //  - Other (invalid input).
21241
0
  uint32_t nd = 0;
21242
0
  int32_t dp = 0;
21243
0
  bool no_digits_before_separator = false;
21244
0
  if (('0' == *p) &&
21245
0
      !(options &
21246
0
        WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_MULTIPLE_LEADING_ZEROES)) {
21247
0
    p++;
21248
0
    for (;; p++) {
21249
0
      if (p >= q) {
21250
0
        goto after_all;
21251
0
      } else if (*p ==
21252
0
                 ((options &
21253
0
                   WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA)
21254
0
                      ? ','
21255
0
                      : '.')) {
21256
0
        p++;
21257
0
        goto after_sep;
21258
0
      } else if ((*p == 'E') || (*p == 'e')) {
21259
0
        p++;
21260
0
        goto after_exp;
21261
0
      } else if ((*p != '_') ||
21262
0
                 !(options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) {
21263
0
        return wuffs_base__make_status(wuffs_base__error__bad_argument);
21264
0
      }
21265
0
    }
21266
21267
0
  } else if (('0' <= *p) && (*p <= '9')) {
21268
0
    if (*p == '0') {
21269
0
      for (; (p < q) && (*p == '0'); p++) {
21270
0
      }
21271
0
    } else {
21272
0
      h->digits[nd++] = (uint8_t)(*p - '0');
21273
0
      dp = (int32_t)nd;
21274
0
      p++;
21275
0
    }
21276
21277
0
    for (;; p++) {
21278
0
      if (p >= q) {
21279
0
        goto after_all;
21280
0
      } else if (('0' <= *p) && (*p <= '9')) {
21281
0
        if (nd < WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION) {
21282
0
          h->digits[nd++] = (uint8_t)(*p - '0');
21283
0
          dp = (int32_t)nd;
21284
0
        } else if ('0' != *p) {
21285
          // Long-tail non-zeroes set the truncated bit.
21286
0
          h->truncated = true;
21287
0
        }
21288
0
      } else if (*p ==
21289
0
                 ((options &
21290
0
                   WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA)
21291
0
                      ? ','
21292
0
                      : '.')) {
21293
0
        p++;
21294
0
        goto after_sep;
21295
0
      } else if ((*p == 'E') || (*p == 'e')) {
21296
0
        p++;
21297
0
        goto after_exp;
21298
0
      } else if ((*p != '_') ||
21299
0
                 !(options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) {
21300
0
        return wuffs_base__make_status(wuffs_base__error__bad_argument);
21301
0
      }
21302
0
    }
21303
21304
0
  } else if (*p == ((options &
21305
0
                     WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA)
21306
0
                        ? ','
21307
0
                        : '.')) {
21308
0
    p++;
21309
0
    no_digits_before_separator = true;
21310
21311
0
  } else {
21312
0
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
21313
0
  }
21314
21315
0
after_sep:
21316
0
  for (;; p++) {
21317
0
    if (p >= q) {
21318
0
      goto after_all;
21319
0
    } else if ('0' == *p) {
21320
0
      if (nd == 0) {
21321
        // Track leading zeroes implicitly.
21322
0
        dp--;
21323
0
      } else if (nd < WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION) {
21324
0
        h->digits[nd++] = (uint8_t)(*p - '0');
21325
0
      }
21326
0
    } else if (('0' < *p) && (*p <= '9')) {
21327
0
      if (nd < WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION) {
21328
0
        h->digits[nd++] = (uint8_t)(*p - '0');
21329
0
      } else {
21330
        // Long-tail non-zeroes set the truncated bit.
21331
0
        h->truncated = true;
21332
0
      }
21333
0
    } else if ((*p == 'E') || (*p == 'e')) {
21334
0
      p++;
21335
0
      goto after_exp;
21336
0
    } else if ((*p != '_') ||
21337
0
               !(options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) {
21338
0
      return wuffs_base__make_status(wuffs_base__error__bad_argument);
21339
0
    }
21340
0
  }
21341
21342
0
after_exp:
21343
0
  do {
21344
0
    if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) {
21345
0
      for (;; p++) {
21346
0
        if (p >= q) {
21347
0
          return wuffs_base__make_status(wuffs_base__error__bad_argument);
21348
0
        } else if (*p != '_') {
21349
0
          break;
21350
0
        }
21351
0
      }
21352
0
    }
21353
21354
0
    int32_t exp_sign = +1;
21355
0
    if (*p == '+') {
21356
0
      p++;
21357
0
    } else if (*p == '-') {
21358
0
      exp_sign = -1;
21359
0
      p++;
21360
0
    }
21361
21362
0
    int32_t exp = 0;
21363
0
    const int32_t exp_large = WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE +
21364
0
                              WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION;
21365
0
    bool saw_exp_digits = false;
21366
0
    for (; p < q; p++) {
21367
0
      if ((*p == '_') &&
21368
0
          (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) {
21369
        // No-op.
21370
0
      } else if (('0' <= *p) && (*p <= '9')) {
21371
0
        saw_exp_digits = true;
21372
0
        if (exp < exp_large) {
21373
0
          exp = (10 * exp) + ((int32_t)(*p - '0'));
21374
0
        }
21375
0
      } else {
21376
0
        break;
21377
0
      }
21378
0
    }
21379
0
    if (!saw_exp_digits) {
21380
0
      return wuffs_base__make_status(wuffs_base__error__bad_argument);
21381
0
    }
21382
0
    dp += exp_sign * exp;
21383
0
  } while (0);
21384
21385
0
after_all:
21386
0
  if (p != q) {
21387
0
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
21388
0
  }
21389
0
  h->num_digits = nd;
21390
0
  if (nd == 0) {
21391
0
    if (no_digits_before_separator) {
21392
0
      return wuffs_base__make_status(wuffs_base__error__bad_argument);
21393
0
    }
21394
0
    h->decimal_point = 0;
21395
0
  } else if (dp < -WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE) {
21396
0
    h->decimal_point = -WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE - 1;
21397
0
  } else if (dp > +WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE) {
21398
0
    h->decimal_point = +WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE + 1;
21399
0
  } else {
21400
0
    h->decimal_point = dp;
21401
0
  }
21402
0
  wuffs_private_impl__high_prec_dec__trim(h);
21403
0
  return wuffs_base__make_status(NULL);
21404
0
}
21405
21406
// --------
21407
21408
// wuffs_private_impl__high_prec_dec__lshift_num_new_digits returns the number
21409
// of additional decimal digits when left-shifting by shift.
21410
//
21411
// See below for preconditions.
21412
static uint32_t  //
21413
wuffs_private_impl__high_prec_dec__lshift_num_new_digits(
21414
    wuffs_private_impl__high_prec_dec* h,
21415
0
    uint32_t shift) {
21416
  // Masking with 0x3F should be unnecessary (assuming the preconditions) but
21417
  // it's cheap and ensures that we don't overflow the
21418
  // wuffs_private_impl__hpd_left_shift array.
21419
0
  shift &= 63;
21420
21421
0
  uint32_t x_a = wuffs_private_impl__hpd_left_shift[shift];
21422
0
  uint32_t x_b = wuffs_private_impl__hpd_left_shift[shift + 1];
21423
0
  uint32_t num_new_digits = x_a >> 11;
21424
0
  uint32_t pow5_a = 0x7FF & x_a;
21425
0
  uint32_t pow5_b = 0x7FF & x_b;
21426
21427
0
  const uint8_t* pow5 = &wuffs_private_impl__powers_of_5[pow5_a];
21428
0
  uint32_t i = 0;
21429
0
  uint32_t n = pow5_b - pow5_a;
21430
0
  for (; i < n; i++) {
21431
0
    if (i >= h->num_digits) {
21432
0
      return num_new_digits - 1;
21433
0
    } else if (h->digits[i] == pow5[i]) {
21434
0
      continue;
21435
0
    } else if (h->digits[i] < pow5[i]) {
21436
0
      return num_new_digits - 1;
21437
0
    } else {
21438
0
      return num_new_digits;
21439
0
    }
21440
0
  }
21441
0
  return num_new_digits;
21442
0
}
21443
21444
// --------
21445
21446
// wuffs_private_impl__high_prec_dec__rounded_integer returns the integral
21447
// (non-fractional) part of h, provided that it is 18 or fewer decimal digits.
21448
// For 19 or more digits, it returns UINT64_MAX. Note that:
21449
//  - (1 << 53) is    9007199254740992, which has 16 decimal digits.
21450
//  - (1 << 56) is   72057594037927936, which has 17 decimal digits.
21451
//  - (1 << 59) is  576460752303423488, which has 18 decimal digits.
21452
//  - (1 << 63) is 9223372036854775808, which has 19 decimal digits.
21453
// and that IEEE 754 double precision has 52 mantissa bits.
21454
//
21455
// That integral part is rounded-to-even: rounding 7.5 or 8.5 both give 8.
21456
//
21457
// h's negative bit is ignored: rounding -8.6 returns 9.
21458
//
21459
// See below for preconditions.
21460
static uint64_t  //
21461
wuffs_private_impl__high_prec_dec__rounded_integer(
21462
0
    wuffs_private_impl__high_prec_dec* h) {
21463
0
  if ((h->num_digits == 0) || (h->decimal_point < 0)) {
21464
0
    return 0;
21465
0
  } else if (h->decimal_point > 18) {
21466
0
    return UINT64_MAX;
21467
0
  }
21468
21469
0
  uint32_t dp = (uint32_t)(h->decimal_point);
21470
0
  uint64_t n = 0;
21471
0
  uint32_t i = 0;
21472
0
  for (; i < dp; i++) {
21473
0
    n = (10 * n) + ((i < h->num_digits) ? h->digits[i] : 0);
21474
0
  }
21475
21476
0
  bool round_up = false;
21477
0
  if (dp < h->num_digits) {
21478
0
    round_up = h->digits[dp] >= 5;
21479
0
    if ((h->digits[dp] == 5) && (dp + 1 == h->num_digits)) {
21480
      // We are exactly halfway. If we're truncated, round up, otherwise round
21481
      // to even.
21482
0
      round_up = h->truncated ||  //
21483
0
                 ((dp > 0) && (1 & h->digits[dp - 1]));
21484
0
    }
21485
0
  }
21486
0
  if (round_up) {
21487
0
    n++;
21488
0
  }
21489
21490
0
  return n;
21491
0
}
21492
21493
// wuffs_private_impl__high_prec_dec__small_xshift shifts h's number (where 'x'
21494
// is 'l' or 'r' for left or right) by a small shift value.
21495
//
21496
// Preconditions:
21497
//  - h is non-NULL.
21498
//  - h->decimal_point is "not extreme".
21499
//  - shift is non-zero.
21500
//  - shift is "a small shift".
21501
//
21502
// "Not extreme" means within ยฑWUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE.
21503
//
21504
// "A small shift" means not more than
21505
// WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL.
21506
//
21507
// wuffs_private_impl__high_prec_dec__rounded_integer and
21508
// wuffs_private_impl__high_prec_dec__lshift_num_new_digits have the same
21509
// preconditions.
21510
//
21511
// wuffs_private_impl__high_prec_dec__lshift keeps the first two preconditions
21512
// but not the last two. Its shift argument is signed and does not need to be
21513
// "small": zero is a no-op, positive means left shift and negative means right
21514
// shift.
21515
21516
static void  //
21517
wuffs_private_impl__high_prec_dec__small_lshift(
21518
    wuffs_private_impl__high_prec_dec* h,
21519
0
    uint32_t shift) {
21520
0
  if (h->num_digits == 0) {
21521
0
    return;
21522
0
  }
21523
0
  uint32_t num_new_digits =
21524
0
      wuffs_private_impl__high_prec_dec__lshift_num_new_digits(h, shift);
21525
0
  uint32_t rx = h->num_digits - 1;                   // Read  index.
21526
0
  uint32_t wx = h->num_digits - 1 + num_new_digits;  // Write index.
21527
0
  uint64_t n = 0;
21528
21529
  // Repeat: pick up a digit, put down a digit, right to left.
21530
0
  while (((int32_t)rx) >= 0) {
21531
0
    n += ((uint64_t)(h->digits[rx])) << shift;
21532
0
    uint64_t quo = n / 10;
21533
0
    uint64_t rem = n - (10 * quo);
21534
0
    if (wx < WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION) {
21535
0
      h->digits[wx] = (uint8_t)rem;
21536
0
    } else if (rem > 0) {
21537
0
      h->truncated = true;
21538
0
    }
21539
0
    n = quo;
21540
0
    wx--;
21541
0
    rx--;
21542
0
  }
21543
21544
  // Put down leading digits, right to left.
21545
0
  while (n > 0) {
21546
0
    uint64_t quo = n / 10;
21547
0
    uint64_t rem = n - (10 * quo);
21548
0
    if (wx < WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION) {
21549
0
      h->digits[wx] = (uint8_t)rem;
21550
0
    } else if (rem > 0) {
21551
0
      h->truncated = true;
21552
0
    }
21553
0
    n = quo;
21554
0
    wx--;
21555
0
  }
21556
21557
  // Finish.
21558
0
  h->num_digits += num_new_digits;
21559
0
  if (h->num_digits > WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION) {
21560
0
    h->num_digits = WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION;
21561
0
  }
21562
0
  h->decimal_point += (int32_t)num_new_digits;
21563
0
  wuffs_private_impl__high_prec_dec__trim(h);
21564
0
}
21565
21566
static void  //
21567
wuffs_private_impl__high_prec_dec__small_rshift(
21568
    wuffs_private_impl__high_prec_dec* h,
21569
0
    uint32_t shift) {
21570
0
  uint32_t rx = 0;  // Read  index.
21571
0
  uint32_t wx = 0;  // Write index.
21572
0
  uint64_t n = 0;
21573
21574
  // Pick up enough leading digits to cover the first shift.
21575
0
  while ((n >> shift) == 0) {
21576
0
    if (rx < h->num_digits) {
21577
      // Read a digit.
21578
0
      n = (10 * n) + h->digits[rx++];
21579
0
    } else if (n == 0) {
21580
      // h's number used to be zero and remains zero.
21581
0
      return;
21582
0
    } else {
21583
      // Read sufficient implicit trailing zeroes.
21584
0
      while ((n >> shift) == 0) {
21585
0
        n = 10 * n;
21586
0
        rx++;
21587
0
      }
21588
0
      break;
21589
0
    }
21590
0
  }
21591
0
  h->decimal_point -= ((int32_t)(rx - 1));
21592
0
  if (h->decimal_point < -WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE) {
21593
    // After the shift, h's number is effectively zero.
21594
0
    h->num_digits = 0;
21595
0
    h->decimal_point = 0;
21596
0
    h->truncated = false;
21597
0
    return;
21598
0
  }
21599
21600
  // Repeat: pick up a digit, put down a digit, left to right.
21601
0
  uint64_t mask = (((uint64_t)(1)) << shift) - 1;
21602
0
  while (rx < h->num_digits) {
21603
0
    uint8_t new_digit = ((uint8_t)(n >> shift));
21604
0
    n = (10 * (n & mask)) + h->digits[rx++];
21605
0
    h->digits[wx++] = new_digit;
21606
0
  }
21607
21608
  // Put down trailing digits, left to right.
21609
0
  while (n > 0) {
21610
0
    uint8_t new_digit = ((uint8_t)(n >> shift));
21611
0
    n = 10 * (n & mask);
21612
0
    if (wx < WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION) {
21613
0
      h->digits[wx++] = new_digit;
21614
0
    } else if (new_digit > 0) {
21615
0
      h->truncated = true;
21616
0
    }
21617
0
  }
21618
21619
  // Finish.
21620
0
  h->num_digits = wx;
21621
0
  wuffs_private_impl__high_prec_dec__trim(h);
21622
0
}
21623
21624
static void  //
21625
wuffs_private_impl__high_prec_dec__lshift(wuffs_private_impl__high_prec_dec* h,
21626
0
                                          int32_t shift) {
21627
0
  if (shift > 0) {
21628
0
    while (shift > +WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL) {
21629
0
      wuffs_private_impl__high_prec_dec__small_lshift(
21630
0
          h, WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL);
21631
0
      shift -= WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL;
21632
0
    }
21633
0
    wuffs_private_impl__high_prec_dec__small_lshift(h, ((uint32_t)(+shift)));
21634
0
  } else if (shift < 0) {
21635
0
    while (shift < -WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL) {
21636
0
      wuffs_private_impl__high_prec_dec__small_rshift(
21637
0
          h, WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL);
21638
0
      shift += WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL;
21639
0
    }
21640
0
    wuffs_private_impl__high_prec_dec__small_rshift(h, ((uint32_t)(-shift)));
21641
0
  }
21642
0
}
21643
21644
// --------
21645
21646
// wuffs_private_impl__high_prec_dec__round_etc rounds h's number. For those
21647
// functions that take an n argument, rounding produces at most n digits (which
21648
// is not necessarily at most n decimal places). Negative n values are ignored,
21649
// as well as any n greater than or equal to h's number of digits. The
21650
// etc__round_just_enough function implicitly chooses an n to implement
21651
// WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION.
21652
//
21653
// Preconditions:
21654
//  - h is non-NULL.
21655
//  - h->decimal_point is "not extreme".
21656
//
21657
// "Not extreme" means within ยฑWUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE.
21658
21659
static void  //
21660
wuffs_private_impl__high_prec_dec__round_down(
21661
    wuffs_private_impl__high_prec_dec* h,
21662
0
    int32_t n) {
21663
0
  if ((n < 0) || (h->num_digits <= (uint32_t)n)) {
21664
0
    return;
21665
0
  }
21666
0
  h->num_digits = (uint32_t)(n);
21667
0
  wuffs_private_impl__high_prec_dec__trim(h);
21668
0
}
21669
21670
static void  //
21671
wuffs_private_impl__high_prec_dec__round_up(
21672
    wuffs_private_impl__high_prec_dec* h,
21673
0
    int32_t n) {
21674
0
  if ((n < 0) || (h->num_digits <= (uint32_t)n)) {
21675
0
    return;
21676
0
  }
21677
21678
0
  for (n--; n >= 0; n--) {
21679
0
    if (h->digits[n] < 9) {
21680
0
      h->digits[n]++;
21681
0
      h->num_digits = (uint32_t)(n + 1);
21682
0
      return;
21683
0
    }
21684
0
  }
21685
21686
  // The number is all 9s. Change to a single 1 and adjust the decimal point.
21687
0
  h->digits[0] = 1;
21688
0
  h->num_digits = 1;
21689
0
  h->decimal_point++;
21690
0
}
21691
21692
static void  //
21693
wuffs_private_impl__high_prec_dec__round_nearest(
21694
    wuffs_private_impl__high_prec_dec* h,
21695
0
    int32_t n) {
21696
0
  if ((n < 0) || (h->num_digits <= (uint32_t)n)) {
21697
0
    return;
21698
0
  }
21699
0
  bool up = h->digits[n] >= 5;
21700
0
  if ((h->digits[n] == 5) && ((n + 1) == ((int32_t)(h->num_digits)))) {
21701
0
    up = h->truncated ||  //
21702
0
         ((n > 0) && ((h->digits[n - 1] & 1) != 0));
21703
0
  }
21704
21705
0
  if (up) {
21706
0
    wuffs_private_impl__high_prec_dec__round_up(h, n);
21707
0
  } else {
21708
0
    wuffs_private_impl__high_prec_dec__round_down(h, n);
21709
0
  }
21710
0
}
21711
21712
static void  //
21713
wuffs_private_impl__high_prec_dec__round_just_enough(
21714
    wuffs_private_impl__high_prec_dec* h,
21715
    int32_t exp2,
21716
0
    uint64_t mantissa) {
21717
  // The magic numbers 52 and 53 in this function are because IEEE 754 double
21718
  // precision has 52 mantissa bits.
21719
  //
21720
  // Let f be the floating point number represented by exp2 and mantissa (and
21721
  // also the number in h): the number (mantissa * (2 ** (exp2 - 52))).
21722
  //
21723
  // If f is zero or a small integer, we can return early.
21724
0
  if ((mantissa == 0) ||
21725
0
      ((exp2 < 53) && (h->decimal_point >= ((int32_t)(h->num_digits))))) {
21726
0
    return;
21727
0
  }
21728
21729
  // The smallest normal f has an exp2 of -1022 and a mantissa of (1 << 52).
21730
  // Subnormal numbers have the same exp2 but a smaller mantissa.
21731
0
  static const int32_t min_incl_normal_exp2 = -1022;
21732
0
  static const uint64_t min_incl_normal_mantissa = 0x0010000000000000ul;
21733
21734
  // Compute lower and upper bounds such that any number between them (possibly
21735
  // inclusive) will round to f. First, the lower bound. Our number f is:
21736
  //   ((mantissa + 0)         * (2 ** (  exp2 - 52)))
21737
  //
21738
  // The next lowest floating point number is:
21739
  //   ((mantissa - 1)         * (2 ** (  exp2 - 52)))
21740
  // unless (mantissa - 1) drops the (1 << 52) bit and exp2 is not the
21741
  // min_incl_normal_exp2. Either way, call it:
21742
  //   ((l_mantissa)           * (2 ** (l_exp2 - 52)))
21743
  //
21744
  // The lower bound is halfway between them (noting that 52 became 53):
21745
  //   (((2 * l_mantissa) + 1) * (2 ** (l_exp2 - 53)))
21746
0
  int32_t l_exp2 = exp2;
21747
0
  uint64_t l_mantissa = mantissa - 1;
21748
0
  if ((exp2 > min_incl_normal_exp2) && (mantissa <= min_incl_normal_mantissa)) {
21749
0
    l_exp2 = exp2 - 1;
21750
0
    l_mantissa = (2 * mantissa) - 1;
21751
0
  }
21752
0
  wuffs_private_impl__high_prec_dec lower;
21753
0
  wuffs_private_impl__high_prec_dec__assign(&lower, (2 * l_mantissa) + 1,
21754
0
                                            false);
21755
0
  wuffs_private_impl__high_prec_dec__lshift(&lower, l_exp2 - 53);
21756
21757
  // Next, the upper bound. Our number f is:
21758
  //   ((mantissa + 0)       * (2 ** (exp2 - 52)))
21759
  //
21760
  // The next highest floating point number is:
21761
  //   ((mantissa + 1)       * (2 ** (exp2 - 52)))
21762
  //
21763
  // The upper bound is halfway between them (noting that 52 became 53):
21764
  //   (((2 * mantissa) + 1) * (2 ** (exp2 - 53)))
21765
0
  wuffs_private_impl__high_prec_dec upper;
21766
0
  wuffs_private_impl__high_prec_dec__assign(&upper, (2 * mantissa) + 1, false);
21767
0
  wuffs_private_impl__high_prec_dec__lshift(&upper, exp2 - 53);
21768
21769
  // The lower and upper bounds are possible outputs only if the original
21770
  // mantissa is even, so that IEEE round-to-even would round to the original
21771
  // mantissa and not its neighbors.
21772
0
  bool inclusive = (mantissa & 1) == 0;
21773
21774
  // As we walk the digits, we want to know whether rounding up would fall
21775
  // within the upper bound. This is tracked by upper_delta:
21776
  //  - When -1, the digits of h and upper are the same so far.
21777
  //  - When +0, we saw a difference of 1 between h and upper on a previous
21778
  //    digit and subsequently only 9s for h and 0s for upper. Thus, rounding
21779
  //    up may fall outside of the bound if !inclusive.
21780
  //  - When +1, the difference is greater than 1 and we know that rounding up
21781
  //    falls within the bound.
21782
  //
21783
  // This is a state machine with three states. The numerical value for each
21784
  // state (-1, +0 or +1) isn't important, other than their order.
21785
0
  int upper_delta = -1;
21786
21787
  // We can now figure out the shortest number of digits required. Walk the
21788
  // digits until h has distinguished itself from lower or upper.
21789
  //
21790
  // The zi and zd variables are indexes and digits, for z in l (lower), h (the
21791
  // number) and u (upper).
21792
  //
21793
  // The lower, h and upper numbers may have their decimal points at different
21794
  // places. In this case, upper is the longest, so we iterate ui starting from
21795
  // 0 and iterate li and hi starting from either 0 or -1.
21796
0
  int32_t ui = 0;
21797
0
  for (;; ui++) {
21798
    // Calculate hd, the middle number's digit.
21799
0
    int32_t hi = ui - upper.decimal_point + h->decimal_point;
21800
0
    if (hi >= ((int32_t)(h->num_digits))) {
21801
0
      break;
21802
0
    }
21803
0
    uint8_t hd = (((uint32_t)hi) < h->num_digits) ? h->digits[hi] : 0;
21804
21805
    // Calculate ld, the lower bound's digit.
21806
0
    int32_t li = ui - upper.decimal_point + lower.decimal_point;
21807
0
    uint8_t ld = (((uint32_t)li) < lower.num_digits) ? lower.digits[li] : 0;
21808
21809
    // We can round down (truncate) if lower has a different digit than h or if
21810
    // lower is inclusive and is exactly the result of rounding down (i.e. we
21811
    // have reached the final digit of lower).
21812
0
    bool can_round_down =
21813
0
        (ld != hd) ||  //
21814
0
        (inclusive && ((li + 1) == ((int32_t)(lower.num_digits))));
21815
21816
    // Calculate ud, the upper bound's digit, and update upper_delta.
21817
0
    uint8_t ud = (((uint32_t)ui) < upper.num_digits) ? upper.digits[ui] : 0;
21818
0
    if (upper_delta < 0) {
21819
0
      if ((hd + 1) < ud) {
21820
        // For example:
21821
        // h     = 12345???
21822
        // upper = 12347???
21823
0
        upper_delta = +1;
21824
0
      } else if (hd != ud) {
21825
        // For example:
21826
        // h     = 12345???
21827
        // upper = 12346???
21828
0
        upper_delta = +0;
21829
0
      }
21830
0
    } else if (upper_delta == 0) {
21831
0
      if ((hd != 9) || (ud != 0)) {
21832
        // For example:
21833
        // h     = 1234598?
21834
        // upper = 1234600?
21835
0
        upper_delta = +1;
21836
0
      }
21837
0
    }
21838
21839
    // We can round up if upper has a different digit than h and either upper
21840
    // is inclusive or upper is bigger than the result of rounding up.
21841
0
    bool can_round_up =
21842
0
        (upper_delta > 0) ||    //
21843
0
        ((upper_delta == 0) &&  //
21844
0
         (inclusive || ((ui + 1) < ((int32_t)(upper.num_digits)))));
21845
21846
    // If we can round either way, round to nearest. If we can round only one
21847
    // way, do it. If we can't round, continue the loop.
21848
0
    if (can_round_down) {
21849
0
      if (can_round_up) {
21850
0
        wuffs_private_impl__high_prec_dec__round_nearest(h, hi + 1);
21851
0
        return;
21852
0
      } else {
21853
0
        wuffs_private_impl__high_prec_dec__round_down(h, hi + 1);
21854
0
        return;
21855
0
      }
21856
0
    } else {
21857
0
      if (can_round_up) {
21858
0
        wuffs_private_impl__high_prec_dec__round_up(h, hi + 1);
21859
0
        return;
21860
0
      }
21861
0
    }
21862
0
  }
21863
0
}
21864
21865
// --------
21866
21867
// wuffs_private_impl__parse_number_f64_eisel_lemire produces the IEEE 754
21868
// double-precision value for an exact mantissa and base-10 exponent. For
21869
// example:
21870
//  - when parsing "12345.678e+02", man is 12345678 and exp10 is -1.
21871
//  - when parsing "-12", man is 12 and exp10 is 0. Processing the leading
21872
//    minus sign is the responsibility of the caller, not this function.
21873
//
21874
// On success, it returns a non-negative int64_t such that the low 63 bits hold
21875
// the 11-bit exponent and 52-bit mantissa.
21876
//
21877
// On failure, it returns a negative value.
21878
//
21879
// The algorithm is based on an original idea by Michael Eisel that was refined
21880
// by Daniel Lemire. See
21881
// https://lemire.me/blog/2020/03/10/fast-float-parsing-in-practice/
21882
// and
21883
// https://nigeltao.github.io/blog/2020/eisel-lemire.html
21884
//
21885
// Preconditions:
21886
//  - man is non-zero.
21887
//  - exp10 is in the range [-307 ..= 288], the same range of the
21888
//    wuffs_private_impl__powers_of_10 array.
21889
//
21890
// The exp10 range (and the fact that man is in the range [1 ..= UINT64_MAX],
21891
// approximately [1 ..= 1.85e+19]) means that (man * (10 ** exp10)) is in the
21892
// range [1e-307 ..= 1.85e+307]. This is entirely within the range of normal
21893
// (neither subnormal nor non-finite) f64 values: DBL_MIN and DBL_MAX are
21894
// approximately 2.23eโ€“308 and 1.80e+308.
21895
static int64_t  //
21896
0
wuffs_private_impl__parse_number_f64_eisel_lemire(uint64_t man, int32_t exp10) {
21897
  // Look up the (possibly truncated) base-2 representation of (10 ** exp10).
21898
  // The look-up table was constructed so that it is already normalized: the
21899
  // table entry's mantissa's MSB (most significant bit) is on.
21900
0
  const uint64_t* po10 = &wuffs_private_impl__powers_of_10[exp10 + 307][0];
21901
21902
  // Normalize the man argument. The (man != 0) precondition means that a
21903
  // non-zero bit exists.
21904
0
  uint32_t clz = wuffs_base__count_leading_zeroes_u64(man);
21905
0
  man <<= clz;
21906
21907
  // Calculate the return value's base-2 exponent. We might tweak it by ยฑ1
21908
  // later, but its initial value comes from a linear scaling of exp10,
21909
  // converting from power-of-10 to power-of-2, and adjusting by clz.
21910
  //
21911
  // The magic constants are:
21912
  //  - 1087 = 1023 + 64. The 1023 is the f64 exponent bias. The 64 is because
21913
  //    the look-up table uses 64-bit mantissas.
21914
  //  - 217706 is such that the ratio 217706 / 65536 โ‰ˆ 3.321930 is close enough
21915
  //    (over the practical range of exp10) to log(10) / log(2) โ‰ˆ 3.321928.
21916
  //  - 65536 = 1<<16 is arbitrary but a power of 2, so division is a shift.
21917
  //
21918
  // Equality of the linearly-scaled value and the actual power-of-2, over the
21919
  // range of exp10 arguments that this function accepts, is confirmed by
21920
  // script/print-mpb-powers-of-10.go
21921
0
  uint64_t ret_exp2 =
21922
0
      ((uint64_t)(((217706 * exp10) >> 16) + 1087)) - ((uint64_t)clz);
21923
21924
  // Multiply the two mantissas. Normalization means that both mantissas are at
21925
  // least (1<<63), so the 128-bit product must be at least (1<<126). The high
21926
  // 64 bits of the product, x_hi, must therefore be at least (1<<62).
21927
  //
21928
  // As a consequence, x_hi has either 0 or 1 leading zeroes. Shifting x_hi
21929
  // right by either 9 or 10 bits (depending on x_hi's MSB) will therefore
21930
  // leave the top 10 MSBs (bits 54 ..= 63) off and the 11th MSB (bit 53) on.
21931
0
  wuffs_base__multiply_u64__output x = wuffs_base__multiply_u64(man, po10[1]);
21932
0
  uint64_t x_hi = x.hi;
21933
0
  uint64_t x_lo = x.lo;
21934
21935
  // Before we shift right by at least 9 bits, recall that the look-up table
21936
  // entry was possibly truncated. We have so far only calculated a lower bound
21937
  // for the product (man * e), where e is (10 ** exp10). The upper bound would
21938
  // add a further (man * 1) to the 128-bit product, which overflows the lower
21939
  // 64-bit limb if ((x_lo + man) < man).
21940
  //
21941
  // If overflow occurs, that adds 1 to x_hi. Since we're about to shift right
21942
  // by at least 9 bits, that carried 1 can be ignored unless the higher 64-bit
21943
  // limb's low 9 bits are all on.
21944
  //
21945
  // For example, parsing "9999999999999999999" will take the if-true branch
21946
  // here, since:
21947
  //  - x_hi = 0x4563918244F3FFFF
21948
  //  - x_lo = 0x8000000000000000
21949
  //  - man  = 0x8AC7230489E7FFFF
21950
0
  if (((x_hi & 0x1FF) == 0x1FF) && ((x_lo + man) < man)) {
21951
    // Refine our calculation of (man * e). Before, our approximation of e used
21952
    // a "low resolution" 64-bit mantissa. Now use a "high resolution" 128-bit
21953
    // mantissa. We've already calculated x = (man * bits_0_to_63_incl_of_e).
21954
    // Now calculate y = (man * bits_64_to_127_incl_of_e).
21955
0
    wuffs_base__multiply_u64__output y = wuffs_base__multiply_u64(man, po10[0]);
21956
0
    uint64_t y_hi = y.hi;
21957
0
    uint64_t y_lo = y.lo;
21958
21959
    // Merge the 128-bit x and 128-bit y, which overlap by 64 bits, to
21960
    // calculate the 192-bit product of the 64-bit man by the 128-bit e.
21961
    // As we exit this if-block, we only care about the high 128 bits
21962
    // (merged_hi and merged_lo) of that 192-bit product.
21963
    //
21964
    // For example, parsing "1.234e-45" will take the if-true branch here,
21965
    // since:
21966
    //  - x_hi = 0x70B7E3696DB29FFF
21967
    //  - x_lo = 0xE040000000000000
21968
    //  - y_hi = 0x33718BBEAB0E0D7A
21969
    //  - y_lo = 0xA880000000000000
21970
0
    uint64_t merged_hi = x_hi;
21971
0
    uint64_t merged_lo = x_lo + y_hi;
21972
0
    if (merged_lo < x_lo) {
21973
0
      merged_hi++;  // Carry the overflow bit.
21974
0
    }
21975
21976
    // The "high resolution" approximation of e is still a lower bound. Once
21977
    // again, see if the upper bound is large enough to produce a different
21978
    // result. This time, if it does, give up instead of reaching for an even
21979
    // more precise approximation to e.
21980
    //
21981
    // This three-part check is similar to the two-part check that guarded the
21982
    // if block that we're now in, but it has an extra term for the middle 64
21983
    // bits (checking that adding 1 to merged_lo would overflow).
21984
    //
21985
    // For example, parsing "5.9604644775390625e-8" will take the if-true
21986
    // branch here, since:
21987
    //  - merged_hi = 0x7FFFFFFFFFFFFFFF
21988
    //  - merged_lo = 0xFFFFFFFFFFFFFFFF
21989
    //  - y_lo      = 0x4DB3FFC120988200
21990
    //  - man       = 0xD3C21BCECCEDA100
21991
0
    if (((merged_hi & 0x1FF) == 0x1FF) && ((merged_lo + 1) == 0) &&
21992
0
        (y_lo + man < man)) {
21993
0
      return -1;
21994
0
    }
21995
21996
    // Replace the 128-bit x with merged.
21997
0
    x_hi = merged_hi;
21998
0
    x_lo = merged_lo;
21999
0
  }
22000
22001
  // As mentioned above, shifting x_hi right by either 9 or 10 bits will leave
22002
  // the top 10 MSBs (bits 54 ..= 63) off and the 11th MSB (bit 53) on. If the
22003
  // MSB (before shifting) was on, adjust ret_exp2 for the larger shift.
22004
  //
22005
  // Having bit 53 on (and higher bits off) means that ret_mantissa is a 54-bit
22006
  // number.
22007
0
  uint64_t msb = x_hi >> 63;
22008
0
  uint64_t ret_mantissa = x_hi >> (msb + 9);
22009
0
  ret_exp2 -= 1 ^ msb;
22010
22011
  // IEEE 754 rounds to-nearest with ties rounded to-even. Rounding to-even can
22012
  // be tricky. If we're half-way between two exactly representable numbers
22013
  // (x's low 73 bits are zero and the next 2 bits that matter are "01"), give
22014
  // up instead of trying to pick the winner.
22015
  //
22016
  // Technically, we could tighten the condition by changing "73" to "73 or 74,
22017
  // depending on msb", but a flat "73" is simpler.
22018
  //
22019
  // For example, parsing "1e+23" will take the if-true branch here, since:
22020
  //  - x_hi          = 0x54B40B1F852BDA00
22021
  //  - ret_mantissa  = 0x002A5A058FC295ED
22022
0
  if ((x_lo == 0) && ((x_hi & 0x1FF) == 0) && ((ret_mantissa & 3) == 1)) {
22023
0
    return -1;
22024
0
  }
22025
22026
  // If we're not halfway then it's rounding to-nearest. Starting with a 54-bit
22027
  // number, carry the lowest bit (bit 0) up if it's on. Regardless of whether
22028
  // it was on or off, shifting right by one then produces a 53-bit number. If
22029
  // carrying up overflowed, shift again.
22030
0
  ret_mantissa += ret_mantissa & 1;
22031
0
  ret_mantissa >>= 1;
22032
  // This if block is equivalent to (but benchmarks slightly faster than) the
22033
  // following branchless form:
22034
  //    uint64_t overflow_adjustment = ret_mantissa >> 53;
22035
  //    ret_mantissa >>= overflow_adjustment;
22036
  //    ret_exp2 += overflow_adjustment;
22037
  //
22038
  // For example, parsing "7.2057594037927933e+16" will take the if-true
22039
  // branch here, since:
22040
  //  - x_hi          = 0x7FFFFFFFFFFFFE80
22041
  //  - ret_mantissa  = 0x0020000000000000
22042
0
  if ((ret_mantissa >> 53) > 0) {
22043
0
    ret_mantissa >>= 1;
22044
0
    ret_exp2++;
22045
0
  }
22046
22047
  // Starting with a 53-bit number, IEEE 754 double-precision normal numbers
22048
  // have an implicit mantissa bit. Mask that away and keep the low 52 bits.
22049
0
  ret_mantissa &= 0x000FFFFFFFFFFFFF;
22050
22051
  // Pack the bits and return.
22052
0
  return ((int64_t)(ret_mantissa | (ret_exp2 << 52)));
22053
0
}
22054
22055
// --------
22056
22057
static wuffs_base__result_f64  //
22058
wuffs_private_impl__parse_number_f64_special(wuffs_base__slice_u8 s,
22059
0
                                             uint32_t options) {
22060
0
  do {
22061
0
    if (options & WUFFS_BASE__PARSE_NUMBER_FXX__REJECT_INF_AND_NAN) {
22062
0
      goto fail;
22063
0
    }
22064
22065
0
    uint8_t* p = s.ptr;
22066
0
    uint8_t* q = s.ptr + s.len;
22067
22068
0
    for (; (p < q) && (*p == '_'); p++) {
22069
0
    }
22070
0
    if (p >= q) {
22071
0
      goto fail;
22072
0
    }
22073
22074
    // Parse sign.
22075
0
    bool negative = false;
22076
0
    do {
22077
0
      if (*p == '+') {
22078
0
        p++;
22079
0
      } else if (*p == '-') {
22080
0
        negative = true;
22081
0
        p++;
22082
0
      } else {
22083
0
        break;
22084
0
      }
22085
0
      for (; (p < q) && (*p == '_'); p++) {
22086
0
      }
22087
0
    } while (0);
22088
0
    if (p >= q) {
22089
0
      goto fail;
22090
0
    }
22091
22092
0
    bool nan = false;
22093
0
    switch (p[0]) {
22094
0
      case 'I':
22095
0
      case 'i':
22096
0
        if (((q - p) < 3) ||                     //
22097
0
            ((p[1] != 'N') && (p[1] != 'n')) ||  //
22098
0
            ((p[2] != 'F') && (p[2] != 'f'))) {
22099
0
          goto fail;
22100
0
        }
22101
0
        p += 3;
22102
22103
0
        if ((p >= q) || (*p == '_')) {
22104
0
          break;
22105
0
        } else if (((q - p) < 5) ||                     //
22106
0
                   ((p[0] != 'I') && (p[0] != 'i')) ||  //
22107
0
                   ((p[1] != 'N') && (p[1] != 'n')) ||  //
22108
0
                   ((p[2] != 'I') && (p[2] != 'i')) ||  //
22109
0
                   ((p[3] != 'T') && (p[3] != 't')) ||  //
22110
0
                   ((p[4] != 'Y') && (p[4] != 'y'))) {
22111
0
          goto fail;
22112
0
        }
22113
0
        p += 5;
22114
22115
0
        if ((p >= q) || (*p == '_')) {
22116
0
          break;
22117
0
        }
22118
0
        goto fail;
22119
22120
0
      case 'N':
22121
0
      case 'n':
22122
0
        if (((q - p) < 3) ||                     //
22123
0
            ((p[1] != 'A') && (p[1] != 'a')) ||  //
22124
0
            ((p[2] != 'N') && (p[2] != 'n'))) {
22125
0
          goto fail;
22126
0
        }
22127
0
        p += 3;
22128
22129
0
        if ((p >= q) || (*p == '_')) {
22130
0
          nan = true;
22131
0
          break;
22132
0
        }
22133
0
        goto fail;
22134
22135
0
      default:
22136
0
        goto fail;
22137
0
    }
22138
22139
    // Finish.
22140
0
    for (; (p < q) && (*p == '_'); p++) {
22141
0
    }
22142
0
    if (p != q) {
22143
0
      goto fail;
22144
0
    }
22145
0
    wuffs_base__result_f64 ret;
22146
0
    ret.status.repr = NULL;
22147
0
    ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64(
22148
0
        (nan ? 0x7FFFFFFFFFFFFFFF : 0x7FF0000000000000) |
22149
0
        (negative ? 0x8000000000000000 : 0));
22150
0
    return ret;
22151
0
  } while (0);
22152
22153
0
fail:
22154
0
  do {
22155
0
    wuffs_base__result_f64 ret;
22156
0
    ret.status.repr = wuffs_base__error__bad_argument;
22157
0
    ret.value = 0;
22158
0
    return ret;
22159
0
  } while (0);
22160
0
}
22161
22162
WUFFS_BASE__MAYBE_STATIC wuffs_base__result_f64  //
22163
wuffs_private_impl__high_prec_dec__to_f64(wuffs_private_impl__high_prec_dec* h,
22164
0
                                          uint32_t options) {
22165
0
  do {
22166
    // powers converts decimal powers of 10 to binary powers of 2. For example,
22167
    // (10000 >> 13) is 1. It stops before the elements exceed 60, also known
22168
    // as WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL.
22169
    //
22170
    // This rounds down (1<<13 is a lower bound for 1e4). Adding 1 to the array
22171
    // element value rounds up (1<<14 is an upper bound for 1e4) while staying
22172
    // at or below WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL.
22173
    //
22174
    // When starting in the range [1e+1 .. 1e+2] (i.e. h->decimal_point == +2),
22175
    // powers[2] == 6 and so:
22176
    //  - Right shifting by 6+0 produces the range [10/64 .. 100/64] =
22177
    //    [0.156250 .. 1.56250]. The resultant h->decimal_point is +0 or +1.
22178
    //  - Right shifting by 6+1 produces the range [10/128 .. 100/128] =
22179
    //    [0.078125 .. 0.78125]. The resultant h->decimal_point is -1 or -0.
22180
    //
22181
    // When starting in the range [1e-3 .. 1e-2] (i.e. h->decimal_point == -2),
22182
    // powers[2] == 6 and so:
22183
    //  - Left shifting by 6+0 produces the range [0.001*64 .. 0.01*64] =
22184
    //    [0.064 .. 0.64]. The resultant h->decimal_point is -1 or -0.
22185
    //  - Left shifting by 6+1 produces the range [0.001*128 .. 0.01*128] =
22186
    //    [0.128 .. 1.28]. The resultant h->decimal_point is +0 or +1.
22187
    //
22188
    // Thus, when targeting h->decimal_point being +0 or +1, use (powers[n]+0)
22189
    // when right shifting but (powers[n]+1) when left shifting.
22190
0
    static const uint32_t num_powers = 19;
22191
0
    static const uint8_t powers[19] = {
22192
0
        0,  3,  6,  9,  13, 16, 19, 23, 26, 29,  //
22193
0
        33, 36, 39, 43, 46, 49, 53, 56, 59,      //
22194
0
    };
22195
22196
    // Handle zero and obvious extremes. The largest and smallest positive
22197
    // finite f64 values are approximately 1.8e+308 and 4.9e-324.
22198
0
    if ((h->num_digits == 0) || (h->decimal_point < -326)) {
22199
0
      goto zero;
22200
0
    } else if (h->decimal_point > 310) {
22201
0
      goto infinity;
22202
0
    }
22203
22204
    // Try the fast Eisel-Lemire algorithm again. Calculating the (man, exp10)
22205
    // pair from the high_prec_dec h is more correct but slower than the
22206
    // approach taken in wuffs_base__parse_number_f64. The latter is optimized
22207
    // for the common cases (e.g. assuming no underscores or a leading '+'
22208
    // sign) rather than the full set of cases allowed by the Wuffs API.
22209
    //
22210
    // When we have 19 or fewer mantissa digits, run Eisel-Lemire once (trying
22211
    // for an exact result). When we have more than 19 mantissa digits, run it
22212
    // twice to get a lower and upper bound. We still have an exact result
22213
    // (within f64's rounding margin) if both bounds are equal (and valid).
22214
0
    uint32_t i_max = h->num_digits;
22215
0
    if (i_max > 19) {
22216
0
      i_max = 19;
22217
0
    }
22218
0
    int32_t exp10 = h->decimal_point - ((int32_t)i_max);
22219
0
    if ((-307 <= exp10) && (exp10 <= 288)) {
22220
0
      uint64_t man = 0;
22221
0
      uint32_t i;
22222
0
      for (i = 0; i < i_max; i++) {
22223
0
        man = (10 * man) + h->digits[i];
22224
0
      }
22225
0
      while (man != 0) {  // The 'while' is just an 'if' that we can 'break'.
22226
0
        int64_t r0 =
22227
0
            wuffs_private_impl__parse_number_f64_eisel_lemire(man + 0, exp10);
22228
0
        if (r0 < 0) {
22229
0
          break;
22230
0
        } else if (h->num_digits > 19) {
22231
0
          int64_t r1 =
22232
0
              wuffs_private_impl__parse_number_f64_eisel_lemire(man + 1, exp10);
22233
0
          if (r1 != r0) {
22234
0
            break;
22235
0
          }
22236
0
        }
22237
0
        wuffs_base__result_f64 ret;
22238
0
        ret.status.repr = NULL;
22239
0
        ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64(
22240
0
            ((uint64_t)r0) | (((uint64_t)(h->negative)) << 63));
22241
0
        return ret;
22242
0
      }
22243
0
    }
22244
22245
    // When Eisel-Lemire fails, fall back to Simple Decimal Conversion. See
22246
    // https://nigeltao.github.io/blog/2020/parse-number-f64-simple.html
22247
    //
22248
    // Scale by powers of 2 until we're in the range [0.1 .. 10]. Equivalently,
22249
    // that h->decimal_point is +0 or +1.
22250
    //
22251
    // First we shift right while at or above 10...
22252
0
    const int32_t f64_bias = -1023;
22253
0
    int32_t exp2 = 0;
22254
0
    while (h->decimal_point > 1) {
22255
0
      uint32_t n = (uint32_t)(+h->decimal_point);
22256
0
      uint32_t shift = (n < num_powers)
22257
0
                           ? powers[n]
22258
0
                           : WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL;
22259
22260
0
      wuffs_private_impl__high_prec_dec__small_rshift(h, shift);
22261
0
      if (h->decimal_point < -WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE) {
22262
0
        goto zero;
22263
0
      }
22264
0
      exp2 += (int32_t)shift;
22265
0
    }
22266
    // ...then we shift left while below 0.1.
22267
0
    while (h->decimal_point < 0) {
22268
0
      uint32_t shift;
22269
0
      uint32_t n = (uint32_t)(-h->decimal_point);
22270
0
      shift = (n < num_powers)
22271
                  // The +1 is per "when targeting h->decimal_point being +0 or
22272
                  // +1... when left shifting" in the powers comment above.
22273
0
                  ? (powers[n] + 1u)
22274
0
                  : WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL;
22275
22276
0
      wuffs_private_impl__high_prec_dec__small_lshift(h, shift);
22277
0
      if (h->decimal_point > +WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE) {
22278
0
        goto infinity;
22279
0
      }
22280
0
      exp2 -= (int32_t)shift;
22281
0
    }
22282
22283
    // To get from "in the range [0.1 .. 10]" to "in the range [1 .. 2]" (which
22284
    // will give us our exponent in base-2), the mantissa's first 3 digits will
22285
    // determine the final left shift, equal to 52 (the number of explicit f64
22286
    // bits) plus an additional adjustment.
22287
0
    int man3 = (100 * h->digits[0]) +
22288
0
               ((h->num_digits > 1) ? (10 * h->digits[1]) : 0) +
22289
0
               ((h->num_digits > 2) ? h->digits[2] : 0);
22290
0
    int32_t additional_lshift = 0;
22291
0
    if (h->decimal_point == 0) {  // The value is in [0.1 .. 1].
22292
0
      if (man3 < 125) {
22293
0
        additional_lshift = +4;
22294
0
      } else if (man3 < 250) {
22295
0
        additional_lshift = +3;
22296
0
      } else if (man3 < 500) {
22297
0
        additional_lshift = +2;
22298
0
      } else {
22299
0
        additional_lshift = +1;
22300
0
      }
22301
0
    } else {  // The value is in [1 .. 10].
22302
0
      if (man3 < 200) {
22303
0
        additional_lshift = -0;
22304
0
      } else if (man3 < 400) {
22305
0
        additional_lshift = -1;
22306
0
      } else if (man3 < 800) {
22307
0
        additional_lshift = -2;
22308
0
      } else {
22309
0
        additional_lshift = -3;
22310
0
      }
22311
0
    }
22312
0
    exp2 -= additional_lshift;
22313
0
    uint32_t final_lshift = (uint32_t)(52 + additional_lshift);
22314
22315
    // The minimum normal exponent is (f64_bias + 1).
22316
0
    while ((f64_bias + 1) > exp2) {
22317
0
      uint32_t n = (uint32_t)((f64_bias + 1) - exp2);
22318
0
      if (n > WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL) {
22319
0
        n = WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL;
22320
0
      }
22321
0
      wuffs_private_impl__high_prec_dec__small_rshift(h, n);
22322
0
      exp2 += (int32_t)n;
22323
0
    }
22324
22325
    // Check for overflow.
22326
0
    if ((exp2 - f64_bias) >= 0x07FF) {  // (1 << 11) - 1.
22327
0
      goto infinity;
22328
0
    }
22329
22330
    // Extract 53 bits for the mantissa (in base-2).
22331
0
    wuffs_private_impl__high_prec_dec__small_lshift(h, final_lshift);
22332
0
    uint64_t man2 = wuffs_private_impl__high_prec_dec__rounded_integer(h);
22333
22334
    // Rounding might have added one bit. If so, shift and re-check overflow.
22335
0
    if ((man2 >> 53) != 0) {
22336
0
      man2 >>= 1;
22337
0
      exp2++;
22338
0
      if ((exp2 - f64_bias) >= 0x07FF) {  // (1 << 11) - 1.
22339
0
        goto infinity;
22340
0
      }
22341
0
    }
22342
22343
    // Handle subnormal numbers.
22344
0
    if ((man2 >> 52) == 0) {
22345
0
      exp2 = f64_bias;
22346
0
    }
22347
22348
    // Pack the bits and return.
22349
0
    uint64_t exp2_bits =
22350
0
        (uint64_t)((exp2 - f64_bias) & 0x07FF);              // (1 << 11) - 1.
22351
0
    uint64_t bits = (man2 & 0x000FFFFFFFFFFFFF) |            // (1 << 52) - 1.
22352
0
                    (exp2_bits << 52) |                      //
22353
0
                    (h->negative ? 0x8000000000000000 : 0);  // (1 << 63).
22354
22355
0
    wuffs_base__result_f64 ret;
22356
0
    ret.status.repr = NULL;
22357
0
    ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64(bits);
22358
0
    return ret;
22359
0
  } while (0);
22360
22361
0
zero:
22362
0
  do {
22363
0
    uint64_t bits = h->negative ? 0x8000000000000000 : 0;
22364
22365
0
    wuffs_base__result_f64 ret;
22366
0
    ret.status.repr = NULL;
22367
0
    ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64(bits);
22368
0
    return ret;
22369
0
  } while (0);
22370
22371
0
infinity:
22372
0
  do {
22373
0
    if (options & WUFFS_BASE__PARSE_NUMBER_FXX__REJECT_INF_AND_NAN) {
22374
0
      wuffs_base__result_f64 ret;
22375
0
      ret.status.repr = wuffs_base__error__bad_argument;
22376
0
      ret.value = 0;
22377
0
      return ret;
22378
0
    }
22379
22380
0
    uint64_t bits = h->negative ? 0xFFF0000000000000 : 0x7FF0000000000000;
22381
22382
0
    wuffs_base__result_f64 ret;
22383
0
    ret.status.repr = NULL;
22384
0
    ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64(bits);
22385
0
    return ret;
22386
0
  } while (0);
22387
0
}
22388
22389
static inline bool  //
22390
0
wuffs_private_impl__is_decimal_digit(uint8_t c) {
22391
0
  return ('0' <= c) && (c <= '9');
22392
0
}
22393
22394
WUFFS_BASE__MAYBE_STATIC wuffs_base__result_f64  //
22395
0
wuffs_base__parse_number_f64(wuffs_base__slice_u8 s, uint32_t options) {
22396
  // In practice, almost all "dd.ddddEยฑxxx" numbers can be represented
22397
  // losslessly by a uint64_t mantissa "dddddd" and an int32_t base-10
22398
  // exponent, adjusting "xxx" for the position (if present) of the decimal
22399
  // separator '.' or ','.
22400
  //
22401
  // This (u64 man, i32 exp10) data structure is superficially similar to the
22402
  // "Do It Yourself Floating Point" type from Loitsch (โ€ ), but the exponent
22403
  // here is base-10, not base-2.
22404
  //
22405
  // If s's number fits in a (man, exp10), parse that pair with the
22406
  // Eisel-Lemire algorithm. If not, or if Eisel-Lemire fails, parsing s with
22407
  // the fallback algorithm is slower but comprehensive.
22408
  //
22409
  // โ€  "Printing Floating-Point Numbers Quickly and Accurately with Integers"
22410
  // (https://www.cs.tufts.edu/~nr/cs257/archive/florian-loitsch/printf.pdf).
22411
  // Florian Loitsch is also the primary contributor to
22412
  // https://github.com/google/double-conversion
22413
0
  do {
22414
    // Calculating that (man, exp10) pair needs to stay within s's bounds.
22415
    // Provided that s isn't extremely long, work on a NUL-terminated copy of
22416
    // s's contents. The NUL byte isn't a valid part of "ยฑdd.ddddEยฑxxx".
22417
    //
22418
    // As the pointer p walks the contents, it's faster to repeatedly check "is
22419
    // *p a valid digit" than "is p within bounds and *p a valid digit".
22420
0
    if (s.len >= 256) {
22421
0
      goto fallback;
22422
0
    }
22423
0
    uint8_t z[256];
22424
0
    memcpy(&z[0], s.ptr, s.len);
22425
0
    z[s.len] = 0;
22426
0
    const uint8_t* p = &z[0];
22427
22428
    // Look for a leading minus sign. Technically, we could also look for an
22429
    // optional plus sign, but the "script/process-json-numbers.c with -p"
22430
    // benchmark is noticably slower if we do. It's optional and, in practice,
22431
    // usually absent. Let the fallback catch it.
22432
0
    bool negative = (*p == '-');
22433
0
    if (negative) {
22434
0
      p++;
22435
0
    }
22436
22437
    // After walking "dd.dddd", comparing p later with p now will produce the
22438
    // number of "d"s and "."s.
22439
0
    const uint8_t* const start_of_digits_ptr = p;
22440
22441
    // Walk the "d"s before a '.', 'E', NUL byte, etc. If it starts with '0',
22442
    // it must be a single '0'. If it starts with a non-zero decimal digit, it
22443
    // can be a sequence of decimal digits.
22444
    //
22445
    // Update the man variable during the walk. It's OK if man overflows now.
22446
    // We'll detect that later.
22447
0
    uint64_t man;
22448
0
    if (*p == '0') {
22449
0
      man = 0;
22450
0
      p++;
22451
0
      if (wuffs_private_impl__is_decimal_digit(*p)) {
22452
0
        goto fallback;
22453
0
      }
22454
0
    } else if (wuffs_private_impl__is_decimal_digit(*p)) {
22455
0
      man = ((uint8_t)(*p - '0'));
22456
0
      p++;
22457
0
      for (; wuffs_private_impl__is_decimal_digit(*p); p++) {
22458
0
        man = (10 * man) + ((uint8_t)(*p - '0'));
22459
0
      }
22460
0
    } else {
22461
0
      goto fallback;
22462
0
    }
22463
22464
    // Walk the "d"s after the optional decimal separator ('.' or ','),
22465
    // updating the man and exp10 variables.
22466
0
    int32_t exp10 = 0;
22467
0
    if (*p ==
22468
0
        ((options & WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA)
22469
0
             ? ','
22470
0
             : '.')) {
22471
0
      p++;
22472
0
      const uint8_t* first_after_separator_ptr = p;
22473
0
      if (!wuffs_private_impl__is_decimal_digit(*p)) {
22474
0
        goto fallback;
22475
0
      }
22476
0
      man = (10 * man) + ((uint8_t)(*p - '0'));
22477
0
      p++;
22478
0
      for (; wuffs_private_impl__is_decimal_digit(*p); p++) {
22479
0
        man = (10 * man) + ((uint8_t)(*p - '0'));
22480
0
      }
22481
0
      exp10 = ((int32_t)(first_after_separator_ptr - p));
22482
0
    }
22483
22484
    // Count the number of digits:
22485
    //  - for an input of "314159",  digit_count is 6.
22486
    //  - for an input of "3.14159", digit_count is 7.
22487
    //
22488
    // This is off-by-one if there is a decimal separator. That's OK for now.
22489
    // We'll correct for that later. The "script/process-json-numbers.c with
22490
    // -p" benchmark is noticably slower if we try to correct for that now.
22491
0
    uint32_t digit_count = (uint32_t)(p - start_of_digits_ptr);
22492
22493
    // Update exp10 for the optional exponent, starting with 'E' or 'e'.
22494
0
    if ((*p | 0x20) == 'e') {
22495
0
      p++;
22496
0
      int32_t exp_sign = +1;
22497
0
      if (*p == '-') {
22498
0
        p++;
22499
0
        exp_sign = -1;
22500
0
      } else if (*p == '+') {
22501
0
        p++;
22502
0
      }
22503
0
      if (!wuffs_private_impl__is_decimal_digit(*p)) {
22504
0
        goto fallback;
22505
0
      }
22506
0
      int32_t exp_num = ((uint8_t)(*p - '0'));
22507
0
      p++;
22508
      // The rest of the exp_num walking has a peculiar control flow but, once
22509
      // again, the "script/process-json-numbers.c with -p" benchmark is
22510
      // sensitive to alternative formulations.
22511
0
      if (wuffs_private_impl__is_decimal_digit(*p)) {
22512
0
        exp_num = (10 * exp_num) + ((uint8_t)(*p - '0'));
22513
0
        p++;
22514
0
      }
22515
0
      if (wuffs_private_impl__is_decimal_digit(*p)) {
22516
0
        exp_num = (10 * exp_num) + ((uint8_t)(*p - '0'));
22517
0
        p++;
22518
0
      }
22519
0
      while (wuffs_private_impl__is_decimal_digit(*p)) {
22520
0
        if (exp_num > 0x1000000) {
22521
0
          goto fallback;
22522
0
        }
22523
0
        exp_num = (10 * exp_num) + ((uint8_t)(*p - '0'));
22524
0
        p++;
22525
0
      }
22526
0
      exp10 += exp_sign * exp_num;
22527
0
    }
22528
22529
    // The Wuffs API is that the original slice has no trailing data. It also
22530
    // allows underscores, which we don't catch here but the fallback should.
22531
0
    if (p != &z[s.len]) {
22532
0
      goto fallback;
22533
0
    }
22534
22535
    // Check that the uint64_t typed man variable has not overflowed, based on
22536
    // digit_count.
22537
    //
22538
    // For reference:
22539
    //   - (1 << 63) is  9223372036854775808, which has 19 decimal digits.
22540
    //   - (1 << 64) is 18446744073709551616, which has 20 decimal digits.
22541
    //   - 19 nines,  9999999999999999999, is  0x8AC7230489E7FFFF, which has 64
22542
    //     bits and 16 hexadecimal digits.
22543
    //   - 20 nines, 99999999999999999999, is 0x56BC75E2D630FFFFF, which has 67
22544
    //     bits and 17 hexadecimal digits.
22545
0
    if (digit_count > 19) {
22546
      // Even if we have more than 19 pseudo-digits, it's not yet definitely an
22547
      // overflow. Recall that digit_count might be off-by-one (too large) if
22548
      // there's a decimal separator. It will also over-report the number of
22549
      // meaningful digits if the input looks something like "0.000dddExxx".
22550
      //
22551
      // We adjust by the number of leading '0's and '.'s and re-compare to 19.
22552
      // Once again, technically, we could skip ','s too, but that perturbs the
22553
      // "script/process-json-numbers.c with -p" benchmark.
22554
0
      const uint8_t* q = start_of_digits_ptr;
22555
0
      for (; (*q == '0') || (*q == '.'); q++) {
22556
0
      }
22557
0
      digit_count -= (uint32_t)(q - start_of_digits_ptr);
22558
0
      if (digit_count > 19) {
22559
0
        goto fallback;
22560
0
      }
22561
0
    }
22562
22563
    // The wuffs_private_impl__parse_number_f64_eisel_lemire preconditions
22564
    // include that exp10 is in the range [-307 ..= 288].
22565
0
    if ((exp10 < -307) || (288 < exp10)) {
22566
0
      goto fallback;
22567
0
    }
22568
22569
    // If both man and (10 ** exp10) are exactly representable by a double, we
22570
    // don't need to run the Eisel-Lemire algorithm.
22571
0
    if ((-22 <= exp10) && (exp10 <= 22) && ((man >> 53) == 0)) {
22572
0
      double d = (double)man;
22573
0
      if (exp10 >= 0) {
22574
0
        d *= wuffs_private_impl__f64_powers_of_10[+exp10];
22575
0
      } else {
22576
0
        d /= wuffs_private_impl__f64_powers_of_10[-exp10];
22577
0
      }
22578
0
      wuffs_base__result_f64 ret;
22579
0
      ret.status.repr = NULL;
22580
0
      ret.value = negative ? -d : +d;
22581
0
      return ret;
22582
0
    }
22583
22584
    // The wuffs_private_impl__parse_number_f64_eisel_lemire preconditions
22585
    // include that man is non-zero. Parsing "0" should be caught by the "If
22586
    // both man and (10 ** exp10)" above, but "0e99" might not.
22587
0
    if (man == 0) {
22588
0
      goto fallback;
22589
0
    }
22590
22591
    // Our man and exp10 are in range. Run the Eisel-Lemire algorithm.
22592
0
    int64_t r = wuffs_private_impl__parse_number_f64_eisel_lemire(man, exp10);
22593
0
    if (r < 0) {
22594
0
      goto fallback;
22595
0
    }
22596
0
    wuffs_base__result_f64 ret;
22597
0
    ret.status.repr = NULL;
22598
0
    ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64(
22599
0
        ((uint64_t)r) | (((uint64_t)negative) << 63));
22600
0
    return ret;
22601
0
  } while (0);
22602
22603
0
fallback:
22604
0
  do {
22605
0
    wuffs_private_impl__high_prec_dec h;
22606
0
    wuffs_base__status status =
22607
0
        wuffs_private_impl__high_prec_dec__parse(&h, s, options);
22608
0
    if (status.repr) {
22609
0
      return wuffs_private_impl__parse_number_f64_special(s, options);
22610
0
    }
22611
0
    return wuffs_private_impl__high_prec_dec__to_f64(&h, options);
22612
0
  } while (0);
22613
0
}
22614
22615
// --------
22616
22617
static inline size_t  //
22618
wuffs_private_impl__render_inf(wuffs_base__slice_u8 dst,
22619
                               bool neg,
22620
0
                               uint32_t options) {
22621
0
  if (neg) {
22622
0
    if (dst.len < 4) {
22623
0
      return 0;
22624
0
    }
22625
0
    wuffs_base__poke_u32le__no_bounds_check(dst.ptr, 0x666E492D);  // '-Inf'le.
22626
0
    return 4;
22627
0
  }
22628
22629
0
  if (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN) {
22630
0
    if (dst.len < 4) {
22631
0
      return 0;
22632
0
    }
22633
0
    wuffs_base__poke_u32le__no_bounds_check(dst.ptr, 0x666E492B);  // '+Inf'le.
22634
0
    return 4;
22635
0
  }
22636
22637
0
  if (dst.len < 3) {
22638
0
    return 0;
22639
0
  }
22640
0
  wuffs_base__poke_u24le__no_bounds_check(dst.ptr, 0x666E49);  // 'Inf'le.
22641
0
  return 3;
22642
0
}
22643
22644
static inline size_t  //
22645
0
wuffs_private_impl__render_nan(wuffs_base__slice_u8 dst) {
22646
0
  if (dst.len < 3) {
22647
0
    return 0;
22648
0
  }
22649
0
  wuffs_base__poke_u24le__no_bounds_check(dst.ptr, 0x4E614E);  // 'NaN'le.
22650
0
  return 3;
22651
0
}
22652
22653
static size_t  //
22654
wuffs_private_impl__high_prec_dec__render_exponent_absent(
22655
    wuffs_base__slice_u8 dst,
22656
    wuffs_private_impl__high_prec_dec* h,
22657
    uint32_t precision,
22658
0
    uint32_t options) {
22659
0
  size_t n = (h->negative ||
22660
0
              (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN))
22661
0
                 ? 1
22662
0
                 : 0;
22663
0
  if (h->decimal_point <= 0) {
22664
0
    n += 1;
22665
0
  } else {
22666
0
    n += (size_t)(h->decimal_point);
22667
0
  }
22668
0
  if (precision > 0) {
22669
0
    n += precision + 1;  // +1 for the '.'.
22670
0
  }
22671
22672
  // Don't modify dst if the formatted number won't fit.
22673
0
  if (n > dst.len) {
22674
0
    return 0;
22675
0
  }
22676
22677
  // Align-left or align-right.
22678
0
  uint8_t* ptr = (options & WUFFS_BASE__RENDER_NUMBER_XXX__ALIGN_RIGHT)
22679
0
                     ? &dst.ptr[dst.len - n]
22680
0
                     : &dst.ptr[0];
22681
22682
  // Leading "ยฑ".
22683
0
  if (h->negative) {
22684
0
    *ptr++ = '-';
22685
0
  } else if (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN) {
22686
0
    *ptr++ = '+';
22687
0
  }
22688
22689
  // Integral digits.
22690
0
  if (h->decimal_point <= 0) {
22691
0
    *ptr++ = '0';
22692
0
  } else {
22693
0
    uint32_t m =
22694
0
        wuffs_base__u32__min(h->num_digits, (uint32_t)(h->decimal_point));
22695
0
    uint32_t i = 0;
22696
0
    for (; i < m; i++) {
22697
0
      *ptr++ = (uint8_t)('0' | h->digits[i]);
22698
0
    }
22699
0
    for (; i < (uint32_t)(h->decimal_point); i++) {
22700
0
      *ptr++ = '0';
22701
0
    }
22702
0
  }
22703
22704
  // Separator and then fractional digits.
22705
0
  if (precision > 0) {
22706
0
    *ptr++ =
22707
0
        (options & WUFFS_BASE__RENDER_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA)
22708
0
            ? ','
22709
0
            : '.';
22710
0
    uint32_t i = 0;
22711
0
    for (; i < precision; i++) {
22712
0
      uint32_t j = ((uint32_t)(h->decimal_point)) + i;
22713
0
      *ptr++ = (uint8_t)('0' | ((j < h->num_digits) ? h->digits[j] : 0));
22714
0
    }
22715
0
  }
22716
22717
0
  return n;
22718
0
}
22719
22720
static size_t  //
22721
wuffs_private_impl__high_prec_dec__render_exponent_present(
22722
    wuffs_base__slice_u8 dst,
22723
    wuffs_private_impl__high_prec_dec* h,
22724
    uint32_t precision,
22725
0
    uint32_t options) {
22726
0
  int32_t exp = 0;
22727
0
  if (h->num_digits > 0) {
22728
0
    exp = h->decimal_point - 1;
22729
0
  }
22730
0
  bool negative_exp = exp < 0;
22731
0
  if (negative_exp) {
22732
0
    exp = -exp;
22733
0
  }
22734
22735
0
  size_t n = (h->negative ||
22736
0
              (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN))
22737
0
                 ? 4
22738
0
                 : 3;  // Mininum 3 bytes: first digit and then "eยฑ".
22739
0
  if (precision > 0) {
22740
0
    n += precision + 1;  // +1 for the '.'.
22741
0
  }
22742
0
  n += (exp < 100) ? 2 : 3;
22743
22744
  // Don't modify dst if the formatted number won't fit.
22745
0
  if (n > dst.len) {
22746
0
    return 0;
22747
0
  }
22748
22749
  // Align-left or align-right.
22750
0
  uint8_t* ptr = (options & WUFFS_BASE__RENDER_NUMBER_XXX__ALIGN_RIGHT)
22751
0
                     ? &dst.ptr[dst.len - n]
22752
0
                     : &dst.ptr[0];
22753
22754
  // Leading "ยฑ".
22755
0
  if (h->negative) {
22756
0
    *ptr++ = '-';
22757
0
  } else if (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN) {
22758
0
    *ptr++ = '+';
22759
0
  }
22760
22761
  // Integral digit.
22762
0
  if (h->num_digits > 0) {
22763
0
    *ptr++ = (uint8_t)('0' | h->digits[0]);
22764
0
  } else {
22765
0
    *ptr++ = '0';
22766
0
  }
22767
22768
  // Separator and then fractional digits.
22769
0
  if (precision > 0) {
22770
0
    *ptr++ =
22771
0
        (options & WUFFS_BASE__RENDER_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA)
22772
0
            ? ','
22773
0
            : '.';
22774
0
    uint32_t i = 1;
22775
0
    uint32_t j = wuffs_base__u32__min(h->num_digits, precision + 1);
22776
0
    for (; i < j; i++) {
22777
0
      *ptr++ = (uint8_t)('0' | h->digits[i]);
22778
0
    }
22779
0
    for (; i <= precision; i++) {
22780
0
      *ptr++ = '0';
22781
0
    }
22782
0
  }
22783
22784
  // Exponent: "eยฑ" and then 2 or 3 digits.
22785
0
  *ptr++ = 'e';
22786
0
  *ptr++ = negative_exp ? '-' : '+';
22787
0
  if (exp < 10) {
22788
0
    *ptr++ = '0';
22789
0
    *ptr++ = (uint8_t)('0' | exp);
22790
0
  } else if (exp < 100) {
22791
0
    *ptr++ = (uint8_t)('0' | (exp / 10));
22792
0
    *ptr++ = (uint8_t)('0' | (exp % 10));
22793
0
  } else {
22794
0
    int32_t e = exp / 100;
22795
0
    exp -= e * 100;
22796
0
    *ptr++ = (uint8_t)('0' | e);
22797
0
    *ptr++ = (uint8_t)('0' | (exp / 10));
22798
0
    *ptr++ = (uint8_t)('0' | (exp % 10));
22799
0
  }
22800
22801
0
  return n;
22802
0
}
22803
22804
WUFFS_BASE__MAYBE_STATIC size_t  //
22805
wuffs_base__render_number_f64(wuffs_base__slice_u8 dst,
22806
                              double x,
22807
                              uint32_t precision,
22808
0
                              uint32_t options) {
22809
  // Decompose x (64 bits) into negativity (1 bit), base-2 exponent (11 bits
22810
  // with a -1023 bias) and mantissa (52 bits).
22811
0
  uint64_t bits = wuffs_base__ieee_754_bit_representation__from_f64_to_u64(x);
22812
0
  bool neg = (bits >> 63) != 0;
22813
0
  int32_t exp2 = ((int32_t)(bits >> 52)) & 0x7FF;
22814
0
  uint64_t man = bits & 0x000FFFFFFFFFFFFFul;
22815
22816
  // Apply the exponent bias and set the implicit top bit of the mantissa,
22817
  // unless x is subnormal. Also take care of Inf and NaN.
22818
0
  if (exp2 == 0x7FF) {
22819
0
    if (man != 0) {
22820
0
      return wuffs_private_impl__render_nan(dst);
22821
0
    }
22822
0
    return wuffs_private_impl__render_inf(dst, neg, options);
22823
0
  } else if (exp2 == 0) {
22824
0
    exp2 = -1022;
22825
0
  } else {
22826
0
    exp2 -= 1023;
22827
0
    man |= 0x0010000000000000ul;
22828
0
  }
22829
22830
  // Ensure that precision isn't too large.
22831
0
  if (precision > 4095) {
22832
0
    precision = 4095;
22833
0
  }
22834
22835
  // Convert from the (neg, exp2, man) tuple to an HPD.
22836
0
  wuffs_private_impl__high_prec_dec h;
22837
0
  wuffs_private_impl__high_prec_dec__assign(&h, man, neg);
22838
0
  if (h.num_digits > 0) {
22839
0
    wuffs_private_impl__high_prec_dec__lshift(&h,
22840
0
                                              exp2 - 52);  // 52 mantissa bits.
22841
0
  }
22842
22843
  // Handle the "%e" and "%f" formats.
22844
0
  switch (options & (WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_ABSENT |
22845
0
                     WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_PRESENT)) {
22846
0
    case WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_ABSENT:  // The "%"f" format.
22847
0
      if (options & WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION) {
22848
0
        wuffs_private_impl__high_prec_dec__round_just_enough(&h, exp2, man);
22849
0
        int32_t p = ((int32_t)(h.num_digits)) - h.decimal_point;
22850
0
        precision = ((uint32_t)(wuffs_base__i32__max(0, p)));
22851
0
      } else {
22852
0
        wuffs_private_impl__high_prec_dec__round_nearest(
22853
0
            &h, ((int32_t)precision) + h.decimal_point);
22854
0
      }
22855
0
      return wuffs_private_impl__high_prec_dec__render_exponent_absent(
22856
0
          dst, &h, precision, options);
22857
22858
0
    case WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_PRESENT:  // The "%e" format.
22859
0
      if (options & WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION) {
22860
0
        wuffs_private_impl__high_prec_dec__round_just_enough(&h, exp2, man);
22861
0
        precision = (h.num_digits > 0) ? (h.num_digits - 1) : 0;
22862
0
      } else {
22863
0
        wuffs_private_impl__high_prec_dec__round_nearest(
22864
0
            &h, ((int32_t)precision) + 1);
22865
0
      }
22866
0
      return wuffs_private_impl__high_prec_dec__render_exponent_present(
22867
0
          dst, &h, precision, options);
22868
0
  }
22869
22870
  // We have the "%g" format and so precision means the number of significant
22871
  // digits, not the number of digits after the decimal separator. Perform
22872
  // rounding and determine whether to use "%e" or "%f".
22873
0
  int32_t e_threshold = 0;
22874
0
  if (options & WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION) {
22875
0
    wuffs_private_impl__high_prec_dec__round_just_enough(&h, exp2, man);
22876
0
    precision = h.num_digits;
22877
0
    e_threshold = 6;
22878
0
  } else {
22879
0
    if (precision == 0) {
22880
0
      precision = 1;
22881
0
    }
22882
0
    wuffs_private_impl__high_prec_dec__round_nearest(&h, ((int32_t)precision));
22883
0
    e_threshold = ((int32_t)precision);
22884
0
    int32_t nd = ((int32_t)(h.num_digits));
22885
0
    if ((e_threshold > nd) && (nd >= h.decimal_point)) {
22886
0
      e_threshold = nd;
22887
0
    }
22888
0
  }
22889
22890
  // Use the "%e" format if the exponent is large.
22891
0
  int32_t e = h.decimal_point - 1;
22892
0
  if ((e < -4) || (e_threshold <= e)) {
22893
0
    uint32_t p = wuffs_base__u32__min(precision, h.num_digits);
22894
0
    return wuffs_private_impl__high_prec_dec__render_exponent_present(
22895
0
        dst, &h, (p > 0) ? (p - 1) : 0, options);
22896
0
  }
22897
22898
  // Use the "%f" format otherwise.
22899
0
  int32_t p = ((int32_t)precision);
22900
0
  if (p > h.decimal_point) {
22901
0
    p = ((int32_t)(h.num_digits));
22902
0
  }
22903
0
  precision = ((uint32_t)(wuffs_base__i32__max(0, p - h.decimal_point)));
22904
0
  return wuffs_private_impl__high_prec_dec__render_exponent_absent(
22905
0
      dst, &h, precision, options);
22906
0
}
22907
22908
#endif  // !defined(WUFFS_CONFIG__MODULES) ||
22909
        // defined(WUFFS_CONFIG__MODULE__BASE) ||
22910
        // defined(WUFFS_CONFIG__MODULE__BASE__FLOATCONV)
22911
22912
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \
22913
    defined(WUFFS_CONFIG__MODULE__BASE__INTCONV)
22914
22915
// ---------------- Integer
22916
22917
// wuffs_base__parse_number__foo_digits entries are 0x00 for invalid digits,
22918
// and (0x80 | v) for valid digits, where v is the 4 bit value.
22919
22920
static const uint8_t wuffs_base__parse_number__decimal_digits[256] = {
22921
    // 0     1     2     3     4     5     6     7
22922
    // 8     9     A     B     C     D     E     F
22923
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x00 ..= 0x07.
22924
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x08 ..= 0x0F.
22925
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x10 ..= 0x17.
22926
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x18 ..= 0x1F.
22927
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x20 ..= 0x27.
22928
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x28 ..= 0x2F.
22929
    0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,  // 0x30 ..= 0x37. '0'-'7'.
22930
    0x88, 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x38 ..= 0x3F. '8'-'9'.
22931
22932
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x40 ..= 0x47.
22933
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x48 ..= 0x4F.
22934
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x50 ..= 0x57.
22935
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x58 ..= 0x5F.
22936
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x60 ..= 0x67.
22937
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x68 ..= 0x6F.
22938
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x70 ..= 0x77.
22939
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x78 ..= 0x7F.
22940
22941
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x80 ..= 0x87.
22942
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x88 ..= 0x8F.
22943
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x90 ..= 0x97.
22944
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x98 ..= 0x9F.
22945
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xA0 ..= 0xA7.
22946
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xA8 ..= 0xAF.
22947
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xB0 ..= 0xB7.
22948
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xB8 ..= 0xBF.
22949
22950
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xC0 ..= 0xC7.
22951
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xC8 ..= 0xCF.
22952
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xD0 ..= 0xD7.
22953
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xD8 ..= 0xDF.
22954
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xE0 ..= 0xE7.
22955
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xE8 ..= 0xEF.
22956
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xF0 ..= 0xF7.
22957
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xF8 ..= 0xFF.
22958
    // 0     1     2     3     4     5     6     7
22959
    // 8     9     A     B     C     D     E     F
22960
};
22961
22962
static const uint8_t wuffs_base__parse_number__hexadecimal_digits[256] = {
22963
    // 0     1     2     3     4     5     6     7
22964
    // 8     9     A     B     C     D     E     F
22965
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x00 ..= 0x07.
22966
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x08 ..= 0x0F.
22967
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x10 ..= 0x17.
22968
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x18 ..= 0x1F.
22969
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x20 ..= 0x27.
22970
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x28 ..= 0x2F.
22971
    0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,  // 0x30 ..= 0x37. '0'-'7'.
22972
    0x88, 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x38 ..= 0x3F. '8'-'9'.
22973
22974
    0x00, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x00,  // 0x40 ..= 0x47. 'A'-'F'.
22975
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x48 ..= 0x4F.
22976
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x50 ..= 0x57.
22977
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x58 ..= 0x5F.
22978
    0x00, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x00,  // 0x60 ..= 0x67. 'a'-'f'.
22979
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x68 ..= 0x6F.
22980
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x70 ..= 0x77.
22981
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x78 ..= 0x7F.
22982
22983
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x80 ..= 0x87.
22984
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x88 ..= 0x8F.
22985
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x90 ..= 0x97.
22986
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x98 ..= 0x9F.
22987
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xA0 ..= 0xA7.
22988
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xA8 ..= 0xAF.
22989
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xB0 ..= 0xB7.
22990
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xB8 ..= 0xBF.
22991
22992
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xC0 ..= 0xC7.
22993
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xC8 ..= 0xCF.
22994
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xD0 ..= 0xD7.
22995
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xD8 ..= 0xDF.
22996
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xE0 ..= 0xE7.
22997
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xE8 ..= 0xEF.
22998
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xF0 ..= 0xF7.
22999
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xF8 ..= 0xFF.
23000
    // 0     1     2     3     4     5     6     7
23001
    // 8     9     A     B     C     D     E     F
23002
};
23003
23004
static const uint8_t wuffs_private_impl__encode_base16[16] = {
23005
    0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,  // 0x00 ..= 0x07.
23006
    0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46,  // 0x08 ..= 0x0F.
23007
};
23008
23009
// --------
23010
23011
WUFFS_BASE__MAYBE_STATIC wuffs_base__result_i64  //
23012
0
wuffs_base__parse_number_i64(wuffs_base__slice_u8 s, uint32_t options) {
23013
0
  uint8_t* p = s.ptr;
23014
0
  uint8_t* q = s.ptr + s.len;
23015
23016
0
  if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) {
23017
0
    for (; (p < q) && (*p == '_'); p++) {
23018
0
    }
23019
0
  }
23020
23021
0
  bool negative = false;
23022
0
  if (p >= q) {
23023
0
    goto fail_bad_argument;
23024
0
  } else if (*p == '-') {
23025
0
    p++;
23026
0
    negative = true;
23027
0
  } else if (*p == '+') {
23028
0
    p++;
23029
0
  }
23030
23031
0
  do {
23032
0
    wuffs_base__result_u64 r = wuffs_base__parse_number_u64(
23033
0
        wuffs_base__make_slice_u8(p, (size_t)(q - p)), options);
23034
0
    if (r.status.repr != NULL) {
23035
0
      wuffs_base__result_i64 ret;
23036
0
      ret.status.repr = r.status.repr;
23037
0
      ret.value = 0;
23038
0
      return ret;
23039
0
    } else if (negative) {
23040
0
      if (r.value < 0x8000000000000000) {
23041
0
        wuffs_base__result_i64 ret;
23042
0
        ret.status.repr = NULL;
23043
0
        ret.value = -(int64_t)(r.value);
23044
0
        return ret;
23045
0
      } else if (r.value == 0x8000000000000000) {
23046
0
        wuffs_base__result_i64 ret;
23047
0
        ret.status.repr = NULL;
23048
0
        ret.value = INT64_MIN;
23049
0
        return ret;
23050
0
      }
23051
0
      goto fail_out_of_bounds;
23052
0
    } else if (r.value > 0x7FFFFFFFFFFFFFFF) {
23053
0
      goto fail_out_of_bounds;
23054
0
    } else {
23055
0
      wuffs_base__result_i64 ret;
23056
0
      ret.status.repr = NULL;
23057
0
      ret.value = +(int64_t)(r.value);
23058
0
      return ret;
23059
0
    }
23060
0
  } while (0);
23061
23062
0
fail_bad_argument:
23063
0
  do {
23064
0
    wuffs_base__result_i64 ret;
23065
0
    ret.status.repr = wuffs_base__error__bad_argument;
23066
0
    ret.value = 0;
23067
0
    return ret;
23068
0
  } while (0);
23069
23070
0
fail_out_of_bounds:
23071
0
  do {
23072
0
    wuffs_base__result_i64 ret;
23073
0
    ret.status.repr = wuffs_base__error__out_of_bounds;
23074
0
    ret.value = 0;
23075
0
    return ret;
23076
0
  } while (0);
23077
0
}
23078
23079
WUFFS_BASE__MAYBE_STATIC wuffs_base__result_u64  //
23080
0
wuffs_base__parse_number_u64(wuffs_base__slice_u8 s, uint32_t options) {
23081
0
  uint8_t* p = s.ptr;
23082
0
  uint8_t* q = s.ptr + s.len;
23083
23084
0
  if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) {
23085
0
    for (; (p < q) && (*p == '_'); p++) {
23086
0
    }
23087
0
  }
23088
23089
0
  if (p >= q) {
23090
0
    goto fail_bad_argument;
23091
23092
0
  } else if (*p == '0') {
23093
0
    p++;
23094
0
    if (p >= q) {
23095
0
      goto ok_zero;
23096
0
    }
23097
0
    if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) {
23098
0
      if (*p == '_') {
23099
0
        p++;
23100
0
        for (; p < q; p++) {
23101
0
          if (*p != '_') {
23102
0
            if (options &
23103
0
                WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_MULTIPLE_LEADING_ZEROES) {
23104
0
              goto decimal;
23105
0
            }
23106
0
            goto fail_bad_argument;
23107
0
          }
23108
0
        }
23109
0
        goto ok_zero;
23110
0
      }
23111
0
    }
23112
23113
0
    if ((*p == 'x') || (*p == 'X')) {
23114
0
      p++;
23115
0
      if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) {
23116
0
        for (; (p < q) && (*p == '_'); p++) {
23117
0
        }
23118
0
      }
23119
0
      if (p < q) {
23120
0
        goto hexadecimal;
23121
0
      }
23122
23123
0
    } else if ((*p == 'd') || (*p == 'D')) {
23124
0
      p++;
23125
0
      if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) {
23126
0
        for (; (p < q) && (*p == '_'); p++) {
23127
0
        }
23128
0
      }
23129
0
      if (p < q) {
23130
0
        goto decimal;
23131
0
      }
23132
0
    }
23133
23134
0
    if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_MULTIPLE_LEADING_ZEROES) {
23135
0
      goto decimal;
23136
0
    }
23137
0
    goto fail_bad_argument;
23138
0
  }
23139
23140
0
decimal:
23141
0
  do {
23142
0
    uint64_t v = wuffs_base__parse_number__decimal_digits[*p++];
23143
0
    if (v == 0) {
23144
0
      goto fail_bad_argument;
23145
0
    }
23146
0
    v &= 0x0F;
23147
23148
    // UINT64_MAX is 18446744073709551615, which is ((10 * max10) + max1).
23149
0
    const uint64_t max10 = 1844674407370955161u;
23150
0
    const uint8_t max1 = 5;
23151
23152
0
    for (; p < q; p++) {
23153
0
      if ((*p == '_') &&
23154
0
          (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) {
23155
0
        continue;
23156
0
      }
23157
0
      uint8_t digit = wuffs_base__parse_number__decimal_digits[*p];
23158
0
      if (digit == 0) {
23159
0
        goto fail_bad_argument;
23160
0
      }
23161
0
      digit &= 0x0F;
23162
0
      if ((v > max10) || ((v == max10) && (digit > max1))) {
23163
0
        goto fail_out_of_bounds;
23164
0
      }
23165
0
      v = (10 * v) + ((uint64_t)(digit));
23166
0
    }
23167
23168
0
    wuffs_base__result_u64 ret;
23169
0
    ret.status.repr = NULL;
23170
0
    ret.value = v;
23171
0
    return ret;
23172
0
  } while (0);
23173
23174
0
hexadecimal:
23175
0
  do {
23176
0
    uint64_t v = wuffs_base__parse_number__hexadecimal_digits[*p++];
23177
0
    if (v == 0) {
23178
0
      goto fail_bad_argument;
23179
0
    }
23180
0
    v &= 0x0F;
23181
23182
0
    for (; p < q; p++) {
23183
0
      if ((*p == '_') &&
23184
0
          (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) {
23185
0
        continue;
23186
0
      }
23187
0
      uint8_t digit = wuffs_base__parse_number__hexadecimal_digits[*p];
23188
0
      if (digit == 0) {
23189
0
        goto fail_bad_argument;
23190
0
      }
23191
0
      digit &= 0x0F;
23192
0
      if ((v >> 60) != 0) {
23193
0
        goto fail_out_of_bounds;
23194
0
      }
23195
0
      v = (v << 4) | ((uint64_t)(digit));
23196
0
    }
23197
23198
0
    wuffs_base__result_u64 ret;
23199
0
    ret.status.repr = NULL;
23200
0
    ret.value = v;
23201
0
    return ret;
23202
0
  } while (0);
23203
23204
0
ok_zero:
23205
0
  do {
23206
0
    wuffs_base__result_u64 ret;
23207
0
    ret.status.repr = NULL;
23208
0
    ret.value = 0;
23209
0
    return ret;
23210
0
  } while (0);
23211
23212
0
fail_bad_argument:
23213
0
  do {
23214
0
    wuffs_base__result_u64 ret;
23215
0
    ret.status.repr = wuffs_base__error__bad_argument;
23216
0
    ret.value = 0;
23217
0
    return ret;
23218
0
  } while (0);
23219
23220
0
fail_out_of_bounds:
23221
0
  do {
23222
0
    wuffs_base__result_u64 ret;
23223
0
    ret.status.repr = wuffs_base__error__out_of_bounds;
23224
0
    ret.value = 0;
23225
0
    return ret;
23226
0
  } while (0);
23227
0
}
23228
23229
// --------
23230
23231
// wuffs_base__render_number__first_hundred contains the decimal encodings of
23232
// the first one hundred numbers [0 ..= 99].
23233
static const uint8_t wuffs_base__render_number__first_hundred[200] = {
23234
    '0', '0', '0', '1', '0', '2', '0', '3', '0', '4',  //
23235
    '0', '5', '0', '6', '0', '7', '0', '8', '0', '9',  //
23236
    '1', '0', '1', '1', '1', '2', '1', '3', '1', '4',  //
23237
    '1', '5', '1', '6', '1', '7', '1', '8', '1', '9',  //
23238
    '2', '0', '2', '1', '2', '2', '2', '3', '2', '4',  //
23239
    '2', '5', '2', '6', '2', '7', '2', '8', '2', '9',  //
23240
    '3', '0', '3', '1', '3', '2', '3', '3', '3', '4',  //
23241
    '3', '5', '3', '6', '3', '7', '3', '8', '3', '9',  //
23242
    '4', '0', '4', '1', '4', '2', '4', '3', '4', '4',  //
23243
    '4', '5', '4', '6', '4', '7', '4', '8', '4', '9',  //
23244
    '5', '0', '5', '1', '5', '2', '5', '3', '5', '4',  //
23245
    '5', '5', '5', '6', '5', '7', '5', '8', '5', '9',  //
23246
    '6', '0', '6', '1', '6', '2', '6', '3', '6', '4',  //
23247
    '6', '5', '6', '6', '6', '7', '6', '8', '6', '9',  //
23248
    '7', '0', '7', '1', '7', '2', '7', '3', '7', '4',  //
23249
    '7', '5', '7', '6', '7', '7', '7', '8', '7', '9',  //
23250
    '8', '0', '8', '1', '8', '2', '8', '3', '8', '4',  //
23251
    '8', '5', '8', '6', '8', '7', '8', '8', '8', '9',  //
23252
    '9', '0', '9', '1', '9', '2', '9', '3', '9', '4',  //
23253
    '9', '5', '9', '6', '9', '7', '9', '8', '9', '9',  //
23254
};
23255
23256
static size_t  //
23257
wuffs_private_impl__render_number_u64(wuffs_base__slice_u8 dst,
23258
                                      uint64_t x,
23259
                                      uint32_t options,
23260
0
                                      bool neg) {
23261
0
  uint8_t buf[WUFFS_BASE__U64__BYTE_LENGTH__MAX_INCL];
23262
0
  uint8_t* ptr = &buf[0] + sizeof(buf);
23263
23264
0
  while (x >= 100) {
23265
0
    size_t index = ((size_t)((x % 100) * 2));
23266
0
    x /= 100;
23267
0
    uint8_t s0 = wuffs_base__render_number__first_hundred[index + 0];
23268
0
    uint8_t s1 = wuffs_base__render_number__first_hundred[index + 1];
23269
0
    ptr -= 2;
23270
0
    ptr[0] = s0;
23271
0
    ptr[1] = s1;
23272
0
  }
23273
23274
0
  if (x < 10) {
23275
0
    ptr -= 1;
23276
0
    ptr[0] = (uint8_t)('0' + x);
23277
0
  } else {
23278
0
    size_t index = ((size_t)(x * 2));
23279
0
    uint8_t s0 = wuffs_base__render_number__first_hundred[index + 0];
23280
0
    uint8_t s1 = wuffs_base__render_number__first_hundred[index + 1];
23281
0
    ptr -= 2;
23282
0
    ptr[0] = s0;
23283
0
    ptr[1] = s1;
23284
0
  }
23285
23286
0
  if (neg) {
23287
0
    ptr -= 1;
23288
0
    ptr[0] = '-';
23289
0
  } else if (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN) {
23290
0
    ptr -= 1;
23291
0
    ptr[0] = '+';
23292
0
  }
23293
23294
0
  size_t n = sizeof(buf) - ((size_t)(ptr - &buf[0]));
23295
0
  if (n > dst.len) {
23296
0
    return 0;
23297
0
  }
23298
0
  memcpy(dst.ptr + ((options & WUFFS_BASE__RENDER_NUMBER_XXX__ALIGN_RIGHT)
23299
0
                        ? (dst.len - n)
23300
0
                        : 0),
23301
0
         ptr, n);
23302
0
  return n;
23303
0
}
23304
23305
WUFFS_BASE__MAYBE_STATIC size_t  //
23306
wuffs_base__render_number_i64(wuffs_base__slice_u8 dst,
23307
                              int64_t x,
23308
0
                              uint32_t options) {
23309
0
  uint64_t u = (uint64_t)x;
23310
0
  bool neg = x < 0;
23311
0
  if (neg) {
23312
0
    u = 1 + ~u;
23313
0
  }
23314
0
  return wuffs_private_impl__render_number_u64(dst, u, options, neg);
23315
0
}
23316
23317
WUFFS_BASE__MAYBE_STATIC size_t  //
23318
wuffs_base__render_number_u64(wuffs_base__slice_u8 dst,
23319
                              uint64_t x,
23320
0
                              uint32_t options) {
23321
0
  return wuffs_private_impl__render_number_u64(dst, x, options, false);
23322
0
}
23323
23324
// ---------------- Base-16
23325
23326
WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output  //
23327
wuffs_base__base_16__decode2(wuffs_base__slice_u8 dst,
23328
                             wuffs_base__slice_u8 src,
23329
                             bool src_closed,
23330
0
                             uint32_t options) {
23331
0
  wuffs_base__transform__output o;
23332
0
  size_t src_len2 = src.len / 2;
23333
0
  size_t len;
23334
0
  if (dst.len < src_len2) {
23335
0
    len = dst.len;
23336
0
    o.status.repr = wuffs_base__suspension__short_write;
23337
0
  } else {
23338
0
    len = src_len2;
23339
0
    if (!src_closed) {
23340
0
      o.status.repr = wuffs_base__suspension__short_read;
23341
0
    } else if (src.len & 1) {
23342
0
      o.status.repr = wuffs_base__error__bad_data;
23343
0
    } else {
23344
0
      o.status.repr = NULL;
23345
0
    }
23346
0
  }
23347
23348
0
  uint8_t* d = dst.ptr;
23349
0
  uint8_t* s = src.ptr;
23350
0
  size_t n = len;
23351
23352
0
  while (n--) {
23353
0
    *d = (uint8_t)((wuffs_base__parse_number__hexadecimal_digits[s[0]] << 4) |
23354
0
                   (wuffs_base__parse_number__hexadecimal_digits[s[1]] & 0x0F));
23355
0
    d += 1;
23356
0
    s += 2;
23357
0
  }
23358
23359
0
  o.num_dst = len;
23360
0
  o.num_src = len * 2;
23361
0
  return o;
23362
0
}
23363
23364
WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output  //
23365
wuffs_base__base_16__decode4(wuffs_base__slice_u8 dst,
23366
                             wuffs_base__slice_u8 src,
23367
                             bool src_closed,
23368
0
                             uint32_t options) {
23369
0
  wuffs_base__transform__output o;
23370
0
  size_t src_len4 = src.len / 4;
23371
0
  size_t len = dst.len < src_len4 ? dst.len : src_len4;
23372
0
  if (dst.len < src_len4) {
23373
0
    len = dst.len;
23374
0
    o.status.repr = wuffs_base__suspension__short_write;
23375
0
  } else {
23376
0
    len = src_len4;
23377
0
    if (!src_closed) {
23378
0
      o.status.repr = wuffs_base__suspension__short_read;
23379
0
    } else if (src.len & 1) {
23380
0
      o.status.repr = wuffs_base__error__bad_data;
23381
0
    } else {
23382
0
      o.status.repr = NULL;
23383
0
    }
23384
0
  }
23385
23386
0
  uint8_t* d = dst.ptr;
23387
0
  uint8_t* s = src.ptr;
23388
0
  size_t n = len;
23389
23390
0
  while (n--) {
23391
0
    *d = (uint8_t)((wuffs_base__parse_number__hexadecimal_digits[s[2]] << 4) |
23392
0
                   (wuffs_base__parse_number__hexadecimal_digits[s[3]] & 0x0F));
23393
0
    d += 1;
23394
0
    s += 4;
23395
0
  }
23396
23397
0
  o.num_dst = len;
23398
0
  o.num_src = len * 4;
23399
0
  return o;
23400
0
}
23401
23402
WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output  //
23403
wuffs_base__base_16__encode2(wuffs_base__slice_u8 dst,
23404
                             wuffs_base__slice_u8 src,
23405
                             bool src_closed,
23406
0
                             uint32_t options) {
23407
0
  wuffs_base__transform__output o;
23408
0
  size_t dst_len2 = dst.len / 2;
23409
0
  size_t len;
23410
0
  if (dst_len2 < src.len) {
23411
0
    len = dst_len2;
23412
0
    o.status.repr = wuffs_base__suspension__short_write;
23413
0
  } else {
23414
0
    len = src.len;
23415
0
    if (!src_closed) {
23416
0
      o.status.repr = wuffs_base__suspension__short_read;
23417
0
    } else {
23418
0
      o.status.repr = NULL;
23419
0
    }
23420
0
  }
23421
23422
0
  uint8_t* d = dst.ptr;
23423
0
  uint8_t* s = src.ptr;
23424
0
  size_t n = len;
23425
23426
0
  while (n--) {
23427
0
    uint8_t c = *s;
23428
0
    d[0] = wuffs_private_impl__encode_base16[c >> 4];
23429
0
    d[1] = wuffs_private_impl__encode_base16[c & 0x0F];
23430
0
    d += 2;
23431
0
    s += 1;
23432
0
  }
23433
23434
0
  o.num_dst = len * 2;
23435
0
  o.num_src = len;
23436
0
  return o;
23437
0
}
23438
23439
WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output  //
23440
wuffs_base__base_16__encode4(wuffs_base__slice_u8 dst,
23441
                             wuffs_base__slice_u8 src,
23442
                             bool src_closed,
23443
0
                             uint32_t options) {
23444
0
  wuffs_base__transform__output o;
23445
0
  size_t dst_len4 = dst.len / 4;
23446
0
  size_t len;
23447
0
  if (dst_len4 < src.len) {
23448
0
    len = dst_len4;
23449
0
    o.status.repr = wuffs_base__suspension__short_write;
23450
0
  } else {
23451
0
    len = src.len;
23452
0
    if (!src_closed) {
23453
0
      o.status.repr = wuffs_base__suspension__short_read;
23454
0
    } else {
23455
0
      o.status.repr = NULL;
23456
0
    }
23457
0
  }
23458
23459
0
  uint8_t* d = dst.ptr;
23460
0
  uint8_t* s = src.ptr;
23461
0
  size_t n = len;
23462
23463
0
  while (n--) {
23464
0
    uint8_t c = *s;
23465
0
    d[0] = '\\';
23466
0
    d[1] = 'x';
23467
0
    d[2] = wuffs_private_impl__encode_base16[c >> 4];
23468
0
    d[3] = wuffs_private_impl__encode_base16[c & 0x0F];
23469
0
    d += 4;
23470
0
    s += 1;
23471
0
  }
23472
23473
0
  o.num_dst = len * 4;
23474
0
  o.num_src = len;
23475
0
  return o;
23476
0
}
23477
23478
// ---------------- Base-64
23479
23480
// The two base-64 alphabets, std and url, differ only in the last two codes.
23481
//  - std: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
23482
//  - url: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"
23483
23484
static const uint8_t wuffs_base__base_64__decode_std[256] = {
23485
    // 0     1     2     3     4     5     6     7
23486
    // 8     9     A     B     C     D     E     F
23487
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x00 ..= 0x07.
23488
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x08 ..= 0x0F.
23489
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x10 ..= 0x17.
23490
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x18 ..= 0x1F.
23491
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x20 ..= 0x27.
23492
    0x80, 0x80, 0x80, 0x3E, 0x80, 0x80, 0x80, 0x3F,  // 0x28 ..= 0x2F.
23493
    0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B,  // 0x30 ..= 0x37.
23494
    0x3C, 0x3D, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x38 ..= 0x3F.
23495
23496
    0x80, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,  // 0x40 ..= 0x47.
23497
    0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E,  // 0x48 ..= 0x4F.
23498
    0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,  // 0x50 ..= 0x57.
23499
    0x17, 0x18, 0x19, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x58 ..= 0x5F.
23500
    0x80, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20,  // 0x60 ..= 0x67.
23501
    0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,  // 0x68 ..= 0x6F.
23502
    0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30,  // 0x70 ..= 0x77.
23503
    0x31, 0x32, 0x33, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x78 ..= 0x7F.
23504
23505
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x80 ..= 0x87.
23506
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x88 ..= 0x8F.
23507
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x90 ..= 0x97.
23508
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x98 ..= 0x9F.
23509
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xA0 ..= 0xA7.
23510
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xA8 ..= 0xAF.
23511
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xB0 ..= 0xB7.
23512
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xB8 ..= 0xBF.
23513
23514
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xC0 ..= 0xC7.
23515
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xC8 ..= 0xCF.
23516
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xD0 ..= 0xD7.
23517
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xD8 ..= 0xDF.
23518
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xE0 ..= 0xE7.
23519
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xE8 ..= 0xEF.
23520
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xF0 ..= 0xF7.
23521
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xF8 ..= 0xFF.
23522
    // 0     1     2     3     4     5     6     7
23523
    // 8     9     A     B     C     D     E     F
23524
};
23525
23526
static const uint8_t wuffs_base__base_64__decode_url[256] = {
23527
    // 0     1     2     3     4     5     6     7
23528
    // 8     9     A     B     C     D     E     F
23529
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x00 ..= 0x07.
23530
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x08 ..= 0x0F.
23531
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x10 ..= 0x17.
23532
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x18 ..= 0x1F.
23533
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x20 ..= 0x27.
23534
    0x80, 0x80, 0x80, 0x80, 0x80, 0x3E, 0x80, 0x80,  // 0x28 ..= 0x2F.
23535
    0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B,  // 0x30 ..= 0x37.
23536
    0x3C, 0x3D, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x38 ..= 0x3F.
23537
23538
    0x80, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,  // 0x40 ..= 0x47.
23539
    0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E,  // 0x48 ..= 0x4F.
23540
    0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,  // 0x50 ..= 0x57.
23541
    0x17, 0x18, 0x19, 0x80, 0x80, 0x80, 0x80, 0x3F,  // 0x58 ..= 0x5F.
23542
    0x80, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20,  // 0x60 ..= 0x67.
23543
    0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,  // 0x68 ..= 0x6F.
23544
    0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30,  // 0x70 ..= 0x77.
23545
    0x31, 0x32, 0x33, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x78 ..= 0x7F.
23546
23547
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x80 ..= 0x87.
23548
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x88 ..= 0x8F.
23549
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x90 ..= 0x97.
23550
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x98 ..= 0x9F.
23551
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xA0 ..= 0xA7.
23552
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xA8 ..= 0xAF.
23553
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xB0 ..= 0xB7.
23554
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xB8 ..= 0xBF.
23555
23556
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xC0 ..= 0xC7.
23557
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xC8 ..= 0xCF.
23558
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xD0 ..= 0xD7.
23559
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xD8 ..= 0xDF.
23560
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xE0 ..= 0xE7.
23561
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xE8 ..= 0xEF.
23562
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xF0 ..= 0xF7.
23563
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xF8 ..= 0xFF.
23564
    // 0     1     2     3     4     5     6     7
23565
    // 8     9     A     B     C     D     E     F
23566
};
23567
23568
static const uint8_t wuffs_base__base_64__encode_std[64] = {
23569
    // 0     1     2     3     4     5     6     7
23570
    // 8     9     A     B     C     D     E     F
23571
    0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,  // 0x00 ..= 0x07.
23572
    0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50,  // 0x08 ..= 0x0F.
23573
    0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,  // 0x10 ..= 0x17.
23574
    0x59, 0x5A, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,  // 0x18 ..= 0x1F.
23575
    0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E,  // 0x20 ..= 0x27.
23576
    0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,  // 0x28 ..= 0x2F.
23577
    0x77, 0x78, 0x79, 0x7A, 0x30, 0x31, 0x32, 0x33,  // 0x30 ..= 0x37.
23578
    0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2B, 0x2F,  // 0x38 ..= 0x3F.
23579
};
23580
23581
static const uint8_t wuffs_base__base_64__encode_url[64] = {
23582
    // 0     1     2     3     4     5     6     7
23583
    // 8     9     A     B     C     D     E     F
23584
    0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,  // 0x00 ..= 0x07.
23585
    0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50,  // 0x08 ..= 0x0F.
23586
    0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,  // 0x10 ..= 0x17.
23587
    0x59, 0x5A, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,  // 0x18 ..= 0x1F.
23588
    0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E,  // 0x20 ..= 0x27.
23589
    0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,  // 0x28 ..= 0x2F.
23590
    0x77, 0x78, 0x79, 0x7A, 0x30, 0x31, 0x32, 0x33,  // 0x30 ..= 0x37.
23591
    0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2D, 0x5F,  // 0x38 ..= 0x3F.
23592
};
23593
23594
// --------
23595
23596
WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output  //
23597
wuffs_base__base_64__decode(wuffs_base__slice_u8 dst,
23598
                            wuffs_base__slice_u8 src,
23599
                            bool src_closed,
23600
0
                            uint32_t options) {
23601
0
  const uint8_t* alphabet = (options & WUFFS_BASE__BASE_64__URL_ALPHABET)
23602
0
                                ? wuffs_base__base_64__decode_url
23603
0
                                : wuffs_base__base_64__decode_std;
23604
0
  wuffs_base__transform__output o;
23605
0
  uint8_t* d_ptr = dst.ptr;
23606
0
  size_t d_len = dst.len;
23607
0
  const uint8_t* s_ptr = src.ptr;
23608
0
  size_t s_len = src.len;
23609
0
  bool pad = false;
23610
23611
0
  while (s_len >= 4) {
23612
0
    uint32_t s = wuffs_base__peek_u32le__no_bounds_check(s_ptr);
23613
0
    uint32_t s0 = alphabet[0xFF & (s >> 0)];
23614
0
    uint32_t s1 = alphabet[0xFF & (s >> 8)];
23615
0
    uint32_t s2 = alphabet[0xFF & (s >> 16)];
23616
0
    uint32_t s3 = alphabet[0xFF & (s >> 24)];
23617
23618
0
    if (((s0 | s1 | s2 | s3) & 0xC0) != 0) {
23619
0
      if (s_len > 4) {
23620
0
        o.status.repr = wuffs_base__error__bad_data;
23621
0
        goto done;
23622
0
      } else if (!src_closed) {
23623
0
        o.status.repr = wuffs_base__suspension__short_read;
23624
0
        goto done;
23625
0
      } else if ((options & WUFFS_BASE__BASE_64__DECODE_ALLOW_PADDING) &&
23626
0
                 (s_ptr[3] == '=')) {
23627
0
        pad = true;
23628
0
        if (s_ptr[2] == '=') {
23629
0
          goto src2;
23630
0
        }
23631
0
        goto src3;
23632
0
      }
23633
0
      o.status.repr = wuffs_base__error__bad_data;
23634
0
      goto done;
23635
0
    }
23636
23637
0
    if (d_len < 3) {
23638
0
      o.status.repr = wuffs_base__suspension__short_write;
23639
0
      goto done;
23640
0
    }
23641
23642
0
    s_ptr += 4;
23643
0
    s_len -= 4;
23644
0
    s = (s0 << 18) | (s1 << 12) | (s2 << 6) | (s3 << 0);
23645
0
    *d_ptr++ = (uint8_t)(s >> 16);
23646
0
    *d_ptr++ = (uint8_t)(s >> 8);
23647
0
    *d_ptr++ = (uint8_t)(s >> 0);
23648
0
    d_len -= 3;
23649
0
  }
23650
23651
0
  if (!src_closed) {
23652
0
    o.status.repr = wuffs_base__suspension__short_read;
23653
0
    goto done;
23654
0
  }
23655
23656
0
  if (s_len == 0) {
23657
0
    o.status.repr = NULL;
23658
0
    goto done;
23659
0
  } else if (s_len == 1) {
23660
0
    o.status.repr = wuffs_base__error__bad_data;
23661
0
    goto done;
23662
0
  } else if (s_len == 2) {
23663
0
    goto src2;
23664
0
  }
23665
23666
0
src3:
23667
0
  do {
23668
0
    uint32_t s = wuffs_base__peek_u24le__no_bounds_check(s_ptr);
23669
0
    uint32_t s0 = alphabet[0xFF & (s >> 0)];
23670
0
    uint32_t s1 = alphabet[0xFF & (s >> 8)];
23671
0
    uint32_t s2 = alphabet[0xFF & (s >> 16)];
23672
0
    if ((s0 & 0xC0) || (s1 & 0xC0) || (s2 & 0xC3)) {
23673
0
      o.status.repr = wuffs_base__error__bad_data;
23674
0
      goto done;
23675
0
    }
23676
0
    if (d_len < 2) {
23677
0
      o.status.repr = wuffs_base__suspension__short_write;
23678
0
      goto done;
23679
0
    }
23680
0
    s_ptr += pad ? 4 : 3;
23681
0
    s = (s0 << 18) | (s1 << 12) | (s2 << 6);
23682
0
    *d_ptr++ = (uint8_t)(s >> 16);
23683
0
    *d_ptr++ = (uint8_t)(s >> 8);
23684
0
    o.status.repr = NULL;
23685
0
    goto done;
23686
0
  } while (0);
23687
23688
0
src2:
23689
0
  do {
23690
0
    uint32_t s = wuffs_base__peek_u16le__no_bounds_check(s_ptr);
23691
0
    uint32_t s0 = alphabet[0xFF & (s >> 0)];
23692
0
    uint32_t s1 = alphabet[0xFF & (s >> 8)];
23693
0
    if ((s0 & 0xC0) || (s1 & 0xCF)) {
23694
0
      o.status.repr = wuffs_base__error__bad_data;
23695
0
      goto done;
23696
0
    }
23697
0
    if (d_len < 1) {
23698
0
      o.status.repr = wuffs_base__suspension__short_write;
23699
0
      goto done;
23700
0
    }
23701
0
    s_ptr += pad ? 4 : 2;
23702
0
    s = (s0 << 18) | (s1 << 12);
23703
0
    *d_ptr++ = (uint8_t)(s >> 16);
23704
0
    o.status.repr = NULL;
23705
0
    goto done;
23706
0
  } while (0);
23707
23708
0
done:
23709
0
  o.num_dst = (size_t)(d_ptr - dst.ptr);
23710
0
  o.num_src = (size_t)(s_ptr - src.ptr);
23711
0
  return o;
23712
0
}
23713
23714
WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output  //
23715
wuffs_base__base_64__encode(wuffs_base__slice_u8 dst,
23716
                            wuffs_base__slice_u8 src,
23717
                            bool src_closed,
23718
0
                            uint32_t options) {
23719
0
  const uint8_t* alphabet = (options & WUFFS_BASE__BASE_64__URL_ALPHABET)
23720
0
                                ? wuffs_base__base_64__encode_url
23721
0
                                : wuffs_base__base_64__encode_std;
23722
0
  wuffs_base__transform__output o;
23723
0
  uint8_t* d_ptr = dst.ptr;
23724
0
  size_t d_len = dst.len;
23725
0
  const uint8_t* s_ptr = src.ptr;
23726
0
  size_t s_len = src.len;
23727
23728
0
  do {
23729
0
    while (s_len >= 3) {
23730
0
      if (d_len < 4) {
23731
0
        o.status.repr = wuffs_base__suspension__short_write;
23732
0
        goto done;
23733
0
      }
23734
0
      uint32_t s = wuffs_base__peek_u24be__no_bounds_check(s_ptr);
23735
0
      s_ptr += 3;
23736
0
      s_len -= 3;
23737
0
      *d_ptr++ = alphabet[0x3F & (s >> 18)];
23738
0
      *d_ptr++ = alphabet[0x3F & (s >> 12)];
23739
0
      *d_ptr++ = alphabet[0x3F & (s >> 6)];
23740
0
      *d_ptr++ = alphabet[0x3F & (s >> 0)];
23741
0
      d_len -= 4;
23742
0
    }
23743
23744
0
    if (!src_closed) {
23745
0
      o.status.repr = wuffs_base__suspension__short_read;
23746
0
      goto done;
23747
0
    }
23748
23749
0
    if (s_len == 2) {
23750
0
      if (d_len <
23751
0
          ((options & WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING) ? 4 : 3)) {
23752
0
        o.status.repr = wuffs_base__suspension__short_write;
23753
0
        goto done;
23754
0
      }
23755
0
      uint32_t s = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(s_ptr)))
23756
0
                   << 8;
23757
0
      s_ptr += 2;
23758
0
      *d_ptr++ = alphabet[0x3F & (s >> 18)];
23759
0
      *d_ptr++ = alphabet[0x3F & (s >> 12)];
23760
0
      *d_ptr++ = alphabet[0x3F & (s >> 6)];
23761
0
      if (options & WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING) {
23762
0
        *d_ptr++ = '=';
23763
0
      }
23764
0
      o.status.repr = NULL;
23765
0
      goto done;
23766
23767
0
    } else if (s_len == 1) {
23768
0
      if (d_len <
23769
0
          ((options & WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING) ? 4 : 2)) {
23770
0
        o.status.repr = wuffs_base__suspension__short_write;
23771
0
        goto done;
23772
0
      }
23773
0
      uint32_t s = ((uint32_t)(wuffs_base__peek_u8__no_bounds_check(s_ptr)))
23774
0
                   << 16;
23775
0
      s_ptr += 1;
23776
0
      *d_ptr++ = alphabet[0x3F & (s >> 18)];
23777
0
      *d_ptr++ = alphabet[0x3F & (s >> 12)];
23778
0
      if (options & WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING) {
23779
0
        *d_ptr++ = '=';
23780
0
        *d_ptr++ = '=';
23781
0
      }
23782
0
      o.status.repr = NULL;
23783
0
      goto done;
23784
23785
0
    } else {
23786
0
      o.status.repr = NULL;
23787
0
      goto done;
23788
0
    }
23789
0
  } while (0);
23790
23791
0
done:
23792
0
  o.num_dst = (size_t)(d_ptr - dst.ptr);
23793
0
  o.num_src = (size_t)(s_ptr - src.ptr);
23794
0
  return o;
23795
0
}
23796
23797
#endif  // !defined(WUFFS_CONFIG__MODULES) ||
23798
        // defined(WUFFS_CONFIG__MODULE__BASE) ||
23799
        // defined(WUFFS_CONFIG__MODULE__BASE__INTCONV)
23800
23801
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \
23802
    defined(WUFFS_CONFIG__MODULE__BASE__MAGIC)
23803
23804
// ---------------- Magic Numbers
23805
23806
// ICO doesn't start with a magic identifier. Instead, see if the opening bytes
23807
// are plausibly ICO.
23808
//
23809
// Callers should have already verified that (prefix_data.len >= 2) and the
23810
// first two bytes are 0x00.
23811
//
23812
// See:
23813
//  - https://docs.fileformat.com/image/ico/
23814
static int32_t  //
23815
wuffs_base__magic_number_guess_fourcc__maybe_ico(
23816
    wuffs_base__slice_u8 prefix_data,
23817
0
    bool prefix_closed) {
23818
  // Allow-list for the Image Type field.
23819
0
  if (prefix_data.len < 4) {
23820
0
    return prefix_closed ? 0 : -1;
23821
0
  } else if (prefix_data.ptr[3] != 0) {
23822
0
    return 0;
23823
0
  }
23824
0
  switch (prefix_data.ptr[2]) {
23825
0
    case 0x01:  // ICO
23826
0
    case 0x02:  // CUR
23827
0
      break;
23828
0
    default:
23829
0
      return 0;
23830
0
  }
23831
23832
  // The Number Of Images should be positive.
23833
0
  if (prefix_data.len < 6) {
23834
0
    return prefix_closed ? 0 : -1;
23835
0
  } else if ((prefix_data.ptr[4] == 0) && (prefix_data.ptr[5] == 0)) {
23836
0
    return 0;
23837
0
  }
23838
23839
  // The first ICONDIRENTRY's fourth byte should be zero.
23840
0
  if (prefix_data.len < 10) {
23841
0
    return prefix_closed ? 0 : -1;
23842
0
  } else if (prefix_data.ptr[9] != 0) {
23843
0
    return 0;
23844
0
  }
23845
23846
  // TODO: have a separate FourCC for CUR?
23847
0
  return 0x49434F20;  // 'ICO 'be
23848
0
}
23849
23850
// TGA doesn't start with a magic identifier. Instead, see if the opening bytes
23851
// are plausibly TGA.
23852
//
23853
// Callers should have already verified that (prefix_data.len >= 2) and the
23854
// second byte (prefix_data.ptr[1], the Color Map Type byte), is either 0x00 or
23855
// 0x01.
23856
//
23857
// See:
23858
//  - https://docs.fileformat.com/image/tga/
23859
//  - https://www.dca.fee.unicamp.br/~martino/disciplinas/ea978/tgaffs.pdf
23860
static int32_t  //
23861
wuffs_base__magic_number_guess_fourcc__maybe_tga(
23862
    wuffs_base__slice_u8 prefix_data,
23863
0
    bool prefix_closed) {
23864
  // Allow-list for the Image Type field.
23865
0
  if (prefix_data.len < 3) {
23866
0
    return prefix_closed ? 0 : -1;
23867
0
  }
23868
0
  switch (prefix_data.ptr[2]) {
23869
0
    case 0x01:
23870
0
    case 0x02:
23871
0
    case 0x03:
23872
0
    case 0x09:
23873
0
    case 0x0A:
23874
0
    case 0x0B:
23875
0
      break;
23876
0
    default:
23877
      // TODO: 0x20 and 0x21 are invalid, according to the spec, but are
23878
      // apparently unofficial extensions.
23879
0
      return 0;
23880
0
  }
23881
23882
  // Allow-list for the Color Map Entry Size field (if the Color Map Type field
23883
  // is non-zero) or else all the Color Map fields should be zero.
23884
0
  if (prefix_data.len < 8) {
23885
0
    return prefix_closed ? 0 : -1;
23886
0
  } else if (prefix_data.ptr[1] != 0x00) {
23887
0
    switch (prefix_data.ptr[7]) {
23888
0
      case 0x0F:
23889
0
      case 0x10:
23890
0
      case 0x18:
23891
0
      case 0x20:
23892
0
        break;
23893
0
      default:
23894
0
        return 0;
23895
0
    }
23896
0
  } else if ((prefix_data.ptr[3] | prefix_data.ptr[4] | prefix_data.ptr[5] |
23897
0
              prefix_data.ptr[6] | prefix_data.ptr[7]) != 0x00) {
23898
0
    return 0;
23899
0
  }
23900
23901
  // Allow-list for the Pixel Depth field.
23902
0
  if (prefix_data.len < 17) {
23903
0
    return prefix_closed ? 0 : -1;
23904
0
  }
23905
0
  switch (prefix_data.ptr[16]) {
23906
0
    case 0x01:
23907
0
    case 0x08:
23908
0
    case 0x0F:
23909
0
    case 0x10:
23910
0
    case 0x18:
23911
0
    case 0x20:
23912
0
      break;
23913
0
    default:
23914
0
      return 0;
23915
0
  }
23916
23917
0
  return 0x54474120;  // 'TGA 'be
23918
0
}
23919
23920
WUFFS_BASE__MAYBE_STATIC int32_t  //
23921
wuffs_base__magic_number_guess_fourcc(wuffs_base__slice_u8 prefix_data,
23922
0
                                      bool prefix_closed) {
23923
  // This is similar to (but different from):
23924
  //  - the magic/Magdir tables under https://github.com/file/file
23925
  //  - the MIME Sniffing algorithm at https://mimesniff.spec.whatwg.org/
23926
23927
  // table holds the 'magic numbers' (which are actually variable length
23928
  // strings). The strings may contain NUL bytes, so the "const char* magic"
23929
  // value starts with the length-minus-1 of the 'magic number'.
23930
  //
23931
  // Keep it sorted by magic[1], then magic[0] descending (prioritizing longer
23932
  // matches) and finally by magic[2:]. When multiple entries match, the
23933
  // longest one wins.
23934
  //
23935
  // The fourcc field might be negated, in which case there's further
23936
  // specialization (see ยง below).
23937
0
  static struct {
23938
0
    int32_t fourcc;
23939
0
    const char* magic;
23940
0
  } table[] = {
23941
0
      {-0x30302020, "\x01\x00\x00"},                  // '00  'be
23942
0
      {+0x41425852, "\x03\x03\x00\x08\x00"},          // ABXR
23943
0
      {+0x475A2020, "\x02\x1F\x8B\x08"},              // GZ
23944
0
      {+0x5A535444, "\x03\x28\xB5\x2F\xFD"},          // ZSTD
23945
0
      {+0x584D4C20, "\x05\x3C\x3F\x78\x6D\x6C\x20"},  // XML
23946
0
      {+0x41425853, "\x03\x41\x42\x58\x00"},          // ABXS
23947
0
      {+0x425A3220, "\x02\x42\x5A\x68"},              // BZ2
23948
0
      {+0x424D5020, "\x01\x42\x4D"},                  // BMP
23949
0
      {+0x47494620, "\x03\x47\x49\x46\x38"},          // GIF
23950
0
      {+0x54494646, "\x03\x49\x49\x2A\x00"},          // TIFF (little-endian)
23951
0
      {+0x4C5A4950, "\x04\x4C\x5A\x49\x50\x01"},      // LZIP
23952
0
      {+0x54494646, "\x03\x4D\x4D\x00\x2A"},          // TIFF (big-endian)
23953
0
      {+0x45544332, "\x03\x50\x4B\x4D\x20"},          // ETC2 (*.pkm)
23954
0
      {+0x4E50424D, "\x02\x50\x35\x09"},              // NPBM (P5; *.pgm)
23955
0
      {+0x4E50424D, "\x02\x50\x35\x0A"},              // NPBM (P5; *.pgm)
23956
0
      {+0x4E50424D, "\x02\x50\x35\x0D"},              // NPBM (P5; *.pgm)
23957
0
      {+0x4E50424D, "\x02\x50\x35\x20"},              // NPBM (P5; *.pgm)
23958
0
      {+0x4E50424D, "\x02\x50\x36\x09"},              // NPBM (P6; *.ppm)
23959
0
      {+0x4E50424D, "\x02\x50\x36\x0A"},              // NPBM (P6; *.ppm)
23960
0
      {+0x4E50424D, "\x02\x50\x36\x0D"},              // NPBM (P6; *.ppm)
23961
0
      {+0x4E50424D, "\x02\x50\x36\x20"},              // NPBM (P6; *.ppm)
23962
0
      {-0x52494646, "\x03\x52\x49\x46\x46"},          // RIFF
23963
0
      {+0x4C5A4D41, "\x04\x5D\x00\x10\x00\x00"},      // LZMA
23964
0
      {+0x4C5A4D41, "\x02\x5D\x00\x00"},              // LZMA
23965
0
      {+0x4E494520, "\x02\x6E\xC3\xAF"},              // NIE
23966
0
      {+0x514F4920, "\x03\x71\x6F\x69\x66"},          // QOI
23967
0
      {+0x5A4C4942, "\x01\x78\x9C"},                  // ZLIB
23968
0
      {+0x504E4720, "\x03\x89\x50\x4E\x47"},          // PNG
23969
0
      {+0x54482020, "\x02\xC3\xBE\xFE"},              // TH
23970
0
      {+0x585A2020, "\x04\xFD\x37\x7A\x58\x5A"},      // XZ
23971
0
      {+0x484E534D, "\x01\xFE\xD7"},                  // HANDSUM
23972
0
      {+0x4A504547, "\x01\xFF\xD8"},                  // JPEG
23973
0
  };
23974
0
  static const size_t table_len = sizeof(table) / sizeof(table[0]);
23975
23976
0
  if (prefix_data.len == 0) {
23977
0
    return prefix_closed ? 0 : -1;
23978
0
  }
23979
0
  uint8_t pre_first_byte = prefix_data.ptr[0];
23980
23981
0
  int32_t fourcc = 0;
23982
0
  size_t i;
23983
0
  for (i = 0; i < table_len; i++) {
23984
0
    uint8_t mag_first_byte = ((uint8_t)(table[i].magic[1]));
23985
0
    if (pre_first_byte < mag_first_byte) {
23986
0
      break;
23987
0
    } else if (pre_first_byte > mag_first_byte) {
23988
0
      continue;
23989
0
    }
23990
0
    fourcc = table[i].fourcc;
23991
23992
0
    uint8_t mag_remaining_len = ((uint8_t)(table[i].magic[0]));
23993
0
    if (mag_remaining_len == 0) {
23994
0
      goto match;
23995
0
    }
23996
23997
0
    const char* mag_remaining_ptr = table[i].magic + 2;
23998
0
    uint8_t* pre_remaining_ptr = prefix_data.ptr + 1;
23999
0
    size_t pre_remaining_len = prefix_data.len - 1;
24000
0
    if (pre_remaining_len < mag_remaining_len) {
24001
0
      if (!memcmp(pre_remaining_ptr, mag_remaining_ptr, pre_remaining_len)) {
24002
0
        return prefix_closed ? 0 : -1;
24003
0
      }
24004
0
    } else {
24005
0
      if (!memcmp(pre_remaining_ptr, mag_remaining_ptr, mag_remaining_len)) {
24006
0
        goto match;
24007
0
      }
24008
0
    }
24009
0
  }
24010
24011
0
  if (prefix_data.len < 2) {
24012
0
    return prefix_closed ? 0 : -1;
24013
0
  } else if ((prefix_data.ptr[1] == 0x00) || (prefix_data.ptr[1] == 0x01)) {
24014
0
    return wuffs_base__magic_number_guess_fourcc__maybe_tga(prefix_data,
24015
0
                                                            prefix_closed);
24016
0
  }
24017
24018
0
  return 0;
24019
24020
0
match:
24021
  // Negative FourCC values (see ยง above) are further specialized.
24022
0
  if (fourcc < 0) {
24023
0
    fourcc = -fourcc;
24024
24025
0
    if (fourcc == 0x52494646) {  // 'RIFF'be
24026
0
      if (prefix_data.len < 12) {
24027
0
        return prefix_closed ? 0 : -1;
24028
0
      }
24029
0
      uint32_t x = wuffs_base__peek_u32be__no_bounds_check(prefix_data.ptr + 8);
24030
0
      if (x == 0x57454250) {  // 'WEBP'be
24031
0
        return 0x57454250;    // 'WEBP'be
24032
0
      }
24033
24034
0
    } else if (fourcc == 0x30302020) {  // '00  'be
24035
      // Binary data starting with multiple 0x00 NUL bytes is quite common.
24036
      // Unfortunately, some file formats also don't start with a magic
24037
      // identifier, so we have to use heuristics (where the order matters, the
24038
      // same as /usr/bin/file's magic/Magdir tables) as best we can. Maybe
24039
      // it's TGA, ICO/CUR, etc. Maybe it's something else.
24040
0
      int32_t tga = wuffs_base__magic_number_guess_fourcc__maybe_tga(
24041
0
          prefix_data, prefix_closed);
24042
0
      if (tga != 0) {
24043
0
        return tga;
24044
0
      }
24045
0
      int32_t ico = wuffs_base__magic_number_guess_fourcc__maybe_ico(
24046
0
          prefix_data, prefix_closed);
24047
0
      if (ico != 0) {
24048
0
        return ico;
24049
0
      }
24050
0
      if (prefix_data.len < 4) {
24051
0
        return prefix_closed ? 0 : -1;
24052
0
      } else if ((prefix_data.ptr[2] != 0x00) &&
24053
0
                 ((prefix_data.ptr[2] >= 0x80) ||
24054
0
                  (prefix_data.ptr[3] != 0x00))) {
24055
        // Roughly speaking, this could be a non-degenerate (non-0-width and
24056
        // non-0-height) WBMP image.
24057
0
        return 0x57424D50;  // 'WBMP'be
24058
0
      }
24059
0
      return 0;
24060
0
    }
24061
0
  }
24062
0
  return fourcc;
24063
0
}
24064
24065
#endif  // !defined(WUFFS_CONFIG__MODULES) ||
24066
        // defined(WUFFS_CONFIG__MODULE__BASE) ||
24067
        // defined(WUFFS_CONFIG__MODULE__BASE__MAGIC)
24068
24069
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \
24070
    defined(WUFFS_CONFIG__MODULE__BASE__PIXCONV)
24071
24072
// ---------------- Pixel Swizzler
24073
24074
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
24075
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
24076
static uint64_t  //
24077
wuffs_private_impl__swizzle_bgrw__bgr__x86_sse42(uint8_t* dst_ptr,
24078
                                                 size_t dst_len,
24079
                                                 uint8_t* dst_palette_ptr,
24080
                                                 size_t dst_palette_len,
24081
                                                 const uint8_t* src_ptr,
24082
                                                 size_t src_len);
24083
24084
static uint64_t  //
24085
wuffs_private_impl__swizzle_bgrw__rgb__x86_sse42(uint8_t* dst_ptr,
24086
                                                 size_t dst_len,
24087
                                                 uint8_t* dst_palette_ptr,
24088
                                                 size_t dst_palette_len,
24089
                                                 const uint8_t* src_ptr,
24090
                                                 size_t src_len);
24091
24092
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
24093
static uint64_t  //
24094
wuffs_private_impl__swizzle_swap_rgbx_bgrx__x86_sse42(uint8_t* dst_ptr,
24095
                                                      size_t dst_len,
24096
                                                      uint8_t* dst_palette_ptr,
24097
                                                      size_t dst_palette_len,
24098
                                                      const uint8_t* src_ptr,
24099
                                                      size_t src_len);
24100
24101
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
24102
static uint64_t  //
24103
wuffs_private_impl__swizzle_xxxx__y__x86_sse42(uint8_t* dst_ptr,
24104
                                               size_t dst_len,
24105
                                               uint8_t* dst_palette_ptr,
24106
                                               size_t dst_palette_len,
24107
                                               const uint8_t* src_ptr,
24108
                                               size_t src_len);
24109
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
24110
24111
// --------
24112
24113
static inline uint32_t  //
24114
0
wuffs_private_impl__swap_u32_argb_abgr(uint32_t u) {
24115
0
  uint32_t o = u & 0xFF00FF00ul;
24116
0
  uint32_t r = u & 0x00FF0000ul;
24117
0
  uint32_t b = u & 0x000000FFul;
24118
0
  return o | (r >> 16) | (b << 16);
24119
0
}
24120
24121
static inline uint64_t  //
24122
0
wuffs_private_impl__swap_u64_argb_abgr(uint64_t u) {
24123
0
  uint64_t o = u & 0xFFFF0000FFFF0000ull;
24124
0
  uint64_t r = u & 0x0000FFFF00000000ull;
24125
0
  uint64_t b = u & 0x000000000000FFFFull;
24126
0
  return o | (r >> 32) | (b << 32);
24127
0
}
24128
24129
static inline uint32_t  //
24130
0
wuffs_private_impl__color_u64__as__color_u32__swap_u32_argb_abgr(uint64_t c) {
24131
0
  uint32_t a = ((uint32_t)(0xFF & (c >> 56)));
24132
0
  uint32_t r = ((uint32_t)(0xFF & (c >> 40)));
24133
0
  uint32_t g = ((uint32_t)(0xFF & (c >> 24)));
24134
0
  uint32_t b = ((uint32_t)(0xFF & (c >> 8)));
24135
0
  return (a << 24) | (b << 16) | (g << 8) | (r << 0);
24136
0
}
24137
24138
// --------
24139
24140
WUFFS_BASE__MAYBE_STATIC wuffs_base__color_u32_argb_premul  //
24141
wuffs_base__pixel_buffer__color_u32_at(const wuffs_base__pixel_buffer* pb,
24142
                                       uint32_t x,
24143
0
                                       uint32_t y) {
24144
0
  if (!pb || (x >= pb->pixcfg.private_impl.width) ||
24145
0
      (y >= pb->pixcfg.private_impl.height)) {
24146
0
    return 0;
24147
0
  }
24148
24149
0
  if (wuffs_base__pixel_format__is_planar(&pb->pixcfg.private_impl.pixfmt)) {
24150
    // TODO: support planar formats.
24151
0
    return 0;
24152
0
  }
24153
24154
0
  size_t stride = pb->private_impl.planes[0].stride;
24155
0
  const uint8_t* row = pb->private_impl.planes[0].ptr + (stride * ((size_t)y));
24156
24157
0
  switch (pb->pixcfg.private_impl.pixfmt.repr) {
24158
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
24159
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
24160
0
      return wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x)));
24161
24162
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL:
24163
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY: {
24164
0
      uint8_t* palette = pb->private_impl.planes[3].ptr;
24165
0
      return wuffs_base__peek_u32le__no_bounds_check(palette +
24166
0
                                                     (4 * ((size_t)row[x])));
24167
0
    }
24168
24169
      // Common formats above. Rarer formats below.
24170
24171
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
24172
0
      return 0xFF000000 | (0x00010101 * ((uint32_t)(row[x])));
24173
0
    case WUFFS_BASE__PIXEL_FORMAT__Y_16LE:
24174
0
      return 0xFF000000 | (0x00010101 * ((uint32_t)(row[(2 * x) + 1])));
24175
0
    case WUFFS_BASE__PIXEL_FORMAT__Y_16BE:
24176
0
      return 0xFF000000 | (0x00010101 * ((uint32_t)(row[(2 * x) + 0])));
24177
0
    case WUFFS_BASE__PIXEL_FORMAT__YA_NONPREMUL:
24178
0
      return wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(
24179
0
          (((uint32_t)(row[(2 * x) + 1])) << 24) |
24180
0
          (((uint32_t)(row[(2 * x) + 0])) * 0x00010101));
24181
24182
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: {
24183
0
      uint8_t* palette = pb->private_impl.planes[3].ptr;
24184
0
      return wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(
24185
0
          wuffs_base__peek_u32le__no_bounds_check(palette +
24186
0
                                                  (4 * ((size_t)row[x]))));
24187
0
    }
24188
24189
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
24190
0
      return wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul(
24191
0
          wuffs_base__peek_u16le__no_bounds_check(row + (2 * ((size_t)x))));
24192
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
24193
0
      return 0xFF000000 |
24194
0
             wuffs_base__peek_u24le__no_bounds_check(row + (3 * ((size_t)x)));
24195
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
24196
0
      return wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(
24197
0
          wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x))));
24198
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
24199
0
      return wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul(
24200
0
          wuffs_base__peek_u64le__no_bounds_check(row + (8 * ((size_t)x))));
24201
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE:
24202
0
      return wuffs_base__color_u64__as__color_u32(
24203
0
          wuffs_base__peek_u64le__no_bounds_check(row + (8 * ((size_t)x))));
24204
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRX:
24205
0
      return 0xFF000000 |
24206
0
             wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x)));
24207
24208
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
24209
0
      return 0xFF000000 |
24210
0
             wuffs_base__peek_u24be__no_bounds_check(row + (3 * ((size_t)x)));
24211
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
24212
0
      return wuffs_private_impl__swap_u32_argb_abgr(
24213
0
          wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(
24214
0
              wuffs_base__peek_u32le__no_bounds_check(row +
24215
0
                                                      (4 * ((size_t)x)))));
24216
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
24217
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
24218
0
      return wuffs_private_impl__swap_u32_argb_abgr(
24219
0
          wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x))));
24220
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBX:
24221
0
      return wuffs_private_impl__swap_u32_argb_abgr(
24222
0
          0xFF000000 |
24223
0
          wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x))));
24224
24225
0
    default:
24226
      // TODO: support more formats.
24227
0
      break;
24228
0
  }
24229
24230
0
  return 0;
24231
0
}
24232
24233
// --------
24234
24235
WUFFS_BASE__MAYBE_STATIC wuffs_base__status  //
24236
wuffs_base__pixel_buffer__set_color_u32_at(
24237
    wuffs_base__pixel_buffer* pb,
24238
    uint32_t x,
24239
    uint32_t y,
24240
910M
    wuffs_base__color_u32_argb_premul color) {
24241
910M
  if (!pb) {
24242
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
24243
0
  }
24244
910M
  if ((x >= pb->pixcfg.private_impl.width) ||
24245
910M
      (y >= pb->pixcfg.private_impl.height)) {
24246
0
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
24247
0
  }
24248
24249
910M
  if (wuffs_base__pixel_format__is_planar(&pb->pixcfg.private_impl.pixfmt)) {
24250
    // TODO: support planar formats.
24251
0
    return wuffs_base__make_status(wuffs_base__error__unsupported_option);
24252
0
  }
24253
24254
910M
  size_t stride = pb->private_impl.planes[0].stride;
24255
910M
  uint8_t* row = pb->private_impl.planes[0].ptr + (stride * ((size_t)y));
24256
24257
910M
  switch (pb->pixcfg.private_impl.pixfmt.repr) {
24258
502M
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
24259
910M
    case WUFFS_BASE__PIXEL_FORMAT__BGRX:
24260
910M
      wuffs_base__poke_u32le__no_bounds_check(row + (4 * ((size_t)x)), color);
24261
910M
      break;
24262
24263
      // Common formats above. Rarer formats below.
24264
24265
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
24266
0
      wuffs_base__poke_u8__no_bounds_check(
24267
0
          row + ((size_t)x),
24268
0
          wuffs_base__color_u32_argb_premul__as__color_u8_gray(color));
24269
0
      break;
24270
0
    case WUFFS_BASE__PIXEL_FORMAT__Y_16LE:
24271
0
      wuffs_base__poke_u16le__no_bounds_check(
24272
0
          row + (2 * ((size_t)x)),
24273
0
          wuffs_base__color_u32_argb_premul__as__color_u16_gray(color));
24274
0
      break;
24275
0
    case WUFFS_BASE__PIXEL_FORMAT__Y_16BE:
24276
0
      wuffs_base__poke_u16be__no_bounds_check(
24277
0
          row + (2 * ((size_t)x)),
24278
0
          wuffs_base__color_u32_argb_premul__as__color_u16_gray(color));
24279
0
      break;
24280
0
    case WUFFS_BASE__PIXEL_FORMAT__YA_NONPREMUL:
24281
0
      wuffs_base__poke_u16le__no_bounds_check(
24282
0
          row + (2 * ((size_t)x)),
24283
0
          wuffs_base__color_u32_argb_premul__as__color_u16_alpha_gray_nonpremul(
24284
0
              color));
24285
0
      break;
24286
24287
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL:
24288
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL:
24289
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY:
24290
0
      wuffs_base__poke_u8__no_bounds_check(
24291
0
          row + ((size_t)x), wuffs_base__pixel_palette__closest_element(
24292
0
                                 wuffs_base__pixel_buffer__palette(pb),
24293
0
                                 pb->pixcfg.private_impl.pixfmt, color));
24294
0
      break;
24295
24296
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
24297
0
      wuffs_base__poke_u16le__no_bounds_check(
24298
0
          row + (2 * ((size_t)x)),
24299
0
          wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(color));
24300
0
      break;
24301
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
24302
0
      wuffs_base__poke_u24le__no_bounds_check(row + (3 * ((size_t)x)), color);
24303
0
      break;
24304
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
24305
0
      wuffs_base__poke_u32le__no_bounds_check(
24306
0
          row + (4 * ((size_t)x)),
24307
0
          wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul(
24308
0
              color));
24309
0
      break;
24310
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
24311
0
      wuffs_base__poke_u64le__no_bounds_check(
24312
0
          row + (8 * ((size_t)x)),
24313
0
          wuffs_base__color_u32_argb_premul__as__color_u64_argb_nonpremul(
24314
0
              color));
24315
0
      break;
24316
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE:
24317
0
      wuffs_base__poke_u64le__no_bounds_check(
24318
0
          row + (8 * ((size_t)x)), wuffs_base__color_u32__as__color_u64(color));
24319
0
      break;
24320
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
24321
0
      wuffs_base__poke_u32le__no_bounds_check(
24322
0
          row + (4 * ((size_t)x)), (color >> 31) ? (color | 0xFF000000) : 0);
24323
0
      break;
24324
24325
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
24326
0
      wuffs_base__poke_u24le__no_bounds_check(
24327
0
          row + (3 * ((size_t)x)),
24328
0
          wuffs_private_impl__swap_u32_argb_abgr(color));
24329
0
      break;
24330
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
24331
0
      wuffs_base__poke_u32le__no_bounds_check(
24332
0
          row + (4 * ((size_t)x)),
24333
0
          wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul(
24334
0
              wuffs_private_impl__swap_u32_argb_abgr(color)));
24335
0
      break;
24336
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
24337
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBX:
24338
0
      wuffs_base__poke_u32le__no_bounds_check(
24339
0
          row + (4 * ((size_t)x)),
24340
0
          wuffs_private_impl__swap_u32_argb_abgr(color));
24341
0
      break;
24342
24343
0
    default:
24344
      // TODO: support more formats.
24345
0
      return wuffs_base__make_status(wuffs_base__error__unsupported_option);
24346
910M
  }
24347
24348
910M
  return wuffs_base__make_status(NULL);
24349
910M
}
24350
24351
// --------
24352
24353
static inline void  //
24354
wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xx(
24355
    wuffs_base__pixel_buffer* pb,
24356
    wuffs_base__rect_ie_u32 rect,
24357
0
    uint16_t color) {
24358
0
  size_t stride = pb->private_impl.planes[0].stride;
24359
0
  uint32_t width = wuffs_base__rect_ie_u32__width(&rect);
24360
0
  if ((stride == (2 * ((uint64_t)width))) && (rect.min_incl_x == 0)) {
24361
0
    uint8_t* ptr =
24362
0
        pb->private_impl.planes[0].ptr + (stride * ((size_t)rect.min_incl_y));
24363
0
    uint32_t height = wuffs_base__rect_ie_u32__height(&rect);
24364
0
    size_t n;
24365
0
    for (n = ((size_t)width) * ((size_t)height); n > 0; n--) {
24366
0
      wuffs_base__poke_u16le__no_bounds_check(ptr, color);
24367
0
      ptr += 2;
24368
0
    }
24369
0
    return;
24370
0
  }
24371
24372
0
  uint32_t y;
24373
0
  for (y = rect.min_incl_y; y < rect.max_excl_y; y++) {
24374
0
    uint8_t* ptr = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)) +
24375
0
                   (2 * ((size_t)rect.min_incl_x));
24376
0
    uint32_t n;
24377
0
    for (n = width; n > 0; n--) {
24378
0
      wuffs_base__poke_u16le__no_bounds_check(ptr, color);
24379
0
      ptr += 2;
24380
0
    }
24381
0
  }
24382
0
}
24383
24384
static inline void  //
24385
wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxx(
24386
    wuffs_base__pixel_buffer* pb,
24387
    wuffs_base__rect_ie_u32 rect,
24388
0
    uint32_t color) {
24389
0
  size_t stride = pb->private_impl.planes[0].stride;
24390
0
  uint32_t width = wuffs_base__rect_ie_u32__width(&rect);
24391
0
  if ((stride == (3 * ((uint64_t)width))) && (rect.min_incl_x == 0)) {
24392
0
    uint8_t* ptr =
24393
0
        pb->private_impl.planes[0].ptr + (stride * ((size_t)rect.min_incl_y));
24394
0
    uint32_t height = wuffs_base__rect_ie_u32__height(&rect);
24395
0
    size_t n;
24396
0
    for (n = ((size_t)width) * ((size_t)height); n > 0; n--) {
24397
0
      wuffs_base__poke_u24le__no_bounds_check(ptr, color);
24398
0
      ptr += 3;
24399
0
    }
24400
0
    return;
24401
0
  }
24402
24403
0
  uint32_t y;
24404
0
  for (y = rect.min_incl_y; y < rect.max_excl_y; y++) {
24405
0
    uint8_t* ptr = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)) +
24406
0
                   (3 * ((size_t)rect.min_incl_x));
24407
0
    uint32_t n;
24408
0
    for (n = width; n > 0; n--) {
24409
0
      wuffs_base__poke_u24le__no_bounds_check(ptr, color);
24410
0
      ptr += 3;
24411
0
    }
24412
0
  }
24413
0
}
24414
24415
static inline void  //
24416
wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxxx(
24417
    wuffs_base__pixel_buffer* pb,
24418
    wuffs_base__rect_ie_u32 rect,
24419
0
    uint32_t color) {
24420
0
  size_t stride = pb->private_impl.planes[0].stride;
24421
0
  uint32_t width = wuffs_base__rect_ie_u32__width(&rect);
24422
0
  if ((stride == (4 * ((uint64_t)width))) && (rect.min_incl_x == 0)) {
24423
0
    uint8_t* ptr =
24424
0
        pb->private_impl.planes[0].ptr + (stride * ((size_t)rect.min_incl_y));
24425
0
    uint32_t height = wuffs_base__rect_ie_u32__height(&rect);
24426
0
    size_t n;
24427
0
    for (n = ((size_t)width) * ((size_t)height); n > 0; n--) {
24428
0
      wuffs_base__poke_u32le__no_bounds_check(ptr, color);
24429
0
      ptr += 4;
24430
0
    }
24431
0
    return;
24432
0
  }
24433
24434
0
  uint32_t y;
24435
0
  for (y = rect.min_incl_y; y < rect.max_excl_y; y++) {
24436
0
    uint8_t* ptr = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)) +
24437
0
                   (4 * ((size_t)rect.min_incl_x));
24438
0
    uint32_t n;
24439
0
    for (n = width; n > 0; n--) {
24440
0
      wuffs_base__poke_u32le__no_bounds_check(ptr, color);
24441
0
      ptr += 4;
24442
0
    }
24443
0
  }
24444
0
}
24445
24446
static inline void  //
24447
wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxxxxxxx(
24448
    wuffs_base__pixel_buffer* pb,
24449
    wuffs_base__rect_ie_u32 rect,
24450
0
    uint64_t color) {
24451
0
  size_t stride = pb->private_impl.planes[0].stride;
24452
0
  uint32_t width = wuffs_base__rect_ie_u32__width(&rect);
24453
0
  if ((stride == (8 * ((uint64_t)width))) && (rect.min_incl_x == 0)) {
24454
0
    uint8_t* ptr =
24455
0
        pb->private_impl.planes[0].ptr + (stride * ((size_t)rect.min_incl_y));
24456
0
    uint32_t height = wuffs_base__rect_ie_u32__height(&rect);
24457
0
    size_t n;
24458
0
    for (n = ((size_t)width) * ((size_t)height); n > 0; n--) {
24459
0
      wuffs_base__poke_u64le__no_bounds_check(ptr, color);
24460
0
      ptr += 8;
24461
0
    }
24462
0
    return;
24463
0
  }
24464
24465
0
  uint32_t y;
24466
0
  for (y = rect.min_incl_y; y < rect.max_excl_y; y++) {
24467
0
    uint8_t* ptr = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)) +
24468
0
                   (8 * ((size_t)rect.min_incl_x));
24469
0
    uint32_t n;
24470
0
    for (n = width; n > 0; n--) {
24471
0
      wuffs_base__poke_u64le__no_bounds_check(ptr, color);
24472
0
      ptr += 8;
24473
0
    }
24474
0
  }
24475
0
}
24476
24477
WUFFS_BASE__MAYBE_STATIC wuffs_base__status  //
24478
wuffs_base__pixel_buffer__set_color_u32_fill_rect(
24479
    wuffs_base__pixel_buffer* pb,
24480
    wuffs_base__rect_ie_u32 rect,
24481
0
    wuffs_base__color_u32_argb_premul color) {
24482
0
  if (!pb) {
24483
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
24484
0
  } else if (wuffs_base__rect_ie_u32__is_empty(&rect)) {
24485
0
    return wuffs_base__make_status(NULL);
24486
0
  }
24487
0
  wuffs_base__rect_ie_u32 bounds =
24488
0
      wuffs_base__pixel_config__bounds(&pb->pixcfg);
24489
0
  if (!wuffs_base__rect_ie_u32__contains_rect(&bounds, rect)) {
24490
0
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
24491
0
  }
24492
24493
0
  if (wuffs_base__pixel_format__is_planar(&pb->pixcfg.private_impl.pixfmt)) {
24494
    // TODO: support planar formats.
24495
0
    return wuffs_base__make_status(wuffs_base__error__unsupported_option);
24496
0
  }
24497
24498
0
  switch (pb->pixcfg.private_impl.pixfmt.repr) {
24499
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
24500
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRX:
24501
0
      wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxxx(pb, rect,
24502
0
                                                                      color);
24503
0
      return wuffs_base__make_status(NULL);
24504
24505
      // Common formats above. Rarer formats below.
24506
24507
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
24508
0
      wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xx(
24509
0
          pb, rect,
24510
0
          wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(color));
24511
0
      return wuffs_base__make_status(NULL);
24512
24513
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
24514
0
      wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxx(pb, rect,
24515
0
                                                                     color);
24516
0
      return wuffs_base__make_status(NULL);
24517
24518
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
24519
0
      wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxxx(
24520
0
          pb, rect,
24521
0
          wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul(
24522
0
              color));
24523
0
      return wuffs_base__make_status(NULL);
24524
24525
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
24526
0
      wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxxxxxxx(
24527
0
          pb, rect,
24528
0
          wuffs_base__color_u32_argb_premul__as__color_u64_argb_nonpremul(
24529
0
              color));
24530
0
      return wuffs_base__make_status(NULL);
24531
24532
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
24533
0
      wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxxx(
24534
0
          pb, rect,
24535
0
          wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul(
24536
0
              wuffs_private_impl__swap_u32_argb_abgr(color)));
24537
0
      return wuffs_base__make_status(NULL);
24538
24539
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
24540
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBX:
24541
0
      wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxxx(
24542
0
          pb, rect, wuffs_private_impl__swap_u32_argb_abgr(color));
24543
0
      return wuffs_base__make_status(NULL);
24544
0
  }
24545
24546
0
  uint32_t y;
24547
0
  for (y = rect.min_incl_y; y < rect.max_excl_y; y++) {
24548
0
    uint32_t x;
24549
0
    for (x = rect.min_incl_x; x < rect.max_excl_x; x++) {
24550
0
      wuffs_base__pixel_buffer__set_color_u32_at(pb, x, y, color);
24551
0
    }
24552
0
  }
24553
0
  return wuffs_base__make_status(NULL);
24554
0
}
24555
24556
WUFFS_BASE__MAYBE_STATIC bool  //
24557
0
wuffs_base__pixel_buffer__is_opaque(const wuffs_base__pixel_buffer* pb) {
24558
0
  if (!pb) {
24559
0
    return false;
24560
0
  } else if (wuffs_base__pixel_format__transparency(
24561
0
                 &pb->pixcfg.private_impl.pixfmt) ==
24562
0
             WUFFS_BASE__PIXEL_ALPHA_TRANSPARENCY__OPAQUE) {
24563
0
    return true;
24564
0
  }
24565
24566
0
  uint32_t w = pb->pixcfg.private_impl.width;
24567
0
  uint32_t h = pb->pixcfg.private_impl.height;
24568
0
  if ((w <= 0) || (h <= 0)) {
24569
0
    return true;
24570
0
  }
24571
0
  const wuffs_base__table_u8* p = &pb->private_impl.planes[0];
24572
24573
0
  switch (pb->pixcfg.private_impl.pixfmt.repr) {
24574
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
24575
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
24576
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
24577
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
24578
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
24579
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: {
24580
0
      for (uint32_t y = 0; y < h; y++) {
24581
0
        const uint8_t* row = p->ptr + (p->stride * (size_t)y);
24582
0
        for (uint32_t x = 0; x < w; x++) {
24583
0
          if (row[(4 * (size_t)x) + 3] != 0xFF) {
24584
0
            return false;
24585
0
          }
24586
0
        }
24587
0
      }
24588
0
      return true;
24589
0
    }
24590
24591
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: {
24592
0
      for (uint32_t y = 0; y < h; y++) {
24593
0
        const uint8_t* row = p->ptr + (p->stride * (size_t)y);
24594
0
        for (uint32_t x = 0; x < w; x++) {
24595
0
          if ((row[(8 * (size_t)x) + 6] != 0xFF) ||
24596
0
              (row[(8 * (size_t)x) + 7] != 0xFF)) {
24597
0
            return false;
24598
0
          }
24599
0
        }
24600
0
      }
24601
0
      return true;
24602
0
    }
24603
24604
0
    case WUFFS_BASE__PIXEL_FORMAT__YA_NONPREMUL: {
24605
0
      for (uint32_t y = 0; y < h; y++) {
24606
0
        const uint8_t* row = p->ptr + (p->stride * (size_t)y);
24607
0
        for (uint32_t x = 0; x < w; x++) {
24608
0
          if (row[(2 * (size_t)x) + 1] != 0xFF) {
24609
0
            return false;
24610
0
          }
24611
0
        }
24612
0
      }
24613
0
      return true;
24614
0
    }
24615
24616
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL:
24617
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY:
24618
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: {
24619
0
      const uint8_t* palette = pb->private_impl.planes[3].ptr;
24620
0
      for (uint32_t i = 0; true; i++) {
24621
0
        if (i >= 256) {
24622
0
          return true;
24623
0
        } else if (palette[(4 * (size_t)i) + 3] != 0xFF) {
24624
0
          break;
24625
0
        }
24626
0
      }
24627
24628
0
      for (uint32_t y = 0; y < h; y++) {
24629
0
        const uint8_t* row = p->ptr + (p->stride * (size_t)y);
24630
0
        for (uint32_t x = 0; x < w; x++) {
24631
0
          if (palette[(4 * (size_t)row[x]) + 3] != 0xFF) {
24632
0
            return false;
24633
0
          }
24634
0
        }
24635
0
      }
24636
24637
0
      return true;
24638
0
    }
24639
24640
0
    default:
24641
0
      break;
24642
0
  }
24643
0
  return false;
24644
0
}
24645
24646
// --------
24647
24648
WUFFS_BASE__MAYBE_STATIC uint8_t  //
24649
wuffs_base__pixel_palette__closest_element(
24650
    wuffs_base__slice_u8 palette_slice,
24651
    wuffs_base__pixel_format palette_format,
24652
0
    wuffs_base__color_u32_argb_premul c) {
24653
0
  size_t n = palette_slice.len / 4;
24654
0
  if (n > (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) {
24655
0
    n = (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4);
24656
0
  }
24657
0
  size_t best_index = 0;
24658
0
  uint64_t best_score = 0xFFFFFFFFFFFFFFFF;
24659
24660
  // Work in 16-bit color.
24661
0
  uint32_t ca = 0x101 * (0xFF & (c >> 24));
24662
0
  uint32_t cr = 0x101 * (0xFF & (c >> 16));
24663
0
  uint32_t cg = 0x101 * (0xFF & (c >> 8));
24664
0
  uint32_t cb = 0x101 * (0xFF & (c >> 0));
24665
24666
0
  switch (palette_format.repr) {
24667
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL:
24668
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL:
24669
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY: {
24670
0
      bool nonpremul = palette_format.repr ==
24671
0
                       WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL;
24672
24673
0
      size_t i;
24674
0
      for (i = 0; i < n; i++) {
24675
        // Work in 16-bit color.
24676
0
        uint32_t pb = 0x101 * ((uint32_t)(palette_slice.ptr[(4 * i) + 0]));
24677
0
        uint32_t pg = 0x101 * ((uint32_t)(palette_slice.ptr[(4 * i) + 1]));
24678
0
        uint32_t pr = 0x101 * ((uint32_t)(palette_slice.ptr[(4 * i) + 2]));
24679
0
        uint32_t pa = 0x101 * ((uint32_t)(palette_slice.ptr[(4 * i) + 3]));
24680
24681
        // Convert to premultiplied alpha.
24682
0
        if (nonpremul && (pa != 0xFFFF)) {
24683
0
          pb = (pb * pa) / 0xFFFF;
24684
0
          pg = (pg * pa) / 0xFFFF;
24685
0
          pr = (pr * pa) / 0xFFFF;
24686
0
        }
24687
24688
        // These deltas are conceptually int32_t (signed) but after squaring,
24689
        // it's equivalent to work in uint32_t (unsigned).
24690
0
        pb -= cb;
24691
0
        pg -= cg;
24692
0
        pr -= cr;
24693
0
        pa -= ca;
24694
0
        uint64_t score = ((uint64_t)(pb * pb)) + ((uint64_t)(pg * pg)) +
24695
0
                         ((uint64_t)(pr * pr)) + ((uint64_t)(pa * pa));
24696
0
        if (best_score > score) {
24697
0
          best_score = score;
24698
0
          best_index = i;
24699
0
        }
24700
0
      }
24701
0
      break;
24702
0
    }
24703
0
  }
24704
24705
0
  return (uint8_t)best_index;
24706
0
}
24707
24708
// --------
24709
24710
static inline uint32_t  //
24711
wuffs_private_impl__composite_nonpremul_nonpremul_u32_axxx(
24712
    uint32_t dst_nonpremul,
24713
0
    uint32_t src_nonpremul) {
24714
  // Extract 16-bit color components.
24715
  //
24716
  // If the destination is transparent then SRC_OVER is equivalent to SRC: just
24717
  // return src_nonpremul. This isn't just an optimization (skipping the rest
24718
  // of the function's computation). It also preserves the nonpremul
24719
  // distinction between e.g. transparent red and transparent blue that would
24720
  // otherwise be lost by converting from nonpremul to premul and back.
24721
0
  uint32_t da = 0x101 * (0xFF & (dst_nonpremul >> 24));
24722
0
  if (da == 0) {
24723
0
    return src_nonpremul;
24724
0
  }
24725
0
  uint32_t dr = 0x101 * (0xFF & (dst_nonpremul >> 16));
24726
0
  uint32_t dg = 0x101 * (0xFF & (dst_nonpremul >> 8));
24727
0
  uint32_t db = 0x101 * (0xFF & (dst_nonpremul >> 0));
24728
0
  uint32_t sa = 0x101 * (0xFF & (src_nonpremul >> 24));
24729
0
  uint32_t sr = 0x101 * (0xFF & (src_nonpremul >> 16));
24730
0
  uint32_t sg = 0x101 * (0xFF & (src_nonpremul >> 8));
24731
0
  uint32_t sb = 0x101 * (0xFF & (src_nonpremul >> 0));
24732
24733
  // Convert dst from nonpremul to premul.
24734
0
  dr = (dr * da) / 0xFFFF;
24735
0
  dg = (dg * da) / 0xFFFF;
24736
0
  db = (db * da) / 0xFFFF;
24737
24738
  // Calculate the inverse of the src-alpha: how much of the dst to keep.
24739
0
  uint32_t ia = 0xFFFF - sa;
24740
24741
  // Composite src (nonpremul) over dst (premul).
24742
0
  da = sa + ((da * ia) / 0xFFFF);
24743
0
  dr = ((sr * sa) + (dr * ia)) / 0xFFFF;
24744
0
  dg = ((sg * sa) + (dg * ia)) / 0xFFFF;
24745
0
  db = ((sb * sa) + (db * ia)) / 0xFFFF;
24746
24747
  // Convert dst from premul to nonpremul.
24748
0
  if (da != 0) {
24749
0
    dr = (dr * 0xFFFF) / da;
24750
0
    dg = (dg * 0xFFFF) / da;
24751
0
    db = (db * 0xFFFF) / da;
24752
0
  }
24753
24754
  // Convert from 16-bit color to 8-bit color.
24755
0
  da >>= 8;
24756
0
  dr >>= 8;
24757
0
  dg >>= 8;
24758
0
  db >>= 8;
24759
24760
  // Combine components.
24761
0
  return (db << 0) | (dg << 8) | (dr << 16) | (da << 24);
24762
0
}
24763
24764
static inline uint64_t  //
24765
wuffs_private_impl__composite_nonpremul_nonpremul_u64_axxx(
24766
    uint64_t dst_nonpremul,
24767
0
    uint64_t src_nonpremul) {
24768
  // Extract components.
24769
  //
24770
  // If the destination is transparent then SRC_OVER is equivalent to SRC: just
24771
  // return src_nonpremul. This isn't just an optimization (skipping the rest
24772
  // of the function's computation). It also preserves the nonpremul
24773
  // distinction between e.g. transparent red and transparent blue that would
24774
  // otherwise be lost by converting from nonpremul to premul and back.
24775
0
  uint64_t da = 0xFFFF & (dst_nonpremul >> 48);
24776
0
  if (da == 0) {
24777
0
    return src_nonpremul;
24778
0
  }
24779
0
  uint64_t dr = 0xFFFF & (dst_nonpremul >> 32);
24780
0
  uint64_t dg = 0xFFFF & (dst_nonpremul >> 16);
24781
0
  uint64_t db = 0xFFFF & (dst_nonpremul >> 0);
24782
0
  uint64_t sa = 0xFFFF & (src_nonpremul >> 48);
24783
0
  uint64_t sr = 0xFFFF & (src_nonpremul >> 32);
24784
0
  uint64_t sg = 0xFFFF & (src_nonpremul >> 16);
24785
0
  uint64_t sb = 0xFFFF & (src_nonpremul >> 0);
24786
24787
  // Convert dst from nonpremul to premul.
24788
0
  dr = (dr * da) / 0xFFFF;
24789
0
  dg = (dg * da) / 0xFFFF;
24790
0
  db = (db * da) / 0xFFFF;
24791
24792
  // Calculate the inverse of the src-alpha: how much of the dst to keep.
24793
0
  uint64_t ia = 0xFFFF - sa;
24794
24795
  // Composite src (nonpremul) over dst (premul).
24796
0
  da = sa + ((da * ia) / 0xFFFF);
24797
0
  dr = ((sr * sa) + (dr * ia)) / 0xFFFF;
24798
0
  dg = ((sg * sa) + (dg * ia)) / 0xFFFF;
24799
0
  db = ((sb * sa) + (db * ia)) / 0xFFFF;
24800
24801
  // Convert dst from premul to nonpremul.
24802
0
  if (da != 0) {
24803
0
    dr = (dr * 0xFFFF) / da;
24804
0
    dg = (dg * 0xFFFF) / da;
24805
0
    db = (db * 0xFFFF) / da;
24806
0
  }
24807
24808
  // Combine components.
24809
0
  return (db << 0) | (dg << 16) | (dr << 32) | (da << 48);
24810
0
}
24811
24812
static inline uint32_t  //
24813
wuffs_private_impl__composite_nonpremul_premul_u32_axxx(uint32_t dst_nonpremul,
24814
0
                                                        uint32_t src_premul) {
24815
  // Extract 16-bit color components.
24816
0
  uint32_t da = 0x101 * (0xFF & (dst_nonpremul >> 24));
24817
0
  uint32_t dr = 0x101 * (0xFF & (dst_nonpremul >> 16));
24818
0
  uint32_t dg = 0x101 * (0xFF & (dst_nonpremul >> 8));
24819
0
  uint32_t db = 0x101 * (0xFF & (dst_nonpremul >> 0));
24820
0
  uint32_t sa = 0x101 * (0xFF & (src_premul >> 24));
24821
0
  uint32_t sr = 0x101 * (0xFF & (src_premul >> 16));
24822
0
  uint32_t sg = 0x101 * (0xFF & (src_premul >> 8));
24823
0
  uint32_t sb = 0x101 * (0xFF & (src_premul >> 0));
24824
24825
  // Convert dst from nonpremul to premul.
24826
0
  dr = (dr * da) / 0xFFFF;
24827
0
  dg = (dg * da) / 0xFFFF;
24828
0
  db = (db * da) / 0xFFFF;
24829
24830
  // Calculate the inverse of the src-alpha: how much of the dst to keep.
24831
0
  uint32_t ia = 0xFFFF - sa;
24832
24833
  // Composite src (premul) over dst (premul).
24834
0
  da = sa + ((da * ia) / 0xFFFF);
24835
0
  dr = sr + ((dr * ia) / 0xFFFF);
24836
0
  dg = sg + ((dg * ia) / 0xFFFF);
24837
0
  db = sb + ((db * ia) / 0xFFFF);
24838
24839
  // Convert dst from premul to nonpremul.
24840
0
  if (da != 0) {
24841
0
    dr = (dr * 0xFFFF) / da;
24842
0
    dg = (dg * 0xFFFF) / da;
24843
0
    db = (db * 0xFFFF) / da;
24844
0
  }
24845
24846
  // Convert from 16-bit color to 8-bit color.
24847
0
  da >>= 8;
24848
0
  dr >>= 8;
24849
0
  dg >>= 8;
24850
0
  db >>= 8;
24851
24852
  // Combine components.
24853
0
  return (db << 0) | (dg << 8) | (dr << 16) | (da << 24);
24854
0
}
24855
24856
static inline uint64_t  //
24857
wuffs_private_impl__composite_nonpremul_premul_u64_axxx(uint64_t dst_nonpremul,
24858
0
                                                        uint64_t src_premul) {
24859
  // Extract components.
24860
0
  uint64_t da = 0xFFFF & (dst_nonpremul >> 48);
24861
0
  uint64_t dr = 0xFFFF & (dst_nonpremul >> 32);
24862
0
  uint64_t dg = 0xFFFF & (dst_nonpremul >> 16);
24863
0
  uint64_t db = 0xFFFF & (dst_nonpremul >> 0);
24864
0
  uint64_t sa = 0xFFFF & (src_premul >> 48);
24865
0
  uint64_t sr = 0xFFFF & (src_premul >> 32);
24866
0
  uint64_t sg = 0xFFFF & (src_premul >> 16);
24867
0
  uint64_t sb = 0xFFFF & (src_premul >> 0);
24868
24869
  // Convert dst from nonpremul to premul.
24870
0
  dr = (dr * da) / 0xFFFF;
24871
0
  dg = (dg * da) / 0xFFFF;
24872
0
  db = (db * da) / 0xFFFF;
24873
24874
  // Calculate the inverse of the src-alpha: how much of the dst to keep.
24875
0
  uint64_t ia = 0xFFFF - sa;
24876
24877
  // Composite src (premul) over dst (premul).
24878
0
  da = sa + ((da * ia) / 0xFFFF);
24879
0
  dr = sr + ((dr * ia) / 0xFFFF);
24880
0
  dg = sg + ((dg * ia) / 0xFFFF);
24881
0
  db = sb + ((db * ia) / 0xFFFF);
24882
24883
  // Convert dst from premul to nonpremul.
24884
0
  if (da != 0) {
24885
0
    dr = (dr * 0xFFFF) / da;
24886
0
    dg = (dg * 0xFFFF) / da;
24887
0
    db = (db * 0xFFFF) / da;
24888
0
  }
24889
24890
  // Combine components.
24891
0
  return (db << 0) | (dg << 16) | (dr << 32) | (da << 48);
24892
0
}
24893
24894
static inline uint32_t  //
24895
wuffs_private_impl__composite_premul_nonpremul_u32_axxx(
24896
    uint32_t dst_premul,
24897
0
    uint32_t src_nonpremul) {
24898
  // Extract 16-bit color components.
24899
0
  uint32_t da = 0x101 * (0xFF & (dst_premul >> 24));
24900
0
  uint32_t dr = 0x101 * (0xFF & (dst_premul >> 16));
24901
0
  uint32_t dg = 0x101 * (0xFF & (dst_premul >> 8));
24902
0
  uint32_t db = 0x101 * (0xFF & (dst_premul >> 0));
24903
0
  uint32_t sa = 0x101 * (0xFF & (src_nonpremul >> 24));
24904
0
  uint32_t sr = 0x101 * (0xFF & (src_nonpremul >> 16));
24905
0
  uint32_t sg = 0x101 * (0xFF & (src_nonpremul >> 8));
24906
0
  uint32_t sb = 0x101 * (0xFF & (src_nonpremul >> 0));
24907
24908
  // Calculate the inverse of the src-alpha: how much of the dst to keep.
24909
0
  uint32_t ia = 0xFFFF - sa;
24910
24911
  // Composite src (nonpremul) over dst (premul).
24912
0
  da = sa + ((da * ia) / 0xFFFF);
24913
0
  dr = ((sr * sa) + (dr * ia)) / 0xFFFF;
24914
0
  dg = ((sg * sa) + (dg * ia)) / 0xFFFF;
24915
0
  db = ((sb * sa) + (db * ia)) / 0xFFFF;
24916
24917
  // Convert from 16-bit color to 8-bit color.
24918
0
  da >>= 8;
24919
0
  dr >>= 8;
24920
0
  dg >>= 8;
24921
0
  db >>= 8;
24922
24923
  // Combine components.
24924
0
  return (db << 0) | (dg << 8) | (dr << 16) | (da << 24);
24925
0
}
24926
24927
static inline uint64_t  //
24928
wuffs_private_impl__composite_premul_nonpremul_u64_axxx(
24929
    uint64_t dst_premul,
24930
0
    uint64_t src_nonpremul) {
24931
  // Extract components.
24932
0
  uint64_t da = 0xFFFF & (dst_premul >> 48);
24933
0
  uint64_t dr = 0xFFFF & (dst_premul >> 32);
24934
0
  uint64_t dg = 0xFFFF & (dst_premul >> 16);
24935
0
  uint64_t db = 0xFFFF & (dst_premul >> 0);
24936
0
  uint64_t sa = 0xFFFF & (src_nonpremul >> 48);
24937
0
  uint64_t sr = 0xFFFF & (src_nonpremul >> 32);
24938
0
  uint64_t sg = 0xFFFF & (src_nonpremul >> 16);
24939
0
  uint64_t sb = 0xFFFF & (src_nonpremul >> 0);
24940
24941
  // Calculate the inverse of the src-alpha: how much of the dst to keep.
24942
0
  uint64_t ia = 0xFFFF - sa;
24943
24944
  // Composite src (nonpremul) over dst (premul).
24945
0
  da = sa + ((da * ia) / 0xFFFF);
24946
0
  dr = ((sr * sa) + (dr * ia)) / 0xFFFF;
24947
0
  dg = ((sg * sa) + (dg * ia)) / 0xFFFF;
24948
0
  db = ((sb * sa) + (db * ia)) / 0xFFFF;
24949
24950
  // Combine components.
24951
0
  return (db << 0) | (dg << 16) | (dr << 32) | (da << 48);
24952
0
}
24953
24954
static inline uint32_t  //
24955
wuffs_private_impl__composite_premul_premul_u32_axxx(uint32_t dst_premul,
24956
0
                                                     uint32_t src_premul) {
24957
  // Extract 16-bit color components.
24958
0
  uint32_t da = 0x101 * (0xFF & (dst_premul >> 24));
24959
0
  uint32_t dr = 0x101 * (0xFF & (dst_premul >> 16));
24960
0
  uint32_t dg = 0x101 * (0xFF & (dst_premul >> 8));
24961
0
  uint32_t db = 0x101 * (0xFF & (dst_premul >> 0));
24962
0
  uint32_t sa = 0x101 * (0xFF & (src_premul >> 24));
24963
0
  uint32_t sr = 0x101 * (0xFF & (src_premul >> 16));
24964
0
  uint32_t sg = 0x101 * (0xFF & (src_premul >> 8));
24965
0
  uint32_t sb = 0x101 * (0xFF & (src_premul >> 0));
24966
24967
  // Calculate the inverse of the src-alpha: how much of the dst to keep.
24968
0
  uint32_t ia = 0xFFFF - sa;
24969
24970
  // Composite src (premul) over dst (premul).
24971
0
  da = sa + ((da * ia) / 0xFFFF);
24972
0
  dr = sr + ((dr * ia) / 0xFFFF);
24973
0
  dg = sg + ((dg * ia) / 0xFFFF);
24974
0
  db = sb + ((db * ia) / 0xFFFF);
24975
24976
  // Convert from 16-bit color to 8-bit color.
24977
0
  da >>= 8;
24978
0
  dr >>= 8;
24979
0
  dg >>= 8;
24980
0
  db >>= 8;
24981
24982
  // Combine components.
24983
0
  return (db << 0) | (dg << 8) | (dr << 16) | (da << 24);
24984
0
}
24985
24986
static inline uint64_t  //
24987
wuffs_private_impl__composite_premul_premul_u64_axxx(uint64_t dst_premul,
24988
0
                                                     uint64_t src_premul) {
24989
  // Extract components.
24990
0
  uint64_t da = 0xFFFF & (dst_premul >> 48);
24991
0
  uint64_t dr = 0xFFFF & (dst_premul >> 32);
24992
0
  uint64_t dg = 0xFFFF & (dst_premul >> 16);
24993
0
  uint64_t db = 0xFFFF & (dst_premul >> 0);
24994
0
  uint64_t sa = 0xFFFF & (src_premul >> 48);
24995
0
  uint64_t sr = 0xFFFF & (src_premul >> 32);
24996
0
  uint64_t sg = 0xFFFF & (src_premul >> 16);
24997
0
  uint64_t sb = 0xFFFF & (src_premul >> 0);
24998
24999
  // Calculate the inverse of the src-alpha: how much of the dst to keep.
25000
0
  uint64_t ia = 0xFFFF - sa;
25001
25002
  // Composite src (premul) over dst (premul).
25003
0
  da = sa + ((da * ia) / 0xFFFF);
25004
0
  dr = sr + ((dr * ia) / 0xFFFF);
25005
0
  dg = sg + ((dg * ia) / 0xFFFF);
25006
0
  db = sb + ((db * ia) / 0xFFFF);
25007
25008
  // Combine components.
25009
0
  return (db << 0) | (dg << 16) | (dr << 32) | (da << 48);
25010
0
}
25011
25012
// --------
25013
25014
static uint64_t  //
25015
wuffs_private_impl__swizzle_squash_align4_bgr_565_8888(uint8_t* dst_ptr,
25016
                                                       size_t dst_len,
25017
                                                       const uint8_t* src_ptr,
25018
                                                       size_t src_len,
25019
0
                                                       bool nonpremul) {
25020
0
  size_t len = (dst_len < src_len ? dst_len : src_len) / 4;
25021
0
  uint8_t* d = dst_ptr;
25022
0
  const uint8_t* s = src_ptr;
25023
25024
0
  size_t n = len;
25025
0
  while (n--) {
25026
0
    uint32_t argb = wuffs_base__peek_u32le__no_bounds_check(s);
25027
0
    if (nonpremul) {
25028
0
      argb =
25029
0
          wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(argb);
25030
0
    }
25031
0
    uint32_t b5 = 0x1F & (argb >> (8 - 5));
25032
0
    uint32_t g6 = 0x3F & (argb >> (16 - 6));
25033
0
    uint32_t r5 = 0x1F & (argb >> (24 - 5));
25034
0
    uint32_t alpha = argb & 0xFF000000;
25035
0
    wuffs_base__poke_u32le__no_bounds_check(
25036
0
        d, alpha | (r5 << 11) | (g6 << 5) | (b5 << 0));
25037
0
    s += 4;
25038
0
    d += 4;
25039
0
  }
25040
0
  return len;
25041
0
}
25042
25043
// --------
25044
25045
static uint64_t  //
25046
wuffs_private_impl__swizzle_squash_align4_y_8888(uint8_t* dst_ptr,
25047
                                                 size_t dst_len,
25048
                                                 const uint8_t* src_ptr,
25049
                                                 size_t src_len,
25050
0
                                                 bool nonpremul) {
25051
0
  size_t len = (dst_len < src_len ? dst_len : src_len) / 4;
25052
0
  uint8_t* d = dst_ptr;
25053
0
  const uint8_t* s = src_ptr;
25054
25055
0
  size_t n = len;
25056
0
  while (n--) {
25057
0
    uint32_t argb = wuffs_base__peek_u32le__no_bounds_check(s);
25058
0
    if (nonpremul) {
25059
0
      argb =
25060
0
          wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(argb);
25061
0
    }
25062
0
    uint32_t s0 = wuffs_base__color_u32_argb_premul__as__color_u8_gray(argb);
25063
0
    wuffs_base__poke_u32le__no_bounds_check(
25064
0
        d, (argb & 0xFF000000) | (s0 * 0x010101));
25065
0
    s += 4;
25066
0
    d += 4;
25067
0
  }
25068
0
  return len;
25069
0
}
25070
25071
// --------
25072
25073
static uint64_t  //
25074
wuffs_private_impl__swizzle_swap_rgb_bgr(uint8_t* dst_ptr,
25075
                                         size_t dst_len,
25076
                                         uint8_t* dst_palette_ptr,
25077
                                         size_t dst_palette_len,
25078
                                         const uint8_t* src_ptr,
25079
0
                                         size_t src_len) {
25080
0
  size_t len = (dst_len < src_len ? dst_len : src_len) / 3;
25081
0
  uint8_t* d = dst_ptr;
25082
0
  const uint8_t* s = src_ptr;
25083
25084
0
  size_t n = len;
25085
0
  while (n--) {
25086
0
    uint8_t s0 = s[0];
25087
0
    uint8_t s1 = s[1];
25088
0
    uint8_t s2 = s[2];
25089
0
    d[0] = s2;
25090
0
    d[1] = s1;
25091
0
    d[2] = s0;
25092
0
    s += 3;
25093
0
    d += 3;
25094
0
  }
25095
0
  return len;
25096
0
}
25097
25098
// โ€ผ WUFFS MULTI-FILE SECTION +x86_sse42
25099
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
25100
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
25101
static uint64_t  //
25102
wuffs_private_impl__swizzle_swap_rgbx_bgrx__x86_sse42(uint8_t* dst_ptr,
25103
                                                      size_t dst_len,
25104
                                                      uint8_t* dst_palette_ptr,
25105
                                                      size_t dst_palette_len,
25106
                                                      const uint8_t* src_ptr,
25107
0
                                                      size_t src_len) {
25108
0
  size_t len = (dst_len < src_len ? dst_len : src_len) / 4;
25109
0
  uint8_t* d = dst_ptr;
25110
0
  const uint8_t* s = src_ptr;
25111
0
  size_t n = len;
25112
25113
0
  __m128i shuffle = _mm_set_epi8(+0x0F, +0x0C, +0x0D, +0x0E,  //
25114
0
                                 +0x0B, +0x08, +0x09, +0x0A,  //
25115
0
                                 +0x07, +0x04, +0x05, +0x06,  //
25116
0
                                 +0x03, +0x00, +0x01, +0x02);
25117
25118
0
  while (n >= 4) {
25119
0
    __m128i x;
25120
0
    x = _mm_lddqu_si128((const __m128i*)(const void*)s);
25121
0
    x = _mm_shuffle_epi8(x, shuffle);
25122
0
    _mm_storeu_si128((__m128i*)(void*)d, x);
25123
25124
0
    s += 4 * 4;
25125
0
    d += 4 * 4;
25126
0
    n -= 4;
25127
0
  }
25128
25129
0
  while (n--) {
25130
0
    uint8_t s0 = s[0];
25131
0
    uint8_t s1 = s[1];
25132
0
    uint8_t s2 = s[2];
25133
0
    uint8_t s3 = s[3];
25134
0
    d[0] = s2;
25135
0
    d[1] = s1;
25136
0
    d[2] = s0;
25137
0
    d[3] = s3;
25138
0
    s += 4;
25139
0
    d += 4;
25140
0
  }
25141
0
  return len;
25142
0
}
25143
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
25144
// โ€ผ WUFFS MULTI-FILE SECTION -x86_sse42
25145
25146
static uint64_t  //
25147
wuffs_private_impl__swizzle_swap_rgbx_bgrx(uint8_t* dst_ptr,
25148
                                           size_t dst_len,
25149
                                           uint8_t* dst_palette_ptr,
25150
                                           size_t dst_palette_len,
25151
                                           const uint8_t* src_ptr,
25152
0
                                           size_t src_len) {
25153
0
  size_t len = (dst_len < src_len ? dst_len : src_len) / 4;
25154
0
  uint8_t* d = dst_ptr;
25155
0
  const uint8_t* s = src_ptr;
25156
25157
0
  size_t n = len;
25158
0
  while (n--) {
25159
0
    uint8_t s0 = s[0];
25160
0
    uint8_t s1 = s[1];
25161
0
    uint8_t s2 = s[2];
25162
0
    uint8_t s3 = s[3];
25163
0
    d[0] = s2;
25164
0
    d[1] = s1;
25165
0
    d[2] = s0;
25166
0
    d[3] = s3;
25167
0
    s += 4;
25168
0
    d += 4;
25169
0
  }
25170
0
  return len;
25171
0
}
25172
25173
static uint64_t  //
25174
wuffs_private_impl__swizzle_swap_rgbx_bgrx_64(uint8_t* dst_ptr,
25175
                                              size_t dst_len,
25176
                                              uint8_t* dst_palette_ptr,
25177
                                              size_t dst_palette_len,
25178
                                              const uint8_t* src_ptr,
25179
0
                                              size_t src_len) {
25180
0
  size_t len = (dst_len < src_len ? dst_len : src_len) / 8;
25181
0
  uint8_t* d = dst_ptr;
25182
0
  const uint8_t* s = src_ptr;
25183
0
25184
0
  size_t n = len;
25185
0
  while (n--) {
25186
0
    uint8_t s0 = s[0];
25187
0
    uint8_t s1 = s[1];
25188
0
    uint8_t s2 = s[2];
25189
0
    uint8_t s3 = s[3];
25190
0
    uint8_t s4 = s[4];
25191
0
    uint8_t s5 = s[5];
25192
0
    uint8_t s6 = s[6];
25193
0
    uint8_t s7 = s[7];
25194
0
    d[0] = s4;
25195
0
    d[1] = s5;
25196
0
    d[2] = s2;
25197
0
    d[3] = s3;
25198
0
    d[4] = s0;
25199
0
    d[5] = s1;
25200
0
    d[6] = s6;
25201
0
    d[7] = s7;
25202
0
    s += 8;
25203
0
    d += 8;
25204
0
  }
25205
0
  return len;
25206
0
}
25207
25208
// --------
25209
25210
static uint64_t  //
25211
wuffs_private_impl__swizzle_copy_1_1(uint8_t* dst_ptr,
25212
                                     size_t dst_len,
25213
                                     uint8_t* dst_palette_ptr,
25214
                                     size_t dst_palette_len,
25215
                                     const uint8_t* src_ptr,
25216
7.29M
                                     size_t src_len) {
25217
7.29M
  size_t len = (dst_len < src_len) ? dst_len : src_len;
25218
7.29M
  if (len > 0) {
25219
7.29M
    memmove(dst_ptr, src_ptr, len);
25220
7.29M
  }
25221
7.29M
  return len;
25222
7.29M
}
25223
25224
static uint64_t  //
25225
wuffs_private_impl__swizzle_copy_2_2(uint8_t* dst_ptr,
25226
                                     size_t dst_len,
25227
                                     uint8_t* dst_palette_ptr,
25228
                                     size_t dst_palette_len,
25229
                                     const uint8_t* src_ptr,
25230
0
                                     size_t src_len) {
25231
0
  size_t dst_len2 = dst_len / 2;
25232
0
  size_t src_len2 = src_len / 2;
25233
0
  size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2;
25234
0
  if (len > 0) {
25235
0
    memmove(dst_ptr, src_ptr, len * 2);
25236
0
  }
25237
0
  return len;
25238
0
}
25239
25240
static uint64_t  //
25241
wuffs_private_impl__swizzle_copy_3_3(uint8_t* dst_ptr,
25242
                                     size_t dst_len,
25243
                                     uint8_t* dst_palette_ptr,
25244
                                     size_t dst_palette_len,
25245
                                     const uint8_t* src_ptr,
25246
0
                                     size_t src_len) {
25247
0
  size_t dst_len3 = dst_len / 3;
25248
0
  size_t src_len3 = src_len / 3;
25249
0
  size_t len = (dst_len3 < src_len3) ? dst_len3 : src_len3;
25250
0
  if (len > 0) {
25251
0
    memmove(dst_ptr, src_ptr, len * 3);
25252
0
  }
25253
0
  return len;
25254
0
}
25255
25256
static uint64_t  //
25257
wuffs_private_impl__swizzle_copy_4_4(uint8_t* dst_ptr,
25258
                                     size_t dst_len,
25259
                                     uint8_t* dst_palette_ptr,
25260
                                     size_t dst_palette_len,
25261
                                     const uint8_t* src_ptr,
25262
0
                                     size_t src_len) {
25263
0
  size_t dst_len4 = dst_len / 4;
25264
0
  size_t src_len4 = src_len / 4;
25265
0
  size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
25266
0
  if (len > 0) {
25267
0
    memmove(dst_ptr, src_ptr, len * 4);
25268
0
  }
25269
0
  return len;
25270
0
}
25271
25272
static uint64_t  //
25273
wuffs_private_impl__swizzle_copy_8_8(uint8_t* dst_ptr,
25274
                                     size_t dst_len,
25275
                                     uint8_t* dst_palette_ptr,
25276
                                     size_t dst_palette_len,
25277
                                     const uint8_t* src_ptr,
25278
0
                                     size_t src_len) {
25279
0
  size_t dst_len8 = dst_len / 8;
25280
0
  size_t src_len8 = src_len / 8;
25281
0
  size_t len = (dst_len8 < src_len8) ? dst_len8 : src_len8;
25282
0
  if (len > 0) {
25283
0
    memmove(dst_ptr, src_ptr, len * 8);
25284
0
  }
25285
0
  return len;
25286
0
}
25287
25288
// --------
25289
25290
static uint64_t  //
25291
wuffs_private_impl__swizzle_bgr_565__bgr(uint8_t* dst_ptr,
25292
                                         size_t dst_len,
25293
                                         uint8_t* dst_palette_ptr,
25294
                                         size_t dst_palette_len,
25295
                                         const uint8_t* src_ptr,
25296
0
                                         size_t src_len) {
25297
0
  size_t dst_len2 = dst_len / 2;
25298
0
  size_t src_len3 = src_len / 3;
25299
0
  size_t len = (dst_len2 < src_len3) ? dst_len2 : src_len3;
25300
0
  uint8_t* d = dst_ptr;
25301
0
  const uint8_t* s = src_ptr;
25302
0
  size_t n = len;
25303
25304
  // TODO: unroll.
25305
25306
0
  while (n >= 1) {
25307
0
    uint32_t b5 = (uint32_t)(s[0] >> 3);
25308
0
    uint32_t g6 = (uint32_t)(s[1] >> 2);
25309
0
    uint32_t r5 = (uint32_t)(s[2] >> 3);
25310
0
    uint32_t rgb_565 = (r5 << 11) | (g6 << 5) | (b5 << 0);
25311
0
    wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565);
25312
25313
0
    s += 1 * 3;
25314
0
    d += 1 * 2;
25315
0
    n -= 1;
25316
0
  }
25317
25318
0
  return len;
25319
0
}
25320
25321
static uint64_t  //
25322
wuffs_private_impl__swizzle_bgr_565__bgrx(uint8_t* dst_ptr,
25323
                                          size_t dst_len,
25324
                                          uint8_t* dst_palette_ptr,
25325
                                          size_t dst_palette_len,
25326
                                          const uint8_t* src_ptr,
25327
0
                                          size_t src_len) {
25328
0
  size_t dst_len2 = dst_len / 2;
25329
0
  size_t src_len4 = src_len / 4;
25330
0
  size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4;
25331
0
  uint8_t* d = dst_ptr;
25332
0
  const uint8_t* s = src_ptr;
25333
0
  size_t n = len;
25334
25335
  // TODO: unroll.
25336
25337
0
  while (n >= 1) {
25338
0
    uint32_t b5 = (uint32_t)(s[0] >> 3);
25339
0
    uint32_t g6 = (uint32_t)(s[1] >> 2);
25340
0
    uint32_t r5 = (uint32_t)(s[2] >> 3);
25341
0
    uint32_t rgb_565 = (r5 << 11) | (g6 << 5) | (b5 << 0);
25342
0
    wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565);
25343
25344
0
    s += 1 * 4;
25345
0
    d += 1 * 2;
25346
0
    n -= 1;
25347
0
  }
25348
25349
0
  return len;
25350
0
}
25351
25352
static uint64_t  //
25353
wuffs_private_impl__swizzle_bgr_565__bgra_nonpremul__src(
25354
    uint8_t* dst_ptr,
25355
    size_t dst_len,
25356
    uint8_t* dst_palette_ptr,
25357
    size_t dst_palette_len,
25358
    const uint8_t* src_ptr,
25359
0
    size_t src_len) {
25360
0
  size_t dst_len2 = dst_len / 2;
25361
0
  size_t src_len4 = src_len / 4;
25362
0
  size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4;
25363
0
  uint8_t* d = dst_ptr;
25364
0
  const uint8_t* s = src_ptr;
25365
0
  size_t n = len;
25366
25367
  // TODO: unroll.
25368
25369
0
  while (n >= 1) {
25370
0
    wuffs_base__poke_u16le__no_bounds_check(
25371
0
        d + (0 * 2),
25372
0
        wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(
25373
0
            wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(
25374
0
                wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))));
25375
25376
0
    s += 1 * 4;
25377
0
    d += 1 * 2;
25378
0
    n -= 1;
25379
0
  }
25380
25381
0
  return len;
25382
0
}
25383
25384
static uint64_t  //
25385
wuffs_private_impl__swizzle_bgr_565__bgra_nonpremul_4x16le__src(
25386
    uint8_t* dst_ptr,
25387
    size_t dst_len,
25388
    uint8_t* dst_palette_ptr,
25389
    size_t dst_palette_len,
25390
    const uint8_t* src_ptr,
25391
0
    size_t src_len) {
25392
0
  size_t dst_len2 = dst_len / 2;
25393
0
  size_t src_len8 = src_len / 8;
25394
0
  size_t len = (dst_len2 < src_len8) ? dst_len2 : src_len8;
25395
0
  uint8_t* d = dst_ptr;
25396
0
  const uint8_t* s = src_ptr;
25397
0
  size_t n = len;
25398
25399
  // TODO: unroll.
25400
25401
0
  while (n >= 1) {
25402
0
    wuffs_base__poke_u16le__no_bounds_check(
25403
0
        d + (0 * 2),
25404
0
        wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(
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
25408
0
    s += 1 * 8;
25409
0
    d += 1 * 2;
25410
0
    n -= 1;
25411
0
  }
25412
25413
0
  return len;
25414
0
}
25415
25416
static uint64_t  //
25417
wuffs_private_impl__swizzle_bgr_565__bgra_nonpremul__src_over(
25418
    uint8_t* dst_ptr,
25419
    size_t dst_len,
25420
    uint8_t* dst_palette_ptr,
25421
    size_t dst_palette_len,
25422
    const uint8_t* src_ptr,
25423
0
    size_t src_len) {
25424
0
  size_t dst_len2 = dst_len / 2;
25425
0
  size_t src_len4 = src_len / 4;
25426
0
  size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4;
25427
0
  uint8_t* d = dst_ptr;
25428
0
  const uint8_t* s = src_ptr;
25429
0
  size_t n = len;
25430
25431
  // TODO: unroll.
25432
25433
0
  while (n >= 1) {
25434
    // Extract 16-bit color components.
25435
0
    uint32_t sa = 0x101 * ((uint32_t)s[3]);
25436
0
    uint32_t sr = 0x101 * ((uint32_t)s[2]);
25437
0
    uint32_t sg = 0x101 * ((uint32_t)s[1]);
25438
0
    uint32_t sb = 0x101 * ((uint32_t)s[0]);
25439
25440
    // Convert from 565 color to 16-bit color.
25441
0
    uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2));
25442
0
    uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11);
25443
0
    uint32_t dr = (0x8421 * old_r5) >> 4;
25444
0
    uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5);
25445
0
    uint32_t dg = (0x1041 * old_g6) >> 2;
25446
0
    uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0);
25447
0
    uint32_t db = (0x8421 * old_b5) >> 4;
25448
25449
    // Calculate the inverse of the src-alpha: how much of the dst to keep.
25450
0
    uint32_t ia = 0xFFFF - sa;
25451
25452
    // Composite src (nonpremul) over dst (premul).
25453
0
    dr = ((sr * sa) + (dr * ia)) / 0xFFFF;
25454
0
    dg = ((sg * sa) + (dg * ia)) / 0xFFFF;
25455
0
    db = ((sb * sa) + (db * ia)) / 0xFFFF;
25456
25457
    // Convert from 16-bit color to 565 color and combine the components.
25458
0
    uint32_t new_r5 = 0x1F & (dr >> 11);
25459
0
    uint32_t new_g6 = 0x3F & (dg >> 10);
25460
0
    uint32_t new_b5 = 0x1F & (db >> 11);
25461
0
    uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0);
25462
0
    wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565);
25463
25464
0
    s += 1 * 4;
25465
0
    d += 1 * 2;
25466
0
    n -= 1;
25467
0
  }
25468
25469
0
  return len;
25470
0
}
25471
25472
static uint64_t  //
25473
wuffs_private_impl__swizzle_bgr_565__bgra_nonpremul_4x16le__src_over(
25474
    uint8_t* dst_ptr,
25475
    size_t dst_len,
25476
    uint8_t* dst_palette_ptr,
25477
    size_t dst_palette_len,
25478
    const uint8_t* src_ptr,
25479
0
    size_t src_len) {
25480
0
  size_t dst_len2 = dst_len / 2;
25481
0
  size_t src_len8 = src_len / 8;
25482
0
  size_t len = (dst_len2 < src_len8) ? dst_len2 : src_len8;
25483
0
  uint8_t* d = dst_ptr;
25484
0
  const uint8_t* s = src_ptr;
25485
0
  size_t n = len;
25486
25487
  // TODO: unroll.
25488
25489
0
  while (n >= 1) {
25490
    // Extract 16-bit color components.
25491
0
    uint32_t sa = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 6));
25492
0
    uint32_t sr = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 4));
25493
0
    uint32_t sg = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 2));
25494
0
    uint32_t sb = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 0));
25495
25496
    // Convert from 565 color to 16-bit color.
25497
0
    uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2));
25498
0
    uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11);
25499
0
    uint32_t dr = (0x8421 * old_r5) >> 4;
25500
0
    uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5);
25501
0
    uint32_t dg = (0x1041 * old_g6) >> 2;
25502
0
    uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0);
25503
0
    uint32_t db = (0x8421 * old_b5) >> 4;
25504
25505
    // Calculate the inverse of the src-alpha: how much of the dst to keep.
25506
0
    uint32_t ia = 0xFFFF - sa;
25507
25508
    // Composite src (nonpremul) over dst (premul).
25509
0
    dr = ((sr * sa) + (dr * ia)) / 0xFFFF;
25510
0
    dg = ((sg * sa) + (dg * ia)) / 0xFFFF;
25511
0
    db = ((sb * sa) + (db * ia)) / 0xFFFF;
25512
25513
    // Convert from 16-bit color to 565 color and combine the components.
25514
0
    uint32_t new_r5 = 0x1F & (dr >> 11);
25515
0
    uint32_t new_g6 = 0x3F & (dg >> 10);
25516
0
    uint32_t new_b5 = 0x1F & (db >> 11);
25517
0
    uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0);
25518
0
    wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565);
25519
25520
0
    s += 1 * 8;
25521
0
    d += 1 * 2;
25522
0
    n -= 1;
25523
0
  }
25524
25525
0
  return len;
25526
0
}
25527
25528
static uint64_t  //
25529
wuffs_private_impl__swizzle_bgr_565__bgra_premul__src(uint8_t* dst_ptr,
25530
                                                      size_t dst_len,
25531
                                                      uint8_t* dst_palette_ptr,
25532
                                                      size_t dst_palette_len,
25533
                                                      const uint8_t* src_ptr,
25534
0
                                                      size_t src_len) {
25535
0
  size_t dst_len2 = dst_len / 2;
25536
0
  size_t src_len4 = src_len / 4;
25537
0
  size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4;
25538
0
  uint8_t* d = dst_ptr;
25539
0
  const uint8_t* s = src_ptr;
25540
0
  size_t n = len;
25541
25542
  // TODO: unroll.
25543
25544
0
  while (n >= 1) {
25545
0
    wuffs_base__poke_u16le__no_bounds_check(
25546
0
        d + (0 * 2), wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(
25547
0
                         wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))));
25548
25549
0
    s += 1 * 4;
25550
0
    d += 1 * 2;
25551
0
    n -= 1;
25552
0
  }
25553
25554
0
  return len;
25555
0
}
25556
25557
static uint64_t  //
25558
wuffs_private_impl__swizzle_bgr_565__bgra_premul_4x16le__src(
25559
    uint8_t* dst_ptr,
25560
    size_t dst_len,
25561
    uint8_t* dst_palette_ptr,
25562
    size_t dst_palette_len,
25563
    const uint8_t* src_ptr,
25564
0
    size_t src_len) {
25565
0
  size_t dst_len2 = dst_len / 2;
25566
0
  size_t src_len8 = src_len / 8;
25567
0
  size_t len = (dst_len2 < src_len8) ? dst_len2 : src_len8;
25568
0
  uint8_t* d = dst_ptr;
25569
0
  const uint8_t* s = src_ptr;
25570
0
  size_t n = len;
25571
25572
  // TODO: unroll.
25573
25574
0
  while (n >= 1) {
25575
0
    wuffs_base__poke_u16le__no_bounds_check(
25576
0
        d + (0 * 2),
25577
0
        wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(
25578
0
            wuffs_base__color_u64__as__color_u32(
25579
0
                wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)))));
25580
25581
0
    s += 1 * 8;
25582
0
    d += 1 * 2;
25583
0
    n -= 1;
25584
0
  }
25585
25586
0
  return len;
25587
0
}
25588
25589
static uint64_t  //
25590
wuffs_private_impl__swizzle_bgr_565__bgra_premul__src_over(
25591
    uint8_t* dst_ptr,
25592
    size_t dst_len,
25593
    uint8_t* dst_palette_ptr,
25594
    size_t dst_palette_len,
25595
    const uint8_t* src_ptr,
25596
0
    size_t src_len) {
25597
0
  size_t dst_len2 = dst_len / 2;
25598
0
  size_t src_len4 = src_len / 4;
25599
0
  size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4;
25600
0
  uint8_t* d = dst_ptr;
25601
0
  const uint8_t* s = src_ptr;
25602
0
  size_t n = len;
25603
25604
  // TODO: unroll.
25605
25606
0
  while (n >= 1) {
25607
    // Extract 16-bit color components.
25608
0
    uint32_t sa = 0x101 * ((uint32_t)s[3]);
25609
0
    uint32_t sr = 0x101 * ((uint32_t)s[2]);
25610
0
    uint32_t sg = 0x101 * ((uint32_t)s[1]);
25611
0
    uint32_t sb = 0x101 * ((uint32_t)s[0]);
25612
25613
    // Convert from 565 color to 16-bit color.
25614
0
    uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2));
25615
0
    uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11);
25616
0
    uint32_t dr = (0x8421 * old_r5) >> 4;
25617
0
    uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5);
25618
0
    uint32_t dg = (0x1041 * old_g6) >> 2;
25619
0
    uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0);
25620
0
    uint32_t db = (0x8421 * old_b5) >> 4;
25621
25622
    // Calculate the inverse of the src-alpha: how much of the dst to keep.
25623
0
    uint32_t ia = 0xFFFF - sa;
25624
25625
    // Composite src (premul) over dst (premul).
25626
0
    dr = sr + ((dr * ia) / 0xFFFF);
25627
0
    dg = sg + ((dg * ia) / 0xFFFF);
25628
0
    db = sb + ((db * ia) / 0xFFFF);
25629
25630
    // Convert from 16-bit color to 565 color and combine the components.
25631
0
    uint32_t new_r5 = 0x1F & (dr >> 11);
25632
0
    uint32_t new_g6 = 0x3F & (dg >> 10);
25633
0
    uint32_t new_b5 = 0x1F & (db >> 11);
25634
0
    uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0);
25635
0
    wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565);
25636
25637
0
    s += 1 * 4;
25638
0
    d += 1 * 2;
25639
0
    n -= 1;
25640
0
  }
25641
25642
0
  return len;
25643
0
}
25644
25645
static uint64_t  //
25646
wuffs_private_impl__swizzle_bgr_565__bgra_premul_4x16le__src_over(
25647
    uint8_t* dst_ptr,
25648
    size_t dst_len,
25649
    uint8_t* dst_palette_ptr,
25650
    size_t dst_palette_len,
25651
    const uint8_t* src_ptr,
25652
0
    size_t src_len) {
25653
0
  size_t dst_len2 = dst_len / 2;
25654
0
  size_t src_len8 = src_len / 8;
25655
0
  size_t len = (dst_len2 < src_len8) ? dst_len2 : src_len8;
25656
0
  uint8_t* d = dst_ptr;
25657
0
  const uint8_t* s = src_ptr;
25658
0
  size_t n = len;
25659
25660
  // TODO: unroll.
25661
25662
0
  while (n >= 1) {
25663
    // Extract 16-bit color components.
25664
0
    uint32_t sa = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 6));
25665
0
    uint32_t sr = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 4));
25666
0
    uint32_t sg = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 2));
25667
0
    uint32_t sb = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 0));
25668
25669
    // Convert from 565 color to 16-bit color.
25670
0
    uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2));
25671
0
    uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11);
25672
0
    uint32_t dr = (0x8421 * old_r5) >> 4;
25673
0
    uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5);
25674
0
    uint32_t dg = (0x1041 * old_g6) >> 2;
25675
0
    uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0);
25676
0
    uint32_t db = (0x8421 * old_b5) >> 4;
25677
25678
    // Calculate the inverse of the src-alpha: how much of the dst to keep.
25679
0
    uint32_t ia = 0xFFFF - sa;
25680
25681
    // Composite src (premul) over dst (premul).
25682
0
    dr = sr + ((dr * ia) / 0xFFFF);
25683
0
    dg = sg + ((dg * ia) / 0xFFFF);
25684
0
    db = sb + ((db * ia) / 0xFFFF);
25685
25686
    // Convert from 16-bit color to 565 color and combine the components.
25687
0
    uint32_t new_r5 = 0x1F & (dr >> 11);
25688
0
    uint32_t new_g6 = 0x3F & (dg >> 10);
25689
0
    uint32_t new_b5 = 0x1F & (db >> 11);
25690
0
    uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0);
25691
0
    wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565);
25692
25693
0
    s += 1 * 8;
25694
0
    d += 1 * 2;
25695
0
    n -= 1;
25696
0
  }
25697
25698
0
  return len;
25699
0
}
25700
25701
static uint64_t  //
25702
wuffs_private_impl__swizzle_bgr_565__rgb(uint8_t* dst_ptr,
25703
                                         size_t dst_len,
25704
                                         uint8_t* dst_palette_ptr,
25705
                                         size_t dst_palette_len,
25706
                                         const uint8_t* src_ptr,
25707
0
                                         size_t src_len) {
25708
0
  size_t dst_len2 = dst_len / 2;
25709
0
  size_t src_len3 = src_len / 3;
25710
0
  size_t len = (dst_len2 < src_len3) ? dst_len2 : src_len3;
25711
0
  uint8_t* d = dst_ptr;
25712
0
  const uint8_t* s = src_ptr;
25713
0
  size_t n = len;
25714
25715
  // TODO: unroll.
25716
25717
0
  while (n >= 1) {
25718
0
    uint32_t r5 = (uint32_t)(s[0] >> 3);
25719
0
    uint32_t g6 = (uint32_t)(s[1] >> 2);
25720
0
    uint32_t b5 = (uint32_t)(s[2] >> 3);
25721
0
    uint32_t rgb_565 = (r5 << 11) | (g6 << 5) | (b5 << 0);
25722
0
    wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565);
25723
25724
0
    s += 1 * 3;
25725
0
    d += 1 * 2;
25726
0
    n -= 1;
25727
0
  }
25728
25729
0
  return len;
25730
0
}
25731
25732
static uint64_t  //
25733
wuffs_private_impl__swizzle_bgr_565__rgba_nonpremul__src(
25734
    uint8_t* dst_ptr,
25735
    size_t dst_len,
25736
    uint8_t* dst_palette_ptr,
25737
    size_t dst_palette_len,
25738
    const uint8_t* src_ptr,
25739
0
    size_t src_len) {
25740
0
  size_t dst_len2 = dst_len / 2;
25741
0
  size_t src_len4 = src_len / 4;
25742
0
  size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4;
25743
0
  uint8_t* d = dst_ptr;
25744
0
  const uint8_t* s = src_ptr;
25745
0
  size_t n = len;
25746
25747
  // TODO: unroll.
25748
25749
0
  while (n >= 1) {
25750
0
    wuffs_base__poke_u16le__no_bounds_check(
25751
0
        d + (0 * 2),
25752
0
        wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(
25753
0
            wuffs_private_impl__swap_u32_argb_abgr(
25754
0
                wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(
25755
0
                    wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))))));
25756
25757
0
    s += 1 * 4;
25758
0
    d += 1 * 2;
25759
0
    n -= 1;
25760
0
  }
25761
25762
0
  return len;
25763
0
}
25764
25765
static uint64_t  //
25766
wuffs_private_impl__swizzle_bgr_565__rgba_nonpremul__src_over(
25767
    uint8_t* dst_ptr,
25768
    size_t dst_len,
25769
    uint8_t* dst_palette_ptr,
25770
    size_t dst_palette_len,
25771
    const uint8_t* src_ptr,
25772
0
    size_t src_len) {
25773
0
  size_t dst_len2 = dst_len / 2;
25774
0
  size_t src_len4 = src_len / 4;
25775
0
  size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4;
25776
0
  uint8_t* d = dst_ptr;
25777
0
  const uint8_t* s = src_ptr;
25778
0
  size_t n = len;
25779
25780
  // TODO: unroll.
25781
25782
0
  while (n >= 1) {
25783
    // Extract 16-bit color components.
25784
0
    uint32_t sa = 0x101 * ((uint32_t)s[3]);
25785
0
    uint32_t sb = 0x101 * ((uint32_t)s[2]);
25786
0
    uint32_t sg = 0x101 * ((uint32_t)s[1]);
25787
0
    uint32_t sr = 0x101 * ((uint32_t)s[0]);
25788
25789
    // Convert from 565 color to 16-bit color.
25790
0
    uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2));
25791
0
    uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11);
25792
0
    uint32_t dr = (0x8421 * old_r5) >> 4;
25793
0
    uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5);
25794
0
    uint32_t dg = (0x1041 * old_g6) >> 2;
25795
0
    uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0);
25796
0
    uint32_t db = (0x8421 * old_b5) >> 4;
25797
25798
    // Calculate the inverse of the src-alpha: how much of the dst to keep.
25799
0
    uint32_t ia = 0xFFFF - sa;
25800
25801
    // Composite src (nonpremul) over dst (premul).
25802
0
    dr = ((sr * sa) + (dr * ia)) / 0xFFFF;
25803
0
    dg = ((sg * sa) + (dg * ia)) / 0xFFFF;
25804
0
    db = ((sb * sa) + (db * ia)) / 0xFFFF;
25805
25806
    // Convert from 16-bit color to 565 color and combine the components.
25807
0
    uint32_t new_r5 = 0x1F & (dr >> 11);
25808
0
    uint32_t new_g6 = 0x3F & (dg >> 10);
25809
0
    uint32_t new_b5 = 0x1F & (db >> 11);
25810
0
    uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0);
25811
0
    wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565);
25812
25813
0
    s += 1 * 4;
25814
0
    d += 1 * 2;
25815
0
    n -= 1;
25816
0
  }
25817
25818
0
  return len;
25819
0
}
25820
25821
static uint64_t  //
25822
wuffs_private_impl__swizzle_bgr_565__rgba_premul__src(uint8_t* dst_ptr,
25823
                                                      size_t dst_len,
25824
                                                      uint8_t* dst_palette_ptr,
25825
                                                      size_t dst_palette_len,
25826
                                                      const uint8_t* src_ptr,
25827
0
                                                      size_t src_len) {
25828
0
  size_t dst_len2 = dst_len / 2;
25829
0
  size_t src_len4 = src_len / 4;
25830
0
  size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4;
25831
0
  uint8_t* d = dst_ptr;
25832
0
  const uint8_t* s = src_ptr;
25833
0
  size_t n = len;
25834
25835
  // TODO: unroll.
25836
25837
0
  while (n >= 1) {
25838
0
    wuffs_base__poke_u16le__no_bounds_check(
25839
0
        d + (0 * 2),
25840
0
        wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(
25841
0
            wuffs_private_impl__swap_u32_argb_abgr(
25842
0
                wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))));
25843
25844
0
    s += 1 * 4;
25845
0
    d += 1 * 2;
25846
0
    n -= 1;
25847
0
  }
25848
25849
0
  return len;
25850
0
}
25851
25852
static uint64_t  //
25853
wuffs_private_impl__swizzle_bgr_565__rgba_premul__src_over(
25854
    uint8_t* dst_ptr,
25855
    size_t dst_len,
25856
    uint8_t* dst_palette_ptr,
25857
    size_t dst_palette_len,
25858
    const uint8_t* src_ptr,
25859
0
    size_t src_len) {
25860
0
  size_t dst_len2 = dst_len / 2;
25861
0
  size_t src_len4 = src_len / 4;
25862
0
  size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4;
25863
0
  uint8_t* d = dst_ptr;
25864
0
  const uint8_t* s = src_ptr;
25865
0
  size_t n = len;
25866
25867
  // TODO: unroll.
25868
25869
0
  while (n >= 1) {
25870
    // Extract 16-bit color components.
25871
0
    uint32_t sa = 0x101 * ((uint32_t)s[3]);
25872
0
    uint32_t sb = 0x101 * ((uint32_t)s[2]);
25873
0
    uint32_t sg = 0x101 * ((uint32_t)s[1]);
25874
0
    uint32_t sr = 0x101 * ((uint32_t)s[0]);
25875
25876
    // Convert from 565 color to 16-bit color.
25877
0
    uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2));
25878
0
    uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11);
25879
0
    uint32_t dr = (0x8421 * old_r5) >> 4;
25880
0
    uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5);
25881
0
    uint32_t dg = (0x1041 * old_g6) >> 2;
25882
0
    uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0);
25883
0
    uint32_t db = (0x8421 * old_b5) >> 4;
25884
25885
    // Calculate the inverse of the src-alpha: how much of the dst to keep.
25886
0
    uint32_t ia = 0xFFFF - sa;
25887
25888
    // Composite src (premul) over dst (premul).
25889
0
    dr = sr + ((dr * ia) / 0xFFFF);
25890
0
    dg = sg + ((dg * ia) / 0xFFFF);
25891
0
    db = sb + ((db * ia) / 0xFFFF);
25892
25893
    // Convert from 16-bit color to 565 color and combine the components.
25894
0
    uint32_t new_r5 = 0x1F & (dr >> 11);
25895
0
    uint32_t new_g6 = 0x3F & (dg >> 10);
25896
0
    uint32_t new_b5 = 0x1F & (db >> 11);
25897
0
    uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0);
25898
0
    wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565);
25899
25900
0
    s += 1 * 4;
25901
0
    d += 1 * 2;
25902
0
    n -= 1;
25903
0
  }
25904
25905
0
  return len;
25906
0
}
25907
25908
static uint64_t  //
25909
wuffs_private_impl__swizzle_bgr_565__y(uint8_t* dst_ptr,
25910
                                       size_t dst_len,
25911
                                       uint8_t* dst_palette_ptr,
25912
                                       size_t dst_palette_len,
25913
                                       const uint8_t* src_ptr,
25914
0
                                       size_t src_len) {
25915
0
  size_t dst_len2 = dst_len / 2;
25916
0
  size_t len = (dst_len2 < src_len) ? dst_len2 : src_len;
25917
0
  uint8_t* d = dst_ptr;
25918
0
  const uint8_t* s = src_ptr;
25919
0
  size_t n = len;
25920
25921
  // TODO: unroll.
25922
25923
0
  while (n >= 1) {
25924
0
    uint32_t y5 = (uint32_t)(s[0] >> 3);
25925
0
    uint32_t y6 = (uint32_t)(s[0] >> 2);
25926
0
    uint32_t rgb_565 = (y5 << 11) | (y6 << 5) | (y5 << 0);
25927
0
    wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565);
25928
25929
0
    s += 1 * 1;
25930
0
    d += 1 * 2;
25931
0
    n -= 1;
25932
0
  }
25933
25934
0
  return len;
25935
0
}
25936
25937
static uint64_t  //
25938
wuffs_private_impl__swizzle_bgr_565__y_16be(uint8_t* dst_ptr,
25939
                                            size_t dst_len,
25940
                                            uint8_t* dst_palette_ptr,
25941
                                            size_t dst_palette_len,
25942
                                            const uint8_t* src_ptr,
25943
0
                                            size_t src_len) {
25944
0
  size_t dst_len2 = dst_len / 2;
25945
0
  size_t src_len2 = src_len / 2;
25946
0
  size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2;
25947
0
  uint8_t* d = dst_ptr;
25948
0
  const uint8_t* s = src_ptr;
25949
0
  size_t n = len;
25950
25951
  // TODO: unroll.
25952
25953
0
  while (n >= 1) {
25954
0
    uint32_t y5 = (uint32_t)(s[0] >> 3);
25955
0
    uint32_t y6 = (uint32_t)(s[0] >> 2);
25956
0
    uint32_t rgb_565 = (y5 << 11) | (y6 << 5) | (y5 << 0);
25957
0
    wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565);
25958
25959
0
    s += 1 * 2;
25960
0
    d += 1 * 2;
25961
0
    n -= 1;
25962
0
  }
25963
25964
0
  return len;
25965
0
}
25966
25967
static uint64_t  //
25968
wuffs_private_impl__swizzle_bgr_565__y_16le(uint8_t* dst_ptr,
25969
                                            size_t dst_len,
25970
                                            uint8_t* dst_palette_ptr,
25971
                                            size_t dst_palette_len,
25972
                                            const uint8_t* src_ptr,
25973
0
                                            size_t src_len) {
25974
0
  size_t dst_len2 = dst_len / 2;
25975
0
  size_t src_len2 = src_len / 2;
25976
0
  size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2;
25977
0
  uint8_t* d = dst_ptr;
25978
0
  const uint8_t* s = src_ptr;
25979
0
  size_t n = len;
25980
25981
  // TODO: unroll.
25982
25983
0
  while (n >= 1) {
25984
0
    uint32_t y5 = (uint32_t)(s[1] >> 3);
25985
0
    uint32_t y6 = (uint32_t)(s[1] >> 2);
25986
0
    uint32_t rgb_565 = (y5 << 11) | (y6 << 5) | (y5 << 0);
25987
0
    wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565);
25988
25989
0
    s += 1 * 2;
25990
0
    d += 1 * 2;
25991
0
    n -= 1;
25992
0
  }
25993
25994
0
  return len;
25995
0
}
25996
25997
static uint64_t  //
25998
wuffs_private_impl__swizzle_bgr_565__ya_nonpremul__src(uint8_t* dst_ptr,
25999
                                                       size_t dst_len,
26000
                                                       uint8_t* dst_palette_ptr,
26001
                                                       size_t dst_palette_len,
26002
                                                       const uint8_t* src_ptr,
26003
0
                                                       size_t src_len) {
26004
0
  size_t dst_len2 = dst_len / 2;
26005
0
  size_t src_len2 = src_len / 2;
26006
0
  size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2;
26007
0
  uint8_t* d = dst_ptr;
26008
0
  const uint8_t* s = src_ptr;
26009
0
  size_t n = len;
26010
26011
  // TODO: unroll.
26012
26013
0
  while (n >= 1) {
26014
0
    uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101);
26015
26016
0
    wuffs_base__poke_u16le__no_bounds_check(
26017
0
        d + (0 * 2),
26018
0
        wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(
26019
0
            wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(
26020
0
                s0)));
26021
26022
0
    s += 1 * 2;
26023
0
    d += 1 * 2;
26024
0
    n -= 1;
26025
0
  }
26026
26027
0
  return len;
26028
0
}
26029
26030
static uint64_t  //
26031
wuffs_private_impl__swizzle_bgr_565__ya_nonpremul__src_over(
26032
    uint8_t* dst_ptr,
26033
    size_t dst_len,
26034
    uint8_t* dst_palette_ptr,
26035
    size_t dst_palette_len,
26036
    const uint8_t* src_ptr,
26037
0
    size_t src_len) {
26038
0
  size_t dst_len2 = dst_len / 2;
26039
0
  size_t src_len2 = src_len / 2;
26040
0
  size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2;
26041
0
  uint8_t* d = dst_ptr;
26042
0
  const uint8_t* s = src_ptr;
26043
0
  size_t n = len;
26044
26045
  // TODO: unroll.
26046
26047
0
  while (n >= 1) {
26048
    // Extract 16-bit color components.
26049
0
    uint32_t sa = 0x101 * ((uint32_t)s[1]);
26050
0
    uint32_t sy = 0x101 * ((uint32_t)s[0]);
26051
26052
    // Convert from 565 color to 16-bit color.
26053
0
    uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2));
26054
0
    uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11);
26055
0
    uint32_t dr = (0x8421 * old_r5) >> 4;
26056
0
    uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5);
26057
0
    uint32_t dg = (0x1041 * old_g6) >> 2;
26058
0
    uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0);
26059
0
    uint32_t db = (0x8421 * old_b5) >> 4;
26060
26061
    // Calculate the inverse of the src-alpha: how much of the dst to keep.
26062
0
    uint32_t ia = 0xFFFF - sa;
26063
26064
    // Composite src (nonpremul) over dst (premul).
26065
0
    dr = ((sy * sa) + (dr * ia)) / 0xFFFF;
26066
0
    dg = ((sy * sa) + (dg * ia)) / 0xFFFF;
26067
0
    db = ((sy * sa) + (db * ia)) / 0xFFFF;
26068
26069
    // Convert from 16-bit color to 565 color and combine the components.
26070
0
    uint32_t new_r5 = 0x1F & (dr >> 11);
26071
0
    uint32_t new_g6 = 0x3F & (dg >> 10);
26072
0
    uint32_t new_b5 = 0x1F & (db >> 11);
26073
0
    uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0);
26074
0
    wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565);
26075
26076
0
    s += 1 * 2;
26077
0
    d += 1 * 2;
26078
0
    n -= 1;
26079
0
  }
26080
26081
0
  return len;
26082
0
}
26083
26084
static uint64_t  //
26085
wuffs_private_impl__swizzle_bgr_565__index__src(uint8_t* dst_ptr,
26086
                                                size_t dst_len,
26087
                                                uint8_t* dst_palette_ptr,
26088
                                                size_t dst_palette_len,
26089
                                                const uint8_t* src_ptr,
26090
0
                                                size_t src_len) {
26091
0
  if (dst_palette_len !=
26092
0
      WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
26093
0
    return 0;
26094
0
  }
26095
0
  size_t dst_len2 = dst_len / 2;
26096
0
  size_t len = (dst_len2 < src_len) ? dst_len2 : src_len;
26097
0
  uint8_t* d = dst_ptr;
26098
0
  const uint8_t* s = src_ptr;
26099
0
  size_t n = len;
26100
26101
0
  const size_t loop_unroll_count = 4;
26102
26103
0
  while (n >= loop_unroll_count) {
26104
0
    wuffs_base__poke_u16le__no_bounds_check(
26105
0
        d + (0 * 2), wuffs_base__peek_u16le__no_bounds_check(
26106
0
                         dst_palette_ptr + ((size_t)s[0] * 4)));
26107
0
    wuffs_base__poke_u16le__no_bounds_check(
26108
0
        d + (1 * 2), wuffs_base__peek_u16le__no_bounds_check(
26109
0
                         dst_palette_ptr + ((size_t)s[1] * 4)));
26110
0
    wuffs_base__poke_u16le__no_bounds_check(
26111
0
        d + (2 * 2), wuffs_base__peek_u16le__no_bounds_check(
26112
0
                         dst_palette_ptr + ((size_t)s[2] * 4)));
26113
0
    wuffs_base__poke_u16le__no_bounds_check(
26114
0
        d + (3 * 2), wuffs_base__peek_u16le__no_bounds_check(
26115
0
                         dst_palette_ptr + ((size_t)s[3] * 4)));
26116
26117
0
    s += loop_unroll_count * 1;
26118
0
    d += loop_unroll_count * 2;
26119
0
    n -= loop_unroll_count;
26120
0
  }
26121
26122
0
  while (n >= 1) {
26123
0
    wuffs_base__poke_u16le__no_bounds_check(
26124
0
        d + (0 * 2), wuffs_base__peek_u16le__no_bounds_check(
26125
0
                         dst_palette_ptr + ((size_t)s[0] * 4)));
26126
26127
0
    s += 1 * 1;
26128
0
    d += 1 * 2;
26129
0
    n -= 1;
26130
0
  }
26131
26132
0
  return len;
26133
0
}
26134
26135
static uint64_t  //
26136
wuffs_private_impl__swizzle_bgr_565__index_bgra_nonpremul__src_over(
26137
    uint8_t* dst_ptr,
26138
    size_t dst_len,
26139
    uint8_t* dst_palette_ptr,
26140
    size_t dst_palette_len,
26141
    const uint8_t* src_ptr,
26142
0
    size_t src_len) {
26143
0
  if (dst_palette_len !=
26144
0
      WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
26145
0
    return 0;
26146
0
  }
26147
0
  size_t dst_len2 = dst_len / 2;
26148
0
  size_t len = (dst_len2 < src_len) ? dst_len2 : src_len;
26149
0
  uint8_t* d = dst_ptr;
26150
0
  const uint8_t* s = src_ptr;
26151
0
  size_t n = len;
26152
26153
  // TODO: unroll.
26154
26155
0
  while (n >= 1) {
26156
0
    uint32_t d0 = wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul(
26157
0
        wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2)));
26158
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
26159
0
                                                          ((size_t)s[0] * 4));
26160
0
    wuffs_base__poke_u16le__no_bounds_check(
26161
0
        d + (0 * 2),
26162
0
        wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(
26163
0
            wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0)));
26164
26165
0
    s += 1 * 1;
26166
0
    d += 1 * 2;
26167
0
    n -= 1;
26168
0
  }
26169
26170
0
  return len;
26171
0
}
26172
26173
static uint64_t  //
26174
wuffs_private_impl__swizzle_bgr_565__index_binary_alpha__src_over(
26175
    uint8_t* dst_ptr,
26176
    size_t dst_len,
26177
    uint8_t* dst_palette_ptr,
26178
    size_t dst_palette_len,
26179
    const uint8_t* src_ptr,
26180
0
    size_t src_len) {
26181
0
  if (dst_palette_len !=
26182
0
      WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
26183
0
    return 0;
26184
0
  }
26185
0
  size_t dst_len2 = dst_len / 2;
26186
0
  size_t len = (dst_len2 < src_len) ? dst_len2 : src_len;
26187
0
  uint8_t* d = dst_ptr;
26188
0
  const uint8_t* s = src_ptr;
26189
0
  size_t n = len;
26190
26191
  // TODO: unroll.
26192
26193
0
  while (n >= 1) {
26194
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
26195
0
                                                          ((size_t)s[0] * 4));
26196
0
    if (s0) {
26197
0
      wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)s0);
26198
0
    }
26199
26200
0
    s += 1 * 1;
26201
0
    d += 1 * 2;
26202
0
    n -= 1;
26203
0
  }
26204
26205
0
  return len;
26206
0
}
26207
26208
// --------
26209
26210
static uint64_t  //
26211
wuffs_private_impl__swizzle_bgr__bgr_565(uint8_t* dst_ptr,
26212
                                         size_t dst_len,
26213
                                         uint8_t* dst_palette_ptr,
26214
                                         size_t dst_palette_len,
26215
                                         const uint8_t* src_ptr,
26216
0
                                         size_t src_len) {
26217
0
  size_t dst_len3 = dst_len / 3;
26218
0
  size_t src_len2 = src_len / 2;
26219
0
  size_t len = (dst_len3 < src_len2) ? dst_len3 : src_len2;
26220
0
  uint8_t* d = dst_ptr;
26221
0
  const uint8_t* s = src_ptr;
26222
0
  size_t n = len;
26223
26224
  // TODO: unroll.
26225
26226
0
  while (n >= 1) {
26227
0
    uint32_t s0 = wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul(
26228
0
        wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2)));
26229
0
    wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0);
26230
26231
0
    s += 1 * 2;
26232
0
    d += 1 * 3;
26233
0
    n -= 1;
26234
0
  }
26235
26236
0
  return len;
26237
0
}
26238
26239
static uint64_t  //
26240
wuffs_private_impl__swizzle_bgr__bgra_nonpremul__src(uint8_t* dst_ptr,
26241
                                                     size_t dst_len,
26242
                                                     uint8_t* dst_palette_ptr,
26243
                                                     size_t dst_palette_len,
26244
                                                     const uint8_t* src_ptr,
26245
0
                                                     size_t src_len) {
26246
0
  size_t dst_len3 = dst_len / 3;
26247
0
  size_t src_len4 = src_len / 4;
26248
0
  size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4;
26249
0
  uint8_t* d = dst_ptr;
26250
0
  const uint8_t* s = src_ptr;
26251
0
  size_t n = len;
26252
26253
  // TODO: unroll.
26254
26255
0
  while (n >= 1) {
26256
0
    uint32_t s0 =
26257
0
        wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(
26258
0
            wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
26259
0
    wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0);
26260
26261
0
    s += 1 * 4;
26262
0
    d += 1 * 3;
26263
0
    n -= 1;
26264
0
  }
26265
26266
0
  return len;
26267
0
}
26268
26269
static uint64_t  //
26270
wuffs_private_impl__swizzle_bgr__bgra_nonpremul_4x16le__src(
26271
    uint8_t* dst_ptr,
26272
    size_t dst_len,
26273
    uint8_t* dst_palette_ptr,
26274
    size_t dst_palette_len,
26275
    const uint8_t* src_ptr,
26276
0
    size_t src_len) {
26277
0
  size_t dst_len3 = dst_len / 3;
26278
0
  size_t src_len8 = src_len / 8;
26279
0
  size_t len = (dst_len3 < src_len8) ? dst_len3 : src_len8;
26280
0
  uint8_t* d = dst_ptr;
26281
0
  const uint8_t* s = src_ptr;
26282
0
  size_t n = len;
26283
26284
  // TODO: unroll.
26285
26286
0
  while (n >= 1) {
26287
0
    uint32_t s0 =
26288
0
        wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul(
26289
0
            wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)));
26290
0
    wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0);
26291
26292
0
    s += 1 * 8;
26293
0
    d += 1 * 3;
26294
0
    n -= 1;
26295
0
  }
26296
26297
0
  return len;
26298
0
}
26299
26300
static uint64_t  //
26301
wuffs_private_impl__swizzle_bgr__bgra_nonpremul__src_over(
26302
    uint8_t* dst_ptr,
26303
    size_t dst_len,
26304
    uint8_t* dst_palette_ptr,
26305
    size_t dst_palette_len,
26306
    const uint8_t* src_ptr,
26307
0
    size_t src_len) {
26308
0
  size_t dst_len3 = dst_len / 3;
26309
0
  size_t src_len4 = src_len / 4;
26310
0
  size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4;
26311
0
  uint8_t* d = dst_ptr;
26312
0
  const uint8_t* s = src_ptr;
26313
0
  size_t n = len;
26314
26315
  // TODO: unroll.
26316
26317
0
  while (n >= 1) {
26318
    // Extract 16-bit color components.
26319
0
    uint32_t dr = 0x101 * ((uint32_t)d[2]);
26320
0
    uint32_t dg = 0x101 * ((uint32_t)d[1]);
26321
0
    uint32_t db = 0x101 * ((uint32_t)d[0]);
26322
0
    uint32_t sa = 0x101 * ((uint32_t)s[3]);
26323
0
    uint32_t sr = 0x101 * ((uint32_t)s[2]);
26324
0
    uint32_t sg = 0x101 * ((uint32_t)s[1]);
26325
0
    uint32_t sb = 0x101 * ((uint32_t)s[0]);
26326
26327
    // Calculate the inverse of the src-alpha: how much of the dst to keep.
26328
0
    uint32_t ia = 0xFFFF - sa;
26329
26330
    // Composite src (nonpremul) over dst (premul).
26331
0
    dr = ((sr * sa) + (dr * ia)) / 0xFFFF;
26332
0
    dg = ((sg * sa) + (dg * ia)) / 0xFFFF;
26333
0
    db = ((sb * sa) + (db * ia)) / 0xFFFF;
26334
26335
    // Convert from 16-bit color to 8-bit color.
26336
0
    d[0] = (uint8_t)(db >> 8);
26337
0
    d[1] = (uint8_t)(dg >> 8);
26338
0
    d[2] = (uint8_t)(dr >> 8);
26339
26340
0
    s += 1 * 4;
26341
0
    d += 1 * 3;
26342
0
    n -= 1;
26343
0
  }
26344
26345
0
  return len;
26346
0
}
26347
26348
static uint64_t  //
26349
wuffs_private_impl__swizzle_bgr__bgra_nonpremul_4x16le__src_over(
26350
    uint8_t* dst_ptr,
26351
    size_t dst_len,
26352
    uint8_t* dst_palette_ptr,
26353
    size_t dst_palette_len,
26354
    const uint8_t* src_ptr,
26355
0
    size_t src_len) {
26356
0
  size_t dst_len3 = dst_len / 3;
26357
0
  size_t src_len8 = src_len / 8;
26358
0
  size_t len = (dst_len3 < src_len8) ? dst_len3 : src_len8;
26359
0
  uint8_t* d = dst_ptr;
26360
0
  const uint8_t* s = src_ptr;
26361
0
  size_t n = len;
26362
26363
  // TODO: unroll.
26364
26365
0
  while (n >= 1) {
26366
    // Extract 16-bit color components.
26367
0
    uint32_t dr = 0x101 * ((uint32_t)d[2]);
26368
0
    uint32_t dg = 0x101 * ((uint32_t)d[1]);
26369
0
    uint32_t db = 0x101 * ((uint32_t)d[0]);
26370
0
    uint32_t sa = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 6));
26371
0
    uint32_t sr = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 4));
26372
0
    uint32_t sg = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 2));
26373
0
    uint32_t sb = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 0));
26374
26375
    // Calculate the inverse of the src-alpha: how much of the dst to keep.
26376
0
    uint32_t ia = 0xFFFF - sa;
26377
26378
    // Composite src (nonpremul) over dst (premul).
26379
0
    dr = ((sr * sa) + (dr * ia)) / 0xFFFF;
26380
0
    dg = ((sg * sa) + (dg * ia)) / 0xFFFF;
26381
0
    db = ((sb * sa) + (db * ia)) / 0xFFFF;
26382
26383
    // Convert from 16-bit color to 8-bit color.
26384
0
    d[0] = (uint8_t)(db >> 8);
26385
0
    d[1] = (uint8_t)(dg >> 8);
26386
0
    d[2] = (uint8_t)(dr >> 8);
26387
26388
0
    s += 1 * 8;
26389
0
    d += 1 * 3;
26390
0
    n -= 1;
26391
0
  }
26392
26393
0
  return len;
26394
0
}
26395
26396
static uint64_t  //
26397
wuffs_private_impl__swizzle_bgr__bgra_premul__src(uint8_t* dst_ptr,
26398
                                                  size_t dst_len,
26399
                                                  uint8_t* dst_palette_ptr,
26400
                                                  size_t dst_palette_len,
26401
                                                  const uint8_t* src_ptr,
26402
0
                                                  size_t src_len) {
26403
0
  size_t dst_len3 = dst_len / 3;
26404
0
  size_t src_len4 = src_len / 4;
26405
0
  size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4;
26406
0
  uint8_t* d = dst_ptr;
26407
0
  const uint8_t* s = src_ptr;
26408
0
  size_t n = len;
26409
26410
0
  while (n >= 1) {
26411
0
    uint8_t s0 = s[0];
26412
0
    uint8_t s1 = s[1];
26413
0
    uint8_t s2 = s[2];
26414
0
    d[0] = s0;
26415
0
    d[1] = s1;
26416
0
    d[2] = s2;
26417
26418
0
    s += 1 * 4;
26419
0
    d += 1 * 3;
26420
0
    n -= 1;
26421
0
  }
26422
26423
0
  return len;
26424
0
}
26425
26426
static uint64_t  //
26427
wuffs_private_impl__swizzle_bgr__bgra_premul_4x16le__src(
26428
    uint8_t* dst_ptr,
26429
    size_t dst_len,
26430
    uint8_t* dst_palette_ptr,
26431
    size_t dst_palette_len,
26432
    const uint8_t* src_ptr,
26433
0
    size_t src_len) {
26434
0
  size_t dst_len3 = dst_len / 3;
26435
0
  size_t src_len8 = src_len / 8;
26436
0
  size_t len = (dst_len3 < src_len8) ? dst_len3 : src_len8;
26437
0
  uint8_t* d = dst_ptr;
26438
0
  const uint8_t* s = src_ptr;
26439
0
  size_t n = len;
26440
26441
  // TODO: unroll.
26442
26443
0
  while (n >= 1) {
26444
0
    uint32_t s0 = wuffs_base__color_u64__as__color_u32(
26445
0
        wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)));
26446
0
    wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0);
26447
26448
0
    s += 1 * 8;
26449
0
    d += 1 * 3;
26450
0
    n -= 1;
26451
0
  }
26452
26453
0
  return len;
26454
0
}
26455
26456
static uint64_t  //
26457
wuffs_private_impl__swizzle_bgr__bgra_premul__src_over(uint8_t* dst_ptr,
26458
                                                       size_t dst_len,
26459
                                                       uint8_t* dst_palette_ptr,
26460
                                                       size_t dst_palette_len,
26461
                                                       const uint8_t* src_ptr,
26462
0
                                                       size_t src_len) {
26463
0
  size_t dst_len3 = dst_len / 3;
26464
0
  size_t src_len4 = src_len / 4;
26465
0
  size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4;
26466
0
  uint8_t* d = dst_ptr;
26467
0
  const uint8_t* s = src_ptr;
26468
0
  size_t n = len;
26469
26470
0
  while (n >= 1) {
26471
    // Extract 16-bit color components.
26472
0
    uint32_t dr = 0x101 * ((uint32_t)d[2]);
26473
0
    uint32_t dg = 0x101 * ((uint32_t)d[1]);
26474
0
    uint32_t db = 0x101 * ((uint32_t)d[0]);
26475
0
    uint32_t sa = 0x101 * ((uint32_t)s[3]);
26476
0
    uint32_t sr = 0x101 * ((uint32_t)s[2]);
26477
0
    uint32_t sg = 0x101 * ((uint32_t)s[1]);
26478
0
    uint32_t sb = 0x101 * ((uint32_t)s[0]);
26479
26480
    // Calculate the inverse of the src-alpha: how much of the dst to keep.
26481
0
    uint32_t ia = 0xFFFF - sa;
26482
26483
    // Composite src (premul) over dst (premul).
26484
0
    dr = sr + ((dr * ia) / 0xFFFF);
26485
0
    dg = sg + ((dg * ia) / 0xFFFF);
26486
0
    db = sb + ((db * ia) / 0xFFFF);
26487
26488
    // Convert from 16-bit color to 8-bit color.
26489
0
    d[0] = (uint8_t)(db >> 8);
26490
0
    d[1] = (uint8_t)(dg >> 8);
26491
0
    d[2] = (uint8_t)(dr >> 8);
26492
26493
0
    s += 1 * 4;
26494
0
    d += 1 * 3;
26495
0
    n -= 1;
26496
0
  }
26497
26498
0
  return len;
26499
0
}
26500
26501
static uint64_t  //
26502
wuffs_private_impl__swizzle_bgr__bgra_premul_4x16le__src_over(
26503
    uint8_t* dst_ptr,
26504
    size_t dst_len,
26505
    uint8_t* dst_palette_ptr,
26506
    size_t dst_palette_len,
26507
    const uint8_t* src_ptr,
26508
0
    size_t src_len) {
26509
0
  size_t dst_len3 = dst_len / 3;
26510
0
  size_t src_len8 = src_len / 8;
26511
0
  size_t len = (dst_len3 < src_len8) ? dst_len3 : src_len8;
26512
0
  uint8_t* d = dst_ptr;
26513
0
  const uint8_t* s = src_ptr;
26514
0
  size_t n = len;
26515
26516
  // TODO: unroll.
26517
26518
0
  while (n >= 1) {
26519
    // Extract 16-bit color components.
26520
0
    uint32_t dr = 0x101 * ((uint32_t)d[2]);
26521
0
    uint32_t dg = 0x101 * ((uint32_t)d[1]);
26522
0
    uint32_t db = 0x101 * ((uint32_t)d[0]);
26523
0
    uint32_t sa = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 6));
26524
0
    uint32_t sr = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 4));
26525
0
    uint32_t sg = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 2));
26526
0
    uint32_t sb = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 0));
26527
26528
    // Calculate the inverse of the src-alpha: how much of the dst to keep.
26529
0
    uint32_t ia = 0xFFFF - sa;
26530
26531
    // Composite src (premul) over dst (premul).
26532
0
    dr = sr + ((dr * ia) / 0xFFFF);
26533
0
    dg = sg + ((dg * ia) / 0xFFFF);
26534
0
    db = sb + ((db * ia) / 0xFFFF);
26535
26536
    // Convert from 16-bit color to 8-bit color.
26537
0
    d[0] = (uint8_t)(db >> 8);
26538
0
    d[1] = (uint8_t)(dg >> 8);
26539
0
    d[2] = (uint8_t)(dr >> 8);
26540
26541
0
    s += 1 * 8;
26542
0
    d += 1 * 3;
26543
0
    n -= 1;
26544
0
  }
26545
26546
0
  return len;
26547
0
}
26548
26549
static uint64_t  //
26550
wuffs_private_impl__swizzle_bgr__rgba_nonpremul__src(uint8_t* dst_ptr,
26551
                                                     size_t dst_len,
26552
                                                     uint8_t* dst_palette_ptr,
26553
                                                     size_t dst_palette_len,
26554
                                                     const uint8_t* src_ptr,
26555
0
                                                     size_t src_len) {
26556
0
  size_t dst_len3 = dst_len / 3;
26557
0
  size_t src_len4 = src_len / 4;
26558
0
  size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4;
26559
0
  uint8_t* d = dst_ptr;
26560
0
  const uint8_t* s = src_ptr;
26561
0
  size_t n = len;
26562
26563
  // TODO: unroll.
26564
26565
0
  while (n >= 1) {
26566
0
    uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr(
26567
0
        wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(
26568
0
            wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))));
26569
0
    wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0);
26570
26571
0
    s += 1 * 4;
26572
0
    d += 1 * 3;
26573
0
    n -= 1;
26574
0
  }
26575
26576
0
  return len;
26577
0
}
26578
26579
static uint64_t  //
26580
wuffs_private_impl__swizzle_bgr__rgba_nonpremul_4x16le__src(
26581
    uint8_t* dst_ptr,
26582
    size_t dst_len,
26583
    uint8_t* dst_palette_ptr,
26584
    size_t dst_palette_len,
26585
    const uint8_t* src_ptr,
26586
0
    size_t src_len) {
26587
0
  size_t dst_len3 = dst_len / 3;
26588
0
  size_t src_len8 = src_len / 8;
26589
0
  size_t len = (dst_len3 < src_len8) ? dst_len3 : src_len8;
26590
0
  uint8_t* d = dst_ptr;
26591
0
  const uint8_t* s = src_ptr;
26592
0
  size_t n = len;
26593
26594
  // TODO: unroll.
26595
26596
0
  while (n >= 1) {
26597
0
    uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr(
26598
0
        wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul(
26599
0
            wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8))));
26600
0
    wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0);
26601
26602
0
    s += 1 * 8;
26603
0
    d += 1 * 3;
26604
0
    n -= 1;
26605
0
  }
26606
26607
0
  return len;
26608
0
}
26609
26610
static uint64_t  //
26611
wuffs_private_impl__swizzle_bgr__rgba_nonpremul__src_over(
26612
    uint8_t* dst_ptr,
26613
    size_t dst_len,
26614
    uint8_t* dst_palette_ptr,
26615
    size_t dst_palette_len,
26616
    const uint8_t* src_ptr,
26617
0
    size_t src_len) {
26618
0
  size_t dst_len3 = dst_len / 3;
26619
0
  size_t src_len4 = src_len / 4;
26620
0
  size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4;
26621
0
  uint8_t* d = dst_ptr;
26622
0
  const uint8_t* s = src_ptr;
26623
0
  size_t n = len;
26624
26625
  // TODO: unroll.
26626
26627
0
  while (n >= 1) {
26628
    // Extract 16-bit color components.
26629
0
    uint32_t dr = 0x101 * ((uint32_t)d[2]);
26630
0
    uint32_t dg = 0x101 * ((uint32_t)d[1]);
26631
0
    uint32_t db = 0x101 * ((uint32_t)d[0]);
26632
0
    uint32_t sa = 0x101 * ((uint32_t)s[3]);
26633
0
    uint32_t sb = 0x101 * ((uint32_t)s[2]);
26634
0
    uint32_t sg = 0x101 * ((uint32_t)s[1]);
26635
0
    uint32_t sr = 0x101 * ((uint32_t)s[0]);
26636
26637
    // Calculate the inverse of the src-alpha: how much of the dst to keep.
26638
0
    uint32_t ia = 0xFFFF - sa;
26639
26640
    // Composite src (nonpremul) over dst (premul).
26641
0
    dr = ((sr * sa) + (dr * ia)) / 0xFFFF;
26642
0
    dg = ((sg * sa) + (dg * ia)) / 0xFFFF;
26643
0
    db = ((sb * sa) + (db * ia)) / 0xFFFF;
26644
26645
    // Convert from 16-bit color to 8-bit color.
26646
0
    d[0] = (uint8_t)(db >> 8);
26647
0
    d[1] = (uint8_t)(dg >> 8);
26648
0
    d[2] = (uint8_t)(dr >> 8);
26649
26650
0
    s += 1 * 4;
26651
0
    d += 1 * 3;
26652
0
    n -= 1;
26653
0
  }
26654
26655
0
  return len;
26656
0
}
26657
26658
static uint64_t  //
26659
wuffs_private_impl__swizzle_bgr__rgba_nonpremul_4x16le__src_over(
26660
    uint8_t* dst_ptr,
26661
    size_t dst_len,
26662
    uint8_t* dst_palette_ptr,
26663
    size_t dst_palette_len,
26664
    const uint8_t* src_ptr,
26665
0
    size_t src_len) {
26666
0
  size_t dst_len3 = dst_len / 3;
26667
0
  size_t src_len8 = src_len / 8;
26668
0
  size_t len = (dst_len3 < src_len8) ? dst_len3 : src_len8;
26669
0
  uint8_t* d = dst_ptr;
26670
0
  const uint8_t* s = src_ptr;
26671
0
  size_t n = len;
26672
26673
  // TODO: unroll.
26674
26675
0
  while (n >= 1) {
26676
    // Extract 16-bit color components.
26677
0
    uint32_t dr = 0x101 * ((uint32_t)d[2]);
26678
0
    uint32_t dg = 0x101 * ((uint32_t)d[1]);
26679
0
    uint32_t db = 0x101 * ((uint32_t)d[0]);
26680
0
    uint32_t sa = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 6));
26681
0
    uint32_t sb = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 4));
26682
0
    uint32_t sg = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 2));
26683
0
    uint32_t sr = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 0));
26684
26685
    // Calculate the inverse of the src-alpha: how much of the dst to keep.
26686
0
    uint32_t ia = 0xFFFF - sa;
26687
26688
    // Composite src (nonpremul) over dst (premul).
26689
0
    dr = ((sr * sa) + (dr * ia)) / 0xFFFF;
26690
0
    dg = ((sg * sa) + (dg * ia)) / 0xFFFF;
26691
0
    db = ((sb * sa) + (db * ia)) / 0xFFFF;
26692
26693
    // Convert from 16-bit color to 8-bit color.
26694
0
    d[0] = (uint8_t)(db >> 8);
26695
0
    d[1] = (uint8_t)(dg >> 8);
26696
0
    d[2] = (uint8_t)(dr >> 8);
26697
26698
0
    s += 1 * 8;
26699
0
    d += 1 * 3;
26700
0
    n -= 1;
26701
0
  }
26702
26703
0
  return len;
26704
0
}
26705
26706
static uint64_t  //
26707
wuffs_private_impl__swizzle_bgr__rgba_premul__src(uint8_t* dst_ptr,
26708
                                                  size_t dst_len,
26709
                                                  uint8_t* dst_palette_ptr,
26710
                                                  size_t dst_palette_len,
26711
                                                  const uint8_t* src_ptr,
26712
0
                                                  size_t src_len) {
26713
0
  size_t dst_len3 = dst_len / 3;
26714
0
  size_t src_len4 = src_len / 4;
26715
0
  size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4;
26716
0
  uint8_t* d = dst_ptr;
26717
0
  const uint8_t* s = src_ptr;
26718
0
  size_t n = len;
26719
26720
0
  while (n >= 1) {
26721
0
    uint8_t s0 = s[0];
26722
0
    uint8_t s1 = s[1];
26723
0
    uint8_t s2 = s[2];
26724
0
    d[0] = s2;
26725
0
    d[1] = s1;
26726
0
    d[2] = s0;
26727
26728
0
    s += 1 * 4;
26729
0
    d += 1 * 3;
26730
0
    n -= 1;
26731
0
  }
26732
26733
0
  return len;
26734
0
}
26735
26736
static uint64_t  //
26737
wuffs_private_impl__swizzle_bgr__rgba_premul_4x16le__src(
26738
    uint8_t* dst_ptr,
26739
    size_t dst_len,
26740
    uint8_t* dst_palette_ptr,
26741
    size_t dst_palette_len,
26742
    const uint8_t* src_ptr,
26743
0
    size_t src_len) {
26744
0
  size_t dst_len3 = dst_len / 3;
26745
0
  size_t src_len8 = src_len / 8;
26746
0
  size_t len = (dst_len3 < src_len8) ? dst_len3 : src_len8;
26747
0
  uint8_t* d = dst_ptr;
26748
0
  const uint8_t* s = src_ptr;
26749
0
  size_t n = len;
26750
26751
  // TODO: unroll.
26752
26753
0
  while (n >= 1) {
26754
0
    uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr(
26755
0
        wuffs_base__color_u64__as__color_u32(
26756
0
            wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8))));
26757
0
    wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0);
26758
26759
0
    s += 1 * 8;
26760
0
    d += 1 * 3;
26761
0
    n -= 1;
26762
0
  }
26763
26764
0
  return len;
26765
0
}
26766
26767
static uint64_t  //
26768
wuffs_private_impl__swizzle_bgr__rgba_premul__src_over(uint8_t* dst_ptr,
26769
                                                       size_t dst_len,
26770
                                                       uint8_t* dst_palette_ptr,
26771
                                                       size_t dst_palette_len,
26772
                                                       const uint8_t* src_ptr,
26773
0
                                                       size_t src_len) {
26774
0
  size_t dst_len3 = dst_len / 3;
26775
0
  size_t src_len4 = src_len / 4;
26776
0
  size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4;
26777
0
  uint8_t* d = dst_ptr;
26778
0
  const uint8_t* s = src_ptr;
26779
0
  size_t n = len;
26780
26781
0
  while (n >= 1) {
26782
    // Extract 16-bit color components.
26783
0
    uint32_t dr = 0x101 * ((uint32_t)d[2]);
26784
0
    uint32_t dg = 0x101 * ((uint32_t)d[1]);
26785
0
    uint32_t db = 0x101 * ((uint32_t)d[0]);
26786
0
    uint32_t sa = 0x101 * ((uint32_t)s[3]);
26787
0
    uint32_t sb = 0x101 * ((uint32_t)s[2]);
26788
0
    uint32_t sg = 0x101 * ((uint32_t)s[1]);
26789
0
    uint32_t sr = 0x101 * ((uint32_t)s[0]);
26790
26791
    // Calculate the inverse of the src-alpha: how much of the dst to keep.
26792
0
    uint32_t ia = 0xFFFF - sa;
26793
26794
    // Composite src (premul) over dst (premul).
26795
0
    dr = sr + ((dr * ia) / 0xFFFF);
26796
0
    dg = sg + ((dg * ia) / 0xFFFF);
26797
0
    db = sb + ((db * ia) / 0xFFFF);
26798
26799
    // Convert from 16-bit color to 8-bit color.
26800
0
    d[0] = (uint8_t)(db >> 8);
26801
0
    d[1] = (uint8_t)(dg >> 8);
26802
0
    d[2] = (uint8_t)(dr >> 8);
26803
26804
0
    s += 1 * 4;
26805
0
    d += 1 * 3;
26806
0
    n -= 1;
26807
0
  }
26808
26809
0
  return len;
26810
0
}
26811
26812
static uint64_t  //
26813
wuffs_private_impl__swizzle_bgr__rgba_premul_4x16le__src_over(
26814
    uint8_t* dst_ptr,
26815
    size_t dst_len,
26816
    uint8_t* dst_palette_ptr,
26817
    size_t dst_palette_len,
26818
    const uint8_t* src_ptr,
26819
0
    size_t src_len) {
26820
0
  size_t dst_len3 = dst_len / 3;
26821
0
  size_t src_len8 = src_len / 8;
26822
0
  size_t len = (dst_len3 < src_len8) ? dst_len3 : src_len8;
26823
0
  uint8_t* d = dst_ptr;
26824
0
  const uint8_t* s = src_ptr;
26825
0
  size_t n = len;
26826
26827
  // TODO: unroll.
26828
26829
0
  while (n >= 1) {
26830
    // Extract 16-bit color components.
26831
0
    uint32_t dr = 0x101 * ((uint32_t)d[2]);
26832
0
    uint32_t dg = 0x101 * ((uint32_t)d[1]);
26833
0
    uint32_t db = 0x101 * ((uint32_t)d[0]);
26834
0
    uint32_t sa = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 6));
26835
0
    uint32_t sb = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 4));
26836
0
    uint32_t sg = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 2));
26837
0
    uint32_t sr = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 0));
26838
26839
    // Calculate the inverse of the src-alpha: how much of the dst to keep.
26840
0
    uint32_t ia = 0xFFFF - sa;
26841
26842
    // Composite src (premul) over dst (premul).
26843
0
    dr = sr + ((dr * ia) / 0xFFFF);
26844
0
    dg = sg + ((dg * ia) / 0xFFFF);
26845
0
    db = sb + ((db * ia) / 0xFFFF);
26846
26847
    // Convert from 16-bit color to 8-bit color.
26848
0
    d[0] = (uint8_t)(db >> 8);
26849
0
    d[1] = (uint8_t)(dg >> 8);
26850
0
    d[2] = (uint8_t)(dr >> 8);
26851
26852
0
    s += 1 * 8;
26853
0
    d += 1 * 3;
26854
0
    n -= 1;
26855
0
  }
26856
26857
0
  return len;
26858
0
}
26859
26860
static uint64_t  //
26861
wuffs_private_impl__swizzle_bgr__rgbx(uint8_t* dst_ptr,
26862
                                      size_t dst_len,
26863
                                      uint8_t* dst_palette_ptr,
26864
                                      size_t dst_palette_len,
26865
                                      const uint8_t* src_ptr,
26866
0
                                      size_t src_len) {
26867
0
  size_t dst_len3 = dst_len / 3;
26868
0
  size_t src_len4 = src_len / 4;
26869
0
  size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4;
26870
0
  uint8_t* d = dst_ptr;
26871
0
  const uint8_t* s = src_ptr;
26872
0
  size_t n = len;
26873
26874
  // TODO: unroll.
26875
26876
0
  while (n >= 1) {
26877
0
    uint8_t b0 = s[0];
26878
0
    uint8_t b1 = s[1];
26879
0
    uint8_t b2 = s[2];
26880
0
    d[0] = b2;
26881
0
    d[1] = b1;
26882
0
    d[2] = b0;
26883
26884
0
    s += 1 * 4;
26885
0
    d += 1 * 3;
26886
0
    n -= 1;
26887
0
  }
26888
26889
0
  return len;
26890
0
}
26891
26892
// --------
26893
26894
static uint64_t  //
26895
wuffs_private_impl__swizzle_bgra_nonpremul__bgra_nonpremul__src_over(
26896
    uint8_t* dst_ptr,
26897
    size_t dst_len,
26898
    uint8_t* dst_palette_ptr,
26899
    size_t dst_palette_len,
26900
    const uint8_t* src_ptr,
26901
0
    size_t src_len) {
26902
0
  size_t dst_len4 = dst_len / 4;
26903
0
  size_t src_len4 = src_len / 4;
26904
0
  size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
26905
0
  uint8_t* d = dst_ptr;
26906
0
  const uint8_t* s = src_ptr;
26907
0
  size_t n = len;
26908
26909
0
  while (n >= 1) {
26910
0
    uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4));
26911
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4));
26912
0
    wuffs_base__poke_u32le__no_bounds_check(
26913
0
        d + (0 * 4),
26914
0
        wuffs_private_impl__composite_nonpremul_nonpremul_u32_axxx(d0, s0));
26915
26916
0
    s += 1 * 4;
26917
0
    d += 1 * 4;
26918
0
    n -= 1;
26919
0
  }
26920
26921
0
  return len;
26922
0
}
26923
26924
static uint64_t  //
26925
wuffs_private_impl__swizzle_bgra_nonpremul__bgra_nonpremul_4x16le__src(
26926
    uint8_t* dst_ptr,
26927
    size_t dst_len,
26928
    uint8_t* dst_palette_ptr,
26929
    size_t dst_palette_len,
26930
    const uint8_t* src_ptr,
26931
0
    size_t src_len) {
26932
0
  size_t dst_len4 = dst_len / 4;
26933
0
  size_t src_len8 = src_len / 8;
26934
0
  size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8;
26935
0
  uint8_t* d = dst_ptr;
26936
0
  const uint8_t* s = src_ptr;
26937
26938
0
  size_t n = len;
26939
0
  while (n >= 1) {
26940
0
    wuffs_base__poke_u32le__no_bounds_check(
26941
0
        d + (0 * 4), wuffs_base__color_u64__as__color_u32(
26942
0
                         wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8))));
26943
26944
0
    s += 1 * 8;
26945
0
    d += 1 * 4;
26946
0
    n -= 1;
26947
0
  }
26948
0
  return len;
26949
0
}
26950
26951
static uint64_t  //
26952
wuffs_private_impl__swizzle_bgra_nonpremul__bgra_nonpremul_4x16le__src_over(
26953
    uint8_t* dst_ptr,
26954
    size_t dst_len,
26955
    uint8_t* dst_palette_ptr,
26956
    size_t dst_palette_len,
26957
    const uint8_t* src_ptr,
26958
0
    size_t src_len) {
26959
0
  size_t dst_len4 = dst_len / 4;
26960
0
  size_t src_len8 = src_len / 8;
26961
0
  size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8;
26962
0
  uint8_t* d = dst_ptr;
26963
0
  const uint8_t* s = src_ptr;
26964
0
  size_t n = len;
26965
26966
0
  while (n >= 1) {
26967
0
    uint64_t d0 = wuffs_base__color_u32__as__color_u64(
26968
0
        wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)));
26969
0
    uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8));
26970
0
    wuffs_base__poke_u32le__no_bounds_check(
26971
0
        d + (0 * 4),
26972
0
        wuffs_base__color_u64__as__color_u32(
26973
0
            wuffs_private_impl__composite_nonpremul_nonpremul_u64_axxx(d0,
26974
0
                                                                       s0)));
26975
26976
0
    s += 1 * 8;
26977
0
    d += 1 * 4;
26978
0
    n -= 1;
26979
0
  }
26980
26981
0
  return len;
26982
0
}
26983
26984
static uint64_t  //
26985
wuffs_private_impl__swizzle_bgra_nonpremul__bgra_premul__src(
26986
    uint8_t* dst_ptr,
26987
    size_t dst_len,
26988
    uint8_t* dst_palette_ptr,
26989
    size_t dst_palette_len,
26990
    const uint8_t* src_ptr,
26991
0
    size_t src_len) {
26992
0
  size_t dst_len4 = dst_len / 4;
26993
0
  size_t src_len4 = src_len / 4;
26994
0
  size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
26995
0
  uint8_t* d = dst_ptr;
26996
0
  const uint8_t* s = src_ptr;
26997
0
  size_t n = len;
26998
26999
0
  while (n >= 1) {
27000
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4));
27001
0
    wuffs_base__poke_u32le__no_bounds_check(
27002
0
        d + (0 * 4),
27003
0
        wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul(s0));
27004
27005
0
    s += 1 * 4;
27006
0
    d += 1 * 4;
27007
0
    n -= 1;
27008
0
  }
27009
27010
0
  return len;
27011
0
}
27012
27013
static uint64_t  //
27014
wuffs_private_impl__swizzle_bgra_nonpremul__bgra_premul__src_over(
27015
    uint8_t* dst_ptr,
27016
    size_t dst_len,
27017
    uint8_t* dst_palette_ptr,
27018
    size_t dst_palette_len,
27019
    const uint8_t* src_ptr,
27020
0
    size_t src_len) {
27021
0
  size_t dst_len4 = dst_len / 4;
27022
0
  size_t src_len4 = src_len / 4;
27023
0
  size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
27024
0
  uint8_t* d = dst_ptr;
27025
0
  const uint8_t* s = src_ptr;
27026
0
  size_t n = len;
27027
27028
0
  while (n >= 1) {
27029
0
    uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4));
27030
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4));
27031
0
    wuffs_base__poke_u32le__no_bounds_check(
27032
0
        d + (0 * 4),
27033
0
        wuffs_private_impl__composite_nonpremul_premul_u32_axxx(d0, s0));
27034
27035
0
    s += 1 * 4;
27036
0
    d += 1 * 4;
27037
0
    n -= 1;
27038
0
  }
27039
27040
0
  return len;
27041
0
}
27042
27043
static uint64_t  //
27044
wuffs_private_impl__swizzle_bgra_nonpremul__bgra_premul_4x16le__src(
27045
    uint8_t* dst_ptr,
27046
    size_t dst_len,
27047
    uint8_t* dst_palette_ptr,
27048
    size_t dst_palette_len,
27049
    const uint8_t* src_ptr,
27050
0
    size_t src_len) {
27051
0
  size_t dst_len4 = dst_len / 4;
27052
0
  size_t src_len8 = src_len / 8;
27053
0
  size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8;
27054
0
  uint8_t* d = dst_ptr;
27055
0
  const uint8_t* s = src_ptr;
27056
27057
0
  size_t n = len;
27058
0
  while (n >= 1) {
27059
0
    wuffs_base__poke_u32le__no_bounds_check(
27060
0
        d + (0 * 4),
27061
0
        wuffs_base__color_u64__as__color_u32(
27062
0
            wuffs_base__color_u64_argb_premul__as__color_u64_argb_nonpremul(
27063
0
                wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)))));
27064
27065
0
    s += 1 * 8;
27066
0
    d += 1 * 4;
27067
0
    n -= 1;
27068
0
  }
27069
0
  return len;
27070
0
}
27071
27072
static uint64_t  //
27073
wuffs_private_impl__swizzle_bgra_nonpremul__bgra_premul_4x16le__src_over(
27074
    uint8_t* dst_ptr,
27075
    size_t dst_len,
27076
    uint8_t* dst_palette_ptr,
27077
    size_t dst_palette_len,
27078
    const uint8_t* src_ptr,
27079
0
    size_t src_len) {
27080
0
  size_t dst_len4 = dst_len / 4;
27081
0
  size_t src_len8 = src_len / 8;
27082
0
  size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8;
27083
0
  uint8_t* d = dst_ptr;
27084
0
  const uint8_t* s = src_ptr;
27085
0
  size_t n = len;
27086
27087
0
  while (n >= 1) {
27088
0
    uint64_t d0 = wuffs_base__color_u32__as__color_u64(
27089
0
        wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)));
27090
0
    uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8));
27091
0
    wuffs_base__poke_u32le__no_bounds_check(
27092
0
        d + (0 * 4),
27093
0
        wuffs_base__color_u64__as__color_u32(
27094
0
            wuffs_private_impl__composite_nonpremul_premul_u64_axxx(d0, s0)));
27095
27096
0
    s += 1 * 8;
27097
0
    d += 1 * 4;
27098
0
    n -= 1;
27099
0
  }
27100
27101
0
  return len;
27102
0
}
27103
27104
static uint64_t  //
27105
wuffs_private_impl__swizzle_bgra_nonpremul__index_bgra_nonpremul__src_over(
27106
    uint8_t* dst_ptr,
27107
    size_t dst_len,
27108
    uint8_t* dst_palette_ptr,
27109
    size_t dst_palette_len,
27110
    const uint8_t* src_ptr,
27111
0
    size_t src_len) {
27112
0
  if (dst_palette_len !=
27113
0
      WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
27114
0
    return 0;
27115
0
  }
27116
0
  size_t dst_len4 = dst_len / 4;
27117
0
  size_t len = (dst_len4 < src_len) ? dst_len4 : src_len;
27118
0
  uint8_t* d = dst_ptr;
27119
0
  const uint8_t* s = src_ptr;
27120
0
  size_t n = len;
27121
27122
  // TODO: unroll.
27123
27124
0
  while (n >= 1) {
27125
0
    uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4));
27126
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
27127
0
                                                          ((size_t)s[0] * 4));
27128
0
    wuffs_base__poke_u32le__no_bounds_check(
27129
0
        d + (0 * 4),
27130
0
        wuffs_private_impl__composite_nonpremul_nonpremul_u32_axxx(d0, s0));
27131
27132
0
    s += 1 * 1;
27133
0
    d += 1 * 4;
27134
0
    n -= 1;
27135
0
  }
27136
27137
0
  return len;
27138
0
}
27139
27140
static uint64_t  //
27141
wuffs_private_impl__swizzle_bgra_nonpremul__rgba_nonpremul__src_over(
27142
    uint8_t* dst_ptr,
27143
    size_t dst_len,
27144
    uint8_t* dst_palette_ptr,
27145
    size_t dst_palette_len,
27146
    const uint8_t* src_ptr,
27147
0
    size_t src_len) {
27148
0
  size_t dst_len4 = dst_len / 4;
27149
0
  size_t src_len4 = src_len / 4;
27150
0
  size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
27151
0
  uint8_t* d = dst_ptr;
27152
0
  const uint8_t* s = src_ptr;
27153
0
  size_t n = len;
27154
27155
0
  while (n >= 1) {
27156
0
    uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4));
27157
0
    uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr(
27158
0
        wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
27159
0
    wuffs_base__poke_u32le__no_bounds_check(
27160
0
        d + (0 * 4),
27161
0
        wuffs_private_impl__composite_nonpremul_nonpremul_u32_axxx(d0, s0));
27162
27163
0
    s += 1 * 4;
27164
0
    d += 1 * 4;
27165
0
    n -= 1;
27166
0
  }
27167
27168
0
  return len;
27169
0
}
27170
27171
static uint64_t  //
27172
wuffs_private_impl__swizzle_bgra_nonpremul__rgba_premul__src(
27173
    uint8_t* dst_ptr,
27174
    size_t dst_len,
27175
    uint8_t* dst_palette_ptr,
27176
    size_t dst_palette_len,
27177
    const uint8_t* src_ptr,
27178
0
    size_t src_len) {
27179
0
  size_t dst_len4 = dst_len / 4;
27180
0
  size_t src_len4 = src_len / 4;
27181
0
  size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
27182
0
  uint8_t* d = dst_ptr;
27183
0
  const uint8_t* s = src_ptr;
27184
0
  size_t n = len;
27185
27186
0
  while (n >= 1) {
27187
0
    uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr(
27188
0
        wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
27189
0
    wuffs_base__poke_u32le__no_bounds_check(
27190
0
        d + (0 * 4),
27191
0
        wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul(s0));
27192
27193
0
    s += 1 * 4;
27194
0
    d += 1 * 4;
27195
0
    n -= 1;
27196
0
  }
27197
27198
0
  return len;
27199
0
}
27200
27201
static uint64_t  //
27202
wuffs_private_impl__swizzle_bgra_nonpremul__rgba_premul__src_over(
27203
    uint8_t* dst_ptr,
27204
    size_t dst_len,
27205
    uint8_t* dst_palette_ptr,
27206
    size_t dst_palette_len,
27207
    const uint8_t* src_ptr,
27208
0
    size_t src_len) {
27209
0
  size_t dst_len4 = dst_len / 4;
27210
0
  size_t src_len4 = src_len / 4;
27211
0
  size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
27212
0
  uint8_t* d = dst_ptr;
27213
0
  const uint8_t* s = src_ptr;
27214
0
  size_t n = len;
27215
27216
0
  while (n >= 1) {
27217
0
    uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4));
27218
0
    uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr(
27219
0
        wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
27220
0
    wuffs_base__poke_u32le__no_bounds_check(
27221
0
        d + (0 * 4),
27222
0
        wuffs_private_impl__composite_nonpremul_premul_u32_axxx(d0, s0));
27223
27224
0
    s += 1 * 4;
27225
0
    d += 1 * 4;
27226
0
    n -= 1;
27227
0
  }
27228
27229
0
  return len;
27230
0
}
27231
27232
static uint64_t  //
27233
wuffs_private_impl__swizzle_bgra_nonpremul__ya_nonpremul__src(
27234
    uint8_t* dst_ptr,
27235
    size_t dst_len,
27236
    uint8_t* dst_palette_ptr,
27237
    size_t dst_palette_len,
27238
    const uint8_t* src_ptr,
27239
0
    size_t src_len) {
27240
0
  size_t dst_len4 = dst_len / 4;
27241
0
  size_t src_len2 = src_len / 2;
27242
0
  size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2;
27243
0
  uint8_t* d = dst_ptr;
27244
0
  const uint8_t* s = src_ptr;
27245
0
  size_t n = len;
27246
27247
  // TODO: unroll.
27248
27249
0
  while (n >= 1) {
27250
0
    uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101);
27251
0
    wuffs_base__poke_u32le__no_bounds_check(d + (0 * 4), s0);
27252
27253
0
    s += 1 * 2;
27254
0
    d += 1 * 4;
27255
0
    n -= 1;
27256
0
  }
27257
27258
0
  return len;
27259
0
}
27260
27261
static uint64_t  //
27262
wuffs_private_impl__swizzle_bgra_nonpremul__ya_nonpremul__src_over(
27263
    uint8_t* dst_ptr,
27264
    size_t dst_len,
27265
    uint8_t* dst_palette_ptr,
27266
    size_t dst_palette_len,
27267
    const uint8_t* src_ptr,
27268
0
    size_t src_len) {
27269
0
  size_t dst_len4 = dst_len / 4;
27270
0
  size_t src_len2 = src_len / 2;
27271
0
  size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2;
27272
0
  uint8_t* d = dst_ptr;
27273
0
  const uint8_t* s = src_ptr;
27274
0
  size_t n = len;
27275
27276
  // TODO: unroll.
27277
27278
0
  while (n >= 1) {
27279
0
    uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4));
27280
0
    uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101);
27281
0
    wuffs_base__poke_u32le__no_bounds_check(
27282
0
        d + (0 * 4),
27283
0
        wuffs_private_impl__composite_nonpremul_nonpremul_u32_axxx(d0, s0));
27284
27285
0
    s += 1 * 2;
27286
0
    d += 1 * 4;
27287
0
    n -= 1;
27288
0
  }
27289
27290
0
  return len;
27291
0
}
27292
27293
// --------
27294
27295
static uint64_t  //
27296
wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_nonpremul__src(
27297
    uint8_t* dst_ptr,
27298
    size_t dst_len,
27299
    uint8_t* dst_palette_ptr,
27300
    size_t dst_palette_len,
27301
    const uint8_t* src_ptr,
27302
0
    size_t src_len) {
27303
0
  size_t dst_len8 = dst_len / 8;
27304
0
  size_t src_len4 = src_len / 4;
27305
0
  size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4;
27306
0
  uint8_t* d = dst_ptr;
27307
0
  const uint8_t* s = src_ptr;
27308
27309
0
  size_t n = len;
27310
0
  while (n >= 1) {
27311
0
    uint8_t s0 = s[0];
27312
0
    uint8_t s1 = s[1];
27313
0
    uint8_t s2 = s[2];
27314
0
    uint8_t s3 = s[3];
27315
0
    d[0] = s0;
27316
0
    d[1] = s0;
27317
0
    d[2] = s1;
27318
0
    d[3] = s1;
27319
0
    d[4] = s2;
27320
0
    d[5] = s2;
27321
0
    d[6] = s3;
27322
0
    d[7] = s3;
27323
27324
0
    s += 1 * 4;
27325
0
    d += 1 * 8;
27326
0
    n -= 1;
27327
0
  }
27328
0
  return len;
27329
0
}
27330
27331
static uint64_t  //
27332
wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_nonpremul__src_over(
27333
    uint8_t* dst_ptr,
27334
    size_t dst_len,
27335
    uint8_t* dst_palette_ptr,
27336
    size_t dst_palette_len,
27337
    const uint8_t* src_ptr,
27338
0
    size_t src_len) {
27339
0
  size_t dst_len8 = dst_len / 8;
27340
0
  size_t src_len4 = src_len / 4;
27341
0
  size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4;
27342
0
  uint8_t* d = dst_ptr;
27343
0
  const uint8_t* s = src_ptr;
27344
27345
0
  size_t n = len;
27346
0
  while (n >= 1) {
27347
0
    uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8));
27348
0
    uint64_t s0 = wuffs_base__color_u32__as__color_u64(
27349
0
        wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
27350
0
    wuffs_base__poke_u64le__no_bounds_check(
27351
0
        d + (0 * 8),
27352
0
        wuffs_private_impl__composite_nonpremul_nonpremul_u64_axxx(d0, s0));
27353
27354
0
    s += 1 * 4;
27355
0
    d += 1 * 8;
27356
0
    n -= 1;
27357
0
  }
27358
0
  return len;
27359
0
}
27360
27361
static uint64_t  //
27362
wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_nonpremul_4x16le__src_over(
27363
    uint8_t* dst_ptr,
27364
    size_t dst_len,
27365
    uint8_t* dst_palette_ptr,
27366
    size_t dst_palette_len,
27367
    const uint8_t* src_ptr,
27368
0
    size_t src_len) {
27369
0
  size_t dst_len8 = dst_len / 8;
27370
0
  size_t src_len8 = src_len / 8;
27371
0
  size_t len = (dst_len8 < src_len8) ? dst_len8 : src_len8;
27372
0
  uint8_t* d = dst_ptr;
27373
0
  const uint8_t* s = src_ptr;
27374
27375
0
  size_t n = len;
27376
0
  while (n >= 1) {
27377
0
    uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8));
27378
0
    uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8));
27379
0
    wuffs_base__poke_u64le__no_bounds_check(
27380
0
        d + (0 * 8),
27381
0
        wuffs_private_impl__composite_nonpremul_nonpremul_u64_axxx(d0, s0));
27382
27383
0
    s += 1 * 8;
27384
0
    d += 1 * 8;
27385
0
    n -= 1;
27386
0
  }
27387
0
  return len;
27388
0
}
27389
27390
static uint64_t  //
27391
wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_premul__src(
27392
    uint8_t* dst_ptr,
27393
    size_t dst_len,
27394
    uint8_t* dst_palette_ptr,
27395
    size_t dst_palette_len,
27396
    const uint8_t* src_ptr,
27397
0
    size_t src_len) {
27398
0
  size_t dst_len8 = dst_len / 8;
27399
0
  size_t src_len4 = src_len / 4;
27400
0
  size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4;
27401
0
  uint8_t* d = dst_ptr;
27402
0
  const uint8_t* s = src_ptr;
27403
27404
0
  size_t n = len;
27405
0
  while (n >= 1) {
27406
0
    uint64_t s0 = wuffs_base__color_u32__as__color_u64(
27407
0
        wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul(
27408
0
            wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))));
27409
0
    wuffs_base__poke_u64le__no_bounds_check(d + (0 * 8), s0);
27410
27411
0
    s += 1 * 4;
27412
0
    d += 1 * 8;
27413
0
    n -= 1;
27414
0
  }
27415
0
  return len;
27416
0
}
27417
27418
static uint64_t  //
27419
wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_premul__src_over(
27420
    uint8_t* dst_ptr,
27421
    size_t dst_len,
27422
    uint8_t* dst_palette_ptr,
27423
    size_t dst_palette_len,
27424
    const uint8_t* src_ptr,
27425
0
    size_t src_len) {
27426
0
  size_t dst_len8 = dst_len / 8;
27427
0
  size_t src_len4 = src_len / 4;
27428
0
  size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4;
27429
0
  uint8_t* d = dst_ptr;
27430
0
  const uint8_t* s = src_ptr;
27431
27432
0
  size_t n = len;
27433
0
  while (n >= 1) {
27434
0
    uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8));
27435
0
    uint64_t s0 = wuffs_base__color_u32__as__color_u64(
27436
0
        wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
27437
0
    wuffs_base__poke_u64le__no_bounds_check(
27438
0
        d + (0 * 8),
27439
0
        wuffs_private_impl__composite_nonpremul_premul_u64_axxx(d0, s0));
27440
27441
0
    s += 1 * 4;
27442
0
    d += 1 * 8;
27443
0
    n -= 1;
27444
0
  }
27445
0
  return len;
27446
0
}
27447
27448
static uint64_t  //
27449
wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_premul_4x16le__src(
27450
    uint8_t* dst_ptr,
27451
    size_t dst_len,
27452
    uint8_t* dst_palette_ptr,
27453
    size_t dst_palette_len,
27454
    const uint8_t* src_ptr,
27455
0
    size_t src_len) {
27456
0
  size_t dst_len8 = dst_len / 8;
27457
0
  size_t src_len8 = src_len / 8;
27458
0
  size_t len = (dst_len8 < src_len8) ? dst_len8 : src_len8;
27459
0
  uint8_t* d = dst_ptr;
27460
0
  const uint8_t* s = src_ptr;
27461
27462
0
  size_t n = len;
27463
0
  while (n >= 1) {
27464
0
    uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8));
27465
0
    wuffs_base__poke_u64le__no_bounds_check(
27466
0
        d + (0 * 8),
27467
0
        wuffs_base__color_u64_argb_premul__as__color_u64_argb_nonpremul(s0));
27468
27469
0
    s += 1 * 8;
27470
0
    d += 1 * 8;
27471
0
    n -= 1;
27472
0
  }
27473
0
  return len;
27474
0
}
27475
27476
static uint64_t  //
27477
wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_premul_4x16le__src_over(
27478
    uint8_t* dst_ptr,
27479
    size_t dst_len,
27480
    uint8_t* dst_palette_ptr,
27481
    size_t dst_palette_len,
27482
    const uint8_t* src_ptr,
27483
0
    size_t src_len) {
27484
0
  size_t dst_len8 = dst_len / 8;
27485
0
  size_t src_len8 = src_len / 8;
27486
0
  size_t len = (dst_len8 < src_len8) ? dst_len8 : src_len8;
27487
0
  uint8_t* d = dst_ptr;
27488
0
  const uint8_t* s = src_ptr;
27489
27490
0
  size_t n = len;
27491
0
  while (n >= 1) {
27492
0
    uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8));
27493
0
    uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8));
27494
0
    wuffs_base__poke_u64le__no_bounds_check(
27495
0
        d + (0 * 8),
27496
0
        wuffs_private_impl__composite_nonpremul_premul_u64_axxx(d0, s0));
27497
27498
0
    s += 1 * 8;
27499
0
    d += 1 * 8;
27500
0
    n -= 1;
27501
0
  }
27502
0
  return len;
27503
0
}
27504
27505
static uint64_t  //
27506
wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__index_bgra_nonpremul__src_over(
27507
    uint8_t* dst_ptr,
27508
    size_t dst_len,
27509
    uint8_t* dst_palette_ptr,
27510
    size_t dst_palette_len,
27511
    const uint8_t* src_ptr,
27512
0
    size_t src_len) {
27513
0
  if (dst_palette_len !=
27514
0
      WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
27515
0
    return 0;
27516
0
  }
27517
0
  size_t dst_len8 = dst_len / 8;
27518
0
  size_t len = (dst_len8 < src_len) ? dst_len8 : src_len;
27519
0
  uint8_t* d = dst_ptr;
27520
0
  const uint8_t* s = src_ptr;
27521
0
  size_t n = len;
27522
27523
0
  while (n >= 1) {
27524
0
    uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8));
27525
0
    uint64_t s0 = wuffs_base__color_u32__as__color_u64(
27526
0
        wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
27527
0
                                                ((size_t)s[0] * 4)));
27528
0
    wuffs_base__poke_u64le__no_bounds_check(
27529
0
        d + (0 * 8),
27530
0
        wuffs_private_impl__composite_nonpremul_nonpremul_u64_axxx(d0, s0));
27531
27532
0
    s += 1 * 1;
27533
0
    d += 1 * 8;
27534
0
    n -= 1;
27535
0
  }
27536
27537
0
  return len;
27538
0
}
27539
27540
static uint64_t  //
27541
wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__rgba_nonpremul__src(
27542
    uint8_t* dst_ptr,
27543
    size_t dst_len,
27544
    uint8_t* dst_palette_ptr,
27545
    size_t dst_palette_len,
27546
    const uint8_t* src_ptr,
27547
0
    size_t src_len) {
27548
0
  size_t dst_len8 = dst_len / 8;
27549
0
  size_t src_len4 = src_len / 4;
27550
0
  size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4;
27551
0
  uint8_t* d = dst_ptr;
27552
0
  const uint8_t* s = src_ptr;
27553
27554
0
  size_t n = len;
27555
0
  while (n >= 1) {
27556
0
    uint8_t s0 = s[0];
27557
0
    uint8_t s1 = s[1];
27558
0
    uint8_t s2 = s[2];
27559
0
    uint8_t s3 = s[3];
27560
0
    d[0] = s2;
27561
0
    d[1] = s2;
27562
0
    d[2] = s1;
27563
0
    d[3] = s1;
27564
0
    d[4] = s0;
27565
0
    d[5] = s0;
27566
0
    d[6] = s3;
27567
0
    d[7] = s3;
27568
27569
0
    s += 1 * 4;
27570
0
    d += 1 * 8;
27571
0
    n -= 1;
27572
0
  }
27573
0
  return len;
27574
0
}
27575
27576
static uint64_t  //
27577
wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__rgba_nonpremul__src_over(
27578
    uint8_t* dst_ptr,
27579
    size_t dst_len,
27580
    uint8_t* dst_palette_ptr,
27581
    size_t dst_palette_len,
27582
    const uint8_t* src_ptr,
27583
0
    size_t src_len) {
27584
0
  size_t dst_len8 = dst_len / 8;
27585
0
  size_t src_len4 = src_len / 4;
27586
0
  size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4;
27587
0
  uint8_t* d = dst_ptr;
27588
0
  const uint8_t* s = src_ptr;
27589
27590
0
  size_t n = len;
27591
0
  while (n >= 1) {
27592
0
    uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8));
27593
0
    uint64_t s0 = wuffs_base__color_u32__as__color_u64(
27594
0
        wuffs_private_impl__swap_u32_argb_abgr(
27595
0
            wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))));
27596
0
    wuffs_base__poke_u64le__no_bounds_check(
27597
0
        d + (0 * 8),
27598
0
        wuffs_private_impl__composite_nonpremul_nonpremul_u64_axxx(d0, s0));
27599
27600
0
    s += 1 * 4;
27601
0
    d += 1 * 8;
27602
0
    n -= 1;
27603
0
  }
27604
0
  return len;
27605
0
}
27606
27607
static uint64_t  //
27608
wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__rgba_premul__src(
27609
    uint8_t* dst_ptr,
27610
    size_t dst_len,
27611
    uint8_t* dst_palette_ptr,
27612
    size_t dst_palette_len,
27613
    const uint8_t* src_ptr,
27614
0
    size_t src_len) {
27615
0
  size_t dst_len8 = dst_len / 8;
27616
0
  size_t src_len4 = src_len / 4;
27617
0
  size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4;
27618
0
  uint8_t* d = dst_ptr;
27619
0
  const uint8_t* s = src_ptr;
27620
27621
0
  size_t n = len;
27622
0
  while (n >= 1) {
27623
0
    uint64_t s0 = wuffs_base__color_u32__as__color_u64(
27624
0
        wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul(
27625
0
            wuffs_private_impl__swap_u32_argb_abgr(
27626
0
                wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))));
27627
0
    wuffs_base__poke_u64le__no_bounds_check(d + (0 * 8), s0);
27628
27629
0
    s += 1 * 4;
27630
0
    d += 1 * 8;
27631
0
    n -= 1;
27632
0
  }
27633
0
  return len;
27634
0
}
27635
27636
static uint64_t  //
27637
wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__rgba_premul__src_over(
27638
    uint8_t* dst_ptr,
27639
    size_t dst_len,
27640
    uint8_t* dst_palette_ptr,
27641
    size_t dst_palette_len,
27642
    const uint8_t* src_ptr,
27643
0
    size_t src_len) {
27644
0
  size_t dst_len8 = dst_len / 8;
27645
0
  size_t src_len4 = src_len / 4;
27646
0
  size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4;
27647
0
  uint8_t* d = dst_ptr;
27648
0
  const uint8_t* s = src_ptr;
27649
27650
0
  size_t n = len;
27651
0
  while (n >= 1) {
27652
0
    uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8));
27653
0
    uint64_t s0 = wuffs_base__color_u32__as__color_u64(
27654
0
        wuffs_private_impl__swap_u32_argb_abgr(
27655
0
            wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))));
27656
0
    wuffs_base__poke_u64le__no_bounds_check(
27657
0
        d + (0 * 8),
27658
0
        wuffs_private_impl__composite_nonpremul_premul_u64_axxx(d0, s0));
27659
27660
0
    s += 1 * 4;
27661
0
    d += 1 * 8;
27662
0
    n -= 1;
27663
0
  }
27664
0
  return len;
27665
0
}
27666
27667
static uint64_t  //
27668
wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__ya_nonpremul__src(
27669
    uint8_t* dst_ptr,
27670
    size_t dst_len,
27671
    uint8_t* dst_palette_ptr,
27672
    size_t dst_palette_len,
27673
    const uint8_t* src_ptr,
27674
0
    size_t src_len) {
27675
0
  size_t dst_len8 = dst_len / 8;
27676
0
  size_t src_len2 = src_len / 2;
27677
0
  size_t len = (dst_len8 < src_len2) ? dst_len8 : src_len2;
27678
0
  uint8_t* d = dst_ptr;
27679
0
  const uint8_t* s = src_ptr;
27680
27681
0
  size_t n = len;
27682
0
  while (n >= 1) {
27683
0
    uint64_t s0 = ((uint64_t)(s[1]) * 0x0101000000000000) |
27684
0
                  ((uint64_t)(s[0]) * 0x0000010101010101);
27685
0
    wuffs_base__poke_u64le__no_bounds_check(d + (0 * 8), s0);
27686
27687
0
    s += 1 * 2;
27688
0
    d += 1 * 8;
27689
0
    n -= 1;
27690
0
  }
27691
0
  return len;
27692
0
}
27693
27694
static uint64_t  //
27695
wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__ya_nonpremul__src_over(
27696
    uint8_t* dst_ptr,
27697
    size_t dst_len,
27698
    uint8_t* dst_palette_ptr,
27699
    size_t dst_palette_len,
27700
    const uint8_t* src_ptr,
27701
0
    size_t src_len) {
27702
0
  size_t dst_len8 = dst_len / 8;
27703
0
  size_t src_len2 = src_len / 2;
27704
0
  size_t len = (dst_len8 < src_len2) ? dst_len8 : src_len2;
27705
0
  uint8_t* d = dst_ptr;
27706
0
  const uint8_t* s = src_ptr;
27707
27708
0
  size_t n = len;
27709
0
  while (n >= 1) {
27710
0
    uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8));
27711
0
    uint64_t s0 = ((uint64_t)(s[1]) * 0x0101000000000000) |
27712
0
                  ((uint64_t)(s[0]) * 0x0000010101010101);
27713
0
    wuffs_base__poke_u64le__no_bounds_check(
27714
0
        d + (0 * 8),
27715
0
        wuffs_private_impl__composite_nonpremul_nonpremul_u64_axxx(d0, s0));
27716
27717
0
    s += 1 * 2;
27718
0
    d += 1 * 8;
27719
0
    n -= 1;
27720
0
  }
27721
0
  return len;
27722
0
}
27723
27724
// --------
27725
27726
static uint64_t  //
27727
wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul__src(
27728
    uint8_t* dst_ptr,
27729
    size_t dst_len,
27730
    uint8_t* dst_palette_ptr,
27731
    size_t dst_palette_len,
27732
    const uint8_t* src_ptr,
27733
0
    size_t src_len) {
27734
0
  size_t dst_len4 = dst_len / 4;
27735
0
  size_t src_len4 = src_len / 4;
27736
0
  size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
27737
0
  uint8_t* d = dst_ptr;
27738
0
  const uint8_t* s = src_ptr;
27739
0
  size_t n = len;
27740
27741
  // TODO: unroll.
27742
27743
0
  while (n >= 1) {
27744
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4));
27745
0
    wuffs_base__poke_u32le__no_bounds_check(
27746
0
        d + (0 * 4),
27747
0
        wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(s0));
27748
27749
0
    s += 1 * 4;
27750
0
    d += 1 * 4;
27751
0
    n -= 1;
27752
0
  }
27753
27754
0
  return len;
27755
0
}
27756
27757
static uint64_t  //
27758
wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul_4x16le__src(
27759
    uint8_t* dst_ptr,
27760
    size_t dst_len,
27761
    uint8_t* dst_palette_ptr,
27762
    size_t dst_palette_len,
27763
    const uint8_t* src_ptr,
27764
0
    size_t src_len) {
27765
0
  size_t dst_len4 = dst_len / 4;
27766
0
  size_t src_len8 = src_len / 8;
27767
0
  size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8;
27768
0
  uint8_t* d = dst_ptr;
27769
0
  const uint8_t* s = src_ptr;
27770
0
  size_t n = len;
27771
27772
  // TODO: unroll.
27773
27774
0
  while (n >= 1) {
27775
0
    uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8));
27776
0
    wuffs_base__poke_u32le__no_bounds_check(
27777
0
        d + (0 * 4),
27778
0
        wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul(s0));
27779
27780
0
    s += 1 * 8;
27781
0
    d += 1 * 4;
27782
0
    n -= 1;
27783
0
  }
27784
27785
0
  return len;
27786
0
}
27787
27788
static uint64_t  //
27789
wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul__src_over(
27790
    uint8_t* dst_ptr,
27791
    size_t dst_len,
27792
    uint8_t* dst_palette_ptr,
27793
    size_t dst_palette_len,
27794
    const uint8_t* src_ptr,
27795
0
    size_t src_len) {
27796
0
  size_t dst_len4 = dst_len / 4;
27797
0
  size_t src_len4 = src_len / 4;
27798
0
  size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
27799
0
  uint8_t* d = dst_ptr;
27800
0
  const uint8_t* s = src_ptr;
27801
0
  size_t n = len;
27802
27803
  // TODO: unroll.
27804
27805
0
  while (n >= 1) {
27806
0
    uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4));
27807
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4));
27808
0
    wuffs_base__poke_u32le__no_bounds_check(
27809
0
        d + (0 * 4),
27810
0
        wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0));
27811
27812
0
    s += 1 * 4;
27813
0
    d += 1 * 4;
27814
0
    n -= 1;
27815
0
  }
27816
27817
0
  return len;
27818
0
}
27819
27820
static uint64_t  //
27821
wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul_4x16le__src_over(
27822
    uint8_t* dst_ptr,
27823
    size_t dst_len,
27824
    uint8_t* dst_palette_ptr,
27825
    size_t dst_palette_len,
27826
    const uint8_t* src_ptr,
27827
0
    size_t src_len) {
27828
0
  size_t dst_len4 = dst_len / 4;
27829
0
  size_t src_len8 = src_len / 8;
27830
0
  size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8;
27831
0
  uint8_t* d = dst_ptr;
27832
0
  const uint8_t* s = src_ptr;
27833
0
  size_t n = len;
27834
27835
  // TODO: unroll.
27836
27837
0
  while (n >= 1) {
27838
0
    uint64_t d0 = wuffs_base__color_u32__as__color_u64(
27839
0
        wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)));
27840
0
    uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8));
27841
0
    wuffs_base__poke_u32le__no_bounds_check(
27842
0
        d + (0 * 4),
27843
0
        wuffs_base__color_u64__as__color_u32(
27844
0
            wuffs_private_impl__composite_premul_nonpremul_u64_axxx(d0, s0)));
27845
27846
0
    s += 1 * 8;
27847
0
    d += 1 * 4;
27848
0
    n -= 1;
27849
0
  }
27850
27851
0
  return len;
27852
0
}
27853
27854
static uint64_t  //
27855
wuffs_private_impl__swizzle_bgra_premul__bgra_premul_4x16le__src(
27856
    uint8_t* dst_ptr,
27857
    size_t dst_len,
27858
    uint8_t* dst_palette_ptr,
27859
    size_t dst_palette_len,
27860
    const uint8_t* src_ptr,
27861
0
    size_t src_len) {
27862
0
  size_t dst_len4 = dst_len / 4;
27863
0
  size_t src_len8 = src_len / 8;
27864
0
  size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8;
27865
0
  uint8_t* d = dst_ptr;
27866
0
  const uint8_t* s = src_ptr;
27867
0
  size_t n = len;
27868
27869
  // TODO: unroll.
27870
27871
0
  while (n >= 1) {
27872
0
    uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8));
27873
0
    wuffs_base__poke_u32le__no_bounds_check(
27874
0
        d + (0 * 4), wuffs_base__color_u64__as__color_u32(s0));
27875
27876
0
    s += 1 * 8;
27877
0
    d += 1 * 4;
27878
0
    n -= 1;
27879
0
  }
27880
27881
0
  return len;
27882
0
}
27883
27884
static uint64_t  //
27885
wuffs_private_impl__swizzle_bgra_premul__bgra_premul__src_over(
27886
    uint8_t* dst_ptr,
27887
    size_t dst_len,
27888
    uint8_t* dst_palette_ptr,
27889
    size_t dst_palette_len,
27890
    const uint8_t* src_ptr,
27891
0
    size_t src_len) {
27892
0
  size_t dst_len4 = dst_len / 4;
27893
0
  size_t src_len4 = src_len / 4;
27894
0
  size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
27895
0
  uint8_t* d = dst_ptr;
27896
0
  const uint8_t* s = src_ptr;
27897
0
  size_t n = len;
27898
27899
  // TODO: unroll.
27900
27901
0
  while (n >= 1) {
27902
0
    uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4));
27903
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4));
27904
0
    wuffs_base__poke_u32le__no_bounds_check(
27905
0
        d + (0 * 4),
27906
0
        wuffs_private_impl__composite_premul_premul_u32_axxx(d0, s0));
27907
27908
0
    s += 1 * 4;
27909
0
    d += 1 * 4;
27910
0
    n -= 1;
27911
0
  }
27912
27913
0
  return len;
27914
0
}
27915
27916
static uint64_t  //
27917
wuffs_private_impl__swizzle_bgra_premul__bgra_premul_4x16le__src_over(
27918
    uint8_t* dst_ptr,
27919
    size_t dst_len,
27920
    uint8_t* dst_palette_ptr,
27921
    size_t dst_palette_len,
27922
    const uint8_t* src_ptr,
27923
0
    size_t src_len) {
27924
0
  size_t dst_len4 = dst_len / 4;
27925
0
  size_t src_len8 = src_len / 8;
27926
0
  size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8;
27927
0
  uint8_t* d = dst_ptr;
27928
0
  const uint8_t* s = src_ptr;
27929
0
  size_t n = len;
27930
27931
  // TODO: unroll.
27932
27933
0
  while (n >= 1) {
27934
0
    uint64_t d0 = wuffs_base__color_u32__as__color_u64(
27935
0
        wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)));
27936
0
    uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8));
27937
0
    wuffs_base__poke_u32le__no_bounds_check(
27938
0
        d + (0 * 4),
27939
0
        wuffs_base__color_u64__as__color_u32(
27940
0
            wuffs_private_impl__composite_premul_premul_u64_axxx(d0, s0)));
27941
27942
0
    s += 1 * 8;
27943
0
    d += 1 * 4;
27944
0
    n -= 1;
27945
0
  }
27946
27947
0
  return len;
27948
0
}
27949
27950
static uint64_t  //
27951
wuffs_private_impl__swizzle_bgra_premul__index_bgra_nonpremul__src_over(
27952
    uint8_t* dst_ptr,
27953
    size_t dst_len,
27954
    uint8_t* dst_palette_ptr,
27955
    size_t dst_palette_len,
27956
    const uint8_t* src_ptr,
27957
0
    size_t src_len) {
27958
0
  if (dst_palette_len !=
27959
0
      WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
27960
0
    return 0;
27961
0
  }
27962
0
  size_t dst_len4 = dst_len / 4;
27963
0
  size_t len = (dst_len4 < src_len) ? dst_len4 : src_len;
27964
0
  uint8_t* d = dst_ptr;
27965
0
  const uint8_t* s = src_ptr;
27966
0
  size_t n = len;
27967
27968
  // TODO: unroll.
27969
27970
0
  while (n >= 1) {
27971
0
    uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4));
27972
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
27973
0
                                                          ((size_t)s[0] * 4));
27974
0
    wuffs_base__poke_u32le__no_bounds_check(
27975
0
        d + (0 * 4),
27976
0
        wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0));
27977
27978
0
    s += 1 * 1;
27979
0
    d += 1 * 4;
27980
0
    n -= 1;
27981
0
  }
27982
27983
0
  return len;
27984
0
}
27985
27986
static uint64_t  //
27987
wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul__src(
27988
    uint8_t* dst_ptr,
27989
    size_t dst_len,
27990
    uint8_t* dst_palette_ptr,
27991
    size_t dst_palette_len,
27992
    const uint8_t* src_ptr,
27993
0
    size_t src_len) {
27994
0
  size_t dst_len4 = dst_len / 4;
27995
0
  size_t src_len4 = src_len / 4;
27996
0
  size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
27997
0
  uint8_t* d = dst_ptr;
27998
0
  const uint8_t* s = src_ptr;
27999
0
  size_t n = len;
28000
28001
  // TODO: unroll.
28002
28003
0
  while (n >= 1) {
28004
0
    uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr(
28005
0
        wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
28006
0
    wuffs_base__poke_u32le__no_bounds_check(
28007
0
        d + (0 * 4),
28008
0
        wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(s0));
28009
28010
0
    s += 1 * 4;
28011
0
    d += 1 * 4;
28012
0
    n -= 1;
28013
0
  }
28014
28015
0
  return len;
28016
0
}
28017
28018
static uint64_t  //
28019
wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul__src_over(
28020
    uint8_t* dst_ptr,
28021
    size_t dst_len,
28022
    uint8_t* dst_palette_ptr,
28023
    size_t dst_palette_len,
28024
    const uint8_t* src_ptr,
28025
0
    size_t src_len) {
28026
0
  size_t dst_len4 = dst_len / 4;
28027
0
  size_t src_len4 = src_len / 4;
28028
0
  size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
28029
0
  uint8_t* d = dst_ptr;
28030
0
  const uint8_t* s = src_ptr;
28031
0
  size_t n = len;
28032
28033
  // TODO: unroll.
28034
28035
0
  while (n >= 1) {
28036
0
    uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4));
28037
0
    uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr(
28038
0
        wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
28039
0
    wuffs_base__poke_u32le__no_bounds_check(
28040
0
        d + (0 * 4),
28041
0
        wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0));
28042
28043
0
    s += 1 * 4;
28044
0
    d += 1 * 4;
28045
0
    n -= 1;
28046
0
  }
28047
28048
0
  return len;
28049
0
}
28050
28051
static uint64_t  //
28052
wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul_4x16le__src(
28053
    uint8_t* dst_ptr,
28054
    size_t dst_len,
28055
    uint8_t* dst_palette_ptr,
28056
    size_t dst_palette_len,
28057
    const uint8_t* src_ptr,
28058
0
    size_t src_len) {
28059
0
  size_t dst_len4 = dst_len / 4;
28060
0
  size_t src_len8 = src_len / 8;
28061
0
  size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8;
28062
0
  uint8_t* d = dst_ptr;
28063
0
  const uint8_t* s = src_ptr;
28064
0
  size_t n = len;
28065
28066
  // TODO: unroll.
28067
28068
0
  while (n >= 1) {
28069
0
    uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8));
28070
0
    wuffs_base__poke_u32le__no_bounds_check(
28071
0
        d + (0 * 4),
28072
0
        wuffs_private_impl__swap_u32_argb_abgr(
28073
0
            wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul(
28074
0
                s0)));
28075
28076
0
    s += 1 * 8;
28077
0
    d += 1 * 4;
28078
0
    n -= 1;
28079
0
  }
28080
28081
0
  return len;
28082
0
}
28083
28084
static uint64_t  //
28085
wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul_4x16le__src_over(
28086
    uint8_t* dst_ptr,
28087
    size_t dst_len,
28088
    uint8_t* dst_palette_ptr,
28089
    size_t dst_palette_len,
28090
    const uint8_t* src_ptr,
28091
0
    size_t src_len) {
28092
0
  size_t dst_len4 = dst_len / 4;
28093
0
  size_t src_len8 = src_len / 8;
28094
0
  size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8;
28095
0
  uint8_t* d = dst_ptr;
28096
0
  const uint8_t* s = src_ptr;
28097
0
  size_t n = len;
28098
28099
  // TODO: unroll.
28100
28101
0
  while (n >= 1) {
28102
0
    uint64_t d0 = wuffs_base__color_u32__as__color_u64(
28103
0
        wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)));
28104
0
    uint64_t s0 = wuffs_private_impl__swap_u64_argb_abgr(
28105
0
        wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)));
28106
0
    wuffs_base__poke_u32le__no_bounds_check(
28107
0
        d + (0 * 4),
28108
0
        wuffs_base__color_u64__as__color_u32(
28109
0
            wuffs_private_impl__composite_premul_nonpremul_u64_axxx(d0, s0)));
28110
28111
0
    s += 1 * 8;
28112
0
    d += 1 * 4;
28113
0
    n -= 1;
28114
0
  }
28115
28116
0
  return len;
28117
0
}
28118
28119
static uint64_t  //
28120
wuffs_private_impl__swizzle_bgra_premul__rgba_premul__src_over(
28121
    uint8_t* dst_ptr,
28122
    size_t dst_len,
28123
    uint8_t* dst_palette_ptr,
28124
    size_t dst_palette_len,
28125
    const uint8_t* src_ptr,
28126
0
    size_t src_len) {
28127
0
  size_t dst_len4 = dst_len / 4;
28128
0
  size_t src_len4 = src_len / 4;
28129
0
  size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
28130
0
  uint8_t* d = dst_ptr;
28131
0
  const uint8_t* s = src_ptr;
28132
0
  size_t n = len;
28133
28134
0
  while (n >= 1) {
28135
0
    uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4));
28136
0
    uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr(
28137
0
        wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
28138
0
    wuffs_base__poke_u32le__no_bounds_check(
28139
0
        d + (0 * 4),
28140
0
        wuffs_private_impl__composite_premul_premul_u32_axxx(d0, s0));
28141
28142
0
    s += 1 * 4;
28143
0
    d += 1 * 4;
28144
0
    n -= 1;
28145
0
  }
28146
28147
0
  return len;
28148
0
}
28149
28150
static uint64_t  //
28151
wuffs_private_impl__swizzle_bgra_premul__rgba_premul_4x16le__src(
28152
    uint8_t* dst_ptr,
28153
    size_t dst_len,
28154
    uint8_t* dst_palette_ptr,
28155
    size_t dst_palette_len,
28156
    const uint8_t* src_ptr,
28157
0
    size_t src_len) {
28158
0
  size_t dst_len4 = dst_len / 4;
28159
0
  size_t src_len8 = src_len / 8;
28160
0
  size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8;
28161
0
  uint8_t* d = dst_ptr;
28162
0
  const uint8_t* s = src_ptr;
28163
0
  size_t n = len;
28164
28165
  // TODO: unroll.
28166
28167
0
  while (n >= 1) {
28168
0
    uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8));
28169
0
    wuffs_base__poke_u32le__no_bounds_check(
28170
0
        d + (0 * 4), wuffs_private_impl__swap_u32_argb_abgr(
28171
0
                         wuffs_base__color_u64__as__color_u32(s0)));
28172
28173
0
    s += 1 * 8;
28174
0
    d += 1 * 4;
28175
0
    n -= 1;
28176
0
  }
28177
28178
0
  return len;
28179
0
}
28180
28181
static uint64_t  //
28182
wuffs_private_impl__swizzle_bgra_premul__rgba_premul_4x16le__src_over(
28183
    uint8_t* dst_ptr,
28184
    size_t dst_len,
28185
    uint8_t* dst_palette_ptr,
28186
    size_t dst_palette_len,
28187
    const uint8_t* src_ptr,
28188
0
    size_t src_len) {
28189
0
  size_t dst_len4 = dst_len / 4;
28190
0
  size_t src_len8 = src_len / 8;
28191
0
  size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8;
28192
0
  uint8_t* d = dst_ptr;
28193
0
  const uint8_t* s = src_ptr;
28194
0
  size_t n = len;
28195
28196
  // TODO: unroll.
28197
28198
0
  while (n >= 1) {
28199
0
    uint64_t d0 = wuffs_base__color_u32__as__color_u64(
28200
0
        wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)));
28201
0
    uint64_t s0 = wuffs_private_impl__swap_u64_argb_abgr(
28202
0
        wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)));
28203
0
    wuffs_base__poke_u32le__no_bounds_check(
28204
0
        d + (0 * 4),
28205
0
        wuffs_base__color_u64__as__color_u32(
28206
0
            wuffs_private_impl__composite_premul_premul_u64_axxx(d0, s0)));
28207
28208
0
    s += 1 * 8;
28209
0
    d += 1 * 4;
28210
0
    n -= 1;
28211
0
  }
28212
28213
0
  return len;
28214
0
}
28215
28216
static uint64_t  //
28217
wuffs_private_impl__swizzle_bgra_premul__ya_nonpremul__src(
28218
    uint8_t* dst_ptr,
28219
    size_t dst_len,
28220
    uint8_t* dst_palette_ptr,
28221
    size_t dst_palette_len,
28222
    const uint8_t* src_ptr,
28223
0
    size_t src_len) {
28224
0
  size_t dst_len4 = dst_len / 4;
28225
0
  size_t src_len2 = src_len / 2;
28226
0
  size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2;
28227
0
  uint8_t* d = dst_ptr;
28228
0
  const uint8_t* s = src_ptr;
28229
0
  size_t n = len;
28230
28231
  // TODO: unroll.
28232
28233
0
  while (n >= 1) {
28234
0
    uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101);
28235
0
    wuffs_base__poke_u32le__no_bounds_check(
28236
0
        d + (0 * 4),
28237
0
        wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(s0));
28238
28239
0
    s += 1 * 2;
28240
0
    d += 1 * 4;
28241
0
    n -= 1;
28242
0
  }
28243
28244
0
  return len;
28245
0
}
28246
28247
static uint64_t  //
28248
wuffs_private_impl__swizzle_bgra_premul__ya_nonpremul__src_over(
28249
    uint8_t* dst_ptr,
28250
    size_t dst_len,
28251
    uint8_t* dst_palette_ptr,
28252
    size_t dst_palette_len,
28253
    const uint8_t* src_ptr,
28254
0
    size_t src_len) {
28255
0
  size_t dst_len4 = dst_len / 4;
28256
0
  size_t src_len2 = src_len / 2;
28257
0
  size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2;
28258
0
  uint8_t* d = dst_ptr;
28259
0
  const uint8_t* s = src_ptr;
28260
0
  size_t n = len;
28261
28262
  // TODO: unroll.
28263
28264
0
  while (n >= 1) {
28265
0
    uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4));
28266
0
    uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101);
28267
0
    wuffs_base__poke_u32le__no_bounds_check(
28268
0
        d + (0 * 4),
28269
0
        wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0));
28270
28271
0
    s += 1 * 2;
28272
0
    d += 1 * 4;
28273
0
    n -= 1;
28274
0
  }
28275
28276
0
  return len;
28277
0
}
28278
28279
// --------
28280
28281
static uint64_t  //
28282
wuffs_private_impl__swizzle_bgra_premul_4x16le__bgra_premul_4x16le__src_over(
28283
    uint8_t* dst_ptr,
28284
    size_t dst_len,
28285
    uint8_t* dst_palette_ptr,
28286
    size_t dst_palette_len,
28287
    const uint8_t* src_ptr,
28288
0
    size_t src_len) {
28289
0
  size_t dst_len8 = dst_len / 8;
28290
0
  size_t src_len8 = src_len / 8;
28291
0
  size_t len = (dst_len8 < src_len8) ? dst_len8 : src_len8;
28292
0
  uint8_t* d = dst_ptr;
28293
0
  const uint8_t* s = src_ptr;
28294
28295
0
  size_t n = len;
28296
0
  while (n >= 1) {
28297
0
    uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8));
28298
0
    uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8));
28299
0
    wuffs_base__poke_u64le__no_bounds_check(
28300
0
        d + (0 * 8),
28301
0
        wuffs_private_impl__composite_premul_premul_u64_axxx(d0, s0));
28302
28303
0
    s += 1 * 8;
28304
0
    d += 1 * 8;
28305
0
    n -= 1;
28306
0
  }
28307
0
  return len;
28308
0
}
28309
28310
// --------
28311
28312
static uint64_t  //
28313
wuffs_private_impl__swizzle_bgrw__bgr(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 dst_len4 = dst_len / 4;
28320
0
  size_t src_len3 = src_len / 3;
28321
0
  size_t len = (dst_len4 < src_len3) ? dst_len4 : src_len3;
28322
0
  uint8_t* d = dst_ptr;
28323
0
  const uint8_t* s = src_ptr;
28324
0
  size_t n = len;
28325
28326
  // TODO: unroll.
28327
28328
0
  while (n >= 1) {
28329
0
    wuffs_base__poke_u32le__no_bounds_check(
28330
0
        d + (0 * 4),
28331
0
        0xFF000000 | wuffs_base__peek_u24le__no_bounds_check(s + (0 * 3)));
28332
28333
0
    s += 1 * 3;
28334
0
    d += 1 * 4;
28335
0
    n -= 1;
28336
0
  }
28337
28338
0
  return len;
28339
0
}
28340
28341
static uint64_t  //
28342
wuffs_private_impl__swizzle_bgrw__bgr_565(uint8_t* dst_ptr,
28343
                                          size_t dst_len,
28344
                                          uint8_t* dst_palette_ptr,
28345
                                          size_t dst_palette_len,
28346
                                          const uint8_t* src_ptr,
28347
0
                                          size_t src_len) {
28348
0
  size_t dst_len4 = dst_len / 4;
28349
0
  size_t src_len2 = src_len / 2;
28350
0
  size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2;
28351
0
  uint8_t* d = dst_ptr;
28352
0
  const uint8_t* s = src_ptr;
28353
0
  size_t n = len;
28354
28355
  // TODO: unroll.
28356
28357
0
  while (n >= 1) {
28358
0
    wuffs_base__poke_u32le__no_bounds_check(
28359
0
        d + (0 * 4), wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul(
28360
0
                         wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2))));
28361
28362
0
    s += 1 * 2;
28363
0
    d += 1 * 4;
28364
0
    n -= 1;
28365
0
  }
28366
28367
0
  return len;
28368
0
}
28369
28370
static uint64_t  //
28371
wuffs_private_impl__swizzle_bgrw__bgrx(uint8_t* dst_ptr,
28372
                                       size_t dst_len,
28373
                                       uint8_t* dst_palette_ptr,
28374
                                       size_t dst_palette_len,
28375
                                       const uint8_t* src_ptr,
28376
0
                                       size_t src_len) {
28377
0
  size_t dst_len4 = dst_len / 4;
28378
0
  size_t src_len4 = src_len / 4;
28379
0
  size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
28380
0
  uint8_t* d = dst_ptr;
28381
0
  const uint8_t* s = src_ptr;
28382
0
  size_t n = len;
28383
28384
  // TODO: unroll.
28385
28386
0
  while (n >= 1) {
28387
0
    wuffs_base__poke_u32le__no_bounds_check(
28388
0
        d + (0 * 4),
28389
0
        0xFF000000 | wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
28390
28391
0
    s += 1 * 4;
28392
0
    d += 1 * 4;
28393
0
    n -= 1;
28394
0
  }
28395
28396
0
  return len;
28397
0
}
28398
28399
// โ€ผ WUFFS MULTI-FILE SECTION +x86_sse42
28400
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
28401
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
28402
static uint64_t  //
28403
wuffs_private_impl__swizzle_bgrw__bgr__x86_sse42(uint8_t* dst_ptr,
28404
                                                 size_t dst_len,
28405
                                                 uint8_t* dst_palette_ptr,
28406
                                                 size_t dst_palette_len,
28407
                                                 const uint8_t* src_ptr,
28408
0
                                                 size_t src_len) {
28409
0
  size_t dst_len4 = dst_len / 4;
28410
0
  size_t src_len3 = src_len / 3;
28411
0
  size_t len = (dst_len4 < src_len3) ? dst_len4 : src_len3;
28412
0
  uint8_t* d = dst_ptr;
28413
0
  const uint8_t* s = src_ptr;
28414
0
  size_t n = len;
28415
28416
0
  __m128i shuffle = _mm_set_epi8(+0x00, +0x0B, +0x0A, +0x09,  //
28417
0
                                 +0x00, +0x08, +0x07, +0x06,  //
28418
0
                                 +0x00, +0x05, +0x04, +0x03,  //
28419
0
                                 +0x00, +0x02, +0x01, +0x00);
28420
0
  __m128i or_ff = _mm_set_epi8(-0x01, +0x00, +0x00, +0x00,  //
28421
0
                               -0x01, +0x00, +0x00, +0x00,  //
28422
0
                               -0x01, +0x00, +0x00, +0x00,  //
28423
0
                               -0x01, +0x00, +0x00, +0x00);
28424
28425
0
  while (n >= 6) {
28426
0
    __m128i x;
28427
0
    x = _mm_lddqu_si128((const __m128i*)(const void*)s);
28428
0
    x = _mm_shuffle_epi8(x, shuffle);
28429
0
    x = _mm_or_si128(x, or_ff);
28430
0
    _mm_storeu_si128((__m128i*)(void*)d, x);
28431
28432
0
    s += 4 * 3;
28433
0
    d += 4 * 4;
28434
0
    n -= 4;
28435
0
  }
28436
28437
0
  while (n >= 1) {
28438
0
    uint8_t b0 = s[0];
28439
0
    uint8_t b1 = s[1];
28440
0
    uint8_t b2 = s[2];
28441
0
    d[0] = b0;
28442
0
    d[1] = b1;
28443
0
    d[2] = b2;
28444
0
    d[3] = 0xFF;
28445
28446
0
    s += 1 * 3;
28447
0
    d += 1 * 4;
28448
0
    n -= 1;
28449
0
  }
28450
28451
0
  return len;
28452
0
}
28453
28454
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
28455
static uint64_t  //
28456
wuffs_private_impl__swizzle_bgrw__rgb__x86_sse42(uint8_t* dst_ptr,
28457
                                                 size_t dst_len,
28458
                                                 uint8_t* dst_palette_ptr,
28459
                                                 size_t dst_palette_len,
28460
                                                 const uint8_t* src_ptr,
28461
0
                                                 size_t src_len) {
28462
0
  size_t dst_len4 = dst_len / 4;
28463
0
  size_t src_len3 = src_len / 3;
28464
0
  size_t len = (dst_len4 < src_len3) ? dst_len4 : src_len3;
28465
0
  uint8_t* d = dst_ptr;
28466
0
  const uint8_t* s = src_ptr;
28467
0
  size_t n = len;
28468
28469
0
  __m128i shuffle = _mm_set_epi8(+0x00, +0x09, +0x0A, +0x0B,  //
28470
0
                                 +0x00, +0x06, +0x07, +0x08,  //
28471
0
                                 +0x00, +0x03, +0x04, +0x05,  //
28472
0
                                 +0x00, +0x00, +0x01, +0x02);
28473
0
  __m128i or_ff = _mm_set_epi8(-0x01, +0x00, +0x00, +0x00,  //
28474
0
                               -0x01, +0x00, +0x00, +0x00,  //
28475
0
                               -0x01, +0x00, +0x00, +0x00,  //
28476
0
                               -0x01, +0x00, +0x00, +0x00);
28477
28478
0
  while (n >= 6) {
28479
0
    __m128i x;
28480
0
    x = _mm_lddqu_si128((const __m128i*)(const void*)s);
28481
0
    x = _mm_shuffle_epi8(x, shuffle);
28482
0
    x = _mm_or_si128(x, or_ff);
28483
0
    _mm_storeu_si128((__m128i*)(void*)d, x);
28484
28485
0
    s += 4 * 3;
28486
0
    d += 4 * 4;
28487
0
    n -= 4;
28488
0
  }
28489
28490
0
  while (n >= 1) {
28491
0
    uint8_t b0 = s[0];
28492
0
    uint8_t b1 = s[1];
28493
0
    uint8_t b2 = s[2];
28494
0
    d[0] = b2;
28495
0
    d[1] = b1;
28496
0
    d[2] = b0;
28497
0
    d[3] = 0xFF;
28498
28499
0
    s += 1 * 3;
28500
0
    d += 1 * 4;
28501
0
    n -= 1;
28502
0
  }
28503
28504
0
  return len;
28505
0
}
28506
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
28507
// โ€ผ WUFFS MULTI-FILE SECTION -x86_sse42
28508
28509
static uint64_t  //
28510
wuffs_private_impl__swizzle_bgrw__rgb(uint8_t* dst_ptr,
28511
                                      size_t dst_len,
28512
                                      uint8_t* dst_palette_ptr,
28513
                                      size_t dst_palette_len,
28514
                                      const uint8_t* src_ptr,
28515
0
                                      size_t src_len) {
28516
0
  size_t dst_len4 = dst_len / 4;
28517
0
  size_t src_len3 = src_len / 3;
28518
0
  size_t len = (dst_len4 < src_len3) ? dst_len4 : src_len3;
28519
0
  uint8_t* d = dst_ptr;
28520
0
  const uint8_t* s = src_ptr;
28521
0
  size_t n = len;
28522
28523
0
  while (n >= 1) {
28524
0
    uint8_t b0 = s[0];
28525
0
    uint8_t b1 = s[1];
28526
0
    uint8_t b2 = s[2];
28527
0
    d[0] = b2;
28528
0
    d[1] = b1;
28529
0
    d[2] = b0;
28530
0
    d[3] = 0xFF;
28531
28532
0
    s += 1 * 3;
28533
0
    d += 1 * 4;
28534
0
    n -= 1;
28535
0
  }
28536
28537
0
  return len;
28538
0
}
28539
28540
static uint64_t  //
28541
wuffs_private_impl__swizzle_bgrw__rgbx(uint8_t* dst_ptr,
28542
                                       size_t dst_len,
28543
                                       uint8_t* dst_palette_ptr,
28544
                                       size_t dst_palette_len,
28545
                                       const uint8_t* src_ptr,
28546
0
                                       size_t src_len) {
28547
0
  size_t dst_len4 = dst_len / 4;
28548
0
  size_t src_len4 = src_len / 4;
28549
0
  size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
28550
0
  uint8_t* d = dst_ptr;
28551
0
  const uint8_t* s = src_ptr;
28552
0
  size_t n = len;
28553
28554
  // TODO: unroll.
28555
28556
0
  while (n >= 1) {
28557
0
    uint8_t b0 = s[0];
28558
0
    uint8_t b1 = s[1];
28559
0
    uint8_t b2 = s[2];
28560
0
    d[0] = b2;
28561
0
    d[1] = b1;
28562
0
    d[2] = b0;
28563
0
    d[3] = 0xFF;
28564
28565
0
    s += 1 * 4;
28566
0
    d += 1 * 4;
28567
0
    n -= 1;
28568
0
  }
28569
28570
0
  return len;
28571
0
}
28572
28573
// --------
28574
28575
static uint64_t  //
28576
wuffs_private_impl__swizzle_bgrw_4x16le__bgr(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 dst_len8 = dst_len / 8;
28583
0
  size_t src_len3 = src_len / 3;
28584
0
  size_t len = (dst_len8 < src_len3) ? dst_len8 : src_len3;
28585
0
  uint8_t* d = dst_ptr;
28586
0
  const uint8_t* s = src_ptr;
28587
0
  size_t n = len;
28588
28589
0
  while (n >= 1) {
28590
0
    uint8_t s0 = s[0];
28591
0
    uint8_t s1 = s[1];
28592
0
    uint8_t s2 = s[2];
28593
0
    d[0] = s0;
28594
0
    d[1] = s0;
28595
0
    d[2] = s1;
28596
0
    d[3] = s1;
28597
0
    d[4] = s2;
28598
0
    d[5] = s2;
28599
0
    d[6] = 0xFF;
28600
0
    d[7] = 0xFF;
28601
28602
0
    s += 1 * 3;
28603
0
    d += 1 * 8;
28604
0
    n -= 1;
28605
0
  }
28606
28607
0
  return len;
28608
0
}
28609
28610
static uint64_t  //
28611
wuffs_private_impl__swizzle_bgrw_4x16le__bgr_565(uint8_t* dst_ptr,
28612
                                                 size_t dst_len,
28613
                                                 uint8_t* dst_palette_ptr,
28614
                                                 size_t dst_palette_len,
28615
                                                 const uint8_t* src_ptr,
28616
0
                                                 size_t src_len) {
28617
0
  size_t dst_len8 = dst_len / 8;
28618
0
  size_t src_len2 = src_len / 2;
28619
0
  size_t len = (dst_len8 < src_len2) ? dst_len8 : src_len2;
28620
0
  uint8_t* d = dst_ptr;
28621
0
  const uint8_t* s = src_ptr;
28622
0
  size_t n = len;
28623
28624
0
  while (n >= 1) {
28625
0
    wuffs_base__poke_u64le__no_bounds_check(
28626
0
        d + (0 * 8),
28627
0
        wuffs_base__color_u32__as__color_u64(
28628
0
            wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul(
28629
0
                wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2)))));
28630
28631
0
    s += 1 * 2;
28632
0
    d += 1 * 8;
28633
0
    n -= 1;
28634
0
  }
28635
28636
0
  return len;
28637
0
}
28638
28639
static uint64_t  //
28640
wuffs_private_impl__swizzle_bgrw_4x16le__bgrx(uint8_t* dst_ptr,
28641
                                              size_t dst_len,
28642
                                              uint8_t* dst_palette_ptr,
28643
                                              size_t dst_palette_len,
28644
                                              const uint8_t* src_ptr,
28645
0
                                              size_t src_len) {
28646
0
  size_t dst_len8 = dst_len / 8;
28647
0
  size_t src_len4 = src_len / 4;
28648
0
  size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4;
28649
0
  uint8_t* d = dst_ptr;
28650
0
  const uint8_t* s = src_ptr;
28651
0
  size_t n = len;
28652
28653
0
  while (n >= 1) {
28654
0
    uint8_t s0 = s[0];
28655
0
    uint8_t s1 = s[1];
28656
0
    uint8_t s2 = s[2];
28657
0
    d[0] = s0;
28658
0
    d[1] = s0;
28659
0
    d[2] = s1;
28660
0
    d[3] = s1;
28661
0
    d[4] = s2;
28662
0
    d[5] = s2;
28663
0
    d[6] = 0xFF;
28664
0
    d[7] = 0xFF;
28665
28666
0
    s += 1 * 4;
28667
0
    d += 1 * 8;
28668
0
    n -= 1;
28669
0
  }
28670
28671
0
  return len;
28672
0
}
28673
28674
static uint64_t  //
28675
wuffs_private_impl__swizzle_bgrw_4x16le__rgb(uint8_t* dst_ptr,
28676
                                             size_t dst_len,
28677
                                             uint8_t* dst_palette_ptr,
28678
                                             size_t dst_palette_len,
28679
                                             const uint8_t* src_ptr,
28680
0
                                             size_t src_len) {
28681
0
  size_t dst_len8 = dst_len / 8;
28682
0
  size_t src_len3 = src_len / 3;
28683
0
  size_t len = (dst_len8 < src_len3) ? dst_len8 : src_len3;
28684
0
  uint8_t* d = dst_ptr;
28685
0
  const uint8_t* s = src_ptr;
28686
0
  size_t n = len;
28687
28688
0
  while (n >= 1) {
28689
0
    uint8_t s0 = s[0];
28690
0
    uint8_t s1 = s[1];
28691
0
    uint8_t s2 = s[2];
28692
0
    d[0] = s2;
28693
0
    d[1] = s2;
28694
0
    d[2] = s1;
28695
0
    d[3] = s1;
28696
0
    d[4] = s0;
28697
0
    d[5] = s0;
28698
0
    d[6] = 0xFF;
28699
0
    d[7] = 0xFF;
28700
28701
0
    s += 1 * 3;
28702
0
    d += 1 * 8;
28703
0
    n -= 1;
28704
0
  }
28705
28706
0
  return len;
28707
0
}
28708
28709
// --------
28710
28711
static uint64_t  //
28712
wuffs_private_impl__swizzle_rgb__bgr_565(uint8_t* dst_ptr,
28713
                                         size_t dst_len,
28714
                                         uint8_t* dst_palette_ptr,
28715
                                         size_t dst_palette_len,
28716
                                         const uint8_t* src_ptr,
28717
0
                                         size_t src_len) {
28718
0
  size_t dst_len3 = dst_len / 3;
28719
0
  size_t src_len2 = src_len / 2;
28720
0
  size_t len = (dst_len3 < src_len2) ? dst_len3 : src_len2;
28721
0
  uint8_t* d = dst_ptr;
28722
0
  const uint8_t* s = src_ptr;
28723
0
  size_t n = len;
28724
28725
  // TODO: unroll.
28726
28727
0
  while (n >= 1) {
28728
0
    wuffs_base__poke_u24le__no_bounds_check(
28729
0
        d + (0 * 3),
28730
0
        wuffs_private_impl__swap_u32_argb_abgr(
28731
0
            wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul(
28732
0
                wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2)))));
28733
28734
0
    s += 1 * 2;
28735
0
    d += 1 * 3;
28736
0
    n -= 1;
28737
0
  }
28738
28739
0
  return len;
28740
0
}
28741
28742
// --------
28743
28744
static uint64_t  //
28745
wuffs_private_impl__swizzle_rgba_nonpremul__bgra_nonpremul_4x16le__src(
28746
    uint8_t* dst_ptr,
28747
    size_t dst_len,
28748
    uint8_t* dst_palette_ptr,
28749
    size_t dst_palette_len,
28750
    const uint8_t* src_ptr,
28751
0
    size_t src_len) {
28752
0
  size_t dst_len4 = dst_len / 4;
28753
0
  size_t src_len8 = src_len / 8;
28754
0
  size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8;
28755
0
  uint8_t* d = dst_ptr;
28756
0
  const uint8_t* s = src_ptr;
28757
28758
0
  size_t n = len;
28759
0
  while (n >= 1) {
28760
0
    wuffs_base__poke_u32le__no_bounds_check(
28761
0
        d + (0 * 4),
28762
0
        wuffs_private_impl__color_u64__as__color_u32__swap_u32_argb_abgr(
28763
0
            wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8))));
28764
28765
0
    s += 1 * 8;
28766
0
    d += 1 * 4;
28767
0
    n -= 1;
28768
0
  }
28769
0
  return len;
28770
0
}
28771
28772
static uint64_t  //
28773
wuffs_private_impl__swizzle_rgba_nonpremul__bgra_nonpremul_4x16le__src_over(
28774
    uint8_t* dst_ptr,
28775
    size_t dst_len,
28776
    uint8_t* dst_palette_ptr,
28777
    size_t dst_palette_len,
28778
    const uint8_t* src_ptr,
28779
0
    size_t src_len) {
28780
0
  size_t dst_len4 = dst_len / 4;
28781
0
  size_t src_len8 = src_len / 8;
28782
0
  size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8;
28783
0
  uint8_t* d = dst_ptr;
28784
0
  const uint8_t* s = src_ptr;
28785
0
  size_t n = len;
28786
28787
0
  while (n >= 1) {
28788
0
    uint64_t d0 = wuffs_base__color_u32__as__color_u64(
28789
0
        wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)));
28790
0
    uint64_t s0 = wuffs_private_impl__swap_u64_argb_abgr(
28791
0
        wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)));
28792
0
    wuffs_base__poke_u32le__no_bounds_check(
28793
0
        d + (0 * 4),
28794
0
        wuffs_base__color_u64__as__color_u32(
28795
0
            wuffs_private_impl__composite_nonpremul_nonpremul_u64_axxx(d0,
28796
0
                                                                       s0)));
28797
28798
0
    s += 1 * 8;
28799
0
    d += 1 * 4;
28800
0
    n -= 1;
28801
0
  }
28802
28803
0
  return len;
28804
0
}
28805
28806
static uint64_t  //
28807
wuffs_private_impl__swizzle_rgba_nonpremul__bgra_premul_4x16le__src(
28808
    uint8_t* dst_ptr,
28809
    size_t dst_len,
28810
    uint8_t* dst_palette_ptr,
28811
    size_t dst_palette_len,
28812
    const uint8_t* src_ptr,
28813
0
    size_t src_len) {
28814
0
  size_t dst_len4 = dst_len / 4;
28815
0
  size_t src_len8 = src_len / 8;
28816
0
  size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8;
28817
0
  uint8_t* d = dst_ptr;
28818
0
  const uint8_t* s = src_ptr;
28819
28820
0
  size_t n = len;
28821
0
  while (n >= 1) {
28822
0
    wuffs_base__poke_u32le__no_bounds_check(
28823
0
        d + (0 * 4),
28824
0
        wuffs_private_impl__color_u64__as__color_u32__swap_u32_argb_abgr(
28825
0
            wuffs_base__color_u64_argb_premul__as__color_u64_argb_nonpremul(
28826
0
                wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)))));
28827
28828
0
    s += 1 * 8;
28829
0
    d += 1 * 4;
28830
0
    n -= 1;
28831
0
  }
28832
0
  return len;
28833
0
}
28834
28835
static uint64_t  //
28836
wuffs_private_impl__swizzle_rgba_nonpremul__bgra_premul_4x16le__src_over(
28837
    uint8_t* dst_ptr,
28838
    size_t dst_len,
28839
    uint8_t* dst_palette_ptr,
28840
    size_t dst_palette_len,
28841
    const uint8_t* src_ptr,
28842
0
    size_t src_len) {
28843
0
  size_t dst_len4 = dst_len / 4;
28844
0
  size_t src_len8 = src_len / 8;
28845
0
  size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8;
28846
0
  uint8_t* d = dst_ptr;
28847
0
  const uint8_t* s = src_ptr;
28848
0
  size_t n = len;
28849
28850
0
  while (n >= 1) {
28851
0
    uint64_t d0 = wuffs_base__color_u32__as__color_u64(
28852
0
        wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)));
28853
0
    uint64_t s0 = wuffs_private_impl__swap_u64_argb_abgr(
28854
0
        wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)));
28855
0
    wuffs_base__poke_u32le__no_bounds_check(
28856
0
        d + (0 * 4),
28857
0
        wuffs_base__color_u64__as__color_u32(
28858
0
            wuffs_private_impl__composite_nonpremul_premul_u64_axxx(d0, s0)));
28859
28860
0
    s += 1 * 8;
28861
0
    d += 1 * 4;
28862
0
    n -= 1;
28863
0
  }
28864
28865
0
  return len;
28866
0
}
28867
28868
// --------
28869
28870
static uint64_t  //
28871
wuffs_private_impl__swizzle_rgbw__bgr_565(uint8_t* dst_ptr,
28872
                                          size_t dst_len,
28873
                                          uint8_t* dst_palette_ptr,
28874
                                          size_t dst_palette_len,
28875
                                          const uint8_t* src_ptr,
28876
0
                                          size_t src_len) {
28877
0
  size_t dst_len4 = dst_len / 4;
28878
0
  size_t src_len2 = src_len / 2;
28879
0
  size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2;
28880
0
  uint8_t* d = dst_ptr;
28881
0
  const uint8_t* s = src_ptr;
28882
0
  size_t n = len;
28883
28884
  // TODO: unroll.
28885
28886
0
  while (n >= 1) {
28887
0
    wuffs_base__poke_u32le__no_bounds_check(
28888
0
        d + (0 * 4),
28889
0
        wuffs_private_impl__swap_u32_argb_abgr(
28890
0
            wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul(
28891
0
                wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2)))));
28892
28893
0
    s += 1 * 2;
28894
0
    d += 1 * 4;
28895
0
    n -= 1;
28896
0
  }
28897
28898
0
  return len;
28899
0
}
28900
28901
// --------
28902
28903
static uint64_t  //
28904
wuffs_private_impl__swizzle_xxx__index__src(uint8_t* dst_ptr,
28905
                                            size_t dst_len,
28906
                                            uint8_t* dst_palette_ptr,
28907
                                            size_t dst_palette_len,
28908
                                            const uint8_t* src_ptr,
28909
0
                                            size_t src_len) {
28910
0
  if (dst_palette_len !=
28911
0
      WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
28912
0
    return 0;
28913
0
  }
28914
0
  size_t dst_len3 = dst_len / 3;
28915
0
  size_t len = (dst_len3 < src_len) ? dst_len3 : src_len;
28916
0
  uint8_t* d = dst_ptr;
28917
0
  const uint8_t* s = src_ptr;
28918
0
  size_t n = len;
28919
28920
0
  const size_t loop_unroll_count = 4;
28921
28922
  // The comparison in the while condition is ">", not ">=", because with
28923
  // ">=", the last 4-byte store could write past the end of the dst slice.
28924
  //
28925
  // Each 4-byte store writes one too many bytes, but a subsequent store
28926
  // will overwrite that with the correct byte. There is always another
28927
  // store, whether a 4-byte store in this loop or a 1-byte store in the
28928
  // next loop.
28929
0
  while (n > loop_unroll_count) {
28930
0
    wuffs_base__poke_u32le__no_bounds_check(
28931
0
        d + (0 * 3), wuffs_base__peek_u32le__no_bounds_check(
28932
0
                         dst_palette_ptr + ((size_t)s[0] * 4)));
28933
0
    wuffs_base__poke_u32le__no_bounds_check(
28934
0
        d + (1 * 3), wuffs_base__peek_u32le__no_bounds_check(
28935
0
                         dst_palette_ptr + ((size_t)s[1] * 4)));
28936
0
    wuffs_base__poke_u32le__no_bounds_check(
28937
0
        d + (2 * 3), wuffs_base__peek_u32le__no_bounds_check(
28938
0
                         dst_palette_ptr + ((size_t)s[2] * 4)));
28939
0
    wuffs_base__poke_u32le__no_bounds_check(
28940
0
        d + (3 * 3), wuffs_base__peek_u32le__no_bounds_check(
28941
0
                         dst_palette_ptr + ((size_t)s[3] * 4)));
28942
28943
0
    s += loop_unroll_count * 1;
28944
0
    d += loop_unroll_count * 3;
28945
0
    n -= loop_unroll_count;
28946
0
  }
28947
28948
0
  while (n >= 1) {
28949
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
28950
0
                                                          ((size_t)s[0] * 4));
28951
0
    wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0);
28952
28953
0
    s += 1 * 1;
28954
0
    d += 1 * 3;
28955
0
    n -= 1;
28956
0
  }
28957
28958
0
  return len;
28959
0
}
28960
28961
static uint64_t  //
28962
wuffs_private_impl__swizzle_xxx__index_bgra_nonpremul__src_over(
28963
    uint8_t* dst_ptr,
28964
    size_t dst_len,
28965
    uint8_t* dst_palette_ptr,
28966
    size_t dst_palette_len,
28967
    const uint8_t* src_ptr,
28968
0
    size_t src_len) {
28969
0
  if (dst_palette_len !=
28970
0
      WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
28971
0
    return 0;
28972
0
  }
28973
0
  size_t dst_len3 = dst_len / 3;
28974
0
  size_t len = (dst_len3 < src_len) ? dst_len3 : src_len;
28975
0
  uint8_t* d = dst_ptr;
28976
0
  const uint8_t* s = src_ptr;
28977
0
  size_t n = len;
28978
28979
  // TODO: unroll.
28980
28981
0
  while (n >= 1) {
28982
0
    uint32_t d0 =
28983
0
        wuffs_base__peek_u24le__no_bounds_check(d + (0 * 3)) | 0xFF000000;
28984
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
28985
0
                                                          ((size_t)s[0] * 4));
28986
0
    wuffs_base__poke_u24le__no_bounds_check(
28987
0
        d + (0 * 3),
28988
0
        wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0));
28989
28990
0
    s += 1 * 1;
28991
0
    d += 1 * 3;
28992
0
    n -= 1;
28993
0
  }
28994
28995
0
  return len;
28996
0
}
28997
28998
static uint64_t  //
28999
wuffs_private_impl__swizzle_xxx__index_binary_alpha__src_over(
29000
    uint8_t* dst_ptr,
29001
    size_t dst_len,
29002
    uint8_t* dst_palette_ptr,
29003
    size_t dst_palette_len,
29004
    const uint8_t* src_ptr,
29005
0
    size_t src_len) {
29006
0
  if (dst_palette_len !=
29007
0
      WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
29008
0
    return 0;
29009
0
  }
29010
0
  size_t dst_len3 = dst_len / 3;
29011
0
  size_t len = (dst_len3 < src_len) ? dst_len3 : src_len;
29012
0
  uint8_t* d = dst_ptr;
29013
0
  const uint8_t* s = src_ptr;
29014
0
  size_t n = len;
29015
29016
0
  const size_t loop_unroll_count = 4;
29017
29018
0
  while (n >= loop_unroll_count) {
29019
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
29020
0
                                                          ((size_t)s[0] * 4));
29021
0
    if (s0) {
29022
0
      wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0);
29023
0
    }
29024
0
    uint32_t s1 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
29025
0
                                                          ((size_t)s[1] * 4));
29026
0
    if (s1) {
29027
0
      wuffs_base__poke_u24le__no_bounds_check(d + (1 * 3), s1);
29028
0
    }
29029
0
    uint32_t s2 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
29030
0
                                                          ((size_t)s[2] * 4));
29031
0
    if (s2) {
29032
0
      wuffs_base__poke_u24le__no_bounds_check(d + (2 * 3), s2);
29033
0
    }
29034
0
    uint32_t s3 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
29035
0
                                                          ((size_t)s[3] * 4));
29036
0
    if (s3) {
29037
0
      wuffs_base__poke_u24le__no_bounds_check(d + (3 * 3), s3);
29038
0
    }
29039
29040
0
    s += loop_unroll_count * 1;
29041
0
    d += loop_unroll_count * 3;
29042
0
    n -= loop_unroll_count;
29043
0
  }
29044
29045
0
  while (n >= 1) {
29046
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
29047
0
                                                          ((size_t)s[0] * 4));
29048
0
    if (s0) {
29049
0
      wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0);
29050
0
    }
29051
29052
0
    s += 1 * 1;
29053
0
    d += 1 * 3;
29054
0
    n -= 1;
29055
0
  }
29056
29057
0
  return len;
29058
0
}
29059
29060
static uint64_t  //
29061
wuffs_private_impl__swizzle_xxx__xxxx(uint8_t* dst_ptr,
29062
                                      size_t dst_len,
29063
                                      uint8_t* dst_palette_ptr,
29064
                                      size_t dst_palette_len,
29065
                                      const uint8_t* src_ptr,
29066
0
                                      size_t src_len) {
29067
0
  size_t dst_len3 = dst_len / 3;
29068
0
  size_t src_len4 = src_len / 4;
29069
0
  size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4;
29070
0
  uint8_t* d = dst_ptr;
29071
0
  const uint8_t* s = src_ptr;
29072
0
  size_t n = len;
29073
29074
  // TODO: unroll.
29075
29076
0
  while (n >= 1) {
29077
0
    wuffs_base__poke_u24le__no_bounds_check(
29078
0
        d + (0 * 3), wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
29079
29080
0
    s += 1 * 4;
29081
0
    d += 1 * 3;
29082
0
    n -= 1;
29083
0
  }
29084
29085
0
  return len;
29086
0
}
29087
29088
static uint64_t  //
29089
wuffs_private_impl__swizzle_xxx__y(uint8_t* dst_ptr,
29090
                                   size_t dst_len,
29091
                                   uint8_t* dst_palette_ptr,
29092
                                   size_t dst_palette_len,
29093
                                   const uint8_t* src_ptr,
29094
0
                                   size_t src_len) {
29095
0
  size_t dst_len3 = dst_len / 3;
29096
0
  size_t len = (dst_len3 < src_len) ? dst_len3 : src_len;
29097
0
  uint8_t* d = dst_ptr;
29098
0
  const uint8_t* s = src_ptr;
29099
0
  size_t n = len;
29100
29101
  // TODO: unroll.
29102
29103
0
  while (n >= 1) {
29104
0
    uint8_t s0 = s[0];
29105
0
    d[0] = s0;
29106
0
    d[1] = s0;
29107
0
    d[2] = s0;
29108
29109
0
    s += 1 * 1;
29110
0
    d += 1 * 3;
29111
0
    n -= 1;
29112
0
  }
29113
29114
0
  return len;
29115
0
}
29116
29117
static uint64_t  //
29118
wuffs_private_impl__swizzle_xxx__y_16be(uint8_t* dst_ptr,
29119
                                        size_t dst_len,
29120
                                        uint8_t* dst_palette_ptr,
29121
                                        size_t dst_palette_len,
29122
                                        const uint8_t* src_ptr,
29123
0
                                        size_t src_len) {
29124
0
  size_t dst_len3 = dst_len / 3;
29125
0
  size_t src_len2 = src_len / 2;
29126
0
  size_t len = (dst_len3 < src_len2) ? dst_len3 : src_len2;
29127
0
  uint8_t* d = dst_ptr;
29128
0
  const uint8_t* s = src_ptr;
29129
0
  size_t n = len;
29130
29131
  // TODO: unroll.
29132
29133
0
  while (n >= 1) {
29134
0
    uint8_t s0 = s[0];
29135
0
    d[0] = s0;
29136
0
    d[1] = s0;
29137
0
    d[2] = s0;
29138
29139
0
    s += 1 * 2;
29140
0
    d += 1 * 3;
29141
0
    n -= 1;
29142
0
  }
29143
29144
0
  return len;
29145
0
}
29146
29147
static uint64_t  //
29148
wuffs_private_impl__swizzle_xxx__y_16le(uint8_t* dst_ptr,
29149
                                        size_t dst_len,
29150
                                        uint8_t* dst_palette_ptr,
29151
                                        size_t dst_palette_len,
29152
                                        const uint8_t* src_ptr,
29153
0
                                        size_t src_len) {
29154
0
  size_t dst_len3 = dst_len / 3;
29155
0
  size_t src_len2 = src_len / 2;
29156
0
  size_t len = (dst_len3 < src_len2) ? dst_len3 : src_len2;
29157
0
  uint8_t* d = dst_ptr;
29158
0
  const uint8_t* s = src_ptr;
29159
0
  size_t n = len;
29160
29161
  // TODO: unroll.
29162
29163
0
  while (n >= 1) {
29164
0
    uint8_t s0 = s[1];
29165
0
    d[0] = s0;
29166
0
    d[1] = s0;
29167
0
    d[2] = s0;
29168
29169
0
    s += 1 * 2;
29170
0
    d += 1 * 3;
29171
0
    n -= 1;
29172
0
  }
29173
29174
0
  return len;
29175
0
}
29176
29177
static uint64_t  //
29178
wuffs_private_impl__swizzle_xxx__ya_nonpremul__src(uint8_t* dst_ptr,
29179
                                                   size_t dst_len,
29180
                                                   uint8_t* dst_palette_ptr,
29181
                                                   size_t dst_palette_len,
29182
                                                   const uint8_t* src_ptr,
29183
0
                                                   size_t src_len) {
29184
0
  size_t dst_len3 = dst_len / 3;
29185
0
  size_t src_len2 = src_len / 2;
29186
0
  size_t len = (dst_len3 < src_len2) ? dst_len3 : src_len2;
29187
0
  uint8_t* d = dst_ptr;
29188
0
  const uint8_t* s = src_ptr;
29189
0
  size_t n = len;
29190
29191
  // TODO: unroll.
29192
29193
0
  while (n >= 1) {
29194
0
    uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101);
29195
0
    wuffs_base__poke_u24le__no_bounds_check(
29196
0
        d + (0 * 3),
29197
0
        wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(s0));
29198
29199
0
    s += 1 * 2;
29200
0
    d += 1 * 3;
29201
0
    n -= 1;
29202
0
  }
29203
29204
0
  return len;
29205
0
}
29206
29207
static uint64_t  //
29208
wuffs_private_impl__swizzle_xxx__ya_nonpremul__src_over(
29209
    uint8_t* dst_ptr,
29210
    size_t dst_len,
29211
    uint8_t* dst_palette_ptr,
29212
    size_t dst_palette_len,
29213
    const uint8_t* src_ptr,
29214
0
    size_t src_len) {
29215
0
  size_t dst_len3 = dst_len / 3;
29216
0
  size_t src_len2 = src_len / 2;
29217
0
  size_t len = (dst_len3 < src_len2) ? dst_len3 : src_len2;
29218
0
  uint8_t* d = dst_ptr;
29219
0
  const uint8_t* s = src_ptr;
29220
0
  size_t n = len;
29221
29222
  // TODO: unroll.
29223
29224
0
  while (n >= 1) {
29225
0
    uint32_t d0 =
29226
0
        wuffs_base__peek_u24le__no_bounds_check(d + (0 * 3)) | 0xFF000000;
29227
0
    uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101);
29228
0
    wuffs_base__poke_u24le__no_bounds_check(
29229
0
        d + (0 * 3),
29230
0
        wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0));
29231
29232
0
    s += 1 * 2;
29233
0
    d += 1 * 3;
29234
0
    n -= 1;
29235
0
  }
29236
29237
0
  return len;
29238
0
}
29239
29240
// --------
29241
29242
static uint64_t  //
29243
wuffs_private_impl__swizzle_xxxx__index__src(uint8_t* dst_ptr,
29244
                                             size_t dst_len,
29245
                                             uint8_t* dst_palette_ptr,
29246
                                             size_t dst_palette_len,
29247
                                             const uint8_t* src_ptr,
29248
0
                                             size_t src_len) {
29249
0
  if (dst_palette_len !=
29250
0
      WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
29251
0
    return 0;
29252
0
  }
29253
0
  size_t dst_len4 = dst_len / 4;
29254
0
  size_t len = (dst_len4 < src_len) ? dst_len4 : src_len;
29255
0
  uint8_t* d = dst_ptr;
29256
0
  const uint8_t* s = src_ptr;
29257
0
  size_t n = len;
29258
29259
0
  const size_t loop_unroll_count = 4;
29260
29261
0
  while (n >= loop_unroll_count) {
29262
0
    wuffs_base__poke_u32le__no_bounds_check(
29263
0
        d + (0 * 4), wuffs_base__peek_u32le__no_bounds_check(
29264
0
                         dst_palette_ptr + ((size_t)s[0] * 4)));
29265
0
    wuffs_base__poke_u32le__no_bounds_check(
29266
0
        d + (1 * 4), wuffs_base__peek_u32le__no_bounds_check(
29267
0
                         dst_palette_ptr + ((size_t)s[1] * 4)));
29268
0
    wuffs_base__poke_u32le__no_bounds_check(
29269
0
        d + (2 * 4), wuffs_base__peek_u32le__no_bounds_check(
29270
0
                         dst_palette_ptr + ((size_t)s[2] * 4)));
29271
0
    wuffs_base__poke_u32le__no_bounds_check(
29272
0
        d + (3 * 4), wuffs_base__peek_u32le__no_bounds_check(
29273
0
                         dst_palette_ptr + ((size_t)s[3] * 4)));
29274
29275
0
    s += loop_unroll_count * 1;
29276
0
    d += loop_unroll_count * 4;
29277
0
    n -= loop_unroll_count;
29278
0
  }
29279
29280
0
  while (n >= 1) {
29281
0
    wuffs_base__poke_u32le__no_bounds_check(
29282
0
        d + (0 * 4), wuffs_base__peek_u32le__no_bounds_check(
29283
0
                         dst_palette_ptr + ((size_t)s[0] * 4)));
29284
29285
0
    s += 1 * 1;
29286
0
    d += 1 * 4;
29287
0
    n -= 1;
29288
0
  }
29289
29290
0
  return len;
29291
0
}
29292
29293
static uint64_t  //
29294
wuffs_private_impl__swizzle_xxxx__index_binary_alpha__src_over(
29295
    uint8_t* dst_ptr,
29296
    size_t dst_len,
29297
    uint8_t* dst_palette_ptr,
29298
    size_t dst_palette_len,
29299
    const uint8_t* src_ptr,
29300
0
    size_t src_len) {
29301
0
  if (dst_palette_len !=
29302
0
      WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
29303
0
    return 0;
29304
0
  }
29305
0
  size_t dst_len4 = dst_len / 4;
29306
0
  size_t len = (dst_len4 < src_len) ? dst_len4 : src_len;
29307
0
  uint8_t* d = dst_ptr;
29308
0
  const uint8_t* s = src_ptr;
29309
0
  size_t n = len;
29310
29311
0
  const size_t loop_unroll_count = 4;
29312
29313
0
  while (n >= loop_unroll_count) {
29314
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
29315
0
                                                          ((size_t)s[0] * 4));
29316
0
    if (s0) {
29317
0
      wuffs_base__poke_u32le__no_bounds_check(d + (0 * 4), s0);
29318
0
    }
29319
0
    uint32_t s1 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
29320
0
                                                          ((size_t)s[1] * 4));
29321
0
    if (s1) {
29322
0
      wuffs_base__poke_u32le__no_bounds_check(d + (1 * 4), s1);
29323
0
    }
29324
0
    uint32_t s2 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
29325
0
                                                          ((size_t)s[2] * 4));
29326
0
    if (s2) {
29327
0
      wuffs_base__poke_u32le__no_bounds_check(d + (2 * 4), s2);
29328
0
    }
29329
0
    uint32_t s3 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
29330
0
                                                          ((size_t)s[3] * 4));
29331
0
    if (s3) {
29332
0
      wuffs_base__poke_u32le__no_bounds_check(d + (3 * 4), s3);
29333
0
    }
29334
29335
0
    s += loop_unroll_count * 1;
29336
0
    d += loop_unroll_count * 4;
29337
0
    n -= loop_unroll_count;
29338
0
  }
29339
29340
0
  while (n >= 1) {
29341
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
29342
0
                                                          ((size_t)s[0] * 4));
29343
0
    if (s0) {
29344
0
      wuffs_base__poke_u32le__no_bounds_check(d + (0 * 4), s0);
29345
0
    }
29346
29347
0
    s += 1 * 1;
29348
0
    d += 1 * 4;
29349
0
    n -= 1;
29350
0
  }
29351
29352
0
  return len;
29353
0
}
29354
29355
// โ€ผ WUFFS MULTI-FILE SECTION +x86_sse42
29356
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
29357
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
29358
static uint64_t  //
29359
wuffs_private_impl__swizzle_xxxx__y__x86_sse42(uint8_t* dst_ptr,
29360
                                               size_t dst_len,
29361
                                               uint8_t* dst_palette_ptr,
29362
                                               size_t dst_palette_len,
29363
                                               const uint8_t* src_ptr,
29364
7.18M
                                               size_t src_len) {
29365
7.18M
  size_t dst_len4 = dst_len / 4;
29366
7.18M
  size_t len = (dst_len4 < src_len) ? dst_len4 : src_len;
29367
7.18M
  uint8_t* d = dst_ptr;
29368
7.18M
  const uint8_t* s = src_ptr;
29369
7.18M
  size_t n = len;
29370
29371
7.18M
  __m128i shuffle = _mm_set_epi8(+0x03, +0x03, +0x03, +0x03,  //
29372
7.18M
                                 +0x02, +0x02, +0x02, +0x02,  //
29373
7.18M
                                 +0x01, +0x01, +0x01, +0x01,  //
29374
7.18M
                                 +0x00, +0x00, +0x00, +0x00);
29375
7.18M
  __m128i or_ff = _mm_set_epi8(-0x01, +0x00, +0x00, +0x00,  //
29376
7.18M
                               -0x01, +0x00, +0x00, +0x00,  //
29377
7.18M
                               -0x01, +0x00, +0x00, +0x00,  //
29378
7.18M
                               -0x01, +0x00, +0x00, +0x00);
29379
29380
822M
  while (n >= 4) {
29381
815M
    __m128i x;
29382
815M
    x = _mm_cvtsi32_si128((int)(wuffs_base__peek_u32le__no_bounds_check(s)));
29383
815M
    x = _mm_shuffle_epi8(x, shuffle);
29384
815M
    x = _mm_or_si128(x, or_ff);
29385
815M
    _mm_storeu_si128((__m128i*)(void*)d, x);
29386
29387
815M
    s += 4 * 1;
29388
815M
    d += 4 * 4;
29389
815M
    n -= 4;
29390
815M
  }
29391
29392
18.6M
  while (n >= 1) {
29393
11.4M
    wuffs_base__poke_u32le__no_bounds_check(
29394
11.4M
        d + (0 * 4), 0xFF000000 | (0x010101 * (uint32_t)s[0]));
29395
29396
11.4M
    s += 1 * 1;
29397
11.4M
    d += 1 * 4;
29398
11.4M
    n -= 1;
29399
11.4M
  }
29400
29401
7.18M
  return len;
29402
7.18M
}
29403
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
29404
// โ€ผ WUFFS MULTI-FILE SECTION -x86_sse42
29405
29406
static uint64_t  //
29407
wuffs_private_impl__swizzle_xxxx__y(uint8_t* dst_ptr,
29408
                                    size_t dst_len,
29409
                                    uint8_t* dst_palette_ptr,
29410
                                    size_t dst_palette_len,
29411
                                    const uint8_t* src_ptr,
29412
0
                                    size_t src_len) {
29413
0
  size_t dst_len4 = dst_len / 4;
29414
0
  size_t len = (dst_len4 < src_len) ? dst_len4 : src_len;
29415
0
  uint8_t* d = dst_ptr;
29416
0
  const uint8_t* s = src_ptr;
29417
0
  size_t n = len;
29418
29419
0
  while (n >= 1) {
29420
0
    wuffs_base__poke_u32le__no_bounds_check(
29421
0
        d + (0 * 4), 0xFF000000 | (0x010101 * (uint32_t)s[0]));
29422
29423
0
    s += 1 * 1;
29424
0
    d += 1 * 4;
29425
0
    n -= 1;
29426
0
  }
29427
29428
0
  return len;
29429
0
}
29430
29431
static uint64_t  //
29432
wuffs_private_impl__swizzle_xxxx__y_16be(uint8_t* dst_ptr,
29433
                                         size_t dst_len,
29434
                                         uint8_t* dst_palette_ptr,
29435
                                         size_t dst_palette_len,
29436
                                         const uint8_t* src_ptr,
29437
0
                                         size_t src_len) {
29438
0
  size_t dst_len4 = dst_len / 4;
29439
0
  size_t src_len2 = src_len / 2;
29440
0
  size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2;
29441
0
  uint8_t* d = dst_ptr;
29442
0
  const uint8_t* s = src_ptr;
29443
0
  size_t n = len;
29444
29445
0
  while (n >= 1) {
29446
0
    wuffs_base__poke_u32le__no_bounds_check(
29447
0
        d + (0 * 4), 0xFF000000 | (0x010101 * (uint32_t)s[0]));
29448
29449
0
    s += 1 * 2;
29450
0
    d += 1 * 4;
29451
0
    n -= 1;
29452
0
  }
29453
29454
0
  return len;
29455
0
}
29456
29457
static uint64_t  //
29458
wuffs_private_impl__swizzle_xxxx__y_16le(uint8_t* dst_ptr,
29459
                                         size_t dst_len,
29460
                                         uint8_t* dst_palette_ptr,
29461
                                         size_t dst_palette_len,
29462
                                         const uint8_t* src_ptr,
29463
0
                                         size_t src_len) {
29464
0
  size_t dst_len4 = dst_len / 4;
29465
0
  size_t src_len2 = src_len / 2;
29466
0
  size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2;
29467
0
  uint8_t* d = dst_ptr;
29468
0
  const uint8_t* s = src_ptr;
29469
0
  size_t n = len;
29470
29471
0
  while (n >= 1) {
29472
0
    wuffs_base__poke_u32le__no_bounds_check(
29473
0
        d + (0 * 4), 0xFF000000 | (0x010101 * (uint32_t)s[1]));
29474
29475
0
    s += 1 * 2;
29476
0
    d += 1 * 4;
29477
0
    n -= 1;
29478
0
  }
29479
29480
0
  return len;
29481
0
}
29482
29483
// --------
29484
29485
static uint64_t  //
29486
wuffs_private_impl__swizzle_xxxxxxxx__index__src(uint8_t* dst_ptr,
29487
                                                 size_t dst_len,
29488
                                                 uint8_t* dst_palette_ptr,
29489
                                                 size_t dst_palette_len,
29490
                                                 const uint8_t* src_ptr,
29491
0
                                                 size_t src_len) {
29492
0
  if (dst_palette_len !=
29493
0
      WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
29494
0
    return 0;
29495
0
  }
29496
0
  size_t dst_len8 = dst_len / 8;
29497
0
  size_t len = (dst_len8 < src_len) ? dst_len8 : src_len;
29498
0
  uint8_t* d = dst_ptr;
29499
0
  const uint8_t* s = src_ptr;
29500
0
  size_t n = len;
29501
29502
0
  while (n >= 1) {
29503
0
    wuffs_base__poke_u64le__no_bounds_check(
29504
0
        d + (0 * 8), wuffs_base__color_u32__as__color_u64(
29505
0
                         wuffs_base__peek_u32le__no_bounds_check(
29506
0
                             dst_palette_ptr + ((size_t)s[0] * 4))));
29507
29508
0
    s += 1 * 1;
29509
0
    d += 1 * 8;
29510
0
    n -= 1;
29511
0
  }
29512
29513
0
  return len;
29514
0
}
29515
29516
static uint64_t  //
29517
wuffs_private_impl__swizzle_xxxxxxxx__index_binary_alpha__src_over(
29518
    uint8_t* dst_ptr,
29519
    size_t dst_len,
29520
    uint8_t* dst_palette_ptr,
29521
    size_t dst_palette_len,
29522
    const uint8_t* src_ptr,
29523
0
    size_t src_len) {
29524
0
  if (dst_palette_len !=
29525
0
      WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
29526
0
    return 0;
29527
0
  }
29528
0
  size_t dst_len8 = dst_len / 8;
29529
0
  size_t len = (dst_len8 < src_len) ? dst_len8 : src_len;
29530
0
  uint8_t* d = dst_ptr;
29531
0
  const uint8_t* s = src_ptr;
29532
0
  size_t n = len;
29533
29534
0
  while (n >= 1) {
29535
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
29536
0
                                                          ((size_t)s[0] * 4));
29537
0
    if (s0) {
29538
0
      wuffs_base__poke_u64le__no_bounds_check(
29539
0
          d + (0 * 8), wuffs_base__color_u32__as__color_u64(s0));
29540
0
    }
29541
29542
0
    s += 1 * 1;
29543
0
    d += 1 * 8;
29544
0
    n -= 1;
29545
0
  }
29546
29547
0
  return len;
29548
0
}
29549
29550
static uint64_t  //
29551
wuffs_private_impl__swizzle_xxxxxxxx__y(uint8_t* dst_ptr,
29552
                                        size_t dst_len,
29553
                                        uint8_t* dst_palette_ptr,
29554
                                        size_t dst_palette_len,
29555
                                        const uint8_t* src_ptr,
29556
0
                                        size_t src_len) {
29557
0
  size_t dst_len8 = dst_len / 8;
29558
0
  size_t len = (dst_len8 < src_len) ? dst_len8 : src_len;
29559
0
  uint8_t* d = dst_ptr;
29560
0
  const uint8_t* s = src_ptr;
29561
0
  size_t n = len;
29562
29563
0
  while (n >= 1) {
29564
0
    wuffs_base__poke_u64le__no_bounds_check(
29565
0
        d + (0 * 8), 0xFFFF000000000000 | (0x010101010101 * (uint64_t)s[0]));
29566
29567
0
    s += 1 * 1;
29568
0
    d += 1 * 8;
29569
0
    n -= 1;
29570
0
  }
29571
29572
0
  return len;
29573
0
}
29574
29575
static uint64_t  //
29576
wuffs_private_impl__swizzle_xxxxxxxx__y_16be(uint8_t* dst_ptr,
29577
                                             size_t dst_len,
29578
                                             uint8_t* dst_palette_ptr,
29579
                                             size_t dst_palette_len,
29580
                                             const uint8_t* src_ptr,
29581
0
                                             size_t src_len) {
29582
0
  size_t dst_len8 = dst_len / 8;
29583
0
  size_t src_len2 = src_len / 2;
29584
0
  size_t len = (dst_len8 < src_len2) ? dst_len8 : src_len2;
29585
0
  uint8_t* d = dst_ptr;
29586
0
  const uint8_t* s = src_ptr;
29587
0
  size_t n = len;
29588
29589
0
  while (n >= 1) {
29590
0
    uint64_t s0 =
29591
0
        ((uint64_t)(wuffs_base__peek_u16be__no_bounds_check(s + (0 * 2))));
29592
0
    wuffs_base__poke_u64le__no_bounds_check(
29593
0
        d + (0 * 8), 0xFFFF000000000000 | (0x000100010001 * s0));
29594
29595
0
    s += 1 * 2;
29596
0
    d += 1 * 8;
29597
0
    n -= 1;
29598
0
  }
29599
29600
0
  return len;
29601
0
}
29602
29603
static uint64_t  //
29604
wuffs_private_impl__swizzle_xxxxxxxx__y_16le(uint8_t* dst_ptr,
29605
                                             size_t dst_len,
29606
                                             uint8_t* dst_palette_ptr,
29607
                                             size_t dst_palette_len,
29608
                                             const uint8_t* src_ptr,
29609
0
                                             size_t src_len) {
29610
0
  size_t dst_len8 = dst_len / 8;
29611
0
  size_t src_len2 = src_len / 2;
29612
0
  size_t len = (dst_len8 < src_len2) ? dst_len8 : src_len2;
29613
0
  uint8_t* d = dst_ptr;
29614
0
  const uint8_t* s = src_ptr;
29615
0
  size_t n = len;
29616
29617
0
  while (n >= 1) {
29618
0
    uint64_t s0 =
29619
0
        ((uint64_t)(wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2))));
29620
0
    wuffs_base__poke_u64le__no_bounds_check(
29621
0
        d + (0 * 8), 0xFFFF000000000000 | (0x000100010001 * s0));
29622
29623
0
    s += 1 * 2;
29624
0
    d += 1 * 8;
29625
0
    n -= 1;
29626
0
  }
29627
29628
0
  return len;
29629
0
}
29630
29631
// --------
29632
29633
static uint64_t  //
29634
wuffs_private_impl__swizzle_y__bgr(uint8_t* dst_ptr,
29635
                                   size_t dst_len,
29636
                                   uint8_t* dst_palette_ptr,
29637
                                   size_t dst_palette_len,
29638
                                   const uint8_t* src_ptr,
29639
0
                                   size_t src_len) {
29640
0
  size_t src_len3 = src_len / 3;
29641
0
  size_t len = (dst_len < src_len3) ? dst_len : src_len3;
29642
0
  uint8_t* d = dst_ptr;
29643
0
  const uint8_t* s = src_ptr;
29644
0
  size_t n = len;
29645
29646
  // TODO: unroll.
29647
29648
0
  while (n >= 1) {
29649
0
    uint32_t s0 =
29650
0
        0xFF000000 | wuffs_base__peek_u24le__no_bounds_check(s + (0 * 3));
29651
0
    d[0] = wuffs_base__color_u32_argb_premul__as__color_u8_gray(s0);
29652
29653
0
    s += 1 * 3;
29654
0
    d += 1 * 1;
29655
0
    n -= 1;
29656
0
  }
29657
29658
0
  return len;
29659
0
}
29660
29661
static uint64_t  //
29662
wuffs_private_impl__swizzle_y__bgr_565(uint8_t* dst_ptr,
29663
                                       size_t dst_len,
29664
                                       uint8_t* dst_palette_ptr,
29665
                                       size_t dst_palette_len,
29666
                                       const uint8_t* src_ptr,
29667
0
                                       size_t src_len) {
29668
0
  size_t src_len2 = src_len / 2;
29669
0
  size_t len = (dst_len < src_len2) ? dst_len : src_len2;
29670
0
  uint8_t* d = dst_ptr;
29671
0
  const uint8_t* s = src_ptr;
29672
0
  size_t n = len;
29673
29674
  // TODO: unroll.
29675
29676
0
  while (n >= 1) {
29677
0
    uint32_t s0 = wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul(
29678
0
        wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2)));
29679
0
    d[0] = wuffs_base__color_u32_argb_premul__as__color_u8_gray(s0);
29680
29681
0
    s += 1 * 2;
29682
0
    d += 1 * 1;
29683
0
    n -= 1;
29684
0
  }
29685
29686
0
  return len;
29687
0
}
29688
29689
static uint64_t  //
29690
wuffs_private_impl__swizzle_y__bgra_nonpremul__src(uint8_t* dst_ptr,
29691
                                                   size_t dst_len,
29692
                                                   uint8_t* dst_palette_ptr,
29693
                                                   size_t dst_palette_len,
29694
                                                   const uint8_t* src_ptr,
29695
0
                                                   size_t src_len) {
29696
0
  size_t src_len4 = src_len / 4;
29697
0
  size_t len = (dst_len < src_len4) ? dst_len : src_len4;
29698
0
  uint8_t* d = dst_ptr;
29699
0
  const uint8_t* s = src_ptr;
29700
0
  size_t n = len;
29701
29702
  // TODO: unroll.
29703
29704
0
  while (n >= 1) {
29705
0
    uint32_t s0 =
29706
0
        wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(
29707
0
            wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
29708
0
    d[0] = wuffs_base__color_u32_argb_premul__as__color_u8_gray(s0);
29709
29710
0
    s += 1 * 4;
29711
0
    d += 1 * 1;
29712
0
    n -= 1;
29713
0
  }
29714
29715
0
  return len;
29716
0
}
29717
29718
static uint64_t  //
29719
wuffs_private_impl__swizzle_y__bgra_nonpremul__src_over(
29720
    uint8_t* dst_ptr,
29721
    size_t dst_len,
29722
    uint8_t* dst_palette_ptr,
29723
    size_t dst_palette_len,
29724
    const uint8_t* src_ptr,
29725
0
    size_t src_len) {
29726
0
  size_t src_len4 = src_len / 4;
29727
0
  size_t len = (dst_len < src_len4) ? dst_len : src_len4;
29728
0
  uint8_t* d = dst_ptr;
29729
0
  const uint8_t* s = src_ptr;
29730
0
  size_t n = len;
29731
29732
  // TODO: unroll.
29733
29734
0
  while (n >= 1) {
29735
0
    uint32_t d0 = 0xFF000000 | (0x00010101 * ((uint32_t)(d[0])));
29736
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4));
29737
0
    d[0] = wuffs_base__color_u32_argb_premul__as__color_u8_gray(
29738
0
        wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0));
29739
29740
0
    s += 1 * 4;
29741
0
    d += 1 * 1;
29742
0
    n -= 1;
29743
0
  }
29744
29745
0
  return len;
29746
0
}
29747
29748
static uint64_t  //
29749
wuffs_private_impl__swizzle_y__bgra_nonpremul_4x16le__src(
29750
    uint8_t* dst_ptr,
29751
    size_t dst_len,
29752
    uint8_t* dst_palette_ptr,
29753
    size_t dst_palette_len,
29754
    const uint8_t* src_ptr,
29755
0
    size_t src_len) {
29756
0
  size_t src_len8 = src_len / 8;
29757
0
  size_t len = (dst_len < src_len8) ? dst_len : src_len8;
29758
0
  uint8_t* d = dst_ptr;
29759
0
  const uint8_t* s = src_ptr;
29760
0
  size_t n = len;
29761
29762
  // TODO: unroll.
29763
29764
0
  while (n >= 1) {
29765
0
    d[0] = wuffs_base__color_u64_argb_nonpremul__as__color_u8_gray(
29766
0
        wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)));
29767
29768
0
    s += 1 * 8;
29769
0
    d += 1 * 1;
29770
0
    n -= 1;
29771
0
  }
29772
29773
0
  return len;
29774
0
}
29775
29776
static uint64_t  //
29777
wuffs_private_impl__swizzle_y__bgra_nonpremul_4x16le__src_over(
29778
    uint8_t* dst_ptr,
29779
    size_t dst_len,
29780
    uint8_t* dst_palette_ptr,
29781
    size_t dst_palette_len,
29782
    const uint8_t* src_ptr,
29783
0
    size_t src_len) {
29784
0
  size_t src_len8 = src_len / 8;
29785
0
  size_t len = (dst_len < src_len8) ? dst_len : src_len8;
29786
0
  uint8_t* d = dst_ptr;
29787
0
  const uint8_t* s = src_ptr;
29788
0
  size_t n = len;
29789
29790
  // TODO: unroll.
29791
29792
0
  while (n >= 1) {
29793
    // Extract 16-bit color components.
29794
0
    uint32_t dr = 0x101 * ((uint32_t)d[0]);
29795
0
    uint32_t dg = 0x101 * ((uint32_t)d[0]);
29796
0
    uint32_t db = 0x101 * ((uint32_t)d[0]);
29797
0
    uint32_t sa = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 6));
29798
0
    uint32_t sr = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 4));
29799
0
    uint32_t sg = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 2));
29800
0
    uint32_t sb = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 0));
29801
29802
    // Calculate the inverse of the src-alpha: how much of the dst to keep.
29803
0
    uint32_t ia = 0xFFFF - sa;
29804
29805
    // Composite src (nonpremul) over dst (premul).
29806
0
    dr = ((sr * sa) + (dr * ia)) / 0xFFFF;
29807
0
    dg = ((sg * sa) + (dg * ia)) / 0xFFFF;
29808
0
    db = ((sb * sa) + (db * ia)) / 0xFFFF;
29809
29810
    // Convert to 16-bit color to 8-bit gray.
29811
0
    uint32_t weighted_average =
29812
0
        (19595 * dr) + (38470 * dg) + (7471 * db) + 32768;
29813
0
    d[0] = (uint8_t)(weighted_average >> 24);
29814
29815
0
    s += 1 * 8;
29816
0
    d += 1 * 1;
29817
0
    n -= 1;
29818
0
  }
29819
29820
0
  return len;
29821
0
}
29822
29823
static uint64_t  //
29824
wuffs_private_impl__swizzle_y__bgra_premul__src(uint8_t* dst_ptr,
29825
                                                size_t dst_len,
29826
                                                uint8_t* dst_palette_ptr,
29827
                                                size_t dst_palette_len,
29828
                                                const uint8_t* src_ptr,
29829
0
                                                size_t src_len) {
29830
0
  size_t src_len4 = src_len / 4;
29831
0
  size_t len = (dst_len < src_len4) ? dst_len : src_len4;
29832
0
  uint8_t* d = dst_ptr;
29833
0
  const uint8_t* s = src_ptr;
29834
0
  size_t n = len;
29835
29836
  // TODO: unroll.
29837
29838
0
  while (n >= 1) {
29839
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4));
29840
0
    d[0] = wuffs_base__color_u32_argb_premul__as__color_u8_gray(s0);
29841
29842
0
    s += 1 * 4;
29843
0
    d += 1 * 1;
29844
0
    n -= 1;
29845
0
  }
29846
29847
0
  return len;
29848
0
}
29849
29850
static uint64_t  //
29851
wuffs_private_impl__swizzle_y__bgra_premul__src_over(uint8_t* dst_ptr,
29852
                                                     size_t dst_len,
29853
                                                     uint8_t* dst_palette_ptr,
29854
                                                     size_t dst_palette_len,
29855
                                                     const uint8_t* src_ptr,
29856
0
                                                     size_t src_len) {
29857
0
  size_t src_len4 = src_len / 4;
29858
0
  size_t len = (dst_len < src_len4) ? dst_len : src_len4;
29859
0
  uint8_t* d = dst_ptr;
29860
0
  const uint8_t* s = src_ptr;
29861
0
  size_t n = len;
29862
29863
  // TODO: unroll.
29864
29865
0
  while (n >= 1) {
29866
    // Extract 16-bit color components.
29867
0
    uint32_t dr = 0x101 * ((uint32_t)d[0]);
29868
0
    uint32_t dg = 0x101 * ((uint32_t)d[0]);
29869
0
    uint32_t db = 0x101 * ((uint32_t)d[0]);
29870
0
    uint32_t sa = 0x101 * ((uint32_t)s[3]);
29871
0
    uint32_t sr = 0x101 * ((uint32_t)s[2]);
29872
0
    uint32_t sg = 0x101 * ((uint32_t)s[1]);
29873
0
    uint32_t sb = 0x101 * ((uint32_t)s[0]);
29874
29875
    // Calculate the inverse of the src-alpha: how much of the dst to keep.
29876
0
    uint32_t ia = 0xFFFF - sa;
29877
29878
    // Composite src (premul) over dst (premul).
29879
0
    dr = sr + ((dr * ia) / 0xFFFF);
29880
0
    dg = sg + ((dg * ia) / 0xFFFF);
29881
0
    db = sb + ((db * ia) / 0xFFFF);
29882
29883
    // Convert to 16-bit color to 8-bit gray.
29884
0
    uint32_t weighted_average =
29885
0
        (19595 * dr) + (38470 * dg) + (7471 * db) + 32768;
29886
0
    d[0] = (uint8_t)(weighted_average >> 24);
29887
29888
0
    s += 1 * 4;
29889
0
    d += 1 * 1;
29890
0
    n -= 1;
29891
0
  }
29892
29893
0
  return len;
29894
0
}
29895
29896
static uint64_t  //
29897
wuffs_private_impl__swizzle_y__bgra_premul_4x16le__src(uint8_t* dst_ptr,
29898
                                                       size_t dst_len,
29899
                                                       uint8_t* dst_palette_ptr,
29900
                                                       size_t dst_palette_len,
29901
                                                       const uint8_t* src_ptr,
29902
0
                                                       size_t src_len) {
29903
0
  size_t src_len8 = src_len / 8;
29904
0
  size_t len = (dst_len < src_len8) ? dst_len : src_len8;
29905
0
  uint8_t* d = dst_ptr;
29906
0
  const uint8_t* s = src_ptr;
29907
0
  size_t n = len;
29908
29909
  // TODO: unroll.
29910
29911
0
  while (n >= 1) {
29912
0
    d[0] = wuffs_base__color_u64_argb_premul__as__color_u8_gray(
29913
0
        wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)));
29914
29915
0
    s += 1 * 8;
29916
0
    d += 1 * 1;
29917
0
    n -= 1;
29918
0
  }
29919
29920
0
  return len;
29921
0
}
29922
29923
static uint64_t  //
29924
wuffs_private_impl__swizzle_y__bgra_premul_4x16le__src_over(
29925
    uint8_t* dst_ptr,
29926
    size_t dst_len,
29927
    uint8_t* dst_palette_ptr,
29928
    size_t dst_palette_len,
29929
    const uint8_t* src_ptr,
29930
0
    size_t src_len) {
29931
0
  size_t src_len8 = src_len / 8;
29932
0
  size_t len = (dst_len < src_len8) ? dst_len : src_len8;
29933
0
  uint8_t* d = dst_ptr;
29934
0
  const uint8_t* s = src_ptr;
29935
0
  size_t n = len;
29936
29937
  // TODO: unroll.
29938
29939
0
  while (n >= 1) {
29940
    // Extract 16-bit color components.
29941
0
    uint32_t dr = 0x101 * ((uint32_t)d[0]);
29942
0
    uint32_t dg = 0x101 * ((uint32_t)d[0]);
29943
0
    uint32_t db = 0x101 * ((uint32_t)d[0]);
29944
0
    uint32_t sa = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 6));
29945
0
    uint32_t sr = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 4));
29946
0
    uint32_t sg = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 2));
29947
0
    uint32_t sb = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 0));
29948
29949
    // Calculate the inverse of the src-alpha: how much of the dst to keep.
29950
0
    uint32_t ia = 0xFFFF - sa;
29951
29952
    // Composite src (premul) over dst (premul).
29953
0
    dr = sr + ((dr * ia) / 0xFFFF);
29954
0
    dg = sg + ((dg * ia) / 0xFFFF);
29955
0
    db = sb + ((db * ia) / 0xFFFF);
29956
29957
    // Convert to 16-bit color to 8-bit gray.
29958
0
    uint32_t weighted_average =
29959
0
        (19595 * dr) + (38470 * dg) + (7471 * db) + 32768;
29960
0
    d[0] = (uint8_t)(weighted_average >> 24);
29961
29962
0
    s += 1 * 8;
29963
0
    d += 1 * 1;
29964
0
    n -= 1;
29965
0
  }
29966
29967
0
  return len;
29968
0
}
29969
29970
static uint64_t  //
29971
wuffs_private_impl__swizzle_y__bgrx(uint8_t* dst_ptr,
29972
                                    size_t dst_len,
29973
                                    uint8_t* dst_palette_ptr,
29974
                                    size_t dst_palette_len,
29975
                                    const uint8_t* src_ptr,
29976
0
                                    size_t src_len) {
29977
0
  size_t src_len4 = src_len / 4;
29978
0
  size_t len = (dst_len < src_len4) ? dst_len : src_len4;
29979
0
  uint8_t* d = dst_ptr;
29980
0
  const uint8_t* s = src_ptr;
29981
0
  size_t n = len;
29982
29983
  // TODO: unroll.
29984
29985
0
  while (n >= 1) {
29986
0
    uint32_t s0 =
29987
0
        0xFF000000 | wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4));
29988
0
    d[0] = wuffs_base__color_u32_argb_premul__as__color_u8_gray(s0);
29989
29990
0
    s += 1 * 4;
29991
0
    d += 1 * 1;
29992
0
    n -= 1;
29993
0
  }
29994
29995
0
  return len;
29996
0
}
29997
29998
static uint64_t  //
29999
wuffs_private_impl__swizzle_y__rgb(uint8_t* dst_ptr,
30000
                                   size_t dst_len,
30001
                                   uint8_t* dst_palette_ptr,
30002
                                   size_t dst_palette_len,
30003
                                   const uint8_t* src_ptr,
30004
0
                                   size_t src_len) {
30005
0
  size_t src_len3 = src_len / 3;
30006
0
  size_t len = (dst_len < src_len3) ? dst_len : src_len3;
30007
0
  uint8_t* d = dst_ptr;
30008
0
  const uint8_t* s = src_ptr;
30009
0
  size_t n = len;
30010
30011
  // TODO: unroll.
30012
30013
0
  while (n >= 1) {
30014
0
    uint32_t s0 =
30015
0
        0xFF000000 | wuffs_base__peek_u24be__no_bounds_check(s + (0 * 3));
30016
0
    d[0] = wuffs_base__color_u32_argb_premul__as__color_u8_gray(s0);
30017
30018
0
    s += 1 * 3;
30019
0
    d += 1 * 1;
30020
0
    n -= 1;
30021
0
  }
30022
30023
0
  return len;
30024
0
}
30025
30026
static uint64_t  //
30027
wuffs_private_impl__swizzle_y__rgba_nonpremul__src(uint8_t* dst_ptr,
30028
                                                   size_t dst_len,
30029
                                                   uint8_t* dst_palette_ptr,
30030
                                                   size_t dst_palette_len,
30031
                                                   const uint8_t* src_ptr,
30032
0
                                                   size_t src_len) {
30033
0
  size_t src_len4 = src_len / 4;
30034
0
  size_t len = (dst_len < src_len4) ? dst_len : src_len4;
30035
0
  uint8_t* d = dst_ptr;
30036
0
  const uint8_t* s = src_ptr;
30037
0
  size_t n = len;
30038
30039
  // TODO: unroll.
30040
30041
0
  while (n >= 1) {
30042
0
    uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr(
30043
0
        wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(
30044
0
            wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))));
30045
0
    d[0] = wuffs_base__color_u32_argb_premul__as__color_u8_gray(s0);
30046
30047
0
    s += 1 * 4;
30048
0
    d += 1 * 1;
30049
0
    n -= 1;
30050
0
  }
30051
30052
0
  return len;
30053
0
}
30054
30055
static uint64_t  //
30056
wuffs_private_impl__swizzle_y__rgba_nonpremul__src_over(
30057
    uint8_t* dst_ptr,
30058
    size_t dst_len,
30059
    uint8_t* dst_palette_ptr,
30060
    size_t dst_palette_len,
30061
    const uint8_t* src_ptr,
30062
0
    size_t src_len) {
30063
0
  size_t src_len4 = src_len / 4;
30064
0
  size_t len = (dst_len < src_len4) ? dst_len : src_len4;
30065
0
  uint8_t* d = dst_ptr;
30066
0
  const uint8_t* s = src_ptr;
30067
0
  size_t n = len;
30068
30069
  // TODO: unroll.
30070
30071
0
  while (n >= 1) {
30072
0
    uint32_t d0 = 0xFF000000 | (0x00010101 * ((uint32_t)(d[0])));
30073
0
    uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr(
30074
0
        wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
30075
0
    d[0] = wuffs_base__color_u32_argb_premul__as__color_u8_gray(
30076
0
        wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0));
30077
30078
0
    s += 1 * 4;
30079
0
    d += 1 * 1;
30080
0
    n -= 1;
30081
0
  }
30082
30083
0
  return len;
30084
0
}
30085
30086
static uint64_t  //
30087
wuffs_private_impl__swizzle_y__rgba_premul__src(uint8_t* dst_ptr,
30088
                                                size_t dst_len,
30089
                                                uint8_t* dst_palette_ptr,
30090
                                                size_t dst_palette_len,
30091
                                                const uint8_t* src_ptr,
30092
0
                                                size_t src_len) {
30093
0
  size_t src_len4 = src_len / 4;
30094
0
  size_t len = (dst_len < src_len4) ? dst_len : src_len4;
30095
0
  uint8_t* d = dst_ptr;
30096
0
  const uint8_t* s = src_ptr;
30097
0
  size_t n = len;
30098
30099
  // TODO: unroll.
30100
30101
0
  while (n >= 1) {
30102
0
    uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr(
30103
0
        wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
30104
0
    d[0] = wuffs_base__color_u32_argb_premul__as__color_u8_gray(s0);
30105
30106
0
    s += 1 * 4;
30107
0
    d += 1 * 1;
30108
0
    n -= 1;
30109
0
  }
30110
30111
0
  return len;
30112
0
}
30113
30114
static uint64_t  //
30115
wuffs_private_impl__swizzle_y__rgba_premul__src_over(uint8_t* dst_ptr,
30116
                                                     size_t dst_len,
30117
                                                     uint8_t* dst_palette_ptr,
30118
                                                     size_t dst_palette_len,
30119
                                                     const uint8_t* src_ptr,
30120
0
                                                     size_t src_len) {
30121
0
  size_t src_len4 = src_len / 4;
30122
0
  size_t len = (dst_len < src_len4) ? dst_len : src_len4;
30123
0
  uint8_t* d = dst_ptr;
30124
0
  const uint8_t* s = src_ptr;
30125
0
  size_t n = len;
30126
30127
  // TODO: unroll.
30128
30129
0
  while (n >= 1) {
30130
0
    uint32_t d0 = 0xFF000000 | (0x00010101 * ((uint32_t)(d[0])));
30131
0
    uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr(
30132
0
        wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
30133
0
    d[0] = wuffs_base__color_u32_argb_premul__as__color_u8_gray(
30134
0
        wuffs_private_impl__composite_premul_premul_u32_axxx(d0, s0));
30135
30136
0
    s += 1 * 4;
30137
0
    d += 1 * 1;
30138
0
    n -= 1;
30139
0
  }
30140
30141
0
  return len;
30142
0
}
30143
30144
static uint64_t  //
30145
wuffs_private_impl__swizzle_y__y_16be(uint8_t* dst_ptr,
30146
                                      size_t dst_len,
30147
                                      uint8_t* dst_palette_ptr,
30148
                                      size_t dst_palette_len,
30149
                                      const uint8_t* src_ptr,
30150
0
                                      size_t src_len) {
30151
0
  size_t src_len2 = src_len / 2;
30152
0
  size_t len = (dst_len < src_len2) ? dst_len : src_len2;
30153
0
  uint8_t* d = dst_ptr;
30154
0
  const uint8_t* s = src_ptr;
30155
0
  size_t n = len;
30156
30157
  // TODO: unroll.
30158
30159
0
  while (n >= 1) {
30160
0
    d[0] = s[0];
30161
30162
0
    s += 1 * 2;
30163
0
    d += 1 * 1;
30164
0
    n -= 1;
30165
0
  }
30166
30167
0
  return len;
30168
0
}
30169
30170
static uint64_t  //
30171
wuffs_private_impl__swizzle_y__y_16le(uint8_t* dst_ptr,
30172
                                      size_t dst_len,
30173
                                      uint8_t* dst_palette_ptr,
30174
                                      size_t dst_palette_len,
30175
                                      const uint8_t* src_ptr,
30176
0
                                      size_t src_len) {
30177
0
  size_t src_len2 = src_len / 2;
30178
0
  size_t len = (dst_len < src_len2) ? dst_len : src_len2;
30179
0
  uint8_t* d = dst_ptr;
30180
0
  const uint8_t* s = src_ptr;
30181
0
  size_t n = len;
30182
30183
  // TODO: unroll.
30184
30185
0
  while (n >= 1) {
30186
0
    d[0] = s[1];
30187
30188
0
    s += 1 * 2;
30189
0
    d += 1 * 1;
30190
0
    n -= 1;
30191
0
  }
30192
30193
0
  return len;
30194
0
}
30195
30196
static uint64_t  //
30197
wuffs_private_impl__swizzle_y__ya_nonpremul__src(uint8_t* dst_ptr,
30198
                                                 size_t dst_len,
30199
                                                 uint8_t* dst_palette_ptr,
30200
                                                 size_t dst_palette_len,
30201
                                                 const uint8_t* src_ptr,
30202
0
                                                 size_t src_len) {
30203
0
  size_t src_len2 = src_len / 2;
30204
0
  size_t len = (dst_len < src_len2) ? dst_len : src_len2;
30205
0
  uint8_t* d = dst_ptr;
30206
0
  const uint8_t* s = src_ptr;
30207
0
  size_t n = len;
30208
30209
  // TODO: unroll.
30210
30211
0
  while (n >= 1) {
30212
0
    uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101);
30213
0
    d[0] = (uint8_t)
30214
0
        wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(s0);
30215
30216
0
    s += 1 * 2;
30217
0
    d += 1 * 1;
30218
0
    n -= 1;
30219
0
  }
30220
30221
0
  return len;
30222
0
}
30223
30224
static uint64_t  //
30225
wuffs_private_impl__swizzle_y__ya_nonpremul__src_over(uint8_t* dst_ptr,
30226
                                                      size_t dst_len,
30227
                                                      uint8_t* dst_palette_ptr,
30228
                                                      size_t dst_palette_len,
30229
                                                      const uint8_t* src_ptr,
30230
0
                                                      size_t src_len) {
30231
0
  size_t src_len2 = src_len / 2;
30232
0
  size_t len = (dst_len < src_len2) ? dst_len : src_len2;
30233
0
  uint8_t* d = dst_ptr;
30234
0
  const uint8_t* s = src_ptr;
30235
0
  size_t n = len;
30236
30237
  // TODO: unroll.
30238
30239
0
  while (n >= 1) {
30240
0
    uint32_t d0 = 0xFF000000 | ((uint32_t)(d[0]) * 0x010101);
30241
0
    uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101);
30242
0
    d[0] = (uint8_t)wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0,
30243
0
                                                                            s0);
30244
30245
0
    s += 1 * 2;
30246
0
    d += 1 * 1;
30247
0
    n -= 1;
30248
0
  }
30249
30250
0
  return len;
30251
0
}
30252
30253
static uint64_t  //
30254
wuffs_private_impl__swizzle_y__index__src(uint8_t* dst_ptr,
30255
                                          size_t dst_len,
30256
                                          uint8_t* dst_palette_ptr,
30257
                                          size_t dst_palette_len,
30258
                                          const uint8_t* src_ptr,
30259
0
                                          size_t src_len) {
30260
0
  if (dst_palette_len !=
30261
0
      WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
30262
0
    return 0;
30263
0
  }
30264
0
  size_t len = (dst_len < src_len) ? dst_len : src_len;
30265
0
  uint8_t* d = dst_ptr;
30266
0
  const uint8_t* s = src_ptr;
30267
0
  size_t n = len;
30268
30269
  // TODO: unroll.
30270
30271
0
  while (n >= 1) {
30272
0
    d[0] = dst_palette_ptr[(size_t)s[0] * 4];
30273
30274
0
    s += 1 * 1;
30275
0
    d += 1 * 1;
30276
0
    n -= 1;
30277
0
  }
30278
30279
0
  return len;
30280
0
}
30281
30282
static uint64_t  //
30283
wuffs_private_impl__swizzle_y__index_bgra_nonpremul__src_over(
30284
    uint8_t* dst_ptr,
30285
    size_t dst_len,
30286
    uint8_t* dst_palette_ptr,
30287
    size_t dst_palette_len,
30288
    const uint8_t* src_ptr,
30289
0
    size_t src_len) {
30290
0
  if (dst_palette_len !=
30291
0
      WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
30292
0
    return 0;
30293
0
  }
30294
0
  size_t len = (dst_len < src_len) ? dst_len : src_len;
30295
0
  uint8_t* d = dst_ptr;
30296
0
  const uint8_t* s = src_ptr;
30297
0
  size_t n = len;
30298
30299
  // TODO: unroll.
30300
30301
0
  while (n >= 1) {
30302
0
    uint32_t d0 = 0xFF000000 | (0x00010101 * ((uint32_t)(d[0])));
30303
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
30304
0
                                                          ((size_t)s[0] * 4));
30305
0
    d[0] = wuffs_base__color_u32_argb_premul__as__color_u8_gray(
30306
0
        wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0));
30307
30308
0
    s += 1 * 1;
30309
0
    d += 1 * 1;
30310
0
    n -= 1;
30311
0
  }
30312
30313
0
  return len;
30314
0
}
30315
30316
static uint64_t  //
30317
wuffs_private_impl__swizzle_y__index_binary_alpha__src_over(
30318
    uint8_t* dst_ptr,
30319
    size_t dst_len,
30320
    uint8_t* dst_palette_ptr,
30321
    size_t dst_palette_len,
30322
    const uint8_t* src_ptr,
30323
0
    size_t src_len) {
30324
0
  if (dst_palette_len !=
30325
0
      WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
30326
0
    return 0;
30327
0
  }
30328
0
  size_t len = (dst_len < src_len) ? dst_len : src_len;
30329
0
  uint8_t* d = dst_ptr;
30330
0
  const uint8_t* s = src_ptr;
30331
0
  size_t n = len;
30332
30333
  // TODO: unroll.
30334
30335
0
  while (n >= 1) {
30336
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
30337
0
                                                          ((size_t)s[0] * 4));
30338
0
    if (s0) {
30339
0
      d[0] = (uint8_t)s0;
30340
0
    }
30341
30342
0
    s += 1 * 1;
30343
0
    d += 1 * 1;
30344
0
    n -= 1;
30345
0
  }
30346
30347
0
  return len;
30348
0
}
30349
30350
// --------
30351
30352
static uint64_t  //
30353
wuffs_private_impl__swizzle_y_16le__y_16be(uint8_t* dst_ptr,
30354
                                           size_t dst_len,
30355
                                           uint8_t* dst_palette_ptr,
30356
                                           size_t dst_palette_len,
30357
                                           const uint8_t* src_ptr,
30358
0
                                           size_t src_len) {
30359
0
  size_t dst_len2 = dst_len / 2;
30360
0
  size_t src_len2 = src_len / 2;
30361
0
  size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2;
30362
0
  uint8_t* d = dst_ptr;
30363
0
  const uint8_t* s = src_ptr;
30364
0
  size_t n = len;
30365
30366
0
  while (n >= 1) {
30367
0
    uint8_t s0 = s[0];
30368
0
    uint8_t s1 = s[1];
30369
0
    d[0] = s1;
30370
0
    d[1] = s0;
30371
30372
0
    s += 1 * 2;
30373
0
    d += 1 * 2;
30374
0
    n -= 1;
30375
0
  }
30376
30377
0
  return len;
30378
0
}
30379
30380
// --------
30381
30382
static uint64_t  //
30383
wuffs_private_impl__swizzle_ya_nonpremul__ya_nonpremul__src_over(
30384
    uint8_t* dst_ptr,
30385
    size_t dst_len,
30386
    uint8_t* dst_palette_ptr,
30387
    size_t dst_palette_len,
30388
    const uint8_t* src_ptr,
30389
0
    size_t src_len) {
30390
0
  size_t dst_len2 = dst_len / 2;
30391
0
  size_t src_len2 = src_len / 2;
30392
0
  size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2;
30393
0
  uint8_t* d = dst_ptr;
30394
0
  const uint8_t* s = src_ptr;
30395
0
  size_t n = len;
30396
30397
0
  while (n >= 1) {
30398
0
    uint32_t d0 = ((uint32_t)(d[1]) << 24) | ((uint32_t)(d[0]) * 0x010101);
30399
0
    uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101);
30400
0
    uint32_t c0 =
30401
0
        wuffs_private_impl__composite_nonpremul_nonpremul_u32_axxx(d0, s0);
30402
0
    wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)(c0 >> 16));
30403
30404
0
    s += 1 * 2;
30405
0
    d += 1 * 2;
30406
0
    n -= 1;
30407
0
  }
30408
30409
0
  return len;
30410
0
}
30411
30412
// --------
30413
30414
static uint64_t  //
30415
wuffs_private_impl__swizzle_transparent_black_src(
30416
    uint8_t* dst_ptr,
30417
    size_t dst_len,
30418
    uint8_t* dst_palette_ptr,
30419
    size_t dst_palette_len,
30420
    uint64_t num_pixels,
30421
0
    uint32_t dst_pixfmt_bytes_per_pixel) {
30422
0
  uint64_t n = ((uint64_t)dst_len) / dst_pixfmt_bytes_per_pixel;
30423
0
  if (n > num_pixels) {
30424
0
    n = num_pixels;
30425
0
  }
30426
0
  memset(dst_ptr, 0, ((size_t)(n * dst_pixfmt_bytes_per_pixel)));
30427
0
  return n;
30428
0
}
30429
30430
static uint64_t  //
30431
wuffs_private_impl__swizzle_transparent_black_src_over(
30432
    uint8_t* dst_ptr,
30433
    size_t dst_len,
30434
    uint8_t* dst_palette_ptr,
30435
    size_t dst_palette_len,
30436
    uint64_t num_pixels,
30437
0
    uint32_t dst_pixfmt_bytes_per_pixel) {
30438
0
  uint64_t n = ((uint64_t)dst_len) / dst_pixfmt_bytes_per_pixel;
30439
0
  if (n > num_pixels) {
30440
0
    n = num_pixels;
30441
0
  }
30442
0
  return n;
30443
0
}
30444
30445
// --------
30446
30447
static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func  //
30448
wuffs_private_impl__pixel_swizzler__prepare__y(
30449
    wuffs_base__pixel_swizzler* p,
30450
    wuffs_base__pixel_format dst_pixfmt,
30451
    wuffs_base__slice_u8 dst_palette,
30452
    wuffs_base__slice_u8 src_palette,
30453
1.94k
    wuffs_base__pixel_blend blend) {
30454
1.94k
  switch (dst_pixfmt.repr) {
30455
1.00k
    case WUFFS_BASE__PIXEL_FORMAT__Y:
30456
1.00k
      return wuffs_private_impl__swizzle_copy_1_1;
30457
30458
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
30459
0
      return wuffs_private_impl__swizzle_bgr_565__y;
30460
30461
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
30462
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
30463
0
      return wuffs_private_impl__swizzle_xxx__y;
30464
30465
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
30466
946
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
30467
946
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
30468
946
    case WUFFS_BASE__PIXEL_FORMAT__BGRX:
30469
946
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
30470
946
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
30471
946
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
30472
946
    case WUFFS_BASE__PIXEL_FORMAT__RGBX:
30473
946
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
30474
946
      if (wuffs_base__cpu_arch__have_x86_sse42()) {
30475
946
        return wuffs_private_impl__swizzle_xxxx__y__x86_sse42;
30476
946
      }
30477
0
#endif
30478
0
      return wuffs_private_impl__swizzle_xxxx__y;
30479
30480
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
30481
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE:
30482
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL_4X16LE:
30483
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL_4X16LE:
30484
0
      return wuffs_private_impl__swizzle_xxxxxxxx__y;
30485
1.94k
  }
30486
0
  return NULL;
30487
1.94k
}
30488
30489
static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func  //
30490
wuffs_private_impl__pixel_swizzler__prepare__y_16be(
30491
    wuffs_base__pixel_swizzler* p,
30492
    wuffs_base__pixel_format dst_pixfmt,
30493
    wuffs_base__slice_u8 dst_palette,
30494
    wuffs_base__slice_u8 src_palette,
30495
0
    wuffs_base__pixel_blend blend) {
30496
0
  switch (dst_pixfmt.repr) {
30497
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
30498
0
      return wuffs_private_impl__swizzle_y__y_16be;
30499
30500
0
    case WUFFS_BASE__PIXEL_FORMAT__Y_16LE:
30501
0
      return wuffs_private_impl__swizzle_y_16le__y_16be;
30502
30503
0
    case WUFFS_BASE__PIXEL_FORMAT__Y_16BE:
30504
0
      return wuffs_private_impl__swizzle_copy_2_2;
30505
30506
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
30507
0
      return wuffs_private_impl__swizzle_bgr_565__y_16be;
30508
30509
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
30510
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
30511
0
      return wuffs_private_impl__swizzle_xxx__y_16be;
30512
30513
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
30514
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
30515
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
30516
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRX:
30517
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
30518
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
30519
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
30520
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBX:
30521
0
      return wuffs_private_impl__swizzle_xxxx__y_16be;
30522
30523
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
30524
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE:
30525
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL_4X16LE:
30526
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL_4X16LE:
30527
0
      return wuffs_private_impl__swizzle_xxxxxxxx__y_16be;
30528
0
  }
30529
0
  return NULL;
30530
0
}
30531
30532
static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func  //
30533
wuffs_private_impl__pixel_swizzler__prepare__y_16le(
30534
    wuffs_base__pixel_swizzler* p,
30535
    wuffs_base__pixel_format dst_pixfmt,
30536
    wuffs_base__slice_u8 dst_palette,
30537
    wuffs_base__slice_u8 src_palette,
30538
0
    wuffs_base__pixel_blend blend) {
30539
0
  switch (dst_pixfmt.repr) {
30540
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
30541
0
      return wuffs_private_impl__swizzle_y__y_16le;
30542
30543
0
    case WUFFS_BASE__PIXEL_FORMAT__Y_16LE:
30544
0
      return wuffs_private_impl__swizzle_copy_2_2;
30545
30546
0
    case WUFFS_BASE__PIXEL_FORMAT__Y_16BE:
30547
0
      return wuffs_private_impl__swizzle_y_16le__y_16be;
30548
30549
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
30550
0
      return wuffs_private_impl__swizzle_bgr_565__y_16le;
30551
30552
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
30553
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
30554
0
      return wuffs_private_impl__swizzle_xxx__y_16le;
30555
30556
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
30557
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
30558
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
30559
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRX:
30560
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
30561
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
30562
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
30563
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBX:
30564
0
      return wuffs_private_impl__swizzle_xxxx__y_16le;
30565
30566
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
30567
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE:
30568
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL_4X16LE:
30569
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL_4X16LE:
30570
0
      return wuffs_private_impl__swizzle_xxxxxxxx__y_16le;
30571
0
  }
30572
0
  return NULL;
30573
0
}
30574
30575
static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func  //
30576
wuffs_private_impl__pixel_swizzler__prepare__ya_nonpremul(
30577
    wuffs_base__pixel_swizzler* p,
30578
    wuffs_base__pixel_format dst_pixfmt,
30579
    wuffs_base__slice_u8 dst_palette,
30580
    wuffs_base__slice_u8 src_palette,
30581
0
    wuffs_base__pixel_blend blend) {
30582
0
  switch (dst_pixfmt.repr) {
30583
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
30584
0
      switch (blend) {
30585
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30586
0
          return wuffs_private_impl__swizzle_y__ya_nonpremul__src;
30587
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30588
0
          return wuffs_private_impl__swizzle_y__ya_nonpremul__src_over;
30589
0
      }
30590
0
      return NULL;
30591
30592
0
    case WUFFS_BASE__PIXEL_FORMAT__YA_NONPREMUL:
30593
0
      switch (blend) {
30594
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30595
0
          return wuffs_private_impl__swizzle_copy_2_2;
30596
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30597
0
          return wuffs_private_impl__swizzle_ya_nonpremul__ya_nonpremul__src_over;
30598
0
      }
30599
0
      return NULL;
30600
30601
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
30602
0
      switch (blend) {
30603
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30604
0
          return wuffs_private_impl__swizzle_bgr_565__ya_nonpremul__src;
30605
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30606
0
          return wuffs_private_impl__swizzle_bgr_565__ya_nonpremul__src_over;
30607
0
      }
30608
0
      return NULL;
30609
30610
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
30611
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
30612
0
      switch (blend) {
30613
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30614
0
          return wuffs_private_impl__swizzle_xxx__ya_nonpremul__src;
30615
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30616
0
          return wuffs_private_impl__swizzle_xxx__ya_nonpremul__src_over;
30617
0
      }
30618
0
      return NULL;
30619
30620
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
30621
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
30622
0
      switch (blend) {
30623
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30624
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__ya_nonpremul__src;
30625
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30626
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__ya_nonpremul__src_over;
30627
0
      }
30628
0
      return NULL;
30629
30630
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
30631
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
30632
0
      switch (blend) {
30633
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30634
0
          return wuffs_private_impl__swizzle_bgra_premul__ya_nonpremul__src;
30635
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30636
0
          return wuffs_private_impl__swizzle_bgra_premul__ya_nonpremul__src_over;
30637
0
      }
30638
0
      return NULL;
30639
30640
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
30641
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL_4X16LE:
30642
0
      switch (blend) {
30643
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30644
0
          return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__ya_nonpremul__src;
30645
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30646
0
          return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__ya_nonpremul__src_over;
30647
0
      }
30648
0
      return NULL;
30649
0
  }
30650
0
  return NULL;
30651
0
}
30652
30653
static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func  //
30654
wuffs_private_impl__pixel_swizzler__prepare__indexed__bgra_nonpremul(
30655
    wuffs_base__pixel_swizzler* p,
30656
    wuffs_base__pixel_format dst_pixfmt,
30657
    wuffs_base__slice_u8 dst_palette,
30658
    wuffs_base__slice_u8 src_palette,
30659
0
    wuffs_base__pixel_blend blend) {
30660
0
  switch (dst_pixfmt.repr) {
30661
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
30662
0
      switch (blend) {
30663
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30664
0
          if (wuffs_private_impl__swizzle_squash_align4_y_8888(
30665
0
                  dst_palette.ptr, dst_palette.len, src_palette.ptr,
30666
0
                  src_palette.len, true) !=
30667
0
              (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) {
30668
0
            return NULL;
30669
0
          }
30670
0
          return wuffs_private_impl__swizzle_y__index__src;
30671
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30672
0
          if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette,
30673
0
                                                            src_palette) !=
30674
0
              WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
30675
0
            return NULL;
30676
0
          }
30677
0
          return wuffs_private_impl__swizzle_y__index_bgra_nonpremul__src_over;
30678
0
      }
30679
0
      return NULL;
30680
30681
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL:
30682
0
      if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette,
30683
0
                                                        src_palette) !=
30684
0
          WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
30685
0
        return NULL;
30686
0
      }
30687
0
      switch (blend) {
30688
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30689
0
          return wuffs_private_impl__swizzle_copy_1_1;
30690
0
      }
30691
0
      return NULL;
30692
30693
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
30694
0
      switch (blend) {
30695
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30696
0
          if (wuffs_private_impl__swizzle_squash_align4_bgr_565_8888(
30697
0
                  dst_palette.ptr, dst_palette.len, src_palette.ptr,
30698
0
                  src_palette.len, true) !=
30699
0
              (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) {
30700
0
            return NULL;
30701
0
          }
30702
0
          return wuffs_private_impl__swizzle_bgr_565__index__src;
30703
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30704
0
          if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette,
30705
0
                                                            src_palette) !=
30706
0
              WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
30707
0
            return NULL;
30708
0
          }
30709
0
          return wuffs_private_impl__swizzle_bgr_565__index_bgra_nonpremul__src_over;
30710
0
      }
30711
0
      return NULL;
30712
30713
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
30714
0
      switch (blend) {
30715
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30716
0
          if (wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul__src(
30717
0
                  dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr,
30718
0
                  src_palette.len) !=
30719
0
              (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) {
30720
0
            return NULL;
30721
0
          }
30722
0
          return wuffs_private_impl__swizzle_xxx__index__src;
30723
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30724
0
          if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette,
30725
0
                                                            src_palette) !=
30726
0
              WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
30727
0
            return NULL;
30728
0
          }
30729
0
          return wuffs_private_impl__swizzle_xxx__index_bgra_nonpremul__src_over;
30730
0
      }
30731
0
      return NULL;
30732
30733
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
30734
0
      if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette,
30735
0
                                                        src_palette) !=
30736
0
          WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
30737
0
        return NULL;
30738
0
      }
30739
0
      switch (blend) {
30740
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30741
0
          return wuffs_private_impl__swizzle_xxxx__index__src;
30742
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30743
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__index_bgra_nonpremul__src_over;
30744
0
      }
30745
0
      return NULL;
30746
30747
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
30748
0
      if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette,
30749
0
                                                        src_palette) !=
30750
0
          WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
30751
0
        return NULL;
30752
0
      }
30753
0
      switch (blend) {
30754
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30755
0
          return wuffs_private_impl__swizzle_xxxxxxxx__index__src;
30756
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30757
0
          return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__index_bgra_nonpremul__src_over;
30758
0
      }
30759
0
      return NULL;
30760
30761
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
30762
0
      switch (blend) {
30763
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30764
0
          if (wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul__src(
30765
0
                  dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr,
30766
0
                  src_palette.len) !=
30767
0
              (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) {
30768
0
            return NULL;
30769
0
          }
30770
0
          return wuffs_private_impl__swizzle_xxxx__index__src;
30771
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30772
0
          if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette,
30773
0
                                                            src_palette) !=
30774
0
              WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
30775
0
            return NULL;
30776
0
          }
30777
0
          return wuffs_private_impl__swizzle_bgra_premul__index_bgra_nonpremul__src_over;
30778
0
      }
30779
0
      return NULL;
30780
30781
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
30782
0
      switch (blend) {
30783
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30784
0
          if (wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul__src(
30785
0
                  dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr,
30786
0
                  src_palette.len) !=
30787
0
              (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) {
30788
0
            return NULL;
30789
0
          }
30790
0
          return wuffs_private_impl__swizzle_xxx__index__src;
30791
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30792
0
          if (wuffs_private_impl__swizzle_swap_rgbx_bgrx(
30793
0
                  dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr,
30794
0
                  src_palette.len) !=
30795
0
              (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) {
30796
0
            return NULL;
30797
0
          }
30798
0
          return wuffs_private_impl__swizzle_xxx__index_bgra_nonpremul__src_over;
30799
0
      }
30800
0
      return NULL;
30801
30802
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
30803
0
      if (wuffs_private_impl__swizzle_swap_rgbx_bgrx(
30804
0
              dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr,
30805
0
              src_palette.len) !=
30806
0
          (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) {
30807
0
        return NULL;
30808
0
      }
30809
0
      switch (blend) {
30810
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30811
0
          return wuffs_private_impl__swizzle_xxxx__index__src;
30812
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30813
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__index_bgra_nonpremul__src_over;
30814
0
      }
30815
0
      return NULL;
30816
30817
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
30818
0
      switch (blend) {
30819
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30820
0
          if (wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul__src(
30821
0
                  dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr,
30822
0
                  src_palette.len) !=
30823
0
              (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) {
30824
0
            return NULL;
30825
0
          }
30826
0
          return wuffs_private_impl__swizzle_xxxx__index__src;
30827
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30828
0
          if (wuffs_private_impl__swizzle_swap_rgbx_bgrx(
30829
0
                  dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr,
30830
0
                  src_palette.len) !=
30831
0
              (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) {
30832
0
            return NULL;
30833
0
          }
30834
0
          return wuffs_private_impl__swizzle_bgra_premul__index_bgra_nonpremul__src_over;
30835
0
      }
30836
0
      return NULL;
30837
30838
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBX:
30839
      // TODO.
30840
0
      break;
30841
0
  }
30842
0
  return NULL;
30843
0
}
30844
30845
static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func  //
30846
wuffs_private_impl__pixel_swizzler__prepare__indexed__bgra_binary(
30847
    wuffs_base__pixel_swizzler* p,
30848
    wuffs_base__pixel_format dst_pixfmt,
30849
    wuffs_base__slice_u8 dst_palette,
30850
    wuffs_base__slice_u8 src_palette,
30851
0
    wuffs_base__pixel_blend blend) {
30852
0
  switch (dst_pixfmt.repr) {
30853
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
30854
0
      if (wuffs_private_impl__swizzle_squash_align4_y_8888(
30855
0
              dst_palette.ptr, dst_palette.len, src_palette.ptr,
30856
0
              src_palette.len, false) !=
30857
0
          (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) {
30858
0
        return NULL;
30859
0
      }
30860
0
      switch (blend) {
30861
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30862
0
          return wuffs_private_impl__swizzle_y__index__src;
30863
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30864
0
          return wuffs_private_impl__swizzle_y__index_binary_alpha__src_over;
30865
0
      }
30866
0
      return NULL;
30867
30868
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL:
30869
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL:
30870
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY:
30871
0
      if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette,
30872
0
                                                        src_palette) !=
30873
0
          WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
30874
0
        return NULL;
30875
0
      }
30876
0
      switch (blend) {
30877
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30878
0
          return wuffs_private_impl__swizzle_copy_1_1;
30879
0
      }
30880
0
      return NULL;
30881
30882
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
30883
0
      if (wuffs_private_impl__swizzle_squash_align4_bgr_565_8888(
30884
0
              dst_palette.ptr, dst_palette.len, src_palette.ptr,
30885
0
              src_palette.len, false) !=
30886
0
          (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) {
30887
0
        return NULL;
30888
0
      }
30889
0
      switch (blend) {
30890
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30891
0
          return wuffs_private_impl__swizzle_bgr_565__index__src;
30892
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30893
0
          return wuffs_private_impl__swizzle_bgr_565__index_binary_alpha__src_over;
30894
0
      }
30895
0
      return NULL;
30896
30897
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
30898
0
      if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette,
30899
0
                                                        src_palette) !=
30900
0
          WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
30901
0
        return NULL;
30902
0
      }
30903
0
      switch (blend) {
30904
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30905
0
          return wuffs_private_impl__swizzle_xxx__index__src;
30906
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30907
0
          return wuffs_private_impl__swizzle_xxx__index_binary_alpha__src_over;
30908
0
      }
30909
0
      return NULL;
30910
30911
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
30912
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
30913
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
30914
0
      if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette,
30915
0
                                                        src_palette) !=
30916
0
          WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
30917
0
        return NULL;
30918
0
      }
30919
0
      switch (blend) {
30920
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30921
0
          return wuffs_private_impl__swizzle_xxxx__index__src;
30922
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30923
0
          return wuffs_private_impl__swizzle_xxxx__index_binary_alpha__src_over;
30924
0
      }
30925
0
      return NULL;
30926
30927
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
30928
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE:
30929
0
      if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette,
30930
0
                                                        src_palette) !=
30931
0
          WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
30932
0
        return NULL;
30933
0
      }
30934
0
      switch (blend) {
30935
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30936
0
          return wuffs_private_impl__swizzle_xxxxxxxx__index__src;
30937
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30938
0
          return wuffs_private_impl__swizzle_xxxxxxxx__index_binary_alpha__src_over;
30939
0
      }
30940
0
      return NULL;
30941
30942
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
30943
0
      if (wuffs_private_impl__swizzle_swap_rgbx_bgrx(
30944
0
              dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr,
30945
0
              src_palette.len) !=
30946
0
          (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) {
30947
0
        return NULL;
30948
0
      }
30949
0
      switch (blend) {
30950
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30951
0
          return wuffs_private_impl__swizzle_xxx__index__src;
30952
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30953
0
          return wuffs_private_impl__swizzle_xxx__index_binary_alpha__src_over;
30954
0
      }
30955
0
      return NULL;
30956
30957
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
30958
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
30959
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
30960
0
      if (wuffs_private_impl__swizzle_swap_rgbx_bgrx(
30961
0
              dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr,
30962
0
              src_palette.len) !=
30963
0
          (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) {
30964
0
        return NULL;
30965
0
      }
30966
0
      switch (blend) {
30967
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30968
0
          return wuffs_private_impl__swizzle_xxxx__index__src;
30969
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30970
0
          return wuffs_private_impl__swizzle_xxxx__index_binary_alpha__src_over;
30971
0
      }
30972
0
      return NULL;
30973
0
  }
30974
0
  return NULL;
30975
0
}
30976
30977
static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func  //
30978
wuffs_private_impl__pixel_swizzler__prepare__bgr_565(
30979
    wuffs_base__pixel_swizzler* p,
30980
    wuffs_base__pixel_format dst_pixfmt,
30981
    wuffs_base__slice_u8 dst_palette,
30982
    wuffs_base__slice_u8 src_palette,
30983
0
    wuffs_base__pixel_blend blend) {
30984
0
  switch (dst_pixfmt.repr) {
30985
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
30986
0
      return wuffs_private_impl__swizzle_y__bgr_565;
30987
30988
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
30989
0
      return wuffs_private_impl__swizzle_copy_2_2;
30990
30991
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
30992
0
      return wuffs_private_impl__swizzle_bgr__bgr_565;
30993
30994
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
30995
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
30996
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
30997
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRX:
30998
0
      return wuffs_private_impl__swizzle_bgrw__bgr_565;
30999
31000
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
31001
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE:
31002
0
      return wuffs_private_impl__swizzle_bgrw_4x16le__bgr_565;
31003
31004
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
31005
0
      return wuffs_private_impl__swizzle_rgb__bgr_565;
31006
31007
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
31008
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
31009
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
31010
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBX:
31011
0
      return wuffs_private_impl__swizzle_rgbw__bgr_565;
31012
0
  }
31013
0
  return NULL;
31014
0
}
31015
31016
static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func  //
31017
wuffs_private_impl__pixel_swizzler__prepare__bgr(
31018
    wuffs_base__pixel_swizzler* p,
31019
    wuffs_base__pixel_format dst_pixfmt,
31020
    wuffs_base__slice_u8 dst_palette,
31021
    wuffs_base__slice_u8 src_palette,
31022
0
    wuffs_base__pixel_blend blend) {
31023
0
  switch (dst_pixfmt.repr) {
31024
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
31025
0
      return wuffs_private_impl__swizzle_y__bgr;
31026
31027
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
31028
0
      return wuffs_private_impl__swizzle_bgr_565__bgr;
31029
31030
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
31031
0
      return wuffs_private_impl__swizzle_copy_3_3;
31032
31033
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
31034
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
31035
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
31036
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRX:
31037
0
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
31038
0
      if (wuffs_base__cpu_arch__have_x86_sse42()) {
31039
0
        return wuffs_private_impl__swizzle_bgrw__bgr__x86_sse42;
31040
0
      }
31041
0
#endif
31042
0
      return wuffs_private_impl__swizzle_bgrw__bgr;
31043
31044
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
31045
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE:
31046
0
      return wuffs_private_impl__swizzle_bgrw_4x16le__bgr;
31047
31048
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
31049
0
      return wuffs_private_impl__swizzle_swap_rgb_bgr;
31050
31051
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
31052
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
31053
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
31054
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBX:
31055
0
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
31056
0
      if (wuffs_base__cpu_arch__have_x86_sse42()) {
31057
0
        return wuffs_private_impl__swizzle_bgrw__rgb__x86_sse42;
31058
0
      }
31059
0
#endif
31060
0
      return wuffs_private_impl__swizzle_bgrw__rgb;
31061
0
  }
31062
0
  return NULL;
31063
0
}
31064
31065
static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func  //
31066
wuffs_private_impl__pixel_swizzler__prepare__bgra_nonpremul(
31067
    wuffs_base__pixel_swizzler* p,
31068
    wuffs_base__pixel_format dst_pixfmt,
31069
    wuffs_base__slice_u8 dst_palette,
31070
    wuffs_base__slice_u8 src_palette,
31071
0
    wuffs_base__pixel_blend blend) {
31072
0
  switch (dst_pixfmt.repr) {
31073
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
31074
0
      switch (blend) {
31075
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31076
0
          return wuffs_private_impl__swizzle_y__bgra_nonpremul__src;
31077
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31078
0
          return wuffs_private_impl__swizzle_y__bgra_nonpremul__src_over;
31079
0
      }
31080
0
      return NULL;
31081
31082
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
31083
0
      switch (blend) {
31084
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31085
0
          return wuffs_private_impl__swizzle_bgr_565__bgra_nonpremul__src;
31086
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31087
0
          return wuffs_private_impl__swizzle_bgr_565__bgra_nonpremul__src_over;
31088
0
      }
31089
0
      return NULL;
31090
31091
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
31092
0
      switch (blend) {
31093
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31094
0
          return wuffs_private_impl__swizzle_bgr__bgra_nonpremul__src;
31095
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31096
0
          return wuffs_private_impl__swizzle_bgr__bgra_nonpremul__src_over;
31097
0
      }
31098
0
      return NULL;
31099
31100
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
31101
0
      switch (blend) {
31102
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31103
0
          return wuffs_private_impl__swizzle_copy_4_4;
31104
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31105
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__bgra_nonpremul__src_over;
31106
0
      }
31107
0
      return NULL;
31108
31109
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
31110
0
      switch (blend) {
31111
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31112
0
          return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_nonpremul__src;
31113
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31114
0
          return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_nonpremul__src_over;
31115
0
      }
31116
0
      return NULL;
31117
31118
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
31119
0
      switch (blend) {
31120
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31121
0
          return wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul__src;
31122
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31123
0
          return wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul__src_over;
31124
0
      }
31125
0
      return NULL;
31126
31127
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
31128
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRX:
31129
      // TODO.
31130
0
      break;
31131
31132
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
31133
0
      switch (blend) {
31134
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31135
0
          return wuffs_private_impl__swizzle_bgr__rgba_nonpremul__src;
31136
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31137
0
          return wuffs_private_impl__swizzle_bgr__rgba_nonpremul__src_over;
31138
0
      }
31139
0
      return NULL;
31140
31141
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
31142
0
      switch (blend) {
31143
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31144
0
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
31145
0
          if (wuffs_base__cpu_arch__have_x86_sse42()) {
31146
0
            return wuffs_private_impl__swizzle_swap_rgbx_bgrx__x86_sse42;
31147
0
          }
31148
0
#endif
31149
0
          return wuffs_private_impl__swizzle_swap_rgbx_bgrx;
31150
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31151
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__rgba_nonpremul__src_over;
31152
0
      }
31153
0
      return NULL;
31154
31155
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
31156
0
      switch (blend) {
31157
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31158
0
          return wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul__src;
31159
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31160
0
          return wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul__src_over;
31161
0
      }
31162
0
      return NULL;
31163
31164
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
31165
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBX:
31166
      // TODO.
31167
0
      break;
31168
0
  }
31169
0
  return NULL;
31170
0
}
31171
31172
static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func  //
31173
wuffs_private_impl__pixel_swizzler__prepare__bgra_nonpremul_4x16le(
31174
    wuffs_base__pixel_swizzler* p,
31175
    wuffs_base__pixel_format dst_pixfmt,
31176
    wuffs_base__slice_u8 dst_palette,
31177
    wuffs_base__slice_u8 src_palette,
31178
0
    wuffs_base__pixel_blend blend) {
31179
0
  switch (dst_pixfmt.repr) {
31180
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
31181
0
      switch (blend) {
31182
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31183
0
          return wuffs_private_impl__swizzle_y__bgra_nonpremul_4x16le__src;
31184
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31185
0
          return wuffs_private_impl__swizzle_y__bgra_nonpremul_4x16le__src_over;
31186
0
      }
31187
0
      return NULL;
31188
31189
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
31190
0
      switch (blend) {
31191
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31192
0
          return wuffs_private_impl__swizzle_bgr_565__bgra_nonpremul_4x16le__src;
31193
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31194
0
          return wuffs_private_impl__swizzle_bgr_565__bgra_nonpremul_4x16le__src_over;
31195
0
      }
31196
0
      return NULL;
31197
31198
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
31199
0
      switch (blend) {
31200
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31201
0
          return wuffs_private_impl__swizzle_bgr__bgra_nonpremul_4x16le__src;
31202
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31203
0
          return wuffs_private_impl__swizzle_bgr__bgra_nonpremul_4x16le__src_over;
31204
0
      }
31205
0
      return NULL;
31206
31207
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
31208
0
      switch (blend) {
31209
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31210
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__bgra_nonpremul_4x16le__src;
31211
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31212
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__bgra_nonpremul_4x16le__src_over;
31213
0
      }
31214
0
      return NULL;
31215
31216
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
31217
0
      switch (blend) {
31218
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31219
0
          return wuffs_private_impl__swizzle_copy_8_8;
31220
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31221
0
          return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_nonpremul_4x16le__src_over;
31222
0
      }
31223
0
      return NULL;
31224
31225
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
31226
0
      switch (blend) {
31227
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31228
0
          return wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul_4x16le__src;
31229
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31230
0
          return wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul_4x16le__src_over;
31231
0
      }
31232
0
      return NULL;
31233
31234
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
31235
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRX:
31236
      // TODO.
31237
0
      break;
31238
31239
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
31240
0
      switch (blend) {
31241
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31242
0
          return wuffs_private_impl__swizzle_bgr__rgba_nonpremul_4x16le__src;
31243
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31244
0
          return wuffs_private_impl__swizzle_bgr__rgba_nonpremul_4x16le__src_over;
31245
0
      }
31246
0
      return NULL;
31247
31248
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
31249
0
      switch (blend) {
31250
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31251
0
          return wuffs_private_impl__swizzle_rgba_nonpremul__bgra_nonpremul_4x16le__src;
31252
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31253
0
          return wuffs_private_impl__swizzle_rgba_nonpremul__bgra_nonpremul_4x16le__src_over;
31254
0
      }
31255
0
      break;
31256
31257
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
31258
0
      switch (blend) {
31259
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31260
0
          return wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul_4x16le__src;
31261
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31262
0
          return wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul_4x16le__src_over;
31263
0
      }
31264
0
      return NULL;
31265
31266
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
31267
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBX:
31268
      // TODO.
31269
0
      break;
31270
0
  }
31271
0
  return NULL;
31272
0
}
31273
31274
static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func  //
31275
wuffs_private_impl__pixel_swizzler__prepare__bgra_premul(
31276
    wuffs_base__pixel_swizzler* p,
31277
    wuffs_base__pixel_format dst_pixfmt,
31278
    wuffs_base__slice_u8 dst_palette,
31279
    wuffs_base__slice_u8 src_palette,
31280
0
    wuffs_base__pixel_blend blend) {
31281
0
  switch (dst_pixfmt.repr) {
31282
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
31283
0
      switch (blend) {
31284
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31285
0
          return wuffs_private_impl__swizzle_y__bgra_premul__src;
31286
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31287
0
          return wuffs_private_impl__swizzle_y__bgra_premul__src_over;
31288
0
      }
31289
0
      return NULL;
31290
31291
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
31292
0
      switch (blend) {
31293
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31294
0
          return wuffs_private_impl__swizzle_bgr_565__bgra_premul__src;
31295
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31296
0
          return wuffs_private_impl__swizzle_bgr_565__bgra_premul__src_over;
31297
0
      }
31298
0
      return NULL;
31299
31300
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
31301
0
      switch (blend) {
31302
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31303
0
          return wuffs_private_impl__swizzle_bgr__bgra_premul__src;
31304
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31305
0
          return wuffs_private_impl__swizzle_bgr__bgra_premul__src_over;
31306
0
      }
31307
0
      return NULL;
31308
31309
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
31310
0
      switch (blend) {
31311
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31312
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__bgra_premul__src;
31313
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31314
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__bgra_premul__src_over;
31315
0
      }
31316
0
      return NULL;
31317
31318
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
31319
0
      switch (blend) {
31320
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31321
0
          return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_premul__src;
31322
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31323
0
          return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_premul__src_over;
31324
0
      }
31325
0
      return NULL;
31326
31327
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
31328
0
      switch (blend) {
31329
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31330
0
          return wuffs_private_impl__swizzle_copy_4_4;
31331
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31332
0
          return wuffs_private_impl__swizzle_bgra_premul__bgra_premul__src_over;
31333
0
      }
31334
0
      return NULL;
31335
31336
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
31337
0
      switch (blend) {
31338
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31339
0
          return wuffs_private_impl__swizzle_bgr__rgba_premul__src;
31340
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31341
0
          return wuffs_private_impl__swizzle_bgr__rgba_premul__src_over;
31342
0
      }
31343
0
      return NULL;
31344
31345
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
31346
0
      switch (blend) {
31347
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31348
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__rgba_premul__src;
31349
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31350
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__rgba_premul__src_over;
31351
0
      }
31352
0
      return NULL;
31353
31354
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
31355
0
      switch (blend) {
31356
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31357
0
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
31358
0
          if (wuffs_base__cpu_arch__have_x86_sse42()) {
31359
0
            return wuffs_private_impl__swizzle_swap_rgbx_bgrx__x86_sse42;
31360
0
          }
31361
0
#endif
31362
0
          return wuffs_private_impl__swizzle_swap_rgbx_bgrx;
31363
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31364
0
          return wuffs_private_impl__swizzle_bgra_premul__rgba_premul__src_over;
31365
0
      }
31366
0
      return NULL;
31367
0
  }
31368
0
  return NULL;
31369
0
}
31370
31371
static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func  //
31372
wuffs_private_impl__pixel_swizzler__prepare__bgra_premul_4x16le(
31373
    wuffs_base__pixel_swizzler* p,
31374
    wuffs_base__pixel_format dst_pixfmt,
31375
    wuffs_base__slice_u8 dst_palette,
31376
    wuffs_base__slice_u8 src_palette,
31377
0
    wuffs_base__pixel_blend blend) {
31378
0
  switch (dst_pixfmt.repr) {
31379
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
31380
0
      switch (blend) {
31381
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31382
0
          return wuffs_private_impl__swizzle_y__bgra_premul_4x16le__src;
31383
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31384
0
          return wuffs_private_impl__swizzle_y__bgra_premul_4x16le__src_over;
31385
0
      }
31386
0
      return NULL;
31387
31388
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
31389
0
      switch (blend) {
31390
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31391
0
          return wuffs_private_impl__swizzle_bgr_565__bgra_premul_4x16le__src;
31392
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31393
0
          return wuffs_private_impl__swizzle_bgr_565__bgra_premul_4x16le__src_over;
31394
0
      }
31395
0
      return NULL;
31396
31397
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
31398
0
      switch (blend) {
31399
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31400
0
          return wuffs_private_impl__swizzle_bgr__bgra_premul_4x16le__src;
31401
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31402
0
          return wuffs_private_impl__swizzle_bgr__bgra_premul_4x16le__src_over;
31403
0
      }
31404
0
      return NULL;
31405
31406
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
31407
0
      switch (blend) {
31408
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31409
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__bgra_premul_4x16le__src;
31410
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31411
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__bgra_premul_4x16le__src_over;
31412
0
      }
31413
0
      return NULL;
31414
31415
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
31416
31417
0
      switch (blend) {
31418
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31419
0
          return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_premul_4x16le__src;
31420
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31421
0
          return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_premul_4x16le__src_over;
31422
0
      }
31423
0
      return NULL;
31424
31425
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
31426
0
      switch (blend) {
31427
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31428
0
          return wuffs_private_impl__swizzle_bgra_premul__bgra_premul_4x16le__src;
31429
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31430
0
          return wuffs_private_impl__swizzle_bgra_premul__bgra_premul_4x16le__src_over;
31431
0
      }
31432
0
      return NULL;
31433
31434
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE:
31435
0
      switch (blend) {
31436
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31437
0
          return wuffs_private_impl__swizzle_copy_8_8;
31438
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31439
0
          return wuffs_private_impl__swizzle_bgra_premul_4x16le__bgra_premul_4x16le__src_over;
31440
0
      }
31441
0
      return NULL;
31442
31443
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
31444
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRX:
31445
      // TODO.
31446
0
      break;
31447
31448
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
31449
0
      switch (blend) {
31450
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31451
0
          return wuffs_private_impl__swizzle_bgr__rgba_premul_4x16le__src;
31452
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31453
0
          return wuffs_private_impl__swizzle_bgr__rgba_premul_4x16le__src_over;
31454
0
      }
31455
0
      return NULL;
31456
31457
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
31458
0
      switch (blend) {
31459
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31460
0
          return wuffs_private_impl__swizzle_rgba_nonpremul__bgra_premul_4x16le__src;
31461
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31462
0
          return wuffs_private_impl__swizzle_rgba_nonpremul__bgra_premul_4x16le__src_over;
31463
0
      }
31464
0
      break;
31465
31466
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
31467
0
      switch (blend) {
31468
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31469
0
          return wuffs_private_impl__swizzle_bgra_premul__rgba_premul_4x16le__src;
31470
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31471
0
          return wuffs_private_impl__swizzle_bgra_premul__rgba_premul_4x16le__src_over;
31472
0
      }
31473
0
      return NULL;
31474
31475
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
31476
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBX:
31477
      // TODO.
31478
0
      break;
31479
0
  }
31480
0
  return NULL;
31481
0
}
31482
31483
static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func  //
31484
wuffs_private_impl__pixel_swizzler__prepare__bgra_binary(
31485
    wuffs_base__pixel_swizzler* p,
31486
    wuffs_base__pixel_format dst_pixfmt,
31487
    wuffs_base__slice_u8 dst_palette,
31488
    wuffs_base__slice_u8 src_palette,
31489
0
    wuffs_base__pixel_blend blend) {
31490
0
  switch (dst_pixfmt.repr) {
31491
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
31492
0
      switch (blend) {
31493
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31494
0
          return wuffs_private_impl__swizzle_y__bgra_premul__src;
31495
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31496
0
          return wuffs_private_impl__swizzle_y__bgra_premul__src_over;
31497
0
      }
31498
0
      return NULL;
31499
31500
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
31501
0
      switch (blend) {
31502
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31503
0
          return wuffs_private_impl__swizzle_bgr_565__bgra_premul__src;
31504
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31505
0
          return wuffs_private_impl__swizzle_bgr_565__bgra_premul__src_over;
31506
0
      }
31507
0
      return NULL;
31508
31509
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
31510
0
      switch (blend) {
31511
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31512
0
          return wuffs_private_impl__swizzle_bgr__bgra_premul__src;
31513
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31514
0
          return wuffs_private_impl__swizzle_bgr__bgra_premul__src_over;
31515
0
      }
31516
0
      return NULL;
31517
31518
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
31519
0
      switch (blend) {
31520
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31521
0
          return wuffs_private_impl__swizzle_copy_4_4;
31522
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31523
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__bgra_premul__src_over;
31524
0
      }
31525
0
      return NULL;
31526
31527
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
31528
0
      switch (blend) {
31529
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31530
0
          return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_premul__src;
31531
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31532
0
          return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_premul__src_over;
31533
0
      }
31534
0
      return NULL;
31535
31536
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
31537
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
31538
0
      switch (blend) {
31539
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31540
0
          return wuffs_private_impl__swizzle_copy_4_4;
31541
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31542
0
          return wuffs_private_impl__swizzle_bgra_premul__bgra_premul__src_over;
31543
0
      }
31544
0
      return NULL;
31545
31546
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
31547
0
      switch (blend) {
31548
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31549
0
          return wuffs_private_impl__swizzle_bgr__rgba_premul__src;
31550
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31551
0
          return wuffs_private_impl__swizzle_bgr__rgba_premul__src_over;
31552
0
      }
31553
0
      return NULL;
31554
31555
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
31556
0
      switch (blend) {
31557
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31558
0
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
31559
0
          if (wuffs_base__cpu_arch__have_x86_sse42()) {
31560
0
            return wuffs_private_impl__swizzle_swap_rgbx_bgrx__x86_sse42;
31561
0
          }
31562
0
#endif
31563
0
          return wuffs_private_impl__swizzle_swap_rgbx_bgrx;
31564
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31565
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__rgba_premul__src_over;
31566
0
      }
31567
0
      return NULL;
31568
31569
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
31570
0
      switch (blend) {
31571
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31572
0
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
31573
0
          if (wuffs_base__cpu_arch__have_x86_sse42()) {
31574
0
            return wuffs_private_impl__swizzle_swap_rgbx_bgrx__x86_sse42;
31575
0
          }
31576
0
#endif
31577
0
          return wuffs_private_impl__swizzle_swap_rgbx_bgrx;
31578
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31579
0
          return wuffs_private_impl__swizzle_bgra_premul__rgba_premul__src_over;
31580
0
      }
31581
0
      return NULL;
31582
0
  }
31583
0
  return NULL;
31584
0
}
31585
31586
static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func  //
31587
wuffs_private_impl__pixel_swizzler__prepare__bgrx(
31588
    wuffs_base__pixel_swizzler* p,
31589
    wuffs_base__pixel_format dst_pixfmt,
31590
    wuffs_base__slice_u8 dst_palette,
31591
    wuffs_base__slice_u8 src_palette,
31592
719
    wuffs_base__pixel_blend blend) {
31593
719
  switch (dst_pixfmt.repr) {
31594
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
31595
0
      return wuffs_private_impl__swizzle_y__bgrx;
31596
31597
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
31598
0
      return wuffs_private_impl__swizzle_bgr_565__bgrx;
31599
31600
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
31601
0
      return wuffs_private_impl__swizzle_xxx__xxxx;
31602
31603
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
31604
349
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
31605
349
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
31606
349
      return wuffs_private_impl__swizzle_bgrw__bgrx;
31607
31608
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
31609
0
      return wuffs_private_impl__swizzle_bgrw_4x16le__bgrx;
31610
31611
370
    case WUFFS_BASE__PIXEL_FORMAT__BGRX:
31612
370
      return wuffs_private_impl__swizzle_copy_4_4;
31613
31614
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
31615
0
      return wuffs_private_impl__swizzle_bgr__rgbx;
31616
31617
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
31618
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
31619
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
31620
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBX:
31621
0
      return wuffs_private_impl__swizzle_bgrw__rgbx;
31622
719
  }
31623
0
  return NULL;
31624
719
}
31625
31626
static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func  //
31627
wuffs_private_impl__pixel_swizzler__prepare__rgb(
31628
    wuffs_base__pixel_swizzler* p,
31629
    wuffs_base__pixel_format dst_pixfmt,
31630
    wuffs_base__slice_u8 dst_palette,
31631
    wuffs_base__slice_u8 src_palette,
31632
0
    wuffs_base__pixel_blend blend) {
31633
0
  switch (dst_pixfmt.repr) {
31634
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
31635
0
      return wuffs_private_impl__swizzle_y__rgb;
31636
31637
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
31638
0
      return wuffs_private_impl__swizzle_bgr_565__rgb;
31639
31640
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
31641
0
      return wuffs_private_impl__swizzle_swap_rgb_bgr;
31642
31643
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
31644
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
31645
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
31646
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRX:
31647
0
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
31648
0
      if (wuffs_base__cpu_arch__have_x86_sse42()) {
31649
0
        return wuffs_private_impl__swizzle_bgrw__rgb__x86_sse42;
31650
0
      }
31651
0
#endif
31652
0
      return wuffs_private_impl__swizzle_bgrw__rgb;
31653
31654
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
31655
0
      return wuffs_private_impl__swizzle_bgrw_4x16le__rgb;
31656
31657
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
31658
0
      return wuffs_private_impl__swizzle_copy_3_3;
31659
31660
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
31661
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
31662
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
31663
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBX:
31664
0
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
31665
0
      if (wuffs_base__cpu_arch__have_x86_sse42()) {
31666
0
        return wuffs_private_impl__swizzle_bgrw__bgr__x86_sse42;
31667
0
      }
31668
0
#endif
31669
0
      return wuffs_private_impl__swizzle_bgrw__bgr;
31670
0
  }
31671
0
  return NULL;
31672
0
}
31673
31674
static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func  //
31675
wuffs_private_impl__pixel_swizzler__prepare__rgba_nonpremul(
31676
    wuffs_base__pixel_swizzler* p,
31677
    wuffs_base__pixel_format dst_pixfmt,
31678
    wuffs_base__slice_u8 dst_palette,
31679
    wuffs_base__slice_u8 src_palette,
31680
0
    wuffs_base__pixel_blend blend) {
31681
0
  switch (dst_pixfmt.repr) {
31682
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
31683
0
      switch (blend) {
31684
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31685
0
          return wuffs_private_impl__swizzle_y__rgba_nonpremul__src;
31686
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31687
0
          return wuffs_private_impl__swizzle_y__rgba_nonpremul__src_over;
31688
0
      }
31689
0
      return NULL;
31690
31691
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
31692
0
      switch (blend) {
31693
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31694
0
          return wuffs_private_impl__swizzle_bgr_565__rgba_nonpremul__src;
31695
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31696
0
          return wuffs_private_impl__swizzle_bgr_565__rgba_nonpremul__src_over;
31697
0
      }
31698
0
      return NULL;
31699
31700
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
31701
0
      switch (blend) {
31702
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31703
0
          return wuffs_private_impl__swizzle_bgr__rgba_nonpremul__src;
31704
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31705
0
          return wuffs_private_impl__swizzle_bgr__rgba_nonpremul__src_over;
31706
0
      }
31707
0
      return NULL;
31708
31709
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
31710
0
      switch (blend) {
31711
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31712
0
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
31713
0
          if (wuffs_base__cpu_arch__have_x86_sse42()) {
31714
0
            return wuffs_private_impl__swizzle_swap_rgbx_bgrx__x86_sse42;
31715
0
          }
31716
0
#endif
31717
0
          return wuffs_private_impl__swizzle_swap_rgbx_bgrx;
31718
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31719
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__rgba_nonpremul__src_over;
31720
0
      }
31721
0
      return NULL;
31722
31723
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
31724
0
      switch (blend) {
31725
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31726
0
          return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__rgba_nonpremul__src;
31727
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31728
0
          return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__rgba_nonpremul__src_over;
31729
0
      }
31730
0
      return NULL;
31731
31732
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
31733
0
      switch (blend) {
31734
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31735
0
          return wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul__src;
31736
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31737
0
          return wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul__src_over;
31738
0
      }
31739
0
      return NULL;
31740
31741
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
31742
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRX:
31743
      // TODO.
31744
0
      break;
31745
31746
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
31747
0
      switch (blend) {
31748
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31749
0
          return wuffs_private_impl__swizzle_bgr__bgra_nonpremul__src;
31750
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31751
0
          return wuffs_private_impl__swizzle_bgr__bgra_nonpremul__src_over;
31752
0
      }
31753
0
      return NULL;
31754
31755
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
31756
0
      switch (blend) {
31757
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31758
0
          return wuffs_private_impl__swizzle_copy_4_4;
31759
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31760
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__bgra_nonpremul__src_over;
31761
0
      }
31762
0
      return NULL;
31763
31764
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
31765
0
      switch (blend) {
31766
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31767
0
          return wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul__src;
31768
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31769
0
          return wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul__src_over;
31770
0
      }
31771
0
      return NULL;
31772
31773
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
31774
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBX:
31775
      // TODO.
31776
0
      break;
31777
0
  }
31778
0
  return NULL;
31779
0
}
31780
31781
static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func  //
31782
wuffs_private_impl__pixel_swizzler__prepare__rgba_premul(
31783
    wuffs_base__pixel_swizzler* p,
31784
    wuffs_base__pixel_format dst_pixfmt,
31785
    wuffs_base__slice_u8 dst_palette,
31786
    wuffs_base__slice_u8 src_palette,
31787
0
    wuffs_base__pixel_blend blend) {
31788
0
  switch (dst_pixfmt.repr) {
31789
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
31790
0
      switch (blend) {
31791
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31792
0
          return wuffs_private_impl__swizzle_y__rgba_premul__src;
31793
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31794
0
          return wuffs_private_impl__swizzle_y__rgba_premul__src_over;
31795
0
      }
31796
0
      return NULL;
31797
31798
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
31799
0
      switch (blend) {
31800
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31801
0
          return wuffs_private_impl__swizzle_bgr_565__rgba_premul__src;
31802
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31803
0
          return wuffs_private_impl__swizzle_bgr_565__rgba_premul__src_over;
31804
0
      }
31805
0
      return NULL;
31806
31807
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
31808
0
      switch (blend) {
31809
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31810
0
          return wuffs_private_impl__swizzle_bgr__rgba_premul__src;
31811
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31812
0
          return wuffs_private_impl__swizzle_bgr__rgba_premul__src_over;
31813
0
      }
31814
0
      return NULL;
31815
31816
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
31817
0
      switch (blend) {
31818
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31819
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__rgba_premul__src;
31820
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31821
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__rgba_premul__src_over;
31822
0
      }
31823
0
      return NULL;
31824
31825
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
31826
0
      switch (blend) {
31827
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31828
0
          return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__rgba_premul__src;
31829
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31830
0
          return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__rgba_premul__src_over;
31831
0
      }
31832
0
      return NULL;
31833
31834
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
31835
0
      switch (blend) {
31836
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31837
0
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
31838
0
          if (wuffs_base__cpu_arch__have_x86_sse42()) {
31839
0
            return wuffs_private_impl__swizzle_swap_rgbx_bgrx__x86_sse42;
31840
0
          }
31841
0
#endif
31842
0
          return wuffs_private_impl__swizzle_swap_rgbx_bgrx;
31843
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31844
0
          return wuffs_private_impl__swizzle_bgra_premul__rgba_premul__src_over;
31845
0
      }
31846
0
      return NULL;
31847
31848
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
31849
0
      switch (blend) {
31850
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31851
0
          return wuffs_private_impl__swizzle_bgr__bgra_premul__src;
31852
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31853
0
          return wuffs_private_impl__swizzle_bgr__bgra_premul__src_over;
31854
0
      }
31855
0
      return NULL;
31856
31857
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
31858
0
      switch (blend) {
31859
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31860
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__bgra_premul__src;
31861
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31862
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__bgra_premul__src_over;
31863
0
      }
31864
0
      return NULL;
31865
31866
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
31867
0
      switch (blend) {
31868
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
31869
0
          return wuffs_private_impl__swizzle_copy_4_4;
31870
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31871
0
          return wuffs_private_impl__swizzle_bgra_premul__bgra_premul__src_over;
31872
0
      }
31873
0
      return NULL;
31874
0
  }
31875
0
  return NULL;
31876
0
}
31877
31878
// --------
31879
31880
WUFFS_BASE__MAYBE_STATIC wuffs_base__status  //
31881
wuffs_base__pixel_swizzler__prepare(wuffs_base__pixel_swizzler* p,
31882
                                    wuffs_base__pixel_format dst_pixfmt,
31883
                                    wuffs_base__slice_u8 dst_palette,
31884
                                    wuffs_base__pixel_format src_pixfmt,
31885
                                    wuffs_base__slice_u8 src_palette,
31886
2.66k
                                    wuffs_base__pixel_blend blend) {
31887
2.66k
  if (!p) {
31888
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
31889
0
  }
31890
2.66k
  p->private_impl.func = NULL;
31891
2.66k
  p->private_impl.transparent_black_func = NULL;
31892
2.66k
  p->private_impl.dst_pixfmt_bytes_per_pixel = 0;
31893
2.66k
  p->private_impl.src_pixfmt_bytes_per_pixel = 0;
31894
31895
  // ----
31896
31897
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ENABLE_ALLOWLIST)
31898
  switch (dst_pixfmt.repr) {
31899
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_Y)
31900
    case WUFFS_BASE__PIXEL_FORMAT__Y:
31901
      break;
31902
#endif
31903
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGR_565)
31904
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
31905
      break;
31906
#endif
31907
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGR)
31908
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
31909
      break;
31910
#endif
31911
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGRA_NONPREMUL)
31912
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
31913
      break;
31914
#endif
31915
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGRA_NONPREMUL_4X16LE)
31916
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
31917
      break;
31918
#endif
31919
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGRA_PREMUL)
31920
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
31921
      break;
31922
#endif
31923
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_RGB)
31924
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
31925
      break;
31926
#endif
31927
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_RGBA_NONPREMUL)
31928
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
31929
      break;
31930
#endif
31931
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_RGBA_PREMUL)
31932
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
31933
      break;
31934
#endif
31935
    default:
31936
      return wuffs_base__make_status(
31937
          wuffs_base__error__disabled_by_wuffs_config_dst_pixel_format_enable_allowlist);
31938
  }
31939
#endif  // defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ENABLE_ALLOWLIST)
31940
31941
  // ----
31942
31943
2.66k
  wuffs_base__pixel_swizzler__func func = NULL;
31944
2.66k
  wuffs_base__pixel_swizzler__transparent_black_func transparent_black_func =
31945
2.66k
      NULL;
31946
31947
2.66k
  uint32_t dst_pixfmt_bits_per_pixel =
31948
2.66k
      wuffs_base__pixel_format__bits_per_pixel(&dst_pixfmt);
31949
2.66k
  if ((dst_pixfmt_bits_per_pixel == 0) ||
31950
2.66k
      ((dst_pixfmt_bits_per_pixel & 7) != 0)) {
31951
0
    return wuffs_base__make_status(
31952
0
        wuffs_base__error__unsupported_pixel_swizzler_option);
31953
0
  }
31954
31955
2.66k
  uint32_t src_pixfmt_bits_per_pixel =
31956
2.66k
      wuffs_base__pixel_format__bits_per_pixel(&src_pixfmt);
31957
2.66k
  if ((src_pixfmt_bits_per_pixel == 0) ||
31958
2.66k
      ((src_pixfmt_bits_per_pixel & 7) != 0)) {
31959
0
    return wuffs_base__make_status(
31960
0
        wuffs_base__error__unsupported_pixel_swizzler_option);
31961
0
  }
31962
31963
  // TODO: support many more formats.
31964
31965
2.66k
  switch (blend) {
31966
2.66k
    case WUFFS_BASE__PIXEL_BLEND__SRC:
31967
2.66k
      transparent_black_func =
31968
2.66k
          wuffs_private_impl__swizzle_transparent_black_src;
31969
2.66k
      break;
31970
31971
0
    case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31972
0
      transparent_black_func =
31973
0
          wuffs_private_impl__swizzle_transparent_black_src_over;
31974
0
      break;
31975
2.66k
  }
31976
31977
2.66k
  switch (src_pixfmt.repr) {
31978
1.94k
    case WUFFS_BASE__PIXEL_FORMAT__Y:
31979
1.94k
      func = wuffs_private_impl__pixel_swizzler__prepare__y(
31980
1.94k
          p, dst_pixfmt, dst_palette, src_palette, blend);
31981
1.94k
      break;
31982
31983
0
    case WUFFS_BASE__PIXEL_FORMAT__Y_16BE:
31984
0
      func = wuffs_private_impl__pixel_swizzler__prepare__y_16be(
31985
0
          p, dst_pixfmt, dst_palette, src_palette, blend);
31986
0
      break;
31987
31988
0
    case WUFFS_BASE__PIXEL_FORMAT__Y_16LE:
31989
0
      func = wuffs_private_impl__pixel_swizzler__prepare__y_16le(
31990
0
          p, dst_pixfmt, dst_palette, src_palette, blend);
31991
0
      break;
31992
31993
0
    case WUFFS_BASE__PIXEL_FORMAT__YA_NONPREMUL:
31994
0
      func = wuffs_private_impl__pixel_swizzler__prepare__ya_nonpremul(
31995
0
          p, dst_pixfmt, dst_palette, src_palette, blend);
31996
0
      break;
31997
31998
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL:
31999
0
      func =
32000
0
          wuffs_private_impl__pixel_swizzler__prepare__indexed__bgra_nonpremul(
32001
0
              p, dst_pixfmt, dst_palette, src_palette, blend);
32002
0
      break;
32003
32004
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY:
32005
0
      func = wuffs_private_impl__pixel_swizzler__prepare__indexed__bgra_binary(
32006
0
          p, dst_pixfmt, dst_palette, src_palette, blend);
32007
0
      break;
32008
32009
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
32010
0
      func = wuffs_private_impl__pixel_swizzler__prepare__bgr_565(
32011
0
          p, dst_pixfmt, dst_palette, src_palette, blend);
32012
0
      break;
32013
32014
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
32015
0
      func = wuffs_private_impl__pixel_swizzler__prepare__bgr(
32016
0
          p, dst_pixfmt, dst_palette, src_palette, blend);
32017
0
      break;
32018
32019
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
32020
0
      func = wuffs_private_impl__pixel_swizzler__prepare__bgra_nonpremul(
32021
0
          p, dst_pixfmt, dst_palette, src_palette, blend);
32022
0
      break;
32023
32024
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
32025
0
      func = wuffs_private_impl__pixel_swizzler__prepare__bgra_nonpremul_4x16le(
32026
0
          p, dst_pixfmt, dst_palette, src_palette, blend);
32027
0
      break;
32028
32029
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
32030
0
      func = wuffs_private_impl__pixel_swizzler__prepare__bgra_premul(
32031
0
          p, dst_pixfmt, dst_palette, src_palette, blend);
32032
0
      break;
32033
32034
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE:
32035
0
      func = wuffs_private_impl__pixel_swizzler__prepare__bgra_premul_4x16le(
32036
0
          p, dst_pixfmt, dst_palette, src_palette, blend);
32037
0
      break;
32038
32039
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
32040
0
      func = wuffs_private_impl__pixel_swizzler__prepare__bgra_binary(
32041
0
          p, dst_pixfmt, dst_palette, src_palette, blend);
32042
0
      break;
32043
32044
719
    case WUFFS_BASE__PIXEL_FORMAT__BGRX:
32045
719
      func = wuffs_private_impl__pixel_swizzler__prepare__bgrx(
32046
719
          p, dst_pixfmt, dst_palette, src_palette, blend);
32047
719
      break;
32048
32049
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
32050
0
      func = wuffs_private_impl__pixel_swizzler__prepare__rgb(
32051
0
          p, dst_pixfmt, dst_palette, src_palette, blend);
32052
0
      break;
32053
32054
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
32055
0
      func = wuffs_private_impl__pixel_swizzler__prepare__rgba_nonpremul(
32056
0
          p, dst_pixfmt, dst_palette, src_palette, blend);
32057
0
      break;
32058
32059
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
32060
0
      func = wuffs_private_impl__pixel_swizzler__prepare__rgba_premul(
32061
0
          p, dst_pixfmt, dst_palette, src_palette, blend);
32062
0
      break;
32063
2.66k
  }
32064
32065
2.66k
  p->private_impl.func = func;
32066
2.66k
  p->private_impl.transparent_black_func = transparent_black_func;
32067
2.66k
  p->private_impl.dst_pixfmt_bytes_per_pixel = dst_pixfmt_bits_per_pixel / 8;
32068
2.66k
  p->private_impl.src_pixfmt_bytes_per_pixel = src_pixfmt_bits_per_pixel / 8;
32069
2.66k
  return wuffs_base__make_status(
32070
2.66k
      func ? NULL : wuffs_base__error__unsupported_pixel_swizzler_option);
32071
2.66k
}
32072
32073
WUFFS_BASE__MAYBE_STATIC uint64_t  //
32074
wuffs_base__pixel_swizzler__limited_swizzle_u32_interleaved_from_reader(
32075
    const wuffs_base__pixel_swizzler* p,
32076
    uint32_t up_to_num_pixels,
32077
    wuffs_base__slice_u8 dst,
32078
    wuffs_base__slice_u8 dst_palette,
32079
    const uint8_t** ptr_iop_r,
32080
0
    const uint8_t* io2_r) {
32081
0
  if (p && p->private_impl.func) {
32082
0
    const uint8_t* iop_r = *ptr_iop_r;
32083
0
    uint64_t src_len = wuffs_base__u64__min(
32084
0
        ((uint64_t)up_to_num_pixels) *
32085
0
            ((uint64_t)p->private_impl.src_pixfmt_bytes_per_pixel),
32086
0
        ((uint64_t)(io2_r - iop_r)));
32087
0
    uint64_t n =
32088
0
        (*p->private_impl.func)(dst.ptr, dst.len, dst_palette.ptr,
32089
0
                                dst_palette.len, iop_r, (size_t)src_len);
32090
0
    *ptr_iop_r += n * p->private_impl.src_pixfmt_bytes_per_pixel;
32091
0
    return n;
32092
0
  }
32093
0
  return 0;
32094
0
}
32095
32096
WUFFS_BASE__MAYBE_STATIC uint64_t  //
32097
wuffs_base__pixel_swizzler__swizzle_interleaved_from_reader(
32098
    const wuffs_base__pixel_swizzler* p,
32099
    wuffs_base__slice_u8 dst,
32100
    wuffs_base__slice_u8 dst_palette,
32101
    const uint8_t** ptr_iop_r,
32102
0
    const uint8_t* io2_r) {
32103
0
  if (p && p->private_impl.func) {
32104
0
    const uint8_t* iop_r = *ptr_iop_r;
32105
0
    uint64_t src_len = ((uint64_t)(io2_r - iop_r));
32106
0
    uint64_t n =
32107
0
        (*p->private_impl.func)(dst.ptr, dst.len, dst_palette.ptr,
32108
0
                                dst_palette.len, iop_r, (size_t)src_len);
32109
0
    *ptr_iop_r += n * p->private_impl.src_pixfmt_bytes_per_pixel;
32110
0
    return n;
32111
0
  }
32112
0
  return 0;
32113
0
}
32114
32115
WUFFS_BASE__MAYBE_STATIC uint64_t  //
32116
wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(
32117
    const wuffs_base__pixel_swizzler* p,
32118
    wuffs_base__slice_u8 dst,
32119
    wuffs_base__slice_u8 dst_palette,
32120
14.4M
    wuffs_base__slice_u8 src) {
32121
14.4M
  if (p && p->private_impl.func) {
32122
14.4M
    return (*p->private_impl.func)(dst.ptr, dst.len, dst_palette.ptr,
32123
14.4M
                                   dst_palette.len, src.ptr, src.len);
32124
14.4M
  }
32125
0
  return 0;
32126
14.4M
}
32127
32128
WUFFS_BASE__MAYBE_STATIC uint64_t  //
32129
wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(
32130
    const wuffs_base__pixel_swizzler* p,
32131
    wuffs_base__slice_u8 dst,
32132
    wuffs_base__slice_u8 dst_palette,
32133
0
    uint64_t num_pixels) {
32134
0
  if (p && p->private_impl.transparent_black_func) {
32135
0
    return (*p->private_impl.transparent_black_func)(
32136
0
        dst.ptr, dst.len, dst_palette.ptr, dst_palette.len, num_pixels,
32137
0
        p->private_impl.dst_pixfmt_bytes_per_pixel);
32138
0
  }
32139
0
  return 0;
32140
0
}
32141
32142
// --------
32143
32144
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
32145
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2")
32146
static void  //
32147
wuffs_private_impl__swizzle_ycc__convert_3_bgrx_x86_avx2(
32148
    wuffs_base__pixel_buffer* dst,
32149
    uint32_t x,
32150
    uint32_t x_end,
32151
    uint32_t y,
32152
    const uint8_t* up0,
32153
    const uint8_t* up1,
32154
    const uint8_t* up2);
32155
32156
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2")
32157
static void  //
32158
wuffs_private_impl__swizzle_ycc__convert_3_rgbx_x86_avx2(
32159
    wuffs_base__pixel_buffer* dst,
32160
    uint32_t x,
32161
    uint32_t x_end,
32162
    uint32_t y,
32163
    const uint8_t* up0,
32164
    const uint8_t* up1,
32165
    const uint8_t* up2);
32166
32167
#if defined(__GNUC__) && !defined(__clang__)
32168
// No-op.
32169
#else
32170
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2")
32171
static const uint8_t*  //
32172
wuffs_private_impl__swizzle_ycc__upsample_inv_h2v2_triangle_x86_avx2(
32173
    uint8_t* dst_ptr,
32174
    const uint8_t* src_ptr_major,
32175
    const uint8_t* src_ptr_minor,
32176
    size_t src_len,
32177
    uint32_t h1v2_bias_ignored,
32178
    bool first_column,
32179
    bool last_column);
32180
#endif
32181
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
32182
32183
// --------
32184
32185
static inline uint32_t  //
32186
wuffs_private_impl__u32__max_of_4(uint32_t a,
32187
                                  uint32_t b,
32188
                                  uint32_t c,
32189
1.37k
                                  uint32_t d) {
32190
1.37k
  return wuffs_base__u32__max(     //
32191
1.37k
      wuffs_base__u32__max(a, b),  //
32192
1.37k
      wuffs_base__u32__max(c, d));
32193
1.37k
}
32194
32195
static inline uint32_t  //
32196
wuffs_private_impl__u32__min_of_5(uint32_t a,
32197
                                  uint32_t b,
32198
                                  uint32_t c,
32199
                                  uint32_t d,
32200
1.37k
                                  uint32_t e) {
32201
1.37k
  return wuffs_base__u32__min(          //
32202
1.37k
      wuffs_base__u32__min(             //
32203
1.37k
          wuffs_base__u32__min(a, b),   //
32204
1.37k
          wuffs_base__u32__min(c, d)),  //
32205
1.37k
      e);
32206
1.37k
}
32207
32208
// --------
32209
32210
typedef void (*wuffs_private_impl__swizzle_ycc__convert_4_func)(
32211
    wuffs_base__pixel_buffer* dst,
32212
    uint32_t x,
32213
    uint32_t x_end,
32214
    uint32_t y,
32215
    const uint8_t* up0,
32216
    const uint8_t* up1,
32217
    const uint8_t* up2,
32218
    const uint8_t* up3);
32219
32220
static void  //
32221
wuffs_private_impl__swizzle_cmyk__convert_4_general(
32222
    wuffs_base__pixel_buffer* dst,
32223
    uint32_t x,
32224
    uint32_t x_end,
32225
    uint32_t y,
32226
    const uint8_t* up0,
32227
    const uint8_t* up1,
32228
    const uint8_t* up2,
32229
2.51M
    const uint8_t* up3) {
32230
693M
  for (; x < x_end; x++) {
32231
    // It's called CMYK but, but for Adobe CMYK JPEG images in practice, it's
32232
    // RGBW: 0xFFu means no ink instead of full ink. Note that a double
32233
    // inversion is a no-op, so inversions might be implicit in the code below.
32234
691M
    uint32_t r = ((uint32_t)(*up0++));
32235
691M
    uint32_t g = ((uint32_t)(*up1++));
32236
691M
    uint32_t b = ((uint32_t)(*up2++));
32237
691M
    uint32_t w = ((uint32_t)(*up3++));
32238
691M
    r = ((r * w) + 0x7Fu) / 0xFFu;
32239
691M
    g = ((g * w) + 0x7Fu) / 0xFFu;
32240
691M
    b = ((b * w) + 0x7Fu) / 0xFFu;
32241
691M
    wuffs_base__pixel_buffer__set_color_u32_at(
32242
691M
        dst, x, y, 0xFF000000u | (r << 16u) | (g << 8u) | (b << 0u));
32243
691M
  }
32244
2.51M
}
32245
32246
static void  //
32247
wuffs_private_impl__swizzle_ycck__convert_4_general(
32248
    wuffs_base__pixel_buffer* dst,
32249
    uint32_t x,
32250
    uint32_t x_end,
32251
    uint32_t y,
32252
    const uint8_t* up0,
32253
    const uint8_t* up1,
32254
    const uint8_t* up2,
32255
377k
    const uint8_t* up3) {
32256
99.8M
  for (; x < x_end; x++) {
32257
    // We invert once again: 0xFFu means no ink instead of full ink.
32258
99.5M
    uint32_t color =                           //
32259
99.5M
        wuffs_base__color_ycc__as__color_u32(  //
32260
99.5M
            *up0++, *up1++, *up2++);
32261
99.5M
    uint32_t r = 0xFFu - (0xFFu & (color >> 16u));
32262
99.5M
    uint32_t g = 0xFFu - (0xFFu & (color >> 8u));
32263
99.5M
    uint32_t b = 0xFFu - (0xFFu & (color >> 0u));
32264
99.5M
    uint32_t w = ((uint32_t)(*up3++));
32265
99.5M
    r = ((r * w) + 0x7Fu) / 0xFFu;
32266
99.5M
    g = ((g * w) + 0x7Fu) / 0xFFu;
32267
99.5M
    b = ((b * w) + 0x7Fu) / 0xFFu;
32268
99.5M
    wuffs_base__pixel_buffer__set_color_u32_at(
32269
99.5M
        dst, x, y, 0xFF000000u | (r << 16u) | (g << 8u) | (b << 0u));
32270
99.5M
  }
32271
377k
}
32272
32273
// --------
32274
32275
typedef void (*wuffs_private_impl__swizzle_ycc__convert_3_func)(
32276
    wuffs_base__pixel_buffer* dst,
32277
    uint32_t x,
32278
    uint32_t x_end,
32279
    uint32_t y,
32280
    const uint8_t* up0,
32281
    const uint8_t* up1,
32282
    const uint8_t* up2);
32283
32284
static void  //
32285
wuffs_private_impl__swizzle_rgb__convert_3_general(
32286
    wuffs_base__pixel_buffer* dst,
32287
    uint32_t x,
32288
    uint32_t x_end,
32289
    uint32_t y,
32290
    const uint8_t* up0,
32291
    const uint8_t* up1,
32292
455k
    const uint8_t* up2) {
32293
120M
  for (; x < x_end; x++) {
32294
120M
    uint32_t color = 0xFF000000u |                    //
32295
120M
                     (((uint32_t)(*up0++)) << 16u) |  //
32296
120M
                     (((uint32_t)(*up1++)) << 8u) |   //
32297
120M
                     (((uint32_t)(*up2++)) << 0u);
32298
120M
    wuffs_base__pixel_buffer__set_color_u32_at(dst, x, y, color);
32299
120M
  }
32300
455k
}
32301
32302
static void  //
32303
wuffs_private_impl__swizzle_ycc__convert_3_general(
32304
    wuffs_base__pixel_buffer* dst,
32305
    uint32_t x,
32306
    uint32_t x_end,
32307
    uint32_t y,
32308
    const uint8_t* up0,
32309
    const uint8_t* up1,
32310
0
    const uint8_t* up2) {
32311
0
  for (; x < x_end; x++) {
32312
0
    uint32_t color =                           //
32313
0
        wuffs_base__color_ycc__as__color_u32(  //
32314
0
            *up0++, *up1++, *up2++);
32315
0
    wuffs_base__pixel_buffer__set_color_u32_at(dst, x, y, color);
32316
0
  }
32317
0
}
32318
32319
static void  //
32320
wuffs_private_impl__swizzle_ycc__convert_3_bgrx(wuffs_base__pixel_buffer* dst,
32321
                                                uint32_t x,
32322
                                                uint32_t x_end,
32323
                                                uint32_t y,
32324
                                                const uint8_t* up0,
32325
                                                const uint8_t* up1,
32326
3.47M
                                                const uint8_t* up2) {
32327
3.47M
  size_t dst_stride = dst->private_impl.planes[0].stride;
32328
3.47M
  uint8_t* dst_iter = dst->private_impl.planes[0].ptr +
32329
3.47M
                      (dst_stride * ((size_t)y)) + (4u * ((size_t)x));
32330
32331
55.8M
  for (; x < x_end; x++) {
32332
52.3M
    uint32_t color =                           //
32333
52.3M
        wuffs_base__color_ycc__as__color_u32(  //
32334
52.3M
            *up0++, *up1++, *up2++);
32335
52.3M
    wuffs_base__poke_u32le__no_bounds_check(dst_iter, color);
32336
52.3M
    dst_iter += 4u;
32337
52.3M
  }
32338
3.47M
}
32339
32340
static void  //
32341
wuffs_private_impl__swizzle_ycc__convert_3_rgbx(wuffs_base__pixel_buffer* dst,
32342
                                                uint32_t x,
32343
                                                uint32_t x_end,
32344
                                                uint32_t y,
32345
                                                const uint8_t* up0,
32346
                                                const uint8_t* up1,
32347
0
                                                const uint8_t* up2) {
32348
0
  size_t dst_stride = dst->private_impl.planes[0].stride;
32349
0
  uint8_t* dst_iter = dst->private_impl.planes[0].ptr +
32350
0
                      (dst_stride * ((size_t)y)) + (4u * ((size_t)x));
32351
32352
0
  for (; x < x_end; x++) {
32353
0
    uint32_t color =                                //
32354
0
        wuffs_base__color_ycc__as__color_u32_abgr(  //
32355
0
            *up0++, *up1++, *up2++);
32356
0
    wuffs_base__poke_u32le__no_bounds_check(dst_iter, color);
32357
0
    dst_iter += 4u;
32358
0
  }
32359
0
}
32360
32361
// --------
32362
32363
// wuffs_private_impl__swizzle_ycc__upsample_func upsamples to a destination
32364
// slice at least 480 (YCCK) or 672 (YCC) bytes long and whose src_len
32365
// (multiplied by 1, 2, 3 or 4) is positive but no more than that. This 480 or
32366
// 672 length is just under 1/4 or 1/3 of the scratch_buffer_2k slice length.
32367
// Both (480 * 4) = 1920 and (672 * 3) = 2016 are less than 2048.
32368
//
32369
// 480 and 672 are nice round numbers because a JPEG MCU is 1, 2, 3 or 4 blocks
32370
// wide and each block is 8 pixels wide. We have:
32371
//   480 = 1 * 8 * 60,   672 = 1 * 8 * 84
32372
//   480 = 2 * 8 * 30,   672 = 2 * 8 * 42
32373
//   480 = 3 * 8 * 20,   672 = 3 * 8 * 28
32374
//   480 = 4 * 8 * 15,   672 = 4 * 8 * 21
32375
//
32376
// Box filters are equivalent to nearest neighbor upsampling. These ignore the
32377
// src_ptr_minor, h1v2_bias, first_column and last_column arguments.
32378
//
32379
// Triangle filters use a 3:1 ratio (in 1 dimension), or 9:3:3:1 (in 2
32380
// dimensions), which is higher quality (less blocky) but also higher
32381
// computational effort.
32382
//
32383
// In theory, we could use triangle filters for any (inv_h, inv_v) combination.
32384
// In practice, matching libjpeg-turbo, we only implement it for the common
32385
// chroma subsampling ratios (YCC420, YCC422 or YCC440), corresponding to an
32386
// (inv_h, inv_v) pair of (2, 2), (2, 1) or (1, 2).
32387
typedef const uint8_t* (*wuffs_private_impl__swizzle_ycc__upsample_func)(
32388
    uint8_t* dst_ptr,
32389
    const uint8_t* src_ptr_major,  // Nearest row.
32390
    const uint8_t* src_ptr_minor,  // Adjacent row, alternating above or below.
32391
    size_t src_len,
32392
    uint32_t h1v2_bias,
32393
    bool first_column,
32394
    bool last_column);
32395
32396
static const uint8_t*  //
32397
wuffs_private_impl__swizzle_ycc__upsample_inv_h1vn_box(
32398
    uint8_t* dst_ptr,
32399
    const uint8_t* src_ptr_major,
32400
    const uint8_t* src_ptr_minor_ignored,
32401
    size_t src_len,
32402
    uint32_t h1v2_bias_ignored,
32403
    bool first_column_ignored,
32404
13.2M
    bool last_column_ignored) {
32405
13.2M
  return src_ptr_major;
32406
13.2M
}
32407
32408
static const uint8_t*  //
32409
wuffs_private_impl__swizzle_ycc__upsample_inv_h2vn_box(
32410
    uint8_t* dst_ptr,
32411
    const uint8_t* src_ptr_major,
32412
    const uint8_t* src_ptr_minor_ignored,
32413
    size_t src_len,
32414
    uint32_t h1v2_bias_ignored,
32415
    bool first_column_ignored,
32416
2.52M
    bool last_column_ignored) {
32417
2.52M
  uint8_t* dp = dst_ptr;
32418
2.52M
  const uint8_t* sp = src_ptr_major;
32419
274M
  while (src_len--) {
32420
272M
    uint8_t sv = *sp++;
32421
272M
    *dp++ = sv;
32422
272M
    *dp++ = sv;
32423
272M
  }
32424
2.52M
  return dst_ptr;
32425
2.52M
}
32426
32427
static const uint8_t*  //
32428
wuffs_private_impl__swizzle_ycc__upsample_inv_h3vn_box(
32429
    uint8_t* dst_ptr,
32430
    const uint8_t* src_ptr_major,
32431
    const uint8_t* src_ptr_minor_ignored,
32432
    size_t src_len,
32433
    uint32_t h1v2_bias_ignored,
32434
    bool first_column_ignored,
32435
6.23M
    bool last_column_ignored) {
32436
6.23M
  uint8_t* dp = dst_ptr;
32437
6.23M
  const uint8_t* sp = src_ptr_major;
32438
345M
  while (src_len--) {
32439
339M
    uint8_t sv = *sp++;
32440
339M
    *dp++ = sv;
32441
339M
    *dp++ = sv;
32442
339M
    *dp++ = sv;
32443
339M
  }
32444
6.23M
  return dst_ptr;
32445
6.23M
}
32446
32447
static const uint8_t*  //
32448
wuffs_private_impl__swizzle_ycc__upsample_inv_h4vn_box(
32449
    uint8_t* dst_ptr,
32450
    const uint8_t* src_ptr_major,
32451
    const uint8_t* src_ptr_minor_ignored,
32452
    size_t src_len,
32453
    uint32_t h1v2_bias_ignored,
32454
    bool first_column_ignored,
32455
3.47M
    bool last_column_ignored) {
32456
3.47M
  uint8_t* dp = dst_ptr;
32457
3.47M
  const uint8_t* sp = src_ptr_major;
32458
186M
  while (src_len--) {
32459
183M
    uint8_t sv = *sp++;
32460
183M
    *dp++ = sv;
32461
183M
    *dp++ = sv;
32462
183M
    *dp++ = sv;
32463
183M
    *dp++ = sv;
32464
183M
  }
32465
3.47M
  return dst_ptr;
32466
3.47M
}
32467
32468
static const uint8_t*  //
32469
wuffs_private_impl__swizzle_ycc__upsample_inv_h1v2_triangle(
32470
    uint8_t* dst_ptr,
32471
    const uint8_t* src_ptr_major,
32472
    const uint8_t* src_ptr_minor,
32473
    size_t src_len,
32474
    uint32_t h1v2_bias,
32475
    bool first_column,
32476
5.05M
    bool last_column) {
32477
5.05M
  uint8_t* dp = dst_ptr;
32478
5.05M
  const uint8_t* sp_major = src_ptr_major;
32479
5.05M
  const uint8_t* sp_minor = src_ptr_minor;
32480
1.12G
  while (src_len--) {
32481
1.12G
    *dp++ = (uint8_t)(((3u * ((uint32_t)(*sp_major++))) +  //
32482
1.12G
                       (1u * ((uint32_t)(*sp_minor++))) +  //
32483
1.12G
                       h1v2_bias) >>
32484
1.12G
                      2u);
32485
1.12G
  }
32486
5.05M
  return dst_ptr;
32487
5.05M
}
32488
32489
static const uint8_t*  //
32490
wuffs_private_impl__swizzle_ycc__upsample_inv_h2v1_triangle(
32491
    uint8_t* dst_ptr,
32492
    const uint8_t* src_ptr_major,
32493
    const uint8_t* src_ptr_minor,
32494
    size_t src_len,
32495
    uint32_t h1v2_bias_ignored,
32496
    bool first_column,
32497
4.01M
    bool last_column) {
32498
4.01M
  uint8_t* dp = dst_ptr;
32499
4.01M
  const uint8_t* sp = src_ptr_major;
32500
32501
4.01M
  if (first_column) {
32502
2.91M
    src_len--;
32503
2.91M
    if ((src_len <= 0u) && last_column) {
32504
159k
      uint8_t sv = *sp++;
32505
159k
      *dp++ = sv;
32506
159k
      *dp++ = sv;
32507
159k
      return dst_ptr;
32508
159k
    }
32509
2.75M
    uint32_t svp1 = sp[+1];
32510
2.75M
    uint8_t sv = *sp++;
32511
2.75M
    *dp++ = sv;
32512
2.75M
    *dp++ = (uint8_t)(((3u * (uint32_t)sv) + svp1 + 2u) >> 2u);
32513
2.75M
    if (src_len <= 0u) {
32514
0
      return dst_ptr;
32515
0
    }
32516
2.75M
  }
32517
32518
3.85M
  if (last_column) {
32519
2.75M
    src_len--;
32520
2.75M
  }
32521
32522
478M
  for (; src_len > 0u; src_len--) {
32523
474M
    uint32_t svm1 = sp[-1];
32524
474M
    uint32_t svp1 = sp[+1];
32525
474M
    uint32_t sv3 = 3u * (uint32_t)(*sp++);
32526
474M
    *dp++ = (uint8_t)((sv3 + svm1 + 1u) >> 2u);
32527
474M
    *dp++ = (uint8_t)((sv3 + svp1 + 2u) >> 2u);
32528
474M
  }
32529
32530
3.85M
  if (last_column) {
32531
2.75M
    uint32_t svm1 = sp[-1];
32532
2.75M
    uint8_t sv = *sp++;
32533
2.75M
    *dp++ = (uint8_t)(((3u * (uint32_t)sv) + svm1 + 1u) >> 2u);
32534
2.75M
    *dp++ = sv;
32535
2.75M
  }
32536
32537
3.85M
  return dst_ptr;
32538
4.01M
}
32539
32540
static const uint8_t*  //
32541
wuffs_private_impl__swizzle_ycc__upsample_inv_h2v2_triangle(
32542
    uint8_t* dst_ptr,
32543
    const uint8_t* src_ptr_major,
32544
    const uint8_t* src_ptr_minor,
32545
    size_t src_len,
32546
    uint32_t h1v2_bias_ignored,
32547
    bool first_column,
32548
0
    bool last_column) {
32549
0
  uint8_t* dp = dst_ptr;
32550
0
  const uint8_t* sp_major = src_ptr_major;
32551
0
  const uint8_t* sp_minor = src_ptr_minor;
32552
32553
0
  if (first_column) {
32554
0
    src_len--;
32555
0
    if ((src_len <= 0u) && last_column) {
32556
0
      uint32_t sv = (12u * ((uint32_t)(*sp_major++))) +  //
32557
0
                    (4u * ((uint32_t)(*sp_minor++)));
32558
0
      *dp++ = (uint8_t)((sv + 8u) >> 4u);
32559
0
      *dp++ = (uint8_t)((sv + 7u) >> 4u);
32560
0
      return dst_ptr;
32561
0
    }
32562
32563
0
    uint32_t sv_major_m1 = sp_major[-0];  // Clamp offset to zero.
32564
0
    uint32_t sv_minor_m1 = sp_minor[-0];  // Clamp offset to zero.
32565
0
    uint32_t sv_major_p1 = sp_major[+1];
32566
0
    uint32_t sv_minor_p1 = sp_minor[+1];
32567
32568
0
    uint32_t sv = (9u * ((uint32_t)(*sp_major++))) +  //
32569
0
                  (3u * ((uint32_t)(*sp_minor++)));
32570
0
    *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u);
32571
0
    *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u);
32572
0
    if (src_len <= 0u) {
32573
0
      return dst_ptr;
32574
0
    }
32575
0
  }
32576
32577
0
  if (last_column) {
32578
0
    src_len--;
32579
0
  }
32580
32581
0
  for (; src_len > 0u; src_len--) {
32582
0
    uint32_t sv_major_m1 = sp_major[-1];
32583
0
    uint32_t sv_minor_m1 = sp_minor[-1];
32584
0
    uint32_t sv_major_p1 = sp_major[+1];
32585
0
    uint32_t sv_minor_p1 = sp_minor[+1];
32586
32587
0
    uint32_t sv = (9u * ((uint32_t)(*sp_major++))) +  //
32588
0
                  (3u * ((uint32_t)(*sp_minor++)));
32589
0
    *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u);
32590
0
    *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u);
32591
0
  }
32592
32593
0
  if (last_column) {
32594
0
    uint32_t sv_major_m1 = sp_major[-1];
32595
0
    uint32_t sv_minor_m1 = sp_minor[-1];
32596
0
    uint32_t sv_major_p1 = sp_major[+0];  // Clamp offset to zero.
32597
0
    uint32_t sv_minor_p1 = sp_minor[+0];  // Clamp offset to zero.
32598
32599
0
    uint32_t sv = (9u * ((uint32_t)(*sp_major++))) +  //
32600
0
                  (3u * ((uint32_t)(*sp_minor++)));
32601
0
    *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u);
32602
0
    *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u);
32603
0
  }
32604
32605
0
  return dst_ptr;
32606
0
}
32607
32608
// wuffs_private_impl__swizzle_ycc__upsample_funcs is indexed by inv_h and then
32609
// inv_v.
32610
static const wuffs_private_impl__swizzle_ycc__upsample_func
32611
    wuffs_private_impl__swizzle_ycc__upsample_funcs[4][4] = {
32612
        {
32613
            wuffs_private_impl__swizzle_ycc__upsample_inv_h1vn_box,
32614
            wuffs_private_impl__swizzle_ycc__upsample_inv_h1vn_box,
32615
            wuffs_private_impl__swizzle_ycc__upsample_inv_h1vn_box,
32616
            wuffs_private_impl__swizzle_ycc__upsample_inv_h1vn_box,
32617
        },
32618
        {
32619
            wuffs_private_impl__swizzle_ycc__upsample_inv_h2vn_box,
32620
            wuffs_private_impl__swizzle_ycc__upsample_inv_h2vn_box,
32621
            wuffs_private_impl__swizzle_ycc__upsample_inv_h2vn_box,
32622
            wuffs_private_impl__swizzle_ycc__upsample_inv_h2vn_box,
32623
        },
32624
        {
32625
            wuffs_private_impl__swizzle_ycc__upsample_inv_h3vn_box,
32626
            wuffs_private_impl__swizzle_ycc__upsample_inv_h3vn_box,
32627
            wuffs_private_impl__swizzle_ycc__upsample_inv_h3vn_box,
32628
            wuffs_private_impl__swizzle_ycc__upsample_inv_h3vn_box,
32629
        },
32630
        {
32631
            wuffs_private_impl__swizzle_ycc__upsample_inv_h4vn_box,
32632
            wuffs_private_impl__swizzle_ycc__upsample_inv_h4vn_box,
32633
            wuffs_private_impl__swizzle_ycc__upsample_inv_h4vn_box,
32634
            wuffs_private_impl__swizzle_ycc__upsample_inv_h4vn_box,
32635
        },
32636
};
32637
32638
static inline uint32_t  //
32639
wuffs_private_impl__swizzle_has_triangle_upsampler(uint32_t inv_h,
32640
1.61k
                                                   uint32_t inv_v) {
32641
1.61k
  if (inv_h == 1u) {
32642
715
    return inv_v == 2u;
32643
901
  } else if (inv_h == 2u) {
32644
418
    return (inv_v == 1u) || (inv_v == 2u);
32645
418
  }
32646
483
  return false;
32647
1.61k
}
32648
32649
// --------
32650
32651
// All of the wuffs_private_impl__swizzle_ycc__etc functions have
32652
// preconditions. See all of the checks made in
32653
// wuffs_base__pixel_swizzler__swizzle_ycck before calling these functions. For
32654
// example, (width > 0) is a precondition, but there are many more.
32655
32656
static void  //
32657
wuffs_private_impl__swizzle_ycck__general__triangle_filter_edge_row(
32658
    wuffs_base__pixel_buffer* dst,
32659
    uint32_t width,
32660
    uint32_t y,
32661
    const uint8_t* src_ptr0,
32662
    const uint8_t* src_ptr1,
32663
    const uint8_t* src_ptr2,
32664
    const uint8_t* src_ptr3,
32665
    uint32_t stride0,
32666
    uint32_t stride1,
32667
    uint32_t stride2,
32668
    uint32_t stride3,
32669
    uint32_t inv_h0,
32670
    uint32_t inv_h1,
32671
    uint32_t inv_h2,
32672
    uint32_t inv_h3,
32673
    uint32_t inv_v0,
32674
    uint32_t inv_v1,
32675
    uint32_t inv_v2,
32676
    uint32_t inv_v3,
32677
    uint32_t half_width_for_2to1,
32678
    uint32_t h1v2_bias,
32679
    uint8_t* scratch_buffer_2k_ptr,
32680
    wuffs_private_impl__swizzle_ycc__upsample_func upfunc0,
32681
    wuffs_private_impl__swizzle_ycc__upsample_func upfunc1,
32682
    wuffs_private_impl__swizzle_ycc__upsample_func upfunc2,
32683
    wuffs_private_impl__swizzle_ycc__upsample_func upfunc3,
32684
237
    wuffs_private_impl__swizzle_ycc__convert_4_func conv4func) {
32685
237
  const uint8_t* src0 = src_ptr0 + ((y / inv_v0) * (size_t)stride0);
32686
237
  const uint8_t* src1 = src_ptr1 + ((y / inv_v1) * (size_t)stride1);
32687
237
  const uint8_t* src2 = src_ptr2 + ((y / inv_v2) * (size_t)stride2);
32688
237
  const uint8_t* src3 = src_ptr3 + ((y / inv_v3) * (size_t)stride3);
32689
237
  uint32_t total_src_len0 = 0u;
32690
237
  uint32_t total_src_len1 = 0u;
32691
237
  uint32_t total_src_len2 = 0u;
32692
237
  uint32_t total_src_len3 = 0u;
32693
32694
237
  uint32_t x = 0u;
32695
7.38k
  while (x < width) {
32696
7.15k
    bool first_column = x == 0u;
32697
7.15k
    uint32_t end = x + 480u;
32698
7.15k
    if (end > width) {
32699
235
      end = width;
32700
235
    }
32701
32702
7.15k
    uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0;
32703
7.15k
    uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1;
32704
7.15k
    uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2;
32705
7.15k
    uint32_t src_len3 = ((end - x) + inv_h3 - 1u) / inv_h3;
32706
7.15k
    total_src_len0 += src_len0;
32707
7.15k
    total_src_len1 += src_len1;
32708
7.15k
    total_src_len2 += src_len2;
32709
7.15k
    total_src_len3 += src_len3;
32710
32711
7.15k
    const uint8_t* src_ptr_x0 = src0 + (x / inv_h0);
32712
7.15k
    const uint8_t* up0 = (*upfunc0)(          //
32713
7.15k
        scratch_buffer_2k_ptr + (0u * 480u),  //
32714
7.15k
        src_ptr_x0,                           //
32715
7.15k
        src_ptr_x0,                           //
32716
7.15k
        src_len0,                             //
32717
7.15k
        h1v2_bias,                            //
32718
7.15k
        first_column,                         //
32719
7.15k
        (total_src_len0 >= half_width_for_2to1));
32720
32721
7.15k
    const uint8_t* src_ptr_x1 = src1 + (x / inv_h1);
32722
7.15k
    const uint8_t* up1 = (*upfunc1)(          //
32723
7.15k
        scratch_buffer_2k_ptr + (1u * 480u),  //
32724
7.15k
        src_ptr_x1,                           //
32725
7.15k
        src_ptr_x1,                           //
32726
7.15k
        src_len1,                             //
32727
7.15k
        h1v2_bias,                            //
32728
7.15k
        first_column,                         //
32729
7.15k
        (total_src_len1 >= half_width_for_2to1));
32730
32731
7.15k
    const uint8_t* src_ptr_x2 = src2 + (x / inv_h2);
32732
7.15k
    const uint8_t* up2 = (*upfunc2)(          //
32733
7.15k
        scratch_buffer_2k_ptr + (2u * 480u),  //
32734
7.15k
        src_ptr_x2,                           //
32735
7.15k
        src_ptr_x2,                           //
32736
7.15k
        src_len2,                             //
32737
7.15k
        h1v2_bias,                            //
32738
7.15k
        first_column,                         //
32739
7.15k
        (total_src_len2 >= half_width_for_2to1));
32740
32741
7.15k
    const uint8_t* src_ptr_x3 = src3 + (x / inv_h3);
32742
7.15k
    const uint8_t* up3 = (*upfunc3)(          //
32743
7.15k
        scratch_buffer_2k_ptr + (3u * 480u),  //
32744
7.15k
        src_ptr_x3,                           //
32745
7.15k
        src_ptr_x3,                           //
32746
7.15k
        src_len3,                             //
32747
7.15k
        h1v2_bias,                            //
32748
7.15k
        first_column,                         //
32749
7.15k
        (total_src_len3 >= half_width_for_2to1));
32750
32751
7.15k
    (*conv4func)(dst, x, end, y, up0, up1, up2, up3);
32752
7.15k
    x = end;
32753
7.15k
  }
32754
237
}
32755
32756
static void  //
32757
wuffs_private_impl__swizzle_ycck__general__triangle_filter(
32758
    wuffs_base__pixel_buffer* dst,
32759
    uint32_t x_min_incl,
32760
    uint32_t x_max_excl,
32761
    uint32_t y_min_incl,
32762
    uint32_t y_max_excl,
32763
    const uint8_t* src_ptr0,
32764
    const uint8_t* src_ptr1,
32765
    const uint8_t* src_ptr2,
32766
    const uint8_t* src_ptr3,
32767
    uint32_t stride0,
32768
    uint32_t stride1,
32769
    uint32_t stride2,
32770
    uint32_t stride3,
32771
    uint32_t inv_h0,
32772
    uint32_t inv_h1,
32773
    uint32_t inv_h2,
32774
    uint32_t inv_h3,
32775
    uint32_t inv_v0,
32776
    uint32_t inv_v1,
32777
    uint32_t inv_v2,
32778
    uint32_t inv_v3,
32779
    uint32_t half_width_for_2to1,
32780
    uint32_t half_height_for_2to1,
32781
    uint8_t* scratch_buffer_2k_ptr,
32782
    wuffs_private_impl__swizzle_ycc__upsample_func (*upfuncs)[4][4],
32783
143
    wuffs_private_impl__swizzle_ycc__convert_4_func conv4func) {
32784
143
  if ((x_min_incl != 0) || (y_min_incl != 0)) {
32785
0
    return;
32786
0
  }
32787
32788
143
  wuffs_private_impl__swizzle_ycc__upsample_func upfunc0 =
32789
143
      (*upfuncs)[(inv_h0 - 1u) & 3u][(inv_v0 - 1u) & 3u];
32790
143
  wuffs_private_impl__swizzle_ycc__upsample_func upfunc1 =
32791
143
      (*upfuncs)[(inv_h1 - 1u) & 3u][(inv_v1 - 1u) & 3u];
32792
143
  wuffs_private_impl__swizzle_ycc__upsample_func upfunc2 =
32793
143
      (*upfuncs)[(inv_h2 - 1u) & 3u][(inv_v2 - 1u) & 3u];
32794
143
  wuffs_private_impl__swizzle_ycc__upsample_func upfunc3 =
32795
143
      (*upfuncs)[(inv_h3 - 1u) & 3u][(inv_v3 - 1u) & 3u];
32796
32797
  // First row.
32798
143
  uint32_t h1v2_bias = 1u;
32799
143
  wuffs_private_impl__swizzle_ycck__general__triangle_filter_edge_row(
32800
143
      dst, x_max_excl, 0u,                     //
32801
143
      src_ptr0, src_ptr1, src_ptr2, src_ptr3,  //
32802
143
      stride0, stride1, stride2, stride3,      //
32803
143
      inv_h0, inv_h1, inv_h2, inv_h3,          //
32804
143
      inv_v0, inv_v1, inv_v2, inv_v3,          //
32805
143
      half_width_for_2to1,                     //
32806
143
      h1v2_bias,                               //
32807
143
      scratch_buffer_2k_ptr,                   //
32808
143
      upfunc0, upfunc1, upfunc2, upfunc3, conv4func);
32809
143
  h1v2_bias = 2u;
32810
32811
  // Middle rows.
32812
143
  bool last_row = y_max_excl == 2u * half_height_for_2to1;
32813
143
  uint32_t middle_y_max_excl = last_row ? (y_max_excl - 1u) : y_max_excl;
32814
143
  uint32_t y;
32815
1.27M
  for (y = 1u; y < middle_y_max_excl; y++) {
32816
1.27M
    const uint8_t* src0_major = src_ptr0 + ((y / inv_v0) * (size_t)stride0);
32817
1.27M
    const uint8_t* src0_minor =
32818
1.27M
        (inv_v0 != 2u)
32819
1.27M
            ? src0_major
32820
1.27M
            : ((y & 1u) ? (src0_major + stride0) : (src0_major - stride0));
32821
1.27M
    const uint8_t* src1_major = src_ptr1 + ((y / inv_v1) * (size_t)stride1);
32822
1.27M
    const uint8_t* src1_minor =
32823
1.27M
        (inv_v1 != 2u)
32824
1.27M
            ? src1_major
32825
1.27M
            : ((y & 1u) ? (src1_major + stride1) : (src1_major - stride1));
32826
1.27M
    const uint8_t* src2_major = src_ptr2 + ((y / inv_v2) * (size_t)stride2);
32827
1.27M
    const uint8_t* src2_minor =
32828
1.27M
        (inv_v2 != 2u)
32829
1.27M
            ? src2_major
32830
1.27M
            : ((y & 1u) ? (src2_major + stride2) : (src2_major - stride2));
32831
1.27M
    const uint8_t* src3_major = src_ptr3 + ((y / inv_v3) * (size_t)stride3);
32832
1.27M
    const uint8_t* src3_minor =
32833
1.27M
        (inv_v3 != 2u)
32834
1.27M
            ? src3_major
32835
1.27M
            : ((y & 1u) ? (src3_major + stride3) : (src3_major - stride3));
32836
1.27M
    uint32_t total_src_len0 = 0u;
32837
1.27M
    uint32_t total_src_len1 = 0u;
32838
1.27M
    uint32_t total_src_len2 = 0u;
32839
1.27M
    uint32_t total_src_len3 = 0u;
32840
32841
1.27M
    uint32_t x = 0u;
32842
3.07M
    while (x < x_max_excl) {
32843
1.79M
      bool first_column = x == 0u;
32844
1.79M
      uint32_t end = x + 480u;
32845
1.79M
      if (end > x_max_excl) {
32846
1.27M
        end = x_max_excl;
32847
1.27M
      }
32848
32849
1.79M
      uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0;
32850
1.79M
      uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1;
32851
1.79M
      uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2;
32852
1.79M
      uint32_t src_len3 = ((end - x) + inv_h3 - 1u) / inv_h3;
32853
1.79M
      total_src_len0 += src_len0;
32854
1.79M
      total_src_len1 += src_len1;
32855
1.79M
      total_src_len2 += src_len2;
32856
1.79M
      total_src_len3 += src_len3;
32857
32858
1.79M
      const uint8_t* up0 = (*upfunc0)(          //
32859
1.79M
          scratch_buffer_2k_ptr + (0u * 480u),  //
32860
1.79M
          src0_major + (x / inv_h0),            //
32861
1.79M
          src0_minor + (x / inv_h0),            //
32862
1.79M
          src_len0,                             //
32863
1.79M
          h1v2_bias,                            //
32864
1.79M
          first_column,                         //
32865
1.79M
          (total_src_len0 >= half_width_for_2to1));
32866
32867
1.79M
      const uint8_t* up1 = (*upfunc1)(          //
32868
1.79M
          scratch_buffer_2k_ptr + (1u * 480u),  //
32869
1.79M
          src1_major + (x / inv_h1),            //
32870
1.79M
          src1_minor + (x / inv_h1),            //
32871
1.79M
          src_len1,                             //
32872
1.79M
          h1v2_bias,                            //
32873
1.79M
          first_column,                         //
32874
1.79M
          (total_src_len1 >= half_width_for_2to1));
32875
32876
1.79M
      const uint8_t* up2 = (*upfunc2)(          //
32877
1.79M
          scratch_buffer_2k_ptr + (2u * 480u),  //
32878
1.79M
          src2_major + (x / inv_h2),            //
32879
1.79M
          src2_minor + (x / inv_h2),            //
32880
1.79M
          src_len2,                             //
32881
1.79M
          h1v2_bias,                            //
32882
1.79M
          first_column,                         //
32883
1.79M
          (total_src_len2 >= half_width_for_2to1));
32884
32885
1.79M
      const uint8_t* up3 = (*upfunc3)(          //
32886
1.79M
          scratch_buffer_2k_ptr + (3u * 480u),  //
32887
1.79M
          src3_major + (x / inv_h3),            //
32888
1.79M
          src3_minor + (x / inv_h3),            //
32889
1.79M
          src_len3,                             //
32890
1.79M
          h1v2_bias,                            //
32891
1.79M
          first_column,                         //
32892
1.79M
          (total_src_len3 >= half_width_for_2to1));
32893
32894
1.79M
      (*conv4func)(dst, x, end, y, up0, up1, up2, up3);
32895
1.79M
      x = end;
32896
1.79M
    }
32897
32898
1.27M
    h1v2_bias ^= 3u;
32899
1.27M
  }
32900
32901
  // Last row.
32902
143
  if (middle_y_max_excl != y_max_excl) {
32903
94
    wuffs_private_impl__swizzle_ycck__general__triangle_filter_edge_row(
32904
94
        dst, x_max_excl, middle_y_max_excl,      //
32905
94
        src_ptr0, src_ptr1, src_ptr2, src_ptr3,  //
32906
94
        stride0, stride1, stride2, stride3,      //
32907
94
        inv_h0, inv_h1, inv_h2, inv_h3,          //
32908
94
        inv_v0, inv_v1, inv_v2, inv_v3,          //
32909
94
        half_width_for_2to1,                     //
32910
94
        h1v2_bias,                               //
32911
94
        scratch_buffer_2k_ptr,                   //
32912
94
        upfunc0, upfunc1, upfunc2, upfunc3, conv4func);
32913
94
  }
32914
143
}
32915
32916
static void  //
32917
wuffs_private_impl__swizzle_ycc__general__triangle_filter_edge_row(
32918
    wuffs_base__pixel_buffer* dst,
32919
    uint32_t width,
32920
    uint32_t y,
32921
    const uint8_t* src_ptr0,
32922
    const uint8_t* src_ptr1,
32923
    const uint8_t* src_ptr2,
32924
    uint32_t stride0,
32925
    uint32_t stride1,
32926
    uint32_t stride2,
32927
    uint32_t inv_h0,
32928
    uint32_t inv_h1,
32929
    uint32_t inv_h2,
32930
    uint32_t inv_v0,
32931
    uint32_t inv_v1,
32932
    uint32_t inv_v2,
32933
    uint32_t half_width_for_2to1,
32934
    uint32_t h1v2_bias,
32935
    uint8_t* scratch_buffer_2k_ptr,
32936
    wuffs_private_impl__swizzle_ycc__upsample_func upfunc0,
32937
    wuffs_private_impl__swizzle_ycc__upsample_func upfunc1,
32938
    wuffs_private_impl__swizzle_ycc__upsample_func upfunc2,
32939
498
    wuffs_private_impl__swizzle_ycc__convert_3_func conv3func) {
32940
498
  const uint8_t* src0 = src_ptr0 + ((y / inv_v0) * (size_t)stride0);
32941
498
  const uint8_t* src1 = src_ptr1 + ((y / inv_v1) * (size_t)stride1);
32942
498
  const uint8_t* src2 = src_ptr2 + ((y / inv_v2) * (size_t)stride2);
32943
498
  uint32_t total_src_len0 = 0u;
32944
498
  uint32_t total_src_len1 = 0u;
32945
498
  uint32_t total_src_len2 = 0u;
32946
32947
498
  uint32_t x = 0u;
32948
7.73k
  while (x < width) {
32949
7.24k
    bool first_column = x == 0u;
32950
7.24k
    uint32_t end = x + 672u;
32951
7.24k
    if (end > width) {
32952
494
      end = width;
32953
494
    }
32954
32955
7.24k
    uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0;
32956
7.24k
    uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1;
32957
7.24k
    uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2;
32958
7.24k
    total_src_len0 += src_len0;
32959
7.24k
    total_src_len1 += src_len1;
32960
7.24k
    total_src_len2 += src_len2;
32961
32962
7.24k
    const uint8_t* src_ptr_x0 = src0 + (x / inv_h0);
32963
7.24k
    const uint8_t* up0 = (*upfunc0)(          //
32964
7.24k
        scratch_buffer_2k_ptr + (0u * 672u),  //
32965
7.24k
        src_ptr_x0,                           //
32966
7.24k
        src_ptr_x0,                           //
32967
7.24k
        src_len0,                             //
32968
7.24k
        h1v2_bias,                            //
32969
7.24k
        first_column,                         //
32970
7.24k
        (total_src_len0 >= half_width_for_2to1));
32971
32972
7.24k
    const uint8_t* src_ptr_x1 = src1 + (x / inv_h1);
32973
7.24k
    const uint8_t* up1 = (*upfunc1)(          //
32974
7.24k
        scratch_buffer_2k_ptr + (1u * 672u),  //
32975
7.24k
        src_ptr_x1,                           //
32976
7.24k
        src_ptr_x1,                           //
32977
7.24k
        src_len1,                             //
32978
7.24k
        h1v2_bias,                            //
32979
7.24k
        first_column,                         //
32980
7.24k
        (total_src_len1 >= half_width_for_2to1));
32981
32982
7.24k
    const uint8_t* src_ptr_x2 = src2 + (x / inv_h2);
32983
7.24k
    const uint8_t* up2 = (*upfunc2)(          //
32984
7.24k
        scratch_buffer_2k_ptr + (2u * 672u),  //
32985
7.24k
        src_ptr_x2,                           //
32986
7.24k
        src_ptr_x2,                           //
32987
7.24k
        src_len2,                             //
32988
7.24k
        h1v2_bias,                            //
32989
7.24k
        first_column,                         //
32990
7.24k
        (total_src_len2 >= half_width_for_2to1));
32991
32992
7.24k
    (*conv3func)(dst, x, end, y, up0, up1, up2);
32993
7.24k
    x = end;
32994
7.24k
  }
32995
498
}
32996
32997
static void  //
32998
wuffs_private_impl__swizzle_ycc__general__triangle_filter(
32999
    wuffs_base__pixel_buffer* dst,
33000
    uint32_t x_min_incl,
33001
    uint32_t x_max_excl,
33002
    uint32_t y_min_incl,
33003
    uint32_t y_max_excl,
33004
    const uint8_t* src_ptr0,
33005
    const uint8_t* src_ptr1,
33006
    const uint8_t* src_ptr2,
33007
    uint32_t stride0,
33008
    uint32_t stride1,
33009
    uint32_t stride2,
33010
    uint32_t inv_h0,
33011
    uint32_t inv_h1,
33012
    uint32_t inv_h2,
33013
    uint32_t inv_v0,
33014
    uint32_t inv_v1,
33015
    uint32_t inv_v2,
33016
    uint32_t half_width_for_2to1,
33017
    uint32_t half_height_for_2to1,
33018
    uint8_t* scratch_buffer_2k_ptr,
33019
    wuffs_private_impl__swizzle_ycc__upsample_func (*upfuncs)[4][4],
33020
333
    wuffs_private_impl__swizzle_ycc__convert_3_func conv3func) {
33021
333
  if ((x_min_incl != 0) || (y_min_incl != 0)) {
33022
0
    return;
33023
0
  }
33024
33025
333
  wuffs_private_impl__swizzle_ycc__upsample_func upfunc0 =
33026
333
      (*upfuncs)[(inv_h0 - 1u) & 3u][(inv_v0 - 1u) & 3u];
33027
333
  wuffs_private_impl__swizzle_ycc__upsample_func upfunc1 =
33028
333
      (*upfuncs)[(inv_h1 - 1u) & 3u][(inv_v1 - 1u) & 3u];
33029
333
  wuffs_private_impl__swizzle_ycc__upsample_func upfunc2 =
33030
333
      (*upfuncs)[(inv_h2 - 1u) & 3u][(inv_v2 - 1u) & 3u];
33031
33032
  // First row.
33033
333
  uint32_t h1v2_bias = 1u;
33034
333
  wuffs_private_impl__swizzle_ycc__general__triangle_filter_edge_row(
33035
333
      dst, x_max_excl, 0u,           //
33036
333
      src_ptr0, src_ptr1, src_ptr2,  //
33037
333
      stride0, stride1, stride2,     //
33038
333
      inv_h0, inv_h1, inv_h2,        //
33039
333
      inv_v0, inv_v1, inv_v2,        //
33040
333
      half_width_for_2to1,           //
33041
333
      h1v2_bias,                     //
33042
333
      scratch_buffer_2k_ptr,         //
33043
333
      upfunc0, upfunc1, upfunc2, conv3func);
33044
333
  h1v2_bias = 2u;
33045
33046
  // Middle rows.
33047
333
  bool last_row = y_max_excl == 2u * half_height_for_2to1;
33048
333
  uint32_t middle_y_max_excl = last_row ? (y_max_excl - 1u) : y_max_excl;
33049
333
  uint32_t y;
33050
4.46M
  for (y = 1u; y < middle_y_max_excl; y++) {
33051
4.46M
    const uint8_t* src0_major = src_ptr0 + ((y / inv_v0) * (size_t)stride0);
33052
4.46M
    const uint8_t* src0_minor =
33053
4.46M
        (inv_v0 != 2u)
33054
4.46M
            ? src0_major
33055
4.46M
            : ((y & 1u) ? (src0_major + stride0) : (src0_major - stride0));
33056
4.46M
    const uint8_t* src1_major = src_ptr1 + ((y / inv_v1) * (size_t)stride1);
33057
4.46M
    const uint8_t* src1_minor =
33058
4.46M
        (inv_v1 != 2u)
33059
4.46M
            ? src1_major
33060
4.46M
            : ((y & 1u) ? (src1_major + stride1) : (src1_major - stride1));
33061
4.46M
    const uint8_t* src2_major = src_ptr2 + ((y / inv_v2) * (size_t)stride2);
33062
4.46M
    const uint8_t* src2_minor =
33063
4.46M
        (inv_v2 != 2u)
33064
4.46M
            ? src2_major
33065
4.46M
            : ((y & 1u) ? (src2_major + stride2) : (src2_major - stride2));
33066
4.46M
    uint32_t total_src_len0 = 0u;
33067
4.46M
    uint32_t total_src_len1 = 0u;
33068
4.46M
    uint32_t total_src_len2 = 0u;
33069
33070
4.46M
    uint32_t x = 0u;
33071
9.96M
    while (x < x_max_excl) {
33072
5.50M
      bool first_column = x == 0u;
33073
5.50M
      uint32_t end = x + 672u;
33074
5.50M
      if (end > x_max_excl) {
33075
4.46M
        end = x_max_excl;
33076
4.46M
      }
33077
33078
5.50M
      uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0;
33079
5.50M
      uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1;
33080
5.50M
      uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2;
33081
5.50M
      total_src_len0 += src_len0;
33082
5.50M
      total_src_len1 += src_len1;
33083
5.50M
      total_src_len2 += src_len2;
33084
33085
5.50M
      const uint8_t* up0 = (*upfunc0)(          //
33086
5.50M
          scratch_buffer_2k_ptr + (0u * 672u),  //
33087
5.50M
          src0_major + (x / inv_h0),            //
33088
5.50M
          src0_minor + (x / inv_h0),            //
33089
5.50M
          src_len0,                             //
33090
5.50M
          h1v2_bias,                            //
33091
5.50M
          first_column,                         //
33092
5.50M
          (total_src_len0 >= half_width_for_2to1));
33093
33094
5.50M
      const uint8_t* up1 = (*upfunc1)(          //
33095
5.50M
          scratch_buffer_2k_ptr + (1u * 672u),  //
33096
5.50M
          src1_major + (x / inv_h1),            //
33097
5.50M
          src1_minor + (x / inv_h1),            //
33098
5.50M
          src_len1,                             //
33099
5.50M
          h1v2_bias,                            //
33100
5.50M
          first_column,                         //
33101
5.50M
          (total_src_len1 >= half_width_for_2to1));
33102
33103
5.50M
      const uint8_t* up2 = (*upfunc2)(          //
33104
5.50M
          scratch_buffer_2k_ptr + (2u * 672u),  //
33105
5.50M
          src2_major + (x / inv_h2),            //
33106
5.50M
          src2_minor + (x / inv_h2),            //
33107
5.50M
          src_len2,                             //
33108
5.50M
          h1v2_bias,                            //
33109
5.50M
          first_column,                         //
33110
5.50M
          (total_src_len2 >= half_width_for_2to1));
33111
33112
5.50M
      (*conv3func)(dst, x, end, y, up0, up1, up2);
33113
5.50M
      x = end;
33114
5.50M
    }
33115
33116
4.46M
    h1v2_bias ^= 3u;
33117
4.46M
  }
33118
33119
  // Last row.
33120
333
  if (middle_y_max_excl != y_max_excl) {
33121
165
    wuffs_private_impl__swizzle_ycc__general__triangle_filter_edge_row(
33122
165
        dst, x_max_excl, middle_y_max_excl,  //
33123
165
        src_ptr0, src_ptr1, src_ptr2,        //
33124
165
        stride0, stride1, stride2,           //
33125
165
        inv_h0, inv_h1, inv_h2,              //
33126
165
        inv_v0, inv_v1, inv_v2,              //
33127
165
        half_width_for_2to1,                 //
33128
165
        h1v2_bias,                           //
33129
165
        scratch_buffer_2k_ptr,               //
33130
165
        upfunc0, upfunc1, upfunc2, conv3func);
33131
165
  }
33132
333
}
33133
33134
static void  //
33135
wuffs_private_impl__swizzle_ycc__general__box_filter(
33136
    wuffs_base__pixel_buffer* dst,
33137
    uint32_t x_min_incl,
33138
    uint32_t x_max_excl,
33139
    uint32_t y_min_incl,
33140
    uint32_t y_max_excl,
33141
    const uint8_t* src_ptr0,
33142
    const uint8_t* src_ptr1,
33143
    const uint8_t* src_ptr2,
33144
    uint32_t stride0,
33145
    uint32_t stride1,
33146
    uint32_t stride2,
33147
    uint32_t inv_h0,
33148
    uint32_t inv_h1,
33149
    uint32_t inv_h2,
33150
    uint32_t inv_v0,
33151
    uint32_t inv_v1,
33152
    uint32_t inv_v2,
33153
    uint32_t half_width_for_2to1,
33154
    uint32_t half_height_for_2to1,
33155
    uint8_t* scratch_buffer_2k_ptr,
33156
    wuffs_private_impl__swizzle_ycc__upsample_func (*upfuncs)[4][4],
33157
139
    wuffs_private_impl__swizzle_ycc__convert_3_func conv3func) {
33158
139
  wuffs_private_impl__swizzle_ycc__upsample_func upfunc0 =
33159
139
      (*upfuncs)[(inv_h0 - 1u) & 3u][(inv_v0 - 1u) & 3u];
33160
139
  wuffs_private_impl__swizzle_ycc__upsample_func upfunc1 =
33161
139
      (*upfuncs)[(inv_h1 - 1u) & 3u][(inv_v1 - 1u) & 3u];
33162
139
  wuffs_private_impl__swizzle_ycc__upsample_func upfunc2 =
33163
139
      (*upfuncs)[(inv_h2 - 1u) & 3u][(inv_v2 - 1u) & 3u];
33164
33165
139
  uint32_t y;
33166
2.44M
  for (y = y_min_incl; y < y_max_excl; y++) {
33167
2.44M
    const uint8_t* src0_major =
33168
2.44M
        src_ptr0 + (((y - y_min_incl) / inv_v0) * (size_t)stride0);
33169
2.44M
    const uint8_t* src1_major =
33170
2.44M
        src_ptr1 + (((y - y_min_incl) / inv_v1) * (size_t)stride1);
33171
2.44M
    const uint8_t* src2_major =
33172
2.44M
        src_ptr2 + (((y - y_min_incl) / inv_v2) * (size_t)stride2);
33173
33174
2.44M
    uint32_t x = x_min_incl;
33175
5.35M
    while (x < x_max_excl) {
33176
2.91M
      uint32_t end = x + 672u;
33177
2.91M
      if (end > x_max_excl) {
33178
2.44M
        end = x_max_excl;
33179
2.44M
      }
33180
33181
2.91M
      uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0;
33182
2.91M
      uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1;
33183
2.91M
      uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2;
33184
33185
2.91M
      const uint8_t* up0 = (*upfunc0)(               //
33186
2.91M
          scratch_buffer_2k_ptr + (0u * 672u),       //
33187
2.91M
          src0_major + ((x - x_min_incl) / inv_h0),  //
33188
2.91M
          src0_major + ((x - x_min_incl) / inv_h0),  //
33189
2.91M
          src_len0,                                  //
33190
2.91M
          0u, false, false);
33191
33192
2.91M
      const uint8_t* up1 = (*upfunc1)(               //
33193
2.91M
          scratch_buffer_2k_ptr + (1u * 672u),       //
33194
2.91M
          src1_major + ((x - x_min_incl) / inv_h1),  //
33195
2.91M
          src1_major + ((x - x_min_incl) / inv_h1),  //
33196
2.91M
          src_len1,                                  //
33197
2.91M
          0u, false, false);
33198
33199
2.91M
      const uint8_t* up2 = (*upfunc2)(               //
33200
2.91M
          scratch_buffer_2k_ptr + (2u * 672u),       //
33201
2.91M
          src2_major + ((x - x_min_incl) / inv_h2),  //
33202
2.91M
          src2_major + ((x - x_min_incl) / inv_h2),  //
33203
2.91M
          src_len2,                                  //
33204
2.91M
          0u, false, false);
33205
33206
2.91M
      (*conv3func)(dst, x, end, y, up0, up1, up2);
33207
2.91M
      x = end;
33208
2.91M
    }
33209
2.44M
  }
33210
139
}
33211
33212
static void  //
33213
wuffs_private_impl__swizzle_ycck__general__box_filter(
33214
    wuffs_base__pixel_buffer* dst,
33215
    uint32_t x_min_incl,
33216
    uint32_t x_max_excl,
33217
    uint32_t y_min_incl,
33218
    uint32_t y_max_excl,
33219
    const uint8_t* src_ptr0,
33220
    const uint8_t* src_ptr1,
33221
    const uint8_t* src_ptr2,
33222
    const uint8_t* src_ptr3,
33223
    uint32_t stride0,
33224
    uint32_t stride1,
33225
    uint32_t stride2,
33226
    uint32_t stride3,
33227
    uint32_t inv_h0,
33228
    uint32_t inv_h1,
33229
    uint32_t inv_h2,
33230
    uint32_t inv_h3,
33231
    uint32_t inv_v0,
33232
    uint32_t inv_v1,
33233
    uint32_t inv_v2,
33234
    uint32_t inv_v3,
33235
    uint32_t half_width_for_2to1,
33236
    uint32_t half_height_for_2to1,
33237
    uint8_t* scratch_buffer_2k_ptr,
33238
    wuffs_private_impl__swizzle_ycc__upsample_func (*upfuncs)[4][4],
33239
74
    wuffs_private_impl__swizzle_ycc__convert_4_func conv4func) {
33240
74
  wuffs_private_impl__swizzle_ycc__upsample_func upfunc0 =
33241
74
      (*upfuncs)[(inv_h0 - 1u) & 3u][(inv_v0 - 1u) & 3u];
33242
74
  wuffs_private_impl__swizzle_ycc__upsample_func upfunc1 =
33243
74
      (*upfuncs)[(inv_h1 - 1u) & 3u][(inv_v1 - 1u) & 3u];
33244
74
  wuffs_private_impl__swizzle_ycc__upsample_func upfunc2 =
33245
74
      (*upfuncs)[(inv_h2 - 1u) & 3u][(inv_v2 - 1u) & 3u];
33246
74
  wuffs_private_impl__swizzle_ycc__upsample_func upfunc3 =
33247
74
      (*upfuncs)[(inv_h3 - 1u) & 3u][(inv_v3 - 1u) & 3u];
33248
33249
74
  uint32_t y;
33250
801k
  for (y = y_min_incl; y < y_max_excl; y++) {
33251
801k
    const uint8_t* src0_major =
33252
801k
        src_ptr0 + (((y - y_min_incl) / inv_v0) * (size_t)stride0);
33253
801k
    const uint8_t* src1_major =
33254
801k
        src_ptr1 + (((y - y_min_incl) / inv_v1) * (size_t)stride1);
33255
801k
    const uint8_t* src2_major =
33256
801k
        src_ptr2 + (((y - y_min_incl) / inv_v2) * (size_t)stride2);
33257
801k
    const uint8_t* src3_major =
33258
801k
        src_ptr3 + (((y - y_min_incl) / inv_v3) * (size_t)stride3);
33259
33260
801k
    uint32_t x = x_min_incl;
33261
1.88M
    while (x < x_max_excl) {
33262
1.08M
      uint32_t end = x + 480u;
33263
1.08M
      if (end > x_max_excl) {
33264
801k
        end = x_max_excl;
33265
801k
      }
33266
33267
1.08M
      uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0;
33268
1.08M
      uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1;
33269
1.08M
      uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2;
33270
1.08M
      uint32_t src_len3 = ((end - x) + inv_h3 - 1u) / inv_h3;
33271
33272
1.08M
      const uint8_t* up0 = (*upfunc0)(               //
33273
1.08M
          scratch_buffer_2k_ptr + (0u * 480u),       //
33274
1.08M
          src0_major + ((x - x_min_incl) / inv_h0),  //
33275
1.08M
          src0_major + ((x - x_min_incl) / inv_h0),  //
33276
1.08M
          src_len0,                                  //
33277
1.08M
          0u, false, false);
33278
33279
1.08M
      const uint8_t* up1 = (*upfunc1)(               //
33280
1.08M
          scratch_buffer_2k_ptr + (1u * 480u),       //
33281
1.08M
          src1_major + ((x - x_min_incl) / inv_h1),  //
33282
1.08M
          src1_major + ((x - x_min_incl) / inv_h1),  //
33283
1.08M
          src_len1,                                  //
33284
1.08M
          0u, false, false);
33285
33286
1.08M
      const uint8_t* up2 = (*upfunc2)(               //
33287
1.08M
          scratch_buffer_2k_ptr + (2u * 480u),       //
33288
1.08M
          src2_major + ((x - x_min_incl) / inv_h2),  //
33289
1.08M
          src2_major + ((x - x_min_incl) / inv_h2),  //
33290
1.08M
          src_len2,                                  //
33291
1.08M
          0u, false, false);
33292
33293
1.08M
      const uint8_t* up3 = (*upfunc3)(               //
33294
1.08M
          scratch_buffer_2k_ptr + (3u * 480u),       //
33295
1.08M
          src3_major + ((x - x_min_incl) / inv_h3),  //
33296
1.08M
          src3_major + ((x - x_min_incl) / inv_h3),  //
33297
1.08M
          src_len3,                                  //
33298
1.08M
          0u, false, false);
33299
33300
1.08M
      (*conv4func)(dst, x, end, y, up0, up1, up2, up3);
33301
1.08M
      x = end;
33302
1.08M
    }
33303
801k
  }
33304
74
}
33305
33306
// --------
33307
33308
// wuffs_private_impl__swizzle_flattened_length is like
33309
// wuffs_base__table__flattened_length but returns uint64_t (not size_t) and
33310
// also accounts for subsampling.
33311
static uint64_t  //
33312
wuffs_private_impl__swizzle_flattened_length(uint32_t width,
33313
                                             uint32_t height,
33314
                                             uint32_t stride,
33315
                                             uint32_t inv_h,
33316
2.28k
                                             uint32_t inv_v) {
33317
2.28k
  uint64_t scaled_width = (((uint64_t)width) + (inv_h - 1u)) / inv_h;
33318
2.28k
  uint64_t scaled_height = (((uint64_t)height) + (inv_v - 1u)) / inv_v;
33319
2.28k
  if (scaled_height <= 0u) {
33320
0
    return 0u;
33321
0
  }
33322
2.28k
  return ((scaled_height - 1u) * stride) + scaled_width;
33323
2.28k
}
33324
33325
WUFFS_BASE__MAYBE_STATIC wuffs_base__status  //
33326
wuffs_base__pixel_swizzler__swizzle_ycck(
33327
    const wuffs_base__pixel_swizzler* p,
33328
    wuffs_base__pixel_buffer* dst,
33329
    wuffs_base__slice_u8 dst_palette,
33330
    uint32_t x_min_incl,
33331
    uint32_t x_max_excl,
33332
    uint32_t y_min_incl,
33333
    uint32_t y_max_excl,
33334
    wuffs_base__slice_u8 src0,
33335
    wuffs_base__slice_u8 src1,
33336
    wuffs_base__slice_u8 src2,
33337
    wuffs_base__slice_u8 src3,
33338
    uint32_t width0,
33339
    uint32_t width1,
33340
    uint32_t width2,
33341
    uint32_t width3,
33342
    uint32_t height0,
33343
    uint32_t height1,
33344
    uint32_t height2,
33345
    uint32_t height3,
33346
    uint32_t stride0,
33347
    uint32_t stride1,
33348
    uint32_t stride2,
33349
    uint32_t stride3,
33350
    uint8_t h0,
33351
    uint8_t h1,
33352
    uint8_t h2,
33353
    uint8_t h3,
33354
    uint8_t v0,
33355
    uint8_t v1,
33356
    uint8_t v2,
33357
    uint8_t v3,
33358
    bool is_rgb_or_cmyk,
33359
    bool triangle_filter_for_2to1,
33360
689
    wuffs_base__slice_u8 scratch_buffer_2k) {
33361
689
  if (!p) {
33362
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
33363
689
  } else if (!dst ||                             //
33364
689
             (x_min_incl > x_max_excl) ||        //
33365
689
             (x_max_excl > 0xFFFFu) ||           //
33366
689
             (y_min_incl > y_max_excl) ||        //
33367
689
             (y_max_excl > 0xFFFFu) ||           //
33368
689
             (4u <= ((unsigned int)h0 - 1u)) ||  //
33369
689
             (4u <= ((unsigned int)h1 - 1u)) ||  //
33370
689
             (4u <= ((unsigned int)h2 - 1u)) ||  //
33371
689
             (4u <= ((unsigned int)v0 - 1u)) ||  //
33372
689
             (4u <= ((unsigned int)v1 - 1u)) ||  //
33373
689
             (4u <= ((unsigned int)v2 - 1u)) ||  //
33374
689
             (triangle_filter_for_2to1 && ((x_min_incl | y_min_incl) > 0u)) ||
33375
689
             (scratch_buffer_2k.len < 2048u)) {
33376
0
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
33377
0
  }
33378
689
  if ((h3 != 0u) || (v3 != 0u)) {
33379
217
    if ((4u <= ((unsigned int)h3 - 1u)) ||  //
33380
217
        (4u <= ((unsigned int)v3 - 1u))) {
33381
0
      return wuffs_base__make_status(wuffs_base__error__bad_argument);
33382
0
    }
33383
217
  }
33384
33385
689
  uint32_t max_incl_h = wuffs_private_impl__u32__max_of_4(h0, h1, h2, h3);
33386
689
  uint32_t max_incl_v = wuffs_private_impl__u32__max_of_4(v0, v1, v2, v3);
33387
33388
  // Calculate the inverse h and v ratios.
33389
  //
33390
  // It also canonicalizes (h=2 and max_incl_h=4) as equivalent to (h=1 and
33391
  // max_incl_h=2). In both cases, the inv_h value is 2.
33392
689
  uint32_t inv_h0 = max_incl_h / h0;
33393
689
  uint32_t inv_h1 = max_incl_h / h1;
33394
689
  uint32_t inv_h2 = max_incl_h / h2;
33395
689
  uint32_t inv_h3 = h3 ? (max_incl_h / h3) : 0u;
33396
689
  uint32_t inv_v0 = max_incl_v / v0;
33397
689
  uint32_t inv_v1 = max_incl_v / v1;
33398
689
  uint32_t inv_v2 = max_incl_v / v2;
33399
689
  uint32_t inv_v3 = v3 ? (max_incl_v / v3) : 0u;
33400
33401
689
  if (x_min_incl != 0) {
33402
0
    if ((x_min_incl % inv_h0) || (x_min_incl % inv_h1) ||
33403
0
        (x_min_incl % inv_h2) || (inv_h3 && (x_min_incl % inv_h3))) {
33404
0
      return wuffs_base__make_status(wuffs_base__error__bad_argument);
33405
0
    }
33406
0
  }
33407
689
  if (y_min_incl != 0) {
33408
0
    if ((y_min_incl % inv_v0) || (y_min_incl % inv_v1) ||
33409
0
        (y_min_incl % inv_v2) || (inv_v3 && (y_min_incl % inv_v3))) {
33410
0
      return wuffs_base__make_status(wuffs_base__error__bad_argument);
33411
0
    }
33412
0
  }
33413
33414
689
  uint32_t half_width_for_2to1 = ((x_max_excl - x_min_incl) + 1u) / 2u;
33415
689
  if (inv_h0 == 2) {
33416
198
    half_width_for_2to1 = wuffs_base__u32__min(half_width_for_2to1, width0);
33417
198
  }
33418
689
  if (inv_h1 == 2) {
33419
232
    half_width_for_2to1 = wuffs_base__u32__min(half_width_for_2to1, width1);
33420
232
  }
33421
689
  if (inv_h2 == 2) {
33422
223
    half_width_for_2to1 = wuffs_base__u32__min(half_width_for_2to1, width2);
33423
223
  }
33424
689
  if (inv_h3 == 2) {
33425
91
    half_width_for_2to1 = wuffs_base__u32__min(half_width_for_2to1, width3);
33426
91
  }
33427
33428
689
  uint32_t half_height_for_2to1 = ((y_max_excl - y_min_incl) + 1u) / 2u;
33429
689
  if (inv_v0 == 2) {
33430
230
    half_height_for_2to1 = wuffs_base__u32__min(half_height_for_2to1, height0);
33431
230
  }
33432
689
  if (inv_v1 == 2) {
33433
210
    half_height_for_2to1 = wuffs_base__u32__min(half_height_for_2to1, height1);
33434
210
  }
33435
689
  if (inv_v2 == 2) {
33436
182
    half_height_for_2to1 = wuffs_base__u32__min(half_height_for_2to1, height2);
33437
182
  }
33438
689
  if (inv_v3 == 2) {
33439
70
    half_height_for_2to1 = wuffs_base__u32__min(half_height_for_2to1, height3);
33440
70
  }
33441
33442
689
  x_max_excl = wuffs_base__u32__min(                   //
33443
689
      wuffs_base__pixel_config__width(&dst->pixcfg),   //
33444
689
      x_min_incl + wuffs_private_impl__u32__min_of_5(  //
33445
689
                       x_max_excl - x_min_incl,        //
33446
689
                       width0 * inv_h0,                //
33447
689
                       width1 * inv_h1,                //
33448
689
                       width2 * inv_h2,                //
33449
689
                       inv_h3 ? (width3 * inv_h3) : 0xFFFFFFFF));
33450
689
  y_max_excl = wuffs_base__u32__min(                   //
33451
689
      wuffs_base__pixel_config__height(&dst->pixcfg),  //
33452
689
      y_min_incl + wuffs_private_impl__u32__min_of_5(  //
33453
689
                       y_max_excl - y_min_incl,        //
33454
689
                       height0 * inv_v0,               //
33455
689
                       height1 * inv_v1,               //
33456
689
                       height2 * inv_v2,               //
33457
689
                       inv_v3 ? (height3 * inv_v3) : 0xFFFFFFFF));
33458
33459
689
  if ((x_min_incl >= x_max_excl) || (y_min_incl >= y_max_excl)) {
33460
0
    return wuffs_base__make_status(NULL);
33461
0
  }
33462
689
  uint32_t width = x_max_excl - x_min_incl;
33463
689
  uint32_t height = y_max_excl - y_min_incl;
33464
33465
689
  if (((h0 * inv_h0) != max_incl_h) ||  //
33466
689
      ((h1 * inv_h1) != max_incl_h) ||  //
33467
689
      ((h2 * inv_h2) != max_incl_h) ||  //
33468
689
      ((v0 * inv_v0) != max_incl_v) ||  //
33469
689
      ((v1 * inv_v1) != max_incl_v) ||  //
33470
689
      ((v2 * inv_v2) != max_incl_v) ||  //
33471
689
      (src0.len < wuffs_private_impl__swizzle_flattened_length(
33472
689
                      width, height, stride0, inv_h0, inv_v0)) ||
33473
689
      (src1.len < wuffs_private_impl__swizzle_flattened_length(
33474
689
                      width, height, stride1, inv_h1, inv_v1)) ||
33475
689
      (src2.len < wuffs_private_impl__swizzle_flattened_length(
33476
689
                      width, height, stride2, inv_h2, inv_v2))) {
33477
0
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
33478
0
  }
33479
689
  if ((h3 != 0u) || (v3 != 0u)) {
33480
217
    if (((h3 * inv_h3) != max_incl_h) ||  //
33481
217
        ((v3 * inv_v3) != max_incl_v) ||  //
33482
217
        (src3.len < wuffs_private_impl__swizzle_flattened_length(
33483
217
                        width, height, stride3, inv_h3, inv_v3))) {
33484
0
      return wuffs_base__make_status(wuffs_base__error__bad_argument);
33485
0
    }
33486
217
  }
33487
33488
689
  if (wuffs_base__pixel_format__is_planar(&dst->pixcfg.private_impl.pixfmt)) {
33489
    // TODO: see wuffs_base__pixel_buffer__set_color_u32_at's TODO.
33490
0
    return wuffs_base__make_status(
33491
0
        wuffs_base__error__unsupported_pixel_swizzler_option);
33492
0
  }
33493
33494
  // ----
33495
33496
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ENABLE_ALLOWLIST)
33497
  switch (dst->pixcfg.private_impl.pixfmt.repr) {
33498
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_Y)
33499
    case WUFFS_BASE__PIXEL_FORMAT__Y:
33500
      break;
33501
#endif
33502
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGR_565)
33503
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
33504
      break;
33505
#endif
33506
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGR)
33507
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
33508
      break;
33509
#endif
33510
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGRA_NONPREMUL)
33511
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
33512
      break;
33513
#endif
33514
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGRA_NONPREMUL_4X16LE)
33515
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
33516
      break;
33517
#endif
33518
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGRA_PREMUL)
33519
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
33520
      break;
33521
#endif
33522
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_RGB)
33523
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
33524
      break;
33525
#endif
33526
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_RGBA_NONPREMUL)
33527
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
33528
      break;
33529
#endif
33530
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_RGBA_PREMUL)
33531
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
33532
      break;
33533
#endif
33534
    default:
33535
      return wuffs_base__make_status(
33536
          wuffs_base__error__disabled_by_wuffs_config_dst_pixel_format_enable_allowlist);
33537
  }
33538
#else   // defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ENABLE_ALLOWLIST)
33539
689
  switch (dst->pixcfg.private_impl.pixfmt.repr) {
33540
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
33541
0
    case WUFFS_BASE__PIXEL_FORMAT__Y_16LE:
33542
0
    case WUFFS_BASE__PIXEL_FORMAT__Y_16BE:
33543
0
    case WUFFS_BASE__PIXEL_FORMAT__YA_NONPREMUL:
33544
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL:
33545
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL:
33546
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY:
33547
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
33548
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
33549
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
33550
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
33551
334
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
33552
689
    case WUFFS_BASE__PIXEL_FORMAT__BGRX:
33553
689
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
33554
689
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
33555
689
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
33556
689
    case WUFFS_BASE__PIXEL_FORMAT__RGBX:
33557
689
      break;
33558
33559
0
    default:
33560
      // TODO: see wuffs_base__pixel_buffer__set_color_u32_at's TODO.
33561
0
      return wuffs_base__make_status(
33562
0
          wuffs_base__error__unsupported_pixel_swizzler_option);
33563
689
  }
33564
689
#endif  // defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ENABLE_ALLOWLIST)
33565
33566
  // ----
33567
33568
689
  wuffs_private_impl__swizzle_ycc__convert_3_func conv3func = NULL;
33569
33570
689
  if (is_rgb_or_cmyk) {
33571
186
    conv3func = &wuffs_private_impl__swizzle_rgb__convert_3_general;
33572
503
  } else {
33573
503
    switch (dst->pixcfg.private_impl.pixfmt.repr) {
33574
0
      case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
33575
233
      case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
33576
503
      case WUFFS_BASE__PIXEL_FORMAT__BGRX:
33577
503
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
33578
503
        if (wuffs_base__cpu_arch__have_x86_avx2()) {
33579
503
          conv3func = &wuffs_private_impl__swizzle_ycc__convert_3_bgrx_x86_avx2;
33580
503
          break;
33581
503
        }
33582
0
#endif
33583
0
        conv3func = &wuffs_private_impl__swizzle_ycc__convert_3_bgrx;
33584
0
        break;
33585
0
      case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
33586
0
      case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
33587
0
      case WUFFS_BASE__PIXEL_FORMAT__RGBX:
33588
0
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
33589
0
        if (wuffs_base__cpu_arch__have_x86_avx2()) {
33590
0
          conv3func = &wuffs_private_impl__swizzle_ycc__convert_3_rgbx_x86_avx2;
33591
0
          break;
33592
0
        }
33593
0
#endif
33594
0
        conv3func = &wuffs_private_impl__swizzle_ycc__convert_3_rgbx;
33595
0
        break;
33596
0
      default:
33597
0
        conv3func = &wuffs_private_impl__swizzle_ycc__convert_3_general;
33598
0
        break;
33599
503
    }
33600
503
  }
33601
33602
689
  void (*func3)(wuffs_base__pixel_buffer * dst,  //
33603
689
                uint32_t x_min_incl,             //
33604
689
                uint32_t x_max_excl,             //
33605
689
                uint32_t y_min_incl,             //
33606
689
                uint32_t y_max_excl,             //
33607
689
                const uint8_t* src_ptr0,         //
33608
689
                const uint8_t* src_ptr1,         //
33609
689
                const uint8_t* src_ptr2,         //
33610
689
                uint32_t stride0,                //
33611
689
                uint32_t stride1,                //
33612
689
                uint32_t stride2,                //
33613
689
                uint32_t inv_h0,                 //
33614
689
                uint32_t inv_h1,                 //
33615
689
                uint32_t inv_h2,                 //
33616
689
                uint32_t inv_v0,                 //
33617
689
                uint32_t inv_v1,                 //
33618
689
                uint32_t inv_v2,                 //
33619
689
                uint32_t half_width_for_2to1,    //
33620
689
                uint32_t half_height_for_2to1,   //
33621
689
                uint8_t* scratch_buffer_2k_ptr,  //
33622
689
                wuffs_private_impl__swizzle_ycc__upsample_func(*upfuncs)[4][4],
33623
689
                wuffs_private_impl__swizzle_ycc__convert_3_func conv3func) =
33624
689
      &wuffs_private_impl__swizzle_ycc__general__box_filter;
33625
33626
689
  void (*func4)(wuffs_base__pixel_buffer * dst,  //
33627
689
                uint32_t x_min_incl,             //
33628
689
                uint32_t x_max_excl,             //
33629
689
                uint32_t y_min_incl,             //
33630
689
                uint32_t y_max_excl,             //
33631
689
                const uint8_t* src_ptr0,         //
33632
689
                const uint8_t* src_ptr1,         //
33633
689
                const uint8_t* src_ptr2,         //
33634
689
                const uint8_t* src_ptr3,         //
33635
689
                uint32_t stride0,                //
33636
689
                uint32_t stride1,                //
33637
689
                uint32_t stride2,                //
33638
689
                uint32_t stride3,                //
33639
689
                uint32_t inv_h0,                 //
33640
689
                uint32_t inv_h1,                 //
33641
689
                uint32_t inv_h2,                 //
33642
689
                uint32_t inv_h3,                 //
33643
689
                uint32_t inv_v0,                 //
33644
689
                uint32_t inv_v1,                 //
33645
689
                uint32_t inv_v2,                 //
33646
689
                uint32_t inv_v3,                 //
33647
689
                uint32_t half_width_for_2to1,    //
33648
689
                uint32_t half_height_for_2to1,   //
33649
689
                uint8_t* scratch_buffer_2k_ptr,  //
33650
689
                wuffs_private_impl__swizzle_ycc__upsample_func(*upfuncs)[4][4],
33651
689
                wuffs_private_impl__swizzle_ycc__convert_4_func conv4func) =
33652
689
      &wuffs_private_impl__swizzle_ycck__general__box_filter;
33653
33654
689
  wuffs_private_impl__swizzle_ycc__upsample_func upfuncs[4][4];
33655
689
  memcpy(&upfuncs, &wuffs_private_impl__swizzle_ycc__upsample_funcs,
33656
689
         sizeof upfuncs);
33657
33658
689
  if (triangle_filter_for_2to1 &&
33659
689
      (wuffs_private_impl__swizzle_has_triangle_upsampler(inv_h0, inv_v0) ||
33660
689
       wuffs_private_impl__swizzle_has_triangle_upsampler(inv_h1, inv_v1) ||
33661
689
       wuffs_private_impl__swizzle_has_triangle_upsampler(inv_h2, inv_v2) ||
33662
689
       wuffs_private_impl__swizzle_has_triangle_upsampler(inv_h3, inv_v3))) {
33663
476
    func3 = &wuffs_private_impl__swizzle_ycc__general__triangle_filter;
33664
476
    func4 = &wuffs_private_impl__swizzle_ycck__general__triangle_filter;
33665
33666
476
    upfuncs[0][1] = wuffs_private_impl__swizzle_ycc__upsample_inv_h1v2_triangle;
33667
476
    upfuncs[1][0] = wuffs_private_impl__swizzle_ycc__upsample_inv_h2v1_triangle;
33668
476
    upfuncs[1][1] = wuffs_private_impl__swizzle_ycc__upsample_inv_h2v2_triangle;
33669
33670
476
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
33671
#if defined(__GNUC__) && !defined(__clang__)
33672
    // Don't use our AVX2 implementation for GCC (but do use it for clang). For
33673
    // some unknown reason, GCC performs noticably better on the non-SIMD
33674
    // version. Possibly because GCC's auto-vectorizer is smarter (just with
33675
    // SSE2, not AVX2) than our hand-written code, but that's just a guess.
33676
    //
33677
    // See commits 51bc60ef9298cb2efc1b29a9681191f66d49820d and
33678
    // cd769a0cdf1b5affee13f6089b995f3d39569cb4 for benchmark numbers.
33679
    //
33680
    // See also https://godbolt.org/z/MbhbPGEz4 for Debian Bullseye's clang 11
33681
    // versus gcc 10, where only gcc auto-vectorizes, although later clang
33682
    // versions will also auto-vectorize.
33683
#else
33684
476
    if (wuffs_base__cpu_arch__have_x86_avx2()) {
33685
476
      upfuncs[1][1] =
33686
476
          wuffs_private_impl__swizzle_ycc__upsample_inv_h2v2_triangle_x86_avx2;
33687
476
    }
33688
476
#endif
33689
476
#endif
33690
476
  }
33691
33692
689
  if ((h3 != 0u) || (v3 != 0u)) {
33693
217
    wuffs_private_impl__swizzle_ycc__convert_4_func conv4func =
33694
217
        is_rgb_or_cmyk ? &wuffs_private_impl__swizzle_cmyk__convert_4_general
33695
217
                       : &wuffs_private_impl__swizzle_ycck__convert_4_general;
33696
217
    (*func4)(                                                 //
33697
217
        dst, x_min_incl, x_max_excl, y_min_incl, y_max_excl,  //
33698
217
        src0.ptr, src1.ptr, src2.ptr, src3.ptr,               //
33699
217
        stride0, stride1, stride2, stride3,                   //
33700
217
        inv_h0, inv_h1, inv_h2, inv_h3,                       //
33701
217
        inv_v0, inv_v1, inv_v2, inv_v3,                       //
33702
217
        half_width_for_2to1, half_height_for_2to1,            //
33703
217
        scratch_buffer_2k.ptr, &upfuncs, conv4func);
33704
33705
472
  } else {
33706
472
    (*func3)(                                                 //
33707
472
        dst, x_min_incl, x_max_excl, y_min_incl, y_max_excl,  //
33708
472
        src0.ptr, src1.ptr, src2.ptr,                         //
33709
472
        stride0, stride1, stride2,                            //
33710
472
        inv_h0, inv_h1, inv_h2,                               //
33711
472
        inv_v0, inv_v1, inv_v2,                               //
33712
472
        half_width_for_2to1, half_height_for_2to1,            //
33713
472
        scratch_buffer_2k.ptr, &upfuncs, conv3func);
33714
472
  }
33715
33716
689
  return wuffs_base__make_status(NULL);
33717
689
}
33718
33719
// --------
33720
33721
// โ€ผ WUFFS MULTI-FILE SECTION +x86_avx2
33722
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
33723
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2")
33724
static void  //
33725
wuffs_private_impl__swizzle_ycc__convert_3_bgrx_x86_avx2(
33726
    wuffs_base__pixel_buffer* dst,
33727
    uint32_t x,
33728
    uint32_t x_end,
33729
    uint32_t y,
33730
    const uint8_t* up0,
33731
    const uint8_t* up1,
33732
7.97M
    const uint8_t* up2) {
33733
7.97M
  if ((x + 32u) > x_end) {
33734
3.47M
    wuffs_private_impl__swizzle_ycc__convert_3_bgrx(  //
33735
3.47M
        dst, x, x_end, y, up0, up1, up2);
33736
3.47M
    return;
33737
3.47M
  }
33738
33739
4.49M
  size_t dst_stride = dst->private_impl.planes[0].stride;
33740
4.49M
  uint8_t* dst_iter = dst->private_impl.planes[0].ptr +
33741
4.49M
                      (dst_stride * ((size_t)y)) + (4u * ((size_t)x));
33742
33743
  // u0001 = u16x16 [0x0001 .. 0x0001]
33744
  // u00FF = u16x16 [0x00FF .. 0x00FF]
33745
  // uFF80 = u16x16 [0xFF80 .. 0xFF80]
33746
  // uFFFF = u16x16 [0xFFFF .. 0xFFFF]
33747
4.49M
  const __m256i u0001 = _mm256_set1_epi16(+0x0001);
33748
4.49M
  const __m256i u00FF = _mm256_set1_epi16(+0x00FF);
33749
4.49M
  const __m256i uFF80 = _mm256_set1_epi16(-0x0080);
33750
4.49M
  const __m256i uFFFF = _mm256_set1_epi16(-0x0001);
33751
33752
  // p8000_p0000 = u16x16 [0x8000 0x0000 .. 0x8000 0x0000]
33753
4.49M
  const __m256i p8000_p0000 = _mm256_set_epi16(  //
33754
4.49M
      +0x0000, -0x8000, +0x0000, -0x8000,        //
33755
4.49M
      +0x0000, -0x8000, +0x0000, -0x8000,        //
33756
4.49M
      +0x0000, -0x8000, +0x0000, -0x8000,        //
33757
4.49M
      +0x0000, -0x8000, +0x0000, -0x8000);
33758
33759
  // Per wuffs_base__color_ycc__as__color_u32, the formulae:
33760
  //
33761
  //  R = Y                + 1.40200 * Cr
33762
  //  G = Y - 0.34414 * Cb - 0.71414 * Cr
33763
  //  B = Y + 1.77200 * Cb
33764
  //
33765
  // When scaled by 1<<16:
33766
  //
33767
  //  0.34414 becomes 0x0581A =  22554.
33768
  //  0.71414 becomes 0x0B6D2 =  46802.
33769
  //  1.40200 becomes 0x166E9 =  91881.
33770
  //  1.77200 becomes 0x1C5A2 = 116130.
33771
  //
33772
  // Separate the integer and fractional parts, since we work with signed
33773
  // 16-bit SIMD lanes. The fractional parts range from -0.5 .. +0.5 (as
33774
  // floating-point) which is from -0x8000 .. +0x8000 (as fixed-point).
33775
  //
33776
  //  -0x3A5E = -0x20000 + 0x1C5A2     The B:Cb factor.
33777
  //  +0x66E9 = -0x10000 + 0x166E9     The R:Cr factor.
33778
  //  -0x581A = +0x00000 - 0x0581A     The G:Cb factor.
33779
  //  +0x492E = +0x10000 - 0x0B6D2     The G:Cr factor.
33780
4.49M
  const __m256i m3A5E = _mm256_set1_epi16(-0x3A5E);
33781
4.49M
  const __m256i p66E9 = _mm256_set1_epi16(+0x66E9);
33782
4.49M
  const __m256i m581A_p492E = _mm256_set_epi16(  //
33783
4.49M
      +0x492E, -0x581A, +0x492E, -0x581A,        //
33784
4.49M
      +0x492E, -0x581A, +0x492E, -0x581A,        //
33785
4.49M
      +0x492E, -0x581A, +0x492E, -0x581A,        //
33786
4.49M
      +0x492E, -0x581A, +0x492E, -0x581A);
33787
33788
52.2M
  while (x < x_end) {
33789
    // Load chroma values in even and odd columns (the high 8 bits of each
33790
    // u16x16 element are zero) and then subtract 0x0080.
33791
    //
33792
    // cb_all = u8x32  [cb.00 cb.01 cb.02 cb.03 .. cb.1C cb.1D cb.1E cb.1F]
33793
    // cb_eve = i16x16 [cb.00-0x80  cb.02-0x80  .. cb.1C-0x80  cb.1E-0x80 ]
33794
    // cb_odd = i16x16 [cb.01-0x80  cb.03-0x80  .. cb.1D-0x80  cb.1F-0x80 ]
33795
    //
33796
    // Ditto for the cr_xxx Chroma-Red values.
33797
47.7M
    __m256i cb_all = _mm256_lddqu_si256((const __m256i*)(const void*)up1);
33798
47.7M
    __m256i cr_all = _mm256_lddqu_si256((const __m256i*)(const void*)up2);
33799
47.7M
    __m256i cb_eve = _mm256_add_epi16(uFF80, _mm256_and_si256(cb_all, u00FF));
33800
47.7M
    __m256i cr_eve = _mm256_add_epi16(uFF80, _mm256_and_si256(cr_all, u00FF));
33801
47.7M
    __m256i cb_odd = _mm256_add_epi16(uFF80, _mm256_srli_epi16(cb_all, 8));
33802
47.7M
    __m256i cr_odd = _mm256_add_epi16(uFF80, _mm256_srli_epi16(cr_all, 8));
33803
33804
    // ----
33805
33806
    // Calculate:
33807
    //
33808
    //  B-Y = (+1.77200 * Cb)                 as floating-point
33809
    //  R-Y = (+1.40200 * Cr)                 as floating-point
33810
    //
33811
    //  B-Y = ((0x2_0000 - 0x3A5E) * Cb)      as fixed-point
33812
    //  R-Y = ((0x1_0000 + 0x66E9) * Cr)      as fixed-point
33813
    //
33814
    //  B-Y = ((-0x3A5E * Cb) + ("2.0" * Cb))
33815
    //  R-Y = ((+0x66E9 * Cr) + ("1.0" * Cr))
33816
33817
    // Multiply by m3A5E or p66E9, taking the high 16 bits. There's also a
33818
    // doubling (add x to itself), adding-of-1 and halving (shift right by 1).
33819
    // That makes multiply-and-take-high round to nearest (instead of down).
33820
47.7M
    __m256i tmp_by_eve = _mm256_srai_epi16(
33821
47.7M
        _mm256_add_epi16(
33822
47.7M
            _mm256_mulhi_epi16(_mm256_add_epi16(cb_eve, cb_eve), m3A5E), u0001),
33823
47.7M
        1);
33824
47.7M
    __m256i tmp_by_odd = _mm256_srai_epi16(
33825
47.7M
        _mm256_add_epi16(
33826
47.7M
            _mm256_mulhi_epi16(_mm256_add_epi16(cb_odd, cb_odd), m3A5E), u0001),
33827
47.7M
        1);
33828
47.7M
    __m256i tmp_ry_eve = _mm256_srai_epi16(
33829
47.7M
        _mm256_add_epi16(
33830
47.7M
            _mm256_mulhi_epi16(_mm256_add_epi16(cr_eve, cr_eve), p66E9), u0001),
33831
47.7M
        1);
33832
47.7M
    __m256i tmp_ry_odd = _mm256_srai_epi16(
33833
47.7M
        _mm256_add_epi16(
33834
47.7M
            _mm256_mulhi_epi16(_mm256_add_epi16(cr_odd, cr_odd), p66E9), u0001),
33835
47.7M
        1);
33836
33837
    // Add (2 * Cb) and (1 * Cr).
33838
47.7M
    __m256i by_eve =
33839
47.7M
        _mm256_add_epi16(tmp_by_eve, _mm256_add_epi16(cb_eve, cb_eve));
33840
47.7M
    __m256i by_odd =
33841
47.7M
        _mm256_add_epi16(tmp_by_odd, _mm256_add_epi16(cb_odd, cb_odd));
33842
47.7M
    __m256i ry_eve = _mm256_add_epi16(tmp_ry_eve, cr_eve);
33843
47.7M
    __m256i ry_odd = _mm256_add_epi16(tmp_ry_odd, cr_odd);
33844
33845
    // ----
33846
33847
    // Calculate:
33848
    //
33849
    //  G-Y = (-0.34414 * Cb) +
33850
    //        (-0.71414 * Cr)                 as floating-point
33851
    //
33852
    //  G-Y = ((+0x0_0000 - 0x581A) * Cb) +
33853
    //        ((-0x1_0000 + 0x492E) * Cr)     as fixed-point
33854
    //
33855
    //  G-Y =  (-0x581A * Cb) +
33856
    //         (+0x492E * Cr) - ("1.0" * Cr)
33857
33858
    // Multiply-add to get ((-0x581A * Cb) + (+0x492E * Cr)).
33859
47.7M
    __m256i tmp0_gy_eve_lo = _mm256_madd_epi16(  //
33860
47.7M
        _mm256_unpacklo_epi16(cb_eve, cr_eve), m581A_p492E);
33861
47.7M
    __m256i tmp0_gy_eve_hi = _mm256_madd_epi16(  //
33862
47.7M
        _mm256_unpackhi_epi16(cb_eve, cr_eve), m581A_p492E);
33863
47.7M
    __m256i tmp0_gy_odd_lo = _mm256_madd_epi16(  //
33864
47.7M
        _mm256_unpacklo_epi16(cb_odd, cr_odd), m581A_p492E);
33865
47.7M
    __m256i tmp0_gy_odd_hi = _mm256_madd_epi16(  //
33866
47.7M
        _mm256_unpackhi_epi16(cb_odd, cr_odd), m581A_p492E);
33867
33868
    // Divide the i32x8 vectors by (1 << 16), rounding to nearest.
33869
47.7M
    __m256i tmp1_gy_eve_lo =
33870
47.7M
        _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_eve_lo, p8000_p0000), 16);
33871
47.7M
    __m256i tmp1_gy_eve_hi =
33872
47.7M
        _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_eve_hi, p8000_p0000), 16);
33873
47.7M
    __m256i tmp1_gy_odd_lo =
33874
47.7M
        _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_odd_lo, p8000_p0000), 16);
33875
47.7M
    __m256i tmp1_gy_odd_hi =
33876
47.7M
        _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_odd_hi, p8000_p0000), 16);
33877
33878
    // Pack the ((-0x581A * Cb) + (+0x492E * Cr)) as i16x16 and subtract Cr.
33879
47.7M
    __m256i gy_eve = _mm256_sub_epi16(
33880
47.7M
        _mm256_packs_epi32(tmp1_gy_eve_lo, tmp1_gy_eve_hi), cr_eve);
33881
47.7M
    __m256i gy_odd = _mm256_sub_epi16(
33882
47.7M
        _mm256_packs_epi32(tmp1_gy_odd_lo, tmp1_gy_odd_hi), cr_odd);
33883
33884
    // ----
33885
33886
    // Add Y to (B-Y), (G-Y) and (R-Y) to produce B, G and R.
33887
    //
33888
    // For the resultant packed_x_xxx vectors, only elements 0 ..= 7 and 16 ..=
33889
    // 23 of the 32-element vectors matter (since we'll unpacklo but not
33890
    // unpackhi them). Let โ€ฆ denote 8 ignored consecutive u8 values and let %
33891
    // denote 0xFF. We'll end this section with:
33892
    //
33893
    // packed_b_eve = u8x32 [b00 b02 .. b0C b0E  โ€ฆ  b10 b12 .. b1C b1E  โ€ฆ]
33894
    // packed_b_odd = u8x32 [b01 b03 .. b0D b0F  โ€ฆ  b11 b13 .. b1D b1F  โ€ฆ]
33895
    // packed_g_eve = u8x32 [g00 g02 .. g0C g0E  โ€ฆ  g10 g12 .. g1C g1E  โ€ฆ]
33896
    // packed_g_odd = u8x32 [g01 g03 .. g0D g0F  โ€ฆ  g11 g13 .. g1D g1F  โ€ฆ]
33897
    // packed_r_eve = u8x32 [r00 r02 .. r0C r0E  โ€ฆ  r10 r12 .. r1C r1E  โ€ฆ]
33898
    // packed_r_odd = u8x32 [r01 r03 .. r0D r0F  โ€ฆ  r11 r13 .. r1D r1F  โ€ฆ]
33899
    // uFFFF        = u8x32 [  %   % ..   %   %  โ€ฆ    %   % ..   %   %  โ€ฆ]
33900
33901
47.7M
    __m256i yy_all = _mm256_lddqu_si256((const __m256i*)(const void*)up0);
33902
47.7M
    __m256i yy_eve = _mm256_and_si256(yy_all, u00FF);
33903
47.7M
    __m256i yy_odd = _mm256_srli_epi16(yy_all, 8);
33904
33905
47.7M
    __m256i loose_b_eve = _mm256_add_epi16(by_eve, yy_eve);
33906
47.7M
    __m256i loose_b_odd = _mm256_add_epi16(by_odd, yy_odd);
33907
47.7M
    __m256i packed_b_eve = _mm256_packus_epi16(loose_b_eve, loose_b_eve);
33908
47.7M
    __m256i packed_b_odd = _mm256_packus_epi16(loose_b_odd, loose_b_odd);
33909
33910
47.7M
    __m256i loose_g_eve = _mm256_add_epi16(gy_eve, yy_eve);
33911
47.7M
    __m256i loose_g_odd = _mm256_add_epi16(gy_odd, yy_odd);
33912
47.7M
    __m256i packed_g_eve = _mm256_packus_epi16(loose_g_eve, loose_g_eve);
33913
47.7M
    __m256i packed_g_odd = _mm256_packus_epi16(loose_g_odd, loose_g_odd);
33914
33915
47.7M
    __m256i loose_r_eve = _mm256_add_epi16(ry_eve, yy_eve);
33916
47.7M
    __m256i loose_r_odd = _mm256_add_epi16(ry_odd, yy_odd);
33917
47.7M
    __m256i packed_r_eve = _mm256_packus_epi16(loose_r_eve, loose_r_eve);
33918
47.7M
    __m256i packed_r_odd = _mm256_packus_epi16(loose_r_odd, loose_r_odd);
33919
33920
    // ----
33921
33922
    // Mix those values (unpacking in 8, 16 and then 32 bit units) to get the
33923
    // desired BGRX/RGBX order.
33924
    //
33925
    // From here onwards, all of our __m256i registers are u8x32.
33926
33927
    // mix00 = [b00 g00 b02 g02 .. b0E g0E b10 g10 .. b1C g1C b1E g1E]
33928
    // mix01 = [b01 g01 b03 g03 .. b0F g0F b11 g11 .. b1D g1D b1F g1F]
33929
    // mix02 = [r00   % r02   % .. r0E   % r10   % .. r1C   % r1E   %]
33930
    // mix03 = [r01   % r03   % .. r0F   % r11   % .. r1D   % r1F   %]
33931
    //
33932
    // See also ยง below.
33933
47.7M
    __m256i mix00 = _mm256_unpacklo_epi8(packed_b_eve, packed_g_eve);
33934
47.7M
    __m256i mix01 = _mm256_unpacklo_epi8(packed_b_odd, packed_g_odd);
33935
47.7M
    __m256i mix02 = _mm256_unpacklo_epi8(packed_r_eve, uFFFF);
33936
47.7M
    __m256i mix03 = _mm256_unpacklo_epi8(packed_r_odd, uFFFF);
33937
33938
    // mix10 = [b00 g00 r00 %  b02 g02 r02 %  b04 g04 r04 %  b06 g06 r06 %
33939
    //          b10 g10 r10 %  b12 g12 r12 %  b14 g14 r14 %  b16 g16 r16 %]
33940
    // mix11 = [b01 g01 r01 %  b03 g03 r03 %  b05 g05 r05 %  b07 g07 r07 %
33941
    //          b11 g11 r11 %  b13 g13 r13 %  b15 g15 r15 %  b17 g17 r17 %]
33942
    // mix12 = [b08 g08 r08 %  b0A g0A r0A %  b0C g0C r0C %  b0E g0E r0E %
33943
    //          b18 g18 r18 %  b1A g1A r1A %  b1C g1C r1C %  b1E g1E r1E %]
33944
    // mix13 = [b09 g09 r09 %  b0B g0B r0B %  b0D g0D r0D %  b0F g0F r0F %
33945
    //          b19 g19 r19 %  b1B g1B r1B %  b1D g1D r1D %  b1F g1F r1F %]
33946
47.7M
    __m256i mix10 = _mm256_unpacklo_epi16(mix00, mix02);
33947
47.7M
    __m256i mix11 = _mm256_unpacklo_epi16(mix01, mix03);
33948
47.7M
    __m256i mix12 = _mm256_unpackhi_epi16(mix00, mix02);
33949
47.7M
    __m256i mix13 = _mm256_unpackhi_epi16(mix01, mix03);
33950
33951
    // mix20 = [b00 g00 r00 %  b01 g01 r01 %  b02 g02 r02 %  b03 g03 r03 %
33952
    //          b10 g10 r10 %  b11 g11 r11 %  b12 g12 r12 %  b13 g13 r13 %]
33953
    // mix21 = [b04 g04 r04 %  b05 g05 r05 %  b06 g06 r06 %  b07 g07 r07 %
33954
    //          b14 g14 r14 %  b15 g15 r15 %  b16 g16 r16 %  b17 g17 r17 %]
33955
    // mix22 = [b08 g08 r08 %  b09 g09 r09 %  b0A g0A r0A %  b0B g0B r0B %
33956
    //          b18 g18 r18 %  b19 g19 r19 %  b1A g1A r1A %  b1B g1B r1B %]
33957
    // mix23 = [b0C g0C r0C %  b0D g0D r0D %  b0E g0E r0E %  b0F g0F r0F %
33958
    //          b1C g1C r1C %  b1D g1D r1D %  b1E g1E r1E %  b1F g1F r1F %]
33959
47.7M
    __m256i mix20 = _mm256_unpacklo_epi32(mix10, mix11);
33960
47.7M
    __m256i mix21 = _mm256_unpackhi_epi32(mix10, mix11);
33961
47.7M
    __m256i mix22 = _mm256_unpacklo_epi32(mix12, mix13);
33962
47.7M
    __m256i mix23 = _mm256_unpackhi_epi32(mix12, mix13);
33963
33964
    // mix30 = [b00 g00 r00 %  b01 g01 r01 %  b02 g02 r02 %  b03 g03 r03 %
33965
    //          b04 g04 r04 %  b05 g05 r05 %  b06 g06 r06 %  b07 g07 r07 %]
33966
    // mix31 = [b08 g08 r08 %  b09 g09 r09 %  b0A g0A r0A %  b0B g0B r0B %
33967
    //          b0C g0C r0C %  b0D g0D r0D %  b0E g0E r0E %  b0F g0F r0F %]
33968
    // mix32 = [b10 g10 r10 %  b11 g11 r11 %  b12 g12 r12 %  b13 g13 r13 %
33969
    //          b14 g14 r14 %  b15 g15 r15 %  b16 g16 r16 %  b17 g17 r17 %]
33970
    // mix33 = [b18 g18 r18 %  b19 g19 r19 %  b1A g1A r1A %  b1B g1B r1B %
33971
    //          b1C g1C r1C %  b1D g1D r1D %  b1E g1E r1E %  b1F g1F r1F %]
33972
47.7M
    __m256i mix30 = _mm256_permute2x128_si256(mix20, mix21, 0x20);
33973
47.7M
    __m256i mix31 = _mm256_permute2x128_si256(mix22, mix23, 0x20);
33974
47.7M
    __m256i mix32 = _mm256_permute2x128_si256(mix20, mix21, 0x31);
33975
47.7M
    __m256i mix33 = _mm256_permute2x128_si256(mix22, mix23, 0x31);
33976
33977
    // Write out four u8x32 SIMD registers (128 bytes, 32 BGRX/RGBX pixels).
33978
47.7M
    _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x00), mix30);
33979
47.7M
    _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x20), mix31);
33980
47.7M
    _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x40), mix32);
33981
47.7M
    _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x60), mix33);
33982
33983
    // Advance by up to 32 pixels. The first iteration might be smaller than 32
33984
    // so that all of the remaining steps are exactly 32.
33985
47.7M
    uint32_t n = 32u - (31u & (x - x_end));
33986
47.7M
    dst_iter += 4u * n;
33987
47.7M
    up0 += n;
33988
47.7M
    up1 += n;
33989
47.7M
    up2 += n;
33990
47.7M
    x += n;
33991
47.7M
  }
33992
4.49M
}
33993
33994
// The rgbx flavor (below) is exactly the same as the bgrx flavor (above)
33995
// except for the lines marked with a ยง and that comments were stripped.
33996
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2")
33997
static void  //
33998
wuffs_private_impl__swizzle_ycc__convert_3_rgbx_x86_avx2(
33999
    wuffs_base__pixel_buffer* dst,
34000
    uint32_t x,
34001
    uint32_t x_end,
34002
    uint32_t y,
34003
    const uint8_t* up0,
34004
    const uint8_t* up1,
34005
0
    const uint8_t* up2) {
34006
0
  if ((x + 32u) > x_end) {
34007
0
    wuffs_private_impl__swizzle_ycc__convert_3_bgrx(  //
34008
0
        dst, x, x_end, y, up0, up1, up2);
34009
0
    return;
34010
0
  }
34011
34012
0
  size_t dst_stride = dst->private_impl.planes[0].stride;
34013
0
  uint8_t* dst_iter = dst->private_impl.planes[0].ptr +
34014
0
                      (dst_stride * ((size_t)y)) + (4u * ((size_t)x));
34015
34016
0
  const __m256i u0001 = _mm256_set1_epi16(+0x0001);
34017
0
  const __m256i u00FF = _mm256_set1_epi16(+0x00FF);
34018
0
  const __m256i uFF80 = _mm256_set1_epi16(-0x0080);
34019
0
  const __m256i uFFFF = _mm256_set1_epi16(-0x0001);
34020
34021
0
  const __m256i p8000_p0000 = _mm256_set_epi16(  //
34022
0
      +0x0000, -0x8000, +0x0000, -0x8000,        //
34023
0
      +0x0000, -0x8000, +0x0000, -0x8000,        //
34024
0
      +0x0000, -0x8000, +0x0000, -0x8000,        //
34025
0
      +0x0000, -0x8000, +0x0000, -0x8000);
34026
34027
0
  const __m256i m3A5E = _mm256_set1_epi16(-0x3A5E);
34028
0
  const __m256i p66E9 = _mm256_set1_epi16(+0x66E9);
34029
0
  const __m256i m581A_p492E = _mm256_set_epi16(  //
34030
0
      +0x492E, -0x581A, +0x492E, -0x581A,        //
34031
0
      +0x492E, -0x581A, +0x492E, -0x581A,        //
34032
0
      +0x492E, -0x581A, +0x492E, -0x581A,        //
34033
0
      +0x492E, -0x581A, +0x492E, -0x581A);
34034
34035
0
  while (x < x_end) {
34036
0
    __m256i cb_all = _mm256_lddqu_si256((const __m256i*)(const void*)up1);
34037
0
    __m256i cr_all = _mm256_lddqu_si256((const __m256i*)(const void*)up2);
34038
0
    __m256i cb_eve = _mm256_add_epi16(uFF80, _mm256_and_si256(cb_all, u00FF));
34039
0
    __m256i cr_eve = _mm256_add_epi16(uFF80, _mm256_and_si256(cr_all, u00FF));
34040
0
    __m256i cb_odd = _mm256_add_epi16(uFF80, _mm256_srli_epi16(cb_all, 8));
34041
0
    __m256i cr_odd = _mm256_add_epi16(uFF80, _mm256_srli_epi16(cr_all, 8));
34042
34043
0
    __m256i tmp_by_eve = _mm256_srai_epi16(
34044
0
        _mm256_add_epi16(
34045
0
            _mm256_mulhi_epi16(_mm256_add_epi16(cb_eve, cb_eve), m3A5E), u0001),
34046
0
        1);
34047
0
    __m256i tmp_by_odd = _mm256_srai_epi16(
34048
0
        _mm256_add_epi16(
34049
0
            _mm256_mulhi_epi16(_mm256_add_epi16(cb_odd, cb_odd), m3A5E), u0001),
34050
0
        1);
34051
0
    __m256i tmp_ry_eve = _mm256_srai_epi16(
34052
0
        _mm256_add_epi16(
34053
0
            _mm256_mulhi_epi16(_mm256_add_epi16(cr_eve, cr_eve), p66E9), u0001),
34054
0
        1);
34055
0
    __m256i tmp_ry_odd = _mm256_srai_epi16(
34056
0
        _mm256_add_epi16(
34057
0
            _mm256_mulhi_epi16(_mm256_add_epi16(cr_odd, cr_odd), p66E9), u0001),
34058
0
        1);
34059
34060
0
    __m256i by_eve =
34061
0
        _mm256_add_epi16(tmp_by_eve, _mm256_add_epi16(cb_eve, cb_eve));
34062
0
    __m256i by_odd =
34063
0
        _mm256_add_epi16(tmp_by_odd, _mm256_add_epi16(cb_odd, cb_odd));
34064
0
    __m256i ry_eve = _mm256_add_epi16(tmp_ry_eve, cr_eve);
34065
0
    __m256i ry_odd = _mm256_add_epi16(tmp_ry_odd, cr_odd);
34066
34067
0
    __m256i tmp0_gy_eve_lo = _mm256_madd_epi16(  //
34068
0
        _mm256_unpacklo_epi16(cb_eve, cr_eve), m581A_p492E);
34069
0
    __m256i tmp0_gy_eve_hi = _mm256_madd_epi16(  //
34070
0
        _mm256_unpackhi_epi16(cb_eve, cr_eve), m581A_p492E);
34071
0
    __m256i tmp0_gy_odd_lo = _mm256_madd_epi16(  //
34072
0
        _mm256_unpacklo_epi16(cb_odd, cr_odd), m581A_p492E);
34073
0
    __m256i tmp0_gy_odd_hi = _mm256_madd_epi16(  //
34074
0
        _mm256_unpackhi_epi16(cb_odd, cr_odd), m581A_p492E);
34075
34076
0
    __m256i tmp1_gy_eve_lo =
34077
0
        _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_eve_lo, p8000_p0000), 16);
34078
0
    __m256i tmp1_gy_eve_hi =
34079
0
        _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_eve_hi, p8000_p0000), 16);
34080
0
    __m256i tmp1_gy_odd_lo =
34081
0
        _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_odd_lo, p8000_p0000), 16);
34082
0
    __m256i tmp1_gy_odd_hi =
34083
0
        _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_odd_hi, p8000_p0000), 16);
34084
34085
0
    __m256i gy_eve = _mm256_sub_epi16(
34086
0
        _mm256_packs_epi32(tmp1_gy_eve_lo, tmp1_gy_eve_hi), cr_eve);
34087
0
    __m256i gy_odd = _mm256_sub_epi16(
34088
0
        _mm256_packs_epi32(tmp1_gy_odd_lo, tmp1_gy_odd_hi), cr_odd);
34089
34090
0
    __m256i yy_all = _mm256_lddqu_si256((const __m256i*)(const void*)up0);
34091
0
    __m256i yy_eve = _mm256_and_si256(yy_all, u00FF);
34092
0
    __m256i yy_odd = _mm256_srli_epi16(yy_all, 8);
34093
34094
0
    __m256i loose_b_eve = _mm256_add_epi16(by_eve, yy_eve);
34095
0
    __m256i loose_b_odd = _mm256_add_epi16(by_odd, yy_odd);
34096
0
    __m256i packed_b_eve = _mm256_packus_epi16(loose_b_eve, loose_b_eve);
34097
0
    __m256i packed_b_odd = _mm256_packus_epi16(loose_b_odd, loose_b_odd);
34098
34099
0
    __m256i loose_g_eve = _mm256_add_epi16(gy_eve, yy_eve);
34100
0
    __m256i loose_g_odd = _mm256_add_epi16(gy_odd, yy_odd);
34101
0
    __m256i packed_g_eve = _mm256_packus_epi16(loose_g_eve, loose_g_eve);
34102
0
    __m256i packed_g_odd = _mm256_packus_epi16(loose_g_odd, loose_g_odd);
34103
34104
0
    __m256i loose_r_eve = _mm256_add_epi16(ry_eve, yy_eve);
34105
0
    __m256i loose_r_odd = _mm256_add_epi16(ry_odd, yy_odd);
34106
0
    __m256i packed_r_eve = _mm256_packus_epi16(loose_r_eve, loose_r_eve);
34107
0
    __m256i packed_r_odd = _mm256_packus_epi16(loose_r_odd, loose_r_odd);
34108
34109
    // ยง Note the swapped B and R channels.
34110
0
    __m256i mix00 = _mm256_unpacklo_epi8(packed_r_eve, packed_g_eve);
34111
0
    __m256i mix01 = _mm256_unpacklo_epi8(packed_r_odd, packed_g_odd);
34112
0
    __m256i mix02 = _mm256_unpacklo_epi8(packed_b_eve, uFFFF);
34113
0
    __m256i mix03 = _mm256_unpacklo_epi8(packed_b_odd, uFFFF);
34114
34115
0
    __m256i mix10 = _mm256_unpacklo_epi16(mix00, mix02);
34116
0
    __m256i mix11 = _mm256_unpacklo_epi16(mix01, mix03);
34117
0
    __m256i mix12 = _mm256_unpackhi_epi16(mix00, mix02);
34118
0
    __m256i mix13 = _mm256_unpackhi_epi16(mix01, mix03);
34119
34120
0
    __m256i mix20 = _mm256_unpacklo_epi32(mix10, mix11);
34121
0
    __m256i mix21 = _mm256_unpackhi_epi32(mix10, mix11);
34122
0
    __m256i mix22 = _mm256_unpacklo_epi32(mix12, mix13);
34123
0
    __m256i mix23 = _mm256_unpackhi_epi32(mix12, mix13);
34124
34125
0
    __m256i mix30 = _mm256_permute2x128_si256(mix20, mix21, 0x20);
34126
0
    __m256i mix31 = _mm256_permute2x128_si256(mix22, mix23, 0x20);
34127
0
    __m256i mix32 = _mm256_permute2x128_si256(mix20, mix21, 0x31);
34128
0
    __m256i mix33 = _mm256_permute2x128_si256(mix22, mix23, 0x31);
34129
34130
0
    _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x00), mix30);
34131
0
    _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x20), mix31);
34132
0
    _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x40), mix32);
34133
0
    _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x60), mix33);
34134
34135
0
    uint32_t n = 32u - (31u & (x - x_end));
34136
0
    dst_iter += 4u * n;
34137
0
    up0 += n;
34138
0
    up1 += n;
34139
0
    up2 += n;
34140
0
    x += n;
34141
0
  }
34142
0
}
34143
34144
#if defined(__GNUC__) && !defined(__clang__)
34145
// No-op.
34146
#else
34147
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2")
34148
static const uint8_t*  //
34149
wuffs_private_impl__swizzle_ycc__upsample_inv_h2v2_triangle_x86_avx2(
34150
    uint8_t* dst_ptr,
34151
    const uint8_t* src_ptr_major,
34152
    const uint8_t* src_ptr_minor,
34153
    size_t src_len,
34154
    uint32_t h1v2_bias_ignored,
34155
    bool first_column,
34156
2.24M
    bool last_column) {
34157
2.24M
  uint8_t* dp = dst_ptr;
34158
2.24M
  const uint8_t* sp_major = src_ptr_major;
34159
2.24M
  const uint8_t* sp_minor = src_ptr_minor;
34160
34161
2.24M
  if (first_column) {
34162
1.81M
    src_len--;
34163
1.81M
    if ((src_len <= 0u) && last_column) {
34164
132k
      uint32_t sv = (12u * ((uint32_t)(*sp_major++))) +  //
34165
132k
                    (4u * ((uint32_t)(*sp_minor++)));
34166
132k
      *dp++ = (uint8_t)((sv + 8u) >> 4u);
34167
132k
      *dp++ = (uint8_t)((sv + 7u) >> 4u);
34168
132k
      return dst_ptr;
34169
132k
    }
34170
34171
1.68M
    uint32_t sv_major_m1 = sp_major[-0];  // Clamp offset to zero.
34172
1.68M
    uint32_t sv_minor_m1 = sp_minor[-0];  // Clamp offset to zero.
34173
1.68M
    uint32_t sv_major_p1 = sp_major[+1];
34174
1.68M
    uint32_t sv_minor_p1 = sp_minor[+1];
34175
34176
1.68M
    uint32_t sv = (9u * ((uint32_t)(*sp_major++))) +  //
34177
1.68M
                  (3u * ((uint32_t)(*sp_minor++)));
34178
1.68M
    *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u);
34179
1.68M
    *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u);
34180
1.68M
    if (src_len <= 0u) {
34181
0
      return dst_ptr;
34182
0
    }
34183
1.68M
  }
34184
34185
2.11M
  if (last_column) {
34186
1.68M
    src_len--;
34187
1.68M
  }
34188
34189
2.11M
  if (src_len < 32) {
34190
    // This fallback is the same as the non-SIMD-capable code path.
34191
10.2M
    for (; src_len > 0u; src_len--) {
34192
9.64M
      uint32_t sv_major_m1 = sp_major[-1];
34193
9.64M
      uint32_t sv_minor_m1 = sp_minor[-1];
34194
9.64M
      uint32_t sv_major_p1 = sp_major[+1];
34195
9.64M
      uint32_t sv_minor_p1 = sp_minor[+1];
34196
34197
9.64M
      uint32_t sv = (9u * ((uint32_t)(*sp_major++))) +  //
34198
9.64M
                    (3u * ((uint32_t)(*sp_minor++)));
34199
9.64M
      *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u);
34200
9.64M
      *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u);
34201
9.64M
    }
34202
34203
1.47M
  } else {
34204
10.0M
    while (src_len > 0u) {
34205
      // Load 1+32+1 samples (six u8x32 vectors) from the major (jxx) and minor
34206
      // (nxx) rows.
34207
      //
34208
      // major_p0 = [j00 j01 j02 j03 .. j28 j29 j30 j31]   // p0 = "plus  0"
34209
      // minor_p0 = [n00 n01 n02 n03 .. n28 n29 n30 n31]   // p0 = "plus  0"
34210
      // major_m1 = [jm1 j00 j01 j02 .. j27 j28 j29 j30]   // m1 = "minus 1"
34211
      // minor_m1 = [nm1 n00 n01 n02 .. n27 n28 n29 n30]   // m1 = "minus 1"
34212
      // major_p1 = [j01 j02 j03 j04 .. j29 j30 j31 j32]   // p1 = "plus  1"
34213
      // minor_p1 = [n01 n02 n03 n04 .. n29 n30 n31 n32]   // p1 = "plus  1"
34214
8.57M
      __m256i major_p0 =
34215
8.57M
          _mm256_lddqu_si256((const __m256i*)(const void*)(sp_major + 0));
34216
8.57M
      __m256i minor_p0 =
34217
8.57M
          _mm256_lddqu_si256((const __m256i*)(const void*)(sp_minor + 0));
34218
8.57M
      __m256i major_m1 =
34219
8.57M
          _mm256_lddqu_si256((const __m256i*)(const void*)(sp_major - 1));
34220
8.57M
      __m256i minor_m1 =
34221
8.57M
          _mm256_lddqu_si256((const __m256i*)(const void*)(sp_minor - 1));
34222
8.57M
      __m256i major_p1 =
34223
8.57M
          _mm256_lddqu_si256((const __m256i*)(const void*)(sp_major + 1));
34224
8.57M
      __m256i minor_p1 =
34225
8.57M
          _mm256_lddqu_si256((const __m256i*)(const void*)(sp_minor + 1));
34226
34227
      // Unpack, staying with u8x32 vectors.
34228
      //
34229
      // step1_p0_lo = [j00 n00 j01 n01 .. j07 n07  j16 n16 j17 n17 .. j23 n23]
34230
      // step1_p0_hi = [j08 n08 j09 n09 .. j15 n15  j24 n24 j25 n25 .. j31 n31]
34231
      // step1_m1_lo = [jm1 nm1 j00 n00 .. j06 n06  j15 n15 j16 n16 .. j22 n22]
34232
      // step1_m1_hi = [j07 n07 j08 n08 .. j14 n14  j23 n23 j24 n24 .. j30 n30]
34233
      // step1_p1_lo = [j01 n01 j02 n02 .. j08 n08  j17 n17 j18 n18 .. j24 n24]
34234
      // step1_p1_hi = [j09 n09 j10 n10 .. j16 n16  j25 n25 j26 n26 .. j32 n32]
34235
8.57M
      __m256i step1_p0_lo = _mm256_unpacklo_epi8(major_p0, minor_p0);
34236
8.57M
      __m256i step1_p0_hi = _mm256_unpackhi_epi8(major_p0, minor_p0);
34237
8.57M
      __m256i step1_m1_lo = _mm256_unpacklo_epi8(major_m1, minor_m1);
34238
8.57M
      __m256i step1_m1_hi = _mm256_unpackhi_epi8(major_m1, minor_m1);
34239
8.57M
      __m256i step1_p1_lo = _mm256_unpacklo_epi8(major_p1, minor_p1);
34240
8.57M
      __m256i step1_p1_hi = _mm256_unpackhi_epi8(major_p1, minor_p1);
34241
34242
      // Multiply-add to get u16x16 vectors.
34243
      //
34244
      // step2_p0_lo = [9*j00+3*n00 9*j01+3*n01 .. 9*j23+3*n23]
34245
      // step2_p0_hi = [9*j08+3*n08 9*j09+3*n09 .. 9*j31+3*n31]
34246
      // step2_m1_lo = [3*jm1+1*nm1 3*j00+1*n00 .. 3*j22+1*n22]
34247
      // step2_m1_hi = [3*j07+1*n07 3*j08+1*n08 .. 3*j30+1*n30]
34248
      // step2_p1_lo = [3*j01+1*n01 3*j02+1*n02 .. 3*j24+1*n24]
34249
      // step2_p1_hi = [3*j09+1*n09 3*j10+1*n10 .. 3*j32+1*n32]
34250
8.57M
      const __m256i k0309 = _mm256_set1_epi16(0x0309);
34251
8.57M
      const __m256i k0103 = _mm256_set1_epi16(0x0103);
34252
8.57M
      __m256i step2_p0_lo = _mm256_maddubs_epi16(step1_p0_lo, k0309);
34253
8.57M
      __m256i step2_p0_hi = _mm256_maddubs_epi16(step1_p0_hi, k0309);
34254
8.57M
      __m256i step2_m1_lo = _mm256_maddubs_epi16(step1_m1_lo, k0103);
34255
8.57M
      __m256i step2_m1_hi = _mm256_maddubs_epi16(step1_m1_hi, k0103);
34256
8.57M
      __m256i step2_p1_lo = _mm256_maddubs_epi16(step1_p1_lo, k0103);
34257
8.57M
      __m256i step2_p1_hi = _mm256_maddubs_epi16(step1_p1_hi, k0103);
34258
34259
      // Compute the weighted sums of (p0, m1) and (p0, p1). For example:
34260
      //
34261
      // step3_m1_lo[00] = ((9*j00) + (3*n00) + (3*jm1) + (1*nm1)) as u16
34262
      // step3_p1_hi[15] = ((9*j31) + (3*n31) + (3*j32) + (1*n32)) as u16
34263
8.57M
      __m256i step3_m1_lo = _mm256_add_epi16(step2_p0_lo, step2_m1_lo);
34264
8.57M
      __m256i step3_m1_hi = _mm256_add_epi16(step2_p0_hi, step2_m1_hi);
34265
8.57M
      __m256i step3_p1_lo = _mm256_add_epi16(step2_p0_lo, step2_p1_lo);
34266
8.57M
      __m256i step3_p1_hi = _mm256_add_epi16(step2_p0_hi, step2_p1_hi);
34267
34268
      // Bias by 8 (on the left) or 7 (on the right) and then divide by 16
34269
      // (which is 9+3+3+1) to get a weighted average. On the left (m1), shift
34270
      // the u16 right value by 4. On the right (p1), shift right by 4 and then
34271
      // shift left by 8 so that, when still in the u16x16 little-endian
34272
      // interpretation, we have:
34273
      //  - m1_element =  (etcetera + 8) >> 4
34274
      //  - p1_element = ((etcetera + 7) >> 4) << 8
34275
      //
34276
      // step4_m1_lo = [0x00?? 0x00?? ... 0x00?? 0x00??]
34277
      // step4_p1_lo = [0x??00 0x??00 ... 0x??00 0x??00]
34278
      // step4_m1_hi = [0x00?? 0x00?? ... 0x00?? 0x00??]
34279
      // step4_p1_hi = [0x??00 0x??00 ... 0x??00 0x??00]
34280
8.57M
      __m256i step4_m1_lo = _mm256_srli_epi16(
34281
8.57M
          _mm256_add_epi16(step3_m1_lo, _mm256_set1_epi16(8)), 4);
34282
8.57M
      __m256i step4_p1_lo = _mm256_slli_epi16(
34283
8.57M
          _mm256_srli_epi16(_mm256_add_epi16(step3_p1_lo, _mm256_set1_epi16(7)),
34284
8.57M
                            4),
34285
8.57M
          8);
34286
8.57M
      __m256i step4_m1_hi = _mm256_srli_epi16(
34287
8.57M
          _mm256_add_epi16(step3_m1_hi, _mm256_set1_epi16(8)), 4);
34288
8.57M
      __m256i step4_p1_hi = _mm256_slli_epi16(
34289
8.57M
          _mm256_srli_epi16(_mm256_add_epi16(step3_p1_hi, _mm256_set1_epi16(7)),
34290
8.57M
                            4),
34291
8.57M
          8);
34292
34293
      // Bitwise-or two "0x00"-rich u16x16 vectors to get a u8x32 vector. Do
34294
      // that twice. Once for the low columns and once for the high columns.
34295
      //
34296
      // In terms of jxx (major row) or nxx (minor row) source samples:
34297
      //  - low  columns means ( 0 ..  8; 16 .. 24).
34298
      //  - high columns means ( 8 .. 16; 24 .. 32).
34299
      //
34300
      // In terms of dxx destination samples (there are twice as many):
34301
      //  - low  columns means ( 0 .. 16; 32 .. 48).
34302
      //  - high columns means (16 .. 32; 48 .. 64).
34303
      //
34304
      // step5_lo = [d00 d01 .. d14 d15  d32 d33 .. d46 d47]
34305
      // step5_hi = [d16 d17 .. d30 d31  d48 d49 .. d62 d63]
34306
      //
34307
      // The d00, d02 ... d62 even elements come from (p0, m1) weighted sums.
34308
      // The d01, d03 ... d63 odd  elements come from (p0, p1) weighted sums.
34309
8.57M
      __m256i step5_lo = _mm256_or_si256(step4_m1_lo, step4_p1_lo);
34310
8.57M
      __m256i step5_hi = _mm256_or_si256(step4_m1_hi, step4_p1_hi);
34311
34312
      // Permute and store.
34313
      //
34314
      // step6_00_31 = [d00 d01 .. d14 d15  d16 d17 .. d30 d31]
34315
      // step6_32_63 = [d32 d33 .. d46 d47  d48 d49 .. d62 d63]
34316
8.57M
      __m256i step6_00_31 = _mm256_permute2x128_si256(step5_lo, step5_hi, 0x20);
34317
8.57M
      __m256i step6_32_63 = _mm256_permute2x128_si256(step5_lo, step5_hi, 0x31);
34318
8.57M
      _mm256_storeu_si256((__m256i*)(void*)(dp + 0x00), step6_00_31);
34319
8.57M
      _mm256_storeu_si256((__m256i*)(void*)(dp + 0x20), step6_32_63);
34320
34321
      // Advance by up to 32 source samples (64 destination samples). The first
34322
      // iteration might be smaller than 32 so that all of the remaining steps
34323
      // are exactly 32.
34324
8.57M
      size_t n = 32u - (31u & (0u - src_len));
34325
8.57M
      dp += 2u * n;
34326
8.57M
      sp_major += n;
34327
8.57M
      sp_minor += n;
34328
8.57M
      src_len -= n;
34329
8.57M
    }
34330
1.47M
  }
34331
34332
2.11M
  if (last_column) {
34333
1.68M
    uint32_t sv_major_m1 = sp_major[-1];
34334
1.68M
    uint32_t sv_minor_m1 = sp_minor[-1];
34335
1.68M
    uint32_t sv_major_p1 = sp_major[+0];  // Clamp offset to zero.
34336
1.68M
    uint32_t sv_minor_p1 = sp_minor[+0];  // Clamp offset to zero.
34337
34338
1.68M
    uint32_t sv = (9u * ((uint32_t)(*sp_major++))) +  //
34339
1.68M
                  (3u * ((uint32_t)(*sp_minor++)));
34340
1.68M
    *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u);
34341
1.68M
    *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u);
34342
1.68M
  }
34343
34344
2.11M
  return dst_ptr;
34345
2.24M
}
34346
#endif
34347
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
34348
// โ€ผ WUFFS MULTI-FILE SECTION -x86_avx2
34349
34350
#endif  // !defined(WUFFS_CONFIG__MODULES) ||
34351
        // defined(WUFFS_CONFIG__MODULE__BASE) ||
34352
        // defined(WUFFS_CONFIG__MODULE__BASE__PIXCONV)
34353
34354
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \
34355
    defined(WUFFS_CONFIG__MODULE__BASE__UTF8)
34356
34357
// ---------------- Unicode and UTF-8
34358
34359
WUFFS_BASE__MAYBE_STATIC size_t  //
34360
0
wuffs_base__utf_8__encode(wuffs_base__slice_u8 dst, uint32_t code_point) {
34361
0
  if (code_point <= 0x7F) {
34362
0
    if (dst.len >= 1) {
34363
0
      dst.ptr[0] = (uint8_t)(code_point);
34364
0
      return 1;
34365
0
    }
34366
34367
0
  } else if (code_point <= 0x07FF) {
34368
0
    if (dst.len >= 2) {
34369
0
      dst.ptr[0] = (uint8_t)(0xC0 | ((code_point >> 6)));
34370
0
      dst.ptr[1] = (uint8_t)(0x80 | ((code_point >> 0) & 0x3F));
34371
0
      return 2;
34372
0
    }
34373
34374
0
  } else if (code_point <= 0xFFFF) {
34375
0
    if ((dst.len >= 3) && ((code_point < 0xD800) || (0xDFFF < code_point))) {
34376
0
      dst.ptr[0] = (uint8_t)(0xE0 | ((code_point >> 12)));
34377
0
      dst.ptr[1] = (uint8_t)(0x80 | ((code_point >> 6) & 0x3F));
34378
0
      dst.ptr[2] = (uint8_t)(0x80 | ((code_point >> 0) & 0x3F));
34379
0
      return 3;
34380
0
    }
34381
34382
0
  } else if (code_point <= 0x10FFFF) {
34383
0
    if (dst.len >= 4) {
34384
0
      dst.ptr[0] = (uint8_t)(0xF0 | ((code_point >> 18)));
34385
0
      dst.ptr[1] = (uint8_t)(0x80 | ((code_point >> 12) & 0x3F));
34386
0
      dst.ptr[2] = (uint8_t)(0x80 | ((code_point >> 6) & 0x3F));
34387
0
      dst.ptr[3] = (uint8_t)(0x80 | ((code_point >> 0) & 0x3F));
34388
0
      return 4;
34389
0
    }
34390
0
  }
34391
34392
0
  return 0;
34393
0
}
34394
34395
// wuffs_base__utf_8__byte_length_minus_1 is the byte length (minus 1) of a
34396
// UTF-8 encoded code point, based on the encoding's initial byte.
34397
//  - 0x00 is 1-byte UTF-8 (ASCII).
34398
//  - 0x01 is the start of 2-byte UTF-8.
34399
//  - 0x02 is the start of 3-byte UTF-8.
34400
//  - 0x03 is the start of 4-byte UTF-8.
34401
//  - 0x40 is a UTF-8 tail byte.
34402
//  - 0x80 is invalid UTF-8.
34403
//
34404
// RFC 3629 (UTF-8) gives this grammar for valid UTF-8:
34405
//    UTF8-1      = %x00-7F
34406
//    UTF8-2      = %xC2-DF UTF8-tail
34407
//    UTF8-3      = %xE0 %xA0-BF UTF8-tail / %xE1-EC 2( UTF8-tail ) /
34408
//                  %xED %x80-9F UTF8-tail / %xEE-EF 2( UTF8-tail )
34409
//    UTF8-4      = %xF0 %x90-BF 2( UTF8-tail ) / %xF1-F3 3( UTF8-tail ) /
34410
//                  %xF4 %x80-8F 2( UTF8-tail )
34411
//    UTF8-tail   = %x80-BF
34412
static const uint8_t wuffs_base__utf_8__byte_length_minus_1[256] = {
34413
    // 0     1     2     3     4     5     6     7
34414
    // 8     9     A     B     C     D     E     F
34415
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x00 ..= 0x07.
34416
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x08 ..= 0x0F.
34417
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x10 ..= 0x17.
34418
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x18 ..= 0x1F.
34419
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x20 ..= 0x27.
34420
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x28 ..= 0x2F.
34421
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x30 ..= 0x37.
34422
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x38 ..= 0x3F.
34423
34424
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x40 ..= 0x47.
34425
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x48 ..= 0x4F.
34426
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x50 ..= 0x57.
34427
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x58 ..= 0x5F.
34428
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x60 ..= 0x67.
34429
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x68 ..= 0x6F.
34430
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x70 ..= 0x77.
34431
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x78 ..= 0x7F.
34432
34433
    0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,  // 0x80 ..= 0x87.
34434
    0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,  // 0x88 ..= 0x8F.
34435
    0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,  // 0x90 ..= 0x97.
34436
    0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,  // 0x98 ..= 0x9F.
34437
    0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,  // 0xA0 ..= 0xA7.
34438
    0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,  // 0xA8 ..= 0xAF.
34439
    0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,  // 0xB0 ..= 0xB7.
34440
    0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,  // 0xB8 ..= 0xBF.
34441
34442
    0x80, 0x80, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,  // 0xC0 ..= 0xC7.
34443
    0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,  // 0xC8 ..= 0xCF.
34444
    0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,  // 0xD0 ..= 0xD7.
34445
    0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,  // 0xD8 ..= 0xDF.
34446
    0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,  // 0xE0 ..= 0xE7.
34447
    0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,  // 0xE8 ..= 0xEF.
34448
    0x03, 0x03, 0x03, 0x03, 0x03, 0x80, 0x80, 0x80,  // 0xF0 ..= 0xF7.
34449
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xF8 ..= 0xFF.
34450
    // 0     1     2     3     4     5     6     7
34451
    // 8     9     A     B     C     D     E     F
34452
};
34453
34454
WUFFS_BASE__MAYBE_STATIC wuffs_base__utf_8__next__output  //
34455
0
wuffs_base__utf_8__next(const uint8_t* s_ptr, size_t s_len) {
34456
0
  if (s_len == 0) {
34457
0
    return wuffs_base__make_utf_8__next__output(0, 0);
34458
0
  }
34459
0
  uint32_t c = s_ptr[0];
34460
0
  switch (wuffs_base__utf_8__byte_length_minus_1[c & 0xFF]) {
34461
0
    case 0:
34462
0
      return wuffs_base__make_utf_8__next__output(c, 1);
34463
34464
0
    case 1:
34465
0
      if (s_len < 2) {
34466
0
        break;
34467
0
      }
34468
0
      c = wuffs_base__peek_u16le__no_bounds_check(s_ptr);
34469
0
      if ((c & 0xC000) != 0x8000) {
34470
0
        break;
34471
0
      }
34472
0
      c = (0x0007C0 & (c << 6)) | (0x00003F & (c >> 8));
34473
0
      return wuffs_base__make_utf_8__next__output(c, 2);
34474
34475
0
    case 2:
34476
0
      if (s_len < 3) {
34477
0
        break;
34478
0
      }
34479
0
      c = wuffs_base__peek_u24le__no_bounds_check(s_ptr);
34480
0
      if ((c & 0xC0C000) != 0x808000) {
34481
0
        break;
34482
0
      }
34483
0
      c = (0x00F000 & (c << 12)) | (0x000FC0 & (c >> 2)) |
34484
0
          (0x00003F & (c >> 16));
34485
0
      if ((c <= 0x07FF) || ((0xD800 <= c) && (c <= 0xDFFF))) {
34486
0
        break;
34487
0
      }
34488
0
      return wuffs_base__make_utf_8__next__output(c, 3);
34489
34490
0
    case 3:
34491
0
      if (s_len < 4) {
34492
0
        break;
34493
0
      }
34494
0
      c = wuffs_base__peek_u32le__no_bounds_check(s_ptr);
34495
0
      if ((c & 0xC0C0C000) != 0x80808000) {
34496
0
        break;
34497
0
      }
34498
0
      c = (0x1C0000 & (c << 18)) | (0x03F000 & (c << 4)) |
34499
0
          (0x000FC0 & (c >> 10)) | (0x00003F & (c >> 24));
34500
0
      if ((c <= 0xFFFF) || (0x110000 <= c)) {
34501
0
        break;
34502
0
      }
34503
0
      return wuffs_base__make_utf_8__next__output(c, 4);
34504
0
  }
34505
34506
0
  return wuffs_base__make_utf_8__next__output(
34507
0
      WUFFS_BASE__UNICODE_REPLACEMENT_CHARACTER, 1);
34508
0
}
34509
34510
WUFFS_BASE__MAYBE_STATIC wuffs_base__utf_8__next__output  //
34511
0
wuffs_base__utf_8__next_from_end(const uint8_t* s_ptr, size_t s_len) {
34512
0
  if (s_len == 0) {
34513
0
    return wuffs_base__make_utf_8__next__output(0, 0);
34514
0
  }
34515
0
  const uint8_t* ptr = &s_ptr[s_len - 1];
34516
0
  if (*ptr < 0x80) {
34517
0
    return wuffs_base__make_utf_8__next__output(*ptr, 1);
34518
34519
0
  } else if (*ptr < 0xC0) {
34520
0
    const uint8_t* too_far = &s_ptr[(s_len > 4) ? (s_len - 4) : 0];
34521
0
    uint32_t n = 1;
34522
0
    while (ptr != too_far) {
34523
0
      ptr--;
34524
0
      n++;
34525
0
      if (*ptr < 0x80) {
34526
0
        break;
34527
0
      } else if (*ptr < 0xC0) {
34528
0
        continue;
34529
0
      }
34530
0
      wuffs_base__utf_8__next__output o = wuffs_base__utf_8__next(ptr, n);
34531
0
      if (o.byte_length != n) {
34532
0
        break;
34533
0
      }
34534
0
      return o;
34535
0
    }
34536
0
  }
34537
34538
0
  return wuffs_base__make_utf_8__next__output(
34539
0
      WUFFS_BASE__UNICODE_REPLACEMENT_CHARACTER, 1);
34540
0
}
34541
34542
WUFFS_BASE__MAYBE_STATIC size_t  //
34543
0
wuffs_base__utf_8__longest_valid_prefix(const uint8_t* s_ptr, size_t s_len) {
34544
  // TODO: possibly optimize the all-ASCII case (4 or 8 bytes at a time).
34545
  //
34546
  // TODO: possibly optimize this by manually inlining the
34547
  // wuffs_base__utf_8__next calls.
34548
0
  size_t original_len = s_len;
34549
0
  while (s_len > 0) {
34550
0
    wuffs_base__utf_8__next__output o = wuffs_base__utf_8__next(s_ptr, s_len);
34551
0
    if ((o.code_point > 0x7F) && (o.byte_length == 1)) {
34552
0
      break;
34553
0
    }
34554
0
    s_ptr += o.byte_length;
34555
0
    s_len -= o.byte_length;
34556
0
  }
34557
0
  return original_len - s_len;
34558
0
}
34559
34560
WUFFS_BASE__MAYBE_STATIC size_t  //
34561
0
wuffs_base__ascii__longest_valid_prefix(const uint8_t* s_ptr, size_t s_len) {
34562
  // TODO: possibly optimize this by checking 4 or 8 bytes at a time.
34563
0
  const uint8_t* original_ptr = s_ptr;
34564
0
  const uint8_t* p = s_ptr;
34565
0
  const uint8_t* q = s_ptr + s_len;
34566
0
  for (; (p != q) && ((*p & 0x80) == 0); p++) {
34567
0
  }
34568
0
  return (size_t)(p - original_ptr);
34569
0
}
34570
34571
#endif  // !defined(WUFFS_CONFIG__MODULES) ||
34572
        // defined(WUFFS_CONFIG__MODULE__BASE) ||
34573
        // defined(WUFFS_CONFIG__MODULE__BASE__UTF8)
34574
34575
#ifdef __cplusplus
34576
}  // extern "C"
34577
#endif
34578
34579
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ADLER32)
34580
34581
// ---------------- Status Codes Implementations
34582
34583
// ---------------- Private Consts
34584
34585
// ---------------- Private Initializer Prototypes
34586
34587
// ---------------- Private Function Prototypes
34588
34589
WUFFS_BASE__GENERATED_C_CODE
34590
static wuffs_base__empty_struct
34591
wuffs_adler32__hasher__up(
34592
    wuffs_adler32__hasher* self,
34593
    wuffs_base__slice_u8 a_x);
34594
34595
WUFFS_BASE__GENERATED_C_CODE
34596
static wuffs_base__empty_struct
34597
wuffs_adler32__hasher__up__choosy_default(
34598
    wuffs_adler32__hasher* self,
34599
    wuffs_base__slice_u8 a_x);
34600
34601
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
34602
WUFFS_BASE__GENERATED_C_CODE
34603
static wuffs_base__empty_struct
34604
wuffs_adler32__hasher__up_arm_neon(
34605
    wuffs_adler32__hasher* self,
34606
    wuffs_base__slice_u8 a_x);
34607
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
34608
34609
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
34610
WUFFS_BASE__GENERATED_C_CODE
34611
static wuffs_base__empty_struct
34612
wuffs_adler32__hasher__up_x86_sse42(
34613
    wuffs_adler32__hasher* self,
34614
    wuffs_base__slice_u8 a_x);
34615
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
34616
34617
// ---------------- VTables
34618
34619
const wuffs_base__hasher_u32__func_ptrs
34620
wuffs_adler32__hasher__func_ptrs_for__wuffs_base__hasher_u32 = {
34621
  (uint32_t(*)(const void*))(&wuffs_adler32__hasher__checksum_u32),
34622
  (uint64_t(*)(const void*,
34623
      uint32_t))(&wuffs_adler32__hasher__get_quirk),
34624
  (wuffs_base__status(*)(void*,
34625
      uint32_t,
34626
      uint64_t))(&wuffs_adler32__hasher__set_quirk),
34627
  (wuffs_base__empty_struct(*)(void*,
34628
      wuffs_base__slice_u8))(&wuffs_adler32__hasher__update),
34629
  (uint32_t(*)(void*,
34630
      wuffs_base__slice_u8))(&wuffs_adler32__hasher__update_u32),
34631
};
34632
34633
// ---------------- Initializer Implementations
34634
34635
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
34636
wuffs_adler32__hasher__initialize(
34637
    wuffs_adler32__hasher* self,
34638
    size_t sizeof_star_self,
34639
    uint64_t wuffs_version,
34640
    uint32_t options){
34641
  if (!self) {
34642
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
34643
  }
34644
  if (sizeof(*self) != sizeof_star_self) {
34645
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
34646
  }
34647
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
34648
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
34649
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
34650
  }
34651
34652
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
34653
    // The whole point of this if-check is to detect an uninitialized *self.
34654
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
34655
#if !defined(__clang__) && defined(__GNUC__)
34656
#pragma GCC diagnostic push
34657
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
34658
#endif
34659
    if (self->private_impl.magic != 0) {
34660
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
34661
    }
34662
#if !defined(__clang__) && defined(__GNUC__)
34663
#pragma GCC diagnostic pop
34664
#endif
34665
  } else {
34666
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
34667
      memset(self, 0, sizeof(*self));
34668
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
34669
    } else {
34670
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
34671
    }
34672
  }
34673
34674
  self->private_impl.choosy_up = &wuffs_adler32__hasher__up__choosy_default;
34675
34676
  self->private_impl.magic = WUFFS_BASE__MAGIC;
34677
  self->private_impl.vtable_for__wuffs_base__hasher_u32.vtable_name =
34678
      wuffs_base__hasher_u32__vtable_name;
34679
  self->private_impl.vtable_for__wuffs_base__hasher_u32.function_pointers =
34680
      (const void*)(&wuffs_adler32__hasher__func_ptrs_for__wuffs_base__hasher_u32);
34681
  return wuffs_base__make_status(NULL);
34682
}
34683
34684
wuffs_adler32__hasher*
34685
wuffs_adler32__hasher__alloc(void) {
34686
  wuffs_adler32__hasher* x =
34687
      (wuffs_adler32__hasher*)(calloc(1, sizeof(wuffs_adler32__hasher)));
34688
  if (!x) {
34689
    return NULL;
34690
  }
34691
  if (wuffs_adler32__hasher__initialize(
34692
      x, sizeof(wuffs_adler32__hasher), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
34693
    free(x);
34694
    return NULL;
34695
  }
34696
  return x;
34697
}
34698
34699
size_t
34700
sizeof__wuffs_adler32__hasher(void) {
34701
  return sizeof(wuffs_adler32__hasher);
34702
}
34703
34704
// ---------------- Function Implementations
34705
34706
// -------- func adler32.hasher.get_quirk
34707
34708
WUFFS_BASE__GENERATED_C_CODE
34709
WUFFS_BASE__MAYBE_STATIC uint64_t
34710
wuffs_adler32__hasher__get_quirk(
34711
    const wuffs_adler32__hasher* self,
34712
    uint32_t a_key) {
34713
  if (!self) {
34714
    return 0;
34715
  }
34716
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
34717
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
34718
    return 0;
34719
  }
34720
34721
  return 0u;
34722
}
34723
34724
// -------- func adler32.hasher.set_quirk
34725
34726
WUFFS_BASE__GENERATED_C_CODE
34727
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
34728
wuffs_adler32__hasher__set_quirk(
34729
    wuffs_adler32__hasher* self,
34730
    uint32_t a_key,
34731
    uint64_t a_value) {
34732
  if (!self) {
34733
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
34734
  }
34735
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
34736
    return wuffs_base__make_status(
34737
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
34738
        ? wuffs_base__error__disabled_by_previous_error
34739
        : wuffs_base__error__initialize_not_called);
34740
  }
34741
34742
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
34743
}
34744
34745
// -------- func adler32.hasher.update
34746
34747
WUFFS_BASE__GENERATED_C_CODE
34748
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
34749
wuffs_adler32__hasher__update(
34750
    wuffs_adler32__hasher* self,
34751
    wuffs_base__slice_u8 a_x) {
34752
  if (!self) {
34753
    return wuffs_base__make_empty_struct();
34754
  }
34755
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
34756
    return wuffs_base__make_empty_struct();
34757
  }
34758
34759
  if ( ! self->private_impl.f_started) {
34760
    self->private_impl.f_started = true;
34761
    self->private_impl.f_state = 1u;
34762
    self->private_impl.choosy_up = (
34763
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
34764
        wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_adler32__hasher__up_arm_neon :
34765
#endif
34766
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
34767
        wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_adler32__hasher__up_x86_sse42 :
34768
#endif
34769
        self->private_impl.choosy_up);
34770
  }
34771
  wuffs_adler32__hasher__up(self, a_x);
34772
  return wuffs_base__make_empty_struct();
34773
}
34774
34775
// -------- func adler32.hasher.update_u32
34776
34777
WUFFS_BASE__GENERATED_C_CODE
34778
WUFFS_BASE__MAYBE_STATIC uint32_t
34779
wuffs_adler32__hasher__update_u32(
34780
    wuffs_adler32__hasher* self,
34781
    wuffs_base__slice_u8 a_x) {
34782
  if (!self) {
34783
    return 0;
34784
  }
34785
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
34786
    return 0;
34787
  }
34788
34789
  wuffs_adler32__hasher__update(self, a_x);
34790
  return self->private_impl.f_state;
34791
}
34792
34793
// -------- func adler32.hasher.up
34794
34795
WUFFS_BASE__GENERATED_C_CODE
34796
static wuffs_base__empty_struct
34797
wuffs_adler32__hasher__up(
34798
    wuffs_adler32__hasher* self,
34799
    wuffs_base__slice_u8 a_x) {
34800
  return (*self->private_impl.choosy_up)(self, a_x);
34801
}
34802
34803
WUFFS_BASE__GENERATED_C_CODE
34804
static wuffs_base__empty_struct
34805
wuffs_adler32__hasher__up__choosy_default(
34806
    wuffs_adler32__hasher* self,
34807
    wuffs_base__slice_u8 a_x) {
34808
  uint32_t v_s1 = 0;
34809
  uint32_t v_s2 = 0;
34810
  wuffs_base__slice_u8 v_remaining = {0};
34811
  wuffs_base__slice_u8 v_p = {0};
34812
34813
  v_s1 = ((self->private_impl.f_state) & 0xFFFFu);
34814
  v_s2 = ((self->private_impl.f_state) >> (32u - 16u));
34815
  while (((uint64_t)(a_x.len)) > 0u) {
34816
    v_remaining = wuffs_base__slice_u8__subslice_j(a_x, 0u);
34817
    if (((uint64_t)(a_x.len)) > 5552u) {
34818
      v_remaining = wuffs_base__slice_u8__subslice_i(a_x, 5552u);
34819
      a_x = wuffs_base__slice_u8__subslice_j(a_x, 5552u);
34820
    }
34821
    {
34822
      wuffs_base__slice_u8 i_slice_p = a_x;
34823
      v_p.ptr = i_slice_p.ptr;
34824
      v_p.len = 1;
34825
      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));
34826
      while (v_p.ptr < i_end0_p) {
34827
        v_s1 += ((uint32_t)(v_p.ptr[0u]));
34828
        v_s2 += v_s1;
34829
        v_p.ptr += 1;
34830
        v_s1 += ((uint32_t)(v_p.ptr[0u]));
34831
        v_s2 += v_s1;
34832
        v_p.ptr += 1;
34833
        v_s1 += ((uint32_t)(v_p.ptr[0u]));
34834
        v_s2 += v_s1;
34835
        v_p.ptr += 1;
34836
        v_s1 += ((uint32_t)(v_p.ptr[0u]));
34837
        v_s2 += v_s1;
34838
        v_p.ptr += 1;
34839
        v_s1 += ((uint32_t)(v_p.ptr[0u]));
34840
        v_s2 += v_s1;
34841
        v_p.ptr += 1;
34842
        v_s1 += ((uint32_t)(v_p.ptr[0u]));
34843
        v_s2 += v_s1;
34844
        v_p.ptr += 1;
34845
        v_s1 += ((uint32_t)(v_p.ptr[0u]));
34846
        v_s2 += v_s1;
34847
        v_p.ptr += 1;
34848
        v_s1 += ((uint32_t)(v_p.ptr[0u]));
34849
        v_s2 += v_s1;
34850
        v_p.ptr += 1;
34851
      }
34852
      v_p.len = 1;
34853
      const uint8_t* i_end1_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len);
34854
      while (v_p.ptr < i_end1_p) {
34855
        v_s1 += ((uint32_t)(v_p.ptr[0u]));
34856
        v_s2 += v_s1;
34857
        v_p.ptr += 1;
34858
      }
34859
      v_p.len = 0;
34860
    }
34861
    v_s1 %= 65521u;
34862
    v_s2 %= 65521u;
34863
    a_x = v_remaining;
34864
  }
34865
  self->private_impl.f_state = (((v_s2 & 65535u) << 16u) | (v_s1 & 65535u));
34866
  return wuffs_base__make_empty_struct();
34867
}
34868
34869
// -------- func adler32.hasher.checksum_u32
34870
34871
WUFFS_BASE__GENERATED_C_CODE
34872
WUFFS_BASE__MAYBE_STATIC uint32_t
34873
wuffs_adler32__hasher__checksum_u32(
34874
    const wuffs_adler32__hasher* self) {
34875
  if (!self) {
34876
    return 0;
34877
  }
34878
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
34879
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
34880
    return 0;
34881
  }
34882
34883
  return self->private_impl.f_state;
34884
}
34885
34886
// โ€ผ WUFFS MULTI-FILE SECTION +arm_neon
34887
// -------- func adler32.hasher.up_arm_neon
34888
34889
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
34890
WUFFS_BASE__GENERATED_C_CODE
34891
static wuffs_base__empty_struct
34892
wuffs_adler32__hasher__up_arm_neon(
34893
    wuffs_adler32__hasher* self,
34894
    wuffs_base__slice_u8 a_x) {
34895
  uint32_t v_s1 = 0;
34896
  uint32_t v_s2 = 0;
34897
  wuffs_base__slice_u8 v_remaining = {0};
34898
  wuffs_base__slice_u8 v_p = {0};
34899
  uint8x16_t v_p__left = {0};
34900
  uint8x16_t v_p_right = {0};
34901
  uint32x4_t v_v1 = {0};
34902
  uint32x4_t v_v2 = {0};
34903
  uint16x8_t v_col0 = {0};
34904
  uint16x8_t v_col1 = {0};
34905
  uint16x8_t v_col2 = {0};
34906
  uint16x8_t v_col3 = {0};
34907
  uint32x2_t v_sum1 = {0};
34908
  uint32x2_t v_sum2 = {0};
34909
  uint32x2_t v_sum12 = {0};
34910
  uint32_t v_num_iterate_bytes = 0;
34911
  uint64_t v_tail_index = 0;
34912
34913
  v_s1 = ((self->private_impl.f_state) & 0xFFFFu);
34914
  v_s2 = ((self->private_impl.f_state) >> (32u - 16u));
34915
  while ((((uint64_t)(a_x.len)) > 0u) && ((15u & ((uint32_t)(0xFFFu & (uintptr_t)(a_x.ptr)))) != 0u)) {
34916
    v_s1 += ((uint32_t)(a_x.ptr[0u]));
34917
    v_s2 += v_s1;
34918
    a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u);
34919
  }
34920
  v_s1 %= 65521u;
34921
  v_s2 %= 65521u;
34922
  while (((uint64_t)(a_x.len)) > 0u) {
34923
    v_remaining = wuffs_base__slice_u8__subslice_j(a_x, 0u);
34924
    if (((uint64_t)(a_x.len)) > 5536u) {
34925
      v_remaining = wuffs_base__slice_u8__subslice_i(a_x, 5536u);
34926
      a_x = wuffs_base__slice_u8__subslice_j(a_x, 5536u);
34927
    }
34928
    v_num_iterate_bytes = ((uint32_t)((((uint64_t)(a_x.len)) & 4294967264u)));
34929
    v_s2 += ((uint32_t)(v_s1 * v_num_iterate_bytes));
34930
    v_v1 = vdupq_n_u32(0u);
34931
    v_v2 = vdupq_n_u32(0u);
34932
    v_col0 = vdupq_n_u16(0u);
34933
    v_col1 = vdupq_n_u16(0u);
34934
    v_col2 = vdupq_n_u16(0u);
34935
    v_col3 = vdupq_n_u16(0u);
34936
    {
34937
      wuffs_base__slice_u8 i_slice_p = a_x;
34938
      v_p.ptr = i_slice_p.ptr;
34939
      v_p.len = 32;
34940
      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));
34941
      while (v_p.ptr < i_end0_p) {
34942
        v_p__left = vld1q_u8(v_p.ptr);
34943
        v_p_right = vld1q_u8(v_p.ptr + 16u);
34944
        v_v2 = vaddq_u32(v_v2, v_v1);
34945
        v_v1 = vpadalq_u16(v_v1, vpadalq_u8(vpaddlq_u8(v_p__left), v_p_right));
34946
        v_col0 = vaddw_u8(v_col0, vget_low_u8(v_p__left));
34947
        v_col1 = vaddw_u8(v_col1, vget_high_u8(v_p__left));
34948
        v_col2 = vaddw_u8(v_col2, vget_low_u8(v_p_right));
34949
        v_col3 = vaddw_u8(v_col3, vget_high_u8(v_p_right));
34950
        v_p.ptr += 32;
34951
      }
34952
      v_p.len = 0;
34953
    }
34954
    v_v2 = vshlq_n_u32(v_v2, 5u);
34955
    v_v2 = vmlal_u16(v_v2, vget_low_u16(v_col0), ((uint16x4_t){32u, 31u, 30u, 29u}));
34956
    v_v2 = vmlal_u16(v_v2, vget_high_u16(v_col0), ((uint16x4_t){28u, 27u, 26u, 25u}));
34957
    v_v2 = vmlal_u16(v_v2, vget_low_u16(v_col1), ((uint16x4_t){24u, 23u, 22u, 21u}));
34958
    v_v2 = vmlal_u16(v_v2, vget_high_u16(v_col1), ((uint16x4_t){20u, 19u, 18u, 17u}));
34959
    v_v2 = vmlal_u16(v_v2, vget_low_u16(v_col2), ((uint16x4_t){16u, 15u, 14u, 13u}));
34960
    v_v2 = vmlal_u16(v_v2, vget_high_u16(v_col2), ((uint16x4_t){12u, 11u, 10u, 9u}));
34961
    v_v2 = vmlal_u16(v_v2, vget_low_u16(v_col3), ((uint16x4_t){8u, 7u, 6u, 5u}));
34962
    v_v2 = vmlal_u16(v_v2, vget_high_u16(v_col3), ((uint16x4_t){4u, 3u, 2u, 1u}));
34963
    v_sum1 = vpadd_u32(vget_low_u32(v_v1), vget_high_u32(v_v1));
34964
    v_sum2 = vpadd_u32(vget_low_u32(v_v2), vget_high_u32(v_v2));
34965
    v_sum12 = vpadd_u32(v_sum1, v_sum2);
34966
    v_s1 += vget_lane_u32(v_sum12, 0u);
34967
    v_s2 += vget_lane_u32(v_sum12, 1u);
34968
    v_tail_index = (((uint64_t)(a_x.len)) & 18446744073709551584u);
34969
    if (v_tail_index < ((uint64_t)(a_x.len))) {
34970
      {
34971
        wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, v_tail_index);
34972
        v_p.ptr = i_slice_p.ptr;
34973
        v_p.len = 1;
34974
        const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len);
34975
        while (v_p.ptr < i_end0_p) {
34976
          v_s1 += ((uint32_t)(v_p.ptr[0u]));
34977
          v_s2 += v_s1;
34978
          v_p.ptr += 1;
34979
        }
34980
        v_p.len = 0;
34981
      }
34982
    }
34983
    v_s1 %= 65521u;
34984
    v_s2 %= 65521u;
34985
    a_x = v_remaining;
34986
  }
34987
  self->private_impl.f_state = (((v_s2 & 65535u) << 16u) | (v_s1 & 65535u));
34988
  return wuffs_base__make_empty_struct();
34989
}
34990
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
34991
// โ€ผ WUFFS MULTI-FILE SECTION -arm_neon
34992
34993
// โ€ผ WUFFS MULTI-FILE SECTION +x86_sse42
34994
// -------- func adler32.hasher.up_x86_sse42
34995
34996
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
34997
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
34998
WUFFS_BASE__GENERATED_C_CODE
34999
static wuffs_base__empty_struct
35000
wuffs_adler32__hasher__up_x86_sse42(
35001
    wuffs_adler32__hasher* self,
35002
    wuffs_base__slice_u8 a_x) {
35003
  uint32_t v_s1 = 0;
35004
  uint32_t v_s2 = 0;
35005
  wuffs_base__slice_u8 v_remaining = {0};
35006
  wuffs_base__slice_u8 v_p = {0};
35007
  __m128i v_zeroes = {0};
35008
  __m128i v_ones = {0};
35009
  __m128i v_weights__left = {0};
35010
  __m128i v_weights_right = {0};
35011
  __m128i v_q__left = {0};
35012
  __m128i v_q_right = {0};
35013
  __m128i v_v1 = {0};
35014
  __m128i v_v2 = {0};
35015
  __m128i v_v2j = {0};
35016
  __m128i v_v2k = {0};
35017
  uint32_t v_num_iterate_bytes = 0;
35018
  uint64_t v_tail_index = 0;
35019
35020
  v_zeroes = _mm_set1_epi16((int16_t)(0u));
35021
  v_ones = _mm_set1_epi16((int16_t)(1u));
35022
  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));
35023
  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));
35024
  v_s1 = ((self->private_impl.f_state) & 0xFFFFu);
35025
  v_s2 = ((self->private_impl.f_state) >> (32u - 16u));
35026
  while (((uint64_t)(a_x.len)) > 0u) {
35027
    v_remaining = wuffs_base__slice_u8__subslice_j(a_x, 0u);
35028
    if (((uint64_t)(a_x.len)) > 5536u) {
35029
      v_remaining = wuffs_base__slice_u8__subslice_i(a_x, 5536u);
35030
      a_x = wuffs_base__slice_u8__subslice_j(a_x, 5536u);
35031
    }
35032
    v_num_iterate_bytes = ((uint32_t)((((uint64_t)(a_x.len)) & 4294967264u)));
35033
    v_s2 += ((uint32_t)(v_s1 * v_num_iterate_bytes));
35034
    v_v1 = _mm_setzero_si128();
35035
    v_v2j = _mm_setzero_si128();
35036
    v_v2k = _mm_setzero_si128();
35037
    {
35038
      wuffs_base__slice_u8 i_slice_p = a_x;
35039
      v_p.ptr = i_slice_p.ptr;
35040
      v_p.len = 32;
35041
      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));
35042
      while (v_p.ptr < i_end0_p) {
35043
        v_q__left = _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr));
35044
        v_q_right = _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 16u));
35045
        v_v2j = _mm_add_epi32(v_v2j, v_v1);
35046
        v_v1 = _mm_add_epi32(v_v1, _mm_sad_epu8(v_q__left, v_zeroes));
35047
        v_v1 = _mm_add_epi32(v_v1, _mm_sad_epu8(v_q_right, v_zeroes));
35048
        v_v2k = _mm_add_epi32(v_v2k, _mm_madd_epi16(v_ones, _mm_maddubs_epi16(v_q__left, v_weights__left)));
35049
        v_v2k = _mm_add_epi32(v_v2k, _mm_madd_epi16(v_ones, _mm_maddubs_epi16(v_q_right, v_weights_right)));
35050
        v_p.ptr += 32;
35051
      }
35052
      v_p.len = 0;
35053
    }
35054
    v_v1 = _mm_add_epi32(v_v1, _mm_shuffle_epi32(v_v1, (int32_t)(177u)));
35055
    v_v1 = _mm_add_epi32(v_v1, _mm_shuffle_epi32(v_v1, (int32_t)(78u)));
35056
    v_s1 += ((uint32_t)(_mm_cvtsi128_si32(v_v1)));
35057
    v_v2 = _mm_add_epi32(v_v2k, _mm_slli_epi32(v_v2j, (int32_t)(5u)));
35058
    v_v2 = _mm_add_epi32(v_v2, _mm_shuffle_epi32(v_v2, (int32_t)(177u)));
35059
    v_v2 = _mm_add_epi32(v_v2, _mm_shuffle_epi32(v_v2, (int32_t)(78u)));
35060
    v_s2 += ((uint32_t)(_mm_cvtsi128_si32(v_v2)));
35061
    v_tail_index = (((uint64_t)(a_x.len)) & 18446744073709551584u);
35062
    if (v_tail_index < ((uint64_t)(a_x.len))) {
35063
      {
35064
        wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, v_tail_index);
35065
        v_p.ptr = i_slice_p.ptr;
35066
        v_p.len = 1;
35067
        const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len);
35068
        while (v_p.ptr < i_end0_p) {
35069
          v_s1 += ((uint32_t)(v_p.ptr[0u]));
35070
          v_s2 += v_s1;
35071
          v_p.ptr += 1;
35072
        }
35073
        v_p.len = 0;
35074
      }
35075
    }
35076
    v_s1 %= 65521u;
35077
    v_s2 %= 65521u;
35078
    a_x = v_remaining;
35079
  }
35080
  self->private_impl.f_state = (((v_s2 & 65535u) << 16u) | (v_s1 & 65535u));
35081
  return wuffs_base__make_empty_struct();
35082
}
35083
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
35084
// โ€ผ WUFFS MULTI-FILE SECTION -x86_sse42
35085
35086
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ADLER32)
35087
35088
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BMP)
35089
35090
// ---------------- Status Codes Implementations
35091
35092
const char wuffs_bmp__error__bad_header[] = "#bmp: bad header";
35093
const char wuffs_bmp__error__bad_rle_compression[] = "#bmp: bad RLE compression";
35094
const char wuffs_bmp__error__truncated_input[] = "#bmp: truncated input";
35095
const char wuffs_bmp__error__unsupported_bmp_file[] = "#bmp: unsupported BMP file";
35096
const char wuffs_bmp__note__internal_note_short_read[] = "@bmp: internal note: short read";
35097
35098
// ---------------- Private Consts
35099
35100
#define WUFFS_BMP__COMPRESSION_NONE 0u
35101
35102
#define WUFFS_BMP__COMPRESSION_RLE8 1u
35103
35104
#define WUFFS_BMP__COMPRESSION_RLE4 2u
35105
35106
#define WUFFS_BMP__COMPRESSION_BITFIELDS 3u
35107
35108
#define WUFFS_BMP__COMPRESSION_JPEG 4u
35109
35110
#define WUFFS_BMP__COMPRESSION_PNG 5u
35111
35112
#define WUFFS_BMP__COMPRESSION_ALPHABITFIELDS 6u
35113
35114
#define WUFFS_BMP__COMPRESSION_LOW_BIT_DEPTH 256u
35115
35116
#define WUFFS_BMP__RLE_STATE_NEUTRAL 0u
35117
35118
#define WUFFS_BMP__RLE_STATE_RUN 1u
35119
35120
#define WUFFS_BMP__RLE_STATE_ESCAPE 2u
35121
35122
#define WUFFS_BMP__RLE_STATE_LITERAL 3u
35123
35124
#define WUFFS_BMP__RLE_STATE_DELTA_X 4u
35125
35126
#define WUFFS_BMP__RLE_STATE_DELTA_Y 5u
35127
35128
// ---------------- Private Initializer Prototypes
35129
35130
// ---------------- Private Function Prototypes
35131
35132
WUFFS_BASE__GENERATED_C_CODE
35133
static wuffs_base__status
35134
wuffs_bmp__decoder__do_decode_image_config(
35135
    wuffs_bmp__decoder* self,
35136
    wuffs_base__image_config* a_dst,
35137
    wuffs_base__io_buffer* a_src);
35138
35139
WUFFS_BASE__GENERATED_C_CODE
35140
static wuffs_base__status
35141
wuffs_bmp__decoder__do_decode_frame_config(
35142
    wuffs_bmp__decoder* self,
35143
    wuffs_base__frame_config* a_dst,
35144
    wuffs_base__io_buffer* a_src);
35145
35146
WUFFS_BASE__GENERATED_C_CODE
35147
static wuffs_base__status
35148
wuffs_bmp__decoder__do_decode_frame(
35149
    wuffs_bmp__decoder* self,
35150
    wuffs_base__pixel_buffer* a_dst,
35151
    wuffs_base__io_buffer* a_src,
35152
    wuffs_base__pixel_blend a_blend,
35153
    wuffs_base__slice_u8 a_workbuf,
35154
    wuffs_base__decode_frame_options* a_opts);
35155
35156
WUFFS_BASE__GENERATED_C_CODE
35157
static wuffs_base__status
35158
wuffs_bmp__decoder__swizzle_none(
35159
    wuffs_bmp__decoder* self,
35160
    wuffs_base__pixel_buffer* a_dst,
35161
    wuffs_base__io_buffer* a_src);
35162
35163
WUFFS_BASE__GENERATED_C_CODE
35164
static wuffs_base__status
35165
wuffs_bmp__decoder__swizzle_rle(
35166
    wuffs_bmp__decoder* self,
35167
    wuffs_base__pixel_buffer* a_dst,
35168
    wuffs_base__io_buffer* a_src);
35169
35170
WUFFS_BASE__GENERATED_C_CODE
35171
static wuffs_base__status
35172
wuffs_bmp__decoder__swizzle_bitfields(
35173
    wuffs_bmp__decoder* self,
35174
    wuffs_base__pixel_buffer* a_dst,
35175
    wuffs_base__io_buffer* a_src);
35176
35177
WUFFS_BASE__GENERATED_C_CODE
35178
static wuffs_base__status
35179
wuffs_bmp__decoder__swizzle_low_bit_depth(
35180
    wuffs_bmp__decoder* self,
35181
    wuffs_base__pixel_buffer* a_dst,
35182
    wuffs_base__io_buffer* a_src);
35183
35184
WUFFS_BASE__GENERATED_C_CODE
35185
static wuffs_base__status
35186
wuffs_bmp__decoder__do_tell_me_more(
35187
    wuffs_bmp__decoder* self,
35188
    wuffs_base__io_buffer* a_dst,
35189
    wuffs_base__more_information* a_minfo,
35190
    wuffs_base__io_buffer* a_src);
35191
35192
WUFFS_BASE__GENERATED_C_CODE
35193
static wuffs_base__status
35194
wuffs_bmp__decoder__read_palette(
35195
    wuffs_bmp__decoder* self,
35196
    wuffs_base__io_buffer* a_src);
35197
35198
WUFFS_BASE__GENERATED_C_CODE
35199
static wuffs_base__status
35200
wuffs_bmp__decoder__process_masks(
35201
    wuffs_bmp__decoder* self);
35202
35203
// ---------------- VTables
35204
35205
const wuffs_base__image_decoder__func_ptrs
35206
wuffs_bmp__decoder__func_ptrs_for__wuffs_base__image_decoder = {
35207
  (wuffs_base__status(*)(void*,
35208
      wuffs_base__pixel_buffer*,
35209
      wuffs_base__io_buffer*,
35210
      wuffs_base__pixel_blend,
35211
      wuffs_base__slice_u8,
35212
      wuffs_base__decode_frame_options*))(&wuffs_bmp__decoder__decode_frame),
35213
  (wuffs_base__status(*)(void*,
35214
      wuffs_base__frame_config*,
35215
      wuffs_base__io_buffer*))(&wuffs_bmp__decoder__decode_frame_config),
35216
  (wuffs_base__status(*)(void*,
35217
      wuffs_base__image_config*,
35218
      wuffs_base__io_buffer*))(&wuffs_bmp__decoder__decode_image_config),
35219
  (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_bmp__decoder__frame_dirty_rect),
35220
  (uint64_t(*)(const void*,
35221
      uint32_t))(&wuffs_bmp__decoder__get_quirk),
35222
  (uint32_t(*)(const void*))(&wuffs_bmp__decoder__num_animation_loops),
35223
  (uint64_t(*)(const void*))(&wuffs_bmp__decoder__num_decoded_frame_configs),
35224
  (uint64_t(*)(const void*))(&wuffs_bmp__decoder__num_decoded_frames),
35225
  (wuffs_base__status(*)(void*,
35226
      uint64_t,
35227
      uint64_t))(&wuffs_bmp__decoder__restart_frame),
35228
  (wuffs_base__status(*)(void*,
35229
      uint32_t,
35230
      uint64_t))(&wuffs_bmp__decoder__set_quirk),
35231
  (wuffs_base__empty_struct(*)(void*,
35232
      uint32_t,
35233
      bool))(&wuffs_bmp__decoder__set_report_metadata),
35234
  (wuffs_base__status(*)(void*,
35235
      wuffs_base__io_buffer*,
35236
      wuffs_base__more_information*,
35237
      wuffs_base__io_buffer*))(&wuffs_bmp__decoder__tell_me_more),
35238
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_bmp__decoder__workbuf_len),
35239
};
35240
35241
// ---------------- Initializer Implementations
35242
35243
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
35244
wuffs_bmp__decoder__initialize(
35245
    wuffs_bmp__decoder* self,
35246
    size_t sizeof_star_self,
35247
    uint64_t wuffs_version,
35248
    uint32_t options){
35249
  if (!self) {
35250
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
35251
  }
35252
  if (sizeof(*self) != sizeof_star_self) {
35253
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
35254
  }
35255
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
35256
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
35257
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
35258
  }
35259
35260
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
35261
    // The whole point of this if-check is to detect an uninitialized *self.
35262
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
35263
#if !defined(__clang__) && defined(__GNUC__)
35264
#pragma GCC diagnostic push
35265
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
35266
#endif
35267
    if (self->private_impl.magic != 0) {
35268
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
35269
    }
35270
#if !defined(__clang__) && defined(__GNUC__)
35271
#pragma GCC diagnostic pop
35272
#endif
35273
  } else {
35274
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
35275
      memset(self, 0, sizeof(*self));
35276
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
35277
    } else {
35278
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
35279
    }
35280
  }
35281
35282
  self->private_impl.magic = WUFFS_BASE__MAGIC;
35283
  self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name =
35284
      wuffs_base__image_decoder__vtable_name;
35285
  self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers =
35286
      (const void*)(&wuffs_bmp__decoder__func_ptrs_for__wuffs_base__image_decoder);
35287
  return wuffs_base__make_status(NULL);
35288
}
35289
35290
wuffs_bmp__decoder*
35291
wuffs_bmp__decoder__alloc(void) {
35292
  wuffs_bmp__decoder* x =
35293
      (wuffs_bmp__decoder*)(calloc(1, sizeof(wuffs_bmp__decoder)));
35294
  if (!x) {
35295
    return NULL;
35296
  }
35297
  if (wuffs_bmp__decoder__initialize(
35298
      x, sizeof(wuffs_bmp__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
35299
    free(x);
35300
    return NULL;
35301
  }
35302
  return x;
35303
}
35304
35305
size_t
35306
sizeof__wuffs_bmp__decoder(void) {
35307
  return sizeof(wuffs_bmp__decoder);
35308
}
35309
35310
// ---------------- Function Implementations
35311
35312
// -------- func bmp.decoder.get_quirk
35313
35314
WUFFS_BASE__GENERATED_C_CODE
35315
WUFFS_BASE__MAYBE_STATIC uint64_t
35316
wuffs_bmp__decoder__get_quirk(
35317
    const wuffs_bmp__decoder* self,
35318
    uint32_t a_key) {
35319
  if (!self) {
35320
    return 0;
35321
  }
35322
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
35323
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
35324
    return 0;
35325
  }
35326
35327
  return 0u;
35328
}
35329
35330
// -------- func bmp.decoder.set_quirk
35331
35332
WUFFS_BASE__GENERATED_C_CODE
35333
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
35334
wuffs_bmp__decoder__set_quirk(
35335
    wuffs_bmp__decoder* self,
35336
    uint32_t a_key,
35337
    uint64_t a_value) {
35338
  if (!self) {
35339
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
35340
  }
35341
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
35342
    return wuffs_base__make_status(
35343
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
35344
        ? wuffs_base__error__disabled_by_previous_error
35345
        : wuffs_base__error__initialize_not_called);
35346
  }
35347
35348
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
35349
}
35350
35351
// -------- func bmp.decoder.decode_image_config
35352
35353
WUFFS_BASE__GENERATED_C_CODE
35354
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
35355
wuffs_bmp__decoder__decode_image_config(
35356
    wuffs_bmp__decoder* self,
35357
    wuffs_base__image_config* a_dst,
35358
    wuffs_base__io_buffer* a_src) {
35359
  if (!self) {
35360
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
35361
  }
35362
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
35363
    return wuffs_base__make_status(
35364
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
35365
        ? wuffs_base__error__disabled_by_previous_error
35366
        : wuffs_base__error__initialize_not_called);
35367
  }
35368
  if (!a_src) {
35369
    self->private_impl.magic = WUFFS_BASE__DISABLED;
35370
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
35371
  }
35372
  if ((self->private_impl.active_coroutine != 0) &&
35373
      (self->private_impl.active_coroutine != 1)) {
35374
    self->private_impl.magic = WUFFS_BASE__DISABLED;
35375
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
35376
  }
35377
  self->private_impl.active_coroutine = 0;
35378
  wuffs_base__status status = wuffs_base__make_status(NULL);
35379
35380
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
35381
35382
  uint32_t coro_susp_point = self->private_impl.p_decode_image_config;
35383
  switch (coro_susp_point) {
35384
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
35385
35386
    while (true) {
35387
      {
35388
        wuffs_base__status t_0 = wuffs_bmp__decoder__do_decode_image_config(self, a_dst, a_src);
35389
        v_status = t_0;
35390
      }
35391
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
35392
        status = wuffs_base__make_status(wuffs_bmp__error__truncated_input);
35393
        goto exit;
35394
      }
35395
      status = v_status;
35396
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
35397
    }
35398
35399
    ok:
35400
    self->private_impl.p_decode_image_config = 0;
35401
    goto exit;
35402
  }
35403
35404
  goto suspend;
35405
  suspend:
35406
  self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
35407
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
35408
35409
  goto exit;
35410
  exit:
35411
  if (wuffs_base__status__is_error(&status)) {
35412
    self->private_impl.magic = WUFFS_BASE__DISABLED;
35413
  }
35414
  return status;
35415
}
35416
35417
// -------- func bmp.decoder.do_decode_image_config
35418
35419
WUFFS_BASE__GENERATED_C_CODE
35420
static wuffs_base__status
35421
wuffs_bmp__decoder__do_decode_image_config(
35422
    wuffs_bmp__decoder* self,
35423
    wuffs_base__image_config* a_dst,
35424
    wuffs_base__io_buffer* a_src) {
35425
  wuffs_base__status status = wuffs_base__make_status(NULL);
35426
35427
  uint32_t v_magic = 0;
35428
  uint32_t v_width = 0;
35429
  uint32_t v_height = 0;
35430
  uint32_t v_planes = 0;
35431
  uint32_t v_n = 0;
35432
  uint32_t v_dst_pixfmt = 0;
35433
  uint32_t v_byte_width = 0;
35434
35435
  const uint8_t* iop_a_src = NULL;
35436
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
35437
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
35438
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
35439
  if (a_src && a_src->data.ptr) {
35440
    io0_a_src = a_src->data.ptr;
35441
    io1_a_src = io0_a_src + a_src->meta.ri;
35442
    iop_a_src = io1_a_src;
35443
    io2_a_src = io0_a_src + a_src->meta.wi;
35444
  }
35445
35446
  uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config;
35447
  switch (coro_susp_point) {
35448
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
35449
35450
    if ((self->private_impl.f_call_sequence != 0u) || (self->private_impl.f_io_redirect_fourcc == 1u)) {
35451
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
35452
      goto exit;
35453
    } else if (self->private_impl.f_io_redirect_fourcc != 0u) {
35454
      status = wuffs_base__make_status(wuffs_base__note__i_o_redirect);
35455
      goto ok;
35456
    }
35457
    {
35458
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
35459
      uint32_t t_0;
35460
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
35461
        t_0 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
35462
        iop_a_src += 2;
35463
      } else {
35464
        self->private_data.s_do_decode_image_config.scratch = 0;
35465
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
35466
        while (true) {
35467
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
35468
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
35469
            goto suspend;
35470
          }
35471
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
35472
          uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
35473
          *scratch <<= 8;
35474
          *scratch >>= 8;
35475
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
35476
          if (num_bits_0 == 8) {
35477
            t_0 = ((uint32_t)(*scratch));
35478
            break;
35479
          }
35480
          num_bits_0 += 8u;
35481
          *scratch |= ((uint64_t)(num_bits_0)) << 56;
35482
        }
35483
      }
35484
      v_magic = t_0;
35485
    }
35486
    if (v_magic != 19778u) {
35487
      status = wuffs_base__make_status(wuffs_bmp__error__bad_header);
35488
      goto exit;
35489
    }
35490
    self->private_data.s_do_decode_image_config.scratch = 8u;
35491
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
35492
    if (self->private_data.s_do_decode_image_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
35493
      self->private_data.s_do_decode_image_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
35494
      iop_a_src = io2_a_src;
35495
      status = wuffs_base__make_status(wuffs_base__suspension__short_read);
35496
      goto suspend;
35497
    }
35498
    iop_a_src += self->private_data.s_do_decode_image_config.scratch;
35499
    {
35500
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
35501
      uint32_t t_1;
35502
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
35503
        t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
35504
        iop_a_src += 4;
35505
      } else {
35506
        self->private_data.s_do_decode_image_config.scratch = 0;
35507
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
35508
        while (true) {
35509
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
35510
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
35511
            goto suspend;
35512
          }
35513
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
35514
          uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
35515
          *scratch <<= 8;
35516
          *scratch >>= 8;
35517
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
35518
          if (num_bits_1 == 24) {
35519
            t_1 = ((uint32_t)(*scratch));
35520
            break;
35521
          }
35522
          num_bits_1 += 8u;
35523
          *scratch |= ((uint64_t)(num_bits_1)) << 56;
35524
        }
35525
      }
35526
      self->private_impl.f_padding = t_1;
35527
    }
35528
    if (self->private_impl.f_padding < 14u) {
35529
      status = wuffs_base__make_status(wuffs_bmp__error__bad_header);
35530
      goto exit;
35531
    }
35532
    self->private_impl.f_padding -= 14u;
35533
    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))));
35534
    {
35535
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
35536
      uint32_t t_2;
35537
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
35538
        t_2 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
35539
        iop_a_src += 4;
35540
      } else {
35541
        self->private_data.s_do_decode_image_config.scratch = 0;
35542
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
35543
        while (true) {
35544
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
35545
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
35546
            goto suspend;
35547
          }
35548
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
35549
          uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56));
35550
          *scratch <<= 8;
35551
          *scratch >>= 8;
35552
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2;
35553
          if (num_bits_2 == 24) {
35554
            t_2 = ((uint32_t)(*scratch));
35555
            break;
35556
          }
35557
          num_bits_2 += 8u;
35558
          *scratch |= ((uint64_t)(num_bits_2)) << 56;
35559
        }
35560
      }
35561
      self->private_impl.f_bitmap_info_len = t_2;
35562
    }
35563
    if (self->private_impl.f_padding < self->private_impl.f_bitmap_info_len) {
35564
      status = wuffs_base__make_status(wuffs_bmp__error__bad_header);
35565
      goto exit;
35566
    }
35567
    self->private_impl.f_padding -= self->private_impl.f_bitmap_info_len;
35568
    if (self->private_impl.f_bitmap_info_len == 12u) {
35569
      {
35570
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
35571
        uint32_t t_3;
35572
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
35573
          t_3 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
35574
          iop_a_src += 2;
35575
        } else {
35576
          self->private_data.s_do_decode_image_config.scratch = 0;
35577
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
35578
          while (true) {
35579
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
35580
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
35581
              goto suspend;
35582
            }
35583
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
35584
            uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56));
35585
            *scratch <<= 8;
35586
            *scratch >>= 8;
35587
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3;
35588
            if (num_bits_3 == 8) {
35589
              t_3 = ((uint32_t)(*scratch));
35590
              break;
35591
            }
35592
            num_bits_3 += 8u;
35593
            *scratch |= ((uint64_t)(num_bits_3)) << 56;
35594
          }
35595
        }
35596
        self->private_impl.f_width = t_3;
35597
      }
35598
      {
35599
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
35600
        uint32_t t_4;
35601
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
35602
          t_4 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
35603
          iop_a_src += 2;
35604
        } else {
35605
          self->private_data.s_do_decode_image_config.scratch = 0;
35606
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11);
35607
          while (true) {
35608
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
35609
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
35610
              goto suspend;
35611
            }
35612
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
35613
            uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56));
35614
            *scratch <<= 8;
35615
            *scratch >>= 8;
35616
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4;
35617
            if (num_bits_4 == 8) {
35618
              t_4 = ((uint32_t)(*scratch));
35619
              break;
35620
            }
35621
            num_bits_4 += 8u;
35622
            *scratch |= ((uint64_t)(num_bits_4)) << 56;
35623
          }
35624
        }
35625
        self->private_impl.f_height = t_4;
35626
      }
35627
      {
35628
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12);
35629
        uint32_t t_5;
35630
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
35631
          t_5 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
35632
          iop_a_src += 2;
35633
        } else {
35634
          self->private_data.s_do_decode_image_config.scratch = 0;
35635
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13);
35636
          while (true) {
35637
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
35638
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
35639
              goto suspend;
35640
            }
35641
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
35642
            uint32_t num_bits_5 = ((uint32_t)(*scratch >> 56));
35643
            *scratch <<= 8;
35644
            *scratch >>= 8;
35645
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_5;
35646
            if (num_bits_5 == 8) {
35647
              t_5 = ((uint32_t)(*scratch));
35648
              break;
35649
            }
35650
            num_bits_5 += 8u;
35651
            *scratch |= ((uint64_t)(num_bits_5)) << 56;
35652
          }
35653
        }
35654
        v_planes = t_5;
35655
      }
35656
      if (v_planes != 1u) {
35657
        status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file);
35658
        goto exit;
35659
      }
35660
      {
35661
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14);
35662
        uint32_t t_6;
35663
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
35664
          t_6 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
35665
          iop_a_src += 2;
35666
        } else {
35667
          self->private_data.s_do_decode_image_config.scratch = 0;
35668
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15);
35669
          while (true) {
35670
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
35671
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
35672
              goto suspend;
35673
            }
35674
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
35675
            uint32_t num_bits_6 = ((uint32_t)(*scratch >> 56));
35676
            *scratch <<= 8;
35677
            *scratch >>= 8;
35678
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_6;
35679
            if (num_bits_6 == 8) {
35680
              t_6 = ((uint32_t)(*scratch));
35681
              break;
35682
            }
35683
            num_bits_6 += 8u;
35684
            *scratch |= ((uint64_t)(num_bits_6)) << 56;
35685
          }
35686
        }
35687
        self->private_impl.f_bits_per_pixel = t_6;
35688
      }
35689
    } else if (self->private_impl.f_bitmap_info_len == 16u) {
35690
      {
35691
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16);
35692
        uint32_t t_7;
35693
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
35694
          t_7 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
35695
          iop_a_src += 4;
35696
        } else {
35697
          self->private_data.s_do_decode_image_config.scratch = 0;
35698
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(17);
35699
          while (true) {
35700
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
35701
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
35702
              goto suspend;
35703
            }
35704
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
35705
            uint32_t num_bits_7 = ((uint32_t)(*scratch >> 56));
35706
            *scratch <<= 8;
35707
            *scratch >>= 8;
35708
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_7;
35709
            if (num_bits_7 == 24) {
35710
              t_7 = ((uint32_t)(*scratch));
35711
              break;
35712
            }
35713
            num_bits_7 += 8u;
35714
            *scratch |= ((uint64_t)(num_bits_7)) << 56;
35715
          }
35716
        }
35717
        v_width = t_7;
35718
      }
35719
      if (v_width > 2147483647u) {
35720
        status = wuffs_base__make_status(wuffs_bmp__error__bad_header);
35721
        goto exit;
35722
      } else if (v_width > 16777215u) {
35723
        status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension);
35724
        goto exit;
35725
      }
35726
      self->private_impl.f_width = v_width;
35727
      {
35728
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(18);
35729
        uint32_t t_8;
35730
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
35731
          t_8 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
35732
          iop_a_src += 4;
35733
        } else {
35734
          self->private_data.s_do_decode_image_config.scratch = 0;
35735
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(19);
35736
          while (true) {
35737
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
35738
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
35739
              goto suspend;
35740
            }
35741
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
35742
            uint32_t num_bits_8 = ((uint32_t)(*scratch >> 56));
35743
            *scratch <<= 8;
35744
            *scratch >>= 8;
35745
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_8;
35746
            if (num_bits_8 == 24) {
35747
              t_8 = ((uint32_t)(*scratch));
35748
              break;
35749
            }
35750
            num_bits_8 += 8u;
35751
            *scratch |= ((uint64_t)(num_bits_8)) << 56;
35752
          }
35753
        }
35754
        v_height = t_8;
35755
      }
35756
      if (v_height > 2147483647u) {
35757
        status = wuffs_base__make_status(wuffs_bmp__error__bad_header);
35758
        goto exit;
35759
      } else if (v_height > 16777215u) {
35760
        status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension);
35761
        goto exit;
35762
      }
35763
      self->private_impl.f_height = v_height;
35764
      {
35765
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(20);
35766
        uint32_t t_9;
35767
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
35768
          t_9 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
35769
          iop_a_src += 2;
35770
        } else {
35771
          self->private_data.s_do_decode_image_config.scratch = 0;
35772
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(21);
35773
          while (true) {
35774
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
35775
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
35776
              goto suspend;
35777
            }
35778
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
35779
            uint32_t num_bits_9 = ((uint32_t)(*scratch >> 56));
35780
            *scratch <<= 8;
35781
            *scratch >>= 8;
35782
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_9;
35783
            if (num_bits_9 == 8) {
35784
              t_9 = ((uint32_t)(*scratch));
35785
              break;
35786
            }
35787
            num_bits_9 += 8u;
35788
            *scratch |= ((uint64_t)(num_bits_9)) << 56;
35789
          }
35790
        }
35791
        v_planes = t_9;
35792
      }
35793
      if (v_planes != 1u) {
35794
        status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file);
35795
        goto exit;
35796
      }
35797
      {
35798
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(22);
35799
        uint32_t t_10;
35800
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
35801
          t_10 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
35802
          iop_a_src += 2;
35803
        } else {
35804
          self->private_data.s_do_decode_image_config.scratch = 0;
35805
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(23);
35806
          while (true) {
35807
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
35808
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
35809
              goto suspend;
35810
            }
35811
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
35812
            uint32_t num_bits_10 = ((uint32_t)(*scratch >> 56));
35813
            *scratch <<= 8;
35814
            *scratch >>= 8;
35815
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_10;
35816
            if (num_bits_10 == 8) {
35817
              t_10 = ((uint32_t)(*scratch));
35818
              break;
35819
            }
35820
            num_bits_10 += 8u;
35821
            *scratch |= ((uint64_t)(num_bits_10)) << 56;
35822
          }
35823
        }
35824
        self->private_impl.f_bits_per_pixel = t_10;
35825
      }
35826
    } else {
35827
      {
35828
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(24);
35829
        uint32_t t_11;
35830
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
35831
          t_11 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
35832
          iop_a_src += 4;
35833
        } else {
35834
          self->private_data.s_do_decode_image_config.scratch = 0;
35835
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(25);
35836
          while (true) {
35837
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
35838
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
35839
              goto suspend;
35840
            }
35841
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
35842
            uint32_t num_bits_11 = ((uint32_t)(*scratch >> 56));
35843
            *scratch <<= 8;
35844
            *scratch >>= 8;
35845
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_11;
35846
            if (num_bits_11 == 24) {
35847
              t_11 = ((uint32_t)(*scratch));
35848
              break;
35849
            }
35850
            num_bits_11 += 8u;
35851
            *scratch |= ((uint64_t)(num_bits_11)) << 56;
35852
          }
35853
        }
35854
        v_width = t_11;
35855
      }
35856
      if (v_width > 2147483647u) {
35857
        status = wuffs_base__make_status(wuffs_bmp__error__bad_header);
35858
        goto exit;
35859
      } else if (v_width > 16777215u) {
35860
        status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension);
35861
        goto exit;
35862
      }
35863
      self->private_impl.f_width = v_width;
35864
      {
35865
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(26);
35866
        uint32_t t_12;
35867
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
35868
          t_12 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
35869
          iop_a_src += 4;
35870
        } else {
35871
          self->private_data.s_do_decode_image_config.scratch = 0;
35872
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(27);
35873
          while (true) {
35874
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
35875
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
35876
              goto suspend;
35877
            }
35878
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
35879
            uint32_t num_bits_12 = ((uint32_t)(*scratch >> 56));
35880
            *scratch <<= 8;
35881
            *scratch >>= 8;
35882
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_12;
35883
            if (num_bits_12 == 24) {
35884
              t_12 = ((uint32_t)(*scratch));
35885
              break;
35886
            }
35887
            num_bits_12 += 8u;
35888
            *scratch |= ((uint64_t)(num_bits_12)) << 56;
35889
          }
35890
        }
35891
        v_height = t_12;
35892
      }
35893
      if (v_height == 2147483648u) {
35894
        status = wuffs_base__make_status(wuffs_bmp__error__bad_header);
35895
        goto exit;
35896
      } else if (v_height > 2147483648u) {
35897
        v_height = ((uint32_t)(0u - v_height));
35898
        if (v_height > 16777215u) {
35899
          status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension);
35900
          goto exit;
35901
        }
35902
        self->private_impl.f_height = v_height;
35903
        self->private_impl.f_top_down = true;
35904
      } else if (v_height > 16777215u) {
35905
        status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension);
35906
        goto exit;
35907
      } else {
35908
        self->private_impl.f_height = v_height;
35909
      }
35910
      {
35911
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(28);
35912
        uint32_t t_13;
35913
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
35914
          t_13 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
35915
          iop_a_src += 2;
35916
        } else {
35917
          self->private_data.s_do_decode_image_config.scratch = 0;
35918
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(29);
35919
          while (true) {
35920
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
35921
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
35922
              goto suspend;
35923
            }
35924
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
35925
            uint32_t num_bits_13 = ((uint32_t)(*scratch >> 56));
35926
            *scratch <<= 8;
35927
            *scratch >>= 8;
35928
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_13;
35929
            if (num_bits_13 == 8) {
35930
              t_13 = ((uint32_t)(*scratch));
35931
              break;
35932
            }
35933
            num_bits_13 += 8u;
35934
            *scratch |= ((uint64_t)(num_bits_13)) << 56;
35935
          }
35936
        }
35937
        v_planes = t_13;
35938
      }
35939
      if (v_planes != 1u) {
35940
        status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file);
35941
        goto exit;
35942
      }
35943
      {
35944
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(30);
35945
        uint32_t t_14;
35946
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
35947
          t_14 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
35948
          iop_a_src += 2;
35949
        } else {
35950
          self->private_data.s_do_decode_image_config.scratch = 0;
35951
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(31);
35952
          while (true) {
35953
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
35954
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
35955
              goto suspend;
35956
            }
35957
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
35958
            uint32_t num_bits_14 = ((uint32_t)(*scratch >> 56));
35959
            *scratch <<= 8;
35960
            *scratch >>= 8;
35961
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_14;
35962
            if (num_bits_14 == 8) {
35963
              t_14 = ((uint32_t)(*scratch));
35964
              break;
35965
            }
35966
            num_bits_14 += 8u;
35967
            *scratch |= ((uint64_t)(num_bits_14)) << 56;
35968
          }
35969
        }
35970
        self->private_impl.f_bits_per_pixel = t_14;
35971
      }
35972
      {
35973
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(32);
35974
        uint32_t t_15;
35975
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
35976
          t_15 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
35977
          iop_a_src += 4;
35978
        } else {
35979
          self->private_data.s_do_decode_image_config.scratch = 0;
35980
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(33);
35981
          while (true) {
35982
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
35983
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
35984
              goto suspend;
35985
            }
35986
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
35987
            uint32_t num_bits_15 = ((uint32_t)(*scratch >> 56));
35988
            *scratch <<= 8;
35989
            *scratch >>= 8;
35990
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_15;
35991
            if (num_bits_15 == 24) {
35992
              t_15 = ((uint32_t)(*scratch));
35993
              break;
35994
            }
35995
            num_bits_15 += 8u;
35996
            *scratch |= ((uint64_t)(num_bits_15)) << 56;
35997
          }
35998
        }
35999
        self->private_impl.f_compression = t_15;
36000
      }
36001
      if (self->private_impl.f_bits_per_pixel == 0u) {
36002
        if (self->private_impl.f_compression == 4u) {
36003
          self->private_impl.f_io_redirect_fourcc = 1246774599u;
36004
          status = wuffs_base__make_status(wuffs_base__note__i_o_redirect);
36005
          goto ok;
36006
        } else if (self->private_impl.f_compression == 5u) {
36007
          self->private_impl.f_io_redirect_fourcc = 1347307296u;
36008
          status = wuffs_base__make_status(wuffs_base__note__i_o_redirect);
36009
          goto ok;
36010
        }
36011
        status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file);
36012
        goto exit;
36013
      }
36014
      self->private_data.s_do_decode_image_config.scratch = 20u;
36015
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(34);
36016
      if (self->private_data.s_do_decode_image_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
36017
        self->private_data.s_do_decode_image_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
36018
        iop_a_src = io2_a_src;
36019
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
36020
        goto suspend;
36021
      }
36022
      iop_a_src += self->private_data.s_do_decode_image_config.scratch;
36023
      if (self->private_impl.f_bitmap_info_len == 40u) {
36024
        if (self->private_impl.f_bits_per_pixel >= 16u) {
36025
          if (self->private_impl.f_padding >= 16u) {
36026
            self->private_impl.f_bitmap_info_len = 56u;
36027
            self->private_impl.f_padding -= 16u;
36028
          } else if (self->private_impl.f_padding >= 12u) {
36029
            self->private_impl.f_bitmap_info_len = 52u;
36030
            self->private_impl.f_padding -= 12u;
36031
          }
36032
        }
36033
      } else if ((self->private_impl.f_bitmap_info_len != 52u) &&
36034
          (self->private_impl.f_bitmap_info_len != 56u) &&
36035
          (self->private_impl.f_bitmap_info_len != 64u) &&
36036
          (self->private_impl.f_bitmap_info_len != 108u) &&
36037
          (self->private_impl.f_bitmap_info_len != 124u)) {
36038
        status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file);
36039
        goto exit;
36040
      }
36041
      if (self->private_impl.f_compression == 6u) {
36042
        self->private_impl.f_compression = 3u;
36043
      }
36044
      if (self->private_impl.f_compression == 3u) {
36045
        if (self->private_impl.f_bitmap_info_len >= 52u) {
36046
          {
36047
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(35);
36048
            uint32_t t_16;
36049
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
36050
              t_16 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
36051
              iop_a_src += 4;
36052
            } else {
36053
              self->private_data.s_do_decode_image_config.scratch = 0;
36054
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(36);
36055
              while (true) {
36056
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
36057
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
36058
                  goto suspend;
36059
                }
36060
                uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
36061
                uint32_t num_bits_16 = ((uint32_t)(*scratch >> 56));
36062
                *scratch <<= 8;
36063
                *scratch >>= 8;
36064
                *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_16;
36065
                if (num_bits_16 == 24) {
36066
                  t_16 = ((uint32_t)(*scratch));
36067
                  break;
36068
                }
36069
                num_bits_16 += 8u;
36070
                *scratch |= ((uint64_t)(num_bits_16)) << 56;
36071
              }
36072
            }
36073
            self->private_impl.f_channel_masks[2u] = t_16;
36074
          }
36075
          {
36076
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(37);
36077
            uint32_t t_17;
36078
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
36079
              t_17 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
36080
              iop_a_src += 4;
36081
            } else {
36082
              self->private_data.s_do_decode_image_config.scratch = 0;
36083
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(38);
36084
              while (true) {
36085
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
36086
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
36087
                  goto suspend;
36088
                }
36089
                uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
36090
                uint32_t num_bits_17 = ((uint32_t)(*scratch >> 56));
36091
                *scratch <<= 8;
36092
                *scratch >>= 8;
36093
                *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_17;
36094
                if (num_bits_17 == 24) {
36095
                  t_17 = ((uint32_t)(*scratch));
36096
                  break;
36097
                }
36098
                num_bits_17 += 8u;
36099
                *scratch |= ((uint64_t)(num_bits_17)) << 56;
36100
              }
36101
            }
36102
            self->private_impl.f_channel_masks[1u] = t_17;
36103
          }
36104
          {
36105
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(39);
36106
            uint32_t t_18;
36107
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
36108
              t_18 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
36109
              iop_a_src += 4;
36110
            } else {
36111
              self->private_data.s_do_decode_image_config.scratch = 0;
36112
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(40);
36113
              while (true) {
36114
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
36115
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
36116
                  goto suspend;
36117
                }
36118
                uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
36119
                uint32_t num_bits_18 = ((uint32_t)(*scratch >> 56));
36120
                *scratch <<= 8;
36121
                *scratch >>= 8;
36122
                *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_18;
36123
                if (num_bits_18 == 24) {
36124
                  t_18 = ((uint32_t)(*scratch));
36125
                  break;
36126
                }
36127
                num_bits_18 += 8u;
36128
                *scratch |= ((uint64_t)(num_bits_18)) << 56;
36129
              }
36130
            }
36131
            self->private_impl.f_channel_masks[0u] = t_18;
36132
          }
36133
          if (self->private_impl.f_bitmap_info_len >= 56u) {
36134
            {
36135
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(41);
36136
              uint32_t t_19;
36137
              if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
36138
                t_19 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
36139
                iop_a_src += 4;
36140
              } else {
36141
                self->private_data.s_do_decode_image_config.scratch = 0;
36142
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT(42);
36143
                while (true) {
36144
                  if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
36145
                    status = wuffs_base__make_status(wuffs_base__suspension__short_read);
36146
                    goto suspend;
36147
                  }
36148
                  uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
36149
                  uint32_t num_bits_19 = ((uint32_t)(*scratch >> 56));
36150
                  *scratch <<= 8;
36151
                  *scratch >>= 8;
36152
                  *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_19;
36153
                  if (num_bits_19 == 24) {
36154
                    t_19 = ((uint32_t)(*scratch));
36155
                    break;
36156
                  }
36157
                  num_bits_19 += 8u;
36158
                  *scratch |= ((uint64_t)(num_bits_19)) << 56;
36159
                }
36160
              }
36161
              self->private_impl.f_channel_masks[3u] = t_19;
36162
            }
36163
            self->private_data.s_do_decode_image_config.scratch = ((uint32_t)(self->private_impl.f_bitmap_info_len - 56u));
36164
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(43);
36165
            if (self->private_data.s_do_decode_image_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
36166
              self->private_data.s_do_decode_image_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
36167
              iop_a_src = io2_a_src;
36168
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
36169
              goto suspend;
36170
            }
36171
            iop_a_src += self->private_data.s_do_decode_image_config.scratch;
36172
          }
36173
          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)) {
36174
            if (self->private_impl.f_bits_per_pixel == 24u) {
36175
              self->private_impl.f_compression = 0u;
36176
            } else if (self->private_impl.f_bits_per_pixel == 32u) {
36177
              if ((self->private_impl.f_channel_masks[3u] == 0u) || (self->private_impl.f_channel_masks[3u] == 4278190080u)) {
36178
                self->private_impl.f_compression = 0u;
36179
              }
36180
            }
36181
          }
36182
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(44);
36183
          status = wuffs_bmp__decoder__process_masks(self);
36184
          if (status.repr) {
36185
            goto suspend;
36186
          }
36187
        }
36188
      } else if (self->private_impl.f_bitmap_info_len >= 40u) {
36189
        v_n = (self->private_impl.f_bitmap_info_len - 40u);
36190
        self->private_data.s_do_decode_image_config.scratch = v_n;
36191
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(45);
36192
        if (self->private_data.s_do_decode_image_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
36193
          self->private_data.s_do_decode_image_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
36194
          iop_a_src = io2_a_src;
36195
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
36196
          goto suspend;
36197
        }
36198
        iop_a_src += self->private_data.s_do_decode_image_config.scratch;
36199
      } else {
36200
        status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file);
36201
        goto exit;
36202
      }
36203
    }
36204
    if (self->private_impl.f_compression != 3u) {
36205
      if (self->private_impl.f_bits_per_pixel < 16u) {
36206
        if (a_src) {
36207
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
36208
        }
36209
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(46);
36210
        status = wuffs_bmp__decoder__read_palette(self, a_src);
36211
        if (a_src) {
36212
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
36213
        }
36214
        if (status.repr) {
36215
          goto suspend;
36216
        }
36217
      }
36218
    }
36219
    if (self->private_impl.f_compression == 0u) {
36220
      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)) {
36221
        self->private_impl.f_src_pixfmt = 2198077448u;
36222
        self->private_impl.f_compression = 256u;
36223
      } else if (self->private_impl.f_bits_per_pixel == 8u) {
36224
        self->private_impl.f_src_pixfmt = 2198077448u;
36225
      } else if (self->private_impl.f_bits_per_pixel == 16u) {
36226
        self->private_impl.f_compression = 3u;
36227
        self->private_impl.f_channel_masks[0u] = 31u;
36228
        self->private_impl.f_channel_masks[1u] = 992u;
36229
        self->private_impl.f_channel_masks[2u] = 31744u;
36230
        self->private_impl.f_channel_masks[3u] = 0u;
36231
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(47);
36232
        status = wuffs_bmp__decoder__process_masks(self);
36233
        if (status.repr) {
36234
          goto suspend;
36235
        }
36236
        self->private_impl.f_src_pixfmt = 2164308923u;
36237
      } else if (self->private_impl.f_bits_per_pixel == 24u) {
36238
        self->private_impl.f_src_pixfmt = 2147485832u;
36239
      } else if (self->private_impl.f_bits_per_pixel == 32u) {
36240
        if (self->private_impl.f_channel_masks[3u] == 0u) {
36241
          self->private_impl.f_src_pixfmt = 2415954056u;
36242
        } else {
36243
          self->private_impl.f_src_pixfmt = 2164295816u;
36244
        }
36245
      } else {
36246
        status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file);
36247
        goto exit;
36248
      }
36249
    } else if (self->private_impl.f_compression == 1u) {
36250
      if (self->private_impl.f_bits_per_pixel == 8u) {
36251
        self->private_impl.f_src_pixfmt = 2198077448u;
36252
      } else {
36253
        status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file);
36254
        goto exit;
36255
      }
36256
    } else if (self->private_impl.f_compression == 2u) {
36257
      if (self->private_impl.f_bits_per_pixel == 4u) {
36258
        self->private_impl.f_src_pixfmt = 2198077448u;
36259
      } else {
36260
        status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file);
36261
        goto exit;
36262
      }
36263
    } else if (self->private_impl.f_compression == 3u) {
36264
      if ((self->private_impl.f_bits_per_pixel == 16u) || (self->private_impl.f_bits_per_pixel == 32u)) {
36265
        self->private_impl.f_src_pixfmt = 2164308923u;
36266
      } else {
36267
        status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file);
36268
        goto exit;
36269
      }
36270
    } else {
36271
      status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file);
36272
      goto exit;
36273
    }
36274
    if (((self->private_impl.f_bitmap_info_len < 40u) || (self->private_impl.f_bitmap_info_len == 64u)) &&
36275
        (self->private_impl.f_bits_per_pixel != 1u) &&
36276
        (self->private_impl.f_bits_per_pixel != 4u) &&
36277
        (self->private_impl.f_bits_per_pixel != 8u) &&
36278
        (self->private_impl.f_bits_per_pixel != 24u)) {
36279
      status = wuffs_base__make_status(wuffs_bmp__error__bad_header);
36280
      goto exit;
36281
    }
36282
    if (self->private_impl.f_bits_per_pixel == 1u) {
36283
      v_byte_width = ((self->private_impl.f_width >> 3u) + (((self->private_impl.f_width & 7u) + 7u) >> 3u));
36284
      self->private_impl.f_pad_per_row = ((4u - (v_byte_width & 3u)) & 3u);
36285
    } else if (self->private_impl.f_bits_per_pixel == 2u) {
36286
      v_byte_width = ((self->private_impl.f_width >> 2u) + (((self->private_impl.f_width & 3u) + 3u) >> 2u));
36287
      self->private_impl.f_pad_per_row = ((4u - (v_byte_width & 3u)) & 3u);
36288
    } else if (self->private_impl.f_bits_per_pixel == 4u) {
36289
      v_byte_width = ((self->private_impl.f_width >> 1u) + (self->private_impl.f_width & 1u));
36290
      self->private_impl.f_pad_per_row = ((4u - (v_byte_width & 3u)) & 3u);
36291
    } else if (self->private_impl.f_bits_per_pixel == 8u) {
36292
      self->private_impl.f_pad_per_row = ((4u - (self->private_impl.f_width & 3u)) & 3u);
36293
    } else if (self->private_impl.f_bits_per_pixel == 16u) {
36294
      self->private_impl.f_pad_per_row = ((self->private_impl.f_width & 1u) * 2u);
36295
    } else if (self->private_impl.f_bits_per_pixel == 24u) {
36296
      self->private_impl.f_pad_per_row = (self->private_impl.f_width & 3u);
36297
    } else if (self->private_impl.f_bits_per_pixel == 32u) {
36298
      self->private_impl.f_pad_per_row = 0u;
36299
    }
36300
    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)));
36301
    if (a_dst != NULL) {
36302
      v_dst_pixfmt = 2164295816u;
36303
      if ((self->private_impl.f_channel_num_bits[0u] > 8u) ||
36304
          (self->private_impl.f_channel_num_bits[1u] > 8u) ||
36305
          (self->private_impl.f_channel_num_bits[2u] > 8u) ||
36306
          (self->private_impl.f_channel_num_bits[3u] > 8u)) {
36307
        v_dst_pixfmt = 2164308923u;
36308
      } 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))) {
36309
        v_dst_pixfmt = 2415954056u;
36310
      }
36311
      wuffs_base__image_config__set(
36312
          a_dst,
36313
          v_dst_pixfmt,
36314
          0u,
36315
          self->private_impl.f_width,
36316
          self->private_impl.f_height,
36317
          self->private_impl.f_frame_config_io_position,
36318
          (self->private_impl.f_channel_masks[3u] == 0u));
36319
    }
36320
    self->private_impl.f_call_sequence = 32u;
36321
36322
    ok:
36323
    self->private_impl.p_do_decode_image_config = 0;
36324
    goto exit;
36325
  }
36326
36327
  goto suspend;
36328
  suspend:
36329
  self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
36330
36331
  goto exit;
36332
  exit:
36333
  if (a_src && a_src->data.ptr) {
36334
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
36335
  }
36336
36337
  return status;
36338
}
36339
36340
// -------- func bmp.decoder.decode_frame_config
36341
36342
WUFFS_BASE__GENERATED_C_CODE
36343
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
36344
wuffs_bmp__decoder__decode_frame_config(
36345
    wuffs_bmp__decoder* self,
36346
    wuffs_base__frame_config* a_dst,
36347
    wuffs_base__io_buffer* a_src) {
36348
  if (!self) {
36349
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
36350
  }
36351
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
36352
    return wuffs_base__make_status(
36353
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
36354
        ? wuffs_base__error__disabled_by_previous_error
36355
        : wuffs_base__error__initialize_not_called);
36356
  }
36357
  if (!a_src) {
36358
    self->private_impl.magic = WUFFS_BASE__DISABLED;
36359
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
36360
  }
36361
  if ((self->private_impl.active_coroutine != 0) &&
36362
      (self->private_impl.active_coroutine != 2)) {
36363
    self->private_impl.magic = WUFFS_BASE__DISABLED;
36364
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
36365
  }
36366
  self->private_impl.active_coroutine = 0;
36367
  wuffs_base__status status = wuffs_base__make_status(NULL);
36368
36369
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
36370
36371
  uint32_t coro_susp_point = self->private_impl.p_decode_frame_config;
36372
  switch (coro_susp_point) {
36373
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
36374
36375
    while (true) {
36376
      {
36377
        wuffs_base__status t_0 = wuffs_bmp__decoder__do_decode_frame_config(self, a_dst, a_src);
36378
        v_status = t_0;
36379
      }
36380
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
36381
        status = wuffs_base__make_status(wuffs_bmp__error__truncated_input);
36382
        goto exit;
36383
      }
36384
      status = v_status;
36385
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
36386
    }
36387
36388
    ok:
36389
    self->private_impl.p_decode_frame_config = 0;
36390
    goto exit;
36391
  }
36392
36393
  goto suspend;
36394
  suspend:
36395
  self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
36396
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0;
36397
36398
  goto exit;
36399
  exit:
36400
  if (wuffs_base__status__is_error(&status)) {
36401
    self->private_impl.magic = WUFFS_BASE__DISABLED;
36402
  }
36403
  return status;
36404
}
36405
36406
// -------- func bmp.decoder.do_decode_frame_config
36407
36408
WUFFS_BASE__GENERATED_C_CODE
36409
static wuffs_base__status
36410
wuffs_bmp__decoder__do_decode_frame_config(
36411
    wuffs_bmp__decoder* self,
36412
    wuffs_base__frame_config* a_dst,
36413
    wuffs_base__io_buffer* a_src) {
36414
  wuffs_base__status status = wuffs_base__make_status(NULL);
36415
36416
  wuffs_base__pixel_format v_pixfmt = {0};
36417
36418
  const uint8_t* iop_a_src = NULL;
36419
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
36420
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
36421
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
36422
  if (a_src && a_src->data.ptr) {
36423
    io0_a_src = a_src->data.ptr;
36424
    io1_a_src = io0_a_src + a_src->meta.ri;
36425
    iop_a_src = io1_a_src;
36426
    io2_a_src = io0_a_src + a_src->meta.wi;
36427
  }
36428
36429
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config;
36430
  switch (coro_susp_point) {
36431
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
36432
36433
    if (self->private_impl.f_call_sequence == 32u) {
36434
    } else if (self->private_impl.f_call_sequence < 32u) {
36435
      if (a_src) {
36436
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
36437
      }
36438
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
36439
      status = wuffs_bmp__decoder__do_decode_image_config(self, NULL, a_src);
36440
      if (a_src) {
36441
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
36442
      }
36443
      if (status.repr) {
36444
        goto suspend;
36445
      }
36446
    } else if (self->private_impl.f_call_sequence == 40u) {
36447
      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)))) {
36448
        status = wuffs_base__make_status(wuffs_base__error__bad_restart);
36449
        goto exit;
36450
      }
36451
    } else if (self->private_impl.f_call_sequence == 64u) {
36452
      self->private_impl.f_call_sequence = 96u;
36453
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
36454
      goto ok;
36455
    } else {
36456
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
36457
      goto ok;
36458
    }
36459
    if (a_dst != NULL) {
36460
      v_pixfmt = wuffs_base__utility__make_pixel_format(self->private_impl.f_src_pixfmt);
36461
      wuffs_base__frame_config__set(
36462
          a_dst,
36463
          wuffs_base__utility__make_rect_ie_u32(
36464
          0u,
36465
          0u,
36466
          self->private_impl.f_width,
36467
          self->private_impl.f_height),
36468
          ((wuffs_base__flicks)(0u)),
36469
          0u,
36470
          self->private_impl.f_frame_config_io_position,
36471
          0u,
36472
          true,
36473
          false,
36474
          wuffs_base__pixel_format__default_background_color(&v_pixfmt));
36475
    }
36476
    self->private_impl.f_call_sequence = 64u;
36477
36478
    ok:
36479
    self->private_impl.p_do_decode_frame_config = 0;
36480
    goto exit;
36481
  }
36482
36483
  goto suspend;
36484
  suspend:
36485
  self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
36486
36487
  goto exit;
36488
  exit:
36489
  if (a_src && a_src->data.ptr) {
36490
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
36491
  }
36492
36493
  return status;
36494
}
36495
36496
// -------- func bmp.decoder.decode_frame
36497
36498
WUFFS_BASE__GENERATED_C_CODE
36499
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
36500
wuffs_bmp__decoder__decode_frame(
36501
    wuffs_bmp__decoder* self,
36502
    wuffs_base__pixel_buffer* a_dst,
36503
    wuffs_base__io_buffer* a_src,
36504
    wuffs_base__pixel_blend a_blend,
36505
    wuffs_base__slice_u8 a_workbuf,
36506
    wuffs_base__decode_frame_options* a_opts) {
36507
  if (!self) {
36508
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
36509
  }
36510
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
36511
    return wuffs_base__make_status(
36512
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
36513
        ? wuffs_base__error__disabled_by_previous_error
36514
        : wuffs_base__error__initialize_not_called);
36515
  }
36516
  if (!a_dst || !a_src) {
36517
    self->private_impl.magic = WUFFS_BASE__DISABLED;
36518
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
36519
  }
36520
  if ((self->private_impl.active_coroutine != 0) &&
36521
      (self->private_impl.active_coroutine != 3)) {
36522
    self->private_impl.magic = WUFFS_BASE__DISABLED;
36523
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
36524
  }
36525
  self->private_impl.active_coroutine = 0;
36526
  wuffs_base__status status = wuffs_base__make_status(NULL);
36527
36528
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
36529
36530
  uint32_t coro_susp_point = self->private_impl.p_decode_frame;
36531
  switch (coro_susp_point) {
36532
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
36533
36534
    while (true) {
36535
      {
36536
        wuffs_base__status t_0 = wuffs_bmp__decoder__do_decode_frame(self,
36537
            a_dst,
36538
            a_src,
36539
            a_blend,
36540
            a_workbuf,
36541
            a_opts);
36542
        v_status = t_0;
36543
      }
36544
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
36545
        status = wuffs_base__make_status(wuffs_bmp__error__truncated_input);
36546
        goto exit;
36547
      }
36548
      status = v_status;
36549
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
36550
    }
36551
36552
    ok:
36553
    self->private_impl.p_decode_frame = 0;
36554
    goto exit;
36555
  }
36556
36557
  goto suspend;
36558
  suspend:
36559
  self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
36560
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0;
36561
36562
  goto exit;
36563
  exit:
36564
  if (wuffs_base__status__is_error(&status)) {
36565
    self->private_impl.magic = WUFFS_BASE__DISABLED;
36566
  }
36567
  return status;
36568
}
36569
36570
// -------- func bmp.decoder.do_decode_frame
36571
36572
WUFFS_BASE__GENERATED_C_CODE
36573
static wuffs_base__status
36574
wuffs_bmp__decoder__do_decode_frame(
36575
    wuffs_bmp__decoder* self,
36576
    wuffs_base__pixel_buffer* a_dst,
36577
    wuffs_base__io_buffer* a_src,
36578
    wuffs_base__pixel_blend a_blend,
36579
    wuffs_base__slice_u8 a_workbuf,
36580
    wuffs_base__decode_frame_options* a_opts) {
36581
  wuffs_base__status status = wuffs_base__make_status(NULL);
36582
36583
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
36584
36585
  const uint8_t* iop_a_src = NULL;
36586
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
36587
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
36588
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
36589
  if (a_src && a_src->data.ptr) {
36590
    io0_a_src = a_src->data.ptr;
36591
    io1_a_src = io0_a_src + a_src->meta.ri;
36592
    iop_a_src = io1_a_src;
36593
    io2_a_src = io0_a_src + a_src->meta.wi;
36594
  }
36595
36596
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame;
36597
  switch (coro_susp_point) {
36598
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
36599
36600
    if (self->private_impl.f_call_sequence == 64u) {
36601
    } else if (self->private_impl.f_call_sequence < 64u) {
36602
      if (a_src) {
36603
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
36604
      }
36605
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
36606
      status = wuffs_bmp__decoder__do_decode_frame_config(self, NULL, a_src);
36607
      if (a_src) {
36608
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
36609
      }
36610
      if (status.repr) {
36611
        goto suspend;
36612
      }
36613
    } else {
36614
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
36615
      goto ok;
36616
    }
36617
    self->private_data.s_do_decode_frame.scratch = self->private_impl.f_padding;
36618
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
36619
    if (self->private_data.s_do_decode_frame.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
36620
      self->private_data.s_do_decode_frame.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
36621
      iop_a_src = io2_a_src;
36622
      status = wuffs_base__make_status(wuffs_base__suspension__short_read);
36623
      goto suspend;
36624
    }
36625
    iop_a_src += self->private_data.s_do_decode_frame.scratch;
36626
    if ((self->private_impl.f_width > 0u) && (self->private_impl.f_height > 0u)) {
36627
      self->private_impl.f_dst_x = 0u;
36628
      if (self->private_impl.f_top_down) {
36629
        self->private_impl.f_dst_y = 0u;
36630
        self->private_impl.f_dst_y_inc = 1u;
36631
      } else {
36632
        self->private_impl.f_dst_y = ((uint32_t)(self->private_impl.f_height - 1u));
36633
        self->private_impl.f_dst_y_inc = 4294967295u;
36634
      }
36635
      v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler,
36636
          wuffs_base__pixel_buffer__pixel_format(a_dst),
36637
          wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_scratch, 1024, 2048)),
36638
          wuffs_base__utility__make_pixel_format(self->private_impl.f_src_pixfmt),
36639
          wuffs_base__make_slice_u8(self->private_data.f_src_palette, 1024),
36640
          a_blend);
36641
      if ( ! wuffs_base__status__is_ok(&v_status)) {
36642
        status = v_status;
36643
        if (wuffs_base__status__is_error(&status)) {
36644
          goto exit;
36645
        } else if (wuffs_base__status__is_suspension(&status)) {
36646
          status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
36647
          goto exit;
36648
        }
36649
        goto ok;
36650
      }
36651
      while (true) {
36652
        if (self->private_impl.f_compression == 0u) {
36653
          if (a_src) {
36654
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
36655
          }
36656
          v_status = wuffs_bmp__decoder__swizzle_none(self, a_dst, a_src);
36657
          if (a_src) {
36658
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
36659
          }
36660
        } else if (self->private_impl.f_compression < 3u) {
36661
          if (a_src) {
36662
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
36663
          }
36664
          v_status = wuffs_bmp__decoder__swizzle_rle(self, a_dst, a_src);
36665
          if (a_src) {
36666
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
36667
          }
36668
        } else if (self->private_impl.f_compression == 3u) {
36669
          if (a_src) {
36670
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
36671
          }
36672
          v_status = wuffs_bmp__decoder__swizzle_bitfields(self, a_dst, a_src);
36673
          if (a_src) {
36674
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
36675
          }
36676
        } else {
36677
          if (a_src) {
36678
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
36679
          }
36680
          v_status = wuffs_bmp__decoder__swizzle_low_bit_depth(self, a_dst, a_src);
36681
          if (a_src) {
36682
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
36683
          }
36684
        }
36685
        if (wuffs_base__status__is_ok(&v_status)) {
36686
          break;
36687
        } else if (v_status.repr != wuffs_bmp__note__internal_note_short_read) {
36688
          status = v_status;
36689
          if (wuffs_base__status__is_error(&status)) {
36690
            goto exit;
36691
          } else if (wuffs_base__status__is_suspension(&status)) {
36692
            status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
36693
            goto exit;
36694
          }
36695
          goto ok;
36696
        }
36697
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
36698
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3);
36699
      }
36700
      self->private_data.s_do_decode_frame.scratch = self->private_impl.f_pending_pad;
36701
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
36702
      if (self->private_data.s_do_decode_frame.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
36703
        self->private_data.s_do_decode_frame.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
36704
        iop_a_src = io2_a_src;
36705
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
36706
        goto suspend;
36707
      }
36708
      iop_a_src += self->private_data.s_do_decode_frame.scratch;
36709
      self->private_impl.f_pending_pad = 0u;
36710
    }
36711
    self->private_impl.f_call_sequence = 96u;
36712
36713
    ok:
36714
    self->private_impl.p_do_decode_frame = 0;
36715
    goto exit;
36716
  }
36717
36718
  goto suspend;
36719
  suspend:
36720
  self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
36721
36722
  goto exit;
36723
  exit:
36724
  if (a_src && a_src->data.ptr) {
36725
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
36726
  }
36727
36728
  return status;
36729
}
36730
36731
// -------- func bmp.decoder.swizzle_none
36732
36733
WUFFS_BASE__GENERATED_C_CODE
36734
static wuffs_base__status
36735
wuffs_bmp__decoder__swizzle_none(
36736
    wuffs_bmp__decoder* self,
36737
    wuffs_base__pixel_buffer* a_dst,
36738
    wuffs_base__io_buffer* a_src) {
36739
  wuffs_base__status status = wuffs_base__make_status(NULL);
36740
36741
  wuffs_base__pixel_format v_dst_pixfmt = {0};
36742
  uint32_t v_dst_bits_per_pixel = 0;
36743
  uint32_t v_dst_bytes_per_pixel = 0;
36744
  uint64_t v_dst_bytes_per_row = 0;
36745
  uint32_t v_src_bytes_per_pixel = 0;
36746
  wuffs_base__slice_u8 v_dst_palette = {0};
36747
  wuffs_base__table_u8 v_tab = {0};
36748
  wuffs_base__slice_u8 v_dst = {0};
36749
  uint64_t v_i = 0;
36750
  uint64_t v_j = 0;
36751
  uint64_t v_n = 0;
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
  v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
36765
  v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
36766
  if ((v_dst_bits_per_pixel & 7u) != 0u) {
36767
    status = wuffs_base__make_status(wuffs_base__error__unsupported_option);
36768
    goto exit;
36769
  }
36770
  v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u);
36771
  v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel)));
36772
  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));
36773
  v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
36774
  label__outer__continue:;
36775
  while (true) {
36776
    while (self->private_impl.f_pending_pad > 0u) {
36777
      if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
36778
        status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read);
36779
        goto ok;
36780
      }
36781
      self->private_impl.f_pending_pad -= 1u;
36782
      iop_a_src += 1u;
36783
    }
36784
    while (true) {
36785
      if (self->private_impl.f_dst_x == self->private_impl.f_width) {
36786
        self->private_impl.f_dst_x = 0u;
36787
        self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc;
36788
        if (self->private_impl.f_dst_y >= self->private_impl.f_height) {
36789
          if (self->private_impl.f_height > 0u) {
36790
            self->private_impl.f_pending_pad = self->private_impl.f_pad_per_row;
36791
          }
36792
          goto label__outer__break;
36793
        } else if (self->private_impl.f_pad_per_row != 0u) {
36794
          self->private_impl.f_pending_pad = self->private_impl.f_pad_per_row;
36795
          goto label__outer__continue;
36796
        }
36797
      }
36798
      v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y);
36799
      if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) {
36800
        v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row);
36801
      }
36802
      v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel)));
36803
      if (v_i >= ((uint64_t)(v_dst.len))) {
36804
        if (self->private_impl.f_bits_per_pixel > 32u) {
36805
          status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file);
36806
          goto exit;
36807
        }
36808
        v_src_bytes_per_pixel = (self->private_impl.f_bits_per_pixel / 8u);
36809
        if (v_src_bytes_per_pixel == 0u) {
36810
          status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file);
36811
          goto exit;
36812
        }
36813
        v_n = (((uint64_t)(io2_a_src - iop_a_src)) / ((uint64_t)(v_src_bytes_per_pixel)));
36814
        v_n = wuffs_base__u64__min(v_n, ((uint64_t)(((uint32_t)(self->private_impl.f_width - self->private_impl.f_dst_x)))));
36815
        v_j = v_n;
36816
        while (v_j >= 8u) {
36817
          if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 8u)))) {
36818
            iop_a_src += (v_src_bytes_per_pixel * 8u);
36819
          }
36820
          v_j -= 8u;
36821
        }
36822
        while (v_j > 0u) {
36823
          if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 1u)))) {
36824
            iop_a_src += (v_src_bytes_per_pixel * 1u);
36825
          }
36826
          v_j -= 1u;
36827
        }
36828
      } else {
36829
        v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_reader(
36830
            &self->private_impl.f_swizzler,
36831
            wuffs_base__slice_u8__subslice_i(v_dst, v_i),
36832
            v_dst_palette,
36833
            &iop_a_src,
36834
            io2_a_src);
36835
      }
36836
      if (v_n == 0u) {
36837
        status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read);
36838
        goto ok;
36839
      }
36840
      wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n)));
36841
    }
36842
  }
36843
  label__outer__break:;
36844
  status = wuffs_base__make_status(NULL);
36845
  goto ok;
36846
36847
  ok:
36848
  goto exit;
36849
  exit:
36850
  if (a_src && a_src->data.ptr) {
36851
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
36852
  }
36853
36854
  return status;
36855
}
36856
36857
// -------- func bmp.decoder.swizzle_rle
36858
36859
WUFFS_BASE__GENERATED_C_CODE
36860
static wuffs_base__status
36861
wuffs_bmp__decoder__swizzle_rle(
36862
    wuffs_bmp__decoder* self,
36863
    wuffs_base__pixel_buffer* a_dst,
36864
    wuffs_base__io_buffer* a_src) {
36865
  wuffs_base__status status = wuffs_base__make_status(NULL);
36866
36867
  wuffs_base__pixel_format v_dst_pixfmt = {0};
36868
  uint32_t v_dst_bits_per_pixel = 0;
36869
  uint32_t v_dst_bytes_per_pixel = 0;
36870
  uint64_t v_dst_bytes_per_row = 0;
36871
  wuffs_base__slice_u8 v_dst_palette = {0};
36872
  wuffs_base__table_u8 v_tab = {0};
36873
  wuffs_base__slice_u8 v_row = {0};
36874
  wuffs_base__slice_u8 v_dst = {0};
36875
  uint64_t v_i = 0;
36876
  uint64_t v_n = 0;
36877
  uint32_t v_p0 = 0;
36878
  uint8_t v_code = 0;
36879
  uint8_t v_indexes[2] = {0};
36880
  uint32_t v_rle_state = 0;
36881
  uint32_t v_chunk_bits = 0;
36882
  uint32_t v_chunk_count = 0;
36883
36884
  const uint8_t* iop_a_src = NULL;
36885
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
36886
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
36887
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
36888
  if (a_src && a_src->data.ptr) {
36889
    io0_a_src = a_src->data.ptr;
36890
    io1_a_src = io0_a_src + a_src->meta.ri;
36891
    iop_a_src = io1_a_src;
36892
    io2_a_src = io0_a_src + a_src->meta.wi;
36893
  }
36894
36895
  v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
36896
  v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
36897
  if ((v_dst_bits_per_pixel & 7u) != 0u) {
36898
    status = wuffs_base__make_status(wuffs_base__error__unsupported_option);
36899
    goto exit;
36900
  }
36901
  v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u);
36902
  v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel)));
36903
  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));
36904
  v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
36905
  v_rle_state = self->private_impl.f_rle_state;
36906
  label__outer__continue:;
36907
  while (true) {
36908
    v_row = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y);
36909
    if (v_dst_bytes_per_row < ((uint64_t)(v_row.len))) {
36910
      v_row = wuffs_base__slice_u8__subslice_j(v_row, v_dst_bytes_per_row);
36911
    }
36912
    label__middle__continue:;
36913
    while (true) {
36914
      v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel)));
36915
      if (v_i <= ((uint64_t)(v_row.len))) {
36916
        v_dst = wuffs_base__slice_u8__subslice_i(v_row, v_i);
36917
      } else {
36918
        v_dst = wuffs_base__utility__empty_slice_u8();
36919
      }
36920
      while (true) {
36921
        if (v_rle_state == 0u) {
36922
          if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) {
36923
            break;
36924
          }
36925
          v_code = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
36926
          iop_a_src += 1u;
36927
          if (v_code == 0u) {
36928
            v_rle_state = 2u;
36929
            continue;
36930
          }
36931
          self->private_impl.f_rle_length = ((uint32_t)(v_code));
36932
          v_rle_state = 1u;
36933
          continue;
36934
        } else if (v_rle_state == 1u) {
36935
          if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) {
36936
            break;
36937
          }
36938
          v_code = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
36939
          iop_a_src += 1u;
36940
          if (self->private_impl.f_bits_per_pixel == 8u) {
36941
            v_p0 = 0u;
36942
            while (v_p0 < self->private_impl.f_rle_length) {
36943
              self->private_data.f_scratch[v_p0] = v_code;
36944
              v_p0 += 1u;
36945
            }
36946
          } else {
36947
            v_indexes[0u] = ((uint8_t)(((uint8_t)(v_code >> 4u))));
36948
            v_indexes[1u] = ((uint8_t)(v_code & 15u));
36949
            v_p0 = 0u;
36950
            while (v_p0 < self->private_impl.f_rle_length) {
36951
              self->private_data.f_scratch[(v_p0 + 0u)] = v_indexes[0u];
36952
              self->private_data.f_scratch[(v_p0 + 1u)] = v_indexes[1u];
36953
              v_p0 += 2u;
36954
            }
36955
          }
36956
          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));
36957
          wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, self->private_impl.f_rle_length);
36958
          v_rle_state = 0u;
36959
          goto label__middle__continue;
36960
        } else if (v_rle_state == 2u) {
36961
          if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) {
36962
            break;
36963
          }
36964
          v_code = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
36965
          iop_a_src += 1u;
36966
          if (v_code < 2u) {
36967
            if ((self->private_impl.f_dst_y >= self->private_impl.f_height) && (v_code == 0u)) {
36968
              status = wuffs_base__make_status(wuffs_bmp__error__bad_rle_compression);
36969
              goto exit;
36970
            }
36971
            wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(&self->private_impl.f_swizzler, v_dst, v_dst_palette, 18446744073709551615u);
36972
            self->private_impl.f_dst_x = 0u;
36973
            self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc;
36974
            if (v_code > 0u) {
36975
              goto label__outer__break;
36976
            }
36977
            v_rle_state = 0u;
36978
            goto label__outer__continue;
36979
          } else if (v_code == 2u) {
36980
            v_rle_state = 4u;
36981
            continue;
36982
          }
36983
          self->private_impl.f_rle_length = ((uint32_t)(v_code));
36984
          self->private_impl.f_rle_padded = ((self->private_impl.f_bits_per_pixel == 8u) && (((uint8_t)(v_code & 1u)) != 0u));
36985
          v_rle_state = 3u;
36986
          continue;
36987
        } else if (v_rle_state == 3u) {
36988
          if (self->private_impl.f_bits_per_pixel == 8u) {
36989
            v_n = wuffs_base__pixel_swizzler__limited_swizzle_u32_interleaved_from_reader(
36990
                &self->private_impl.f_swizzler,
36991
                self->private_impl.f_rle_length,
36992
                v_dst,
36993
                v_dst_palette,
36994
                &iop_a_src,
36995
                io2_a_src);
36996
            wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n)));
36997
            wuffs_private_impl__u32__sat_sub_indirect(&self->private_impl.f_rle_length, ((uint32_t)(v_n)));
36998
          } else {
36999
            v_chunk_count = ((self->private_impl.f_rle_length + 3u) / 4u);
37000
            v_p0 = 0u;
37001
            while ((v_chunk_count > 0u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 2u)) {
37002
              v_chunk_bits = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src)));
37003
              iop_a_src += 2u;
37004
              self->private_data.f_scratch[(v_p0 + 0u)] = ((uint8_t)((15u & (v_chunk_bits >> 12u))));
37005
              self->private_data.f_scratch[(v_p0 + 1u)] = ((uint8_t)((15u & (v_chunk_bits >> 8u))));
37006
              self->private_data.f_scratch[(v_p0 + 2u)] = ((uint8_t)((15u & (v_chunk_bits >> 4u))));
37007
              self->private_data.f_scratch[(v_p0 + 3u)] = ((uint8_t)((15u & (v_chunk_bits >> 0u))));
37008
              v_p0 = ((v_p0 & 255u) + 4u);
37009
              v_chunk_count -= 1u;
37010
            }
37011
            v_p0 = wuffs_base__u32__min(v_p0, self->private_impl.f_rle_length);
37012
            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));
37013
            wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, v_p0);
37014
            wuffs_private_impl__u32__sat_sub_indirect(&self->private_impl.f_rle_length, v_p0);
37015
          }
37016
          if (self->private_impl.f_rle_length > 0u) {
37017
            break;
37018
          }
37019
          if (self->private_impl.f_rle_padded) {
37020
            if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) {
37021
              break;
37022
            }
37023
            iop_a_src += 1u;
37024
            self->private_impl.f_rle_padded = false;
37025
          }
37026
          v_rle_state = 0u;
37027
          goto label__middle__continue;
37028
        } else if (v_rle_state == 4u) {
37029
          if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) {
37030
            break;
37031
          }
37032
          self->private_impl.f_rle_delta_x = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
37033
          iop_a_src += 1u;
37034
          v_rle_state = 5u;
37035
          continue;
37036
        }
37037
        if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) {
37038
          break;
37039
        }
37040
        v_code = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
37041
        iop_a_src += 1u;
37042
        if (self->private_impl.f_rle_delta_x > 0u) {
37043
          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)));
37044
          wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(self->private_impl.f_rle_delta_x)));
37045
          self->private_impl.f_rle_delta_x = 0u;
37046
          if (self->private_impl.f_dst_x > self->private_impl.f_width) {
37047
            status = wuffs_base__make_status(wuffs_bmp__error__bad_rle_compression);
37048
            goto exit;
37049
          }
37050
        }
37051
        if (v_code > 0u) {
37052
#if defined(__GNUC__)
37053
#pragma GCC diagnostic push
37054
#pragma GCC diagnostic ignored "-Wconversion"
37055
#endif
37056
          v_code -= 1u;
37057
#if defined(__GNUC__)
37058
#pragma GCC diagnostic pop
37059
#endif
37060
          while (true) {
37061
            self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc;
37062
            if (self->private_impl.f_dst_y >= self->private_impl.f_height) {
37063
              status = wuffs_base__make_status(wuffs_bmp__error__bad_rle_compression);
37064
              goto exit;
37065
            }
37066
            v_row = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y);
37067
            if (v_dst_bytes_per_row < ((uint64_t)(v_row.len))) {
37068
              v_row = wuffs_base__slice_u8__subslice_j(v_row, v_dst_bytes_per_row);
37069
            }
37070
            if (v_code <= 0u) {
37071
              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)));
37072
              break;
37073
            }
37074
            wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(&self->private_impl.f_swizzler, v_row, v_dst_palette, 18446744073709551615u);
37075
#if defined(__GNUC__)
37076
#pragma GCC diagnostic push
37077
#pragma GCC diagnostic ignored "-Wconversion"
37078
#endif
37079
            v_code -= 1u;
37080
#if defined(__GNUC__)
37081
#pragma GCC diagnostic pop
37082
#endif
37083
          }
37084
        }
37085
        v_rle_state = 0u;
37086
        goto label__middle__continue;
37087
      }
37088
      self->private_impl.f_rle_state = v_rle_state;
37089
      status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read);
37090
      goto ok;
37091
    }
37092
  }
37093
  label__outer__break:;
37094
  while (self->private_impl.f_dst_y < self->private_impl.f_height) {
37095
    v_row = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y);
37096
    if (v_dst_bytes_per_row < ((uint64_t)(v_row.len))) {
37097
      v_row = wuffs_base__slice_u8__subslice_j(v_row, v_dst_bytes_per_row);
37098
    }
37099
    wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(&self->private_impl.f_swizzler, v_row, v_dst_palette, 18446744073709551615u);
37100
    self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc;
37101
  }
37102
  status = wuffs_base__make_status(NULL);
37103
  goto ok;
37104
37105
  ok:
37106
  goto exit;
37107
  exit:
37108
  if (a_src && a_src->data.ptr) {
37109
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
37110
  }
37111
37112
  return status;
37113
}
37114
37115
// -------- func bmp.decoder.swizzle_bitfields
37116
37117
WUFFS_BASE__GENERATED_C_CODE
37118
static wuffs_base__status
37119
wuffs_bmp__decoder__swizzle_bitfields(
37120
    wuffs_bmp__decoder* self,
37121
    wuffs_base__pixel_buffer* a_dst,
37122
    wuffs_base__io_buffer* a_src) {
37123
  wuffs_base__status status = wuffs_base__make_status(NULL);
37124
37125
  wuffs_base__pixel_format v_dst_pixfmt = {0};
37126
  uint32_t v_dst_bits_per_pixel = 0;
37127
  uint32_t v_dst_bytes_per_pixel = 0;
37128
  uint64_t v_dst_bytes_per_row = 0;
37129
  wuffs_base__slice_u8 v_dst_palette = {0};
37130
  wuffs_base__table_u8 v_tab = {0};
37131
  wuffs_base__slice_u8 v_dst = {0};
37132
  uint64_t v_i = 0;
37133
  uint64_t v_n = 0;
37134
  uint32_t v_p0 = 0;
37135
  uint32_t v_p1 = 0;
37136
  uint32_t v_p1_temp = 0;
37137
  uint32_t v_num_bits = 0;
37138
  uint32_t v_c = 0;
37139
  uint32_t v_c32 = 0;
37140
  uint32_t v_channel = 0;
37141
37142
  const uint8_t* iop_a_src = NULL;
37143
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
37144
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
37145
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
37146
  if (a_src && a_src->data.ptr) {
37147
    io0_a_src = a_src->data.ptr;
37148
    io1_a_src = io0_a_src + a_src->meta.ri;
37149
    iop_a_src = io1_a_src;
37150
    io2_a_src = io0_a_src + a_src->meta.wi;
37151
  }
37152
37153
  v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
37154
  v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
37155
  if ((v_dst_bits_per_pixel & 7u) != 0u) {
37156
    status = wuffs_base__make_status(wuffs_base__error__unsupported_option);
37157
    goto exit;
37158
  }
37159
  v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u);
37160
  v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel)));
37161
  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));
37162
  v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
37163
  label__outer__continue:;
37164
  while (true) {
37165
    while (self->private_impl.f_pending_pad > 0u) {
37166
      if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
37167
        status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read);
37168
        goto ok;
37169
      }
37170
      self->private_impl.f_pending_pad -= 1u;
37171
      iop_a_src += 1u;
37172
    }
37173
    while (true) {
37174
      if (self->private_impl.f_dst_x == self->private_impl.f_width) {
37175
        self->private_impl.f_dst_x = 0u;
37176
        self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc;
37177
        if (self->private_impl.f_dst_y >= self->private_impl.f_height) {
37178
          if (self->private_impl.f_height > 0u) {
37179
            self->private_impl.f_pending_pad = self->private_impl.f_pad_per_row;
37180
          }
37181
          goto label__outer__break;
37182
        } else if (self->private_impl.f_pad_per_row != 0u) {
37183
          self->private_impl.f_pending_pad = self->private_impl.f_pad_per_row;
37184
          goto label__outer__continue;
37185
        }
37186
      }
37187
      v_p1_temp = ((uint32_t)(self->private_impl.f_width - self->private_impl.f_dst_x));
37188
      v_p1 = wuffs_base__u32__min(v_p1_temp, 256u);
37189
      v_p0 = 0u;
37190
      while (v_p0 < v_p1) {
37191
        if (self->private_impl.f_bits_per_pixel == 16u) {
37192
          if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) {
37193
            break;
37194
          }
37195
          v_c32 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
37196
          iop_a_src += 2u;
37197
        } else {
37198
          if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) {
37199
            break;
37200
          }
37201
          v_c32 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
37202
          iop_a_src += 4u;
37203
        }
37204
        v_channel = 0u;
37205
        while (v_channel < 4u) {
37206
          if (self->private_impl.f_channel_num_bits[v_channel] == 0u) {
37207
            self->private_data.f_scratch[((8u * v_p0) + (2u * v_channel) + 0u)] = 255u;
37208
            self->private_data.f_scratch[((8u * v_p0) + (2u * v_channel) + 1u)] = 255u;
37209
          } else {
37210
            v_c = ((v_c32 & self->private_impl.f_channel_masks[v_channel]) >> self->private_impl.f_channel_shifts[v_channel]);
37211
            v_num_bits = ((uint32_t)(self->private_impl.f_channel_num_bits[v_channel]));
37212
            while (v_num_bits < 16u) {
37213
              v_c |= ((uint32_t)(v_c << v_num_bits));
37214
              v_num_bits *= 2u;
37215
            }
37216
            v_c >>= (v_num_bits - 16u);
37217
            self->private_data.f_scratch[((8u * v_p0) + (2u * v_channel) + 0u)] = ((uint8_t)((v_c >> 0u)));
37218
            self->private_data.f_scratch[((8u * v_p0) + (2u * v_channel) + 1u)] = ((uint8_t)((v_c >> 8u)));
37219
          }
37220
          v_channel += 1u;
37221
        }
37222
        v_p0 += 1u;
37223
      }
37224
      v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y);
37225
      if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) {
37226
        v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row);
37227
      }
37228
      v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel)));
37229
      if (v_i >= ((uint64_t)(v_dst.len))) {
37230
        v_n = ((uint64_t)(v_p0));
37231
      } else {
37232
        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)));
37233
      }
37234
      if (v_n == 0u) {
37235
        status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read);
37236
        goto ok;
37237
      }
37238
      wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n)));
37239
    }
37240
  }
37241
  label__outer__break:;
37242
  status = wuffs_base__make_status(NULL);
37243
  goto ok;
37244
37245
  ok:
37246
  goto exit;
37247
  exit:
37248
  if (a_src && a_src->data.ptr) {
37249
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
37250
  }
37251
37252
  return status;
37253
}
37254
37255
// -------- func bmp.decoder.swizzle_low_bit_depth
37256
37257
WUFFS_BASE__GENERATED_C_CODE
37258
static wuffs_base__status
37259
wuffs_bmp__decoder__swizzle_low_bit_depth(
37260
    wuffs_bmp__decoder* self,
37261
    wuffs_base__pixel_buffer* a_dst,
37262
    wuffs_base__io_buffer* a_src) {
37263
  wuffs_base__status status = wuffs_base__make_status(NULL);
37264
37265
  wuffs_base__pixel_format v_dst_pixfmt = {0};
37266
  uint32_t v_dst_bits_per_pixel = 0;
37267
  uint32_t v_dst_bytes_per_pixel = 0;
37268
  uint64_t v_dst_bytes_per_row = 0;
37269
  wuffs_base__slice_u8 v_dst_palette = {0};
37270
  wuffs_base__table_u8 v_tab = {0};
37271
  wuffs_base__slice_u8 v_dst = {0};
37272
  uint64_t v_i = 0;
37273
  uint64_t v_n = 0;
37274
  uint32_t v_p0 = 0;
37275
  uint32_t v_chunk_bits = 0;
37276
  uint32_t v_chunk_count = 0;
37277
  uint32_t v_pixels_per_chunk = 0;
37278
37279
  const uint8_t* iop_a_src = NULL;
37280
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
37281
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
37282
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
37283
  if (a_src && a_src->data.ptr) {
37284
    io0_a_src = a_src->data.ptr;
37285
    io1_a_src = io0_a_src + a_src->meta.ri;
37286
    iop_a_src = io1_a_src;
37287
    io2_a_src = io0_a_src + a_src->meta.wi;
37288
  }
37289
37290
  v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
37291
  v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
37292
  if ((v_dst_bits_per_pixel & 7u) != 0u) {
37293
    status = wuffs_base__make_status(wuffs_base__error__unsupported_option);
37294
    goto exit;
37295
  }
37296
  v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u);
37297
  v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel)));
37298
  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));
37299
  v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
37300
  while (true) {
37301
    if (self->private_impl.f_dst_x == self->private_impl.f_width) {
37302
      self->private_impl.f_dst_x = 0u;
37303
      self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc;
37304
      if (self->private_impl.f_dst_y >= self->private_impl.f_height) {
37305
        break;
37306
      }
37307
    }
37308
    v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y);
37309
    if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) {
37310
      v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row);
37311
    }
37312
    v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel)));
37313
    if (v_i >= ((uint64_t)(v_dst.len))) {
37314
      if (self->private_impl.f_bits_per_pixel == 1u) {
37315
        v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 31u) / 32u);
37316
        v_pixels_per_chunk = 32u;
37317
      } else if (self->private_impl.f_bits_per_pixel == 2u) {
37318
        v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 15u) / 16u);
37319
        v_pixels_per_chunk = 16u;
37320
      } else {
37321
        v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 7u) / 8u);
37322
        v_pixels_per_chunk = 8u;
37323
      }
37324
      while ((v_chunk_count >= 64u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 256u)) {
37325
        iop_a_src += 256u;
37326
        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))));
37327
        v_chunk_count -= 64u;
37328
      }
37329
      while ((v_chunk_count >= 8u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 32u)) {
37330
        iop_a_src += 32u;
37331
        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))));
37332
        v_chunk_count -= 8u;
37333
      }
37334
      while (v_chunk_count > 0u) {
37335
        if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) {
37336
          status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read);
37337
          goto ok;
37338
        }
37339
        iop_a_src += 4u;
37340
        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))));
37341
        v_chunk_count -= 1u;
37342
      }
37343
      continue;
37344
    }
37345
    v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_i);
37346
    v_p0 = 0u;
37347
    if (self->private_impl.f_bits_per_pixel == 1u) {
37348
      v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 31u) / 32u);
37349
      v_chunk_count = wuffs_base__u32__min(v_chunk_count, 16u);
37350
      while ((v_chunk_count > 0u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 4u)) {
37351
        v_chunk_bits = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
37352
        iop_a_src += 4u;
37353
        self->private_data.f_scratch[(v_p0 + 0u)] = ((uint8_t)((1u & (v_chunk_bits >> 31u))));
37354
        self->private_data.f_scratch[(v_p0 + 1u)] = ((uint8_t)((1u & (v_chunk_bits >> 30u))));
37355
        self->private_data.f_scratch[(v_p0 + 2u)] = ((uint8_t)((1u & (v_chunk_bits >> 29u))));
37356
        self->private_data.f_scratch[(v_p0 + 3u)] = ((uint8_t)((1u & (v_chunk_bits >> 28u))));
37357
        self->private_data.f_scratch[(v_p0 + 4u)] = ((uint8_t)((1u & (v_chunk_bits >> 27u))));
37358
        self->private_data.f_scratch[(v_p0 + 5u)] = ((uint8_t)((1u & (v_chunk_bits >> 26u))));
37359
        self->private_data.f_scratch[(v_p0 + 6u)] = ((uint8_t)((1u & (v_chunk_bits >> 25u))));
37360
        self->private_data.f_scratch[(v_p0 + 7u)] = ((uint8_t)((1u & (v_chunk_bits >> 24u))));
37361
        self->private_data.f_scratch[(v_p0 + 8u)] = ((uint8_t)((1u & (v_chunk_bits >> 23u))));
37362
        self->private_data.f_scratch[(v_p0 + 9u)] = ((uint8_t)((1u & (v_chunk_bits >> 22u))));
37363
        self->private_data.f_scratch[(v_p0 + 10u)] = ((uint8_t)((1u & (v_chunk_bits >> 21u))));
37364
        self->private_data.f_scratch[(v_p0 + 11u)] = ((uint8_t)((1u & (v_chunk_bits >> 20u))));
37365
        self->private_data.f_scratch[(v_p0 + 12u)] = ((uint8_t)((1u & (v_chunk_bits >> 19u))));
37366
        self->private_data.f_scratch[(v_p0 + 13u)] = ((uint8_t)((1u & (v_chunk_bits >> 18u))));
37367
        self->private_data.f_scratch[(v_p0 + 14u)] = ((uint8_t)((1u & (v_chunk_bits >> 17u))));
37368
        self->private_data.f_scratch[(v_p0 + 15u)] = ((uint8_t)((1u & (v_chunk_bits >> 16u))));
37369
        self->private_data.f_scratch[(v_p0 + 16u)] = ((uint8_t)((1u & (v_chunk_bits >> 15u))));
37370
        self->private_data.f_scratch[(v_p0 + 17u)] = ((uint8_t)((1u & (v_chunk_bits >> 14u))));
37371
        self->private_data.f_scratch[(v_p0 + 18u)] = ((uint8_t)((1u & (v_chunk_bits >> 13u))));
37372
        self->private_data.f_scratch[(v_p0 + 19u)] = ((uint8_t)((1u & (v_chunk_bits >> 12u))));
37373
        self->private_data.f_scratch[(v_p0 + 20u)] = ((uint8_t)((1u & (v_chunk_bits >> 11u))));
37374
        self->private_data.f_scratch[(v_p0 + 21u)] = ((uint8_t)((1u & (v_chunk_bits >> 10u))));
37375
        self->private_data.f_scratch[(v_p0 + 22u)] = ((uint8_t)((1u & (v_chunk_bits >> 9u))));
37376
        self->private_data.f_scratch[(v_p0 + 23u)] = ((uint8_t)((1u & (v_chunk_bits >> 8u))));
37377
        self->private_data.f_scratch[(v_p0 + 24u)] = ((uint8_t)((1u & (v_chunk_bits >> 7u))));
37378
        self->private_data.f_scratch[(v_p0 + 25u)] = ((uint8_t)((1u & (v_chunk_bits >> 6u))));
37379
        self->private_data.f_scratch[(v_p0 + 26u)] = ((uint8_t)((1u & (v_chunk_bits >> 5u))));
37380
        self->private_data.f_scratch[(v_p0 + 27u)] = ((uint8_t)((1u & (v_chunk_bits >> 4u))));
37381
        self->private_data.f_scratch[(v_p0 + 28u)] = ((uint8_t)((1u & (v_chunk_bits >> 3u))));
37382
        self->private_data.f_scratch[(v_p0 + 29u)] = ((uint8_t)((1u & (v_chunk_bits >> 2u))));
37383
        self->private_data.f_scratch[(v_p0 + 30u)] = ((uint8_t)((1u & (v_chunk_bits >> 1u))));
37384
        self->private_data.f_scratch[(v_p0 + 31u)] = ((uint8_t)((1u & (v_chunk_bits >> 0u))));
37385
        v_p0 = ((v_p0 & 511u) + 32u);
37386
        v_chunk_count -= 1u;
37387
      }
37388
    } else if (self->private_impl.f_bits_per_pixel == 2u) {
37389
      v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 15u) / 16u);
37390
      v_chunk_count = wuffs_base__u32__min(v_chunk_count, 32u);
37391
      while ((v_chunk_count > 0u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 4u)) {
37392
        v_chunk_bits = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
37393
        iop_a_src += 4u;
37394
        self->private_data.f_scratch[(v_p0 + 0u)] = ((uint8_t)((3u & (v_chunk_bits >> 30u))));
37395
        self->private_data.f_scratch[(v_p0 + 1u)] = ((uint8_t)((3u & (v_chunk_bits >> 28u))));
37396
        self->private_data.f_scratch[(v_p0 + 2u)] = ((uint8_t)((3u & (v_chunk_bits >> 26u))));
37397
        self->private_data.f_scratch[(v_p0 + 3u)] = ((uint8_t)((3u & (v_chunk_bits >> 24u))));
37398
        self->private_data.f_scratch[(v_p0 + 4u)] = ((uint8_t)((3u & (v_chunk_bits >> 22u))));
37399
        self->private_data.f_scratch[(v_p0 + 5u)] = ((uint8_t)((3u & (v_chunk_bits >> 20u))));
37400
        self->private_data.f_scratch[(v_p0 + 6u)] = ((uint8_t)((3u & (v_chunk_bits >> 18u))));
37401
        self->private_data.f_scratch[(v_p0 + 7u)] = ((uint8_t)((3u & (v_chunk_bits >> 16u))));
37402
        self->private_data.f_scratch[(v_p0 + 8u)] = ((uint8_t)((3u & (v_chunk_bits >> 14u))));
37403
        self->private_data.f_scratch[(v_p0 + 9u)] = ((uint8_t)((3u & (v_chunk_bits >> 12u))));
37404
        self->private_data.f_scratch[(v_p0 + 10u)] = ((uint8_t)((3u & (v_chunk_bits >> 10u))));
37405
        self->private_data.f_scratch[(v_p0 + 11u)] = ((uint8_t)((3u & (v_chunk_bits >> 8u))));
37406
        self->private_data.f_scratch[(v_p0 + 12u)] = ((uint8_t)((3u & (v_chunk_bits >> 6u))));
37407
        self->private_data.f_scratch[(v_p0 + 13u)] = ((uint8_t)((3u & (v_chunk_bits >> 4u))));
37408
        self->private_data.f_scratch[(v_p0 + 14u)] = ((uint8_t)((3u & (v_chunk_bits >> 2u))));
37409
        self->private_data.f_scratch[(v_p0 + 15u)] = ((uint8_t)((3u & (v_chunk_bits >> 0u))));
37410
        v_p0 = ((v_p0 & 511u) + 16u);
37411
        v_chunk_count -= 1u;
37412
      }
37413
    } else {
37414
      v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 7u) / 8u);
37415
      v_chunk_count = wuffs_base__u32__min(v_chunk_count, 64u);
37416
      while ((v_chunk_count > 0u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 4u)) {
37417
        v_chunk_bits = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
37418
        iop_a_src += 4u;
37419
        self->private_data.f_scratch[(v_p0 + 0u)] = ((uint8_t)((15u & (v_chunk_bits >> 28u))));
37420
        self->private_data.f_scratch[(v_p0 + 1u)] = ((uint8_t)((15u & (v_chunk_bits >> 24u))));
37421
        self->private_data.f_scratch[(v_p0 + 2u)] = ((uint8_t)((15u & (v_chunk_bits >> 20u))));
37422
        self->private_data.f_scratch[(v_p0 + 3u)] = ((uint8_t)((15u & (v_chunk_bits >> 16u))));
37423
        self->private_data.f_scratch[(v_p0 + 4u)] = ((uint8_t)((15u & (v_chunk_bits >> 12u))));
37424
        self->private_data.f_scratch[(v_p0 + 5u)] = ((uint8_t)((15u & (v_chunk_bits >> 8u))));
37425
        self->private_data.f_scratch[(v_p0 + 6u)] = ((uint8_t)((15u & (v_chunk_bits >> 4u))));
37426
        self->private_data.f_scratch[(v_p0 + 7u)] = ((uint8_t)((15u & (v_chunk_bits >> 0u))));
37427
        v_p0 = ((v_p0 & 511u) + 8u);
37428
        v_chunk_count -= 1u;
37429
      }
37430
    }
37431
    v_p0 = wuffs_base__u32__min(v_p0, wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x));
37432
    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));
37433
    if (v_n == 0u) {
37434
      status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read);
37435
      goto ok;
37436
    }
37437
    wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n)));
37438
  }
37439
  status = wuffs_base__make_status(NULL);
37440
  goto ok;
37441
37442
  ok:
37443
  goto exit;
37444
  exit:
37445
  if (a_src && a_src->data.ptr) {
37446
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
37447
  }
37448
37449
  return status;
37450
}
37451
37452
// -------- func bmp.decoder.frame_dirty_rect
37453
37454
WUFFS_BASE__GENERATED_C_CODE
37455
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
37456
wuffs_bmp__decoder__frame_dirty_rect(
37457
    const wuffs_bmp__decoder* self) {
37458
  if (!self) {
37459
    return wuffs_base__utility__empty_rect_ie_u32();
37460
  }
37461
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
37462
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
37463
    return wuffs_base__utility__empty_rect_ie_u32();
37464
  }
37465
37466
  return wuffs_base__utility__make_rect_ie_u32(
37467
      0u,
37468
      0u,
37469
      self->private_impl.f_width,
37470
      self->private_impl.f_height);
37471
}
37472
37473
// -------- func bmp.decoder.num_animation_loops
37474
37475
WUFFS_BASE__GENERATED_C_CODE
37476
WUFFS_BASE__MAYBE_STATIC uint32_t
37477
wuffs_bmp__decoder__num_animation_loops(
37478
    const wuffs_bmp__decoder* self) {
37479
  if (!self) {
37480
    return 0;
37481
  }
37482
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
37483
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
37484
    return 0;
37485
  }
37486
37487
  return 0u;
37488
}
37489
37490
// -------- func bmp.decoder.num_decoded_frame_configs
37491
37492
WUFFS_BASE__GENERATED_C_CODE
37493
WUFFS_BASE__MAYBE_STATIC uint64_t
37494
wuffs_bmp__decoder__num_decoded_frame_configs(
37495
    const wuffs_bmp__decoder* self) {
37496
  if (!self) {
37497
    return 0;
37498
  }
37499
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
37500
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
37501
    return 0;
37502
  }
37503
37504
  if (self->private_impl.f_call_sequence > 32u) {
37505
    return 1u;
37506
  }
37507
  return 0u;
37508
}
37509
37510
// -------- func bmp.decoder.num_decoded_frames
37511
37512
WUFFS_BASE__GENERATED_C_CODE
37513
WUFFS_BASE__MAYBE_STATIC uint64_t
37514
wuffs_bmp__decoder__num_decoded_frames(
37515
    const wuffs_bmp__decoder* self) {
37516
  if (!self) {
37517
    return 0;
37518
  }
37519
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
37520
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
37521
    return 0;
37522
  }
37523
37524
  if (self->private_impl.f_call_sequence > 64u) {
37525
    return 1u;
37526
  }
37527
  return 0u;
37528
}
37529
37530
// -------- func bmp.decoder.restart_frame
37531
37532
WUFFS_BASE__GENERATED_C_CODE
37533
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
37534
wuffs_bmp__decoder__restart_frame(
37535
    wuffs_bmp__decoder* self,
37536
    uint64_t a_index,
37537
    uint64_t a_io_position) {
37538
  if (!self) {
37539
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
37540
  }
37541
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
37542
    return wuffs_base__make_status(
37543
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
37544
        ? wuffs_base__error__disabled_by_previous_error
37545
        : wuffs_base__error__initialize_not_called);
37546
  }
37547
37548
  if (self->private_impl.f_call_sequence < 32u) {
37549
    return wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
37550
  }
37551
  if (a_index != 0u) {
37552
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
37553
  }
37554
  self->private_impl.f_call_sequence = 40u;
37555
  self->private_impl.f_frame_config_io_position = a_io_position;
37556
  return wuffs_base__make_status(NULL);
37557
}
37558
37559
// -------- func bmp.decoder.set_report_metadata
37560
37561
WUFFS_BASE__GENERATED_C_CODE
37562
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
37563
wuffs_bmp__decoder__set_report_metadata(
37564
    wuffs_bmp__decoder* self,
37565
    uint32_t a_fourcc,
37566
    bool a_report) {
37567
  return wuffs_base__make_empty_struct();
37568
}
37569
37570
// -------- func bmp.decoder.tell_me_more
37571
37572
WUFFS_BASE__GENERATED_C_CODE
37573
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
37574
wuffs_bmp__decoder__tell_me_more(
37575
    wuffs_bmp__decoder* self,
37576
    wuffs_base__io_buffer* a_dst,
37577
    wuffs_base__more_information* a_minfo,
37578
    wuffs_base__io_buffer* a_src) {
37579
  if (!self) {
37580
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
37581
  }
37582
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
37583
    return wuffs_base__make_status(
37584
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
37585
        ? wuffs_base__error__disabled_by_previous_error
37586
        : wuffs_base__error__initialize_not_called);
37587
  }
37588
  if (!a_dst || !a_src) {
37589
    self->private_impl.magic = WUFFS_BASE__DISABLED;
37590
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
37591
  }
37592
  if ((self->private_impl.active_coroutine != 0) &&
37593
      (self->private_impl.active_coroutine != 4)) {
37594
    self->private_impl.magic = WUFFS_BASE__DISABLED;
37595
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
37596
  }
37597
  self->private_impl.active_coroutine = 0;
37598
  wuffs_base__status status = wuffs_base__make_status(NULL);
37599
37600
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
37601
37602
  uint32_t coro_susp_point = self->private_impl.p_tell_me_more;
37603
  switch (coro_susp_point) {
37604
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
37605
37606
    while (true) {
37607
      {
37608
        wuffs_base__status t_0 = wuffs_bmp__decoder__do_tell_me_more(self, a_dst, a_minfo, a_src);
37609
        v_status = t_0;
37610
      }
37611
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
37612
        status = wuffs_base__make_status(wuffs_bmp__error__truncated_input);
37613
        goto exit;
37614
      }
37615
      status = v_status;
37616
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
37617
    }
37618
37619
    ok:
37620
    self->private_impl.p_tell_me_more = 0;
37621
    goto exit;
37622
  }
37623
37624
  goto suspend;
37625
  suspend:
37626
  self->private_impl.p_tell_me_more = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
37627
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 4 : 0;
37628
37629
  goto exit;
37630
  exit:
37631
  if (wuffs_base__status__is_error(&status)) {
37632
    self->private_impl.magic = WUFFS_BASE__DISABLED;
37633
  }
37634
  return status;
37635
}
37636
37637
// -------- func bmp.decoder.do_tell_me_more
37638
37639
WUFFS_BASE__GENERATED_C_CODE
37640
static wuffs_base__status
37641
wuffs_bmp__decoder__do_tell_me_more(
37642
    wuffs_bmp__decoder* self,
37643
    wuffs_base__io_buffer* a_dst,
37644
    wuffs_base__more_information* a_minfo,
37645
    wuffs_base__io_buffer* a_src) {
37646
  wuffs_base__status status = wuffs_base__make_status(NULL);
37647
37648
  if (self->private_impl.f_io_redirect_fourcc <= 1u) {
37649
    status = wuffs_base__make_status(wuffs_base__error__no_more_information);
37650
    goto exit;
37651
  }
37652
  if (a_minfo != NULL) {
37653
    wuffs_base__more_information__set(a_minfo,
37654
        1u,
37655
        self->private_impl.f_io_redirect_fourcc,
37656
        0u,
37657
        self->private_impl.f_io_redirect_pos,
37658
        18446744073709551615u);
37659
  }
37660
  self->private_impl.f_io_redirect_fourcc = 1u;
37661
37662
  goto ok;
37663
  ok:
37664
  goto exit;
37665
  exit:
37666
  return status;
37667
}
37668
37669
// -------- func bmp.decoder.workbuf_len
37670
37671
WUFFS_BASE__GENERATED_C_CODE
37672
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
37673
wuffs_bmp__decoder__workbuf_len(
37674
    const wuffs_bmp__decoder* self) {
37675
  if (!self) {
37676
    return wuffs_base__utility__empty_range_ii_u64();
37677
  }
37678
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
37679
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
37680
    return wuffs_base__utility__empty_range_ii_u64();
37681
  }
37682
37683
  return wuffs_base__utility__make_range_ii_u64(0u, 0u);
37684
}
37685
37686
// -------- func bmp.decoder.read_palette
37687
37688
WUFFS_BASE__GENERATED_C_CODE
37689
static wuffs_base__status
37690
wuffs_bmp__decoder__read_palette(
37691
    wuffs_bmp__decoder* self,
37692
    wuffs_base__io_buffer* a_src) {
37693
  wuffs_base__status status = wuffs_base__make_status(NULL);
37694
37695
  uint32_t v_i = 0;
37696
  uint32_t v_argb = 0;
37697
37698
  const uint8_t* iop_a_src = NULL;
37699
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
37700
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
37701
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
37702
  if (a_src && a_src->data.ptr) {
37703
    io0_a_src = a_src->data.ptr;
37704
    io1_a_src = io0_a_src + a_src->meta.ri;
37705
    iop_a_src = io1_a_src;
37706
    io2_a_src = io0_a_src + a_src->meta.wi;
37707
  }
37708
37709
  uint32_t coro_susp_point = self->private_impl.p_read_palette;
37710
  if (coro_susp_point) {
37711
    v_i = self->private_data.s_read_palette.v_i;
37712
  }
37713
  switch (coro_susp_point) {
37714
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
37715
37716
    if (self->private_impl.f_bitmap_info_len == 12u) {
37717
      while ((v_i < 256u) && (self->private_impl.f_padding >= 3u)) {
37718
        self->private_impl.f_padding -= 3u;
37719
        {
37720
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
37721
          uint32_t t_0;
37722
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) {
37723
            t_0 = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src)));
37724
            iop_a_src += 3;
37725
          } else {
37726
            self->private_data.s_read_palette.scratch = 0;
37727
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
37728
            while (true) {
37729
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
37730
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
37731
                goto suspend;
37732
              }
37733
              uint64_t* scratch = &self->private_data.s_read_palette.scratch;
37734
              uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
37735
              *scratch <<= 8;
37736
              *scratch >>= 8;
37737
              *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
37738
              if (num_bits_0 == 16) {
37739
                t_0 = ((uint32_t)(*scratch));
37740
                break;
37741
              }
37742
              num_bits_0 += 8u;
37743
              *scratch |= ((uint64_t)(num_bits_0)) << 56;
37744
            }
37745
          }
37746
          v_argb = t_0;
37747
        }
37748
        v_argb |= 4278190080u;
37749
        self->private_data.f_src_palette[((4u * v_i) + 0u)] = ((uint8_t)((v_argb >> 0u)));
37750
        self->private_data.f_src_palette[((4u * v_i) + 1u)] = ((uint8_t)((v_argb >> 8u)));
37751
        self->private_data.f_src_palette[((4u * v_i) + 2u)] = ((uint8_t)((v_argb >> 16u)));
37752
        self->private_data.f_src_palette[((4u * v_i) + 3u)] = ((uint8_t)((v_argb >> 24u)));
37753
        v_i += 1u;
37754
      }
37755
    } else {
37756
      while ((v_i < 256u) && (self->private_impl.f_padding >= 4u)) {
37757
        self->private_impl.f_padding -= 4u;
37758
        {
37759
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
37760
          uint32_t t_1;
37761
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
37762
            t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
37763
            iop_a_src += 4;
37764
          } else {
37765
            self->private_data.s_read_palette.scratch = 0;
37766
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
37767
            while (true) {
37768
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
37769
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
37770
                goto suspend;
37771
              }
37772
              uint64_t* scratch = &self->private_data.s_read_palette.scratch;
37773
              uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
37774
              *scratch <<= 8;
37775
              *scratch >>= 8;
37776
              *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
37777
              if (num_bits_1 == 24) {
37778
                t_1 = ((uint32_t)(*scratch));
37779
                break;
37780
              }
37781
              num_bits_1 += 8u;
37782
              *scratch |= ((uint64_t)(num_bits_1)) << 56;
37783
            }
37784
          }
37785
          v_argb = t_1;
37786
        }
37787
        v_argb |= 4278190080u;
37788
        self->private_data.f_src_palette[((4u * v_i) + 0u)] = ((uint8_t)((v_argb >> 0u)));
37789
        self->private_data.f_src_palette[((4u * v_i) + 1u)] = ((uint8_t)((v_argb >> 8u)));
37790
        self->private_data.f_src_palette[((4u * v_i) + 2u)] = ((uint8_t)((v_argb >> 16u)));
37791
        self->private_data.f_src_palette[((4u * v_i) + 3u)] = ((uint8_t)((v_argb >> 24u)));
37792
        v_i += 1u;
37793
      }
37794
    }
37795
    while (v_i < 256u) {
37796
      self->private_data.f_src_palette[((4u * v_i) + 0u)] = 0u;
37797
      self->private_data.f_src_palette[((4u * v_i) + 1u)] = 0u;
37798
      self->private_data.f_src_palette[((4u * v_i) + 2u)] = 0u;
37799
      self->private_data.f_src_palette[((4u * v_i) + 3u)] = 255u;
37800
      v_i += 1u;
37801
    }
37802
37803
    goto ok;
37804
    ok:
37805
    self->private_impl.p_read_palette = 0;
37806
    goto exit;
37807
  }
37808
37809
  goto suspend;
37810
  suspend:
37811
  self->private_impl.p_read_palette = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
37812
  self->private_data.s_read_palette.v_i = v_i;
37813
37814
  goto exit;
37815
  exit:
37816
  if (a_src && a_src->data.ptr) {
37817
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
37818
  }
37819
37820
  return status;
37821
}
37822
37823
// -------- func bmp.decoder.process_masks
37824
37825
WUFFS_BASE__GENERATED_C_CODE
37826
static wuffs_base__status
37827
wuffs_bmp__decoder__process_masks(
37828
    wuffs_bmp__decoder* self) {
37829
  wuffs_base__status status = wuffs_base__make_status(NULL);
37830
37831
  uint32_t v_i = 0;
37832
  uint32_t v_mask = 0;
37833
  uint32_t v_n = 0;
37834
37835
  while (v_i < 4u) {
37836
    v_mask = self->private_impl.f_channel_masks[v_i];
37837
    if (v_mask != 0u) {
37838
      v_n = 0u;
37839
      while ((v_mask & 1u) == 0u) {
37840
        v_n += 1u;
37841
        v_mask >>= 1u;
37842
      }
37843
      self->private_impl.f_channel_shifts[v_i] = ((uint8_t)((v_n & 31u)));
37844
      v_n = 0u;
37845
      while ((v_mask & 1u) == 1u) {
37846
        v_n += 1u;
37847
        v_mask >>= 1u;
37848
      }
37849
      if ((v_mask != 0u) || (v_n > 32u)) {
37850
        status = wuffs_base__make_status(wuffs_bmp__error__bad_header);
37851
        goto exit;
37852
      }
37853
      self->private_impl.f_channel_num_bits[v_i] = ((uint8_t)(v_n));
37854
    } else if (v_i != 3u) {
37855
      status = wuffs_base__make_status(wuffs_bmp__error__bad_header);
37856
      goto exit;
37857
    }
37858
    v_i += 1u;
37859
  }
37860
37861
  goto ok;
37862
  ok:
37863
  goto exit;
37864
  exit:
37865
  return status;
37866
}
37867
37868
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BMP)
37869
37870
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BZIP2)
37871
37872
// ---------------- Status Codes Implementations
37873
37874
const char wuffs_bzip2__error__bad_huffman_code_over_subscribed[] = "#bzip2: bad Huffman code (over-subscribed)";
37875
const char wuffs_bzip2__error__bad_huffman_code_under_subscribed[] = "#bzip2: bad Huffman code (under-subscribed)";
37876
const char wuffs_bzip2__error__bad_block_header[] = "#bzip2: bad block header";
37877
const char wuffs_bzip2__error__bad_block_length[] = "#bzip2: bad block length";
37878
const char wuffs_bzip2__error__bad_checksum[] = "#bzip2: bad checksum";
37879
const char wuffs_bzip2__error__bad_header[] = "#bzip2: bad header";
37880
const char wuffs_bzip2__error__bad_number_of_sections[] = "#bzip2: bad number of sections";
37881
const char wuffs_bzip2__error__truncated_input[] = "#bzip2: truncated input";
37882
const char wuffs_bzip2__error__unsupported_block_randomization[] = "#bzip2: unsupported block randomization";
37883
const char wuffs_bzip2__error__internal_error_inconsistent_huffman_decoder_state[] = "#bzip2: internal error: inconsistent Huffman decoder state";
37884
37885
// ---------------- Private Consts
37886
37887
static const uint8_t
37888
WUFFS_BZIP2__CLAMP_TO_5[8] WUFFS_BASE__POTENTIALLY_UNUSED = {
37889
  0u, 1u, 2u, 3u, 4u, 5u, 5u, 5u,
37890
};
37891
37892
static const uint32_t
37893
WUFFS_BZIP2__REV_CRC32_TABLE[256] WUFFS_BASE__POTENTIALLY_UNUSED = {
37894
  0u, 79764919u, 159529838u, 222504665u, 319059676u, 398814059u, 445009330u, 507990021u,
37895
  638119352u, 583659535u, 797628118u, 726387553u, 890018660u, 835552979u, 1015980042u, 944750013u,
37896
  1276238704u, 1221641927u, 1167319070u, 1095957929u, 1595256236u, 1540665371u, 1452775106u, 1381403509u,
37897
  1780037320u, 1859660671u, 1671105958u, 1733955601u, 2031960084u, 2111593891u, 1889500026u, 1952343757u,
37898
  2552477408u, 2632100695u, 2443283854u, 2506133561u, 2334638140u, 2414271883u, 2191915858u, 2254759653u,
37899
  3190512472u, 3135915759u, 3081330742u, 3009969537u, 2905550212u, 2850959411u, 2762807018u, 2691435357u,
37900
  3560074640u, 3505614887u, 3719321342u, 3648080713u, 3342211916u, 3287746299u, 3467911202u, 3396681109u,
37901
  4063920168u, 4143685023u, 4223187782u, 4286162673u, 3779000052u, 3858754371u, 3904687514u, 3967668269u,
37902
  881225847u, 809987520u, 1023691545u, 969234094u, 662832811u, 591600412u, 771767749u, 717299826u,
37903
  311336399u, 374308984u, 453813921u, 533576470u, 25881363u, 88864420u, 134795389u, 214552010u,
37904
  2023205639u, 2086057648u, 1897238633u, 1976864222u, 1804852699u, 1867694188u, 1645340341u, 1724971778u,
37905
  1587496639u, 1516133128u, 1461550545u, 1406951526u, 1302016099u, 1230646740u, 1142491917u, 1087903418u,
37906
  2896545431u, 2825181984u, 2770861561u, 2716262478u, 3215044683u, 3143675388u, 3055782693u, 3001194130u,
37907
  2326604591u, 2389456536u, 2200899649u, 2280525302u, 2578013683u, 2640855108u, 2418763421u, 2498394922u,
37908
  3769900519u, 3832873040u, 3912640137u, 3992402750u, 4088425275u, 4151408268u, 4197601365u, 4277358050u,
37909
  3334271071u, 3263032808u, 3476998961u, 3422541446u, 3585640067u, 3514407732u, 3694837229u, 3640369242u,
37910
  1762451694u, 1842216281u, 1619975040u, 1682949687u, 2047383090u, 2127137669u, 1938468188u, 2001449195u,
37911
  1325665622u, 1271206113u, 1183200824u, 1111960463u, 1543535498u, 1489069629u, 1434599652u, 1363369299u,
37912
  622672798u, 568075817u, 748617968u, 677256519u, 907627842u, 853037301u, 1067152940u, 995781531u,
37913
  51762726u, 131386257u, 177728840u, 240578815u, 269590778u, 349224269u, 429104020u, 491947555u,
37914
  4046411278u, 4126034873u, 4172115296u, 4234965207u, 3794477266u, 3874110821u, 3953728444u, 4016571915u,
37915
  3609705398u, 3555108353u, 3735388376u, 3664026991u, 3290680682u, 3236090077u, 3449943556u, 3378572211u,
37916
  3174993278u, 3120533705u, 3032266256u, 2961025959u, 2923101090u, 2868635157u, 2813903052u, 2742672763u,
37917
  2604032198u, 2683796849u, 2461293480u, 2524268063u, 2284983834u, 2364738477u, 2175806836u, 2238787779u,
37918
  1569362073u, 1498123566u, 1409854455u, 1355396672u, 1317987909u, 1246755826u, 1192025387u, 1137557660u,
37919
  2072149281u, 2135122070u, 1912620623u, 1992383480u, 1753615357u, 1816598090u, 1627664531u, 1707420964u,
37920
  295390185u, 358241886u, 404320391u, 483945776u, 43990325u, 106832002u, 186451547u, 266083308u,
37921
  932423249u, 861060070u, 1041341759u, 986742920u, 613929101u, 542559546u, 756411363u, 701822548u,
37922
  3316196985u, 3244833742u, 3425377559u, 3370778784u, 3601682597u, 3530312978u, 3744426955u, 3689838204u,
37923
  3819031489u, 3881883254u, 3928223919u, 4007849240u, 4037393693u, 4100235434u, 4180117107u, 4259748804u,
37924
  2310601993u, 2373574846u, 2151335527u, 2231098320u, 2596047829u, 2659030626u, 2470359227u, 2550115596u,
37925
  2947551409u, 2876312838u, 2788305887u, 2733848168u, 3165939309u, 3094707162u, 3040238851u, 2985771188u,
37926
};
37927
37928
// ---------------- Private Initializer Prototypes
37929
37930
// ---------------- Private Function Prototypes
37931
37932
WUFFS_BASE__GENERATED_C_CODE
37933
static wuffs_base__status
37934
wuffs_bzip2__decoder__do_transform_io(
37935
    wuffs_bzip2__decoder* self,
37936
    wuffs_base__io_buffer* a_dst,
37937
    wuffs_base__io_buffer* a_src,
37938
    wuffs_base__slice_u8 a_workbuf);
37939
37940
WUFFS_BASE__GENERATED_C_CODE
37941
static wuffs_base__status
37942
wuffs_bzip2__decoder__prepare_block(
37943
    wuffs_bzip2__decoder* self,
37944
    wuffs_base__io_buffer* a_src);
37945
37946
WUFFS_BASE__GENERATED_C_CODE
37947
static wuffs_base__status
37948
wuffs_bzip2__decoder__read_code_lengths(
37949
    wuffs_bzip2__decoder* self,
37950
    wuffs_base__io_buffer* a_src);
37951
37952
WUFFS_BASE__GENERATED_C_CODE
37953
static wuffs_base__status
37954
wuffs_bzip2__decoder__build_huffman_tree(
37955
    wuffs_bzip2__decoder* self,
37956
    uint32_t a_which);
37957
37958
WUFFS_BASE__GENERATED_C_CODE
37959
static wuffs_base__empty_struct
37960
wuffs_bzip2__decoder__build_huffman_table(
37961
    wuffs_bzip2__decoder* self,
37962
    uint32_t a_which);
37963
37964
WUFFS_BASE__GENERATED_C_CODE
37965
static wuffs_base__empty_struct
37966
wuffs_bzip2__decoder__invert_bwt(
37967
    wuffs_bzip2__decoder* self);
37968
37969
WUFFS_BASE__GENERATED_C_CODE
37970
static wuffs_base__empty_struct
37971
wuffs_bzip2__decoder__flush_fast(
37972
    wuffs_bzip2__decoder* self,
37973
    wuffs_base__io_buffer* a_dst);
37974
37975
WUFFS_BASE__GENERATED_C_CODE
37976
static wuffs_base__status
37977
wuffs_bzip2__decoder__flush_slow(
37978
    wuffs_bzip2__decoder* self,
37979
    wuffs_base__io_buffer* a_dst);
37980
37981
WUFFS_BASE__GENERATED_C_CODE
37982
static wuffs_base__status
37983
wuffs_bzip2__decoder__decode_huffman_fast(
37984
    wuffs_bzip2__decoder* self,
37985
    wuffs_base__io_buffer* a_src);
37986
37987
WUFFS_BASE__GENERATED_C_CODE
37988
static wuffs_base__status
37989
wuffs_bzip2__decoder__decode_huffman_slow(
37990
    wuffs_bzip2__decoder* self,
37991
    wuffs_base__io_buffer* a_src);
37992
37993
// ---------------- VTables
37994
37995
const wuffs_base__io_transformer__func_ptrs
37996
wuffs_bzip2__decoder__func_ptrs_for__wuffs_base__io_transformer = {
37997
  (wuffs_base__optional_u63(*)(const void*))(&wuffs_bzip2__decoder__dst_history_retain_length),
37998
  (uint64_t(*)(const void*,
37999
      uint32_t))(&wuffs_bzip2__decoder__get_quirk),
38000
  (wuffs_base__status(*)(void*,
38001
      uint32_t,
38002
      uint64_t))(&wuffs_bzip2__decoder__set_quirk),
38003
  (wuffs_base__status(*)(void*,
38004
      wuffs_base__io_buffer*,
38005
      wuffs_base__io_buffer*,
38006
      wuffs_base__slice_u8))(&wuffs_bzip2__decoder__transform_io),
38007
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_bzip2__decoder__workbuf_len),
38008
};
38009
38010
// ---------------- Initializer Implementations
38011
38012
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
38013
wuffs_bzip2__decoder__initialize(
38014
    wuffs_bzip2__decoder* self,
38015
    size_t sizeof_star_self,
38016
    uint64_t wuffs_version,
38017
    uint32_t options){
38018
  if (!self) {
38019
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
38020
  }
38021
  if (sizeof(*self) != sizeof_star_self) {
38022
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
38023
  }
38024
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
38025
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
38026
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
38027
  }
38028
38029
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
38030
    // The whole point of this if-check is to detect an uninitialized *self.
38031
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
38032
#if !defined(__clang__) && defined(__GNUC__)
38033
#pragma GCC diagnostic push
38034
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
38035
#endif
38036
    if (self->private_impl.magic != 0) {
38037
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
38038
    }
38039
#if !defined(__clang__) && defined(__GNUC__)
38040
#pragma GCC diagnostic pop
38041
#endif
38042
  } else {
38043
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
38044
      memset(self, 0, sizeof(*self));
38045
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
38046
    } else {
38047
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
38048
    }
38049
  }
38050
38051
  self->private_impl.magic = WUFFS_BASE__MAGIC;
38052
  self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name =
38053
      wuffs_base__io_transformer__vtable_name;
38054
  self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers =
38055
      (const void*)(&wuffs_bzip2__decoder__func_ptrs_for__wuffs_base__io_transformer);
38056
  return wuffs_base__make_status(NULL);
38057
}
38058
38059
wuffs_bzip2__decoder*
38060
wuffs_bzip2__decoder__alloc(void) {
38061
  wuffs_bzip2__decoder* x =
38062
      (wuffs_bzip2__decoder*)(calloc(1, sizeof(wuffs_bzip2__decoder)));
38063
  if (!x) {
38064
    return NULL;
38065
  }
38066
  if (wuffs_bzip2__decoder__initialize(
38067
      x, sizeof(wuffs_bzip2__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
38068
    free(x);
38069
    return NULL;
38070
  }
38071
  return x;
38072
}
38073
38074
size_t
38075
sizeof__wuffs_bzip2__decoder(void) {
38076
  return sizeof(wuffs_bzip2__decoder);
38077
}
38078
38079
// ---------------- Function Implementations
38080
38081
// -------- func bzip2.decoder.get_quirk
38082
38083
WUFFS_BASE__GENERATED_C_CODE
38084
WUFFS_BASE__MAYBE_STATIC uint64_t
38085
wuffs_bzip2__decoder__get_quirk(
38086
    const wuffs_bzip2__decoder* self,
38087
    uint32_t a_key) {
38088
  if (!self) {
38089
    return 0;
38090
  }
38091
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
38092
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
38093
    return 0;
38094
  }
38095
38096
  if ((a_key == 1u) && self->private_impl.f_ignore_checksum) {
38097
    return 1u;
38098
  }
38099
  return 0u;
38100
}
38101
38102
// -------- func bzip2.decoder.set_quirk
38103
38104
WUFFS_BASE__GENERATED_C_CODE
38105
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
38106
wuffs_bzip2__decoder__set_quirk(
38107
    wuffs_bzip2__decoder* self,
38108
    uint32_t a_key,
38109
    uint64_t a_value) {
38110
  if (!self) {
38111
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
38112
  }
38113
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
38114
    return wuffs_base__make_status(
38115
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
38116
        ? wuffs_base__error__disabled_by_previous_error
38117
        : wuffs_base__error__initialize_not_called);
38118
  }
38119
38120
  if (a_key == 1u) {
38121
    self->private_impl.f_ignore_checksum = (a_value > 0u);
38122
    return wuffs_base__make_status(NULL);
38123
  }
38124
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
38125
}
38126
38127
// -------- func bzip2.decoder.dst_history_retain_length
38128
38129
WUFFS_BASE__GENERATED_C_CODE
38130
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
38131
wuffs_bzip2__decoder__dst_history_retain_length(
38132
    const wuffs_bzip2__decoder* self) {
38133
  if (!self) {
38134
    return wuffs_base__utility__make_optional_u63(false, 0u);
38135
  }
38136
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
38137
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
38138
    return wuffs_base__utility__make_optional_u63(false, 0u);
38139
  }
38140
38141
  return wuffs_base__utility__make_optional_u63(true, 0u);
38142
}
38143
38144
// -------- func bzip2.decoder.workbuf_len
38145
38146
WUFFS_BASE__GENERATED_C_CODE
38147
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
38148
wuffs_bzip2__decoder__workbuf_len(
38149
    const wuffs_bzip2__decoder* self) {
38150
  if (!self) {
38151
    return wuffs_base__utility__empty_range_ii_u64();
38152
  }
38153
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
38154
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
38155
    return wuffs_base__utility__empty_range_ii_u64();
38156
  }
38157
38158
  return wuffs_base__utility__make_range_ii_u64(0u, 0u);
38159
}
38160
38161
// -------- func bzip2.decoder.transform_io
38162
38163
WUFFS_BASE__GENERATED_C_CODE
38164
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
38165
wuffs_bzip2__decoder__transform_io(
38166
    wuffs_bzip2__decoder* self,
38167
    wuffs_base__io_buffer* a_dst,
38168
    wuffs_base__io_buffer* a_src,
38169
    wuffs_base__slice_u8 a_workbuf) {
38170
  if (!self) {
38171
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
38172
  }
38173
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
38174
    return wuffs_base__make_status(
38175
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
38176
        ? wuffs_base__error__disabled_by_previous_error
38177
        : wuffs_base__error__initialize_not_called);
38178
  }
38179
  if (!a_dst || !a_src) {
38180
    self->private_impl.magic = WUFFS_BASE__DISABLED;
38181
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
38182
  }
38183
  if ((self->private_impl.active_coroutine != 0) &&
38184
      (self->private_impl.active_coroutine != 1)) {
38185
    self->private_impl.magic = WUFFS_BASE__DISABLED;
38186
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
38187
  }
38188
  self->private_impl.active_coroutine = 0;
38189
  wuffs_base__status status = wuffs_base__make_status(NULL);
38190
38191
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
38192
38193
  uint32_t coro_susp_point = self->private_impl.p_transform_io;
38194
  switch (coro_susp_point) {
38195
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
38196
38197
    while (true) {
38198
      {
38199
        wuffs_base__status t_0 = wuffs_bzip2__decoder__do_transform_io(self, a_dst, a_src, a_workbuf);
38200
        v_status = t_0;
38201
      }
38202
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
38203
        status = wuffs_base__make_status(wuffs_bzip2__error__truncated_input);
38204
        goto exit;
38205
      }
38206
      status = v_status;
38207
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
38208
    }
38209
38210
    ok:
38211
    self->private_impl.p_transform_io = 0;
38212
    goto exit;
38213
  }
38214
38215
  goto suspend;
38216
  suspend:
38217
  self->private_impl.p_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
38218
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
38219
38220
  goto exit;
38221
  exit:
38222
  if (wuffs_base__status__is_error(&status)) {
38223
    self->private_impl.magic = WUFFS_BASE__DISABLED;
38224
  }
38225
  return status;
38226
}
38227
38228
// -------- func bzip2.decoder.do_transform_io
38229
38230
WUFFS_BASE__GENERATED_C_CODE
38231
static wuffs_base__status
38232
wuffs_bzip2__decoder__do_transform_io(
38233
    wuffs_bzip2__decoder* self,
38234
    wuffs_base__io_buffer* a_dst,
38235
    wuffs_base__io_buffer* a_src,
38236
    wuffs_base__slice_u8 a_workbuf) {
38237
  wuffs_base__status status = wuffs_base__make_status(NULL);
38238
38239
  uint8_t v_c8 = 0;
38240
  uint32_t v_i = 0;
38241
  uint64_t v_tag = 0;
38242
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
38243
  uint32_t v_final_checksum_want = 0;
38244
38245
  const uint8_t* iop_a_src = NULL;
38246
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
38247
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
38248
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
38249
  if (a_src && a_src->data.ptr) {
38250
    io0_a_src = a_src->data.ptr;
38251
    io1_a_src = io0_a_src + a_src->meta.ri;
38252
    iop_a_src = io1_a_src;
38253
    io2_a_src = io0_a_src + a_src->meta.wi;
38254
  }
38255
38256
  uint32_t coro_susp_point = self->private_impl.p_do_transform_io;
38257
  if (coro_susp_point) {
38258
    v_i = self->private_data.s_do_transform_io.v_i;
38259
    v_tag = self->private_data.s_do_transform_io.v_tag;
38260
    v_final_checksum_want = self->private_data.s_do_transform_io.v_final_checksum_want;
38261
  }
38262
  switch (coro_susp_point) {
38263
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
38264
38265
    {
38266
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
38267
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
38268
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
38269
        goto suspend;
38270
      }
38271
      uint8_t t_0 = *iop_a_src++;
38272
      v_c8 = t_0;
38273
    }
38274
    if (v_c8 != 66u) {
38275
      status = wuffs_base__make_status(wuffs_bzip2__error__bad_header);
38276
      goto exit;
38277
    }
38278
    {
38279
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
38280
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
38281
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
38282
        goto suspend;
38283
      }
38284
      uint8_t t_1 = *iop_a_src++;
38285
      v_c8 = t_1;
38286
    }
38287
    if (v_c8 != 90u) {
38288
      status = wuffs_base__make_status(wuffs_bzip2__error__bad_header);
38289
      goto exit;
38290
    }
38291
    {
38292
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
38293
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
38294
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
38295
        goto suspend;
38296
      }
38297
      uint8_t t_2 = *iop_a_src++;
38298
      v_c8 = t_2;
38299
    }
38300
    if (v_c8 != 104u) {
38301
      status = wuffs_base__make_status(wuffs_bzip2__error__bad_header);
38302
      goto exit;
38303
    }
38304
    {
38305
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
38306
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
38307
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
38308
        goto suspend;
38309
      }
38310
      uint8_t t_3 = *iop_a_src++;
38311
      v_c8 = t_3;
38312
    }
38313
    if ((v_c8 < 49u) || (57u < v_c8)) {
38314
      status = wuffs_base__make_status(wuffs_bzip2__error__bad_header);
38315
      goto exit;
38316
    }
38317
    self->private_impl.f_max_incl_block_size = (((uint32_t)(((uint8_t)(v_c8 - 48u)))) * 100000u);
38318
    while (true) {
38319
      v_tag = 0u;
38320
      v_i = 0u;
38321
      while (v_i < 48u) {
38322
        if (self->private_impl.f_n_bits <= 0u) {
38323
          {
38324
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
38325
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
38326
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
38327
              goto suspend;
38328
            }
38329
            uint8_t t_4 = *iop_a_src++;
38330
            v_c8 = t_4;
38331
          }
38332
          self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u);
38333
          self->private_impl.f_n_bits = 8u;
38334
        }
38335
        v_tag <<= 1u;
38336
        v_tag |= ((uint64_t)((self->private_impl.f_bits >> 31u)));
38337
        self->private_impl.f_bits <<= 1u;
38338
        self->private_impl.f_n_bits -= 1u;
38339
        v_i += 1u;
38340
      }
38341
      if (v_tag == 25779555029136u) {
38342
        break;
38343
      } else if (v_tag != 54156738319193u) {
38344
        status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header);
38345
        goto exit;
38346
      }
38347
      if (a_src) {
38348
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
38349
      }
38350
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
38351
      status = wuffs_bzip2__decoder__prepare_block(self, a_src);
38352
      if (a_src) {
38353
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
38354
      }
38355
      if (status.repr) {
38356
        goto suspend;
38357
      }
38358
      self->private_impl.f_block_size = 0u;
38359
      self->private_impl.f_decode_huffman_finished = false;
38360
      self->private_impl.f_decode_huffman_which = WUFFS_BZIP2__CLAMP_TO_5[((uint8_t)(self->private_data.f_huffman_selectors[0u] & 7u))];
38361
      self->private_impl.f_decode_huffman_ticks = 50u;
38362
      self->private_impl.f_decode_huffman_section = 0u;
38363
      self->private_impl.f_decode_huffman_run_shift = 0u;
38364
      while ( ! self->private_impl.f_decode_huffman_finished) {
38365
        if (a_src) {
38366
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
38367
        }
38368
        v_status = wuffs_bzip2__decoder__decode_huffman_fast(self, a_src);
38369
        if (a_src) {
38370
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
38371
        }
38372
        if (wuffs_base__status__is_error(&v_status)) {
38373
          status = v_status;
38374
          goto exit;
38375
        } else if (self->private_impl.f_decode_huffman_finished) {
38376
          break;
38377
        }
38378
        if (a_src) {
38379
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
38380
        }
38381
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
38382
        status = wuffs_bzip2__decoder__decode_huffman_slow(self, a_src);
38383
        if (a_src) {
38384
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
38385
        }
38386
        if (status.repr) {
38387
          goto suspend;
38388
        }
38389
      }
38390
      wuffs_bzip2__decoder__invert_bwt(self);
38391
      self->private_impl.f_block_checksum_have = 4294967295u;
38392
      if (self->private_impl.f_original_pointer >= self->private_impl.f_block_size) {
38393
        status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length);
38394
        goto exit;
38395
      }
38396
      self->private_impl.f_flush_pointer = (self->private_data.f_bwt[self->private_impl.f_original_pointer] >> 12u);
38397
      self->private_impl.f_flush_repeat_count = 0u;
38398
      self->private_impl.f_flush_prev = 0u;
38399
      while (self->private_impl.f_block_size > 0u) {
38400
        wuffs_bzip2__decoder__flush_fast(self, a_dst);
38401
        if (self->private_impl.f_block_size <= 0u) {
38402
          break;
38403
        }
38404
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
38405
        status = wuffs_bzip2__decoder__flush_slow(self, a_dst);
38406
        if (status.repr) {
38407
          goto suspend;
38408
        }
38409
      }
38410
      self->private_impl.f_block_checksum_have ^= 4294967295u;
38411
      if ( ! self->private_impl.f_ignore_checksum && (self->private_impl.f_block_checksum_have != self->private_impl.f_block_checksum_want)) {
38412
        status = wuffs_base__make_status(wuffs_bzip2__error__bad_checksum);
38413
        goto exit;
38414
      }
38415
      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))));
38416
    }
38417
    v_final_checksum_want = 0u;
38418
    v_i = 0u;
38419
    while (v_i < 32u) {
38420
      if (self->private_impl.f_n_bits <= 0u) {
38421
        {
38422
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
38423
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
38424
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
38425
            goto suspend;
38426
          }
38427
          uint8_t t_5 = *iop_a_src++;
38428
          v_c8 = t_5;
38429
        }
38430
        self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u);
38431
        self->private_impl.f_n_bits = 8u;
38432
      }
38433
      v_final_checksum_want <<= 1u;
38434
      v_final_checksum_want |= (self->private_impl.f_bits >> 31u);
38435
      self->private_impl.f_bits <<= 1u;
38436
      self->private_impl.f_n_bits -= 1u;
38437
      v_i += 1u;
38438
    }
38439
    if ( ! self->private_impl.f_ignore_checksum && (self->private_impl.f_final_checksum_have != v_final_checksum_want)) {
38440
      status = wuffs_base__make_status(wuffs_bzip2__error__bad_checksum);
38441
      goto exit;
38442
    }
38443
38444
    goto ok;
38445
    ok:
38446
    self->private_impl.p_do_transform_io = 0;
38447
    goto exit;
38448
  }
38449
38450
  goto suspend;
38451
  suspend:
38452
  self->private_impl.p_do_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
38453
  self->private_data.s_do_transform_io.v_i = v_i;
38454
  self->private_data.s_do_transform_io.v_tag = v_tag;
38455
  self->private_data.s_do_transform_io.v_final_checksum_want = v_final_checksum_want;
38456
38457
  goto exit;
38458
  exit:
38459
  if (a_src && a_src->data.ptr) {
38460
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
38461
  }
38462
38463
  return status;
38464
}
38465
38466
// -------- func bzip2.decoder.prepare_block
38467
38468
WUFFS_BASE__GENERATED_C_CODE
38469
static wuffs_base__status
38470
wuffs_bzip2__decoder__prepare_block(
38471
    wuffs_bzip2__decoder* self,
38472
    wuffs_base__io_buffer* a_src) {
38473
  wuffs_base__status status = wuffs_base__make_status(NULL);
38474
38475
  uint8_t v_c8 = 0;
38476
  uint32_t v_i = 0;
38477
  uint32_t v_j = 0;
38478
  uint32_t v_selector = 0;
38479
  uint32_t v_sel_ff = 0;
38480
  uint8_t v_movee = 0;
38481
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
38482
38483
  const uint8_t* iop_a_src = NULL;
38484
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
38485
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
38486
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
38487
  if (a_src && a_src->data.ptr) {
38488
    io0_a_src = a_src->data.ptr;
38489
    io1_a_src = io0_a_src + a_src->meta.ri;
38490
    iop_a_src = io1_a_src;
38491
    io2_a_src = io0_a_src + a_src->meta.wi;
38492
  }
38493
38494
  uint32_t coro_susp_point = self->private_impl.p_prepare_block;
38495
  if (coro_susp_point) {
38496
    v_i = self->private_data.s_prepare_block.v_i;
38497
    v_selector = self->private_data.s_prepare_block.v_selector;
38498
  }
38499
  switch (coro_susp_point) {
38500
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
38501
38502
    self->private_impl.f_block_checksum_want = 0u;
38503
    v_i = 0u;
38504
    while (v_i < 32u) {
38505
      if (self->private_impl.f_n_bits <= 0u) {
38506
        {
38507
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
38508
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
38509
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
38510
            goto suspend;
38511
          }
38512
          uint8_t t_0 = *iop_a_src++;
38513
          v_c8 = t_0;
38514
        }
38515
        self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u);
38516
        self->private_impl.f_n_bits = 8u;
38517
      }
38518
      self->private_impl.f_block_checksum_want <<= 1u;
38519
      self->private_impl.f_block_checksum_want |= (self->private_impl.f_bits >> 31u);
38520
      self->private_impl.f_bits <<= 1u;
38521
      self->private_impl.f_n_bits -= 1u;
38522
      v_i += 1u;
38523
    }
38524
    if (self->private_impl.f_n_bits <= 0u) {
38525
      {
38526
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
38527
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
38528
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
38529
          goto suspend;
38530
        }
38531
        uint8_t t_1 = *iop_a_src++;
38532
        v_c8 = t_1;
38533
      }
38534
      self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u);
38535
      self->private_impl.f_n_bits = 8u;
38536
    }
38537
    if ((self->private_impl.f_bits >> 31u) != 0u) {
38538
      status = wuffs_base__make_status(wuffs_bzip2__error__unsupported_block_randomization);
38539
      goto exit;
38540
    }
38541
    self->private_impl.f_bits <<= 1u;
38542
    self->private_impl.f_n_bits -= 1u;
38543
    self->private_impl.f_original_pointer = 0u;
38544
    v_i = 0u;
38545
    while (v_i < 24u) {
38546
      if (self->private_impl.f_n_bits <= 0u) {
38547
        {
38548
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
38549
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
38550
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
38551
            goto suspend;
38552
          }
38553
          uint8_t t_2 = *iop_a_src++;
38554
          v_c8 = t_2;
38555
        }
38556
        self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u);
38557
        self->private_impl.f_n_bits = 8u;
38558
      }
38559
      self->private_impl.f_original_pointer <<= 1u;
38560
      self->private_impl.f_original_pointer |= (self->private_impl.f_bits >> 31u);
38561
      self->private_impl.f_bits <<= 1u;
38562
      self->private_impl.f_n_bits -= 1u;
38563
      v_i += 1u;
38564
    }
38565
    v_i = 0u;
38566
    while (v_i < 256u) {
38567
      self->private_data.f_presence[v_i] = 0u;
38568
      v_i += 1u;
38569
    }
38570
    v_i = 0u;
38571
    while (v_i < 256u) {
38572
      if (self->private_impl.f_n_bits <= 0u) {
38573
        {
38574
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
38575
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
38576
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
38577
            goto suspend;
38578
          }
38579
          uint8_t t_3 = *iop_a_src++;
38580
          v_c8 = t_3;
38581
        }
38582
        self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u);
38583
        self->private_impl.f_n_bits = 8u;
38584
      }
38585
      if ((self->private_impl.f_bits >> 31u) != 0u) {
38586
        self->private_data.f_presence[v_i] = 1u;
38587
      }
38588
      self->private_impl.f_bits <<= 1u;
38589
      self->private_impl.f_n_bits -= 1u;
38590
      v_i += 16u;
38591
    }
38592
    self->private_data.f_scratch = 0u;
38593
    v_i = 0u;
38594
    while (v_i < 256u) {
38595
      if (self->private_data.f_presence[v_i] == 0u) {
38596
        v_i += 16u;
38597
        continue;
38598
      }
38599
      while (true) {
38600
        if (self->private_impl.f_n_bits <= 0u) {
38601
          {
38602
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
38603
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
38604
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
38605
              goto suspend;
38606
            }
38607
            uint8_t t_4 = *iop_a_src++;
38608
            v_c8 = t_4;
38609
          }
38610
          self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u);
38611
          self->private_impl.f_n_bits = 8u;
38612
        }
38613
        self->private_data.f_scratch += (self->private_impl.f_bits >> 31u);
38614
        self->private_data.f_presence[(v_i & 255u)] = ((uint8_t)((self->private_impl.f_bits >> 31u)));
38615
        self->private_impl.f_bits <<= 1u;
38616
        self->private_impl.f_n_bits -= 1u;
38617
        v_i += 1u;
38618
        if ((v_i & 15u) == 0u) {
38619
          break;
38620
        }
38621
      }
38622
    }
38623
    if ((self->private_data.f_scratch < 1u) || (256u < self->private_data.f_scratch)) {
38624
      status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header);
38625
      goto exit;
38626
    }
38627
    self->private_impl.f_num_symbols = (self->private_data.f_scratch + 2u);
38628
    self->private_data.f_scratch = 0u;
38629
    v_i = 0u;
38630
    while (v_i < 3u) {
38631
      if (self->private_impl.f_n_bits <= 0u) {
38632
        {
38633
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
38634
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
38635
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
38636
            goto suspend;
38637
          }
38638
          uint8_t t_5 = *iop_a_src++;
38639
          v_c8 = t_5;
38640
        }
38641
        self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u);
38642
        self->private_impl.f_n_bits = 8u;
38643
      }
38644
      self->private_data.f_scratch <<= 1u;
38645
      self->private_data.f_scratch |= (self->private_impl.f_bits >> 31u);
38646
      self->private_impl.f_bits <<= 1u;
38647
      self->private_impl.f_n_bits -= 1u;
38648
      v_i += 1u;
38649
    }
38650
    if ((self->private_data.f_scratch < 2u) || (6u < self->private_data.f_scratch)) {
38651
      status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header);
38652
      goto exit;
38653
    }
38654
    self->private_impl.f_num_huffman_codes = self->private_data.f_scratch;
38655
    self->private_data.f_scratch = 0u;
38656
    v_i = 0u;
38657
    while (v_i < 15u) {
38658
      if (self->private_impl.f_n_bits <= 0u) {
38659
        {
38660
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
38661
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
38662
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
38663
            goto suspend;
38664
          }
38665
          uint8_t t_6 = *iop_a_src++;
38666
          v_c8 = t_6;
38667
        }
38668
        self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u);
38669
        self->private_impl.f_n_bits = 8u;
38670
      }
38671
      self->private_data.f_scratch <<= 1u;
38672
      self->private_data.f_scratch |= (self->private_impl.f_bits >> 31u);
38673
      self->private_impl.f_bits <<= 1u;
38674
      self->private_impl.f_n_bits -= 1u;
38675
      v_i += 1u;
38676
    }
38677
    if ((self->private_data.f_scratch < 1u) || (18001u < self->private_data.f_scratch)) {
38678
      status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header);
38679
      goto exit;
38680
    }
38681
    self->private_impl.f_num_sections = self->private_data.f_scratch;
38682
    v_i = 0u;
38683
    while (v_i < self->private_impl.f_num_huffman_codes) {
38684
      self->private_data.f_mtft[v_i] = ((uint8_t)(v_i));
38685
      v_i += 1u;
38686
    }
38687
    v_i = 0u;
38688
    while (v_i < self->private_impl.f_num_sections) {
38689
      v_selector = 0u;
38690
      while (true) {
38691
        if (self->private_impl.f_n_bits <= 0u) {
38692
          {
38693
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
38694
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
38695
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
38696
              goto suspend;
38697
            }
38698
            uint8_t t_7 = *iop_a_src++;
38699
            v_c8 = t_7;
38700
          }
38701
          self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u);
38702
          self->private_impl.f_n_bits = 8u;
38703
        }
38704
        if ((self->private_impl.f_bits >> 31u) == 0u) {
38705
          self->private_impl.f_bits <<= 1u;
38706
          self->private_impl.f_n_bits -= 1u;
38707
          break;
38708
        }
38709
        self->private_impl.f_bits <<= 1u;
38710
        self->private_impl.f_n_bits -= 1u;
38711
        v_selector += 1u;
38712
        if (v_selector >= self->private_impl.f_num_huffman_codes) {
38713
          status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header);
38714
          goto exit;
38715
        }
38716
      }
38717
      if (v_selector == 0u) {
38718
        self->private_data.f_huffman_selectors[v_i] = self->private_data.f_mtft[0u];
38719
      } else {
38720
        v_sel_ff = (v_selector & 255u);
38721
        v_movee = self->private_data.f_mtft[v_sel_ff];
38722
        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));
38723
        self->private_data.f_mtft[0u] = v_movee;
38724
        self->private_data.f_huffman_selectors[v_i] = v_movee;
38725
      }
38726
      v_i += 1u;
38727
    }
38728
    v_i = 0u;
38729
    while (v_i < self->private_impl.f_num_huffman_codes) {
38730
      if (a_src) {
38731
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
38732
      }
38733
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
38734
      status = wuffs_bzip2__decoder__read_code_lengths(self, a_src);
38735
      if (a_src) {
38736
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
38737
      }
38738
      if (status.repr) {
38739
        goto suspend;
38740
      }
38741
      v_status = wuffs_bzip2__decoder__build_huffman_tree(self, v_i);
38742
      if (wuffs_base__status__is_error(&v_status)) {
38743
        status = v_status;
38744
        goto exit;
38745
      }
38746
      wuffs_bzip2__decoder__build_huffman_table(self, v_i);
38747
      v_i += 1u;
38748
    }
38749
    v_i = 0u;
38750
    v_j = 0u;
38751
    while (v_i < 256u) {
38752
      if (self->private_data.f_presence[v_i] != 0u) {
38753
        self->private_data.f_mtft[(v_j & 255u)] = ((uint8_t)(v_i));
38754
        v_j += 1u;
38755
      }
38756
      v_i += 1u;
38757
    }
38758
    v_i = 0u;
38759
    while (v_i < 256u) {
38760
      self->private_data.f_letter_counts[v_i] = 0u;
38761
      v_i += 1u;
38762
    }
38763
38764
    goto ok;
38765
    ok:
38766
    self->private_impl.p_prepare_block = 0;
38767
    goto exit;
38768
  }
38769
38770
  goto suspend;
38771
  suspend:
38772
  self->private_impl.p_prepare_block = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
38773
  self->private_data.s_prepare_block.v_i = v_i;
38774
  self->private_data.s_prepare_block.v_selector = v_selector;
38775
38776
  goto exit;
38777
  exit:
38778
  if (a_src && a_src->data.ptr) {
38779
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
38780
  }
38781
38782
  return status;
38783
}
38784
38785
// -------- func bzip2.decoder.read_code_lengths
38786
38787
WUFFS_BASE__GENERATED_C_CODE
38788
static wuffs_base__status
38789
wuffs_bzip2__decoder__read_code_lengths(
38790
    wuffs_bzip2__decoder* self,
38791
    wuffs_base__io_buffer* a_src) {
38792
  wuffs_base__status status = wuffs_base__make_status(NULL);
38793
38794
  uint8_t v_c8 = 0;
38795
  uint32_t v_i = 0;
38796
  uint32_t v_code_length = 0;
38797
38798
  const uint8_t* iop_a_src = NULL;
38799
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
38800
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
38801
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
38802
  if (a_src && a_src->data.ptr) {
38803
    io0_a_src = a_src->data.ptr;
38804
    io1_a_src = io0_a_src + a_src->meta.ri;
38805
    iop_a_src = io1_a_src;
38806
    io2_a_src = io0_a_src + a_src->meta.wi;
38807
  }
38808
38809
  uint32_t coro_susp_point = self->private_impl.p_read_code_lengths;
38810
  if (coro_susp_point) {
38811
    v_i = self->private_data.s_read_code_lengths.v_i;
38812
    v_code_length = self->private_data.s_read_code_lengths.v_code_length;
38813
  }
38814
  switch (coro_susp_point) {
38815
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
38816
38817
    self->private_impl.f_code_lengths_bitmask = 0u;
38818
    v_i = 0u;
38819
    while (v_i < 5u) {
38820
      if (self->private_impl.f_n_bits <= 0u) {
38821
        {
38822
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
38823
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
38824
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
38825
            goto suspend;
38826
          }
38827
          uint8_t t_0 = *iop_a_src++;
38828
          v_c8 = t_0;
38829
        }
38830
        self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u);
38831
        self->private_impl.f_n_bits = 8u;
38832
      }
38833
      v_code_length <<= 1u;
38834
      v_code_length |= (self->private_impl.f_bits >> 31u);
38835
      self->private_impl.f_bits <<= 1u;
38836
      self->private_impl.f_n_bits -= 1u;
38837
      v_i += 1u;
38838
    }
38839
    v_i = 0u;
38840
    while (v_i < self->private_impl.f_num_symbols) {
38841
      while (true) {
38842
        if ((v_code_length < 1u) || (20u < v_code_length)) {
38843
          status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header);
38844
          goto exit;
38845
        }
38846
        if (self->private_impl.f_n_bits <= 0u) {
38847
          {
38848
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
38849
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
38850
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
38851
              goto suspend;
38852
            }
38853
            uint8_t t_1 = *iop_a_src++;
38854
            v_c8 = t_1;
38855
          }
38856
          self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u);
38857
          self->private_impl.f_n_bits = 8u;
38858
        }
38859
        if ((self->private_impl.f_bits >> 31u) == 0u) {
38860
          self->private_impl.f_bits <<= 1u;
38861
          self->private_impl.f_n_bits -= 1u;
38862
          break;
38863
        }
38864
        self->private_impl.f_bits <<= 1u;
38865
        self->private_impl.f_n_bits -= 1u;
38866
        if (self->private_impl.f_n_bits <= 0u) {
38867
          {
38868
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
38869
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
38870
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
38871
              goto suspend;
38872
            }
38873
            uint8_t t_2 = *iop_a_src++;
38874
            v_c8 = t_2;
38875
          }
38876
          self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u);
38877
          self->private_impl.f_n_bits = 8u;
38878
        }
38879
        if ((self->private_impl.f_bits >> 31u) == 0u) {
38880
          v_code_length += 1u;
38881
        } else {
38882
          v_code_length -= 1u;
38883
        }
38884
        self->private_impl.f_bits <<= 1u;
38885
        self->private_impl.f_n_bits -= 1u;
38886
      }
38887
      self->private_impl.f_code_lengths_bitmask |= (((uint32_t)(1u)) << (v_code_length & 31u));
38888
      self->private_data.f_bwt[v_i] = v_code_length;
38889
      v_i += 1u;
38890
    }
38891
38892
    goto ok;
38893
    ok:
38894
    self->private_impl.p_read_code_lengths = 0;
38895
    goto exit;
38896
  }
38897
38898
  goto suspend;
38899
  suspend:
38900
  self->private_impl.p_read_code_lengths = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
38901
  self->private_data.s_read_code_lengths.v_i = v_i;
38902
  self->private_data.s_read_code_lengths.v_code_length = v_code_length;
38903
38904
  goto exit;
38905
  exit:
38906
  if (a_src && a_src->data.ptr) {
38907
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
38908
  }
38909
38910
  return status;
38911
}
38912
38913
// -------- func bzip2.decoder.build_huffman_tree
38914
38915
WUFFS_BASE__GENERATED_C_CODE
38916
static wuffs_base__status
38917
wuffs_bzip2__decoder__build_huffman_tree(
38918
    wuffs_bzip2__decoder* self,
38919
    uint32_t a_which) {
38920
  uint32_t v_code_length = 0;
38921
  uint32_t v_symbol_index = 0;
38922
  uint32_t v_num_branch_nodes = 0;
38923
  uint32_t v_stack_height = 0;
38924
  uint32_t v_stack_values[21] = {0};
38925
  uint32_t v_node_index = 0;
38926
  uint16_t v_leaf_value = 0;
38927
38928
  self->private_data.f_huffman_trees[a_which][0u][0u] = 0u;
38929
  self->private_data.f_huffman_trees[a_which][0u][1u] = 0u;
38930
  v_num_branch_nodes = 1u;
38931
  v_stack_height = 1u;
38932
  v_stack_values[0u] = 0u;
38933
  v_code_length = 1u;
38934
  while (v_code_length <= 20u) {
38935
    if ((self->private_impl.f_code_lengths_bitmask & (((uint32_t)(1u)) << v_code_length)) == 0u) {
38936
      v_code_length += 1u;
38937
      continue;
38938
    }
38939
    v_symbol_index = 0u;
38940
    while (v_symbol_index < self->private_impl.f_num_symbols) {
38941
      if (self->private_data.f_bwt[v_symbol_index] != v_code_length) {
38942
        v_symbol_index += 1u;
38943
        continue;
38944
      }
38945
      while (true) {
38946
        if (v_stack_height <= 0u) {
38947
          return wuffs_base__make_status(wuffs_bzip2__error__bad_huffman_code_over_subscribed);
38948
        } else if (v_stack_height >= v_code_length) {
38949
          break;
38950
        }
38951
        v_node_index = v_stack_values[(v_stack_height - 1u)];
38952
        if (self->private_data.f_huffman_trees[a_which][v_node_index][0u] == 0u) {
38953
          self->private_data.f_huffman_trees[a_which][v_node_index][0u] = ((uint16_t)(v_num_branch_nodes));
38954
        } else {
38955
          self->private_data.f_huffman_trees[a_which][v_node_index][1u] = ((uint16_t)(v_num_branch_nodes));
38956
        }
38957
        if (v_num_branch_nodes >= 257u) {
38958
          return wuffs_base__make_status(wuffs_bzip2__error__bad_huffman_code_under_subscribed);
38959
        }
38960
        v_stack_values[v_stack_height] = v_num_branch_nodes;
38961
        self->private_data.f_huffman_trees[a_which][v_num_branch_nodes][0u] = 0u;
38962
        self->private_data.f_huffman_trees[a_which][v_num_branch_nodes][1u] = 0u;
38963
        v_num_branch_nodes += 1u;
38964
        v_stack_height += 1u;
38965
      }
38966
      v_node_index = v_stack_values[(v_stack_height - 1u)];
38967
      if (v_symbol_index < 2u) {
38968
        v_leaf_value = ((uint16_t)((769u + v_symbol_index)));
38969
      } else if ((v_symbol_index + 1u) < self->private_impl.f_num_symbols) {
38970
        v_leaf_value = ((uint16_t)((511u + v_symbol_index)));
38971
      } else {
38972
        v_leaf_value = 768u;
38973
      }
38974
      if (self->private_data.f_huffman_trees[a_which][v_node_index][0u] == 0u) {
38975
        self->private_data.f_huffman_trees[a_which][v_node_index][0u] = v_leaf_value;
38976
      } else {
38977
        self->private_data.f_huffman_trees[a_which][v_node_index][1u] = v_leaf_value;
38978
        v_stack_height -= 1u;
38979
        while (v_stack_height > 0u) {
38980
          v_node_index = v_stack_values[(v_stack_height - 1u)];
38981
          if (self->private_data.f_huffman_trees[a_which][v_node_index][1u] == 0u) {
38982
            break;
38983
          }
38984
          v_stack_height -= 1u;
38985
        }
38986
      }
38987
      v_symbol_index += 1u;
38988
    }
38989
    v_code_length += 1u;
38990
  }
38991
  if (v_stack_height != 0u) {
38992
    return wuffs_base__make_status(wuffs_bzip2__error__bad_huffman_code_under_subscribed);
38993
  }
38994
  return wuffs_base__make_status(NULL);
38995
}
38996
38997
// -------- func bzip2.decoder.build_huffman_table
38998
38999
WUFFS_BASE__GENERATED_C_CODE
39000
static wuffs_base__empty_struct
39001
wuffs_bzip2__decoder__build_huffman_table(
39002
    wuffs_bzip2__decoder* self,
39003
    uint32_t a_which) {
39004
  uint32_t v_i = 0;
39005
  uint32_t v_bits = 0;
39006
  uint16_t v_n_bits = 0;
39007
  uint16_t v_child = 0;
39008
39009
  while (v_i < 256u) {
39010
    v_bits = (v_i << 24u);
39011
    v_n_bits = 0u;
39012
    v_child = 0u;
39013
    while ((v_child < 257u) && (v_n_bits < 8u)) {
39014
      v_child = self->private_data.f_huffman_trees[a_which][v_child][(v_bits >> 31u)];
39015
      v_bits <<= 1u;
39016
#if defined(__GNUC__)
39017
#pragma GCC diagnostic push
39018
#pragma GCC diagnostic ignored "-Wconversion"
39019
#endif
39020
      v_n_bits += 1u;
39021
#if defined(__GNUC__)
39022
#pragma GCC diagnostic pop
39023
#endif
39024
    }
39025
    self->private_data.f_huffman_tables[a_which][v_i] = ((uint16_t)(((uint16_t)(v_child | ((uint16_t)(v_n_bits << 12u))))));
39026
    v_i += 1u;
39027
  }
39028
  return wuffs_base__make_empty_struct();
39029
}
39030
39031
// -------- func bzip2.decoder.invert_bwt
39032
39033
WUFFS_BASE__GENERATED_C_CODE
39034
static wuffs_base__empty_struct
39035
wuffs_bzip2__decoder__invert_bwt(
39036
    wuffs_bzip2__decoder* self) {
39037
  uint32_t v_i = 0;
39038
  uint32_t v_letter = 0;
39039
  uint32_t v_sum = 0;
39040
  uint32_t v_old_sum = 0;
39041
39042
  v_sum = 0u;
39043
  v_i = 0u;
39044
  while (v_i < 256u) {
39045
    v_old_sum = v_sum;
39046
    v_sum += self->private_data.f_letter_counts[v_i];
39047
    self->private_data.f_letter_counts[v_i] = v_old_sum;
39048
    v_i += 1u;
39049
  }
39050
  v_i = 0u;
39051
  while (v_i < self->private_impl.f_block_size) {
39052
    v_letter = (self->private_data.f_bwt[v_i] & 255u);
39053
    self->private_data.f_bwt[(self->private_data.f_letter_counts[v_letter] & 1048575u)] |= (v_i << 12u);
39054
    self->private_data.f_letter_counts[v_letter] += 1u;
39055
    v_i += 1u;
39056
  }
39057
  return wuffs_base__make_empty_struct();
39058
}
39059
39060
// -------- func bzip2.decoder.flush_fast
39061
39062
WUFFS_BASE__GENERATED_C_CODE
39063
static wuffs_base__empty_struct
39064
wuffs_bzip2__decoder__flush_fast(
39065
    wuffs_bzip2__decoder* self,
39066
    wuffs_base__io_buffer* a_dst) {
39067
  uint32_t v_flush_pointer = 0;
39068
  uint32_t v_flush_repeat_count = 0;
39069
  uint8_t v_flush_prev = 0;
39070
  uint32_t v_block_checksum_have = 0;
39071
  uint32_t v_block_size = 0;
39072
  uint32_t v_entry = 0;
39073
  uint8_t v_curr = 0;
39074
39075
  uint8_t* iop_a_dst = NULL;
39076
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
39077
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
39078
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
39079
  if (a_dst && a_dst->data.ptr) {
39080
    io0_a_dst = a_dst->data.ptr;
39081
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
39082
    iop_a_dst = io1_a_dst;
39083
    io2_a_dst = io0_a_dst + a_dst->data.len;
39084
    if (a_dst->meta.closed) {
39085
      io2_a_dst = iop_a_dst;
39086
    }
39087
  }
39088
39089
  v_flush_pointer = self->private_impl.f_flush_pointer;
39090
  v_flush_repeat_count = self->private_impl.f_flush_repeat_count;
39091
  v_flush_prev = self->private_impl.f_flush_prev;
39092
  v_block_checksum_have = self->private_impl.f_block_checksum_have;
39093
  v_block_size = self->private_impl.f_block_size;
39094
  while ((v_block_size > 0u) && (((uint64_t)(io2_a_dst - iop_a_dst)) >= 255u)) {
39095
    if (v_flush_repeat_count < 4u) {
39096
      v_entry = self->private_data.f_bwt[v_flush_pointer];
39097
      v_curr = ((uint8_t)(v_entry));
39098
      v_flush_pointer = (v_entry >> 12u);
39099
      if (v_curr == v_flush_prev) {
39100
        v_flush_repeat_count += 1u;
39101
      } else {
39102
        v_flush_repeat_count = 1u;
39103
      }
39104
      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)));
39105
      (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, v_curr), iop_a_dst += 1);
39106
      v_flush_prev = v_curr;
39107
      v_block_size -= 1u;
39108
    } else {
39109
      v_entry = self->private_data.f_bwt[v_flush_pointer];
39110
      v_curr = ((uint8_t)(v_entry));
39111
      v_flush_pointer = (v_entry >> 12u);
39112
      v_flush_repeat_count = ((uint32_t)(v_curr));
39113
      while (v_flush_repeat_count > 0u) {
39114
        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)));
39115
        if (((uint64_t)(io2_a_dst - iop_a_dst)) > 0u) {
39116
          (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, v_flush_prev), iop_a_dst += 1);
39117
        }
39118
        v_flush_repeat_count -= 1u;
39119
      }
39120
      v_flush_repeat_count = 0u;
39121
      v_flush_prev = v_curr;
39122
      v_block_size -= 1u;
39123
    }
39124
  }
39125
  self->private_impl.f_flush_pointer = v_flush_pointer;
39126
  self->private_impl.f_flush_repeat_count = v_flush_repeat_count;
39127
  self->private_impl.f_flush_prev = v_flush_prev;
39128
  self->private_impl.f_block_checksum_have = v_block_checksum_have;
39129
  if (v_block_size <= 900000u) {
39130
    self->private_impl.f_block_size = v_block_size;
39131
  }
39132
  if (a_dst && a_dst->data.ptr) {
39133
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
39134
  }
39135
39136
  return wuffs_base__make_empty_struct();
39137
}
39138
39139
// -------- func bzip2.decoder.flush_slow
39140
39141
WUFFS_BASE__GENERATED_C_CODE
39142
static wuffs_base__status
39143
wuffs_bzip2__decoder__flush_slow(
39144
    wuffs_bzip2__decoder* self,
39145
    wuffs_base__io_buffer* a_dst) {
39146
  wuffs_base__status status = wuffs_base__make_status(NULL);
39147
39148
  uint32_t v_flush_pointer = 0;
39149
  uint32_t v_flush_repeat_count = 0;
39150
  uint8_t v_flush_prev = 0;
39151
  uint32_t v_block_checksum_have = 0;
39152
  uint32_t v_block_size = 0;
39153
  uint32_t v_entry = 0;
39154
  uint8_t v_curr = 0;
39155
39156
  uint8_t* iop_a_dst = NULL;
39157
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
39158
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
39159
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
39160
  if (a_dst && a_dst->data.ptr) {
39161
    io0_a_dst = a_dst->data.ptr;
39162
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
39163
    iop_a_dst = io1_a_dst;
39164
    io2_a_dst = io0_a_dst + a_dst->data.len;
39165
    if (a_dst->meta.closed) {
39166
      io2_a_dst = iop_a_dst;
39167
    }
39168
  }
39169
39170
  uint32_t coro_susp_point = self->private_impl.p_flush_slow;
39171
  if (coro_susp_point) {
39172
    v_flush_pointer = self->private_data.s_flush_slow.v_flush_pointer;
39173
    v_flush_repeat_count = self->private_data.s_flush_slow.v_flush_repeat_count;
39174
    v_flush_prev = self->private_data.s_flush_slow.v_flush_prev;
39175
    v_block_checksum_have = self->private_data.s_flush_slow.v_block_checksum_have;
39176
    v_block_size = self->private_data.s_flush_slow.v_block_size;
39177
    v_curr = self->private_data.s_flush_slow.v_curr;
39178
  }
39179
  switch (coro_susp_point) {
39180
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
39181
39182
    v_flush_pointer = self->private_impl.f_flush_pointer;
39183
    v_flush_repeat_count = self->private_impl.f_flush_repeat_count;
39184
    v_flush_prev = self->private_impl.f_flush_prev;
39185
    v_block_checksum_have = self->private_impl.f_block_checksum_have;
39186
    v_block_size = self->private_impl.f_block_size;
39187
    while ((v_block_size > 0u) &&  ! (self->private_impl.p_flush_slow != 0)) {
39188
      if (v_flush_repeat_count < 4u) {
39189
        v_entry = self->private_data.f_bwt[v_flush_pointer];
39190
        v_curr = ((uint8_t)(v_entry));
39191
        v_flush_pointer = (v_entry >> 12u);
39192
        if (v_curr == v_flush_prev) {
39193
          v_flush_repeat_count += 1u;
39194
        } else {
39195
          v_flush_repeat_count = 1u;
39196
        }
39197
        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)));
39198
        self->private_data.s_flush_slow.scratch = v_curr;
39199
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
39200
        if (iop_a_dst == io2_a_dst) {
39201
          status = wuffs_base__make_status(wuffs_base__suspension__short_write);
39202
          goto suspend;
39203
        }
39204
        *iop_a_dst++ = ((uint8_t)(self->private_data.s_flush_slow.scratch));
39205
        v_flush_prev = v_curr;
39206
        v_block_size -= 1u;
39207
      } else {
39208
        v_entry = self->private_data.f_bwt[v_flush_pointer];
39209
        v_curr = ((uint8_t)(v_entry));
39210
        v_flush_pointer = (v_entry >> 12u);
39211
        v_flush_repeat_count = ((uint32_t)(v_curr));
39212
        while (v_flush_repeat_count > 0u) {
39213
          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)));
39214
          self->private_data.s_flush_slow.scratch = v_flush_prev;
39215
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
39216
          if (iop_a_dst == io2_a_dst) {
39217
            status = wuffs_base__make_status(wuffs_base__suspension__short_write);
39218
            goto suspend;
39219
          }
39220
          *iop_a_dst++ = ((uint8_t)(self->private_data.s_flush_slow.scratch));
39221
          v_flush_repeat_count -= 1u;
39222
        }
39223
        v_flush_repeat_count = 0u;
39224
        v_flush_prev = v_curr;
39225
        v_block_size -= 1u;
39226
      }
39227
    }
39228
    self->private_impl.f_flush_pointer = v_flush_pointer;
39229
    self->private_impl.f_flush_repeat_count = v_flush_repeat_count;
39230
    self->private_impl.f_flush_prev = v_flush_prev;
39231
    self->private_impl.f_block_checksum_have = v_block_checksum_have;
39232
    if (v_block_size <= 900000u) {
39233
      self->private_impl.f_block_size = v_block_size;
39234
    }
39235
39236
    goto ok;
39237
    ok:
39238
    self->private_impl.p_flush_slow = 0;
39239
    goto exit;
39240
  }
39241
39242
  goto suspend;
39243
  suspend:
39244
  self->private_impl.p_flush_slow = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
39245
  self->private_data.s_flush_slow.v_flush_pointer = v_flush_pointer;
39246
  self->private_data.s_flush_slow.v_flush_repeat_count = v_flush_repeat_count;
39247
  self->private_data.s_flush_slow.v_flush_prev = v_flush_prev;
39248
  self->private_data.s_flush_slow.v_block_checksum_have = v_block_checksum_have;
39249
  self->private_data.s_flush_slow.v_block_size = v_block_size;
39250
  self->private_data.s_flush_slow.v_curr = v_curr;
39251
39252
  goto exit;
39253
  exit:
39254
  if (a_dst && a_dst->data.ptr) {
39255
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
39256
  }
39257
39258
  return status;
39259
}
39260
39261
// -------- func bzip2.decoder.decode_huffman_fast
39262
39263
WUFFS_BASE__GENERATED_C_CODE
39264
static wuffs_base__status
39265
wuffs_bzip2__decoder__decode_huffman_fast(
39266
    wuffs_bzip2__decoder* self,
39267
    wuffs_base__io_buffer* a_src) {
39268
  wuffs_base__status status = wuffs_base__make_status(NULL);
39269
39270
  uint32_t v_bits = 0;
39271
  uint32_t v_n_bits = 0;
39272
  uint32_t v_block_size = 0;
39273
  uint8_t v_which = 0;
39274
  uint32_t v_ticks = 0;
39275
  uint32_t v_section = 0;
39276
  uint32_t v_run_shift = 0;
39277
  uint16_t v_table_entry = 0;
39278
  uint16_t v_child = 0;
39279
  uint32_t v_child_ff = 0;
39280
  uint32_t v_i = 0;
39281
  uint32_t v_j = 0;
39282
  uint32_t v_output = 0;
39283
  uint32_t v_run = 0;
39284
  uint32_t v_mtft0 = 0;
39285
39286
  const uint8_t* iop_a_src = NULL;
39287
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
39288
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
39289
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
39290
  if (a_src && a_src->data.ptr) {
39291
    io0_a_src = a_src->data.ptr;
39292
    io1_a_src = io0_a_src + a_src->meta.ri;
39293
    iop_a_src = io1_a_src;
39294
    io2_a_src = io0_a_src + a_src->meta.wi;
39295
  }
39296
39297
  v_bits = self->private_impl.f_bits;
39298
  v_n_bits = self->private_impl.f_n_bits;
39299
  v_block_size = self->private_impl.f_block_size;
39300
  v_which = self->private_impl.f_decode_huffman_which;
39301
  v_ticks = self->private_impl.f_decode_huffman_ticks;
39302
  v_section = self->private_impl.f_decode_huffman_section;
39303
  v_run_shift = self->private_impl.f_decode_huffman_run_shift;
39304
  while (((uint64_t)(io2_a_src - iop_a_src)) >= 4u) {
39305
    if (v_ticks > 0u) {
39306
      v_ticks -= 1u;
39307
    } else {
39308
      v_ticks = 49u;
39309
      v_section += 1u;
39310
      if (v_section >= self->private_impl.f_num_sections) {
39311
        status = wuffs_base__make_status(wuffs_bzip2__error__bad_number_of_sections);
39312
        goto exit;
39313
      }
39314
      v_which = WUFFS_BZIP2__CLAMP_TO_5[((uint8_t)(self->private_data.f_huffman_selectors[(v_section & 32767u)] & 7u))];
39315
    }
39316
    v_bits |= (wuffs_base__peek_u32be__no_bounds_check(iop_a_src) >> v_n_bits);
39317
    iop_a_src += ((31u - v_n_bits) >> 3u);
39318
    v_n_bits |= 24u;
39319
    v_table_entry = self->private_data.f_huffman_tables[v_which][(v_bits >> 24u)];
39320
    v_bits <<= ((uint16_t)(v_table_entry >> 12u));
39321
    v_n_bits -= ((uint32_t)(((uint16_t)(v_table_entry >> 12u))));
39322
    v_child = ((uint16_t)(v_table_entry & 1023u));
39323
    while (v_child < 257u) {
39324
      v_child = self->private_data.f_huffman_trees[v_which][v_child][(v_bits >> 31u)];
39325
      v_bits <<= 1u;
39326
      if (v_n_bits <= 0u) {
39327
        status = wuffs_base__make_status(wuffs_bzip2__error__internal_error_inconsistent_huffman_decoder_state);
39328
        goto exit;
39329
      }
39330
      v_n_bits -= 1u;
39331
    }
39332
    if (v_child < 768u) {
39333
      v_child_ff = ((uint32_t)(((uint16_t)(v_child & 255u))));
39334
      v_output = ((uint32_t)(self->private_data.f_mtft[v_child_ff]));
39335
      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));
39336
      self->private_data.f_mtft[0u] = ((uint8_t)(v_output));
39337
      self->private_data.f_letter_counts[v_output] += 1u;
39338
      self->private_data.f_bwt[v_block_size] = v_output;
39339
      if (v_block_size >= self->private_impl.f_max_incl_block_size) {
39340
        status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length);
39341
        goto exit;
39342
      }
39343
      v_block_size += 1u;
39344
      v_run_shift = 0u;
39345
      continue;
39346
    } else if (v_child == 768u) {
39347
      self->private_impl.f_decode_huffman_finished = true;
39348
      break;
39349
    }
39350
    if (v_run_shift >= 23u) {
39351
      status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length);
39352
      goto exit;
39353
    }
39354
    v_run = ((((uint32_t)(v_child)) & 3u) << v_run_shift);
39355
    v_run_shift += 1u;
39356
    v_i = v_block_size;
39357
    v_j = (v_run + v_block_size);
39358
    if (v_j > self->private_impl.f_max_incl_block_size) {
39359
      status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length);
39360
      goto exit;
39361
    }
39362
    v_block_size = v_j;
39363
    v_mtft0 = ((uint32_t)(self->private_data.f_mtft[0u]));
39364
    self->private_data.f_letter_counts[v_mtft0] += v_run;
39365
    while (v_i < v_j) {
39366
      self->private_data.f_bwt[v_i] = v_mtft0;
39367
      v_i += 1u;
39368
    }
39369
  }
39370
  self->private_impl.f_bits = v_bits;
39371
  self->private_impl.f_n_bits = v_n_bits;
39372
  self->private_impl.f_block_size = v_block_size;
39373
  self->private_impl.f_decode_huffman_which = v_which;
39374
  self->private_impl.f_decode_huffman_ticks = v_ticks;
39375
  self->private_impl.f_decode_huffman_section = v_section;
39376
  self->private_impl.f_decode_huffman_run_shift = v_run_shift;
39377
  status = wuffs_base__make_status(NULL);
39378
  goto ok;
39379
39380
  ok:
39381
  goto exit;
39382
  exit:
39383
  if (a_src && a_src->data.ptr) {
39384
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
39385
  }
39386
39387
  return status;
39388
}
39389
39390
// -------- func bzip2.decoder.decode_huffman_slow
39391
39392
WUFFS_BASE__GENERATED_C_CODE
39393
static wuffs_base__status
39394
wuffs_bzip2__decoder__decode_huffman_slow(
39395
    wuffs_bzip2__decoder* self,
39396
    wuffs_base__io_buffer* a_src) {
39397
  wuffs_base__status status = wuffs_base__make_status(NULL);
39398
39399
  uint8_t v_c8 = 0;
39400
  uint32_t v_node_index = 0;
39401
  uint16_t v_child = 0;
39402
  uint32_t v_child_ff = 0;
39403
  uint32_t v_i = 0;
39404
  uint32_t v_j = 0;
39405
  uint32_t v_output = 0;
39406
  uint32_t v_run = 0;
39407
  uint32_t v_mtft0 = 0;
39408
39409
  const uint8_t* iop_a_src = NULL;
39410
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
39411
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
39412
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
39413
  if (a_src && a_src->data.ptr) {
39414
    io0_a_src = a_src->data.ptr;
39415
    io1_a_src = io0_a_src + a_src->meta.ri;
39416
    iop_a_src = io1_a_src;
39417
    io2_a_src = io0_a_src + a_src->meta.wi;
39418
  }
39419
39420
  uint32_t coro_susp_point = self->private_impl.p_decode_huffman_slow;
39421
  if (coro_susp_point) {
39422
    v_node_index = self->private_data.s_decode_huffman_slow.v_node_index;
39423
  }
39424
  switch (coro_susp_point) {
39425
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
39426
39427
    while ( ! (self->private_impl.p_decode_huffman_slow != 0)) {
39428
      if (self->private_impl.f_decode_huffman_ticks > 0u) {
39429
        self->private_impl.f_decode_huffman_ticks -= 1u;
39430
      } else {
39431
        self->private_impl.f_decode_huffman_ticks = 49u;
39432
        self->private_impl.f_decode_huffman_section += 1u;
39433
        if (self->private_impl.f_decode_huffman_section >= self->private_impl.f_num_sections) {
39434
          status = wuffs_base__make_status(wuffs_bzip2__error__bad_number_of_sections);
39435
          goto exit;
39436
        }
39437
        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))];
39438
      }
39439
      v_node_index = 0u;
39440
      while (true) {
39441
        if (self->private_impl.f_n_bits <= 0u) {
39442
          {
39443
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
39444
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
39445
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
39446
              goto suspend;
39447
            }
39448
            uint8_t t_0 = *iop_a_src++;
39449
            v_c8 = t_0;
39450
          }
39451
          self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u);
39452
          self->private_impl.f_n_bits = 8u;
39453
        }
39454
        v_child = self->private_data.f_huffman_trees[self->private_impl.f_decode_huffman_which][v_node_index][(self->private_impl.f_bits >> 31u)];
39455
        self->private_impl.f_bits <<= 1u;
39456
        self->private_impl.f_n_bits -= 1u;
39457
        if (v_child < 257u) {
39458
          v_node_index = ((uint32_t)(v_child));
39459
          continue;
39460
        } else if (v_child < 768u) {
39461
          v_child_ff = ((uint32_t)(((uint16_t)(v_child & 255u))));
39462
          v_output = ((uint32_t)(self->private_data.f_mtft[v_child_ff]));
39463
          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));
39464
          self->private_data.f_mtft[0u] = ((uint8_t)(v_output));
39465
          self->private_data.f_letter_counts[v_output] += 1u;
39466
          self->private_data.f_bwt[self->private_impl.f_block_size] = v_output;
39467
          if (self->private_impl.f_block_size >= self->private_impl.f_max_incl_block_size) {
39468
            status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length);
39469
            goto exit;
39470
          }
39471
          self->private_impl.f_block_size += 1u;
39472
          self->private_impl.f_decode_huffman_run_shift = 0u;
39473
          break;
39474
        } else if (v_child == 768u) {
39475
          self->private_impl.f_decode_huffman_finished = true;
39476
          goto label__outer__break;
39477
        }
39478
        if (self->private_impl.f_decode_huffman_run_shift >= 23u) {
39479
          status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length);
39480
          goto exit;
39481
        }
39482
        v_run = ((((uint32_t)(v_child)) & 3u) << self->private_impl.f_decode_huffman_run_shift);
39483
        self->private_impl.f_decode_huffman_run_shift += 1u;
39484
        v_i = self->private_impl.f_block_size;
39485
        v_j = (v_run + self->private_impl.f_block_size);
39486
        if (v_j > self->private_impl.f_max_incl_block_size) {
39487
          status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length);
39488
          goto exit;
39489
        }
39490
        self->private_impl.f_block_size = v_j;
39491
        v_mtft0 = ((uint32_t)(self->private_data.f_mtft[0u]));
39492
        self->private_data.f_letter_counts[v_mtft0] += v_run;
39493
        while (v_i < v_j) {
39494
          self->private_data.f_bwt[v_i] = v_mtft0;
39495
          v_i += 1u;
39496
        }
39497
        break;
39498
      }
39499
    }
39500
    label__outer__break:;
39501
39502
    goto ok;
39503
    ok:
39504
    self->private_impl.p_decode_huffman_slow = 0;
39505
    goto exit;
39506
  }
39507
39508
  goto suspend;
39509
  suspend:
39510
  self->private_impl.p_decode_huffman_slow = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
39511
  self->private_data.s_decode_huffman_slow.v_node_index = v_node_index;
39512
39513
  goto exit;
39514
  exit:
39515
  if (a_src && a_src->data.ptr) {
39516
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
39517
  }
39518
39519
  return status;
39520
}
39521
39522
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BZIP2)
39523
39524
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CBOR)
39525
39526
// ---------------- Status Codes Implementations
39527
39528
const char wuffs_cbor__error__bad_input[] = "#cbor: bad input";
39529
const char wuffs_cbor__error__unsupported_recursion_depth[] = "#cbor: unsupported recursion depth";
39530
const char wuffs_cbor__error__internal_error_inconsistent_i_o[] = "#cbor: internal error: inconsistent I/O";
39531
const char wuffs_cbor__error__internal_error_inconsistent_token_length[] = "#cbor: internal error: inconsistent token length";
39532
39533
// ---------------- Private Consts
39534
39535
static const uint32_t
39536
WUFFS_CBOR__LITERALS[4] WUFFS_BASE__POTENTIALLY_UNUSED = {
39537
  8388612u, 8388616u, 8388610u, 8388609u,
39538
};
39539
39540
static const uint8_t
39541
WUFFS_CBOR__TOKEN_LENGTHS[32] WUFFS_BASE__POTENTIALLY_UNUSED = {
39542
  1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u,
39543
  1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u,
39544
  1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u,
39545
  2u, 3u, 5u, 9u, 0u, 0u, 0u, 1u,
39546
};
39547
39548
// ---------------- Private Initializer Prototypes
39549
39550
// ---------------- Private Function Prototypes
39551
39552
// ---------------- VTables
39553
39554
const wuffs_base__token_decoder__func_ptrs
39555
wuffs_cbor__decoder__func_ptrs_for__wuffs_base__token_decoder = {
39556
  (wuffs_base__status(*)(void*,
39557
      wuffs_base__token_buffer*,
39558
      wuffs_base__io_buffer*,
39559
      wuffs_base__slice_u8))(&wuffs_cbor__decoder__decode_tokens),
39560
  (uint64_t(*)(const void*,
39561
      uint32_t))(&wuffs_cbor__decoder__get_quirk),
39562
  (wuffs_base__status(*)(void*,
39563
      uint32_t,
39564
      uint64_t))(&wuffs_cbor__decoder__set_quirk),
39565
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_cbor__decoder__workbuf_len),
39566
};
39567
39568
// ---------------- Initializer Implementations
39569
39570
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
39571
wuffs_cbor__decoder__initialize(
39572
    wuffs_cbor__decoder* self,
39573
    size_t sizeof_star_self,
39574
    uint64_t wuffs_version,
39575
    uint32_t options){
39576
  if (!self) {
39577
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
39578
  }
39579
  if (sizeof(*self) != sizeof_star_self) {
39580
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
39581
  }
39582
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
39583
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
39584
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
39585
  }
39586
39587
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
39588
    // The whole point of this if-check is to detect an uninitialized *self.
39589
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
39590
#if !defined(__clang__) && defined(__GNUC__)
39591
#pragma GCC diagnostic push
39592
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
39593
#endif
39594
    if (self->private_impl.magic != 0) {
39595
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
39596
    }
39597
#if !defined(__clang__) && defined(__GNUC__)
39598
#pragma GCC diagnostic pop
39599
#endif
39600
  } else {
39601
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
39602
      memset(self, 0, sizeof(*self));
39603
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
39604
    } else {
39605
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
39606
    }
39607
  }
39608
39609
  self->private_impl.magic = WUFFS_BASE__MAGIC;
39610
  self->private_impl.vtable_for__wuffs_base__token_decoder.vtable_name =
39611
      wuffs_base__token_decoder__vtable_name;
39612
  self->private_impl.vtable_for__wuffs_base__token_decoder.function_pointers =
39613
      (const void*)(&wuffs_cbor__decoder__func_ptrs_for__wuffs_base__token_decoder);
39614
  return wuffs_base__make_status(NULL);
39615
}
39616
39617
wuffs_cbor__decoder*
39618
wuffs_cbor__decoder__alloc(void) {
39619
  wuffs_cbor__decoder* x =
39620
      (wuffs_cbor__decoder*)(calloc(1, sizeof(wuffs_cbor__decoder)));
39621
  if (!x) {
39622
    return NULL;
39623
  }
39624
  if (wuffs_cbor__decoder__initialize(
39625
      x, sizeof(wuffs_cbor__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
39626
    free(x);
39627
    return NULL;
39628
  }
39629
  return x;
39630
}
39631
39632
size_t
39633
sizeof__wuffs_cbor__decoder(void) {
39634
  return sizeof(wuffs_cbor__decoder);
39635
}
39636
39637
// ---------------- Function Implementations
39638
39639
// -------- func cbor.decoder.get_quirk
39640
39641
WUFFS_BASE__GENERATED_C_CODE
39642
WUFFS_BASE__MAYBE_STATIC uint64_t
39643
wuffs_cbor__decoder__get_quirk(
39644
    const wuffs_cbor__decoder* self,
39645
    uint32_t a_key) {
39646
  if (!self) {
39647
    return 0;
39648
  }
39649
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
39650
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
39651
    return 0;
39652
  }
39653
39654
  return 0u;
39655
}
39656
39657
// -------- func cbor.decoder.set_quirk
39658
39659
WUFFS_BASE__GENERATED_C_CODE
39660
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
39661
wuffs_cbor__decoder__set_quirk(
39662
    wuffs_cbor__decoder* self,
39663
    uint32_t a_key,
39664
    uint64_t a_value) {
39665
  if (!self) {
39666
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
39667
  }
39668
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
39669
    return wuffs_base__make_status(
39670
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
39671
        ? wuffs_base__error__disabled_by_previous_error
39672
        : wuffs_base__error__initialize_not_called);
39673
  }
39674
39675
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
39676
}
39677
39678
// -------- func cbor.decoder.workbuf_len
39679
39680
WUFFS_BASE__GENERATED_C_CODE
39681
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
39682
wuffs_cbor__decoder__workbuf_len(
39683
    const wuffs_cbor__decoder* self) {
39684
  if (!self) {
39685
    return wuffs_base__utility__empty_range_ii_u64();
39686
  }
39687
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
39688
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
39689
    return wuffs_base__utility__empty_range_ii_u64();
39690
  }
39691
39692
  return wuffs_base__utility__empty_range_ii_u64();
39693
}
39694
39695
// -------- func cbor.decoder.decode_tokens
39696
39697
WUFFS_BASE__GENERATED_C_CODE
39698
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
39699
wuffs_cbor__decoder__decode_tokens(
39700
    wuffs_cbor__decoder* self,
39701
    wuffs_base__token_buffer* a_dst,
39702
    wuffs_base__io_buffer* a_src,
39703
    wuffs_base__slice_u8 a_workbuf) {
39704
  if (!self) {
39705
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
39706
  }
39707
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
39708
    return wuffs_base__make_status(
39709
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
39710
        ? wuffs_base__error__disabled_by_previous_error
39711
        : wuffs_base__error__initialize_not_called);
39712
  }
39713
  if (!a_dst || !a_src) {
39714
    self->private_impl.magic = WUFFS_BASE__DISABLED;
39715
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
39716
  }
39717
  if ((self->private_impl.active_coroutine != 0) &&
39718
      (self->private_impl.active_coroutine != 1)) {
39719
    self->private_impl.magic = WUFFS_BASE__DISABLED;
39720
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
39721
  }
39722
  self->private_impl.active_coroutine = 0;
39723
  wuffs_base__status status = wuffs_base__make_status(NULL);
39724
39725
  uint64_t v_string_length = 0;
39726
  uint64_t v_n64 = 0;
39727
  uint32_t v_depth = 0;
39728
  uint32_t v_stack_byte = 0;
39729
  uint32_t v_stack_bit = 0;
39730
  uint32_t v_stack_val = 0;
39731
  uint32_t v_token_length = 0;
39732
  uint32_t v_vminor = 0;
39733
  uint32_t v_vminor_alt = 0;
39734
  uint32_t v_continued = 0;
39735
  uint8_t v_c8 = 0;
39736
  uint8_t v_c_major = 0;
39737
  uint8_t v_c_minor = 0;
39738
  bool v_tagged = false;
39739
  uint8_t v_indefinite_string_major_type = 0;
39740
39741
  wuffs_base__token* iop_a_dst = NULL;
39742
  wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
39743
  wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
39744
  wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
39745
  if (a_dst && a_dst->data.ptr) {
39746
    io0_a_dst = a_dst->data.ptr;
39747
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
39748
    iop_a_dst = io1_a_dst;
39749
    io2_a_dst = io0_a_dst + a_dst->data.len;
39750
    if (a_dst->meta.closed) {
39751
      io2_a_dst = iop_a_dst;
39752
    }
39753
  }
39754
  const uint8_t* iop_a_src = NULL;
39755
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
39756
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
39757
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
39758
  if (a_src && a_src->data.ptr) {
39759
    io0_a_src = a_src->data.ptr;
39760
    io1_a_src = io0_a_src + a_src->meta.ri;
39761
    iop_a_src = io1_a_src;
39762
    io2_a_src = io0_a_src + a_src->meta.wi;
39763
  }
39764
39765
  uint32_t coro_susp_point = self->private_impl.p_decode_tokens;
39766
  if (coro_susp_point) {
39767
    v_string_length = self->private_data.s_decode_tokens.v_string_length;
39768
    v_depth = self->private_data.s_decode_tokens.v_depth;
39769
    v_tagged = self->private_data.s_decode_tokens.v_tagged;
39770
    v_indefinite_string_major_type = self->private_data.s_decode_tokens.v_indefinite_string_major_type;
39771
  }
39772
  switch (coro_susp_point) {
39773
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
39774
39775
    if (self->private_impl.f_end_of_data) {
39776
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
39777
      goto ok;
39778
    }
39779
    label__outer__continue:;
39780
    while (true) {
39781
      while (true) {
39782
        do {
39783
          if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 1u) {
39784
            status = wuffs_base__make_status(wuffs_base__suspension__short_write);
39785
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
39786
            goto label__outer__continue;
39787
          }
39788
          if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
39789
            if (a_src && a_src->meta.closed) {
39790
              status = wuffs_base__make_status(wuffs_cbor__error__bad_input);
39791
              goto exit;
39792
            }
39793
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
39794
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2);
39795
            goto label__outer__continue;
39796
          }
39797
          v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
39798
          if ((v_indefinite_string_major_type != 0u) && (v_indefinite_string_major_type != ((uint8_t)(v_c8 >> 5u)))) {
39799
            if (v_c8 != 255u) {
39800
              status = wuffs_base__make_status(wuffs_cbor__error__bad_input);
39801
              goto exit;
39802
            }
39803
            v_vminor = 4194560u;
39804
            if (v_indefinite_string_major_type == 3u) {
39805
              v_vminor |= 19u;
39806
            }
39807
            v_indefinite_string_major_type = 0u;
39808
            iop_a_src += 1u;
39809
            *iop_a_dst++ = wuffs_base__make_token(
39810
                (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
39811
                (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
39812
            goto label__goto_parsed_a_leaf_value__break;
39813
          }
39814
          iop_a_src += 1u;
39815
          v_c_major = ((uint8_t)(((uint8_t)(v_c8 >> 5u))));
39816
          v_c_minor = ((uint8_t)(v_c8 & 31u));
39817
          if (v_c_minor < 24u) {
39818
            v_string_length = ((uint64_t)(v_c_minor));
39819
          } else {
39820
            while (true) {
39821
              if (v_c_minor == 24u) {
39822
                if (((uint64_t)(io2_a_src - iop_a_src)) >= 1u) {
39823
                  v_string_length = ((uint64_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src)));
39824
                  iop_a_src += 1u;
39825
                  break;
39826
                }
39827
              } else if (v_c_minor == 25u) {
39828
                if (((uint64_t)(io2_a_src - iop_a_src)) >= 2u) {
39829
                  v_string_length = ((uint64_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src)));
39830
                  iop_a_src += 2u;
39831
                  break;
39832
                }
39833
              } else if (v_c_minor == 26u) {
39834
                if (((uint64_t)(io2_a_src - iop_a_src)) >= 4u) {
39835
                  v_string_length = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src)));
39836
                  iop_a_src += 4u;
39837
                  break;
39838
                }
39839
              } else if (v_c_minor == 27u) {
39840
                if (((uint64_t)(io2_a_src - iop_a_src)) >= 8u) {
39841
                  v_string_length = wuffs_base__peek_u64be__no_bounds_check(iop_a_src);
39842
                  iop_a_src += 8u;
39843
                  break;
39844
                }
39845
              } else {
39846
                v_string_length = 0u;
39847
                break;
39848
              }
39849
              if (iop_a_src > io1_a_src) {
39850
                iop_a_src--;
39851
                if (a_src && a_src->meta.closed) {
39852
                  status = wuffs_base__make_status(wuffs_cbor__error__bad_input);
39853
                  goto exit;
39854
                }
39855
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
39856
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3);
39857
                goto label__outer__continue;
39858
              }
39859
              status = wuffs_base__make_status(wuffs_cbor__error__internal_error_inconsistent_i_o);
39860
              goto exit;
39861
            }
39862
          }
39863
          if (v_c_major == 0u) {
39864
            if (v_c_minor < 26u) {
39865
              *iop_a_dst++ = wuffs_base__make_token(
39866
                  (((uint64_t)((14680064u | ((uint32_t)((v_string_length & 65535u)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
39867
                  (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
39868
              goto label__goto_parsed_a_leaf_value__break;
39869
            } else if (v_c_minor < 28u) {
39870
              *iop_a_dst++ = wuffs_base__make_token(
39871
                  (((uint64_t)((14680064u | ((uint32_t)((v_string_length >> 46u)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
39872
                  (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
39873
                  (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
39874
              *iop_a_dst++ = wuffs_base__make_token(
39875
                  (~(v_string_length & 70368744177663u) << WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT) |
39876
                  (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
39877
              goto label__goto_parsed_a_leaf_value__break;
39878
            }
39879
          } else if (v_c_major == 1u) {
39880
            if (v_c_minor < 26u) {
39881
              *iop_a_dst++ = wuffs_base__make_token(
39882
                  (((uint64_t)((12582912u | (2097151u - ((uint32_t)((v_string_length & 65535u))))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
39883
                  (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
39884
              goto label__goto_parsed_a_leaf_value__break;
39885
            } else if (v_c_minor < 28u) {
39886
              if (v_string_length < 9223372036854775808u) {
39887
                *iop_a_dst++ = wuffs_base__make_token(
39888
                    (((uint64_t)((12582912u | (2097151u - ((uint32_t)((v_string_length >> 46u))))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
39889
                    (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
39890
                    (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
39891
                *iop_a_dst++ = wuffs_base__make_token(
39892
                    (~((18446744073709551615u - v_string_length) & 70368744177663u) << WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT) |
39893
                    (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
39894
              } else {
39895
                *iop_a_dst++ = wuffs_base__make_token(
39896
                    (((uint64_t)(731642u)) << WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT) |
39897
                    (((uint64_t)(16777216u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
39898
                    (((uint64_t)(9u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
39899
              }
39900
              goto label__goto_parsed_a_leaf_value__break;
39901
            }
39902
          } else if (v_c_major == 2u) {
39903
            if (v_c_minor < 28u) {
39904
              if (v_string_length == 0u) {
39905
                *iop_a_dst++ = wuffs_base__make_token(
39906
                    (((uint64_t)(4194560u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
39907
                    (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
39908
                goto label__goto_parsed_a_leaf_value__break;
39909
              }
39910
              *iop_a_dst++ = wuffs_base__make_token(
39911
                  (((uint64_t)(4194560u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
39912
                  (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
39913
                  (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
39914
            } else if (v_c_minor == 31u) {
39915
              if (v_indefinite_string_major_type != 0u) {
39916
                break;
39917
              }
39918
              v_indefinite_string_major_type = 2u;
39919
              *iop_a_dst++ = wuffs_base__make_token(
39920
                  (((uint64_t)(4194560u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
39921
                  (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
39922
                  (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
39923
              goto label__outer__continue;
39924
            } else {
39925
              break;
39926
            }
39927
            while (true) {
39928
              if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
39929
                status = wuffs_base__make_status(wuffs_base__suspension__short_write);
39930
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4);
39931
                continue;
39932
              }
39933
              v_n64 = wuffs_base__u64__min(v_string_length, ((uint64_t)(io2_a_src - iop_a_src)));
39934
              v_token_length = ((uint32_t)((v_n64 & 65535u)));
39935
              if (v_n64 > 65535u) {
39936
                v_token_length = 65535u;
39937
              } else if (v_token_length <= 0u) {
39938
                if (a_src && a_src->meta.closed) {
39939
                  status = wuffs_base__make_status(wuffs_cbor__error__bad_input);
39940
                  goto exit;
39941
                }
39942
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
39943
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5);
39944
                continue;
39945
              }
39946
              if (((uint64_t)(io2_a_src - iop_a_src)) < ((uint64_t)(v_token_length))) {
39947
                status = wuffs_base__make_status(wuffs_cbor__error__internal_error_inconsistent_token_length);
39948
                goto exit;
39949
              }
39950
              v_string_length -= ((uint64_t)(v_token_length));
39951
              v_continued = 0u;
39952
              if ((v_string_length > 0u) || (v_indefinite_string_major_type > 0u)) {
39953
                v_continued = 1u;
39954
              }
39955
              iop_a_src += v_token_length;
39956
              *iop_a_dst++ = wuffs_base__make_token(
39957
                  (((uint64_t)(4194816u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
39958
                  (((uint64_t)(v_continued)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
39959
                  (((uint64_t)(v_token_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
39960
              if (v_string_length > 0u) {
39961
                continue;
39962
              } else if (v_indefinite_string_major_type > 0u) {
39963
                goto label__outer__continue;
39964
              }
39965
              goto label__goto_parsed_a_leaf_value__break;
39966
            }
39967
          } else if (v_c_major == 3u) {
39968
            if (v_c_minor < 28u) {
39969
              if (v_string_length == 0u) {
39970
                *iop_a_dst++ = wuffs_base__make_token(
39971
                    (((uint64_t)(4194579u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
39972
                    (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
39973
                goto label__goto_parsed_a_leaf_value__break;
39974
              }
39975
              *iop_a_dst++ = wuffs_base__make_token(
39976
                  (((uint64_t)(4194579u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
39977
                  (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
39978
                  (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
39979
            } else if (v_c_minor == 31u) {
39980
              if (v_indefinite_string_major_type != 0u) {
39981
                break;
39982
              }
39983
              v_indefinite_string_major_type = 3u;
39984
              *iop_a_dst++ = wuffs_base__make_token(
39985
                  (((uint64_t)(4194579u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
39986
                  (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
39987
                  (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
39988
              goto label__outer__continue;
39989
            } else {
39990
              break;
39991
            }
39992
            while (true) {
39993
              if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
39994
                status = wuffs_base__make_status(wuffs_base__suspension__short_write);
39995
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6);
39996
                continue;
39997
              }
39998
              v_n64 = wuffs_base__u64__min(v_string_length, 65535u);
39999
              v_n64 = ((uint64_t)(wuffs_base__utf_8__longest_valid_prefix(iop_a_src,
40000
                  ((size_t)(wuffs_base__u64__min(((uint64_t)(io2_a_src - iop_a_src)), v_n64))))));
40001
              v_token_length = ((uint32_t)((v_n64 & 65535u)));
40002
              if (v_token_length <= 0u) {
40003
                if ((a_src && a_src->meta.closed) || (((uint64_t)(io2_a_src - iop_a_src)) >= 4u)) {
40004
                  status = wuffs_base__make_status(wuffs_cbor__error__bad_input);
40005
                  goto exit;
40006
                }
40007
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
40008
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7);
40009
                continue;
40010
              }
40011
              if (((uint64_t)(io2_a_src - iop_a_src)) < ((uint64_t)(v_token_length))) {
40012
                status = wuffs_base__make_status(wuffs_cbor__error__internal_error_inconsistent_token_length);
40013
                goto exit;
40014
              }
40015
              v_string_length -= ((uint64_t)(v_token_length));
40016
              v_continued = 0u;
40017
              if ((v_string_length > 0u) || (v_indefinite_string_major_type > 0u)) {
40018
                v_continued = 1u;
40019
              }
40020
              iop_a_src += v_token_length;
40021
              *iop_a_dst++ = wuffs_base__make_token(
40022
                  (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
40023
                  (((uint64_t)(v_continued)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
40024
                  (((uint64_t)(v_token_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
40025
              if (v_string_length > 0u) {
40026
                continue;
40027
              } else if (v_indefinite_string_major_type > 0u) {
40028
                goto label__outer__continue;
40029
              }
40030
              goto label__goto_parsed_a_leaf_value__break;
40031
            }
40032
          } else if (v_c_major == 4u) {
40033
            if (WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor] == 0u) {
40034
              break;
40035
            } else if (v_depth >= 1024u) {
40036
              v_token_length = ((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor]));
40037
              while ((v_token_length > 0u) && (iop_a_src > io1_a_src)) {
40038
                iop_a_src--;
40039
                v_token_length -= 1u;
40040
              }
40041
              status = wuffs_base__make_status(wuffs_cbor__error__unsupported_recursion_depth);
40042
              goto exit;
40043
            }
40044
            v_vminor = 2105361u;
40045
            v_vminor_alt = 2101282u;
40046
            if (v_depth > 0u) {
40047
              v_stack_byte = ((v_depth - 1u) / 16u);
40048
              v_stack_bit = (((v_depth - 1u) & 15u) * 2u);
40049
              if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) {
40050
                v_vminor = 2105377u;
40051
                v_vminor_alt = 2105378u;
40052
              } else {
40053
                v_vminor = 2105409u;
40054
                v_vminor_alt = 2113570u;
40055
              }
40056
            }
40057
            *iop_a_dst++ = wuffs_base__make_token(
40058
                (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
40059
                (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
40060
            if (v_c_minor == 0u) {
40061
              *iop_a_dst++ = wuffs_base__make_token(
40062
                  (((uint64_t)(v_vminor_alt)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
40063
                  (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
40064
              goto label__goto_parsed_a_leaf_value__break;
40065
            }
40066
            v_stack_byte = (v_depth / 16u);
40067
            v_stack_bit = ((v_depth & 15u) * 2u);
40068
            self->private_data.f_stack[v_stack_byte] &= (4294967295u ^ (((uint32_t)(3u)) << v_stack_bit));
40069
            self->private_data.f_container_num_remaining[v_depth] = v_string_length;
40070
            v_depth += 1u;
40071
            v_tagged = false;
40072
            goto label__outer__continue;
40073
          } else if (v_c_major == 5u) {
40074
            if (WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor] == 0u) {
40075
              break;
40076
            } else if (v_depth >= 1024u) {
40077
              v_token_length = ((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor]));
40078
              while ((v_token_length > 0u) && (iop_a_src > io1_a_src)) {
40079
                iop_a_src--;
40080
                v_token_length -= 1u;
40081
              }
40082
              status = wuffs_base__make_status(wuffs_cbor__error__unsupported_recursion_depth);
40083
              goto exit;
40084
            }
40085
            v_vminor = 2113553u;
40086
            v_vminor_alt = 2101314u;
40087
            if (v_depth > 0u) {
40088
              v_stack_byte = ((v_depth - 1u) / 16u);
40089
              v_stack_bit = (((v_depth - 1u) & 15u) * 2u);
40090
              if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) {
40091
                v_vminor = 2113569u;
40092
                v_vminor_alt = 2105410u;
40093
              } else {
40094
                v_vminor = 2113601u;
40095
                v_vminor_alt = 2113602u;
40096
              }
40097
            }
40098
            *iop_a_dst++ = wuffs_base__make_token(
40099
                (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
40100
                (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
40101
            if (v_c_minor == 0u) {
40102
              *iop_a_dst++ = wuffs_base__make_token(
40103
                  (((uint64_t)(v_vminor_alt)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
40104
                  (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
40105
              goto label__goto_parsed_a_leaf_value__break;
40106
            }
40107
            v_stack_byte = (v_depth / 16u);
40108
            v_stack_bit = ((v_depth & 15u) * 2u);
40109
            self->private_data.f_stack[v_stack_byte] |= (((uint32_t)(3u)) << v_stack_bit);
40110
            self->private_data.f_container_num_remaining[v_depth] = v_string_length;
40111
            v_depth += 1u;
40112
            v_tagged = false;
40113
            goto label__outer__continue;
40114
          } else if (v_c_major == 6u) {
40115
            if (v_c_minor >= 28u) {
40116
              break;
40117
            }
40118
            if (v_string_length < 262144u) {
40119
              *iop_a_dst++ = wuffs_base__make_token(
40120
                  (((uint64_t)(731642u)) << WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT) |
40121
                  (((uint64_t)((4194304u | ((uint32_t)(v_string_length))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
40122
                  (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
40123
            } else {
40124
              *iop_a_dst++ = wuffs_base__make_token(
40125
                  (((uint64_t)(731642u)) << WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT) |
40126
                  (((uint64_t)((4194304u | ((uint32_t)((v_string_length >> 46u)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
40127
                  (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
40128
                  (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
40129
              *iop_a_dst++ = wuffs_base__make_token(
40130
                  (~(v_string_length & 70368744177663u) << WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT) |
40131
                  (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
40132
            }
40133
            v_tagged = true;
40134
            goto label__outer__continue;
40135
          } else if (v_c_major == 7u) {
40136
            if (v_c_minor < 20u) {
40137
              *iop_a_dst++ = wuffs_base__make_token(
40138
                  (((uint64_t)(731642u)) << WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT) |
40139
                  (((uint64_t)((8388608u | ((uint32_t)((v_string_length & 255u)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
40140
                  (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
40141
              goto label__goto_parsed_a_leaf_value__break;
40142
            } else if (v_c_minor < 24u) {
40143
              *iop_a_dst++ = wuffs_base__make_token(
40144
                  (((uint64_t)(WUFFS_CBOR__LITERALS[((uint8_t)(v_c_minor & 3u))])) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
40145
                  (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
40146
              goto label__goto_parsed_a_leaf_value__break;
40147
            } else if (v_c_minor == 24u) {
40148
              if (v_string_length < 24u) {
40149
                if ( ! (iop_a_src > io1_a_src)) {
40150
                  status = wuffs_base__make_status(wuffs_cbor__error__internal_error_inconsistent_i_o);
40151
                  goto exit;
40152
                }
40153
                iop_a_src--;
40154
                break;
40155
              }
40156
              *iop_a_dst++ = wuffs_base__make_token(
40157
                  (((uint64_t)(731642u)) << WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT) |
40158
                  (((uint64_t)((8388608u | ((uint32_t)((v_string_length & 255u)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
40159
                  (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
40160
              goto label__goto_parsed_a_leaf_value__break;
40161
            } else if (v_c_minor < 28u) {
40162
              *iop_a_dst++ = wuffs_base__make_token(
40163
                  (((uint64_t)(10490113u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
40164
                  (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
40165
              goto label__goto_parsed_a_leaf_value__break;
40166
            } else if (v_c_minor == 31u) {
40167
              if (v_tagged || (v_depth <= 0u)) {
40168
                break;
40169
              }
40170
              v_depth -= 1u;
40171
              if (self->private_data.f_container_num_remaining[v_depth] != 0u) {
40172
                break;
40173
              }
40174
              v_stack_byte = (v_depth / 16u);
40175
              v_stack_bit = ((v_depth & 15u) * 2u);
40176
              v_stack_val = (3u & (self->private_data.f_stack[v_stack_byte] >> v_stack_bit));
40177
              if (v_stack_val == 1u) {
40178
                break;
40179
              }
40180
              if (v_stack_val != 3u) {
40181
                v_vminor_alt = 2097186u;
40182
              } else {
40183
                v_vminor_alt = 2097218u;
40184
              }
40185
              if (v_depth <= 0u) {
40186
                v_vminor_alt |= 4096u;
40187
              } else {
40188
                v_stack_byte = ((v_depth - 1u) / 16u);
40189
                v_stack_bit = (((v_depth - 1u) & 15u) * 2u);
40190
                if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) {
40191
                  v_vminor_alt |= 8192u;
40192
                } else {
40193
                  v_vminor_alt |= 16384u;
40194
                }
40195
              }
40196
              *iop_a_dst++ = wuffs_base__make_token(
40197
                  (((uint64_t)(v_vminor_alt)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
40198
                  (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
40199
              goto label__goto_parsed_a_leaf_value__break;
40200
            }
40201
          }
40202
        } while (0);
40203
        if (iop_a_src > io1_a_src) {
40204
          iop_a_src--;
40205
          status = wuffs_base__make_status(wuffs_cbor__error__bad_input);
40206
          goto exit;
40207
        }
40208
        status = wuffs_base__make_status(wuffs_cbor__error__internal_error_inconsistent_i_o);
40209
        goto exit;
40210
      }
40211
      label__goto_parsed_a_leaf_value__break:;
40212
      v_tagged = false;
40213
      while (v_depth > 0u) {
40214
        v_stack_byte = ((v_depth - 1u) / 16u);
40215
        v_stack_bit = (((v_depth - 1u) & 15u) * 2u);
40216
        self->private_data.f_stack[v_stack_byte] ^= (((uint32_t)(1u)) << (v_stack_bit + 1u));
40217
        if (1u == (3u & (self->private_data.f_stack[v_stack_byte] >> v_stack_bit))) {
40218
          goto label__outer__continue;
40219
        }
40220
        if (self->private_data.f_container_num_remaining[(v_depth - 1u)] <= 0u) {
40221
          goto label__outer__continue;
40222
        }
40223
        self->private_data.f_container_num_remaining[(v_depth - 1u)] -= 1u;
40224
        if (self->private_data.f_container_num_remaining[(v_depth - 1u)] > 0u) {
40225
          goto label__outer__continue;
40226
        }
40227
        while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
40228
          status = wuffs_base__make_status(wuffs_base__suspension__short_write);
40229
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8);
40230
          continue;
40231
        }
40232
        v_depth -= 1u;
40233
        v_stack_byte = (v_depth / 16u);
40234
        v_stack_bit = ((v_depth & 15u) * 2u);
40235
        if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) {
40236
          v_vminor_alt = 2097186u;
40237
        } else {
40238
          v_vminor_alt = 2097218u;
40239
        }
40240
        if (v_depth <= 0u) {
40241
          v_vminor_alt |= 4096u;
40242
        } else {
40243
          v_stack_byte = ((v_depth - 1u) / 16u);
40244
          v_stack_bit = (((v_depth - 1u) & 15u) * 2u);
40245
          if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) {
40246
            v_vminor_alt |= 8192u;
40247
          } else {
40248
            v_vminor_alt |= 16384u;
40249
          }
40250
        }
40251
        *iop_a_dst++ = wuffs_base__make_token(
40252
            (((uint64_t)(v_vminor_alt)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
40253
            (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
40254
      }
40255
      break;
40256
    }
40257
    self->private_impl.f_end_of_data = true;
40258
40259
    ok:
40260
    self->private_impl.p_decode_tokens = 0;
40261
    goto exit;
40262
  }
40263
40264
  goto suspend;
40265
  suspend:
40266
  self->private_impl.p_decode_tokens = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
40267
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
40268
  self->private_data.s_decode_tokens.v_string_length = v_string_length;
40269
  self->private_data.s_decode_tokens.v_depth = v_depth;
40270
  self->private_data.s_decode_tokens.v_tagged = v_tagged;
40271
  self->private_data.s_decode_tokens.v_indefinite_string_major_type = v_indefinite_string_major_type;
40272
40273
  goto exit;
40274
  exit:
40275
  if (a_dst && a_dst->data.ptr) {
40276
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
40277
  }
40278
  if (a_src && a_src->data.ptr) {
40279
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
40280
  }
40281
40282
  if (wuffs_base__status__is_error(&status)) {
40283
    self->private_impl.magic = WUFFS_BASE__DISABLED;
40284
  }
40285
  return status;
40286
}
40287
40288
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CBOR)
40289
40290
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC32)
40291
40292
// ---------------- Status Codes Implementations
40293
40294
// ---------------- Private Consts
40295
40296
static const uint32_t
40297
WUFFS_CRC32__IEEE_TABLE[16][256] WUFFS_BASE__POTENTIALLY_UNUSED = {
40298
  {
40299
    0u, 1996959894u, 3993919788u, 2567524794u, 124634137u, 1886057615u, 3915621685u, 2657392035u,
40300
    249268274u, 2044508324u, 3772115230u, 2547177864u, 162941995u, 2125561021u, 3887607047u, 2428444049u,
40301
    498536548u, 1789927666u, 4089016648u, 2227061214u, 450548861u, 1843258603u, 4107580753u, 2211677639u,
40302
    325883990u, 1684777152u, 4251122042u, 2321926636u, 335633487u, 1661365465u, 4195302755u, 2366115317u,
40303
    997073096u, 1281953886u, 3579855332u, 2724688242u, 1006888145u, 1258607687u, 3524101629u, 2768942443u,
40304
    901097722u, 1119000684u, 3686517206u, 2898065728u, 853044451u, 1172266101u, 3705015759u, 2882616665u,
40305
    651767980u, 1373503546u, 3369554304u, 3218104598u, 565507253u, 1454621731u, 3485111705u, 3099436303u,
40306
    671266974u, 1594198024u, 3322730930u, 2970347812u, 795835527u, 1483230225u, 3244367275u, 3060149565u,
40307
    1994146192u, 31158534u, 2563907772u, 4023717930u, 1907459465u, 112637215u, 2680153253u, 3904427059u,
40308
    2013776290u, 251722036u, 2517215374u, 3775830040u, 2137656763u, 141376813u, 2439277719u, 3865271297u,
40309
    1802195444u, 476864866u, 2238001368u, 4066508878u, 1812370925u, 453092731u, 2181625025u, 4111451223u,
40310
    1706088902u, 314042704u, 2344532202u, 4240017532u, 1658658271u, 366619977u, 2362670323u, 4224994405u,
40311
    1303535960u, 984961486u, 2747007092u, 3569037538u, 1256170817u, 1037604311u, 2765210733u, 3554079995u,
40312
    1131014506u, 879679996u, 2909243462u, 3663771856u, 1141124467u, 855842277u, 2852801631u, 3708648649u,
40313
    1342533948u, 654459306u, 3188396048u, 3373015174u, 1466479909u, 544179635u, 3110523913u, 3462522015u,
40314
    1591671054u, 702138776u, 2966460450u, 3352799412u, 1504918807u, 783551873u, 3082640443u, 3233442989u,
40315
    3988292384u, 2596254646u, 62317068u, 1957810842u, 3939845945u, 2647816111u, 81470997u, 1943803523u,
40316
    3814918930u, 2489596804u, 225274430u, 2053790376u, 3826175755u, 2466906013u, 167816743u, 2097651377u,
40317
    4027552580u, 2265490386u, 503444072u, 1762050814u, 4150417245u, 2154129355u, 426522225u, 1852507879u,
40318
    4275313526u, 2312317920u, 282753626u, 1742555852u, 4189708143u, 2394877945u, 397917763u, 1622183637u,
40319
    3604390888u, 2714866558u, 953729732u, 1340076626u, 3518719985u, 2797360999u, 1068828381u, 1219638859u,
40320
    3624741850u, 2936675148u, 906185462u, 1090812512u, 3747672003u, 2825379669u, 829329135u, 1181335161u,
40321
    3412177804u, 3160834842u, 628085408u, 1382605366u, 3423369109u, 3138078467u, 570562233u, 1426400815u,
40322
    3317316542u, 2998733608u, 733239954u, 1555261956u, 3268935591u, 3050360625u, 752459403u, 1541320221u,
40323
    2607071920u, 3965973030u, 1969922972u, 40735498u, 2617837225u, 3943577151u, 1913087877u, 83908371u,
40324
    2512341634u, 3803740692u, 2075208622u, 213261112u, 2463272603u, 3855990285u, 2094854071u, 198958881u,
40325
    2262029012u, 4057260610u, 1759359992u, 534414190u, 2176718541u, 4139329115u, 1873836001u, 414664567u,
40326
    2282248934u, 4279200368u, 1711684554u, 285281116u, 2405801727u, 4167216745u, 1634467795u, 376229701u,
40327
    2685067896u, 3608007406u, 1308918612u, 956543938u, 2808555105u, 3495958263u, 1231636301u, 1047427035u,
40328
    2932959818u, 3654703836u, 1088359270u, 936918000u, 2847714899u, 3736837829u, 1202900863u, 817233897u,
40329
    3183342108u, 3401237130u, 1404277552u, 615818150u, 3134207493u, 3453421203u, 1423857449u, 601450431u,
40330
    3009837614u, 3294710456u, 1567103746u, 711928724u, 3020668471u, 3272380065u, 1510334235u, 755167117u,
40331
  }, {
40332
    0u, 421212481u, 842424962u, 724390851u, 1684849924u, 2105013317u, 1448781702u, 1329698503u,
40333
    3369699848u, 3519200073u, 4210026634u, 3824474571u, 2897563404u, 3048111693u, 2659397006u, 2274893007u,
40334
    1254232657u, 1406739216u, 2029285587u, 1643069842u, 783210325u, 934667796u, 479770071u, 92505238u,
40335
    2182846553u, 2600511768u, 2955803355u, 2838940570u, 3866582365u, 4285295644u, 3561045983u, 3445231262u,
40336
    2508465314u, 2359236067u, 2813478432u, 3198777185u, 4058571174u, 3908292839u, 3286139684u, 3670389349u,
40337
    1566420650u, 1145479147u, 1869335592u, 1987116393u, 959540142u, 539646703u, 185010476u, 303839341u,
40338
    3745920755u, 3327985586u, 3983561841u, 4100678960u, 3140154359u, 2721170102u, 2300350837u, 2416418868u,
40339
    396344571u, 243568058u, 631889529u, 1018359608u, 1945336319u, 1793607870u, 1103436669u, 1490954812u,
40340
    4034481925u, 3915546180u, 3259968903u, 3679722694u, 2484439553u, 2366552896u, 2787371139u, 3208174018u,
40341
    950060301u, 565965900u, 177645455u, 328046286u, 1556873225u, 1171730760u, 1861902987u, 2011255754u,
40342
    3132841300u, 2745199637u, 2290958294u, 2442530455u, 3738671184u, 3352078609u, 3974232786u, 4126854035u,
40343
    1919080284u, 1803150877u, 1079293406u, 1498383519u, 370020952u, 253043481u, 607678682u, 1025720731u,
40344
    1711106983u, 2095471334u, 1472923941u, 1322268772u, 26324643u, 411738082u, 866634785u, 717028704u,
40345
    2904875439u, 3024081134u, 2668790573u, 2248782444u, 3376948395u, 3495106026u, 4219356713u, 3798300520u,
40346
    792689142u, 908347575u, 487136116u, 68299317u, 1263779058u, 1380486579u, 2036719216u, 1618931505u,
40347
    3890672638u, 4278043327u, 3587215740u, 3435896893u, 2206873338u, 2593195963u, 2981909624u, 2829542713u,
40348
    998479947u, 580430090u, 162921161u, 279890824u, 1609522511u, 1190423566u, 1842954189u, 1958874764u,
40349
    4082766403u, 3930137346u, 3245109441u, 3631694208u, 2536953671u, 2385372678u, 2768287173u, 3155920004u,
40350
    1900120602u, 1750776667u, 1131931800u, 1517083097u, 355290910u, 204897887u, 656092572u, 1040194781u,
40351
    3113746450u, 2692952403u, 2343461520u, 2461357009u, 3723805974u, 3304059991u, 4022511508u, 4141455061u,
40352
    2919742697u, 3072101800u, 2620513899u, 2234183466u, 3396041197u, 3547351212u, 4166851439u, 3779471918u,
40353
    1725839073u, 2143618976u, 1424512099u, 1307796770u, 45282277u, 464110244u, 813994343u, 698327078u,
40354
    3838160568u, 4259225593u, 3606301754u, 3488152955u, 2158586812u, 2578602749u, 2996767038u, 2877569151u,
40355
    740041904u, 889656817u, 506086962u, 120682355u, 1215357364u, 1366020341u, 2051441462u, 1667084919u,
40356
    3422213966u, 3538019855u, 4190942668u, 3772220557u, 2945847882u, 3062702859u, 2644537544u, 2226864521u,
40357
    52649286u, 439905287u, 823476164u, 672009861u, 1733269570u, 2119477507u, 1434057408u, 1281543041u,
40358
    2167981343u, 2552493150u, 3004082077u, 2853541596u, 3847487515u, 4233048410u, 3613549209u, 3464057816u,
40359
    1239502615u, 1358593622u, 2077699477u, 1657543892u, 764250643u, 882293586u, 532408465u, 111204816u,
40360
    1585378284u, 1197851309u, 1816695150u, 1968414767u, 974272232u, 587794345u, 136598634u, 289367339u,
40361
    2527558116u, 2411481253u, 2760973158u, 3179948583u, 4073438432u, 3956313505u, 3237863010u, 3655790371u,
40362
    347922877u, 229101820u, 646611775u, 1066513022u, 1892689081u, 1774917112u, 1122387515u, 1543337850u,
40363
    3697634229u, 3313392372u, 3998419255u, 4148705398u, 3087642289u, 2702352368u, 2319436851u, 2468674930u,
40364
  }, {
40365
    0u, 29518391u, 59036782u, 38190681u, 118073564u, 114017003u, 76381362u, 89069189u,
40366
    236147128u, 265370511u, 228034006u, 206958561u, 152762724u, 148411219u, 178138378u, 190596925u,
40367
    472294256u, 501532999u, 530741022u, 509615401u, 456068012u, 451764635u, 413917122u, 426358261u,
40368
    305525448u, 334993663u, 296822438u, 275991697u, 356276756u, 352202787u, 381193850u, 393929805u,
40369
    944588512u, 965684439u, 1003065998u, 973863097u, 1061482044u, 1049003019u, 1019230802u, 1023561829u,
40370
    912136024u, 933002607u, 903529270u, 874031361u, 827834244u, 815125939u, 852716522u, 856752605u,
40371
    611050896u, 631869351u, 669987326u, 640506825u, 593644876u, 580921211u, 551983394u, 556069653u,
40372
    712553512u, 733666847u, 704405574u, 675154545u, 762387700u, 749958851u, 787859610u, 792175277u,
40373
    1889177024u, 1901651959u, 1931368878u, 1927033753u, 2006131996u, 1985040171u, 1947726194u, 1976933189u,
40374
    2122964088u, 2135668303u, 2098006038u, 2093965857u, 2038461604u, 2017599123u, 2047123658u, 2076625661u,
40375
    1824272048u, 1836991623u, 1866005214u, 1861914857u, 1807058540u, 1786244187u, 1748062722u, 1777547317u,
40376
    1655668488u, 1668093247u, 1630251878u, 1625932113u, 1705433044u, 1684323811u, 1713505210u, 1742760333u,
40377
    1222101792u, 1226154263u, 1263738702u, 1251046777u, 1339974652u, 1310460363u, 1281013650u, 1301863845u,
40378
    1187289752u, 1191637167u, 1161842422u, 1149379777u, 1103966788u, 1074747507u, 1112139306u, 1133218845u,
40379
    1425107024u, 1429406311u, 1467333694u, 1454888457u, 1408811148u, 1379576507u, 1350309090u, 1371438805u,
40380
    1524775400u, 1528845279u, 1499917702u, 1487177649u, 1575719220u, 1546255107u, 1584350554u, 1605185389u,
40381
    3778354048u, 3774312887u, 3803303918u, 3816007129u, 3862737756u, 3892238699u, 3854067506u, 3833203973u,
40382
    4012263992u, 4007927823u, 3970080342u, 3982554209u, 3895452388u, 3924658387u, 3953866378u, 3932773565u,
40383
    4245928176u, 4241609415u, 4271336606u, 4283762345u, 4196012076u, 4225268251u, 4187931714u, 4166823541u,
40384
    4076923208u, 4072833919u, 4035198246u, 4047918865u, 4094247316u, 4123732899u, 4153251322u, 4132437965u,
40385
    3648544096u, 3636082519u, 3673983246u, 3678331705u, 3732010428u, 3753090955u, 3723829714u, 3694611429u,
40386
    3614117080u, 3601426159u, 3572488374u, 3576541825u, 3496125444u, 3516976691u, 3555094634u, 3525581405u,
40387
    3311336976u, 3298595879u, 3336186494u, 3340255305u, 3260503756u, 3281337595u, 3251864226u, 3222399125u,
40388
    3410866088u, 3398419871u, 3368647622u, 3372945905u, 3427010420u, 3448139075u, 3485520666u, 3456284973u,
40389
    2444203584u, 2423127159u, 2452308526u, 2481530905u, 2527477404u, 2539934891u, 2502093554u, 2497740997u,
40390
    2679949304u, 2659102159u, 2620920726u, 2650438049u, 2562027300u, 2574714131u, 2603727690u, 2599670141u,
40391
    2374579504u, 2353749767u, 2383274334u, 2412743529u, 2323684844u, 2336421851u, 2298759554u, 2294686645u,
40392
    2207933576u, 2186809023u, 2149495014u, 2178734801u, 2224278612u, 2236720739u, 2266437690u, 2262135309u,
40393
    2850214048u, 2820717207u, 2858812622u, 2879680249u, 2934667388u, 2938704459u, 2909776914u, 2897069605u,
40394
    2817622296u, 2788420399u, 2759153014u, 2780249921u, 2700618180u, 2704950259u, 2742877610u, 2730399645u,
40395
    3049550800u, 3020298727u, 3057690558u, 3078802825u, 2999835404u, 3004150075u, 2974355298u, 2961925461u,
40396
    3151438440u, 3121956959u, 3092510214u, 3113327665u, 3168701108u, 3172786307u, 3210370778u, 3197646061u,
40397
  }, {
40398
    0u, 3099354981u, 2852767883u, 313896942u, 2405603159u, 937357362u, 627793884u, 2648127673u,
40399
    3316918511u, 2097696650u, 1874714724u, 3607201537u, 1255587768u, 4067088605u, 3772741427u, 1482887254u,
40400
    1343838111u, 3903140090u, 4195393300u, 1118632049u, 3749429448u, 1741137837u, 1970407491u, 3452858150u,
40401
    2511175536u, 756094997u, 1067759611u, 2266550430u, 449832999u, 2725482306u, 2965774508u, 142231497u,
40402
    2687676222u, 412010587u, 171665333u, 2995192016u, 793786473u, 2548850444u, 2237264098u, 1038456711u,
40403
    1703315409u, 3711623348u, 3482275674u, 1999841343u, 3940814982u, 1381529571u, 1089329165u, 4166106984u,
40404
    4029413537u, 1217896388u, 1512189994u, 3802027855u, 2135519222u, 3354724499u, 3577784189u, 1845280792u,
40405
    899665998u, 2367928107u, 2677414085u, 657096608u, 3137160985u, 37822588u, 284462994u, 2823350519u,
40406
    2601801789u, 598228824u, 824021174u, 2309093331u, 343330666u, 2898962447u, 3195996129u, 113467524u,
40407
    1587572946u, 3860600759u, 4104763481u, 1276501820u, 3519211397u, 1769898208u, 2076913422u, 3279374443u,
40408
    3406630818u, 1941006535u, 1627703081u, 3652755532u, 1148164341u, 4241751952u, 3999682686u, 1457141531u,
40409
    247015245u, 3053797416u, 2763059142u, 470583459u, 2178658330u, 963106687u, 735213713u, 2473467892u,
40410
    992409347u, 2207944806u, 2435792776u, 697522413u, 3024379988u, 217581361u, 508405983u, 2800865210u,
40411
    4271038444u, 1177467017u, 1419450215u, 3962007554u, 1911572667u, 3377213406u, 3690561584u, 1665525589u,
40412
    1799331996u, 3548628985u, 3241568279u, 2039091058u, 3831314379u, 1558270126u, 1314193216u, 4142438437u,
40413
    2928380019u, 372764438u, 75645176u, 3158189981u, 568925988u, 2572515393u, 2346768303u, 861712586u,
40414
    3982079547u, 1441124702u, 1196457648u, 4293663189u, 1648042348u, 3666298377u, 3358779879u, 1888390786u,
40415
    686661332u, 2421291441u, 2196002399u, 978858298u, 2811169155u, 523464422u, 226935048u, 3040519789u,
40416
    3175145892u, 100435649u, 390670639u, 2952089162u, 841119475u, 2325614998u, 2553003640u, 546822429u,
40417
    2029308235u, 3225988654u, 3539796416u, 1782671013u, 4153826844u, 1328167289u, 1570739863u, 3844338162u,
40418
    1298864389u, 4124540512u, 3882013070u, 1608431339u, 3255406162u, 2058742071u, 1744848601u, 3501990332u,
40419
    2296328682u, 811816591u, 584513889u, 2590678532u, 129869501u, 3204563416u, 2914283062u, 352848211u,
40420
    494030490u, 2781751807u, 3078325777u, 264757620u, 2450577869u, 715964072u, 941166918u, 2158327331u,
40421
    3636881013u, 1618608400u, 1926213374u, 3396585883u, 1470427426u, 4011365959u, 4255988137u, 1158766284u,
40422
    1984818694u, 3471935843u, 3695453837u, 1693991400u, 4180638033u, 1100160564u, 1395044826u, 3952793279u,
40423
    3019491049u, 189112716u, 435162722u, 2706139399u, 1016811966u, 2217162459u, 2526189877u, 774831696u,
40424
    643086745u, 2666061564u, 2354934034u, 887166583u, 2838900430u, 294275499u, 54519365u, 3145957664u,
40425
    3823145334u, 1532818963u, 1240029693u, 4048895640u, 1820460577u, 3560857924u, 3331051178u, 2117577167u,
40426
    3598663992u, 1858283101u, 2088143283u, 3301633750u, 1495127663u, 3785470218u, 4078182116u, 1269332353u,
40427
    332098007u, 2876706482u, 3116540252u, 25085497u, 2628386432u, 605395429u, 916469259u, 2384220526u,
40428
    2254837415u, 1054503362u, 745528876u, 2496903497u, 151290352u, 2981684885u, 2735556987u, 464596510u,
40429
    1137851976u, 4218313005u, 3923506883u, 1365741990u, 3434129695u, 1946996346u, 1723425172u, 3724871409u,
40430
  }, {
40431
    0u, 1029712304u, 2059424608u, 1201699536u, 4118849216u, 3370159984u, 2403399072u, 2988497936u,
40432
    812665793u, 219177585u, 1253054625u, 2010132753u, 3320900865u, 4170237105u, 3207642721u, 2186319825u,
40433
    1625331586u, 1568718386u, 438355170u, 658566482u, 2506109250u, 2818578674u, 4020265506u, 3535817618u,
40434
    1351670851u, 1844508147u, 709922595u, 389064339u, 2769320579u, 2557498163u, 3754961379u, 3803185235u,
40435
    3250663172u, 4238411444u, 3137436772u, 2254525908u, 876710340u, 153198708u, 1317132964u, 1944187668u,
40436
    4054934725u, 3436268917u, 2339452837u, 3054575125u, 70369797u, 961670069u, 2129760613u, 1133623509u,
40437
    2703341702u, 2621542710u, 3689016294u, 3867263574u, 1419845190u, 1774270454u, 778128678u, 318858390u,
40438
    2438067015u, 2888948471u, 3952189479u, 3606153623u, 1691440519u, 1504803895u, 504432359u, 594620247u,
40439
    1492342857u, 1704161785u, 573770537u, 525542041u, 2910060169u, 2417219385u, 3618876905u, 3939730521u,
40440
    1753420680u, 1440954936u, 306397416u, 790849880u, 2634265928u, 2690882808u, 3888375336u, 3668168600u,
40441
    940822475u, 91481723u, 1121164459u, 2142483739u, 3448989963u, 4042473659u, 3075684971u, 2318603227u,
40442
    140739594u, 889433530u, 1923340138u, 1338244826u, 4259521226u, 3229813626u, 2267247018u, 3124975642u,
40443
    2570221389u, 2756861693u, 3824297005u, 3734113693u, 1823658381u, 1372780605u, 376603373u, 722643805u,
40444
    2839690380u, 2485261628u, 3548540908u, 4007806556u, 1556257356u, 1638052860u, 637716780u, 459464860u,
40445
    4191346895u, 3300051327u, 2199040943u, 3195181599u, 206718479u, 825388991u, 1989285231u, 1274166495u,
40446
    3382881038u, 4106388158u, 3009607790u, 2382549470u, 1008864718u, 21111934u, 1189240494u, 2072147742u,
40447
    2984685714u, 2357631266u, 3408323570u, 4131834434u, 1147541074u, 2030452706u, 1051084082u, 63335554u,
40448
    2174155603u, 3170292451u, 4216760371u, 3325460867u, 1947622803u, 1232499747u, 248909555u, 867575619u,
40449
    3506841360u, 3966111392u, 2881909872u, 2527485376u, 612794832u, 434546784u, 1581699760u, 1663499008u,
40450
    3782634705u, 3692447073u, 2612412337u, 2799048193u, 351717905u, 697754529u, 1849071985u, 1398190273u,
40451
    1881644950u, 1296545318u, 182963446u, 931652934u, 2242328918u, 3100053734u, 4284967478u, 3255255942u,
40452
    1079497815u, 2100821479u, 983009079u, 133672583u, 3050795671u, 2293717799u, 3474399735u, 4067887175u,
40453
    281479188u, 765927844u, 1778867060u, 1466397380u, 3846680276u, 3626469220u, 2676489652u, 2733102084u,
40454
    548881365u, 500656741u, 1517752501u, 1729575173u, 3577210133u, 3898068133u, 2952246901u, 2459410373u,
40455
    3910527195u, 3564487019u, 2480257979u, 2931134987u, 479546907u, 569730987u, 1716854139u, 1530213579u,
40456
    3647316762u, 3825568426u, 2745561210u, 2663766474u, 753206746u, 293940330u, 1445287610u, 1799716618u,
40457
    2314567513u, 3029685993u, 4080348217u, 3461678473u, 2088098201u, 1091956777u, 112560889u, 1003856713u,
40458
    3112514712u, 2229607720u, 3276105720u, 4263857736u, 1275433560u, 1902492648u, 918929720u, 195422344u,
40459
    685033439u, 364179055u, 1377080511u, 1869921551u, 3713294623u, 3761522863u, 2811507327u, 2599689167u,
40460
    413436958u, 633644462u, 1650777982u, 1594160846u, 3978570462u, 3494118254u, 2548332990u, 2860797966u,
40461
    1211387997u, 1968470509u, 854852413u, 261368461u, 3182753437u, 2161434413u, 3346310653u, 4195650637u,
40462
    2017729436u, 1160000044u, 42223868u, 1071931724u, 2378480988u, 2963576044u, 4144295484u, 3395602316u,
40463
  }, {
40464
    0u, 3411858341u, 1304994059u, 2257875630u, 2609988118u, 1355649459u, 3596215069u, 486879416u,
40465
    3964895853u, 655315400u, 2711298918u, 1791488195u, 2009251963u, 3164476382u, 973758832u, 4048990933u,
40466
    64357019u, 3364540734u, 1310630800u, 2235723829u, 2554806413u, 1394316072u, 3582976390u, 517157411u,
40467
    4018503926u, 618222419u, 2722963965u, 1762783832u, 1947517664u, 3209171269u, 970744811u, 4068520014u,
40468
    128714038u, 3438335635u, 1248109629u, 2167961496u, 2621261600u, 1466012805u, 3522553387u, 447296910u,
40469
    3959392091u, 547575038u, 2788632144u, 1835791861u, 1886307661u, 3140622056u, 1034314822u, 4143626211u,
40470
    75106221u, 3475428360u, 1236444838u, 2196665603u, 2682996155u, 1421317662u, 3525567664u, 427767573u,
40471
    3895035328u, 594892389u, 2782995659u, 1857943406u, 1941489622u, 3101955187u, 1047553757u, 4113347960u,
40472
    257428076u, 3288652233u, 1116777319u, 2311878850u, 2496219258u, 1603640287u, 3640781169u, 308099796u,
40473
    3809183745u, 676813732u, 2932025610u, 1704983215u, 2023410199u, 3016104370u, 894593820u, 4262377657u,
40474
    210634999u, 3352484690u, 1095150076u, 2316991065u, 2535410401u, 1547934020u, 3671583722u, 294336591u,
40475
    3772615322u, 729897279u, 2903845777u, 1716123700u, 2068629644u, 2953845545u, 914647431u, 4258839074u,
40476
    150212442u, 3282623743u, 1161604689u, 2388688372u, 2472889676u, 1480171241u, 3735940167u, 368132066u,
40477
    3836185911u, 805002898u, 2842635324u, 1647574937u, 2134298401u, 3026852996u, 855535146u, 4188192143u,
40478
    186781121u, 3229539940u, 1189784778u, 2377547631u, 2427670487u, 1542429810u, 3715886812u, 371670393u,
40479
    3882979244u, 741170185u, 2864262823u, 1642462466u, 2095107514u, 3082559007u, 824732849u, 4201955092u,
40480
    514856152u, 3589064573u, 1400419795u, 2552522358u, 2233554638u, 1316849003u, 3370776517u, 62202976u,
40481
    4075001525u, 968836368u, 3207280574u, 1954014235u, 1769133219u, 2720925446u, 616199592u, 4024870413u,
40482
    493229635u, 3594175974u, 1353627464u, 2616354029u, 2264355925u, 1303087088u, 3409966430u, 6498043u,
40483
    4046820398u, 979978123u, 3170710821u, 2007099008u, 1789187640u, 2717386141u, 661419827u, 3962610838u,
40484
    421269998u, 3527459403u, 1423225061u, 2676515648u, 2190300152u, 1238466653u, 3477467891u, 68755798u,
40485
    4115633027u, 1041448998u, 3095868040u, 1943789869u, 1860096405u, 2776760880u, 588673182u, 3897205563u,
40486
    449450869u, 3516317904u, 1459794558u, 2623431131u, 2170245475u, 1242006214u, 3432247400u, 131015629u,
40487
    4137259288u, 1036337853u, 3142660115u, 1879958454u, 1829294862u, 2790523051u, 549483013u, 3952910752u,
40488
    300424884u, 3669282065u, 1545650111u, 2541513754u, 2323209378u, 1092980487u, 3350330793u, 216870412u,
40489
    4256931033u, 921128828u, 2960342482u, 2066738807u, 1714085583u, 2910195050u, 736264132u, 3770592353u,
40490
    306060335u, 3647131530u, 1610005796u, 2494197377u, 2309971513u, 1123257756u, 3295149874u, 255536279u,
40491
    4268596802u, 892423655u, 3013951305u, 2029645036u, 1711070292u, 2929725425u, 674528607u, 3815288570u,
40492
    373562242u, 3709388839u, 1535949449u, 2429577516u, 2379569556u, 1183418929u, 3223189663u, 188820282u,
40493
    4195850735u, 827017802u, 3084859620u, 2089020225u, 1636228089u, 2866415708u, 743340786u, 3876759895u,
40494
    361896217u, 3738094268u, 1482340370u, 2466671543u, 2382584591u, 1163888810u, 3284924932u, 144124321u,
40495
    4190215028u, 849168593u, 3020503679u, 2136336858u, 1649465698u, 2836138695u, 798521449u, 3838094284u,
40496
  }, {
40497
    0u, 2792819636u, 2543784233u, 837294749u, 4098827283u, 1379413927u, 1674589498u, 3316072078u,
40498
    871321191u, 2509784531u, 2758827854u, 34034938u, 3349178996u, 1641505216u, 1346337629u, 4131942633u,
40499
    1742642382u, 3249117050u, 4030828007u, 1446413907u, 2475800797u, 904311657u, 68069876u, 2725880384u,
40500
    1412551337u, 4064729373u, 3283010432u, 1708771380u, 2692675258u, 101317902u, 937551763u, 2442587175u,
40501
    3485284764u, 1774858792u, 1478633653u, 4266992385u, 1005723023u, 2642744891u, 2892827814u, 169477906u,
40502
    4233263099u, 1512406095u, 1808623314u, 3451546982u, 136139752u, 2926205020u, 2676114113u, 972376437u,
40503
    2825102674u, 236236518u, 1073525883u, 2576072655u, 1546420545u, 4200303349u, 3417542760u, 1841601500u,
40504
    2609703733u, 1039917185u, 202635804u, 2858742184u, 1875103526u, 3384067218u, 4166835727u, 1579931067u,
40505
    1141601657u, 3799809741u, 3549717584u, 1977839588u, 2957267306u, 372464350u, 668680259u, 2175552503u,
40506
    2011446046u, 3516084394u, 3766168119u, 1175200131u, 2209029901u, 635180217u, 338955812u, 2990736784u,
40507
    601221559u, 2242044419u, 3024812190u, 306049834u, 3617246628u, 1911408144u, 1074125965u, 3866285881u,
40508
    272279504u, 3058543716u, 2275784441u, 567459149u, 3832906691u, 1107462263u, 1944752874u, 3583875422u,
40509
    2343980261u, 767641425u, 472473036u, 3126744696u, 2147051766u, 3649987394u, 3899029983u, 1309766251u,
40510
    3092841090u, 506333494u, 801510315u, 2310084639u, 1276520081u, 3932237093u, 3683203000u, 2113813516u,
40511
    3966292011u, 1243601823u, 2079834370u, 3716205238u, 405271608u, 3192979340u, 2411259153u, 701492901u,
40512
    3750207052u, 2045810168u, 1209569125u, 4000285905u, 734575199u, 2378150379u, 3159862134u, 438345922u,
40513
    2283203314u, 778166598u, 529136603u, 3120492655u, 2086260449u, 3660498261u, 3955679176u, 1303499900u,
40514
    3153699989u, 495890209u, 744928700u, 2316418568u, 1337360518u, 3921775410u, 3626602927u, 2120129051u,
40515
    4022892092u, 1237286280u, 2018993941u, 3726666913u, 461853231u, 3186645403u, 2350400262u, 711936178u,
40516
    3693557851u, 2052076527u, 1270360434u, 3989775046u, 677911624u, 2384402428u, 3220639073u, 427820757u,
40517
    1202443118u, 3789347034u, 3493118535u, 1984154099u, 3018127229u, 362020041u, 612099668u, 2181885408u,
40518
    1950653705u, 3526596285u, 3822816288u, 1168934804u, 2148251930u, 645706414u, 395618355u, 2984485767u,
40519
    544559008u, 2248295444u, 3085590153u, 295523645u, 3560598451u, 1917673479u, 1134918298u, 3855773998u,
40520
    328860103u, 3052210803u, 2214924526u, 577903450u, 3889505748u, 1101147744u, 1883911421u, 3594338121u,
40521
    3424493451u, 1785369663u, 1535282850u, 4260726038u, 944946072u, 2653270060u, 2949491377u, 163225861u,
40522
    4294103532u, 1501944408u, 1752023237u, 3457862513u, 196998655u, 2915761739u, 2619532502u, 978710370u,
40523
    2881684293u, 229902577u, 1012666988u, 2586515928u, 1603020630u, 4193987810u, 3356702335u, 1852063179u,
40524
    2553040162u, 1046169238u, 263412747u, 2848217023u, 1818454321u, 3390333573u, 4227627032u, 1569420204u,
40525
    60859927u, 2782375331u, 2487203646u, 843627658u, 4159668740u, 1368951216u, 1617990445u, 3322386585u,
40526
    810543216u, 2520310724u, 2815490393u, 27783917u, 3288386659u, 1652017111u, 1402985802u, 4125677310u,
40527
    1685994201u, 3255382381u, 4091620336u, 1435902020u, 2419138250u, 910562686u, 128847843u, 2715354199u,
40528
    1469150398u, 4058414858u, 3222168983u, 1719234083u, 2749255853u, 94984985u, 876691844u, 2453031472u,
40529
  }, {
40530
    0u, 3433693342u, 1109723005u, 2391738339u, 2219446010u, 1222643300u, 3329165703u, 180685081u,
40531
    3555007413u, 525277995u, 2445286600u, 1567235158u, 1471092047u, 2600801745u, 361370162u, 3642757804u,
40532
    2092642603u, 2953916853u, 1050555990u, 4063508168u, 4176560081u, 878395215u, 3134470316u, 1987983410u,
40533
    2942184094u, 1676945920u, 3984272867u, 567356797u, 722740324u, 3887998202u, 1764827929u, 2778407815u,
40534
    4185285206u, 903635656u, 3142804779u, 2012833205u, 2101111980u, 2979425330u, 1058630609u, 4088621903u,
40535
    714308067u, 3862526333u, 1756790430u, 2753330688u, 2933487385u, 1651734407u, 3975966820u, 542535930u,
40536
    2244825981u, 1231508451u, 3353891840u, 188896414u, 25648519u, 3442302233u, 1134713594u, 2399689316u,
40537
    1445480648u, 2592229462u, 336416693u, 3634843435u, 3529655858u, 516441772u, 2420588879u, 1559052753u,
40538
    698204909u, 3845636723u, 1807271312u, 2803025166u, 2916600855u, 1635634313u, 4025666410u, 593021940u,
40539
    4202223960u, 919787974u, 3093159461u, 1962401467u, 2117261218u, 2996361020u, 1008193759u, 4038971457u,
40540
    1428616134u, 2576151384u, 386135227u, 3685348389u, 3513580860u, 499580322u, 2471098945u, 1608776415u,
40541
    2260985971u, 1248454893u, 3303468814u, 139259792u, 42591881u, 3458459159u, 1085071860u, 2349261162u,
40542
    3505103035u, 474062885u, 2463016902u, 1583654744u, 1419882049u, 2550902495u, 377792828u, 3660491170u,
40543
    51297038u, 3483679632u, 1093385331u, 2374089965u, 2269427188u, 1273935210u, 3311514249u, 164344343u,
40544
    2890961296u, 1627033870u, 4000683757u, 585078387u, 672833386u, 3836780532u, 1782552599u, 2794821769u,
40545
    2142603813u, 3005188795u, 1032883544u, 4047146438u, 4227826911u, 928351297u, 3118105506u, 1970307900u,
40546
    1396409818u, 2677114180u, 287212199u, 3719594553u, 3614542624u, 467372990u, 2505346141u, 1509854403u,
40547
    2162073199u, 1282711281u, 3271268626u, 240228748u, 76845205u, 3359543307u, 1186043880u, 2317064054u,
40548
    796964081u, 3811226735u, 1839575948u, 2702160658u, 2882189835u, 1734392469u, 3924802934u, 625327592u,
40549
    4234522436u, 818917338u, 3191908409u, 1927981223u, 2016387518u, 3028656416u, 973776579u, 4137723485u,
40550
    2857232268u, 1726474002u, 3899187441u, 616751215u, 772270454u, 3803048424u, 1814228491u, 2693328533u,
40551
    2041117753u, 3036871847u, 999160644u, 4146592730u, 4259508931u, 826864221u, 3217552830u, 1936586016u,
40552
    3606501031u, 442291769u, 2496909786u, 1484378436u, 1388107869u, 2652297411u, 278519584u, 3694387134u,
40553
    85183762u, 3384397196u, 1194773103u, 2342308593u, 2170143720u, 1307820918u, 3279733909u, 265733131u,
40554
    2057717559u, 3054258089u, 948125770u, 4096344276u, 4276898253u, 843467091u, 3167309488u, 1885556270u,
40555
    2839764098u, 1709792284u, 3949353983u, 667704161u, 755585656u, 3785577190u, 1865176325u, 2743489947u,
40556
    102594076u, 3401021058u, 1144549729u, 2291298815u, 2186770662u, 1325234296u, 3228729243u, 215514885u,
40557
    3589828009u, 424832311u, 2547870420u, 1534552650u, 1370645331u, 2635621325u, 328688686u, 3745342640u,
40558
    2211456353u, 1333405183u, 3254067740u, 224338562u, 127544219u, 3408931589u, 1170156774u, 2299866232u,
40559
    1345666772u, 2627681866u, 303053225u, 3736746295u, 3565105198u, 416624816u, 2522494803u, 1525692365u,
40560
    4285207626u, 868291796u, 3176010551u, 1910772649u, 2065767088u, 3079346734u, 956571085u, 4121828691u,
40561
    747507711u, 3760459617u, 1856702594u, 2717976604u, 2831417605u, 1684930971u, 3940615800u, 642451174u,
40562
  },
40563
  {
40564
    0u, 393942083u, 787884166u, 965557445u, 1575768332u, 1251427663u, 1931114890u, 1684106697u,
40565
    3151536664u, 2896410203u, 2502855326u, 2186649309u, 3862229780u, 4048545623u, 3368213394u, 3753496529u,
40566
    2898281073u, 3149616690u, 2184604407u, 2504883892u, 4046197629u, 3864463166u, 3755621371u, 3366006712u,
40567
    387506281u, 6550570u, 971950319u, 781573292u, 1257550181u, 1569695014u, 1677892067u, 1937345952u,
40568
    2196865699u, 2508887776u, 2886183461u, 3145514598u, 3743273903u, 3362179052u, 4058774313u, 3868258154u,
40569
    958996667u, 777139448u, 400492605u, 10755198u, 1690661303u, 1941857780u, 1244879153u, 1565019506u,
40570
    775012562u, 961205393u, 13101140u, 398261271u, 1943900638u, 1688634781u, 1563146584u, 1246801179u,
40571
    2515100362u, 2190636681u, 3139390028u, 2892258831u, 3355784134u, 3749586821u, 3874691904u, 4052225795u,
40572
    3734110983u, 3387496260u, 4033096577u, 3877584834u, 2206093835u, 2483373640u, 2911402637u, 3136515790u,
40573
    1699389727u, 1915860316u, 1270647193u, 1556585946u, 950464531u, 803071056u, 374397077u, 19647702u,
40574
    1917993334u, 1697207605u, 1554278896u, 1272937907u, 800985210u, 952435769u, 21510396u, 372452543u,
40575
    3381322606u, 3740399405u, 3883715560u, 4027047851u, 2489758306u, 2199758369u, 3130039012u, 2917895847u,
40576
    1550025124u, 1259902439u, 1922410786u, 1710144865u, 26202280u, 385139947u, 796522542u, 939715693u,
40577
    3887801276u, 4039129087u, 3377269562u, 3728088953u, 3126293168u, 2905368307u, 2493602358u, 2212122229u,
40578
    4037264341u, 3889747862u, 3730172755u, 3375300368u, 2907673305u, 3124004506u, 2209987167u, 2495786524u,
40579
    1266377165u, 1543533966u, 1703758155u, 1928748296u, 379007169u, 32253058u, 945887303u, 790236164u,
40580
    1716846671u, 1898845196u, 1218652361u, 1608006794u, 1002000707u, 750929152u, 357530053u, 36990342u,
40581
    3717046871u, 3405166100u, 4084959953u, 3825245842u, 2153902939u, 2535122712u, 2929187805u, 3119304606u,
40582
    3398779454u, 3723384445u, 3831720632u, 4078468859u, 2541294386u, 2147616625u, 3113171892u, 2935238647u,
40583
    1900929062u, 1714877541u, 1606142112u, 1220599011u, 748794154u, 1004184937u, 39295404u, 355241455u,
40584
    3835986668u, 4091516591u, 3394415210u, 3710500393u, 3108557792u, 2922629027u, 2545875814u, 2160455461u,
40585
    1601970420u, 1208431799u, 1904871538u, 1727077425u, 43020792u, 367748539u, 744905086u, 991776061u,
40586
    1214562461u, 1595921630u, 1720903707u, 1911159896u, 361271697u, 49513938u, 998160663u, 738569556u,
40587
    4089209477u, 3838277318u, 3712633347u, 3392233024u, 2924491657u, 3106613194u, 2158369551u, 2547846988u,
40588
    3100050248u, 2948339467u, 2519804878u, 2169126797u, 3844821572u, 4065347079u, 3420289730u, 3701894785u,
40589
    52404560u, 342144275u, 770279894u, 982687125u, 1593045084u, 1233708063u, 1879431386u, 1736363161u,
40590
    336019769u, 58479994u, 988899775u, 764050940u, 1240141877u, 1586496630u, 1729968307u, 1885744368u,
40591
    2950685473u, 3097818978u, 2166999975u, 2522013668u, 4063474221u, 3846743662u, 3703937707u, 3418263272u,
40592
    976650731u, 760059304u, 348170605u, 62635310u, 1742393575u, 1889649828u, 1227683937u, 1582820386u,
40593
    2179867635u, 2526361520u, 2937588597u, 3093503798u, 3691148031u, 3413731004u, 4076100217u, 3851374138u,
40594
    2532754330u, 2173556697u, 3087067932u, 2944139103u, 3407516310u, 3697379029u, 3857496592u, 4070026835u,
40595
    758014338u, 978679233u, 64506116u, 346250567u, 1891774606u, 1740186829u, 1580472328u, 1229917259u,
40596
  }, {
40597
    0u, 4022496062u, 83218493u, 3946298115u, 166436986u, 3861498692u, 220098631u, 3806075769u,
40598
    332873972u, 4229245898u, 388141257u, 4175494135u, 440197262u, 4127099824u, 516501683u, 4044053389u,
40599
    665747944u, 3362581206u, 593187285u, 3432594155u, 776282514u, 3246869164u, 716239279u, 3312622225u,
40600
    880394524u, 3686509090u, 814485793u, 3746462239u, 1033003366u, 3528460888u, 963096923u, 3601193573u,
40601
    1331495888u, 2694801646u, 1269355501u, 2758457555u, 1186374570u, 2843003028u, 1111716759u, 2910918825u,
40602
    1552565028u, 3007850522u, 1484755737u, 3082680359u, 1432478558u, 3131279456u, 1368666979u, 3193329757u,
40603
    1760789048u, 2268195078u, 1812353541u, 2210675003u, 1628971586u, 2396670332u, 1710092927u, 2318375233u,
40604
    2066006732u, 2498144754u, 2144408305u, 2417195471u, 1926193846u, 2634877320u, 1983558283u, 2583222709u,
40605
    2662991776u, 1903717534u, 2588923805u, 1972223139u, 2538711002u, 2022952164u, 2477029351u, 2087066841u,
40606
    2372749140u, 1655647338u, 2308478825u, 1717238871u, 2223433518u, 1799654416u, 2155034387u, 1873894445u,
40607
    3105130056u, 1456926070u, 3185661557u, 1378041163u, 2969511474u, 1597852940u, 3020617231u, 1539874097u,
40608
    2864957116u, 1157737858u, 2922780289u, 1106542015u, 2737333958u, 1290407416u, 2816325371u, 1210047941u,
40609
    3521578096u, 1042640718u, 3574781005u, 986759027u, 3624707082u, 936300340u, 3707335735u, 859512585u,
40610
    3257943172u, 770846650u, 3334837433u, 688390023u, 3420185854u, 605654976u, 3475911875u, 552361981u,
40611
    4132013464u, 428600998u, 4072428965u, 494812827u, 4288816610u, 274747100u, 4216845791u, 345349857u,
40612
    3852387692u, 173846098u, 3781891409u, 245988975u, 3967116566u, 62328360u, 3900749099u, 121822741u,
40613
    3859089665u, 164061759u, 3807435068u, 221426178u, 4025395579u, 2933317u, 3944446278u, 81334904u,
40614
    4124199413u, 437265099u, 4045904328u, 518386422u, 4231653775u, 335250097u, 4174133682u, 386814604u,
40615
    3249244393u, 778691543u, 3311294676u, 714879978u, 3359647891u, 662848429u, 3434477742u, 595039120u,
40616
    3531393053u, 1035903779u, 3599308832u, 961245982u, 3684132967u, 877986649u, 3747788890u, 815846244u,
40617
    2841119441u, 1184522735u, 2913852140u, 1114616274u, 2696129195u, 1332855189u, 2756082326u, 1266946472u,
40618
    3129952805u, 1431118107u, 3195705880u, 1371074854u, 3009735263u, 1554415969u, 3079748194u, 1481855324u,
40619
    2398522169u, 1630855175u, 2315475716u, 1707159610u, 2266835779u, 1759461501u, 2213084030u, 1814728768u,
40620
    2636237773u, 1927520499u, 2580814832u, 1981182158u, 2496293815u, 2064121993u, 2420095882u, 2147340468u,
40621
    2025787041u, 2541577631u, 2085281436u, 2475210146u, 1901375195u, 2660681189u, 1973518054u, 2590184920u,
40622
    1801997909u, 2225743211u, 1872600680u, 2153772374u, 1652813359u, 2369881361u, 1719025170u, 2310296876u,
40623
    1594986313u, 2966676599u, 1541693300u, 3022402634u, 1459236659u, 3107472397u, 1376780046u, 3184366640u,
40624
    1288097725u, 2734990467u, 1211309952u, 2817619134u, 1160605639u, 2867791097u, 1104723962u, 2920993988u,
40625
    937561457u, 3626001999u, 857201996u, 3704993394u, 1040821515u, 3519792693u, 989625654u, 3577615880u,
40626
    607473029u, 3421972155u, 549494200u, 3473077894u, 769584639u, 3256649409u, 690699714u, 3337180924u,
40627
    273452185u, 4287555495u, 347692196u, 4219156378u, 430386403u, 4133832669u, 491977950u, 4069562336u,
40628
    60542061u, 3965298515u, 124656720u, 3903616878u, 175139863u, 3853649705u, 243645482u, 3779581716u,
40629
  }, {
40630
    0u, 3247366080u, 1483520449u, 2581751297u, 2967040898u, 1901571138u, 3904227907u, 691737987u,
40631
    3133399365u, 2068659845u, 3803142276u, 589399876u, 169513671u, 3415493895u, 1383475974u, 2482566342u,
40632
    2935407819u, 1870142219u, 4137319690u, 924099274u, 506443593u, 3751897225u, 1178799752u, 2278412616u,
40633
    339027342u, 3585866318u, 1280941135u, 2379694991u, 2766951948u, 1700956620u, 4236308429u, 1024339981u,
40634
    2258407383u, 1192382487u, 3740284438u, 528411094u, 910556245u, 4157285269u, 1848198548u, 2946996820u,
40635
    1012887186u, 4258378066u, 1681119059u, 2780629139u, 2357599504u, 1292419792u, 3572147409u, 358906641u,
40636
    678054684u, 3924071644u, 1879503581u, 2978491677u, 2561882270u, 1497229150u, 3235873119u, 22109855u,
40637
    2460592729u, 1395094937u, 3401913240u, 189516888u, 577821147u, 3825075739u, 2048679962u, 3146956762u,
40638
    3595049455u, 398902831u, 2384764974u, 1336573934u, 1720805997u, 2803873197u, 1056822188u, 4285729900u,
40639
    1821112490u, 2902796138u, 887570795u, 4117339819u, 3696397096u, 500978920u, 2218668777u, 1169222953u,
40640
    2025774372u, 3106931428u, 550659301u, 3780950821u, 3362238118u, 166293862u, 2416645991u, 1367722151u,
40641
    3262987361u, 66315169u, 2584839584u, 1537170016u, 1923370979u, 3005911075u, 717813282u, 3947244002u,
40642
    1356109368u, 2438613496u, 146288633u, 3375820857u, 3759007162u, 562248314u, 3093388411u, 2045739963u,
40643
    3927406461u, 731490493u, 2994458300u, 1945440636u, 1523451135u, 2604718911u, 44219710u, 3274466046u,
40644
    4263662323u, 1068272947u, 2790189874u, 1740649714u, 1325080945u, 2406874801u, 379033776u, 3608758128u,
40645
    1155642294u, 2238671990u, 479005303u, 3708016055u, 4097359924u, 901128180u, 2891217397u, 1843045941u,
40646
    2011248031u, 3060787807u, 797805662u, 3993195422u, 3342353949u, 112630237u, 2673147868u, 1591353372u,
40647
    3441611994u, 212601626u, 2504944923u, 1421914843u, 2113644376u, 3161815192u, 630660761u, 3826893145u,
40648
    3642224980u, 412692116u, 2172340373u, 1089836885u, 1775141590u, 2822790422u, 832715543u, 4029474007u,
40649
    1674842129u, 2723860433u, 1001957840u, 4197873168u, 3540870035u, 310623315u, 2338445906u, 1257178514u,
40650
    4051548744u, 821257608u, 2836464521u, 1755307081u, 1101318602u, 2150241802u, 432566283u, 3628511179u,
40651
    1270766349u, 2318435533u, 332587724u, 3529260300u, 4217841807u, 988411727u, 2735444302u, 1652903566u,
40652
    1602977411u, 2651169091u, 132630338u, 3328776322u, 4015131905u, 786223809u, 3074340032u, 1991273216u,
40653
    3846741958u, 616972294u, 3173262855u, 2091579847u, 1435626564u, 2485072772u, 234706309u, 3430124101u,
40654
    2712218736u, 1613231024u, 4190475697u, 944458353u, 292577266u, 3506339890u, 1226630707u, 2291284467u,
40655
    459984181u, 3672380149u, 1124496628u, 2189994804u, 2880683703u, 1782407543u, 4091479926u, 844224694u,
40656
    257943739u, 3469817723u, 1462980986u, 2529005242u, 3213269817u, 2114471161u, 3890881272u, 644152632u,
40657
    3046902270u, 1947391550u, 3991973951u, 746483711u, 88439420u, 3301680572u, 1563018173u, 2628197501u,
40658
    657826727u, 3871046759u, 2136545894u, 3201811878u, 2548879397u, 1449267173u, 3481299428u, 235845156u,
40659
    2650161890u, 1551408418u, 3315268387u, 68429027u, 758067552u, 3970035360u, 1967360161u, 3033356129u,
40660
    2311284588u, 1213053100u, 3517963949u, 270598509u, 958010606u, 4170500910u, 1635167535u, 2700636911u,
40661
    855672361u, 4069415401u, 1802256360u, 2866995240u, 2212099499u, 1113008747u, 3686091882u, 440112042u,
40662
  }, {
40663
    0u, 2611301487u, 3963330207u, 2006897392u, 50740095u, 2560849680u, 4013794784u, 1956178319u,
40664
    101480190u, 2645113489u, 3929532513u, 1905435662u, 84561281u, 2662269422u, 3912356638u, 1922342769u,
40665
    202960380u, 2545787283u, 3760419683u, 2072395532u, 253679235u, 2495322860u, 3810871324u, 2021655667u,
40666
    169122562u, 2444351341u, 3861841309u, 2106214898u, 152215677u, 2461527058u, 3844685538u, 2123133581u,
40667
    405920760u, 2207553431u, 4094313831u, 1873742088u, 456646791u, 2157096168u, 4144791064u, 1823027831u,
40668
    507358470u, 2241388905u, 4060492697u, 1772322806u, 490444409u, 2258557462u, 4043311334u, 1789215881u,
40669
    338245124u, 2408348267u, 4161972379u, 1672996084u, 388959611u, 2357870868u, 4212429796u, 1622269835u,
40670
    304431354u, 2306870421u, 4263435877u, 1706791434u, 287538053u, 2324051946u, 4246267162u, 1723705717u,
40671
    811841520u, 2881944479u, 3696765295u, 1207788800u, 862293135u, 2831204576u, 3747484176u, 1157324415u,
40672
    913293582u, 2915732833u, 3662962577u, 1106318334u, 896137841u, 2932651550u, 3646055662u, 1123494017u,
40673
    1014716940u, 2816349795u, 3493905555u, 1273334012u, 1065181555u, 2765630748u, 3544645612u, 1222882179u,
40674
    980888818u, 2714919069u, 3595350637u, 1307180546u, 963712909u, 2731826146u, 3578431762u, 1324336509u,
40675
    676490248u, 3019317351u, 3295277719u, 1607253752u, 726947703u, 2968591128u, 3345992168u, 1556776327u,
40676
    777919222u, 3053147801u, 3261432937u, 1505806342u, 760750473u, 3070062054u, 3244539670u, 1522987897u,
40677
    608862708u, 3220163995u, 3362856811u, 1406423812u, 659339915u, 3169449700u, 3413582868u, 1355966587u,
40678
    575076106u, 3118709605u, 3464325525u, 1440228858u, 557894773u, 3135602714u, 3447411434u, 1457397381u,
40679
    1623683040u, 4217512847u, 2365387135u, 391757072u, 1673614495u, 4167309552u, 2415577600u, 341804655u,
40680
    1724586270u, 4251866481u, 2331019137u, 290835438u, 1707942497u, 4268256782u, 2314648830u, 307490961u,
40681
    1826587164u, 4152020595u, 2162433155u, 457265388u, 1876539747u, 4101829900u, 2212636668u, 407333779u,
40682
    1792275682u, 4051089549u, 2263378557u, 491595282u, 1775619997u, 4067460082u, 2246988034u, 508239213u,
40683
    2029433880u, 3813931127u, 2496473735u, 258500328u, 2079362919u, 3763716872u, 2546668024u, 208559511u,
40684
    2130363110u, 3848244873u, 2462145657u, 157552662u, 2113730969u, 3864638966u, 2445764358u, 174205801u,
40685
    1961777636u, 4014675339u, 2564147067u, 57707284u, 2011718299u, 3964481268u, 2614361092u, 7778411u,
40686
    1927425818u, 3913769845u, 2665066885u, 92077546u, 1910772837u, 3930150922u, 2648673018u, 108709525u,
40687
    1352980496u, 3405878399u, 3164554895u, 658115296u, 1403183983u, 3355946752u, 3214507504u, 607924639u,
40688
    1453895406u, 3440239233u, 3130208369u, 557218846u, 1437504913u, 3456883198u, 3113552654u, 573589345u,
40689
    1555838444u, 3340335491u, 2961681267u, 723707676u, 1606028947u, 3290383100u, 3011612684u, 673504355u,
40690
    1521500946u, 3239382909u, 3062619533u, 758026722u, 1505130605u, 3256038402u, 3045975794u, 774417053u,
40691
    1217725416u, 3543158663u, 2762906999u, 1057739032u, 1267939479u, 3493229816u, 2812847624u, 1007544935u,
40692
    1318679830u, 3577493881u, 2728586121u, 956803046u, 1302285929u, 3594125830u, 2711933174u, 973184153u,
40693
    1150152212u, 3743982203u, 2830528651u, 856898788u, 1200346475u, 3694041348u, 2880457716u, 806684571u,
40694
    1115789546u, 3643069573u, 2931426933u, 891243034u, 1099408277u, 3659722746u, 2914794762u, 907637093u,
40695
  }, {
40696
    0u, 3717650821u, 1616688459u, 3184159950u, 3233376918u, 489665299u, 2699419613u, 2104690264u,
40697
    1510200173u, 2274691816u, 979330598u, 3888758691u, 2595928571u, 1194090622u, 4209380528u, 661706037u,
40698
    3020400346u, 1771143007u, 3562738577u, 164481556u, 1958661196u, 2837976521u, 350386439u, 3379863682u,
40699
    3993269687u, 865250354u, 2388181244u, 1406015865u, 784146209u, 4079732388u, 1323412074u, 2474079215u,
40700
    3011398645u, 1860735600u, 3542286014u, 246687547u, 1942430051u, 2924607718u, 328963112u, 3456978349u,
40701
    3917322392u, 887832861u, 2300653011u, 1421341782u, 700772878u, 4099025803u, 1234716485u, 2483986112u,
40702
    125431087u, 3673109674u, 1730500708u, 3132326369u, 3351283641u, 441867836u, 2812031730u, 2047535991u,
40703
    1568292418u, 2163009479u, 1025936137u, 3769651852u, 2646824148u, 1079348561u, 4255113631u, 537475098u,
40704
    3180171691u, 1612400686u, 3721471200u, 4717925u, 2100624189u, 2694980280u, 493375094u, 3237910515u,
40705
    3884860102u, 974691139u, 2278750093u, 1514417672u, 657926224u, 4204917205u, 1198234907u, 2600289438u,
40706
    160053105u, 3558665972u, 1775665722u, 3024116671u, 3375586791u, 346391650u, 2842683564u, 1962488105u,
40707
    1401545756u, 2384412057u, 869618007u, 3997403346u, 2469432970u, 1319524111u, 4083956673u, 788193860u,
40708
    250862174u, 3546612699u, 1856990997u, 3006903952u, 3461001416u, 333211981u, 2920678787u, 1937824774u,
40709
    1425017139u, 2305216694u, 883735672u, 3912918525u, 2487837605u, 1239398944u, 4095071982u, 696455019u,
40710
    3136584836u, 1734518017u, 3668494799u, 121507914u, 2051872274u, 2816200599u, 437363545u, 3347544796u,
40711
    3774328809u, 1029797484u, 2158697122u, 1564328743u, 542033279u, 4258798842u, 1074950196u, 2642717105u,
40712
    2691310871u, 2113731730u, 3224801372u, 497043929u, 1624461185u, 3175454212u, 9435850u, 3709412175u,
40713
    4201248378u, 671035391u, 2587181873u, 1201904308u, 986750188u, 3880142185u, 1519135143u, 2266689570u,
40714
    342721485u, 3388693064u, 1949382278u, 2846355203u, 3570723163u, 155332830u, 3028835344u, 1763607957u,
40715
    1315852448u, 2482538789u, 775087595u, 4087626862u, 2396469814u, 1396827059u, 4002123645u, 857560824u,
40716
    320106210u, 3464673127u, 1934154665u, 2933785132u, 3551331444u, 238804465u, 3018961215u, 1852270778u,
40717
    1226292623u, 2491507722u, 692783300u, 4108177729u, 2309936921u, 1412959900u, 3924976210u, 879016919u,
40718
    2803091512u, 2055541181u, 3343875443u, 450471158u, 1739236014u, 3124525867u, 133568485u, 3663777376u,
40719
    4245691221u, 545702608u, 2639048222u, 1088059291u, 1034514883u, 3762268230u, 1576387720u, 2153979149u,
40720
    501724348u, 3228659001u, 2109407735u, 2687359090u, 3713981994u, 13109167u, 3171052385u, 1620357860u,
40721
    1206151121u, 2591211092u, 666423962u, 4197321503u, 2271022407u, 1523307714u, 3875649548u, 982999433u,
40722
    2850034278u, 1953942499u, 3384583981u, 338329256u, 1767471344u, 3033506165u, 151375291u, 3566408766u,
40723
    4091789579u, 779425934u, 2478797888u, 1311354309u, 861580189u, 4006375960u, 1392910038u, 2391852883u,
40724
    2929327945u, 1930372812u, 3469036034u, 324244359u, 1847629279u, 3015068762u, 243015828u, 3555391761u,
40725
    4103744548u, 688715169u, 2496043375u, 1229996266u, 874727090u, 3920994103u, 1417671673u, 2313759356u,
40726
    446585235u, 3339223062u, 2059594968u, 2807313757u, 3660002053u, 129100416u, 3128657486u, 1743609803u,
40727
    1084066558u, 2634765179u, 549535669u, 4250396208u, 2149900392u, 1571961325u, 3765982499u, 1039043750u,
40728
  }, {
40729
    0u, 2635063670u, 3782132909u, 2086741467u, 430739227u, 2225303149u, 4173482934u, 1707977408u,
40730
    861478454u, 2924937024u, 3526875803u, 1329085421u, 720736557u, 3086643291u, 3415954816u, 1452586230u,
40731
    1722956908u, 4223524122u, 2279405761u, 450042295u, 2132718455u, 3792785921u, 2658170842u, 58693292u,
40732
    1441473114u, 3370435372u, 3028674295u, 696911745u, 1279765825u, 3511176247u, 2905172460u, 807831706u,
40733
    3445913816u, 1349228974u, 738901109u, 2969918723u, 3569940419u, 1237784245u, 900084590u, 2829701656u,
40734
    4265436910u, 1664255896u, 525574723u, 2187084597u, 3885099509u, 2057177219u, 117386584u, 2616249390u,
40735
    2882946228u, 920233410u, 1253605401u, 3619119471u, 2994391983u, 796207833u, 1393823490u, 3457937012u,
40736
    2559531650u, 92322804u, 2044829231u, 3840835417u, 2166609305u, 472659183u, 1615663412u, 4249022530u,
40737
    1102706673u, 3702920839u, 2698457948u, 1037619754u, 1477802218u, 3306854812u, 3111894087u, 611605809u,
40738
    1927342535u, 4025419953u, 2475568490u, 243387420u, 1800169180u, 4131620778u, 2317525617u, 388842247u,
40739
    655084445u, 3120835307u, 3328511792u, 1533734470u, 1051149446u, 2745738736u, 3754524715u, 1120297309u,
40740
    340972971u, 2304586973u, 4114354438u, 1748234352u, 234773168u, 2431761350u, 3968900637u, 1906278251u,
40741
    2363330345u, 299003487u, 1840466820u, 4038896370u, 2507210802u, 142532932u, 1948239007u, 3910149609u,
40742
    3213136159u, 579563625u, 1592415666u, 3286611140u, 2787646980u, 992477042u, 1195825833u, 3662232543u,
40743
    3933188933u, 2002801203u, 184645608u, 2517538462u, 4089658462u, 1858919720u, 313391347u, 2409765253u,
40744
    3644239219u, 1144605701u, 945318366u, 2773977256u, 3231326824u, 1570095902u, 569697989u, 3170568115u,
40745
    2205413346u, 511446676u, 1646078799u, 4279421497u, 2598330617u, 131105167u, 2075239508u, 3871229218u,
40746
    2955604436u, 757403810u, 1363424633u, 3427521551u, 2844163791u, 881434553u, 1223211618u, 3588709140u,
40747
    3854685070u, 2026779384u, 78583587u, 2577462869u, 4235025557u, 1633861091u, 486774840u, 2148301134u,
40748
    3600338360u, 1268198606u, 938871061u, 2868504675u, 3476308643u, 1379640277u, 777684494u, 3008718712u,
40749
    1310168890u, 3541595724u, 2943964055u, 846639841u, 1471879201u, 3400857943u, 3067468940u, 735723002u,
40750
    2102298892u, 3762382970u, 2619362721u, 19901655u, 1692534295u, 4193118049u, 2240594618u, 411247564u,
40751
    681945942u, 3047836192u, 3385552891u, 1422167693u, 822682701u, 2886124859u, 3496468704u, 1298661782u,
40752
    469546336u, 2264093718u, 4203901389u, 1738379451u, 38812283u, 2673859341u, 3812556502u, 2117148576u,
40753
    3268024339u, 1606809957u, 598006974u, 3198893512u, 3680933640u, 1181316734u, 973624229u, 2802299603u,
40754
    4052944421u, 1822222163u, 285065864u, 2381456382u, 3896478014u, 1966106696u, 156323219u, 2489232613u,
40755
    2759337087u, 964150537u, 1159127250u, 3625517476u, 3184831332u, 551242258u, 1555722185u, 3249901247u,
40756
    2535537225u, 170842943u, 1984954084u, 3946848146u, 2391651666u, 327308324u, 1877176831u, 4075589769u,
40757
    263086283u, 2460058045u, 4005602406u, 1942963472u, 369291216u, 2332888742u, 4151061373u, 1784924683u,
40758
    1022852861u, 2717425547u, 3717839440u, 1083595558u, 626782694u, 3092517008u, 3291821387u, 1497027645u,
40759
    1763466407u, 4094934481u, 2289211402u, 360544636u, 1890636732u, 3988730570u, 2447251217u, 215086695u,
40760
    1514488465u, 3343557607u, 3140191804u, 639919946u, 1139395978u, 3739626748u, 2726758695u, 1065936977u,
40761
  }, {
40762
    0u, 3120290792u, 2827399569u, 293431929u, 2323408227u, 864534155u, 586863858u, 2600537882u,
40763
    3481914503u, 1987188591u, 1729068310u, 3740575486u, 1173727716u, 4228805132u, 3983743093u, 1418249117u,
40764
    1147313999u, 4254680231u, 3974377182u, 1428157750u, 3458136620u, 2011505092u, 1721256893u, 3747844181u,
40765
    2347455432u, 839944224u, 594403929u, 2593536433u, 26687147u, 3094146371u, 2836498234u, 283794642u,
40766
    2294627998u, 826205558u, 541298447u, 2578994407u, 45702141u, 3141697557u, 2856315500u, 331624836u,
40767
    1196225049u, 4273416689u, 4023010184u, 1446090848u, 3442513786u, 1959480466u, 1706436331u, 3696098563u,
40768
    3433538001u, 1968994873u, 1679888448u, 3722103720u, 1188807858u, 4280295258u, 3999102243u, 1470541515u,
40769
    53374294u, 3134568126u, 2879970503u, 307431215u, 2303854645u, 816436189u, 567589284u, 2553242188u,
40770
    3405478781u, 1929420949u, 1652411116u, 3682996484u, 1082596894u, 4185703926u, 3892424591u, 1375368295u,
40771
    91404282u, 3163122706u, 2918450795u, 336584067u, 2400113305u, 922028401u, 663249672u, 2658384096u,
40772
    2392450098u, 929185754u, 639587747u, 2682555979u, 82149713u, 3172883129u, 2892181696u, 362343208u,
40773
    1091578037u, 4176212829u, 3918960932u, 1349337804u, 3412872662u, 1922537022u, 1676344391u, 3658557359u,
40774
    1111377379u, 4224032267u, 3937989746u, 1396912026u, 3359776896u, 1908013928u, 1623494929u, 3644803833u,
40775
    2377615716u, 877417100u, 623982837u, 2630542109u, 130804743u, 3190831087u, 2941083030u, 381060734u,
40776
    106748588u, 3215393092u, 2933549885u, 388083925u, 2350956495u, 903570471u, 614862430u, 2640172470u,
40777
    3386185259u, 1882115523u, 1632872378u, 3634920530u, 1135178568u, 4199721120u, 3945775833u, 1389631793u,
40778
    1317531835u, 4152109907u, 3858841898u, 1610259138u, 3304822232u, 2097172016u, 1820140617u, 3582394273u,
40779
    2165193788u, 955639764u, 696815021u, 2423477829u, 192043359u, 2995356343u, 2750736590u, 437203750u,
40780
    182808564u, 3005133852u, 2724453989u, 462947725u, 2157513367u, 962777471u, 673168134u, 2447663342u,
40781
    3312231283u, 2090301595u, 1844056802u, 3557935370u, 1326499344u, 4142603768u, 3885397889u, 1584245865u,
40782
    3326266917u, 2142836173u, 1858371508u, 3611272284u, 1279175494u, 4123357358u, 3837270743u, 1564721471u,
40783
    164299426u, 2955991370u, 2706223923u, 414607579u, 2209834945u, 978107433u, 724686416u, 2462715320u,
40784
    2183156074u, 1004243586u, 715579643u, 2472360723u, 140260361u, 2980573153u, 2698675608u, 421617264u,
40785
    1302961645u, 4099032581u, 3845074044u, 1557460884u, 3352688782u, 2116952934u, 1867729183u, 3601371895u,
40786
    2222754758u, 1032278062u, 754596439u, 2499928511u, 234942117u, 3086693709u, 2793824052u, 528319708u,
40787
    1274365761u, 4061043881u, 3816027856u, 1518873912u, 3246989858u, 2020800970u, 1762628531u, 3505670235u,
40788
    3223196809u, 2045103969u, 1754834200u, 3512958704u, 1247965674u, 4086934018u, 3806642299u, 1528765331u,
40789
    261609486u, 3060532198u, 2802936223u, 518697591u, 2246819181u, 1007707781u, 762121468u, 2492913428u,
40790
    213497176u, 3041029808u, 2755593417u, 499441441u, 2261110843u, 1061030867u, 776167850u, 2545465922u,
40791
    3274734047u, 2060165687u, 1807140942u, 3528266662u, 1229724860u, 4038575956u, 3788156205u, 1479636677u,
40792
    1222322711u, 4045468159u, 3764231046u, 1504067694u, 3265744756u, 2069664924u, 1780612837u, 3554288909u,
40793
    2270357136u, 1051278712u, 802445057u, 2519698665u, 221152243u, 3033880603u, 2779263586u, 475261322u,
40794
  }, {
40795
    0u, 2926088593u, 2275419491u, 701019378u, 3560000647u, 2052709654u, 1402038756u, 4261017717u,
40796
    1930665807u, 3715829470u, 4105419308u, 1524313021u, 2804077512u, 155861593u, 545453739u, 2397726522u,
40797
    3861331614u, 1213181711u, 1636244477u, 3488582252u, 840331801u, 2625561480u, 3048626042u, 467584747u,
40798
    2503254481u, 995897408u, 311723186u, 3170637091u, 1090907478u, 4016929991u, 3332753461u, 1758288292u,
40799
    390036349u, 3109546732u, 2426363422u, 1056427919u, 3272488954u, 1835443819u, 1152258713u, 3938878216u,
40800
    1680663602u, 3393484195u, 3817652561u, 1306808512u, 2954733749u, 510998820u, 935169494u, 2580880455u,
40801
    4044899811u, 1601229938u, 1991794816u, 3637571857u, 623446372u, 2336332021u, 2726898695u, 216120726u,
40802
    2181814956u, 744704829u, 95158223u, 2881711710u, 1446680107u, 4166125498u, 3516576584u, 2146575065u,
40803
    780072698u, 2148951915u, 2849952665u, 129384968u, 4199529085u, 1411853292u, 2112855838u, 3548843663u,
40804
    1567451573u, 4077254692u, 3670887638u, 1957027143u, 2304517426u, 657765539u, 251396177u, 2694091200u,
40805
    3361327204u, 1714510325u, 1341779207u, 3784408214u, 476611811u, 2986349938u, 2613617024u, 899690513u,
40806
    3142211371u, 354600634u, 1021997640u, 2458051545u, 1870338988u, 3239283261u, 3906682575u, 1186180958u,
40807
    960597383u, 2536053782u, 3202459876u, 277428597u, 3983589632u, 1125666961u, 1792074851u, 3300423154u,
40808
    1246892744u, 3829039961u, 3455203243u, 1671079482u, 2657312335u, 806080478u, 432241452u, 3081497277u,
40809
    3748049689u, 1896751752u, 1489409658u, 4138600427u, 190316446u, 2772397583u, 2365053693u, 580864876u,
40810
    2893360214u, 35503559u, 735381813u, 2243795108u, 2017747153u, 3593269568u, 4293150130u, 1368183843u,
40811
    1560145396u, 4069882981u, 3680356503u, 1966430470u, 2295112051u, 648294626u, 258769936u, 2701399425u,
40812
    804156091u, 2173100842u, 2823706584u, 103204425u, 4225711676u, 1438101421u, 2088704863u, 3524758222u,
40813
    3134903146u, 347226875u, 1031468553u, 2467456920u, 1860935661u, 3229814396u, 3914054286u, 1193487135u,
40814
    3385412645u, 1738661300u, 1315531078u, 3758225623u, 502792354u, 3012596019u, 2589468097u, 875607120u,
40815
    1271043721u, 3853125400u, 3429020650u, 1644831355u, 2683558414u, 832261023u, 408158061u, 3057348348u,
40816
    953223622u, 2528745559u, 3211865253u, 286899508u, 3974120769u, 1116263632u, 1799381026u, 3307794867u,
40817
    2917509143u, 59586950u, 709201268u, 2217549029u, 2043995280u, 3619452161u, 4269064691u, 1344032866u,
40818
    3740677976u, 1889445577u, 1498812987u, 4148069290u, 180845535u, 2762992206u, 2372361916u, 588238637u,
40819
    1921194766u, 3706423967u, 4112727661u, 1531686908u, 2796705673u, 148555288u, 554857194u, 2407195515u,
40820
    26248257u, 2952271312u, 2251333922u, 676868275u, 3584149702u, 2076793175u, 1375858085u, 4234771508u,
40821
    2493785488u, 986493953u, 319029491u, 3178008930u, 1083533591u, 4009621638u, 3342158964u, 1767759333u,
40822
    3887577823u, 1239362382u, 1612160956u, 3464433197u, 864482904u, 2649647049u, 3022443323u, 441336490u,
40823
    1706844275u, 3419730402u, 3793503504u, 1282724993u, 2978819316u, 535149925u, 908921239u, 2554697734u,
40824
    380632892u, 3100077741u, 2433735263u, 1063734222u, 3265180603u, 1828069930u, 1161729752u, 3948283721u,
40825
    2207997677u, 770953084u, 71007118u, 2857626143u, 1470763626u, 4190274555u, 3490330377u, 2120394392u,
40826
    4035494306u, 1591758899u, 1999168705u, 3644880208u, 616140069u, 2328960180u, 2736367686u, 225524183u,
40827
  },
40828
};
40829
40830
// ---------------- Private Initializer Prototypes
40831
40832
// ---------------- Private Function Prototypes
40833
40834
WUFFS_BASE__GENERATED_C_CODE
40835
static wuffs_base__empty_struct
40836
wuffs_crc32__ieee_hasher__up(
40837
    wuffs_crc32__ieee_hasher* self,
40838
    wuffs_base__slice_u8 a_x);
40839
40840
WUFFS_BASE__GENERATED_C_CODE
40841
static wuffs_base__empty_struct
40842
wuffs_crc32__ieee_hasher__up__choosy_default(
40843
    wuffs_crc32__ieee_hasher* self,
40844
    wuffs_base__slice_u8 a_x);
40845
40846
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32)
40847
WUFFS_BASE__GENERATED_C_CODE
40848
static wuffs_base__empty_struct
40849
wuffs_crc32__ieee_hasher__up_arm_crc32(
40850
    wuffs_crc32__ieee_hasher* self,
40851
    wuffs_base__slice_u8 a_x);
40852
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32)
40853
40854
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
40855
WUFFS_BASE__GENERATED_C_CODE
40856
static wuffs_base__empty_struct
40857
wuffs_crc32__ieee_hasher__up_x86_sse42(
40858
    wuffs_crc32__ieee_hasher* self,
40859
    wuffs_base__slice_u8 a_x);
40860
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
40861
40862
// ---------------- VTables
40863
40864
const wuffs_base__hasher_u32__func_ptrs
40865
wuffs_crc32__ieee_hasher__func_ptrs_for__wuffs_base__hasher_u32 = {
40866
  (uint32_t(*)(const void*))(&wuffs_crc32__ieee_hasher__checksum_u32),
40867
  (uint64_t(*)(const void*,
40868
      uint32_t))(&wuffs_crc32__ieee_hasher__get_quirk),
40869
  (wuffs_base__status(*)(void*,
40870
      uint32_t,
40871
      uint64_t))(&wuffs_crc32__ieee_hasher__set_quirk),
40872
  (wuffs_base__empty_struct(*)(void*,
40873
      wuffs_base__slice_u8))(&wuffs_crc32__ieee_hasher__update),
40874
  (uint32_t(*)(void*,
40875
      wuffs_base__slice_u8))(&wuffs_crc32__ieee_hasher__update_u32),
40876
};
40877
40878
// ---------------- Initializer Implementations
40879
40880
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
40881
wuffs_crc32__ieee_hasher__initialize(
40882
    wuffs_crc32__ieee_hasher* self,
40883
    size_t sizeof_star_self,
40884
    uint64_t wuffs_version,
40885
    uint32_t options){
40886
  if (!self) {
40887
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
40888
  }
40889
  if (sizeof(*self) != sizeof_star_self) {
40890
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
40891
  }
40892
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
40893
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
40894
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
40895
  }
40896
40897
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
40898
    // The whole point of this if-check is to detect an uninitialized *self.
40899
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
40900
#if !defined(__clang__) && defined(__GNUC__)
40901
#pragma GCC diagnostic push
40902
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
40903
#endif
40904
    if (self->private_impl.magic != 0) {
40905
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
40906
    }
40907
#if !defined(__clang__) && defined(__GNUC__)
40908
#pragma GCC diagnostic pop
40909
#endif
40910
  } else {
40911
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
40912
      memset(self, 0, sizeof(*self));
40913
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
40914
    } else {
40915
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
40916
    }
40917
  }
40918
40919
  self->private_impl.choosy_up = &wuffs_crc32__ieee_hasher__up__choosy_default;
40920
40921
  self->private_impl.magic = WUFFS_BASE__MAGIC;
40922
  self->private_impl.vtable_for__wuffs_base__hasher_u32.vtable_name =
40923
      wuffs_base__hasher_u32__vtable_name;
40924
  self->private_impl.vtable_for__wuffs_base__hasher_u32.function_pointers =
40925
      (const void*)(&wuffs_crc32__ieee_hasher__func_ptrs_for__wuffs_base__hasher_u32);
40926
  return wuffs_base__make_status(NULL);
40927
}
40928
40929
wuffs_crc32__ieee_hasher*
40930
wuffs_crc32__ieee_hasher__alloc(void) {
40931
  wuffs_crc32__ieee_hasher* x =
40932
      (wuffs_crc32__ieee_hasher*)(calloc(1, sizeof(wuffs_crc32__ieee_hasher)));
40933
  if (!x) {
40934
    return NULL;
40935
  }
40936
  if (wuffs_crc32__ieee_hasher__initialize(
40937
      x, sizeof(wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
40938
    free(x);
40939
    return NULL;
40940
  }
40941
  return x;
40942
}
40943
40944
size_t
40945
sizeof__wuffs_crc32__ieee_hasher(void) {
40946
  return sizeof(wuffs_crc32__ieee_hasher);
40947
}
40948
40949
// ---------------- Function Implementations
40950
40951
// -------- func crc32.ieee_hasher.get_quirk
40952
40953
WUFFS_BASE__GENERATED_C_CODE
40954
WUFFS_BASE__MAYBE_STATIC uint64_t
40955
wuffs_crc32__ieee_hasher__get_quirk(
40956
    const wuffs_crc32__ieee_hasher* self,
40957
    uint32_t a_key) {
40958
  if (!self) {
40959
    return 0;
40960
  }
40961
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
40962
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
40963
    return 0;
40964
  }
40965
40966
  return 0u;
40967
}
40968
40969
// -------- func crc32.ieee_hasher.set_quirk
40970
40971
WUFFS_BASE__GENERATED_C_CODE
40972
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
40973
wuffs_crc32__ieee_hasher__set_quirk(
40974
    wuffs_crc32__ieee_hasher* self,
40975
    uint32_t a_key,
40976
    uint64_t a_value) {
40977
  if (!self) {
40978
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
40979
  }
40980
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
40981
    return wuffs_base__make_status(
40982
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
40983
        ? wuffs_base__error__disabled_by_previous_error
40984
        : wuffs_base__error__initialize_not_called);
40985
  }
40986
40987
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
40988
}
40989
40990
// -------- func crc32.ieee_hasher.update
40991
40992
WUFFS_BASE__GENERATED_C_CODE
40993
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
40994
wuffs_crc32__ieee_hasher__update(
40995
    wuffs_crc32__ieee_hasher* self,
40996
    wuffs_base__slice_u8 a_x) {
40997
  if (!self) {
40998
    return wuffs_base__make_empty_struct();
40999
  }
41000
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
41001
    return wuffs_base__make_empty_struct();
41002
  }
41003
41004
  if (self->private_impl.f_state == 0u) {
41005
    self->private_impl.choosy_up = (
41006
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32)
41007
        wuffs_base__cpu_arch__have_arm_crc32() ? &wuffs_crc32__ieee_hasher__up_arm_crc32 :
41008
#endif
41009
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
41010
        wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_crc32__ieee_hasher__up_x86_sse42 :
41011
#endif
41012
        self->private_impl.choosy_up);
41013
  }
41014
  wuffs_crc32__ieee_hasher__up(self, a_x);
41015
  return wuffs_base__make_empty_struct();
41016
}
41017
41018
// -------- func crc32.ieee_hasher.update_u32
41019
41020
WUFFS_BASE__GENERATED_C_CODE
41021
WUFFS_BASE__MAYBE_STATIC uint32_t
41022
wuffs_crc32__ieee_hasher__update_u32(
41023
    wuffs_crc32__ieee_hasher* self,
41024
    wuffs_base__slice_u8 a_x) {
41025
  if (!self) {
41026
    return 0;
41027
  }
41028
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
41029
    return 0;
41030
  }
41031
41032
  wuffs_crc32__ieee_hasher__update(self, a_x);
41033
  return self->private_impl.f_state;
41034
}
41035
41036
// -------- func crc32.ieee_hasher.up
41037
41038
WUFFS_BASE__GENERATED_C_CODE
41039
static wuffs_base__empty_struct
41040
wuffs_crc32__ieee_hasher__up(
41041
    wuffs_crc32__ieee_hasher* self,
41042
    wuffs_base__slice_u8 a_x) {
41043
  return (*self->private_impl.choosy_up)(self, a_x);
41044
}
41045
41046
WUFFS_BASE__GENERATED_C_CODE
41047
static wuffs_base__empty_struct
41048
wuffs_crc32__ieee_hasher__up__choosy_default(
41049
    wuffs_crc32__ieee_hasher* self,
41050
    wuffs_base__slice_u8 a_x) {
41051
  uint32_t v_s = 0;
41052
  wuffs_base__slice_u8 v_p = {0};
41053
41054
  v_s = (4294967295u ^ self->private_impl.f_state);
41055
  {
41056
    wuffs_base__slice_u8 i_slice_p = a_x;
41057
    v_p.ptr = i_slice_p.ptr;
41058
    v_p.len = 16;
41059
    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));
41060
    while (v_p.ptr < i_end0_p) {
41061
      v_s ^= ((((uint32_t)(v_p.ptr[0u])) << 0u) |
41062
          (((uint32_t)(v_p.ptr[1u])) << 8u) |
41063
          (((uint32_t)(v_p.ptr[2u])) << 16u) |
41064
          (((uint32_t)(v_p.ptr[3u])) << 24u));
41065
      v_s = (WUFFS_CRC32__IEEE_TABLE[0u][v_p.ptr[15u]] ^
41066
          WUFFS_CRC32__IEEE_TABLE[1u][v_p.ptr[14u]] ^
41067
          WUFFS_CRC32__IEEE_TABLE[2u][v_p.ptr[13u]] ^
41068
          WUFFS_CRC32__IEEE_TABLE[3u][v_p.ptr[12u]] ^
41069
          WUFFS_CRC32__IEEE_TABLE[4u][v_p.ptr[11u]] ^
41070
          WUFFS_CRC32__IEEE_TABLE[5u][v_p.ptr[10u]] ^
41071
          WUFFS_CRC32__IEEE_TABLE[6u][v_p.ptr[9u]] ^
41072
          WUFFS_CRC32__IEEE_TABLE[7u][v_p.ptr[8u]] ^
41073
          WUFFS_CRC32__IEEE_TABLE[8u][v_p.ptr[7u]] ^
41074
          WUFFS_CRC32__IEEE_TABLE[9u][v_p.ptr[6u]] ^
41075
          WUFFS_CRC32__IEEE_TABLE[10u][v_p.ptr[5u]] ^
41076
          WUFFS_CRC32__IEEE_TABLE[11u][v_p.ptr[4u]] ^
41077
          WUFFS_CRC32__IEEE_TABLE[12u][(255u & (v_s >> 24u))] ^
41078
          WUFFS_CRC32__IEEE_TABLE[13u][(255u & (v_s >> 16u))] ^
41079
          WUFFS_CRC32__IEEE_TABLE[14u][(255u & (v_s >> 8u))] ^
41080
          WUFFS_CRC32__IEEE_TABLE[15u][(255u & (v_s >> 0u))]);
41081
      v_p.ptr += 16;
41082
      v_s ^= ((((uint32_t)(v_p.ptr[0u])) << 0u) |
41083
          (((uint32_t)(v_p.ptr[1u])) << 8u) |
41084
          (((uint32_t)(v_p.ptr[2u])) << 16u) |
41085
          (((uint32_t)(v_p.ptr[3u])) << 24u));
41086
      v_s = (WUFFS_CRC32__IEEE_TABLE[0u][v_p.ptr[15u]] ^
41087
          WUFFS_CRC32__IEEE_TABLE[1u][v_p.ptr[14u]] ^
41088
          WUFFS_CRC32__IEEE_TABLE[2u][v_p.ptr[13u]] ^
41089
          WUFFS_CRC32__IEEE_TABLE[3u][v_p.ptr[12u]] ^
41090
          WUFFS_CRC32__IEEE_TABLE[4u][v_p.ptr[11u]] ^
41091
          WUFFS_CRC32__IEEE_TABLE[5u][v_p.ptr[10u]] ^
41092
          WUFFS_CRC32__IEEE_TABLE[6u][v_p.ptr[9u]] ^
41093
          WUFFS_CRC32__IEEE_TABLE[7u][v_p.ptr[8u]] ^
41094
          WUFFS_CRC32__IEEE_TABLE[8u][v_p.ptr[7u]] ^
41095
          WUFFS_CRC32__IEEE_TABLE[9u][v_p.ptr[6u]] ^
41096
          WUFFS_CRC32__IEEE_TABLE[10u][v_p.ptr[5u]] ^
41097
          WUFFS_CRC32__IEEE_TABLE[11u][v_p.ptr[4u]] ^
41098
          WUFFS_CRC32__IEEE_TABLE[12u][(255u & (v_s >> 24u))] ^
41099
          WUFFS_CRC32__IEEE_TABLE[13u][(255u & (v_s >> 16u))] ^
41100
          WUFFS_CRC32__IEEE_TABLE[14u][(255u & (v_s >> 8u))] ^
41101
          WUFFS_CRC32__IEEE_TABLE[15u][(255u & (v_s >> 0u))]);
41102
      v_p.ptr += 16;
41103
    }
41104
    v_p.len = 16;
41105
    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));
41106
    while (v_p.ptr < i_end1_p) {
41107
      v_s ^= ((((uint32_t)(v_p.ptr[0u])) << 0u) |
41108
          (((uint32_t)(v_p.ptr[1u])) << 8u) |
41109
          (((uint32_t)(v_p.ptr[2u])) << 16u) |
41110
          (((uint32_t)(v_p.ptr[3u])) << 24u));
41111
      v_s = (WUFFS_CRC32__IEEE_TABLE[0u][v_p.ptr[15u]] ^
41112
          WUFFS_CRC32__IEEE_TABLE[1u][v_p.ptr[14u]] ^
41113
          WUFFS_CRC32__IEEE_TABLE[2u][v_p.ptr[13u]] ^
41114
          WUFFS_CRC32__IEEE_TABLE[3u][v_p.ptr[12u]] ^
41115
          WUFFS_CRC32__IEEE_TABLE[4u][v_p.ptr[11u]] ^
41116
          WUFFS_CRC32__IEEE_TABLE[5u][v_p.ptr[10u]] ^
41117
          WUFFS_CRC32__IEEE_TABLE[6u][v_p.ptr[9u]] ^
41118
          WUFFS_CRC32__IEEE_TABLE[7u][v_p.ptr[8u]] ^
41119
          WUFFS_CRC32__IEEE_TABLE[8u][v_p.ptr[7u]] ^
41120
          WUFFS_CRC32__IEEE_TABLE[9u][v_p.ptr[6u]] ^
41121
          WUFFS_CRC32__IEEE_TABLE[10u][v_p.ptr[5u]] ^
41122
          WUFFS_CRC32__IEEE_TABLE[11u][v_p.ptr[4u]] ^
41123
          WUFFS_CRC32__IEEE_TABLE[12u][(255u & (v_s >> 24u))] ^
41124
          WUFFS_CRC32__IEEE_TABLE[13u][(255u & (v_s >> 16u))] ^
41125
          WUFFS_CRC32__IEEE_TABLE[14u][(255u & (v_s >> 8u))] ^
41126
          WUFFS_CRC32__IEEE_TABLE[15u][(255u & (v_s >> 0u))]);
41127
      v_p.ptr += 16;
41128
    }
41129
    v_p.len = 1;
41130
    const uint8_t* i_end2_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len);
41131
    while (v_p.ptr < i_end2_p) {
41132
      v_s = (WUFFS_CRC32__IEEE_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ v_p.ptr[0u]))] ^ (v_s >> 8u));
41133
      v_p.ptr += 1;
41134
    }
41135
    v_p.len = 0;
41136
  }
41137
  self->private_impl.f_state = (4294967295u ^ v_s);
41138
  return wuffs_base__make_empty_struct();
41139
}
41140
41141
// -------- func crc32.ieee_hasher.checksum_u32
41142
41143
WUFFS_BASE__GENERATED_C_CODE
41144
WUFFS_BASE__MAYBE_STATIC uint32_t
41145
wuffs_crc32__ieee_hasher__checksum_u32(
41146
    const wuffs_crc32__ieee_hasher* self) {
41147
  if (!self) {
41148
    return 0;
41149
  }
41150
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
41151
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
41152
    return 0;
41153
  }
41154
41155
  return self->private_impl.f_state;
41156
}
41157
41158
// โ€ผ WUFFS MULTI-FILE SECTION +arm_crc32
41159
// -------- func crc32.ieee_hasher.up_arm_crc32
41160
41161
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32)
41162
WUFFS_BASE__GENERATED_C_CODE
41163
static wuffs_base__empty_struct
41164
wuffs_crc32__ieee_hasher__up_arm_crc32(
41165
    wuffs_crc32__ieee_hasher* self,
41166
    wuffs_base__slice_u8 a_x) {
41167
  wuffs_base__slice_u8 v_p = {0};
41168
  uint32_t v_s = 0;
41169
41170
  v_s = (4294967295u ^ self->private_impl.f_state);
41171
  while ((((uint64_t)(a_x.len)) > 0u) && ((15u & ((uint32_t)(0xFFFu & (uintptr_t)(a_x.ptr)))) != 0u)) {
41172
    v_s = __crc32b(v_s, a_x.ptr[0u]);
41173
    a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u);
41174
  }
41175
  {
41176
    wuffs_base__slice_u8 i_slice_p = a_x;
41177
    v_p.ptr = i_slice_p.ptr;
41178
    v_p.len = 8;
41179
    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));
41180
    while (v_p.ptr < i_end0_p) {
41181
      v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
41182
      v_p.ptr += 8;
41183
      v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
41184
      v_p.ptr += 8;
41185
      v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
41186
      v_p.ptr += 8;
41187
      v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
41188
      v_p.ptr += 8;
41189
      v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
41190
      v_p.ptr += 8;
41191
      v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
41192
      v_p.ptr += 8;
41193
      v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
41194
      v_p.ptr += 8;
41195
      v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
41196
      v_p.ptr += 8;
41197
      v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
41198
      v_p.ptr += 8;
41199
      v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
41200
      v_p.ptr += 8;
41201
      v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
41202
      v_p.ptr += 8;
41203
      v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
41204
      v_p.ptr += 8;
41205
      v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
41206
      v_p.ptr += 8;
41207
      v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
41208
      v_p.ptr += 8;
41209
      v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
41210
      v_p.ptr += 8;
41211
      v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
41212
      v_p.ptr += 8;
41213
    }
41214
    v_p.len = 8;
41215
    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));
41216
    while (v_p.ptr < i_end1_p) {
41217
      v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
41218
      v_p.ptr += 8;
41219
    }
41220
    v_p.len = 1;
41221
    const uint8_t* i_end2_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len);
41222
    while (v_p.ptr < i_end2_p) {
41223
      v_s = __crc32b(v_s, v_p.ptr[0u]);
41224
      v_p.ptr += 1;
41225
    }
41226
    v_p.len = 0;
41227
  }
41228
  self->private_impl.f_state = (4294967295u ^ v_s);
41229
  return wuffs_base__make_empty_struct();
41230
}
41231
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32)
41232
// โ€ผ WUFFS MULTI-FILE SECTION -arm_crc32
41233
41234
// โ€ผ WUFFS MULTI-FILE SECTION +x86_sse42
41235
// -------- func crc32.ieee_hasher.up_x86_sse42
41236
41237
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
41238
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
41239
WUFFS_BASE__GENERATED_C_CODE
41240
static wuffs_base__empty_struct
41241
wuffs_crc32__ieee_hasher__up_x86_sse42(
41242
    wuffs_crc32__ieee_hasher* self,
41243
    wuffs_base__slice_u8 a_x) {
41244
  uint32_t v_s = 0;
41245
  __m128i v_kk = {0};
41246
  __m128i v_x0 = {0};
41247
  __m128i v_x1 = {0};
41248
  __m128i v_x2 = {0};
41249
  __m128i v_x3 = {0};
41250
  __m128i v_x4 = {0};
41251
  __m128i v_x5 = {0};
41252
  __m128i v_x6 = {0};
41253
  __m128i v_x7 = {0};
41254
  __m128i v_y0 = {0};
41255
  __m128i v_y1 = {0};
41256
  __m128i v_y2 = {0};
41257
  __m128i v_y3 = {0};
41258
  __m128i v_y4 = {0};
41259
  __m128i v_y5 = {0};
41260
  __m128i v_y6 = {0};
41261
  __m128i v_y7 = {0};
41262
41263
  v_s = (4294967295u ^ self->private_impl.f_state);
41264
  while ((((uint64_t)(a_x.len)) > 0u) && ((15u & ((uint32_t)(0xFFFu & (uintptr_t)(a_x.ptr)))) != 0u)) {
41265
    v_s = (WUFFS_CRC32__IEEE_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ a_x.ptr[0u]))] ^ (v_s >> 8u));
41266
    a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u);
41267
  }
41268
  if (((uint64_t)(a_x.len)) >= 128u) {
41269
    v_x0 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u));
41270
    v_x1 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u));
41271
    v_x2 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 32u));
41272
    v_x3 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 48u));
41273
    v_x4 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 64u));
41274
    v_x5 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 80u));
41275
    v_x6 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 96u));
41276
    v_x7 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 112u));
41277
    v_kk = _mm_set_epi32((int32_t)(0u), (int32_t)(2433674945u), (int32_t)(0u), (int32_t)(872412467u));
41278
    v_x0 = _mm_xor_si128(v_x0, _mm_cvtsi32_si128((int32_t)(v_s)));
41279
    a_x = wuffs_base__slice_u8__subslice_i(a_x, 128u);
41280
    while (((uint64_t)(a_x.len)) >= 128u) {
41281
      v_y0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(0u));
41282
      v_x0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(17u));
41283
      v_y1 = _mm_clmulepi64_si128(v_x1, v_kk, (int32_t)(0u));
41284
      v_x1 = _mm_clmulepi64_si128(v_x1, v_kk, (int32_t)(17u));
41285
      v_y2 = _mm_clmulepi64_si128(v_x2, v_kk, (int32_t)(0u));
41286
      v_x2 = _mm_clmulepi64_si128(v_x2, v_kk, (int32_t)(17u));
41287
      v_y3 = _mm_clmulepi64_si128(v_x3, v_kk, (int32_t)(0u));
41288
      v_x3 = _mm_clmulepi64_si128(v_x3, v_kk, (int32_t)(17u));
41289
      v_y4 = _mm_clmulepi64_si128(v_x4, v_kk, (int32_t)(0u));
41290
      v_x4 = _mm_clmulepi64_si128(v_x4, v_kk, (int32_t)(17u));
41291
      v_y5 = _mm_clmulepi64_si128(v_x5, v_kk, (int32_t)(0u));
41292
      v_x5 = _mm_clmulepi64_si128(v_x5, v_kk, (int32_t)(17u));
41293
      v_y6 = _mm_clmulepi64_si128(v_x6, v_kk, (int32_t)(0u));
41294
      v_x6 = _mm_clmulepi64_si128(v_x6, v_kk, (int32_t)(17u));
41295
      v_y7 = _mm_clmulepi64_si128(v_x7, v_kk, (int32_t)(0u));
41296
      v_x7 = _mm_clmulepi64_si128(v_x7, v_kk, (int32_t)(17u));
41297
      v_y0 = _mm_xor_si128(v_y0, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u)));
41298
      v_x0 = _mm_xor_si128(v_x0, v_y0);
41299
      v_y1 = _mm_xor_si128(v_y1, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u)));
41300
      v_x1 = _mm_xor_si128(v_x1, v_y1);
41301
      v_y2 = _mm_xor_si128(v_y2, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 32u)));
41302
      v_x2 = _mm_xor_si128(v_x2, v_y2);
41303
      v_y3 = _mm_xor_si128(v_y3, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 48u)));
41304
      v_x3 = _mm_xor_si128(v_x3, v_y3);
41305
      v_y4 = _mm_xor_si128(v_y4, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 64u)));
41306
      v_x4 = _mm_xor_si128(v_x4, v_y4);
41307
      v_y5 = _mm_xor_si128(v_y5, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 80u)));
41308
      v_x5 = _mm_xor_si128(v_x5, v_y5);
41309
      v_y6 = _mm_xor_si128(v_y6, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 96u)));
41310
      v_x6 = _mm_xor_si128(v_x6, v_y6);
41311
      v_y7 = _mm_xor_si128(v_y7, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 112u)));
41312
      v_x7 = _mm_xor_si128(v_x7, v_y7);
41313
      a_x = wuffs_base__slice_u8__subslice_i(a_x, 128u);
41314
    }
41315
    v_kk = _mm_set_epi32((int32_t)(0u), (int32_t)(3433693342u), (int32_t)(0u), (int32_t)(2926088593u));
41316
    v_y0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(0u));
41317
    v_x0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(17u));
41318
    v_y2 = _mm_clmulepi64_si128(v_x2, v_kk, (int32_t)(0u));
41319
    v_x2 = _mm_clmulepi64_si128(v_x2, v_kk, (int32_t)(17u));
41320
    v_y4 = _mm_clmulepi64_si128(v_x4, v_kk, (int32_t)(0u));
41321
    v_x4 = _mm_clmulepi64_si128(v_x4, v_kk, (int32_t)(17u));
41322
    v_y6 = _mm_clmulepi64_si128(v_x6, v_kk, (int32_t)(0u));
41323
    v_x6 = _mm_clmulepi64_si128(v_x6, v_kk, (int32_t)(17u));
41324
    v_y0 = _mm_xor_si128(v_y0, v_x1);
41325
    v_x0 = _mm_xor_si128(v_x0, v_y0);
41326
    v_y2 = _mm_xor_si128(v_y2, v_x3);
41327
    v_x2 = _mm_xor_si128(v_x2, v_y2);
41328
    v_y4 = _mm_xor_si128(v_y4, v_x5);
41329
    v_x4 = _mm_xor_si128(v_x4, v_y4);
41330
    v_y6 = _mm_xor_si128(v_y6, v_x7);
41331
    v_x6 = _mm_xor_si128(v_x6, v_y6);
41332
    v_kk = _mm_set_epi32((int32_t)(0u), (int32_t)(2166711591u), (int32_t)(0u), (int32_t)(4057597354u));
41333
    v_y0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(0u));
41334
    v_x0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(17u));
41335
    v_y4 = _mm_clmulepi64_si128(v_x4, v_kk, (int32_t)(0u));
41336
    v_x4 = _mm_clmulepi64_si128(v_x4, v_kk, (int32_t)(17u));
41337
    v_y0 = _mm_xor_si128(v_y0, v_x2);
41338
    v_x0 = _mm_xor_si128(v_x0, v_y0);
41339
    v_y4 = _mm_xor_si128(v_y4, v_x6);
41340
    v_x4 = _mm_xor_si128(v_x4, v_y4);
41341
    v_kk = _mm_set_epi32((int32_t)(0u), (int32_t)(496309207u), (int32_t)(0u), (int32_t)(2402626965u));
41342
    v_y0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(0u));
41343
    v_x0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(17u));
41344
    v_y0 = _mm_xor_si128(v_y0, v_x4);
41345
    v_x0 = _mm_xor_si128(v_x0, v_y0);
41346
    v_kk = _mm_set_epi32((int32_t)(1u), (int32_t)(3681617473u), (int32_t)(3034951717u), (int32_t)(4144043585u));
41347
    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))));
41348
    v_kk = _mm_set_epi32((int32_t)(1u), (int32_t)(3681617473u), (int32_t)(3034951717u), (int32_t)(4144043585u));
41349
    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))));
41350
  }
41351
  while (((uint64_t)(a_x.len)) >= 8u) {
41352
    v_kk = _mm_set_epi32((int32_t)(1u), (int32_t)(3681617473u), (int32_t)(3034951717u), (int32_t)(4144043585u));
41353
    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))));
41354
    a_x = wuffs_base__slice_u8__subslice_i(a_x, 8u);
41355
  }
41356
  while (((uint64_t)(a_x.len)) > 0u) {
41357
    v_s = (WUFFS_CRC32__IEEE_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ a_x.ptr[0u]))] ^ (v_s >> 8u));
41358
    a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u);
41359
  }
41360
  self->private_impl.f_state = (4294967295u ^ v_s);
41361
  return wuffs_base__make_empty_struct();
41362
}
41363
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
41364
// โ€ผ WUFFS MULTI-FILE SECTION -x86_sse42
41365
41366
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC32)
41367
41368
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC64)
41369
41370
// ---------------- Status Codes Implementations
41371
41372
// ---------------- Private Consts
41373
41374
static const uint64_t
41375
WUFFS_CRC64__ECMA_TABLE[8][256] WUFFS_BASE__POTENTIALLY_UNUSED = {
41376
  {
41377
    0u, 12911341560706588527u, 17619267392293085275u, 5164075066763771700u, 8921845837811637811u, 14483170935171449180u, 10328150133527543400u, 4357999468653093127u,
41378
    17843691675623275622u, 4940391307328217865u, 226782375002905661u, 12685511915359257426u, 10119945210068853333u, 4566377562367245626u, 8715998937306186254u, 14689403211693301089u,
41379
    9051005139383707209u, 14895072503764629798u, 9880782614656435730u, 4193374422961527165u, 453564750005811322u, 13070904082541799189u, 17496296445768931361u, 4747102235666401102u,
41380
    9960315520700766767u, 4113029525020509504u, 9132755124734491252u, 14812441257301386523u, 17431997874612372508u, 4811156168024382323u, 391483189436228679u, 13132671735097031464u,
41381
    18102010278767414418u, 5195199925788447741u, 1131375642422963401u, 13591081480414639014u, 9288535643022529185u, 3731739485546663374u, 8386748845923054330u, 14361410892855143829u,
41382
    907129500011622644u, 13814943346342178715u, 17875617253995106479u, 5421418680781082560u, 8594564625313771207u, 14152643483341451688u, 9494204471332802204u, 3525329033817543155u,
41383
    9704381199536204507u, 3855837706121835956u, 8226059050041019008u, 13908973417437222383u, 18265510249468982504u, 5643692520190618503u, 718348998302913715u, 13463047253836762076u,
41384
    8146277531524994749u, 13989069943491807698u, 9622312336048764646u, 3938150108875254153u, 782966378872457358u, 13399312233903888353u, 18327840216347633877u, 5582173445676054458u,
41385
    7257036000092981153u, 15535280666427316430u, 10390399851576895482u, 2529986302517213333u, 2262751284845926802u, 12414353723947190013u, 16997392145760156105u, 6398650419759490726u,
41386
    10599130201908394951u, 2322133910755632296u, 7463478971093326748u, 15329644185724306675u, 16773497691846108660u, 6622864283287239323u, 2036569382881248687u, 12640783567252986560u,
41387
    1814259000023245288u, 12250853444207230599u, 17125426475222188467u, 6811676960462675676u, 7132938157145702363u, 15119434731753103540u, 10842837361562165120u, 2690676064372932847u,
41388
    17189129250627542414u, 6747026957542163169u, 1875814858707893717u, 12188560364711551674u, 10762704257491731389u, 2770420489343360210u, 7050658067635086310u, 15201536148867841161u,
41389
    11493583972846619443u, 3219832958944941148u, 7711675412243671912u, 15576564987190227975u, 16452118100082038016u, 6305011443818121839u, 1213047649942025563u, 11816267669673208372u,
41390
    7503259434831574869u, 15784731923736995898u, 11287385040381237006u, 3425713581329221729u, 1436697996605827430u, 11591809733187859977u, 16677985422973077821u, 6078267261889762898u,
41391
    16292555063049989498u, 5851447209550246421u, 1630020308903038241u, 11939238787801010766u, 11081681957373440841u, 3090674103720225830u, 7876300217750508306u, 16023932746787097725u,
41392
    1565932757744914716u, 12003503911822413427u, 16230825569204842823u, 5913566482019610152u, 7956607163135676207u, 15944361922680361024u, 11164346891352108916u, 3008957496780927003u,
41393
    14514072000185962306u, 8809633696146542637u, 4460922918905818905u, 10287960411460399222u, 12879331835779764593u, 113391187501452830u, 5059972605034426666u, 17660565739912801861u,
41394
    4525502569691853604u, 10224187249629523019u, 14576435430675780479u, 8748148222884465680u, 4980157760350383383u, 17740628527280140920u, 12797300839518981452u, 195741594718114339u,
41395
    13040162471224305931u, 565687821211481700u, 4644267821511264592u, 17536326748496696895u, 14926957942186653496u, 8937808626997553239u, 4297282312656885603u, 9839608450464401420u,
41396
    4852190599768102253u, 17327666750234135042u, 13245728566574478646u, 359174499151456857u, 4073138765762497374u, 10063573324157604913u, 14700457781105076997u, 9163920108173816938u,
41397
    3628518000046490576u, 9328460452529085631u, 14330211790445699979u, 8498696072880078052u, 5299565100954197475u, 18061012165519327884u, 13623353920925351352u, 1018284691440624343u,
41398
    14265876314291404726u, 8562713237611094233u, 3566469078572851181u, 9390260331795218562u, 13702854325316886917u, 937907429353946858u, 5381352128745865694u, 17978417549248290481u,
41399
    5746791986423309721u, 18225777846762470134u, 13494053915084326338u, 606523824971012781u, 3751629717415787434u, 9745292510640121029u, 13876787882151992305u, 8338992711486538910u,
41400
    13285957365033343487u, 815010154451519120u, 5540840978686720420u, 18431906428167644875u, 14101316135270172620u, 8115412784602421411u, 3978303581567838103u, 9519354766961195256u,
41401
    12527462061959317731u, 2230461459452909452u, 6439665917889882296u, 16893009583564617687u, 15423350824487343824u, 7288217715337890239u, 2490078880175191691u, 10493603952060017124u,
41402
    6520081235612152965u, 16813546994155744234u, 12610022887636243678u, 2148641156328442801u, 2426095299884051126u, 10557972909709735385u, 15361512820870335213u, 7350228890552538498u,
41403
    15006518869663149738u, 7165105895222849989u, 2649782550477098737u, 10947027550912647582u, 12362696414880903321u, 1783234539286425590u, 6851427162658443458u, 17022309211647725485u,
41404
    2873395993211654860u, 10722532847870938531u, 15232418832718623383u, 6938393941075996152u, 6642978682516671743u, 17230443782969840528u, 12156534523779525796u, 1989151790783919051u,
41405
    6263731030979658865u, 16556202624882645790u, 11702894419100492842u, 1245039440087595845u, 3260040617806076482u, 11390642587947386157u, 15688795063501830681u, 7680756410435167606u,
41406
    11622868312827688983u, 1324891275238549368u, 6181348207440451660u, 16638201170595874595u, 15752600435501016612u, 7616209416359311691u, 3321489341258335871u, 11328242235714328848u,
41407
    3131865515489829432u, 10977756817953029463u, 16137146508898304611u, 7844397531750915340u, 5811434156413844491u, 16395372229761246052u, 11827132964039220304u, 1660744670629167935u,
41408
    15913214326271352414u, 8068573254449152305u, 2905717078206922245u, 11204220263579804010u, 12035829987123708013u, 1452858539103461122u, 6017914993561854006u, 16189773752444600153u,
41409
  }, {
41410
    0u, 6118555238288912653u, 12237110476577825306u, 18247330833359770391u, 13942380710360636081u, 10778293617712507836u, 7543452712389327019u, 4343374206906190246u,
41411
    1162559746622204903u, 4957131115480832746u, 13398436261328603645u, 17084888254066768112u, 15086905424778654038u, 9634902877839851611u, 8686748413812380492u, 3198961161184305729u,
41412
    2325119493244409806u, 8407378615347160771u, 9914262230961665492u, 15960741045388068057u, 16229058527915052415u, 13101053971319389298u, 5254506258681524069u, 2018377927885299304u,
41413
    3487552142959377449u, 7246080283574668580u, 11075676491871100467u, 14798208821638459198u, 17373496827624760984u, 11957750539307177877u, 6397922322368611458u, 873845550624159119u,
41414
    4650238986488819612u, 1468611264581623441u, 16814757230694321542u, 13669406796222545035u, 9364600845881799981u, 15356367945216001056u, 2893367039927949111u, 8993183146101597754u,
41415
    5812680741028562043u, 307286854339917174u, 17976181078471403105u, 12506848973898782572u, 10509012517363048138u, 14213073068277772231u, 4036755855770598608u, 7848658706446142941u,
41416
    6975104285918754898u, 3757679901787621727u, 14492160567149337160u, 11382574084698991429u, 11651310343450272483u, 17679087685142107118u, 604386294999662841u, 6668229816820511220u,
41417
    8137636784695169973u, 2596263716583940792u, 15653459723670892975u, 10220140060479144098u, 12795844644737222916u, 16535671346696648713u, 1747691101248318238u, 5523790692630174227u,
41418
    9300477972977639224u, 15418239225476001333u, 2937222529163246882u, 8947075512310451247u, 4642267913777087881u, 1478833794519692420u, 16842993350473770899u, 13643422681269376670u,
41419
    10462937938231096543u, 14256895642581861842u, 4098594218943518405u, 7784568886045304776u, 5786734079855898222u, 335485660068962147u, 17986366292203195508u, 12498915352811683193u,
41420
    11625361482057124086u, 17707288688936286715u, 614573708679834348u, 6660293997941431265u, 6929031904881267271u, 3801500275841901386u, 14553996732492558429u, 11318486464284246352u,
41421
    12787875770090627857u, 16545891676414235164u, 1775925023235784971u, 5497808777625382918u, 8073511711541197216u, 2658137194938402989u, 15697317412892285882u, 10174030228858301111u,
41422
    13950208571837509796u, 10768213751408296361u, 7515359803575243454u, 4369215658492879795u, 64266086328445461u, 6056541296517372696u, 12193111774187735055u, 18293581128395077890u,
41423
    15112713823828466499u, 9606842886146402894u, 8676701462472931673u, 3206755967968430164u, 1208772589999325682u, 4913169729330573567u, 13336459633641022440u, 17149116886581154533u,
41424
    16275273569390339946u, 13057090384914568807u, 5192527433167881584u, 2082608760381092989u, 2350925692077440475u, 8379320821714095318u, 9904217479574233025u, 15968533654375526092u,
41425
    17437760713698643085u, 11895738795633802624u, 6353925819959930519u, 920093647833407386u, 3495382202496636476u, 7235998217053677361u, 11047581385260348454u, 14824052473177163051u,
41426
    10447068876609200373u, 14128364157388739064u, 4118967294799201007u, 7908597456515216354u, 5874445058326493764u, 391603411424480073u, 17894151024620902494u, 12447300791057279315u,
41427
    9284535827554175762u, 15289779793358354975u, 2957667589039384840u, 9071030930460645381u, 4729911307347480995u, 1535020299074674862u, 16750846767572792249u, 13591740465559749300u,
41428
    12735909365018523451u, 16453465302197274166u, 1832394617641637153u, 5585730863000118316u, 8197188437887036810u, 2678299164963691655u, 15569137772090609552u, 10158372272797335197u,
41429
    11573468159711796444u, 17614790262716542417u, 670971320137924294u, 6748289234561093579u, 7052776217202099821u, 3821593491595032416u, 14425748405936874615u, 11302896163253294458u,
41430
    15020497008676966249u, 9555230900528283236u, 8764415362900159859u, 3262871967819308158u, 1229147417359668696u, 5037195377843840213u, 13320587995882862530u, 17020586948957226703u,
41431
    13858063809762534542u, 10716528681989657987u, 7603000551683802772u, 4425403642365261721u, 84709666887204415u, 6180499360129388338u, 12177172482473303077u, 18165119875451415848u,
41432
    17309582619392432295u, 11880078264510294442u, 6477599625422879421u, 940257368289594288u, 3551850046471569942u, 7323923223311315739u, 10995617555250765836u, 14731624552464748801u,
41433
    16147023423082394432u, 13041502936518885965u, 5316274389876805978u, 2102700497890566231u, 2407324781779167729u, 8467313413945678076u, 9852321304593615851u, 15876037047908055782u,
41434
    1291018766690942925u, 4973072573440528064u, 13274480430592564695u, 17064442507263798490u, 15030719607150486908u, 9547259896855319665u, 8738431316985759590u, 3291108156134209131u,
41435
    128532172656890922u, 6134424711959717159u, 12113082593034745392u, 18226958170089932605u, 13886262546419256987u, 10690581952315096982u, 7595066862094806145u, 4435588787024731532u,
41436
    3580050981226981379u, 7297974293382715662u, 10987681667836234265u, 14741811897106152212u, 17353402924945863346u, 11834005814401532863u, 6413511935936860328u, 1002093465131966885u,
41437
    2417545179998651364u, 8459344608371405545u, 9826339458661147134u, 15904271038397419763u, 16208896970474576213u, 12977377931899316312u, 5270164626790366031u, 2146558256149678658u,
41438
    5864365122984562769u, 399431204366950748u, 17919992407673188939u, 12419207813205476166u, 10385054866335763168u, 14192630174644861933u, 4165217520762185978u, 7864598685623228919u,
41439
    4701851384154880950u, 1560828767195761339u, 16758641643428190636u, 13581693582721149089u, 9240574510442684679u, 15335992705270927370u, 3021896290089222941u, 9009054371811832336u,
41440
    8153224920554538911u, 2724514274940876434u, 15633368673088300421u, 10096393516356015240u, 12707851639919861038u, 16479271570068024355u, 1840187295666814772u, 5575686180147088953u,
41441
    6990764404993272952u, 3885857308630146421u, 14471996434107354722u, 11258899592309161839u, 11563386024119531209u, 17622620253752952772u, 696814903175779539u, 6720194058879067614u,
41442
  }, {
41443
    0u, 4542972359516777931u, 9085944719033555862u, 4691664355513513565u, 18171889438067111724u, 14061474303606774503u, 9383328711027027130u, 13633424072306524529u,
41444
    7676286055365832925u, 6164376987427609878u, 1481798532234586955u, 3142253189322229376u, 10855962452864321521u, 12223826156538735162u, 16771372852738792551u, 15543052108730888620u,
41445
    15352572110731665850u, 16862791698018765937u, 12328753974855219756u, 10669987536837040103u, 2963597064469173910u, 1597421751597874013u, 6284506378644458752u, 7511137813735006411u,
41446
    13801544397233820007u, 9260261528098962604u, 13951919735851666161u, 18344511890033026874u, 4874982405016790603u, 8983709158270585728u, 4445237816650825181u, 196831773885239318u,
41447
    4091022007653359089u, 562346998784700474u, 5103132815620245095u, 8780357948041161644u, 14189083196432476893u, 18150173592266475286u, 13474345022262784331u, 9652793049543924864u,
41448
    5927194128938347820u, 7875246409875505383u, 3194843503195748026u, 1395478681687169905u, 12569012757288917504u, 10477056948030502859u, 15022275627470012822u, 17253916197967211613u,
41449
    17134349580696108107u, 15186860751721288064u, 10655150290339489757u, 12453952663903504918u, 1289987737384422247u, 3381381201708377772u, 8066289525279445233u, 5835212509754572090u,
41450
    9749964810033581206u, 13278076374523191645u, 17967418316541171456u, 14290755639648123595u, 8890475633301650362u, 4929947589851190897u, 393663547770478636u, 4214651972966108647u,
41451
    8182044015306718178u, 5658655167774316073u, 1124693997569400948u, 3499391957275839935u, 10206265631240490190u, 12873559114121502981u, 17560715896082323288u, 14753743294414502547u,
41452
    1948880861322201919u, 2594127930539943668u, 7285718382500778153u, 6491924633276939618u, 16655531858934856723u, 15577868310755742168u, 11039333611388512133u, 11977453108914408014u,
41453
    11854388257876695640u, 11207451878732806035u, 15750492819751010766u, 16545974958769302533u, 6389687006391496052u, 7469038772501250239u, 2790957363374339810u, 1851148384058628905u,
41454
    14845159798643632773u, 17370237963685480270u, 12687582131971748115u, 10311195790054169816u, 3615017233668480425u, 946035540305899618u, 5493509258033841727u, 8302171348940565492u,
41455
    5281120895271462419u, 8521283507583323096u, 3989500891288354181u, 600787064567550030u, 13071075951463747903u, 9974957613568212212u, 14659789384177486505u, 17616368207971182434u,
41456
    2579975474768844494u, 2073357103652371205u, 6762762403416755544u, 7120694423275413651u, 16132579050558890466u, 16206641305794825257u, 11670425019509144180u, 11456679111066785727u,
41457
    11260412520859862953u, 11767594448091671138u, 16308316081471249471u, 15949821717821010420u, 6947506857025941637u, 6872882154850049358u, 2196985003345963795u, 2411294364755134168u,
41458
    17780951266603300724u, 14540225107906894527u, 9859895179702381794u, 13249171359945539881u, 787327095540957272u, 3884007889973030291u, 8429303945932217294u, 5472161678768272901u,
41459
    16364088030613436356u, 15858029804260760079u, 11317310335548632146u, 11674676600264311193u, 2249387995138801896u, 2322888996435045667u, 6998783914551679870u, 6785602652076537525u,
41460
    9916730820443375385u, 13156333278251739858u, 17836661041797717135u, 14448512960480194884u, 8480501340405739573u, 5384944246861192702u, 839650424281590691u, 3795664592519366248u,
41461
    3897761722644403838u, 656471011406904245u, 5188255861079887336u, 8578093388688728099u, 14571436765001556306u, 17668683201823263897u, 12983849266553879236u, 10026146741872662287u,
41462
    6669836397870376611u, 7177582867921406824u, 2488175334770097461u, 2129119614032302334u, 11583119667977343375u, 11507929313807383620u, 16044147764761037337u, 16259017374083049426u,
41463
    15843330937415051829u, 16489139217633298430u, 11946100509993103779u, 11151742071862860904u, 2878174689517968665u, 1799951022334374098u, 6478030266801178255u, 7416715545229372228u,
41464
    12779374012782992104u, 10255423946675697443u, 14938077545002500478u, 17313340186040954037u, 5581914726748679620u, 8249768321177223183u, 3702296768117257810u, 894758378090191769u,
41465
    1067805515879173007u, 3592318064290702916u, 8126281399163064345u, 5750455340522077650u, 17509465798031703203u, 14841048614271029608u, 10153889598922762037u, 12961990299524614910u,
41466
    7230034467336960850u, 6583663697231173273u, 1892071080611799236u, 2686992928761285903u, 10987018516067683454u, 12065805765134311861u, 16604342697881130984u, 15665095101429070371u,
41467
    10562241790542924838u, 12510858718452294125u, 17042567015166646192u, 15242640940723501691u, 7979001782576708362u, 5886480219318720193u, 1201574129135100060u, 3433774845539634519u,
41468
    17875696825445760251u, 14346457162030502192u, 9657117384671061869u, 13334903762452155046u, 305328503063841751u, 4266984645440464412u, 8803266454141587521u, 4981154328058445194u,
41469
    5159950949537688988u, 8687502257518297175u, 4146714207304742410u, 470617173809470401u, 13525524806833511088u, 9565558111887030139u, 14241388846550827302u, 18061812720343526637u,
41470
    3250597773715660097u, 1303669193657626762u, 5984074333724313303u, 7782311056298339100u, 15074661043719826029u, 17165493152098584486u, 12620272307991097851u, 10389759836427934768u,
41471
    12273052416502600151u, 10761709128327461916u, 15295744618112993857u, 16955639155056813962u, 6232173811933554427u, 7599472825692375856u, 2912390363305901421u, 1684630829289181350u,
41472
    13895013714051883274u, 18437420284065877185u, 13745764309700098716u, 9352044056584181591u, 4393970006691927590u, 284119552558480365u, 4822588729510268336u, 9072122871209877627u,
41473
    9177754244107333741u, 4635909983525117350u, 92935459340889083u, 4486092121981797936u, 9471751652205676353u, 13581038687731985034u, 18259186513699183831u, 14010214853299335452u,
41474
    1574654191081914544u, 3085435160094502267u, 7768015779946060582u, 6108684823746459373u, 16858607891864434588u, 15491872287116188247u, 10944323357536545802u, 12171520400656925121u,
41475
  }, {
41476
    0u, 2156813408461955548u, 4313626816923911096u, 2752718492472304228u, 8627253633847822192u, 7661928252530632364u, 5505436984944608456u, 5875429064940414228u,
41477
    17254507267695644384u, 17481523150583344956u, 15323856505061264728u, 14503785508944014468u, 11010873969889216912u, 9592933115173218380u, 11750858129880828456u, 13762408288327199732u,
41478
    5489899806547772229u, 5899293950881604249u, 8641596751236382973u, 7639112309309301025u, 4290280838231655477u, 2766522915734824425u, 24548853041579917u, 2141951263632483921u,
41479
    11764625126767791525u, 13739024951972572281u, 10995904098661322269u, 9617374173086412737u, 15347829100153899733u, 14488356108428585737u, 17231728733602892141u, 17495903608387299505u,
41480
    10979799613095544458u, 9623805157521532758u, 11798587901763208498u, 13714458609834648814u, 17283193502472765946u, 17452775347443867686u, 15278224618618602050u, 14549338234851124126u,
41481
    8580561676463310954u, 7708699370463537590u, 5533045831469648850u, 5847881786764880398u, 49097706083159834u, 2107935609010204358u, 4283902527264967842u, 2782645096555375998u,
41482
    15298762408106657231u, 14537220494637179923u, 17261466032775972471u, 17465946411177207723u, 11811312492909331135u, 13692276008895521635u, 10968273481005252871u, 9644925621600215259u,
41483
    4261616546501692207u, 2795266376586341107u, 70185227798988951u, 2096376465831291211u, 5520961050865536095u, 5868452604588535171u, 8593836137267777511u, 7687075229128879675u,
41484
    11680230827506930577u, 13832259058284016205u, 11080421551794245673u, 9523735455073038837u, 15394057194608301281u, 14432953972299937085u, 17185658977434064729u, 17550865948466574981u,
41485
    5579070418531851633u, 5801301123735731373u, 8552830750928559817u, 7736981982542757653u, 4239857041646656001u, 2826138345940532189u, 75412445699561913u, 2082177495183685733u,
41486
    17161123352926621908u, 17565732457015587080u, 15417398740927075180u, 14419136389292487344u, 11066091662939297700u, 9546555762013386360u, 11695763573529760796u, 13808381012597372352u,
41487
    98195412166319668u, 2067810197125185512u, 4215871218020408716u, 2841563382736944208u, 8567805054529935684u, 7712554084374493336u, 5565290193110751996u, 5824680096370817824u,
41488
    4213277561403610395u, 2852497928146826439u, 118647349622822563u, 2038740285422565247u, 5603244184571253355u, 5777048188553278391u, 8511711324634206675u, 7778039831901335567u,
41489
    15351860113773370363u, 14475212630091872807u, 17208772955998935107u, 17527831139023518111u, 11724816064851319947u, 13787876126790335831u, 11055209722282565427u, 9549167182608629487u,
41490
    8523233093003384414u, 7756906139291137922u, 5590532753172682214u, 5799235221864313914u, 140370455597977902u, 2025555993157185778u, 4192752931662582422u, 2864620100732154698u,
41491
    11041922101731072190u, 9570786891571902818u, 11736905209177070342u, 13767318537498720986u, 17187672274535555022u, 17539385849830522386u, 15374150458257759350u, 14462604578592423338u,
41492
    15486092620961298855u, 14629711868178897019u, 17092483903335922207u, 17355247692313779139u, 11624791503456485079u, 13600030943165030155u, 11137009302703308143u, 9754815117126884531u,
41493
    4151744643171039047u, 2626583331457439387u, 162377516962444543u, 2282879863086044451u, 5631712546292871223u, 6037452326221451755u, 8501327171535303567u, 7499692239708246611u,
41494
    11158140837063703266u, 9743299917872012094u, 11602602247471462746u, 13612749016692676742u, 17105661501857119634u, 17333526894853233742u, 15473963965085515306u, 14650238604571402230u,
41495
    8479714083293312002u, 7512977616177960414u, 5652276691881064378u, 6025361010828170854u, 150824891399123826u, 2303974039851176622u, 4164354990367371466u, 2604286280411140374u,
41496
    5659250822143950637u, 6009834889821986545u, 8454565055791594645u, 7546392787102457161u, 4121809449076176989u, 2656298618920900993u, 211263906290727909u, 2233791159333640761u,
41497
    11672732454520566221u, 13552292306546298897u, 11106145987650286197u, 9785898338790069161u, 15440531030182573757u, 14675335027319969633u, 17121240571213837573u, 17326570184971408601u,
41498
    196390824332639336u, 2258328937796115892u, 4135620394250371024u, 2632959299571932684u, 8431742436040817432u, 7560729365405768388u, 5683126765473888416u, 5994308631384381820u,
41499
    17135610109059871368u, 17303780593489122132u, 15425108168748986672u, 14699314298944934124u, 11130580386221503992u, 9770921945649714212u, 11649360192741635648u, 13566070240564762524u,
41500
    8426555122807220790u, 7574959341548112874u, 5704995856293652878u, 5963537623700588626u, 237294699245645126u, 2208312048661695642u, 4077480570845130494u, 2700071425513574178u,
41501
    11206488369142506710u, 9686112028953249034u, 11554096377106556782u, 13670376701660284594u, 17023422649268413350u, 17424940338905547386u, 15556079663802671134u, 14559229772221530562u,
41502
    4089596066908350835u, 2679540256679954607u, 224121464376355531u, 2230046074588744471u, 5727171952466636291u, 5950815117732351967u, 8405427952099257787u, 7586487769270013031u,
41503
    15543464952953907091u, 14581513594800801359u, 17034988434643772459u, 17403850594581005815u, 11533527867866456291u, 13682454788587061567u, 11228114617197060955u, 9672831084924650119u,
41504
    17046466186006768828u, 17401835225210195296u, 15513812278582275844u, 14601417988320120536u, 11181065506345364428u, 9711332585899690512u, 11598470443728627828u, 13625782737014311336u,
41505
    280740911195955804u, 2165085734748128128u, 4051111986314371556u, 2726642315882184760u, 8385505863325164844u, 7616087770173211888u, 5729240201464309396u, 5939354855465699144u,
41506
    11574598932837183481u, 13641322155266051621u, 11203874897631210561u, 9696991643941850525u, 15500005765847099529u, 14624770467483748693u, 17061326039500450609u, 17377293083093715693u,
41507
    5752625691707646233u, 5925581285101240517u, 8361067032314929825u, 7631051003498906493u, 4066548076212889193u, 2702667407911749557u, 266366940911429073u, 2187862166416278541u,
41508
  }, {
41509
    0u, 6642096280510406750u, 13284192561020813500u, 16462795876764246242u, 16315823105410768893u, 13708963636559134627u, 6500836570635362113u, 439922346977066783u,
41510
    6197597939812213119u, 733872460607717665u, 17174658310779658691u, 12859417258165748125u, 13001673141270724226u, 16736026809386770140u, 879844693954133566u, 5771540452186644064u,
41511
    12395195879624426238u, 17305613297699152544u, 1467744921215435330u, 5220531075568771612u, 5650300446275329283u, 1316336633116425565u, 17740532779662220735u, 12258375912742239713u,
41512
    18016332033719362433u, 11973850846087693279u, 4781749989466252093u, 2193612730179060579u, 1759689387908267132u, 4919860766213921826u, 11543080904373288128u, 18166453874549300382u,
41513
    14614610554166352761u, 10879836598703668007u, 8253805222095936453u, 3361408799105547163u, 2935489842430870660u, 8399638907315561690u, 10441062151137543224u, 14757009366268798054u,
41514
    11300600892550658566u, 13906759146888600152u, 2632673266232851130u, 8693166652788693732u, 9132946036408395259u, 2491556468171146661u, 14331668736193815879u, 11153489555886392601u,
41515
    7409848711186274695u, 4249257595424012761u, 16037314857127418171u, 9413239572791867749u, 9563499978932504186u, 15606406401646028324u, 4387225460358121158u, 6976068332272625304u,
41516
    3519378775816534264u, 7852640824571713702u, 9839721532427843652u, 15321459211647031322u, 15184496315767285509u, 10274783960564057947u, 7701371084599273401u, 3949009615571978215u,
41517
    539203352115488887u, 6581683165424715817u, 13772373076031531211u, 16360516657443457173u, 16507610444191872906u, 13347445937900984276u, 6722817598211094326u, 99441604310980456u,
41518
    5870979684861741320u, 960568039155968342u, 16799277814631123380u, 13046489736199563754u, 12904108438562707189u, 17238069777753355947u, 814716683761407561u, 6296880972452001303u,
41519
    12357655745765665417u, 17821378201246059223u, 1379747099228580405u, 5694995023857257067u, 5265346532465702260u, 1530999186474390826u, 17386333305577387464u, 12494636173022434710u,
41520
    18265892072816790518u, 11623803214076996520u, 4983112936342293322u, 1804507146630605588u, 2238305212630619147u, 4845162757404030037u, 12054694172541097143u, 18115614168568345833u,
41521
    14819697422372549390u, 10486441695742104400u, 8498515190848025522u, 3016776137306395628u, 3442815973027425523u, 8352525304506551469u, 10925090729870978127u, 14677459070913039377u,
41522
    11216336045685248625u, 14376925237369287215u, 2590274523633996493u, 9214355580338500243u, 8774450920716242316u, 2731551919773330898u, 13952136664545250608u, 11363291318662491502u,
41523
    7038757551633068528u, 4432606169309893038u, 15705281649143427404u, 9644785238863483154u, 9494645848386137613u, 16136034042300943955u, 4294513027018469041u, 7472698529450626799u,
41524
    4011857131457007759u, 7746628612951437521u, 10373500843358195763u, 15265904688119197805u, 15402742169198546802u, 9938598876682809132u, 7898019231143956430u, 3582070091934478224u,
41525
    1078406704230977774u, 5970139571501035696u, 13163366330849431634u, 16897748309796073484u, 17049000381336047379u, 12733717820530814797u, 6107119981172920239u, 643361792051163121u,
41526
    6410046491609887121u, 349161128571523535u, 16190407203032477997u, 13583585392940618099u, 13445635196422188652u, 16624205252526067250u, 198883208621960912u, 6840937431151644302u,
41527
    11741959369723482640u, 18365299631022420558u, 1921136078311936684u, 5081265949533565682u, 4656338829252136429u, 2068229881835728307u, 17925537898651110737u, 11883093821164285199u,
41528
    17650059563187254127u, 12167860639460954929u, 5524638460789093331u, 1190641388963713933u, 1629433367522815122u, 5382257181810330828u, 12593761944904002606u, 17504208224571739248u,
41529
    14134199920450915223u, 10956049054195313609u, 8970094247992396587u, 2328741787718953845u, 2759494198457160810u, 8819954874021999668u, 11389990047714514134u, 13996106797082358920u,
41530
    10530693064931404520u, 14846677937748691638u, 3061998372948781652u, 8526176301674629642u, 8091274350704555285u, 3198835872954668363u, 14416890915810522537u, 10682083699634542071u,
41531
    7503655637611612521u, 3751252662574033207u, 15021960841764981205u, 10112215774463453579u, 9966225872684586644u, 15448000658827392714u, 3609014293261211176u, 7942304654960916086u,
41532
    4476610425261238294u, 7065420035288041544u, 9690325514808060074u, 15733189881789008116u, 15874467260079749099u, 9250420838410950581u, 7212375292832610135u, 4051821833783301897u,
41533
    688179623118076057u, 6170372224719608007u, 12814440204992854053u, 17148438651140642939u, 16997030381696051044u, 13244209591132604218u, 6033552274612791256u, 1123099122930255750u,
41534
    6885631946054851046u, 262293608834169272u, 16705050609013102938u, 13544914965422553348u, 13683025758949262875u, 16271127284595091013u, 412415468322195111u, 6454862019777308409u,
41535
    11927910341603441255u, 17988788832627006009u, 2148953154424896219u, 4755777988240824965u, 5180549047267992986u, 2001980365486523844u, 18428711160677000486u, 11786650616022549880u,
41536
    17548901841432484632u, 12657171448130714438u, 5463103839546661796u, 1728714438829439994u, 1290082918514197733u, 5605359706950509755u, 12231113943998710873u, 17694874057198724103u,
41537
    14077515103266137056u, 11488706867561743294u, 8865212338619786076u, 2822341649514070786u, 2391433177253116957u, 9015472726907116611u, 11054926469989481633u, 14215482952762858751u,
41538
    10763369033251996319u, 14515766235920655041u, 3244216653174833699u, 8153963644554617469u, 8589026054036938082u, 3107253741862419772u, 14945397058901253598u, 10612099275430968704u,
41539
    8023714262914015518u, 3707732413820797248u, 15493257225902875042u, 10029072425162228220u, 10174906129304731363u, 15067338284929851069u, 3850131242430201439u, 7584939832928591361u,
41540
    4133108057121652833u, 7311251501606674495u, 9295800309597257949u, 15937155243838988419u, 15796038462287912860u, 9735579710801330114u, 7164140183868956448u, 4558017662132191102u,
41541
  }, {
41542
    0u, 7026975924517234630u, 14053951849034469260u, 11713158812725061706u, 1498566550037692829u, 8453026741656872539u, 15547077823203331601u, 13134332388348864983u,
41543
    2997133100075385658u, 5193532126013515004u, 16906053483313745078u, 10023477084983765872u, 4421425403924087463u, 6690338751863514465u, 18326734871926164779u, 11516110084014746349u,
41544
    5994266200150771316u, 3651077923391955378u, 10387064252027030008u, 17411644826573123134u, 5180286430728521705u, 2765428220391841839u, 9578516152858789989u, 16530863678517358499u,
41545
    8842850807848174926u, 1962664170658947720u, 13380677503727028930u, 15579466327313067268u, 7958959654645957843u, 1150444288916906773u, 12500388506175163231u, 14771411239789669529u,
41546
    11988532400301542632u, 14401112944851970862u, 7302155846783910756u, 347530691846251682u, 12867955000885349749u, 15208934917731379891u, 8186843028093092601u, 1160054057126929727u,
41547
    10360572861457043410u, 17171366937719040020u, 5530856440783683678u, 3262112454209283992u, 11170013709381963343u, 18052407625221859721u, 6344013830343901635u, 4147432248901248517u,
41548
    17685701615696349852u, 10733466276663946586u, 3925328341317895440u, 6340298665266291414u, 16265807495604570881u, 9241127928571882695u, 2500178400086410381u, 4843267757373072203u,
41549
    15917919309291915686u, 13646779991004769888u, 2300888577833813546u, 9109287431904666092u, 14423962049646856251u, 12225267820500938749u, 803223682168014775u, 7683504840782913649u,
41550
    16025789128531904341u, 13827140552201887891u, 2120809441137969369u, 9001136188144267039u, 14604311693567821512u, 12333148557000565006u, 695061383692503364u, 7503436758785666690u,
41551
    17866059964468495471u, 10841338299774886825u, 3817174930229677027u, 6160221704524114981u, 16373686056186185202u, 9421479739856314932u, 2320108114253859454u, 4735107671358188984u,
41552
    10180636633891078433u, 17063072784830850791u, 5638869205660782253u, 3442330069771397483u, 11061712881567367356u, 17872478072565786490u, 6524224908418567984u, 4255451551249279222u,
41553
    11880240423364919835u, 14221174549956093405u, 7482375666214882711u, 455541244296276561u, 12688027660687803270u, 15100631886079386688u, 8294864497802497034u, 1340262959281482700u,
41554
    8662912472460168125u, 1854372134182743163u, 13488687978245964849u, 15759686224643400695u, 7850656682635790880u, 970516889046347238u, 12680597330532582828u, 14879432787265004138u,
41555
    5885971969496909959u, 3471141773623390017u, 10567281927262422795u, 17519657531808653517u, 5000356800172820762u, 2657127470508076764u, 9686535514746144406u, 16711074697083887952u,
41556
    3105005063510429129u, 5373890534425651727u, 16725976600334615109u, 9915323596096578947u, 4601777155667627092u, 6798217371950640018u, 18218574863809332184u, 11336039720248747038u,
41557
    180360639130832627u, 7134845665859430709u, 13945800545768817023u, 11533079735570376377u, 1606447364336029550u, 8633376307814525096u, 15367009681565827298u, 13026170149548992292u,
41558
    3321048140255203375u, 5733767250183223273u, 17086394267351834531u, 10131907641284540517u, 4241618882275938738u, 6582455852881933940u, 18002272376288534078u, 10975340495589554680u,
41559
    540800415553098517u, 7351451582082282707u, 14161821513074465945u, 11892934580260027231u, 1390122767385006728u, 8272655212095272270u, 15006873517571333380u, 12810430501506267842u,
41560
    9023334491325470299u, 2070960623556915613u, 13704726720259086807u, 16119558478964112913u, 7634349860459354054u, 609813203025260544u, 12320443409048229962u, 14663675712440713100u,
41561
    6101997361665611105u, 3831000989484282535u, 10927717295939115757u, 17736259059608567083u, 4640216228507718908u, 2441383434118427450u, 9470215342716377968u, 16350357972595129526u,
41562
    9820495924665654471u, 16847328885758262017u, 5422549171225416523u, 3081613207998608525u, 11277738411321564506u, 18232337151134792348u, 6884660139542794966u, 4472053216375158032u,
41563
    11663933463862517757u, 13860471001487472699u, 7122221882022416497u, 239784031886489527u, 13048449816837135968u, 15317220237859158438u, 8510903102498558444u, 1700135351162517034u,
41564
    15809464669166377651u, 13466419319190748533u, 1760673139591009599u, 8785396677427507961u, 14964751332429765422u, 12549754610540477672u, 911082488592553122u, 7863291466191287140u,
41565
    17505901828360837513u, 10625576643111779919u, 3600872305391818245u, 5799522617425244611u, 16589728995604994068u, 9781356593166352338u, 2680525918562965400u, 4951691578960654430u,
41566
    17325824944920336250u, 10517423154702741692u, 3708744268365486326u, 5979881026315534128u, 16481568986909349607u, 9601286230029496609u, 2860877669727689067u, 5059570199676927661u,
41567
    15701313365271581760u, 13286340242614875014u, 1941033778092694476u, 8893266419348519946u, 14784683190314112477u, 12441592372201976347u, 1018963302412737105u, 8043641032810315159u,
41568
    11771943938993819918u, 14040690898222216904u, 6942283547246780034u, 131491994814691652u, 13228658641689481363u, 15425241784889898837u, 8402600130983321375u, 1520207950847359193u,
41569
    10000713600345641524u, 16955341590498866674u, 5314254941016153528u, 2901677057735113342u, 11385757773804508073u, 18412548169088955503u, 6704730509582687269u, 4363752465879022563u,
41570
    6210010127020858258u, 4011218604585024596u, 10747781068851303454u, 17627964906259002328u, 4820427307211528719u, 2549402735887646153u, 9361914515530929539u, 16170428419360240197u,
41571
    9203554311335254184u, 2178971175377796974u, 13596434743901280036u, 15939620083439087842u, 7742371330630129973u, 790022104701665011u, 12140516069312059065u, 14555372680310567295u,
41572
    360721278261665254u, 7243300338934250016u, 14269691331718861418u, 12073295142069515692u, 1281960468464901243u, 8092587130592951229u, 15187223161047700471u, 12918311238500824113u,
41573
    3212894728672059100u, 5553690289885640986u, 17266752615629050192u, 10239779664840078998u, 4061548595831021377u, 6474295767462639751u, 18110150936257777869u, 11155692307469580043u,
41574
  }, {
41575
    0u, 2517245393515406572u, 5034490787030813144u, 7435750759411199284u, 10068981574061626288u, 12201157653998401372u, 14871501518822398568u, 17045318164640841348u,
41576
    9628913577918544357u, 12056075433989135625u, 13870769438669140029u, 16326061061730899153u, 1016952077871524437u, 3239211695253081785u, 5459183210385793933u, 7578968205522831201u,
41577
    11067918171351838031u, 13508029996328618403u, 15872723984458359959u, 18349972777811820667u, 1307470557354262271u, 3515654148887976467u, 6339673239971903271u, 8436375012170683339u,
41578
    2033904155743048874u, 4528066323082129478u, 6478423390506163570u, 8865607338129291678u, 10918366420771587866u, 13072499669943034870u, 15157936411045662402u, 17344703028974807598u,
41579
    11667391723826758683u, 9441211325989495031u, 16444045520167767491u, 14329311757255665967u, 3050858413050517419u, 628778578755597127u, 8036894684654706291u, 5577642697640442527u,
41580
    2614941114708524542u, 478839856218937618u, 7031308297775952934u, 4862538486186004682u, 12679346479943806542u, 10167187506301176482u, 16872750024341366678u, 14467534086004917114u,
41581
    4067808311486097748u, 1917635425212288440u, 9056132646164258956u, 6864284009665987680u, 12956846781012327140u, 10457633378212404744u, 17731214676258583356u, 15347951510183778256u,
41582
    13678285260964991153u, 11474057634298917981u, 17873974704293108073u, 15772186515461651845u, 3922409453435093761u, 1477250791027468269u, 8336488571297909465u, 5863164957556321845u,
41583
    15063804914172139187u, 17573731408537121375u, 10724047561790938987u, 13131499433903012743u, 6535100908406441219u, 8673469987586793967u, 2265113888856263899u, 4431612735036172343u,
41584
    6101716826101034838u, 8521560882533092282u, 1257557157511194254u, 3719041779816530530u, 16073789369309412582u, 18302240886422657034u, 11155285395280885054u, 13267751491267498450u,
41585
    5229882229417049084u, 7672809353916620560u, 957679712437875236u, 3433240205686757064u, 14062616595551905868u, 16269110787469675680u, 9725076972372009364u, 11824592944582215032u,
41586
    14786588404820918809u, 17283564772171425525u, 9865866699426761665u, 12251361247433944877u, 5082513026899726761u, 7234957975966594373u, 240568853608110193u, 2430150771060047005u,
41587
    8135616622972195496u, 5911125624750880324u, 3835270850424576880u, 1717722887501053852u, 18112265292328517912u, 15687370158510810612u, 13728568019331975360u, 11271004332422294572u,
41588
    17674167644946721613u, 15539754686561718177u, 12725302718847165077u, 10553717607734429305u, 9150035367232403709u, 6635062193578351633u, 4261933579054297381u, 1858407040333796809u,
41589
    16825062113507622887u, 14668696227990231819u, 12439147139764057663u, 10254616302904316627u, 7116415003206659159u, 4624520499557157051u, 2818284765131990415u, 428829699325493603u,
41590
    7844818906870187522u, 5634399380472423150u, 2954501582054936538u, 860032292373900086u, 16672977142595818930u, 14235136279826723166u, 11726329915112643690u, 9246813302127474822u,
41591
    3513487962258617315u, 1309817375275636495u, 8438743075148003899u, 6337546835477044951u, 13510341259434958931u, 11065716548023207103u, 18347741267953084811u, 15874986514718330215u,
41592
    13070201816812882438u, 10920562880461237994u, 17346939975173587934u, 15155660198108440370u, 4530227777712527798u, 2031571415669472602u, 8863225470072344686u, 6480554254231811202u,
41593
    12203433652202069676u, 10066744842596399680u, 17043121765066184564u, 14873799311837557656u, 2515114315022388508u, 2382082824317424u, 7438083559633061060u, 5032329272252129320u,
41594
    3241337884980569929u, 1014584229661574053u, 7576621447749742225u, 5461349336866867837u, 12053812688995611897u, 9631145302510833685u, 16328262745174523169u, 13868458115447806413u,
41595
    10459764458834098168u, 12954464700354433812u, 15345618707833241120u, 17733376188870843084u, 1915359424875750472u, 4070045040789094564u, 6866480411373514128u, 9053834855311329660u,
41596
    1479513538183220765u, 3920177730975673073u, 5860963271950469061u, 8338799892386374441u, 11471931442405006765u, 13680653107046267201u, 15774533275401163893u, 17871808579940708505u,
41597
    626467317811485367u, 3053060038512016987u, 5579874205336949615u, 8034632152261867395u, 9443377510452431111u, 11665044903776710123u, 14326943696444768479u, 16446171926791300147u,
41598
    10165026053799453522u, 12681679222183806910u, 14469915951933188746u, 16870619158449294950u, 481137707216220386u, 2612744652856644622u, 4860301542120094010u, 7033584512875404758u,
41599
    16271233245944390992u, 14060243759811248572u, 11822251249501760648u, 9727246909562751076u, 7670541700849153760u, 5232109988680716812u, 3435445775002107704u, 955373222128557012u,
41600
    7237229143405862069u, 5080272407415421017u, 2427958334666397037u, 242871556844564865u, 17281429885116092165u, 14788965422804986857u, 12253699033039161053u, 9863708918048465457u,
41601
    8671167069616523295u, 6537293559533907187u, 4433853414635209159u, 2262842661302265131u, 17575888975148309423u, 15061467343334031171u, 13129122476067492471u, 10726182388697724571u,
41602
    18300070734464807418u, 16076131279156974870u, 13270124387156703266u, 11153162876657622222u, 8523867158108594762u, 6099511471519499942u, 3716814080667593618u, 1259824750463930238u,
41603
    4622362935074513227u, 7118752576211060135u, 431206655032469651u, 2816149936058911871u, 14670999143827763963u, 16822869460218058263u, 10252375625438018339u, 12441418369480155087u,
41604
    14232830006413318318u, 16675182499310091330u, 9249040999114314102u, 11724062320027170202u, 5636569530263980830u, 7842476994894082034u, 857659398650987206u, 2956624102806742570u,
41605
    15689637813740375044u, 18110037535197587688u, 11268798760944846300u, 13730874507508556080u, 5909003164109873076u, 8137989456584309592u, 1720064584747800172u, 3833100915362378368u,
41606
    6637197082762229217u, 9147658351414628621u, 1856069252600036409u, 4264091358266300629u, 15537483516989711953u, 17676408262268928701u, 10555910046260817801u, 12723000017772809061u,
41607
  }, {
41608
    0u, 15762200328042667840u, 2856835172924432389u, 18238190752146915141u, 5713670345848864778u, 10805715811487326026u, 7561135427655163919u, 12848797446532677455u,
41609
    11427340691697729556u, 4911321075843194708u, 13345174655120580625u, 7173389830452510545u, 15122270855310327838u, 820654137405644638u, 17760118084036943899u, 3226275954771115867u,
41610
    12678913378224905901u, 8451595299172663789u, 9822642151686389416u, 5976168202979041768u, 16194808345499688615u, 4179641502022828519u, 14346779660905021090u, 2135996745225445858u,
41611
    3558579666237890233u, 16995468946051088889u, 1641308274811289276u, 14733962144962732540u, 9090961916423626419u, 11859948271085519347u, 6452551909542231734u, 9453764156601606646u,
41612
    14785799433083167711u, 1697614691135618207u, 16903190598345327578u, 3470771065211313306u, 9402037001392841685u, 6396285171454065813u, 11952336405958083536u, 9178809987380452496u,
41613
    6027971268800324555u, 9878982515431963787u, 8359283004045657038u, 12591138999497481358u, 2084233168694272961u, 14290549069261356161u, 4271993490450891716u, 16282692837778922628u,
41614
    7117159332475780466u, 13293411258189767218u, 4999205320339463543u, 11519692655715205687u, 3282616549622578552u, 17811921192019632696u, 732879648334208381u, 15029958398333780541u,
41615
    18181923832847252838u, 2805107922438644262u, 15850048426093911395u, 92388385340408355u, 12905103819084463468u, 7612972483059622444u, 10717907374994120041u, 5621392111171994153u,
41616
    629311348378851643u, 15133597752622646907u, 3395229382271236414u, 17699378041462564478u, 5183867188229904689u, 11335100742646646385u, 6941542130422626612u, 13469099241846138484u,
41617
    10821536956051937583u, 5517832210058282607u, 12792570342908131626u, 7725577015716947562u, 15665448522205731109u, 277059068684322405u, 18357619974760904992u, 2629481737494357600u,
41618
    12055942537600649110u, 9075274912216783062u, 9289461107078326163u, 6508930745710590163u, 16718566008091314076u, 3655465612432595164u, 14961454118931310489u, 1522030784741112025u,
41619
    4168466337388545922u, 16386289672930760898u, 2196870928291817351u, 14177982363995224263u, 8543986980901783432u, 12406505804242475208u, 5852377756745475981u, 10054645982306597069u,
41620
    14234318664951560932u, 2248669261341992356u, 16298510681658284769u, 4076149859246245281u, 9998410640678927086u, 5800610134637962670u, 12494386096293518059u, 8636334373997692331u,
41621
    6565233099245157104u, 9341293662428177840u, 8987461698644630261u, 11963660006880118197u, 1465759296668416762u, 14909722918146729402u, 3743309483160705791u, 16810949547632248255u,
41622
    7673845564465570889u, 12736298827739970313u, 5610215844877288524u, 10909381007990496012u, 2681314179816367171u, 18413922163761052419u, 184776770680816710u, 15577635352405072646u,
41623
    17647610443766686813u, 3338994288425483037u, 15225944966119244888u, 717191546761911064u, 13520897736746902615u, 6997878541721926423u, 11242784222343988306u, 5096087965850491666u,
41624
    1258622696757703286u, 14684288965200833846u, 3950222953022231155u, 17036158029906267443u, 6790458764542472828u, 9548224856613104956u, 8762045755503235705u, 11756540858562383161u,
41625
    10367734376459809378u, 6151638724996853026u, 12124837022850257511u, 8285082520580115751u, 13883084260845253224u, 1879138195689975080u, 16649556998353834605u, 4445490780332133677u,
41626
    13727827248377474267u, 7223104792207356827u, 11035664420116565214u, 4870673773980832670u, 17422178244240010449u, 3131857036752565137u, 15451154031433895124u, 924103331921597332u,
41627
    2311784730144877775u, 18062687245331231631u, 554118137368644810u, 15928680121837474698u, 8024872609708797125u, 13105623011270275973u, 5258963474988715200u, 10539833548380279680u,
41628
    15872427342139003305u, 502333042764009193u, 18150549824433566124u, 2404114375865757420u, 10596187595637903779u, 5310779519913856739u, 13017861491421180326u, 7932573568563556070u,
41629
    4814384572959953341u, 10983915471956430589u, 7310931224865190328u, 13820193315420761848u, 980423156880069047u, 15503004023780282103u, 3044061569482224050u, 17329913425393921778u,
41630
    8336932674777091844u, 12181156958151692356u, 6059373863990406913u, 10279938678082531393u, 4393741856583634702u, 16593268045114871886u, 1971504083133951755u, 13970910599835103307u,
41631
    17087973961803566864u, 4006576835745435728u, 14591990156772618005u, 1170861220680101973u, 11704755513490951962u, 8705792948709298266u, 9640554597612056351u, 6878321524855255135u,
41632
    1858937689852799821u, 14083548048513152013u, 4497338522683984712u, 16489741062169236488u, 6235036951360285511u, 10104345546597921799u, 8152299718492490562u, 12365860697102636034u,
41633
    9753200483853429593u, 6765745319621112857u, 11601220269275925340u, 8809399250468705308u, 14416405870873226067u, 1346516287098352659u, 17272668747995384662u, 3821952007586370582u,
41634
    13130466198490314208u, 7820039919040899744u, 10492627387899532773u, 5414409408661555877u, 17974923397289260522u, 2579810761044912810u, 16057098401758057967u, 317732763665910447u,
41635
    2931518593336833524u, 17442526084696124084u, 1084062204544407025u, 15399436031514938033u, 7486618966321411582u, 13644576356632980158u, 4629793036166665723u, 11168576964637084347u,
41636
    15347691128931141778u, 1027777753507534802u, 17534896747071563927u, 3019349226222860247u, 11220431689754577048u, 4686116923914377176u, 13552315720802183325u, 7398828111596124125u,
41637
    5362628359632734342u, 10436379358185592774u, 7912374160093407363u, 13218332977821366211u, 369553541361633420u, 16113456511805446092u, 2487515902914439305u, 17887166489985742793u,
41638
    8865757316743550527u, 11653040814255671679u, 6677988576850966074u, 9660905738751846778u, 3765703796660934197u, 17220887603689539957u, 1434383093523822128u, 14508740362393577840u,
41639
    16546065181022836267u, 4549193289962883435u, 13995757083443852846u, 1766676892172462446u, 12309576339732698657u, 8100554995509053793u, 10192175931700983332u, 6327407589325138276u,
41640
  },
41641
};
41642
41643
static const uint8_t
41644
WUFFS_CRC64__ECMA_X86_SSE42_FOLD1[16] WUFFS_BASE__POTENTIALLY_UNUSED = {
41645
  228u, 58u, 57u, 202u, 151u, 212u, 93u, 224u,
41646
  64u, 95u, 135u, 199u, 175u, 149u, 190u, 218u,
41647
};
41648
41649
static const uint8_t
41650
WUFFS_CRC64__ECMA_X86_SSE42_FOLD2[16] WUFFS_BASE__POTENTIALLY_UNUSED = {
41651
  68u, 250u, 158u, 138u, 0u, 91u, 9u, 96u,
41652
  81u, 175u, 225u, 15u, 163u, 83u, 230u, 59u,
41653
};
41654
41655
static const uint8_t
41656
WUFFS_CRC64__ECMA_X86_SSE42_FOLD4[16] WUFFS_BASE__POTENTIALLY_UNUSED = {
41657
  243u, 65u, 212u, 157u, 187u, 239u, 227u, 106u,
41658
  244u, 45u, 132u, 167u, 84u, 96u, 31u, 8u,
41659
};
41660
41661
static const uint8_t
41662
WUFFS_CRC64__ECMA_X86_SSE42_FOLD8[16] WUFFS_BASE__POTENTIALLY_UNUSED = {
41663
  0u, 16u, 204u, 79u, 29u, 215u, 87u, 135u,
41664
  64u, 231u, 61u, 247u, 42u, 107u, 216u, 215u,
41665
};
41666
41667
static const uint8_t
41668
WUFFS_CRC64__ECMA_X86_SSE42_MUPX[16] WUFFS_BASE__POTENTIALLY_UNUSED = {
41669
  213u, 99u, 41u, 23u, 108u, 70u, 62u, 156u,
41670
  133u, 30u, 14u, 175u, 43u, 175u, 216u, 146u,
41671
};
41672
41673
// ---------------- Private Initializer Prototypes
41674
41675
// ---------------- Private Function Prototypes
41676
41677
WUFFS_BASE__GENERATED_C_CODE
41678
static wuffs_base__empty_struct
41679
wuffs_crc64__ecma_hasher__up(
41680
    wuffs_crc64__ecma_hasher* self,
41681
    wuffs_base__slice_u8 a_x);
41682
41683
WUFFS_BASE__GENERATED_C_CODE
41684
static wuffs_base__empty_struct
41685
wuffs_crc64__ecma_hasher__up__choosy_default(
41686
    wuffs_crc64__ecma_hasher* self,
41687
    wuffs_base__slice_u8 a_x);
41688
41689
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
41690
WUFFS_BASE__GENERATED_C_CODE
41691
static wuffs_base__empty_struct
41692
wuffs_crc64__ecma_hasher__up_x86_sse42(
41693
    wuffs_crc64__ecma_hasher* self,
41694
    wuffs_base__slice_u8 a_x);
41695
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
41696
41697
// ---------------- VTables
41698
41699
const wuffs_base__hasher_u64__func_ptrs
41700
wuffs_crc64__ecma_hasher__func_ptrs_for__wuffs_base__hasher_u64 = {
41701
  (uint64_t(*)(const void*))(&wuffs_crc64__ecma_hasher__checksum_u64),
41702
  (uint64_t(*)(const void*,
41703
      uint32_t))(&wuffs_crc64__ecma_hasher__get_quirk),
41704
  (wuffs_base__status(*)(void*,
41705
      uint32_t,
41706
      uint64_t))(&wuffs_crc64__ecma_hasher__set_quirk),
41707
  (wuffs_base__empty_struct(*)(void*,
41708
      wuffs_base__slice_u8))(&wuffs_crc64__ecma_hasher__update),
41709
  (uint64_t(*)(void*,
41710
      wuffs_base__slice_u8))(&wuffs_crc64__ecma_hasher__update_u64),
41711
};
41712
41713
// ---------------- Initializer Implementations
41714
41715
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
41716
wuffs_crc64__ecma_hasher__initialize(
41717
    wuffs_crc64__ecma_hasher* self,
41718
    size_t sizeof_star_self,
41719
    uint64_t wuffs_version,
41720
    uint32_t options){
41721
  if (!self) {
41722
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
41723
  }
41724
  if (sizeof(*self) != sizeof_star_self) {
41725
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
41726
  }
41727
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
41728
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
41729
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
41730
  }
41731
41732
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
41733
    // The whole point of this if-check is to detect an uninitialized *self.
41734
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
41735
#if !defined(__clang__) && defined(__GNUC__)
41736
#pragma GCC diagnostic push
41737
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
41738
#endif
41739
    if (self->private_impl.magic != 0) {
41740
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
41741
    }
41742
#if !defined(__clang__) && defined(__GNUC__)
41743
#pragma GCC diagnostic pop
41744
#endif
41745
  } else {
41746
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
41747
      memset(self, 0, sizeof(*self));
41748
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
41749
    } else {
41750
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
41751
    }
41752
  }
41753
41754
  self->private_impl.choosy_up = &wuffs_crc64__ecma_hasher__up__choosy_default;
41755
41756
  self->private_impl.magic = WUFFS_BASE__MAGIC;
41757
  self->private_impl.vtable_for__wuffs_base__hasher_u64.vtable_name =
41758
      wuffs_base__hasher_u64__vtable_name;
41759
  self->private_impl.vtable_for__wuffs_base__hasher_u64.function_pointers =
41760
      (const void*)(&wuffs_crc64__ecma_hasher__func_ptrs_for__wuffs_base__hasher_u64);
41761
  return wuffs_base__make_status(NULL);
41762
}
41763
41764
wuffs_crc64__ecma_hasher*
41765
wuffs_crc64__ecma_hasher__alloc(void) {
41766
  wuffs_crc64__ecma_hasher* x =
41767
      (wuffs_crc64__ecma_hasher*)(calloc(1, sizeof(wuffs_crc64__ecma_hasher)));
41768
  if (!x) {
41769
    return NULL;
41770
  }
41771
  if (wuffs_crc64__ecma_hasher__initialize(
41772
      x, sizeof(wuffs_crc64__ecma_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
41773
    free(x);
41774
    return NULL;
41775
  }
41776
  return x;
41777
}
41778
41779
size_t
41780
sizeof__wuffs_crc64__ecma_hasher(void) {
41781
  return sizeof(wuffs_crc64__ecma_hasher);
41782
}
41783
41784
// ---------------- Function Implementations
41785
41786
// -------- func crc64.ecma_hasher.get_quirk
41787
41788
WUFFS_BASE__GENERATED_C_CODE
41789
WUFFS_BASE__MAYBE_STATIC uint64_t
41790
wuffs_crc64__ecma_hasher__get_quirk(
41791
    const wuffs_crc64__ecma_hasher* self,
41792
    uint32_t a_key) {
41793
  if (!self) {
41794
    return 0;
41795
  }
41796
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
41797
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
41798
    return 0;
41799
  }
41800
41801
  return 0u;
41802
}
41803
41804
// -------- func crc64.ecma_hasher.set_quirk
41805
41806
WUFFS_BASE__GENERATED_C_CODE
41807
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
41808
wuffs_crc64__ecma_hasher__set_quirk(
41809
    wuffs_crc64__ecma_hasher* self,
41810
    uint32_t a_key,
41811
    uint64_t a_value) {
41812
  if (!self) {
41813
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
41814
  }
41815
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
41816
    return wuffs_base__make_status(
41817
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
41818
        ? wuffs_base__error__disabled_by_previous_error
41819
        : wuffs_base__error__initialize_not_called);
41820
  }
41821
41822
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
41823
}
41824
41825
// -------- func crc64.ecma_hasher.update
41826
41827
WUFFS_BASE__GENERATED_C_CODE
41828
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
41829
wuffs_crc64__ecma_hasher__update(
41830
    wuffs_crc64__ecma_hasher* self,
41831
    wuffs_base__slice_u8 a_x) {
41832
  if (!self) {
41833
    return wuffs_base__make_empty_struct();
41834
  }
41835
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
41836
    return wuffs_base__make_empty_struct();
41837
  }
41838
41839
  if (self->private_impl.f_state == 0u) {
41840
    self->private_impl.choosy_up = (
41841
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
41842
        wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_crc64__ecma_hasher__up_x86_sse42 :
41843
#endif
41844
        self->private_impl.choosy_up);
41845
  }
41846
  wuffs_crc64__ecma_hasher__up(self, a_x);
41847
  return wuffs_base__make_empty_struct();
41848
}
41849
41850
// -------- func crc64.ecma_hasher.update_u64
41851
41852
WUFFS_BASE__GENERATED_C_CODE
41853
WUFFS_BASE__MAYBE_STATIC uint64_t
41854
wuffs_crc64__ecma_hasher__update_u64(
41855
    wuffs_crc64__ecma_hasher* self,
41856
    wuffs_base__slice_u8 a_x) {
41857
  if (!self) {
41858
    return 0;
41859
  }
41860
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
41861
    return 0;
41862
  }
41863
41864
  wuffs_crc64__ecma_hasher__update(self, a_x);
41865
  return wuffs_crc64__ecma_hasher__checksum_u64(self);
41866
}
41867
41868
// -------- func crc64.ecma_hasher.up
41869
41870
WUFFS_BASE__GENERATED_C_CODE
41871
static wuffs_base__empty_struct
41872
wuffs_crc64__ecma_hasher__up(
41873
    wuffs_crc64__ecma_hasher* self,
41874
    wuffs_base__slice_u8 a_x) {
41875
  return (*self->private_impl.choosy_up)(self, a_x);
41876
}
41877
41878
WUFFS_BASE__GENERATED_C_CODE
41879
static wuffs_base__empty_struct
41880
wuffs_crc64__ecma_hasher__up__choosy_default(
41881
    wuffs_crc64__ecma_hasher* self,
41882
    wuffs_base__slice_u8 a_x) {
41883
  uint64_t v_s = 0;
41884
  wuffs_base__slice_u8 v_p = {0};
41885
41886
  v_s = (18446744073709551615u ^ self->private_impl.f_state);
41887
  {
41888
    wuffs_base__slice_u8 i_slice_p = a_x;
41889
    v_p.ptr = i_slice_p.ptr;
41890
    v_p.len = 8;
41891
    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));
41892
    while (v_p.ptr < i_end0_p) {
41893
      v_s ^= ((((uint64_t)(v_p.ptr[0u])) << 0u) |
41894
          (((uint64_t)(v_p.ptr[1u])) << 8u) |
41895
          (((uint64_t)(v_p.ptr[2u])) << 16u) |
41896
          (((uint64_t)(v_p.ptr[3u])) << 24u) |
41897
          (((uint64_t)(v_p.ptr[4u])) << 32u) |
41898
          (((uint64_t)(v_p.ptr[5u])) << 40u) |
41899
          (((uint64_t)(v_p.ptr[6u])) << 48u) |
41900
          (((uint64_t)(v_p.ptr[7u])) << 56u));
41901
      v_s = (WUFFS_CRC64__ECMA_TABLE[0u][(255u & (v_s >> 56u))] ^
41902
          WUFFS_CRC64__ECMA_TABLE[1u][(255u & (v_s >> 48u))] ^
41903
          WUFFS_CRC64__ECMA_TABLE[2u][(255u & (v_s >> 40u))] ^
41904
          WUFFS_CRC64__ECMA_TABLE[3u][(255u & (v_s >> 32u))] ^
41905
          WUFFS_CRC64__ECMA_TABLE[4u][(255u & (v_s >> 24u))] ^
41906
          WUFFS_CRC64__ECMA_TABLE[5u][(255u & (v_s >> 16u))] ^
41907
          WUFFS_CRC64__ECMA_TABLE[6u][(255u & (v_s >> 8u))] ^
41908
          WUFFS_CRC64__ECMA_TABLE[7u][(255u & (v_s >> 0u))]);
41909
      v_p.ptr += 8;
41910
    }
41911
    v_p.len = 1;
41912
    const uint8_t* i_end1_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len);
41913
    while (v_p.ptr < i_end1_p) {
41914
      v_s = (WUFFS_CRC64__ECMA_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ v_p.ptr[0u]))] ^ (v_s >> 8u));
41915
      v_p.ptr += 1;
41916
    }
41917
    v_p.len = 0;
41918
  }
41919
  self->private_impl.f_state = (18446744073709551615u ^ v_s);
41920
  return wuffs_base__make_empty_struct();
41921
}
41922
41923
// -------- func crc64.ecma_hasher.checksum_u64
41924
41925
WUFFS_BASE__GENERATED_C_CODE
41926
WUFFS_BASE__MAYBE_STATIC uint64_t
41927
wuffs_crc64__ecma_hasher__checksum_u64(
41928
    const wuffs_crc64__ecma_hasher* self) {
41929
  if (!self) {
41930
    return 0;
41931
  }
41932
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
41933
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
41934
    return 0;
41935
  }
41936
41937
  return self->private_impl.f_state;
41938
}
41939
41940
// โ€ผ WUFFS MULTI-FILE SECTION +x86_sse42
41941
// -------- func crc64.ecma_hasher.up_x86_sse42
41942
41943
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
41944
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
41945
WUFFS_BASE__GENERATED_C_CODE
41946
static wuffs_base__empty_struct
41947
wuffs_crc64__ecma_hasher__up_x86_sse42(
41948
    wuffs_crc64__ecma_hasher* self,
41949
    wuffs_base__slice_u8 a_x) {
41950
  uint64_t v_s = 0;
41951
  wuffs_base__slice_u8 v_p = {0};
41952
  uint8_t v_buf[48] = {0};
41953
  __m128i v_xa = {0};
41954
  __m128i v_xb = {0};
41955
  __m128i v_xc = {0};
41956
  __m128i v_xd = {0};
41957
  __m128i v_xe = {0};
41958
  __m128i v_xf = {0};
41959
  __m128i v_xg = {0};
41960
  __m128i v_xh = {0};
41961
  __m128i v_mu1 = {0};
41962
  __m128i v_mu2 = {0};
41963
  __m128i v_mu4 = {0};
41964
  __m128i v_mu8 = {0};
41965
  __m128i v_mupx = {0};
41966
41967
  v_s = (18446744073709551615u ^ self->private_impl.f_state);
41968
  while ((((uint64_t)(a_x.len)) > 0u) && ((15u & ((uint32_t)(0xFFFu & (uintptr_t)(a_x.ptr)))) != 0u)) {
41969
    v_s = (WUFFS_CRC64__ECMA_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ a_x.ptr[0u]))] ^ (v_s >> 8u));
41970
    a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u);
41971
  }
41972
  do {
41973
    do {
41974
      if (((uint64_t)(a_x.len)) >= 128u) {
41975
      } else if (((uint64_t)(a_x.len)) >= 64u) {
41976
        v_xa = _mm_xor_si128(_mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u)), _mm_cvtsi64_si128((int64_t)(v_s)));
41977
        v_xb = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u));
41978
        v_xc = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 32u));
41979
        v_xd = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 48u));
41980
        a_x = wuffs_base__slice_u8__subslice_i(a_x, 64u);
41981
        break;
41982
      } else if (((uint64_t)(a_x.len)) >= 32u) {
41983
        v_xa = _mm_xor_si128(_mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u)), _mm_cvtsi64_si128((int64_t)(v_s)));
41984
        v_xb = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u));
41985
        a_x = wuffs_base__slice_u8__subslice_i(a_x, 32u);
41986
        goto label__chain2__break;
41987
      } else {
41988
        {
41989
          wuffs_base__slice_u8 i_slice_p = a_x;
41990
          v_p.ptr = i_slice_p.ptr;
41991
          v_p.len = 1;
41992
          const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len);
41993
          while (v_p.ptr < i_end0_p) {
41994
            v_s = (WUFFS_CRC64__ECMA_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ v_p.ptr[0u]))] ^ (v_s >> 8u));
41995
            v_p.ptr += 1;
41996
          }
41997
          v_p.len = 0;
41998
        }
41999
        self->private_impl.f_state = (18446744073709551615u ^ v_s);
42000
        return wuffs_base__make_empty_struct();
42001
      }
42002
      v_xa = _mm_xor_si128(_mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u)), _mm_cvtsi64_si128((int64_t)(v_s)));
42003
      v_xb = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u));
42004
      v_xc = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 32u));
42005
      v_xd = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 48u));
42006
      v_xe = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 64u));
42007
      v_xf = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 80u));
42008
      v_xg = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 96u));
42009
      v_xh = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 112u));
42010
      a_x = wuffs_base__slice_u8__subslice_i(a_x, 128u);
42011
      v_mu8 = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC64__ECMA_X86_SSE42_FOLD8));
42012
      while (((uint64_t)(a_x.len)) >= 128u) {
42013
        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)));
42014
        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)));
42015
        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)));
42016
        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)));
42017
        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)));
42018
        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)));
42019
        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)));
42020
        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)));
42021
        a_x = wuffs_base__slice_u8__subslice_i(a_x, 128u);
42022
      }
42023
      v_mu4 = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC64__ECMA_X86_SSE42_FOLD4));
42024
      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);
42025
      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);
42026
      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);
42027
      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);
42028
      if (((uint64_t)(a_x.len)) > 64u) {
42029
        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)));
42030
        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)));
42031
        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)));
42032
        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)));
42033
        a_x = wuffs_base__slice_u8__subslice_i(a_x, 64u);
42034
      }
42035
    } while (0);
42036
    v_mu2 = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC64__ECMA_X86_SSE42_FOLD2));
42037
    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);
42038
    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);
42039
    if (((uint64_t)(a_x.len)) > 32u) {
42040
      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)));
42041
      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)));
42042
      a_x = wuffs_base__slice_u8__subslice_i(a_x, 32u);
42043
    }
42044
  } while (0);
42045
  label__chain2__break:;
42046
  v_mu1 = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC64__ECMA_X86_SSE42_FOLD1));
42047
  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);
42048
  if (((uint64_t)(a_x.len)) > 24u) {
42049
    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)));
42050
    a_x = wuffs_base__slice_u8__subslice_i(a_x, 16u);
42051
    if (((uint64_t)(a_x.len)) > 24u) {
42052
      return wuffs_base__make_empty_struct();
42053
    }
42054
  }
42055
  _mm_storeu_si128((__m128i*)(void*)(v_buf + (24u - ((uint64_t)(a_x.len)))), v_xa);
42056
  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);
42057
  v_mu2 = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC64__ECMA_X86_SSE42_FOLD2));
42058
  v_xa = _mm_lddqu_si128((const __m128i*)(const void*)(v_buf + 0u));
42059
  v_xb = _mm_lddqu_si128((const __m128i*)(const void*)(v_buf + 16u));
42060
  v_xc = _mm_lddqu_si128((const __m128i*)(const void*)(v_buf + 32u));
42061
  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)));
42062
  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)));
42063
  v_xa = _mm_xor_si128(v_xd, _mm_xor_si128(v_xe, v_xc));
42064
  v_mupx = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC64__ECMA_X86_SSE42_MUPX));
42065
  v_xb = _mm_clmulepi64_si128(v_xa, v_mupx, (int32_t)(0u));
42066
  v_xc = _mm_clmulepi64_si128(v_xb, v_mupx, (int32_t)(16u));
42067
  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))));
42068
  self->private_impl.f_state = (18446744073709551615u ^ v_s);
42069
  return wuffs_base__make_empty_struct();
42070
}
42071
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
42072
// โ€ผ WUFFS MULTI-FILE SECTION -x86_sse42
42073
42074
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC64)
42075
42076
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__DEFLATE)
42077
42078
// ---------------- Status Codes Implementations
42079
42080
const char wuffs_deflate__error__bad_huffman_code_over_subscribed[] = "#deflate: bad Huffman code (over-subscribed)";
42081
const char wuffs_deflate__error__bad_huffman_code_under_subscribed[] = "#deflate: bad Huffman code (under-subscribed)";
42082
const char wuffs_deflate__error__bad_huffman_code_length_count[] = "#deflate: bad Huffman code length count";
42083
const char wuffs_deflate__error__bad_huffman_code_length_repetition[] = "#deflate: bad Huffman code length repetition";
42084
const char wuffs_deflate__error__bad_huffman_code[] = "#deflate: bad Huffman code";
42085
const char wuffs_deflate__error__bad_huffman_minimum_code_length[] = "#deflate: bad Huffman minimum code length";
42086
const char wuffs_deflate__error__bad_block[] = "#deflate: bad block";
42087
const char wuffs_deflate__error__bad_distance[] = "#deflate: bad distance";
42088
const char wuffs_deflate__error__bad_distance_code_count[] = "#deflate: bad distance code count";
42089
const char wuffs_deflate__error__bad_literal_length_code_count[] = "#deflate: bad literal/length code count";
42090
const char wuffs_deflate__error__inconsistent_stored_block_length[] = "#deflate: inconsistent stored block length";
42091
const char wuffs_deflate__error__missing_end_of_block_code[] = "#deflate: missing end-of-block code";
42092
const char wuffs_deflate__error__no_huffman_codes[] = "#deflate: no Huffman codes";
42093
const char wuffs_deflate__error__truncated_input[] = "#deflate: truncated input";
42094
const char wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state[] = "#deflate: internal error: inconsistent Huffman decoder state";
42095
const char wuffs_deflate__error__internal_error_inconsistent_i_o[] = "#deflate: internal error: inconsistent I/O";
42096
const char wuffs_deflate__error__internal_error_inconsistent_distance[] = "#deflate: internal error: inconsistent distance";
42097
const char wuffs_deflate__error__internal_error_inconsistent_n_bits[] = "#deflate: internal error: inconsistent n_bits";
42098
42099
// ---------------- Private Consts
42100
42101
static const uint8_t
42102
WUFFS_DEFLATE__CODE_ORDER[19] WUFFS_BASE__POTENTIALLY_UNUSED = {
42103
  16u, 17u, 18u, 0u, 8u, 7u, 9u, 6u,
42104
  10u, 5u, 11u, 4u, 12u, 3u, 13u, 2u,
42105
  14u, 1u, 15u,
42106
};
42107
42108
static const uint8_t
42109
WUFFS_DEFLATE__REVERSE8[256] WUFFS_BASE__POTENTIALLY_UNUSED = {
42110
  0u, 128u, 64u, 192u, 32u, 160u, 96u, 224u,
42111
  16u, 144u, 80u, 208u, 48u, 176u, 112u, 240u,
42112
  8u, 136u, 72u, 200u, 40u, 168u, 104u, 232u,
42113
  24u, 152u, 88u, 216u, 56u, 184u, 120u, 248u,
42114
  4u, 132u, 68u, 196u, 36u, 164u, 100u, 228u,
42115
  20u, 148u, 84u, 212u, 52u, 180u, 116u, 244u,
42116
  12u, 140u, 76u, 204u, 44u, 172u, 108u, 236u,
42117
  28u, 156u, 92u, 220u, 60u, 188u, 124u, 252u,
42118
  2u, 130u, 66u, 194u, 34u, 162u, 98u, 226u,
42119
  18u, 146u, 82u, 210u, 50u, 178u, 114u, 242u,
42120
  10u, 138u, 74u, 202u, 42u, 170u, 106u, 234u,
42121
  26u, 154u, 90u, 218u, 58u, 186u, 122u, 250u,
42122
  6u, 134u, 70u, 198u, 38u, 166u, 102u, 230u,
42123
  22u, 150u, 86u, 214u, 54u, 182u, 118u, 246u,
42124
  14u, 142u, 78u, 206u, 46u, 174u, 110u, 238u,
42125
  30u, 158u, 94u, 222u, 62u, 190u, 126u, 254u,
42126
  1u, 129u, 65u, 193u, 33u, 161u, 97u, 225u,
42127
  17u, 145u, 81u, 209u, 49u, 177u, 113u, 241u,
42128
  9u, 137u, 73u, 201u, 41u, 169u, 105u, 233u,
42129
  25u, 153u, 89u, 217u, 57u, 185u, 121u, 249u,
42130
  5u, 133u, 69u, 197u, 37u, 165u, 101u, 229u,
42131
  21u, 149u, 85u, 213u, 53u, 181u, 117u, 245u,
42132
  13u, 141u, 77u, 205u, 45u, 173u, 109u, 237u,
42133
  29u, 157u, 93u, 221u, 61u, 189u, 125u, 253u,
42134
  3u, 131u, 67u, 195u, 35u, 163u, 99u, 227u,
42135
  19u, 147u, 83u, 211u, 51u, 179u, 115u, 243u,
42136
  11u, 139u, 75u, 203u, 43u, 171u, 107u, 235u,
42137
  27u, 155u, 91u, 219u, 59u, 187u, 123u, 251u,
42138
  7u, 135u, 71u, 199u, 39u, 167u, 103u, 231u,
42139
  23u, 151u, 87u, 215u, 55u, 183u, 119u, 247u,
42140
  15u, 143u, 79u, 207u, 47u, 175u, 111u, 239u,
42141
  31u, 159u, 95u, 223u, 63u, 191u, 127u, 255u,
42142
};
42143
42144
static const uint32_t
42145
WUFFS_DEFLATE__LCODE_MAGIC_NUMBERS[32] WUFFS_BASE__POTENTIALLY_UNUSED = {
42146
  1073741824u, 1073742080u, 1073742336u, 1073742592u, 1073742848u, 1073743104u, 1073743360u, 1073743616u,
42147
  1073743888u, 1073744400u, 1073744912u, 1073745424u, 1073745952u, 1073746976u, 1073748000u, 1073749024u,
42148
  1073750064u, 1073752112u, 1073754160u, 1073756208u, 1073758272u, 1073762368u, 1073766464u, 1073770560u,
42149
  1073774672u, 1073782864u, 1073791056u, 1073799248u, 1073807104u, 134217728u, 134217728u, 134217728u,
42150
};
42151
42152
static const uint32_t
42153
WUFFS_DEFLATE__DCODE_MAGIC_NUMBERS[32] WUFFS_BASE__POTENTIALLY_UNUSED = {
42154
  1073741824u, 1073742080u, 1073742336u, 1073742592u, 1073742864u, 1073743376u, 1073743904u, 1073744928u,
42155
  1073745968u, 1073748016u, 1073750080u, 1073754176u, 1073758288u, 1073766480u, 1073774688u, 1073791072u,
42156
  1073807472u, 1073840240u, 1073873024u, 1073938560u, 1074004112u, 1074135184u, 1074266272u, 1074528416u,
42157
  1074790576u, 1075314864u, 1075839168u, 1076887744u, 1077936336u, 1080033488u, 134217728u, 134217728u,
42158
};
42159
42160
#define WUFFS_DEFLATE__HUFFS_TABLE_SIZE 1024u
42161
42162
#define WUFFS_DEFLATE__HUFFS_TABLE_MASK 1023u
42163
42164
// ---------------- Private Initializer Prototypes
42165
42166
// ---------------- Private Function Prototypes
42167
42168
WUFFS_BASE__GENERATED_C_CODE
42169
static wuffs_base__status
42170
wuffs_deflate__decoder__do_transform_io(
42171
    wuffs_deflate__decoder* self,
42172
    wuffs_base__io_buffer* a_dst,
42173
    wuffs_base__io_buffer* a_src,
42174
    wuffs_base__slice_u8 a_workbuf);
42175
42176
WUFFS_BASE__GENERATED_C_CODE
42177
static wuffs_base__status
42178
wuffs_deflate__decoder__decode_blocks(
42179
    wuffs_deflate__decoder* self,
42180
    wuffs_base__io_buffer* a_dst,
42181
    wuffs_base__io_buffer* a_src);
42182
42183
WUFFS_BASE__GENERATED_C_CODE
42184
static wuffs_base__status
42185
wuffs_deflate__decoder__decode_uncompressed(
42186
    wuffs_deflate__decoder* self,
42187
    wuffs_base__io_buffer* a_dst,
42188
    wuffs_base__io_buffer* a_src);
42189
42190
WUFFS_BASE__GENERATED_C_CODE
42191
static wuffs_base__status
42192
wuffs_deflate__decoder__init_fixed_huffman(
42193
    wuffs_deflate__decoder* self);
42194
42195
WUFFS_BASE__GENERATED_C_CODE
42196
static wuffs_base__status
42197
wuffs_deflate__decoder__init_dynamic_huffman(
42198
    wuffs_deflate__decoder* self,
42199
    wuffs_base__io_buffer* a_src);
42200
42201
WUFFS_BASE__GENERATED_C_CODE
42202
static wuffs_base__status
42203
wuffs_deflate__decoder__init_huff(
42204
    wuffs_deflate__decoder* self,
42205
    uint32_t a_which,
42206
    uint32_t a_n_codes0,
42207
    uint32_t a_n_codes1,
42208
    uint32_t a_base_symbol);
42209
42210
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
42211
WUFFS_BASE__GENERATED_C_CODE
42212
static wuffs_base__status
42213
wuffs_deflate__decoder__decode_huffman_bmi2(
42214
    wuffs_deflate__decoder* self,
42215
    wuffs_base__io_buffer* a_dst,
42216
    wuffs_base__io_buffer* a_src);
42217
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
42218
42219
WUFFS_BASE__GENERATED_C_CODE
42220
static wuffs_base__status
42221
wuffs_deflate__decoder__decode_huffman_fast32(
42222
    wuffs_deflate__decoder* self,
42223
    wuffs_base__io_buffer* a_dst,
42224
    wuffs_base__io_buffer* a_src);
42225
42226
WUFFS_BASE__GENERATED_C_CODE
42227
static wuffs_base__status
42228
wuffs_deflate__decoder__decode_huffman_fast64(
42229
    wuffs_deflate__decoder* self,
42230
    wuffs_base__io_buffer* a_dst,
42231
    wuffs_base__io_buffer* a_src);
42232
42233
WUFFS_BASE__GENERATED_C_CODE
42234
static wuffs_base__status
42235
wuffs_deflate__decoder__decode_huffman_fast64__choosy_default(
42236
    wuffs_deflate__decoder* self,
42237
    wuffs_base__io_buffer* a_dst,
42238
    wuffs_base__io_buffer* a_src);
42239
42240
WUFFS_BASE__GENERATED_C_CODE
42241
static wuffs_base__status
42242
wuffs_deflate__decoder__decode_huffman_slow(
42243
    wuffs_deflate__decoder* self,
42244
    wuffs_base__io_buffer* a_dst,
42245
    wuffs_base__io_buffer* a_src);
42246
42247
// ---------------- VTables
42248
42249
const wuffs_base__io_transformer__func_ptrs
42250
wuffs_deflate__decoder__func_ptrs_for__wuffs_base__io_transformer = {
42251
  (wuffs_base__optional_u63(*)(const void*))(&wuffs_deflate__decoder__dst_history_retain_length),
42252
  (uint64_t(*)(const void*,
42253
      uint32_t))(&wuffs_deflate__decoder__get_quirk),
42254
  (wuffs_base__status(*)(void*,
42255
      uint32_t,
42256
      uint64_t))(&wuffs_deflate__decoder__set_quirk),
42257
  (wuffs_base__status(*)(void*,
42258
      wuffs_base__io_buffer*,
42259
      wuffs_base__io_buffer*,
42260
      wuffs_base__slice_u8))(&wuffs_deflate__decoder__transform_io),
42261
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_deflate__decoder__workbuf_len),
42262
};
42263
42264
// ---------------- Initializer Implementations
42265
42266
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
42267
wuffs_deflate__decoder__initialize(
42268
    wuffs_deflate__decoder* self,
42269
    size_t sizeof_star_self,
42270
    uint64_t wuffs_version,
42271
    uint32_t options){
42272
  if (!self) {
42273
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
42274
  }
42275
  if (sizeof(*self) != sizeof_star_self) {
42276
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
42277
  }
42278
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
42279
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
42280
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
42281
  }
42282
42283
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
42284
    // The whole point of this if-check is to detect an uninitialized *self.
42285
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
42286
#if !defined(__clang__) && defined(__GNUC__)
42287
#pragma GCC diagnostic push
42288
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
42289
#endif
42290
    if (self->private_impl.magic != 0) {
42291
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
42292
    }
42293
#if !defined(__clang__) && defined(__GNUC__)
42294
#pragma GCC diagnostic pop
42295
#endif
42296
  } else {
42297
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
42298
      memset(self, 0, sizeof(*self));
42299
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
42300
    } else {
42301
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
42302
    }
42303
  }
42304
42305
  self->private_impl.choosy_decode_huffman_fast64 = &wuffs_deflate__decoder__decode_huffman_fast64__choosy_default;
42306
42307
  self->private_impl.magic = WUFFS_BASE__MAGIC;
42308
  self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name =
42309
      wuffs_base__io_transformer__vtable_name;
42310
  self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers =
42311
      (const void*)(&wuffs_deflate__decoder__func_ptrs_for__wuffs_base__io_transformer);
42312
  return wuffs_base__make_status(NULL);
42313
}
42314
42315
wuffs_deflate__decoder*
42316
wuffs_deflate__decoder__alloc(void) {
42317
  wuffs_deflate__decoder* x =
42318
      (wuffs_deflate__decoder*)(calloc(1, sizeof(wuffs_deflate__decoder)));
42319
  if (!x) {
42320
    return NULL;
42321
  }
42322
  if (wuffs_deflate__decoder__initialize(
42323
      x, sizeof(wuffs_deflate__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
42324
    free(x);
42325
    return NULL;
42326
  }
42327
  return x;
42328
}
42329
42330
size_t
42331
sizeof__wuffs_deflate__decoder(void) {
42332
  return sizeof(wuffs_deflate__decoder);
42333
}
42334
42335
// ---------------- Function Implementations
42336
42337
// -------- func deflate.decoder.add_history
42338
42339
WUFFS_BASE__GENERATED_C_CODE
42340
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
42341
wuffs_deflate__decoder__add_history(
42342
    wuffs_deflate__decoder* self,
42343
    wuffs_base__slice_u8 a_hist) {
42344
  if (!self) {
42345
    return wuffs_base__make_empty_struct();
42346
  }
42347
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
42348
    return wuffs_base__make_empty_struct();
42349
  }
42350
42351
  wuffs_base__slice_u8 v_s = {0};
42352
  uint64_t v_n_copied = 0;
42353
  uint32_t v_already_full = 0;
42354
42355
  v_s = a_hist;
42356
  if (((uint64_t)(v_s.len)) >= 32768u) {
42357
    v_s = wuffs_private_impl__slice_u8__suffix(v_s, 32768u);
42358
    wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__make_slice_u8(self->private_data.f_history, 32768), v_s);
42359
    self->private_impl.f_history_index = 32768u;
42360
  } else {
42361
    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);
42362
    if (v_n_copied < ((uint64_t)(v_s.len))) {
42363
      v_s = wuffs_base__slice_u8__subslice_i(v_s, v_n_copied);
42364
      v_n_copied = wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__make_slice_u8(self->private_data.f_history, 32768), v_s);
42365
      self->private_impl.f_history_index = (((uint32_t)((v_n_copied & 32767u))) + 32768u);
42366
    } else {
42367
      v_already_full = 0u;
42368
      if (self->private_impl.f_history_index >= 32768u) {
42369
        v_already_full = 32768u;
42370
      }
42371
      self->private_impl.f_history_index = ((self->private_impl.f_history_index & 32767u) + ((uint32_t)((v_n_copied & 32767u))) + v_already_full);
42372
    }
42373
  }
42374
  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));
42375
  return wuffs_base__make_empty_struct();
42376
}
42377
42378
// -------- func deflate.decoder.get_quirk
42379
42380
WUFFS_BASE__GENERATED_C_CODE
42381
WUFFS_BASE__MAYBE_STATIC uint64_t
42382
wuffs_deflate__decoder__get_quirk(
42383
    const wuffs_deflate__decoder* self,
42384
    uint32_t a_key) {
42385
  if (!self) {
42386
    return 0;
42387
  }
42388
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
42389
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
42390
    return 0;
42391
  }
42392
42393
  return 0u;
42394
}
42395
42396
// -------- func deflate.decoder.set_quirk
42397
42398
WUFFS_BASE__GENERATED_C_CODE
42399
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
42400
wuffs_deflate__decoder__set_quirk(
42401
    wuffs_deflate__decoder* self,
42402
    uint32_t a_key,
42403
    uint64_t a_value) {
42404
  if (!self) {
42405
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
42406
  }
42407
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
42408
    return wuffs_base__make_status(
42409
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
42410
        ? wuffs_base__error__disabled_by_previous_error
42411
        : wuffs_base__error__initialize_not_called);
42412
  }
42413
42414
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
42415
}
42416
42417
// -------- func deflate.decoder.dst_history_retain_length
42418
42419
WUFFS_BASE__GENERATED_C_CODE
42420
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
42421
wuffs_deflate__decoder__dst_history_retain_length(
42422
    const wuffs_deflate__decoder* self) {
42423
  if (!self) {
42424
    return wuffs_base__utility__make_optional_u63(false, 0u);
42425
  }
42426
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
42427
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
42428
    return wuffs_base__utility__make_optional_u63(false, 0u);
42429
  }
42430
42431
  return wuffs_base__utility__make_optional_u63(true, 0u);
42432
}
42433
42434
// -------- func deflate.decoder.workbuf_len
42435
42436
WUFFS_BASE__GENERATED_C_CODE
42437
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
42438
wuffs_deflate__decoder__workbuf_len(
42439
    const wuffs_deflate__decoder* self) {
42440
  if (!self) {
42441
    return wuffs_base__utility__empty_range_ii_u64();
42442
  }
42443
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
42444
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
42445
    return wuffs_base__utility__empty_range_ii_u64();
42446
  }
42447
42448
  return wuffs_base__utility__make_range_ii_u64(1u, 1u);
42449
}
42450
42451
// -------- func deflate.decoder.transform_io
42452
42453
WUFFS_BASE__GENERATED_C_CODE
42454
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
42455
wuffs_deflate__decoder__transform_io(
42456
    wuffs_deflate__decoder* self,
42457
    wuffs_base__io_buffer* a_dst,
42458
    wuffs_base__io_buffer* a_src,
42459
    wuffs_base__slice_u8 a_workbuf) {
42460
  if (!self) {
42461
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
42462
  }
42463
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
42464
    return wuffs_base__make_status(
42465
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
42466
        ? wuffs_base__error__disabled_by_previous_error
42467
        : wuffs_base__error__initialize_not_called);
42468
  }
42469
  if (!a_dst || !a_src) {
42470
    self->private_impl.magic = WUFFS_BASE__DISABLED;
42471
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
42472
  }
42473
  if ((self->private_impl.active_coroutine != 0) &&
42474
      (self->private_impl.active_coroutine != 1)) {
42475
    self->private_impl.magic = WUFFS_BASE__DISABLED;
42476
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
42477
  }
42478
  self->private_impl.active_coroutine = 0;
42479
  wuffs_base__status status = wuffs_base__make_status(NULL);
42480
42481
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
42482
42483
  uint32_t coro_susp_point = self->private_impl.p_transform_io;
42484
  switch (coro_susp_point) {
42485
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
42486
42487
    while (true) {
42488
      {
42489
        wuffs_base__status t_0 = wuffs_deflate__decoder__do_transform_io(self, a_dst, a_src, a_workbuf);
42490
        v_status = t_0;
42491
      }
42492
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
42493
        status = wuffs_base__make_status(wuffs_deflate__error__truncated_input);
42494
        goto exit;
42495
      }
42496
      status = v_status;
42497
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
42498
    }
42499
42500
    ok:
42501
    self->private_impl.p_transform_io = 0;
42502
    goto exit;
42503
  }
42504
42505
  goto suspend;
42506
  suspend:
42507
  self->private_impl.p_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
42508
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
42509
42510
  goto exit;
42511
  exit:
42512
  if (wuffs_base__status__is_error(&status)) {
42513
    self->private_impl.magic = WUFFS_BASE__DISABLED;
42514
  }
42515
  return status;
42516
}
42517
42518
// -------- func deflate.decoder.do_transform_io
42519
42520
WUFFS_BASE__GENERATED_C_CODE
42521
static wuffs_base__status
42522
wuffs_deflate__decoder__do_transform_io(
42523
    wuffs_deflate__decoder* self,
42524
    wuffs_base__io_buffer* a_dst,
42525
    wuffs_base__io_buffer* a_src,
42526
    wuffs_base__slice_u8 a_workbuf) {
42527
  wuffs_base__status status = wuffs_base__make_status(NULL);
42528
42529
  uint64_t v_mark = 0;
42530
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
42531
42532
  uint8_t* iop_a_dst = NULL;
42533
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
42534
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
42535
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
42536
  if (a_dst && a_dst->data.ptr) {
42537
    io0_a_dst = a_dst->data.ptr;
42538
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
42539
    iop_a_dst = io1_a_dst;
42540
    io2_a_dst = io0_a_dst + a_dst->data.len;
42541
    if (a_dst->meta.closed) {
42542
      io2_a_dst = iop_a_dst;
42543
    }
42544
  }
42545
42546
  uint32_t coro_susp_point = self->private_impl.p_do_transform_io;
42547
  switch (coro_susp_point) {
42548
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
42549
42550
    self->private_impl.choosy_decode_huffman_fast64 = (
42551
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
42552
        wuffs_base__cpu_arch__have_x86_bmi2() ? &wuffs_deflate__decoder__decode_huffman_bmi2 :
42553
#endif
42554
        self->private_impl.choosy_decode_huffman_fast64);
42555
    while (true) {
42556
      v_mark = ((uint64_t)(iop_a_dst - io0_a_dst));
42557
      {
42558
        if (a_dst) {
42559
          a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
42560
        }
42561
        wuffs_base__status t_0 = wuffs_deflate__decoder__decode_blocks(self, a_dst, a_src);
42562
        v_status = t_0;
42563
        if (a_dst) {
42564
          iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
42565
        }
42566
      }
42567
      if ( ! wuffs_base__status__is_suspension(&v_status)) {
42568
        status = v_status;
42569
        if (wuffs_base__status__is_error(&status)) {
42570
          goto exit;
42571
        } else if (wuffs_base__status__is_suspension(&status)) {
42572
          status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
42573
          goto exit;
42574
        }
42575
        goto ok;
42576
      }
42577
      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))));
42578
      wuffs_deflate__decoder__add_history(self, wuffs_private_impl__io__since(v_mark, ((uint64_t)(iop_a_dst - io0_a_dst)), io0_a_dst));
42579
      status = v_status;
42580
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
42581
    }
42582
42583
    ok:
42584
    self->private_impl.p_do_transform_io = 0;
42585
    goto exit;
42586
  }
42587
42588
  goto suspend;
42589
  suspend:
42590
  self->private_impl.p_do_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
42591
42592
  goto exit;
42593
  exit:
42594
  if (a_dst && a_dst->data.ptr) {
42595
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
42596
  }
42597
42598
  return status;
42599
}
42600
42601
// -------- func deflate.decoder.decode_blocks
42602
42603
WUFFS_BASE__GENERATED_C_CODE
42604
static wuffs_base__status
42605
wuffs_deflate__decoder__decode_blocks(
42606
    wuffs_deflate__decoder* self,
42607
    wuffs_base__io_buffer* a_dst,
42608
    wuffs_base__io_buffer* a_src) {
42609
  wuffs_base__status status = wuffs_base__make_status(NULL);
42610
42611
  uint32_t v_final = 0;
42612
  uint32_t v_b0 = 0;
42613
  uint32_t v_type = 0;
42614
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
42615
42616
  const uint8_t* iop_a_src = NULL;
42617
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
42618
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
42619
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
42620
  if (a_src && a_src->data.ptr) {
42621
    io0_a_src = a_src->data.ptr;
42622
    io1_a_src = io0_a_src + a_src->meta.ri;
42623
    iop_a_src = io1_a_src;
42624
    io2_a_src = io0_a_src + a_src->meta.wi;
42625
  }
42626
42627
  uint32_t coro_susp_point = self->private_impl.p_decode_blocks;
42628
  if (coro_susp_point) {
42629
    v_final = self->private_data.s_decode_blocks.v_final;
42630
  }
42631
  switch (coro_susp_point) {
42632
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
42633
42634
    label__outer__continue:;
42635
    while (v_final == 0u) {
42636
      while (self->private_impl.f_n_bits < 3u) {
42637
        {
42638
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
42639
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
42640
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
42641
            goto suspend;
42642
          }
42643
          uint32_t t_0 = *iop_a_src++;
42644
          v_b0 = t_0;
42645
        }
42646
        self->private_impl.f_bits |= (v_b0 << (self->private_impl.f_n_bits & 3u));
42647
        self->private_impl.f_n_bits = ((self->private_impl.f_n_bits & 3u) + 8u);
42648
      }
42649
      v_final = (self->private_impl.f_bits & 1u);
42650
      v_type = ((self->private_impl.f_bits >> 1u) & 3u);
42651
      self->private_impl.f_bits >>= 3u;
42652
      self->private_impl.f_n_bits -= 3u;
42653
      if (v_type == 0u) {
42654
        if (a_src) {
42655
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
42656
        }
42657
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
42658
        status = wuffs_deflate__decoder__decode_uncompressed(self, a_dst, a_src);
42659
        if (a_src) {
42660
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
42661
        }
42662
        if (status.repr) {
42663
          goto suspend;
42664
        }
42665
        continue;
42666
      } else if (v_type == 1u) {
42667
        v_status = wuffs_deflate__decoder__init_fixed_huffman(self);
42668
        if ( ! wuffs_base__status__is_ok(&v_status)) {
42669
          status = v_status;
42670
          if (wuffs_base__status__is_error(&status)) {
42671
            goto exit;
42672
          } else if (wuffs_base__status__is_suspension(&status)) {
42673
            status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
42674
            goto exit;
42675
          }
42676
          goto ok;
42677
        }
42678
      } else if (v_type == 2u) {
42679
        if (a_src) {
42680
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
42681
        }
42682
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
42683
        status = wuffs_deflate__decoder__init_dynamic_huffman(self, a_src);
42684
        if (a_src) {
42685
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
42686
        }
42687
        if (status.repr) {
42688
          goto suspend;
42689
        }
42690
      } else {
42691
        status = wuffs_base__make_status(wuffs_deflate__error__bad_block);
42692
        goto exit;
42693
      }
42694
      self->private_impl.f_end_of_block = false;
42695
      while (true) {
42696
        if (sizeof(void*) == 4u) {
42697
          if (a_src) {
42698
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
42699
          }
42700
          v_status = wuffs_deflate__decoder__decode_huffman_fast32(self, a_dst, a_src);
42701
          if (a_src) {
42702
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
42703
          }
42704
        } else {
42705
          if (a_src) {
42706
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
42707
          }
42708
          v_status = wuffs_deflate__decoder__decode_huffman_fast64(self, a_dst, a_src);
42709
          if (a_src) {
42710
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
42711
          }
42712
        }
42713
        if (wuffs_base__status__is_error(&v_status)) {
42714
          status = v_status;
42715
          goto exit;
42716
        }
42717
        if (self->private_impl.f_end_of_block) {
42718
          goto label__outer__continue;
42719
        }
42720
        if (a_src) {
42721
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
42722
        }
42723
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
42724
        status = wuffs_deflate__decoder__decode_huffman_slow(self, a_dst, a_src);
42725
        if (a_src) {
42726
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
42727
        }
42728
        if (status.repr) {
42729
          goto suspend;
42730
        }
42731
        if (self->private_impl.f_end_of_block) {
42732
          goto label__outer__continue;
42733
        }
42734
      }
42735
    }
42736
42737
    ok:
42738
    self->private_impl.p_decode_blocks = 0;
42739
    goto exit;
42740
  }
42741
42742
  goto suspend;
42743
  suspend:
42744
  self->private_impl.p_decode_blocks = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
42745
  self->private_data.s_decode_blocks.v_final = v_final;
42746
42747
  goto exit;
42748
  exit:
42749
  if (a_src && a_src->data.ptr) {
42750
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
42751
  }
42752
42753
  return status;
42754
}
42755
42756
// -------- func deflate.decoder.decode_uncompressed
42757
42758
WUFFS_BASE__GENERATED_C_CODE
42759
static wuffs_base__status
42760
wuffs_deflate__decoder__decode_uncompressed(
42761
    wuffs_deflate__decoder* self,
42762
    wuffs_base__io_buffer* a_dst,
42763
    wuffs_base__io_buffer* a_src) {
42764
  wuffs_base__status status = wuffs_base__make_status(NULL);
42765
42766
  uint32_t v_length = 0;
42767
  uint32_t v_n_copied = 0;
42768
42769
  uint8_t* iop_a_dst = NULL;
42770
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
42771
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
42772
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
42773
  if (a_dst && a_dst->data.ptr) {
42774
    io0_a_dst = a_dst->data.ptr;
42775
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
42776
    iop_a_dst = io1_a_dst;
42777
    io2_a_dst = io0_a_dst + a_dst->data.len;
42778
    if (a_dst->meta.closed) {
42779
      io2_a_dst = iop_a_dst;
42780
    }
42781
  }
42782
  const uint8_t* iop_a_src = NULL;
42783
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
42784
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
42785
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
42786
  if (a_src && a_src->data.ptr) {
42787
    io0_a_src = a_src->data.ptr;
42788
    io1_a_src = io0_a_src + a_src->meta.ri;
42789
    iop_a_src = io1_a_src;
42790
    io2_a_src = io0_a_src + a_src->meta.wi;
42791
  }
42792
42793
  uint32_t coro_susp_point = self->private_impl.p_decode_uncompressed;
42794
  if (coro_susp_point) {
42795
    v_length = self->private_data.s_decode_uncompressed.v_length;
42796
  }
42797
  switch (coro_susp_point) {
42798
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
42799
42800
    if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) {
42801
      status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits);
42802
      goto exit;
42803
    }
42804
    self->private_impl.f_n_bits = 0u;
42805
    self->private_impl.f_bits = 0u;
42806
    {
42807
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
42808
      uint32_t t_0;
42809
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
42810
        t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
42811
        iop_a_src += 4;
42812
      } else {
42813
        self->private_data.s_decode_uncompressed.scratch = 0;
42814
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
42815
        while (true) {
42816
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
42817
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
42818
            goto suspend;
42819
          }
42820
          uint64_t* scratch = &self->private_data.s_decode_uncompressed.scratch;
42821
          uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
42822
          *scratch <<= 8;
42823
          *scratch >>= 8;
42824
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
42825
          if (num_bits_0 == 24) {
42826
            t_0 = ((uint32_t)(*scratch));
42827
            break;
42828
          }
42829
          num_bits_0 += 8u;
42830
          *scratch |= ((uint64_t)(num_bits_0)) << 56;
42831
        }
42832
      }
42833
      v_length = t_0;
42834
    }
42835
    if ((((v_length) & 0xFFFFu) + ((v_length) >> (32u - 16u))) != 65535u) {
42836
      status = wuffs_base__make_status(wuffs_deflate__error__inconsistent_stored_block_length);
42837
      goto exit;
42838
    }
42839
    v_length = ((v_length) & 0xFFFFu);
42840
    while (true) {
42841
      v_n_copied = wuffs_private_impl__io_writer__limited_copy_u32_from_reader(
42842
          &iop_a_dst, io2_a_dst,v_length, &iop_a_src, io2_a_src);
42843
      if (v_length <= v_n_copied) {
42844
        status = wuffs_base__make_status(NULL);
42845
        goto ok;
42846
      }
42847
      v_length -= v_n_copied;
42848
      if (((uint64_t)(io2_a_dst - iop_a_dst)) == 0u) {
42849
        status = wuffs_base__make_status(wuffs_base__suspension__short_write);
42850
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3);
42851
      } else {
42852
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
42853
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4);
42854
      }
42855
    }
42856
42857
    ok:
42858
    self->private_impl.p_decode_uncompressed = 0;
42859
    goto exit;
42860
  }
42861
42862
  goto suspend;
42863
  suspend:
42864
  self->private_impl.p_decode_uncompressed = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
42865
  self->private_data.s_decode_uncompressed.v_length = v_length;
42866
42867
  goto exit;
42868
  exit:
42869
  if (a_dst && a_dst->data.ptr) {
42870
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
42871
  }
42872
  if (a_src && a_src->data.ptr) {
42873
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
42874
  }
42875
42876
  return status;
42877
}
42878
42879
// -------- func deflate.decoder.init_fixed_huffman
42880
42881
WUFFS_BASE__GENERATED_C_CODE
42882
static wuffs_base__status
42883
wuffs_deflate__decoder__init_fixed_huffman(
42884
    wuffs_deflate__decoder* self) {
42885
  uint32_t v_i = 0;
42886
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
42887
42888
  while (v_i < 144u) {
42889
    self->private_data.f_code_lengths[v_i] = 8u;
42890
    v_i += 1u;
42891
  }
42892
  while (v_i < 256u) {
42893
    self->private_data.f_code_lengths[v_i] = 9u;
42894
    v_i += 1u;
42895
  }
42896
  while (v_i < 280u) {
42897
    self->private_data.f_code_lengths[v_i] = 7u;
42898
    v_i += 1u;
42899
  }
42900
  while (v_i < 288u) {
42901
    self->private_data.f_code_lengths[v_i] = 8u;
42902
    v_i += 1u;
42903
  }
42904
  while (v_i < 320u) {
42905
    self->private_data.f_code_lengths[v_i] = 5u;
42906
    v_i += 1u;
42907
  }
42908
  v_status = wuffs_deflate__decoder__init_huff(self,
42909
      0u,
42910
      0u,
42911
      288u,
42912
      257u);
42913
  if (wuffs_base__status__is_error(&v_status)) {
42914
    return v_status;
42915
  }
42916
  v_status = wuffs_deflate__decoder__init_huff(self,
42917
      1u,
42918
      288u,
42919
      320u,
42920
      0u);
42921
  if (wuffs_base__status__is_error(&v_status)) {
42922
    return v_status;
42923
  }
42924
  return wuffs_base__make_status(NULL);
42925
}
42926
42927
// -------- func deflate.decoder.init_dynamic_huffman
42928
42929
WUFFS_BASE__GENERATED_C_CODE
42930
static wuffs_base__status
42931
wuffs_deflate__decoder__init_dynamic_huffman(
42932
    wuffs_deflate__decoder* self,
42933
    wuffs_base__io_buffer* a_src) {
42934
  wuffs_base__status status = wuffs_base__make_status(NULL);
42935
42936
  uint32_t v_bits = 0;
42937
  uint32_t v_n_bits = 0;
42938
  uint32_t v_b0 = 0;
42939
  uint32_t v_n_lit = 0;
42940
  uint32_t v_n_dist = 0;
42941
  uint32_t v_n_clen = 0;
42942
  uint32_t v_i = 0;
42943
  uint32_t v_b1 = 0;
42944
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
42945
  uint32_t v_mask = 0;
42946
  uint32_t v_table_entry = 0;
42947
  uint32_t v_table_entry_n_bits = 0;
42948
  uint32_t v_b2 = 0;
42949
  uint32_t v_n_extra_bits = 0;
42950
  uint8_t v_rep_symbol = 0;
42951
  uint32_t v_rep_count = 0;
42952
  uint32_t v_b3 = 0;
42953
42954
  const uint8_t* iop_a_src = NULL;
42955
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
42956
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
42957
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
42958
  if (a_src && a_src->data.ptr) {
42959
    io0_a_src = a_src->data.ptr;
42960
    io1_a_src = io0_a_src + a_src->meta.ri;
42961
    iop_a_src = io1_a_src;
42962
    io2_a_src = io0_a_src + a_src->meta.wi;
42963
  }
42964
42965
  uint32_t coro_susp_point = self->private_impl.p_init_dynamic_huffman;
42966
  if (coro_susp_point) {
42967
    v_bits = self->private_data.s_init_dynamic_huffman.v_bits;
42968
    v_n_bits = self->private_data.s_init_dynamic_huffman.v_n_bits;
42969
    v_n_lit = self->private_data.s_init_dynamic_huffman.v_n_lit;
42970
    v_n_dist = self->private_data.s_init_dynamic_huffman.v_n_dist;
42971
    v_n_clen = self->private_data.s_init_dynamic_huffman.v_n_clen;
42972
    v_i = self->private_data.s_init_dynamic_huffman.v_i;
42973
    v_mask = self->private_data.s_init_dynamic_huffman.v_mask;
42974
    v_n_extra_bits = self->private_data.s_init_dynamic_huffman.v_n_extra_bits;
42975
    v_rep_symbol = self->private_data.s_init_dynamic_huffman.v_rep_symbol;
42976
    v_rep_count = self->private_data.s_init_dynamic_huffman.v_rep_count;
42977
  }
42978
  switch (coro_susp_point) {
42979
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
42980
42981
    v_bits = self->private_impl.f_bits;
42982
    v_n_bits = self->private_impl.f_n_bits;
42983
    while (v_n_bits < 14u) {
42984
      {
42985
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
42986
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
42987
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
42988
          goto suspend;
42989
        }
42990
        uint32_t t_0 = *iop_a_src++;
42991
        v_b0 = t_0;
42992
      }
42993
      v_bits |= (v_b0 << v_n_bits);
42994
      v_n_bits += 8u;
42995
    }
42996
    v_n_lit = (((v_bits) & 0x1Fu) + 257u);
42997
    if (v_n_lit > 286u) {
42998
      status = wuffs_base__make_status(wuffs_deflate__error__bad_literal_length_code_count);
42999
      goto exit;
43000
    }
43001
    v_bits >>= 5u;
43002
    v_n_dist = (((v_bits) & 0x1Fu) + 1u);
43003
    if (v_n_dist > 30u) {
43004
      status = wuffs_base__make_status(wuffs_deflate__error__bad_distance_code_count);
43005
      goto exit;
43006
    }
43007
    v_bits >>= 5u;
43008
    v_n_clen = (((v_bits) & 0xFu) + 4u);
43009
    v_bits >>= 4u;
43010
    v_n_bits -= 14u;
43011
    v_i = 0u;
43012
    while (v_i < v_n_clen) {
43013
      while (v_n_bits < 3u) {
43014
        {
43015
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
43016
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
43017
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
43018
            goto suspend;
43019
          }
43020
          uint32_t t_1 = *iop_a_src++;
43021
          v_b1 = t_1;
43022
        }
43023
        v_bits |= (v_b1 << v_n_bits);
43024
        v_n_bits += 8u;
43025
      }
43026
      self->private_data.f_code_lengths[WUFFS_DEFLATE__CODE_ORDER[v_i]] = ((uint8_t)((v_bits & 7u)));
43027
      v_bits >>= 3u;
43028
      v_n_bits -= 3u;
43029
      v_i += 1u;
43030
    }
43031
    while (v_i < 19u) {
43032
      self->private_data.f_code_lengths[WUFFS_DEFLATE__CODE_ORDER[v_i]] = 0u;
43033
      v_i += 1u;
43034
    }
43035
    v_status = wuffs_deflate__decoder__init_huff(self,
43036
        0u,
43037
        0u,
43038
        19u,
43039
        4095u);
43040
    if (wuffs_base__status__is_error(&v_status)) {
43041
      status = v_status;
43042
      goto exit;
43043
    }
43044
    v_mask = ((((uint32_t)(1u)) << self->private_impl.f_n_huffs_bits[0u]) - 1u);
43045
    v_i = 0u;
43046
    while (v_i < (v_n_lit + v_n_dist)) {
43047
      while (true) {
43048
        v_table_entry = self->private_data.f_huffs[0u][(v_bits & v_mask)];
43049
        v_table_entry_n_bits = (v_table_entry & 15u);
43050
        if (v_n_bits >= v_table_entry_n_bits) {
43051
          v_bits >>= v_table_entry_n_bits;
43052
          v_n_bits -= v_table_entry_n_bits;
43053
          break;
43054
        }
43055
        {
43056
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
43057
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
43058
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
43059
            goto suspend;
43060
          }
43061
          uint32_t t_2 = *iop_a_src++;
43062
          v_b2 = t_2;
43063
        }
43064
        v_bits |= (v_b2 << v_n_bits);
43065
        v_n_bits += 8u;
43066
      }
43067
      if ((v_table_entry >> 24u) != 128u) {
43068
        status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
43069
        goto exit;
43070
      }
43071
      v_table_entry = ((v_table_entry >> 8u) & 255u);
43072
      if (v_table_entry < 16u) {
43073
        self->private_data.f_code_lengths[v_i] = ((uint8_t)(v_table_entry));
43074
        v_i += 1u;
43075
        continue;
43076
      }
43077
      v_n_extra_bits = 0u;
43078
      v_rep_symbol = 0u;
43079
      v_rep_count = 0u;
43080
      if (v_table_entry == 16u) {
43081
        v_n_extra_bits = 2u;
43082
        if (v_i <= 0u) {
43083
          status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_length_repetition);
43084
          goto exit;
43085
        }
43086
        v_rep_symbol = ((uint8_t)(self->private_data.f_code_lengths[(v_i - 1u)] & 15u));
43087
        v_rep_count = 3u;
43088
      } else if (v_table_entry == 17u) {
43089
        v_n_extra_bits = 3u;
43090
        v_rep_symbol = 0u;
43091
        v_rep_count = 3u;
43092
      } else if (v_table_entry == 18u) {
43093
        v_n_extra_bits = 7u;
43094
        v_rep_symbol = 0u;
43095
        v_rep_count = 11u;
43096
      } else {
43097
        status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
43098
        goto exit;
43099
      }
43100
      while (v_n_bits < v_n_extra_bits) {
43101
        {
43102
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
43103
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
43104
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
43105
            goto suspend;
43106
          }
43107
          uint32_t t_3 = *iop_a_src++;
43108
          v_b3 = t_3;
43109
        }
43110
        v_bits |= (v_b3 << v_n_bits);
43111
        v_n_bits += 8u;
43112
      }
43113
      v_rep_count += ((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(v_n_extra_bits));
43114
      v_bits >>= v_n_extra_bits;
43115
      v_n_bits -= v_n_extra_bits;
43116
      while (v_rep_count > 0u) {
43117
        if (v_i >= (v_n_lit + v_n_dist)) {
43118
          status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_length_count);
43119
          goto exit;
43120
        }
43121
        self->private_data.f_code_lengths[v_i] = v_rep_symbol;
43122
        v_i += 1u;
43123
        v_rep_count -= 1u;
43124
      }
43125
    }
43126
    if (v_i != (v_n_lit + v_n_dist)) {
43127
      status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_length_count);
43128
      goto exit;
43129
    }
43130
    if (self->private_data.f_code_lengths[256u] == 0u) {
43131
      status = wuffs_base__make_status(wuffs_deflate__error__missing_end_of_block_code);
43132
      goto exit;
43133
    }
43134
    v_status = wuffs_deflate__decoder__init_huff(self,
43135
        0u,
43136
        0u,
43137
        v_n_lit,
43138
        257u);
43139
    if (wuffs_base__status__is_error(&v_status)) {
43140
      status = v_status;
43141
      goto exit;
43142
    }
43143
    v_status = wuffs_deflate__decoder__init_huff(self,
43144
        1u,
43145
        v_n_lit,
43146
        (v_n_lit + v_n_dist),
43147
        0u);
43148
    if (wuffs_base__status__is_error(&v_status)) {
43149
      status = v_status;
43150
      goto exit;
43151
    }
43152
    self->private_impl.f_bits = v_bits;
43153
    self->private_impl.f_n_bits = v_n_bits;
43154
43155
    goto ok;
43156
    ok:
43157
    self->private_impl.p_init_dynamic_huffman = 0;
43158
    goto exit;
43159
  }
43160
43161
  goto suspend;
43162
  suspend:
43163
  self->private_impl.p_init_dynamic_huffman = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
43164
  self->private_data.s_init_dynamic_huffman.v_bits = v_bits;
43165
  self->private_data.s_init_dynamic_huffman.v_n_bits = v_n_bits;
43166
  self->private_data.s_init_dynamic_huffman.v_n_lit = v_n_lit;
43167
  self->private_data.s_init_dynamic_huffman.v_n_dist = v_n_dist;
43168
  self->private_data.s_init_dynamic_huffman.v_n_clen = v_n_clen;
43169
  self->private_data.s_init_dynamic_huffman.v_i = v_i;
43170
  self->private_data.s_init_dynamic_huffman.v_mask = v_mask;
43171
  self->private_data.s_init_dynamic_huffman.v_n_extra_bits = v_n_extra_bits;
43172
  self->private_data.s_init_dynamic_huffman.v_rep_symbol = v_rep_symbol;
43173
  self->private_data.s_init_dynamic_huffman.v_rep_count = v_rep_count;
43174
43175
  goto exit;
43176
  exit:
43177
  if (a_src && a_src->data.ptr) {
43178
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
43179
  }
43180
43181
  return status;
43182
}
43183
43184
// -------- func deflate.decoder.init_huff
43185
43186
WUFFS_BASE__GENERATED_C_CODE
43187
static wuffs_base__status
43188
wuffs_deflate__decoder__init_huff(
43189
    wuffs_deflate__decoder* self,
43190
    uint32_t a_which,
43191
    uint32_t a_n_codes0,
43192
    uint32_t a_n_codes1,
43193
    uint32_t a_base_symbol) {
43194
  uint16_t v_counts[16] = {0};
43195
  uint32_t v_i = 0;
43196
  uint32_t v_remaining = 0;
43197
  uint16_t v_offsets[16] = {0};
43198
  uint32_t v_n_symbols = 0;
43199
  uint32_t v_count = 0;
43200
  uint16_t v_symbols[320] = {0};
43201
  uint32_t v_min_cl = 0;
43202
  uint32_t v_max_cl = 0;
43203
  uint32_t v_initial_high_bits = 0;
43204
  uint32_t v_prev_cl = 0;
43205
  uint32_t v_prev_redirect_key = 0;
43206
  uint32_t v_top = 0;
43207
  uint32_t v_next_top = 0;
43208
  uint32_t v_code = 0;
43209
  uint32_t v_key = 0;
43210
  uint32_t v_value = 0;
43211
  uint32_t v_cl = 0;
43212
  uint32_t v_redirect_key = 0;
43213
  uint32_t v_j = 0;
43214
  uint32_t v_reversed_key = 0;
43215
  uint32_t v_symbol = 0;
43216
  uint32_t v_high_bits = 0;
43217
  uint32_t v_delta = 0;
43218
43219
  v_i = a_n_codes0;
43220
  while (v_i < a_n_codes1) {
43221
    if (v_counts[((uint8_t)(self->private_data.f_code_lengths[v_i] & 15u))] >= 320u) {
43222
      return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
43223
    }
43224
#if defined(__GNUC__)
43225
#pragma GCC diagnostic push
43226
#pragma GCC diagnostic ignored "-Wconversion"
43227
#endif
43228
    v_counts[((uint8_t)(self->private_data.f_code_lengths[v_i] & 15u))] += 1u;
43229
#if defined(__GNUC__)
43230
#pragma GCC diagnostic pop
43231
#endif
43232
    v_i += 1u;
43233
  }
43234
  if ((((uint32_t)(v_counts[0u])) + a_n_codes0) == a_n_codes1) {
43235
    return wuffs_base__make_status(wuffs_deflate__error__no_huffman_codes);
43236
  }
43237
  v_remaining = 1u;
43238
  v_i = 1u;
43239
  while (v_i <= 15u) {
43240
    if (v_remaining > 1073741824u) {
43241
      return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
43242
    }
43243
    v_remaining <<= 1u;
43244
    if (v_remaining < ((uint32_t)(v_counts[v_i]))) {
43245
      return wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_over_subscribed);
43246
    }
43247
    v_remaining -= ((uint32_t)(v_counts[v_i]));
43248
    v_i += 1u;
43249
  }
43250
  if (v_remaining != 0u) {
43251
    if ((a_which == 1u) && (v_counts[1u] == 1u) && ((((uint32_t)(v_counts[0u])) + a_n_codes0 + 1u) == a_n_codes1)) {
43252
      v_i = 0u;
43253
      while (v_i <= 29u) {
43254
        if (self->private_data.f_code_lengths[(a_n_codes0 + v_i)] == 1u) {
43255
          self->private_impl.f_n_huffs_bits[1u] = 1u;
43256
          self->private_data.f_huffs[1u][0u] = (WUFFS_DEFLATE__DCODE_MAGIC_NUMBERS[v_i] | 1u);
43257
          self->private_data.f_huffs[1u][1u] = (WUFFS_DEFLATE__DCODE_MAGIC_NUMBERS[31u] | 1u);
43258
          return wuffs_base__make_status(NULL);
43259
        }
43260
        v_i += 1u;
43261
      }
43262
    }
43263
    return wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_under_subscribed);
43264
  }
43265
  v_i = 1u;
43266
  while (v_i <= 15u) {
43267
    v_offsets[v_i] = ((uint16_t)(v_n_symbols));
43268
    v_count = ((uint32_t)(v_counts[v_i]));
43269
    if (v_n_symbols > (320u - v_count)) {
43270
      return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
43271
    }
43272
    v_n_symbols = (v_n_symbols + v_count);
43273
    v_i += 1u;
43274
  }
43275
  if (v_n_symbols > 288u) {
43276
    return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
43277
  }
43278
  v_i = a_n_codes0;
43279
  while (v_i < a_n_codes1) {
43280
    if (v_i < a_n_codes0) {
43281
      return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
43282
    }
43283
    if (self->private_data.f_code_lengths[v_i] != 0u) {
43284
      if (v_offsets[((uint8_t)(self->private_data.f_code_lengths[v_i] & 15u))] >= 320u) {
43285
        return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
43286
      }
43287
      v_symbols[v_offsets[((uint8_t)(self->private_data.f_code_lengths[v_i] & 15u))]] = ((uint16_t)((v_i - a_n_codes0)));
43288
#if defined(__GNUC__)
43289
#pragma GCC diagnostic push
43290
#pragma GCC diagnostic ignored "-Wconversion"
43291
#endif
43292
      v_offsets[((uint8_t)(self->private_data.f_code_lengths[v_i] & 15u))] += 1u;
43293
#if defined(__GNUC__)
43294
#pragma GCC diagnostic pop
43295
#endif
43296
    }
43297
    v_i += 1u;
43298
  }
43299
  v_min_cl = 1u;
43300
  while (true) {
43301
    if (v_counts[v_min_cl] != 0u) {
43302
      break;
43303
    }
43304
    if (v_min_cl >= 9u) {
43305
      return wuffs_base__make_status(wuffs_deflate__error__bad_huffman_minimum_code_length);
43306
    }
43307
    v_min_cl += 1u;
43308
  }
43309
  v_max_cl = 15u;
43310
  while (true) {
43311
    if (v_counts[v_max_cl] != 0u) {
43312
      break;
43313
    }
43314
    if (v_max_cl <= 1u) {
43315
      return wuffs_base__make_status(wuffs_deflate__error__no_huffman_codes);
43316
    }
43317
    v_max_cl -= 1u;
43318
  }
43319
  if (v_max_cl <= 9u) {
43320
    self->private_impl.f_n_huffs_bits[a_which] = v_max_cl;
43321
  } else {
43322
    self->private_impl.f_n_huffs_bits[a_which] = 9u;
43323
  }
43324
  v_i = 0u;
43325
  if ((v_n_symbols != ((uint32_t)(v_offsets[v_max_cl]))) || (v_n_symbols != ((uint32_t)(v_offsets[15u])))) {
43326
    return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
43327
  }
43328
  if ((a_n_codes0 + ((uint32_t)(v_symbols[0u]))) >= 320u) {
43329
    return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
43330
  }
43331
  v_initial_high_bits = 512u;
43332
  if (v_max_cl < 9u) {
43333
    v_initial_high_bits = (((uint32_t)(1u)) << v_max_cl);
43334
  }
43335
  v_prev_cl = ((uint32_t)(((uint8_t)(self->private_data.f_code_lengths[(a_n_codes0 + ((uint32_t)(v_symbols[0u])))] & 15u))));
43336
  v_prev_redirect_key = 4294967295u;
43337
  v_top = 0u;
43338
  v_next_top = 512u;
43339
  v_code = 0u;
43340
  v_key = 0u;
43341
  v_value = 0u;
43342
  while (true) {
43343
    if ((a_n_codes0 + ((uint32_t)(v_symbols[v_i]))) >= 320u) {
43344
      return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
43345
    }
43346
    v_cl = ((uint32_t)(((uint8_t)(self->private_data.f_code_lengths[(a_n_codes0 + ((uint32_t)(v_symbols[v_i])))] & 15u))));
43347
    if (v_cl > v_prev_cl) {
43348
      v_code <<= (v_cl - v_prev_cl);
43349
      if (v_code >= 32768u) {
43350
        return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
43351
      }
43352
    }
43353
    v_prev_cl = v_cl;
43354
    v_key = v_code;
43355
    if (v_cl > 9u) {
43356
      v_cl -= 9u;
43357
      v_redirect_key = ((v_key >> v_cl) & 511u);
43358
      v_key = ((v_key) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(v_cl));
43359
      if (v_prev_redirect_key != v_redirect_key) {
43360
        v_prev_redirect_key = v_redirect_key;
43361
        v_remaining = (((uint32_t)(1u)) << v_cl);
43362
        v_j = v_prev_cl;
43363
        while (v_j <= 15u) {
43364
          if (v_remaining <= ((uint32_t)(v_counts[v_j]))) {
43365
            break;
43366
          }
43367
          v_remaining -= ((uint32_t)(v_counts[v_j]));
43368
          if (v_remaining > 1073741824u) {
43369
            return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
43370
          }
43371
          v_remaining <<= 1u;
43372
          v_j += 1u;
43373
        }
43374
        if ((v_j <= 9u) || (15u < v_j)) {
43375
          return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
43376
        }
43377
        v_j -= 9u;
43378
        v_initial_high_bits = (((uint32_t)(1u)) << v_j);
43379
        v_top = v_next_top;
43380
        if ((v_top + (((uint32_t)(1u)) << v_j)) > 1024u) {
43381
          return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
43382
        }
43383
        v_next_top = (v_top + (((uint32_t)(1u)) << v_j));
43384
        v_redirect_key = (((uint32_t)(WUFFS_DEFLATE__REVERSE8[(v_redirect_key >> 1u)])) | ((v_redirect_key & 1u) << 8u));
43385
        self->private_data.f_huffs[a_which][v_redirect_key] = (268435465u | (v_top << 8u) | (v_j << 4u));
43386
      }
43387
    }
43388
    if ((v_key >= 512u) || (v_counts[v_prev_cl] <= 0u)) {
43389
      return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
43390
    }
43391
#if defined(__GNUC__)
43392
#pragma GCC diagnostic push
43393
#pragma GCC diagnostic ignored "-Wconversion"
43394
#endif
43395
    v_counts[v_prev_cl] -= 1u;
43396
#if defined(__GNUC__)
43397
#pragma GCC diagnostic pop
43398
#endif
43399
    v_reversed_key = (((uint32_t)(WUFFS_DEFLATE__REVERSE8[(v_key >> 1u)])) | ((v_key & 1u) << 8u));
43400
    v_reversed_key >>= (9u - v_cl);
43401
    v_symbol = ((uint32_t)(v_symbols[v_i]));
43402
    if (v_symbol == 256u) {
43403
      v_value = (536870912u | v_cl);
43404
    } else if ((v_symbol < 256u) && (a_which == 0u)) {
43405
      v_value = (2147483648u | (v_symbol << 8u) | v_cl);
43406
    } else if (v_symbol >= a_base_symbol) {
43407
      v_symbol -= a_base_symbol;
43408
      if (a_which == 0u) {
43409
        v_value = (WUFFS_DEFLATE__LCODE_MAGIC_NUMBERS[(v_symbol & 31u)] | v_cl);
43410
      } else {
43411
        v_value = (WUFFS_DEFLATE__DCODE_MAGIC_NUMBERS[(v_symbol & 31u)] | v_cl);
43412
      }
43413
    } else {
43414
      return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
43415
    }
43416
    v_high_bits = v_initial_high_bits;
43417
    v_delta = (((uint32_t)(1u)) << v_cl);
43418
    while (v_high_bits >= v_delta) {
43419
      v_high_bits -= v_delta;
43420
      if ((v_top + ((v_high_bits | v_reversed_key) & 511u)) >= 1024u) {
43421
        return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
43422
      }
43423
      self->private_data.f_huffs[a_which][(v_top + ((v_high_bits | v_reversed_key) & 511u))] = v_value;
43424
    }
43425
    v_i += 1u;
43426
    if (v_i >= v_n_symbols) {
43427
      break;
43428
    }
43429
    v_code += 1u;
43430
    if (v_code >= 32768u) {
43431
      return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
43432
    }
43433
  }
43434
  return wuffs_base__make_status(NULL);
43435
}
43436
43437
// โ€ผ WUFFS MULTI-FILE SECTION +x86_bmi2
43438
// -------- func deflate.decoder.decode_huffman_bmi2
43439
43440
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
43441
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("bmi2")
43442
WUFFS_BASE__GENERATED_C_CODE
43443
static wuffs_base__status
43444
wuffs_deflate__decoder__decode_huffman_bmi2(
43445
    wuffs_deflate__decoder* self,
43446
    wuffs_base__io_buffer* a_dst,
43447
    wuffs_base__io_buffer* a_src) {
43448
  wuffs_base__status status = wuffs_base__make_status(NULL);
43449
43450
  uint64_t v_bits = 0;
43451
  uint32_t v_n_bits = 0;
43452
  uint32_t v_table_entry = 0;
43453
  uint32_t v_table_entry_n_bits = 0;
43454
  uint64_t v_lmask = 0;
43455
  uint64_t v_dmask = 0;
43456
  uint32_t v_redir_top = 0;
43457
  uint32_t v_redir_mask = 0;
43458
  uint32_t v_length = 0;
43459
  uint32_t v_dist_minus_1 = 0;
43460
  uint32_t v_hlen = 0;
43461
  uint32_t v_hdist = 0;
43462
  uint32_t v_hdist_adjustment = 0;
43463
43464
  uint8_t* iop_a_dst = NULL;
43465
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
43466
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
43467
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
43468
  if (a_dst && a_dst->data.ptr) {
43469
    io0_a_dst = a_dst->data.ptr;
43470
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
43471
    iop_a_dst = io1_a_dst;
43472
    io2_a_dst = io0_a_dst + a_dst->data.len;
43473
    if (a_dst->meta.closed) {
43474
      io2_a_dst = iop_a_dst;
43475
    }
43476
  }
43477
  const uint8_t* iop_a_src = NULL;
43478
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
43479
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
43480
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
43481
  if (a_src && a_src->data.ptr) {
43482
    io0_a_src = a_src->data.ptr;
43483
    io1_a_src = io0_a_src + a_src->meta.ri;
43484
    iop_a_src = io1_a_src;
43485
    io2_a_src = io0_a_src + a_src->meta.wi;
43486
  }
43487
43488
  if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) {
43489
    status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits);
43490
    goto exit;
43491
  }
43492
  v_bits = ((uint64_t)(self->private_impl.f_bits));
43493
  v_n_bits = self->private_impl.f_n_bits;
43494
  v_lmask = ((((uint64_t)(1u)) << self->private_impl.f_n_huffs_bits[0u]) - 1u);
43495
  v_dmask = ((((uint64_t)(1u)) << self->private_impl.f_n_huffs_bits[1u]) - 1u);
43496
  if (self->private_impl.f_transformed_history_count < (a_dst ? a_dst->meta.pos : 0u)) {
43497
    status = wuffs_base__make_status(wuffs_base__error__bad_i_o_position);
43498
    goto exit;
43499
  }
43500
  v_hdist_adjustment = ((uint32_t)((self->private_impl.f_transformed_history_count - (a_dst ? a_dst->meta.pos : 0u))));
43501
  label__loop__continue:;
43502
  while ((((uint64_t)(io2_a_dst - iop_a_dst)) >= 266u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 8u)) {
43503
    v_bits |= ((uint64_t)(wuffs_base__peek_u64le__no_bounds_check(iop_a_src) << (v_n_bits & 63u)));
43504
    iop_a_src += ((63u - (v_n_bits & 63u)) >> 3u);
43505
    v_n_bits |= 56u;
43506
    v_table_entry = self->private_data.f_huffs[0u][(v_bits & v_lmask)];
43507
    v_table_entry_n_bits = (v_table_entry & 15u);
43508
    v_bits >>= v_table_entry_n_bits;
43509
    v_n_bits -= v_table_entry_n_bits;
43510
    if ((v_table_entry >> 31u) != 0u) {
43511
      (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1);
43512
      continue;
43513
    } else if ((v_table_entry >> 30u) != 0u) {
43514
    } else if ((v_table_entry >> 29u) != 0u) {
43515
      self->private_impl.f_end_of_block = true;
43516
      break;
43517
    } else if ((v_table_entry >> 28u) != 0u) {
43518
      v_redir_top = ((v_table_entry >> 8u) & 65535u);
43519
      v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u);
43520
      v_table_entry = self->private_data.f_huffs[0u][((v_redir_top + (((uint32_t)(v_bits)) & v_redir_mask)) & 1023u)];
43521
      v_table_entry_n_bits = (v_table_entry & 15u);
43522
      v_bits >>= v_table_entry_n_bits;
43523
      v_n_bits -= v_table_entry_n_bits;
43524
      if ((v_table_entry >> 31u) != 0u) {
43525
        (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1);
43526
        continue;
43527
      } else if ((v_table_entry >> 30u) != 0u) {
43528
      } else if ((v_table_entry >> 29u) != 0u) {
43529
        self->private_impl.f_end_of_block = true;
43530
        break;
43531
      } else if ((v_table_entry >> 28u) != 0u) {
43532
        status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
43533
        goto exit;
43534
      } else if ((v_table_entry >> 27u) != 0u) {
43535
        status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code);
43536
        goto exit;
43537
      } else {
43538
        status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
43539
        goto exit;
43540
      }
43541
    } else if ((v_table_entry >> 27u) != 0u) {
43542
      status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code);
43543
      goto exit;
43544
    } else {
43545
      status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
43546
      goto exit;
43547
    }
43548
    v_length = (((v_table_entry >> 8u) & 255u) + 3u);
43549
    v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u);
43550
    if (v_table_entry_n_bits > 0u) {
43551
      v_length = (((v_length + 253u + ((uint32_t)(((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U64(v_table_entry_n_bits))))) & 255u) + 3u);
43552
      v_bits >>= v_table_entry_n_bits;
43553
      v_n_bits -= v_table_entry_n_bits;
43554
    }
43555
    v_table_entry = self->private_data.f_huffs[1u][(v_bits & v_dmask)];
43556
    v_table_entry_n_bits = (v_table_entry & 15u);
43557
    v_bits >>= v_table_entry_n_bits;
43558
    v_n_bits -= v_table_entry_n_bits;
43559
    if ((v_table_entry >> 28u) == 1u) {
43560
      v_redir_top = ((v_table_entry >> 8u) & 65535u);
43561
      v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u);
43562
      v_table_entry = self->private_data.f_huffs[1u][((v_redir_top + (((uint32_t)(v_bits)) & v_redir_mask)) & 1023u)];
43563
      v_table_entry_n_bits = (v_table_entry & 15u);
43564
      v_bits >>= v_table_entry_n_bits;
43565
      v_n_bits -= v_table_entry_n_bits;
43566
    }
43567
    if ((v_table_entry >> 24u) != 64u) {
43568
      if ((v_table_entry >> 24u) == 8u) {
43569
        status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code);
43570
        goto exit;
43571
      }
43572
      status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
43573
      goto exit;
43574
    }
43575
    v_dist_minus_1 = ((v_table_entry >> 8u) & 32767u);
43576
    v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u);
43577
    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);
43578
    v_bits >>= v_table_entry_n_bits;
43579
    v_n_bits -= v_table_entry_n_bits;
43580
    do {
43581
      if (((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) {
43582
        v_hlen = 0u;
43583
        v_hdist = ((uint32_t)((((uint64_t)((v_dist_minus_1 + 1u))) - ((uint64_t)(iop_a_dst - io0_a_dst)))));
43584
        if (v_length > v_hdist) {
43585
          v_length -= v_hdist;
43586
          v_hlen = v_hdist;
43587
        } else {
43588
          v_hlen = v_length;
43589
          v_length = 0u;
43590
        }
43591
        v_hdist += v_hdist_adjustment;
43592
        if (self->private_impl.f_history_index < v_hdist) {
43593
          status = wuffs_base__make_status(wuffs_deflate__error__bad_distance);
43594
          goto exit;
43595
        }
43596
        wuffs_private_impl__io_writer__limited_copy_u32_from_slice(
43597
            &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));
43598
        if (v_length == 0u) {
43599
          goto label__loop__continue;
43600
        }
43601
        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)))) {
43602
          status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_distance);
43603
          goto exit;
43604
        }
43605
      }
43606
      if ((v_dist_minus_1 + 1u) >= 8u) {
43607
        wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast(
43608
            &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u));
43609
      } else if ((v_dist_minus_1 + 1u) == 1u) {
43610
        wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast(
43611
            &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u));
43612
      } else {
43613
        wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast(
43614
            &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u));
43615
      }
43616
    } while (0);
43617
  }
43618
  if (v_n_bits > 63u) {
43619
    status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits);
43620
    goto exit;
43621
  }
43622
  while (v_n_bits >= 8u) {
43623
    v_n_bits -= 8u;
43624
    if (iop_a_src > io1_a_src) {
43625
      iop_a_src--;
43626
    } else {
43627
      status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_i_o);
43628
      goto exit;
43629
    }
43630
  }
43631
  self->private_impl.f_bits = ((uint32_t)((v_bits & ((((uint64_t)(1u)) << v_n_bits) - 1u))));
43632
  self->private_impl.f_n_bits = v_n_bits;
43633
  if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> self->private_impl.f_n_bits) != 0u)) {
43634
    status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits);
43635
    goto exit;
43636
  }
43637
  goto exit;
43638
  exit:
43639
  if (a_dst && a_dst->data.ptr) {
43640
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
43641
  }
43642
  if (a_src && a_src->data.ptr) {
43643
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
43644
  }
43645
43646
  return status;
43647
}
43648
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
43649
// โ€ผ WUFFS MULTI-FILE SECTION -x86_bmi2
43650
43651
// -------- func deflate.decoder.decode_huffman_fast32
43652
43653
WUFFS_BASE__GENERATED_C_CODE
43654
static wuffs_base__status
43655
wuffs_deflate__decoder__decode_huffman_fast32(
43656
    wuffs_deflate__decoder* self,
43657
    wuffs_base__io_buffer* a_dst,
43658
    wuffs_base__io_buffer* a_src) {
43659
  wuffs_base__status status = wuffs_base__make_status(NULL);
43660
43661
  uint32_t v_bits = 0;
43662
  uint32_t v_n_bits = 0;
43663
  uint32_t v_table_entry = 0;
43664
  uint32_t v_table_entry_n_bits = 0;
43665
  uint32_t v_lmask = 0;
43666
  uint32_t v_dmask = 0;
43667
  uint32_t v_redir_top = 0;
43668
  uint32_t v_redir_mask = 0;
43669
  uint32_t v_length = 0;
43670
  uint32_t v_dist_minus_1 = 0;
43671
  uint32_t v_hlen = 0;
43672
  uint32_t v_hdist = 0;
43673
  uint32_t v_hdist_adjustment = 0;
43674
43675
  uint8_t* iop_a_dst = NULL;
43676
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
43677
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
43678
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
43679
  if (a_dst && a_dst->data.ptr) {
43680
    io0_a_dst = a_dst->data.ptr;
43681
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
43682
    iop_a_dst = io1_a_dst;
43683
    io2_a_dst = io0_a_dst + a_dst->data.len;
43684
    if (a_dst->meta.closed) {
43685
      io2_a_dst = iop_a_dst;
43686
    }
43687
  }
43688
  const uint8_t* iop_a_src = NULL;
43689
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
43690
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
43691
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
43692
  if (a_src && a_src->data.ptr) {
43693
    io0_a_src = a_src->data.ptr;
43694
    io1_a_src = io0_a_src + a_src->meta.ri;
43695
    iop_a_src = io1_a_src;
43696
    io2_a_src = io0_a_src + a_src->meta.wi;
43697
  }
43698
43699
  if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) {
43700
    status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits);
43701
    goto exit;
43702
  }
43703
  v_bits = self->private_impl.f_bits;
43704
  v_n_bits = self->private_impl.f_n_bits;
43705
  v_lmask = ((((uint32_t)(1u)) << self->private_impl.f_n_huffs_bits[0u]) - 1u);
43706
  v_dmask = ((((uint32_t)(1u)) << self->private_impl.f_n_huffs_bits[1u]) - 1u);
43707
  if (self->private_impl.f_transformed_history_count < (a_dst ? a_dst->meta.pos : 0u)) {
43708
    status = wuffs_base__make_status(wuffs_base__error__bad_i_o_position);
43709
    goto exit;
43710
  }
43711
  v_hdist_adjustment = ((uint32_t)((self->private_impl.f_transformed_history_count - (a_dst ? a_dst->meta.pos : 0u))));
43712
  label__loop__continue:;
43713
  while ((((uint64_t)(io2_a_dst - iop_a_dst)) >= 266u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 12u)) {
43714
    if (v_n_bits < 15u) {
43715
      v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
43716
      iop_a_src += 1u;
43717
      v_n_bits += 8u;
43718
      v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
43719
      iop_a_src += 1u;
43720
      v_n_bits += 8u;
43721
    } else {
43722
    }
43723
    v_table_entry = self->private_data.f_huffs[0u][(v_bits & v_lmask)];
43724
    v_table_entry_n_bits = (v_table_entry & 15u);
43725
    v_bits >>= v_table_entry_n_bits;
43726
    v_n_bits -= v_table_entry_n_bits;
43727
    if ((v_table_entry >> 31u) != 0u) {
43728
      (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1);
43729
      continue;
43730
    } else if ((v_table_entry >> 30u) != 0u) {
43731
    } else if ((v_table_entry >> 29u) != 0u) {
43732
      self->private_impl.f_end_of_block = true;
43733
      break;
43734
    } else if ((v_table_entry >> 28u) != 0u) {
43735
      if (v_n_bits < 15u) {
43736
        v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
43737
        iop_a_src += 1u;
43738
        v_n_bits += 8u;
43739
        v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
43740
        iop_a_src += 1u;
43741
        v_n_bits += 8u;
43742
      } else {
43743
      }
43744
      v_redir_top = ((v_table_entry >> 8u) & 65535u);
43745
      v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u);
43746
      v_table_entry = self->private_data.f_huffs[0u][((v_redir_top + (v_bits & v_redir_mask)) & 1023u)];
43747
      v_table_entry_n_bits = (v_table_entry & 15u);
43748
      v_bits >>= v_table_entry_n_bits;
43749
      v_n_bits -= v_table_entry_n_bits;
43750
      if ((v_table_entry >> 31u) != 0u) {
43751
        (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1);
43752
        continue;
43753
      } else if ((v_table_entry >> 30u) != 0u) {
43754
      } else if ((v_table_entry >> 29u) != 0u) {
43755
        self->private_impl.f_end_of_block = true;
43756
        break;
43757
      } else if ((v_table_entry >> 28u) != 0u) {
43758
        status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
43759
        goto exit;
43760
      } else if ((v_table_entry >> 27u) != 0u) {
43761
        status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code);
43762
        goto exit;
43763
      } else {
43764
        status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
43765
        goto exit;
43766
      }
43767
    } else if ((v_table_entry >> 27u) != 0u) {
43768
      status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code);
43769
      goto exit;
43770
    } else {
43771
      status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
43772
      goto exit;
43773
    }
43774
    v_length = (((v_table_entry >> 8u) & 255u) + 3u);
43775
    v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u);
43776
    if (v_table_entry_n_bits > 0u) {
43777
      if (v_n_bits < 15u) {
43778
        v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
43779
        iop_a_src += 1u;
43780
        v_n_bits += 8u;
43781
        v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
43782
        iop_a_src += 1u;
43783
        v_n_bits += 8u;
43784
      } else {
43785
      }
43786
      v_length = (((v_length + 253u + ((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(v_table_entry_n_bits))) & 255u) + 3u);
43787
      v_bits >>= v_table_entry_n_bits;
43788
      v_n_bits -= v_table_entry_n_bits;
43789
    } else {
43790
    }
43791
    if (v_n_bits < 15u) {
43792
      v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
43793
      iop_a_src += 1u;
43794
      v_n_bits += 8u;
43795
      v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
43796
      iop_a_src += 1u;
43797
      v_n_bits += 8u;
43798
    } else {
43799
    }
43800
    v_table_entry = self->private_data.f_huffs[1u][(v_bits & v_dmask)];
43801
    v_table_entry_n_bits = (v_table_entry & 15u);
43802
    v_bits >>= v_table_entry_n_bits;
43803
    v_n_bits -= v_table_entry_n_bits;
43804
    if ((v_table_entry >> 28u) == 1u) {
43805
      if (v_n_bits < 15u) {
43806
        v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
43807
        iop_a_src += 1u;
43808
        v_n_bits += 8u;
43809
        v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
43810
        iop_a_src += 1u;
43811
        v_n_bits += 8u;
43812
      } else {
43813
      }
43814
      v_redir_top = ((v_table_entry >> 8u) & 65535u);
43815
      v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u);
43816
      v_table_entry = self->private_data.f_huffs[1u][((v_redir_top + (v_bits & v_redir_mask)) & 1023u)];
43817
      v_table_entry_n_bits = (v_table_entry & 15u);
43818
      v_bits >>= v_table_entry_n_bits;
43819
      v_n_bits -= v_table_entry_n_bits;
43820
    } else {
43821
    }
43822
    if ((v_table_entry >> 24u) != 64u) {
43823
      if ((v_table_entry >> 24u) == 8u) {
43824
        status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code);
43825
        goto exit;
43826
      }
43827
      status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
43828
      goto exit;
43829
    }
43830
    v_dist_minus_1 = ((v_table_entry >> 8u) & 32767u);
43831
    v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u);
43832
    if (v_n_bits < v_table_entry_n_bits) {
43833
      v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
43834
      iop_a_src += 1u;
43835
      v_n_bits += 8u;
43836
      v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
43837
      iop_a_src += 1u;
43838
      v_n_bits += 8u;
43839
    }
43840
    v_dist_minus_1 = ((v_dist_minus_1 + ((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(v_table_entry_n_bits))) & 32767u);
43841
    v_bits >>= v_table_entry_n_bits;
43842
    v_n_bits -= v_table_entry_n_bits;
43843
    do {
43844
      if (((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) {
43845
        v_hlen = 0u;
43846
        v_hdist = ((uint32_t)((((uint64_t)((v_dist_minus_1 + 1u))) - ((uint64_t)(iop_a_dst - io0_a_dst)))));
43847
        if (v_length > v_hdist) {
43848
          v_length -= v_hdist;
43849
          v_hlen = v_hdist;
43850
        } else {
43851
          v_hlen = v_length;
43852
          v_length = 0u;
43853
        }
43854
        v_hdist += v_hdist_adjustment;
43855
        if (self->private_impl.f_history_index < v_hdist) {
43856
          status = wuffs_base__make_status(wuffs_deflate__error__bad_distance);
43857
          goto exit;
43858
        }
43859
        wuffs_private_impl__io_writer__limited_copy_u32_from_slice(
43860
            &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));
43861
        if (v_length == 0u) {
43862
          goto label__loop__continue;
43863
        }
43864
        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)))) {
43865
          status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_distance);
43866
          goto exit;
43867
        }
43868
      }
43869
      if ((v_dist_minus_1 + 1u) >= 8u) {
43870
        wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast(
43871
            &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u));
43872
      } else {
43873
        wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast(
43874
            &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u));
43875
      }
43876
    } while (0);
43877
  }
43878
  while (v_n_bits >= 8u) {
43879
    v_n_bits -= 8u;
43880
    if (iop_a_src > io1_a_src) {
43881
      iop_a_src--;
43882
    } else {
43883
      status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_i_o);
43884
      goto exit;
43885
    }
43886
  }
43887
  self->private_impl.f_bits = (v_bits & ((((uint32_t)(1u)) << v_n_bits) - 1u));
43888
  self->private_impl.f_n_bits = v_n_bits;
43889
  if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> self->private_impl.f_n_bits) != 0u)) {
43890
    status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits);
43891
    goto exit;
43892
  }
43893
  goto exit;
43894
  exit:
43895
  if (a_dst && a_dst->data.ptr) {
43896
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
43897
  }
43898
  if (a_src && a_src->data.ptr) {
43899
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
43900
  }
43901
43902
  return status;
43903
}
43904
43905
// -------- func deflate.decoder.decode_huffman_fast64
43906
43907
WUFFS_BASE__GENERATED_C_CODE
43908
static wuffs_base__status
43909
wuffs_deflate__decoder__decode_huffman_fast64(
43910
    wuffs_deflate__decoder* self,
43911
    wuffs_base__io_buffer* a_dst,
43912
    wuffs_base__io_buffer* a_src) {
43913
  return (*self->private_impl.choosy_decode_huffman_fast64)(self, a_dst, a_src);
43914
}
43915
43916
WUFFS_BASE__GENERATED_C_CODE
43917
static wuffs_base__status
43918
wuffs_deflate__decoder__decode_huffman_fast64__choosy_default(
43919
    wuffs_deflate__decoder* self,
43920
    wuffs_base__io_buffer* a_dst,
43921
    wuffs_base__io_buffer* a_src) {
43922
  wuffs_base__status status = wuffs_base__make_status(NULL);
43923
43924
  uint64_t v_bits = 0;
43925
  uint32_t v_n_bits = 0;
43926
  uint32_t v_table_entry = 0;
43927
  uint32_t v_table_entry_n_bits = 0;
43928
  uint64_t v_lmask = 0;
43929
  uint64_t v_dmask = 0;
43930
  uint32_t v_redir_top = 0;
43931
  uint32_t v_redir_mask = 0;
43932
  uint32_t v_length = 0;
43933
  uint32_t v_dist_minus_1 = 0;
43934
  uint32_t v_hlen = 0;
43935
  uint32_t v_hdist = 0;
43936
  uint32_t v_hdist_adjustment = 0;
43937
43938
  uint8_t* iop_a_dst = NULL;
43939
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
43940
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
43941
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
43942
  if (a_dst && a_dst->data.ptr) {
43943
    io0_a_dst = a_dst->data.ptr;
43944
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
43945
    iop_a_dst = io1_a_dst;
43946
    io2_a_dst = io0_a_dst + a_dst->data.len;
43947
    if (a_dst->meta.closed) {
43948
      io2_a_dst = iop_a_dst;
43949
    }
43950
  }
43951
  const uint8_t* iop_a_src = NULL;
43952
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
43953
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
43954
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
43955
  if (a_src && a_src->data.ptr) {
43956
    io0_a_src = a_src->data.ptr;
43957
    io1_a_src = io0_a_src + a_src->meta.ri;
43958
    iop_a_src = io1_a_src;
43959
    io2_a_src = io0_a_src + a_src->meta.wi;
43960
  }
43961
43962
  if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) {
43963
    status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits);
43964
    goto exit;
43965
  }
43966
  v_bits = ((uint64_t)(self->private_impl.f_bits));
43967
  v_n_bits = self->private_impl.f_n_bits;
43968
  v_lmask = ((((uint64_t)(1u)) << self->private_impl.f_n_huffs_bits[0u]) - 1u);
43969
  v_dmask = ((((uint64_t)(1u)) << self->private_impl.f_n_huffs_bits[1u]) - 1u);
43970
  if (self->private_impl.f_transformed_history_count < (a_dst ? a_dst->meta.pos : 0u)) {
43971
    status = wuffs_base__make_status(wuffs_base__error__bad_i_o_position);
43972
    goto exit;
43973
  }
43974
  v_hdist_adjustment = ((uint32_t)((self->private_impl.f_transformed_history_count - (a_dst ? a_dst->meta.pos : 0u))));
43975
  label__loop__continue:;
43976
  while ((((uint64_t)(io2_a_dst - iop_a_dst)) >= 266u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 8u)) {
43977
    v_bits |= ((uint64_t)(wuffs_base__peek_u64le__no_bounds_check(iop_a_src) << (v_n_bits & 63u)));
43978
    iop_a_src += ((63u - (v_n_bits & 63u)) >> 3u);
43979
    v_n_bits |= 56u;
43980
    v_table_entry = self->private_data.f_huffs[0u][(v_bits & v_lmask)];
43981
    v_table_entry_n_bits = (v_table_entry & 15u);
43982
    v_bits >>= v_table_entry_n_bits;
43983
    v_n_bits -= v_table_entry_n_bits;
43984
    if ((v_table_entry >> 31u) != 0u) {
43985
      (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1);
43986
      continue;
43987
    } else if ((v_table_entry >> 30u) != 0u) {
43988
    } else if ((v_table_entry >> 29u) != 0u) {
43989
      self->private_impl.f_end_of_block = true;
43990
      break;
43991
    } else if ((v_table_entry >> 28u) != 0u) {
43992
      v_redir_top = ((v_table_entry >> 8u) & 65535u);
43993
      v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u);
43994
      v_table_entry = self->private_data.f_huffs[0u][((v_redir_top + (((uint32_t)(v_bits)) & v_redir_mask)) & 1023u)];
43995
      v_table_entry_n_bits = (v_table_entry & 15u);
43996
      v_bits >>= v_table_entry_n_bits;
43997
      v_n_bits -= v_table_entry_n_bits;
43998
      if ((v_table_entry >> 31u) != 0u) {
43999
        (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1);
44000
        continue;
44001
      } else if ((v_table_entry >> 30u) != 0u) {
44002
      } else if ((v_table_entry >> 29u) != 0u) {
44003
        self->private_impl.f_end_of_block = true;
44004
        break;
44005
      } else if ((v_table_entry >> 28u) != 0u) {
44006
        status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
44007
        goto exit;
44008
      } else if ((v_table_entry >> 27u) != 0u) {
44009
        status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code);
44010
        goto exit;
44011
      } else {
44012
        status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
44013
        goto exit;
44014
      }
44015
    } else if ((v_table_entry >> 27u) != 0u) {
44016
      status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code);
44017
      goto exit;
44018
    } else {
44019
      status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
44020
      goto exit;
44021
    }
44022
    v_length = (((v_table_entry >> 8u) & 255u) + 3u);
44023
    v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u);
44024
    if (v_table_entry_n_bits > 0u) {
44025
      v_length = (((v_length + 253u + ((uint32_t)(((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U64(v_table_entry_n_bits))))) & 255u) + 3u);
44026
      v_bits >>= v_table_entry_n_bits;
44027
      v_n_bits -= v_table_entry_n_bits;
44028
    }
44029
    v_table_entry = self->private_data.f_huffs[1u][(v_bits & v_dmask)];
44030
    v_table_entry_n_bits = (v_table_entry & 15u);
44031
    v_bits >>= v_table_entry_n_bits;
44032
    v_n_bits -= v_table_entry_n_bits;
44033
    if ((v_table_entry >> 28u) == 1u) {
44034
      v_redir_top = ((v_table_entry >> 8u) & 65535u);
44035
      v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u);
44036
      v_table_entry = self->private_data.f_huffs[1u][((v_redir_top + (((uint32_t)(v_bits)) & v_redir_mask)) & 1023u)];
44037
      v_table_entry_n_bits = (v_table_entry & 15u);
44038
      v_bits >>= v_table_entry_n_bits;
44039
      v_n_bits -= v_table_entry_n_bits;
44040
    }
44041
    if ((v_table_entry >> 24u) != 64u) {
44042
      if ((v_table_entry >> 24u) == 8u) {
44043
        status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code);
44044
        goto exit;
44045
      }
44046
      status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
44047
      goto exit;
44048
    }
44049
    v_dist_minus_1 = ((v_table_entry >> 8u) & 32767u);
44050
    v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u);
44051
    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);
44052
    v_bits >>= v_table_entry_n_bits;
44053
    v_n_bits -= v_table_entry_n_bits;
44054
    do {
44055
      if (((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) {
44056
        v_hlen = 0u;
44057
        v_hdist = ((uint32_t)((((uint64_t)((v_dist_minus_1 + 1u))) - ((uint64_t)(iop_a_dst - io0_a_dst)))));
44058
        if (v_length > v_hdist) {
44059
          v_length -= v_hdist;
44060
          v_hlen = v_hdist;
44061
        } else {
44062
          v_hlen = v_length;
44063
          v_length = 0u;
44064
        }
44065
        v_hdist += v_hdist_adjustment;
44066
        if (self->private_impl.f_history_index < v_hdist) {
44067
          status = wuffs_base__make_status(wuffs_deflate__error__bad_distance);
44068
          goto exit;
44069
        }
44070
        wuffs_private_impl__io_writer__limited_copy_u32_from_slice(
44071
            &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));
44072
        if (v_length == 0u) {
44073
          goto label__loop__continue;
44074
        }
44075
        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)))) {
44076
          status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_distance);
44077
          goto exit;
44078
        }
44079
      }
44080
      if ((v_dist_minus_1 + 1u) >= 8u) {
44081
        wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast(
44082
            &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u));
44083
      } else if ((v_dist_minus_1 + 1u) == 1u) {
44084
        wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast(
44085
            &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u));
44086
      } else {
44087
        wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast(
44088
            &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u));
44089
      }
44090
    } while (0);
44091
  }
44092
  if (v_n_bits > 63u) {
44093
    status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits);
44094
    goto exit;
44095
  }
44096
  while (v_n_bits >= 8u) {
44097
    v_n_bits -= 8u;
44098
    if (iop_a_src > io1_a_src) {
44099
      iop_a_src--;
44100
    } else {
44101
      status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_i_o);
44102
      goto exit;
44103
    }
44104
  }
44105
  self->private_impl.f_bits = ((uint32_t)((v_bits & ((((uint64_t)(1u)) << v_n_bits) - 1u))));
44106
  self->private_impl.f_n_bits = v_n_bits;
44107
  if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> self->private_impl.f_n_bits) != 0u)) {
44108
    status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits);
44109
    goto exit;
44110
  }
44111
  goto exit;
44112
  exit:
44113
  if (a_dst && a_dst->data.ptr) {
44114
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
44115
  }
44116
  if (a_src && a_src->data.ptr) {
44117
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
44118
  }
44119
44120
  return status;
44121
}
44122
44123
// -------- func deflate.decoder.decode_huffman_slow
44124
44125
WUFFS_BASE__GENERATED_C_CODE
44126
static wuffs_base__status
44127
wuffs_deflate__decoder__decode_huffman_slow(
44128
    wuffs_deflate__decoder* self,
44129
    wuffs_base__io_buffer* a_dst,
44130
    wuffs_base__io_buffer* a_src) {
44131
  wuffs_base__status status = wuffs_base__make_status(NULL);
44132
44133
  uint32_t v_bits = 0;
44134
  uint32_t v_n_bits = 0;
44135
  uint32_t v_table_entry = 0;
44136
  uint32_t v_table_entry_n_bits = 0;
44137
  uint32_t v_lmask = 0;
44138
  uint32_t v_dmask = 0;
44139
  uint32_t v_b0 = 0;
44140
  uint32_t v_redir_top = 0;
44141
  uint32_t v_redir_mask = 0;
44142
  uint32_t v_b1 = 0;
44143
  uint32_t v_length = 0;
44144
  uint32_t v_b2 = 0;
44145
  uint32_t v_b3 = 0;
44146
  uint32_t v_b4 = 0;
44147
  uint32_t v_dist_minus_1 = 0;
44148
  uint32_t v_b5 = 0;
44149
  uint32_t v_n_copied = 0;
44150
  uint32_t v_hlen = 0;
44151
  uint32_t v_hdist = 0;
44152
44153
  uint8_t* iop_a_dst = NULL;
44154
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
44155
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
44156
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
44157
  if (a_dst && a_dst->data.ptr) {
44158
    io0_a_dst = a_dst->data.ptr;
44159
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
44160
    iop_a_dst = io1_a_dst;
44161
    io2_a_dst = io0_a_dst + a_dst->data.len;
44162
    if (a_dst->meta.closed) {
44163
      io2_a_dst = iop_a_dst;
44164
    }
44165
  }
44166
  const uint8_t* iop_a_src = NULL;
44167
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
44168
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
44169
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
44170
  if (a_src && a_src->data.ptr) {
44171
    io0_a_src = a_src->data.ptr;
44172
    io1_a_src = io0_a_src + a_src->meta.ri;
44173
    iop_a_src = io1_a_src;
44174
    io2_a_src = io0_a_src + a_src->meta.wi;
44175
  }
44176
44177
  uint32_t coro_susp_point = self->private_impl.p_decode_huffman_slow;
44178
  if (coro_susp_point) {
44179
    v_bits = self->private_data.s_decode_huffman_slow.v_bits;
44180
    v_n_bits = self->private_data.s_decode_huffman_slow.v_n_bits;
44181
    v_table_entry_n_bits = self->private_data.s_decode_huffman_slow.v_table_entry_n_bits;
44182
    v_lmask = self->private_data.s_decode_huffman_slow.v_lmask;
44183
    v_dmask = self->private_data.s_decode_huffman_slow.v_dmask;
44184
    v_redir_top = self->private_data.s_decode_huffman_slow.v_redir_top;
44185
    v_redir_mask = self->private_data.s_decode_huffman_slow.v_redir_mask;
44186
    v_length = self->private_data.s_decode_huffman_slow.v_length;
44187
    v_dist_minus_1 = self->private_data.s_decode_huffman_slow.v_dist_minus_1;
44188
  }
44189
  switch (coro_susp_point) {
44190
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
44191
44192
    if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) {
44193
      status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits);
44194
      goto exit;
44195
    }
44196
    v_bits = self->private_impl.f_bits;
44197
    v_n_bits = self->private_impl.f_n_bits;
44198
    v_lmask = ((((uint32_t)(1u)) << self->private_impl.f_n_huffs_bits[0u]) - 1u);
44199
    v_dmask = ((((uint32_t)(1u)) << self->private_impl.f_n_huffs_bits[1u]) - 1u);
44200
    label__loop__continue:;
44201
    while ( ! (self->private_impl.p_decode_huffman_slow != 0)) {
44202
      while (true) {
44203
        v_table_entry = self->private_data.f_huffs[0u][(v_bits & v_lmask)];
44204
        v_table_entry_n_bits = (v_table_entry & 15u);
44205
        if (v_n_bits >= v_table_entry_n_bits) {
44206
          v_bits >>= v_table_entry_n_bits;
44207
          v_n_bits -= v_table_entry_n_bits;
44208
          break;
44209
        }
44210
        {
44211
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
44212
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
44213
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
44214
            goto suspend;
44215
          }
44216
          uint32_t t_0 = *iop_a_src++;
44217
          v_b0 = t_0;
44218
        }
44219
        v_bits |= (v_b0 << v_n_bits);
44220
        v_n_bits += 8u;
44221
      }
44222
      if ((v_table_entry >> 31u) != 0u) {
44223
        self->private_data.s_decode_huffman_slow.scratch = ((uint8_t)((v_table_entry >> 8u)));
44224
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
44225
        if (iop_a_dst == io2_a_dst) {
44226
          status = wuffs_base__make_status(wuffs_base__suspension__short_write);
44227
          goto suspend;
44228
        }
44229
        *iop_a_dst++ = ((uint8_t)(self->private_data.s_decode_huffman_slow.scratch));
44230
        continue;
44231
      } else if ((v_table_entry >> 30u) != 0u) {
44232
      } else if ((v_table_entry >> 29u) != 0u) {
44233
        self->private_impl.f_end_of_block = true;
44234
        break;
44235
      } else if ((v_table_entry >> 28u) != 0u) {
44236
        v_redir_top = ((v_table_entry >> 8u) & 65535u);
44237
        v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u);
44238
        while (true) {
44239
          v_table_entry = self->private_data.f_huffs[0u][((v_redir_top + (v_bits & v_redir_mask)) & 1023u)];
44240
          v_table_entry_n_bits = (v_table_entry & 15u);
44241
          if (v_n_bits >= v_table_entry_n_bits) {
44242
            v_bits >>= v_table_entry_n_bits;
44243
            v_n_bits -= v_table_entry_n_bits;
44244
            break;
44245
          }
44246
          {
44247
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
44248
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
44249
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
44250
              goto suspend;
44251
            }
44252
            uint32_t t_1 = *iop_a_src++;
44253
            v_b1 = t_1;
44254
          }
44255
          v_bits |= (v_b1 << v_n_bits);
44256
          v_n_bits += 8u;
44257
        }
44258
        if ((v_table_entry >> 31u) != 0u) {
44259
          self->private_data.s_decode_huffman_slow.scratch = ((uint8_t)((v_table_entry >> 8u)));
44260
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
44261
          if (iop_a_dst == io2_a_dst) {
44262
            status = wuffs_base__make_status(wuffs_base__suspension__short_write);
44263
            goto suspend;
44264
          }
44265
          *iop_a_dst++ = ((uint8_t)(self->private_data.s_decode_huffman_slow.scratch));
44266
          continue;
44267
        } else if ((v_table_entry >> 30u) != 0u) {
44268
        } else if ((v_table_entry >> 29u) != 0u) {
44269
          self->private_impl.f_end_of_block = true;
44270
          break;
44271
        } else if ((v_table_entry >> 28u) != 0u) {
44272
          status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
44273
          goto exit;
44274
        } else if ((v_table_entry >> 27u) != 0u) {
44275
          status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code);
44276
          goto exit;
44277
        } else {
44278
          status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
44279
          goto exit;
44280
        }
44281
      } else if ((v_table_entry >> 27u) != 0u) {
44282
        status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code);
44283
        goto exit;
44284
      } else {
44285
        status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
44286
        goto exit;
44287
      }
44288
      v_length = (((v_table_entry >> 8u) & 255u) + 3u);
44289
      v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u);
44290
      if (v_table_entry_n_bits > 0u) {
44291
        while (v_n_bits < v_table_entry_n_bits) {
44292
          {
44293
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
44294
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
44295
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
44296
              goto suspend;
44297
            }
44298
            uint32_t t_2 = *iop_a_src++;
44299
            v_b2 = t_2;
44300
          }
44301
          v_bits |= (v_b2 << v_n_bits);
44302
          v_n_bits += 8u;
44303
        }
44304
        v_length = (((v_length + 253u + ((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(v_table_entry_n_bits))) & 255u) + 3u);
44305
        v_bits >>= v_table_entry_n_bits;
44306
        v_n_bits -= v_table_entry_n_bits;
44307
      }
44308
      while (true) {
44309
        v_table_entry = self->private_data.f_huffs[1u][(v_bits & v_dmask)];
44310
        v_table_entry_n_bits = (v_table_entry & 15u);
44311
        if (v_n_bits >= v_table_entry_n_bits) {
44312
          v_bits >>= v_table_entry_n_bits;
44313
          v_n_bits -= v_table_entry_n_bits;
44314
          break;
44315
        }
44316
        {
44317
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
44318
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
44319
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
44320
            goto suspend;
44321
          }
44322
          uint32_t t_3 = *iop_a_src++;
44323
          v_b3 = t_3;
44324
        }
44325
        v_bits |= (v_b3 << v_n_bits);
44326
        v_n_bits += 8u;
44327
      }
44328
      if ((v_table_entry >> 28u) == 1u) {
44329
        v_redir_top = ((v_table_entry >> 8u) & 65535u);
44330
        v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u);
44331
        while (true) {
44332
          v_table_entry = self->private_data.f_huffs[1u][((v_redir_top + (v_bits & v_redir_mask)) & 1023u)];
44333
          v_table_entry_n_bits = (v_table_entry & 15u);
44334
          if (v_n_bits >= v_table_entry_n_bits) {
44335
            v_bits >>= v_table_entry_n_bits;
44336
            v_n_bits -= v_table_entry_n_bits;
44337
            break;
44338
          }
44339
          {
44340
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
44341
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
44342
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
44343
              goto suspend;
44344
            }
44345
            uint32_t t_4 = *iop_a_src++;
44346
            v_b4 = t_4;
44347
          }
44348
          v_bits |= (v_b4 << v_n_bits);
44349
          v_n_bits += 8u;
44350
        }
44351
      }
44352
      if ((v_table_entry >> 24u) != 64u) {
44353
        if ((v_table_entry >> 24u) == 8u) {
44354
          status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code);
44355
          goto exit;
44356
        }
44357
        status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
44358
        goto exit;
44359
      }
44360
      v_dist_minus_1 = ((v_table_entry >> 8u) & 32767u);
44361
      v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u);
44362
      if (v_table_entry_n_bits > 0u) {
44363
        while (v_n_bits < v_table_entry_n_bits) {
44364
          {
44365
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
44366
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
44367
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
44368
              goto suspend;
44369
            }
44370
            uint32_t t_5 = *iop_a_src++;
44371
            v_b5 = t_5;
44372
          }
44373
          v_bits |= (v_b5 << v_n_bits);
44374
          v_n_bits += 8u;
44375
        }
44376
        v_dist_minus_1 = ((v_dist_minus_1 + ((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(v_table_entry_n_bits))) & 32767u);
44377
        v_bits >>= v_table_entry_n_bits;
44378
        v_n_bits -= v_table_entry_n_bits;
44379
      }
44380
      while (true) {
44381
        if (((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) {
44382
          v_hdist = ((uint32_t)((((uint64_t)((v_dist_minus_1 + 1u))) - ((uint64_t)(iop_a_dst - io0_a_dst)))));
44383
          if (v_hdist < v_length) {
44384
            v_hlen = v_hdist;
44385
          } else {
44386
            v_hlen = v_length;
44387
          }
44388
          v_hdist += ((uint32_t)(((uint64_t)(self->private_impl.f_transformed_history_count - (a_dst ? a_dst->meta.pos : 0u)))));
44389
          if (self->private_impl.f_history_index < v_hdist) {
44390
            status = wuffs_base__make_status(wuffs_deflate__error__bad_distance);
44391
            goto exit;
44392
          }
44393
          v_n_copied = wuffs_private_impl__io_writer__limited_copy_u32_from_slice(
44394
              &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));
44395
          if (v_n_copied < v_hlen) {
44396
            v_length -= v_n_copied;
44397
            status = wuffs_base__make_status(wuffs_base__suspension__short_write);
44398
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9);
44399
            continue;
44400
          }
44401
          v_length -= v_hlen;
44402
          if (v_length == 0u) {
44403
            goto label__loop__continue;
44404
          }
44405
        }
44406
        v_n_copied = wuffs_private_impl__io_writer__limited_copy_u32_from_history(
44407
            &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u));
44408
        if (v_length <= v_n_copied) {
44409
          goto label__loop__continue;
44410
        }
44411
        v_length -= v_n_copied;
44412
        status = wuffs_base__make_status(wuffs_base__suspension__short_write);
44413
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10);
44414
      }
44415
    }
44416
    self->private_impl.f_bits = v_bits;
44417
    self->private_impl.f_n_bits = v_n_bits;
44418
    if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) {
44419
      status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits);
44420
      goto exit;
44421
    }
44422
44423
    ok:
44424
    self->private_impl.p_decode_huffman_slow = 0;
44425
    goto exit;
44426
  }
44427
44428
  goto suspend;
44429
  suspend:
44430
  self->private_impl.p_decode_huffman_slow = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
44431
  self->private_data.s_decode_huffman_slow.v_bits = v_bits;
44432
  self->private_data.s_decode_huffman_slow.v_n_bits = v_n_bits;
44433
  self->private_data.s_decode_huffman_slow.v_table_entry_n_bits = v_table_entry_n_bits;
44434
  self->private_data.s_decode_huffman_slow.v_lmask = v_lmask;
44435
  self->private_data.s_decode_huffman_slow.v_dmask = v_dmask;
44436
  self->private_data.s_decode_huffman_slow.v_redir_top = v_redir_top;
44437
  self->private_data.s_decode_huffman_slow.v_redir_mask = v_redir_mask;
44438
  self->private_data.s_decode_huffman_slow.v_length = v_length;
44439
  self->private_data.s_decode_huffman_slow.v_dist_minus_1 = v_dist_minus_1;
44440
44441
  goto exit;
44442
  exit:
44443
  if (a_dst && a_dst->data.ptr) {
44444
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
44445
  }
44446
  if (a_src && a_src->data.ptr) {
44447
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
44448
  }
44449
44450
  return status;
44451
}
44452
44453
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__DEFLATE)
44454
44455
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ETC2)
44456
44457
// ---------------- Status Codes Implementations
44458
44459
const char wuffs_etc2__error__bad_header[] = "#etc2: bad header";
44460
const char wuffs_etc2__error__truncated_input[] = "#etc2: truncated input";
44461
44462
// ---------------- Private Consts
44463
44464
static const uint32_t
44465
WUFFS_ETC2__DIFFS[8] WUFFS_BASE__POTENTIALLY_UNUSED = {
44466
  0u, 1u, 2u, 3u, 4294967292u, 4294967293u, 4294967294u, 4294967295u,
44467
};
44468
44469
static const uint32_t
44470
WUFFS_ETC2__MODIFIERS[16][4] WUFFS_BASE__POTENTIALLY_UNUSED = {
44471
  {
44472
    2u, 8u, 4294967294u, 4294967288u,
44473
  }, {
44474
    5u, 17u, 4294967291u, 4294967279u,
44475
  }, {
44476
    9u, 29u, 4294967287u, 4294967267u,
44477
  }, {
44478
    13u, 42u, 4294967283u, 4294967254u,
44479
  }, {
44480
    18u, 60u, 4294967278u, 4294967236u,
44481
  }, {
44482
    24u, 80u, 4294967272u, 4294967216u,
44483
  }, {
44484
    33u, 106u, 4294967263u, 4294967190u,
44485
  }, {
44486
    47u, 183u, 4294967249u, 4294967113u,
44487
  },
44488
  {
44489
    0u, 8u, 0u, 4294967288u,
44490
  }, {
44491
    0u, 17u, 0u, 4294967279u,
44492
  }, {
44493
    0u, 29u, 0u, 4294967267u,
44494
  }, {
44495
    0u, 42u, 0u, 4294967254u,
44496
  }, {
44497
    0u, 60u, 0u, 4294967236u,
44498
  }, {
44499
    0u, 80u, 0u, 4294967216u,
44500
  }, {
44501
    0u, 106u, 0u, 4294967190u,
44502
  }, {
44503
    0u, 183u, 0u, 4294967113u,
44504
  },
44505
};
44506
44507
static const uint8_t
44508
WUFFS_ETC2__T_H_MODIFIERS[8] WUFFS_BASE__POTENTIALLY_UNUSED = {
44509
  3u, 6u, 11u, 16u, 23u, 32u, 41u, 64u,
44510
};
44511
44512
static const uint32_t
44513
WUFFS_ETC2__ALPHA_MODIFIERS[16][8] WUFFS_BASE__POTENTIALLY_UNUSED = {
44514
  {
44515
    4294967293u, 4294967290u, 4294967287u, 4294967281u, 2u, 5u, 8u, 14u,
44516
  }, {
44517
    4294967293u, 4294967289u, 4294967286u, 4294967283u, 2u, 6u, 9u, 12u,
44518
  }, {
44519
    4294967294u, 4294967291u, 4294967288u, 4294967283u, 1u, 4u, 7u, 12u,
44520
  }, {
44521
    4294967294u, 4294967292u, 4294967290u, 4294967283u, 1u, 3u, 5u, 12u,
44522
  }, {
44523
    4294967293u, 4294967290u, 4294967288u, 4294967284u, 2u, 5u, 7u, 11u,
44524
  }, {
44525
    4294967293u, 4294967289u, 4294967287u, 4294967285u, 2u, 6u, 8u, 10u,
44526
  }, {
44527
    4294967292u, 4294967289u, 4294967288u, 4294967285u, 3u, 6u, 7u, 10u,
44528
  }, {
44529
    4294967293u, 4294967291u, 4294967288u, 4294967285u, 2u, 4u, 7u, 10u,
44530
  },
44531
  {
44532
    4294967294u, 4294967290u, 4294967288u, 4294967286u, 1u, 5u, 7u, 9u,
44533
  }, {
44534
    4294967294u, 4294967291u, 4294967288u, 4294967286u, 1u, 4u, 7u, 9u,
44535
  }, {
44536
    4294967294u, 4294967292u, 4294967288u, 4294967286u, 1u, 3u, 7u, 9u,
44537
  }, {
44538
    4294967294u, 4294967291u, 4294967289u, 4294967286u, 1u, 4u, 6u, 9u,
44539
  }, {
44540
    4294967293u, 4294967292u, 4294967289u, 4294967286u, 2u, 3u, 6u, 9u,
44541
  }, {
44542
    4294967295u, 4294967294u, 4294967293u, 4294967286u, 0u, 1u, 2u, 9u,
44543
  }, {
44544
    4294967292u, 4294967290u, 4294967288u, 4294967287u, 3u, 5u, 7u, 8u,
44545
  }, {
44546
    4294967293u, 4294967291u, 4294967289u, 4294967287u, 2u, 4u, 6u, 8u,
44547
  },
44548
};
44549
44550
static const uint8_t
44551
WUFFS_ETC2__CLAMP[1024] WUFFS_BASE__POTENTIALLY_UNUSED = {
44552
  0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u,
44553
  8u, 9u, 10u, 11u, 12u, 13u, 14u, 15u,
44554
  16u, 17u, 18u, 19u, 20u, 21u, 22u, 23u,
44555
  24u, 25u, 26u, 27u, 28u, 29u, 30u, 31u,
44556
  32u, 33u, 34u, 35u, 36u, 37u, 38u, 39u,
44557
  40u, 41u, 42u, 43u, 44u, 45u, 46u, 47u,
44558
  48u, 49u, 50u, 51u, 52u, 53u, 54u, 55u,
44559
  56u, 57u, 58u, 59u, 60u, 61u, 62u, 63u,
44560
  64u, 65u, 66u, 67u, 68u, 69u, 70u, 71u,
44561
  72u, 73u, 74u, 75u, 76u, 77u, 78u, 79u,
44562
  80u, 81u, 82u, 83u, 84u, 85u, 86u, 87u,
44563
  88u, 89u, 90u, 91u, 92u, 93u, 94u, 95u,
44564
  96u, 97u, 98u, 99u, 100u, 101u, 102u, 103u,
44565
  104u, 105u, 106u, 107u, 108u, 109u, 110u, 111u,
44566
  112u, 113u, 114u, 115u, 116u, 117u, 118u, 119u,
44567
  120u, 121u, 122u, 123u, 124u, 125u, 126u, 127u,
44568
  128u, 129u, 130u, 131u, 132u, 133u, 134u, 135u,
44569
  136u, 137u, 138u, 139u, 140u, 141u, 142u, 143u,
44570
  144u, 145u, 146u, 147u, 148u, 149u, 150u, 151u,
44571
  152u, 153u, 154u, 155u, 156u, 157u, 158u, 159u,
44572
  160u, 161u, 162u, 163u, 164u, 165u, 166u, 167u,
44573
  168u, 169u, 170u, 171u, 172u, 173u, 174u, 175u,
44574
  176u, 177u, 178u, 179u, 180u, 181u, 182u, 183u,
44575
  184u, 185u, 186u, 187u, 188u, 189u, 190u, 191u,
44576
  192u, 193u, 194u, 195u, 196u, 197u, 198u, 199u,
44577
  200u, 201u, 202u, 203u, 204u, 205u, 206u, 207u,
44578
  208u, 209u, 210u, 211u, 212u, 213u, 214u, 215u,
44579
  216u, 217u, 218u, 219u, 220u, 221u, 222u, 223u,
44580
  224u, 225u, 226u, 227u, 228u, 229u, 230u, 231u,
44581
  232u, 233u, 234u, 235u, 236u, 237u, 238u, 239u,
44582
  240u, 241u, 242u, 243u, 244u, 245u, 246u, 247u,
44583
  248u, 249u, 250u, 251u, 252u, 253u, 254u, 255u,
44584
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
44585
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
44586
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
44587
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
44588
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
44589
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
44590
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
44591
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
44592
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
44593
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
44594
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
44595
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
44596
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
44597
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
44598
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
44599
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
44600
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
44601
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
44602
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
44603
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
44604
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
44605
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
44606
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
44607
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
44608
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
44609
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
44610
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
44611
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
44612
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
44613
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
44614
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
44615
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
44616
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44617
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44618
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44619
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44620
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44621
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44622
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44623
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44624
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44625
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44626
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44627
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44628
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44629
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44630
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44631
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44632
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44633
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44634
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44635
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44636
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44637
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44638
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44639
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44640
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44641
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44642
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44643
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44644
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44645
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44646
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44647
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44648
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44649
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44650
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44651
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44652
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44653
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44654
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44655
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44656
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44657
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44658
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44659
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44660
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44661
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44662
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44663
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44664
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44665
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44666
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44667
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44668
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44669
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44670
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44671
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44672
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44673
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44674
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44675
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44676
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44677
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44678
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44679
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
44680
};
44681
44682
// ---------------- Private Initializer Prototypes
44683
44684
// ---------------- Private Function Prototypes
44685
44686
WUFFS_BASE__GENERATED_C_CODE
44687
static wuffs_base__status
44688
wuffs_etc2__decoder__do_decode_image_config(
44689
    wuffs_etc2__decoder* self,
44690
    wuffs_base__image_config* a_dst,
44691
    wuffs_base__io_buffer* a_src);
44692
44693
WUFFS_BASE__GENERATED_C_CODE
44694
static wuffs_base__status
44695
wuffs_etc2__decoder__do_decode_frame_config(
44696
    wuffs_etc2__decoder* self,
44697
    wuffs_base__frame_config* a_dst,
44698
    wuffs_base__io_buffer* a_src);
44699
44700
WUFFS_BASE__GENERATED_C_CODE
44701
static wuffs_base__status
44702
wuffs_etc2__decoder__do_decode_frame(
44703
    wuffs_etc2__decoder* self,
44704
    wuffs_base__pixel_buffer* a_dst,
44705
    wuffs_base__io_buffer* a_src,
44706
    wuffs_base__pixel_blend a_blend,
44707
    wuffs_base__slice_u8 a_workbuf,
44708
    wuffs_base__decode_frame_options* a_opts);
44709
44710
WUFFS_BASE__GENERATED_C_CODE
44711
static wuffs_base__status
44712
wuffs_etc2__decoder__from_src_to_colors(
44713
    wuffs_etc2__decoder* self,
44714
    wuffs_base__io_buffer* a_src);
44715
44716
WUFFS_BASE__GENERATED_C_CODE
44717
static wuffs_base__empty_struct
44718
wuffs_etc2__decoder__from_colors_to_buffer(
44719
    wuffs_etc2__decoder* self);
44720
44721
WUFFS_BASE__GENERATED_C_CODE
44722
static wuffs_base__empty_struct
44723
wuffs_etc2__decoder__from_colors_to_buffer__choosy_default(
44724
    wuffs_etc2__decoder* self);
44725
44726
WUFFS_BASE__GENERATED_C_CODE
44727
static wuffs_base__empty_struct
44728
wuffs_etc2__decoder__decode_t_mode(
44729
    wuffs_etc2__decoder* self,
44730
    uint64_t a_bits,
44731
    uint32_t a_offset,
44732
    bool a_transparent);
44733
44734
WUFFS_BASE__GENERATED_C_CODE
44735
static wuffs_base__empty_struct
44736
wuffs_etc2__decoder__decode_h_mode(
44737
    wuffs_etc2__decoder* self,
44738
    uint64_t a_bits,
44739
    uint32_t a_offset,
44740
    bool a_transparent);
44741
44742
WUFFS_BASE__GENERATED_C_CODE
44743
static wuffs_base__empty_struct
44744
wuffs_etc2__decoder__decode_planar_mode(
44745
    wuffs_etc2__decoder* self,
44746
    uint64_t a_bits,
44747
    uint32_t a_offset);
44748
44749
WUFFS_BASE__GENERATED_C_CODE
44750
static wuffs_base__empty_struct
44751
wuffs_etc2__decoder__decode_half_block(
44752
    wuffs_etc2__decoder* self,
44753
    uint32_t a_bits,
44754
    uint32_t a_offset,
44755
    uint32_t a_which,
44756
    uint32_t a_r,
44757
    uint32_t a_g,
44758
    uint32_t a_b,
44759
    bool a_flip,
44760
    bool a_transparent,
44761
    bool a_second);
44762
44763
WUFFS_BASE__GENERATED_C_CODE
44764
static wuffs_base__empty_struct
44765
wuffs_etc2__decoder__from_alphas_to_buffer(
44766
    wuffs_etc2__decoder* self);
44767
44768
WUFFS_BASE__GENERATED_C_CODE
44769
static wuffs_base__empty_struct
44770
wuffs_etc2__decoder__from_colors_to_buffer_r11u(
44771
    wuffs_etc2__decoder* self);
44772
44773
WUFFS_BASE__GENERATED_C_CODE
44774
static wuffs_base__empty_struct
44775
wuffs_etc2__decoder__from_colors_to_buffer_r11s(
44776
    wuffs_etc2__decoder* self);
44777
44778
WUFFS_BASE__GENERATED_C_CODE
44779
static wuffs_base__empty_struct
44780
wuffs_etc2__decoder__from_colors_to_buffer_rg11u(
44781
    wuffs_etc2__decoder* self);
44782
44783
WUFFS_BASE__GENERATED_C_CODE
44784
static wuffs_base__empty_struct
44785
wuffs_etc2__decoder__from_colors_to_buffer_rg11s(
44786
    wuffs_etc2__decoder* self);
44787
44788
WUFFS_BASE__GENERATED_C_CODE
44789
static wuffs_base__empty_struct
44790
wuffs_etc2__decoder__from_colors_to_buffer_unsigned(
44791
    wuffs_etc2__decoder* self,
44792
    uint32_t a_input,
44793
    uint32_t a_dst_bytes_per_pixel,
44794
    uint32_t a_offset_adjustment);
44795
44796
WUFFS_BASE__GENERATED_C_CODE
44797
static wuffs_base__empty_struct
44798
wuffs_etc2__decoder__from_colors_to_buffer_signed(
44799
    wuffs_etc2__decoder* self,
44800
    uint32_t a_input,
44801
    uint32_t a_dst_bytes_per_pixel,
44802
    uint32_t a_offset_adjustment);
44803
44804
WUFFS_BASE__GENERATED_C_CODE
44805
static wuffs_base__status
44806
wuffs_etc2__decoder__from_buffer_to_dst(
44807
    wuffs_etc2__decoder* self,
44808
    wuffs_base__pixel_buffer* a_dst);
44809
44810
// ---------------- VTables
44811
44812
const wuffs_base__image_decoder__func_ptrs
44813
wuffs_etc2__decoder__func_ptrs_for__wuffs_base__image_decoder = {
44814
  (wuffs_base__status(*)(void*,
44815
      wuffs_base__pixel_buffer*,
44816
      wuffs_base__io_buffer*,
44817
      wuffs_base__pixel_blend,
44818
      wuffs_base__slice_u8,
44819
      wuffs_base__decode_frame_options*))(&wuffs_etc2__decoder__decode_frame),
44820
  (wuffs_base__status(*)(void*,
44821
      wuffs_base__frame_config*,
44822
      wuffs_base__io_buffer*))(&wuffs_etc2__decoder__decode_frame_config),
44823
  (wuffs_base__status(*)(void*,
44824
      wuffs_base__image_config*,
44825
      wuffs_base__io_buffer*))(&wuffs_etc2__decoder__decode_image_config),
44826
  (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_etc2__decoder__frame_dirty_rect),
44827
  (uint64_t(*)(const void*,
44828
      uint32_t))(&wuffs_etc2__decoder__get_quirk),
44829
  (uint32_t(*)(const void*))(&wuffs_etc2__decoder__num_animation_loops),
44830
  (uint64_t(*)(const void*))(&wuffs_etc2__decoder__num_decoded_frame_configs),
44831
  (uint64_t(*)(const void*))(&wuffs_etc2__decoder__num_decoded_frames),
44832
  (wuffs_base__status(*)(void*,
44833
      uint64_t,
44834
      uint64_t))(&wuffs_etc2__decoder__restart_frame),
44835
  (wuffs_base__status(*)(void*,
44836
      uint32_t,
44837
      uint64_t))(&wuffs_etc2__decoder__set_quirk),
44838
  (wuffs_base__empty_struct(*)(void*,
44839
      uint32_t,
44840
      bool))(&wuffs_etc2__decoder__set_report_metadata),
44841
  (wuffs_base__status(*)(void*,
44842
      wuffs_base__io_buffer*,
44843
      wuffs_base__more_information*,
44844
      wuffs_base__io_buffer*))(&wuffs_etc2__decoder__tell_me_more),
44845
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_etc2__decoder__workbuf_len),
44846
};
44847
44848
// ---------------- Initializer Implementations
44849
44850
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
44851
wuffs_etc2__decoder__initialize(
44852
    wuffs_etc2__decoder* self,
44853
    size_t sizeof_star_self,
44854
    uint64_t wuffs_version,
44855
    uint32_t options){
44856
  if (!self) {
44857
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
44858
  }
44859
  if (sizeof(*self) != sizeof_star_self) {
44860
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
44861
  }
44862
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
44863
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
44864
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
44865
  }
44866
44867
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
44868
    // The whole point of this if-check is to detect an uninitialized *self.
44869
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
44870
#if !defined(__clang__) && defined(__GNUC__)
44871
#pragma GCC diagnostic push
44872
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
44873
#endif
44874
    if (self->private_impl.magic != 0) {
44875
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
44876
    }
44877
#if !defined(__clang__) && defined(__GNUC__)
44878
#pragma GCC diagnostic pop
44879
#endif
44880
  } else {
44881
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
44882
      memset(self, 0, sizeof(*self));
44883
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
44884
    } else {
44885
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
44886
    }
44887
  }
44888
44889
  self->private_impl.choosy_from_colors_to_buffer = &wuffs_etc2__decoder__from_colors_to_buffer__choosy_default;
44890
44891
  self->private_impl.magic = WUFFS_BASE__MAGIC;
44892
  self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name =
44893
      wuffs_base__image_decoder__vtable_name;
44894
  self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers =
44895
      (const void*)(&wuffs_etc2__decoder__func_ptrs_for__wuffs_base__image_decoder);
44896
  return wuffs_base__make_status(NULL);
44897
}
44898
44899
wuffs_etc2__decoder*
44900
wuffs_etc2__decoder__alloc(void) {
44901
  wuffs_etc2__decoder* x =
44902
      (wuffs_etc2__decoder*)(calloc(1, sizeof(wuffs_etc2__decoder)));
44903
  if (!x) {
44904
    return NULL;
44905
  }
44906
  if (wuffs_etc2__decoder__initialize(
44907
      x, sizeof(wuffs_etc2__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
44908
    free(x);
44909
    return NULL;
44910
  }
44911
  return x;
44912
}
44913
44914
size_t
44915
sizeof__wuffs_etc2__decoder(void) {
44916
  return sizeof(wuffs_etc2__decoder);
44917
}
44918
44919
// ---------------- Function Implementations
44920
44921
// -------- func etc2.decoder.get_quirk
44922
44923
WUFFS_BASE__GENERATED_C_CODE
44924
WUFFS_BASE__MAYBE_STATIC uint64_t
44925
wuffs_etc2__decoder__get_quirk(
44926
    const wuffs_etc2__decoder* self,
44927
    uint32_t a_key) {
44928
  if (!self) {
44929
    return 0;
44930
  }
44931
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
44932
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
44933
    return 0;
44934
  }
44935
44936
  return 0u;
44937
}
44938
44939
// -------- func etc2.decoder.set_quirk
44940
44941
WUFFS_BASE__GENERATED_C_CODE
44942
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
44943
wuffs_etc2__decoder__set_quirk(
44944
    wuffs_etc2__decoder* self,
44945
    uint32_t a_key,
44946
    uint64_t a_value) {
44947
  if (!self) {
44948
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
44949
  }
44950
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
44951
    return wuffs_base__make_status(
44952
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
44953
        ? wuffs_base__error__disabled_by_previous_error
44954
        : wuffs_base__error__initialize_not_called);
44955
  }
44956
44957
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
44958
}
44959
44960
// -------- func etc2.decoder.decode_image_config
44961
44962
WUFFS_BASE__GENERATED_C_CODE
44963
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
44964
wuffs_etc2__decoder__decode_image_config(
44965
    wuffs_etc2__decoder* self,
44966
    wuffs_base__image_config* a_dst,
44967
    wuffs_base__io_buffer* a_src) {
44968
  if (!self) {
44969
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
44970
  }
44971
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
44972
    return wuffs_base__make_status(
44973
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
44974
        ? wuffs_base__error__disabled_by_previous_error
44975
        : wuffs_base__error__initialize_not_called);
44976
  }
44977
  if (!a_src) {
44978
    self->private_impl.magic = WUFFS_BASE__DISABLED;
44979
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
44980
  }
44981
  if ((self->private_impl.active_coroutine != 0) &&
44982
      (self->private_impl.active_coroutine != 1)) {
44983
    self->private_impl.magic = WUFFS_BASE__DISABLED;
44984
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
44985
  }
44986
  self->private_impl.active_coroutine = 0;
44987
  wuffs_base__status status = wuffs_base__make_status(NULL);
44988
44989
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
44990
44991
  uint32_t coro_susp_point = self->private_impl.p_decode_image_config;
44992
  switch (coro_susp_point) {
44993
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
44994
44995
    while (true) {
44996
      {
44997
        wuffs_base__status t_0 = wuffs_etc2__decoder__do_decode_image_config(self, a_dst, a_src);
44998
        v_status = t_0;
44999
      }
45000
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
45001
        status = wuffs_base__make_status(wuffs_etc2__error__truncated_input);
45002
        goto exit;
45003
      }
45004
      status = v_status;
45005
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
45006
    }
45007
45008
    ok:
45009
    self->private_impl.p_decode_image_config = 0;
45010
    goto exit;
45011
  }
45012
45013
  goto suspend;
45014
  suspend:
45015
  self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
45016
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
45017
45018
  goto exit;
45019
  exit:
45020
  if (wuffs_base__status__is_error(&status)) {
45021
    self->private_impl.magic = WUFFS_BASE__DISABLED;
45022
  }
45023
  return status;
45024
}
45025
45026
// -------- func etc2.decoder.do_decode_image_config
45027
45028
WUFFS_BASE__GENERATED_C_CODE
45029
static wuffs_base__status
45030
wuffs_etc2__decoder__do_decode_image_config(
45031
    wuffs_etc2__decoder* self,
45032
    wuffs_base__image_config* a_dst,
45033
    wuffs_base__io_buffer* a_src) {
45034
  wuffs_base__status status = wuffs_base__make_status(NULL);
45035
45036
  uint32_t v_c32 = 0;
45037
  uint32_t v_i = 0;
45038
  uint16_t v_rounded_up_width = 0;
45039
  uint16_t v_rounded_up_height = 0;
45040
45041
  const uint8_t* iop_a_src = NULL;
45042
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
45043
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
45044
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
45045
  if (a_src && a_src->data.ptr) {
45046
    io0_a_src = a_src->data.ptr;
45047
    io1_a_src = io0_a_src + a_src->meta.ri;
45048
    iop_a_src = io1_a_src;
45049
    io2_a_src = io0_a_src + a_src->meta.wi;
45050
  }
45051
45052
  uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config;
45053
  if (coro_susp_point) {
45054
    v_rounded_up_width = self->private_data.s_do_decode_image_config.v_rounded_up_width;
45055
    v_rounded_up_height = self->private_data.s_do_decode_image_config.v_rounded_up_height;
45056
  }
45057
  switch (coro_susp_point) {
45058
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
45059
45060
    if (self->private_impl.f_call_sequence != 0u) {
45061
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
45062
      goto exit;
45063
    }
45064
    {
45065
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
45066
      uint32_t t_0;
45067
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
45068
        t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
45069
        iop_a_src += 4;
45070
      } else {
45071
        self->private_data.s_do_decode_image_config.scratch = 0;
45072
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
45073
        while (true) {
45074
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
45075
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
45076
            goto suspend;
45077
          }
45078
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
45079
          uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
45080
          *scratch <<= 8;
45081
          *scratch >>= 8;
45082
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
45083
          if (num_bits_0 == 24) {
45084
            t_0 = ((uint32_t)(*scratch));
45085
            break;
45086
          }
45087
          num_bits_0 += 8u;
45088
          *scratch |= ((uint64_t)(num_bits_0)) << 56;
45089
        }
45090
      }
45091
      v_c32 = t_0;
45092
    }
45093
    if (v_c32 != 541936464u) {
45094
      status = wuffs_base__make_status(wuffs_etc2__error__bad_header);
45095
      goto exit;
45096
    }
45097
    {
45098
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
45099
      uint32_t t_1;
45100
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
45101
        t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
45102
        iop_a_src += 4;
45103
      } else {
45104
        self->private_data.s_do_decode_image_config.scratch = 0;
45105
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
45106
        while (true) {
45107
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
45108
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
45109
            goto suspend;
45110
          }
45111
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
45112
          uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
45113
          *scratch <<= 8;
45114
          *scratch >>= 8;
45115
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
45116
          if (num_bits_1 == 24) {
45117
            t_1 = ((uint32_t)(*scratch));
45118
            break;
45119
          }
45120
          num_bits_1 += 8u;
45121
          *scratch |= ((uint64_t)(num_bits_1)) << 56;
45122
        }
45123
      }
45124
      v_c32 = t_1;
45125
    }
45126
    if ((v_c32 == 12337u) || (v_c32 == 16789554u) || (v_c32 == 151007282u)) {
45127
      self->private_impl.f_pixfmt = 2415954056u;
45128
    } else if ((v_c32 == 50343986u) || (v_c32 == 167784498u)) {
45129
      self->private_impl.f_pixfmt = 2164295816u;
45130
    } else if ((v_c32 == 67121202u) || (v_c32 == 184561714u)) {
45131
      self->private_impl.f_pixfmt = 2197850248u;
45132
    } else if (v_c32 == 83898418u) {
45133
      self->private_impl.f_pixfmt = 536870923u;
45134
      self->private_impl.choosy_from_colors_to_buffer = (
45135
          &wuffs_etc2__decoder__from_colors_to_buffer_r11u);
45136
    } else if (v_c32 == 100675634u) {
45137
      self->private_impl.f_pixfmt = 2164308923u;
45138
      self->private_impl.choosy_from_colors_to_buffer = (
45139
          &wuffs_etc2__decoder__from_colors_to_buffer_rg11u);
45140
    } else if (v_c32 == 117452850u) {
45141
      self->private_impl.f_pixfmt = 536870923u;
45142
      self->private_impl.choosy_from_colors_to_buffer = (
45143
          &wuffs_etc2__decoder__from_colors_to_buffer_r11s);
45144
    } else if (v_c32 == 134230066u) {
45145
      self->private_impl.f_pixfmt = 2164308923u;
45146
      self->private_impl.choosy_from_colors_to_buffer = (
45147
          &wuffs_etc2__decoder__from_colors_to_buffer_rg11s);
45148
    } else {
45149
      status = wuffs_base__make_status(wuffs_etc2__error__bad_header);
45150
      goto exit;
45151
    }
45152
    self->private_impl.f_srgb = ((v_c32 >> 24u) >= 9u);
45153
    if (self->private_impl.f_pixfmt == 2164308923u) {
45154
      v_i = 0u;
45155
      while (v_i <= 4088u) {
45156
        self->private_data.f_buffer[(v_i + 0u)] = 0u;
45157
        self->private_data.f_buffer[(v_i + 1u)] = 0u;
45158
        self->private_data.f_buffer[(v_i + 6u)] = 255u;
45159
        self->private_data.f_buffer[(v_i + 7u)] = 255u;
45160
        v_i += 8u;
45161
      }
45162
    }
45163
    {
45164
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
45165
      uint16_t t_2;
45166
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
45167
        t_2 = wuffs_base__peek_u16be__no_bounds_check(iop_a_src);
45168
        iop_a_src += 2;
45169
      } else {
45170
        self->private_data.s_do_decode_image_config.scratch = 0;
45171
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
45172
        while (true) {
45173
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
45174
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
45175
            goto suspend;
45176
          }
45177
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
45178
          uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu));
45179
          *scratch >>= 8;
45180
          *scratch <<= 8;
45181
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2);
45182
          if (num_bits_2 == 8) {
45183
            t_2 = ((uint16_t)(*scratch >> 48));
45184
            break;
45185
          }
45186
          num_bits_2 += 8u;
45187
          *scratch |= ((uint64_t)(num_bits_2));
45188
        }
45189
      }
45190
      v_rounded_up_width = t_2;
45191
    }
45192
    {
45193
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
45194
      uint16_t t_3;
45195
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
45196
        t_3 = wuffs_base__peek_u16be__no_bounds_check(iop_a_src);
45197
        iop_a_src += 2;
45198
      } else {
45199
        self->private_data.s_do_decode_image_config.scratch = 0;
45200
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
45201
        while (true) {
45202
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
45203
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
45204
            goto suspend;
45205
          }
45206
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
45207
          uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFFu));
45208
          *scratch >>= 8;
45209
          *scratch <<= 8;
45210
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3);
45211
          if (num_bits_3 == 8) {
45212
            t_3 = ((uint16_t)(*scratch >> 48));
45213
            break;
45214
          }
45215
          num_bits_3 += 8u;
45216
          *scratch |= ((uint64_t)(num_bits_3));
45217
        }
45218
      }
45219
      v_rounded_up_height = t_3;
45220
    }
45221
    {
45222
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
45223
      uint32_t t_4;
45224
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
45225
        t_4 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src)));
45226
        iop_a_src += 2;
45227
      } else {
45228
        self->private_data.s_do_decode_image_config.scratch = 0;
45229
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
45230
        while (true) {
45231
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
45232
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
45233
            goto suspend;
45234
          }
45235
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
45236
          uint32_t num_bits_4 = ((uint32_t)(*scratch & 0xFFu));
45237
          *scratch >>= 8;
45238
          *scratch <<= 8;
45239
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_4);
45240
          if (num_bits_4 == 8) {
45241
            t_4 = ((uint32_t)(*scratch >> 48));
45242
            break;
45243
          }
45244
          num_bits_4 += 8u;
45245
          *scratch |= ((uint64_t)(num_bits_4));
45246
        }
45247
      }
45248
      v_c32 = t_4;
45249
    }
45250
    if (((v_c32 + 3u) & 4294967292u) != ((uint32_t)(v_rounded_up_width))) {
45251
      status = wuffs_base__make_status(wuffs_etc2__error__bad_header);
45252
      goto exit;
45253
    }
45254
    self->private_impl.f_width = v_c32;
45255
    {
45256
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11);
45257
      uint32_t t_5;
45258
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
45259
        t_5 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src)));
45260
        iop_a_src += 2;
45261
      } else {
45262
        self->private_data.s_do_decode_image_config.scratch = 0;
45263
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12);
45264
        while (true) {
45265
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
45266
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
45267
            goto suspend;
45268
          }
45269
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
45270
          uint32_t num_bits_5 = ((uint32_t)(*scratch & 0xFFu));
45271
          *scratch >>= 8;
45272
          *scratch <<= 8;
45273
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_5);
45274
          if (num_bits_5 == 8) {
45275
            t_5 = ((uint32_t)(*scratch >> 48));
45276
            break;
45277
          }
45278
          num_bits_5 += 8u;
45279
          *scratch |= ((uint64_t)(num_bits_5));
45280
        }
45281
      }
45282
      v_c32 = t_5;
45283
    }
45284
    if (((v_c32 + 3u) & 4294967292u) != ((uint32_t)(v_rounded_up_height))) {
45285
      status = wuffs_base__make_status(wuffs_etc2__error__bad_header);
45286
      goto exit;
45287
    }
45288
    self->private_impl.f_height = v_c32;
45289
    if (a_dst != NULL) {
45290
      wuffs_base__image_config__set(
45291
          a_dst,
45292
          self->private_impl.f_pixfmt,
45293
          0u,
45294
          self->private_impl.f_width,
45295
          self->private_impl.f_height,
45296
          16u,
45297
          (self->private_impl.f_pixfmt == 2415954056u));
45298
    }
45299
    self->private_impl.f_call_sequence = 32u;
45300
45301
    goto ok;
45302
    ok:
45303
    self->private_impl.p_do_decode_image_config = 0;
45304
    goto exit;
45305
  }
45306
45307
  goto suspend;
45308
  suspend:
45309
  self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
45310
  self->private_data.s_do_decode_image_config.v_rounded_up_width = v_rounded_up_width;
45311
  self->private_data.s_do_decode_image_config.v_rounded_up_height = v_rounded_up_height;
45312
45313
  goto exit;
45314
  exit:
45315
  if (a_src && a_src->data.ptr) {
45316
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
45317
  }
45318
45319
  return status;
45320
}
45321
45322
// -------- func etc2.decoder.decode_frame_config
45323
45324
WUFFS_BASE__GENERATED_C_CODE
45325
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
45326
wuffs_etc2__decoder__decode_frame_config(
45327
    wuffs_etc2__decoder* self,
45328
    wuffs_base__frame_config* a_dst,
45329
    wuffs_base__io_buffer* a_src) {
45330
  if (!self) {
45331
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
45332
  }
45333
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
45334
    return wuffs_base__make_status(
45335
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
45336
        ? wuffs_base__error__disabled_by_previous_error
45337
        : wuffs_base__error__initialize_not_called);
45338
  }
45339
  if (!a_src) {
45340
    self->private_impl.magic = WUFFS_BASE__DISABLED;
45341
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
45342
  }
45343
  if ((self->private_impl.active_coroutine != 0) &&
45344
      (self->private_impl.active_coroutine != 2)) {
45345
    self->private_impl.magic = WUFFS_BASE__DISABLED;
45346
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
45347
  }
45348
  self->private_impl.active_coroutine = 0;
45349
  wuffs_base__status status = wuffs_base__make_status(NULL);
45350
45351
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
45352
45353
  uint32_t coro_susp_point = self->private_impl.p_decode_frame_config;
45354
  switch (coro_susp_point) {
45355
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
45356
45357
    while (true) {
45358
      {
45359
        wuffs_base__status t_0 = wuffs_etc2__decoder__do_decode_frame_config(self, a_dst, a_src);
45360
        v_status = t_0;
45361
      }
45362
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
45363
        status = wuffs_base__make_status(wuffs_etc2__error__truncated_input);
45364
        goto exit;
45365
      }
45366
      status = v_status;
45367
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
45368
    }
45369
45370
    ok:
45371
    self->private_impl.p_decode_frame_config = 0;
45372
    goto exit;
45373
  }
45374
45375
  goto suspend;
45376
  suspend:
45377
  self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
45378
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0;
45379
45380
  goto exit;
45381
  exit:
45382
  if (wuffs_base__status__is_error(&status)) {
45383
    self->private_impl.magic = WUFFS_BASE__DISABLED;
45384
  }
45385
  return status;
45386
}
45387
45388
// -------- func etc2.decoder.do_decode_frame_config
45389
45390
WUFFS_BASE__GENERATED_C_CODE
45391
static wuffs_base__status
45392
wuffs_etc2__decoder__do_decode_frame_config(
45393
    wuffs_etc2__decoder* self,
45394
    wuffs_base__frame_config* a_dst,
45395
    wuffs_base__io_buffer* a_src) {
45396
  wuffs_base__status status = wuffs_base__make_status(NULL);
45397
45398
  wuffs_base__pixel_format v_pixfmt = {0};
45399
45400
  const uint8_t* iop_a_src = NULL;
45401
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
45402
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
45403
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
45404
  if (a_src && a_src->data.ptr) {
45405
    io0_a_src = a_src->data.ptr;
45406
    io1_a_src = io0_a_src + a_src->meta.ri;
45407
    iop_a_src = io1_a_src;
45408
    io2_a_src = io0_a_src + a_src->meta.wi;
45409
  }
45410
45411
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config;
45412
  switch (coro_susp_point) {
45413
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
45414
45415
    if (self->private_impl.f_call_sequence == 32u) {
45416
    } else if (self->private_impl.f_call_sequence < 32u) {
45417
      if (a_src) {
45418
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
45419
      }
45420
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
45421
      status = wuffs_etc2__decoder__do_decode_image_config(self, NULL, a_src);
45422
      if (a_src) {
45423
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
45424
      }
45425
      if (status.repr) {
45426
        goto suspend;
45427
      }
45428
    } else if (self->private_impl.f_call_sequence == 40u) {
45429
      if (16u != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) {
45430
        status = wuffs_base__make_status(wuffs_base__error__bad_restart);
45431
        goto exit;
45432
      }
45433
    } else if (self->private_impl.f_call_sequence == 64u) {
45434
      self->private_impl.f_call_sequence = 96u;
45435
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
45436
      goto ok;
45437
    } else {
45438
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
45439
      goto ok;
45440
    }
45441
    if (a_dst != NULL) {
45442
      v_pixfmt = wuffs_base__utility__make_pixel_format(self->private_impl.f_pixfmt);
45443
      wuffs_base__frame_config__set(
45444
          a_dst,
45445
          wuffs_base__utility__make_rect_ie_u32(
45446
          0u,
45447
          0u,
45448
          self->private_impl.f_width,
45449
          self->private_impl.f_height),
45450
          ((wuffs_base__flicks)(0u)),
45451
          0u,
45452
          16u,
45453
          0u,
45454
          (self->private_impl.f_pixfmt == 2415954056u),
45455
          false,
45456
          wuffs_base__pixel_format__default_background_color(&v_pixfmt));
45457
    }
45458
    self->private_impl.f_call_sequence = 64u;
45459
45460
    ok:
45461
    self->private_impl.p_do_decode_frame_config = 0;
45462
    goto exit;
45463
  }
45464
45465
  goto suspend;
45466
  suspend:
45467
  self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
45468
45469
  goto exit;
45470
  exit:
45471
  if (a_src && a_src->data.ptr) {
45472
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
45473
  }
45474
45475
  return status;
45476
}
45477
45478
// -------- func etc2.decoder.decode_frame
45479
45480
WUFFS_BASE__GENERATED_C_CODE
45481
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
45482
wuffs_etc2__decoder__decode_frame(
45483
    wuffs_etc2__decoder* self,
45484
    wuffs_base__pixel_buffer* a_dst,
45485
    wuffs_base__io_buffer* a_src,
45486
    wuffs_base__pixel_blend a_blend,
45487
    wuffs_base__slice_u8 a_workbuf,
45488
    wuffs_base__decode_frame_options* a_opts) {
45489
  if (!self) {
45490
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
45491
  }
45492
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
45493
    return wuffs_base__make_status(
45494
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
45495
        ? wuffs_base__error__disabled_by_previous_error
45496
        : wuffs_base__error__initialize_not_called);
45497
  }
45498
  if (!a_dst || !a_src) {
45499
    self->private_impl.magic = WUFFS_BASE__DISABLED;
45500
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
45501
  }
45502
  if ((self->private_impl.active_coroutine != 0) &&
45503
      (self->private_impl.active_coroutine != 3)) {
45504
    self->private_impl.magic = WUFFS_BASE__DISABLED;
45505
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
45506
  }
45507
  self->private_impl.active_coroutine = 0;
45508
  wuffs_base__status status = wuffs_base__make_status(NULL);
45509
45510
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
45511
45512
  uint32_t coro_susp_point = self->private_impl.p_decode_frame;
45513
  switch (coro_susp_point) {
45514
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
45515
45516
    while (true) {
45517
      {
45518
        wuffs_base__status t_0 = wuffs_etc2__decoder__do_decode_frame(self,
45519
            a_dst,
45520
            a_src,
45521
            a_blend,
45522
            a_workbuf,
45523
            a_opts);
45524
        v_status = t_0;
45525
      }
45526
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
45527
        status = wuffs_base__make_status(wuffs_etc2__error__truncated_input);
45528
        goto exit;
45529
      }
45530
      status = v_status;
45531
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
45532
    }
45533
45534
    ok:
45535
    self->private_impl.p_decode_frame = 0;
45536
    goto exit;
45537
  }
45538
45539
  goto suspend;
45540
  suspend:
45541
  self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
45542
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0;
45543
45544
  goto exit;
45545
  exit:
45546
  if (wuffs_base__status__is_error(&status)) {
45547
    self->private_impl.magic = WUFFS_BASE__DISABLED;
45548
  }
45549
  return status;
45550
}
45551
45552
// -------- func etc2.decoder.do_decode_frame
45553
45554
WUFFS_BASE__GENERATED_C_CODE
45555
static wuffs_base__status
45556
wuffs_etc2__decoder__do_decode_frame(
45557
    wuffs_etc2__decoder* self,
45558
    wuffs_base__pixel_buffer* a_dst,
45559
    wuffs_base__io_buffer* a_src,
45560
    wuffs_base__pixel_blend a_blend,
45561
    wuffs_base__slice_u8 a_workbuf,
45562
    wuffs_base__decode_frame_options* a_opts) {
45563
  wuffs_base__status status = wuffs_base__make_status(NULL);
45564
45565
  uint32_t v_remaining = 0;
45566
  uint32_t v_max_nbb = 0;
45567
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
45568
45569
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame;
45570
  if (coro_susp_point) {
45571
    v_remaining = self->private_data.s_do_decode_frame.v_remaining;
45572
  }
45573
  switch (coro_susp_point) {
45574
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
45575
45576
    if (self->private_impl.f_call_sequence == 64u) {
45577
    } else if (self->private_impl.f_call_sequence < 64u) {
45578
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
45579
      status = wuffs_etc2__decoder__do_decode_frame_config(self, NULL, a_src);
45580
      if (status.repr) {
45581
        goto suspend;
45582
      }
45583
    } else {
45584
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
45585
      goto ok;
45586
    }
45587
    v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler,
45588
        wuffs_base__pixel_buffer__pixel_format(a_dst),
45589
        wuffs_base__pixel_buffer__palette(a_dst),
45590
        wuffs_base__utility__make_pixel_format(self->private_impl.f_pixfmt),
45591
        wuffs_base__utility__empty_slice_u8(),
45592
        a_blend);
45593
    if ( ! wuffs_base__status__is_ok(&v_status)) {
45594
      status = v_status;
45595
      if (wuffs_base__status__is_error(&status)) {
45596
        goto exit;
45597
      } else if (wuffs_base__status__is_suspension(&status)) {
45598
        status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
45599
        goto exit;
45600
      }
45601
      goto ok;
45602
    }
45603
    self->private_impl.f_dst_x = 0u;
45604
    self->private_impl.f_dst_y = 0u;
45605
    v_remaining = (((self->private_impl.f_width + 3u) / 4u) * ((self->private_impl.f_height + 3u) / 4u));
45606
    while (v_remaining > 0u) {
45607
      v_max_nbb = 64u;
45608
      if ((self->private_impl.f_pixfmt == 536870923u) || (self->private_impl.f_pixfmt == 2164308923u)) {
45609
        v_max_nbb = 32u;
45610
      }
45611
      self->private_impl.f_num_buffered_blocks = wuffs_base__u32__min(v_remaining, v_max_nbb);
45612
      if (v_remaining < self->private_impl.f_num_buffered_blocks) {
45613
        status = wuffs_base__make_status(wuffs_base__error__too_much_data);
45614
        goto exit;
45615
      }
45616
      v_remaining -= self->private_impl.f_num_buffered_blocks;
45617
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
45618
      status = wuffs_etc2__decoder__from_src_to_colors(self, a_src);
45619
      if (status.repr) {
45620
        goto suspend;
45621
      }
45622
      wuffs_etc2__decoder__from_colors_to_buffer(self);
45623
      if (self->private_impl.f_pixfmt == 2164295816u) {
45624
        wuffs_etc2__decoder__from_alphas_to_buffer(self);
45625
      }
45626
      v_status = wuffs_etc2__decoder__from_buffer_to_dst(self, a_dst);
45627
      if ( ! wuffs_base__status__is_ok(&v_status)) {
45628
        status = v_status;
45629
        if (wuffs_base__status__is_error(&status)) {
45630
          goto exit;
45631
        } else if (wuffs_base__status__is_suspension(&status)) {
45632
          status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
45633
          goto exit;
45634
        }
45635
        goto ok;
45636
      }
45637
    }
45638
    self->private_impl.f_call_sequence = 96u;
45639
45640
    ok:
45641
    self->private_impl.p_do_decode_frame = 0;
45642
    goto exit;
45643
  }
45644
45645
  goto suspend;
45646
  suspend:
45647
  self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
45648
  self->private_data.s_do_decode_frame.v_remaining = v_remaining;
45649
45650
  goto exit;
45651
  exit:
45652
  return status;
45653
}
45654
45655
// -------- func etc2.decoder.from_src_to_colors
45656
45657
WUFFS_BASE__GENERATED_C_CODE
45658
static wuffs_base__status
45659
wuffs_etc2__decoder__from_src_to_colors(
45660
    wuffs_etc2__decoder* self,
45661
    wuffs_base__io_buffer* a_src) {
45662
  wuffs_base__status status = wuffs_base__make_status(NULL);
45663
45664
  uint32_t v_bi = 0;
45665
45666
  const uint8_t* iop_a_src = NULL;
45667
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
45668
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
45669
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
45670
  if (a_src && a_src->data.ptr) {
45671
    io0_a_src = a_src->data.ptr;
45672
    io1_a_src = io0_a_src + a_src->meta.ri;
45673
    iop_a_src = io1_a_src;
45674
    io2_a_src = io0_a_src + a_src->meta.wi;
45675
  }
45676
45677
  uint32_t coro_susp_point = self->private_impl.p_from_src_to_colors;
45678
  if (coro_susp_point) {
45679
    v_bi = self->private_data.s_from_src_to_colors.v_bi;
45680
  }
45681
  switch (coro_susp_point) {
45682
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
45683
45684
    while (v_bi < self->private_impl.f_num_buffered_blocks) {
45685
      if ((self->private_impl.f_pixfmt == 2164295816u) || (self->private_impl.f_pixfmt == 2164308923u)) {
45686
        {
45687
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
45688
          uint64_t t_0;
45689
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) {
45690
            t_0 = wuffs_base__peek_u64be__no_bounds_check(iop_a_src);
45691
            iop_a_src += 8;
45692
          } else {
45693
            self->private_data.s_from_src_to_colors.scratch = 0;
45694
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
45695
            while (true) {
45696
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
45697
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
45698
                goto suspend;
45699
              }
45700
              uint64_t* scratch = &self->private_data.s_from_src_to_colors.scratch;
45701
              uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu));
45702
              *scratch >>= 8;
45703
              *scratch <<= 8;
45704
              *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0);
45705
              if (num_bits_0 == 56) {
45706
                t_0 = ((uint64_t)(*scratch >> 0));
45707
                break;
45708
              }
45709
              num_bits_0 += 8u;
45710
              *scratch |= ((uint64_t)(num_bits_0));
45711
            }
45712
          }
45713
          self->private_data.f_colors[0u][v_bi] = t_0;
45714
        }
45715
      }
45716
      {
45717
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
45718
        uint64_t t_1;
45719
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) {
45720
          t_1 = wuffs_base__peek_u64be__no_bounds_check(iop_a_src);
45721
          iop_a_src += 8;
45722
        } else {
45723
          self->private_data.s_from_src_to_colors.scratch = 0;
45724
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
45725
          while (true) {
45726
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
45727
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
45728
              goto suspend;
45729
            }
45730
            uint64_t* scratch = &self->private_data.s_from_src_to_colors.scratch;
45731
            uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu));
45732
            *scratch >>= 8;
45733
            *scratch <<= 8;
45734
            *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1);
45735
            if (num_bits_1 == 56) {
45736
              t_1 = ((uint64_t)(*scratch >> 0));
45737
              break;
45738
            }
45739
            num_bits_1 += 8u;
45740
            *scratch |= ((uint64_t)(num_bits_1));
45741
          }
45742
        }
45743
        self->private_data.f_colors[1u][v_bi] = t_1;
45744
      }
45745
      v_bi += 1u;
45746
    }
45747
45748
    goto ok;
45749
    ok:
45750
    self->private_impl.p_from_src_to_colors = 0;
45751
    goto exit;
45752
  }
45753
45754
  goto suspend;
45755
  suspend:
45756
  self->private_impl.p_from_src_to_colors = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
45757
  self->private_data.s_from_src_to_colors.v_bi = v_bi;
45758
45759
  goto exit;
45760
  exit:
45761
  if (a_src && a_src->data.ptr) {
45762
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
45763
  }
45764
45765
  return status;
45766
}
45767
45768
// -------- func etc2.decoder.from_colors_to_buffer
45769
45770
WUFFS_BASE__GENERATED_C_CODE
45771
static wuffs_base__empty_struct
45772
wuffs_etc2__decoder__from_colors_to_buffer(
45773
    wuffs_etc2__decoder* self) {
45774
  return (*self->private_impl.choosy_from_colors_to_buffer)(self);
45775
}
45776
45777
WUFFS_BASE__GENERATED_C_CODE
45778
static wuffs_base__empty_struct
45779
wuffs_etc2__decoder__from_colors_to_buffer__choosy_default(
45780
    wuffs_etc2__decoder* self) {
45781
  uint32_t v_bi = 0;
45782
  uint64_t v_color = 0;
45783
  uint32_t v_r0 = 0;
45784
  uint32_t v_r1 = 0;
45785
  uint32_t v_g0 = 0;
45786
  uint32_t v_g1 = 0;
45787
  uint32_t v_b0 = 0;
45788
  uint32_t v_b1 = 0;
45789
  bool v_diff = false;
45790
  bool v_tran = false;
45791
  bool v_flip = false;
45792
45793
  while (v_bi < self->private_impl.f_num_buffered_blocks) {
45794
    v_color = self->private_data.f_colors[1u][v_bi];
45795
    v_diff = ((v_color & 8589934592u) != 0u);
45796
    v_tran = ( ! v_diff && (self->private_impl.f_pixfmt == 2197850248u));
45797
    if ( ! v_diff && (self->private_impl.f_pixfmt != 2197850248u)) {
45798
      v_r0 = ((uint32_t)((15u & (v_color >> 60u))));
45799
      v_r0 = ((v_r0 << 4u) | v_r0);
45800
      v_r1 = ((uint32_t)((15u & (v_color >> 56u))));
45801
      v_r1 = ((v_r1 << 4u) | v_r1);
45802
      v_g0 = ((uint32_t)((15u & (v_color >> 52u))));
45803
      v_g0 = ((v_g0 << 4u) | v_g0);
45804
      v_g1 = ((uint32_t)((15u & (v_color >> 48u))));
45805
      v_g1 = ((v_g1 << 4u) | v_g1);
45806
      v_b0 = ((uint32_t)((15u & (v_color >> 44u))));
45807
      v_b0 = ((v_b0 << 4u) | v_b0);
45808
      v_b1 = ((uint32_t)((15u & (v_color >> 40u))));
45809
      v_b1 = ((v_b1 << 4u) | v_b1);
45810
    } else {
45811
      v_r0 = ((uint32_t)((31u & (v_color >> 59u))));
45812
      v_r1 = ((uint32_t)(v_r0 + WUFFS_ETC2__DIFFS[(7u & (v_color >> 56u))]));
45813
      if ((v_r1 >> 5u) != 0u) {
45814
        wuffs_etc2__decoder__decode_t_mode(self, v_color, (16u * v_bi), v_tran);
45815
        v_bi += 1u;
45816
        continue;
45817
      }
45818
      v_r0 = (((uint32_t)(v_r0 << 3u)) | (v_r0 >> 2u));
45819
      v_r1 = (((uint32_t)(v_r1 << 3u)) | (v_r1 >> 2u));
45820
      v_g0 = ((uint32_t)((31u & (v_color >> 51u))));
45821
      v_g1 = ((uint32_t)(v_g0 + WUFFS_ETC2__DIFFS[(7u & (v_color >> 48u))]));
45822
      if ((v_g1 >> 5u) != 0u) {
45823
        wuffs_etc2__decoder__decode_h_mode(self, v_color, (16u * v_bi), v_tran);
45824
        v_bi += 1u;
45825
        continue;
45826
      }
45827
      v_g0 = (((uint32_t)(v_g0 << 3u)) | (v_g0 >> 2u));
45828
      v_g1 = (((uint32_t)(v_g1 << 3u)) | (v_g1 >> 2u));
45829
      v_b0 = ((uint32_t)((31u & (v_color >> 43u))));
45830
      v_b1 = ((uint32_t)(v_b0 + WUFFS_ETC2__DIFFS[(7u & (v_color >> 40u))]));
45831
      if ((v_b1 >> 5u) != 0u) {
45832
        wuffs_etc2__decoder__decode_planar_mode(self, v_color, (16u * v_bi));
45833
        v_bi += 1u;
45834
        continue;
45835
      }
45836
      v_b0 = (((uint32_t)(v_b0 << 3u)) | (v_b0 >> 2u));
45837
      v_b1 = (((uint32_t)(v_b1 << 3u)) | (v_b1 >> 2u));
45838
    }
45839
    v_flip = ((v_color & 4294967296u) != 0u);
45840
    wuffs_etc2__decoder__decode_half_block(self,
45841
        ((uint32_t)(v_color)),
45842
        (16u * v_bi),
45843
        ((uint32_t)(((v_color >> 37u) & 7u))),
45844
        v_r0,
45845
        v_g0,
45846
        v_b0,
45847
        v_flip,
45848
        v_tran,
45849
        false);
45850
    wuffs_etc2__decoder__decode_half_block(self,
45851
        ((uint32_t)(v_color)),
45852
        (16u * v_bi),
45853
        ((uint32_t)(((v_color >> 34u) & 7u))),
45854
        v_r1,
45855
        v_g1,
45856
        v_b1,
45857
        v_flip,
45858
        v_tran,
45859
        true);
45860
    v_bi += 1u;
45861
  }
45862
  return wuffs_base__make_empty_struct();
45863
}
45864
45865
// -------- func etc2.decoder.decode_t_mode
45866
45867
WUFFS_BASE__GENERATED_C_CODE
45868
static wuffs_base__empty_struct
45869
wuffs_etc2__decoder__decode_t_mode(
45870
    wuffs_etc2__decoder* self,
45871
    uint64_t a_bits,
45872
    uint32_t a_offset,
45873
    bool a_transparent) {
45874
  uint8_t v_r[4] = {0};
45875
  uint8_t v_g[4] = {0};
45876
  uint8_t v_b[4] = {0};
45877
  uint8_t v_a[4] = {0};
45878
  uint32_t v_which = 0;
45879
  uint32_t v_delta = 0;
45880
  uint32_t v_y = 0;
45881
  uint32_t v_x = 0;
45882
  uint32_t v_x4y = 0;
45883
  uint32_t v_index = 0;
45884
  uint32_t v_o = 0;
45885
45886
  v_r[0u] = ((uint8_t)(((uint8_t)((12u & (a_bits >> 57u)))) | ((uint8_t)((3u & (a_bits >> 56u))))));
45887
  v_r[0u] = ((uint8_t)(((uint8_t)(v_r[0u] << 4u)) | v_r[0u]));
45888
  v_g[0u] = ((uint8_t)((15u & (a_bits >> 52u))));
45889
  v_g[0u] = ((uint8_t)(((uint8_t)(v_g[0u] << 4u)) | v_g[0u]));
45890
  v_b[0u] = ((uint8_t)((15u & (a_bits >> 48u))));
45891
  v_b[0u] = ((uint8_t)(((uint8_t)(v_b[0u] << 4u)) | v_b[0u]));
45892
  v_a[0u] = 255u;
45893
  v_r[2u] = ((uint8_t)((15u & (a_bits >> 44u))));
45894
  v_r[2u] = ((uint8_t)(((uint8_t)(v_r[2u] << 4u)) | v_r[2u]));
45895
  v_g[2u] = ((uint8_t)((15u & (a_bits >> 40u))));
45896
  v_g[2u] = ((uint8_t)(((uint8_t)(v_g[2u] << 4u)) | v_g[2u]));
45897
  v_b[2u] = ((uint8_t)((15u & (a_bits >> 36u))));
45898
  v_b[2u] = ((uint8_t)(((uint8_t)(v_b[2u] << 4u)) | v_b[2u]));
45899
  v_a[2u] = 255u;
45900
  v_which = (((uint32_t)((6u & (a_bits >> 33u)))) | ((uint32_t)((1u & (a_bits >> 32u)))));
45901
  v_delta = ((uint32_t)(WUFFS_ETC2__T_H_MODIFIERS[v_which]));
45902
  v_r[1u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_r[2u])) + v_delta)) & 1023u)];
45903
  v_g[1u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_g[2u])) + v_delta)) & 1023u)];
45904
  v_b[1u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_b[2u])) + v_delta)) & 1023u)];
45905
  v_a[1u] = 255u;
45906
  v_r[3u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_r[2u])) - v_delta)) & 1023u)];
45907
  v_g[3u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_g[2u])) - v_delta)) & 1023u)];
45908
  v_b[3u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_b[2u])) - v_delta)) & 1023u)];
45909
  v_a[3u] = 255u;
45910
  if (a_transparent) {
45911
    v_r[2u] = 0u;
45912
    v_g[2u] = 0u;
45913
    v_b[2u] = 0u;
45914
    v_a[2u] = 0u;
45915
  }
45916
  while (v_y < 4u) {
45917
    v_x = 0u;
45918
    while (v_x < 4u) {
45919
      v_x4y = ((v_x * 4u) | v_y);
45920
      v_index = (((uint32_t)(((a_bits >> v_x4y) & 1u))) | ((uint32_t)(((a_bits >> (v_x4y + 15u)) & 2u))));
45921
      v_o = (a_offset + (v_x * 4u) + (v_y * 1024u));
45922
      self->private_data.f_buffer[(v_o + 0u)] = v_b[v_index];
45923
      self->private_data.f_buffer[(v_o + 1u)] = v_g[v_index];
45924
      self->private_data.f_buffer[(v_o + 2u)] = v_r[v_index];
45925
      self->private_data.f_buffer[(v_o + 3u)] = v_a[v_index];
45926
      v_x += 1u;
45927
    }
45928
    v_y += 1u;
45929
  }
45930
  return wuffs_base__make_empty_struct();
45931
}
45932
45933
// -------- func etc2.decoder.decode_h_mode
45934
45935
WUFFS_BASE__GENERATED_C_CODE
45936
static wuffs_base__empty_struct
45937
wuffs_etc2__decoder__decode_h_mode(
45938
    wuffs_etc2__decoder* self,
45939
    uint64_t a_bits,
45940
    uint32_t a_offset,
45941
    bool a_transparent) {
45942
  uint8_t v_r[4] = {0};
45943
  uint8_t v_g[4] = {0};
45944
  uint8_t v_b[4] = {0};
45945
  uint8_t v_a[4] = {0};
45946
  uint32_t v_rgb0 = 0;
45947
  uint32_t v_rgb2 = 0;
45948
  uint32_t v_which = 0;
45949
  uint32_t v_delta = 0;
45950
  uint32_t v_y = 0;
45951
  uint32_t v_x = 0;
45952
  uint32_t v_x4y = 0;
45953
  uint32_t v_index = 0;
45954
  uint32_t v_o = 0;
45955
45956
  v_r[0u] = ((uint8_t)((15u & (a_bits >> 59u))));
45957
  v_r[0u] = ((uint8_t)(((uint8_t)(v_r[0u] << 4u)) | v_r[0u]));
45958
  v_g[0u] = ((uint8_t)(((uint8_t)((14u & (a_bits >> 55u)))) | ((uint8_t)((1u & (a_bits >> 52u))))));
45959
  v_g[0u] = ((uint8_t)(((uint8_t)(v_g[0u] << 4u)) | v_g[0u]));
45960
  v_b[0u] = ((uint8_t)(((uint8_t)((8u & (a_bits >> 48u)))) | ((uint8_t)((7u & (a_bits >> 47u))))));
45961
  v_b[0u] = ((uint8_t)(((uint8_t)(v_b[0u] << 4u)) | v_b[0u]));
45962
  v_r[2u] = ((uint8_t)((15u & (a_bits >> 43u))));
45963
  v_r[2u] = ((uint8_t)(((uint8_t)(v_r[2u] << 4u)) | v_r[2u]));
45964
  v_g[2u] = ((uint8_t)((15u & (a_bits >> 39u))));
45965
  v_g[2u] = ((uint8_t)(((uint8_t)(v_g[2u] << 4u)) | v_g[2u]));
45966
  v_b[2u] = ((uint8_t)((15u & (a_bits >> 35u))));
45967
  v_b[2u] = ((uint8_t)(((uint8_t)(v_b[2u] << 4u)) | v_b[2u]));
45968
  v_rgb0 = ((((uint32_t)(v_r[0u])) << 16u) | (((uint32_t)(v_g[0u])) << 8u) | (((uint32_t)(v_b[0u])) << 0u));
45969
  v_rgb2 = ((((uint32_t)(v_r[2u])) << 16u) | (((uint32_t)(v_g[2u])) << 8u) | (((uint32_t)(v_b[2u])) << 0u));
45970
  v_which = (((uint32_t)((4u & (a_bits >> 32u)))) | ((uint32_t)((2u & (a_bits >> 31u)))));
45971
  if (v_rgb0 >= v_rgb2) {
45972
    v_which |= 1u;
45973
  }
45974
  v_delta = ((uint32_t)(WUFFS_ETC2__T_H_MODIFIERS[v_which]));
45975
  v_r[1u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_r[0u])) - v_delta)) & 1023u)];
45976
  v_g[1u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_g[0u])) - v_delta)) & 1023u)];
45977
  v_b[1u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_b[0u])) - v_delta)) & 1023u)];
45978
  v_a[1u] = 255u;
45979
  v_r[0u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_r[0u])) + v_delta)) & 1023u)];
45980
  v_g[0u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_g[0u])) + v_delta)) & 1023u)];
45981
  v_b[0u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_b[0u])) + v_delta)) & 1023u)];
45982
  v_a[0u] = 255u;
45983
  v_r[3u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_r[2u])) - v_delta)) & 1023u)];
45984
  v_g[3u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_g[2u])) - v_delta)) & 1023u)];
45985
  v_b[3u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_b[2u])) - v_delta)) & 1023u)];
45986
  v_a[3u] = 255u;
45987
  v_r[2u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_r[2u])) + v_delta)) & 1023u)];
45988
  v_g[2u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_g[2u])) + v_delta)) & 1023u)];
45989
  v_b[2u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_b[2u])) + v_delta)) & 1023u)];
45990
  v_a[2u] = 255u;
45991
  if (a_transparent) {
45992
    v_r[2u] = 0u;
45993
    v_g[2u] = 0u;
45994
    v_b[2u] = 0u;
45995
    v_a[2u] = 0u;
45996
  }
45997
  while (v_y < 4u) {
45998
    v_x = 0u;
45999
    while (v_x < 4u) {
46000
      v_x4y = ((v_x * 4u) | v_y);
46001
      v_index = (((uint32_t)(((a_bits >> v_x4y) & 1u))) | ((uint32_t)(((a_bits >> (v_x4y + 15u)) & 2u))));
46002
      v_o = (a_offset + (v_x * 4u) + (v_y * 1024u));
46003
      self->private_data.f_buffer[(v_o + 0u)] = v_b[v_index];
46004
      self->private_data.f_buffer[(v_o + 1u)] = v_g[v_index];
46005
      self->private_data.f_buffer[(v_o + 2u)] = v_r[v_index];
46006
      self->private_data.f_buffer[(v_o + 3u)] = v_a[v_index];
46007
      v_x += 1u;
46008
    }
46009
    v_y += 1u;
46010
  }
46011
  return wuffs_base__make_empty_struct();
46012
}
46013
46014
// -------- func etc2.decoder.decode_planar_mode
46015
46016
WUFFS_BASE__GENERATED_C_CODE
46017
static wuffs_base__empty_struct
46018
wuffs_etc2__decoder__decode_planar_mode(
46019
    wuffs_etc2__decoder* self,
46020
    uint64_t a_bits,
46021
    uint32_t a_offset) {
46022
  uint32_t v_ro = 0;
46023
  uint32_t v_go = 0;
46024
  uint32_t v_bo = 0;
46025
  uint32_t v_rh = 0;
46026
  uint32_t v_gh = 0;
46027
  uint32_t v_bh = 0;
46028
  uint32_t v_rv = 0;
46029
  uint32_t v_gv = 0;
46030
  uint32_t v_bv = 0;
46031
  uint32_t v_y = 0;
46032
  uint32_t v_x = 0;
46033
  uint32_t v_o = 0;
46034
  uint32_t v_rp = 0;
46035
  uint32_t v_gp = 0;
46036
  uint32_t v_bp = 0;
46037
46038
  v_ro = ((uint32_t)((63u & (a_bits >> 57u))));
46039
  v_ro = (((uint32_t)(v_ro << 2u)) | (v_ro >> 4u));
46040
  v_go = (((uint32_t)((64u & (a_bits >> 50u)))) | ((uint32_t)((63u & (a_bits >> 49u)))));
46041
  v_go = (((uint32_t)(v_go << 1u)) | (v_go >> 6u));
46042
  v_bo = (((uint32_t)((32u & (a_bits >> 43u)))) | ((uint32_t)((24u & (a_bits >> 40u)))) | ((uint32_t)((7u & (a_bits >> 39u)))));
46043
  v_bo = (((uint32_t)(v_bo << 2u)) | (v_bo >> 4u));
46044
  v_rh = (((uint32_t)((62u & (a_bits >> 33u)))) | ((uint32_t)((1u & (a_bits >> 32u)))));
46045
  v_rh = (((uint32_t)(v_rh << 2u)) | (v_rh >> 4u));
46046
  v_gh = ((uint32_t)((127u & (a_bits >> 25u))));
46047
  v_gh = (((uint32_t)(v_gh << 1u)) | (v_gh >> 6u));
46048
  v_bh = ((uint32_t)((63u & (a_bits >> 19u))));
46049
  v_bh = (((uint32_t)(v_bh << 2u)) | (v_bh >> 4u));
46050
  v_rv = ((uint32_t)((63u & (a_bits >> 13u))));
46051
  v_rv = (((uint32_t)(v_rv << 2u)) | (v_rv >> 4u));
46052
  v_gv = ((uint32_t)((127u & (a_bits >> 6u))));
46053
  v_gv = (((uint32_t)(v_gv << 1u)) | (v_gv >> 6u));
46054
  v_bv = ((uint32_t)((63u & (a_bits >> 0u))));
46055
  v_bv = (((uint32_t)(v_bv << 2u)) | (v_bv >> 4u));
46056
  v_rh -= v_ro;
46057
  v_gh -= v_go;
46058
  v_bh -= v_bo;
46059
  v_rv -= v_ro;
46060
  v_gv -= v_go;
46061
  v_bv -= v_bo;
46062
  v_ro *= 4u;
46063
  v_go *= 4u;
46064
  v_bo *= 4u;
46065
  while (v_y < 4u) {
46066
    v_x = 0u;
46067
    while (v_x < 4u) {
46068
      v_o = (a_offset + (v_x * 4u) + (v_y * 1024u));
46069
      v_bp = ((uint32_t)(((uint32_t)(((uint32_t)(v_x * v_bh)) + ((uint32_t)(v_y * v_bv)))) + v_bo));
46070
      self->private_data.f_buffer[(v_o + 0u)] = WUFFS_ETC2__CLAMP[((((uint32_t)(v_bp + 2u)) / 4u) & 1023u)];
46071
      v_gp = ((uint32_t)(((uint32_t)(((uint32_t)(v_x * v_gh)) + ((uint32_t)(v_y * v_gv)))) + v_go));
46072
      self->private_data.f_buffer[(v_o + 1u)] = WUFFS_ETC2__CLAMP[((((uint32_t)(v_gp + 2u)) / 4u) & 1023u)];
46073
      v_rp = ((uint32_t)(((uint32_t)(((uint32_t)(v_x * v_rh)) + ((uint32_t)(v_y * v_rv)))) + v_ro));
46074
      self->private_data.f_buffer[(v_o + 2u)] = WUFFS_ETC2__CLAMP[((((uint32_t)(v_rp + 2u)) / 4u) & 1023u)];
46075
      v_x += 1u;
46076
      self->private_data.f_buffer[(v_o + 3u)] = 255u;
46077
    }
46078
    v_y += 1u;
46079
  }
46080
  return wuffs_base__make_empty_struct();
46081
}
46082
46083
// -------- func etc2.decoder.decode_half_block
46084
46085
WUFFS_BASE__GENERATED_C_CODE
46086
static wuffs_base__empty_struct
46087
wuffs_etc2__decoder__decode_half_block(
46088
    wuffs_etc2__decoder* self,
46089
    uint32_t a_bits,
46090
    uint32_t a_offset,
46091
    uint32_t a_which,
46092
    uint32_t a_r,
46093
    uint32_t a_g,
46094
    uint32_t a_b,
46095
    bool a_flip,
46096
    bool a_transparent,
46097
    bool a_second) {
46098
  uint32_t v_which = 0;
46099
  uint32_t v_x0 = 0;
46100
  uint32_t v_y0 = 0;
46101
  uint32_t v_x = 0;
46102
  uint32_t v_y = 0;
46103
  uint32_t v_i = 0;
46104
  uint32_t v_x4y = 0;
46105
  uint32_t v_index = 0;
46106
  uint32_t v_modif = 0;
46107
  uint32_t v_o = 0;
46108
46109
  v_which = a_which;
46110
  if (a_transparent) {
46111
    v_which |= 8u;
46112
  }
46113
  if ( ! a_second) {
46114
  } else if (a_flip) {
46115
    v_y0 = 2u;
46116
  } else {
46117
    v_x0 = 2u;
46118
  }
46119
  while (v_i < 8u) {
46120
    if (a_flip) {
46121
      v_x = ((v_x0 + (v_i / 2u)) & 3u);
46122
      v_y = (v_y0 + (v_i & 1u));
46123
    } else {
46124
      v_x = (v_x0 + (v_i / 4u));
46125
      v_y = ((v_y0 + v_i) & 3u);
46126
    }
46127
    v_x4y = ((v_x * 4u) | v_y);
46128
    v_index = (((a_bits >> v_x4y) & 1u) | ((a_bits >> (v_x4y + 15u)) & 2u));
46129
    v_modif = WUFFS_ETC2__MODIFIERS[v_which][v_index];
46130
    v_o = (a_offset + (v_x * 4u) + (v_y * 1024u));
46131
    if (a_transparent && (v_index == 2u)) {
46132
      self->private_data.f_buffer[(v_o + 0u)] = 0u;
46133
      self->private_data.f_buffer[(v_o + 1u)] = 0u;
46134
      self->private_data.f_buffer[(v_o + 2u)] = 0u;
46135
      self->private_data.f_buffer[(v_o + 3u)] = 0u;
46136
    } else {
46137
      self->private_data.f_buffer[(v_o + 0u)] = WUFFS_ETC2__CLAMP[(((uint32_t)(a_b + v_modif)) & 1023u)];
46138
      self->private_data.f_buffer[(v_o + 1u)] = WUFFS_ETC2__CLAMP[(((uint32_t)(a_g + v_modif)) & 1023u)];
46139
      self->private_data.f_buffer[(v_o + 2u)] = WUFFS_ETC2__CLAMP[(((uint32_t)(a_r + v_modif)) & 1023u)];
46140
      self->private_data.f_buffer[(v_o + 3u)] = 255u;
46141
    }
46142
    v_i += 1u;
46143
  }
46144
  return wuffs_base__make_empty_struct();
46145
}
46146
46147
// -------- func etc2.decoder.from_alphas_to_buffer
46148
46149
WUFFS_BASE__GENERATED_C_CODE
46150
static wuffs_base__empty_struct
46151
wuffs_etc2__decoder__from_alphas_to_buffer(
46152
    wuffs_etc2__decoder* self) {
46153
  uint32_t v_bi = 0;
46154
  uint64_t v_alpha = 0;
46155
  uint32_t v_a0 = 0;
46156
  uint32_t v_multiplier = 0;
46157
  uint32_t v_which = 0;
46158
  uint32_t v_offset = 0;
46159
  uint32_t v_y = 0;
46160
  uint32_t v_x = 0;
46161
  uint32_t v_shift = 0;
46162
  uint32_t v_delta = 0;
46163
  uint32_t v_o = 0;
46164
46165
  while (v_bi < self->private_impl.f_num_buffered_blocks) {
46166
    v_alpha = self->private_data.f_colors[0u][v_bi];
46167
    v_a0 = ((uint32_t)((v_alpha >> 56u)));
46168
    v_multiplier = ((uint32_t)(((v_alpha >> 52u) & 15u)));
46169
    v_which = ((uint32_t)(((v_alpha >> 48u) & 15u)));
46170
    v_offset = (16u * v_bi);
46171
    v_y = 0u;
46172
    while (v_y < 4u) {
46173
      v_x = 0u;
46174
      while (v_x < 4u) {
46175
        v_shift = ((((v_x ^ 3u) * 4u) | (v_y ^ 3u)) * 3u);
46176
        v_delta = ((uint32_t)(v_multiplier * WUFFS_ETC2__ALPHA_MODIFIERS[v_which][(7u & (v_alpha >> v_shift))]));
46177
        v_o = (v_offset + (v_x * 4u) + (v_y * 1024u));
46178
        self->private_data.f_buffer[(v_o + 3u)] = WUFFS_ETC2__CLAMP[(((uint32_t)(v_a0 + v_delta)) & 1023u)];
46179
        v_x += 1u;
46180
      }
46181
      v_y += 1u;
46182
    }
46183
    v_bi += 1u;
46184
  }
46185
  return wuffs_base__make_empty_struct();
46186
}
46187
46188
// -------- func etc2.decoder.from_colors_to_buffer_r11u
46189
46190
WUFFS_BASE__GENERATED_C_CODE
46191
static wuffs_base__empty_struct
46192
wuffs_etc2__decoder__from_colors_to_buffer_r11u(
46193
    wuffs_etc2__decoder* self) {
46194
  wuffs_etc2__decoder__from_colors_to_buffer_unsigned(self, 1u, 2u, 0u);
46195
  return wuffs_base__make_empty_struct();
46196
}
46197
46198
// -------- func etc2.decoder.from_colors_to_buffer_r11s
46199
46200
WUFFS_BASE__GENERATED_C_CODE
46201
static wuffs_base__empty_struct
46202
wuffs_etc2__decoder__from_colors_to_buffer_r11s(
46203
    wuffs_etc2__decoder* self) {
46204
  wuffs_etc2__decoder__from_colors_to_buffer_signed(self, 1u, 2u, 0u);
46205
  return wuffs_base__make_empty_struct();
46206
}
46207
46208
// -------- func etc2.decoder.from_colors_to_buffer_rg11u
46209
46210
WUFFS_BASE__GENERATED_C_CODE
46211
static wuffs_base__empty_struct
46212
wuffs_etc2__decoder__from_colors_to_buffer_rg11u(
46213
    wuffs_etc2__decoder* self) {
46214
  wuffs_etc2__decoder__from_colors_to_buffer_unsigned(self, 0u, 8u, 4u);
46215
  wuffs_etc2__decoder__from_colors_to_buffer_unsigned(self, 1u, 8u, 2u);
46216
  return wuffs_base__make_empty_struct();
46217
}
46218
46219
// -------- func etc2.decoder.from_colors_to_buffer_rg11s
46220
46221
WUFFS_BASE__GENERATED_C_CODE
46222
static wuffs_base__empty_struct
46223
wuffs_etc2__decoder__from_colors_to_buffer_rg11s(
46224
    wuffs_etc2__decoder* self) {
46225
  wuffs_etc2__decoder__from_colors_to_buffer_signed(self, 0u, 8u, 4u);
46226
  wuffs_etc2__decoder__from_colors_to_buffer_signed(self, 1u, 8u, 2u);
46227
  return wuffs_base__make_empty_struct();
46228
}
46229
46230
// -------- func etc2.decoder.from_colors_to_buffer_unsigned
46231
46232
WUFFS_BASE__GENERATED_C_CODE
46233
static wuffs_base__empty_struct
46234
wuffs_etc2__decoder__from_colors_to_buffer_unsigned(
46235
    wuffs_etc2__decoder* self,
46236
    uint32_t a_input,
46237
    uint32_t a_dst_bytes_per_pixel,
46238
    uint32_t a_offset_adjustment) {
46239
  uint32_t v_nbb = 0;
46240
  uint32_t v_bi = 0;
46241
  uint64_t v_color = 0;
46242
  uint32_t v_c0 = 0;
46243
  uint32_t v_multiplier = 0;
46244
  uint32_t v_which = 0;
46245
  uint32_t v_offset = 0;
46246
  uint32_t v_y = 0;
46247
  uint32_t v_x = 0;
46248
  uint32_t v_shift = 0;
46249
  uint32_t v_delta = 0;
46250
  uint32_t v_c11 = 0;
46251
  uint32_t v_c16 = 0;
46252
  uint32_t v_o = 0;
46253
46254
  v_nbb = wuffs_base__u32__min(self->private_impl.f_num_buffered_blocks, 32u);
46255
  while (v_bi < v_nbb) {
46256
    v_color = self->private_data.f_colors[a_input][v_bi];
46257
    v_c0 = ((((uint32_t)((v_color >> 56u))) * 8u) + 4u);
46258
    v_multiplier = ((uint32_t)(((v_color >> 52u) & 15u)));
46259
    v_multiplier *= 8u;
46260
    if (v_multiplier == 0u) {
46261
      v_multiplier = 1u;
46262
    }
46263
    v_which = ((uint32_t)(((v_color >> 48u) & 15u)));
46264
    v_offset = ((4u * a_dst_bytes_per_pixel * v_bi) + a_offset_adjustment);
46265
    v_y = 0u;
46266
    while (v_y < 4u) {
46267
      v_x = 0u;
46268
      while (v_x < 4u) {
46269
        v_shift = ((((v_x ^ 3u) * 4u) | (v_y ^ 3u)) * 3u);
46270
        v_delta = ((uint32_t)(v_multiplier * WUFFS_ETC2__ALPHA_MODIFIERS[v_which][(7u & (v_color >> v_shift))]));
46271
        v_c11 = ((uint32_t)(v_c0 + v_delta));
46272
        if (v_c11 >= 2147483648u) {
46273
          v_c11 = 0u;
46274
        } else if (v_c11 > 2047u) {
46275
          v_c11 = 2047u;
46276
        }
46277
        v_c16 = ((v_c11 << 5u) | (v_c11 >> 6u));
46278
        v_o = (v_offset + (v_x * a_dst_bytes_per_pixel) + (v_y * 1024u));
46279
        self->private_data.f_buffer[(v_o + 0u)] = ((uint8_t)((v_c16 >> 0u)));
46280
        self->private_data.f_buffer[(v_o + 1u)] = ((uint8_t)((v_c16 >> 8u)));
46281
        v_x += 1u;
46282
      }
46283
      v_y += 1u;
46284
    }
46285
    v_bi += 1u;
46286
  }
46287
  return wuffs_base__make_empty_struct();
46288
}
46289
46290
// -------- func etc2.decoder.from_colors_to_buffer_signed
46291
46292
WUFFS_BASE__GENERATED_C_CODE
46293
static wuffs_base__empty_struct
46294
wuffs_etc2__decoder__from_colors_to_buffer_signed(
46295
    wuffs_etc2__decoder* self,
46296
    uint32_t a_input,
46297
    uint32_t a_dst_bytes_per_pixel,
46298
    uint32_t a_offset_adjustment) {
46299
  uint32_t v_nbb = 0;
46300
  uint32_t v_bi = 0;
46301
  uint64_t v_color = 0;
46302
  uint32_t v_c0 = 0;
46303
  uint32_t v_multiplier = 0;
46304
  uint32_t v_which = 0;
46305
  uint32_t v_offset = 0;
46306
  uint32_t v_y = 0;
46307
  uint32_t v_x = 0;
46308
  uint32_t v_shift = 0;
46309
  uint32_t v_delta = 0;
46310
  uint32_t v_c11 = 0;
46311
  uint32_t v_c16 = 0;
46312
  uint32_t v_o = 0;
46313
46314
  v_nbb = wuffs_base__u32__min(self->private_impl.f_num_buffered_blocks, 32u);
46315
  while (v_bi < v_nbb) {
46316
    v_color = self->private_data.f_colors[a_input][v_bi];
46317
    v_c0 = (((uint32_t)((v_color >> 56u))) * 8u);
46318
    if (v_c0 < 1024u) {
46319
    } else if (v_c0 == 1024u) {
46320
      v_c0 = 4294966280u;
46321
    } else {
46322
      v_c0 -= 2048u;
46323
    }
46324
    v_multiplier = ((uint32_t)(((v_color >> 52u) & 15u)));
46325
    v_multiplier *= 8u;
46326
    if (v_multiplier == 0u) {
46327
      v_multiplier = 1u;
46328
    }
46329
    v_which = ((uint32_t)(((v_color >> 48u) & 15u)));
46330
    v_offset = ((4u * a_dst_bytes_per_pixel * v_bi) + a_offset_adjustment);
46331
    v_y = 0u;
46332
    while (v_y < 4u) {
46333
      v_x = 0u;
46334
      while (v_x < 4u) {
46335
        v_shift = ((((v_x ^ 3u) * 4u) | (v_y ^ 3u)) * 3u);
46336
        v_delta = ((uint32_t)(v_multiplier * WUFFS_ETC2__ALPHA_MODIFIERS[v_which][(7u & (v_color >> v_shift))]));
46337
        v_c11 = ((uint32_t)(v_c0 + v_delta));
46338
        if (v_c11 <= 1023u) {
46339
        } else if (v_c11 < 2147483648u) {
46340
          v_c11 = 1023u;
46341
        } else if (v_c11 < 4294966273u) {
46342
          v_c11 = 4294966273u;
46343
        }
46344
        if (v_c11 < 2147483648u) {
46345
          v_c16 = (((uint32_t)(v_c11 << 5u)) | (v_c11 >> 5u));
46346
        } else {
46347
          v_c11 = ((uint32_t)(0u - v_c11));
46348
          v_c16 = (((uint32_t)(v_c11 << 5u)) | (v_c11 >> 5u));
46349
          v_c16 = ((uint32_t)(0u - v_c16));
46350
        }
46351
        v_c16 ^= 32768u;
46352
        v_o = (v_offset + (v_x * a_dst_bytes_per_pixel) + (v_y * 1024u));
46353
        self->private_data.f_buffer[(v_o + 0u)] = ((uint8_t)((v_c16 >> 0u)));
46354
        self->private_data.f_buffer[(v_o + 1u)] = ((uint8_t)((v_c16 >> 8u)));
46355
        v_x += 1u;
46356
      }
46357
      v_y += 1u;
46358
    }
46359
    v_bi += 1u;
46360
  }
46361
  return wuffs_base__make_empty_struct();
46362
}
46363
46364
// -------- func etc2.decoder.from_buffer_to_dst
46365
46366
WUFFS_BASE__GENERATED_C_CODE
46367
static wuffs_base__status
46368
wuffs_etc2__decoder__from_buffer_to_dst(
46369
    wuffs_etc2__decoder* self,
46370
    wuffs_base__pixel_buffer* a_dst) {
46371
  uint32_t v_src_bytes_per_pixel = 0;
46372
  wuffs_base__pixel_format v_dst_pixfmt = {0};
46373
  uint32_t v_dst_bits_per_pixel = 0;
46374
  uint32_t v_dst_bytes_per_pixel = 0;
46375
  uint64_t v_dst_bytes_per_row = 0;
46376
  wuffs_base__table_u8 v_tab = {0};
46377
  uint32_t v_bi = 0;
46378
  uint32_t v_rem_x = 0;
46379
  uint32_t v_dy = 0;
46380
  wuffs_base__slice_u8 v_dst = {0};
46381
  wuffs_base__slice_u8 v_src = {0};
46382
  uint32_t v_si = 0;
46383
  uint32_t v_sj = 0;
46384
  uint64_t v_i = 0;
46385
  uint32_t v_num_src_pixels = 0;
46386
46387
  if (self->private_impl.f_pixfmt == 536870923u) {
46388
    v_src_bytes_per_pixel = 2u;
46389
  } else if (self->private_impl.f_pixfmt == 2164308923u) {
46390
    v_src_bytes_per_pixel = 8u;
46391
  } else {
46392
    v_src_bytes_per_pixel = 4u;
46393
  }
46394
  v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
46395
  v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
46396
  if ((v_dst_bits_per_pixel & 7u) != 0u) {
46397
    return wuffs_base__make_status(wuffs_base__error__unsupported_option);
46398
  }
46399
  v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u);
46400
  v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel)));
46401
  v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
46402
  while (v_bi < self->private_impl.f_num_buffered_blocks) {
46403
    if (self->private_impl.f_width <= self->private_impl.f_dst_x) {
46404
      self->private_impl.f_dst_x = 0u;
46405
      self->private_impl.f_dst_y += 4u;
46406
      if (self->private_impl.f_dst_y >= self->private_impl.f_height) {
46407
        break;
46408
      }
46409
      v_rem_x = self->private_impl.f_width;
46410
    } else {
46411
      v_rem_x = (self->private_impl.f_width - self->private_impl.f_dst_x);
46412
    }
46413
    v_dy = 0u;
46414
    while (v_dy < 4u) {
46415
      if (v_src_bytes_per_pixel == 4u) {
46416
        v_si = ((1024u * v_dy) + (16u * v_bi));
46417
        v_sj = ((1024u * v_dy) + 1024u);
46418
      } else if (v_src_bytes_per_pixel < 4u) {
46419
        v_si = ((1024u * v_dy) + (8u * v_bi));
46420
        v_sj = ((1024u * v_dy) + 256u);
46421
      } else {
46422
        v_si = ((1024u * v_dy) + (32u * (v_bi & 31u)));
46423
        v_sj = ((1024u * v_dy) + 1024u);
46424
      }
46425
      if (v_si < v_sj) {
46426
        v_src = wuffs_base__make_slice_u8_ij(self->private_data.f_buffer, v_si, v_sj);
46427
      }
46428
      if (((uint64_t)((v_src_bytes_per_pixel * v_rem_x))) < ((uint64_t)(v_src.len))) {
46429
        v_src = wuffs_base__slice_u8__subslice_j(v_src, ((uint64_t)((v_src_bytes_per_pixel * v_rem_x))));
46430
      }
46431
      if (((uint32_t)(self->private_impl.f_dst_y + v_dy)) >= self->private_impl.f_height) {
46432
        break;
46433
      }
46434
      v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, ((uint32_t)(self->private_impl.f_dst_y + v_dy)));
46435
      if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) {
46436
        v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row);
46437
      }
46438
      v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel)));
46439
      if (v_i < ((uint64_t)(v_dst.len))) {
46440
        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);
46441
      }
46442
      v_dy += 1u;
46443
    }
46444
    v_num_src_pixels = (((uint32_t)(((uint64_t)(v_src.len)))) / v_src_bytes_per_pixel);
46445
    self->private_impl.f_dst_x += v_num_src_pixels;
46446
    v_bi += (((uint32_t)(v_num_src_pixels + 3u)) / 4u);
46447
  }
46448
  return wuffs_base__make_status(NULL);
46449
}
46450
46451
// -------- func etc2.decoder.frame_dirty_rect
46452
46453
WUFFS_BASE__GENERATED_C_CODE
46454
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
46455
wuffs_etc2__decoder__frame_dirty_rect(
46456
    const wuffs_etc2__decoder* self) {
46457
  if (!self) {
46458
    return wuffs_base__utility__empty_rect_ie_u32();
46459
  }
46460
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
46461
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
46462
    return wuffs_base__utility__empty_rect_ie_u32();
46463
  }
46464
46465
  return wuffs_base__utility__make_rect_ie_u32(
46466
      0u,
46467
      0u,
46468
      self->private_impl.f_width,
46469
      self->private_impl.f_height);
46470
}
46471
46472
// -------- func etc2.decoder.num_animation_loops
46473
46474
WUFFS_BASE__GENERATED_C_CODE
46475
WUFFS_BASE__MAYBE_STATIC uint32_t
46476
wuffs_etc2__decoder__num_animation_loops(
46477
    const wuffs_etc2__decoder* self) {
46478
  if (!self) {
46479
    return 0;
46480
  }
46481
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
46482
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
46483
    return 0;
46484
  }
46485
46486
  return 0u;
46487
}
46488
46489
// -------- func etc2.decoder.num_decoded_frame_configs
46490
46491
WUFFS_BASE__GENERATED_C_CODE
46492
WUFFS_BASE__MAYBE_STATIC uint64_t
46493
wuffs_etc2__decoder__num_decoded_frame_configs(
46494
    const wuffs_etc2__decoder* self) {
46495
  if (!self) {
46496
    return 0;
46497
  }
46498
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
46499
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
46500
    return 0;
46501
  }
46502
46503
  if (self->private_impl.f_call_sequence > 32u) {
46504
    return 1u;
46505
  }
46506
  return 0u;
46507
}
46508
46509
// -------- func etc2.decoder.num_decoded_frames
46510
46511
WUFFS_BASE__GENERATED_C_CODE
46512
WUFFS_BASE__MAYBE_STATIC uint64_t
46513
wuffs_etc2__decoder__num_decoded_frames(
46514
    const wuffs_etc2__decoder* self) {
46515
  if (!self) {
46516
    return 0;
46517
  }
46518
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
46519
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
46520
    return 0;
46521
  }
46522
46523
  if (self->private_impl.f_call_sequence > 64u) {
46524
    return 1u;
46525
  }
46526
  return 0u;
46527
}
46528
46529
// -------- func etc2.decoder.restart_frame
46530
46531
WUFFS_BASE__GENERATED_C_CODE
46532
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
46533
wuffs_etc2__decoder__restart_frame(
46534
    wuffs_etc2__decoder* self,
46535
    uint64_t a_index,
46536
    uint64_t a_io_position) {
46537
  if (!self) {
46538
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
46539
  }
46540
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
46541
    return wuffs_base__make_status(
46542
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
46543
        ? wuffs_base__error__disabled_by_previous_error
46544
        : wuffs_base__error__initialize_not_called);
46545
  }
46546
46547
  if (self->private_impl.f_call_sequence < 32u) {
46548
    return wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
46549
  }
46550
  if ((a_index != 0u) || (a_io_position != 16u)) {
46551
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
46552
  }
46553
  self->private_impl.f_call_sequence = 40u;
46554
  return wuffs_base__make_status(NULL);
46555
}
46556
46557
// -------- func etc2.decoder.set_report_metadata
46558
46559
WUFFS_BASE__GENERATED_C_CODE
46560
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
46561
wuffs_etc2__decoder__set_report_metadata(
46562
    wuffs_etc2__decoder* self,
46563
    uint32_t a_fourcc,
46564
    bool a_report) {
46565
  return wuffs_base__make_empty_struct();
46566
}
46567
46568
// -------- func etc2.decoder.tell_me_more
46569
46570
WUFFS_BASE__GENERATED_C_CODE
46571
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
46572
wuffs_etc2__decoder__tell_me_more(
46573
    wuffs_etc2__decoder* self,
46574
    wuffs_base__io_buffer* a_dst,
46575
    wuffs_base__more_information* a_minfo,
46576
    wuffs_base__io_buffer* a_src) {
46577
  if (!self) {
46578
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
46579
  }
46580
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
46581
    return wuffs_base__make_status(
46582
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
46583
        ? wuffs_base__error__disabled_by_previous_error
46584
        : wuffs_base__error__initialize_not_called);
46585
  }
46586
  if (!a_dst || !a_src) {
46587
    self->private_impl.magic = WUFFS_BASE__DISABLED;
46588
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
46589
  }
46590
  if ((self->private_impl.active_coroutine != 0) &&
46591
      (self->private_impl.active_coroutine != 4)) {
46592
    self->private_impl.magic = WUFFS_BASE__DISABLED;
46593
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
46594
  }
46595
  self->private_impl.active_coroutine = 0;
46596
  wuffs_base__status status = wuffs_base__make_status(NULL);
46597
46598
  status = wuffs_base__make_status(wuffs_base__error__no_more_information);
46599
  goto exit;
46600
46601
  goto ok;
46602
  ok:
46603
  goto exit;
46604
  exit:
46605
  if (wuffs_base__status__is_error(&status)) {
46606
    self->private_impl.magic = WUFFS_BASE__DISABLED;
46607
  }
46608
  return status;
46609
}
46610
46611
// -------- func etc2.decoder.workbuf_len
46612
46613
WUFFS_BASE__GENERATED_C_CODE
46614
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
46615
wuffs_etc2__decoder__workbuf_len(
46616
    const wuffs_etc2__decoder* self) {
46617
  if (!self) {
46618
    return wuffs_base__utility__empty_range_ii_u64();
46619
  }
46620
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
46621
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
46622
    return wuffs_base__utility__empty_range_ii_u64();
46623
  }
46624
46625
  return wuffs_base__utility__make_range_ii_u64(0u, 0u);
46626
}
46627
46628
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ETC2)
46629
46630
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GIF)
46631
46632
// ---------------- Status Codes Implementations
46633
46634
const char wuffs_gif__error__bad_lzw_code[] = "#gif: bad LZW code";
46635
const char wuffs_gif__error__bad_extension_label[] = "#gif: bad extension label";
46636
const char wuffs_gif__error__bad_frame_size[] = "#gif: bad frame size";
46637
const char wuffs_gif__error__bad_graphic_control[] = "#gif: bad graphic control";
46638
const char wuffs_gif__error__bad_header[] = "#gif: bad header";
46639
const char wuffs_gif__error__bad_literal_width[] = "#gif: bad literal width";
46640
const char wuffs_gif__error__bad_palette[] = "#gif: bad palette";
46641
const char wuffs_gif__error__truncated_input[] = "#gif: truncated input";
46642
const char wuffs_gif__error__internal_error_inconsistent_i_o[] = "#gif: internal error: inconsistent I/O";
46643
46644
// ---------------- Private Consts
46645
46646
static const uint32_t
46647
WUFFS_GIF__INTERLACE_START[5] WUFFS_BASE__POTENTIALLY_UNUSED = {
46648
  4294967295u, 1u, 2u, 4u, 0u,
46649
};
46650
46651
static const uint8_t
46652
WUFFS_GIF__INTERLACE_DELTA[5] WUFFS_BASE__POTENTIALLY_UNUSED = {
46653
  1u, 2u, 4u, 8u, 8u,
46654
};
46655
46656
static const uint8_t
46657
WUFFS_GIF__INTERLACE_COUNT[5] WUFFS_BASE__POTENTIALLY_UNUSED = {
46658
  0u, 1u, 2u, 4u, 8u,
46659
};
46660
46661
static const uint8_t
46662
WUFFS_GIF__ANIMEXTS1DOT0[11] WUFFS_BASE__POTENTIALLY_UNUSED = {
46663
  65u, 78u, 73u, 77u, 69u, 88u, 84u, 83u,
46664
  49u, 46u, 48u,
46665
};
46666
46667
static const uint8_t
46668
WUFFS_GIF__NETSCAPE2DOT0[11] WUFFS_BASE__POTENTIALLY_UNUSED = {
46669
  78u, 69u, 84u, 83u, 67u, 65u, 80u, 69u,
46670
  50u, 46u, 48u,
46671
};
46672
46673
static const uint8_t
46674
WUFFS_GIF__ICCRGBG1012[11] WUFFS_BASE__POTENTIALLY_UNUSED = {
46675
  73u, 67u, 67u, 82u, 71u, 66u, 71u, 49u,
46676
  48u, 49u, 50u,
46677
};
46678
46679
static const uint8_t
46680
WUFFS_GIF__XMPDATAXMP[11] WUFFS_BASE__POTENTIALLY_UNUSED = {
46681
  88u, 77u, 80u, 32u, 68u, 97u, 116u, 97u,
46682
  88u, 77u, 80u,
46683
};
46684
46685
#define WUFFS_GIF__QUIRKS_BASE 983928832u
46686
46687
#define WUFFS_GIF__QUIRKS_COUNT 7u
46688
46689
// ---------------- Private Initializer Prototypes
46690
46691
// ---------------- Private Function Prototypes
46692
46693
WUFFS_BASE__GENERATED_C_CODE
46694
static wuffs_base__status
46695
wuffs_gif__decoder__do_decode_image_config(
46696
    wuffs_gif__decoder* self,
46697
    wuffs_base__image_config* a_dst,
46698
    wuffs_base__io_buffer* a_src);
46699
46700
WUFFS_BASE__GENERATED_C_CODE
46701
static wuffs_base__status
46702
wuffs_gif__decoder__do_tell_me_more(
46703
    wuffs_gif__decoder* self,
46704
    wuffs_base__io_buffer* a_dst,
46705
    wuffs_base__more_information* a_minfo,
46706
    wuffs_base__io_buffer* a_src);
46707
46708
WUFFS_BASE__GENERATED_C_CODE
46709
static wuffs_base__status
46710
wuffs_gif__decoder__do_decode_frame_config(
46711
    wuffs_gif__decoder* self,
46712
    wuffs_base__frame_config* a_dst,
46713
    wuffs_base__io_buffer* a_src);
46714
46715
WUFFS_BASE__GENERATED_C_CODE
46716
static wuffs_base__status
46717
wuffs_gif__decoder__skip_frame(
46718
    wuffs_gif__decoder* self,
46719
    wuffs_base__io_buffer* a_src);
46720
46721
WUFFS_BASE__GENERATED_C_CODE
46722
static wuffs_base__status
46723
wuffs_gif__decoder__do_decode_frame(
46724
    wuffs_gif__decoder* self,
46725
    wuffs_base__pixel_buffer* a_dst,
46726
    wuffs_base__io_buffer* a_src,
46727
    wuffs_base__pixel_blend a_blend,
46728
    wuffs_base__slice_u8 a_workbuf,
46729
    wuffs_base__decode_frame_options* a_opts);
46730
46731
WUFFS_BASE__GENERATED_C_CODE
46732
static wuffs_base__empty_struct
46733
wuffs_gif__decoder__reset_gc(
46734
    wuffs_gif__decoder* self);
46735
46736
WUFFS_BASE__GENERATED_C_CODE
46737
static wuffs_base__status
46738
wuffs_gif__decoder__decode_up_to_id_part1(
46739
    wuffs_gif__decoder* self,
46740
    wuffs_base__io_buffer* a_src);
46741
46742
WUFFS_BASE__GENERATED_C_CODE
46743
static wuffs_base__status
46744
wuffs_gif__decoder__decode_header(
46745
    wuffs_gif__decoder* self,
46746
    wuffs_base__io_buffer* a_src);
46747
46748
WUFFS_BASE__GENERATED_C_CODE
46749
static wuffs_base__status
46750
wuffs_gif__decoder__decode_lsd(
46751
    wuffs_gif__decoder* self,
46752
    wuffs_base__io_buffer* a_src);
46753
46754
WUFFS_BASE__GENERATED_C_CODE
46755
static wuffs_base__status
46756
wuffs_gif__decoder__decode_extension(
46757
    wuffs_gif__decoder* self,
46758
    wuffs_base__io_buffer* a_src);
46759
46760
WUFFS_BASE__GENERATED_C_CODE
46761
static wuffs_base__status
46762
wuffs_gif__decoder__skip_blocks(
46763
    wuffs_gif__decoder* self,
46764
    wuffs_base__io_buffer* a_src);
46765
46766
WUFFS_BASE__GENERATED_C_CODE
46767
static wuffs_base__status
46768
wuffs_gif__decoder__decode_ae(
46769
    wuffs_gif__decoder* self,
46770
    wuffs_base__io_buffer* a_src);
46771
46772
WUFFS_BASE__GENERATED_C_CODE
46773
static wuffs_base__status
46774
wuffs_gif__decoder__decode_gc(
46775
    wuffs_gif__decoder* self,
46776
    wuffs_base__io_buffer* a_src);
46777
46778
WUFFS_BASE__GENERATED_C_CODE
46779
static wuffs_base__status
46780
wuffs_gif__decoder__decode_id_part0(
46781
    wuffs_gif__decoder* self,
46782
    wuffs_base__io_buffer* a_src);
46783
46784
WUFFS_BASE__GENERATED_C_CODE
46785
static wuffs_base__status
46786
wuffs_gif__decoder__decode_id_part1(
46787
    wuffs_gif__decoder* self,
46788
    wuffs_base__pixel_buffer* a_dst,
46789
    wuffs_base__io_buffer* a_src,
46790
    wuffs_base__pixel_blend a_blend);
46791
46792
WUFFS_BASE__GENERATED_C_CODE
46793
static wuffs_base__status
46794
wuffs_gif__decoder__decode_id_part2(
46795
    wuffs_gif__decoder* self,
46796
    wuffs_base__pixel_buffer* a_dst,
46797
    wuffs_base__io_buffer* a_src,
46798
    wuffs_base__slice_u8 a_workbuf);
46799
46800
WUFFS_BASE__GENERATED_C_CODE
46801
static wuffs_base__status
46802
wuffs_gif__decoder__copy_to_image_buffer(
46803
    wuffs_gif__decoder* self,
46804
    wuffs_base__pixel_buffer* a_pb,
46805
    wuffs_base__slice_u8 a_src);
46806
46807
WUFFS_BASE__GENERATED_C_CODE
46808
static wuffs_base__empty_struct
46809
wuffs_gif__decoder__lzw_init(
46810
    wuffs_gif__decoder* self);
46811
46812
WUFFS_BASE__GENERATED_C_CODE
46813
static wuffs_base__empty_struct
46814
wuffs_gif__decoder__lzw_read_from(
46815
    wuffs_gif__decoder* self,
46816
    wuffs_base__io_buffer* a_src);
46817
46818
// ---------------- VTables
46819
46820
const wuffs_base__image_decoder__func_ptrs
46821
wuffs_gif__decoder__func_ptrs_for__wuffs_base__image_decoder = {
46822
  (wuffs_base__status(*)(void*,
46823
      wuffs_base__pixel_buffer*,
46824
      wuffs_base__io_buffer*,
46825
      wuffs_base__pixel_blend,
46826
      wuffs_base__slice_u8,
46827
      wuffs_base__decode_frame_options*))(&wuffs_gif__decoder__decode_frame),
46828
  (wuffs_base__status(*)(void*,
46829
      wuffs_base__frame_config*,
46830
      wuffs_base__io_buffer*))(&wuffs_gif__decoder__decode_frame_config),
46831
  (wuffs_base__status(*)(void*,
46832
      wuffs_base__image_config*,
46833
      wuffs_base__io_buffer*))(&wuffs_gif__decoder__decode_image_config),
46834
  (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_gif__decoder__frame_dirty_rect),
46835
  (uint64_t(*)(const void*,
46836
      uint32_t))(&wuffs_gif__decoder__get_quirk),
46837
  (uint32_t(*)(const void*))(&wuffs_gif__decoder__num_animation_loops),
46838
  (uint64_t(*)(const void*))(&wuffs_gif__decoder__num_decoded_frame_configs),
46839
  (uint64_t(*)(const void*))(&wuffs_gif__decoder__num_decoded_frames),
46840
  (wuffs_base__status(*)(void*,
46841
      uint64_t,
46842
      uint64_t))(&wuffs_gif__decoder__restart_frame),
46843
  (wuffs_base__status(*)(void*,
46844
      uint32_t,
46845
      uint64_t))(&wuffs_gif__decoder__set_quirk),
46846
  (wuffs_base__empty_struct(*)(void*,
46847
      uint32_t,
46848
      bool))(&wuffs_gif__decoder__set_report_metadata),
46849
  (wuffs_base__status(*)(void*,
46850
      wuffs_base__io_buffer*,
46851
      wuffs_base__more_information*,
46852
      wuffs_base__io_buffer*))(&wuffs_gif__decoder__tell_me_more),
46853
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_gif__decoder__workbuf_len),
46854
};
46855
46856
// ---------------- Initializer Implementations
46857
46858
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
46859
wuffs_gif__decoder__initialize(
46860
    wuffs_gif__decoder* self,
46861
    size_t sizeof_star_self,
46862
    uint64_t wuffs_version,
46863
    uint32_t options){
46864
  if (!self) {
46865
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
46866
  }
46867
  if (sizeof(*self) != sizeof_star_self) {
46868
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
46869
  }
46870
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
46871
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
46872
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
46873
  }
46874
46875
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
46876
    // The whole point of this if-check is to detect an uninitialized *self.
46877
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
46878
#if !defined(__clang__) && defined(__GNUC__)
46879
#pragma GCC diagnostic push
46880
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
46881
#endif
46882
    if (self->private_impl.magic != 0) {
46883
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
46884
    }
46885
#if !defined(__clang__) && defined(__GNUC__)
46886
#pragma GCC diagnostic pop
46887
#endif
46888
  } else {
46889
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
46890
      memset(self, 0, sizeof(*self));
46891
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
46892
    } else {
46893
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
46894
    }
46895
  }
46896
46897
  self->private_impl.magic = WUFFS_BASE__MAGIC;
46898
  self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name =
46899
      wuffs_base__image_decoder__vtable_name;
46900
  self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers =
46901
      (const void*)(&wuffs_gif__decoder__func_ptrs_for__wuffs_base__image_decoder);
46902
  return wuffs_base__make_status(NULL);
46903
}
46904
46905
wuffs_gif__decoder*
46906
wuffs_gif__decoder__alloc(void) {
46907
  wuffs_gif__decoder* x =
46908
      (wuffs_gif__decoder*)(calloc(1, sizeof(wuffs_gif__decoder)));
46909
  if (!x) {
46910
    return NULL;
46911
  }
46912
  if (wuffs_gif__decoder__initialize(
46913
      x, sizeof(wuffs_gif__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
46914
    free(x);
46915
    return NULL;
46916
  }
46917
  return x;
46918
}
46919
46920
size_t
46921
sizeof__wuffs_gif__decoder(void) {
46922
  return sizeof(wuffs_gif__decoder);
46923
}
46924
46925
// ---------------- Function Implementations
46926
46927
// -------- func gif.decoder.get_quirk
46928
46929
WUFFS_BASE__GENERATED_C_CODE
46930
WUFFS_BASE__MAYBE_STATIC uint64_t
46931
wuffs_gif__decoder__get_quirk(
46932
    const wuffs_gif__decoder* self,
46933
    uint32_t a_key) {
46934
  if (!self) {
46935
    return 0;
46936
  }
46937
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
46938
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
46939
    return 0;
46940
  }
46941
46942
  uint32_t v_key = 0;
46943
46944
  if (a_key >= 983928832u) {
46945
    v_key = (a_key - 983928832u);
46946
    if (v_key < 7u) {
46947
      if (self->private_impl.f_quirks[v_key]) {
46948
        return 1u;
46949
      }
46950
    }
46951
  }
46952
  return 0u;
46953
}
46954
46955
// -------- func gif.decoder.set_quirk
46956
46957
WUFFS_BASE__GENERATED_C_CODE
46958
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
46959
wuffs_gif__decoder__set_quirk(
46960
    wuffs_gif__decoder* self,
46961
    uint32_t a_key,
46962
    uint64_t a_value) {
46963
  if (!self) {
46964
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
46965
  }
46966
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
46967
    return wuffs_base__make_status(
46968
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
46969
        ? wuffs_base__error__disabled_by_previous_error
46970
        : wuffs_base__error__initialize_not_called);
46971
  }
46972
46973
  if ((self->private_impl.f_call_sequence == 0u) && (a_key >= 983928832u)) {
46974
    a_key -= 983928832u;
46975
    if (a_key < 7u) {
46976
      self->private_impl.f_quirks[a_key] = (a_value > 0u);
46977
      return wuffs_base__make_status(NULL);
46978
    }
46979
  }
46980
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
46981
}
46982
46983
// -------- func gif.decoder.decode_image_config
46984
46985
WUFFS_BASE__GENERATED_C_CODE
46986
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
46987
wuffs_gif__decoder__decode_image_config(
46988
    wuffs_gif__decoder* self,
46989
    wuffs_base__image_config* a_dst,
46990
    wuffs_base__io_buffer* a_src) {
46991
  if (!self) {
46992
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
46993
  }
46994
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
46995
    return wuffs_base__make_status(
46996
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
46997
        ? wuffs_base__error__disabled_by_previous_error
46998
        : wuffs_base__error__initialize_not_called);
46999
  }
47000
  if (!a_src) {
47001
    self->private_impl.magic = WUFFS_BASE__DISABLED;
47002
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
47003
  }
47004
  if ((self->private_impl.active_coroutine != 0) &&
47005
      (self->private_impl.active_coroutine != 1)) {
47006
    self->private_impl.magic = WUFFS_BASE__DISABLED;
47007
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
47008
  }
47009
  self->private_impl.active_coroutine = 0;
47010
  wuffs_base__status status = wuffs_base__make_status(NULL);
47011
47012
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
47013
47014
  uint32_t coro_susp_point = self->private_impl.p_decode_image_config;
47015
  switch (coro_susp_point) {
47016
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
47017
47018
    while (true) {
47019
      {
47020
        wuffs_base__status t_0 = wuffs_gif__decoder__do_decode_image_config(self, a_dst, a_src);
47021
        v_status = t_0;
47022
      }
47023
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
47024
        status = wuffs_base__make_status(wuffs_gif__error__truncated_input);
47025
        goto exit;
47026
      }
47027
      status = v_status;
47028
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
47029
    }
47030
47031
    ok:
47032
    self->private_impl.p_decode_image_config = 0;
47033
    goto exit;
47034
  }
47035
47036
  goto suspend;
47037
  suspend:
47038
  self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
47039
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
47040
47041
  goto exit;
47042
  exit:
47043
  if (wuffs_base__status__is_error(&status)) {
47044
    self->private_impl.magic = WUFFS_BASE__DISABLED;
47045
  }
47046
  return status;
47047
}
47048
47049
// -------- func gif.decoder.do_decode_image_config
47050
47051
WUFFS_BASE__GENERATED_C_CODE
47052
static wuffs_base__status
47053
wuffs_gif__decoder__do_decode_image_config(
47054
    wuffs_gif__decoder* self,
47055
    wuffs_base__image_config* a_dst,
47056
    wuffs_base__io_buffer* a_src) {
47057
  wuffs_base__status status = wuffs_base__make_status(NULL);
47058
47059
  bool v_ffio = false;
47060
47061
  uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config;
47062
  switch (coro_susp_point) {
47063
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
47064
47065
    if (self->private_impl.f_call_sequence != 0u) {
47066
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
47067
      goto exit;
47068
    } else if ( ! self->private_impl.f_seen_header) {
47069
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
47070
      status = wuffs_gif__decoder__decode_header(self, a_src);
47071
      if (status.repr) {
47072
        goto suspend;
47073
      }
47074
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
47075
      status = wuffs_gif__decoder__decode_lsd(self, a_src);
47076
      if (status.repr) {
47077
        goto suspend;
47078
      }
47079
      self->private_impl.f_seen_header = true;
47080
    }
47081
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
47082
    status = wuffs_gif__decoder__decode_up_to_id_part1(self, a_src);
47083
    if (status.repr) {
47084
      goto suspend;
47085
    }
47086
    v_ffio =  ! self->private_impl.f_gc_has_transparent_index;
47087
    if ( ! self->private_impl.f_quirks[2u]) {
47088
      v_ffio = (v_ffio &&
47089
          (self->private_impl.f_frame_rect_x0 == 0u) &&
47090
          (self->private_impl.f_frame_rect_y0 == 0u) &&
47091
          (self->private_impl.f_frame_rect_x1 == self->private_impl.f_width) &&
47092
          (self->private_impl.f_frame_rect_y1 == self->private_impl.f_height));
47093
    } else if (v_ffio) {
47094
      self->private_impl.f_black_color_u32_argb_premul = 4278190080u;
47095
    }
47096
    if (self->private_impl.f_background_color_u32_argb_premul == 77u) {
47097
      self->private_impl.f_background_color_u32_argb_premul = self->private_impl.f_black_color_u32_argb_premul;
47098
    }
47099
    if (a_dst != NULL) {
47100
      wuffs_base__image_config__set(
47101
          a_dst,
47102
          2198077448u,
47103
          0u,
47104
          self->private_impl.f_width,
47105
          self->private_impl.f_height,
47106
          self->private_impl.f_frame_config_io_position,
47107
          v_ffio);
47108
    }
47109
    if (self->private_impl.f_call_sequence == 0u) {
47110
      self->private_impl.f_call_sequence = 32u;
47111
    }
47112
47113
    goto ok;
47114
    ok:
47115
    self->private_impl.p_do_decode_image_config = 0;
47116
    goto exit;
47117
  }
47118
47119
  goto suspend;
47120
  suspend:
47121
  self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
47122
47123
  goto exit;
47124
  exit:
47125
  return status;
47126
}
47127
47128
// -------- func gif.decoder.set_report_metadata
47129
47130
WUFFS_BASE__GENERATED_C_CODE
47131
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
47132
wuffs_gif__decoder__set_report_metadata(
47133
    wuffs_gif__decoder* self,
47134
    uint32_t a_fourcc,
47135
    bool a_report) {
47136
  if (!self) {
47137
    return wuffs_base__make_empty_struct();
47138
  }
47139
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
47140
    return wuffs_base__make_empty_struct();
47141
  }
47142
47143
  if (a_fourcc == 1229144912u) {
47144
    self->private_impl.f_report_metadata_iccp = a_report;
47145
  } else if (a_fourcc == 1481461792u) {
47146
    self->private_impl.f_report_metadata_xmp = a_report;
47147
  }
47148
  return wuffs_base__make_empty_struct();
47149
}
47150
47151
// -------- func gif.decoder.tell_me_more
47152
47153
WUFFS_BASE__GENERATED_C_CODE
47154
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
47155
wuffs_gif__decoder__tell_me_more(
47156
    wuffs_gif__decoder* self,
47157
    wuffs_base__io_buffer* a_dst,
47158
    wuffs_base__more_information* a_minfo,
47159
    wuffs_base__io_buffer* a_src) {
47160
  if (!self) {
47161
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
47162
  }
47163
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
47164
    return wuffs_base__make_status(
47165
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
47166
        ? wuffs_base__error__disabled_by_previous_error
47167
        : wuffs_base__error__initialize_not_called);
47168
  }
47169
  if (!a_dst || !a_src) {
47170
    self->private_impl.magic = WUFFS_BASE__DISABLED;
47171
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
47172
  }
47173
  if ((self->private_impl.active_coroutine != 0) &&
47174
      (self->private_impl.active_coroutine != 2)) {
47175
    self->private_impl.magic = WUFFS_BASE__DISABLED;
47176
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
47177
  }
47178
  self->private_impl.active_coroutine = 0;
47179
  wuffs_base__status status = wuffs_base__make_status(NULL);
47180
47181
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
47182
47183
  uint32_t coro_susp_point = self->private_impl.p_tell_me_more;
47184
  switch (coro_susp_point) {
47185
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
47186
47187
    while (true) {
47188
      {
47189
        wuffs_base__status t_0 = wuffs_gif__decoder__do_tell_me_more(self, a_dst, a_minfo, a_src);
47190
        v_status = t_0;
47191
      }
47192
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
47193
        status = wuffs_base__make_status(wuffs_gif__error__truncated_input);
47194
        goto exit;
47195
      }
47196
      status = v_status;
47197
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
47198
    }
47199
47200
    ok:
47201
    self->private_impl.p_tell_me_more = 0;
47202
    goto exit;
47203
  }
47204
47205
  goto suspend;
47206
  suspend:
47207
  self->private_impl.p_tell_me_more = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
47208
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0;
47209
47210
  goto exit;
47211
  exit:
47212
  if (wuffs_base__status__is_error(&status)) {
47213
    self->private_impl.magic = WUFFS_BASE__DISABLED;
47214
  }
47215
  return status;
47216
}
47217
47218
// -------- func gif.decoder.do_tell_me_more
47219
47220
WUFFS_BASE__GENERATED_C_CODE
47221
static wuffs_base__status
47222
wuffs_gif__decoder__do_tell_me_more(
47223
    wuffs_gif__decoder* self,
47224
    wuffs_base__io_buffer* a_dst,
47225
    wuffs_base__more_information* a_minfo,
47226
    wuffs_base__io_buffer* a_src) {
47227
  wuffs_base__status status = wuffs_base__make_status(NULL);
47228
47229
  uint64_t v_chunk_length = 0;
47230
47231
  const uint8_t* iop_a_src = NULL;
47232
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
47233
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
47234
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
47235
  if (a_src && a_src->data.ptr) {
47236
    io0_a_src = a_src->data.ptr;
47237
    io1_a_src = io0_a_src + a_src->meta.ri;
47238
    iop_a_src = io1_a_src;
47239
    io2_a_src = io0_a_src + a_src->meta.wi;
47240
  }
47241
47242
  uint32_t coro_susp_point = self->private_impl.p_do_tell_me_more;
47243
  switch (coro_susp_point) {
47244
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
47245
47246
    if (((uint8_t)(self->private_impl.f_call_sequence & 16u)) == 0u) {
47247
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
47248
      goto exit;
47249
    }
47250
    if (self->private_impl.f_metadata_fourcc == 0u) {
47251
      status = wuffs_base__make_status(wuffs_base__error__no_more_information);
47252
      goto exit;
47253
    }
47254
    while (true) {
47255
      while (true) {
47256
        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) {
47257
          if (a_minfo != NULL) {
47258
            wuffs_base__more_information__set(a_minfo,
47259
                2u,
47260
                0u,
47261
                self->private_impl.f_metadata_io_position,
47262
                0u,
47263
                0u);
47264
          }
47265
          status = wuffs_base__make_status(wuffs_base__suspension__mispositioned_read);
47266
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
47267
          continue;
47268
        }
47269
        if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
47270
          if (a_minfo != NULL) {
47271
            wuffs_base__more_information__set(a_minfo,
47272
                0u,
47273
                0u,
47274
                0u,
47275
                0u,
47276
                0u);
47277
          }
47278
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
47279
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2);
47280
          continue;
47281
        }
47282
        break;
47283
      }
47284
      v_chunk_length = ((uint64_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src)));
47285
      if (v_chunk_length <= 0u) {
47286
        iop_a_src += 1u;
47287
        break;
47288
      }
47289
      if (self->private_impl.f_metadata_fourcc == 1481461792u) {
47290
        v_chunk_length += 1u;
47291
      } else {
47292
        iop_a_src += 1u;
47293
      }
47294
      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);
47295
      if (a_minfo != NULL) {
47296
        wuffs_base__more_information__set(a_minfo,
47297
            3u,
47298
            self->private_impl.f_metadata_fourcc,
47299
            0u,
47300
            wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))),
47301
            self->private_impl.f_metadata_io_position);
47302
      }
47303
      status = wuffs_base__make_status(wuffs_base__suspension__even_more_information);
47304
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3);
47305
    }
47306
    if (a_minfo != NULL) {
47307
      wuffs_base__more_information__set(a_minfo,
47308
          3u,
47309
          self->private_impl.f_metadata_fourcc,
47310
          0u,
47311
          self->private_impl.f_metadata_io_position,
47312
          self->private_impl.f_metadata_io_position);
47313
    }
47314
    self->private_impl.f_call_sequence &= 239u;
47315
    self->private_impl.f_metadata_fourcc = 0u;
47316
    self->private_impl.f_metadata_io_position = 0u;
47317
    status = wuffs_base__make_status(NULL);
47318
    goto ok;
47319
47320
    ok:
47321
    self->private_impl.p_do_tell_me_more = 0;
47322
    goto exit;
47323
  }
47324
47325
  goto suspend;
47326
  suspend:
47327
  self->private_impl.p_do_tell_me_more = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
47328
47329
  goto exit;
47330
  exit:
47331
  if (a_src && a_src->data.ptr) {
47332
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
47333
  }
47334
47335
  return status;
47336
}
47337
47338
// -------- func gif.decoder.num_animation_loops
47339
47340
WUFFS_BASE__GENERATED_C_CODE
47341
WUFFS_BASE__MAYBE_STATIC uint32_t
47342
wuffs_gif__decoder__num_animation_loops(
47343
    const wuffs_gif__decoder* self) {
47344
  if (!self) {
47345
    return 0;
47346
  }
47347
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
47348
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
47349
    return 0;
47350
  }
47351
47352
  if (self->private_impl.f_seen_num_animation_loops_value) {
47353
    return self->private_impl.f_num_animation_loops_value;
47354
  }
47355
  if (self->private_impl.f_num_decoded_frame_configs_value > 1u) {
47356
    return 1u;
47357
  }
47358
  return 0u;
47359
}
47360
47361
// -------- func gif.decoder.num_decoded_frame_configs
47362
47363
WUFFS_BASE__GENERATED_C_CODE
47364
WUFFS_BASE__MAYBE_STATIC uint64_t
47365
wuffs_gif__decoder__num_decoded_frame_configs(
47366
    const wuffs_gif__decoder* self) {
47367
  if (!self) {
47368
    return 0;
47369
  }
47370
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
47371
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
47372
    return 0;
47373
  }
47374
47375
  return self->private_impl.f_num_decoded_frame_configs_value;
47376
}
47377
47378
// -------- func gif.decoder.num_decoded_frames
47379
47380
WUFFS_BASE__GENERATED_C_CODE
47381
WUFFS_BASE__MAYBE_STATIC uint64_t
47382
wuffs_gif__decoder__num_decoded_frames(
47383
    const wuffs_gif__decoder* self) {
47384
  if (!self) {
47385
    return 0;
47386
  }
47387
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
47388
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
47389
    return 0;
47390
  }
47391
47392
  return self->private_impl.f_num_decoded_frames_value;
47393
}
47394
47395
// -------- func gif.decoder.frame_dirty_rect
47396
47397
WUFFS_BASE__GENERATED_C_CODE
47398
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
47399
wuffs_gif__decoder__frame_dirty_rect(
47400
    const wuffs_gif__decoder* self) {
47401
  if (!self) {
47402
    return wuffs_base__utility__empty_rect_ie_u32();
47403
  }
47404
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
47405
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
47406
    return wuffs_base__utility__empty_rect_ie_u32();
47407
  }
47408
47409
  return wuffs_base__utility__make_rect_ie_u32(
47410
      wuffs_base__u32__min(self->private_impl.f_frame_rect_x0, self->private_impl.f_width),
47411
      wuffs_base__u32__min(self->private_impl.f_frame_rect_y0, self->private_impl.f_height),
47412
      wuffs_base__u32__min(self->private_impl.f_frame_rect_x1, self->private_impl.f_width),
47413
      wuffs_base__u32__min(self->private_impl.f_dirty_max_excl_y, self->private_impl.f_height));
47414
}
47415
47416
// -------- func gif.decoder.workbuf_len
47417
47418
WUFFS_BASE__GENERATED_C_CODE
47419
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
47420
wuffs_gif__decoder__workbuf_len(
47421
    const wuffs_gif__decoder* self) {
47422
  if (!self) {
47423
    return wuffs_base__utility__empty_range_ii_u64();
47424
  }
47425
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
47426
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
47427
    return wuffs_base__utility__empty_range_ii_u64();
47428
  }
47429
47430
  return wuffs_base__utility__make_range_ii_u64(0u, 0u);
47431
}
47432
47433
// -------- func gif.decoder.restart_frame
47434
47435
WUFFS_BASE__GENERATED_C_CODE
47436
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
47437
wuffs_gif__decoder__restart_frame(
47438
    wuffs_gif__decoder* self,
47439
    uint64_t a_index,
47440
    uint64_t a_io_position) {
47441
  if (!self) {
47442
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
47443
  }
47444
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
47445
    return wuffs_base__make_status(
47446
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
47447
        ? wuffs_base__error__disabled_by_previous_error
47448
        : wuffs_base__error__initialize_not_called);
47449
  }
47450
47451
  if (self->private_impl.f_call_sequence < 32u) {
47452
    return wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
47453
  } else if (a_io_position == 0u) {
47454
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
47455
  }
47456
  self->private_impl.f_delayed_num_decoded_frames = false;
47457
  self->private_impl.f_frame_config_io_position = a_io_position;
47458
  self->private_impl.f_num_decoded_frame_configs_value = a_index;
47459
  self->private_impl.f_num_decoded_frames_value = a_index;
47460
  wuffs_gif__decoder__reset_gc(self);
47461
  self->private_impl.f_call_sequence = 40u;
47462
  return wuffs_base__make_status(NULL);
47463
}
47464
47465
// -------- func gif.decoder.decode_frame_config
47466
47467
WUFFS_BASE__GENERATED_C_CODE
47468
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
47469
wuffs_gif__decoder__decode_frame_config(
47470
    wuffs_gif__decoder* self,
47471
    wuffs_base__frame_config* a_dst,
47472
    wuffs_base__io_buffer* a_src) {
47473
  if (!self) {
47474
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
47475
  }
47476
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
47477
    return wuffs_base__make_status(
47478
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
47479
        ? wuffs_base__error__disabled_by_previous_error
47480
        : wuffs_base__error__initialize_not_called);
47481
  }
47482
  if (!a_src) {
47483
    self->private_impl.magic = WUFFS_BASE__DISABLED;
47484
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
47485
  }
47486
  if ((self->private_impl.active_coroutine != 0) &&
47487
      (self->private_impl.active_coroutine != 3)) {
47488
    self->private_impl.magic = WUFFS_BASE__DISABLED;
47489
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
47490
  }
47491
  self->private_impl.active_coroutine = 0;
47492
  wuffs_base__status status = wuffs_base__make_status(NULL);
47493
47494
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
47495
47496
  uint32_t coro_susp_point = self->private_impl.p_decode_frame_config;
47497
  switch (coro_susp_point) {
47498
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
47499
47500
    while (true) {
47501
      {
47502
        wuffs_base__status t_0 = wuffs_gif__decoder__do_decode_frame_config(self, a_dst, a_src);
47503
        v_status = t_0;
47504
      }
47505
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
47506
        status = wuffs_base__make_status(wuffs_gif__error__truncated_input);
47507
        goto exit;
47508
      }
47509
      status = v_status;
47510
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
47511
    }
47512
47513
    ok:
47514
    self->private_impl.p_decode_frame_config = 0;
47515
    goto exit;
47516
  }
47517
47518
  goto suspend;
47519
  suspend:
47520
  self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
47521
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0;
47522
47523
  goto exit;
47524
  exit:
47525
  if (wuffs_base__status__is_error(&status)) {
47526
    self->private_impl.magic = WUFFS_BASE__DISABLED;
47527
  }
47528
  return status;
47529
}
47530
47531
// -------- func gif.decoder.do_decode_frame_config
47532
47533
WUFFS_BASE__GENERATED_C_CODE
47534
static wuffs_base__status
47535
wuffs_gif__decoder__do_decode_frame_config(
47536
    wuffs_gif__decoder* self,
47537
    wuffs_base__frame_config* a_dst,
47538
    wuffs_base__io_buffer* a_src) {
47539
  wuffs_base__status status = wuffs_base__make_status(NULL);
47540
47541
  uint32_t v_background_color = 0;
47542
  uint8_t v_flags = 0;
47543
47544
  const uint8_t* iop_a_src = NULL;
47545
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
47546
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
47547
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
47548
  if (a_src && a_src->data.ptr) {
47549
    io0_a_src = a_src->data.ptr;
47550
    io1_a_src = io0_a_src + a_src->meta.ri;
47551
    iop_a_src = io1_a_src;
47552
    io2_a_src = io0_a_src + a_src->meta.wi;
47553
  }
47554
47555
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config;
47556
  if (coro_susp_point) {
47557
    v_background_color = self->private_data.s_do_decode_frame_config.v_background_color;
47558
  }
47559
  switch (coro_susp_point) {
47560
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
47561
47562
    self->private_impl.f_dirty_max_excl_y = 0u;
47563
    if (((uint8_t)(self->private_impl.f_call_sequence & 16u)) != 0u) {
47564
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
47565
      goto exit;
47566
    } else if (self->private_impl.f_call_sequence == 32u) {
47567
    } else if (self->private_impl.f_call_sequence < 32u) {
47568
      if (a_src) {
47569
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
47570
      }
47571
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
47572
      status = wuffs_gif__decoder__do_decode_image_config(self, NULL, a_src);
47573
      if (a_src) {
47574
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
47575
      }
47576
      if (status.repr) {
47577
        goto suspend;
47578
      }
47579
    } else if (self->private_impl.f_call_sequence == 40u) {
47580
      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)))) {
47581
        status = wuffs_base__make_status(wuffs_base__error__bad_restart);
47582
        goto exit;
47583
      }
47584
    } else if (self->private_impl.f_call_sequence == 64u) {
47585
      if (a_src) {
47586
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
47587
      }
47588
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
47589
      status = wuffs_gif__decoder__skip_frame(self, a_src);
47590
      if (a_src) {
47591
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
47592
      }
47593
      if (status.repr) {
47594
        goto suspend;
47595
      }
47596
      if (self->private_impl.f_call_sequence >= 96u) {
47597
        status = wuffs_base__make_status(wuffs_base__note__end_of_data);
47598
        goto ok;
47599
      }
47600
    } else {
47601
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
47602
      goto ok;
47603
    }
47604
    if ((self->private_impl.f_num_decoded_frame_configs_value > 0u) || (self->private_impl.f_call_sequence == 40u)) {
47605
      if (a_src) {
47606
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
47607
      }
47608
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
47609
      status = wuffs_gif__decoder__decode_up_to_id_part1(self, a_src);
47610
      if (a_src) {
47611
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
47612
      }
47613
      if (status.repr) {
47614
        goto suspend;
47615
      }
47616
      if (self->private_impl.f_call_sequence >= 96u) {
47617
        status = wuffs_base__make_status(wuffs_base__note__end_of_data);
47618
        goto ok;
47619
      }
47620
    }
47621
    v_background_color = self->private_impl.f_black_color_u32_argb_premul;
47622
    if ( ! self->private_impl.f_gc_has_transparent_index) {
47623
      v_background_color = self->private_impl.f_background_color_u32_argb_premul;
47624
      if (self->private_impl.f_quirks[1u] && (self->private_impl.f_num_decoded_frame_configs_value == 0u)) {
47625
        while (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
47626
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
47627
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4);
47628
        }
47629
        v_flags = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
47630
        if (((uint8_t)(v_flags & 128u)) != 0u) {
47631
          v_background_color = self->private_impl.f_black_color_u32_argb_premul;
47632
        }
47633
      }
47634
    }
47635
    if (a_dst != NULL) {
47636
      wuffs_base__frame_config__set(
47637
          a_dst,
47638
          wuffs_base__utility__make_rect_ie_u32(
47639
          wuffs_base__u32__min(self->private_impl.f_frame_rect_x0, self->private_impl.f_width),
47640
          wuffs_base__u32__min(self->private_impl.f_frame_rect_y0, self->private_impl.f_height),
47641
          wuffs_base__u32__min(self->private_impl.f_frame_rect_x1, self->private_impl.f_width),
47642
          wuffs_base__u32__min(self->private_impl.f_frame_rect_y1, self->private_impl.f_height)),
47643
          ((wuffs_base__flicks)(self->private_impl.f_gc_duration)),
47644
          self->private_impl.f_num_decoded_frame_configs_value,
47645
          self->private_impl.f_frame_config_io_position,
47646
          self->private_impl.f_gc_disposal,
47647
          ! self->private_impl.f_gc_has_transparent_index,
47648
          false,
47649
          v_background_color);
47650
    }
47651
    wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frame_configs_value, 1u);
47652
    self->private_impl.f_call_sequence = 64u;
47653
47654
    ok:
47655
    self->private_impl.p_do_decode_frame_config = 0;
47656
    goto exit;
47657
  }
47658
47659
  goto suspend;
47660
  suspend:
47661
  self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
47662
  self->private_data.s_do_decode_frame_config.v_background_color = v_background_color;
47663
47664
  goto exit;
47665
  exit:
47666
  if (a_src && a_src->data.ptr) {
47667
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
47668
  }
47669
47670
  return status;
47671
}
47672
47673
// -------- func gif.decoder.skip_frame
47674
47675
WUFFS_BASE__GENERATED_C_CODE
47676
static wuffs_base__status
47677
wuffs_gif__decoder__skip_frame(
47678
    wuffs_gif__decoder* self,
47679
    wuffs_base__io_buffer* a_src) {
47680
  wuffs_base__status status = wuffs_base__make_status(NULL);
47681
47682
  uint8_t v_flags = 0;
47683
  uint8_t v_lw = 0;
47684
47685
  const uint8_t* iop_a_src = NULL;
47686
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
47687
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
47688
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
47689
  if (a_src && a_src->data.ptr) {
47690
    io0_a_src = a_src->data.ptr;
47691
    io1_a_src = io0_a_src + a_src->meta.ri;
47692
    iop_a_src = io1_a_src;
47693
    io2_a_src = io0_a_src + a_src->meta.wi;
47694
  }
47695
47696
  uint32_t coro_susp_point = self->private_impl.p_skip_frame;
47697
  switch (coro_susp_point) {
47698
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
47699
47700
    {
47701
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
47702
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
47703
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
47704
        goto suspend;
47705
      }
47706
      uint8_t t_0 = *iop_a_src++;
47707
      v_flags = t_0;
47708
    }
47709
    if (((uint8_t)(v_flags & 128u)) != 0u) {
47710
      self->private_data.s_skip_frame.scratch = (((uint32_t)(3u)) << ((uint8_t)(1u + ((uint8_t)(v_flags & 7u)))));
47711
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
47712
      if (self->private_data.s_skip_frame.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
47713
        self->private_data.s_skip_frame.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
47714
        iop_a_src = io2_a_src;
47715
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
47716
        goto suspend;
47717
      }
47718
      iop_a_src += self->private_data.s_skip_frame.scratch;
47719
    }
47720
    {
47721
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
47722
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
47723
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
47724
        goto suspend;
47725
      }
47726
      uint8_t t_1 = *iop_a_src++;
47727
      v_lw = t_1;
47728
    }
47729
    if (v_lw > 8u) {
47730
      status = wuffs_base__make_status(wuffs_gif__error__bad_literal_width);
47731
      goto exit;
47732
    }
47733
    if (a_src) {
47734
      a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
47735
    }
47736
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
47737
    status = wuffs_gif__decoder__skip_blocks(self, a_src);
47738
    if (a_src) {
47739
      iop_a_src = a_src->data.ptr + a_src->meta.ri;
47740
    }
47741
    if (status.repr) {
47742
      goto suspend;
47743
    }
47744
    if (self->private_impl.f_quirks[0u]) {
47745
      self->private_impl.f_delayed_num_decoded_frames = true;
47746
    } else {
47747
      wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u);
47748
    }
47749
    wuffs_gif__decoder__reset_gc(self);
47750
    self->private_impl.f_call_sequence = 32u;
47751
47752
    goto ok;
47753
    ok:
47754
    self->private_impl.p_skip_frame = 0;
47755
    goto exit;
47756
  }
47757
47758
  goto suspend;
47759
  suspend:
47760
  self->private_impl.p_skip_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
47761
47762
  goto exit;
47763
  exit:
47764
  if (a_src && a_src->data.ptr) {
47765
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
47766
  }
47767
47768
  return status;
47769
}
47770
47771
// -------- func gif.decoder.decode_frame
47772
47773
WUFFS_BASE__GENERATED_C_CODE
47774
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
47775
wuffs_gif__decoder__decode_frame(
47776
    wuffs_gif__decoder* self,
47777
    wuffs_base__pixel_buffer* a_dst,
47778
    wuffs_base__io_buffer* a_src,
47779
    wuffs_base__pixel_blend a_blend,
47780
    wuffs_base__slice_u8 a_workbuf,
47781
    wuffs_base__decode_frame_options* a_opts) {
47782
  if (!self) {
47783
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
47784
  }
47785
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
47786
    return wuffs_base__make_status(
47787
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
47788
        ? wuffs_base__error__disabled_by_previous_error
47789
        : wuffs_base__error__initialize_not_called);
47790
  }
47791
  if (!a_dst || !a_src) {
47792
    self->private_impl.magic = WUFFS_BASE__DISABLED;
47793
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
47794
  }
47795
  if ((self->private_impl.active_coroutine != 0) &&
47796
      (self->private_impl.active_coroutine != 4)) {
47797
    self->private_impl.magic = WUFFS_BASE__DISABLED;
47798
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
47799
  }
47800
  self->private_impl.active_coroutine = 0;
47801
  wuffs_base__status status = wuffs_base__make_status(NULL);
47802
47803
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
47804
47805
  uint32_t coro_susp_point = self->private_impl.p_decode_frame;
47806
  switch (coro_susp_point) {
47807
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
47808
47809
    while (true) {
47810
      {
47811
        wuffs_base__status t_0 = wuffs_gif__decoder__do_decode_frame(self,
47812
            a_dst,
47813
            a_src,
47814
            a_blend,
47815
            a_workbuf,
47816
            a_opts);
47817
        v_status = t_0;
47818
      }
47819
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
47820
        status = wuffs_base__make_status(wuffs_gif__error__truncated_input);
47821
        goto exit;
47822
      }
47823
      status = v_status;
47824
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
47825
    }
47826
47827
    ok:
47828
    self->private_impl.p_decode_frame = 0;
47829
    goto exit;
47830
  }
47831
47832
  goto suspend;
47833
  suspend:
47834
  self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
47835
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 4 : 0;
47836
47837
  goto exit;
47838
  exit:
47839
  if (wuffs_base__status__is_error(&status)) {
47840
    self->private_impl.magic = WUFFS_BASE__DISABLED;
47841
  }
47842
  return status;
47843
}
47844
47845
// -------- func gif.decoder.do_decode_frame
47846
47847
WUFFS_BASE__GENERATED_C_CODE
47848
static wuffs_base__status
47849
wuffs_gif__decoder__do_decode_frame(
47850
    wuffs_gif__decoder* self,
47851
    wuffs_base__pixel_buffer* a_dst,
47852
    wuffs_base__io_buffer* a_src,
47853
    wuffs_base__pixel_blend a_blend,
47854
    wuffs_base__slice_u8 a_workbuf,
47855
    wuffs_base__decode_frame_options* a_opts) {
47856
  wuffs_base__status status = wuffs_base__make_status(NULL);
47857
47858
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame;
47859
  switch (coro_susp_point) {
47860
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
47861
47862
    if (self->private_impl.f_call_sequence == 64u) {
47863
    } else if (self->private_impl.f_call_sequence < 64u) {
47864
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
47865
      status = wuffs_gif__decoder__do_decode_frame_config(self, NULL, a_src);
47866
      if (status.repr) {
47867
        goto suspend;
47868
      }
47869
    } else {
47870
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
47871
      goto ok;
47872
    }
47873
    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))) {
47874
      status = wuffs_base__make_status(wuffs_gif__error__bad_frame_size);
47875
      goto exit;
47876
    }
47877
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
47878
    status = wuffs_gif__decoder__decode_id_part1(self, a_dst, a_src, a_blend);
47879
    if (status.repr) {
47880
      goto suspend;
47881
    }
47882
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
47883
    status = wuffs_gif__decoder__decode_id_part2(self, a_dst, a_src, a_workbuf);
47884
    if (status.repr) {
47885
      goto suspend;
47886
    }
47887
    wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u);
47888
    wuffs_gif__decoder__reset_gc(self);
47889
    self->private_impl.f_call_sequence = 32u;
47890
47891
    ok:
47892
    self->private_impl.p_do_decode_frame = 0;
47893
    goto exit;
47894
  }
47895
47896
  goto suspend;
47897
  suspend:
47898
  self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
47899
47900
  goto exit;
47901
  exit:
47902
  return status;
47903
}
47904
47905
// -------- func gif.decoder.reset_gc
47906
47907
WUFFS_BASE__GENERATED_C_CODE
47908
static wuffs_base__empty_struct
47909
wuffs_gif__decoder__reset_gc(
47910
    wuffs_gif__decoder* self) {
47911
  self->private_impl.f_gc_has_transparent_index = false;
47912
  self->private_impl.f_gc_transparent_index = 0u;
47913
  self->private_impl.f_gc_disposal = 0u;
47914
  self->private_impl.f_gc_duration = 0u;
47915
  return wuffs_base__make_empty_struct();
47916
}
47917
47918
// -------- func gif.decoder.decode_up_to_id_part1
47919
47920
WUFFS_BASE__GENERATED_C_CODE
47921
static wuffs_base__status
47922
wuffs_gif__decoder__decode_up_to_id_part1(
47923
    wuffs_gif__decoder* self,
47924
    wuffs_base__io_buffer* a_src) {
47925
  wuffs_base__status status = wuffs_base__make_status(NULL);
47926
47927
  uint8_t v_block_type = 0;
47928
47929
  const uint8_t* iop_a_src = NULL;
47930
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
47931
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
47932
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
47933
  if (a_src && a_src->data.ptr) {
47934
    io0_a_src = a_src->data.ptr;
47935
    io1_a_src = io0_a_src + a_src->meta.ri;
47936
    iop_a_src = io1_a_src;
47937
    io2_a_src = io0_a_src + a_src->meta.wi;
47938
  }
47939
47940
  uint32_t coro_susp_point = self->private_impl.p_decode_up_to_id_part1;
47941
  switch (coro_susp_point) {
47942
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
47943
47944
    if ((self->private_impl.f_frame_config_io_position == 0u) || (self->private_impl.f_num_decoded_frame_configs_value > 0u)) {
47945
      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)));
47946
    }
47947
    while (true) {
47948
      {
47949
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
47950
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
47951
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
47952
          goto suspend;
47953
        }
47954
        uint8_t t_0 = *iop_a_src++;
47955
        v_block_type = t_0;
47956
      }
47957
      if (v_block_type == 33u) {
47958
        if (a_src) {
47959
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
47960
        }
47961
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
47962
        status = wuffs_gif__decoder__decode_extension(self, a_src);
47963
        if (a_src) {
47964
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
47965
        }
47966
        if (status.repr) {
47967
          goto suspend;
47968
        }
47969
      } else if (v_block_type == 44u) {
47970
        if (self->private_impl.f_delayed_num_decoded_frames) {
47971
          self->private_impl.f_delayed_num_decoded_frames = false;
47972
          wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u);
47973
        }
47974
        if (a_src) {
47975
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
47976
        }
47977
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
47978
        status = wuffs_gif__decoder__decode_id_part0(self, a_src);
47979
        if (a_src) {
47980
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
47981
        }
47982
        if (status.repr) {
47983
          goto suspend;
47984
        }
47985
        break;
47986
      } else {
47987
        if (self->private_impl.f_delayed_num_decoded_frames) {
47988
          self->private_impl.f_delayed_num_decoded_frames = false;
47989
          wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u);
47990
        }
47991
        self->private_impl.f_call_sequence = 96u;
47992
        break;
47993
      }
47994
    }
47995
47996
    goto ok;
47997
    ok:
47998
    self->private_impl.p_decode_up_to_id_part1 = 0;
47999
    goto exit;
48000
  }
48001
48002
  goto suspend;
48003
  suspend:
48004
  self->private_impl.p_decode_up_to_id_part1 = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
48005
48006
  goto exit;
48007
  exit:
48008
  if (a_src && a_src->data.ptr) {
48009
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
48010
  }
48011
48012
  return status;
48013
}
48014
48015
// -------- func gif.decoder.decode_header
48016
48017
WUFFS_BASE__GENERATED_C_CODE
48018
static wuffs_base__status
48019
wuffs_gif__decoder__decode_header(
48020
    wuffs_gif__decoder* self,
48021
    wuffs_base__io_buffer* a_src) {
48022
  wuffs_base__status status = wuffs_base__make_status(NULL);
48023
48024
  uint64_t v_c48 = 0;
48025
48026
  const uint8_t* iop_a_src = NULL;
48027
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
48028
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
48029
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
48030
  if (a_src && a_src->data.ptr) {
48031
    io0_a_src = a_src->data.ptr;
48032
    io1_a_src = io0_a_src + a_src->meta.ri;
48033
    iop_a_src = io1_a_src;
48034
    io2_a_src = io0_a_src + a_src->meta.wi;
48035
  }
48036
48037
  uint32_t coro_susp_point = self->private_impl.p_decode_header;
48038
  switch (coro_susp_point) {
48039
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
48040
48041
    {
48042
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
48043
      uint64_t t_0;
48044
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 6)) {
48045
        t_0 = ((uint64_t)(wuffs_base__peek_u48le__no_bounds_check(iop_a_src)));
48046
        iop_a_src += 6;
48047
      } else {
48048
        self->private_data.s_decode_header.scratch = 0;
48049
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
48050
        while (true) {
48051
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
48052
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
48053
            goto suspend;
48054
          }
48055
          uint64_t* scratch = &self->private_data.s_decode_header.scratch;
48056
          uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
48057
          *scratch <<= 8;
48058
          *scratch >>= 8;
48059
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
48060
          if (num_bits_0 == 40) {
48061
            t_0 = ((uint64_t)(*scratch));
48062
            break;
48063
          }
48064
          num_bits_0 += 8u;
48065
          *scratch |= ((uint64_t)(num_bits_0)) << 56;
48066
        }
48067
      }
48068
      v_c48 = t_0;
48069
    }
48070
    if ((v_c48 != 106889795225927u) && (v_c48 != 106898385160519u)) {
48071
      status = wuffs_base__make_status(wuffs_gif__error__bad_header);
48072
      goto exit;
48073
    }
48074
48075
    goto ok;
48076
    ok:
48077
    self->private_impl.p_decode_header = 0;
48078
    goto exit;
48079
  }
48080
48081
  goto suspend;
48082
  suspend:
48083
  self->private_impl.p_decode_header = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
48084
48085
  goto exit;
48086
  exit:
48087
  if (a_src && a_src->data.ptr) {
48088
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
48089
  }
48090
48091
  return status;
48092
}
48093
48094
// -------- func gif.decoder.decode_lsd
48095
48096
WUFFS_BASE__GENERATED_C_CODE
48097
static wuffs_base__status
48098
wuffs_gif__decoder__decode_lsd(
48099
    wuffs_gif__decoder* self,
48100
    wuffs_base__io_buffer* a_src) {
48101
  wuffs_base__status status = wuffs_base__make_status(NULL);
48102
48103
  uint8_t v_flags = 0;
48104
  uint8_t v_background_color_index = 0;
48105
  uint32_t v_num_palette_entries = 0;
48106
  uint32_t v_i = 0;
48107
  uint32_t v_j = 0;
48108
  uint32_t v_argb = 0;
48109
48110
  const uint8_t* iop_a_src = NULL;
48111
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
48112
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
48113
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
48114
  if (a_src && a_src->data.ptr) {
48115
    io0_a_src = a_src->data.ptr;
48116
    io1_a_src = io0_a_src + a_src->meta.ri;
48117
    iop_a_src = io1_a_src;
48118
    io2_a_src = io0_a_src + a_src->meta.wi;
48119
  }
48120
48121
  uint32_t coro_susp_point = self->private_impl.p_decode_lsd;
48122
  if (coro_susp_point) {
48123
    v_flags = self->private_data.s_decode_lsd.v_flags;
48124
    v_background_color_index = self->private_data.s_decode_lsd.v_background_color_index;
48125
    v_num_palette_entries = self->private_data.s_decode_lsd.v_num_palette_entries;
48126
    v_i = self->private_data.s_decode_lsd.v_i;
48127
  }
48128
  switch (coro_susp_point) {
48129
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
48130
48131
    {
48132
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
48133
      uint32_t t_0;
48134
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
48135
        t_0 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
48136
        iop_a_src += 2;
48137
      } else {
48138
        self->private_data.s_decode_lsd.scratch = 0;
48139
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
48140
        while (true) {
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
          uint64_t* scratch = &self->private_data.s_decode_lsd.scratch;
48146
          uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
48147
          *scratch <<= 8;
48148
          *scratch >>= 8;
48149
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
48150
          if (num_bits_0 == 8) {
48151
            t_0 = ((uint32_t)(*scratch));
48152
            break;
48153
          }
48154
          num_bits_0 += 8u;
48155
          *scratch |= ((uint64_t)(num_bits_0)) << 56;
48156
        }
48157
      }
48158
      self->private_impl.f_width = t_0;
48159
    }
48160
    {
48161
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
48162
      uint32_t t_1;
48163
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
48164
        t_1 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
48165
        iop_a_src += 2;
48166
      } else {
48167
        self->private_data.s_decode_lsd.scratch = 0;
48168
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
48169
        while (true) {
48170
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
48171
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
48172
            goto suspend;
48173
          }
48174
          uint64_t* scratch = &self->private_data.s_decode_lsd.scratch;
48175
          uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
48176
          *scratch <<= 8;
48177
          *scratch >>= 8;
48178
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
48179
          if (num_bits_1 == 8) {
48180
            t_1 = ((uint32_t)(*scratch));
48181
            break;
48182
          }
48183
          num_bits_1 += 8u;
48184
          *scratch |= ((uint64_t)(num_bits_1)) << 56;
48185
        }
48186
      }
48187
      self->private_impl.f_height = t_1;
48188
    }
48189
    {
48190
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
48191
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
48192
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
48193
        goto suspend;
48194
      }
48195
      uint8_t t_2 = *iop_a_src++;
48196
      v_flags = t_2;
48197
    }
48198
    {
48199
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
48200
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
48201
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
48202
        goto suspend;
48203
      }
48204
      uint8_t t_3 = *iop_a_src++;
48205
      v_background_color_index = t_3;
48206
    }
48207
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
48208
    if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
48209
      status = wuffs_base__make_status(wuffs_base__suspension__short_read);
48210
      goto suspend;
48211
    }
48212
    iop_a_src++;
48213
    v_i = 0u;
48214
    self->private_impl.f_has_global_palette = (((uint8_t)(v_flags & 128u)) != 0u);
48215
    if (self->private_impl.f_has_global_palette) {
48216
      v_num_palette_entries = (((uint32_t)(1u)) << ((uint8_t)(1u + ((uint8_t)(v_flags & 7u)))));
48217
      while (v_i < v_num_palette_entries) {
48218
        {
48219
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
48220
          uint32_t t_4;
48221
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) {
48222
            t_4 = ((uint32_t)(wuffs_base__peek_u24be__no_bounds_check(iop_a_src)));
48223
            iop_a_src += 3;
48224
          } else {
48225
            self->private_data.s_decode_lsd.scratch = 0;
48226
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
48227
            while (true) {
48228
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
48229
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
48230
                goto suspend;
48231
              }
48232
              uint64_t* scratch = &self->private_data.s_decode_lsd.scratch;
48233
              uint32_t num_bits_4 = ((uint32_t)(*scratch & 0xFFu));
48234
              *scratch >>= 8;
48235
              *scratch <<= 8;
48236
              *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_4);
48237
              if (num_bits_4 == 16) {
48238
                t_4 = ((uint32_t)(*scratch >> 40));
48239
                break;
48240
              }
48241
              num_bits_4 += 8u;
48242
              *scratch |= ((uint64_t)(num_bits_4));
48243
            }
48244
          }
48245
          v_argb = t_4;
48246
        }
48247
        v_argb |= 4278190080u;
48248
        self->private_data.f_palettes[0u][((4u * v_i) + 0u)] = ((uint8_t)((v_argb >> 0u)));
48249
        self->private_data.f_palettes[0u][((4u * v_i) + 1u)] = ((uint8_t)((v_argb >> 8u)));
48250
        self->private_data.f_palettes[0u][((4u * v_i) + 2u)] = ((uint8_t)((v_argb >> 16u)));
48251
        self->private_data.f_palettes[0u][((4u * v_i) + 3u)] = ((uint8_t)((v_argb >> 24u)));
48252
        v_i += 1u;
48253
      }
48254
      if (self->private_impl.f_quirks[2u]) {
48255
        if ((v_background_color_index != 0u) && (((uint32_t)(v_background_color_index)) < v_num_palette_entries)) {
48256
          v_j = (4u * ((uint32_t)(v_background_color_index)));
48257
          self->private_impl.f_background_color_u32_argb_premul = ((((uint32_t)(self->private_data.f_palettes[0u][(v_j + 0u)])) << 0u) |
48258
              (((uint32_t)(self->private_data.f_palettes[0u][(v_j + 1u)])) << 8u) |
48259
              (((uint32_t)(self->private_data.f_palettes[0u][(v_j + 2u)])) << 16u) |
48260
              (((uint32_t)(self->private_data.f_palettes[0u][(v_j + 3u)])) << 24u));
48261
        } else {
48262
          self->private_impl.f_background_color_u32_argb_premul = 77u;
48263
        }
48264
      }
48265
    }
48266
    while (v_i < 256u) {
48267
      self->private_data.f_palettes[0u][((4u * v_i) + 0u)] = 0u;
48268
      self->private_data.f_palettes[0u][((4u * v_i) + 1u)] = 0u;
48269
      self->private_data.f_palettes[0u][((4u * v_i) + 2u)] = 0u;
48270
      self->private_data.f_palettes[0u][((4u * v_i) + 3u)] = 255u;
48271
      v_i += 1u;
48272
    }
48273
48274
    goto ok;
48275
    ok:
48276
    self->private_impl.p_decode_lsd = 0;
48277
    goto exit;
48278
  }
48279
48280
  goto suspend;
48281
  suspend:
48282
  self->private_impl.p_decode_lsd = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
48283
  self->private_data.s_decode_lsd.v_flags = v_flags;
48284
  self->private_data.s_decode_lsd.v_background_color_index = v_background_color_index;
48285
  self->private_data.s_decode_lsd.v_num_palette_entries = v_num_palette_entries;
48286
  self->private_data.s_decode_lsd.v_i = v_i;
48287
48288
  goto exit;
48289
  exit:
48290
  if (a_src && a_src->data.ptr) {
48291
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
48292
  }
48293
48294
  return status;
48295
}
48296
48297
// -------- func gif.decoder.decode_extension
48298
48299
WUFFS_BASE__GENERATED_C_CODE
48300
static wuffs_base__status
48301
wuffs_gif__decoder__decode_extension(
48302
    wuffs_gif__decoder* self,
48303
    wuffs_base__io_buffer* a_src) {
48304
  wuffs_base__status status = wuffs_base__make_status(NULL);
48305
48306
  uint8_t v_label = 0;
48307
48308
  const uint8_t* iop_a_src = NULL;
48309
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
48310
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
48311
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
48312
  if (a_src && a_src->data.ptr) {
48313
    io0_a_src = a_src->data.ptr;
48314
    io1_a_src = io0_a_src + a_src->meta.ri;
48315
    iop_a_src = io1_a_src;
48316
    io2_a_src = io0_a_src + a_src->meta.wi;
48317
  }
48318
48319
  uint32_t coro_susp_point = self->private_impl.p_decode_extension;
48320
  switch (coro_susp_point) {
48321
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
48322
48323
    {
48324
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
48325
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
48326
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
48327
        goto suspend;
48328
      }
48329
      uint8_t t_0 = *iop_a_src++;
48330
      v_label = t_0;
48331
    }
48332
    if (v_label == 249u) {
48333
      if (a_src) {
48334
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
48335
      }
48336
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
48337
      status = wuffs_gif__decoder__decode_gc(self, a_src);
48338
      if (a_src) {
48339
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
48340
      }
48341
      if (status.repr) {
48342
        goto suspend;
48343
      }
48344
      status = wuffs_base__make_status(NULL);
48345
      goto ok;
48346
    } else if (v_label == 255u) {
48347
      if (a_src) {
48348
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
48349
      }
48350
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
48351
      status = wuffs_gif__decoder__decode_ae(self, a_src);
48352
      if (a_src) {
48353
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
48354
      }
48355
      if (status.repr) {
48356
        goto suspend;
48357
      }
48358
      status = wuffs_base__make_status(NULL);
48359
      goto ok;
48360
    }
48361
    if (a_src) {
48362
      a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
48363
    }
48364
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
48365
    status = wuffs_gif__decoder__skip_blocks(self, a_src);
48366
    if (a_src) {
48367
      iop_a_src = a_src->data.ptr + a_src->meta.ri;
48368
    }
48369
    if (status.repr) {
48370
      goto suspend;
48371
    }
48372
48373
    ok:
48374
    self->private_impl.p_decode_extension = 0;
48375
    goto exit;
48376
  }
48377
48378
  goto suspend;
48379
  suspend:
48380
  self->private_impl.p_decode_extension = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
48381
48382
  goto exit;
48383
  exit:
48384
  if (a_src && a_src->data.ptr) {
48385
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
48386
  }
48387
48388
  return status;
48389
}
48390
48391
// -------- func gif.decoder.skip_blocks
48392
48393
WUFFS_BASE__GENERATED_C_CODE
48394
static wuffs_base__status
48395
wuffs_gif__decoder__skip_blocks(
48396
    wuffs_gif__decoder* self,
48397
    wuffs_base__io_buffer* a_src) {
48398
  wuffs_base__status status = wuffs_base__make_status(NULL);
48399
48400
  uint8_t v_block_size = 0;
48401
48402
  const uint8_t* iop_a_src = NULL;
48403
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
48404
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
48405
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
48406
  if (a_src && a_src->data.ptr) {
48407
    io0_a_src = a_src->data.ptr;
48408
    io1_a_src = io0_a_src + a_src->meta.ri;
48409
    iop_a_src = io1_a_src;
48410
    io2_a_src = io0_a_src + a_src->meta.wi;
48411
  }
48412
48413
  uint32_t coro_susp_point = self->private_impl.p_skip_blocks;
48414
  switch (coro_susp_point) {
48415
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
48416
48417
    while (true) {
48418
      {
48419
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
48420
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
48421
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
48422
          goto suspend;
48423
        }
48424
        uint8_t t_0 = *iop_a_src++;
48425
        v_block_size = t_0;
48426
      }
48427
      if (v_block_size == 0u) {
48428
        status = wuffs_base__make_status(NULL);
48429
        goto ok;
48430
      }
48431
      self->private_data.s_skip_blocks.scratch = ((uint32_t)(v_block_size));
48432
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
48433
      if (self->private_data.s_skip_blocks.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
48434
        self->private_data.s_skip_blocks.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
48435
        iop_a_src = io2_a_src;
48436
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
48437
        goto suspend;
48438
      }
48439
      iop_a_src += self->private_data.s_skip_blocks.scratch;
48440
    }
48441
48442
    ok:
48443
    self->private_impl.p_skip_blocks = 0;
48444
    goto exit;
48445
  }
48446
48447
  goto suspend;
48448
  suspend:
48449
  self->private_impl.p_skip_blocks = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
48450
48451
  goto exit;
48452
  exit:
48453
  if (a_src && a_src->data.ptr) {
48454
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
48455
  }
48456
48457
  return status;
48458
}
48459
48460
// -------- func gif.decoder.decode_ae
48461
48462
WUFFS_BASE__GENERATED_C_CODE
48463
static wuffs_base__status
48464
wuffs_gif__decoder__decode_ae(
48465
    wuffs_gif__decoder* self,
48466
    wuffs_base__io_buffer* a_src) {
48467
  wuffs_base__status status = wuffs_base__make_status(NULL);
48468
48469
  uint8_t v_c8 = 0;
48470
  uint8_t v_block_size = 0;
48471
  bool v_is_animexts = false;
48472
  bool v_is_netscape = false;
48473
  bool v_is_iccp = false;
48474
  bool v_is_xmp = false;
48475
48476
  const uint8_t* iop_a_src = NULL;
48477
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
48478
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
48479
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
48480
  if (a_src && a_src->data.ptr) {
48481
    io0_a_src = a_src->data.ptr;
48482
    io1_a_src = io0_a_src + a_src->meta.ri;
48483
    iop_a_src = io1_a_src;
48484
    io2_a_src = io0_a_src + a_src->meta.wi;
48485
  }
48486
48487
  uint32_t coro_susp_point = self->private_impl.p_decode_ae;
48488
  if (coro_susp_point) {
48489
    v_block_size = self->private_data.s_decode_ae.v_block_size;
48490
    v_is_animexts = self->private_data.s_decode_ae.v_is_animexts;
48491
    v_is_netscape = self->private_data.s_decode_ae.v_is_netscape;
48492
    v_is_iccp = self->private_data.s_decode_ae.v_is_iccp;
48493
    v_is_xmp = self->private_data.s_decode_ae.v_is_xmp;
48494
  }
48495
  switch (coro_susp_point) {
48496
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
48497
48498
    do {
48499
      if (self->private_impl.f_metadata_fourcc != 0u) {
48500
        status = wuffs_base__make_status(wuffs_base__note__metadata_reported);
48501
        goto ok;
48502
      }
48503
      {
48504
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
48505
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
48506
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
48507
          goto suspend;
48508
        }
48509
        uint8_t t_0 = *iop_a_src++;
48510
        v_block_size = t_0;
48511
      }
48512
      if (v_block_size == 0u) {
48513
        status = wuffs_base__make_status(NULL);
48514
        goto ok;
48515
      }
48516
      if (v_block_size != 11u) {
48517
        self->private_data.s_decode_ae.scratch = ((uint32_t)(v_block_size));
48518
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
48519
        if (self->private_data.s_decode_ae.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
48520
          self->private_data.s_decode_ae.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
48521
          iop_a_src = io2_a_src;
48522
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
48523
          goto suspend;
48524
        }
48525
        iop_a_src += self->private_data.s_decode_ae.scratch;
48526
        break;
48527
      }
48528
      v_is_animexts = true;
48529
      v_is_netscape = true;
48530
      v_is_iccp = true;
48531
      v_is_xmp = true;
48532
      v_block_size = 0u;
48533
      while (v_block_size < 11u) {
48534
        {
48535
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
48536
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
48537
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
48538
            goto suspend;
48539
          }
48540
          uint8_t t_1 = *iop_a_src++;
48541
          v_c8 = t_1;
48542
        }
48543
        v_is_animexts = (v_is_animexts && (v_c8 == WUFFS_GIF__ANIMEXTS1DOT0[v_block_size]));
48544
        v_is_netscape = (v_is_netscape && (v_c8 == WUFFS_GIF__NETSCAPE2DOT0[v_block_size]));
48545
        v_is_iccp = (v_is_iccp && (v_c8 == WUFFS_GIF__ICCRGBG1012[v_block_size]));
48546
        v_is_xmp = (v_is_xmp && (v_c8 == WUFFS_GIF__XMPDATAXMP[v_block_size]));
48547
#if defined(__GNUC__)
48548
#pragma GCC diagnostic push
48549
#pragma GCC diagnostic ignored "-Wconversion"
48550
#endif
48551
        v_block_size += 1u;
48552
#if defined(__GNUC__)
48553
#pragma GCC diagnostic pop
48554
#endif
48555
      }
48556
      if (v_is_animexts || v_is_netscape) {
48557
        {
48558
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
48559
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
48560
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
48561
            goto suspend;
48562
          }
48563
          uint8_t t_2 = *iop_a_src++;
48564
          v_block_size = t_2;
48565
        }
48566
        if (v_block_size != 3u) {
48567
          self->private_data.s_decode_ae.scratch = ((uint32_t)(v_block_size));
48568
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
48569
          if (self->private_data.s_decode_ae.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
48570
            self->private_data.s_decode_ae.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
48571
            iop_a_src = io2_a_src;
48572
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
48573
            goto suspend;
48574
          }
48575
          iop_a_src += self->private_data.s_decode_ae.scratch;
48576
          break;
48577
        }
48578
        {
48579
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
48580
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
48581
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
48582
            goto suspend;
48583
          }
48584
          uint8_t t_3 = *iop_a_src++;
48585
          v_c8 = t_3;
48586
        }
48587
        if (v_c8 != 1u) {
48588
          self->private_data.s_decode_ae.scratch = 2u;
48589
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
48590
          if (self->private_data.s_decode_ae.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
48591
            self->private_data.s_decode_ae.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
48592
            iop_a_src = io2_a_src;
48593
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
48594
            goto suspend;
48595
          }
48596
          iop_a_src += self->private_data.s_decode_ae.scratch;
48597
          break;
48598
        }
48599
        {
48600
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
48601
          uint32_t t_4;
48602
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
48603
            t_4 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
48604
            iop_a_src += 2;
48605
          } else {
48606
            self->private_data.s_decode_ae.scratch = 0;
48607
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
48608
            while (true) {
48609
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
48610
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
48611
                goto suspend;
48612
              }
48613
              uint64_t* scratch = &self->private_data.s_decode_ae.scratch;
48614
              uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56));
48615
              *scratch <<= 8;
48616
              *scratch >>= 8;
48617
              *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4;
48618
              if (num_bits_4 == 8) {
48619
                t_4 = ((uint32_t)(*scratch));
48620
                break;
48621
              }
48622
              num_bits_4 += 8u;
48623
              *scratch |= ((uint64_t)(num_bits_4)) << 56;
48624
            }
48625
          }
48626
          self->private_impl.f_num_animation_loops_value = t_4;
48627
        }
48628
        self->private_impl.f_seen_num_animation_loops_value = true;
48629
        if ((0u < self->private_impl.f_num_animation_loops_value) && (self->private_impl.f_num_animation_loops_value <= 65535u)) {
48630
          self->private_impl.f_num_animation_loops_value += 1u;
48631
        }
48632
      } else if (self->private_impl.f_call_sequence >= 32u) {
48633
      } else if (v_is_iccp && self->private_impl.f_report_metadata_iccp) {
48634
        self->private_impl.f_metadata_fourcc = 1229144912u;
48635
        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)));
48636
        self->private_impl.f_call_sequence = 16u;
48637
        status = wuffs_base__make_status(wuffs_base__note__metadata_reported);
48638
        goto ok;
48639
      } else if (v_is_xmp && self->private_impl.f_report_metadata_xmp) {
48640
        self->private_impl.f_metadata_fourcc = 1481461792u;
48641
        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)));
48642
        self->private_impl.f_call_sequence = 16u;
48643
        status = wuffs_base__make_status(wuffs_base__note__metadata_reported);
48644
        goto ok;
48645
      }
48646
    } while (0);
48647
    if (a_src) {
48648
      a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
48649
    }
48650
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
48651
    status = wuffs_gif__decoder__skip_blocks(self, a_src);
48652
    if (a_src) {
48653
      iop_a_src = a_src->data.ptr + a_src->meta.ri;
48654
    }
48655
    if (status.repr) {
48656
      goto suspend;
48657
    }
48658
48659
    ok:
48660
    self->private_impl.p_decode_ae = 0;
48661
    goto exit;
48662
  }
48663
48664
  goto suspend;
48665
  suspend:
48666
  self->private_impl.p_decode_ae = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
48667
  self->private_data.s_decode_ae.v_block_size = v_block_size;
48668
  self->private_data.s_decode_ae.v_is_animexts = v_is_animexts;
48669
  self->private_data.s_decode_ae.v_is_netscape = v_is_netscape;
48670
  self->private_data.s_decode_ae.v_is_iccp = v_is_iccp;
48671
  self->private_data.s_decode_ae.v_is_xmp = v_is_xmp;
48672
48673
  goto exit;
48674
  exit:
48675
  if (a_src && a_src->data.ptr) {
48676
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
48677
  }
48678
48679
  return status;
48680
}
48681
48682
// -------- func gif.decoder.decode_gc
48683
48684
WUFFS_BASE__GENERATED_C_CODE
48685
static wuffs_base__status
48686
wuffs_gif__decoder__decode_gc(
48687
    wuffs_gif__decoder* self,
48688
    wuffs_base__io_buffer* a_src) {
48689
  wuffs_base__status status = wuffs_base__make_status(NULL);
48690
48691
  uint8_t v_c8 = 0;
48692
  uint8_t v_flags = 0;
48693
  uint16_t v_gc_duration_centiseconds = 0;
48694
48695
  const uint8_t* iop_a_src = NULL;
48696
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
48697
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
48698
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
48699
  if (a_src && a_src->data.ptr) {
48700
    io0_a_src = a_src->data.ptr;
48701
    io1_a_src = io0_a_src + a_src->meta.ri;
48702
    iop_a_src = io1_a_src;
48703
    io2_a_src = io0_a_src + a_src->meta.wi;
48704
  }
48705
48706
  uint32_t coro_susp_point = self->private_impl.p_decode_gc;
48707
  switch (coro_susp_point) {
48708
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
48709
48710
    {
48711
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
48712
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
48713
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
48714
        goto suspend;
48715
      }
48716
      uint8_t t_0 = *iop_a_src++;
48717
      v_c8 = t_0;
48718
    }
48719
    if (v_c8 != 4u) {
48720
      status = wuffs_base__make_status(wuffs_gif__error__bad_graphic_control);
48721
      goto exit;
48722
    }
48723
    {
48724
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
48725
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
48726
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
48727
        goto suspend;
48728
      }
48729
      uint8_t t_1 = *iop_a_src++;
48730
      v_flags = t_1;
48731
    }
48732
    self->private_impl.f_gc_has_transparent_index = (((uint8_t)(v_flags & 1u)) != 0u);
48733
    v_flags = ((uint8_t)(((uint8_t)(v_flags >> 2u)) & 7u));
48734
    if (v_flags == 2u) {
48735
      self->private_impl.f_gc_disposal = 1u;
48736
    } else if ((v_flags == 3u) || (v_flags == 4u)) {
48737
      self->private_impl.f_gc_disposal = 2u;
48738
    } else {
48739
      self->private_impl.f_gc_disposal = 0u;
48740
    }
48741
    {
48742
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
48743
      uint16_t t_2;
48744
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
48745
        t_2 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src);
48746
        iop_a_src += 2;
48747
      } else {
48748
        self->private_data.s_decode_gc.scratch = 0;
48749
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
48750
        while (true) {
48751
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
48752
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
48753
            goto suspend;
48754
          }
48755
          uint64_t* scratch = &self->private_data.s_decode_gc.scratch;
48756
          uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56));
48757
          *scratch <<= 8;
48758
          *scratch >>= 8;
48759
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2;
48760
          if (num_bits_2 == 8) {
48761
            t_2 = ((uint16_t)(*scratch));
48762
            break;
48763
          }
48764
          num_bits_2 += 8u;
48765
          *scratch |= ((uint64_t)(num_bits_2)) << 56;
48766
        }
48767
      }
48768
      v_gc_duration_centiseconds = t_2;
48769
    }
48770
    self->private_impl.f_gc_duration = (((uint64_t)(v_gc_duration_centiseconds)) * 7056000u);
48771
    {
48772
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
48773
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
48774
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
48775
        goto suspend;
48776
      }
48777
      uint8_t t_3 = *iop_a_src++;
48778
      self->private_impl.f_gc_transparent_index = t_3;
48779
    }
48780
    {
48781
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
48782
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
48783
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
48784
        goto suspend;
48785
      }
48786
      uint8_t t_4 = *iop_a_src++;
48787
      v_c8 = t_4;
48788
    }
48789
    if (v_c8 != 0u) {
48790
      status = wuffs_base__make_status(wuffs_gif__error__bad_graphic_control);
48791
      goto exit;
48792
    }
48793
48794
    goto ok;
48795
    ok:
48796
    self->private_impl.p_decode_gc = 0;
48797
    goto exit;
48798
  }
48799
48800
  goto suspend;
48801
  suspend:
48802
  self->private_impl.p_decode_gc = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
48803
48804
  goto exit;
48805
  exit:
48806
  if (a_src && a_src->data.ptr) {
48807
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
48808
  }
48809
48810
  return status;
48811
}
48812
48813
// -------- func gif.decoder.decode_id_part0
48814
48815
WUFFS_BASE__GENERATED_C_CODE
48816
static wuffs_base__status
48817
wuffs_gif__decoder__decode_id_part0(
48818
    wuffs_gif__decoder* self,
48819
    wuffs_base__io_buffer* a_src) {
48820
  wuffs_base__status status = wuffs_base__make_status(NULL);
48821
48822
  const uint8_t* iop_a_src = NULL;
48823
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
48824
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
48825
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
48826
  if (a_src && a_src->data.ptr) {
48827
    io0_a_src = a_src->data.ptr;
48828
    io1_a_src = io0_a_src + a_src->meta.ri;
48829
    iop_a_src = io1_a_src;
48830
    io2_a_src = io0_a_src + a_src->meta.wi;
48831
  }
48832
48833
  uint32_t coro_susp_point = self->private_impl.p_decode_id_part0;
48834
  switch (coro_susp_point) {
48835
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
48836
48837
    {
48838
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
48839
      uint32_t t_0;
48840
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
48841
        t_0 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
48842
        iop_a_src += 2;
48843
      } else {
48844
        self->private_data.s_decode_id_part0.scratch = 0;
48845
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
48846
        while (true) {
48847
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
48848
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
48849
            goto suspend;
48850
          }
48851
          uint64_t* scratch = &self->private_data.s_decode_id_part0.scratch;
48852
          uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
48853
          *scratch <<= 8;
48854
          *scratch >>= 8;
48855
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
48856
          if (num_bits_0 == 8) {
48857
            t_0 = ((uint32_t)(*scratch));
48858
            break;
48859
          }
48860
          num_bits_0 += 8u;
48861
          *scratch |= ((uint64_t)(num_bits_0)) << 56;
48862
        }
48863
      }
48864
      self->private_impl.f_frame_rect_x0 = t_0;
48865
    }
48866
    {
48867
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
48868
      uint32_t t_1;
48869
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
48870
        t_1 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
48871
        iop_a_src += 2;
48872
      } else {
48873
        self->private_data.s_decode_id_part0.scratch = 0;
48874
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
48875
        while (true) {
48876
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
48877
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
48878
            goto suspend;
48879
          }
48880
          uint64_t* scratch = &self->private_data.s_decode_id_part0.scratch;
48881
          uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
48882
          *scratch <<= 8;
48883
          *scratch >>= 8;
48884
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
48885
          if (num_bits_1 == 8) {
48886
            t_1 = ((uint32_t)(*scratch));
48887
            break;
48888
          }
48889
          num_bits_1 += 8u;
48890
          *scratch |= ((uint64_t)(num_bits_1)) << 56;
48891
        }
48892
      }
48893
      self->private_impl.f_frame_rect_y0 = t_1;
48894
    }
48895
    {
48896
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
48897
      uint32_t t_2;
48898
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
48899
        t_2 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
48900
        iop_a_src += 2;
48901
      } else {
48902
        self->private_data.s_decode_id_part0.scratch = 0;
48903
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
48904
        while (true) {
48905
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
48906
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
48907
            goto suspend;
48908
          }
48909
          uint64_t* scratch = &self->private_data.s_decode_id_part0.scratch;
48910
          uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56));
48911
          *scratch <<= 8;
48912
          *scratch >>= 8;
48913
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2;
48914
          if (num_bits_2 == 8) {
48915
            t_2 = ((uint32_t)(*scratch));
48916
            break;
48917
          }
48918
          num_bits_2 += 8u;
48919
          *scratch |= ((uint64_t)(num_bits_2)) << 56;
48920
        }
48921
      }
48922
      self->private_impl.f_frame_rect_x1 = t_2;
48923
    }
48924
    self->private_impl.f_frame_rect_x1 += self->private_impl.f_frame_rect_x0;
48925
    {
48926
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
48927
      uint32_t t_3;
48928
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
48929
        t_3 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
48930
        iop_a_src += 2;
48931
      } else {
48932
        self->private_data.s_decode_id_part0.scratch = 0;
48933
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
48934
        while (true) {
48935
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
48936
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
48937
            goto suspend;
48938
          }
48939
          uint64_t* scratch = &self->private_data.s_decode_id_part0.scratch;
48940
          uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56));
48941
          *scratch <<= 8;
48942
          *scratch >>= 8;
48943
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3;
48944
          if (num_bits_3 == 8) {
48945
            t_3 = ((uint32_t)(*scratch));
48946
            break;
48947
          }
48948
          num_bits_3 += 8u;
48949
          *scratch |= ((uint64_t)(num_bits_3)) << 56;
48950
        }
48951
      }
48952
      self->private_impl.f_frame_rect_y1 = t_3;
48953
    }
48954
    self->private_impl.f_frame_rect_y1 += self->private_impl.f_frame_rect_y0;
48955
    self->private_impl.f_dst_x = self->private_impl.f_frame_rect_x0;
48956
    self->private_impl.f_dst_y = self->private_impl.f_frame_rect_y0;
48957
    if ((self->private_impl.f_num_decoded_frame_configs_value == 0u) &&  ! self->private_impl.f_quirks[4u]) {
48958
      self->private_impl.f_width = wuffs_base__u32__max(self->private_impl.f_width, self->private_impl.f_frame_rect_x1);
48959
      self->private_impl.f_height = wuffs_base__u32__max(self->private_impl.f_height, self->private_impl.f_frame_rect_y1);
48960
    }
48961
48962
    goto ok;
48963
    ok:
48964
    self->private_impl.p_decode_id_part0 = 0;
48965
    goto exit;
48966
  }
48967
48968
  goto suspend;
48969
  suspend:
48970
  self->private_impl.p_decode_id_part0 = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
48971
48972
  goto exit;
48973
  exit:
48974
  if (a_src && a_src->data.ptr) {
48975
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
48976
  }
48977
48978
  return status;
48979
}
48980
48981
// -------- func gif.decoder.decode_id_part1
48982
48983
WUFFS_BASE__GENERATED_C_CODE
48984
static wuffs_base__status
48985
wuffs_gif__decoder__decode_id_part1(
48986
    wuffs_gif__decoder* self,
48987
    wuffs_base__pixel_buffer* a_dst,
48988
    wuffs_base__io_buffer* a_src,
48989
    wuffs_base__pixel_blend a_blend) {
48990
  wuffs_base__status status = wuffs_base__make_status(NULL);
48991
48992
  uint8_t v_flags = 0;
48993
  uint8_t v_which_palette = 0;
48994
  uint32_t v_num_palette_entries = 0;
48995
  uint32_t v_i = 0;
48996
  uint32_t v_argb = 0;
48997
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
48998
  uint8_t v_lw = 0;
48999
49000
  const uint8_t* iop_a_src = NULL;
49001
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
49002
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
49003
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
49004
  if (a_src && a_src->data.ptr) {
49005
    io0_a_src = a_src->data.ptr;
49006
    io1_a_src = io0_a_src + a_src->meta.ri;
49007
    iop_a_src = io1_a_src;
49008
    io2_a_src = io0_a_src + a_src->meta.wi;
49009
  }
49010
49011
  uint32_t coro_susp_point = self->private_impl.p_decode_id_part1;
49012
  if (coro_susp_point) {
49013
    v_which_palette = self->private_data.s_decode_id_part1.v_which_palette;
49014
    v_num_palette_entries = self->private_data.s_decode_id_part1.v_num_palette_entries;
49015
    v_i = self->private_data.s_decode_id_part1.v_i;
49016
  }
49017
  switch (coro_susp_point) {
49018
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
49019
49020
    {
49021
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
49022
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
49023
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
49024
        goto suspend;
49025
      }
49026
      uint8_t t_0 = *iop_a_src++;
49027
      v_flags = t_0;
49028
    }
49029
    if (((uint8_t)(v_flags & 64u)) != 0u) {
49030
      self->private_impl.f_interlace = 4u;
49031
    } else {
49032
      self->private_impl.f_interlace = 0u;
49033
    }
49034
    v_which_palette = 1u;
49035
    if (((uint8_t)(v_flags & 128u)) != 0u) {
49036
      v_num_palette_entries = (((uint32_t)(1u)) << ((uint8_t)(1u + ((uint8_t)(v_flags & 7u)))));
49037
      v_i = 0u;
49038
      while (v_i < v_num_palette_entries) {
49039
        {
49040
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
49041
          uint32_t t_1;
49042
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) {
49043
            t_1 = ((uint32_t)(wuffs_base__peek_u24be__no_bounds_check(iop_a_src)));
49044
            iop_a_src += 3;
49045
          } else {
49046
            self->private_data.s_decode_id_part1.scratch = 0;
49047
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
49048
            while (true) {
49049
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
49050
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
49051
                goto suspend;
49052
              }
49053
              uint64_t* scratch = &self->private_data.s_decode_id_part1.scratch;
49054
              uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu));
49055
              *scratch >>= 8;
49056
              *scratch <<= 8;
49057
              *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1);
49058
              if (num_bits_1 == 16) {
49059
                t_1 = ((uint32_t)(*scratch >> 40));
49060
                break;
49061
              }
49062
              num_bits_1 += 8u;
49063
              *scratch |= ((uint64_t)(num_bits_1));
49064
            }
49065
          }
49066
          v_argb = t_1;
49067
        }
49068
        v_argb |= 4278190080u;
49069
        self->private_data.f_palettes[1u][((4u * v_i) + 0u)] = ((uint8_t)((v_argb >> 0u)));
49070
        self->private_data.f_palettes[1u][((4u * v_i) + 1u)] = ((uint8_t)((v_argb >> 8u)));
49071
        self->private_data.f_palettes[1u][((4u * v_i) + 2u)] = ((uint8_t)((v_argb >> 16u)));
49072
        self->private_data.f_palettes[1u][((4u * v_i) + 3u)] = ((uint8_t)((v_argb >> 24u)));
49073
        v_i += 1u;
49074
      }
49075
      while (v_i < 256u) {
49076
        self->private_data.f_palettes[1u][((4u * v_i) + 0u)] = 0u;
49077
        self->private_data.f_palettes[1u][((4u * v_i) + 1u)] = 0u;
49078
        self->private_data.f_palettes[1u][((4u * v_i) + 2u)] = 0u;
49079
        self->private_data.f_palettes[1u][((4u * v_i) + 3u)] = 255u;
49080
        v_i += 1u;
49081
      }
49082
    } else if (self->private_impl.f_quirks[6u] &&  ! self->private_impl.f_has_global_palette) {
49083
      status = wuffs_base__make_status(wuffs_gif__error__bad_palette);
49084
      goto exit;
49085
    } else if (self->private_impl.f_gc_has_transparent_index) {
49086
      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));
49087
    } else {
49088
      v_which_palette = 0u;
49089
    }
49090
    if (self->private_impl.f_gc_has_transparent_index) {
49091
      self->private_data.f_palettes[1u][((4u * ((uint32_t)(self->private_impl.f_gc_transparent_index))) + 0u)] = 0u;
49092
      self->private_data.f_palettes[1u][((4u * ((uint32_t)(self->private_impl.f_gc_transparent_index))) + 1u)] = 0u;
49093
      self->private_data.f_palettes[1u][((4u * ((uint32_t)(self->private_impl.f_gc_transparent_index))) + 2u)] = 0u;
49094
      self->private_data.f_palettes[1u][((4u * ((uint32_t)(self->private_impl.f_gc_transparent_index))) + 3u)] = 0u;
49095
    }
49096
    v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler,
49097
        wuffs_base__pixel_buffer__pixel_format(a_dst),
49098
        wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)),
49099
        wuffs_base__utility__make_pixel_format(2198077448u),
49100
        wuffs_base__make_slice_u8(self->private_data.f_palettes[v_which_palette], 1024),
49101
        a_blend);
49102
    if ( ! wuffs_base__status__is_ok(&v_status)) {
49103
      status = v_status;
49104
      if (wuffs_base__status__is_error(&status)) {
49105
        goto exit;
49106
      } else if (wuffs_base__status__is_suspension(&status)) {
49107
        status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
49108
        goto exit;
49109
      }
49110
      goto ok;
49111
    }
49112
    if (self->private_impl.f_ignored_but_affects_benchmarks) {
49113
    }
49114
    {
49115
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
49116
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
49117
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
49118
        goto suspend;
49119
      }
49120
      uint8_t t_2 = *iop_a_src++;
49121
      v_lw = t_2;
49122
    }
49123
    if (v_lw > 8u) {
49124
      status = wuffs_base__make_status(wuffs_gif__error__bad_literal_width);
49125
      goto exit;
49126
    }
49127
    self->private_impl.f_lzw_pending_literal_width_plus_one = ((uint32_t)(((uint8_t)(1u + v_lw))));
49128
    self->private_impl.f_ignored_but_affects_benchmarks = true;
49129
49130
    ok:
49131
    self->private_impl.p_decode_id_part1 = 0;
49132
    goto exit;
49133
  }
49134
49135
  goto suspend;
49136
  suspend:
49137
  self->private_impl.p_decode_id_part1 = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
49138
  self->private_data.s_decode_id_part1.v_which_palette = v_which_palette;
49139
  self->private_data.s_decode_id_part1.v_num_palette_entries = v_num_palette_entries;
49140
  self->private_data.s_decode_id_part1.v_i = v_i;
49141
49142
  goto exit;
49143
  exit:
49144
  if (a_src && a_src->data.ptr) {
49145
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
49146
  }
49147
49148
  return status;
49149
}
49150
49151
// -------- func gif.decoder.decode_id_part2
49152
49153
WUFFS_BASE__GENERATED_C_CODE
49154
static wuffs_base__status
49155
wuffs_gif__decoder__decode_id_part2(
49156
    wuffs_gif__decoder* self,
49157
    wuffs_base__pixel_buffer* a_dst,
49158
    wuffs_base__io_buffer* a_src,
49159
    wuffs_base__slice_u8 a_workbuf) {
49160
  wuffs_base__status status = wuffs_base__make_status(NULL);
49161
49162
  uint64_t v_block_size = 0;
49163
  bool v_need_block_size = false;
49164
  uint32_t v_n_copied = 0;
49165
  uint64_t v_n_compressed = 0;
49166
  wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer();
49167
  wuffs_base__io_buffer* v_r = &u_r;
49168
  const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
49169
  const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
49170
  const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
49171
  const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
49172
  uint64_t v_mark = 0;
49173
  wuffs_base__status v_copy_status = wuffs_base__make_status(NULL);
49174
49175
  const uint8_t* iop_a_src = NULL;
49176
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
49177
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
49178
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
49179
  if (a_src && a_src->data.ptr) {
49180
    io0_a_src = a_src->data.ptr;
49181
    io1_a_src = io0_a_src + a_src->meta.ri;
49182
    iop_a_src = io1_a_src;
49183
    io2_a_src = io0_a_src + a_src->meta.wi;
49184
  }
49185
49186
  uint32_t coro_susp_point = self->private_impl.p_decode_id_part2;
49187
  if (coro_susp_point) {
49188
    v_block_size = self->private_data.s_decode_id_part2.v_block_size;
49189
    v_need_block_size = self->private_data.s_decode_id_part2.v_need_block_size;
49190
  }
49191
  switch (coro_susp_point) {
49192
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
49193
49194
    wuffs_gif__decoder__lzw_init(self);
49195
    v_need_block_size = true;
49196
    label__outer__continue:;
49197
    while (true) {
49198
      if (v_need_block_size) {
49199
        v_need_block_size = false;
49200
        {
49201
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
49202
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
49203
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
49204
            goto suspend;
49205
          }
49206
          uint64_t t_0 = *iop_a_src++;
49207
          v_block_size = t_0;
49208
        }
49209
      }
49210
      if (v_block_size == 0u) {
49211
        break;
49212
      }
49213
      while (((uint64_t)(io2_a_src - iop_a_src)) == 0u) {
49214
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
49215
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2);
49216
      }
49217
      if (self->private_impl.f_compressed_ri == self->private_impl.f_compressed_wi) {
49218
        self->private_impl.f_compressed_ri = 0u;
49219
        self->private_impl.f_compressed_wi = 0u;
49220
      }
49221
      while (self->private_impl.f_compressed_wi <= 3841u) {
49222
        v_n_compressed = wuffs_base__u64__min(v_block_size, ((uint64_t)(io2_a_src - iop_a_src)));
49223
        if (v_n_compressed <= 0u) {
49224
          break;
49225
        }
49226
        v_n_copied = wuffs_private_impl__io_reader__limited_copy_u32_to_slice(
49227
            &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));
49228
        wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_compressed_wi, ((uint64_t)(v_n_copied)));
49229
        wuffs_private_impl__u64__sat_sub_indirect(&v_block_size, ((uint64_t)(v_n_copied)));
49230
        if (v_block_size > 0u) {
49231
          break;
49232
        }
49233
        if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
49234
          v_need_block_size = true;
49235
          break;
49236
        }
49237
        v_block_size = ((uint64_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src)));
49238
        iop_a_src += 1u;
49239
      }
49240
      while (true) {
49241
        if ((self->private_impl.f_compressed_ri > self->private_impl.f_compressed_wi) || (self->private_impl.f_compressed_wi > 4096u)) {
49242
          status = wuffs_base__make_status(wuffs_gif__error__internal_error_inconsistent_i_o);
49243
          goto exit;
49244
        }
49245
        {
49246
          wuffs_base__io_buffer* o_0_v_r = v_r;
49247
          const uint8_t* o_0_iop_v_r = iop_v_r;
49248
          const uint8_t* o_0_io0_v_r = io0_v_r;
49249
          const uint8_t* o_0_io1_v_r = io1_v_r;
49250
          const uint8_t* o_0_io2_v_r = io2_v_r;
49251
          v_r = wuffs_private_impl__io_reader__set(
49252
              &u_r,
49253
              &iop_v_r,
49254
              &io0_v_r,
49255
              &io1_v_r,
49256
              &io2_v_r,
49257
              wuffs_base__make_slice_u8_ij(self->private_data.f_compressed,
49258
              self->private_impl.f_compressed_ri,
49259
              self->private_impl.f_compressed_wi),
49260
              0u);
49261
          v_mark = ((uint64_t)(iop_v_r - io0_v_r));
49262
          u_r.meta.ri = ((size_t)(iop_v_r - u_r.data.ptr));
49263
          wuffs_gif__decoder__lzw_read_from(self, v_r);
49264
          iop_v_r = u_r.data.ptr + u_r.meta.ri;
49265
          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))));
49266
          v_r = o_0_v_r;
49267
          iop_v_r = o_0_iop_v_r;
49268
          io0_v_r = o_0_io0_v_r;
49269
          io1_v_r = o_0_io1_v_r;
49270
          io2_v_r = o_0_io2_v_r;
49271
        }
49272
        if (self->private_impl.f_lzw_output_ri < self->private_impl.f_lzw_output_wi) {
49273
          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,
49274
              self->private_impl.f_lzw_output_ri,
49275
              self->private_impl.f_lzw_output_wi));
49276
          if (wuffs_base__status__is_error(&v_copy_status)) {
49277
            status = v_copy_status;
49278
            goto exit;
49279
          }
49280
          self->private_impl.f_lzw_output_ri = 0u;
49281
          self->private_impl.f_lzw_output_wi = 0u;
49282
        }
49283
        if (self->private_impl.f_lzw_read_from_return_value == 0u) {
49284
          self->private_impl.f_ignored_but_affects_benchmarks = false;
49285
          if (v_need_block_size || (v_block_size > 0u)) {
49286
            self->private_data.s_decode_id_part2.scratch = ((uint32_t)(v_block_size));
49287
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
49288
            if (self->private_data.s_decode_id_part2.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
49289
              self->private_data.s_decode_id_part2.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
49290
              iop_a_src = io2_a_src;
49291
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
49292
              goto suspend;
49293
            }
49294
            iop_a_src += self->private_data.s_decode_id_part2.scratch;
49295
            if (a_src) {
49296
              a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
49297
            }
49298
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
49299
            status = wuffs_gif__decoder__skip_blocks(self, a_src);
49300
            if (a_src) {
49301
              iop_a_src = a_src->data.ptr + a_src->meta.ri;
49302
            }
49303
            if (status.repr) {
49304
              goto suspend;
49305
            }
49306
          }
49307
          goto label__outer__break;
49308
        } else if (self->private_impl.f_lzw_read_from_return_value == 1u) {
49309
          continue;
49310
        } else if (self->private_impl.f_lzw_read_from_return_value == 2u) {
49311
          goto label__outer__continue;
49312
        } 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)) {
49313
          if (v_need_block_size || (v_block_size > 0u)) {
49314
            self->private_data.s_decode_id_part2.scratch = ((uint32_t)(v_block_size));
49315
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
49316
            if (self->private_data.s_decode_id_part2.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
49317
              self->private_data.s_decode_id_part2.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
49318
              iop_a_src = io2_a_src;
49319
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
49320
              goto suspend;
49321
            }
49322
            iop_a_src += self->private_data.s_decode_id_part2.scratch;
49323
            if (a_src) {
49324
              a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
49325
            }
49326
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
49327
            status = wuffs_gif__decoder__skip_blocks(self, a_src);
49328
            if (a_src) {
49329
              iop_a_src = a_src->data.ptr + a_src->meta.ri;
49330
            }
49331
            if (status.repr) {
49332
              goto suspend;
49333
            }
49334
          }
49335
          goto label__outer__break;
49336
        } else if (self->private_impl.f_lzw_read_from_return_value == 3u) {
49337
          status = wuffs_base__make_status(wuffs_gif__error__truncated_input);
49338
          goto exit;
49339
        } else if (self->private_impl.f_lzw_read_from_return_value == 4u) {
49340
          status = wuffs_base__make_status(wuffs_gif__error__bad_lzw_code);
49341
          goto exit;
49342
        }
49343
        status = wuffs_base__make_status(wuffs_gif__error__internal_error_inconsistent_i_o);
49344
        goto exit;
49345
      }
49346
    }
49347
    label__outer__break:;
49348
    self->private_impl.f_compressed_ri = 0u;
49349
    self->private_impl.f_compressed_wi = 0u;
49350
    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)) {
49351
      status = wuffs_base__make_status(wuffs_base__error__not_enough_data);
49352
      goto exit;
49353
    }
49354
49355
    ok:
49356
    self->private_impl.p_decode_id_part2 = 0;
49357
    goto exit;
49358
  }
49359
49360
  goto suspend;
49361
  suspend:
49362
  self->private_impl.p_decode_id_part2 = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
49363
  self->private_data.s_decode_id_part2.v_block_size = v_block_size;
49364
  self->private_data.s_decode_id_part2.v_need_block_size = v_need_block_size;
49365
49366
  goto exit;
49367
  exit:
49368
  if (a_src && a_src->data.ptr) {
49369
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
49370
  }
49371
49372
  return status;
49373
}
49374
49375
// -------- func gif.decoder.copy_to_image_buffer
49376
49377
WUFFS_BASE__GENERATED_C_CODE
49378
static wuffs_base__status
49379
wuffs_gif__decoder__copy_to_image_buffer(
49380
    wuffs_gif__decoder* self,
49381
    wuffs_base__pixel_buffer* a_pb,
49382
    wuffs_base__slice_u8 a_src) {
49383
  wuffs_base__slice_u8 v_dst = {0};
49384
  wuffs_base__slice_u8 v_src = {0};
49385
  uint64_t v_width_in_bytes = 0;
49386
  uint64_t v_n = 0;
49387
  uint64_t v_src_ri = 0;
49388
  wuffs_base__pixel_format v_pixfmt = {0};
49389
  uint32_t v_bytes_per_pixel = 0;
49390
  uint32_t v_bits_per_pixel = 0;
49391
  wuffs_base__table_u8 v_tab = {0};
49392
  uint64_t v_i = 0;
49393
  uint64_t v_j = 0;
49394
  uint32_t v_replicate_y0 = 0;
49395
  uint32_t v_replicate_y1 = 0;
49396
  wuffs_base__slice_u8 v_replicate_dst = {0};
49397
  wuffs_base__slice_u8 v_replicate_src = {0};
49398
49399
  v_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_pb);
49400
  v_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_pixfmt);
49401
  if ((v_bits_per_pixel & 7u) != 0u) {
49402
    return wuffs_base__make_status(wuffs_base__error__unsupported_option);
49403
  }
49404
  v_bytes_per_pixel = (v_bits_per_pixel >> 3u);
49405
  v_width_in_bytes = ((uint64_t)((self->private_impl.f_width * v_bytes_per_pixel)));
49406
  v_tab = wuffs_base__pixel_buffer__plane(a_pb, 0u);
49407
  while (v_src_ri < ((uint64_t)(a_src.len))) {
49408
    v_src = wuffs_base__slice_u8__subslice_i(a_src, v_src_ri);
49409
    if (self->private_impl.f_dst_y >= self->private_impl.f_frame_rect_y1) {
49410
      if (self->private_impl.f_quirks[3u]) {
49411
        return wuffs_base__make_status(NULL);
49412
      }
49413
      return wuffs_base__make_status(wuffs_base__error__too_much_data);
49414
    }
49415
    v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y);
49416
    if (self->private_impl.f_dst_y >= self->private_impl.f_height) {
49417
      v_dst = wuffs_base__slice_u8__subslice_j(v_dst, 0u);
49418
    } else if (v_width_in_bytes < ((uint64_t)(v_dst.len))) {
49419
      v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_width_in_bytes);
49420
    }
49421
    v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_bytes_per_pixel)));
49422
    if (v_i < ((uint64_t)(v_dst.len))) {
49423
      v_j = (((uint64_t)(self->private_impl.f_frame_rect_x1)) * ((uint64_t)(v_bytes_per_pixel)));
49424
      if ((v_i <= v_j) && (v_j <= ((uint64_t)(v_dst.len)))) {
49425
        v_dst = wuffs_base__slice_u8__subslice_ij(v_dst, v_i, v_j);
49426
      } else {
49427
        v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_i);
49428
      }
49429
      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);
49430
      wuffs_private_impl__u64__sat_add_indirect(&v_src_ri, v_n);
49431
      wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n)));
49432
      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));
49433
    }
49434
    if (self->private_impl.f_frame_rect_x1 <= self->private_impl.f_dst_x) {
49435
      self->private_impl.f_dst_x = self->private_impl.f_frame_rect_x0;
49436
      if (self->private_impl.f_interlace == 0u) {
49437
        wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_y, 1u);
49438
        continue;
49439
      }
49440
      if ((self->private_impl.f_num_decoded_frames_value == 0u) &&  ! self->private_impl.f_gc_has_transparent_index && (self->private_impl.f_interlace > 1u)) {
49441
        v_replicate_src = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y);
49442
        v_replicate_y0 = wuffs_base__u32__sat_add(self->private_impl.f_dst_y, 1u);
49443
        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])));
49444
        v_replicate_y1 = wuffs_base__u32__min(v_replicate_y1, self->private_impl.f_frame_rect_y1);
49445
        while (v_replicate_y0 < v_replicate_y1) {
49446
          v_replicate_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_replicate_y0);
49447
          wuffs_private_impl__slice_u8__copy_from_slice(v_replicate_dst, v_replicate_src);
49448
          v_replicate_y0 += 1u;
49449
        }
49450
        self->private_impl.f_dirty_max_excl_y = wuffs_base__u32__max(self->private_impl.f_dirty_max_excl_y, v_replicate_y1);
49451
      }
49452
      wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_y, ((uint32_t)(WUFFS_GIF__INTERLACE_DELTA[self->private_impl.f_interlace])));
49453
      while ((self->private_impl.f_interlace > 0u) && (self->private_impl.f_dst_y >= self->private_impl.f_frame_rect_y1)) {
49454
#if defined(__GNUC__)
49455
#pragma GCC diagnostic push
49456
#pragma GCC diagnostic ignored "-Wconversion"
49457
#endif
49458
        self->private_impl.f_interlace -= 1u;
49459
#if defined(__GNUC__)
49460
#pragma GCC diagnostic pop
49461
#endif
49462
        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]);
49463
      }
49464
      continue;
49465
    }
49466
    if (((uint64_t)(a_src.len)) == v_src_ri) {
49467
      break;
49468
    } else if (((uint64_t)(a_src.len)) < v_src_ri) {
49469
      return wuffs_base__make_status(wuffs_gif__error__internal_error_inconsistent_i_o);
49470
    }
49471
    v_n = ((uint64_t)((self->private_impl.f_frame_rect_x1 - self->private_impl.f_dst_x)));
49472
    v_n = wuffs_base__u64__min(v_n, (((uint64_t)(a_src.len)) - v_src_ri));
49473
    wuffs_private_impl__u64__sat_add_indirect(&v_src_ri, v_n);
49474
    wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n)));
49475
    if (self->private_impl.f_frame_rect_x1 <= self->private_impl.f_dst_x) {
49476
      self->private_impl.f_dst_x = self->private_impl.f_frame_rect_x0;
49477
      wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_y, ((uint32_t)(WUFFS_GIF__INTERLACE_DELTA[self->private_impl.f_interlace])));
49478
      while ((self->private_impl.f_interlace > 0u) && (self->private_impl.f_dst_y >= self->private_impl.f_frame_rect_y1)) {
49479
#if defined(__GNUC__)
49480
#pragma GCC diagnostic push
49481
#pragma GCC diagnostic ignored "-Wconversion"
49482
#endif
49483
        self->private_impl.f_interlace -= 1u;
49484
#if defined(__GNUC__)
49485
#pragma GCC diagnostic pop
49486
#endif
49487
        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]);
49488
      }
49489
      continue;
49490
    }
49491
    if (v_src_ri != ((uint64_t)(a_src.len))) {
49492
      return wuffs_base__make_status(wuffs_gif__error__internal_error_inconsistent_i_o);
49493
    }
49494
    break;
49495
  }
49496
  return wuffs_base__make_status(NULL);
49497
}
49498
49499
// -------- func gif.decoder.lzw_init
49500
49501
WUFFS_BASE__GENERATED_C_CODE
49502
static wuffs_base__empty_struct
49503
wuffs_gif__decoder__lzw_init(
49504
    wuffs_gif__decoder* self) {
49505
  uint32_t v_i = 0;
49506
49507
  self->private_impl.f_lzw_literal_width = 8u;
49508
  if (self->private_impl.f_lzw_pending_literal_width_plus_one > 0u) {
49509
    self->private_impl.f_lzw_literal_width = (self->private_impl.f_lzw_pending_literal_width_plus_one - 1u);
49510
  }
49511
  self->private_impl.f_lzw_clear_code = (((uint32_t)(1u)) << self->private_impl.f_lzw_literal_width);
49512
  self->private_impl.f_lzw_end_code = (self->private_impl.f_lzw_clear_code + 1u);
49513
  self->private_impl.f_lzw_save_code = self->private_impl.f_lzw_end_code;
49514
  self->private_impl.f_lzw_prev_code = self->private_impl.f_lzw_end_code;
49515
  self->private_impl.f_lzw_width = (self->private_impl.f_lzw_literal_width + 1u);
49516
  self->private_impl.f_lzw_bits = 0u;
49517
  self->private_impl.f_lzw_n_bits = 0u;
49518
  self->private_impl.f_lzw_output_ri = 0u;
49519
  self->private_impl.f_lzw_output_wi = 0u;
49520
  v_i = 0u;
49521
  while (v_i < self->private_impl.f_lzw_clear_code) {
49522
    self->private_data.f_lzw_lm1s[v_i] = 0u;
49523
    self->private_data.f_lzw_suffixes[v_i][0u] = ((uint8_t)(v_i));
49524
    v_i += 1u;
49525
  }
49526
  return wuffs_base__make_empty_struct();
49527
}
49528
49529
// -------- func gif.decoder.lzw_read_from
49530
49531
WUFFS_BASE__GENERATED_C_CODE
49532
static wuffs_base__empty_struct
49533
wuffs_gif__decoder__lzw_read_from(
49534
    wuffs_gif__decoder* self,
49535
    wuffs_base__io_buffer* a_src) {
49536
  uint32_t v_clear_code = 0;
49537
  uint32_t v_end_code = 0;
49538
  uint32_t v_save_code = 0;
49539
  uint32_t v_prev_code = 0;
49540
  uint32_t v_width = 0;
49541
  uint32_t v_bits = 0;
49542
  uint32_t v_n_bits = 0;
49543
  uint32_t v_output_wi = 0;
49544
  uint32_t v_code = 0;
49545
  uint32_t v_c = 0;
49546
  uint32_t v_o = 0;
49547
  uint32_t v_steps = 0;
49548
  uint8_t v_first_byte = 0;
49549
  uint16_t v_lm1_b = 0;
49550
  uint16_t v_lm1_a = 0;
49551
49552
  const uint8_t* iop_a_src = NULL;
49553
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
49554
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
49555
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
49556
  if (a_src && a_src->data.ptr) {
49557
    io0_a_src = a_src->data.ptr;
49558
    io1_a_src = io0_a_src + a_src->meta.ri;
49559
    iop_a_src = io1_a_src;
49560
    io2_a_src = io0_a_src + a_src->meta.wi;
49561
  }
49562
49563
  v_clear_code = self->private_impl.f_lzw_clear_code;
49564
  v_end_code = self->private_impl.f_lzw_end_code;
49565
  v_save_code = self->private_impl.f_lzw_save_code;
49566
  v_prev_code = self->private_impl.f_lzw_prev_code;
49567
  v_width = self->private_impl.f_lzw_width;
49568
  v_bits = self->private_impl.f_lzw_bits;
49569
  v_n_bits = self->private_impl.f_lzw_n_bits;
49570
  v_output_wi = self->private_impl.f_lzw_output_wi;
49571
  while (true) {
49572
    if (v_n_bits < v_width) {
49573
      if (((uint64_t)(io2_a_src - iop_a_src)) >= 4u) {
49574
        v_bits |= ((uint32_t)(wuffs_base__peek_u32le__no_bounds_check(iop_a_src) << v_n_bits));
49575
        iop_a_src += ((31u - v_n_bits) >> 3u);
49576
        v_n_bits |= 24u;
49577
      } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
49578
        if (a_src && a_src->meta.closed) {
49579
          self->private_impl.f_lzw_read_from_return_value = 3u;
49580
        } else {
49581
          self->private_impl.f_lzw_read_from_return_value = 2u;
49582
        }
49583
        break;
49584
      } else {
49585
        v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
49586
        iop_a_src += 1u;
49587
        v_n_bits += 8u;
49588
        if (v_n_bits >= v_width) {
49589
        } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
49590
          if (a_src && a_src->meta.closed) {
49591
            self->private_impl.f_lzw_read_from_return_value = 3u;
49592
          } else {
49593
            self->private_impl.f_lzw_read_from_return_value = 2u;
49594
          }
49595
          break;
49596
        } else {
49597
          v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
49598
          iop_a_src += 1u;
49599
          v_n_bits += 8u;
49600
          if (v_n_bits < v_width) {
49601
            self->private_impl.f_lzw_read_from_return_value = 5u;
49602
            break;
49603
          }
49604
        }
49605
      }
49606
    }
49607
    v_code = ((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(v_width));
49608
    v_bits >>= v_width;
49609
    v_n_bits -= v_width;
49610
    if (v_code < v_clear_code) {
49611
      self->private_data.f_lzw_output[v_output_wi] = ((uint8_t)(v_code));
49612
      v_output_wi = ((v_output_wi + 1u) & 8191u);
49613
      if (v_save_code <= 4095u) {
49614
        v_lm1_a = ((uint16_t)(((uint16_t)(self->private_data.f_lzw_lm1s[v_prev_code] + 1u)) & 4095u));
49615
        self->private_data.f_lzw_lm1s[v_save_code] = v_lm1_a;
49616
        if (((uint16_t)(v_lm1_a % 8u)) != 0u) {
49617
          self->private_impl.f_lzw_prefixes[v_save_code] = self->private_impl.f_lzw_prefixes[v_prev_code];
49618
          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]));
49619
          self->private_data.f_lzw_suffixes[v_save_code][((uint16_t)(v_lm1_a % 8u))] = ((uint8_t)(v_code));
49620
        } else {
49621
          self->private_impl.f_lzw_prefixes[v_save_code] = ((uint16_t)(v_prev_code));
49622
          self->private_data.f_lzw_suffixes[v_save_code][0u] = ((uint8_t)(v_code));
49623
        }
49624
        v_save_code += 1u;
49625
        if (v_width < 12u) {
49626
          v_width += (1u & (v_save_code >> v_width));
49627
        }
49628
        v_prev_code = v_code;
49629
      }
49630
    } else if (v_code <= v_end_code) {
49631
      if (v_code == v_end_code) {
49632
        self->private_impl.f_lzw_read_from_return_value = 0u;
49633
        break;
49634
      }
49635
      v_save_code = v_end_code;
49636
      v_prev_code = v_end_code;
49637
      v_width = (self->private_impl.f_lzw_literal_width + 1u);
49638
    } else if (v_code <= v_save_code) {
49639
      v_c = v_code;
49640
      if (v_code == v_save_code) {
49641
        v_c = v_prev_code;
49642
      }
49643
      v_o = ((v_output_wi + (((uint32_t)(self->private_data.f_lzw_lm1s[v_c])) & 4294967288u)) & 8191u);
49644
      v_output_wi = ((v_output_wi + 1u + ((uint32_t)(self->private_data.f_lzw_lm1s[v_c]))) & 8191u);
49645
      v_steps = (((uint32_t)(self->private_data.f_lzw_lm1s[v_c])) >> 3u);
49646
      while (true) {
49647
        memcpy((self->private_data.f_lzw_output)+(v_o), (self->private_data.f_lzw_suffixes[v_c]), 8u);
49648
        if (v_steps <= 0u) {
49649
          break;
49650
        }
49651
        v_steps -= 1u;
49652
        v_o = (((uint32_t)(v_o - 8u)) & 8191u);
49653
        v_c = ((uint32_t)(self->private_impl.f_lzw_prefixes[v_c]));
49654
      }
49655
      v_first_byte = self->private_data.f_lzw_suffixes[v_c][0u];
49656
      if (v_code == v_save_code) {
49657
        self->private_data.f_lzw_output[v_output_wi] = v_first_byte;
49658
        v_output_wi = ((v_output_wi + 1u) & 8191u);
49659
      }
49660
      if (v_save_code <= 4095u) {
49661
        v_lm1_b = ((uint16_t)(((uint16_t)(self->private_data.f_lzw_lm1s[v_prev_code] + 1u)) & 4095u));
49662
        self->private_data.f_lzw_lm1s[v_save_code] = v_lm1_b;
49663
        if (((uint16_t)(v_lm1_b % 8u)) != 0u) {
49664
          self->private_impl.f_lzw_prefixes[v_save_code] = self->private_impl.f_lzw_prefixes[v_prev_code];
49665
          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]));
49666
          self->private_data.f_lzw_suffixes[v_save_code][((uint16_t)(v_lm1_b % 8u))] = v_first_byte;
49667
        } else {
49668
          self->private_impl.f_lzw_prefixes[v_save_code] = ((uint16_t)(v_prev_code));
49669
          self->private_data.f_lzw_suffixes[v_save_code][0u] = ((uint8_t)(v_first_byte));
49670
        }
49671
        v_save_code += 1u;
49672
        if (v_width < 12u) {
49673
          v_width += (1u & (v_save_code >> v_width));
49674
        }
49675
        v_prev_code = v_code;
49676
      }
49677
    } else {
49678
      self->private_impl.f_lzw_read_from_return_value = 4u;
49679
      break;
49680
    }
49681
    if (v_output_wi > 4095u) {
49682
      self->private_impl.f_lzw_read_from_return_value = 1u;
49683
      break;
49684
    }
49685
  }
49686
  if (self->private_impl.f_lzw_read_from_return_value != 2u) {
49687
    while (v_n_bits >= 8u) {
49688
      v_n_bits -= 8u;
49689
      if (iop_a_src > io1_a_src) {
49690
        iop_a_src--;
49691
      } else {
49692
        self->private_impl.f_lzw_read_from_return_value = 5u;
49693
        break;
49694
      }
49695
    }
49696
  }
49697
  self->private_impl.f_lzw_save_code = v_save_code;
49698
  self->private_impl.f_lzw_prev_code = v_prev_code;
49699
  self->private_impl.f_lzw_width = v_width;
49700
  self->private_impl.f_lzw_bits = v_bits;
49701
  self->private_impl.f_lzw_n_bits = v_n_bits;
49702
  self->private_impl.f_lzw_output_wi = v_output_wi;
49703
  if (a_src && a_src->data.ptr) {
49704
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
49705
  }
49706
49707
  return wuffs_base__make_empty_struct();
49708
}
49709
49710
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GIF)
49711
49712
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GZIP)
49713
49714
// ---------------- Status Codes Implementations
49715
49716
const char wuffs_gzip__error__bad_checksum[] = "#gzip: bad checksum";
49717
const char wuffs_gzip__error__bad_compression_method[] = "#gzip: bad compression method";
49718
const char wuffs_gzip__error__bad_encoding_flags[] = "#gzip: bad encoding flags";
49719
const char wuffs_gzip__error__bad_header[] = "#gzip: bad header";
49720
const char wuffs_gzip__error__truncated_input[] = "#gzip: truncated input";
49721
49722
// ---------------- Private Consts
49723
49724
// ---------------- Private Initializer Prototypes
49725
49726
// ---------------- Private Function Prototypes
49727
49728
WUFFS_BASE__GENERATED_C_CODE
49729
static wuffs_base__status
49730
wuffs_gzip__decoder__do_transform_io(
49731
    wuffs_gzip__decoder* self,
49732
    wuffs_base__io_buffer* a_dst,
49733
    wuffs_base__io_buffer* a_src,
49734
    wuffs_base__slice_u8 a_workbuf);
49735
49736
// ---------------- VTables
49737
49738
const wuffs_base__io_transformer__func_ptrs
49739
wuffs_gzip__decoder__func_ptrs_for__wuffs_base__io_transformer = {
49740
  (wuffs_base__optional_u63(*)(const void*))(&wuffs_gzip__decoder__dst_history_retain_length),
49741
  (uint64_t(*)(const void*,
49742
      uint32_t))(&wuffs_gzip__decoder__get_quirk),
49743
  (wuffs_base__status(*)(void*,
49744
      uint32_t,
49745
      uint64_t))(&wuffs_gzip__decoder__set_quirk),
49746
  (wuffs_base__status(*)(void*,
49747
      wuffs_base__io_buffer*,
49748
      wuffs_base__io_buffer*,
49749
      wuffs_base__slice_u8))(&wuffs_gzip__decoder__transform_io),
49750
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_gzip__decoder__workbuf_len),
49751
};
49752
49753
// ---------------- Initializer Implementations
49754
49755
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
49756
wuffs_gzip__decoder__initialize(
49757
    wuffs_gzip__decoder* self,
49758
    size_t sizeof_star_self,
49759
    uint64_t wuffs_version,
49760
    uint32_t options){
49761
  if (!self) {
49762
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
49763
  }
49764
  if (sizeof(*self) != sizeof_star_self) {
49765
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
49766
  }
49767
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
49768
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
49769
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
49770
  }
49771
49772
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
49773
    // The whole point of this if-check is to detect an uninitialized *self.
49774
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
49775
#if !defined(__clang__) && defined(__GNUC__)
49776
#pragma GCC diagnostic push
49777
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
49778
#endif
49779
    if (self->private_impl.magic != 0) {
49780
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
49781
    }
49782
#if !defined(__clang__) && defined(__GNUC__)
49783
#pragma GCC diagnostic pop
49784
#endif
49785
  } else {
49786
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
49787
      memset(self, 0, sizeof(*self));
49788
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
49789
    } else {
49790
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
49791
    }
49792
  }
49793
49794
  {
49795
    wuffs_base__status z = wuffs_crc32__ieee_hasher__initialize(
49796
        &self->private_data.f_checksum, sizeof(self->private_data.f_checksum), WUFFS_VERSION, options);
49797
    if (z.repr) {
49798
      return z;
49799
    }
49800
  }
49801
  {
49802
    wuffs_base__status z = wuffs_deflate__decoder__initialize(
49803
        &self->private_data.f_flate, sizeof(self->private_data.f_flate), WUFFS_VERSION, options);
49804
    if (z.repr) {
49805
      return z;
49806
    }
49807
  }
49808
  self->private_impl.magic = WUFFS_BASE__MAGIC;
49809
  self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name =
49810
      wuffs_base__io_transformer__vtable_name;
49811
  self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers =
49812
      (const void*)(&wuffs_gzip__decoder__func_ptrs_for__wuffs_base__io_transformer);
49813
  return wuffs_base__make_status(NULL);
49814
}
49815
49816
wuffs_gzip__decoder*
49817
wuffs_gzip__decoder__alloc(void) {
49818
  wuffs_gzip__decoder* x =
49819
      (wuffs_gzip__decoder*)(calloc(1, sizeof(wuffs_gzip__decoder)));
49820
  if (!x) {
49821
    return NULL;
49822
  }
49823
  if (wuffs_gzip__decoder__initialize(
49824
      x, sizeof(wuffs_gzip__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
49825
    free(x);
49826
    return NULL;
49827
  }
49828
  return x;
49829
}
49830
49831
size_t
49832
sizeof__wuffs_gzip__decoder(void) {
49833
  return sizeof(wuffs_gzip__decoder);
49834
}
49835
49836
// ---------------- Function Implementations
49837
49838
// -------- func gzip.decoder.get_quirk
49839
49840
WUFFS_BASE__GENERATED_C_CODE
49841
WUFFS_BASE__MAYBE_STATIC uint64_t
49842
wuffs_gzip__decoder__get_quirk(
49843
    const wuffs_gzip__decoder* self,
49844
    uint32_t a_key) {
49845
  if (!self) {
49846
    return 0;
49847
  }
49848
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
49849
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
49850
    return 0;
49851
  }
49852
49853
  if ((a_key == 1u) && self->private_impl.f_ignore_checksum) {
49854
    return 1u;
49855
  }
49856
  return 0u;
49857
}
49858
49859
// -------- func gzip.decoder.set_quirk
49860
49861
WUFFS_BASE__GENERATED_C_CODE
49862
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
49863
wuffs_gzip__decoder__set_quirk(
49864
    wuffs_gzip__decoder* self,
49865
    uint32_t a_key,
49866
    uint64_t a_value) {
49867
  if (!self) {
49868
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
49869
  }
49870
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
49871
    return wuffs_base__make_status(
49872
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
49873
        ? wuffs_base__error__disabled_by_previous_error
49874
        : wuffs_base__error__initialize_not_called);
49875
  }
49876
49877
  if (a_key == 1u) {
49878
    self->private_impl.f_ignore_checksum = (a_value > 0u);
49879
    return wuffs_base__make_status(NULL);
49880
  }
49881
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
49882
}
49883
49884
// -------- func gzip.decoder.dst_history_retain_length
49885
49886
WUFFS_BASE__GENERATED_C_CODE
49887
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
49888
wuffs_gzip__decoder__dst_history_retain_length(
49889
    const wuffs_gzip__decoder* self) {
49890
  if (!self) {
49891
    return wuffs_base__utility__make_optional_u63(false, 0u);
49892
  }
49893
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
49894
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
49895
    return wuffs_base__utility__make_optional_u63(false, 0u);
49896
  }
49897
49898
  return wuffs_base__utility__make_optional_u63(true, 0u);
49899
}
49900
49901
// -------- func gzip.decoder.workbuf_len
49902
49903
WUFFS_BASE__GENERATED_C_CODE
49904
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
49905
wuffs_gzip__decoder__workbuf_len(
49906
    const wuffs_gzip__decoder* self) {
49907
  if (!self) {
49908
    return wuffs_base__utility__empty_range_ii_u64();
49909
  }
49910
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
49911
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
49912
    return wuffs_base__utility__empty_range_ii_u64();
49913
  }
49914
49915
  return wuffs_base__utility__make_range_ii_u64(1u, 1u);
49916
}
49917
49918
// -------- func gzip.decoder.transform_io
49919
49920
WUFFS_BASE__GENERATED_C_CODE
49921
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
49922
wuffs_gzip__decoder__transform_io(
49923
    wuffs_gzip__decoder* self,
49924
    wuffs_base__io_buffer* a_dst,
49925
    wuffs_base__io_buffer* a_src,
49926
    wuffs_base__slice_u8 a_workbuf) {
49927
  if (!self) {
49928
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
49929
  }
49930
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
49931
    return wuffs_base__make_status(
49932
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
49933
        ? wuffs_base__error__disabled_by_previous_error
49934
        : wuffs_base__error__initialize_not_called);
49935
  }
49936
  if (!a_dst || !a_src) {
49937
    self->private_impl.magic = WUFFS_BASE__DISABLED;
49938
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
49939
  }
49940
  if ((self->private_impl.active_coroutine != 0) &&
49941
      (self->private_impl.active_coroutine != 1)) {
49942
    self->private_impl.magic = WUFFS_BASE__DISABLED;
49943
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
49944
  }
49945
  self->private_impl.active_coroutine = 0;
49946
  wuffs_base__status status = wuffs_base__make_status(NULL);
49947
49948
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
49949
49950
  uint32_t coro_susp_point = self->private_impl.p_transform_io;
49951
  switch (coro_susp_point) {
49952
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
49953
49954
    while (true) {
49955
      {
49956
        wuffs_base__status t_0 = wuffs_gzip__decoder__do_transform_io(self, a_dst, a_src, a_workbuf);
49957
        v_status = t_0;
49958
      }
49959
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
49960
        status = wuffs_base__make_status(wuffs_gzip__error__truncated_input);
49961
        goto exit;
49962
      }
49963
      status = v_status;
49964
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
49965
    }
49966
49967
    ok:
49968
    self->private_impl.p_transform_io = 0;
49969
    goto exit;
49970
  }
49971
49972
  goto suspend;
49973
  suspend:
49974
  self->private_impl.p_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
49975
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
49976
49977
  goto exit;
49978
  exit:
49979
  if (wuffs_base__status__is_error(&status)) {
49980
    self->private_impl.magic = WUFFS_BASE__DISABLED;
49981
  }
49982
  return status;
49983
}
49984
49985
// -------- func gzip.decoder.do_transform_io
49986
49987
WUFFS_BASE__GENERATED_C_CODE
49988
static wuffs_base__status
49989
wuffs_gzip__decoder__do_transform_io(
49990
    wuffs_gzip__decoder* self,
49991
    wuffs_base__io_buffer* a_dst,
49992
    wuffs_base__io_buffer* a_src,
49993
    wuffs_base__slice_u8 a_workbuf) {
49994
  wuffs_base__status status = wuffs_base__make_status(NULL);
49995
49996
  uint8_t v_c8 = 0;
49997
  uint8_t v_flags = 0;
49998
  uint16_t v_xlen = 0;
49999
  uint64_t v_mark = 0;
50000
  uint32_t v_checksum_have = 0;
50001
  uint32_t v_decoded_length_have = 0;
50002
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
50003
  uint32_t v_checksum_want = 0;
50004
  uint32_t v_decoded_length_want = 0;
50005
50006
  uint8_t* iop_a_dst = NULL;
50007
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
50008
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
50009
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
50010
  if (a_dst && a_dst->data.ptr) {
50011
    io0_a_dst = a_dst->data.ptr;
50012
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
50013
    iop_a_dst = io1_a_dst;
50014
    io2_a_dst = io0_a_dst + a_dst->data.len;
50015
    if (a_dst->meta.closed) {
50016
      io2_a_dst = iop_a_dst;
50017
    }
50018
  }
50019
  const uint8_t* iop_a_src = NULL;
50020
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
50021
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
50022
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
50023
  if (a_src && a_src->data.ptr) {
50024
    io0_a_src = a_src->data.ptr;
50025
    io1_a_src = io0_a_src + a_src->meta.ri;
50026
    iop_a_src = io1_a_src;
50027
    io2_a_src = io0_a_src + a_src->meta.wi;
50028
  }
50029
50030
  uint32_t coro_susp_point = self->private_impl.p_do_transform_io;
50031
  if (coro_susp_point) {
50032
    v_flags = self->private_data.s_do_transform_io.v_flags;
50033
    v_checksum_have = self->private_data.s_do_transform_io.v_checksum_have;
50034
    v_decoded_length_have = self->private_data.s_do_transform_io.v_decoded_length_have;
50035
    v_checksum_want = self->private_data.s_do_transform_io.v_checksum_want;
50036
  }
50037
  switch (coro_susp_point) {
50038
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
50039
50040
    {
50041
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
50042
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
50043
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
50044
        goto suspend;
50045
      }
50046
      uint8_t t_0 = *iop_a_src++;
50047
      v_c8 = t_0;
50048
    }
50049
    if (v_c8 != 31u) {
50050
      status = wuffs_base__make_status(wuffs_gzip__error__bad_header);
50051
      goto exit;
50052
    }
50053
    {
50054
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
50055
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
50056
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
50057
        goto suspend;
50058
      }
50059
      uint8_t t_1 = *iop_a_src++;
50060
      v_c8 = t_1;
50061
    }
50062
    if (v_c8 != 139u) {
50063
      status = wuffs_base__make_status(wuffs_gzip__error__bad_header);
50064
      goto exit;
50065
    }
50066
    {
50067
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
50068
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
50069
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
50070
        goto suspend;
50071
      }
50072
      uint8_t t_2 = *iop_a_src++;
50073
      v_c8 = t_2;
50074
    }
50075
    if (v_c8 != 8u) {
50076
      status = wuffs_base__make_status(wuffs_gzip__error__bad_compression_method);
50077
      goto exit;
50078
    }
50079
    {
50080
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
50081
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
50082
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
50083
        goto suspend;
50084
      }
50085
      uint8_t t_3 = *iop_a_src++;
50086
      v_flags = t_3;
50087
    }
50088
    self->private_data.s_do_transform_io.scratch = 6u;
50089
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
50090
    if (self->private_data.s_do_transform_io.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
50091
      self->private_data.s_do_transform_io.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
50092
      iop_a_src = io2_a_src;
50093
      status = wuffs_base__make_status(wuffs_base__suspension__short_read);
50094
      goto suspend;
50095
    }
50096
    iop_a_src += self->private_data.s_do_transform_io.scratch;
50097
    if (((uint8_t)(v_flags & 4u)) != 0u) {
50098
      {
50099
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
50100
        uint16_t t_4;
50101
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
50102
          t_4 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src);
50103
          iop_a_src += 2;
50104
        } else {
50105
          self->private_data.s_do_transform_io.scratch = 0;
50106
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
50107
          while (true) {
50108
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
50109
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
50110
              goto suspend;
50111
            }
50112
            uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
50113
            uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56));
50114
            *scratch <<= 8;
50115
            *scratch >>= 8;
50116
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4;
50117
            if (num_bits_4 == 8) {
50118
              t_4 = ((uint16_t)(*scratch));
50119
              break;
50120
            }
50121
            num_bits_4 += 8u;
50122
            *scratch |= ((uint64_t)(num_bits_4)) << 56;
50123
          }
50124
        }
50125
        v_xlen = t_4;
50126
      }
50127
      self->private_data.s_do_transform_io.scratch = ((uint32_t)(v_xlen));
50128
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
50129
      if (self->private_data.s_do_transform_io.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
50130
        self->private_data.s_do_transform_io.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
50131
        iop_a_src = io2_a_src;
50132
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
50133
        goto suspend;
50134
      }
50135
      iop_a_src += self->private_data.s_do_transform_io.scratch;
50136
    }
50137
    if (((uint8_t)(v_flags & 8u)) != 0u) {
50138
      while (true) {
50139
        {
50140
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
50141
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
50142
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
50143
            goto suspend;
50144
          }
50145
          uint8_t t_5 = *iop_a_src++;
50146
          v_c8 = t_5;
50147
        }
50148
        if (v_c8 == 0u) {
50149
          break;
50150
        }
50151
      }
50152
    }
50153
    if (((uint8_t)(v_flags & 16u)) != 0u) {
50154
      while (true) {
50155
        {
50156
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
50157
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
50158
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
50159
            goto suspend;
50160
          }
50161
          uint8_t t_6 = *iop_a_src++;
50162
          v_c8 = t_6;
50163
        }
50164
        if (v_c8 == 0u) {
50165
          break;
50166
        }
50167
      }
50168
    }
50169
    if (((uint8_t)(v_flags & 2u)) != 0u) {
50170
      self->private_data.s_do_transform_io.scratch = 2u;
50171
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11);
50172
      if (self->private_data.s_do_transform_io.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
50173
        self->private_data.s_do_transform_io.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
50174
        iop_a_src = io2_a_src;
50175
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
50176
        goto suspend;
50177
      }
50178
      iop_a_src += self->private_data.s_do_transform_io.scratch;
50179
    }
50180
    if (((uint8_t)(v_flags & 224u)) != 0u) {
50181
      status = wuffs_base__make_status(wuffs_gzip__error__bad_encoding_flags);
50182
      goto exit;
50183
    }
50184
    while (true) {
50185
      v_mark = ((uint64_t)(iop_a_dst - io0_a_dst));
50186
      {
50187
        if (a_dst) {
50188
          a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
50189
        }
50190
        if (a_src) {
50191
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
50192
        }
50193
        wuffs_base__status t_7 = wuffs_deflate__decoder__transform_io(&self->private_data.f_flate, a_dst, a_src, a_workbuf);
50194
        v_status = t_7;
50195
        if (a_dst) {
50196
          iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
50197
        }
50198
        if (a_src) {
50199
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
50200
        }
50201
      }
50202
      if ( ! self->private_impl.f_ignore_checksum) {
50203
        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));
50204
        v_decoded_length_have += ((uint32_t)(wuffs_private_impl__io__count_since(v_mark, ((uint64_t)(iop_a_dst - io0_a_dst)))));
50205
      }
50206
      if (wuffs_base__status__is_ok(&v_status)) {
50207
        break;
50208
      }
50209
      status = v_status;
50210
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(12);
50211
    }
50212
    {
50213
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13);
50214
      uint32_t t_8;
50215
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
50216
        t_8 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
50217
        iop_a_src += 4;
50218
      } else {
50219
        self->private_data.s_do_transform_io.scratch = 0;
50220
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14);
50221
        while (true) {
50222
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
50223
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
50224
            goto suspend;
50225
          }
50226
          uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
50227
          uint32_t num_bits_8 = ((uint32_t)(*scratch >> 56));
50228
          *scratch <<= 8;
50229
          *scratch >>= 8;
50230
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_8;
50231
          if (num_bits_8 == 24) {
50232
            t_8 = ((uint32_t)(*scratch));
50233
            break;
50234
          }
50235
          num_bits_8 += 8u;
50236
          *scratch |= ((uint64_t)(num_bits_8)) << 56;
50237
        }
50238
      }
50239
      v_checksum_want = t_8;
50240
    }
50241
    {
50242
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15);
50243
      uint32_t t_9;
50244
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
50245
        t_9 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
50246
        iop_a_src += 4;
50247
      } else {
50248
        self->private_data.s_do_transform_io.scratch = 0;
50249
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16);
50250
        while (true) {
50251
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
50252
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
50253
            goto suspend;
50254
          }
50255
          uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
50256
          uint32_t num_bits_9 = ((uint32_t)(*scratch >> 56));
50257
          *scratch <<= 8;
50258
          *scratch >>= 8;
50259
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_9;
50260
          if (num_bits_9 == 24) {
50261
            t_9 = ((uint32_t)(*scratch));
50262
            break;
50263
          }
50264
          num_bits_9 += 8u;
50265
          *scratch |= ((uint64_t)(num_bits_9)) << 56;
50266
        }
50267
      }
50268
      v_decoded_length_want = t_9;
50269
    }
50270
    if ( ! self->private_impl.f_ignore_checksum && ((v_checksum_have != v_checksum_want) || (v_decoded_length_have != v_decoded_length_want))) {
50271
      status = wuffs_base__make_status(wuffs_gzip__error__bad_checksum);
50272
      goto exit;
50273
    }
50274
50275
    ok:
50276
    self->private_impl.p_do_transform_io = 0;
50277
    goto exit;
50278
  }
50279
50280
  goto suspend;
50281
  suspend:
50282
  self->private_impl.p_do_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
50283
  self->private_data.s_do_transform_io.v_flags = v_flags;
50284
  self->private_data.s_do_transform_io.v_checksum_have = v_checksum_have;
50285
  self->private_data.s_do_transform_io.v_decoded_length_have = v_decoded_length_have;
50286
  self->private_data.s_do_transform_io.v_checksum_want = v_checksum_want;
50287
50288
  goto exit;
50289
  exit:
50290
  if (a_dst && a_dst->data.ptr) {
50291
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
50292
  }
50293
  if (a_src && a_src->data.ptr) {
50294
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
50295
  }
50296
50297
  return status;
50298
}
50299
50300
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GZIP)
50301
50302
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__HANDSUM)
50303
50304
// ---------------- Status Codes Implementations
50305
50306
const char wuffs_handsum__error__bad_header[] = "#handsum: bad header";
50307
const char wuffs_handsum__error__truncated_input[] = "#handsum: truncated input";
50308
const char wuffs_handsum__error__unsupported_handsum_file[] = "#handsum: unsupported Handsum file";
50309
50310
// ---------------- Private Consts
50311
50312
static const uint8_t
50313
WUFFS_HANDSUM__CLAMP_7[32] WUFFS_BASE__POTENTIALLY_UNUSED = {
50314
  0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u,
50315
  7u, 7u, 7u, 7u, 7u, 7u, 7u, 7u,
50316
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50317
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50318
};
50319
50320
static const uint8_t
50321
WUFFS_HANDSUM__CLAMP_15[64] WUFFS_BASE__POTENTIALLY_UNUSED = {
50322
  0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u,
50323
  8u, 9u, 10u, 11u, 12u, 13u, 14u, 15u,
50324
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
50325
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
50326
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50327
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50328
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50329
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50330
};
50331
50332
static const uint8_t
50333
WUFFS_HANDSUM__ZIGZAG[15] WUFFS_BASE__POTENTIALLY_UNUSED = {
50334
  0u, 1u, 8u, 16u, 9u, 2u, 3u, 10u,
50335
  17u, 24u, 32u, 25u, 18u, 11u, 4u,
50336
};
50337
50338
static const uint8_t
50339
WUFFS_HANDSUM__SMOOTHING_PAIRS[56] WUFFS_BASE__POTENTIALLY_UNUSED = {
50340
  7u, 8u, 23u, 24u, 39u, 40u, 55u, 56u,
50341
  71u, 72u, 87u, 88u, 103u, 104u, 112u, 128u,
50342
  113u, 129u, 114u, 130u, 115u, 131u, 116u, 132u,
50343
  117u, 133u, 118u, 134u, 121u, 137u, 122u, 138u,
50344
  123u, 139u, 124u, 140u, 125u, 141u, 126u, 142u,
50345
  127u, 143u, 151u, 152u, 167u, 168u, 183u, 184u,
50346
  199u, 200u, 215u, 216u, 231u, 232u, 247u, 248u,
50347
};
50348
50349
#define WUFFS_HANDSUM__FIXED_POINT_HALF 32768u
50350
50351
#define WUFFS_HANDSUM__FIXED_POINT_INV_2_SQRT_2 23170u
50352
50353
static const uint32_t
50354
WUFFS_HANDSUM__COSINES[32] WUFFS_BASE__POTENTIALLY_UNUSED = {
50355
  65536u, 64276u, 60547u, 54491u, 46340u, 36409u, 25079u, 12785u,
50356
  0u, 4294954511u, 4294942217u, 4294930887u, 4294920956u, 4294912805u, 4294906749u, 4294903020u,
50357
  4294901760u, 4294903020u, 4294906749u, 4294912805u, 4294920956u, 4294930887u, 4294942217u, 4294954511u,
50358
  0u, 12785u, 25079u, 36409u, 46340u, 54491u, 60547u, 64276u,
50359
};
50360
50361
static const uint8_t
50362
WUFFS_HANDSUM__BIAS_AND_CLAMP[1024] WUFFS_BASE__POTENTIALLY_UNUSED = {
50363
  128u, 129u, 130u, 131u, 132u, 133u, 134u, 135u,
50364
  136u, 137u, 138u, 139u, 140u, 141u, 142u, 143u,
50365
  144u, 145u, 146u, 147u, 148u, 149u, 150u, 151u,
50366
  152u, 153u, 154u, 155u, 156u, 157u, 158u, 159u,
50367
  160u, 161u, 162u, 163u, 164u, 165u, 166u, 167u,
50368
  168u, 169u, 170u, 171u, 172u, 173u, 174u, 175u,
50369
  176u, 177u, 178u, 179u, 180u, 181u, 182u, 183u,
50370
  184u, 185u, 186u, 187u, 188u, 189u, 190u, 191u,
50371
  192u, 193u, 194u, 195u, 196u, 197u, 198u, 199u,
50372
  200u, 201u, 202u, 203u, 204u, 205u, 206u, 207u,
50373
  208u, 209u, 210u, 211u, 212u, 213u, 214u, 215u,
50374
  216u, 217u, 218u, 219u, 220u, 221u, 222u, 223u,
50375
  224u, 225u, 226u, 227u, 228u, 229u, 230u, 231u,
50376
  232u, 233u, 234u, 235u, 236u, 237u, 238u, 239u,
50377
  240u, 241u, 242u, 243u, 244u, 245u, 246u, 247u,
50378
  248u, 249u, 250u, 251u, 252u, 253u, 254u, 255u,
50379
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
50380
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
50381
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
50382
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
50383
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
50384
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
50385
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
50386
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
50387
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
50388
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
50389
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
50390
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
50391
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
50392
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
50393
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
50394
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
50395
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
50396
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
50397
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
50398
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
50399
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
50400
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
50401
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
50402
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
50403
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
50404
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
50405
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
50406
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
50407
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
50408
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
50409
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
50410
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
50411
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
50412
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
50413
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
50414
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
50415
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
50416
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
50417
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
50418
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
50419
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
50420
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
50421
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
50422
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
50423
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
50424
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
50425
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
50426
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
50427
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50428
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50429
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50430
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50431
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50432
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50433
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50434
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50435
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50436
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50437
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50438
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50439
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50440
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50441
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50442
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50443
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50444
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50445
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50446
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50447
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50448
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50449
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50450
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50451
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50452
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50453
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50454
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50455
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50456
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50457
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50458
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50459
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50460
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50461
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50462
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50463
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50464
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50465
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50466
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50467
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50468
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50469
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50470
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50471
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50472
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50473
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50474
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
50475
  0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u,
50476
  8u, 9u, 10u, 11u, 12u, 13u, 14u, 15u,
50477
  16u, 17u, 18u, 19u, 20u, 21u, 22u, 23u,
50478
  24u, 25u, 26u, 27u, 28u, 29u, 30u, 31u,
50479
  32u, 33u, 34u, 35u, 36u, 37u, 38u, 39u,
50480
  40u, 41u, 42u, 43u, 44u, 45u, 46u, 47u,
50481
  48u, 49u, 50u, 51u, 52u, 53u, 54u, 55u,
50482
  56u, 57u, 58u, 59u, 60u, 61u, 62u, 63u,
50483
  64u, 65u, 66u, 67u, 68u, 69u, 70u, 71u,
50484
  72u, 73u, 74u, 75u, 76u, 77u, 78u, 79u,
50485
  80u, 81u, 82u, 83u, 84u, 85u, 86u, 87u,
50486
  88u, 89u, 90u, 91u, 92u, 93u, 94u, 95u,
50487
  96u, 97u, 98u, 99u, 100u, 101u, 102u, 103u,
50488
  104u, 105u, 106u, 107u, 108u, 109u, 110u, 111u,
50489
  112u, 113u, 114u, 115u, 116u, 117u, 118u, 119u,
50490
  120u, 121u, 122u, 123u, 124u, 125u, 126u, 127u,
50491
};
50492
50493
// ---------------- Private Initializer Prototypes
50494
50495
// ---------------- Private Function Prototypes
50496
50497
WUFFS_BASE__GENERATED_C_CODE
50498
static wuffs_base__status
50499
wuffs_handsum__decoder__do_decode_image_config(
50500
    wuffs_handsum__decoder* self,
50501
    wuffs_base__image_config* a_dst,
50502
    wuffs_base__io_buffer* a_src);
50503
50504
WUFFS_BASE__GENERATED_C_CODE
50505
static wuffs_base__status
50506
wuffs_handsum__decoder__do_decode_frame_config(
50507
    wuffs_handsum__decoder* self,
50508
    wuffs_base__frame_config* a_dst,
50509
    wuffs_base__io_buffer* a_src);
50510
50511
WUFFS_BASE__GENERATED_C_CODE
50512
static wuffs_base__status
50513
wuffs_handsum__decoder__do_decode_frame(
50514
    wuffs_handsum__decoder* self,
50515
    wuffs_base__pixel_buffer* a_dst,
50516
    wuffs_base__io_buffer* a_src,
50517
    wuffs_base__pixel_blend a_blend,
50518
    wuffs_base__slice_u8 a_workbuf,
50519
    wuffs_base__decode_frame_options* a_opts);
50520
50521
WUFFS_BASE__GENERATED_C_CODE
50522
static wuffs_base__empty_struct
50523
wuffs_handsum__decoder__decode_block(
50524
    wuffs_handsum__decoder* self,
50525
    uint32_t a_which,
50526
    uint32_t a_y_offset,
50527
    uint32_t a_x_offset);
50528
50529
WUFFS_BASE__GENERATED_C_CODE
50530
static wuffs_base__empty_struct
50531
wuffs_handsum__decoder__decode_coeffs(
50532
    wuffs_handsum__decoder* self);
50533
50534
WUFFS_BASE__GENERATED_C_CODE
50535
static wuffs_base__empty_struct
50536
wuffs_handsum__decoder__smooth_luma_block_seams(
50537
    wuffs_handsum__decoder* self);
50538
50539
WUFFS_BASE__GENERATED_C_CODE
50540
static wuffs_base__empty_struct
50541
wuffs_handsum__decoder__upsample_chroma(
50542
    wuffs_handsum__decoder* self);
50543
50544
WUFFS_BASE__GENERATED_C_CODE
50545
static wuffs_base__empty_struct
50546
wuffs_handsum__decoder__upsample_bgr(
50547
    wuffs_handsum__decoder* self);
50548
50549
WUFFS_BASE__GENERATED_C_CODE
50550
static wuffs_base__empty_struct
50551
wuffs_handsum__decoder__convert_ycc_to_bgr(
50552
    wuffs_handsum__decoder* self);
50553
50554
WUFFS_BASE__GENERATED_C_CODE
50555
static wuffs_base__empty_struct
50556
wuffs_handsum__decoder__scale_1d_horizontal(
50557
    wuffs_handsum__decoder* self);
50558
50559
WUFFS_BASE__GENERATED_C_CODE
50560
static wuffs_base__empty_struct
50561
wuffs_handsum__decoder__scale_1d_vertical(
50562
    wuffs_handsum__decoder* self);
50563
50564
WUFFS_BASE__GENERATED_C_CODE
50565
static wuffs_base__status
50566
wuffs_handsum__decoder__from_pixels_to_dst(
50567
    wuffs_handsum__decoder* self,
50568
    wuffs_base__pixel_buffer* a_dst,
50569
    uint32_t a_which);
50570
50571
// ---------------- VTables
50572
50573
const wuffs_base__image_decoder__func_ptrs
50574
wuffs_handsum__decoder__func_ptrs_for__wuffs_base__image_decoder = {
50575
  (wuffs_base__status(*)(void*,
50576
      wuffs_base__pixel_buffer*,
50577
      wuffs_base__io_buffer*,
50578
      wuffs_base__pixel_blend,
50579
      wuffs_base__slice_u8,
50580
      wuffs_base__decode_frame_options*))(&wuffs_handsum__decoder__decode_frame),
50581
  (wuffs_base__status(*)(void*,
50582
      wuffs_base__frame_config*,
50583
      wuffs_base__io_buffer*))(&wuffs_handsum__decoder__decode_frame_config),
50584
  (wuffs_base__status(*)(void*,
50585
      wuffs_base__image_config*,
50586
      wuffs_base__io_buffer*))(&wuffs_handsum__decoder__decode_image_config),
50587
  (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_handsum__decoder__frame_dirty_rect),
50588
  (uint64_t(*)(const void*,
50589
      uint32_t))(&wuffs_handsum__decoder__get_quirk),
50590
  (uint32_t(*)(const void*))(&wuffs_handsum__decoder__num_animation_loops),
50591
  (uint64_t(*)(const void*))(&wuffs_handsum__decoder__num_decoded_frame_configs),
50592
  (uint64_t(*)(const void*))(&wuffs_handsum__decoder__num_decoded_frames),
50593
  (wuffs_base__status(*)(void*,
50594
      uint64_t,
50595
      uint64_t))(&wuffs_handsum__decoder__restart_frame),
50596
  (wuffs_base__status(*)(void*,
50597
      uint32_t,
50598
      uint64_t))(&wuffs_handsum__decoder__set_quirk),
50599
  (wuffs_base__empty_struct(*)(void*,
50600
      uint32_t,
50601
      bool))(&wuffs_handsum__decoder__set_report_metadata),
50602
  (wuffs_base__status(*)(void*,
50603
      wuffs_base__io_buffer*,
50604
      wuffs_base__more_information*,
50605
      wuffs_base__io_buffer*))(&wuffs_handsum__decoder__tell_me_more),
50606
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_handsum__decoder__workbuf_len),
50607
};
50608
50609
// ---------------- Initializer Implementations
50610
50611
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
50612
wuffs_handsum__decoder__initialize(
50613
    wuffs_handsum__decoder* self,
50614
    size_t sizeof_star_self,
50615
    uint64_t wuffs_version,
50616
    uint32_t options){
50617
  if (!self) {
50618
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
50619
  }
50620
  if (sizeof(*self) != sizeof_star_self) {
50621
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
50622
  }
50623
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
50624
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
50625
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
50626
  }
50627
50628
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
50629
    // The whole point of this if-check is to detect an uninitialized *self.
50630
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
50631
#if !defined(__clang__) && defined(__GNUC__)
50632
#pragma GCC diagnostic push
50633
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
50634
#endif
50635
    if (self->private_impl.magic != 0) {
50636
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
50637
    }
50638
#if !defined(__clang__) && defined(__GNUC__)
50639
#pragma GCC diagnostic pop
50640
#endif
50641
  } else {
50642
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
50643
      memset(self, 0, sizeof(*self));
50644
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
50645
    } else {
50646
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
50647
    }
50648
  }
50649
50650
  self->private_impl.magic = WUFFS_BASE__MAGIC;
50651
  self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name =
50652
      wuffs_base__image_decoder__vtable_name;
50653
  self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers =
50654
      (const void*)(&wuffs_handsum__decoder__func_ptrs_for__wuffs_base__image_decoder);
50655
  return wuffs_base__make_status(NULL);
50656
}
50657
50658
wuffs_handsum__decoder*
50659
wuffs_handsum__decoder__alloc(void) {
50660
  wuffs_handsum__decoder* x =
50661
      (wuffs_handsum__decoder*)(calloc(1, sizeof(wuffs_handsum__decoder)));
50662
  if (!x) {
50663
    return NULL;
50664
  }
50665
  if (wuffs_handsum__decoder__initialize(
50666
      x, sizeof(wuffs_handsum__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
50667
    free(x);
50668
    return NULL;
50669
  }
50670
  return x;
50671
}
50672
50673
size_t
50674
sizeof__wuffs_handsum__decoder(void) {
50675
  return sizeof(wuffs_handsum__decoder);
50676
}
50677
50678
// ---------------- Function Implementations
50679
50680
// -------- func handsum.decoder.get_quirk
50681
50682
WUFFS_BASE__GENERATED_C_CODE
50683
WUFFS_BASE__MAYBE_STATIC uint64_t
50684
wuffs_handsum__decoder__get_quirk(
50685
    const wuffs_handsum__decoder* self,
50686
    uint32_t a_key) {
50687
  if (!self) {
50688
    return 0;
50689
  }
50690
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
50691
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
50692
    return 0;
50693
  }
50694
50695
  return 0u;
50696
}
50697
50698
// -------- func handsum.decoder.set_quirk
50699
50700
WUFFS_BASE__GENERATED_C_CODE
50701
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
50702
wuffs_handsum__decoder__set_quirk(
50703
    wuffs_handsum__decoder* self,
50704
    uint32_t a_key,
50705
    uint64_t a_value) {
50706
  if (!self) {
50707
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
50708
  }
50709
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
50710
    return wuffs_base__make_status(
50711
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
50712
        ? wuffs_base__error__disabled_by_previous_error
50713
        : wuffs_base__error__initialize_not_called);
50714
  }
50715
50716
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
50717
}
50718
50719
// -------- func handsum.decoder.decode_image_config
50720
50721
WUFFS_BASE__GENERATED_C_CODE
50722
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
50723
wuffs_handsum__decoder__decode_image_config(
50724
    wuffs_handsum__decoder* self,
50725
    wuffs_base__image_config* a_dst,
50726
    wuffs_base__io_buffer* a_src) {
50727
  if (!self) {
50728
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
50729
  }
50730
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
50731
    return wuffs_base__make_status(
50732
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
50733
        ? wuffs_base__error__disabled_by_previous_error
50734
        : wuffs_base__error__initialize_not_called);
50735
  }
50736
  if (!a_src) {
50737
    self->private_impl.magic = WUFFS_BASE__DISABLED;
50738
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
50739
  }
50740
  if ((self->private_impl.active_coroutine != 0) &&
50741
      (self->private_impl.active_coroutine != 1)) {
50742
    self->private_impl.magic = WUFFS_BASE__DISABLED;
50743
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
50744
  }
50745
  self->private_impl.active_coroutine = 0;
50746
  wuffs_base__status status = wuffs_base__make_status(NULL);
50747
50748
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
50749
50750
  uint32_t coro_susp_point = self->private_impl.p_decode_image_config;
50751
  switch (coro_susp_point) {
50752
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
50753
50754
    while (true) {
50755
      {
50756
        wuffs_base__status t_0 = wuffs_handsum__decoder__do_decode_image_config(self, a_dst, a_src);
50757
        v_status = t_0;
50758
      }
50759
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
50760
        status = wuffs_base__make_status(wuffs_handsum__error__truncated_input);
50761
        goto exit;
50762
      }
50763
      status = v_status;
50764
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
50765
    }
50766
50767
    ok:
50768
    self->private_impl.p_decode_image_config = 0;
50769
    goto exit;
50770
  }
50771
50772
  goto suspend;
50773
  suspend:
50774
  self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
50775
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
50776
50777
  goto exit;
50778
  exit:
50779
  if (wuffs_base__status__is_error(&status)) {
50780
    self->private_impl.magic = WUFFS_BASE__DISABLED;
50781
  }
50782
  return status;
50783
}
50784
50785
// -------- func handsum.decoder.do_decode_image_config
50786
50787
WUFFS_BASE__GENERATED_C_CODE
50788
static wuffs_base__status
50789
wuffs_handsum__decoder__do_decode_image_config(
50790
    wuffs_handsum__decoder* self,
50791
    wuffs_base__image_config* a_dst,
50792
    wuffs_base__io_buffer* a_src) {
50793
  wuffs_base__status status = wuffs_base__make_status(NULL);
50794
50795
  uint32_t v_c32 = 0;
50796
50797
  const uint8_t* iop_a_src = NULL;
50798
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
50799
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
50800
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
50801
  if (a_src && a_src->data.ptr) {
50802
    io0_a_src = a_src->data.ptr;
50803
    io1_a_src = io0_a_src + a_src->meta.ri;
50804
    iop_a_src = io1_a_src;
50805
    io2_a_src = io0_a_src + a_src->meta.wi;
50806
  }
50807
50808
  uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config;
50809
  switch (coro_susp_point) {
50810
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
50811
50812
    if (self->private_impl.f_call_sequence != 0u) {
50813
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
50814
      goto exit;
50815
    }
50816
    {
50817
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
50818
      uint32_t t_0;
50819
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
50820
        t_0 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
50821
        iop_a_src += 2;
50822
      } else {
50823
        self->private_data.s_do_decode_image_config.scratch = 0;
50824
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
50825
        while (true) {
50826
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
50827
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
50828
            goto suspend;
50829
          }
50830
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
50831
          uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
50832
          *scratch <<= 8;
50833
          *scratch >>= 8;
50834
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
50835
          if (num_bits_0 == 8) {
50836
            t_0 = ((uint32_t)(*scratch));
50837
            break;
50838
          }
50839
          num_bits_0 += 8u;
50840
          *scratch |= ((uint64_t)(num_bits_0)) << 56;
50841
        }
50842
      }
50843
      v_c32 = t_0;
50844
    }
50845
    if (v_c32 != 55294u) {
50846
      status = wuffs_base__make_status(wuffs_handsum__error__bad_header);
50847
      goto exit;
50848
    }
50849
    {
50850
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
50851
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
50852
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
50853
        goto suspend;
50854
      }
50855
      uint32_t t_1 = *iop_a_src++;
50856
      v_c32 = t_1;
50857
    }
50858
    if ((v_c32 & 192u) != 0u) {
50859
      status = wuffs_base__make_status(wuffs_handsum__error__unsupported_handsum_file);
50860
      goto exit;
50861
    }
50862
    if ((v_c32 & 32u) == 0u) {
50863
      self->private_impl.f_width = 32u;
50864
      self->private_impl.f_height = ((v_c32 & 31u) + 1u);
50865
    } else {
50866
      self->private_impl.f_width = ((v_c32 & 31u) + 1u);
50867
      self->private_impl.f_height = 32u;
50868
    }
50869
    if (a_dst != NULL) {
50870
      wuffs_base__image_config__set(
50871
          a_dst,
50872
          2415954056u,
50873
          0u,
50874
          self->private_impl.f_width,
50875
          self->private_impl.f_height,
50876
          3u,
50877
          true);
50878
    }
50879
    self->private_impl.f_call_sequence = 32u;
50880
50881
    goto ok;
50882
    ok:
50883
    self->private_impl.p_do_decode_image_config = 0;
50884
    goto exit;
50885
  }
50886
50887
  goto suspend;
50888
  suspend:
50889
  self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
50890
50891
  goto exit;
50892
  exit:
50893
  if (a_src && a_src->data.ptr) {
50894
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
50895
  }
50896
50897
  return status;
50898
}
50899
50900
// -------- func handsum.decoder.decode_frame_config
50901
50902
WUFFS_BASE__GENERATED_C_CODE
50903
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
50904
wuffs_handsum__decoder__decode_frame_config(
50905
    wuffs_handsum__decoder* self,
50906
    wuffs_base__frame_config* a_dst,
50907
    wuffs_base__io_buffer* a_src) {
50908
  if (!self) {
50909
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
50910
  }
50911
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
50912
    return wuffs_base__make_status(
50913
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
50914
        ? wuffs_base__error__disabled_by_previous_error
50915
        : wuffs_base__error__initialize_not_called);
50916
  }
50917
  if (!a_src) {
50918
    self->private_impl.magic = WUFFS_BASE__DISABLED;
50919
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
50920
  }
50921
  if ((self->private_impl.active_coroutine != 0) &&
50922
      (self->private_impl.active_coroutine != 2)) {
50923
    self->private_impl.magic = WUFFS_BASE__DISABLED;
50924
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
50925
  }
50926
  self->private_impl.active_coroutine = 0;
50927
  wuffs_base__status status = wuffs_base__make_status(NULL);
50928
50929
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
50930
50931
  uint32_t coro_susp_point = self->private_impl.p_decode_frame_config;
50932
  switch (coro_susp_point) {
50933
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
50934
50935
    while (true) {
50936
      {
50937
        wuffs_base__status t_0 = wuffs_handsum__decoder__do_decode_frame_config(self, a_dst, a_src);
50938
        v_status = t_0;
50939
      }
50940
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
50941
        status = wuffs_base__make_status(wuffs_handsum__error__truncated_input);
50942
        goto exit;
50943
      }
50944
      status = v_status;
50945
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
50946
    }
50947
50948
    ok:
50949
    self->private_impl.p_decode_frame_config = 0;
50950
    goto exit;
50951
  }
50952
50953
  goto suspend;
50954
  suspend:
50955
  self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
50956
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0;
50957
50958
  goto exit;
50959
  exit:
50960
  if (wuffs_base__status__is_error(&status)) {
50961
    self->private_impl.magic = WUFFS_BASE__DISABLED;
50962
  }
50963
  return status;
50964
}
50965
50966
// -------- func handsum.decoder.do_decode_frame_config
50967
50968
WUFFS_BASE__GENERATED_C_CODE
50969
static wuffs_base__status
50970
wuffs_handsum__decoder__do_decode_frame_config(
50971
    wuffs_handsum__decoder* self,
50972
    wuffs_base__frame_config* a_dst,
50973
    wuffs_base__io_buffer* a_src) {
50974
  wuffs_base__status status = wuffs_base__make_status(NULL);
50975
50976
  const uint8_t* iop_a_src = NULL;
50977
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
50978
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
50979
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
50980
  if (a_src && a_src->data.ptr) {
50981
    io0_a_src = a_src->data.ptr;
50982
    io1_a_src = io0_a_src + a_src->meta.ri;
50983
    iop_a_src = io1_a_src;
50984
    io2_a_src = io0_a_src + a_src->meta.wi;
50985
  }
50986
50987
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config;
50988
  switch (coro_susp_point) {
50989
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
50990
50991
    if (self->private_impl.f_call_sequence == 32u) {
50992
    } else if (self->private_impl.f_call_sequence < 32u) {
50993
      if (a_src) {
50994
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
50995
      }
50996
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
50997
      status = wuffs_handsum__decoder__do_decode_image_config(self, NULL, a_src);
50998
      if (a_src) {
50999
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
51000
      }
51001
      if (status.repr) {
51002
        goto suspend;
51003
      }
51004
    } else if (self->private_impl.f_call_sequence == 40u) {
51005
      if (3u != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) {
51006
        status = wuffs_base__make_status(wuffs_base__error__bad_restart);
51007
        goto exit;
51008
      }
51009
    } else if (self->private_impl.f_call_sequence == 64u) {
51010
      self->private_impl.f_call_sequence = 96u;
51011
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
51012
      goto ok;
51013
    } else {
51014
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
51015
      goto ok;
51016
    }
51017
    if (a_dst != NULL) {
51018
      wuffs_base__frame_config__set(
51019
          a_dst,
51020
          wuffs_base__utility__make_rect_ie_u32(
51021
          0u,
51022
          0u,
51023
          self->private_impl.f_width,
51024
          self->private_impl.f_height),
51025
          ((wuffs_base__flicks)(0u)),
51026
          0u,
51027
          3u,
51028
          0u,
51029
          true,
51030
          false,
51031
          4278190080u);
51032
    }
51033
    self->private_impl.f_call_sequence = 64u;
51034
51035
    ok:
51036
    self->private_impl.p_do_decode_frame_config = 0;
51037
    goto exit;
51038
  }
51039
51040
  goto suspend;
51041
  suspend:
51042
  self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
51043
51044
  goto exit;
51045
  exit:
51046
  if (a_src && a_src->data.ptr) {
51047
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
51048
  }
51049
51050
  return status;
51051
}
51052
51053
// -------- func handsum.decoder.decode_frame
51054
51055
WUFFS_BASE__GENERATED_C_CODE
51056
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
51057
wuffs_handsum__decoder__decode_frame(
51058
    wuffs_handsum__decoder* self,
51059
    wuffs_base__pixel_buffer* a_dst,
51060
    wuffs_base__io_buffer* a_src,
51061
    wuffs_base__pixel_blend a_blend,
51062
    wuffs_base__slice_u8 a_workbuf,
51063
    wuffs_base__decode_frame_options* a_opts) {
51064
  if (!self) {
51065
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
51066
  }
51067
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
51068
    return wuffs_base__make_status(
51069
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
51070
        ? wuffs_base__error__disabled_by_previous_error
51071
        : wuffs_base__error__initialize_not_called);
51072
  }
51073
  if (!a_dst || !a_src) {
51074
    self->private_impl.magic = WUFFS_BASE__DISABLED;
51075
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
51076
  }
51077
  if ((self->private_impl.active_coroutine != 0) &&
51078
      (self->private_impl.active_coroutine != 3)) {
51079
    self->private_impl.magic = WUFFS_BASE__DISABLED;
51080
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
51081
  }
51082
  self->private_impl.active_coroutine = 0;
51083
  wuffs_base__status status = wuffs_base__make_status(NULL);
51084
51085
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
51086
51087
  uint32_t coro_susp_point = self->private_impl.p_decode_frame;
51088
  switch (coro_susp_point) {
51089
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
51090
51091
    while (true) {
51092
      {
51093
        wuffs_base__status t_0 = wuffs_handsum__decoder__do_decode_frame(self,
51094
            a_dst,
51095
            a_src,
51096
            a_blend,
51097
            a_workbuf,
51098
            a_opts);
51099
        v_status = t_0;
51100
      }
51101
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
51102
        status = wuffs_base__make_status(wuffs_handsum__error__truncated_input);
51103
        goto exit;
51104
      }
51105
      status = v_status;
51106
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
51107
    }
51108
51109
    ok:
51110
    self->private_impl.p_decode_frame = 0;
51111
    goto exit;
51112
  }
51113
51114
  goto suspend;
51115
  suspend:
51116
  self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
51117
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0;
51118
51119
  goto exit;
51120
  exit:
51121
  if (wuffs_base__status__is_error(&status)) {
51122
    self->private_impl.magic = WUFFS_BASE__DISABLED;
51123
  }
51124
  return status;
51125
}
51126
51127
// -------- func handsum.decoder.do_decode_frame
51128
51129
WUFFS_BASE__GENERATED_C_CODE
51130
static wuffs_base__status
51131
wuffs_handsum__decoder__do_decode_frame(
51132
    wuffs_handsum__decoder* self,
51133
    wuffs_base__pixel_buffer* a_dst,
51134
    wuffs_base__io_buffer* a_src,
51135
    wuffs_base__pixel_blend a_blend,
51136
    wuffs_base__slice_u8 a_workbuf,
51137
    wuffs_base__decode_frame_options* a_opts) {
51138
  wuffs_base__status status = wuffs_base__make_status(NULL);
51139
51140
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
51141
  uint32_t v_num_read = 0;
51142
  uint32_t v_which = 0;
51143
51144
  const uint8_t* iop_a_src = NULL;
51145
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
51146
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
51147
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
51148
  if (a_src && a_src->data.ptr) {
51149
    io0_a_src = a_src->data.ptr;
51150
    io1_a_src = io0_a_src + a_src->meta.ri;
51151
    iop_a_src = io1_a_src;
51152
    io2_a_src = io0_a_src + a_src->meta.wi;
51153
  }
51154
51155
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame;
51156
  if (coro_susp_point) {
51157
    v_num_read = self->private_data.s_do_decode_frame.v_num_read;
51158
  }
51159
  switch (coro_susp_point) {
51160
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
51161
51162
    if (self->private_impl.f_call_sequence == 64u) {
51163
    } else if (self->private_impl.f_call_sequence < 64u) {
51164
      if (a_src) {
51165
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
51166
      }
51167
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
51168
      status = wuffs_handsum__decoder__do_decode_frame_config(self, NULL, a_src);
51169
      if (a_src) {
51170
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
51171
      }
51172
      if (status.repr) {
51173
        goto suspend;
51174
      }
51175
    } else {
51176
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
51177
      goto ok;
51178
    }
51179
    v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler,
51180
        wuffs_base__pixel_buffer__pixel_format(a_dst),
51181
        wuffs_base__pixel_buffer__palette(a_dst),
51182
        wuffs_base__utility__make_pixel_format(2415954056u),
51183
        wuffs_base__utility__empty_slice_u8(),
51184
        a_blend);
51185
    if ( ! wuffs_base__status__is_ok(&v_status)) {
51186
      status = v_status;
51187
      if (wuffs_base__status__is_error(&status)) {
51188
        goto exit;
51189
      } else if (wuffs_base__status__is_suspension(&status)) {
51190
        status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
51191
        goto exit;
51192
      }
51193
      goto ok;
51194
    }
51195
    while (v_num_read < 45u) {
51196
      v_num_read += wuffs_private_impl__io_reader__limited_copy_u32_to_slice(
51197
          &iop_a_src, io2_a_src,(45u - v_num_read), wuffs_base__make_slice_u8_ij(self->private_data.f_bits, v_num_read, 64));
51198
      if (v_num_read < 45u) {
51199
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
51200
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2);
51201
      }
51202
    }
51203
    self->private_impl.f_bit_offset = 0u;
51204
    wuffs_handsum__decoder__decode_block(self, 0u, 0u, 0u);
51205
    wuffs_handsum__decoder__decode_block(self, 0u, 0u, 32u);
51206
    wuffs_handsum__decoder__decode_block(self, 0u, 8u, 0u);
51207
    wuffs_handsum__decoder__decode_block(self, 0u, 8u, 32u);
51208
    wuffs_handsum__decoder__decode_block(self, 1u, 0u, 1u);
51209
    wuffs_handsum__decoder__decode_block(self, 1u, 0u, 2u);
51210
    wuffs_handsum__decoder__smooth_luma_block_seams(self);
51211
    wuffs_handsum__decoder__upsample_chroma(self);
51212
    wuffs_handsum__decoder__convert_ycc_to_bgr(self);
51213
    wuffs_handsum__decoder__upsample_bgr(self);
51214
    v_which = 1u;
51215
    if (self->private_impl.f_width < 32u) {
51216
      v_which = 0u;
51217
      wuffs_handsum__decoder__scale_1d_horizontal(self);
51218
    } else if (self->private_impl.f_height < 32u) {
51219
      v_which = 0u;
51220
      wuffs_handsum__decoder__scale_1d_vertical(self);
51221
    }
51222
    v_status = wuffs_handsum__decoder__from_pixels_to_dst(self, a_dst, v_which);
51223
    if ( ! wuffs_base__status__is_ok(&v_status)) {
51224
      status = v_status;
51225
      if (wuffs_base__status__is_error(&status)) {
51226
        goto exit;
51227
      } else if (wuffs_base__status__is_suspension(&status)) {
51228
        status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
51229
        goto exit;
51230
      }
51231
      goto ok;
51232
    }
51233
    self->private_impl.f_call_sequence = 96u;
51234
51235
    ok:
51236
    self->private_impl.p_do_decode_frame = 0;
51237
    goto exit;
51238
  }
51239
51240
  goto suspend;
51241
  suspend:
51242
  self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
51243
  self->private_data.s_do_decode_frame.v_num_read = v_num_read;
51244
51245
  goto exit;
51246
  exit:
51247
  if (a_src && a_src->data.ptr) {
51248
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
51249
  }
51250
51251
  return status;
51252
}
51253
51254
// -------- func handsum.decoder.decode_block
51255
51256
WUFFS_BASE__GENERATED_C_CODE
51257
static wuffs_base__empty_struct
51258
wuffs_handsum__decoder__decode_block(
51259
    wuffs_handsum__decoder* self,
51260
    uint32_t a_which,
51261
    uint32_t a_y_offset,
51262
    uint32_t a_x_offset) {
51263
  uint32_t v_y = 0;
51264
  uint32_t v_x = 0;
51265
  uint32_t v_v = 0;
51266
  uint32_t v_u = 0;
51267
  uint64_t v_alphas_sum_32 = 0;
51268
  uint64_t v_half_alpha_v_16 = 0;
51269
  uint64_t v_half_alpha_u_16 = 0;
51270
  uint64_t v_alphas_16 = 0;
51271
  uint64_t v_c_32 = 0;
51272
  uint64_t v_c_16 = 0;
51273
  uint64_t v_result_0 = 0;
51274
51275
  wuffs_handsum__decoder__decode_coeffs(self);
51276
  v_y = 0u;
51277
  while (v_y < 8u) {
51278
    v_x = 0u;
51279
    while (v_x < 8u) {
51280
      v_alphas_sum_32 = 0u;
51281
      v_v = 0u;
51282
      while (v_v < 5u) {
51283
        v_half_alpha_v_16 = ((uint64_t)(23170u));
51284
        if (v_v != 0u) {
51285
          v_half_alpha_v_16 = ((uint64_t)(32768u));
51286
        }
51287
        v_u = 0u;
51288
        while (v_u < 5u) {
51289
          v_half_alpha_u_16 = ((uint64_t)(23170u));
51290
          if (v_u != 0u) {
51291
            v_half_alpha_u_16 = ((uint64_t)(32768u));
51292
          }
51293
          v_alphas_16 = wuffs_base__utility__sign_extend_rshift_u64(((uint64_t)(((uint64_t)(v_half_alpha_v_16 * v_half_alpha_u_16)) + 32768u)), 16u);
51294
          v_c_32 = ((uint64_t)(wuffs_base__utility__sign_extend_convert_u32_u64(WUFFS_HANDSUM__COSINES[((((2u * v_x) + 1u) * v_u) & 31u)]) * wuffs_base__utility__sign_extend_convert_u32_u64(WUFFS_HANDSUM__COSINES[((((2u * v_y) + 1u) * v_v) & 31u)])));
51295
          v_c_16 = wuffs_base__utility__sign_extend_rshift_u64(((uint64_t)(v_c_32 + 32768u)), 16u);
51296
          v_alphas_sum_32 += ((uint64_t)(((uint64_t)(v_alphas_16 * v_c_16)) * wuffs_base__utility__sign_extend_convert_u16_u64(self->private_impl.f_coeffs[((8u * v_v) + v_u)])));
51297
          v_u += 1u;
51298
        }
51299
        v_v += 1u;
51300
      }
51301
      v_result_0 = wuffs_base__utility__sign_extend_rshift_u64(((uint64_t)(v_alphas_sum_32 + 2147483648u)), 32u);
51302
      self->private_data.f_buffers[a_which][(a_y_offset + v_y)][(a_x_offset + (4u * v_x))] = WUFFS_HANDSUM__BIAS_AND_CLAMP[(v_result_0 & 1023u)];
51303
      v_x += 1u;
51304
    }
51305
    v_y += 1u;
51306
  }
51307
  return wuffs_base__make_empty_struct();
51308
}
51309
51310
// -------- func handsum.decoder.decode_coeffs
51311
51312
WUFFS_BASE__GENERATED_C_CODE
51313
static wuffs_base__empty_struct
51314
wuffs_handsum__decoder__decode_coeffs(
51315
    wuffs_handsum__decoder* self) {
51316
  uint32_t v_bo = 0;
51317
  uint8_t v_nibble = 0;
51318
  uint32_t v_i = 0;
51319
51320
  v_bo = ((uint32_t)(self->private_impl.f_bit_offset));
51321
  v_nibble = ((uint8_t)(((uint8_t)(self->private_data.f_bits[((v_bo >> 3u) & 63u)] >> (v_bo & 4u))) & 15u));
51322
  self->private_impl.f_coeffs[0u] = ((uint16_t)(((uint16_t)(((uint16_t)(v_nibble)) - 8u)) * 128u));
51323
  v_bo += 4u;
51324
  v_i = 1u;
51325
  while (v_i < 15u) {
51326
    v_nibble = ((uint8_t)(((uint8_t)(self->private_data.f_bits[((v_bo >> 3u) & 63u)] >> (v_bo & 4u))) & 15u));
51327
    self->private_impl.f_coeffs[WUFFS_HANDSUM__ZIGZAG[v_i]] = ((uint16_t)(((uint16_t)(((uint16_t)(v_nibble)) - 8u)) * 16u));
51328
    v_bo += 4u;
51329
    v_i += 1u;
51330
  }
51331
  self->private_impl.f_bit_offset = ((uint16_t)(v_bo));
51332
  return wuffs_base__make_empty_struct();
51333
}
51334
51335
// -------- func handsum.decoder.smooth_luma_block_seams
51336
51337
WUFFS_BASE__GENERATED_C_CODE
51338
static wuffs_base__empty_struct
51339
wuffs_handsum__decoder__smooth_luma_block_seams(
51340
    wuffs_handsum__decoder* self) {
51341
  uint32_t v_i = 0;
51342
  uint8_t v_p0 = 0;
51343
  uint8_t v_p1 = 0;
51344
  uint32_t v_y0 = 0;
51345
  uint32_t v_y1 = 0;
51346
  uint32_t v_x0 = 0;
51347
  uint32_t v_x1 = 0;
51348
  uint32_t v_v0 = 0;
51349
  uint32_t v_v1 = 0;
51350
  uint32_t v_w0 = 0;
51351
  uint32_t v_w1 = 0;
51352
  uint32_t v_v77 = 0;
51353
  uint32_t v_v78 = 0;
51354
  uint32_t v_v88 = 0;
51355
  uint32_t v_v87 = 0;
51356
  uint32_t v_w77 = 0;
51357
  uint32_t v_w78 = 0;
51358
  uint32_t v_w88 = 0;
51359
  uint32_t v_w87 = 0;
51360
51361
  v_i = 0u;
51362
  while (v_i <= 54u) {
51363
    v_p0 = WUFFS_HANDSUM__SMOOTHING_PAIRS[(v_i + 0u)];
51364
    v_p1 = WUFFS_HANDSUM__SMOOTHING_PAIRS[(v_i + 1u)];
51365
    v_y0 = ((uint32_t)(((uint8_t)(v_p0 >> 4u))));
51366
    v_y1 = ((uint32_t)(((uint8_t)(v_p1 >> 4u))));
51367
    v_x0 = ((uint32_t)(((uint8_t)(v_p0 & 15u))));
51368
    v_x1 = ((uint32_t)(((uint8_t)(v_p1 & 15u))));
51369
    v_v0 = ((uint32_t)(self->private_data.f_buffers[0u][v_y0][(v_x0 * 4u)]));
51370
    v_v1 = ((uint32_t)(self->private_data.f_buffers[0u][v_y1][(v_x1 * 4u)]));
51371
    v_w0 = (((3u * v_v0) + v_v1 + 2u) / 4u);
51372
    v_w1 = (((3u * v_v1) + v_v0 + 2u) / 4u);
51373
    self->private_data.f_buffers[0u][v_y0][(v_x0 * 4u)] = ((uint8_t)(v_w0));
51374
    self->private_data.f_buffers[0u][v_y1][(v_x1 * 4u)] = ((uint8_t)(v_w1));
51375
    v_i += 2u;
51376
  }
51377
  v_v77 = ((uint32_t)(self->private_data.f_buffers[0u][7u][28u]));
51378
  v_v78 = ((uint32_t)(self->private_data.f_buffers[0u][7u][32u]));
51379
  v_v88 = ((uint32_t)(self->private_data.f_buffers[0u][8u][32u]));
51380
  v_v87 = ((uint32_t)(self->private_data.f_buffers[0u][8u][28u]));
51381
  v_w77 = (((9u * v_v77) +
51382
      (3u * v_v78) +
51383
      v_v88 +
51384
      (3u * v_v87) +
51385
      8u) / 16u);
51386
  v_w78 = (((9u * v_v78) +
51387
      (3u * v_v88) +
51388
      v_v87 +
51389
      (3u * v_v77) +
51390
      8u) / 16u);
51391
  v_w88 = (((9u * v_v88) +
51392
      (3u * v_v87) +
51393
      v_v77 +
51394
      (3u * v_v78) +
51395
      8u) / 16u);
51396
  v_w87 = (((9u * v_v87) +
51397
      (3u * v_v77) +
51398
      v_v78 +
51399
      (3u * v_v88) +
51400
      8u) / 16u);
51401
  self->private_data.f_buffers[0u][7u][28u] = ((uint8_t)(v_w77));
51402
  self->private_data.f_buffers[0u][7u][32u] = ((uint8_t)(v_w78));
51403
  self->private_data.f_buffers[0u][8u][32u] = ((uint8_t)(v_w88));
51404
  self->private_data.f_buffers[0u][8u][28u] = ((uint8_t)(v_w87));
51405
  return wuffs_base__make_empty_struct();
51406
}
51407
51408
// -------- func handsum.decoder.upsample_chroma
51409
51410
WUFFS_BASE__GENERATED_C_CODE
51411
static wuffs_base__empty_struct
51412
wuffs_handsum__decoder__upsample_chroma(
51413
    wuffs_handsum__decoder* self) {
51414
  uint32_t v_y = 0;
51415
  uint32_t v_dy = 0;
51416
  uint32_t v_y0 = 0;
51417
  uint32_t v_y1 = 0;
51418
  uint32_t v_x = 0;
51419
  uint32_t v_dx = 0;
51420
  uint32_t v_x0 = 0;
51421
  uint32_t v_x1 = 0;
51422
51423
  v_y = 0u;
51424
  while (v_y < 16u) {
51425
    v_dy = ((uint32_t)(((v_y & 1u) * 2u) - 1u));
51426
    v_y0 = (v_y >> 1u);
51427
    v_y1 = ((uint32_t)(WUFFS_HANDSUM__CLAMP_7[(((uint32_t)(v_y0 + v_dy)) & 31u)]));
51428
    v_x = 0u;
51429
    while (v_x < 16u) {
51430
      v_dx = ((uint32_t)(((v_x & 1u) * 2u) - 1u));
51431
      v_x0 = (v_x >> 1u);
51432
      v_x1 = ((uint32_t)(WUFFS_HANDSUM__CLAMP_7[(((uint32_t)(v_x0 + v_dx)) & 31u)]));
51433
      self->private_data.f_buffers[0u][v_y][((4u * v_x) + 1u)] = ((uint8_t)((((((uint32_t)(self->private_data.f_buffers[1u][v_y0][((4u * v_x0) + 1u)])) * 9u) +
51434
          (((uint32_t)(self->private_data.f_buffers[1u][v_y0][((4u * v_x1) + 1u)])) * 3u) +
51435
          (((uint32_t)(self->private_data.f_buffers[1u][v_y1][((4u * v_x0) + 1u)])) * 3u) +
51436
          ((uint32_t)(self->private_data.f_buffers[1u][v_y1][((4u * v_x1) + 1u)])) +
51437
          8u) / 16u)));
51438
      self->private_data.f_buffers[0u][v_y][((4u * v_x) + 2u)] = ((uint8_t)((((((uint32_t)(self->private_data.f_buffers[1u][v_y0][((4u * v_x0) + 2u)])) * 9u) +
51439
          (((uint32_t)(self->private_data.f_buffers[1u][v_y0][((4u * v_x1) + 2u)])) * 3u) +
51440
          (((uint32_t)(self->private_data.f_buffers[1u][v_y1][((4u * v_x0) + 2u)])) * 3u) +
51441
          ((uint32_t)(self->private_data.f_buffers[1u][v_y1][((4u * v_x1) + 2u)])) +
51442
          8u) / 16u)));
51443
      v_x += 1u;
51444
    }
51445
    v_y += 1u;
51446
  }
51447
  return wuffs_base__make_empty_struct();
51448
}
51449
51450
// -------- func handsum.decoder.upsample_bgr
51451
51452
WUFFS_BASE__GENERATED_C_CODE
51453
static wuffs_base__empty_struct
51454
wuffs_handsum__decoder__upsample_bgr(
51455
    wuffs_handsum__decoder* self) {
51456
  uint32_t v_y = 0;
51457
  uint32_t v_dy = 0;
51458
  uint32_t v_y0 = 0;
51459
  uint32_t v_y1 = 0;
51460
  uint32_t v_x = 0;
51461
  uint32_t v_dx = 0;
51462
  uint32_t v_x0 = 0;
51463
  uint32_t v_x1 = 0;
51464
51465
  v_y = 0u;
51466
  while (v_y < 32u) {
51467
    v_dy = ((uint32_t)(((v_y & 1u) * 2u) - 1u));
51468
    v_y0 = (v_y >> 1u);
51469
    v_y1 = ((uint32_t)(WUFFS_HANDSUM__CLAMP_15[(((uint32_t)(v_y0 + v_dy)) & 63u)]));
51470
    v_x = 0u;
51471
    while (v_x < 32u) {
51472
      v_dx = ((uint32_t)(((v_x & 1u) * 2u) - 1u));
51473
      v_x0 = (v_x >> 1u);
51474
      v_x1 = ((uint32_t)(WUFFS_HANDSUM__CLAMP_15[(((uint32_t)(v_x0 + v_dx)) & 63u)]));
51475
      self->private_data.f_buffers[1u][v_y][((4u * v_x) + 0u)] = ((uint8_t)((((((uint32_t)(self->private_data.f_buffers[0u][v_y0][((4u * v_x0) + 0u)])) * 9u) +
51476
          (((uint32_t)(self->private_data.f_buffers[0u][v_y0][((4u * v_x1) + 0u)])) * 3u) +
51477
          (((uint32_t)(self->private_data.f_buffers[0u][v_y1][((4u * v_x0) + 0u)])) * 3u) +
51478
          ((uint32_t)(self->private_data.f_buffers[0u][v_y1][((4u * v_x1) + 0u)])) +
51479
          8u) / 16u)));
51480
      self->private_data.f_buffers[1u][v_y][((4u * v_x) + 1u)] = ((uint8_t)((((((uint32_t)(self->private_data.f_buffers[0u][v_y0][((4u * v_x0) + 1u)])) * 9u) +
51481
          (((uint32_t)(self->private_data.f_buffers[0u][v_y0][((4u * v_x1) + 1u)])) * 3u) +
51482
          (((uint32_t)(self->private_data.f_buffers[0u][v_y1][((4u * v_x0) + 1u)])) * 3u) +
51483
          ((uint32_t)(self->private_data.f_buffers[0u][v_y1][((4u * v_x1) + 1u)])) +
51484
          8u) / 16u)));
51485
      self->private_data.f_buffers[1u][v_y][((4u * v_x) + 2u)] = ((uint8_t)((((((uint32_t)(self->private_data.f_buffers[0u][v_y0][((4u * v_x0) + 2u)])) * 9u) +
51486
          (((uint32_t)(self->private_data.f_buffers[0u][v_y0][((4u * v_x1) + 2u)])) * 3u) +
51487
          (((uint32_t)(self->private_data.f_buffers[0u][v_y1][((4u * v_x0) + 2u)])) * 3u) +
51488
          ((uint32_t)(self->private_data.f_buffers[0u][v_y1][((4u * v_x1) + 2u)])) +
51489
          8u) / 16u)));
51490
      self->private_data.f_buffers[1u][v_y][((4u * v_x) + 3u)] = 255u;
51491
      v_x += 1u;
51492
    }
51493
    v_y += 1u;
51494
  }
51495
  return wuffs_base__make_empty_struct();
51496
}
51497
51498
// -------- func handsum.decoder.convert_ycc_to_bgr
51499
51500
WUFFS_BASE__GENERATED_C_CODE
51501
static wuffs_base__empty_struct
51502
wuffs_handsum__decoder__convert_ycc_to_bgr(
51503
    wuffs_handsum__decoder* self) {
51504
  uint32_t v_y = 0;
51505
  uint32_t v_x = 0;
51506
  uint32_t v_yy1 = 0;
51507
  uint32_t v_cb1 = 0;
51508
  uint32_t v_cr1 = 0;
51509
  uint32_t v_r = 0;
51510
  uint32_t v_g = 0;
51511
  uint32_t v_b = 0;
51512
51513
  v_y = 0u;
51514
  while (v_y < 16u) {
51515
    v_x = 0u;
51516
    while (v_x < 16u) {
51517
      v_yy1 = (((uint32_t)(self->private_data.f_buffers[0u][v_y][((4u * v_x) + 0u)])) * 65793u);
51518
      v_cb1 = ((uint32_t)(((uint32_t)(self->private_data.f_buffers[0u][v_y][((4u * v_x) + 1u)])) - 128u));
51519
      v_cr1 = ((uint32_t)(((uint32_t)(self->private_data.f_buffers[0u][v_y][((4u * v_x) + 2u)])) - 128u));
51520
      v_r = ((uint32_t)(v_yy1 + ((uint32_t)(91881u * v_cr1))));
51521
      if ((v_r & 4278190080u) == 0u) {
51522
        v_r >>= 16u;
51523
      } else {
51524
        v_r = (4294967295u ^ wuffs_base__utility__sign_extend_rshift_u32(v_r, 31u));
51525
      }
51526
      v_g = ((uint32_t)(v_yy1 - ((uint32_t)(((uint32_t)(22554u * v_cb1)) + ((uint32_t)(46802u * v_cr1))))));
51527
      if ((v_g & 4278190080u) == 0u) {
51528
        v_g >>= 16u;
51529
      } else {
51530
        v_g = (4294967295u ^ wuffs_base__utility__sign_extend_rshift_u32(v_g, 31u));
51531
      }
51532
      v_b = ((uint32_t)(v_yy1 + ((uint32_t)(116130u * v_cb1))));
51533
      if ((v_b & 4278190080u) == 0u) {
51534
        v_b >>= 16u;
51535
      } else {
51536
        v_b = (4294967295u ^ wuffs_base__utility__sign_extend_rshift_u32(v_b, 31u));
51537
      }
51538
      self->private_data.f_buffers[0u][v_y][((4u * v_x) + 0u)] = ((uint8_t)(v_b));
51539
      self->private_data.f_buffers[0u][v_y][((4u * v_x) + 1u)] = ((uint8_t)(v_g));
51540
      self->private_data.f_buffers[0u][v_y][((4u * v_x) + 2u)] = ((uint8_t)(v_r));
51541
      v_x += 1u;
51542
    }
51543
    v_y += 1u;
51544
  }
51545
  return wuffs_base__make_empty_struct();
51546
}
51547
51548
// -------- func handsum.decoder.scale_1d_horizontal
51549
51550
WUFFS_BASE__GENERATED_C_CODE
51551
static wuffs_base__empty_struct
51552
wuffs_handsum__decoder__scale_1d_horizontal(
51553
    wuffs_handsum__decoder* self) {
51554
  uint32_t v_y = 0;
51555
  uint32_t v_dstx = 0;
51556
  uint32_t v_srcx = 0;
51557
  uint32_t v_acc0 = 0;
51558
  uint32_t v_acc1 = 0;
51559
  uint32_t v_acc2 = 0;
51560
  uint32_t v_s0 = 0;
51561
  uint32_t v_s1 = 0;
51562
  uint32_t v_s2 = 0;
51563
  uint32_t v_remainder = 0;
51564
  uint32_t v_partial = 0;
51565
51566
  v_y = 0u;
51567
  while (v_y < 32u) {
51568
    v_dstx = 0u;
51569
    v_srcx = 0u;
51570
    v_acc0 = 0u;
51571
    v_acc1 = 0u;
51572
    v_acc2 = 0u;
51573
    v_remainder = 32u;
51574
    while (v_srcx < 32u) {
51575
      v_s0 = ((uint32_t)(self->private_data.f_buffers[1u][v_y][((4u * v_srcx) + 0u)]));
51576
      v_s1 = ((uint32_t)(self->private_data.f_buffers[1u][v_y][((4u * v_srcx) + 1u)]));
51577
      v_s2 = ((uint32_t)(self->private_data.f_buffers[1u][v_y][((4u * v_srcx) + 2u)]));
51578
      if (v_remainder > self->private_impl.f_width) {
51579
        v_remainder -= self->private_impl.f_width;
51580
        v_acc0 += (self->private_impl.f_width * v_s0);
51581
        v_acc1 += (self->private_impl.f_width * v_s1);
51582
        v_acc2 += (self->private_impl.f_width * v_s2);
51583
      } else {
51584
        v_acc0 += (v_remainder * v_s0);
51585
        v_acc1 += (v_remainder * v_s1);
51586
        v_acc2 += (v_remainder * v_s2);
51587
        self->private_data.f_buffers[0u][v_y][((4u * v_dstx) + 0u)] = ((uint8_t)((((uint32_t)(v_acc0 + 16u)) / 32u)));
51588
        self->private_data.f_buffers[0u][v_y][((4u * v_dstx) + 1u)] = ((uint8_t)((((uint32_t)(v_acc1 + 16u)) / 32u)));
51589
        self->private_data.f_buffers[0u][v_y][((4u * v_dstx) + 2u)] = ((uint8_t)((((uint32_t)(v_acc2 + 16u)) / 32u)));
51590
        self->private_data.f_buffers[0u][v_y][((4u * v_dstx) + 3u)] = 255u;
51591
        v_dstx = ((v_dstx + 1u) & 31u);
51592
        v_partial = (self->private_impl.f_width - v_remainder);
51593
        v_acc0 = (v_partial * v_s0);
51594
        v_acc1 = (v_partial * v_s1);
51595
        v_acc2 = (v_partial * v_s2);
51596
        v_remainder = (32u - v_partial);
51597
      }
51598
      v_srcx += 1u;
51599
    }
51600
    v_y += 1u;
51601
  }
51602
  return wuffs_base__make_empty_struct();
51603
}
51604
51605
// -------- func handsum.decoder.scale_1d_vertical
51606
51607
WUFFS_BASE__GENERATED_C_CODE
51608
static wuffs_base__empty_struct
51609
wuffs_handsum__decoder__scale_1d_vertical(
51610
    wuffs_handsum__decoder* self) {
51611
  uint32_t v_x = 0;
51612
  uint32_t v_dsty = 0;
51613
  uint32_t v_srcy = 0;
51614
  uint32_t v_acc0 = 0;
51615
  uint32_t v_acc1 = 0;
51616
  uint32_t v_acc2 = 0;
51617
  uint32_t v_s0 = 0;
51618
  uint32_t v_s1 = 0;
51619
  uint32_t v_s2 = 0;
51620
  uint32_t v_remainder = 0;
51621
  uint32_t v_partial = 0;
51622
51623
  v_x = 0u;
51624
  while (v_x < 32u) {
51625
    v_dsty = 0u;
51626
    v_srcy = 0u;
51627
    v_acc0 = 0u;
51628
    v_acc1 = 0u;
51629
    v_acc2 = 0u;
51630
    v_remainder = 32u;
51631
    while (v_srcy < 32u) {
51632
      v_s0 = ((uint32_t)(self->private_data.f_buffers[1u][v_srcy][((4u * v_x) + 0u)]));
51633
      v_s1 = ((uint32_t)(self->private_data.f_buffers[1u][v_srcy][((4u * v_x) + 1u)]));
51634
      v_s2 = ((uint32_t)(self->private_data.f_buffers[1u][v_srcy][((4u * v_x) + 2u)]));
51635
      if (v_remainder > self->private_impl.f_height) {
51636
        v_remainder -= self->private_impl.f_height;
51637
        v_acc0 += (self->private_impl.f_height * v_s0);
51638
        v_acc1 += (self->private_impl.f_height * v_s1);
51639
        v_acc2 += (self->private_impl.f_height * v_s2);
51640
      } else {
51641
        v_acc0 += (v_remainder * v_s0);
51642
        v_acc1 += (v_remainder * v_s1);
51643
        v_acc2 += (v_remainder * v_s2);
51644
        self->private_data.f_buffers[0u][v_dsty][((4u * v_x) + 0u)] = ((uint8_t)((((uint32_t)(v_acc0 + 16u)) / 32u)));
51645
        self->private_data.f_buffers[0u][v_dsty][((4u * v_x) + 1u)] = ((uint8_t)((((uint32_t)(v_acc1 + 16u)) / 32u)));
51646
        self->private_data.f_buffers[0u][v_dsty][((4u * v_x) + 2u)] = ((uint8_t)((((uint32_t)(v_acc2 + 16u)) / 32u)));
51647
        self->private_data.f_buffers[0u][v_dsty][((4u * v_x) + 3u)] = 255u;
51648
        v_dsty = ((v_dsty + 1u) & 31u);
51649
        v_partial = (self->private_impl.f_height - v_remainder);
51650
        v_acc0 = (v_partial * v_s0);
51651
        v_acc1 = (v_partial * v_s1);
51652
        v_acc2 = (v_partial * v_s2);
51653
        v_remainder = (32u - v_partial);
51654
      }
51655
      v_srcy += 1u;
51656
    }
51657
    v_x += 1u;
51658
  }
51659
  return wuffs_base__make_empty_struct();
51660
}
51661
51662
// -------- func handsum.decoder.from_pixels_to_dst
51663
51664
WUFFS_BASE__GENERATED_C_CODE
51665
static wuffs_base__status
51666
wuffs_handsum__decoder__from_pixels_to_dst(
51667
    wuffs_handsum__decoder* self,
51668
    wuffs_base__pixel_buffer* a_dst,
51669
    uint32_t a_which) {
51670
  wuffs_base__pixel_format v_dst_pixfmt = {0};
51671
  uint32_t v_dst_bits_per_pixel = 0;
51672
  uint32_t v_dst_bytes_per_pixel = 0;
51673
  uint64_t v_dst_bytes_per_row = 0;
51674
  wuffs_base__table_u8 v_tab = {0};
51675
  uint32_t v_y = 0;
51676
  wuffs_base__slice_u8 v_dst = {0};
51677
  wuffs_base__slice_u8 v_src = {0};
51678
51679
  v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
51680
  v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
51681
  if ((v_dst_bits_per_pixel & 7u) != 0u) {
51682
    return wuffs_base__make_status(wuffs_base__error__unsupported_option);
51683
  }
51684
  v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u);
51685
  v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel)));
51686
  v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
51687
  while (v_y < self->private_impl.f_height) {
51688
    v_src = wuffs_base__make_slice_u8(self->private_data.f_buffers[a_which][v_y], (self->private_impl.f_width * 4u));
51689
    v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_y);
51690
    if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) {
51691
      v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row);
51692
    }
51693
    wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, wuffs_base__pixel_buffer__palette(a_dst), v_src);
51694
    v_y += 1u;
51695
  }
51696
  return wuffs_base__make_status(NULL);
51697
}
51698
51699
// -------- func handsum.decoder.frame_dirty_rect
51700
51701
WUFFS_BASE__GENERATED_C_CODE
51702
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
51703
wuffs_handsum__decoder__frame_dirty_rect(
51704
    const wuffs_handsum__decoder* self) {
51705
  if (!self) {
51706
    return wuffs_base__utility__empty_rect_ie_u32();
51707
  }
51708
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
51709
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
51710
    return wuffs_base__utility__empty_rect_ie_u32();
51711
  }
51712
51713
  return wuffs_base__utility__make_rect_ie_u32(
51714
      0u,
51715
      0u,
51716
      self->private_impl.f_width,
51717
      self->private_impl.f_height);
51718
}
51719
51720
// -------- func handsum.decoder.num_animation_loops
51721
51722
WUFFS_BASE__GENERATED_C_CODE
51723
WUFFS_BASE__MAYBE_STATIC uint32_t
51724
wuffs_handsum__decoder__num_animation_loops(
51725
    const wuffs_handsum__decoder* self) {
51726
  if (!self) {
51727
    return 0;
51728
  }
51729
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
51730
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
51731
    return 0;
51732
  }
51733
51734
  return 0u;
51735
}
51736
51737
// -------- func handsum.decoder.num_decoded_frame_configs
51738
51739
WUFFS_BASE__GENERATED_C_CODE
51740
WUFFS_BASE__MAYBE_STATIC uint64_t
51741
wuffs_handsum__decoder__num_decoded_frame_configs(
51742
    const wuffs_handsum__decoder* self) {
51743
  if (!self) {
51744
    return 0;
51745
  }
51746
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
51747
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
51748
    return 0;
51749
  }
51750
51751
  if (self->private_impl.f_call_sequence > 32u) {
51752
    return 1u;
51753
  }
51754
  return 0u;
51755
}
51756
51757
// -------- func handsum.decoder.num_decoded_frames
51758
51759
WUFFS_BASE__GENERATED_C_CODE
51760
WUFFS_BASE__MAYBE_STATIC uint64_t
51761
wuffs_handsum__decoder__num_decoded_frames(
51762
    const wuffs_handsum__decoder* self) {
51763
  if (!self) {
51764
    return 0;
51765
  }
51766
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
51767
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
51768
    return 0;
51769
  }
51770
51771
  if (self->private_impl.f_call_sequence > 64u) {
51772
    return 1u;
51773
  }
51774
  return 0u;
51775
}
51776
51777
// -------- func handsum.decoder.restart_frame
51778
51779
WUFFS_BASE__GENERATED_C_CODE
51780
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
51781
wuffs_handsum__decoder__restart_frame(
51782
    wuffs_handsum__decoder* self,
51783
    uint64_t a_index,
51784
    uint64_t a_io_position) {
51785
  if (!self) {
51786
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
51787
  }
51788
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
51789
    return wuffs_base__make_status(
51790
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
51791
        ? wuffs_base__error__disabled_by_previous_error
51792
        : wuffs_base__error__initialize_not_called);
51793
  }
51794
51795
  if (self->private_impl.f_call_sequence < 32u) {
51796
    return wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
51797
  }
51798
  if ((a_index != 0u) || (a_io_position != 3u)) {
51799
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
51800
  }
51801
  self->private_impl.f_call_sequence = 40u;
51802
  return wuffs_base__make_status(NULL);
51803
}
51804
51805
// -------- func handsum.decoder.set_report_metadata
51806
51807
WUFFS_BASE__GENERATED_C_CODE
51808
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
51809
wuffs_handsum__decoder__set_report_metadata(
51810
    wuffs_handsum__decoder* self,
51811
    uint32_t a_fourcc,
51812
    bool a_report) {
51813
  return wuffs_base__make_empty_struct();
51814
}
51815
51816
// -------- func handsum.decoder.tell_me_more
51817
51818
WUFFS_BASE__GENERATED_C_CODE
51819
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
51820
wuffs_handsum__decoder__tell_me_more(
51821
    wuffs_handsum__decoder* self,
51822
    wuffs_base__io_buffer* a_dst,
51823
    wuffs_base__more_information* a_minfo,
51824
    wuffs_base__io_buffer* a_src) {
51825
  if (!self) {
51826
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
51827
  }
51828
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
51829
    return wuffs_base__make_status(
51830
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
51831
        ? wuffs_base__error__disabled_by_previous_error
51832
        : wuffs_base__error__initialize_not_called);
51833
  }
51834
  if (!a_dst || !a_src) {
51835
    self->private_impl.magic = WUFFS_BASE__DISABLED;
51836
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
51837
  }
51838
  if ((self->private_impl.active_coroutine != 0) &&
51839
      (self->private_impl.active_coroutine != 4)) {
51840
    self->private_impl.magic = WUFFS_BASE__DISABLED;
51841
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
51842
  }
51843
  self->private_impl.active_coroutine = 0;
51844
  wuffs_base__status status = wuffs_base__make_status(NULL);
51845
51846
  status = wuffs_base__make_status(wuffs_base__error__no_more_information);
51847
  goto exit;
51848
51849
  goto ok;
51850
  ok:
51851
  goto exit;
51852
  exit:
51853
  if (wuffs_base__status__is_error(&status)) {
51854
    self->private_impl.magic = WUFFS_BASE__DISABLED;
51855
  }
51856
  return status;
51857
}
51858
51859
// -------- func handsum.decoder.workbuf_len
51860
51861
WUFFS_BASE__GENERATED_C_CODE
51862
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
51863
wuffs_handsum__decoder__workbuf_len(
51864
    const wuffs_handsum__decoder* self) {
51865
  if (!self) {
51866
    return wuffs_base__utility__empty_range_ii_u64();
51867
  }
51868
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
51869
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
51870
    return wuffs_base__utility__empty_range_ii_u64();
51871
  }
51872
51873
  return wuffs_base__utility__make_range_ii_u64(0u, 0u);
51874
}
51875
51876
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__HANDSUM)
51877
51878
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JPEG)
51879
51880
// ---------------- Status Codes Implementations
51881
51882
const char wuffs_jpeg__error__bad_dht_marker[] = "#jpeg: bad DHT marker";
51883
const char wuffs_jpeg__error__bad_dqt_marker[] = "#jpeg: bad DQT marker";
51884
const char wuffs_jpeg__error__bad_dri_marker[] = "#jpeg: bad DRI marker";
51885
const char wuffs_jpeg__error__bad_sof_marker[] = "#jpeg: bad SOF marker";
51886
const char wuffs_jpeg__error__bad_sos_marker[] = "#jpeg: bad SOS marker";
51887
const char wuffs_jpeg__error__bad_header[] = "#jpeg: bad header";
51888
const char wuffs_jpeg__error__bad_marker[] = "#jpeg: bad marker";
51889
const char wuffs_jpeg__error__bad_scan_count[] = "#jpeg: bad scan count";
51890
const char wuffs_jpeg__error__missing_huffman_table[] = "#jpeg: missing Huffman table";
51891
const char wuffs_jpeg__error__missing_quantization_table[] = "#jpeg: missing Quantization table";
51892
const char wuffs_jpeg__error__rejected_progressive_jpeg[] = "#jpeg: rejected progressive JPEG";
51893
const char wuffs_jpeg__error__short_sos_bitstream[] = "#jpeg: short SOS bitstream";
51894
const char wuffs_jpeg__error__truncated_input[] = "#jpeg: truncated input";
51895
const char wuffs_jpeg__error__unsupported_arithmetic_coding[] = "#jpeg: unsupported arithmetic coding";
51896
const char wuffs_jpeg__error__unsupported_color_model[] = "#jpeg: unsupported color model";
51897
const char wuffs_jpeg__error__unsupported_fractional_sampling[] = "#jpeg: unsupported fractional sampling";
51898
const char wuffs_jpeg__error__unsupported_hierarchical_coding[] = "#jpeg: unsupported hierarchical coding";
51899
const char wuffs_jpeg__error__unsupported_implicit_height[] = "#jpeg: unsupported implicit height";
51900
const char wuffs_jpeg__error__unsupported_lossless_coding[] = "#jpeg: unsupported lossless coding";
51901
const char wuffs_jpeg__error__unsupported_marker[] = "#jpeg: unsupported marker";
51902
const char wuffs_jpeg__error__unsupported_precision_12_bits[] = "#jpeg: unsupported precision (12 bits)";
51903
const char wuffs_jpeg__error__unsupported_precision_16_bits[] = "#jpeg: unsupported precision (16 bits)";
51904
const char wuffs_jpeg__error__unsupported_precision[] = "#jpeg: unsupported precision";
51905
const char wuffs_jpeg__error__unsupported_scan_count[] = "#jpeg: unsupported scan count";
51906
const char wuffs_jpeg__error__internal_error_inconsistent_decoder_state[] = "#jpeg: internal error: inconsistent decoder state";
51907
51908
// ---------------- Private Consts
51909
51910
static const uint8_t
51911
WUFFS_JPEG__UNZIG[80] WUFFS_BASE__POTENTIALLY_UNUSED = {
51912
  0u, 0u, 1u, 8u, 16u, 9u, 2u, 3u,
51913
  10u, 17u, 24u, 32u, 25u, 18u, 11u, 4u,
51914
  5u, 12u, 19u, 26u, 33u, 40u, 48u, 41u,
51915
  34u, 27u, 20u, 13u, 6u, 7u, 14u, 21u,
51916
  28u, 35u, 42u, 49u, 56u, 57u, 50u, 43u,
51917
  36u, 29u, 22u, 15u, 23u, 30u, 37u, 44u,
51918
  51u, 58u, 59u, 52u, 45u, 38u, 31u, 39u,
51919
  46u, 53u, 60u, 61u, 54u, 47u, 55u, 62u,
51920
  63u, 63u, 63u, 63u, 63u, 63u, 63u, 63u,
51921
  63u, 63u, 63u, 63u, 63u, 63u, 63u, 63u,
51922
};
51923
51924
static const uint8_t
51925
WUFFS_JPEG__BIAS_AND_CLAMP[1024] WUFFS_BASE__POTENTIALLY_UNUSED = {
51926
  128u, 129u, 130u, 131u, 132u, 133u, 134u, 135u,
51927
  136u, 137u, 138u, 139u, 140u, 141u, 142u, 143u,
51928
  144u, 145u, 146u, 147u, 148u, 149u, 150u, 151u,
51929
  152u, 153u, 154u, 155u, 156u, 157u, 158u, 159u,
51930
  160u, 161u, 162u, 163u, 164u, 165u, 166u, 167u,
51931
  168u, 169u, 170u, 171u, 172u, 173u, 174u, 175u,
51932
  176u, 177u, 178u, 179u, 180u, 181u, 182u, 183u,
51933
  184u, 185u, 186u, 187u, 188u, 189u, 190u, 191u,
51934
  192u, 193u, 194u, 195u, 196u, 197u, 198u, 199u,
51935
  200u, 201u, 202u, 203u, 204u, 205u, 206u, 207u,
51936
  208u, 209u, 210u, 211u, 212u, 213u, 214u, 215u,
51937
  216u, 217u, 218u, 219u, 220u, 221u, 222u, 223u,
51938
  224u, 225u, 226u, 227u, 228u, 229u, 230u, 231u,
51939
  232u, 233u, 234u, 235u, 236u, 237u, 238u, 239u,
51940
  240u, 241u, 242u, 243u, 244u, 245u, 246u, 247u,
51941
  248u, 249u, 250u, 251u, 252u, 253u, 254u, 255u,
51942
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51943
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51944
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51945
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51946
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51947
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51948
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51949
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51950
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51951
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51952
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51953
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51954
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51955
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51956
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51957
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51958
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51959
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51960
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51961
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51962
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51963
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51964
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51965
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51966
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51967
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51968
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51969
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51970
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51971
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51972
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51973
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51974
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51975
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51976
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51977
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51978
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51979
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51980
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51981
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51982
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51983
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51984
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51985
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51986
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51987
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51988
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51989
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51990
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51991
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51992
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51993
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51994
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51995
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51996
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51997
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51998
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51999
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
52000
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
52001
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
52002
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
52003
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
52004
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
52005
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
52006
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
52007
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
52008
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
52009
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
52010
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
52011
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
52012
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
52013
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
52014
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
52015
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
52016
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
52017
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
52018
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
52019
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
52020
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
52021
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
52022
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
52023
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
52024
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
52025
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
52026
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
52027
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
52028
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
52029
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
52030
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
52031
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
52032
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
52033
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
52034
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
52035
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
52036
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
52037
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
52038
  0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u,
52039
  8u, 9u, 10u, 11u, 12u, 13u, 14u, 15u,
52040
  16u, 17u, 18u, 19u, 20u, 21u, 22u, 23u,
52041
  24u, 25u, 26u, 27u, 28u, 29u, 30u, 31u,
52042
  32u, 33u, 34u, 35u, 36u, 37u, 38u, 39u,
52043
  40u, 41u, 42u, 43u, 44u, 45u, 46u, 47u,
52044
  48u, 49u, 50u, 51u, 52u, 53u, 54u, 55u,
52045
  56u, 57u, 58u, 59u, 60u, 61u, 62u, 63u,
52046
  64u, 65u, 66u, 67u, 68u, 69u, 70u, 71u,
52047
  72u, 73u, 74u, 75u, 76u, 77u, 78u, 79u,
52048
  80u, 81u, 82u, 83u, 84u, 85u, 86u, 87u,
52049
  88u, 89u, 90u, 91u, 92u, 93u, 94u, 95u,
52050
  96u, 97u, 98u, 99u, 100u, 101u, 102u, 103u,
52051
  104u, 105u, 106u, 107u, 108u, 109u, 110u, 111u,
52052
  112u, 113u, 114u, 115u, 116u, 117u, 118u, 119u,
52053
  120u, 121u, 122u, 123u, 124u, 125u, 126u, 127u,
52054
};
52055
52056
static const uint16_t
52057
WUFFS_JPEG__EXTEND[16] WUFFS_BASE__POTENTIALLY_UNUSED = {
52058
  0u, 65535u, 65533u, 65529u, 65521u, 65505u, 65473u, 65409u,
52059
  65281u, 65025u, 64513u, 63489u, 61441u, 57345u, 49153u, 32769u,
52060
};
52061
52062
static const uint8_t
52063
WUFFS_JPEG__DEFAULT_HUFF_TABLE_DC_LUMA[29] WUFFS_BASE__POTENTIALLY_UNUSED = {
52064
  0u, 0u, 1u, 5u, 1u, 1u, 1u, 1u,
52065
  1u, 1u, 0u, 0u, 0u, 0u, 0u, 0u,
52066
  0u, 0u, 1u, 2u, 3u, 4u, 5u, 6u,
52067
  7u, 8u, 9u, 10u, 11u,
52068
};
52069
52070
static const uint8_t
52071
WUFFS_JPEG__DEFAULT_HUFF_TABLE_DC_CHROMA[29] WUFFS_BASE__POTENTIALLY_UNUSED = {
52072
  1u, 0u, 3u, 1u, 1u, 1u, 1u, 1u,
52073
  1u, 1u, 1u, 1u, 0u, 0u, 0u, 0u,
52074
  0u, 0u, 1u, 2u, 3u, 4u, 5u, 6u,
52075
  7u, 8u, 9u, 10u, 11u,
52076
};
52077
52078
static const uint8_t
52079
WUFFS_JPEG__DEFAULT_HUFF_TABLE_AC_LUMA[179] WUFFS_BASE__POTENTIALLY_UNUSED = {
52080
  16u, 0u, 2u, 1u, 3u, 3u, 2u, 4u,
52081
  3u, 5u, 5u, 4u, 4u, 0u, 0u, 1u,
52082
  125u, 1u, 2u, 3u, 0u, 4u, 17u, 5u,
52083
  18u, 33u, 49u, 65u, 6u, 19u, 81u, 97u,
52084
  7u, 34u, 113u, 20u, 50u, 129u, 145u, 161u,
52085
  8u, 35u, 66u, 177u, 193u, 21u, 82u, 209u,
52086
  240u, 36u, 51u, 98u, 114u, 130u, 9u, 10u,
52087
  22u, 23u, 24u, 25u, 26u, 37u, 38u, 39u,
52088
  40u, 41u, 42u, 52u, 53u, 54u, 55u, 56u,
52089
  57u, 58u, 67u, 68u, 69u, 70u, 71u, 72u,
52090
  73u, 74u, 83u, 84u, 85u, 86u, 87u, 88u,
52091
  89u, 90u, 99u, 100u, 101u, 102u, 103u, 104u,
52092
  105u, 106u, 115u, 116u, 117u, 118u, 119u, 120u,
52093
  121u, 122u, 131u, 132u, 133u, 134u, 135u, 136u,
52094
  137u, 138u, 146u, 147u, 148u, 149u, 150u, 151u,
52095
  152u, 153u, 154u, 162u, 163u, 164u, 165u, 166u,
52096
  167u, 168u, 169u, 170u, 178u, 179u, 180u, 181u,
52097
  182u, 183u, 184u, 185u, 186u, 194u, 195u, 196u,
52098
  197u, 198u, 199u, 200u, 201u, 202u, 210u, 211u,
52099
  212u, 213u, 214u, 215u, 216u, 217u, 218u, 225u,
52100
  226u, 227u, 228u, 229u, 230u, 231u, 232u, 233u,
52101
  234u, 241u, 242u, 243u, 244u, 245u, 246u, 247u,
52102
  248u, 249u, 250u,
52103
};
52104
52105
static const uint8_t
52106
WUFFS_JPEG__DEFAULT_HUFF_TABLE_AC_CHROMA[179] WUFFS_BASE__POTENTIALLY_UNUSED = {
52107
  17u, 0u, 2u, 1u, 2u, 4u, 4u, 3u,
52108
  4u, 7u, 5u, 4u, 4u, 0u, 1u, 2u,
52109
  119u, 0u, 1u, 2u, 3u, 17u, 4u, 5u,
52110
  33u, 49u, 6u, 18u, 65u, 81u, 7u, 97u,
52111
  113u, 19u, 34u, 50u, 129u, 8u, 20u, 66u,
52112
  145u, 161u, 177u, 193u, 9u, 35u, 51u, 82u,
52113
  240u, 21u, 98u, 114u, 209u, 10u, 22u, 36u,
52114
  52u, 225u, 37u, 241u, 23u, 24u, 25u, 26u,
52115
  38u, 39u, 40u, 41u, 42u, 53u, 54u, 55u,
52116
  56u, 57u, 58u, 67u, 68u, 69u, 70u, 71u,
52117
  72u, 73u, 74u, 83u, 84u, 85u, 86u, 87u,
52118
  88u, 89u, 90u, 99u, 100u, 101u, 102u, 103u,
52119
  104u, 105u, 106u, 115u, 116u, 117u, 118u, 119u,
52120
  120u, 121u, 122u, 130u, 131u, 132u, 133u, 134u,
52121
  135u, 136u, 137u, 138u, 146u, 147u, 148u, 149u,
52122
  150u, 151u, 152u, 153u, 154u, 162u, 163u, 164u,
52123
  165u, 166u, 167u, 168u, 169u, 170u, 178u, 179u,
52124
  180u, 181u, 182u, 183u, 184u, 185u, 186u, 194u,
52125
  195u, 196u, 197u, 198u, 199u, 200u, 201u, 202u,
52126
  210u, 211u, 212u, 213u, 214u, 215u, 216u, 217u,
52127
  218u, 226u, 227u, 228u, 229u, 230u, 231u, 232u,
52128
  233u, 234u, 242u, 243u, 244u, 245u, 246u, 247u,
52129
  248u, 249u, 250u,
52130
};
52131
52132
#define WUFFS_JPEG__QUIRKS_BASE 1162824704u
52133
52134
// ---------------- Private Initializer Prototypes
52135
52136
// ---------------- Private Function Prototypes
52137
52138
WUFFS_BASE__GENERATED_C_CODE
52139
static wuffs_base__empty_struct
52140
wuffs_jpeg__decoder__decode_idct(
52141
    wuffs_jpeg__decoder* self,
52142
    wuffs_base__slice_u8 a_dst_buffer,
52143
    uint64_t a_dst_stride,
52144
    uint32_t a_q);
52145
52146
WUFFS_BASE__GENERATED_C_CODE
52147
static wuffs_base__empty_struct
52148
wuffs_jpeg__decoder__decode_idct__choosy_default(
52149
    wuffs_jpeg__decoder* self,
52150
    wuffs_base__slice_u8 a_dst_buffer,
52151
    uint64_t a_dst_stride,
52152
    uint32_t a_q);
52153
52154
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
52155
WUFFS_BASE__GENERATED_C_CODE
52156
static wuffs_base__empty_struct
52157
wuffs_jpeg__decoder__decode_idct_x86_avx2(
52158
    wuffs_jpeg__decoder* self,
52159
    wuffs_base__slice_u8 a_dst_buffer,
52160
    uint64_t a_dst_stride,
52161
    uint32_t a_q);
52162
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
52163
52164
WUFFS_BASE__GENERATED_C_CODE
52165
static wuffs_base__status
52166
wuffs_jpeg__decoder__do_decode_image_config(
52167
    wuffs_jpeg__decoder* self,
52168
    wuffs_base__image_config* a_dst,
52169
    wuffs_base__io_buffer* a_src);
52170
52171
WUFFS_BASE__GENERATED_C_CODE
52172
static wuffs_base__status
52173
wuffs_jpeg__decoder__decode_dqt(
52174
    wuffs_jpeg__decoder* self,
52175
    wuffs_base__io_buffer* a_src);
52176
52177
WUFFS_BASE__GENERATED_C_CODE
52178
static wuffs_base__status
52179
wuffs_jpeg__decoder__decode_dri(
52180
    wuffs_jpeg__decoder* self,
52181
    wuffs_base__io_buffer* a_src);
52182
52183
WUFFS_BASE__GENERATED_C_CODE
52184
static wuffs_base__status
52185
wuffs_jpeg__decoder__decode_appn(
52186
    wuffs_jpeg__decoder* self,
52187
    wuffs_base__io_buffer* a_src,
52188
    uint8_t a_marker);
52189
52190
WUFFS_BASE__GENERATED_C_CODE
52191
static wuffs_base__status
52192
wuffs_jpeg__decoder__decode_sof(
52193
    wuffs_jpeg__decoder* self,
52194
    wuffs_base__io_buffer* a_src);
52195
52196
WUFFS_BASE__GENERATED_C_CODE
52197
static uint32_t
52198
wuffs_jpeg__decoder__quantize_dimension(
52199
    const wuffs_jpeg__decoder* self,
52200
    uint32_t a_width,
52201
    uint8_t a_h,
52202
    uint8_t a_max_incl_h);
52203
52204
WUFFS_BASE__GENERATED_C_CODE
52205
static wuffs_base__status
52206
wuffs_jpeg__decoder__do_decode_frame_config(
52207
    wuffs_jpeg__decoder* self,
52208
    wuffs_base__frame_config* a_dst,
52209
    wuffs_base__io_buffer* a_src);
52210
52211
WUFFS_BASE__GENERATED_C_CODE
52212
static wuffs_base__status
52213
wuffs_jpeg__decoder__do_decode_frame(
52214
    wuffs_jpeg__decoder* self,
52215
    wuffs_base__pixel_buffer* a_dst,
52216
    wuffs_base__io_buffer* a_src,
52217
    wuffs_base__pixel_blend a_blend,
52218
    wuffs_base__slice_u8 a_workbuf,
52219
    wuffs_base__decode_frame_options* a_opts);
52220
52221
WUFFS_BASE__GENERATED_C_CODE
52222
static wuffs_base__status
52223
wuffs_jpeg__decoder__decode_dht(
52224
    wuffs_jpeg__decoder* self,
52225
    wuffs_base__io_buffer* a_src);
52226
52227
WUFFS_BASE__GENERATED_C_CODE
52228
static bool
52229
wuffs_jpeg__decoder__calculate_huff_tables(
52230
    wuffs_jpeg__decoder* self,
52231
    uint8_t a_tc4_th,
52232
    uint32_t a_total_count);
52233
52234
WUFFS_BASE__GENERATED_C_CODE
52235
static wuffs_base__status
52236
wuffs_jpeg__decoder__decode_sos(
52237
    wuffs_jpeg__decoder* self,
52238
    wuffs_base__pixel_buffer* a_dst,
52239
    wuffs_base__io_buffer* a_src,
52240
    wuffs_base__slice_u8 a_workbuf);
52241
52242
WUFFS_BASE__GENERATED_C_CODE
52243
static wuffs_base__status
52244
wuffs_jpeg__decoder__prepare_scan(
52245
    wuffs_jpeg__decoder* self,
52246
    wuffs_base__io_buffer* a_src);
52247
52248
WUFFS_BASE__GENERATED_C_CODE
52249
static wuffs_base__status
52250
wuffs_jpeg__decoder__use_default_huffman_table(
52251
    wuffs_jpeg__decoder* self,
52252
    uint8_t a_tc4_th);
52253
52254
WUFFS_BASE__GENERATED_C_CODE
52255
static wuffs_base__empty_struct
52256
wuffs_jpeg__decoder__calculate_single_component_scan_fields(
52257
    wuffs_jpeg__decoder* self);
52258
52259
WUFFS_BASE__GENERATED_C_CODE
52260
static bool
52261
wuffs_jpeg__decoder__calculate_multiple_component_scan_fields(
52262
    wuffs_jpeg__decoder* self);
52263
52264
WUFFS_BASE__GENERATED_C_CODE
52265
static wuffs_base__empty_struct
52266
wuffs_jpeg__decoder__fill_bitstream(
52267
    wuffs_jpeg__decoder* self,
52268
    wuffs_base__io_buffer* a_src);
52269
52270
WUFFS_BASE__GENERATED_C_CODE
52271
static wuffs_base__empty_struct
52272
wuffs_jpeg__decoder__load_mcu_blocks_for_single_component(
52273
    wuffs_jpeg__decoder* self,
52274
    uint32_t a_mx,
52275
    uint32_t a_my,
52276
    wuffs_base__slice_u8 a_workbuf,
52277
    uint32_t a_csel);
52278
52279
WUFFS_BASE__GENERATED_C_CODE
52280
static wuffs_base__empty_struct
52281
wuffs_jpeg__decoder__load_mcu_blocks_for_single_component__choosy_default(
52282
    wuffs_jpeg__decoder* self,
52283
    uint32_t a_mx,
52284
    uint32_t a_my,
52285
    wuffs_base__slice_u8 a_workbuf,
52286
    uint32_t a_csel);
52287
52288
WUFFS_BASE__GENERATED_C_CODE
52289
static wuffs_base__empty_struct
52290
wuffs_jpeg__decoder__load_mcu_blocks(
52291
    wuffs_jpeg__decoder* self,
52292
    uint32_t a_mx,
52293
    uint32_t a_my,
52294
    wuffs_base__slice_u8 a_workbuf);
52295
52296
WUFFS_BASE__GENERATED_C_CODE
52297
static wuffs_base__empty_struct
52298
wuffs_jpeg__decoder__save_mcu_blocks(
52299
    wuffs_jpeg__decoder* self,
52300
    uint32_t a_mx,
52301
    uint32_t a_my,
52302
    wuffs_base__slice_u8 a_workbuf);
52303
52304
WUFFS_BASE__GENERATED_C_CODE
52305
static wuffs_base__status
52306
wuffs_jpeg__decoder__skip_past_the_next_restart_marker(
52307
    wuffs_jpeg__decoder* self,
52308
    wuffs_base__io_buffer* a_src);
52309
52310
WUFFS_BASE__GENERATED_C_CODE
52311
static wuffs_base__empty_struct
52312
wuffs_jpeg__decoder__apply_progressive_idct(
52313
    wuffs_jpeg__decoder* self,
52314
    wuffs_base__slice_u8 a_workbuf);
52315
52316
WUFFS_BASE__GENERATED_C_CODE
52317
static wuffs_base__status
52318
wuffs_jpeg__decoder__swizzle_gray(
52319
    wuffs_jpeg__decoder* self,
52320
    wuffs_base__pixel_buffer* a_dst,
52321
    wuffs_base__slice_u8 a_workbuf,
52322
    uint32_t a_x0,
52323
    uint32_t a_x1,
52324
    uint32_t a_y0,
52325
    uint32_t a_y1,
52326
    uint64_t a_stride);
52327
52328
WUFFS_BASE__GENERATED_C_CODE
52329
static wuffs_base__status
52330
wuffs_jpeg__decoder__swizzle_colorful(
52331
    wuffs_jpeg__decoder* self,
52332
    wuffs_base__pixel_buffer* a_dst,
52333
    wuffs_base__slice_u8 a_workbuf,
52334
    uint32_t a_x0,
52335
    uint32_t a_x1,
52336
    uint32_t a_y0,
52337
    uint32_t a_y1);
52338
52339
WUFFS_BASE__GENERATED_C_CODE
52340
static bool
52341
wuffs_jpeg__decoder__top_left_quants_has_zero(
52342
    const wuffs_jpeg__decoder* self,
52343
    uint32_t a_q);
52344
52345
WUFFS_BASE__GENERATED_C_CODE
52346
static wuffs_base__empty_struct
52347
wuffs_jpeg__decoder__load_mcu_blocks_for_single_component_smooth(
52348
    wuffs_jpeg__decoder* self,
52349
    uint32_t a_mx,
52350
    uint32_t a_my,
52351
    wuffs_base__slice_u8 a_workbuf,
52352
    uint32_t a_csel);
52353
52354
WUFFS_BASE__GENERATED_C_CODE
52355
static uint32_t
52356
wuffs_jpeg__decoder__decode_mcu(
52357
    wuffs_jpeg__decoder* self,
52358
    wuffs_base__pixel_buffer* a_dst,
52359
    wuffs_base__slice_u8 a_workbuf,
52360
    uint32_t a_mx,
52361
    uint32_t a_my);
52362
52363
WUFFS_BASE__GENERATED_C_CODE
52364
static uint32_t
52365
wuffs_jpeg__decoder__decode_mcu__choosy_default(
52366
    wuffs_jpeg__decoder* self,
52367
    wuffs_base__pixel_buffer* a_dst,
52368
    wuffs_base__slice_u8 a_workbuf,
52369
    uint32_t a_mx,
52370
    uint32_t a_my);
52371
52372
WUFFS_BASE__GENERATED_C_CODE
52373
static uint32_t
52374
wuffs_jpeg__decoder__decode_mcu_progressive_ac_high_bits(
52375
    wuffs_jpeg__decoder* self,
52376
    wuffs_base__pixel_buffer* a_dst,
52377
    wuffs_base__slice_u8 a_workbuf,
52378
    uint32_t a_mx,
52379
    uint32_t a_my);
52380
52381
WUFFS_BASE__GENERATED_C_CODE
52382
static uint32_t
52383
wuffs_jpeg__decoder__decode_mcu_progressive_ac_low_bit(
52384
    wuffs_jpeg__decoder* self,
52385
    wuffs_base__pixel_buffer* a_dst,
52386
    wuffs_base__slice_u8 a_workbuf,
52387
    uint32_t a_mx,
52388
    uint32_t a_my);
52389
52390
WUFFS_BASE__GENERATED_C_CODE
52391
static uint32_t
52392
wuffs_jpeg__decoder__decode_mcu_progressive_dc_high_bits(
52393
    wuffs_jpeg__decoder* self,
52394
    wuffs_base__pixel_buffer* a_dst,
52395
    wuffs_base__slice_u8 a_workbuf,
52396
    uint32_t a_mx,
52397
    uint32_t a_my);
52398
52399
WUFFS_BASE__GENERATED_C_CODE
52400
static uint32_t
52401
wuffs_jpeg__decoder__decode_mcu_progressive_dc_low_bit(
52402
    wuffs_jpeg__decoder* self,
52403
    wuffs_base__pixel_buffer* a_dst,
52404
    wuffs_base__slice_u8 a_workbuf,
52405
    uint32_t a_mx,
52406
    uint32_t a_my);
52407
52408
// ---------------- VTables
52409
52410
const wuffs_base__image_decoder__func_ptrs
52411
wuffs_jpeg__decoder__func_ptrs_for__wuffs_base__image_decoder = {
52412
  (wuffs_base__status(*)(void*,
52413
      wuffs_base__pixel_buffer*,
52414
      wuffs_base__io_buffer*,
52415
      wuffs_base__pixel_blend,
52416
      wuffs_base__slice_u8,
52417
      wuffs_base__decode_frame_options*))(&wuffs_jpeg__decoder__decode_frame),
52418
  (wuffs_base__status(*)(void*,
52419
      wuffs_base__frame_config*,
52420
      wuffs_base__io_buffer*))(&wuffs_jpeg__decoder__decode_frame_config),
52421
  (wuffs_base__status(*)(void*,
52422
      wuffs_base__image_config*,
52423
      wuffs_base__io_buffer*))(&wuffs_jpeg__decoder__decode_image_config),
52424
  (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_jpeg__decoder__frame_dirty_rect),
52425
  (uint64_t(*)(const void*,
52426
      uint32_t))(&wuffs_jpeg__decoder__get_quirk),
52427
  (uint32_t(*)(const void*))(&wuffs_jpeg__decoder__num_animation_loops),
52428
  (uint64_t(*)(const void*))(&wuffs_jpeg__decoder__num_decoded_frame_configs),
52429
  (uint64_t(*)(const void*))(&wuffs_jpeg__decoder__num_decoded_frames),
52430
  (wuffs_base__status(*)(void*,
52431
      uint64_t,
52432
      uint64_t))(&wuffs_jpeg__decoder__restart_frame),
52433
  (wuffs_base__status(*)(void*,
52434
      uint32_t,
52435
      uint64_t))(&wuffs_jpeg__decoder__set_quirk),
52436
  (wuffs_base__empty_struct(*)(void*,
52437
      uint32_t,
52438
      bool))(&wuffs_jpeg__decoder__set_report_metadata),
52439
  (wuffs_base__status(*)(void*,
52440
      wuffs_base__io_buffer*,
52441
      wuffs_base__more_information*,
52442
      wuffs_base__io_buffer*))(&wuffs_jpeg__decoder__tell_me_more),
52443
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_jpeg__decoder__workbuf_len),
52444
};
52445
52446
// ---------------- Initializer Implementations
52447
52448
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
52449
wuffs_jpeg__decoder__initialize(
52450
    wuffs_jpeg__decoder* self,
52451
    size_t sizeof_star_self,
52452
    uint64_t wuffs_version,
52453
3.72k
    uint32_t options){
52454
3.72k
  if (!self) {
52455
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
52456
0
  }
52457
3.72k
  if (sizeof(*self) != sizeof_star_self) {
52458
0
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
52459
0
  }
52460
3.72k
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
52461
3.72k
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
52462
0
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
52463
0
  }
52464
52465
3.72k
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
52466
    // The whole point of this if-check is to detect an uninitialized *self.
52467
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
52468
#if !defined(__clang__) && defined(__GNUC__)
52469
#pragma GCC diagnostic push
52470
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
52471
#endif
52472
0
    if (self->private_impl.magic != 0) {
52473
0
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
52474
0
    }
52475
#if !defined(__clang__) && defined(__GNUC__)
52476
#pragma GCC diagnostic pop
52477
#endif
52478
3.72k
  } else {
52479
3.72k
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
52480
1.89k
      memset(self, 0, sizeof(*self));
52481
1.89k
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
52482
1.89k
    } else {
52483
1.83k
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
52484
1.83k
    }
52485
3.72k
  }
52486
52487
3.72k
  self->private_impl.choosy_decode_idct = &wuffs_jpeg__decoder__decode_idct__choosy_default;
52488
3.72k
  self->private_impl.choosy_load_mcu_blocks_for_single_component = &wuffs_jpeg__decoder__load_mcu_blocks_for_single_component__choosy_default;
52489
3.72k
  self->private_impl.choosy_decode_mcu = &wuffs_jpeg__decoder__decode_mcu__choosy_default;
52490
52491
3.72k
  self->private_impl.magic = WUFFS_BASE__MAGIC;
52492
3.72k
  self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name =
52493
3.72k
      wuffs_base__image_decoder__vtable_name;
52494
3.72k
  self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers =
52495
3.72k
      (const void*)(&wuffs_jpeg__decoder__func_ptrs_for__wuffs_base__image_decoder);
52496
3.72k
  return wuffs_base__make_status(NULL);
52497
3.72k
}
52498
52499
wuffs_jpeg__decoder*
52500
0
wuffs_jpeg__decoder__alloc(void) {
52501
0
  wuffs_jpeg__decoder* x =
52502
0
      (wuffs_jpeg__decoder*)(calloc(1, sizeof(wuffs_jpeg__decoder)));
52503
0
  if (!x) {
52504
0
    return NULL;
52505
0
  }
52506
0
  if (wuffs_jpeg__decoder__initialize(
52507
0
      x, sizeof(wuffs_jpeg__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
52508
0
    free(x);
52509
0
    return NULL;
52510
0
  }
52511
0
  return x;
52512
0
}
52513
52514
size_t
52515
0
sizeof__wuffs_jpeg__decoder(void) {
52516
0
  return sizeof(wuffs_jpeg__decoder);
52517
0
}
52518
52519
// ---------------- Function Implementations
52520
52521
// -------- func jpeg.decoder.decode_idct
52522
52523
WUFFS_BASE__GENERATED_C_CODE
52524
static wuffs_base__empty_struct
52525
wuffs_jpeg__decoder__decode_idct(
52526
    wuffs_jpeg__decoder* self,
52527
    wuffs_base__slice_u8 a_dst_buffer,
52528
    uint64_t a_dst_stride,
52529
109M
    uint32_t a_q) {
52530
109M
  return (*self->private_impl.choosy_decode_idct)(self, a_dst_buffer, a_dst_stride, a_q);
52531
109M
}
52532
52533
WUFFS_BASE__GENERATED_C_CODE
52534
static wuffs_base__empty_struct
52535
wuffs_jpeg__decoder__decode_idct__choosy_default(
52536
    wuffs_jpeg__decoder* self,
52537
    wuffs_base__slice_u8 a_dst_buffer,
52538
    uint64_t a_dst_stride,
52539
0
    uint32_t a_q) {
52540
0
  uint32_t v_bq0 = 0;
52541
0
  uint32_t v_bq2 = 0;
52542
0
  uint32_t v_bq4 = 0;
52543
0
  uint32_t v_bq6 = 0;
52544
0
  uint32_t v_ca = 0;
52545
0
  uint32_t v_cb2 = 0;
52546
0
  uint32_t v_cb6 = 0;
52547
0
  uint32_t v_ccp = 0;
52548
0
  uint32_t v_ccm = 0;
52549
0
  uint32_t v_cd0 = 0;
52550
0
  uint32_t v_cd1 = 0;
52551
0
  uint32_t v_cd2 = 0;
52552
0
  uint32_t v_cd3 = 0;
52553
0
  uint32_t v_bq1 = 0;
52554
0
  uint32_t v_bq3 = 0;
52555
0
  uint32_t v_bq5 = 0;
52556
0
  uint32_t v_bq7 = 0;
52557
0
  uint32_t v_ci51 = 0;
52558
0
  uint32_t v_ci53 = 0;
52559
0
  uint32_t v_ci71 = 0;
52560
0
  uint32_t v_ci73 = 0;
52561
0
  uint32_t v_cj = 0;
52562
0
  uint32_t v_ck1 = 0;
52563
0
  uint32_t v_ck3 = 0;
52564
0
  uint32_t v_ck5 = 0;
52565
0
  uint32_t v_ck7 = 0;
52566
0
  uint32_t v_cl51 = 0;
52567
0
  uint32_t v_cl73 = 0;
52568
0
  uint32_t v_in0 = 0;
52569
0
  uint32_t v_in2 = 0;
52570
0
  uint32_t v_in4 = 0;
52571
0
  uint32_t v_in6 = 0;
52572
0
  uint32_t v_ra = 0;
52573
0
  uint32_t v_rb2 = 0;
52574
0
  uint32_t v_rb6 = 0;
52575
0
  uint32_t v_rcp = 0;
52576
0
  uint32_t v_rcm = 0;
52577
0
  uint32_t v_rd0 = 0;
52578
0
  uint32_t v_rd1 = 0;
52579
0
  uint32_t v_rd2 = 0;
52580
0
  uint32_t v_rd3 = 0;
52581
0
  uint32_t v_in1 = 0;
52582
0
  uint32_t v_in3 = 0;
52583
0
  uint32_t v_in5 = 0;
52584
0
  uint32_t v_in7 = 0;
52585
0
  uint32_t v_ri51 = 0;
52586
0
  uint32_t v_ri53 = 0;
52587
0
  uint32_t v_ri71 = 0;
52588
0
  uint32_t v_ri73 = 0;
52589
0
  uint32_t v_rj = 0;
52590
0
  uint32_t v_rk1 = 0;
52591
0
  uint32_t v_rk3 = 0;
52592
0
  uint32_t v_rk5 = 0;
52593
0
  uint32_t v_rk7 = 0;
52594
0
  uint32_t v_rl51 = 0;
52595
0
  uint32_t v_rl73 = 0;
52596
0
  uint32_t v_intermediate[64] = {0};
52597
52598
0
  if (8u > a_dst_stride) {
52599
0
    return wuffs_base__make_empty_struct();
52600
0
  }
52601
0
  if (0u == (self->private_data.f_mcu_blocks[0u][8u] |
52602
0
      self->private_data.f_mcu_blocks[0u][16u] |
52603
0
      self->private_data.f_mcu_blocks[0u][24u] |
52604
0
      self->private_data.f_mcu_blocks[0u][32u] |
52605
0
      self->private_data.f_mcu_blocks[0u][40u] |
52606
0
      self->private_data.f_mcu_blocks[0u][48u] |
52607
0
      self->private_data.f_mcu_blocks[0u][56u])) {
52608
0
    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));
52609
0
    v_intermediate[8u] = v_intermediate[0u];
52610
0
    v_intermediate[16u] = v_intermediate[0u];
52611
0
    v_intermediate[24u] = v_intermediate[0u];
52612
0
    v_intermediate[32u] = v_intermediate[0u];
52613
0
    v_intermediate[40u] = v_intermediate[0u];
52614
0
    v_intermediate[48u] = v_intermediate[0u];
52615
0
    v_intermediate[56u] = v_intermediate[0u];
52616
0
  } else {
52617
0
    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]))));
52618
0
    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]))));
52619
0
    v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u));
52620
0
    v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u))));
52621
0
    v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u))));
52622
0
    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]))));
52623
0
    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]))));
52624
0
    v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u));
52625
0
    v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u));
52626
0
    v_cd0 = ((uint32_t)(v_ccp + v_cb2));
52627
0
    v_cd1 = ((uint32_t)(v_ccm + v_cb6));
52628
0
    v_cd2 = ((uint32_t)(v_ccm - v_cb6));
52629
0
    v_cd3 = ((uint32_t)(v_ccp - v_cb2));
52630
0
    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]))));
52631
0
    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]))));
52632
0
    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]))));
52633
0
    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]))));
52634
0
    v_ci51 = ((uint32_t)(v_bq5 + v_bq1));
52635
0
    v_ci53 = ((uint32_t)(v_bq5 + v_bq3));
52636
0
    v_ci71 = ((uint32_t)(v_bq7 + v_bq1));
52637
0
    v_ci73 = ((uint32_t)(v_bq7 + v_bq3));
52638
0
    v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u));
52639
0
    v_ck1 = ((uint32_t)(v_bq1 * 12299u));
52640
0
    v_ck3 = ((uint32_t)(v_bq3 * 25172u));
52641
0
    v_ck5 = ((uint32_t)(v_bq5 * 16819u));
52642
0
    v_ck7 = ((uint32_t)(v_bq7 * 2446u));
52643
0
    v_ci51 *= 4294964100u;
52644
0
    v_ci53 *= 4294946301u;
52645
0
    v_ci71 *= 4294959923u;
52646
0
    v_ci73 *= 4294951227u;
52647
0
    v_cl51 = ((uint32_t)(v_ci51 + v_cj));
52648
0
    v_cl73 = ((uint32_t)(v_ci73 + v_cj));
52649
0
    v_ck1 += ((uint32_t)(v_ci71 + v_cl51));
52650
0
    v_ck3 += ((uint32_t)(v_ci53 + v_cl73));
52651
0
    v_ck5 += ((uint32_t)(v_ci53 + v_cl51));
52652
0
    v_ck7 += ((uint32_t)(v_ci71 + v_cl73));
52653
0
    v_intermediate[0u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u);
52654
0
    v_intermediate[56u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u);
52655
0
    v_intermediate[8u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u);
52656
0
    v_intermediate[48u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u);
52657
0
    v_intermediate[16u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u);
52658
0
    v_intermediate[40u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u);
52659
0
    v_intermediate[24u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u);
52660
0
    v_intermediate[32u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u);
52661
0
  }
52662
0
  if (0u == (self->private_data.f_mcu_blocks[0u][9u] |
52663
0
      self->private_data.f_mcu_blocks[0u][17u] |
52664
0
      self->private_data.f_mcu_blocks[0u][25u] |
52665
0
      self->private_data.f_mcu_blocks[0u][33u] |
52666
0
      self->private_data.f_mcu_blocks[0u][41u] |
52667
0
      self->private_data.f_mcu_blocks[0u][49u] |
52668
0
      self->private_data.f_mcu_blocks[0u][57u])) {
52669
0
    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));
52670
0
    v_intermediate[9u] = v_intermediate[1u];
52671
0
    v_intermediate[17u] = v_intermediate[1u];
52672
0
    v_intermediate[25u] = v_intermediate[1u];
52673
0
    v_intermediate[33u] = v_intermediate[1u];
52674
0
    v_intermediate[41u] = v_intermediate[1u];
52675
0
    v_intermediate[49u] = v_intermediate[1u];
52676
0
    v_intermediate[57u] = v_intermediate[1u];
52677
0
  } else {
52678
0
    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]))));
52679
0
    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]))));
52680
0
    v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u));
52681
0
    v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u))));
52682
0
    v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u))));
52683
0
    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]))));
52684
0
    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]))));
52685
0
    v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u));
52686
0
    v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u));
52687
0
    v_cd0 = ((uint32_t)(v_ccp + v_cb2));
52688
0
    v_cd1 = ((uint32_t)(v_ccm + v_cb6));
52689
0
    v_cd2 = ((uint32_t)(v_ccm - v_cb6));
52690
0
    v_cd3 = ((uint32_t)(v_ccp - v_cb2));
52691
0
    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]))));
52692
0
    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]))));
52693
0
    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]))));
52694
0
    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]))));
52695
0
    v_ci51 = ((uint32_t)(v_bq5 + v_bq1));
52696
0
    v_ci53 = ((uint32_t)(v_bq5 + v_bq3));
52697
0
    v_ci71 = ((uint32_t)(v_bq7 + v_bq1));
52698
0
    v_ci73 = ((uint32_t)(v_bq7 + v_bq3));
52699
0
    v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u));
52700
0
    v_ck1 = ((uint32_t)(v_bq1 * 12299u));
52701
0
    v_ck3 = ((uint32_t)(v_bq3 * 25172u));
52702
0
    v_ck5 = ((uint32_t)(v_bq5 * 16819u));
52703
0
    v_ck7 = ((uint32_t)(v_bq7 * 2446u));
52704
0
    v_ci51 *= 4294964100u;
52705
0
    v_ci53 *= 4294946301u;
52706
0
    v_ci71 *= 4294959923u;
52707
0
    v_ci73 *= 4294951227u;
52708
0
    v_cl51 = ((uint32_t)(v_ci51 + v_cj));
52709
0
    v_cl73 = ((uint32_t)(v_ci73 + v_cj));
52710
0
    v_ck1 += ((uint32_t)(v_ci71 + v_cl51));
52711
0
    v_ck3 += ((uint32_t)(v_ci53 + v_cl73));
52712
0
    v_ck5 += ((uint32_t)(v_ci53 + v_cl51));
52713
0
    v_ck7 += ((uint32_t)(v_ci71 + v_cl73));
52714
0
    v_intermediate[1u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u);
52715
0
    v_intermediate[57u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u);
52716
0
    v_intermediate[9u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u);
52717
0
    v_intermediate[49u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u);
52718
0
    v_intermediate[17u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u);
52719
0
    v_intermediate[41u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u);
52720
0
    v_intermediate[25u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u);
52721
0
    v_intermediate[33u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u);
52722
0
  }
52723
0
  if (0u == (self->private_data.f_mcu_blocks[0u][10u] |
52724
0
      self->private_data.f_mcu_blocks[0u][18u] |
52725
0
      self->private_data.f_mcu_blocks[0u][26u] |
52726
0
      self->private_data.f_mcu_blocks[0u][34u] |
52727
0
      self->private_data.f_mcu_blocks[0u][42u] |
52728
0
      self->private_data.f_mcu_blocks[0u][50u] |
52729
0
      self->private_data.f_mcu_blocks[0u][58u])) {
52730
0
    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));
52731
0
    v_intermediate[10u] = v_intermediate[2u];
52732
0
    v_intermediate[18u] = v_intermediate[2u];
52733
0
    v_intermediate[26u] = v_intermediate[2u];
52734
0
    v_intermediate[34u] = v_intermediate[2u];
52735
0
    v_intermediate[42u] = v_intermediate[2u];
52736
0
    v_intermediate[50u] = v_intermediate[2u];
52737
0
    v_intermediate[58u] = v_intermediate[2u];
52738
0
  } else {
52739
0
    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]))));
52740
0
    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]))));
52741
0
    v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u));
52742
0
    v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u))));
52743
0
    v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u))));
52744
0
    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]))));
52745
0
    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]))));
52746
0
    v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u));
52747
0
    v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u));
52748
0
    v_cd0 = ((uint32_t)(v_ccp + v_cb2));
52749
0
    v_cd1 = ((uint32_t)(v_ccm + v_cb6));
52750
0
    v_cd2 = ((uint32_t)(v_ccm - v_cb6));
52751
0
    v_cd3 = ((uint32_t)(v_ccp - v_cb2));
52752
0
    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]))));
52753
0
    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]))));
52754
0
    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]))));
52755
0
    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]))));
52756
0
    v_ci51 = ((uint32_t)(v_bq5 + v_bq1));
52757
0
    v_ci53 = ((uint32_t)(v_bq5 + v_bq3));
52758
0
    v_ci71 = ((uint32_t)(v_bq7 + v_bq1));
52759
0
    v_ci73 = ((uint32_t)(v_bq7 + v_bq3));
52760
0
    v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u));
52761
0
    v_ck1 = ((uint32_t)(v_bq1 * 12299u));
52762
0
    v_ck3 = ((uint32_t)(v_bq3 * 25172u));
52763
0
    v_ck5 = ((uint32_t)(v_bq5 * 16819u));
52764
0
    v_ck7 = ((uint32_t)(v_bq7 * 2446u));
52765
0
    v_ci51 *= 4294964100u;
52766
0
    v_ci53 *= 4294946301u;
52767
0
    v_ci71 *= 4294959923u;
52768
0
    v_ci73 *= 4294951227u;
52769
0
    v_cl51 = ((uint32_t)(v_ci51 + v_cj));
52770
0
    v_cl73 = ((uint32_t)(v_ci73 + v_cj));
52771
0
    v_ck1 += ((uint32_t)(v_ci71 + v_cl51));
52772
0
    v_ck3 += ((uint32_t)(v_ci53 + v_cl73));
52773
0
    v_ck5 += ((uint32_t)(v_ci53 + v_cl51));
52774
0
    v_ck7 += ((uint32_t)(v_ci71 + v_cl73));
52775
0
    v_intermediate[2u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u);
52776
0
    v_intermediate[58u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u);
52777
0
    v_intermediate[10u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u);
52778
0
    v_intermediate[50u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u);
52779
0
    v_intermediate[18u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u);
52780
0
    v_intermediate[42u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u);
52781
0
    v_intermediate[26u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u);
52782
0
    v_intermediate[34u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u);
52783
0
  }
52784
0
  if (0u == (self->private_data.f_mcu_blocks[0u][11u] |
52785
0
      self->private_data.f_mcu_blocks[0u][19u] |
52786
0
      self->private_data.f_mcu_blocks[0u][27u] |
52787
0
      self->private_data.f_mcu_blocks[0u][35u] |
52788
0
      self->private_data.f_mcu_blocks[0u][43u] |
52789
0
      self->private_data.f_mcu_blocks[0u][51u] |
52790
0
      self->private_data.f_mcu_blocks[0u][59u])) {
52791
0
    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));
52792
0
    v_intermediate[11u] = v_intermediate[3u];
52793
0
    v_intermediate[19u] = v_intermediate[3u];
52794
0
    v_intermediate[27u] = v_intermediate[3u];
52795
0
    v_intermediate[35u] = v_intermediate[3u];
52796
0
    v_intermediate[43u] = v_intermediate[3u];
52797
0
    v_intermediate[51u] = v_intermediate[3u];
52798
0
    v_intermediate[59u] = v_intermediate[3u];
52799
0
  } else {
52800
0
    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]))));
52801
0
    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]))));
52802
0
    v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u));
52803
0
    v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u))));
52804
0
    v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u))));
52805
0
    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]))));
52806
0
    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]))));
52807
0
    v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u));
52808
0
    v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u));
52809
0
    v_cd0 = ((uint32_t)(v_ccp + v_cb2));
52810
0
    v_cd1 = ((uint32_t)(v_ccm + v_cb6));
52811
0
    v_cd2 = ((uint32_t)(v_ccm - v_cb6));
52812
0
    v_cd3 = ((uint32_t)(v_ccp - v_cb2));
52813
0
    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]))));
52814
0
    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]))));
52815
0
    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]))));
52816
0
    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]))));
52817
0
    v_ci51 = ((uint32_t)(v_bq5 + v_bq1));
52818
0
    v_ci53 = ((uint32_t)(v_bq5 + v_bq3));
52819
0
    v_ci71 = ((uint32_t)(v_bq7 + v_bq1));
52820
0
    v_ci73 = ((uint32_t)(v_bq7 + v_bq3));
52821
0
    v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u));
52822
0
    v_ck1 = ((uint32_t)(v_bq1 * 12299u));
52823
0
    v_ck3 = ((uint32_t)(v_bq3 * 25172u));
52824
0
    v_ck5 = ((uint32_t)(v_bq5 * 16819u));
52825
0
    v_ck7 = ((uint32_t)(v_bq7 * 2446u));
52826
0
    v_ci51 *= 4294964100u;
52827
0
    v_ci53 *= 4294946301u;
52828
0
    v_ci71 *= 4294959923u;
52829
0
    v_ci73 *= 4294951227u;
52830
0
    v_cl51 = ((uint32_t)(v_ci51 + v_cj));
52831
0
    v_cl73 = ((uint32_t)(v_ci73 + v_cj));
52832
0
    v_ck1 += ((uint32_t)(v_ci71 + v_cl51));
52833
0
    v_ck3 += ((uint32_t)(v_ci53 + v_cl73));
52834
0
    v_ck5 += ((uint32_t)(v_ci53 + v_cl51));
52835
0
    v_ck7 += ((uint32_t)(v_ci71 + v_cl73));
52836
0
    v_intermediate[3u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u);
52837
0
    v_intermediate[59u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u);
52838
0
    v_intermediate[11u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u);
52839
0
    v_intermediate[51u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u);
52840
0
    v_intermediate[19u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u);
52841
0
    v_intermediate[43u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u);
52842
0
    v_intermediate[27u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u);
52843
0
    v_intermediate[35u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u);
52844
0
  }
52845
0
  if (0u == (self->private_data.f_mcu_blocks[0u][12u] |
52846
0
      self->private_data.f_mcu_blocks[0u][20u] |
52847
0
      self->private_data.f_mcu_blocks[0u][28u] |
52848
0
      self->private_data.f_mcu_blocks[0u][36u] |
52849
0
      self->private_data.f_mcu_blocks[0u][44u] |
52850
0
      self->private_data.f_mcu_blocks[0u][52u] |
52851
0
      self->private_data.f_mcu_blocks[0u][60u])) {
52852
0
    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));
52853
0
    v_intermediate[12u] = v_intermediate[4u];
52854
0
    v_intermediate[20u] = v_intermediate[4u];
52855
0
    v_intermediate[28u] = v_intermediate[4u];
52856
0
    v_intermediate[36u] = v_intermediate[4u];
52857
0
    v_intermediate[44u] = v_intermediate[4u];
52858
0
    v_intermediate[52u] = v_intermediate[4u];
52859
0
    v_intermediate[60u] = v_intermediate[4u];
52860
0
  } else {
52861
0
    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]))));
52862
0
    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]))));
52863
0
    v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u));
52864
0
    v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u))));
52865
0
    v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u))));
52866
0
    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]))));
52867
0
    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]))));
52868
0
    v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u));
52869
0
    v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u));
52870
0
    v_cd0 = ((uint32_t)(v_ccp + v_cb2));
52871
0
    v_cd1 = ((uint32_t)(v_ccm + v_cb6));
52872
0
    v_cd2 = ((uint32_t)(v_ccm - v_cb6));
52873
0
    v_cd3 = ((uint32_t)(v_ccp - v_cb2));
52874
0
    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]))));
52875
0
    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]))));
52876
0
    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]))));
52877
0
    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]))));
52878
0
    v_ci51 = ((uint32_t)(v_bq5 + v_bq1));
52879
0
    v_ci53 = ((uint32_t)(v_bq5 + v_bq3));
52880
0
    v_ci71 = ((uint32_t)(v_bq7 + v_bq1));
52881
0
    v_ci73 = ((uint32_t)(v_bq7 + v_bq3));
52882
0
    v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u));
52883
0
    v_ck1 = ((uint32_t)(v_bq1 * 12299u));
52884
0
    v_ck3 = ((uint32_t)(v_bq3 * 25172u));
52885
0
    v_ck5 = ((uint32_t)(v_bq5 * 16819u));
52886
0
    v_ck7 = ((uint32_t)(v_bq7 * 2446u));
52887
0
    v_ci51 *= 4294964100u;
52888
0
    v_ci53 *= 4294946301u;
52889
0
    v_ci71 *= 4294959923u;
52890
0
    v_ci73 *= 4294951227u;
52891
0
    v_cl51 = ((uint32_t)(v_ci51 + v_cj));
52892
0
    v_cl73 = ((uint32_t)(v_ci73 + v_cj));
52893
0
    v_ck1 += ((uint32_t)(v_ci71 + v_cl51));
52894
0
    v_ck3 += ((uint32_t)(v_ci53 + v_cl73));
52895
0
    v_ck5 += ((uint32_t)(v_ci53 + v_cl51));
52896
0
    v_ck7 += ((uint32_t)(v_ci71 + v_cl73));
52897
0
    v_intermediate[4u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u);
52898
0
    v_intermediate[60u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u);
52899
0
    v_intermediate[12u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u);
52900
0
    v_intermediate[52u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u);
52901
0
    v_intermediate[20u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u);
52902
0
    v_intermediate[44u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u);
52903
0
    v_intermediate[28u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u);
52904
0
    v_intermediate[36u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u);
52905
0
  }
52906
0
  if (0u == (self->private_data.f_mcu_blocks[0u][13u] |
52907
0
      self->private_data.f_mcu_blocks[0u][21u] |
52908
0
      self->private_data.f_mcu_blocks[0u][29u] |
52909
0
      self->private_data.f_mcu_blocks[0u][37u] |
52910
0
      self->private_data.f_mcu_blocks[0u][45u] |
52911
0
      self->private_data.f_mcu_blocks[0u][53u] |
52912
0
      self->private_data.f_mcu_blocks[0u][61u])) {
52913
0
    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));
52914
0
    v_intermediate[13u] = v_intermediate[5u];
52915
0
    v_intermediate[21u] = v_intermediate[5u];
52916
0
    v_intermediate[29u] = v_intermediate[5u];
52917
0
    v_intermediate[37u] = v_intermediate[5u];
52918
0
    v_intermediate[45u] = v_intermediate[5u];
52919
0
    v_intermediate[53u] = v_intermediate[5u];
52920
0
    v_intermediate[61u] = v_intermediate[5u];
52921
0
  } else {
52922
0
    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]))));
52923
0
    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]))));
52924
0
    v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u));
52925
0
    v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u))));
52926
0
    v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u))));
52927
0
    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]))));
52928
0
    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]))));
52929
0
    v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u));
52930
0
    v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u));
52931
0
    v_cd0 = ((uint32_t)(v_ccp + v_cb2));
52932
0
    v_cd1 = ((uint32_t)(v_ccm + v_cb6));
52933
0
    v_cd2 = ((uint32_t)(v_ccm - v_cb6));
52934
0
    v_cd3 = ((uint32_t)(v_ccp - v_cb2));
52935
0
    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]))));
52936
0
    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]))));
52937
0
    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]))));
52938
0
    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]))));
52939
0
    v_ci51 = ((uint32_t)(v_bq5 + v_bq1));
52940
0
    v_ci53 = ((uint32_t)(v_bq5 + v_bq3));
52941
0
    v_ci71 = ((uint32_t)(v_bq7 + v_bq1));
52942
0
    v_ci73 = ((uint32_t)(v_bq7 + v_bq3));
52943
0
    v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u));
52944
0
    v_ck1 = ((uint32_t)(v_bq1 * 12299u));
52945
0
    v_ck3 = ((uint32_t)(v_bq3 * 25172u));
52946
0
    v_ck5 = ((uint32_t)(v_bq5 * 16819u));
52947
0
    v_ck7 = ((uint32_t)(v_bq7 * 2446u));
52948
0
    v_ci51 *= 4294964100u;
52949
0
    v_ci53 *= 4294946301u;
52950
0
    v_ci71 *= 4294959923u;
52951
0
    v_ci73 *= 4294951227u;
52952
0
    v_cl51 = ((uint32_t)(v_ci51 + v_cj));
52953
0
    v_cl73 = ((uint32_t)(v_ci73 + v_cj));
52954
0
    v_ck1 += ((uint32_t)(v_ci71 + v_cl51));
52955
0
    v_ck3 += ((uint32_t)(v_ci53 + v_cl73));
52956
0
    v_ck5 += ((uint32_t)(v_ci53 + v_cl51));
52957
0
    v_ck7 += ((uint32_t)(v_ci71 + v_cl73));
52958
0
    v_intermediate[5u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u);
52959
0
    v_intermediate[61u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u);
52960
0
    v_intermediate[13u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u);
52961
0
    v_intermediate[53u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u);
52962
0
    v_intermediate[21u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u);
52963
0
    v_intermediate[45u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u);
52964
0
    v_intermediate[29u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u);
52965
0
    v_intermediate[37u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u);
52966
0
  }
52967
0
  if (0u == (self->private_data.f_mcu_blocks[0u][14u] |
52968
0
      self->private_data.f_mcu_blocks[0u][22u] |
52969
0
      self->private_data.f_mcu_blocks[0u][30u] |
52970
0
      self->private_data.f_mcu_blocks[0u][38u] |
52971
0
      self->private_data.f_mcu_blocks[0u][46u] |
52972
0
      self->private_data.f_mcu_blocks[0u][54u] |
52973
0
      self->private_data.f_mcu_blocks[0u][62u])) {
52974
0
    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));
52975
0
    v_intermediate[14u] = v_intermediate[6u];
52976
0
    v_intermediate[22u] = v_intermediate[6u];
52977
0
    v_intermediate[30u] = v_intermediate[6u];
52978
0
    v_intermediate[38u] = v_intermediate[6u];
52979
0
    v_intermediate[46u] = v_intermediate[6u];
52980
0
    v_intermediate[54u] = v_intermediate[6u];
52981
0
    v_intermediate[62u] = v_intermediate[6u];
52982
0
  } else {
52983
0
    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]))));
52984
0
    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]))));
52985
0
    v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u));
52986
0
    v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u))));
52987
0
    v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u))));
52988
0
    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]))));
52989
0
    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]))));
52990
0
    v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u));
52991
0
    v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u));
52992
0
    v_cd0 = ((uint32_t)(v_ccp + v_cb2));
52993
0
    v_cd1 = ((uint32_t)(v_ccm + v_cb6));
52994
0
    v_cd2 = ((uint32_t)(v_ccm - v_cb6));
52995
0
    v_cd3 = ((uint32_t)(v_ccp - v_cb2));
52996
0
    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]))));
52997
0
    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]))));
52998
0
    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]))));
52999
0
    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]))));
53000
0
    v_ci51 = ((uint32_t)(v_bq5 + v_bq1));
53001
0
    v_ci53 = ((uint32_t)(v_bq5 + v_bq3));
53002
0
    v_ci71 = ((uint32_t)(v_bq7 + v_bq1));
53003
0
    v_ci73 = ((uint32_t)(v_bq7 + v_bq3));
53004
0
    v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u));
53005
0
    v_ck1 = ((uint32_t)(v_bq1 * 12299u));
53006
0
    v_ck3 = ((uint32_t)(v_bq3 * 25172u));
53007
0
    v_ck5 = ((uint32_t)(v_bq5 * 16819u));
53008
0
    v_ck7 = ((uint32_t)(v_bq7 * 2446u));
53009
0
    v_ci51 *= 4294964100u;
53010
0
    v_ci53 *= 4294946301u;
53011
0
    v_ci71 *= 4294959923u;
53012
0
    v_ci73 *= 4294951227u;
53013
0
    v_cl51 = ((uint32_t)(v_ci51 + v_cj));
53014
0
    v_cl73 = ((uint32_t)(v_ci73 + v_cj));
53015
0
    v_ck1 += ((uint32_t)(v_ci71 + v_cl51));
53016
0
    v_ck3 += ((uint32_t)(v_ci53 + v_cl73));
53017
0
    v_ck5 += ((uint32_t)(v_ci53 + v_cl51));
53018
0
    v_ck7 += ((uint32_t)(v_ci71 + v_cl73));
53019
0
    v_intermediate[6u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u);
53020
0
    v_intermediate[62u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u);
53021
0
    v_intermediate[14u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u);
53022
0
    v_intermediate[54u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u);
53023
0
    v_intermediate[22u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u);
53024
0
    v_intermediate[46u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u);
53025
0
    v_intermediate[30u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u);
53026
0
    v_intermediate[38u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u);
53027
0
  }
53028
0
  if (0u == (self->private_data.f_mcu_blocks[0u][15u] |
53029
0
      self->private_data.f_mcu_blocks[0u][23u] |
53030
0
      self->private_data.f_mcu_blocks[0u][31u] |
53031
0
      self->private_data.f_mcu_blocks[0u][39u] |
53032
0
      self->private_data.f_mcu_blocks[0u][47u] |
53033
0
      self->private_data.f_mcu_blocks[0u][55u] |
53034
0
      self->private_data.f_mcu_blocks[0u][63u])) {
53035
0
    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));
53036
0
    v_intermediate[15u] = v_intermediate[7u];
53037
0
    v_intermediate[23u] = v_intermediate[7u];
53038
0
    v_intermediate[31u] = v_intermediate[7u];
53039
0
    v_intermediate[39u] = v_intermediate[7u];
53040
0
    v_intermediate[47u] = v_intermediate[7u];
53041
0
    v_intermediate[55u] = v_intermediate[7u];
53042
0
    v_intermediate[63u] = v_intermediate[7u];
53043
0
  } else {
53044
0
    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]))));
53045
0
    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]))));
53046
0
    v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u));
53047
0
    v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u))));
53048
0
    v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u))));
53049
0
    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]))));
53050
0
    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]))));
53051
0
    v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u));
53052
0
    v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u));
53053
0
    v_cd0 = ((uint32_t)(v_ccp + v_cb2));
53054
0
    v_cd1 = ((uint32_t)(v_ccm + v_cb6));
53055
0
    v_cd2 = ((uint32_t)(v_ccm - v_cb6));
53056
0
    v_cd3 = ((uint32_t)(v_ccp - v_cb2));
53057
0
    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]))));
53058
0
    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]))));
53059
0
    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]))));
53060
0
    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]))));
53061
0
    v_ci51 = ((uint32_t)(v_bq5 + v_bq1));
53062
0
    v_ci53 = ((uint32_t)(v_bq5 + v_bq3));
53063
0
    v_ci71 = ((uint32_t)(v_bq7 + v_bq1));
53064
0
    v_ci73 = ((uint32_t)(v_bq7 + v_bq3));
53065
0
    v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u));
53066
0
    v_ck1 = ((uint32_t)(v_bq1 * 12299u));
53067
0
    v_ck3 = ((uint32_t)(v_bq3 * 25172u));
53068
0
    v_ck5 = ((uint32_t)(v_bq5 * 16819u));
53069
0
    v_ck7 = ((uint32_t)(v_bq7 * 2446u));
53070
0
    v_ci51 *= 4294964100u;
53071
0
    v_ci53 *= 4294946301u;
53072
0
    v_ci71 *= 4294959923u;
53073
0
    v_ci73 *= 4294951227u;
53074
0
    v_cl51 = ((uint32_t)(v_ci51 + v_cj));
53075
0
    v_cl73 = ((uint32_t)(v_ci73 + v_cj));
53076
0
    v_ck1 += ((uint32_t)(v_ci71 + v_cl51));
53077
0
    v_ck3 += ((uint32_t)(v_ci53 + v_cl73));
53078
0
    v_ck5 += ((uint32_t)(v_ci53 + v_cl51));
53079
0
    v_ck7 += ((uint32_t)(v_ci71 + v_cl73));
53080
0
    v_intermediate[7u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u);
53081
0
    v_intermediate[63u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u);
53082
0
    v_intermediate[15u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u);
53083
0
    v_intermediate[55u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u);
53084
0
    v_intermediate[23u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u);
53085
0
    v_intermediate[47u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u);
53086
0
    v_intermediate[31u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u);
53087
0
    v_intermediate[39u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u);
53088
0
  }
53089
0
  if (0u == (v_intermediate[1u] |
53090
0
      v_intermediate[2u] |
53091
0
      v_intermediate[3u] |
53092
0
      v_intermediate[4u] |
53093
0
      v_intermediate[5u] |
53094
0
      v_intermediate[6u] |
53095
0
      v_intermediate[7u])) {
53096
0
    if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
53097
0
      return wuffs_base__make_empty_struct();
53098
0
    }
53099
0
    a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[0u] + 16u)) >> 5u) & 1023u)];
53100
0
    a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u];
53101
0
    a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u];
53102
0
    a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u];
53103
0
    a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u];
53104
0
    a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u];
53105
0
    a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u];
53106
0
    a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u];
53107
0
    a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
53108
0
  } else {
53109
0
    v_in2 = v_intermediate[2u];
53110
0
    v_in6 = v_intermediate[6u];
53111
0
    v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u));
53112
0
    v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u))));
53113
0
    v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u))));
53114
0
    v_in0 = v_intermediate[0u];
53115
0
    v_in4 = v_intermediate[4u];
53116
0
    v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u));
53117
0
    v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u));
53118
0
    v_rd0 = ((uint32_t)(v_rcp + v_rb2));
53119
0
    v_rd1 = ((uint32_t)(v_rcm + v_rb6));
53120
0
    v_rd2 = ((uint32_t)(v_rcm - v_rb6));
53121
0
    v_rd3 = ((uint32_t)(v_rcp - v_rb2));
53122
0
    v_in1 = v_intermediate[1u];
53123
0
    v_in3 = v_intermediate[3u];
53124
0
    v_in5 = v_intermediate[5u];
53125
0
    v_in7 = v_intermediate[7u];
53126
0
    v_ri51 = ((uint32_t)(v_in5 + v_in1));
53127
0
    v_ri53 = ((uint32_t)(v_in5 + v_in3));
53128
0
    v_ri71 = ((uint32_t)(v_in7 + v_in1));
53129
0
    v_ri73 = ((uint32_t)(v_in7 + v_in3));
53130
0
    v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u));
53131
0
    v_rk1 = ((uint32_t)(v_in1 * 12299u));
53132
0
    v_rk3 = ((uint32_t)(v_in3 * 25172u));
53133
0
    v_rk5 = ((uint32_t)(v_in5 * 16819u));
53134
0
    v_rk7 = ((uint32_t)(v_in7 * 2446u));
53135
0
    v_ri51 *= 4294964100u;
53136
0
    v_ri53 *= 4294946301u;
53137
0
    v_ri71 *= 4294959923u;
53138
0
    v_ri73 *= 4294951227u;
53139
0
    v_rl51 = ((uint32_t)(v_ri51 + v_rj));
53140
0
    v_rl73 = ((uint32_t)(v_ri73 + v_rj));
53141
0
    v_rk1 += ((uint32_t)(v_ri71 + v_rl51));
53142
0
    v_rk3 += ((uint32_t)(v_ri53 + v_rl73));
53143
0
    v_rk5 += ((uint32_t)(v_ri53 + v_rl51));
53144
0
    v_rk7 += ((uint32_t)(v_ri71 + v_rl73));
53145
0
    if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
53146
0
      return wuffs_base__make_empty_struct();
53147
0
    }
53148
0
    a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)];
53149
0
    a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)];
53150
0
    a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)];
53151
0
    a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)];
53152
0
    a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)];
53153
0
    a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)];
53154
0
    a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)];
53155
0
    a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)];
53156
0
    a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
53157
0
  }
53158
0
  if (0u == (v_intermediate[9u] |
53159
0
      v_intermediate[10u] |
53160
0
      v_intermediate[11u] |
53161
0
      v_intermediate[12u] |
53162
0
      v_intermediate[13u] |
53163
0
      v_intermediate[14u] |
53164
0
      v_intermediate[15u])) {
53165
0
    if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
53166
0
      return wuffs_base__make_empty_struct();
53167
0
    }
53168
0
    a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[8u] + 16u)) >> 5u) & 1023u)];
53169
0
    a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u];
53170
0
    a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u];
53171
0
    a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u];
53172
0
    a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u];
53173
0
    a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u];
53174
0
    a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u];
53175
0
    a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u];
53176
0
    a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
53177
0
  } else {
53178
0
    v_in2 = v_intermediate[10u];
53179
0
    v_in6 = v_intermediate[14u];
53180
0
    v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u));
53181
0
    v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u))));
53182
0
    v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u))));
53183
0
    v_in0 = v_intermediate[8u];
53184
0
    v_in4 = v_intermediate[12u];
53185
0
    v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u));
53186
0
    v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u));
53187
0
    v_rd0 = ((uint32_t)(v_rcp + v_rb2));
53188
0
    v_rd1 = ((uint32_t)(v_rcm + v_rb6));
53189
0
    v_rd2 = ((uint32_t)(v_rcm - v_rb6));
53190
0
    v_rd3 = ((uint32_t)(v_rcp - v_rb2));
53191
0
    v_in1 = v_intermediate[9u];
53192
0
    v_in3 = v_intermediate[11u];
53193
0
    v_in5 = v_intermediate[13u];
53194
0
    v_in7 = v_intermediate[15u];
53195
0
    v_ri51 = ((uint32_t)(v_in5 + v_in1));
53196
0
    v_ri53 = ((uint32_t)(v_in5 + v_in3));
53197
0
    v_ri71 = ((uint32_t)(v_in7 + v_in1));
53198
0
    v_ri73 = ((uint32_t)(v_in7 + v_in3));
53199
0
    v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u));
53200
0
    v_rk1 = ((uint32_t)(v_in1 * 12299u));
53201
0
    v_rk3 = ((uint32_t)(v_in3 * 25172u));
53202
0
    v_rk5 = ((uint32_t)(v_in5 * 16819u));
53203
0
    v_rk7 = ((uint32_t)(v_in7 * 2446u));
53204
0
    v_ri51 *= 4294964100u;
53205
0
    v_ri53 *= 4294946301u;
53206
0
    v_ri71 *= 4294959923u;
53207
0
    v_ri73 *= 4294951227u;
53208
0
    v_rl51 = ((uint32_t)(v_ri51 + v_rj));
53209
0
    v_rl73 = ((uint32_t)(v_ri73 + v_rj));
53210
0
    v_rk1 += ((uint32_t)(v_ri71 + v_rl51));
53211
0
    v_rk3 += ((uint32_t)(v_ri53 + v_rl73));
53212
0
    v_rk5 += ((uint32_t)(v_ri53 + v_rl51));
53213
0
    v_rk7 += ((uint32_t)(v_ri71 + v_rl73));
53214
0
    if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
53215
0
      return wuffs_base__make_empty_struct();
53216
0
    }
53217
0
    a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)];
53218
0
    a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)];
53219
0
    a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)];
53220
0
    a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)];
53221
0
    a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)];
53222
0
    a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)];
53223
0
    a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)];
53224
0
    a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)];
53225
0
    a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
53226
0
  }
53227
0
  if (0u == (v_intermediate[17u] |
53228
0
      v_intermediate[18u] |
53229
0
      v_intermediate[19u] |
53230
0
      v_intermediate[20u] |
53231
0
      v_intermediate[21u] |
53232
0
      v_intermediate[22u] |
53233
0
      v_intermediate[23u])) {
53234
0
    if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
53235
0
      return wuffs_base__make_empty_struct();
53236
0
    }
53237
0
    a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[16u] + 16u)) >> 5u) & 1023u)];
53238
0
    a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u];
53239
0
    a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u];
53240
0
    a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u];
53241
0
    a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u];
53242
0
    a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u];
53243
0
    a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u];
53244
0
    a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u];
53245
0
    a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
53246
0
  } else {
53247
0
    v_in2 = v_intermediate[18u];
53248
0
    v_in6 = v_intermediate[22u];
53249
0
    v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u));
53250
0
    v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u))));
53251
0
    v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u))));
53252
0
    v_in0 = v_intermediate[16u];
53253
0
    v_in4 = v_intermediate[20u];
53254
0
    v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u));
53255
0
    v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u));
53256
0
    v_rd0 = ((uint32_t)(v_rcp + v_rb2));
53257
0
    v_rd1 = ((uint32_t)(v_rcm + v_rb6));
53258
0
    v_rd2 = ((uint32_t)(v_rcm - v_rb6));
53259
0
    v_rd3 = ((uint32_t)(v_rcp - v_rb2));
53260
0
    v_in1 = v_intermediate[17u];
53261
0
    v_in3 = v_intermediate[19u];
53262
0
    v_in5 = v_intermediate[21u];
53263
0
    v_in7 = v_intermediate[23u];
53264
0
    v_ri51 = ((uint32_t)(v_in5 + v_in1));
53265
0
    v_ri53 = ((uint32_t)(v_in5 + v_in3));
53266
0
    v_ri71 = ((uint32_t)(v_in7 + v_in1));
53267
0
    v_ri73 = ((uint32_t)(v_in7 + v_in3));
53268
0
    v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u));
53269
0
    v_rk1 = ((uint32_t)(v_in1 * 12299u));
53270
0
    v_rk3 = ((uint32_t)(v_in3 * 25172u));
53271
0
    v_rk5 = ((uint32_t)(v_in5 * 16819u));
53272
0
    v_rk7 = ((uint32_t)(v_in7 * 2446u));
53273
0
    v_ri51 *= 4294964100u;
53274
0
    v_ri53 *= 4294946301u;
53275
0
    v_ri71 *= 4294959923u;
53276
0
    v_ri73 *= 4294951227u;
53277
0
    v_rl51 = ((uint32_t)(v_ri51 + v_rj));
53278
0
    v_rl73 = ((uint32_t)(v_ri73 + v_rj));
53279
0
    v_rk1 += ((uint32_t)(v_ri71 + v_rl51));
53280
0
    v_rk3 += ((uint32_t)(v_ri53 + v_rl73));
53281
0
    v_rk5 += ((uint32_t)(v_ri53 + v_rl51));
53282
0
    v_rk7 += ((uint32_t)(v_ri71 + v_rl73));
53283
0
    if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
53284
0
      return wuffs_base__make_empty_struct();
53285
0
    }
53286
0
    a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)];
53287
0
    a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)];
53288
0
    a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)];
53289
0
    a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)];
53290
0
    a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)];
53291
0
    a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)];
53292
0
    a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)];
53293
0
    a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)];
53294
0
    a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
53295
0
  }
53296
0
  if (0u == (v_intermediate[25u] |
53297
0
      v_intermediate[26u] |
53298
0
      v_intermediate[27u] |
53299
0
      v_intermediate[28u] |
53300
0
      v_intermediate[29u] |
53301
0
      v_intermediate[30u] |
53302
0
      v_intermediate[31u])) {
53303
0
    if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
53304
0
      return wuffs_base__make_empty_struct();
53305
0
    }
53306
0
    a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[24u] + 16u)) >> 5u) & 1023u)];
53307
0
    a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u];
53308
0
    a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u];
53309
0
    a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u];
53310
0
    a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u];
53311
0
    a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u];
53312
0
    a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u];
53313
0
    a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u];
53314
0
    a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
53315
0
  } else {
53316
0
    v_in2 = v_intermediate[26u];
53317
0
    v_in6 = v_intermediate[30u];
53318
0
    v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u));
53319
0
    v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u))));
53320
0
    v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u))));
53321
0
    v_in0 = v_intermediate[24u];
53322
0
    v_in4 = v_intermediate[28u];
53323
0
    v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u));
53324
0
    v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u));
53325
0
    v_rd0 = ((uint32_t)(v_rcp + v_rb2));
53326
0
    v_rd1 = ((uint32_t)(v_rcm + v_rb6));
53327
0
    v_rd2 = ((uint32_t)(v_rcm - v_rb6));
53328
0
    v_rd3 = ((uint32_t)(v_rcp - v_rb2));
53329
0
    v_in1 = v_intermediate[25u];
53330
0
    v_in3 = v_intermediate[27u];
53331
0
    v_in5 = v_intermediate[29u];
53332
0
    v_in7 = v_intermediate[31u];
53333
0
    v_ri51 = ((uint32_t)(v_in5 + v_in1));
53334
0
    v_ri53 = ((uint32_t)(v_in5 + v_in3));
53335
0
    v_ri71 = ((uint32_t)(v_in7 + v_in1));
53336
0
    v_ri73 = ((uint32_t)(v_in7 + v_in3));
53337
0
    v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u));
53338
0
    v_rk1 = ((uint32_t)(v_in1 * 12299u));
53339
0
    v_rk3 = ((uint32_t)(v_in3 * 25172u));
53340
0
    v_rk5 = ((uint32_t)(v_in5 * 16819u));
53341
0
    v_rk7 = ((uint32_t)(v_in7 * 2446u));
53342
0
    v_ri51 *= 4294964100u;
53343
0
    v_ri53 *= 4294946301u;
53344
0
    v_ri71 *= 4294959923u;
53345
0
    v_ri73 *= 4294951227u;
53346
0
    v_rl51 = ((uint32_t)(v_ri51 + v_rj));
53347
0
    v_rl73 = ((uint32_t)(v_ri73 + v_rj));
53348
0
    v_rk1 += ((uint32_t)(v_ri71 + v_rl51));
53349
0
    v_rk3 += ((uint32_t)(v_ri53 + v_rl73));
53350
0
    v_rk5 += ((uint32_t)(v_ri53 + v_rl51));
53351
0
    v_rk7 += ((uint32_t)(v_ri71 + v_rl73));
53352
0
    if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
53353
0
      return wuffs_base__make_empty_struct();
53354
0
    }
53355
0
    a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)];
53356
0
    a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)];
53357
0
    a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)];
53358
0
    a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)];
53359
0
    a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)];
53360
0
    a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)];
53361
0
    a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)];
53362
0
    a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)];
53363
0
    a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
53364
0
  }
53365
0
  if (0u == (v_intermediate[33u] |
53366
0
      v_intermediate[34u] |
53367
0
      v_intermediate[35u] |
53368
0
      v_intermediate[36u] |
53369
0
      v_intermediate[37u] |
53370
0
      v_intermediate[38u] |
53371
0
      v_intermediate[39u])) {
53372
0
    if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
53373
0
      return wuffs_base__make_empty_struct();
53374
0
    }
53375
0
    a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[32u] + 16u)) >> 5u) & 1023u)];
53376
0
    a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u];
53377
0
    a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u];
53378
0
    a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u];
53379
0
    a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u];
53380
0
    a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u];
53381
0
    a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u];
53382
0
    a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u];
53383
0
    a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
53384
0
  } else {
53385
0
    v_in2 = v_intermediate[34u];
53386
0
    v_in6 = v_intermediate[38u];
53387
0
    v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u));
53388
0
    v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u))));
53389
0
    v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u))));
53390
0
    v_in0 = v_intermediate[32u];
53391
0
    v_in4 = v_intermediate[36u];
53392
0
    v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u));
53393
0
    v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u));
53394
0
    v_rd0 = ((uint32_t)(v_rcp + v_rb2));
53395
0
    v_rd1 = ((uint32_t)(v_rcm + v_rb6));
53396
0
    v_rd2 = ((uint32_t)(v_rcm - v_rb6));
53397
0
    v_rd3 = ((uint32_t)(v_rcp - v_rb2));
53398
0
    v_in1 = v_intermediate[33u];
53399
0
    v_in3 = v_intermediate[35u];
53400
0
    v_in5 = v_intermediate[37u];
53401
0
    v_in7 = v_intermediate[39u];
53402
0
    v_ri51 = ((uint32_t)(v_in5 + v_in1));
53403
0
    v_ri53 = ((uint32_t)(v_in5 + v_in3));
53404
0
    v_ri71 = ((uint32_t)(v_in7 + v_in1));
53405
0
    v_ri73 = ((uint32_t)(v_in7 + v_in3));
53406
0
    v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u));
53407
0
    v_rk1 = ((uint32_t)(v_in1 * 12299u));
53408
0
    v_rk3 = ((uint32_t)(v_in3 * 25172u));
53409
0
    v_rk5 = ((uint32_t)(v_in5 * 16819u));
53410
0
    v_rk7 = ((uint32_t)(v_in7 * 2446u));
53411
0
    v_ri51 *= 4294964100u;
53412
0
    v_ri53 *= 4294946301u;
53413
0
    v_ri71 *= 4294959923u;
53414
0
    v_ri73 *= 4294951227u;
53415
0
    v_rl51 = ((uint32_t)(v_ri51 + v_rj));
53416
0
    v_rl73 = ((uint32_t)(v_ri73 + v_rj));
53417
0
    v_rk1 += ((uint32_t)(v_ri71 + v_rl51));
53418
0
    v_rk3 += ((uint32_t)(v_ri53 + v_rl73));
53419
0
    v_rk5 += ((uint32_t)(v_ri53 + v_rl51));
53420
0
    v_rk7 += ((uint32_t)(v_ri71 + v_rl73));
53421
0
    if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
53422
0
      return wuffs_base__make_empty_struct();
53423
0
    }
53424
0
    a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)];
53425
0
    a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)];
53426
0
    a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)];
53427
0
    a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)];
53428
0
    a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)];
53429
0
    a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)];
53430
0
    a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)];
53431
0
    a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)];
53432
0
    a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
53433
0
  }
53434
0
  if (0u == (v_intermediate[41u] |
53435
0
      v_intermediate[42u] |
53436
0
      v_intermediate[43u] |
53437
0
      v_intermediate[44u] |
53438
0
      v_intermediate[45u] |
53439
0
      v_intermediate[46u] |
53440
0
      v_intermediate[47u])) {
53441
0
    if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
53442
0
      return wuffs_base__make_empty_struct();
53443
0
    }
53444
0
    a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[40u] + 16u)) >> 5u) & 1023u)];
53445
0
    a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u];
53446
0
    a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u];
53447
0
    a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u];
53448
0
    a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u];
53449
0
    a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u];
53450
0
    a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u];
53451
0
    a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u];
53452
0
    a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
53453
0
  } else {
53454
0
    v_in2 = v_intermediate[42u];
53455
0
    v_in6 = v_intermediate[46u];
53456
0
    v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u));
53457
0
    v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u))));
53458
0
    v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u))));
53459
0
    v_in0 = v_intermediate[40u];
53460
0
    v_in4 = v_intermediate[44u];
53461
0
    v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u));
53462
0
    v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u));
53463
0
    v_rd0 = ((uint32_t)(v_rcp + v_rb2));
53464
0
    v_rd1 = ((uint32_t)(v_rcm + v_rb6));
53465
0
    v_rd2 = ((uint32_t)(v_rcm - v_rb6));
53466
0
    v_rd3 = ((uint32_t)(v_rcp - v_rb2));
53467
0
    v_in1 = v_intermediate[41u];
53468
0
    v_in3 = v_intermediate[43u];
53469
0
    v_in5 = v_intermediate[45u];
53470
0
    v_in7 = v_intermediate[47u];
53471
0
    v_ri51 = ((uint32_t)(v_in5 + v_in1));
53472
0
    v_ri53 = ((uint32_t)(v_in5 + v_in3));
53473
0
    v_ri71 = ((uint32_t)(v_in7 + v_in1));
53474
0
    v_ri73 = ((uint32_t)(v_in7 + v_in3));
53475
0
    v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u));
53476
0
    v_rk1 = ((uint32_t)(v_in1 * 12299u));
53477
0
    v_rk3 = ((uint32_t)(v_in3 * 25172u));
53478
0
    v_rk5 = ((uint32_t)(v_in5 * 16819u));
53479
0
    v_rk7 = ((uint32_t)(v_in7 * 2446u));
53480
0
    v_ri51 *= 4294964100u;
53481
0
    v_ri53 *= 4294946301u;
53482
0
    v_ri71 *= 4294959923u;
53483
0
    v_ri73 *= 4294951227u;
53484
0
    v_rl51 = ((uint32_t)(v_ri51 + v_rj));
53485
0
    v_rl73 = ((uint32_t)(v_ri73 + v_rj));
53486
0
    v_rk1 += ((uint32_t)(v_ri71 + v_rl51));
53487
0
    v_rk3 += ((uint32_t)(v_ri53 + v_rl73));
53488
0
    v_rk5 += ((uint32_t)(v_ri53 + v_rl51));
53489
0
    v_rk7 += ((uint32_t)(v_ri71 + v_rl73));
53490
0
    if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
53491
0
      return wuffs_base__make_empty_struct();
53492
0
    }
53493
0
    a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)];
53494
0
    a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)];
53495
0
    a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)];
53496
0
    a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)];
53497
0
    a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)];
53498
0
    a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)];
53499
0
    a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)];
53500
0
    a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)];
53501
0
    a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
53502
0
  }
53503
0
  if (0u == (v_intermediate[49u] |
53504
0
      v_intermediate[50u] |
53505
0
      v_intermediate[51u] |
53506
0
      v_intermediate[52u] |
53507
0
      v_intermediate[53u] |
53508
0
      v_intermediate[54u] |
53509
0
      v_intermediate[55u])) {
53510
0
    if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
53511
0
      return wuffs_base__make_empty_struct();
53512
0
    }
53513
0
    a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[48u] + 16u)) >> 5u) & 1023u)];
53514
0
    a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u];
53515
0
    a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u];
53516
0
    a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u];
53517
0
    a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u];
53518
0
    a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u];
53519
0
    a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u];
53520
0
    a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u];
53521
0
    a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
53522
0
  } else {
53523
0
    v_in2 = v_intermediate[50u];
53524
0
    v_in6 = v_intermediate[54u];
53525
0
    v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u));
53526
0
    v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u))));
53527
0
    v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u))));
53528
0
    v_in0 = v_intermediate[48u];
53529
0
    v_in4 = v_intermediate[52u];
53530
0
    v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u));
53531
0
    v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u));
53532
0
    v_rd0 = ((uint32_t)(v_rcp + v_rb2));
53533
0
    v_rd1 = ((uint32_t)(v_rcm + v_rb6));
53534
0
    v_rd2 = ((uint32_t)(v_rcm - v_rb6));
53535
0
    v_rd3 = ((uint32_t)(v_rcp - v_rb2));
53536
0
    v_in1 = v_intermediate[49u];
53537
0
    v_in3 = v_intermediate[51u];
53538
0
    v_in5 = v_intermediate[53u];
53539
0
    v_in7 = v_intermediate[55u];
53540
0
    v_ri51 = ((uint32_t)(v_in5 + v_in1));
53541
0
    v_ri53 = ((uint32_t)(v_in5 + v_in3));
53542
0
    v_ri71 = ((uint32_t)(v_in7 + v_in1));
53543
0
    v_ri73 = ((uint32_t)(v_in7 + v_in3));
53544
0
    v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u));
53545
0
    v_rk1 = ((uint32_t)(v_in1 * 12299u));
53546
0
    v_rk3 = ((uint32_t)(v_in3 * 25172u));
53547
0
    v_rk5 = ((uint32_t)(v_in5 * 16819u));
53548
0
    v_rk7 = ((uint32_t)(v_in7 * 2446u));
53549
0
    v_ri51 *= 4294964100u;
53550
0
    v_ri53 *= 4294946301u;
53551
0
    v_ri71 *= 4294959923u;
53552
0
    v_ri73 *= 4294951227u;
53553
0
    v_rl51 = ((uint32_t)(v_ri51 + v_rj));
53554
0
    v_rl73 = ((uint32_t)(v_ri73 + v_rj));
53555
0
    v_rk1 += ((uint32_t)(v_ri71 + v_rl51));
53556
0
    v_rk3 += ((uint32_t)(v_ri53 + v_rl73));
53557
0
    v_rk5 += ((uint32_t)(v_ri53 + v_rl51));
53558
0
    v_rk7 += ((uint32_t)(v_ri71 + v_rl73));
53559
0
    if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
53560
0
      return wuffs_base__make_empty_struct();
53561
0
    }
53562
0
    a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)];
53563
0
    a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)];
53564
0
    a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)];
53565
0
    a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)];
53566
0
    a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)];
53567
0
    a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)];
53568
0
    a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)];
53569
0
    a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)];
53570
0
    a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
53571
0
  }
53572
0
  if (0u == (v_intermediate[57u] |
53573
0
      v_intermediate[58u] |
53574
0
      v_intermediate[59u] |
53575
0
      v_intermediate[60u] |
53576
0
      v_intermediate[61u] |
53577
0
      v_intermediate[62u] |
53578
0
      v_intermediate[63u])) {
53579
0
    if (8u > ((uint64_t)(a_dst_buffer.len))) {
53580
0
      return wuffs_base__make_empty_struct();
53581
0
    }
53582
0
    a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[56u] + 16u)) >> 5u) & 1023u)];
53583
0
    a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u];
53584
0
    a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u];
53585
0
    a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u];
53586
0
    a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u];
53587
0
    a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u];
53588
0
    a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u];
53589
0
    a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u];
53590
0
  } else {
53591
0
    v_in2 = v_intermediate[58u];
53592
0
    v_in6 = v_intermediate[62u];
53593
0
    v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u));
53594
0
    v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u))));
53595
0
    v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u))));
53596
0
    v_in0 = v_intermediate[56u];
53597
0
    v_in4 = v_intermediate[60u];
53598
0
    v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u));
53599
0
    v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u));
53600
0
    v_rd0 = ((uint32_t)(v_rcp + v_rb2));
53601
0
    v_rd1 = ((uint32_t)(v_rcm + v_rb6));
53602
0
    v_rd2 = ((uint32_t)(v_rcm - v_rb6));
53603
0
    v_rd3 = ((uint32_t)(v_rcp - v_rb2));
53604
0
    v_in1 = v_intermediate[57u];
53605
0
    v_in3 = v_intermediate[59u];
53606
0
    v_in5 = v_intermediate[61u];
53607
0
    v_in7 = v_intermediate[63u];
53608
0
    v_ri51 = ((uint32_t)(v_in5 + v_in1));
53609
0
    v_ri53 = ((uint32_t)(v_in5 + v_in3));
53610
0
    v_ri71 = ((uint32_t)(v_in7 + v_in1));
53611
0
    v_ri73 = ((uint32_t)(v_in7 + v_in3));
53612
0
    v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u));
53613
0
    v_rk1 = ((uint32_t)(v_in1 * 12299u));
53614
0
    v_rk3 = ((uint32_t)(v_in3 * 25172u));
53615
0
    v_rk5 = ((uint32_t)(v_in5 * 16819u));
53616
0
    v_rk7 = ((uint32_t)(v_in7 * 2446u));
53617
0
    v_ri51 *= 4294964100u;
53618
0
    v_ri53 *= 4294946301u;
53619
0
    v_ri71 *= 4294959923u;
53620
0
    v_ri73 *= 4294951227u;
53621
0
    v_rl51 = ((uint32_t)(v_ri51 + v_rj));
53622
0
    v_rl73 = ((uint32_t)(v_ri73 + v_rj));
53623
0
    v_rk1 += ((uint32_t)(v_ri71 + v_rl51));
53624
0
    v_rk3 += ((uint32_t)(v_ri53 + v_rl73));
53625
0
    v_rk5 += ((uint32_t)(v_ri53 + v_rl51));
53626
0
    v_rk7 += ((uint32_t)(v_ri71 + v_rl73));
53627
0
    if (8u > ((uint64_t)(a_dst_buffer.len))) {
53628
0
      return wuffs_base__make_empty_struct();
53629
0
    }
53630
0
    a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)];
53631
0
    a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)];
53632
0
    a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)];
53633
0
    a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)];
53634
0
    a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)];
53635
0
    a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)];
53636
0
    a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)];
53637
0
    a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)];
53638
0
  }
53639
0
  return wuffs_base__make_empty_struct();
53640
0
}
53641
53642
// โ€ผ WUFFS MULTI-FILE SECTION +x86_avx2
53643
// -------- func jpeg.decoder.decode_idct_x86_avx2
53644
53645
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
53646
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2")
53647
WUFFS_BASE__GENERATED_C_CODE
53648
static wuffs_base__empty_struct
53649
wuffs_jpeg__decoder__decode_idct_x86_avx2(
53650
    wuffs_jpeg__decoder* self,
53651
    wuffs_base__slice_u8 a_dst_buffer,
53652
    uint64_t a_dst_stride,
53653
109M
    uint32_t a_q) {
53654
109M
  __m256i v_k_0000 = {0};
53655
109M
  __m256i v_k_8080 = {0};
53656
109M
  __m256i v_k_0000_0002 = {0};
53657
109M
  __m256i v_k_0001_FFFF = {0};
53658
109M
  __m256i v_k_0400_0000 = {0};
53659
109M
  __m256i v_k_29CF_1151_D630_1151 = {0};
53660
109M
  __m256i v_k_E333_133E_ADFD_1051 = {0};
53661
109M
  __m256i v_k_E6DC_25A1_1925_25A1 = {0};
53662
109M
  __m256i v_k_ECC1_E333_EFB0_ADFD = {0};
53663
109M
  __m128i v_az_coeffs = {0};
53664
109M
  __m256i v_az_ah00 = {0};
53665
109M
  __m256i v_az_ad00 = {0};
53666
109M
  __m256i v_az_eh00 = {0};
53667
109M
  __m256i v_az_adeh = {0};
53668
109M
  __m256i v_rows01 = {0};
53669
109M
  __m256i v_rows23 = {0};
53670
109M
  __m256i v_rows45 = {0};
53671
109M
  __m256i v_rows67 = {0};
53672
109M
  __m256i v_quants01 = {0};
53673
109M
  __m256i v_quants23 = {0};
53674
109M
  __m256i v_quants45 = {0};
53675
109M
  __m256i v_quants67 = {0};
53676
109M
  __m256i v_rows04 = {0};
53677
109M
  __m256i v_rows31 = {0};
53678
109M
  __m256i v_rows26 = {0};
53679
109M
  __m256i v_rows75 = {0};
53680
109M
  __m256i v_fp_rows62 = {0};
53681
109M
  __m256i v_fp_bq2662ad = {0};
53682
109M
  __m256i v_fp_bq2662eh = {0};
53683
109M
  __m256i v_fp_cb26ad = {0};
53684
109M
  __m256i v_fp_cb26eh = {0};
53685
109M
  __m256i v_fp_rows40pos = {0};
53686
109M
  __m256i v_fp_rows04neg = {0};
53687
109M
  __m256i v_fp_rows0pm4 = {0};
53688
109M
  __m256i v_fp_ccpmad = {0};
53689
109M
  __m256i v_fp_ccpmeh = {0};
53690
109M
  __m256i v_fp_cd01ad = {0};
53691
109M
  __m256i v_fp_cd01eh = {0};
53692
109M
  __m256i v_fp_cd32ad = {0};
53693
109M
  __m256i v_fp_cd32eh = {0};
53694
109M
  __m256i v_fp_sums7351 = {0};
53695
109M
  __m256i v_fp_sums5173 = {0};
53696
109M
  __m256i v_fp_ci73515173ad = {0};
53697
109M
  __m256i v_fp_ci73515173eh = {0};
53698
109M
  __m256i v_fp_cl7351ad = {0};
53699
109M
  __m256i v_fp_cl7351eh = {0};
53700
109M
  __m256i v_fp_rows13 = {0};
53701
109M
  __m256i v_fp_bq7153ad = {0};
53702
109M
  __m256i v_fp_bq7153eh = {0};
53703
109M
  __m256i v_fp_ck75ad = {0};
53704
109M
  __m256i v_fp_ck75eh = {0};
53705
109M
  __m256i v_fp_cl5173ad = {0};
53706
109M
  __m256i v_fp_cl5173eh = {0};
53707
109M
  __m256i v_fp_ck13ad = {0};
53708
109M
  __m256i v_fp_ck13eh = {0};
53709
109M
  __m256i v_intermediate01ad = {0};
53710
109M
  __m256i v_intermediate01eh = {0};
53711
109M
  __m256i v_intermediate01 = {0};
53712
109M
  __m256i v_intermediate32ad = {0};
53713
109M
  __m256i v_intermediate32eh = {0};
53714
109M
  __m256i v_intermediate32 = {0};
53715
109M
  __m256i v_intermediate45ad = {0};
53716
109M
  __m256i v_intermediate45eh = {0};
53717
109M
  __m256i v_intermediate45 = {0};
53718
109M
  __m256i v_intermediate76ad = {0};
53719
109M
  __m256i v_intermediate76eh = {0};
53720
109M
  __m256i v_intermediate76 = {0};
53721
109M
  __m256i v_ita0a1e0e1 = {0};
53722
109M
  __m256i v_ita2a3e2e3 = {0};
53723
109M
  __m256i v_ita4a5e4e5 = {0};
53724
109M
  __m256i v_ita6a7e6e7 = {0};
53725
109M
  __m256i v_ita0c0e0g0 = {0};
53726
109M
  __m256i v_ita1c1e1g1 = {0};
53727
109M
  __m256i v_ita4c4e4g4 = {0};
53728
109M
  __m256i v_ita5c5e5g5 = {0};
53729
109M
  __m256i v_ita0b0e0f0 = {0};
53730
109M
  __m256i v_ita4b4e4f4 = {0};
53731
109M
  __m256i v_itc0d0g0h0 = {0};
53732
109M
  __m256i v_itc4d4g4h4 = {0};
53733
109M
  __m256i v_intermediateae = {0};
53734
109M
  __m256i v_intermediatebf = {0};
53735
109M
  __m256i v_intermediatecg = {0};
53736
109M
  __m256i v_intermediatedh = {0};
53737
109M
  __m256i v_intermediatedb = {0};
53738
109M
  __m256i v_intermediatehf = {0};
53739
109M
  __m256i v_sp_cols62 = {0};
53740
109M
  __m256i v_sp_bq2662ad = {0};
53741
109M
  __m256i v_sp_bq2662eh = {0};
53742
109M
  __m256i v_sp_rb26ad = {0};
53743
109M
  __m256i v_sp_rb26eh = {0};
53744
109M
  __m256i v_sp_cols40pos = {0};
53745
109M
  __m256i v_sp_cols04neg = {0};
53746
109M
  __m256i v_sp_cols0pm4 = {0};
53747
109M
  __m256i v_sp_rcpmad = {0};
53748
109M
  __m256i v_sp_rcpmeh = {0};
53749
109M
  __m256i v_sp_rd01ad = {0};
53750
109M
  __m256i v_sp_rd01eh = {0};
53751
109M
  __m256i v_sp_rd32ad = {0};
53752
109M
  __m256i v_sp_rd32eh = {0};
53753
109M
  __m256i v_sp_sums7351 = {0};
53754
109M
  __m256i v_sp_sums5173 = {0};
53755
109M
  __m256i v_sp_ri73515173ad = {0};
53756
109M
  __m256i v_sp_ri73515173eh = {0};
53757
109M
  __m256i v_sp_rl7351ad = {0};
53758
109M
  __m256i v_sp_rl7351eh = {0};
53759
109M
  __m256i v_sp_cols13 = {0};
53760
109M
  __m256i v_sp_bq7153ad = {0};
53761
109M
  __m256i v_sp_bq7153eh = {0};
53762
109M
  __m256i v_sp_rk75ad = {0};
53763
109M
  __m256i v_sp_rk75eh = {0};
53764
109M
  __m256i v_sp_rl5173ad = {0};
53765
109M
  __m256i v_sp_rl5173eh = {0};
53766
109M
  __m256i v_sp_rk13ad = {0};
53767
109M
  __m256i v_sp_rk13eh = {0};
53768
109M
  __m256i v_final01ad = {0};
53769
109M
  __m256i v_final01eh = {0};
53770
109M
  __m256i v_final01 = {0};
53771
109M
  __m256i v_final32ad = {0};
53772
109M
  __m256i v_final32eh = {0};
53773
109M
  __m256i v_final32 = {0};
53774
109M
  __m256i v_final45ad = {0};
53775
109M
  __m256i v_final45eh = {0};
53776
109M
  __m256i v_final45 = {0};
53777
109M
  __m256i v_final76ad = {0};
53778
109M
  __m256i v_final76eh = {0};
53779
109M
  __m256i v_final76 = {0};
53780
109M
  __m256i v_fta0a1e0e1 = {0};
53781
109M
  __m256i v_fta2a3e2e3 = {0};
53782
109M
  __m256i v_fta4a5e4e5 = {0};
53783
109M
  __m256i v_fta6a7e6e7 = {0};
53784
109M
  __m256i v_fta0c0e0g0 = {0};
53785
109M
  __m256i v_fta1c1e1g1 = {0};
53786
109M
  __m256i v_fta4c4e4g4 = {0};
53787
109M
  __m256i v_fta5c5e5g5 = {0};
53788
109M
  __m256i v_fta0b0e0f0 = {0};
53789
109M
  __m256i v_ftc0d0g0h0 = {0};
53790
109M
  __m256i v_fta4b4e4f4 = {0};
53791
109M
  __m256i v_ftc4d4g4h4 = {0};
53792
109M
  __m256i v_finalae = {0};
53793
109M
  __m256i v_finalbf = {0};
53794
109M
  __m256i v_finalcg = {0};
53795
109M
  __m256i v_finaldh = {0};
53796
109M
  __m256i v_final0145 = {0};
53797
109M
  __m256i v_final2367 = {0};
53798
109M
  uint64_t v_final0 = 0;
53799
109M
  uint64_t v_final1 = 0;
53800
109M
  uint64_t v_final2 = 0;
53801
109M
  uint64_t v_final3 = 0;
53802
109M
  uint64_t v_final4 = 0;
53803
109M
  uint64_t v_final5 = 0;
53804
109M
  uint64_t v_final6 = 0;
53805
109M
  uint64_t v_final7 = 0;
53806
109M
  wuffs_base__slice_u8 v_remaining = {0};
53807
53808
109M
  if (8u > a_dst_stride) {
53809
0
    return wuffs_base__make_empty_struct();
53810
0
  }
53811
109M
  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));
53812
109M
  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));
53813
109M
  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));
53814
109M
  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));
53815
109M
  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));
53816
109M
  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));
53817
109M
  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));
53818
109M
  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));
53819
109M
  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));
53820
109M
  do {
53821
109M
    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)))) {
53822
107M
      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)));
53823
107M
      if (0u == ((uint64_t)(_mm_cvtsi128_si64(_mm_packs_epi16(v_az_coeffs, v_az_coeffs))))) {
53824
107M
        v_rows01 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 0u));
53825
107M
        v_quants01 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_impl.f_quant_tables[a_q] + 0u));
53826
107M
        v_rows01 = _mm256_mullo_epi16(v_rows01, v_quants01);
53827
107M
        v_az_ah00 = _mm256_slli_epi16(v_rows01, (int32_t)(2u));
53828
107M
        v_az_ad00 = _mm256_unpacklo_epi16(v_az_ah00, v_az_ah00);
53829
107M
        v_az_eh00 = _mm256_unpackhi_epi16(v_az_ah00, v_az_ah00);
53830
107M
        v_az_adeh = _mm256_inserti128_si256(v_az_ad00, _mm256_castsi256_si128(v_az_eh00), (int32_t)(1u));
53831
107M
        v_intermediateae = _mm256_shuffle_epi32(v_az_adeh, (int32_t)(0u));
53832
107M
        v_intermediatebf = _mm256_shuffle_epi32(v_az_adeh, (int32_t)(85u));
53833
107M
        v_intermediatecg = _mm256_shuffle_epi32(v_az_adeh, (int32_t)(170u));
53834
107M
        v_intermediatedh = _mm256_shuffle_epi32(v_az_adeh, (int32_t)(255u));
53835
107M
        break;
53836
107M
      }
53837
107M
    }
53838
2.17M
    v_rows01 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 0u));
53839
2.17M
    v_rows23 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 16u));
53840
2.17M
    v_rows45 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 32u));
53841
2.17M
    v_rows67 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 48u));
53842
2.17M
    v_quants01 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_impl.f_quant_tables[a_q] + 0u));
53843
2.17M
    v_quants23 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_impl.f_quant_tables[a_q] + 16u));
53844
2.17M
    v_quants45 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_impl.f_quant_tables[a_q] + 32u));
53845
2.17M
    v_quants67 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_impl.f_quant_tables[a_q] + 48u));
53846
2.17M
    v_rows01 = _mm256_mullo_epi16(v_rows01, v_quants01);
53847
2.17M
    v_rows23 = _mm256_mullo_epi16(v_rows23, v_quants23);
53848
2.17M
    v_rows45 = _mm256_mullo_epi16(v_rows45, v_quants45);
53849
2.17M
    v_rows67 = _mm256_mullo_epi16(v_rows67, v_quants67);
53850
2.17M
    v_rows04 = _mm256_permute2x128_si256(v_rows01, v_rows45, (int32_t)(32u));
53851
2.17M
    v_rows31 = _mm256_permute2x128_si256(v_rows23, v_rows01, (int32_t)(49u));
53852
2.17M
    v_rows26 = _mm256_permute2x128_si256(v_rows23, v_rows67, (int32_t)(32u));
53853
2.17M
    v_rows75 = _mm256_permute2x128_si256(v_rows67, v_rows45, (int32_t)(49u));
53854
2.17M
    v_fp_rows62 = _mm256_permute2x128_si256(v_rows26, v_rows26, (int32_t)(1u));
53855
2.17M
    v_fp_bq2662ad = _mm256_unpacklo_epi16(v_rows26, v_fp_rows62);
53856
2.17M
    v_fp_bq2662eh = _mm256_unpackhi_epi16(v_rows26, v_fp_rows62);
53857
2.17M
    v_fp_cb26ad = _mm256_madd_epi16(v_fp_bq2662ad, v_k_29CF_1151_D630_1151);
53858
2.17M
    v_fp_cb26eh = _mm256_madd_epi16(v_fp_bq2662eh, v_k_29CF_1151_D630_1151);
53859
2.17M
    v_fp_rows40pos = _mm256_permute2x128_si256(v_rows04, v_rows04, (int32_t)(1u));
53860
2.17M
    v_fp_rows04neg = _mm256_sign_epi16(v_rows04, v_k_0001_FFFF);
53861
2.17M
    v_fp_rows0pm4 = _mm256_add_epi16(v_fp_rows40pos, v_fp_rows04neg);
53862
2.17M
    v_fp_ccpmad = _mm256_srai_epi32(_mm256_unpacklo_epi16(v_k_0000, v_fp_rows0pm4), (int32_t)(3u));
53863
2.17M
    v_fp_ccpmeh = _mm256_srai_epi32(_mm256_unpackhi_epi16(v_k_0000, v_fp_rows0pm4), (int32_t)(3u));
53864
2.17M
    v_fp_cd01ad = _mm256_add_epi32(v_fp_ccpmad, v_fp_cb26ad);
53865
2.17M
    v_fp_cd01eh = _mm256_add_epi32(v_fp_ccpmeh, v_fp_cb26eh);
53866
2.17M
    v_fp_cd32ad = _mm256_sub_epi32(v_fp_ccpmad, v_fp_cb26ad);
53867
2.17M
    v_fp_cd32eh = _mm256_sub_epi32(v_fp_ccpmeh, v_fp_cb26eh);
53868
2.17M
    v_fp_sums7351 = _mm256_add_epi16(v_rows75, v_rows31);
53869
2.17M
    v_fp_sums5173 = _mm256_permute2x128_si256(v_fp_sums7351, v_fp_sums7351, (int32_t)(1u));
53870
2.17M
    v_fp_ci73515173ad = _mm256_unpacklo_epi16(v_fp_sums7351, v_fp_sums5173);
53871
2.17M
    v_fp_ci73515173eh = _mm256_unpackhi_epi16(v_fp_sums7351, v_fp_sums5173);
53872
2.17M
    v_fp_cl7351ad = _mm256_madd_epi16(v_fp_ci73515173ad, v_k_E6DC_25A1_1925_25A1);
53873
2.17M
    v_fp_cl7351eh = _mm256_madd_epi16(v_fp_ci73515173eh, v_k_E6DC_25A1_1925_25A1);
53874
2.17M
    v_fp_rows13 = _mm256_permute2x128_si256(v_rows31, v_rows31, (int32_t)(1u));
53875
2.17M
    v_fp_bq7153ad = _mm256_unpacklo_epi16(v_rows75, v_fp_rows13);
53876
2.17M
    v_fp_bq7153eh = _mm256_unpackhi_epi16(v_rows75, v_fp_rows13);
53877
2.17M
    v_fp_ck75ad = _mm256_add_epi32(_mm256_madd_epi16(v_fp_bq7153ad, v_k_ECC1_E333_EFB0_ADFD), v_fp_cl7351ad);
53878
2.17M
    v_fp_ck75eh = _mm256_add_epi32(_mm256_madd_epi16(v_fp_bq7153eh, v_k_ECC1_E333_EFB0_ADFD), v_fp_cl7351eh);
53879
2.17M
    v_fp_cl5173ad = _mm256_permute2x128_si256(v_fp_cl7351ad, v_fp_cl7351ad, (int32_t)(1u));
53880
2.17M
    v_fp_cl5173eh = _mm256_permute2x128_si256(v_fp_cl7351eh, v_fp_cl7351eh, (int32_t)(1u));
53881
2.17M
    v_fp_ck13ad = _mm256_add_epi32(v_fp_cl5173ad, _mm256_madd_epi16(v_fp_bq7153ad, v_k_E333_133E_ADFD_1051));
53882
2.17M
    v_fp_ck13eh = _mm256_add_epi32(v_fp_cl5173eh, _mm256_madd_epi16(v_fp_bq7153eh, v_k_E333_133E_ADFD_1051));
53883
2.17M
    v_intermediate01ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_fp_cd01ad, v_fp_ck13ad), v_k_0400_0000), (int32_t)(11u));
53884
2.17M
    v_intermediate01eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_fp_cd01eh, v_fp_ck13eh), v_k_0400_0000), (int32_t)(11u));
53885
2.17M
    v_intermediate01 = _mm256_packs_epi32(v_intermediate01ad, v_intermediate01eh);
53886
2.17M
    v_intermediate32ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_fp_cd32ad, v_fp_ck75ad), v_k_0400_0000), (int32_t)(11u));
53887
2.17M
    v_intermediate32eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_fp_cd32eh, v_fp_ck75eh), v_k_0400_0000), (int32_t)(11u));
53888
2.17M
    v_intermediate32 = _mm256_packs_epi32(v_intermediate32ad, v_intermediate32eh);
53889
2.17M
    v_intermediate45ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_fp_cd32ad, v_fp_ck75ad), v_k_0400_0000), (int32_t)(11u));
53890
2.17M
    v_intermediate45eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_fp_cd32eh, v_fp_ck75eh), v_k_0400_0000), (int32_t)(11u));
53891
2.17M
    v_intermediate45 = _mm256_packs_epi32(v_intermediate45ad, v_intermediate45eh);
53892
2.17M
    v_intermediate76ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_fp_cd01ad, v_fp_ck13ad), v_k_0400_0000), (int32_t)(11u));
53893
2.17M
    v_intermediate76eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_fp_cd01eh, v_fp_ck13eh), v_k_0400_0000), (int32_t)(11u));
53894
2.17M
    v_intermediate76 = _mm256_packs_epi32(v_intermediate76ad, v_intermediate76eh);
53895
2.17M
    v_ita0a1e0e1 = _mm256_permute4x64_epi64(v_intermediate01, (int32_t)(216u));
53896
2.17M
    v_ita2a3e2e3 = _mm256_permute4x64_epi64(v_intermediate32, (int32_t)(114u));
53897
2.17M
    v_ita4a5e4e5 = _mm256_permute4x64_epi64(v_intermediate45, (int32_t)(216u));
53898
2.17M
    v_ita6a7e6e7 = _mm256_permute4x64_epi64(v_intermediate76, (int32_t)(114u));
53899
2.17M
    v_ita0c0e0g0 = _mm256_unpacklo_epi16(v_ita0a1e0e1, v_ita2a3e2e3);
53900
2.17M
    v_ita1c1e1g1 = _mm256_unpackhi_epi16(v_ita0a1e0e1, v_ita2a3e2e3);
53901
2.17M
    v_ita4c4e4g4 = _mm256_unpacklo_epi16(v_ita4a5e4e5, v_ita6a7e6e7);
53902
2.17M
    v_ita5c5e5g5 = _mm256_unpackhi_epi16(v_ita4a5e4e5, v_ita6a7e6e7);
53903
2.17M
    v_ita0b0e0f0 = _mm256_unpacklo_epi16(v_ita0c0e0g0, v_ita1c1e1g1);
53904
2.17M
    v_itc0d0g0h0 = _mm256_unpackhi_epi16(v_ita0c0e0g0, v_ita1c1e1g1);
53905
2.17M
    v_ita4b4e4f4 = _mm256_unpacklo_epi16(v_ita4c4e4g4, v_ita5c5e5g5);
53906
2.17M
    v_itc4d4g4h4 = _mm256_unpackhi_epi16(v_ita4c4e4g4, v_ita5c5e5g5);
53907
2.17M
    v_intermediateae = _mm256_unpacklo_epi64(v_ita0b0e0f0, v_ita4b4e4f4);
53908
2.17M
    v_intermediatebf = _mm256_unpackhi_epi64(v_ita0b0e0f0, v_ita4b4e4f4);
53909
2.17M
    v_intermediatecg = _mm256_unpacklo_epi64(v_itc0d0g0h0, v_itc4d4g4h4);
53910
2.17M
    v_intermediatedh = _mm256_unpackhi_epi64(v_itc0d0g0h0, v_itc4d4g4h4);
53911
2.17M
  } while (0);
53912
0
  v_intermediatedb = _mm256_permute2x128_si256(v_intermediatedh, v_intermediatebf, (int32_t)(32u));
53913
109M
  v_intermediatehf = _mm256_permute2x128_si256(v_intermediatedh, v_intermediatebf, (int32_t)(49u));
53914
109M
  v_sp_cols62 = _mm256_permute2x128_si256(v_intermediatecg, v_intermediatecg, (int32_t)(1u));
53915
109M
  v_sp_bq2662ad = _mm256_unpacklo_epi16(v_intermediatecg, v_sp_cols62);
53916
109M
  v_sp_bq2662eh = _mm256_unpackhi_epi16(v_intermediatecg, v_sp_cols62);
53917
109M
  v_sp_rb26ad = _mm256_madd_epi16(v_sp_bq2662ad, v_k_29CF_1151_D630_1151);
53918
109M
  v_sp_rb26eh = _mm256_madd_epi16(v_sp_bq2662eh, v_k_29CF_1151_D630_1151);
53919
109M
  v_sp_cols40pos = _mm256_permute2x128_si256(v_intermediateae, v_intermediateae, (int32_t)(1u));
53920
109M
  v_sp_cols04neg = _mm256_sign_epi16(v_intermediateae, v_k_0001_FFFF);
53921
109M
  v_sp_cols0pm4 = _mm256_add_epi16(v_sp_cols40pos, v_sp_cols04neg);
53922
109M
  v_sp_rcpmad = _mm256_srai_epi32(_mm256_unpacklo_epi16(v_k_0000, v_sp_cols0pm4), (int32_t)(3u));
53923
109M
  v_sp_rcpmeh = _mm256_srai_epi32(_mm256_unpackhi_epi16(v_k_0000, v_sp_cols0pm4), (int32_t)(3u));
53924
109M
  v_sp_rd01ad = _mm256_add_epi32(v_sp_rcpmad, v_sp_rb26ad);
53925
109M
  v_sp_rd01eh = _mm256_add_epi32(v_sp_rcpmeh, v_sp_rb26eh);
53926
109M
  v_sp_rd32ad = _mm256_sub_epi32(v_sp_rcpmad, v_sp_rb26ad);
53927
109M
  v_sp_rd32eh = _mm256_sub_epi32(v_sp_rcpmeh, v_sp_rb26eh);
53928
109M
  v_sp_sums7351 = _mm256_add_epi16(v_intermediatehf, v_intermediatedb);
53929
109M
  v_sp_sums5173 = _mm256_permute2x128_si256(v_sp_sums7351, v_sp_sums7351, (int32_t)(1u));
53930
109M
  v_sp_ri73515173ad = _mm256_unpacklo_epi16(v_sp_sums7351, v_sp_sums5173);
53931
109M
  v_sp_ri73515173eh = _mm256_unpackhi_epi16(v_sp_sums7351, v_sp_sums5173);
53932
109M
  v_sp_rl7351ad = _mm256_madd_epi16(v_sp_ri73515173ad, v_k_E6DC_25A1_1925_25A1);
53933
109M
  v_sp_rl7351eh = _mm256_madd_epi16(v_sp_ri73515173eh, v_k_E6DC_25A1_1925_25A1);
53934
109M
  v_sp_cols13 = _mm256_permute2x128_si256(v_intermediatedb, v_intermediatedb, (int32_t)(1u));
53935
109M
  v_sp_bq7153ad = _mm256_unpacklo_epi16(v_intermediatehf, v_sp_cols13);
53936
109M
  v_sp_bq7153eh = _mm256_unpackhi_epi16(v_intermediatehf, v_sp_cols13);
53937
109M
  v_sp_rk75ad = _mm256_add_epi32(_mm256_madd_epi16(v_sp_bq7153ad, v_k_ECC1_E333_EFB0_ADFD), v_sp_rl7351ad);
53938
109M
  v_sp_rk75eh = _mm256_add_epi32(_mm256_madd_epi16(v_sp_bq7153eh, v_k_ECC1_E333_EFB0_ADFD), v_sp_rl7351eh);
53939
109M
  v_sp_rl5173ad = _mm256_permute2x128_si256(v_sp_rl7351ad, v_sp_rl7351ad, (int32_t)(1u));
53940
109M
  v_sp_rl5173eh = _mm256_permute2x128_si256(v_sp_rl7351eh, v_sp_rl7351eh, (int32_t)(1u));
53941
109M
  v_sp_rk13ad = _mm256_add_epi32(v_sp_rl5173ad, _mm256_madd_epi16(v_sp_bq7153ad, v_k_E333_133E_ADFD_1051));
53942
109M
  v_sp_rk13eh = _mm256_add_epi32(v_sp_rl5173eh, _mm256_madd_epi16(v_sp_bq7153eh, v_k_E333_133E_ADFD_1051));
53943
109M
  v_final01ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_sp_rd01ad, v_sp_rk13ad), v_k_0000_0002), (int32_t)(18u));
53944
109M
  v_final01eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_sp_rd01eh, v_sp_rk13eh), v_k_0000_0002), (int32_t)(18u));
53945
109M
  v_final01 = _mm256_packs_epi32(v_final01ad, v_final01eh);
53946
109M
  v_final32ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_sp_rd32ad, v_sp_rk75ad), v_k_0000_0002), (int32_t)(18u));
53947
109M
  v_final32eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_sp_rd32eh, v_sp_rk75eh), v_k_0000_0002), (int32_t)(18u));
53948
109M
  v_final32 = _mm256_packs_epi32(v_final32ad, v_final32eh);
53949
109M
  v_final45ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_sp_rd32ad, v_sp_rk75ad), v_k_0000_0002), (int32_t)(18u));
53950
109M
  v_final45eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_sp_rd32eh, v_sp_rk75eh), v_k_0000_0002), (int32_t)(18u));
53951
109M
  v_final45 = _mm256_packs_epi32(v_final45ad, v_final45eh);
53952
109M
  v_final76ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_sp_rd01ad, v_sp_rk13ad), v_k_0000_0002), (int32_t)(18u));
53953
109M
  v_final76eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_sp_rd01eh, v_sp_rk13eh), v_k_0000_0002), (int32_t)(18u));
53954
109M
  v_final76 = _mm256_packs_epi32(v_final76ad, v_final76eh);
53955
109M
  v_fta0a1e0e1 = _mm256_permute4x64_epi64(v_final01, (int32_t)(216u));
53956
109M
  v_fta2a3e2e3 = _mm256_permute4x64_epi64(v_final32, (int32_t)(114u));
53957
109M
  v_fta4a5e4e5 = _mm256_permute4x64_epi64(v_final45, (int32_t)(216u));
53958
109M
  v_fta6a7e6e7 = _mm256_permute4x64_epi64(v_final76, (int32_t)(114u));
53959
109M
  v_fta0c0e0g0 = _mm256_unpacklo_epi16(v_fta0a1e0e1, v_fta2a3e2e3);
53960
109M
  v_fta1c1e1g1 = _mm256_unpackhi_epi16(v_fta0a1e0e1, v_fta2a3e2e3);
53961
109M
  v_fta4c4e4g4 = _mm256_unpacklo_epi16(v_fta4a5e4e5, v_fta6a7e6e7);
53962
109M
  v_fta5c5e5g5 = _mm256_unpackhi_epi16(v_fta4a5e4e5, v_fta6a7e6e7);
53963
109M
  v_fta0b0e0f0 = _mm256_unpacklo_epi16(v_fta0c0e0g0, v_fta1c1e1g1);
53964
109M
  v_ftc0d0g0h0 = _mm256_unpackhi_epi16(v_fta0c0e0g0, v_fta1c1e1g1);
53965
109M
  v_fta4b4e4f4 = _mm256_unpacklo_epi16(v_fta4c4e4g4, v_fta5c5e5g5);
53966
109M
  v_ftc4d4g4h4 = _mm256_unpackhi_epi16(v_fta4c4e4g4, v_fta5c5e5g5);
53967
109M
  v_finalae = _mm256_unpacklo_epi64(v_fta0b0e0f0, v_fta4b4e4f4);
53968
109M
  v_finalbf = _mm256_unpackhi_epi64(v_fta0b0e0f0, v_fta4b4e4f4);
53969
109M
  v_finalcg = _mm256_unpacklo_epi64(v_ftc0d0g0h0, v_ftc4d4g4h4);
53970
109M
  v_finaldh = _mm256_unpackhi_epi64(v_ftc0d0g0h0, v_ftc4d4g4h4);
53971
109M
  v_final0145 = _mm256_add_epi8(_mm256_packs_epi16(v_finalae, v_finalbf), v_k_8080);
53972
109M
  v_final2367 = _mm256_add_epi8(_mm256_packs_epi16(v_finalcg, v_finaldh), v_k_8080);
53973
109M
  v_final0 = ((uint64_t)(_mm256_extract_epi64(v_final0145, (int32_t)(0u))));
53974
109M
  v_final1 = ((uint64_t)(_mm256_extract_epi64(v_final0145, (int32_t)(1u))));
53975
109M
  v_final2 = ((uint64_t)(_mm256_extract_epi64(v_final2367, (int32_t)(0u))));
53976
109M
  v_final3 = ((uint64_t)(_mm256_extract_epi64(v_final2367, (int32_t)(1u))));
53977
109M
  v_final4 = ((uint64_t)(_mm256_extract_epi64(v_final0145, (int32_t)(2u))));
53978
109M
  v_final5 = ((uint64_t)(_mm256_extract_epi64(v_final0145, (int32_t)(3u))));
53979
109M
  v_final6 = ((uint64_t)(_mm256_extract_epi64(v_final2367, (int32_t)(2u))));
53980
109M
  v_final7 = ((uint64_t)(_mm256_extract_epi64(v_final2367, (int32_t)(3u))));
53981
109M
  if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
53982
0
    return wuffs_base__make_empty_struct();
53983
0
  }
53984
109M
  v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
53985
109M
  wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final0);
53986
109M
  a_dst_buffer = v_remaining;
53987
109M
  if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
53988
0
    return wuffs_base__make_empty_struct();
53989
0
  }
53990
109M
  v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
53991
109M
  wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final1);
53992
109M
  a_dst_buffer = v_remaining;
53993
109M
  if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
53994
0
    return wuffs_base__make_empty_struct();
53995
0
  }
53996
109M
  v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
53997
109M
  wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final2);
53998
109M
  a_dst_buffer = v_remaining;
53999
109M
  if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
54000
0
    return wuffs_base__make_empty_struct();
54001
0
  }
54002
109M
  v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
54003
109M
  wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final3);
54004
109M
  a_dst_buffer = v_remaining;
54005
109M
  if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
54006
0
    return wuffs_base__make_empty_struct();
54007
0
  }
54008
109M
  v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
54009
109M
  wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final4);
54010
109M
  a_dst_buffer = v_remaining;
54011
109M
  if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
54012
0
    return wuffs_base__make_empty_struct();
54013
0
  }
54014
109M
  v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
54015
109M
  wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final5);
54016
109M
  a_dst_buffer = v_remaining;
54017
109M
  if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
54018
0
    return wuffs_base__make_empty_struct();
54019
0
  }
54020
109M
  v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
54021
109M
  wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final6);
54022
109M
  a_dst_buffer = v_remaining;
54023
109M
  if (8u > ((uint64_t)(a_dst_buffer.len))) {
54024
0
    return wuffs_base__make_empty_struct();
54025
0
  }
54026
109M
  wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final7);
54027
109M
  return wuffs_base__make_empty_struct();
54028
109M
}
54029
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
54030
// โ€ผ WUFFS MULTI-FILE SECTION -x86_avx2
54031
54032
// -------- func jpeg.decoder.get_quirk
54033
54034
WUFFS_BASE__GENERATED_C_CODE
54035
WUFFS_BASE__MAYBE_STATIC uint64_t
54036
wuffs_jpeg__decoder__get_quirk(
54037
    const wuffs_jpeg__decoder* self,
54038
0
    uint32_t a_key) {
54039
0
  if (!self) {
54040
0
    return 0;
54041
0
  }
54042
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
54043
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
54044
0
    return 0;
54045
0
  }
54046
54047
0
  if (a_key == 2u) {
54048
0
    if (self->private_impl.f_use_lower_quality) {
54049
0
      return 18446744073709551615u;
54050
0
    }
54051
0
  } else if (a_key == 1162824704u) {
54052
0
    if (self->private_impl.f_reject_progressive_jpegs) {
54053
0
      return 1u;
54054
0
    }
54055
0
  }
54056
0
  return 0u;
54057
0
}
54058
54059
// -------- func jpeg.decoder.set_quirk
54060
54061
WUFFS_BASE__GENERATED_C_CODE
54062
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
54063
wuffs_jpeg__decoder__set_quirk(
54064
    wuffs_jpeg__decoder* self,
54065
    uint32_t a_key,
54066
0
    uint64_t a_value) {
54067
0
  if (!self) {
54068
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
54069
0
  }
54070
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
54071
0
    return wuffs_base__make_status(
54072
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
54073
0
        ? wuffs_base__error__disabled_by_previous_error
54074
0
        : wuffs_base__error__initialize_not_called);
54075
0
  }
54076
54077
0
  if (a_key == 2u) {
54078
0
    self->private_impl.f_use_lower_quality = (a_value >= 9223372036854775808u);
54079
0
    return wuffs_base__make_status(NULL);
54080
0
  } else if (a_key == 1162824704u) {
54081
0
    self->private_impl.f_reject_progressive_jpegs = (a_value != 0u);
54082
0
    return wuffs_base__make_status(NULL);
54083
0
  }
54084
0
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
54085
0
}
54086
54087
// -------- func jpeg.decoder.decode_image_config
54088
54089
WUFFS_BASE__GENERATED_C_CODE
54090
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
54091
wuffs_jpeg__decoder__decode_image_config(
54092
    wuffs_jpeg__decoder* self,
54093
    wuffs_base__image_config* a_dst,
54094
3.72k
    wuffs_base__io_buffer* a_src) {
54095
3.72k
  if (!self) {
54096
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
54097
0
  }
54098
3.72k
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
54099
0
    return wuffs_base__make_status(
54100
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
54101
0
        ? wuffs_base__error__disabled_by_previous_error
54102
0
        : wuffs_base__error__initialize_not_called);
54103
0
  }
54104
3.72k
  if (!a_src) {
54105
0
    self->private_impl.magic = WUFFS_BASE__DISABLED;
54106
0
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
54107
0
  }
54108
3.72k
  if ((self->private_impl.active_coroutine != 0) &&
54109
3.72k
      (self->private_impl.active_coroutine != 1)) {
54110
0
    self->private_impl.magic = WUFFS_BASE__DISABLED;
54111
0
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
54112
0
  }
54113
3.72k
  self->private_impl.active_coroutine = 0;
54114
3.72k
  wuffs_base__status status = wuffs_base__make_status(NULL);
54115
54116
3.72k
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
54117
54118
3.72k
  uint32_t coro_susp_point = self->private_impl.p_decode_image_config;
54119
3.72k
  switch (coro_susp_point) {
54120
3.72k
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
54121
54122
3.72k
    while (true) {
54123
3.72k
      {
54124
3.72k
        wuffs_base__status t_0 = wuffs_jpeg__decoder__do_decode_image_config(self, a_dst, a_src);
54125
3.72k
        v_status = t_0;
54126
3.72k
      }
54127
3.72k
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
54128
452
        status = wuffs_base__make_status(wuffs_jpeg__error__truncated_input);
54129
452
        goto exit;
54130
452
      }
54131
3.27k
      status = v_status;
54132
3.27k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
54133
0
    }
54134
54135
2.68k
    ok:
54136
2.68k
    self->private_impl.p_decode_image_config = 0;
54137
2.68k
    goto exit;
54138
3.72k
  }
54139
54140
0
  goto suspend;
54141
339
  suspend:
54142
339
  self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
54143
339
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
54144
54145
339
  goto exit;
54146
3.72k
  exit:
54147
3.72k
  if (wuffs_base__status__is_error(&status)) {
54148
707
    self->private_impl.magic = WUFFS_BASE__DISABLED;
54149
707
  }
54150
3.72k
  return status;
54151
3.72k
}
54152
54153
// -------- func jpeg.decoder.do_decode_image_config
54154
54155
WUFFS_BASE__GENERATED_C_CODE
54156
static wuffs_base__status
54157
wuffs_jpeg__decoder__do_decode_image_config(
54158
    wuffs_jpeg__decoder* self,
54159
    wuffs_base__image_config* a_dst,
54160
3.72k
    wuffs_base__io_buffer* a_src) {
54161
3.72k
  wuffs_base__status status = wuffs_base__make_status(NULL);
54162
54163
3.72k
  uint8_t v_c8 = 0;
54164
3.72k
  uint8_t v_marker = 0;
54165
3.72k
  uint32_t v_pixfmt = 0;
54166
54167
3.72k
  const uint8_t* iop_a_src = NULL;
54168
3.72k
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
54169
3.72k
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
54170
3.72k
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
54171
3.72k
  if (a_src && a_src->data.ptr) {
54172
3.72k
    io0_a_src = a_src->data.ptr;
54173
3.72k
    io1_a_src = io0_a_src + a_src->meta.ri;
54174
3.72k
    iop_a_src = io1_a_src;
54175
3.72k
    io2_a_src = io0_a_src + a_src->meta.wi;
54176
3.72k
  }
54177
54178
3.72k
  uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config;
54179
3.72k
  if (coro_susp_point) {
54180
0
    v_marker = self->private_data.s_do_decode_image_config.v_marker;
54181
0
  }
54182
3.72k
  switch (coro_susp_point) {
54183
3.72k
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
54184
54185
3.72k
    if (self->private_impl.f_call_sequence != 0u) {
54186
0
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
54187
0
      goto exit;
54188
0
    }
54189
3.72k
    {
54190
3.72k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
54191
3.72k
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
54192
0
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
54193
0
        goto suspend;
54194
0
      }
54195
3.72k
      uint8_t t_0 = *iop_a_src++;
54196
3.72k
      v_c8 = t_0;
54197
3.72k
    }
54198
3.72k
    if (v_c8 != 255u) {
54199
14
      status = wuffs_base__make_status(wuffs_jpeg__error__bad_header);
54200
14
      goto exit;
54201
14
    }
54202
3.71k
    {
54203
3.71k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
54204
3.71k
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
54205
1
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
54206
1
        goto suspend;
54207
1
      }
54208
3.71k
      uint8_t t_1 = *iop_a_src++;
54209
3.71k
      v_c8 = t_1;
54210
3.71k
    }
54211
3.71k
    if (v_c8 != 216u) {
54212
12
      status = wuffs_base__make_status(wuffs_jpeg__error__bad_header);
54213
12
      goto exit;
54214
12
    }
54215
17.9k
    while (true) {
54216
236k
      while (true) {
54217
236k
        {
54218
236k
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
54219
236k
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
54220
129
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
54221
129
            goto suspend;
54222
129
          }
54223
236k
          uint8_t t_2 = *iop_a_src++;
54224
236k
          v_c8 = t_2;
54225
236k
        }
54226
236k
        if (v_c8 == 255u) {
54227
17.8k
          break;
54228
17.8k
        }
54229
236k
      }
54230
21.5k
      while (true) {
54231
21.5k
        {
54232
21.5k
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
54233
21.5k
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
54234
20
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
54235
20
            goto suspend;
54236
20
          }
54237
21.5k
          uint8_t t_3 = *iop_a_src++;
54238
21.5k
          v_c8 = t_3;
54239
21.5k
        }
54240
21.5k
        if (v_c8 != 255u) {
54241
17.8k
          v_marker = v_c8;
54242
17.8k
          break;
54243
17.8k
        }
54244
21.5k
      }
54245
17.8k
      if (v_marker == 0u) {
54246
1.93k
        continue;
54247
15.8k
      } else if ((208u <= v_marker) && (v_marker <= 217u)) {
54248
750
        if (v_marker <= 215u) {
54249
743
          continue;
54250
743
        }
54251
15.1k
      } else {
54252
15.1k
        {
54253
15.1k
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
54254
15.1k
          uint32_t t_4;
54255
15.1k
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
54256
15.0k
            t_4 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src)));
54257
15.0k
            iop_a_src += 2;
54258
15.0k
          } else {
54259
30
            self->private_data.s_do_decode_image_config.scratch = 0;
54260
30
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
54261
32
            while (true) {
54262
32
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
54263
30
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
54264
30
                goto suspend;
54265
30
              }
54266
2
              uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
54267
2
              uint32_t num_bits_4 = ((uint32_t)(*scratch & 0xFFu));
54268
2
              *scratch >>= 8;
54269
2
              *scratch <<= 8;
54270
2
              *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_4);
54271
2
              if (num_bits_4 == 8) {
54272
0
                t_4 = ((uint32_t)(*scratch >> 48));
54273
0
                break;
54274
0
              }
54275
2
              num_bits_4 += 8u;
54276
2
              *scratch |= ((uint64_t)(num_bits_4));
54277
2
            }
54278
30
          }
54279
15.0k
          self->private_impl.f_payload_length = t_4;
54280
15.0k
        }
54281
15.0k
        if (self->private_impl.f_payload_length < 2u) {
54282
437
          if ((v_marker == 254u) || ((224u <= v_marker) && (v_marker < 240u))) {
54283
422
            continue;
54284
422
          }
54285
15
          status = wuffs_base__make_status(wuffs_jpeg__error__bad_marker);
54286
15
          goto exit;
54287
437
        }
54288
14.6k
        self->private_impl.f_payload_length -= 2u;
54289
14.6k
      }
54290
14.6k
      if (v_marker < 192u) {
54291
20
        status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker);
54292
20
        goto exit;
54293
14.6k
      } else if (v_marker < 208u) {
54294
3.36k
        if (v_marker <= 194u) {
54295
2.84k
          if ((v_marker == 194u) && self->private_impl.f_reject_progressive_jpegs) {
54296
0
            status = wuffs_base__make_status(wuffs_jpeg__error__rejected_progressive_jpeg);
54297
0
            goto exit;
54298
2.84k
          } else if (self->private_impl.f_sof_marker != 0u) {
54299
0
            status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker);
54300
0
            goto exit;
54301
2.84k
          } else if (v_marker == 192u) {
54302
593
            if (self->private_impl.f_seen_dht[2u] ||
54303
593
                self->private_impl.f_seen_dht[3u] ||
54304
593
                self->private_impl.f_seen_dht[6u] ||
54305
593
                self->private_impl.f_seen_dht[7u]) {
54306
4
              status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker);
54307
4
              goto exit;
54308
4
            }
54309
593
          }
54310
2.84k
          self->private_impl.f_sof_marker = v_marker;
54311
2.84k
          if (a_src) {
54312
2.84k
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
54313
2.84k
          }
54314
2.84k
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
54315
2.84k
          status = wuffs_jpeg__decoder__decode_sof(self, a_src);
54316
2.84k
          if (a_src) {
54317
2.84k
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
54318
2.84k
          }
54319
2.84k
          if (status.repr) {
54320
160
            goto suspend;
54321
160
          }
54322
2.68k
          break;
54323
2.84k
        } else if (v_marker == 195u) {
54324
1
          status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_lossless_coding);
54325
1
          goto exit;
54326
517
        } else if (v_marker == 196u) {
54327
508
          if (a_src) {
54328
508
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
54329
508
          }
54330
508
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
54331
508
          status = wuffs_jpeg__decoder__decode_dht(self, a_src);
54332
508
          if (a_src) {
54333
508
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
54334
508
          }
54335
508
          if (status.repr) {
54336
197
            goto suspend;
54337
197
          }
54338
311
          continue;
54339
508
        } else if ((197u <= v_marker) && (v_marker <= 199u)) {
54340
2
          status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_hierarchical_coding);
54341
2
          goto exit;
54342
7
        } else if (v_marker == 200u) {
54343
1
          status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker);
54344
1
          goto exit;
54345
6
        } else {
54346
6
          status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_arithmetic_coding);
54347
6
          goto exit;
54348
6
        }
54349
11.2k
      } else if (v_marker < 224u) {
54350
2.69k
        if (v_marker < 218u) {
54351
7
          status = wuffs_base__make_status(wuffs_jpeg__error__bad_marker);
54352
7
          goto exit;
54353
2.68k
        } else if (v_marker == 218u) {
54354
3
          status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker);
54355
3
          goto exit;
54356
2.68k
        } else if (v_marker == 219u) {
54357
2.29k
          if (a_src) {
54358
2.29k
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
54359
2.29k
          }
54360
2.29k
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
54361
2.29k
          status = wuffs_jpeg__decoder__decode_dqt(self, a_src);
54362
2.29k
          if (a_src) {
54363
2.29k
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
54364
2.29k
          }
54365
2.29k
          if (status.repr) {
54366
84
            goto suspend;
54367
84
          }
54368
2.21k
          continue;
54369
2.29k
        } else if (v_marker == 221u) {
54370
386
          if (a_src) {
54371
386
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
54372
386
          }
54373
386
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
54374
386
          status = wuffs_jpeg__decoder__decode_dri(self, a_src);
54375
386
          if (a_src) {
54376
386
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
54377
386
          }
54378
386
          if (status.repr) {
54379
25
            goto suspend;
54380
25
          }
54381
361
          continue;
54382
386
        } else {
54383
3
          status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker);
54384
3
          goto exit;
54385
3
        }
54386
8.58k
      } else if (v_marker < 240u) {
54387
8.10k
        if (a_src) {
54388
8.10k
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
54389
8.10k
        }
54390
8.10k
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11);
54391
8.10k
        status = wuffs_jpeg__decoder__decode_appn(self, a_src, v_marker);
54392
8.10k
        if (a_src) {
54393
8.10k
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
54394
8.10k
        }
54395
8.10k
        if (status.repr) {
54396
285
          goto suspend;
54397
285
        }
54398
7.82k
        continue;
54399
8.10k
      } else {
54400
481
        if (v_marker == 254u) {
54401
475
        } else {
54402
6
          status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker);
54403
6
          goto exit;
54404
6
        }
54405
481
      }
54406
475
      self->private_data.s_do_decode_image_config.scratch = self->private_impl.f_payload_length;
54407
475
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12);
54408
475
      if (self->private_data.s_do_decode_image_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
54409
21
        self->private_data.s_do_decode_image_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
54410
21
        iop_a_src = io2_a_src;
54411
21
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
54412
21
        goto suspend;
54413
21
      }
54414
454
      iop_a_src += self->private_data.s_do_decode_image_config.scratch;
54415
454
      self->private_impl.f_payload_length = 0u;
54416
454
    }
54417
2.68k
    self->private_impl.choosy_decode_idct = (
54418
2.68k
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
54419
2.68k
        wuffs_base__cpu_arch__have_x86_avx2() ? &wuffs_jpeg__decoder__decode_idct_x86_avx2 :
54420
2.68k
#endif
54421
2.68k
        self->private_impl.choosy_decode_idct);
54422
2.68k
    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)));
54423
2.68k
    if (a_dst != NULL) {
54424
2.68k
      v_pixfmt = 536870920u;
54425
2.68k
      if (self->private_impl.f_num_components > 1u) {
54426
730
        v_pixfmt = 2415954056u;
54427
730
      }
54428
2.68k
      wuffs_base__image_config__set(
54429
2.68k
          a_dst,
54430
2.68k
          v_pixfmt,
54431
2.68k
          0u,
54432
2.68k
          self->private_impl.f_width,
54433
2.68k
          self->private_impl.f_height,
54434
2.68k
          self->private_impl.f_frame_config_io_position,
54435
2.68k
          true);
54436
2.68k
    }
54437
2.68k
    self->private_impl.f_call_sequence = 32u;
54438
54439
2.68k
    goto ok;
54440
2.68k
    ok:
54441
2.68k
    self->private_impl.p_do_decode_image_config = 0;
54442
2.68k
    goto exit;
54443
3.72k
  }
54444
54445
0
  goto suspend;
54446
952
  suspend:
54447
952
  self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
54448
952
  self->private_data.s_do_decode_image_config.v_marker = v_marker;
54449
54450
952
  goto exit;
54451
3.72k
  exit:
54452
3.72k
  if (a_src && a_src->data.ptr) {
54453
3.72k
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
54454
3.72k
  }
54455
54456
3.72k
  return status;
54457
3.72k
}
54458
54459
// -------- func jpeg.decoder.decode_dqt
54460
54461
WUFFS_BASE__GENERATED_C_CODE
54462
static wuffs_base__status
54463
wuffs_jpeg__decoder__decode_dqt(
54464
    wuffs_jpeg__decoder* self,
54465
2.51k
    wuffs_base__io_buffer* a_src) {
54466
2.51k
  wuffs_base__status status = wuffs_base__make_status(NULL);
54467
54468
2.51k
  uint8_t v_c8 = 0;
54469
2.51k
  uint8_t v_q = 0;
54470
2.51k
  uint32_t v_i = 0;
54471
54472
2.51k
  const uint8_t* iop_a_src = NULL;
54473
2.51k
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
54474
2.51k
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
54475
2.51k
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
54476
2.51k
  if (a_src && a_src->data.ptr) {
54477
2.51k
    io0_a_src = a_src->data.ptr;
54478
2.51k
    io1_a_src = io0_a_src + a_src->meta.ri;
54479
2.51k
    iop_a_src = io1_a_src;
54480
2.51k
    io2_a_src = io0_a_src + a_src->meta.wi;
54481
2.51k
  }
54482
54483
2.51k
  uint32_t coro_susp_point = self->private_impl.p_decode_dqt;
54484
2.51k
  if (coro_susp_point) {
54485
0
    v_q = self->private_data.s_decode_dqt.v_q;
54486
0
    v_i = self->private_data.s_decode_dqt.v_i;
54487
0
  }
54488
2.51k
  switch (coro_susp_point) {
54489
2.51k
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
54490
54491
6.04k
    while (self->private_impl.f_payload_length > 0u) {
54492
3.63k
      self->private_impl.f_payload_length -= 1u;
54493
3.63k
      {
54494
3.63k
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
54495
3.63k
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
54496
42
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
54497
42
          goto suspend;
54498
42
        }
54499
3.59k
        uint8_t t_0 = *iop_a_src++;
54500
3.59k
        v_c8 = t_0;
54501
3.59k
      }
54502
3.59k
      if (((uint8_t)(v_c8 & 15u)) > 3u) {
54503
6
        status = wuffs_base__make_status(wuffs_jpeg__error__bad_dqt_marker);
54504
6
        goto exit;
54505
6
      }
54506
3.58k
      v_q = ((uint8_t)(v_c8 & 15u));
54507
3.58k
      if (((uint8_t)(v_c8 >> 4u)) == 1u) {
54508
1
        status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_precision);
54509
1
        goto exit;
54510
3.58k
      } else if ((((uint8_t)(v_c8 >> 4u)) > 1u) || (self->private_impl.f_payload_length < 64u)) {
54511
15
        status = wuffs_base__make_status(wuffs_jpeg__error__bad_dqt_marker);
54512
15
        goto exit;
54513
15
      }
54514
3.57k
      self->private_impl.f_payload_length -= 64u;
54515
3.57k
      v_i = 0u;
54516
230k
      while (v_i < 64u) {
54517
226k
        v_i += 1u;
54518
226k
        {
54519
226k
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
54520
226k
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
54521
39
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
54522
39
            goto suspend;
54523
39
          }
54524
226k
          uint16_t t_1 = *iop_a_src++;
54525
226k
          self->private_impl.f_quant_tables[v_q][WUFFS_JPEG__UNZIG[v_i]] = t_1;
54526
226k
        }
54527
226k
      }
54528
3.53k
      self->private_impl.f_seen_dqt[v_q] = true;
54529
3.53k
      if (self->private_impl.f_sof_marker == 0u) {
54530
3.10k
        v_i = 0u;
54531
201k
        while (v_i < 64u) {
54532
198k
          self->private_impl.f_saved_quant_tables[v_q][v_i] = self->private_impl.f_quant_tables[v_q][v_i];
54533
198k
          v_i += 1u;
54534
198k
        }
54535
3.10k
        self->private_impl.f_saved_seen_dqt[v_q] = true;
54536
3.10k
      }
54537
3.53k
    }
54538
54539
2.40k
    goto ok;
54540
2.40k
    ok:
54541
2.40k
    self->private_impl.p_decode_dqt = 0;
54542
2.40k
    goto exit;
54543
2.51k
  }
54544
54545
0
  goto suspend;
54546
81
  suspend:
54547
81
  self->private_impl.p_decode_dqt = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
54548
81
  self->private_data.s_decode_dqt.v_q = v_q;
54549
81
  self->private_data.s_decode_dqt.v_i = v_i;
54550
54551
81
  goto exit;
54552
2.51k
  exit:
54553
2.51k
  if (a_src && a_src->data.ptr) {
54554
2.51k
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
54555
2.51k
  }
54556
54557
2.51k
  return status;
54558
2.51k
}
54559
54560
// -------- func jpeg.decoder.decode_dri
54561
54562
WUFFS_BASE__GENERATED_C_CODE
54563
static wuffs_base__status
54564
wuffs_jpeg__decoder__decode_dri(
54565
    wuffs_jpeg__decoder* self,
54566
937
    wuffs_base__io_buffer* a_src) {
54567
937
  wuffs_base__status status = wuffs_base__make_status(NULL);
54568
54569
937
  const uint8_t* iop_a_src = NULL;
54570
937
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
54571
937
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
54572
937
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
54573
937
  if (a_src && a_src->data.ptr) {
54574
937
    io0_a_src = a_src->data.ptr;
54575
937
    io1_a_src = io0_a_src + a_src->meta.ri;
54576
937
    iop_a_src = io1_a_src;
54577
937
    io2_a_src = io0_a_src + a_src->meta.wi;
54578
937
  }
54579
54580
937
  uint32_t coro_susp_point = self->private_impl.p_decode_dri;
54581
937
  switch (coro_susp_point) {
54582
937
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
54583
54584
937
    if (self->private_impl.f_payload_length != 2u) {
54585
25
      status = wuffs_base__make_status(wuffs_jpeg__error__bad_dri_marker);
54586
25
      goto exit;
54587
25
    }
54588
912
    self->private_impl.f_payload_length = 0u;
54589
912
    {
54590
912
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
54591
912
      uint16_t t_0;
54592
912
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
54593
905
        t_0 = wuffs_base__peek_u16be__no_bounds_check(iop_a_src);
54594
905
        iop_a_src += 2;
54595
905
      } else {
54596
7
        self->private_data.s_decode_dri.scratch = 0;
54597
7
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
54598
8
        while (true) {
54599
8
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
54600
7
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
54601
7
            goto suspend;
54602
7
          }
54603
1
          uint64_t* scratch = &self->private_data.s_decode_dri.scratch;
54604
1
          uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu));
54605
1
          *scratch >>= 8;
54606
1
          *scratch <<= 8;
54607
1
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0);
54608
1
          if (num_bits_0 == 8) {
54609
0
            t_0 = ((uint16_t)(*scratch >> 48));
54610
0
            break;
54611
0
          }
54612
1
          num_bits_0 += 8u;
54613
1
          *scratch |= ((uint64_t)(num_bits_0));
54614
1
        }
54615
7
      }
54616
905
      self->private_impl.f_restart_interval = t_0;
54617
905
    }
54618
905
    if (self->private_impl.f_sof_marker == 0u) {
54619
361
      self->private_impl.f_saved_restart_interval = self->private_impl.f_restart_interval;
54620
361
    }
54621
54622
905
    goto ok;
54623
905
    ok:
54624
905
    self->private_impl.p_decode_dri = 0;
54625
905
    goto exit;
54626
937
  }
54627
54628
0
  goto suspend;
54629
7
  suspend:
54630
7
  self->private_impl.p_decode_dri = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
54631
54632
7
  goto exit;
54633
937
  exit:
54634
937
  if (a_src && a_src->data.ptr) {
54635
937
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
54636
937
  }
54637
54638
937
  return status;
54639
937
}
54640
54641
// -------- func jpeg.decoder.decode_appn
54642
54643
WUFFS_BASE__GENERATED_C_CODE
54644
static wuffs_base__status
54645
wuffs_jpeg__decoder__decode_appn(
54646
    wuffs_jpeg__decoder* self,
54647
    wuffs_base__io_buffer* a_src,
54648
8.10k
    uint8_t a_marker) {
54649
8.10k
  wuffs_base__status status = wuffs_base__make_status(NULL);
54650
54651
8.10k
  uint8_t v_c8 = 0;
54652
8.10k
  uint32_t v_c32 = 0;
54653
54654
8.10k
  const uint8_t* iop_a_src = NULL;
54655
8.10k
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
54656
8.10k
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
54657
8.10k
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
54658
8.10k
  if (a_src && a_src->data.ptr) {
54659
8.10k
    io0_a_src = a_src->data.ptr;
54660
8.10k
    io1_a_src = io0_a_src + a_src->meta.ri;
54661
8.10k
    iop_a_src = io1_a_src;
54662
8.10k
    io2_a_src = io0_a_src + a_src->meta.wi;
54663
8.10k
  }
54664
54665
8.10k
  uint32_t coro_susp_point = self->private_impl.p_decode_appn;
54666
8.10k
  switch (coro_susp_point) {
54667
8.10k
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
54668
54669
8.10k
    do {
54670
8.10k
      if (a_marker == 224u) {
54671
806
        if (self->private_impl.f_payload_length >= 5u) {
54672
597
          self->private_impl.f_payload_length -= 5u;
54673
597
          {
54674
597
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
54675
597
            uint32_t t_0;
54676
597
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
54677
575
              t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
54678
575
              iop_a_src += 4;
54679
575
            } else {
54680
22
              self->private_data.s_decode_appn.scratch = 0;
54681
22
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
54682
29
              while (true) {
54683
29
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
54684
22
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
54685
22
                  goto suspend;
54686
22
                }
54687
7
                uint64_t* scratch = &self->private_data.s_decode_appn.scratch;
54688
7
                uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
54689
7
                *scratch <<= 8;
54690
7
                *scratch >>= 8;
54691
7
                *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
54692
7
                if (num_bits_0 == 24) {
54693
0
                  t_0 = ((uint32_t)(*scratch));
54694
0
                  break;
54695
0
                }
54696
7
                num_bits_0 += 8u;
54697
7
                *scratch |= ((uint64_t)(num_bits_0)) << 56;
54698
7
              }
54699
22
            }
54700
575
            v_c32 = t_0;
54701
575
          }
54702
575
          if (v_c32 != 1179207242u) {
54703
339
            self->private_impl.f_payload_length = (65535u & (self->private_impl.f_payload_length + 1u));
54704
339
            break;
54705
339
          }
54706
236
          {
54707
236
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
54708
236
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
54709
4
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
54710
4
              goto suspend;
54711
4
            }
54712
232
            uint8_t t_1 = *iop_a_src++;
54713
232
            v_c8 = t_1;
54714
232
          }
54715
0
          self->private_impl.f_is_jfif = (v_c8 == 0u);
54716
232
        }
54717
7.30k
      } else if (a_marker == 238u) {
54718
7.04k
        if (self->private_impl.f_payload_length >= 12u) {
54719
6.84k
          self->private_impl.f_payload_length -= 12u;
54720
6.84k
          {
54721
6.84k
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
54722
6.84k
            uint32_t t_2;
54723
6.84k
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
54724
6.81k
              t_2 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
54725
6.81k
              iop_a_src += 4;
54726
6.81k
            } else {
54727
23
              self->private_data.s_decode_appn.scratch = 0;
54728
23
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
54729
34
              while (true) {
54730
34
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
54731
23
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
54732
23
                  goto suspend;
54733
23
                }
54734
11
                uint64_t* scratch = &self->private_data.s_decode_appn.scratch;
54735
11
                uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56));
54736
11
                *scratch <<= 8;
54737
11
                *scratch >>= 8;
54738
11
                *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2;
54739
11
                if (num_bits_2 == 24) {
54740
0
                  t_2 = ((uint32_t)(*scratch));
54741
0
                  break;
54742
0
                }
54743
11
                num_bits_2 += 8u;
54744
11
                *scratch |= ((uint64_t)(num_bits_2)) << 56;
54745
11
              }
54746
23
            }
54747
6.81k
            v_c32 = t_2;
54748
6.81k
          }
54749
6.81k
          if (v_c32 != 1651467329u) {
54750
706
            self->private_impl.f_payload_length = (65535u & (self->private_impl.f_payload_length + 8u));
54751
706
            break;
54752
706
          }
54753
6.11k
          {
54754
6.11k
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
54755
6.11k
            uint32_t t_3;
54756
6.11k
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
54757
6.10k
              t_3 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
54758
6.10k
              iop_a_src += 4;
54759
6.10k
            } else {
54760
9
              self->private_data.s_decode_appn.scratch = 0;
54761
9
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
54762
15
              while (true) {
54763
15
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
54764
9
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
54765
9
                  goto suspend;
54766
9
                }
54767
6
                uint64_t* scratch = &self->private_data.s_decode_appn.scratch;
54768
6
                uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56));
54769
6
                *scratch <<= 8;
54770
6
                *scratch >>= 8;
54771
6
                *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3;
54772
6
                if (num_bits_3 == 24) {
54773
0
                  t_3 = ((uint32_t)(*scratch));
54774
0
                  break;
54775
0
                }
54776
6
                num_bits_3 += 8u;
54777
6
                *scratch |= ((uint64_t)(num_bits_3)) << 56;
54778
6
              }
54779
9
            }
54780
6.10k
            v_c32 = t_3;
54781
6.10k
          }
54782
6.10k
          if ((255u & v_c32) != 101u) {
54783
405
            self->private_impl.f_payload_length = (65535u & (self->private_impl.f_payload_length + 4u));
54784
405
            break;
54785
405
          }
54786
5.69k
          {
54787
5.69k
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
54788
5.69k
            uint32_t t_4;
54789
5.69k
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
54790
5.68k
              t_4 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
54791
5.68k
              iop_a_src += 4;
54792
5.68k
            } else {
54793
12
              self->private_data.s_decode_appn.scratch = 0;
54794
12
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
54795
20
              while (true) {
54796
20
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
54797
12
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
54798
12
                  goto suspend;
54799
12
                }
54800
8
                uint64_t* scratch = &self->private_data.s_decode_appn.scratch;
54801
8
                uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56));
54802
8
                *scratch <<= 8;
54803
8
                *scratch >>= 8;
54804
8
                *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4;
54805
8
                if (num_bits_4 == 24) {
54806
0
                  t_4 = ((uint32_t)(*scratch));
54807
0
                  break;
54808
0
                }
54809
8
                num_bits_4 += 8u;
54810
8
                *scratch |= ((uint64_t)(num_bits_4)) << 56;
54811
8
              }
54812
12
            }
54813
5.68k
            v_c32 = t_4;
54814
5.68k
          }
54815
5.68k
          if ((v_c32 >> 24u) == 0u) {
54816
1.72k
            self->private_impl.f_is_adobe = 1u;
54817
3.95k
          } else {
54818
3.95k
            self->private_impl.f_is_adobe = 2u;
54819
3.95k
          }
54820
5.68k
        }
54821
7.04k
      }
54822
8.10k
    } while (0);
54823
8.03k
    self->private_data.s_decode_appn.scratch = self->private_impl.f_payload_length;
54824
8.03k
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
54825
8.03k
    if (self->private_data.s_decode_appn.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
54826
215
      self->private_data.s_decode_appn.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
54827
215
      iop_a_src = io2_a_src;
54828
215
      status = wuffs_base__make_status(wuffs_base__suspension__short_read);
54829
215
      goto suspend;
54830
215
    }
54831
7.82k
    iop_a_src += self->private_data.s_decode_appn.scratch;
54832
7.82k
    self->private_impl.f_payload_length = 0u;
54833
54834
7.82k
    goto ok;
54835
7.82k
    ok:
54836
7.82k
    self->private_impl.p_decode_appn = 0;
54837
7.82k
    goto exit;
54838
8.10k
  }
54839
54840
0
  goto suspend;
54841
285
  suspend:
54842
285
  self->private_impl.p_decode_appn = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
54843
54844
285
  goto exit;
54845
8.10k
  exit:
54846
8.10k
  if (a_src && a_src->data.ptr) {
54847
8.10k
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
54848
8.10k
  }
54849
54850
8.10k
  return status;
54851
8.10k
}
54852
54853
// -------- func jpeg.decoder.decode_sof
54854
54855
WUFFS_BASE__GENERATED_C_CODE
54856
static wuffs_base__status
54857
wuffs_jpeg__decoder__decode_sof(
54858
    wuffs_jpeg__decoder* self,
54859
2.84k
    wuffs_base__io_buffer* a_src) {
54860
2.84k
  wuffs_base__status status = wuffs_base__make_status(NULL);
54861
54862
2.84k
  uint8_t v_c8 = 0;
54863
2.84k
  uint8_t v_comp_h = 0;
54864
2.84k
  uint8_t v_comp_v = 0;
54865
2.84k
  uint32_t v_i = 0;
54866
2.84k
  uint32_t v_j = 0;
54867
2.84k
  bool v_has_h24 = false;
54868
2.84k
  bool v_has_h3 = false;
54869
2.84k
  bool v_has_v24 = false;
54870
2.84k
  bool v_has_v3 = false;
54871
2.84k
  uint32_t v_upper_bound = 0;
54872
2.84k
  uint64_t v_wh0 = 0;
54873
2.84k
  uint64_t v_wh1 = 0;
54874
2.84k
  uint64_t v_wh2 = 0;
54875
2.84k
  uint64_t v_wh3 = 0;
54876
2.84k
  uint64_t v_progressive = 0;
54877
54878
2.84k
  const uint8_t* iop_a_src = NULL;
54879
2.84k
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
54880
2.84k
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
54881
2.84k
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
54882
2.84k
  if (a_src && a_src->data.ptr) {
54883
2.84k
    io0_a_src = a_src->data.ptr;
54884
2.84k
    io1_a_src = io0_a_src + a_src->meta.ri;
54885
2.84k
    iop_a_src = io1_a_src;
54886
2.84k
    io2_a_src = io0_a_src + a_src->meta.wi;
54887
2.84k
  }
54888
54889
2.84k
  uint32_t coro_susp_point = self->private_impl.p_decode_sof;
54890
2.84k
  if (coro_susp_point) {
54891
0
    v_i = self->private_data.s_decode_sof.v_i;
54892
0
  }
54893
2.84k
  switch (coro_susp_point) {
54894
2.84k
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
54895
54896
2.84k
    if (self->private_impl.f_payload_length < 6u) {
54897
4
      status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker);
54898
4
      goto exit;
54899
4
    }
54900
2.83k
    self->private_impl.f_payload_length -= 6u;
54901
2.83k
    {
54902
2.83k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
54903
2.83k
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
54904
15
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
54905
15
        goto suspend;
54906
15
      }
54907
2.82k
      uint8_t t_0 = *iop_a_src++;
54908
2.82k
      v_c8 = t_0;
54909
2.82k
    }
54910
2.82k
    if (v_c8 == 8u) {
54911
2.80k
    } else if (v_c8 == 12u) {
54912
1
      status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_precision_12_bits);
54913
1
      goto exit;
54914
17
    } else if (v_c8 == 16u) {
54915
1
      status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_precision_16_bits);
54916
1
      goto exit;
54917
16
    } else {
54918
16
      status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_precision);
54919
16
      goto exit;
54920
16
    }
54921
2.80k
    {
54922
2.80k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
54923
2.80k
      uint32_t t_1;
54924
2.80k
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
54925
2.80k
        t_1 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src)));
54926
2.80k
        iop_a_src += 2;
54927
2.80k
      } else {
54928
2
        self->private_data.s_decode_sof.scratch = 0;
54929
2
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
54930
3
        while (true) {
54931
3
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
54932
2
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
54933
2
            goto suspend;
54934
2
          }
54935
1
          uint64_t* scratch = &self->private_data.s_decode_sof.scratch;
54936
1
          uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu));
54937
1
          *scratch >>= 8;
54938
1
          *scratch <<= 8;
54939
1
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1);
54940
1
          if (num_bits_1 == 8) {
54941
0
            t_1 = ((uint32_t)(*scratch >> 48));
54942
0
            break;
54943
0
          }
54944
1
          num_bits_1 += 8u;
54945
1
          *scratch |= ((uint64_t)(num_bits_1));
54946
1
        }
54947
2
      }
54948
2.80k
      self->private_impl.f_height = t_1;
54949
2.80k
    }
54950
2.80k
    if (self->private_impl.f_height == 0u) {
54951
1
      status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_implicit_height);
54952
1
      goto exit;
54953
1
    }
54954
2.80k
    {
54955
2.80k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
54956
2.80k
      uint32_t t_2;
54957
2.80k
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
54958
2.78k
        t_2 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src)));
54959
2.78k
        iop_a_src += 2;
54960
2.78k
      } else {
54961
16
        self->private_data.s_decode_sof.scratch = 0;
54962
16
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
54963
17
        while (true) {
54964
17
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
54965
16
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
54966
16
            goto suspend;
54967
16
          }
54968
1
          uint64_t* scratch = &self->private_data.s_decode_sof.scratch;
54969
1
          uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu));
54970
1
          *scratch >>= 8;
54971
1
          *scratch <<= 8;
54972
1
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2);
54973
1
          if (num_bits_2 == 8) {
54974
0
            t_2 = ((uint32_t)(*scratch >> 48));
54975
0
            break;
54976
0
          }
54977
1
          num_bits_2 += 8u;
54978
1
          *scratch |= ((uint64_t)(num_bits_2));
54979
1
        }
54980
16
      }
54981
2.78k
      self->private_impl.f_width = t_2;
54982
2.78k
    }
54983
2.78k
    if (self->private_impl.f_width == 0u) {
54984
1
      status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension);
54985
1
      goto exit;
54986
1
    }
54987
2.78k
    {
54988
2.78k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
54989
2.78k
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
54990
13
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
54991
13
        goto suspend;
54992
13
      }
54993
2.77k
      uint8_t t_3 = *iop_a_src++;
54994
2.77k
      v_c8 = t_3;
54995
2.77k
    }
54996
2.77k
    if ((v_c8 == 0u) || (v_c8 > 4u)) {
54997
12
      status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker);
54998
12
      goto exit;
54999
2.76k
    } else if (v_c8 == 2u) {
55000
2
      status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_color_model);
55001
2
      goto exit;
55002
2
    }
55003
2.75k
    self->private_impl.f_num_components = ((uint32_t)(v_c8));
55004
2.75k
    if (self->private_impl.f_payload_length != (3u * self->private_impl.f_num_components)) {
55005
22
      status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker);
55006
22
      goto exit;
55007
22
    }
55008
2.73k
    self->private_impl.f_payload_length = 0u;
55009
2.73k
    v_i = 0u;
55010
7.16k
    while (v_i < self->private_impl.f_num_components) {
55011
4.48k
      {
55012
4.48k
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
55013
4.48k
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
55014
12
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
55015
12
          goto suspend;
55016
12
        }
55017
4.46k
        uint8_t t_4 = *iop_a_src++;
55018
4.46k
        self->private_impl.f_components_c[v_i] = t_4;
55019
4.46k
      }
55020
0
      {
55021
4.46k
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
55022
4.46k
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
55023
4
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
55024
4
          goto suspend;
55025
4
        }
55026
4.46k
        uint8_t t_5 = *iop_a_src++;
55027
4.46k
        v_c8 = t_5;
55028
4.46k
      }
55029
0
      v_comp_h = ((uint8_t)(v_c8 >> 4u));
55030
4.46k
      v_comp_v = ((uint8_t)(v_c8 & 15u));
55031
4.46k
      if ((v_comp_h == 0u) ||
55032
4.46k
          (v_comp_h > 4u) ||
55033
4.46k
          (v_comp_v == 0u) ||
55034
4.46k
          (v_comp_v > 4u)) {
55035
10
        status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker);
55036
10
        goto exit;
55037
10
      }
55038
4.45k
      self->private_impl.f_components_h[v_i] = v_comp_h;
55039
4.45k
      if (self->private_impl.f_max_incl_components_h < self->private_impl.f_components_h[v_i]) {
55040
3.13k
        self->private_impl.f_max_incl_components_h = self->private_impl.f_components_h[v_i];
55041
3.13k
      }
55042
4.45k
      self->private_impl.f_components_v[v_i] = v_comp_v;
55043
4.45k
      if (self->private_impl.f_max_incl_components_v < self->private_impl.f_components_v[v_i]) {
55044
3.20k
        self->private_impl.f_max_incl_components_v = self->private_impl.f_components_v[v_i];
55045
3.20k
      }
55046
4.45k
      {
55047
4.45k
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
55048
4.45k
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
55049
16
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
55050
16
          goto suspend;
55051
16
        }
55052
4.43k
        uint8_t t_6 = *iop_a_src++;
55053
4.43k
        v_c8 = t_6;
55054
4.43k
      }
55055
4.43k
      if (v_c8 >= 4u) {
55056
8
        status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker);
55057
8
        goto exit;
55058
8
      }
55059
4.43k
      self->private_impl.f_components_tq[v_i] = v_c8;
55060
4.43k
      v_j = 0u;
55061
7.33k
      while (v_j < v_i) {
55062
2.90k
        if (self->private_impl.f_components_c[v_j] == self->private_impl.f_components_c[v_i]) {
55063
2
          status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker);
55064
2
          goto exit;
55065
2
        }
55066
2.90k
        v_j += 1u;
55067
2.90k
      }
55068
4.42k
      v_i += 1u;
55069
4.42k
    }
55070
2.68k
    if (self->private_impl.f_num_components == 1u) {
55071
1.95k
      self->private_impl.f_max_incl_components_h = 1u;
55072
1.95k
      self->private_impl.f_max_incl_components_v = 1u;
55073
1.95k
      self->private_impl.f_components_h[0u] = 1u;
55074
1.95k
      self->private_impl.f_components_v[0u] = 1u;
55075
1.95k
    } else {
55076
732
      v_has_h24 = false;
55077
732
      v_has_h3 = false;
55078
732
      v_has_v24 = false;
55079
732
      v_has_v3 = false;
55080
732
      v_i = 0u;
55081
3.15k
      while (v_i < self->private_impl.f_num_components) {
55082
2.42k
        v_has_h24 = (v_has_h24 || (self->private_impl.f_components_h[v_i] == 2u) || (self->private_impl.f_components_h[v_i] == 4u));
55083
2.42k
        v_has_h3 = (v_has_h3 || (self->private_impl.f_components_h[v_i] == 3u));
55084
2.42k
        v_has_v24 = (v_has_v24 || (self->private_impl.f_components_v[v_i] == 2u) || (self->private_impl.f_components_v[v_i] == 4u));
55085
2.42k
        v_has_v3 = (v_has_v3 || (self->private_impl.f_components_v[v_i] == 3u));
55086
2.42k
        v_i += 1u;
55087
2.42k
      }
55088
732
      if ((v_has_h24 && v_has_h3) || (v_has_v24 && v_has_v3)) {
55089
2
        status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_fractional_sampling);
55090
2
        goto exit;
55091
2
      }
55092
730
      if (self->private_impl.f_num_components == 4u) {
55093
225
        self->private_impl.f_is_rgb_or_cmyk = (self->private_impl.f_is_adobe < 2u);
55094
505
      } else {
55095
505
        if (self->private_impl.f_is_jfif) {
55096
18
          self->private_impl.f_is_rgb_or_cmyk = false;
55097
487
        } else if (self->private_impl.f_is_adobe > 0u) {
55098
7
          self->private_impl.f_is_rgb_or_cmyk = (self->private_impl.f_is_adobe == 1u);
55099
480
        } else {
55100
480
          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));
55101
480
        }
55102
505
      }
55103
730
    }
55104
2.68k
    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);
55105
2.68k
    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);
55106
2.68k
    v_upper_bound = 65544u;
55107
2.68k
    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]))));
55108
2.68k
    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]))));
55109
2.68k
    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]))));
55110
2.68k
    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]))));
55111
2.68k
    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]))));
55112
2.68k
    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]))));
55113
2.68k
    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]))));
55114
2.68k
    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]))));
55115
2.68k
    v_wh0 = (((uint64_t)(self->private_impl.f_components_workbuf_widths[0u])) * ((uint64_t)(self->private_impl.f_components_workbuf_heights[0u])));
55116
2.68k
    v_wh1 = (((uint64_t)(self->private_impl.f_components_workbuf_widths[1u])) * ((uint64_t)(self->private_impl.f_components_workbuf_heights[1u])));
55117
2.68k
    v_wh2 = (((uint64_t)(self->private_impl.f_components_workbuf_widths[2u])) * ((uint64_t)(self->private_impl.f_components_workbuf_heights[2u])));
55118
2.68k
    v_wh3 = (((uint64_t)(self->private_impl.f_components_workbuf_widths[3u])) * ((uint64_t)(self->private_impl.f_components_workbuf_heights[3u])));
55119
2.68k
    v_progressive = 0u;
55120
2.68k
    if (self->private_impl.f_sof_marker >= 194u) {
55121
1.70k
      v_progressive = 2u;
55122
1.70k
      v_i = 0u;
55123
8.51k
      while (v_i < 4u) {
55124
6.81k
        v_j = 0u;
55125
74.9k
        while (v_j < 10u) {
55126
68.1k
          self->private_impl.f_block_smoothing_lowest_scan_al[v_i][v_j] = 16u;
55127
68.1k
          v_j += 1u;
55128
68.1k
        }
55129
6.81k
        v_i += 1u;
55130
6.81k
      }
55131
1.70k
    }
55132
2.68k
    self->private_impl.f_components_workbuf_offsets[0u] = 0u;
55133
2.68k
    self->private_impl.f_components_workbuf_offsets[1u] = (self->private_impl.f_components_workbuf_offsets[0u] + v_wh0);
55134
2.68k
    self->private_impl.f_components_workbuf_offsets[2u] = (self->private_impl.f_components_workbuf_offsets[1u] + v_wh1);
55135
2.68k
    self->private_impl.f_components_workbuf_offsets[3u] = (self->private_impl.f_components_workbuf_offsets[2u] + v_wh2);
55136
2.68k
    self->private_impl.f_components_workbuf_offsets[4u] = (self->private_impl.f_components_workbuf_offsets[3u] + v_wh3);
55137
2.68k
    self->private_impl.f_components_workbuf_offsets[5u] = (self->private_impl.f_components_workbuf_offsets[4u] + (v_wh0 * v_progressive));
55138
2.68k
    self->private_impl.f_components_workbuf_offsets[6u] = (self->private_impl.f_components_workbuf_offsets[5u] + (v_wh1 * v_progressive));
55139
2.68k
    self->private_impl.f_components_workbuf_offsets[7u] = (self->private_impl.f_components_workbuf_offsets[6u] + (v_wh2 * v_progressive));
55140
2.68k
    self->private_impl.f_components_workbuf_offsets[8u] = (self->private_impl.f_components_workbuf_offsets[7u] + (v_wh3 * v_progressive));
55141
55142
2.68k
    goto ok;
55143
2.68k
    ok:
55144
2.68k
    self->private_impl.p_decode_sof = 0;
55145
2.68k
    goto exit;
55146
2.84k
  }
55147
55148
0
  goto suspend;
55149
78
  suspend:
55150
78
  self->private_impl.p_decode_sof = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
55151
78
  self->private_data.s_decode_sof.v_i = v_i;
55152
55153
78
  goto exit;
55154
2.84k
  exit:
55155
2.84k
  if (a_src && a_src->data.ptr) {
55156
2.84k
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
55157
2.84k
  }
55158
55159
2.84k
  return status;
55160
2.84k
}
55161
55162
// -------- func jpeg.decoder.quantize_dimension
55163
55164
WUFFS_BASE__GENERATED_C_CODE
55165
static uint32_t
55166
wuffs_jpeg__decoder__quantize_dimension(
55167
    const wuffs_jpeg__decoder* self,
55168
    uint32_t a_width,
55169
    uint8_t a_h,
55170
15.5k
    uint8_t a_max_incl_h) {
55171
15.5k
  uint32_t v_ratio = 0;
55172
55173
15.5k
  v_ratio = 0u;
55174
15.5k
  if (a_h > 0u) {
55175
15.5k
    v_ratio = ((uint32_t)(((uint8_t)(a_max_incl_h / a_h))));
55176
15.5k
  }
55177
15.5k
  if (v_ratio == 1u) {
55178
12.5k
    return ((a_width + 7u) / 8u);
55179
12.5k
  } else if (v_ratio == 2u) {
55180
1.19k
    return ((a_width + 15u) / 16u);
55181
1.74k
  } else if (v_ratio == 3u) {
55182
842
    return ((a_width + 23u) / 24u);
55183
842
  }
55184
899
  return ((a_width + 31u) / 32u);
55185
15.5k
}
55186
55187
// -------- func jpeg.decoder.decode_frame_config
55188
55189
WUFFS_BASE__GENERATED_C_CODE
55190
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
55191
wuffs_jpeg__decoder__decode_frame_config(
55192
    wuffs_jpeg__decoder* self,
55193
    wuffs_base__frame_config* a_dst,
55194
2.67k
    wuffs_base__io_buffer* a_src) {
55195
2.67k
  if (!self) {
55196
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
55197
0
  }
55198
2.67k
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
55199
0
    return wuffs_base__make_status(
55200
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
55201
0
        ? wuffs_base__error__disabled_by_previous_error
55202
0
        : wuffs_base__error__initialize_not_called);
55203
0
  }
55204
2.67k
  if (!a_src) {
55205
0
    self->private_impl.magic = WUFFS_BASE__DISABLED;
55206
0
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
55207
0
  }
55208
2.67k
  if ((self->private_impl.active_coroutine != 0) &&
55209
2.67k
      (self->private_impl.active_coroutine != 2)) {
55210
0
    self->private_impl.magic = WUFFS_BASE__DISABLED;
55211
0
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
55212
0
  }
55213
2.67k
  self->private_impl.active_coroutine = 0;
55214
2.67k
  wuffs_base__status status = wuffs_base__make_status(NULL);
55215
55216
2.67k
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
55217
55218
2.67k
  uint32_t coro_susp_point = self->private_impl.p_decode_frame_config;
55219
2.67k
  switch (coro_susp_point) {
55220
2.67k
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
55221
55222
2.67k
    while (true) {
55223
2.67k
      {
55224
2.67k
        wuffs_base__status t_0 = wuffs_jpeg__decoder__do_decode_frame_config(self, a_dst, a_src);
55225
2.67k
        v_status = t_0;
55226
2.67k
      }
55227
2.67k
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
55228
0
        status = wuffs_base__make_status(wuffs_jpeg__error__truncated_input);
55229
0
        goto exit;
55230
0
      }
55231
2.67k
      status = v_status;
55232
2.67k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
55233
0
    }
55234
55235
2.66k
    ok:
55236
2.66k
    self->private_impl.p_decode_frame_config = 0;
55237
2.66k
    goto exit;
55238
2.67k
  }
55239
55240
0
  goto suspend;
55241
0
  suspend:
55242
0
  self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
55243
0
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0;
55244
55245
0
  goto exit;
55246
2.67k
  exit:
55247
2.67k
  if (wuffs_base__status__is_error(&status)) {
55248
0
    self->private_impl.magic = WUFFS_BASE__DISABLED;
55249
0
  }
55250
2.67k
  return status;
55251
2.67k
}
55252
55253
// -------- func jpeg.decoder.do_decode_frame_config
55254
55255
WUFFS_BASE__GENERATED_C_CODE
55256
static wuffs_base__status
55257
wuffs_jpeg__decoder__do_decode_frame_config(
55258
    wuffs_jpeg__decoder* self,
55259
    wuffs_base__frame_config* a_dst,
55260
2.67k
    wuffs_base__io_buffer* a_src) {
55261
2.67k
  wuffs_base__status status = wuffs_base__make_status(NULL);
55262
55263
2.67k
  const uint8_t* iop_a_src = NULL;
55264
2.67k
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
55265
2.67k
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
55266
2.67k
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
55267
2.67k
  if (a_src && a_src->data.ptr) {
55268
2.67k
    io0_a_src = a_src->data.ptr;
55269
2.67k
    io1_a_src = io0_a_src + a_src->meta.ri;
55270
2.67k
    iop_a_src = io1_a_src;
55271
2.67k
    io2_a_src = io0_a_src + a_src->meta.wi;
55272
2.67k
  }
55273
55274
2.67k
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config;
55275
2.67k
  switch (coro_susp_point) {
55276
2.67k
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
55277
55278
2.67k
    if (self->private_impl.f_call_sequence == 32u) {
55279
2.66k
    } else if (self->private_impl.f_call_sequence < 32u) {
55280
0
      if (a_src) {
55281
0
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
55282
0
      }
55283
0
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
55284
0
      status = wuffs_jpeg__decoder__do_decode_image_config(self, NULL, a_src);
55285
0
      if (a_src) {
55286
0
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
55287
0
      }
55288
0
      if (status.repr) {
55289
0
        goto suspend;
55290
0
      }
55291
5
    } else if (self->private_impl.f_call_sequence == 40u) {
55292
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)))) {
55293
0
        status = wuffs_base__make_status(wuffs_base__error__bad_restart);
55294
0
        goto exit;
55295
0
      }
55296
5
    } else if (self->private_impl.f_call_sequence == 64u) {
55297
0
      self->private_impl.f_call_sequence = 96u;
55298
0
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
55299
0
      goto ok;
55300
5
    } else {
55301
5
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
55302
5
      goto ok;
55303
5
    }
55304
2.66k
    if (a_dst != NULL) {
55305
2.66k
      wuffs_base__frame_config__set(
55306
2.66k
          a_dst,
55307
2.66k
          wuffs_base__utility__make_rect_ie_u32(
55308
2.66k
          0u,
55309
2.66k
          0u,
55310
2.66k
          self->private_impl.f_width,
55311
2.66k
          self->private_impl.f_height),
55312
2.66k
          ((wuffs_base__flicks)(0u)),
55313
2.66k
          0u,
55314
2.66k
          self->private_impl.f_frame_config_io_position,
55315
2.66k
          0u,
55316
2.66k
          true,
55317
2.66k
          false,
55318
2.66k
          4278190080u);
55319
2.66k
    }
55320
2.66k
    self->private_impl.f_call_sequence = 64u;
55321
55322
2.67k
    ok:
55323
2.67k
    self->private_impl.p_do_decode_frame_config = 0;
55324
2.67k
    goto exit;
55325
2.67k
  }
55326
55327
0
  goto suspend;
55328
0
  suspend:
55329
0
  self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
55330
55331
0
  goto exit;
55332
2.67k
  exit:
55333
2.67k
  if (a_src && a_src->data.ptr) {
55334
2.67k
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
55335
2.67k
  }
55336
55337
2.67k
  return status;
55338
2.67k
}
55339
55340
// -------- func jpeg.decoder.decode_frame
55341
55342
WUFFS_BASE__GENERATED_C_CODE
55343
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
55344
wuffs_jpeg__decoder__decode_frame(
55345
    wuffs_jpeg__decoder* self,
55346
    wuffs_base__pixel_buffer* a_dst,
55347
    wuffs_base__io_buffer* a_src,
55348
    wuffs_base__pixel_blend a_blend,
55349
    wuffs_base__slice_u8 a_workbuf,
55350
2.66k
    wuffs_base__decode_frame_options* a_opts) {
55351
2.66k
  if (!self) {
55352
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
55353
0
  }
55354
2.66k
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
55355
0
    return wuffs_base__make_status(
55356
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
55357
0
        ? wuffs_base__error__disabled_by_previous_error
55358
0
        : wuffs_base__error__initialize_not_called);
55359
0
  }
55360
2.66k
  if (!a_dst || !a_src) {
55361
0
    self->private_impl.magic = WUFFS_BASE__DISABLED;
55362
0
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
55363
0
  }
55364
2.66k
  if ((self->private_impl.active_coroutine != 0) &&
55365
2.66k
      (self->private_impl.active_coroutine != 3)) {
55366
0
    self->private_impl.magic = WUFFS_BASE__DISABLED;
55367
0
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
55368
0
  }
55369
2.66k
  self->private_impl.active_coroutine = 0;
55370
2.66k
  wuffs_base__status status = wuffs_base__make_status(NULL);
55371
55372
2.66k
  wuffs_base__status v_ddf_status = wuffs_base__make_status(NULL);
55373
2.66k
  wuffs_base__status v_swizzle_status = wuffs_base__make_status(NULL);
55374
2.66k
  uint32_t v_scan_count = 0;
55375
55376
2.66k
  uint32_t coro_susp_point = self->private_impl.p_decode_frame;
55377
2.66k
  switch (coro_susp_point) {
55378
2.66k
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
55379
55380
2.66k
    while (true) {
55381
2.66k
      v_scan_count = self->private_impl.f_scan_count;
55382
2.66k
      {
55383
2.66k
        wuffs_base__status t_0 = wuffs_jpeg__decoder__do_decode_frame(self,
55384
2.66k
            a_dst,
55385
2.66k
            a_src,
55386
2.66k
            a_blend,
55387
2.66k
            a_workbuf,
55388
2.66k
            a_opts);
55389
2.66k
        v_ddf_status = t_0;
55390
2.66k
      }
55391
2.66k
      if ((v_ddf_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
55392
1.81k
        v_ddf_status = wuffs_base__make_status(wuffs_jpeg__error__truncated_input);
55393
1.81k
      }
55394
2.66k
      if ( ! self->private_impl.f_swizzle_immediately && (wuffs_base__status__is_error(&v_ddf_status) || (v_scan_count < self->private_impl.f_scan_count))) {
55395
2.52k
        if (self->private_impl.f_sof_marker >= 194u) {
55396
1.63k
          wuffs_jpeg__decoder__apply_progressive_idct(self, a_workbuf);
55397
1.63k
        }
55398
2.52k
        if (self->private_impl.f_num_components == 1u) {
55399
1.83k
          v_swizzle_status = wuffs_jpeg__decoder__swizzle_gray(self,
55400
1.83k
              a_dst,
55401
1.83k
              a_workbuf,
55402
1.83k
              0u,
55403
1.83k
              4294967295u,
55404
1.83k
              0u,
55405
1.83k
              4294967295u,
55406
1.83k
              ((uint64_t)(self->private_impl.f_components_workbuf_widths[0u])));
55407
1.83k
        } else {
55408
689
          v_swizzle_status = wuffs_jpeg__decoder__swizzle_colorful(self,
55409
689
              a_dst,
55410
689
              a_workbuf,
55411
689
              0u,
55412
689
              4294967295u,
55413
689
              0u,
55414
689
              4294967295u);
55415
689
        }
55416
2.52k
        if (wuffs_base__status__is_error(&v_ddf_status)) {
55417
2.27k
          status = v_ddf_status;
55418
2.27k
          goto exit;
55419
2.27k
        } else if (wuffs_base__status__is_error(&v_swizzle_status)) {
55420
0
          status = v_swizzle_status;
55421
0
          goto exit;
55422
0
        }
55423
2.52k
      }
55424
388
      status = v_ddf_status;
55425
388
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
55426
0
    }
55427
55428
5
    ok:
55429
5
    self->private_impl.p_decode_frame = 0;
55430
5
    goto exit;
55431
2.66k
  }
55432
55433
0
  goto suspend;
55434
383
  suspend:
55435
383
  self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
55436
383
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0;
55437
55438
383
  goto exit;
55439
2.66k
  exit:
55440
2.66k
  if (wuffs_base__status__is_error(&status)) {
55441
2.27k
    self->private_impl.magic = WUFFS_BASE__DISABLED;
55442
2.27k
  }
55443
2.66k
  return status;
55444
2.66k
}
55445
55446
// -------- func jpeg.decoder.do_decode_frame
55447
55448
WUFFS_BASE__GENERATED_C_CODE
55449
static wuffs_base__status
55450
wuffs_jpeg__decoder__do_decode_frame(
55451
    wuffs_jpeg__decoder* self,
55452
    wuffs_base__pixel_buffer* a_dst,
55453
    wuffs_base__io_buffer* a_src,
55454
    wuffs_base__pixel_blend a_blend,
55455
    wuffs_base__slice_u8 a_workbuf,
55456
2.66k
    wuffs_base__decode_frame_options* a_opts) {
55457
2.66k
  wuffs_base__status status = wuffs_base__make_status(NULL);
55458
55459
2.66k
  uint32_t v_pixfmt = 0;
55460
2.66k
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
55461
2.66k
  uint8_t v_c8 = 0;
55462
2.66k
  uint8_t v_marker = 0;
55463
55464
2.66k
  const uint8_t* iop_a_src = NULL;
55465
2.66k
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
55466
2.66k
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
55467
2.66k
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
55468
2.66k
  if (a_src && a_src->data.ptr) {
55469
2.66k
    io0_a_src = a_src->data.ptr;
55470
2.66k
    io1_a_src = io0_a_src + a_src->meta.ri;
55471
2.66k
    iop_a_src = io1_a_src;
55472
2.66k
    io2_a_src = io0_a_src + a_src->meta.wi;
55473
2.66k
  }
55474
55475
2.66k
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame;
55476
2.66k
  if (coro_susp_point) {
55477
0
    v_marker = self->private_data.s_do_decode_frame.v_marker;
55478
0
  }
55479
2.66k
  switch (coro_susp_point) {
55480
2.66k
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
55481
55482
2.66k
    if (self->private_impl.f_call_sequence == 64u) {
55483
2.66k
    } else if (self->private_impl.f_call_sequence < 64u) {
55484
0
      if (a_src) {
55485
0
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
55486
0
      }
55487
0
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
55488
0
      status = wuffs_jpeg__decoder__do_decode_frame_config(self, NULL, a_src);
55489
0
      if (a_src) {
55490
0
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
55491
0
      }
55492
0
      if (status.repr) {
55493
0
        goto suspend;
55494
0
      }
55495
0
    } else {
55496
0
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
55497
0
      goto ok;
55498
0
    }
55499
2.66k
    v_pixfmt = 536870920u;
55500
2.66k
    if (self->private_impl.f_num_components > 1u) {
55501
719
      v_pixfmt = 2415954056u;
55502
719
    }
55503
2.66k
    v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler,
55504
2.66k
        wuffs_base__pixel_buffer__pixel_format(a_dst),
55505
2.66k
        wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)),
55506
2.66k
        wuffs_base__utility__make_pixel_format(v_pixfmt),
55507
2.66k
        wuffs_base__utility__empty_slice_u8(),
55508
2.66k
        a_blend);
55509
2.66k
    if ( ! wuffs_base__status__is_ok(&v_status)) {
55510
0
      status = v_status;
55511
0
      if (wuffs_base__status__is_error(&status)) {
55512
0
        goto exit;
55513
0
      } else if (wuffs_base__status__is_suspension(&status)) {
55514
0
        status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
55515
0
        goto exit;
55516
0
      }
55517
0
      goto ok;
55518
0
    }
55519
2.66k
    self->private_impl.f_swizzle_immediately = false;
55520
2.66k
    if (self->private_impl.f_components_workbuf_offsets[8u] > ((uint64_t)(a_workbuf.len))) {
55521
0
      if ((self->private_impl.f_sof_marker >= 194u) ||  ! self->private_impl.f_use_lower_quality) {
55522
0
        status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length);
55523
0
        goto exit;
55524
0
      }
55525
0
      self->private_impl.f_swizzle_immediately = true;
55526
0
      self->private_impl.f_swizzle_immediately_status = wuffs_base__make_status(NULL);
55527
2.66k
    } else if (self->private_impl.f_components_workbuf_offsets[4u] < self->private_impl.f_components_workbuf_offsets[8u]) {
55528
1.69k
      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);
55529
1.69k
    }
55530
2.66k
    if (self->private_impl.f_components_workbuf_offsets[4u] <= ((uint64_t)(a_workbuf.len))) {
55531
2.66k
      wuffs_private_impl__bulk_memset(a_workbuf.ptr, self->private_impl.f_components_workbuf_offsets[4u], 128u);
55532
2.66k
    }
55533
31.7k
    while (true) {
55534
239k
      while (true) {
55535
239k
        {
55536
239k
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
55537
239k
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
55538
534
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
55539
534
            goto suspend;
55540
534
          }
55541
239k
          uint8_t t_0 = *iop_a_src++;
55542
239k
          v_c8 = t_0;
55543
239k
        }
55544
239k
        if (v_c8 == 255u) {
55545
31.1k
          break;
55546
31.1k
        }
55547
239k
      }
55548
40.1k
      while (true) {
55549
40.1k
        {
55550
40.1k
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
55551
40.1k
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
55552
18
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
55553
18
            goto suspend;
55554
18
          }
55555
40.1k
          uint8_t t_1 = *iop_a_src++;
55556
40.1k
          v_c8 = t_1;
55557
40.1k
        }
55558
40.1k
        if (v_c8 != 255u) {
55559
31.1k
          v_marker = v_c8;
55560
31.1k
          break;
55561
31.1k
        }
55562
40.1k
      }
55563
31.1k
      if (v_marker == 0u) {
55564
6.08k
        continue;
55565
25.0k
      } else if ((208u <= v_marker) && (v_marker <= 217u)) {
55566
871
        if (v_marker <= 215u) {
55567
830
          continue;
55568
830
        }
55569
24.2k
      } else {
55570
24.2k
        {
55571
24.2k
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
55572
24.2k
          uint32_t t_2;
55573
24.2k
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
55574
23.9k
            t_2 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src)));
55575
23.9k
            iop_a_src += 2;
55576
23.9k
          } else {
55577
270
            self->private_data.s_do_decode_frame.scratch = 0;
55578
270
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
55579
279
            while (true) {
55580
279
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
55581
270
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
55582
270
                goto suspend;
55583
270
              }
55584
9
              uint64_t* scratch = &self->private_data.s_do_decode_frame.scratch;
55585
9
              uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu));
55586
9
              *scratch >>= 8;
55587
9
              *scratch <<= 8;
55588
9
              *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2);
55589
9
              if (num_bits_2 == 8) {
55590
0
                t_2 = ((uint32_t)(*scratch >> 48));
55591
0
                break;
55592
0
              }
55593
9
              num_bits_2 += 8u;
55594
9
              *scratch |= ((uint64_t)(num_bits_2));
55595
9
            }
55596
270
          }
55597
23.9k
          self->private_impl.f_payload_length = t_2;
55598
23.9k
        }
55599
23.9k
        if (self->private_impl.f_payload_length < 2u) {
55600
3
          status = wuffs_base__make_status(wuffs_jpeg__error__bad_marker);
55601
3
          goto exit;
55602
3
        }
55603
23.9k
        self->private_impl.f_payload_length -= 2u;
55604
23.9k
      }
55605
23.9k
      if (v_marker < 192u) {
55606
27
        status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker);
55607
27
        goto exit;
55608
23.9k
      } else if (v_marker < 208u) {
55609
1.12k
        if (v_marker == 196u) {
55610
1.11k
          if (a_src) {
55611
1.11k
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
55612
1.11k
          }
55613
1.11k
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
55614
1.11k
          status = wuffs_jpeg__decoder__decode_dht(self, a_src);
55615
1.11k
          if (a_src) {
55616
1.11k
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
55617
1.11k
          }
55618
1.11k
          if (status.repr) {
55619
16
            goto suspend;
55620
16
          }
55621
1.09k
          continue;
55622
1.11k
        } else if (v_marker == 200u) {
55623
1
          status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker);
55624
1
          goto exit;
55625
1
        }
55626
14
        status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker);
55627
14
        goto exit;
55628
22.8k
      } else if (v_marker < 224u) {
55629
4.30k
        if (v_marker < 217u) {
55630
36
          status = wuffs_base__make_status(wuffs_jpeg__error__bad_marker);
55631
36
          goto exit;
55632
4.26k
        } else if (v_marker == 217u) {
55633
5
          break;
55634
4.26k
        } else if (v_marker == 218u) {
55635
3.48k
          if (a_src) {
55636
3.48k
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
55637
3.48k
          }
55638
3.48k
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
55639
3.48k
          status = wuffs_jpeg__decoder__decode_sos(self, a_dst, a_src, a_workbuf);
55640
3.48k
          if (a_src) {
55641
3.48k
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
55642
3.48k
          }
55643
3.48k
          if (status.repr) {
55644
1.68k
            goto suspend;
55645
1.68k
          }
55646
1.80k
          continue;
55647
3.48k
        } else if (v_marker == 219u) {
55648
218
          if (a_src) {
55649
218
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
55650
218
          }
55651
218
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
55652
218
          status = wuffs_jpeg__decoder__decode_dqt(self, a_src);
55653
218
          if (a_src) {
55654
218
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
55655
218
          }
55656
218
          if (status.repr) {
55657
19
            goto suspend;
55658
19
          }
55659
199
          continue;
55660
555
        } else if (v_marker == 221u) {
55661
551
          if (a_src) {
55662
551
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
55663
551
          }
55664
551
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
55665
551
          status = wuffs_jpeg__decoder__decode_dri(self, a_src);
55666
551
          if (a_src) {
55667
551
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
55668
551
          }
55669
551
          if (status.repr) {
55670
7
            goto suspend;
55671
7
          }
55672
544
          continue;
55673
551
        } else {
55674
4
          status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker);
55675
4
          goto exit;
55676
4
        }
55677
18.5k
      } else if (v_marker < 240u) {
55678
17.4k
      } else {
55679
1.08k
        if (v_marker == 254u) {
55680
1.08k
        } else {
55681
4
          status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker);
55682
4
          goto exit;
55683
4
        }
55684
1.08k
      }
55685
18.5k
      self->private_data.s_do_decode_frame.scratch = self->private_impl.f_payload_length;
55686
18.5k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
55687
18.5k
      if (self->private_data.s_do_decode_frame.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
55688
24
        self->private_data.s_do_decode_frame.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
55689
24
        iop_a_src = io2_a_src;
55690
24
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
55691
24
        goto suspend;
55692
24
      }
55693
18.4k
      iop_a_src += self->private_data.s_do_decode_frame.scratch;
55694
18.4k
      self->private_impl.f_payload_length = 0u;
55695
18.4k
    }
55696
5
    self->private_impl.f_call_sequence = 96u;
55697
55698
5
    ok:
55699
5
    self->private_impl.p_do_decode_frame = 0;
55700
5
    goto exit;
55701
2.66k
  }
55702
55703
0
  goto suspend;
55704
2.57k
  suspend:
55705
2.57k
  self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
55706
2.57k
  self->private_data.s_do_decode_frame.v_marker = v_marker;
55707
55708
2.57k
  goto exit;
55709
2.66k
  exit:
55710
2.66k
  if (a_src && a_src->data.ptr) {
55711
2.66k
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
55712
2.66k
  }
55713
55714
2.66k
  return status;
55715
2.66k
}
55716
55717
// -------- func jpeg.decoder.decode_dht
55718
55719
WUFFS_BASE__GENERATED_C_CODE
55720
static wuffs_base__status
55721
wuffs_jpeg__decoder__decode_dht(
55722
    wuffs_jpeg__decoder* self,
55723
4.16k
    wuffs_base__io_buffer* a_src) {
55724
4.16k
  wuffs_base__status status = wuffs_base__make_status(NULL);
55725
55726
4.16k
  uint8_t v_c8 = 0;
55727
4.16k
  uint8_t v_tc = 0;
55728
4.16k
  uint8_t v_th = 0;
55729
4.16k
  uint8_t v_tc4_th = 0;
55730
4.16k
  uint32_t v_working_total_count = 0;
55731
4.16k
  uint32_t v_total_count = 0;
55732
4.16k
  uint32_t v_i = 0;
55733
4.16k
  bool v_failed = false;
55734
55735
4.16k
  const uint8_t* iop_a_src = NULL;
55736
4.16k
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
55737
4.16k
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
55738
4.16k
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
55739
4.16k
  if (a_src && a_src->data.ptr) {
55740
4.16k
    io0_a_src = a_src->data.ptr;
55741
4.16k
    io1_a_src = io0_a_src + a_src->meta.ri;
55742
4.16k
    iop_a_src = io1_a_src;
55743
4.16k
    io2_a_src = io0_a_src + a_src->meta.wi;
55744
4.16k
  }
55745
55746
4.16k
  uint32_t coro_susp_point = self->private_impl.p_decode_dht;
55747
4.16k
  if (coro_susp_point) {
55748
0
    v_tc4_th = self->private_data.s_decode_dht.v_tc4_th;
55749
0
    v_total_count = self->private_data.s_decode_dht.v_total_count;
55750
0
    v_i = self->private_data.s_decode_dht.v_i;
55751
0
  }
55752
4.16k
  switch (coro_susp_point) {
55753
4.16k
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
55754
55755
10.0k
    while (self->private_impl.f_payload_length > 0u) {
55756
6.08k
      if (self->private_impl.f_payload_length < 17u) {
55757
8
        status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker);
55758
8
        goto exit;
55759
8
      }
55760
6.08k
      self->private_impl.f_payload_length -= 17u;
55761
6.08k
      {
55762
6.08k
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
55763
6.08k
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
55764
98
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
55765
98
          goto suspend;
55766
98
        }
55767
5.98k
        uint8_t t_0 = *iop_a_src++;
55768
5.98k
        v_c8 = t_0;
55769
5.98k
      }
55770
5.98k
      if ((((uint8_t)(v_c8 >> 4u)) > 1u) || (((uint8_t)(v_c8 & 15u)) > 3u)) {
55771
11
        status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker);
55772
11
        goto exit;
55773
11
      }
55774
5.97k
      v_tc = ((uint8_t)(v_c8 >> 4u));
55775
5.97k
      v_th = ((uint8_t)(v_c8 & 15u));
55776
5.97k
      v_tc4_th = ((uint8_t)(((uint8_t)(((uint8_t)(v_tc * 4u)) | v_th))));
55777
5.97k
      if ((self->private_impl.f_sof_marker == 192u) && (((uint8_t)(v_tc4_th & 3u)) > 1u)) {
55778
1
        status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker);
55779
1
        goto exit;
55780
1
      }
55781
5.97k
      v_i = 0u;
55782
101k
      while (v_i < 16u) {
55783
95.1k
        {
55784
95.1k
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
55785
95.1k
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
55786
30
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
55787
30
            goto suspend;
55788
30
          }
55789
95.1k
          uint8_t t_1 = *iop_a_src++;
55790
95.1k
          self->private_data.f_dht_temp_counts[v_i] = t_1;
55791
95.1k
        }
55792
0
        v_i += 1u;
55793
95.1k
      }
55794
5.94k
      v_working_total_count = 0u;
55795
5.94k
      v_i = 0u;
55796
100k
      while (v_i < 16u) {
55797
95.0k
        v_working_total_count = ((v_working_total_count + ((uint32_t)(self->private_data.f_dht_temp_counts[v_i]))) & 65535u);
55798
95.0k
        v_i += 1u;
55799
95.0k
      }
55800
5.94k
      if ((v_working_total_count <= 0u) || (256u < v_working_total_count)) {
55801
6
        status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker);
55802
6
        goto exit;
55803
6
      }
55804
5.93k
      v_total_count = v_working_total_count;
55805
5.93k
      if (self->private_impl.f_payload_length < v_total_count) {
55806
3
        status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker);
55807
3
        goto exit;
55808
3
      }
55809
5.93k
      self->private_impl.f_payload_length -= v_total_count;
55810
5.93k
      v_i = 0u;
55811
264k
      while (v_i < v_total_count) {
55812
258k
        {
55813
258k
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
55814
258k
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
55815
35
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
55816
35
            goto suspend;
55817
35
          }
55818
258k
          uint8_t t_2 = *iop_a_src++;
55819
258k
          self->private_impl.f_huff_tables_symbols[v_tc4_th][v_i] = t_2;
55820
258k
        }
55821
0
        v_i += 1u;
55822
258k
      }
55823
1.25M
      while (v_i < 256u) {
55824
1.25M
        self->private_impl.f_huff_tables_symbols[v_tc4_th][v_i] = 0u;
55825
1.25M
        v_i += 1u;
55826
1.25M
      }
55827
5.89k
      if (((uint8_t)(v_tc4_th & 4u)) == 0u) {
55828
3.54k
        v_i = 0u;
55829
23.5k
        while (v_i < v_total_count) {
55830
20.0k
          if (self->private_impl.f_huff_tables_symbols[v_tc4_th][v_i] > 15u) {
55831
15
            status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker);
55832
15
            goto exit;
55833
15
          }
55834
19.9k
          v_i += 1u;
55835
19.9k
        }
55836
3.54k
      }
55837
5.88k
      v_failed = wuffs_jpeg__decoder__calculate_huff_tables(self, v_tc4_th, v_total_count);
55838
5.88k
      if (v_failed) {
55839
6
        status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker);
55840
6
        goto exit;
55841
6
      }
55842
5.87k
      self->private_impl.f_seen_dht[v_tc4_th] = true;
55843
5.87k
    }
55844
55845
3.95k
    goto ok;
55846
3.95k
    ok:
55847
3.95k
    self->private_impl.p_decode_dht = 0;
55848
3.95k
    goto exit;
55849
4.16k
  }
55850
55851
0
  goto suspend;
55852
163
  suspend:
55853
163
  self->private_impl.p_decode_dht = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
55854
163
  self->private_data.s_decode_dht.v_tc4_th = v_tc4_th;
55855
163
  self->private_data.s_decode_dht.v_total_count = v_total_count;
55856
163
  self->private_data.s_decode_dht.v_i = v_i;
55857
55858
163
  goto exit;
55859
4.16k
  exit:
55860
4.16k
  if (a_src && a_src->data.ptr) {
55861
4.16k
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
55862
4.16k
  }
55863
55864
4.16k
  return status;
55865
4.16k
}
55866
55867
// -------- func jpeg.decoder.calculate_huff_tables
55868
55869
WUFFS_BASE__GENERATED_C_CODE
55870
static bool
55871
wuffs_jpeg__decoder__calculate_huff_tables(
55872
    wuffs_jpeg__decoder* self,
55873
    uint8_t a_tc4_th,
55874
5.88k
    uint32_t a_total_count) {
55875
5.88k
  uint32_t v_i = 0;
55876
5.88k
  uint8_t v_j = 0;
55877
5.88k
  uint8_t v_k = 0;
55878
5.88k
  uint32_t v_bit_length_minus_one = 0;
55879
5.88k
  uint8_t v_bit_length = 0;
55880
5.88k
  uint32_t v_bit_string = 0;
55881
5.88k
  uint32_t v_slow = 0;
55882
5.88k
  uint8_t v_prefix = 0;
55883
5.88k
  uint16_t v_fast = 0;
55884
5.88k
  uint32_t v_reps = 0;
55885
55886
5.88k
  v_i = 0u;
55887
5.88k
  v_k = 0u;
55888
5.88k
  v_bit_length_minus_one = 0u;
55889
261k
  while (v_i < a_total_count) {
55890
313k
    while (v_k >= self->private_data.f_dht_temp_counts[v_bit_length_minus_one]) {
55891
57.7k
      v_k = 0u;
55892
57.7k
      v_bit_length_minus_one = ((v_bit_length_minus_one + 1u) & 15u);
55893
57.7k
    }
55894
256k
#if defined(__GNUC__)
55895
256k
#pragma GCC diagnostic push
55896
256k
#pragma GCC diagnostic ignored "-Wconversion"
55897
256k
#endif
55898
256k
    v_k += 1u;
55899
256k
#if defined(__GNUC__)
55900
256k
#pragma GCC diagnostic pop
55901
256k
#endif
55902
256k
    self->private_data.f_dht_temp_bit_lengths[v_i] = ((uint8_t)((v_bit_length_minus_one + 1u)));
55903
256k
    v_i += 1u;
55904
256k
  }
55905
5.88k
  v_bit_length = 0u;
55906
5.88k
  v_bit_string = 0u;
55907
5.88k
  v_i = 0u;
55908
261k
  while (v_i < a_total_count) {
55909
319k
    while (v_bit_length < self->private_data.f_dht_temp_bit_lengths[v_i]) {
55910
63.6k
      if (v_bit_length >= 16u) {
55911
0
        return true;
55912
0
      }
55913
63.6k
#if defined(__GNUC__)
55914
63.6k
#pragma GCC diagnostic push
55915
63.6k
#pragma GCC diagnostic ignored "-Wconversion"
55916
63.6k
#endif
55917
63.6k
      v_bit_length += 1u;
55918
63.6k
#if defined(__GNUC__)
55919
63.6k
#pragma GCC diagnostic pop
55920
63.6k
#endif
55921
63.6k
      v_bit_string <<= 1u;
55922
63.6k
    }
55923
255k
    self->private_data.f_dht_temp_bit_strings[v_i] = ((uint16_t)(v_bit_string));
55924
255k
    v_bit_string += 1u;
55925
255k
    if ((v_bit_string >> v_bit_length) > 0u) {
55926
6
      return true;
55927
6
    }
55928
255k
    v_i += 1u;
55929
255k
  }
55930
5.87k
  v_k = 0u;
55931
5.87k
  v_bit_length_minus_one = 0u;
55932
94.0k
  while (true) {
55933
94.0k
    if (self->private_data.f_dht_temp_counts[v_bit_length_minus_one] == 0u) {
55934
57.9k
      self->private_impl.f_huff_tables_slow[a_tc4_th][v_bit_length_minus_one] = 0u;
55935
57.9k
    } else {
55936
36.1k
      v_slow = (255u & ((uint32_t)(((uint32_t)(v_k)) - ((uint32_t)(self->private_data.f_dht_temp_bit_strings[v_k])))));
55937
36.1k
#if defined(__GNUC__)
55938
36.1k
#pragma GCC diagnostic push
55939
36.1k
#pragma GCC diagnostic ignored "-Wconversion"
55940
36.1k
#endif
55941
36.1k
      v_k += self->private_data.f_dht_temp_counts[v_bit_length_minus_one];
55942
36.1k
#if defined(__GNUC__)
55943
36.1k
#pragma GCC diagnostic pop
55944
36.1k
#endif
55945
36.1k
      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));
55946
36.1k
    }
55947
94.0k
    v_bit_length_minus_one = ((v_bit_length_minus_one + 1u) & 15u);
55948
94.0k
    if (v_bit_length_minus_one == 0u) {
55949
5.87k
      break;
55950
5.87k
    }
55951
94.0k
  }
55952
5.87k
  v_i = 0u;
55953
1.51M
  while (v_i < 256u) {
55954
1.50M
    self->private_impl.f_huff_tables_fast[a_tc4_th][v_i] = 65535u;
55955
1.50M
    v_i += 1u;
55956
1.50M
  }
55957
5.87k
  v_j = 0u;
55958
5.87k
  v_bit_length_minus_one = 0u;
55959
52.8k
  while (v_bit_length_minus_one < 8u) {
55960
47.0k
    v_k = 0u;
55961
99.2k
    while (v_k < self->private_data.f_dht_temp_counts[v_bit_length_minus_one]) {
55962
52.2k
      v_prefix = ((uint8_t)((((uint32_t)(self->private_data.f_dht_temp_bit_strings[v_j])) << (7u - v_bit_length_minus_one))));
55963
52.2k
      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])))));
55964
52.2k
      v_reps = (((uint32_t)(1u)) << (7u - v_bit_length_minus_one));
55965
918k
      while (v_reps > 0u) {
55966
866k
        self->private_impl.f_huff_tables_fast[a_tc4_th][v_prefix] = v_fast;
55967
866k
#if defined(__GNUC__)
55968
866k
#pragma GCC diagnostic push
55969
866k
#pragma GCC diagnostic ignored "-Wconversion"
55970
866k
#endif
55971
866k
        v_prefix += 1u;
55972
866k
#if defined(__GNUC__)
55973
866k
#pragma GCC diagnostic pop
55974
866k
#endif
55975
866k
        v_reps -= 1u;
55976
866k
      }
55977
52.2k
#if defined(__GNUC__)
55978
52.2k
#pragma GCC diagnostic push
55979
52.2k
#pragma GCC diagnostic ignored "-Wconversion"
55980
52.2k
#endif
55981
52.2k
      v_k += 1u;
55982
52.2k
      v_j += 1u;
55983
52.2k
#if defined(__GNUC__)
55984
52.2k
#pragma GCC diagnostic pop
55985
52.2k
#endif
55986
52.2k
    }
55987
47.0k
    v_bit_length_minus_one += 1u;
55988
47.0k
  }
55989
5.87k
  return false;
55990
5.88k
}
55991
55992
// -------- func jpeg.decoder.decode_sos
55993
55994
WUFFS_BASE__GENERATED_C_CODE
55995
static wuffs_base__status
55996
wuffs_jpeg__decoder__decode_sos(
55997
    wuffs_jpeg__decoder* self,
55998
    wuffs_base__pixel_buffer* a_dst,
55999
    wuffs_base__io_buffer* a_src,
56000
3.48k
    wuffs_base__slice_u8 a_workbuf) {
56001
3.48k
  wuffs_base__status status = wuffs_base__make_status(NULL);
56002
56003
3.48k
  uint32_t v_my = 0;
56004
3.48k
  uint32_t v_mx = 0;
56005
3.48k
  uint32_t v_decode_mcu_result = 0;
56006
3.48k
  uint32_t v_bitstream_length = 0;
56007
56008
3.48k
  uint32_t coro_susp_point = self->private_impl.p_decode_sos;
56009
3.48k
  if (coro_susp_point) {
56010
0
    v_my = self->private_data.s_decode_sos.v_my;
56011
0
    v_mx = self->private_data.s_decode_sos.v_mx;
56012
0
  }
56013
3.48k
  switch (coro_susp_point) {
56014
3.48k
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
56015
56016
3.48k
    if (self->private_impl.f_scan_count >= 32u) {
56017
1
      status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_scan_count);
56018
1
      goto exit;
56019
3.48k
    } else if ((self->private_impl.f_scan_count > 0u) &&  ! self->private_impl.f_expect_multiple_scans) {
56020
2
      status = wuffs_base__make_status(wuffs_jpeg__error__bad_scan_count);
56021
2
      goto exit;
56022
2
    }
56023
6.96k
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
56024
6.96k
    status = wuffs_jpeg__decoder__prepare_scan(self, a_src);
56025
6.96k
    if (status.repr) {
56026
198
      goto suspend;
56027
198
    }
56028
3.28k
    self->private_impl.f_next_restart_marker = 0u;
56029
3.28k
    self->private_impl.f_mcu_previous_dc_values[0u] = 0u;
56030
3.28k
    self->private_impl.f_mcu_previous_dc_values[1u] = 0u;
56031
3.28k
    self->private_impl.f_mcu_previous_dc_values[2u] = 0u;
56032
3.28k
    self->private_impl.f_mcu_previous_dc_values[3u] = 0u;
56033
3.28k
    self->private_impl.f_restarts_remaining = self->private_impl.f_restart_interval;
56034
3.28k
    self->private_impl.f_eob_run = 0u;
56035
3.28k
    self->private_impl.f_bitstream_bits = 0u;
56036
3.28k
    self->private_impl.f_bitstream_n_bits = 0u;
56037
3.28k
    self->private_impl.f_bitstream_ri = 0u;
56038
3.28k
    self->private_impl.f_bitstream_wi = 0u;
56039
3.28k
    self->private_impl.f_bitstream_padding = 12345u;
56040
3.28k
    wuffs_jpeg__decoder__fill_bitstream(self, a_src);
56041
3.28k
    v_my = 0u;
56042
531k
    while (v_my < self->private_impl.f_scan_height_in_mcus) {
56043
529k
      v_mx = 0u;
56044
25.1M
      while (v_mx < self->private_impl.f_scan_width_in_mcus) {
56045
24.5M
        self->private_impl.f_mcu_current_block = 0u;
56046
24.5M
        self->private_impl.f_mcu_zig_index = ((uint32_t)(self->private_impl.f_scan_ss));
56047
24.5M
        if (self->private_impl.f_sof_marker >= 194u) {
56048
22.6M
          wuffs_jpeg__decoder__load_mcu_blocks(self, v_mx, v_my, a_workbuf);
56049
22.6M
        }
56050
24.7M
        while (true) {
56051
24.7M
          v_decode_mcu_result = wuffs_jpeg__decoder__decode_mcu(self,
56052
24.7M
              a_dst,
56053
24.7M
              a_workbuf,
56054
24.7M
              v_mx,
56055
24.7M
              v_my);
56056
24.7M
          if (v_decode_mcu_result == 0u) {
56057
24.5M
            break;
56058
24.5M
          } else if (v_decode_mcu_result == 1u) {
56059
208k
          } else if (v_decode_mcu_result == 2u) {
56060
0
            status = wuffs_base__make_status(wuffs_jpeg__error__internal_error_inconsistent_decoder_state);
56061
0
            goto exit;
56062
0
          } else {
56063
0
            status = self->private_impl.f_swizzle_immediately_status;
56064
0
            if (wuffs_base__status__is_error(&status)) {
56065
0
              goto exit;
56066
0
            } else if (wuffs_base__status__is_suspension(&status)) {
56067
0
              status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
56068
0
              goto exit;
56069
0
            }
56070
0
            goto ok;
56071
0
          }
56072
208k
          while (true) {
56073
208k
            v_bitstream_length = ((uint32_t)(self->private_impl.f_bitstream_wi - self->private_impl.f_bitstream_ri));
56074
208k
            wuffs_jpeg__decoder__fill_bitstream(self, a_src);
56075
208k
            if (v_bitstream_length < ((uint32_t)(self->private_impl.f_bitstream_wi - self->private_impl.f_bitstream_ri))) {
56076
206k
              break;
56077
206k
            } else if (self->private_impl.f_bitstream_padding == 0u) {
56078
246
              status = wuffs_base__make_status(wuffs_jpeg__error__short_sos_bitstream);
56079
246
              goto exit;
56080
2.24k
            } else if ((a_src && a_src->meta.closed) &&  ! self->private_impl.f_bitstream_is_closed) {
56081
1.06k
              if (self->private_impl.f_bitstream_wi < 1024u) {
56082
1.06k
                wuffs_private_impl__bulk_memset(&self->private_data.f_bitstream_buffer[self->private_impl.f_bitstream_wi], 264u, 0u);
56083
1.06k
                self->private_impl.f_bitstream_wi += 264u;
56084
1.06k
                self->private_impl.f_bitstream_is_closed = true;
56085
1.06k
              }
56086
1.06k
              break;
56087
1.06k
            }
56088
1.18k
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
56089
1.18k
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2);
56090
0
          }
56091
208k
        }
56092
24.5M
        if (self->private_impl.f_sof_marker >= 194u) {
56093
22.6M
          wuffs_jpeg__decoder__save_mcu_blocks(self, v_mx, v_my, a_workbuf);
56094
22.6M
        }
56095
24.5M
        if (self->private_impl.f_restarts_remaining > 0u) {
56096
7.57M
#if defined(__GNUC__)
56097
7.57M
#pragma GCC diagnostic push
56098
7.57M
#pragma GCC diagnostic ignored "-Wconversion"
56099
7.57M
#endif
56100
7.57M
          self->private_impl.f_restarts_remaining -= 1u;
56101
7.57M
#if defined(__GNUC__)
56102
7.57M
#pragma GCC diagnostic pop
56103
7.57M
#endif
56104
7.57M
          if (self->private_impl.f_restarts_remaining == 0u) {
56105
66.6k
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
56106
66.6k
            status = wuffs_jpeg__decoder__skip_past_the_next_restart_marker(self, a_src);
56107
66.6k
            if (status.repr) {
56108
54
              goto suspend;
56109
54
            }
56110
66.5k
            self->private_impl.f_mcu_previous_dc_values[0u] = 0u;
56111
66.5k
            self->private_impl.f_mcu_previous_dc_values[1u] = 0u;
56112
66.5k
            self->private_impl.f_mcu_previous_dc_values[2u] = 0u;
56113
66.5k
            self->private_impl.f_mcu_previous_dc_values[3u] = 0u;
56114
66.5k
            self->private_impl.f_restarts_remaining = self->private_impl.f_restart_interval;
56115
66.5k
            self->private_impl.f_eob_run = 0u;
56116
66.5k
            self->private_impl.f_bitstream_bits = 0u;
56117
66.5k
            self->private_impl.f_bitstream_n_bits = 0u;
56118
66.5k
            self->private_impl.f_bitstream_ri = 0u;
56119
66.5k
            self->private_impl.f_bitstream_wi = 0u;
56120
66.5k
            self->private_impl.f_bitstream_padding = 12345u;
56121
66.5k
          }
56122
7.57M
        }
56123
24.5M
        v_mx += 1u;
56124
24.5M
      }
56125
527k
      v_my += 1u;
56126
527k
    }
56127
1.80k
    wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_scan_count, 1u);
56128
56129
1.80k
    ok:
56130
1.80k
    self->private_impl.p_decode_sos = 0;
56131
1.80k
    goto exit;
56132
3.48k
  }
56133
56134
0
  goto suspend;
56135
1.43k
  suspend:
56136
1.43k
  self->private_impl.p_decode_sos = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
56137
1.43k
  self->private_data.s_decode_sos.v_my = v_my;
56138
1.43k
  self->private_data.s_decode_sos.v_mx = v_mx;
56139
56140
1.43k
  goto exit;
56141
3.48k
  exit:
56142
3.48k
  return status;
56143
3.48k
}
56144
56145
// -------- func jpeg.decoder.prepare_scan
56146
56147
WUFFS_BASE__GENERATED_C_CODE
56148
static wuffs_base__status
56149
wuffs_jpeg__decoder__prepare_scan(
56150
    wuffs_jpeg__decoder* self,
56151
3.48k
    wuffs_base__io_buffer* a_src) {
56152
3.48k
  wuffs_base__status status = wuffs_base__make_status(NULL);
56153
56154
3.48k
  uint8_t v_c8 = 0;
56155
3.48k
  uint32_t v_i = 0;
56156
3.48k
  uint32_t v_j = 0;
56157
3.48k
  uint32_t v_j_max_incl = 0;
56158
3.48k
  bool v_failed = false;
56159
56160
3.48k
  const uint8_t* iop_a_src = NULL;
56161
3.48k
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
56162
3.48k
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
56163
3.48k
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
56164
3.48k
  if (a_src && a_src->data.ptr) {
56165
3.48k
    io0_a_src = a_src->data.ptr;
56166
3.48k
    io1_a_src = io0_a_src + a_src->meta.ri;
56167
3.48k
    iop_a_src = io1_a_src;
56168
3.48k
    io2_a_src = io0_a_src + a_src->meta.wi;
56169
3.48k
  }
56170
56171
3.48k
  uint32_t coro_susp_point = self->private_impl.p_prepare_scan;
56172
3.48k
  if (coro_susp_point) {
56173
0
    v_i = self->private_data.s_prepare_scan.v_i;
56174
0
  }
56175
3.48k
  switch (coro_susp_point) {
56176
3.48k
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
56177
56178
3.48k
    if ((self->private_impl.f_payload_length < 6u) || (self->private_impl.f_payload_length > 12u)) {
56179
18
      status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker);
56180
18
      goto exit;
56181
18
    }
56182
3.46k
    {
56183
3.46k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
56184
3.46k
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
56185
14
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
56186
14
        goto suspend;
56187
14
      }
56188
3.45k
      uint8_t t_0 = *iop_a_src++;
56189
3.45k
      v_c8 = t_0;
56190
3.45k
    }
56191
3.45k
    if ((v_c8 < 1u) || (v_c8 > 4u)) {
56192
7
      status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker);
56193
7
      goto exit;
56194
7
    }
56195
3.44k
    self->private_impl.f_scan_num_components = ((uint32_t)(v_c8));
56196
3.44k
    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)))) {
56197
7
      status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker);
56198
7
      goto exit;
56199
7
    }
56200
3.43k
    self->private_impl.f_payload_length = 0u;
56201
3.43k
    v_i = 0u;
56202
7.89k
    while (v_i < self->private_impl.f_scan_num_components) {
56203
4.51k
      {
56204
4.51k
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
56205
4.51k
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
56206
11
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
56207
11
          goto suspend;
56208
11
        }
56209
4.50k
        uint8_t t_1 = *iop_a_src++;
56210
4.50k
        v_c8 = t_1;
56211
4.50k
      }
56212
0
      v_j = 0u;
56213
6.95k
      while (true) {
56214
6.95k
        if (v_j >= self->private_impl.f_num_components) {
56215
17
          status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker);
56216
17
          goto exit;
56217
17
        }
56218
6.94k
        if (v_c8 == self->private_impl.f_components_c[v_j]) {
56219
4.48k
          if ( ! self->private_impl.f_seen_dqt[self->private_impl.f_components_tq[v_j]]) {
56220
3
            status = wuffs_base__make_status(wuffs_jpeg__error__missing_quantization_table);
56221
3
            goto exit;
56222
3
          }
56223
4.48k
          self->private_impl.f_scan_comps_cselector[v_i] = ((uint8_t)(v_j));
56224
4.48k
          break;
56225
4.48k
        }
56226
2.45k
        v_j += 1u;
56227
2.45k
      }
56228
4.48k
      v_j = 0u;
56229
6.25k
      while (v_j < v_i) {
56230
1.77k
        if (self->private_impl.f_scan_comps_cselector[v_i] == self->private_impl.f_scan_comps_cselector[v_j]) {
56231
2
          status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker);
56232
2
          goto exit;
56233
2
        }
56234
1.77k
        v_j += 1u;
56235
1.77k
      }
56236
4.47k
      {
56237
4.47k
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
56238
4.47k
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
56239
14
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
56240
14
          goto suspend;
56241
14
        }
56242
4.46k
        uint8_t t_2 = *iop_a_src++;
56243
4.46k
        v_c8 = t_2;
56244
4.46k
      }
56245
4.46k
      if ((((uint8_t)(v_c8 >> 4u)) > 3u) || (((uint8_t)(v_c8 & 15u)) > 3u)) {
56246
5
        status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker);
56247
5
        goto exit;
56248
5
      }
56249
4.46k
      self->private_impl.f_scan_comps_td[v_i] = ((uint8_t)(v_c8 >> 4u));
56250
4.46k
      self->private_impl.f_scan_comps_ta[v_i] = ((uint8_t)(v_c8 & 15u));
56251
4.46k
      if (self->private_impl.f_sof_marker == 192u) {
56252
741
        if ((self->private_impl.f_scan_comps_td[v_i] > 1u) || (self->private_impl.f_scan_comps_ta[v_i] > 1u)) {
56253
4
          status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker);
56254
4
          goto exit;
56255
4
        }
56256
741
      }
56257
4.45k
      v_i += 1u;
56258
4.45k
    }
56259
3.38k
    if (self->private_impl.f_scan_count == 0u) {
56260
1.95k
      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));
56261
1.95k
    }
56262
3.38k
    if (self->private_impl.f_sof_marker < 194u) {
56263
701
      self->private_data.s_prepare_scan.scratch = 3u;
56264
701
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
56265
701
      if (self->private_data.s_prepare_scan.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
56266
10
        self->private_data.s_prepare_scan.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
56267
10
        iop_a_src = io2_a_src;
56268
10
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
56269
10
        goto suspend;
56270
10
      }
56271
691
      iop_a_src += self->private_data.s_prepare_scan.scratch;
56272
691
      self->private_impl.f_scan_ss = 0u;
56273
691
      self->private_impl.f_scan_se = 63u;
56274
691
      self->private_impl.f_scan_ah = 0u;
56275
691
      self->private_impl.f_scan_al = 0u;
56276
2.68k
    } else {
56277
2.68k
      {
56278
2.68k
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
56279
2.68k
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
56280
14
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
56281
14
          goto suspend;
56282
14
        }
56283
2.66k
        uint8_t t_3 = *iop_a_src++;
56284
2.66k
        v_c8 = t_3;
56285
2.66k
      }
56286
2.66k
      if (v_c8 > 63u) {
56287
1
        status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker);
56288
1
        goto exit;
56289
1
      }
56290
2.66k
      self->private_impl.f_scan_ss = v_c8;
56291
2.66k
      {
56292
2.66k
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
56293
2.66k
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
56294
11
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
56295
11
          goto suspend;
56296
11
        }
56297
2.65k
        uint8_t t_4 = *iop_a_src++;
56298
2.65k
        v_c8 = t_4;
56299
2.65k
      }
56300
2.65k
      if ((v_c8 > 63u) || (v_c8 < self->private_impl.f_scan_ss)) {
56301
3
        status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker);
56302
3
        goto exit;
56303
3
      }
56304
2.65k
      self->private_impl.f_scan_se = v_c8;
56305
2.65k
      {
56306
2.65k
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
56307
2.65k
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
56308
12
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
56309
12
          goto suspend;
56310
12
        }
56311
2.64k
        uint8_t t_5 = *iop_a_src++;
56312
2.64k
        v_c8 = t_5;
56313
2.64k
      }
56314
2.64k
      if ((((uint8_t)(v_c8 >> 4u)) > 14u) || (((uint8_t)(v_c8 & 15u)) > 13u)) {
56315
3
        status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker);
56316
3
        goto exit;
56317
3
      }
56318
2.63k
      self->private_impl.f_scan_ah = ((uint8_t)(v_c8 >> 4u));
56319
2.63k
      self->private_impl.f_scan_al = ((uint8_t)(v_c8 & 15u));
56320
2.63k
      if (self->private_impl.f_scan_ah > 0u) {
56321
926
        if (((uint8_t)(self->private_impl.f_scan_ah - 1u)) != self->private_impl.f_scan_al) {
56322
7
          status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker);
56323
7
          goto exit;
56324
7
        }
56325
926
      }
56326
2.63k
      if (self->private_impl.f_scan_ss == 0u) {
56327
1.16k
        if (self->private_impl.f_scan_se != 0u) {
56328
6
          status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker);
56329
6
          goto exit;
56330
1.15k
        } else if (self->private_impl.f_scan_ah == 0u) {
56331
787
          self->private_impl.choosy_decode_mcu = (
56332
787
              &wuffs_jpeg__decoder__decode_mcu_progressive_dc_high_bits);
56333
787
        } else {
56334
370
          self->private_impl.choosy_decode_mcu = (
56335
370
              &wuffs_jpeg__decoder__decode_mcu_progressive_dc_low_bit);
56336
370
        }
56337
1.46k
      } else {
56338
1.46k
        if (self->private_impl.f_scan_num_components != 1u) {
56339
1
          status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker);
56340
1
          goto exit;
56341
1.46k
        } else if (self->private_impl.f_scan_ah == 0u) {
56342
919
          self->private_impl.choosy_decode_mcu = (
56343
919
              &wuffs_jpeg__decoder__decode_mcu_progressive_ac_high_bits);
56344
919
        } else {
56345
547
          self->private_impl.choosy_decode_mcu = (
56346
547
              &wuffs_jpeg__decoder__decode_mcu_progressive_ac_low_bit);
56347
547
        }
56348
1.46k
      }
56349
2.63k
    }
56350
3.31k
    v_i = 0u;
56351
7.62k
    while (v_i < self->private_impl.f_scan_num_components) {
56352
4.31k
      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]))]) {
56353
1.22k
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
56354
1.22k
        status = wuffs_jpeg__decoder__use_default_huffman_table(self, ((uint8_t)(0u | self->private_impl.f_scan_comps_td[v_i])));
56355
1.22k
        if (status.repr) {
56356
3
          goto suspend;
56357
3
        }
56358
1.22k
      }
56359
4.31k
      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]))]) {
56360
1.33k
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
56361
1.33k
        status = wuffs_jpeg__decoder__use_default_huffman_table(self, ((uint8_t)(4u | self->private_impl.f_scan_comps_ta[v_i])));
56362
1.33k
        if (status.repr) {
56363
5
          goto suspend;
56364
5
        }
56365
1.33k
      }
56366
4.30k
      v_j = ((uint32_t)(self->private_impl.f_scan_ss));
56367
4.30k
      v_j_max_incl = ((uint32_t)(wuffs_base__u8__min(self->private_impl.f_scan_se, 9u)));
56368
22.6k
      while (v_j <= v_j_max_incl) {
56369
18.3k
        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;
56370
18.3k
        v_j += 1u;
56371
18.3k
      }
56372
4.30k
      v_i += 1u;
56373
4.30k
    }
56374
3.30k
    if (self->private_impl.f_scan_num_components == 1u) {
56375
2.77k
      wuffs_jpeg__decoder__calculate_single_component_scan_fields(self);
56376
2.77k
    } else {
56377
532
      v_failed = wuffs_jpeg__decoder__calculate_multiple_component_scan_fields(self);
56378
532
      if (v_failed) {
56379
20
        status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker);
56380
20
        goto exit;
56381
20
      }
56382
532
    }
56383
56384
3.28k
    goto ok;
56385
3.28k
    ok:
56386
3.28k
    self->private_impl.p_prepare_scan = 0;
56387
3.28k
    goto exit;
56388
3.48k
  }
56389
56390
0
  goto suspend;
56391
94
  suspend:
56392
94
  self->private_impl.p_prepare_scan = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
56393
94
  self->private_data.s_prepare_scan.v_i = v_i;
56394
56395
94
  goto exit;
56396
3.48k
  exit:
56397
3.48k
  if (a_src && a_src->data.ptr) {
56398
3.48k
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
56399
3.48k
  }
56400
56401
3.48k
  return status;
56402
3.48k
}
56403
56404
// -------- func jpeg.decoder.use_default_huffman_table
56405
56406
WUFFS_BASE__GENERATED_C_CODE
56407
static wuffs_base__status
56408
wuffs_jpeg__decoder__use_default_huffman_table(
56409
    wuffs_jpeg__decoder* self,
56410
2.55k
    uint8_t a_tc4_th) {
56411
2.55k
  wuffs_base__status status = wuffs_base__make_status(NULL);
56412
56413
2.55k
  wuffs_base__slice_u8 v_data = {0};
56414
2.55k
  wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer();
56415
2.55k
  wuffs_base__io_buffer* v_r = &u_r;
56416
2.55k
  const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
56417
2.55k
  const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
56418
2.55k
  const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
56419
2.55k
  const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
56420
2.55k
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
56421
56422
2.55k
  if (a_tc4_th == 0u) {
56423
1.02k
    v_data = wuffs_base__make_slice_u8(wuffs_base__strip_const_from_u8_ptr(WUFFS_JPEG__DEFAULT_HUFF_TABLE_DC_LUMA), 29);
56424
1.53k
  } else if (a_tc4_th == 1u) {
56425
197
    v_data = wuffs_base__make_slice_u8(wuffs_base__strip_const_from_u8_ptr(WUFFS_JPEG__DEFAULT_HUFF_TABLE_DC_CHROMA), 29);
56426
1.33k
  } else if (a_tc4_th == 4u) {
56427
831
    v_data = wuffs_base__make_slice_u8(wuffs_base__strip_const_from_u8_ptr(WUFFS_JPEG__DEFAULT_HUFF_TABLE_AC_LUMA), 179);
56428
831
  } else if (a_tc4_th == 5u) {
56429
498
    v_data = wuffs_base__make_slice_u8(wuffs_base__strip_const_from_u8_ptr(WUFFS_JPEG__DEFAULT_HUFF_TABLE_AC_CHROMA), 179);
56430
498
  } else {
56431
8
    status = wuffs_base__make_status(wuffs_jpeg__error__missing_huffman_table);
56432
8
    goto exit;
56433
8
  }
56434
2.54k
  {
56435
2.54k
    wuffs_base__io_buffer* o_0_v_r = v_r;
56436
2.54k
    const uint8_t* o_0_iop_v_r = iop_v_r;
56437
2.54k
    const uint8_t* o_0_io0_v_r = io0_v_r;
56438
2.54k
    const uint8_t* o_0_io1_v_r = io1_v_r;
56439
2.54k
    const uint8_t* o_0_io2_v_r = io2_v_r;
56440
2.54k
    v_r = wuffs_private_impl__io_reader__set(
56441
2.54k
        &u_r,
56442
2.54k
        &iop_v_r,
56443
2.54k
        &io0_v_r,
56444
2.54k
        &io1_v_r,
56445
2.54k
        &io2_v_r,
56446
2.54k
        v_data,
56447
2.54k
        0u);
56448
2.54k
    self->private_impl.f_payload_length = ((uint32_t)((((uint64_t)(v_data.len)) & 65535u)));
56449
2.54k
    {
56450
2.54k
      wuffs_base__status t_0 = wuffs_jpeg__decoder__decode_dht(self, v_r);
56451
2.54k
      v_status = t_0;
56452
2.54k
    }
56453
2.54k
    v_r = o_0_v_r;
56454
2.54k
    iop_v_r = o_0_iop_v_r;
56455
2.54k
    io0_v_r = o_0_io0_v_r;
56456
2.54k
    io1_v_r = o_0_io1_v_r;
56457
2.54k
    io2_v_r = o_0_io2_v_r;
56458
2.54k
  }
56459
2.54k
  status = v_status;
56460
2.54k
  if (wuffs_base__status__is_error(&status)) {
56461
0
    goto exit;
56462
2.54k
  } else if (wuffs_base__status__is_suspension(&status)) {
56463
0
    status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
56464
0
    goto exit;
56465
0
  }
56466
2.54k
  goto ok;
56467
56468
2.54k
  ok:
56469
2.54k
  goto exit;
56470
2.55k
  exit:
56471
2.55k
  return status;
56472
2.54k
}
56473
56474
// -------- func jpeg.decoder.calculate_single_component_scan_fields
56475
56476
WUFFS_BASE__GENERATED_C_CODE
56477
static wuffs_base__empty_struct
56478
wuffs_jpeg__decoder__calculate_single_component_scan_fields(
56479
2.77k
    wuffs_jpeg__decoder* self) {
56480
2.77k
  uint8_t v_csel = 0;
56481
56482
2.77k
  self->private_impl.f_scan_comps_bx_offset[0u] = 0u;
56483
2.77k
  self->private_impl.f_scan_comps_by_offset[0u] = 0u;
56484
2.77k
  self->private_impl.f_mcu_num_blocks = 1u;
56485
2.77k
  self->private_impl.f_mcu_blocks_sselector[0u] = 0u;
56486
2.77k
  v_csel = self->private_impl.f_scan_comps_cselector[0u];
56487
2.77k
  self->private_impl.f_mcu_blocks_offset[0u] = self->private_impl.f_components_workbuf_offsets[v_csel];
56488
2.77k
  self->private_impl.f_mcu_blocks_mx_mul[0u] = 8u;
56489
2.77k
  self->private_impl.f_mcu_blocks_my_mul[0u] = (8u * self->private_impl.f_components_workbuf_widths[v_csel]);
56490
2.77k
  self->private_impl.f_mcu_blocks_dc_hselector[0u] = ((uint8_t)(0u | self->private_impl.f_scan_comps_td[0u]));
56491
2.77k
  self->private_impl.f_mcu_blocks_ac_hselector[0u] = ((uint8_t)(4u | self->private_impl.f_scan_comps_ta[0u]));
56492
2.77k
  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);
56493
2.77k
  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);
56494
2.77k
  return wuffs_base__make_empty_struct();
56495
2.77k
}
56496
56497
// -------- func jpeg.decoder.calculate_multiple_component_scan_fields
56498
56499
WUFFS_BASE__GENERATED_C_CODE
56500
static bool
56501
wuffs_jpeg__decoder__calculate_multiple_component_scan_fields(
56502
532
    wuffs_jpeg__decoder* self) {
56503
532
  uint32_t v_i = 0;
56504
532
  uint32_t v_h = 0;
56505
532
  uint32_t v_v = 0;
56506
532
  uint32_t v_hv = 0;
56507
532
  uint32_t v_total_hv = 0;
56508
532
  uint32_t v_b = 0;
56509
532
  uint32_t v_bx_offset = 0;
56510
532
  uint32_t v_by_offset = 0;
56511
532
  uint32_t v_sibo = 0;
56512
532
  uint8_t v_ssel = 0;
56513
532
  uint8_t v_csel = 0;
56514
56515
532
  v_total_hv = 0u;
56516
532
  v_i = 0u;
56517
532
  v_b = 0u;
56518
532
  v_bx_offset = 0u;
56519
532
  v_by_offset = 0u;
56520
2.06k
  while (v_i < self->private_impl.f_scan_num_components) {
56521
1.52k
    v_h = ((uint32_t)(self->private_impl.f_components_h[self->private_impl.f_scan_comps_cselector[v_i]]));
56522
1.52k
    v_v = ((uint32_t)(self->private_impl.f_components_v[self->private_impl.f_scan_comps_cselector[v_i]]));
56523
1.52k
    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]])));
56524
1.52k
    self->private_impl.f_swizzle_immediately_c_offsets[v_i] = ((uint32_t)(64u * v_total_hv));
56525
1.52k
    v_total_hv += v_hv;
56526
6.13k
    while (v_hv > 0u) {
56527
4.60k
      self->private_impl.f_scan_comps_bx_offset[(v_b & 15u)] = ((uint8_t)((v_bx_offset & 3u)));
56528
4.60k
      self->private_impl.f_scan_comps_by_offset[(v_b & 15u)] = ((uint8_t)((v_by_offset & 3u)));
56529
4.60k
      self->private_impl.f_mcu_blocks_sselector[(v_b & 15u)] = ((uint8_t)(v_i));
56530
4.60k
      v_b += 1u;
56531
4.60k
      v_bx_offset += 1u;
56532
4.60k
      if (v_bx_offset == v_h) {
56533
2.88k
        v_bx_offset = 0u;
56534
2.88k
        v_by_offset += 1u;
56535
2.88k
        if (v_by_offset == v_v) {
56536
1.52k
          v_by_offset = 0u;
56537
1.52k
        }
56538
2.88k
      }
56539
4.60k
      v_hv -= 1u;
56540
4.60k
    }
56541
1.52k
    v_i += 1u;
56542
1.52k
  }
56543
532
  if (v_total_hv > 10u) {
56544
20
    return true;
56545
20
  }
56546
512
  self->private_impl.f_mcu_num_blocks = v_total_hv;
56547
512
  self->private_impl.f_swizzle_immediately_c_offsets[self->private_impl.f_scan_num_components] = ((uint32_t)(64u * v_total_hv));
56548
512
  v_b = 0u;
56549
4.76k
  while (v_b < self->private_impl.f_mcu_num_blocks) {
56550
4.24k
    v_ssel = self->private_impl.f_mcu_blocks_sselector[v_b];
56551
4.24k
    v_csel = self->private_impl.f_scan_comps_cselector[v_ssel];
56552
4.24k
    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]))));
56553
4.24k
    self->private_impl.f_mcu_blocks_mx_mul[v_b] = (8u * ((uint32_t)(self->private_impl.f_components_h[v_csel])));
56554
4.24k
    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]);
56555
4.24k
    self->private_impl.f_mcu_blocks_dc_hselector[v_b] = ((uint8_t)(0u | self->private_impl.f_scan_comps_td[v_ssel]));
56556
4.24k
    self->private_impl.f_mcu_blocks_ac_hselector[v_b] = ((uint8_t)(4u | self->private_impl.f_scan_comps_ta[v_ssel]));
56557
4.24k
    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]))))));
56558
4.24k
    self->private_impl.f_swizzle_immediately_b_offsets[v_b] = wuffs_base__u32__min(v_sibo, 576u);
56559
4.24k
    v_b += 1u;
56560
4.24k
  }
56561
512
  self->private_impl.f_scan_width_in_mcus = self->private_impl.f_width_in_mcus;
56562
512
  self->private_impl.f_scan_height_in_mcus = self->private_impl.f_height_in_mcus;
56563
512
  return false;
56564
532
}
56565
56566
// -------- func jpeg.decoder.fill_bitstream
56567
56568
WUFFS_BASE__GENERATED_C_CODE
56569
static wuffs_base__empty_struct
56570
wuffs_jpeg__decoder__fill_bitstream(
56571
    wuffs_jpeg__decoder* self,
56572
212k
    wuffs_base__io_buffer* a_src) {
56573
212k
  uint32_t v_wi = 0;
56574
212k
  uint8_t v_c8 = 0;
56575
212k
  uint32_t v_new_wi = 0;
56576
56577
212k
  const uint8_t* iop_a_src = NULL;
56578
212k
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
56579
212k
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
56580
212k
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
56581
212k
  if (a_src && a_src->data.ptr) {
56582
212k
    io0_a_src = a_src->data.ptr;
56583
212k
    io1_a_src = io0_a_src + a_src->meta.ri;
56584
212k
    iop_a_src = io1_a_src;
56585
212k
    io2_a_src = io0_a_src + a_src->meta.wi;
56586
212k
  }
56587
56588
212k
  if (self->private_impl.f_bitstream_ri <= 0u) {
56589
141k
  } else if (self->private_impl.f_bitstream_ri >= self->private_impl.f_bitstream_wi) {
56590
0
    self->private_impl.f_bitstream_ri = 0u;
56591
0
    self->private_impl.f_bitstream_wi = 0u;
56592
141k
  } else {
56593
141k
    v_wi = (self->private_impl.f_bitstream_wi - self->private_impl.f_bitstream_ri);
56594
141k
    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,
56595
141k
        self->private_impl.f_bitstream_ri,
56596
141k
        self->private_impl.f_bitstream_wi));
56597
141k
    self->private_impl.f_bitstream_ri = 0u;
56598
141k
    self->private_impl.f_bitstream_wi = v_wi;
56599
141k
  }
56600
212k
  v_wi = self->private_impl.f_bitstream_wi;
56601
7.38M
  while ((v_wi < 2048u) && (((uint64_t)(io2_a_src - iop_a_src)) > 0u)) {
56602
7.37M
    v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
56603
7.37M
    if (v_c8 < 255u) {
56604
7.12M
      self->private_data.f_bitstream_buffer[v_wi] = v_c8;
56605
7.12M
      v_wi += 1u;
56606
7.12M
      iop_a_src += 1u;
56607
7.12M
      continue;
56608
7.12M
    } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 1u) {
56609
59
      break;
56610
59
    }
56611
254k
    v_c8 = iop_a_src[1u];
56612
254k
    if (v_c8 == 0u) {
56613
46.8k
      self->private_data.f_bitstream_buffer[v_wi] = 255u;
56614
46.8k
      v_wi += 1u;
56615
46.8k
      iop_a_src += 2u;
56616
46.8k
      continue;
56617
207k
    } else if (v_c8 < 255u) {
56618
206k
      break;
56619
206k
    }
56620
1.60k
    iop_a_src += 1u;
56621
1.60k
  }
56622
212k
  if (((uint64_t)(io2_a_src - iop_a_src)) > 1u) {
56623
208k
    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)) {
56624
206k
      v_new_wi = (wuffs_base__u32__min(v_wi, 1784u) + 264u);
56625
206k
      v_new_wi = wuffs_base__u32__min(v_new_wi, (v_wi + self->private_impl.f_bitstream_padding));
56626
206k
      if (v_wi < v_new_wi) {
56627
205k
        wuffs_private_impl__u32__sat_sub_indirect(&self->private_impl.f_bitstream_padding, (v_new_wi - v_wi));
56628
205k
        wuffs_private_impl__bulk_memset(&self->private_data.f_bitstream_buffer[v_wi], (v_new_wi - v_wi), 0u);
56629
205k
        v_wi = v_new_wi;
56630
205k
      }
56631
206k
    }
56632
208k
  }
56633
212k
  self->private_impl.f_bitstream_wi = v_wi;
56634
212k
  if (a_src && a_src->data.ptr) {
56635
212k
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
56636
212k
  }
56637
56638
212k
  return wuffs_base__make_empty_struct();
56639
212k
}
56640
56641
// -------- func jpeg.decoder.load_mcu_blocks_for_single_component
56642
56643
WUFFS_BASE__GENERATED_C_CODE
56644
static wuffs_base__empty_struct
56645
wuffs_jpeg__decoder__load_mcu_blocks_for_single_component(
56646
    wuffs_jpeg__decoder* self,
56647
    uint32_t a_mx,
56648
    uint32_t a_my,
56649
    wuffs_base__slice_u8 a_workbuf,
56650
106M
    uint32_t a_csel) {
56651
106M
  return (*self->private_impl.choosy_load_mcu_blocks_for_single_component)(self, a_mx, a_my, a_workbuf, a_csel);
56652
106M
}
56653
56654
WUFFS_BASE__GENERATED_C_CODE
56655
static wuffs_base__empty_struct
56656
wuffs_jpeg__decoder__load_mcu_blocks_for_single_component__choosy_default(
56657
    wuffs_jpeg__decoder* self,
56658
    uint32_t a_mx,
56659
    uint32_t a_my,
56660
    wuffs_base__slice_u8 a_workbuf,
56661
73.2M
    uint32_t a_csel) {
56662
73.2M
  uint64_t v_stride16 = 0;
56663
73.2M
  uint64_t v_offset = 0;
56664
56665
73.2M
  v_stride16 = ((uint64_t)((self->private_impl.f_components_workbuf_widths[a_csel] * 16u)));
56666
73.2M
  v_offset = (self->private_impl.f_components_workbuf_offsets[(a_csel | 4u)] + (((uint64_t)(a_mx)) * 128u) + (((uint64_t)(a_my)) * v_stride16));
56667
73.2M
  if (v_offset <= ((uint64_t)(a_workbuf.len))) {
56668
73.2M
    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));
56669
73.2M
  }
56670
73.2M
  return wuffs_base__make_empty_struct();
56671
73.2M
}
56672
56673
// -------- func jpeg.decoder.load_mcu_blocks
56674
56675
WUFFS_BASE__GENERATED_C_CODE
56676
static wuffs_base__empty_struct
56677
wuffs_jpeg__decoder__load_mcu_blocks(
56678
    wuffs_jpeg__decoder* self,
56679
    uint32_t a_mx,
56680
    uint32_t a_my,
56681
22.6M
    wuffs_base__slice_u8 a_workbuf) {
56682
22.6M
  uint32_t v_b = 0;
56683
22.6M
  uint8_t v_csel = 0;
56684
22.6M
  uint64_t v_h = 0;
56685
22.6M
  uint64_t v_v = 0;
56686
22.6M
  uint64_t v_stride16 = 0;
56687
22.6M
  uint64_t v_offset = 0;
56688
56689
22.6M
  v_h = 1u;
56690
22.6M
  v_v = 1u;
56691
22.6M
  v_b = 0u;
56692
48.8M
  while (v_b < self->private_impl.f_mcu_num_blocks) {
56693
26.1M
    v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[v_b]];
56694
26.1M
    if (self->private_impl.f_scan_num_components > 1u) {
56695
4.07M
      v_h = ((uint64_t)(self->private_impl.f_components_h[v_csel]));
56696
4.07M
      v_v = ((uint64_t)(self->private_impl.f_components_v[v_csel]));
56697
4.07M
    }
56698
26.1M
    v_stride16 = ((uint64_t)((self->private_impl.f_components_workbuf_widths[v_csel] * 16u)));
56699
26.1M
    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));
56700
26.1M
    if (v_offset <= ((uint64_t)(a_workbuf.len))) {
56701
26.1M
      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));
56702
26.1M
    }
56703
26.1M
    v_b += 1u;
56704
26.1M
  }
56705
22.6M
  return wuffs_base__make_empty_struct();
56706
22.6M
}
56707
56708
// -------- func jpeg.decoder.save_mcu_blocks
56709
56710
WUFFS_BASE__GENERATED_C_CODE
56711
static wuffs_base__empty_struct
56712
wuffs_jpeg__decoder__save_mcu_blocks(
56713
    wuffs_jpeg__decoder* self,
56714
    uint32_t a_mx,
56715
    uint32_t a_my,
56716
22.6M
    wuffs_base__slice_u8 a_workbuf) {
56717
22.6M
  uint32_t v_b = 0;
56718
22.6M
  uint8_t v_csel = 0;
56719
22.6M
  uint64_t v_h = 0;
56720
22.6M
  uint64_t v_v = 0;
56721
22.6M
  uint64_t v_stride16 = 0;
56722
22.6M
  uint64_t v_offset = 0;
56723
56724
22.6M
  v_h = 1u;
56725
22.6M
  v_v = 1u;
56726
22.6M
  v_b = 0u;
56727
48.8M
  while (v_b < self->private_impl.f_mcu_num_blocks) {
56728
26.1M
    v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[v_b]];
56729
26.1M
    if (self->private_impl.f_scan_num_components > 1u) {
56730
4.07M
      v_h = ((uint64_t)(self->private_impl.f_components_h[v_csel]));
56731
4.07M
      v_v = ((uint64_t)(self->private_impl.f_components_v[v_csel]));
56732
4.07M
    }
56733
26.1M
    v_stride16 = ((uint64_t)((self->private_impl.f_components_workbuf_widths[v_csel] * 16u)));
56734
26.1M
    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));
56735
26.1M
    if (v_offset <= ((uint64_t)(a_workbuf.len))) {
56736
26.1M
      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));
56737
26.1M
    }
56738
26.1M
    v_b += 1u;
56739
26.1M
  }
56740
22.6M
  return wuffs_base__make_empty_struct();
56741
22.6M
}
56742
56743
// -------- func jpeg.decoder.skip_past_the_next_restart_marker
56744
56745
WUFFS_BASE__GENERATED_C_CODE
56746
static wuffs_base__status
56747
wuffs_jpeg__decoder__skip_past_the_next_restart_marker(
56748
    wuffs_jpeg__decoder* self,
56749
66.6k
    wuffs_base__io_buffer* a_src) {
56750
66.6k
  wuffs_base__status status = wuffs_base__make_status(NULL);
56751
56752
66.6k
  uint8_t v_c8 = 0;
56753
56754
66.6k
  const uint8_t* iop_a_src = NULL;
56755
66.6k
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
56756
66.6k
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
56757
66.6k
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
56758
66.6k
  if (a_src && a_src->data.ptr) {
56759
66.6k
    io0_a_src = a_src->data.ptr;
56760
66.6k
    io1_a_src = io0_a_src + a_src->meta.ri;
56761
66.6k
    iop_a_src = io1_a_src;
56762
66.6k
    io2_a_src = io0_a_src + a_src->meta.wi;
56763
66.6k
  }
56764
56765
66.6k
  uint32_t coro_susp_point = self->private_impl.p_skip_past_the_next_restart_marker;
56766
66.6k
  switch (coro_susp_point) {
56767
66.6k
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
56768
56769
239k
    while (true) {
56770
239k
      if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) {
56771
54
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
56772
54
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
56773
0
        continue;
56774
239k
      } else if (wuffs_base__peek_u8be__no_bounds_check(iop_a_src) < 255u) {
56775
169k
        iop_a_src += 1u;
56776
169k
        continue;
56777
169k
      }
56778
69.6k
      v_c8 = ((uint8_t)(((uint16_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src) >> 8u))));
56779
69.6k
      if (v_c8 < 192u) {
56780
2.54k
        iop_a_src += 2u;
56781
2.54k
        continue;
56782
67.1k
      } else if ((v_c8 < 208u) || (215u < v_c8)) {
56783
56.4k
        break;
56784
56.4k
      }
56785
10.6k
      v_c8 &= 7u;
56786
10.6k
      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)))) {
56787
1.93k
        break;
56788
8.72k
      } 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)))) {
56789
555
        iop_a_src += 2u;
56790
555
        continue;
56791
8.16k
      } else {
56792
8.16k
        iop_a_src += 2u;
56793
8.16k
        break;
56794
8.16k
      }
56795
10.6k
    }
56796
66.5k
    self->private_impl.f_next_restart_marker = ((uint8_t)(((uint8_t)(self->private_impl.f_next_restart_marker + 1u)) & 7u));
56797
56798
66.5k
    ok:
56799
66.5k
    self->private_impl.p_skip_past_the_next_restart_marker = 0;
56800
66.5k
    goto exit;
56801
66.6k
  }
56802
56803
0
  goto suspend;
56804
54
  suspend:
56805
54
  self->private_impl.p_skip_past_the_next_restart_marker = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
56806
56807
54
  goto exit;
56808
66.6k
  exit:
56809
66.6k
  if (a_src && a_src->data.ptr) {
56810
66.6k
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
56811
66.6k
  }
56812
56813
66.6k
  return status;
56814
66.6k
}
56815
56816
// -------- func jpeg.decoder.apply_progressive_idct
56817
56818
WUFFS_BASE__GENERATED_C_CODE
56819
static wuffs_base__empty_struct
56820
wuffs_jpeg__decoder__apply_progressive_idct(
56821
    wuffs_jpeg__decoder* self,
56822
1.63k
    wuffs_base__slice_u8 a_workbuf) {
56823
1.63k
  uint32_t v_csel = 0;
56824
1.63k
  bool v_block_smoothing_applicable = false;
56825
1.63k
  uint32_t v_scan_width_in_mcus = 0;
56826
1.63k
  uint32_t v_scan_height_in_mcus = 0;
56827
1.63k
  uint32_t v_mcu_blocks_mx_mul_0 = 0;
56828
1.63k
  uint32_t v_mcu_blocks_my_mul_0 = 0;
56829
1.63k
  uint32_t v_my = 0;
56830
1.63k
  uint32_t v_mx = 0;
56831
1.63k
  uint64_t v_stride = 0;
56832
1.63k
  uint64_t v_offset = 0;
56833
1.63k
  uint8_t v_stashed_mcu_blocks_0[128] = {0};
56834
56835
1.63k
  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));
56836
1.63k
  v_block_smoothing_applicable = true;
56837
1.63k
  v_csel = 0u;
56838
3.92k
  while (v_csel < self->private_impl.f_num_components) {
56839
2.29k
    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])))) {
56840
1.74k
      v_block_smoothing_applicable = false;
56841
1.74k
    }
56842
2.29k
    v_csel += 1u;
56843
2.29k
  }
56844
1.63k
  v_csel = 0u;
56845
3.92k
  while (v_csel < self->private_impl.f_num_components) {
56846
2.29k
    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);
56847
2.29k
    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);
56848
2.29k
    v_mcu_blocks_mx_mul_0 = 8u;
56849
2.29k
    v_mcu_blocks_my_mul_0 = (8u * self->private_impl.f_components_workbuf_widths[v_csel]);
56850
2.29k
    if (v_block_smoothing_applicable && (0u != (self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][1u] |
56851
529
        self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][2u] |
56852
529
        self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][3u] |
56853
529
        self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][4u] |
56854
529
        self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][5u] |
56855
529
        self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][6u] |
56856
529
        self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][8u] |
56857
529
        self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][8u] |
56858
529
        self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][9u]))) {
56859
522
      self->private_impl.choosy_load_mcu_blocks_for_single_component = (
56860
522
          &wuffs_jpeg__decoder__load_mcu_blocks_for_single_component_smooth);
56861
522
      self->private_impl.f_block_smoothing_mx_max_incl = wuffs_base__u32__sat_sub(v_scan_width_in_mcus, 1u);
56862
522
      self->private_impl.f_block_smoothing_my_max_incl = wuffs_base__u32__sat_sub(v_scan_height_in_mcus, 1u);
56863
1.77k
    } else {
56864
1.77k
      self->private_impl.choosy_load_mcu_blocks_for_single_component = (
56865
1.77k
          &wuffs_jpeg__decoder__load_mcu_blocks_for_single_component__choosy_default);
56866
1.77k
    }
56867
2.29k
    v_my = 0u;
56868
1.95M
    while (v_my < v_scan_height_in_mcus) {
56869
1.95M
      v_mx = 0u;
56870
108M
      while (v_mx < v_scan_width_in_mcus) {
56871
106M
        wuffs_jpeg__decoder__load_mcu_blocks_for_single_component(self,
56872
106M
            v_mx,
56873
106M
            v_my,
56874
106M
            a_workbuf,
56875
106M
            v_csel);
56876
106M
        v_stride = ((uint64_t)(self->private_impl.f_components_workbuf_widths[v_csel]));
56877
106M
        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))));
56878
106M
        if (v_offset <= ((uint64_t)(a_workbuf.len))) {
56879
106M
          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])));
56880
106M
        }
56881
106M
        v_mx += 1u;
56882
106M
      }
56883
1.95M
      v_my += 1u;
56884
1.95M
    }
56885
2.29k
    v_csel += 1u;
56886
2.29k
  }
56887
1.63k
  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));
56888
1.63k
  return wuffs_base__make_empty_struct();
56889
1.63k
}
56890
56891
// -------- func jpeg.decoder.swizzle_gray
56892
56893
WUFFS_BASE__GENERATED_C_CODE
56894
static wuffs_base__status
56895
wuffs_jpeg__decoder__swizzle_gray(
56896
    wuffs_jpeg__decoder* self,
56897
    wuffs_base__pixel_buffer* a_dst,
56898
    wuffs_base__slice_u8 a_workbuf,
56899
    uint32_t a_x0,
56900
    uint32_t a_x1,
56901
    uint32_t a_y0,
56902
    uint32_t a_y1,
56903
1.83k
    uint64_t a_stride) {
56904
1.83k
  wuffs_base__pixel_format v_dst_pixfmt = {0};
56905
1.83k
  uint32_t v_dst_bits_per_pixel = 0;
56906
1.83k
  uint32_t v_dst_bytes_per_pixel = 0;
56907
1.83k
  uint64_t v_x0 = 0;
56908
1.83k
  uint64_t v_x1 = 0;
56909
1.83k
  wuffs_base__table_u8 v_tab = {0};
56910
1.83k
  wuffs_base__slice_u8 v_dst = {0};
56911
1.83k
  uint32_t v_y = 0;
56912
1.83k
  uint32_t v_y1 = 0;
56913
56914
1.83k
  v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
56915
1.83k
  v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
56916
1.83k
  if ((v_dst_bits_per_pixel & 7u) != 0u) {
56917
0
    return wuffs_base__make_status(wuffs_base__error__unsupported_option);
56918
0
  }
56919
1.83k
  v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u);
56920
1.83k
  v_x0 = ((uint64_t)((v_dst_bytes_per_pixel * wuffs_base__u32__min(a_x0, self->private_impl.f_width))));
56921
1.83k
  v_x1 = ((uint64_t)((v_dst_bytes_per_pixel * wuffs_base__u32__min(a_x1, self->private_impl.f_width))));
56922
1.83k
  v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
56923
1.83k
  v_y = a_y0;
56924
1.83k
  v_y1 = wuffs_base__u32__min(a_y1, self->private_impl.f_height);
56925
14.4M
  while (v_y < v_y1) {
56926
14.4M
    v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_y);
56927
14.4M
    if (v_x1 < ((uint64_t)(v_dst.len))) {
56928
0
      v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_x1);
56929
0
    }
56930
14.4M
    if (v_x0 < ((uint64_t)(v_dst.len))) {
56931
14.4M
      v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_x0);
56932
14.4M
    } else {
56933
0
      v_dst = wuffs_base__utility__empty_slice_u8();
56934
0
    }
56935
14.4M
    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);
56936
14.4M
    if (a_stride <= ((uint64_t)(a_workbuf.len))) {
56937
14.4M
      a_workbuf = wuffs_base__slice_u8__subslice_i(a_workbuf, a_stride);
56938
14.4M
    } else {
56939
0
      a_workbuf = wuffs_base__utility__empty_slice_u8();
56940
0
    }
56941
14.4M
    v_y += 1u;
56942
14.4M
  }
56943
1.83k
  return wuffs_base__make_status(NULL);
56944
1.83k
}
56945
56946
// -------- func jpeg.decoder.swizzle_colorful
56947
56948
WUFFS_BASE__GENERATED_C_CODE
56949
static wuffs_base__status
56950
wuffs_jpeg__decoder__swizzle_colorful(
56951
    wuffs_jpeg__decoder* self,
56952
    wuffs_base__pixel_buffer* a_dst,
56953
    wuffs_base__slice_u8 a_workbuf,
56954
    uint32_t a_x0,
56955
    uint32_t a_x1,
56956
    uint32_t a_y0,
56957
689
    uint32_t a_y1) {
56958
689
  uint64_t v_i = 0;
56959
689
  uint64_t v_j = 0;
56960
689
  wuffs_base__slice_u8 v_src0 = {0};
56961
689
  wuffs_base__slice_u8 v_src1 = {0};
56962
689
  wuffs_base__slice_u8 v_src2 = {0};
56963
689
  wuffs_base__slice_u8 v_src3 = {0};
56964
689
  uint32_t v_width0 = 0;
56965
689
  uint32_t v_width1 = 0;
56966
689
  uint32_t v_width2 = 0;
56967
689
  uint32_t v_width3 = 0;
56968
689
  uint32_t v_height0 = 0;
56969
689
  uint32_t v_height1 = 0;
56970
689
  uint32_t v_height2 = 0;
56971
689
  uint32_t v_height3 = 0;
56972
689
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
56973
56974
689
  if (self->private_impl.f_swizzle_immediately) {
56975
0
    v_i = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[0u]));
56976
0
    v_j = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[1u]));
56977
0
    if ((v_i <= v_j) && (v_j <= 640u)) {
56978
0
      v_src0 = wuffs_base__make_slice_u8_ij(self->private_data.f_swizzle_immediately_buffer, v_i, v_j);
56979
0
      v_width0 = (8u * ((uint32_t)(self->private_impl.f_components_h[0u])));
56980
0
      v_height0 = (8u * ((uint32_t)(self->private_impl.f_components_v[0u])));
56981
0
    }
56982
0
    v_i = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[1u]));
56983
0
    v_j = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[2u]));
56984
0
    if ((v_i <= v_j) && (v_j <= 640u)) {
56985
0
      v_src1 = wuffs_base__make_slice_u8_ij(self->private_data.f_swizzle_immediately_buffer, v_i, v_j);
56986
0
      v_width1 = (8u * ((uint32_t)(self->private_impl.f_components_h[1u])));
56987
0
      v_height1 = (8u * ((uint32_t)(self->private_impl.f_components_v[1u])));
56988
0
    }
56989
0
    v_i = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[2u]));
56990
0
    v_j = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[3u]));
56991
0
    if ((v_i <= v_j) && (v_j <= 640u)) {
56992
0
      v_src2 = wuffs_base__make_slice_u8_ij(self->private_data.f_swizzle_immediately_buffer, v_i, v_j);
56993
0
      v_width2 = (8u * ((uint32_t)(self->private_impl.f_components_h[2u])));
56994
0
      v_height2 = (8u * ((uint32_t)(self->private_impl.f_components_v[2u])));
56995
0
    }
56996
0
    v_i = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[3u]));
56997
0
    v_j = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[4u]));
56998
0
    if ((v_i <= v_j) && (v_j <= 640u)) {
56999
0
      v_src3 = wuffs_base__make_slice_u8_ij(self->private_data.f_swizzle_immediately_buffer, v_i, v_j);
57000
0
      v_width3 = (8u * ((uint32_t)(self->private_impl.f_components_h[3u])));
57001
0
      v_height3 = (8u * ((uint32_t)(self->private_impl.f_components_v[3u])));
57002
0
    }
57003
689
  } else {
57004
689
    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)))) {
57005
689
      v_src0 = wuffs_base__slice_u8__subslice_ij(a_workbuf,
57006
689
          self->private_impl.f_components_workbuf_offsets[0u],
57007
689
          self->private_impl.f_components_workbuf_offsets[1u]);
57008
689
      v_width0 = self->private_impl.f_components_workbuf_widths[0u];
57009
689
      v_height0 = self->private_impl.f_components_workbuf_heights[0u];
57010
689
    }
57011
689
    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)))) {
57012
689
      v_src1 = wuffs_base__slice_u8__subslice_ij(a_workbuf,
57013
689
          self->private_impl.f_components_workbuf_offsets[1u],
57014
689
          self->private_impl.f_components_workbuf_offsets[2u]);
57015
689
      v_width1 = self->private_impl.f_components_workbuf_widths[1u];
57016
689
      v_height1 = self->private_impl.f_components_workbuf_heights[1u];
57017
689
    }
57018
689
    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)))) {
57019
689
      v_src2 = wuffs_base__slice_u8__subslice_ij(a_workbuf,
57020
689
          self->private_impl.f_components_workbuf_offsets[2u],
57021
689
          self->private_impl.f_components_workbuf_offsets[3u]);
57022
689
      v_width2 = self->private_impl.f_components_workbuf_widths[2u];
57023
689
      v_height2 = self->private_impl.f_components_workbuf_heights[2u];
57024
689
    }
57025
689
    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)))) {
57026
689
      v_src3 = wuffs_base__slice_u8__subslice_ij(a_workbuf,
57027
689
          self->private_impl.f_components_workbuf_offsets[3u],
57028
689
          self->private_impl.f_components_workbuf_offsets[4u]);
57029
689
      v_width3 = self->private_impl.f_components_workbuf_widths[3u];
57030
689
      v_height3 = self->private_impl.f_components_workbuf_heights[3u];
57031
689
    }
57032
689
  }
57033
689
  v_status = wuffs_base__pixel_swizzler__swizzle_ycck(&self->private_impl.f_swizzler,
57034
689
      a_dst,
57035
689
      wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)),
57036
689
      (a_x0 & 65535u),
57037
689
      wuffs_base__u32__min(a_x1, self->private_impl.f_width),
57038
689
      (a_y0 & 65535u),
57039
689
      wuffs_base__u32__min(a_y1, self->private_impl.f_height),
57040
689
      v_src0,
57041
689
      v_src1,
57042
689
      v_src2,
57043
689
      v_src3,
57044
689
      v_width0,
57045
689
      v_width1,
57046
689
      v_width2,
57047
689
      v_width3,
57048
689
      v_height0,
57049
689
      v_height1,
57050
689
      v_height2,
57051
689
      v_height3,
57052
689
      v_width0,
57053
689
      v_width1,
57054
689
      v_width2,
57055
689
      v_width3,
57056
689
      self->private_impl.f_components_h[0u],
57057
689
      self->private_impl.f_components_h[1u],
57058
689
      self->private_impl.f_components_h[2u],
57059
689
      self->private_impl.f_components_h[3u],
57060
689
      self->private_impl.f_components_v[0u],
57061
689
      self->private_impl.f_components_v[1u],
57062
689
      self->private_impl.f_components_v[2u],
57063
689
      self->private_impl.f_components_v[3u],
57064
689
      self->private_impl.f_is_rgb_or_cmyk,
57065
689
      ! self->private_impl.f_use_lower_quality,
57066
689
      wuffs_base__make_slice_u8(self->private_data.f_swizzle_ycck_scratch_buffer_2k, 2048));
57067
689
  return wuffs_private_impl__status__ensure_not_a_suspension(v_status);
57068
689
}
57069
57070
// -------- func jpeg.decoder.frame_dirty_rect
57071
57072
WUFFS_BASE__GENERATED_C_CODE
57073
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
57074
wuffs_jpeg__decoder__frame_dirty_rect(
57075
2.66k
    const wuffs_jpeg__decoder* self) {
57076
2.66k
  if (!self) {
57077
0
    return wuffs_base__utility__empty_rect_ie_u32();
57078
0
  }
57079
2.66k
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
57080
2.66k
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
57081
0
    return wuffs_base__utility__empty_rect_ie_u32();
57082
0
  }
57083
57084
2.66k
  return wuffs_base__utility__make_rect_ie_u32(
57085
2.66k
      0u,
57086
2.66k
      0u,
57087
2.66k
      self->private_impl.f_width,
57088
2.66k
      self->private_impl.f_height);
57089
2.66k
}
57090
57091
// -------- func jpeg.decoder.num_animation_loops
57092
57093
WUFFS_BASE__GENERATED_C_CODE
57094
WUFFS_BASE__MAYBE_STATIC uint32_t
57095
wuffs_jpeg__decoder__num_animation_loops(
57096
0
    const wuffs_jpeg__decoder* self) {
57097
0
  if (!self) {
57098
0
    return 0;
57099
0
  }
57100
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
57101
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
57102
0
    return 0;
57103
0
  }
57104
57105
0
  return 0u;
57106
0
}
57107
57108
// -------- func jpeg.decoder.num_decoded_frame_configs
57109
57110
WUFFS_BASE__GENERATED_C_CODE
57111
WUFFS_BASE__MAYBE_STATIC uint64_t
57112
wuffs_jpeg__decoder__num_decoded_frame_configs(
57113
0
    const wuffs_jpeg__decoder* self) {
57114
0
  if (!self) {
57115
0
    return 0;
57116
0
  }
57117
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
57118
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
57119
0
    return 0;
57120
0
  }
57121
57122
0
  if (self->private_impl.f_call_sequence > 32u) {
57123
0
    return 1u;
57124
0
  }
57125
0
  return 0u;
57126
0
}
57127
57128
// -------- func jpeg.decoder.num_decoded_frames
57129
57130
WUFFS_BASE__GENERATED_C_CODE
57131
WUFFS_BASE__MAYBE_STATIC uint64_t
57132
wuffs_jpeg__decoder__num_decoded_frames(
57133
0
    const wuffs_jpeg__decoder* self) {
57134
0
  if (!self) {
57135
0
    return 0;
57136
0
  }
57137
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
57138
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
57139
0
    return 0;
57140
0
  }
57141
57142
0
  if (self->private_impl.f_call_sequence > 64u) {
57143
0
    return 1u;
57144
0
  }
57145
0
  return 0u;
57146
0
}
57147
57148
// -------- func jpeg.decoder.restart_frame
57149
57150
WUFFS_BASE__GENERATED_C_CODE
57151
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
57152
wuffs_jpeg__decoder__restart_frame(
57153
    wuffs_jpeg__decoder* self,
57154
    uint64_t a_index,
57155
0
    uint64_t a_io_position) {
57156
0
  if (!self) {
57157
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
57158
0
  }
57159
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
57160
0
    return wuffs_base__make_status(
57161
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
57162
0
        ? wuffs_base__error__disabled_by_previous_error
57163
0
        : wuffs_base__error__initialize_not_called);
57164
0
  }
57165
57166
0
  uint32_t v_i = 0;
57167
0
  uint32_t v_j = 0;
57168
57169
0
  if (self->private_impl.f_call_sequence < 32u) {
57170
0
    return wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
57171
0
  }
57172
0
  if (a_index != 0u) {
57173
0
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
57174
0
  }
57175
0
  self->private_impl.f_call_sequence = 40u;
57176
0
  self->private_impl.f_bitstream_is_closed = false;
57177
0
  self->private_impl.f_expect_multiple_scans = false;
57178
0
  self->private_impl.f_frame_config_io_position = a_io_position;
57179
0
  self->private_impl.f_scan_count = 0u;
57180
0
  self->private_impl.f_restart_interval = self->private_impl.f_saved_restart_interval;
57181
0
  v_i = 0u;
57182
0
  while (v_i < 4u) {
57183
0
    self->private_impl.f_seen_dqt[v_i] = self->private_impl.f_saved_seen_dqt[v_i];
57184
0
    v_j = 0u;
57185
0
    while (v_j < 64u) {
57186
0
      self->private_impl.f_quant_tables[v_i][v_j] = self->private_impl.f_saved_quant_tables[v_i][v_j];
57187
0
      v_j += 1u;
57188
0
    }
57189
0
    v_i += 1u;
57190
0
  }
57191
0
  v_i = 0u;
57192
0
  while (v_i < 4u) {
57193
0
    v_j = 0u;
57194
0
    while (v_j < 10u) {
57195
0
      self->private_impl.f_block_smoothing_lowest_scan_al[v_i][v_j] = 16u;
57196
0
      v_j += 1u;
57197
0
    }
57198
0
    v_i += 1u;
57199
0
  }
57200
0
  v_i = 0u;
57201
0
  while (v_i < 8u) {
57202
0
    self->private_impl.f_seen_dht[v_i] = false;
57203
0
    v_i += 1u;
57204
0
  }
57205
0
  return wuffs_base__make_status(NULL);
57206
0
}
57207
57208
// -------- func jpeg.decoder.set_report_metadata
57209
57210
WUFFS_BASE__GENERATED_C_CODE
57211
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
57212
wuffs_jpeg__decoder__set_report_metadata(
57213
    wuffs_jpeg__decoder* self,
57214
    uint32_t a_fourcc,
57215
0
    bool a_report) {
57216
0
  return wuffs_base__make_empty_struct();
57217
0
}
57218
57219
// -------- func jpeg.decoder.tell_me_more
57220
57221
WUFFS_BASE__GENERATED_C_CODE
57222
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
57223
wuffs_jpeg__decoder__tell_me_more(
57224
    wuffs_jpeg__decoder* self,
57225
    wuffs_base__io_buffer* a_dst,
57226
    wuffs_base__more_information* a_minfo,
57227
0
    wuffs_base__io_buffer* a_src) {
57228
0
  if (!self) {
57229
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
57230
0
  }
57231
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
57232
0
    return wuffs_base__make_status(
57233
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
57234
0
        ? wuffs_base__error__disabled_by_previous_error
57235
0
        : wuffs_base__error__initialize_not_called);
57236
0
  }
57237
0
  if (!a_dst || !a_src) {
57238
0
    self->private_impl.magic = WUFFS_BASE__DISABLED;
57239
0
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
57240
0
  }
57241
0
  if ((self->private_impl.active_coroutine != 0) &&
57242
0
      (self->private_impl.active_coroutine != 4)) {
57243
0
    self->private_impl.magic = WUFFS_BASE__DISABLED;
57244
0
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
57245
0
  }
57246
0
  self->private_impl.active_coroutine = 0;
57247
0
  wuffs_base__status status = wuffs_base__make_status(NULL);
57248
57249
0
  status = wuffs_base__make_status(wuffs_base__error__no_more_information);
57250
0
  goto exit;
57251
57252
0
  goto ok;
57253
0
  ok:
57254
0
  goto exit;
57255
0
  exit:
57256
0
  if (wuffs_base__status__is_error(&status)) {
57257
0
    self->private_impl.magic = WUFFS_BASE__DISABLED;
57258
0
  }
57259
0
  return status;
57260
0
}
57261
57262
// -------- func jpeg.decoder.workbuf_len
57263
57264
WUFFS_BASE__GENERATED_C_CODE
57265
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
57266
wuffs_jpeg__decoder__workbuf_len(
57267
2.68k
    const wuffs_jpeg__decoder* self) {
57268
2.68k
  if (!self) {
57269
0
    return wuffs_base__utility__empty_range_ii_u64();
57270
0
  }
57271
2.68k
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
57272
2.68k
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
57273
0
    return wuffs_base__utility__empty_range_ii_u64();
57274
0
  }
57275
57276
2.68k
  if (self->private_impl.f_use_lower_quality && (self->private_impl.f_sof_marker < 194u)) {
57277
0
    return wuffs_base__utility__make_range_ii_u64(0u, self->private_impl.f_components_workbuf_offsets[8u]);
57278
0
  }
57279
2.68k
  return wuffs_base__utility__make_range_ii_u64(self->private_impl.f_components_workbuf_offsets[8u], self->private_impl.f_components_workbuf_offsets[8u]);
57280
2.68k
}
57281
57282
// -------- func jpeg.decoder.top_left_quants_has_zero
57283
57284
WUFFS_BASE__GENERATED_C_CODE
57285
static bool
57286
wuffs_jpeg__decoder__top_left_quants_has_zero(
57287
    const wuffs_jpeg__decoder* self,
57288
909
    uint32_t a_q) {
57289
909
  return ((self->private_impl.f_quant_tables[a_q][0u] == 0u) ||
57290
909
      (self->private_impl.f_quant_tables[a_q][1u] == 0u) ||
57291
909
      (self->private_impl.f_quant_tables[a_q][2u] == 0u) ||
57292
909
      (self->private_impl.f_quant_tables[a_q][3u] == 0u) ||
57293
909
      (self->private_impl.f_quant_tables[a_q][8u] == 0u) ||
57294
909
      (self->private_impl.f_quant_tables[a_q][9u] == 0u) ||
57295
909
      (self->private_impl.f_quant_tables[a_q][10u] == 0u) ||
57296
909
      (self->private_impl.f_quant_tables[a_q][16u] == 0u) ||
57297
909
      (self->private_impl.f_quant_tables[a_q][17u] == 0u) ||
57298
909
      (self->private_impl.f_quant_tables[a_q][24u] == 0u));
57299
909
}
57300
57301
// -------- func jpeg.decoder.load_mcu_blocks_for_single_component_smooth
57302
57303
WUFFS_BASE__GENERATED_C_CODE
57304
static wuffs_base__empty_struct
57305
wuffs_jpeg__decoder__load_mcu_blocks_for_single_component_smooth(
57306
    wuffs_jpeg__decoder* self,
57307
    uint32_t a_mx,
57308
    uint32_t a_my,
57309
    wuffs_base__slice_u8 a_workbuf,
57310
33.2M
    uint32_t a_csel) {
57311
33.2M
  uint64_t v_stride16 = 0;
57312
33.2M
  uint64_t v_offset = 0;
57313
33.2M
  uint32_t v_dx = 0;
57314
33.2M
  uint32_t v_dy = 0;
57315
33.2M
  uint32_t v_mx = 0;
57316
33.2M
  uint32_t v_my = 0;
57317
33.2M
  uint8_t v_q = 0;
57318
33.2M
  uint32_t v_q_00 = 0;
57319
33.2M
  uint32_t v_q_xy = 0;
57320
33.2M
  uint8_t v_al = 0;
57321
33.2M
  uint32_t v_scratch = 0;
57322
33.2M
  uint32_t v_limit = 0;
57323
57324
33.2M
  v_stride16 = ((uint64_t)((self->private_impl.f_components_workbuf_widths[a_csel] * 16u)));
57325
33.2M
  v_offset = (self->private_impl.f_components_workbuf_offsets[(a_csel | 4u)] + (((uint64_t)(a_mx)) * 128u) + (((uint64_t)(a_my)) * v_stride16));
57326
33.2M
  if (v_offset <= ((uint64_t)(a_workbuf.len))) {
57327
33.2M
    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));
57328
33.2M
  }
57329
33.2M
  v_dy = 0u;
57330
199M
  while (v_dy < 5u) {
57331
166M
    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));
57332
166M
    v_dx = 0u;
57333
996M
    while (v_dx < 5u) {
57334
830M
      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));
57335
830M
      v_offset = (self->private_impl.f_components_workbuf_offsets[(a_csel | 4u)] + (((uint64_t)(v_mx)) * 128u) + (((uint64_t)(v_my)) * v_stride16));
57336
830M
      if (v_offset <= ((uint64_t)(a_workbuf.len))) {
57337
830M
        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));
57338
830M
      }
57339
830M
      v_dx += 1u;
57340
830M
    }
57341
166M
    v_dy += 1u;
57342
166M
  }
57343
33.2M
  v_q = self->private_impl.f_components_tq[a_csel];
57344
33.2M
  v_q_00 = ((uint32_t)(self->private_impl.f_quant_tables[v_q][0u]));
57345
33.2M
  if (v_q_00 <= 0u) {
57346
0
    return wuffs_base__make_empty_struct();
57347
0
  }
57348
33.2M
  if (0u != (16u &
57349
33.2M
      self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][1u] &
57350
33.2M
      self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][2u] &
57351
33.2M
      self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][3u] &
57352
33.2M
      self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][4u] &
57353
33.2M
      self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][5u] &
57354
33.2M
      self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][6u] &
57355
33.2M
      self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][7u] &
57356
33.2M
      self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][8u] &
57357
33.2M
      self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][9u])) {
57358
28.6M
    v_scratch = 0u;
57359
28.6M
    v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u])));
57360
28.6M
    v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u])));
57361
28.6M
    v_scratch += ((uint32_t)(4294967288u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u])));
57362
28.6M
    v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u])));
57363
28.6M
    v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u])));
57364
28.6M
    v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u])));
57365
28.6M
    v_scratch += ((uint32_t)(6u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u])));
57366
28.6M
    v_scratch += ((uint32_t)(42u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u])));
57367
28.6M
    v_scratch += ((uint32_t)(6u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u])));
57368
28.6M
    v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u])));
57369
28.6M
    v_scratch += ((uint32_t)(4294967288u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u])));
57370
28.6M
    v_scratch += ((uint32_t)(42u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u])));
57371
28.6M
    v_scratch += ((uint32_t)(152u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u])));
57372
28.6M
    v_scratch += ((uint32_t)(42u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u])));
57373
28.6M
    v_scratch += ((uint32_t)(4294967288u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u])));
57374
28.6M
    v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u])));
57375
28.6M
    v_scratch += ((uint32_t)(6u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u])));
57376
28.6M
    v_scratch += ((uint32_t)(42u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u])));
57377
28.6M
    v_scratch += ((uint32_t)(6u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u])));
57378
28.6M
    v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u])));
57379
28.6M
    v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u])));
57380
28.6M
    v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u])));
57381
28.6M
    v_scratch += ((uint32_t)(4294967288u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u])));
57382
28.6M
    v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u])));
57383
28.6M
    v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u])));
57384
28.6M
    if (v_scratch < 2147483648u) {
57385
27.5M
      v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + 128u)) / 256u)));
57386
27.5M
    } else {
57387
1.07M
      v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + 128u)) / 256u)));
57388
1.07M
    }
57389
28.6M
    self->private_data.f_mcu_blocks[0u][0u] = ((uint16_t)(v_scratch));
57390
28.6M
    v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][1u]));
57391
28.6M
    if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][1u] == 0u)) {
57392
28.6M
      v_scratch = 0u;
57393
28.6M
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u])));
57394
28.6M
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u])));
57395
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u])));
57396
28.6M
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u])));
57397
28.6M
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u])));
57398
28.6M
      v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u])));
57399
28.6M
      v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u])));
57400
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u])));
57401
28.6M
      v_scratch += ((uint32_t)(4294967283u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u])));
57402
28.6M
      v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u])));
57403
28.6M
      v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u])));
57404
28.6M
      v_scratch += ((uint32_t)(38u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u])));
57405
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u])));
57406
28.6M
      v_scratch += ((uint32_t)(4294967258u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u])));
57407
28.6M
      v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u])));
57408
28.6M
      v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u])));
57409
28.6M
      v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u])));
57410
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u])));
57411
28.6M
      v_scratch += ((uint32_t)(4294967283u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u])));
57412
28.6M
      v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u])));
57413
28.6M
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u])));
57414
28.6M
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u])));
57415
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u])));
57416
28.6M
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u])));
57417
28.6M
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u])));
57418
28.6M
      v_scratch *= v_q_00;
57419
28.6M
      if (v_scratch < 2147483648u) {
57420
28.4M
        v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
57421
28.4M
      } else {
57422
182k
        v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
57423
182k
      }
57424
28.6M
      self->private_data.f_mcu_blocks[0u][1u] = ((uint16_t)(v_scratch));
57425
28.6M
    }
57426
28.6M
    v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][2u]));
57427
28.6M
    if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][2u] == 0u)) {
57428
28.6M
      v_scratch = 0u;
57429
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u])));
57430
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u])));
57431
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u])));
57432
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u])));
57433
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u])));
57434
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u])));
57435
28.6M
      v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u])));
57436
28.6M
      v_scratch += ((uint32_t)(4294967291u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u])));
57437
28.6M
      v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u])));
57438
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u])));
57439
28.6M
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u])));
57440
28.6M
      v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u])));
57441
28.6M
      v_scratch += ((uint32_t)(4294967282u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u])));
57442
28.6M
      v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u])));
57443
28.6M
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u])));
57444
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u])));
57445
28.6M
      v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u])));
57446
28.6M
      v_scratch += ((uint32_t)(4294967291u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u])));
57447
28.6M
      v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u])));
57448
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u])));
57449
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u])));
57450
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u])));
57451
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u])));
57452
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u])));
57453
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u])));
57454
28.6M
      v_scratch *= v_q_00;
57455
28.6M
      if (v_scratch < 2147483648u) {
57456
28.3M
        v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
57457
28.3M
      } else {
57458
233k
        v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
57459
233k
      }
57460
28.6M
      self->private_data.f_mcu_blocks[0u][2u] = ((uint16_t)(v_scratch));
57461
28.6M
    }
57462
28.6M
    v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][3u]));
57463
28.6M
    if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][3u] == 0u)) {
57464
28.6M
      v_scratch = 0u;
57465
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u])));
57466
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u])));
57467
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u])));
57468
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u])));
57469
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u])));
57470
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u])));
57471
28.6M
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u])));
57472
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u])));
57473
28.6M
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u])));
57474
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u])));
57475
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u])));
57476
28.6M
      v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u])));
57477
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u])));
57478
28.6M
      v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u])));
57479
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u])));
57480
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u])));
57481
28.6M
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u])));
57482
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u])));
57483
28.6M
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u])));
57484
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u])));
57485
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u])));
57486
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u])));
57487
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u])));
57488
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u])));
57489
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u])));
57490
28.6M
      v_scratch *= v_q_00;
57491
28.6M
      if (v_scratch < 2147483648u) {
57492
28.5M
        v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
57493
28.5M
      } else {
57494
114k
        v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
57495
114k
      }
57496
28.6M
      self->private_data.f_mcu_blocks[0u][3u] = ((uint16_t)(v_scratch));
57497
28.6M
    }
57498
28.6M
    v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][8u]));
57499
28.6M
    if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][8u] == 0u)) {
57500
28.6M
      v_scratch = 0u;
57501
28.6M
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u])));
57502
28.6M
      v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u])));
57503
28.6M
      v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u])));
57504
28.6M
      v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u])));
57505
28.6M
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u])));
57506
28.6M
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u])));
57507
28.6M
      v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u])));
57508
28.6M
      v_scratch += ((uint32_t)(38u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u])));
57509
28.6M
      v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u])));
57510
28.6M
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u])));
57511
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u])));
57512
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u])));
57513
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u])));
57514
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u])));
57515
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u])));
57516
28.6M
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u])));
57517
28.6M
      v_scratch += ((uint32_t)(4294967283u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u])));
57518
28.6M
      v_scratch += ((uint32_t)(4294967258u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u])));
57519
28.6M
      v_scratch += ((uint32_t)(4294967283u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u])));
57520
28.6M
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u])));
57521
28.6M
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u])));
57522
28.6M
      v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u])));
57523
28.6M
      v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u])));
57524
28.6M
      v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u])));
57525
28.6M
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u])));
57526
28.6M
      v_scratch *= v_q_00;
57527
28.6M
      if (v_scratch < 2147483648u) {
57528
28.3M
        v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
57529
28.3M
      } else {
57530
296k
        v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
57531
296k
      }
57532
28.6M
      self->private_data.f_mcu_blocks[0u][8u] = ((uint16_t)(v_scratch));
57533
28.6M
    }
57534
28.6M
    v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][9u]));
57535
28.6M
    if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][9u] == 0u)) {
57536
28.6M
      v_scratch = 0u;
57537
28.6M
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u])));
57538
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u])));
57539
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u])));
57540
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u])));
57541
28.6M
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u])));
57542
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u])));
57543
28.6M
      v_scratch += ((uint32_t)(9u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u])));
57544
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u])));
57545
28.6M
      v_scratch += ((uint32_t)(4294967287u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u])));
57546
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u])));
57547
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u])));
57548
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u])));
57549
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u])));
57550
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u])));
57551
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u])));
57552
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u])));
57553
28.6M
      v_scratch += ((uint32_t)(4294967287u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u])));
57554
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u])));
57555
28.6M
      v_scratch += ((uint32_t)(9u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u])));
57556
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u])));
57557
28.6M
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u])));
57558
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u])));
57559
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u])));
57560
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u])));
57561
28.6M
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u])));
57562
28.6M
      v_scratch *= v_q_00;
57563
28.6M
      if (v_scratch < 2147483648u) {
57564
28.4M
        v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
57565
28.4M
      } else {
57566
152k
        v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
57567
152k
      }
57568
28.6M
      self->private_data.f_mcu_blocks[0u][9u] = ((uint16_t)(v_scratch));
57569
28.6M
    }
57570
28.6M
    v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][10u]));
57571
28.6M
    if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][10u] == 0u)) {
57572
28.6M
      v_scratch = 0u;
57573
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u])));
57574
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u])));
57575
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u])));
57576
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u])));
57577
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u])));
57578
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u])));
57579
28.6M
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u])));
57580
28.6M
      v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u])));
57581
28.6M
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u])));
57582
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u])));
57583
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u])));
57584
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u])));
57585
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u])));
57586
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u])));
57587
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u])));
57588
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u])));
57589
28.6M
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u])));
57590
28.6M
      v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u])));
57591
28.6M
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u])));
57592
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u])));
57593
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u])));
57594
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u])));
57595
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u])));
57596
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u])));
57597
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u])));
57598
28.6M
      v_scratch *= v_q_00;
57599
28.6M
      if (v_scratch < 2147483648u) {
57600
28.4M
        v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
57601
28.4M
      } else {
57602
206k
        v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
57603
206k
      }
57604
28.6M
      self->private_data.f_mcu_blocks[0u][10u] = ((uint16_t)(v_scratch));
57605
28.6M
    }
57606
28.6M
    v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][16u]));
57607
28.6M
    if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][16u] == 0u)) {
57608
28.6M
      v_scratch = 0u;
57609
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u])));
57610
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u])));
57611
28.6M
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u])));
57612
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u])));
57613
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u])));
57614
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u])));
57615
28.6M
      v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u])));
57616
28.6M
      v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u])));
57617
28.6M
      v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u])));
57618
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u])));
57619
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u])));
57620
28.6M
      v_scratch += ((uint32_t)(4294967291u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u])));
57621
28.6M
      v_scratch += ((uint32_t)(4294967282u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u])));
57622
28.6M
      v_scratch += ((uint32_t)(4294967291u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u])));
57623
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u])));
57624
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u])));
57625
28.6M
      v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u])));
57626
28.6M
      v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u])));
57627
28.6M
      v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u])));
57628
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u])));
57629
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u])));
57630
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u])));
57631
28.6M
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u])));
57632
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u])));
57633
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u])));
57634
28.6M
      v_scratch *= v_q_00;
57635
28.6M
      if (v_scratch < 2147483648u) {
57636
28.3M
        v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
57637
28.3M
      } else {
57638
238k
        v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
57639
238k
      }
57640
28.6M
      self->private_data.f_mcu_blocks[0u][16u] = ((uint16_t)(v_scratch));
57641
28.6M
    }
57642
28.6M
    v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][17u]));
57643
28.6M
    if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][17u] == 0u)) {
57644
28.6M
      v_scratch = 0u;
57645
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u])));
57646
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u])));
57647
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u])));
57648
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u])));
57649
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u])));
57650
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u])));
57651
28.6M
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u])));
57652
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u])));
57653
28.6M
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u])));
57654
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u])));
57655
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u])));
57656
28.6M
      v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u])));
57657
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u])));
57658
28.6M
      v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u])));
57659
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u])));
57660
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u])));
57661
28.6M
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u])));
57662
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u])));
57663
28.6M
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u])));
57664
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u])));
57665
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u])));
57666
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u])));
57667
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u])));
57668
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u])));
57669
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u])));
57670
28.6M
      v_scratch *= v_q_00;
57671
28.6M
      if (v_scratch < 2147483648u) {
57672
28.5M
        v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
57673
28.5M
      } else {
57674
114k
        v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
57675
114k
      }
57676
28.6M
      self->private_data.f_mcu_blocks[0u][17u] = ((uint16_t)(v_scratch));
57677
28.6M
    }
57678
28.6M
    v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][24u]));
57679
28.6M
    if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][24u] == 0u)) {
57680
28.6M
      v_scratch = 0u;
57681
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u])));
57682
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u])));
57683
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u])));
57684
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u])));
57685
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u])));
57686
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u])));
57687
28.6M
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u])));
57688
28.6M
      v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u])));
57689
28.6M
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u])));
57690
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u])));
57691
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u])));
57692
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u])));
57693
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u])));
57694
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u])));
57695
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u])));
57696
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u])));
57697
28.6M
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u])));
57698
28.6M
      v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u])));
57699
28.6M
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u])));
57700
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u])));
57701
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u])));
57702
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u])));
57703
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u])));
57704
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u])));
57705
28.6M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u])));
57706
28.6M
      v_scratch *= v_q_00;
57707
28.6M
      if (v_scratch < 2147483648u) {
57708
28.4M
        v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
57709
28.4M
      } else {
57710
159k
        v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
57711
159k
      }
57712
28.6M
      self->private_data.f_mcu_blocks[0u][24u] = ((uint16_t)(v_scratch));
57713
28.6M
    }
57714
28.6M
  } else {
57715
4.60M
    v_al = self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][1u];
57716
4.60M
    v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][1u]));
57717
4.60M
    if ((v_al > 0u) && (v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][1u] == 0u)) {
57718
4.56M
      v_limit = ((((uint32_t)(1u)) << v_al) - 1u);
57719
4.56M
      v_scratch = 0u;
57720
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u])));
57721
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u])));
57722
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u])));
57723
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u])));
57724
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u])));
57725
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u])));
57726
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u])));
57727
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u])));
57728
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u])));
57729
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u])));
57730
4.56M
      v_scratch += ((uint32_t)(4294967289u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u])));
57731
4.56M
      v_scratch += ((uint32_t)(50u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u])));
57732
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u])));
57733
4.56M
      v_scratch += ((uint32_t)(4294967246u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u])));
57734
4.56M
      v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u])));
57735
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u])));
57736
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u])));
57737
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u])));
57738
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u])));
57739
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u])));
57740
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u])));
57741
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u])));
57742
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u])));
57743
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u])));
57744
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u])));
57745
4.56M
      v_scratch *= v_q_00;
57746
4.56M
      if (v_scratch < 2147483648u) {
57747
4.55M
        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)))));
57748
4.55M
      } else {
57749
7.15k
        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)))));
57750
7.15k
      }
57751
4.56M
      self->private_data.f_mcu_blocks[0u][1u] = ((uint16_t)(v_scratch));
57752
4.56M
    }
57753
4.60M
    v_al = self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][5u];
57754
4.60M
    v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][2u]));
57755
4.60M
    if ((v_al > 0u) && (v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][2u] == 0u)) {
57756
4.48M
      v_limit = ((((uint32_t)(1u)) << v_al) - 1u);
57757
4.48M
      v_scratch = 0u;
57758
4.48M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u])));
57759
4.48M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u])));
57760
4.48M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u])));
57761
4.48M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u])));
57762
4.48M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u])));
57763
4.48M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u])));
57764
4.48M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u])));
57765
4.48M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u])));
57766
4.48M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u])));
57767
4.48M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u])));
57768
4.48M
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u])));
57769
4.48M
      v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u])));
57770
4.48M
      v_scratch += ((uint32_t)(4294967272u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u])));
57771
4.48M
      v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u])));
57772
4.48M
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u])));
57773
4.48M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u])));
57774
4.48M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u])));
57775
4.48M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u])));
57776
4.48M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u])));
57777
4.48M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u])));
57778
4.48M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u])));
57779
4.48M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u])));
57780
4.48M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u])));
57781
4.48M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u])));
57782
4.48M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u])));
57783
4.48M
      v_scratch *= v_q_00;
57784
4.48M
      if (v_scratch < 2147483648u) {
57785
4.47M
        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)))));
57786
4.47M
      } else {
57787
5.64k
        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)))));
57788
5.64k
      }
57789
4.48M
      self->private_data.f_mcu_blocks[0u][2u] = ((uint16_t)(v_scratch));
57790
4.48M
    }
57791
4.60M
    v_al = self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][2u];
57792
4.60M
    v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][8u]));
57793
4.60M
    if ((v_al > 0u) && (v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][8u] == 0u)) {
57794
4.56M
      v_limit = ((((uint32_t)(1u)) << v_al) - 1u);
57795
4.56M
      v_scratch = 0u;
57796
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u])));
57797
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u])));
57798
4.56M
      v_scratch += ((uint32_t)(4294967289u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u])));
57799
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u])));
57800
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u])));
57801
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u])));
57802
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u])));
57803
4.56M
      v_scratch += ((uint32_t)(50u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u])));
57804
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u])));
57805
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u])));
57806
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u])));
57807
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u])));
57808
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u])));
57809
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u])));
57810
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u])));
57811
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u])));
57812
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u])));
57813
4.56M
      v_scratch += ((uint32_t)(4294967246u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u])));
57814
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u])));
57815
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u])));
57816
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u])));
57817
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u])));
57818
4.56M
      v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u])));
57819
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u])));
57820
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u])));
57821
4.56M
      v_scratch *= v_q_00;
57822
4.56M
      if (v_scratch < 2147483648u) {
57823
4.55M
        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)))));
57824
4.55M
      } else {
57825
12.7k
        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)))));
57826
12.7k
      }
57827
4.56M
      self->private_data.f_mcu_blocks[0u][8u] = ((uint16_t)(v_scratch));
57828
4.56M
    }
57829
4.60M
    v_al = self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][4u];
57830
4.60M
    v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][9u]));
57831
4.60M
    if ((v_al > 0u) && (v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][9u] == 0u)) {
57832
4.56M
      v_limit = ((((uint32_t)(1u)) << v_al) - 1u);
57833
4.56M
      v_scratch = 0u;
57834
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u])));
57835
4.56M
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u])));
57836
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u])));
57837
4.56M
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u])));
57838
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u])));
57839
4.56M
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u])));
57840
4.56M
      v_scratch += ((uint32_t)(10u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u])));
57841
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u])));
57842
4.56M
      v_scratch += ((uint32_t)(4294967286u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u])));
57843
4.56M
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u])));
57844
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u])));
57845
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u])));
57846
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u])));
57847
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u])));
57848
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u])));
57849
4.56M
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u])));
57850
4.56M
      v_scratch += ((uint32_t)(4294967286u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u])));
57851
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u])));
57852
4.56M
      v_scratch += ((uint32_t)(10u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u])));
57853
4.56M
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u])));
57854
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u])));
57855
4.56M
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u])));
57856
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u])));
57857
4.56M
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u])));
57858
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u])));
57859
4.56M
      v_scratch *= v_q_00;
57860
4.56M
      if (v_scratch < 2147483648u) {
57861
4.56M
        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)))));
57862
4.56M
      } else {
57863
8.71k
        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)))));
57864
8.71k
      }
57865
4.56M
      self->private_data.f_mcu_blocks[0u][9u] = ((uint16_t)(v_scratch));
57866
4.56M
    }
57867
4.60M
    v_al = self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][3u];
57868
4.60M
    v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][16u]));
57869
4.60M
    if ((v_al > 0u) && (v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][16u] == 0u)) {
57870
4.56M
      v_limit = ((((uint32_t)(1u)) << v_al) - 1u);
57871
4.56M
      v_scratch = 0u;
57872
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u])));
57873
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u])));
57874
4.56M
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u])));
57875
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u])));
57876
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u])));
57877
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u])));
57878
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u])));
57879
4.56M
      v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u])));
57880
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u])));
57881
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u])));
57882
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u])));
57883
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u])));
57884
4.56M
      v_scratch += ((uint32_t)(4294967272u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u])));
57885
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u])));
57886
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u])));
57887
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u])));
57888
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u])));
57889
4.56M
      v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u])));
57890
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u])));
57891
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u])));
57892
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u])));
57893
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u])));
57894
4.56M
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u])));
57895
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u])));
57896
4.56M
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u])));
57897
4.56M
      v_scratch *= v_q_00;
57898
4.56M
      if (v_scratch < 2147483648u) {
57899
4.55M
        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)))));
57900
4.55M
      } else {
57901
9.73k
        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)))));
57902
9.73k
      }
57903
4.56M
      self->private_data.f_mcu_blocks[0u][16u] = ((uint16_t)(v_scratch));
57904
4.56M
    }
57905
4.60M
  }
57906
33.2M
  return wuffs_base__make_empty_struct();
57907
33.2M
}
57908
57909
// -------- func jpeg.decoder.decode_mcu
57910
57911
WUFFS_BASE__GENERATED_C_CODE
57912
static uint32_t
57913
wuffs_jpeg__decoder__decode_mcu(
57914
    wuffs_jpeg__decoder* self,
57915
    wuffs_base__pixel_buffer* a_dst,
57916
    wuffs_base__slice_u8 a_workbuf,
57917
    uint32_t a_mx,
57918
24.7M
    uint32_t a_my) {
57919
24.7M
  return (*self->private_impl.choosy_decode_mcu)(self, a_dst, a_workbuf, a_mx, a_my);
57920
24.7M
}
57921
57922
WUFFS_BASE__GENERATED_C_CODE
57923
static uint32_t
57924
wuffs_jpeg__decoder__decode_mcu__choosy_default(
57925
    wuffs_jpeg__decoder* self,
57926
    wuffs_base__pixel_buffer* a_dst,
57927
    wuffs_base__slice_u8 a_workbuf,
57928
    uint32_t a_mx,
57929
2.08M
    uint32_t a_my) {
57930
2.08M
  uint32_t v_ret = 0;
57931
2.08M
  uint64_t v_bits = 0;
57932
2.08M
  uint32_t v_n_bits = 0;
57933
2.08M
  uint8_t v_csel = 0;
57934
2.08M
  wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer();
57935
2.08M
  wuffs_base__io_buffer* v_r = &u_r;
57936
2.08M
  const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
57937
2.08M
  const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
57938
2.08M
  const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
57939
2.08M
  const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
57940
2.08M
  uint32_t v_pos = 0;
57941
2.08M
  uint8_t v_dc_h = 0;
57942
2.08M
  uint32_t v_dc_symbol = 0;
57943
2.08M
  uint32_t v_dc_ht_fast = 0;
57944
2.08M
  uint32_t v_dc_bl = 0;
57945
2.08M
  uint32_t v_dc_code = 0;
57946
2.08M
  uint32_t v_dc_blm1 = 0;
57947
2.08M
  uint32_t v_dc_ht_slow = 0;
57948
2.08M
  uint16_t v_dc_value = 0;
57949
2.08M
  uint16_t v_dc_extend = 0;
57950
2.08M
  const uint16_t* v_ac_huff_table_fast = NULL;
57951
2.08M
  uint8_t v_ac_h = 0;
57952
2.08M
  uint32_t v_ac_symbol = 0;
57953
2.08M
  uint32_t v_ac_ht_fast = 0;
57954
2.08M
  uint32_t v_ac_bl = 0;
57955
2.08M
  uint32_t v_ac_code = 0;
57956
2.08M
  uint32_t v_ac_blm1 = 0;
57957
2.08M
  uint32_t v_ac_ht_slow = 0;
57958
2.08M
  uint16_t v_ac_value = 0;
57959
2.08M
  uint16_t v_ac_extend = 0;
57960
2.08M
  uint32_t v_ac_rrrr = 0;
57961
2.08M
  uint32_t v_ac_ssss = 0;
57962
2.08M
  uint32_t v_z = 0;
57963
2.08M
  uint32_t v_mcb = 0;
57964
2.08M
  uint64_t v_stride = 0;
57965
2.08M
  uint64_t v_offset = 0;
57966
57967
2.08M
  v_bits = self->private_impl.f_bitstream_bits;
57968
2.08M
  v_n_bits = self->private_impl.f_bitstream_n_bits;
57969
2.08M
  if (self->private_impl.f_bitstream_ri > self->private_impl.f_bitstream_wi) {
57970
0
    return 2u;
57971
0
  }
57972
2.08M
  {
57973
2.08M
    wuffs_base__io_buffer* o_0_v_r = v_r;
57974
2.08M
    const uint8_t* o_0_iop_v_r = iop_v_r;
57975
2.08M
    const uint8_t* o_0_io0_v_r = io0_v_r;
57976
2.08M
    const uint8_t* o_0_io1_v_r = io1_v_r;
57977
2.08M
    const uint8_t* o_0_io2_v_r = io2_v_r;
57978
2.08M
    v_r = wuffs_private_impl__io_reader__set(
57979
2.08M
        &u_r,
57980
2.08M
        &iop_v_r,
57981
2.08M
        &io0_v_r,
57982
2.08M
        &io1_v_r,
57983
2.08M
        &io2_v_r,
57984
2.08M
        wuffs_base__make_slice_u8_ij(self->private_data.f_bitstream_buffer,
57985
2.08M
        self->private_impl.f_bitstream_ri,
57986
2.08M
        self->private_impl.f_bitstream_wi),
57987
2.08M
        ((uint64_t)(self->private_impl.f_bitstream_ri)));
57988
2.08M
    do {
57989
4.82M
      while (self->private_impl.f_mcu_current_block < self->private_impl.f_mcu_num_blocks) {
57990
2.85M
        while (self->private_impl.f_mcu_zig_index <= 0u) {
57991
2.81M
          wuffs_private_impl__bulk_memset(&self->private_data.f_mcu_blocks[0], 1u * (size_t)128u, 0u);
57992
2.81M
          if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) {
57993
71.3k
            v_ret = 1u;
57994
71.3k
            goto label__goto_done__break;
57995
71.3k
          }
57996
2.74M
          v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u));
57997
2.74M
          iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u);
57998
2.74M
          v_n_bits |= 56u;
57999
2.74M
          v_dc_h = self->private_impl.f_mcu_blocks_dc_hselector[self->private_impl.f_mcu_current_block];
58000
2.74M
          v_dc_ht_fast = ((uint32_t)(self->private_impl.f_huff_tables_fast[v_dc_h][(v_bits >> 56u)]));
58001
2.74M
          v_dc_bl = (v_dc_ht_fast >> 8u);
58002
2.74M
          if (v_n_bits >= v_dc_bl) {
58003
2.71M
            v_dc_symbol = (15u & v_dc_ht_fast);
58004
2.71M
            v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol];
58005
2.71M
            v_bits <<= (v_dc_bl & 63u);
58006
2.71M
            v_n_bits -= v_dc_bl;
58007
2.71M
          } else {
58008
21.2k
            v_dc_code = ((uint32_t)((v_bits >> 55u)));
58009
21.2k
            v_dc_blm1 = 8u;
58010
21.2k
            v_bits <<= 9u;
58011
21.2k
            v_n_bits -= 9u;
58012
92.9k
            while (true) {
58013
92.9k
              v_dc_ht_slow = self->private_impl.f_huff_tables_slow[v_dc_h][v_dc_blm1];
58014
92.9k
              if (v_dc_code < (v_dc_ht_slow >> 8u)) {
58015
20.7k
                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)))])));
58016
20.7k
                v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol];
58017
20.7k
                break;
58018
20.7k
              }
58019
72.2k
              v_dc_code = (((uint32_t)(v_dc_code << 1u)) | ((uint32_t)((v_bits >> 63u))));
58020
72.2k
              v_bits <<= 1u;
58021
72.2k
              v_n_bits -= 1u;
58022
72.2k
              v_dc_blm1 = ((v_dc_blm1 + 1u) & 15u);
58023
72.2k
              if (v_dc_blm1 == 0u) {
58024
465
                v_dc_symbol = 0u;
58025
465
                v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol];
58026
465
                break;
58027
465
              }
58028
72.2k
            }
58029
21.2k
          }
58030
2.74M
          v_dc_value = ((uint16_t)(((v_bits >> 32u) >> (32u - v_dc_symbol))));
58031
2.74M
#if defined(__GNUC__)
58032
2.74M
#pragma GCC diagnostic push
58033
2.74M
#pragma GCC diagnostic ignored "-Wconversion"
58034
2.74M
#endif
58035
2.74M
          v_dc_value += ((uint16_t)(v_dc_extend & ((uint16_t)(((uint16_t)(wuffs_base__utility__sign_extend_rshift_u64(v_bits, 63u))) ^ 65535u))));
58036
2.74M
#if defined(__GNUC__)
58037
2.74M
#pragma GCC diagnostic pop
58038
2.74M
#endif
58039
2.74M
          v_bits <<= v_dc_symbol;
58040
2.74M
          v_n_bits -= v_dc_symbol;
58041
2.74M
          v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[self->private_impl.f_mcu_current_block]];
58042
2.74M
#if defined(__GNUC__)
58043
2.74M
#pragma GCC diagnostic push
58044
2.74M
#pragma GCC diagnostic ignored "-Wconversion"
58045
2.74M
#endif
58046
2.74M
          self->private_impl.f_mcu_previous_dc_values[v_csel] += v_dc_value;
58047
2.74M
#if defined(__GNUC__)
58048
2.74M
#pragma GCC diagnostic pop
58049
2.74M
#endif
58050
2.74M
          self->private_data.f_mcu_blocks[0u][0u] = self->private_impl.f_mcu_previous_dc_values[v_csel];
58051
2.74M
          self->private_impl.f_mcu_zig_index = 1u;
58052
2.74M
          break;
58053
2.81M
        }
58054
2.78M
        if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) {
58055
44.2k
          v_ret = 1u;
58056
44.2k
          goto label__goto_done__break;
58057
44.2k
        }
58058
2.74M
        if (v_n_bits < 16u) {
58059
0
          v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u));
58060
0
        }
58061
2.74M
        v_z = 1u;
58062
2.74M
        self->private_impl.f_mcu_zig_index = 0u;
58063
2.74M
        v_ac_h = self->private_impl.f_mcu_blocks_ac_hselector[self->private_impl.f_mcu_current_block];
58064
2.74M
        v_ac_huff_table_fast = &self->private_impl.f_huff_tables_fast[v_ac_h][0u];
58065
39.3M
        while (v_z < 64u) {
58066
38.8M
          v_ac_ht_fast = ((uint32_t)(v_ac_huff_table_fast[(v_bits >> 56u)]));
58067
38.8M
          if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) {
58068
0
            v_ret = 2u;
58069
0
            goto label__goto_done__break;
58070
0
          }
58071
38.8M
          v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u));
58072
38.8M
          iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u);
58073
38.8M
          v_n_bits |= 56u;
58074
38.8M
          v_ac_bl = (v_ac_ht_fast >> 8u);
58075
38.8M
          if (v_n_bits >= v_ac_bl) {
58076
38.6M
            v_ac_symbol = (255u & v_ac_ht_fast);
58077
38.6M
            v_bits <<= (v_ac_bl & 63u);
58078
38.6M
            v_n_bits -= v_ac_bl;
58079
38.6M
          } else {
58080
179k
            v_ac_code = ((uint32_t)((v_bits >> 55u)));
58081
179k
            v_ac_blm1 = 8u;
58082
179k
            v_bits <<= 9u;
58083
179k
            v_n_bits -= 9u;
58084
548k
            while (true) {
58085
548k
              v_ac_ht_slow = self->private_impl.f_huff_tables_slow[v_ac_h][v_ac_blm1];
58086
548k
              if (v_ac_code < (v_ac_ht_slow >> 8u)) {
58087
179k
                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)))]));
58088
179k
                break;
58089
179k
              }
58090
368k
              v_ac_code = (((uint32_t)(v_ac_code << 1u)) | ((uint32_t)((v_bits >> 63u))));
58091
368k
              v_bits <<= 1u;
58092
368k
              v_n_bits -= 1u;
58093
368k
              v_ac_blm1 = ((v_ac_blm1 + 1u) & 15u);
58094
368k
              if (v_ac_blm1 == 0u) {
58095
289
                v_ac_symbol = 0u;
58096
289
                break;
58097
289
              }
58098
368k
            }
58099
179k
          }
58100
38.8M
          v_ac_rrrr = (v_ac_symbol >> 4u);
58101
38.8M
          v_z += (v_ac_rrrr + 1u);
58102
38.8M
          v_ac_ssss = (v_ac_symbol & 15u);
58103
38.8M
          v_ac_extend = WUFFS_JPEG__EXTEND[v_ac_ssss];
58104
38.8M
          if (v_ac_ssss > 0u) {
58105
36.5M
            v_ac_value = ((uint16_t)((v_bits >> (64u - v_ac_ssss))));
58106
36.5M
#if defined(__GNUC__)
58107
36.5M
#pragma GCC diagnostic push
58108
36.5M
#pragma GCC diagnostic ignored "-Wconversion"
58109
36.5M
#endif
58110
36.5M
            v_ac_value += ((uint16_t)(v_ac_extend & ((uint16_t)(((uint16_t)(wuffs_base__utility__sign_extend_rshift_u64(v_bits, 63u))) ^ 65535u))));
58111
36.5M
#if defined(__GNUC__)
58112
36.5M
#pragma GCC diagnostic pop
58113
36.5M
#endif
58114
36.5M
            v_bits <<= v_ac_ssss;
58115
36.5M
            v_n_bits -= v_ac_ssss;
58116
36.5M
            self->private_data.f_mcu_blocks[0u][WUFFS_JPEG__UNZIG[v_z]] = v_ac_value;
58117
36.5M
          } else if (v_ac_rrrr < 15u) {
58118
2.22M
            break;
58119
2.22M
          }
58120
38.8M
        }
58121
2.74M
        v_mcb = self->private_impl.f_mcu_current_block;
58122
2.74M
        self->private_impl.f_mcu_current_block += 1u;
58123
2.74M
        if (self->private_impl.f_test_only_interrupt_decode_mcu) {
58124
0
          goto label__goto_done__break;
58125
0
        }
58126
2.74M
        if ( ! self->private_impl.f_swizzle_immediately) {
58127
2.74M
          v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[v_mcb]];
58128
2.74M
          v_stride = ((uint64_t)(self->private_impl.f_components_workbuf_widths[v_csel]));
58129
2.74M
          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))));
58130
2.74M
          if (v_offset <= ((uint64_t)(a_workbuf.len))) {
58131
2.74M
            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])));
58132
2.74M
          }
58133
2.74M
        } else if (self->private_impl.f_num_components == 1u) {
58134
0
          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])));
58135
0
          self->private_impl.f_swizzle_immediately_status = wuffs_jpeg__decoder__swizzle_gray(self,
58136
0
              a_dst,
58137
0
              wuffs_base__make_slice_u8(self->private_data.f_swizzle_immediately_buffer, 64),
58138
0
              ((a_mx + 0u) * 8u),
58139
0
              ((a_mx + 1u) * 8u),
58140
0
              ((a_my + 0u) * 8u),
58141
0
              ((a_my + 1u) * 8u),
58142
0
              8u);
58143
0
          if ( ! wuffs_base__status__is_ok(&self->private_impl.f_swizzle_immediately_status)) {
58144
0
            v_ret = 3u;
58145
0
            goto label__goto_done__break;
58146
0
          }
58147
0
          break;
58148
0
        } else {
58149
0
          v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[v_mcb]];
58150
0
          v_stride = (8u * ((uint64_t)(self->private_impl.f_components_h[v_csel])));
58151
0
          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])));
58152
0
          if (self->private_impl.f_mcu_current_block < self->private_impl.f_mcu_num_blocks) {
58153
0
            continue;
58154
0
          }
58155
0
          self->private_impl.f_swizzle_immediately_status = wuffs_jpeg__decoder__swizzle_colorful(self,
58156
0
              a_dst,
58157
0
              wuffs_base__utility__empty_slice_u8(),
58158
0
              ((a_mx + 0u) * 8u * ((uint32_t)(self->private_impl.f_max_incl_components_h))),
58159
0
              ((a_mx + 1u) * 8u * ((uint32_t)(self->private_impl.f_max_incl_components_h))),
58160
0
              ((a_my + 0u) * 8u * ((uint32_t)(self->private_impl.f_max_incl_components_v))),
58161
0
              ((a_my + 1u) * 8u * ((uint32_t)(self->private_impl.f_max_incl_components_v))));
58162
0
          if ( ! wuffs_base__status__is_ok(&self->private_impl.f_swizzle_immediately_status)) {
58163
0
            v_ret = 3u;
58164
0
            goto label__goto_done__break;
58165
0
          }
58166
0
          break;
58167
0
        }
58168
2.74M
      }
58169
1.96M
      self->private_impl.f_mcu_current_block = 0u;
58170
1.96M
    } while (0);
58171
2.08M
    label__goto_done__break:;
58172
2.08M
    v_pos = ((uint32_t)(wuffs_base__u64__sat_add((v_r ? v_r->meta.pos : 0), ((uint64_t)(iop_v_r - io0_v_r)))));
58173
2.08M
    if (v_pos > self->private_impl.f_bitstream_wi) {
58174
0
      v_ret = 2u;
58175
2.08M
    } else {
58176
2.08M
      self->private_impl.f_bitstream_ri = v_pos;
58177
2.08M
    }
58178
2.08M
    v_r = o_0_v_r;
58179
2.08M
    iop_v_r = o_0_iop_v_r;
58180
2.08M
    io0_v_r = o_0_io0_v_r;
58181
2.08M
    io1_v_r = o_0_io1_v_r;
58182
2.08M
    io2_v_r = o_0_io2_v_r;
58183
2.08M
  }
58184
0
  self->private_impl.f_bitstream_bits = v_bits;
58185
2.08M
  self->private_impl.f_bitstream_n_bits = v_n_bits;
58186
2.08M
  return v_ret;
58187
2.08M
}
58188
58189
// -------- func jpeg.decoder.decode_mcu_progressive_ac_high_bits
58190
58191
WUFFS_BASE__GENERATED_C_CODE
58192
static uint32_t
58193
wuffs_jpeg__decoder__decode_mcu_progressive_ac_high_bits(
58194
    wuffs_jpeg__decoder* self,
58195
    wuffs_base__pixel_buffer* a_dst,
58196
    wuffs_base__slice_u8 a_workbuf,
58197
    uint32_t a_mx,
58198
2.51M
    uint32_t a_my) {
58199
2.51M
  uint32_t v_ret = 0;
58200
2.51M
  uint64_t v_bits = 0;
58201
2.51M
  uint32_t v_n_bits = 0;
58202
2.51M
  wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer();
58203
2.51M
  wuffs_base__io_buffer* v_r = &u_r;
58204
2.51M
  const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
58205
2.51M
  const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
58206
2.51M
  const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
58207
2.51M
  const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
58208
2.51M
  uint32_t v_pos = 0;
58209
2.51M
  const uint16_t* v_ac_huff_table_fast = NULL;
58210
2.51M
  uint8_t v_ac_h = 0;
58211
2.51M
  uint32_t v_ac_symbol = 0;
58212
2.51M
  uint32_t v_ac_ht_fast = 0;
58213
2.51M
  uint32_t v_ac_bl = 0;
58214
2.51M
  uint32_t v_ac_code = 0;
58215
2.51M
  uint32_t v_ac_blm1 = 0;
58216
2.51M
  uint32_t v_ac_ht_slow = 0;
58217
2.51M
  uint16_t v_ac_value = 0;
58218
2.51M
  uint16_t v_ac_extend = 0;
58219
2.51M
  uint32_t v_ac_rrrr = 0;
58220
2.51M
  uint32_t v_ac_ssss = 0;
58221
2.51M
  uint32_t v_z = 0;
58222
58223
2.51M
  if (self->private_impl.f_eob_run > 0u) {
58224
92.0k
#if defined(__GNUC__)
58225
92.0k
#pragma GCC diagnostic push
58226
92.0k
#pragma GCC diagnostic ignored "-Wconversion"
58227
92.0k
#endif
58228
92.0k
    self->private_impl.f_eob_run -= 1u;
58229
92.0k
#if defined(__GNUC__)
58230
92.0k
#pragma GCC diagnostic pop
58231
92.0k
#endif
58232
92.0k
    return 0u;
58233
92.0k
  }
58234
2.41M
  v_bits = self->private_impl.f_bitstream_bits;
58235
2.41M
  v_n_bits = self->private_impl.f_bitstream_n_bits;
58236
2.41M
  if (self->private_impl.f_bitstream_ri > self->private_impl.f_bitstream_wi) {
58237
0
    return 2u;
58238
0
  }
58239
2.41M
  {
58240
2.41M
    wuffs_base__io_buffer* o_0_v_r = v_r;
58241
2.41M
    const uint8_t* o_0_iop_v_r = iop_v_r;
58242
2.41M
    const uint8_t* o_0_io0_v_r = io0_v_r;
58243
2.41M
    const uint8_t* o_0_io1_v_r = io1_v_r;
58244
2.41M
    const uint8_t* o_0_io2_v_r = io2_v_r;
58245
2.41M
    v_r = wuffs_private_impl__io_reader__set(
58246
2.41M
        &u_r,
58247
2.41M
        &iop_v_r,
58248
2.41M
        &io0_v_r,
58249
2.41M
        &io1_v_r,
58250
2.41M
        &io2_v_r,
58251
2.41M
        wuffs_base__make_slice_u8_ij(self->private_data.f_bitstream_buffer,
58252
2.41M
        self->private_impl.f_bitstream_ri,
58253
2.41M
        self->private_impl.f_bitstream_wi),
58254
2.41M
        ((uint64_t)(self->private_impl.f_bitstream_ri)));
58255
2.41M
    do {
58256
2.41M
      do {
58257
2.41M
        if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) {
58258
38.9k
          v_ret = 1u;
58259
38.9k
          goto label__goto_done__break;
58260
38.9k
        }
58261
2.37M
        if (v_n_bits < 16u) {
58262
2.80k
          v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u));
58263
2.80k
        }
58264
2.37M
        v_z = self->private_impl.f_mcu_zig_index;
58265
2.37M
        self->private_impl.f_mcu_zig_index = 0u;
58266
2.37M
        v_ac_h = self->private_impl.f_mcu_blocks_ac_hselector[0u];
58267
2.37M
        v_ac_huff_table_fast = &self->private_impl.f_huff_tables_fast[v_ac_h][0u];
58268
26.3M
        while (v_z <= ((uint32_t)(self->private_impl.f_scan_se))) {
58269
25.3M
          v_ac_ht_fast = ((uint32_t)(v_ac_huff_table_fast[(v_bits >> 56u)]));
58270
25.3M
          if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) {
58271
0
            v_ret = 2u;
58272
0
            goto label__goto_done__break;
58273
0
          }
58274
25.3M
          v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u));
58275
25.3M
          iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u);
58276
25.3M
          v_n_bits |= 56u;
58277
25.3M
          v_ac_bl = (v_ac_ht_fast >> 8u);
58278
25.3M
          if (v_n_bits >= v_ac_bl) {
58279
25.2M
            v_ac_symbol = (255u & v_ac_ht_fast);
58280
25.2M
            v_bits <<= (v_ac_bl & 63u);
58281
25.2M
            v_n_bits -= v_ac_bl;
58282
25.2M
          } else {
58283
37.0k
            v_ac_code = ((uint32_t)((v_bits >> 55u)));
58284
37.0k
            v_ac_blm1 = 8u;
58285
37.0k
            v_bits <<= 9u;
58286
37.0k
            v_n_bits -= 9u;
58287
187k
            while (true) {
58288
187k
              v_ac_ht_slow = self->private_impl.f_huff_tables_slow[v_ac_h][v_ac_blm1];
58289
187k
              if (v_ac_code < (v_ac_ht_slow >> 8u)) {
58290
36.4k
                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)))]));
58291
36.4k
                break;
58292
36.4k
              }
58293
150k
              v_ac_code = (((uint32_t)(v_ac_code << 1u)) | ((uint32_t)((v_bits >> 63u))));
58294
150k
              v_bits <<= 1u;
58295
150k
              v_n_bits -= 1u;
58296
150k
              v_ac_blm1 = ((v_ac_blm1 + 1u) & 15u);
58297
150k
              if (v_ac_blm1 == 0u) {
58298
533
                v_ac_symbol = 0u;
58299
533
                break;
58300
533
              }
58301
150k
            }
58302
37.0k
          }
58303
25.3M
          v_ac_rrrr = (v_ac_symbol >> 4u);
58304
25.3M
          v_z += (v_ac_rrrr + 1u);
58305
25.3M
          v_ac_ssss = (v_ac_symbol & 15u);
58306
25.3M
          v_ac_extend = WUFFS_JPEG__EXTEND[v_ac_ssss];
58307
25.3M
          if (v_ac_ssss > 0u) {
58308
23.9M
            v_ac_value = ((uint16_t)((v_bits >> (64u - v_ac_ssss))));
58309
23.9M
#if defined(__GNUC__)
58310
23.9M
#pragma GCC diagnostic push
58311
23.9M
#pragma GCC diagnostic ignored "-Wconversion"
58312
23.9M
#endif
58313
23.9M
            v_ac_value += ((uint16_t)(v_ac_extend & ((uint16_t)(((uint16_t)(wuffs_base__utility__sign_extend_rshift_u64(v_bits, 63u))) ^ 65535u))));
58314
23.9M
#if defined(__GNUC__)
58315
23.9M
#pragma GCC diagnostic pop
58316
23.9M
#endif
58317
23.9M
            v_bits <<= v_ac_ssss;
58318
23.9M
            v_n_bits -= v_ac_ssss;
58319
23.9M
            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))));
58320
23.9M
          } else if (v_ac_rrrr < 15u) {
58321
1.37M
            self->private_impl.f_eob_run = ((uint16_t)(((uint16_t)(((uint16_t)(((uint16_t)(1u)) << v_ac_rrrr)) - 1u))));
58322
1.37M
            if (v_ac_rrrr > 0u) {
58323
14.8k
#if defined(__GNUC__)
58324
14.8k
#pragma GCC diagnostic push
58325
14.8k
#pragma GCC diagnostic ignored "-Wconversion"
58326
14.8k
#endif
58327
14.8k
              self->private_impl.f_eob_run += ((uint16_t)((v_bits >> (64u - v_ac_rrrr))));
58328
14.8k
#if defined(__GNUC__)
58329
14.8k
#pragma GCC diagnostic pop
58330
14.8k
#endif
58331
14.8k
              v_bits <<= v_ac_rrrr;
58332
14.8k
              v_n_bits -= v_ac_rrrr;
58333
14.8k
            }
58334
1.37M
            break;
58335
1.37M
          }
58336
25.3M
        }
58337
2.37M
      } while (0);
58338
2.41M
    } while (0);
58339
2.41M
    label__goto_done__break:;
58340
2.41M
    v_pos = ((uint32_t)(wuffs_base__u64__sat_add((v_r ? v_r->meta.pos : 0), ((uint64_t)(iop_v_r - io0_v_r)))));
58341
2.41M
    if (v_pos > self->private_impl.f_bitstream_wi) {
58342
0
      v_ret = 2u;
58343
2.41M
    } else {
58344
2.41M
      self->private_impl.f_bitstream_ri = v_pos;
58345
2.41M
    }
58346
2.41M
    v_r = o_0_v_r;
58347
2.41M
    iop_v_r = o_0_iop_v_r;
58348
2.41M
    io0_v_r = o_0_io0_v_r;
58349
2.41M
    io1_v_r = o_0_io1_v_r;
58350
2.41M
    io2_v_r = o_0_io2_v_r;
58351
2.41M
  }
58352
0
  self->private_impl.f_bitstream_bits = v_bits;
58353
2.41M
  self->private_impl.f_bitstream_n_bits = v_n_bits;
58354
2.41M
  return v_ret;
58355
2.41M
}
58356
58357
// -------- func jpeg.decoder.decode_mcu_progressive_ac_low_bit
58358
58359
WUFFS_BASE__GENERATED_C_CODE
58360
static uint32_t
58361
wuffs_jpeg__decoder__decode_mcu_progressive_ac_low_bit(
58362
    wuffs_jpeg__decoder* self,
58363
    wuffs_base__pixel_buffer* a_dst,
58364
    wuffs_base__slice_u8 a_workbuf,
58365
    uint32_t a_mx,
58366
1.63M
    uint32_t a_my) {
58367
1.63M
  uint32_t v_ret = 0;
58368
1.63M
  uint64_t v_bits = 0;
58369
1.63M
  uint32_t v_n_bits = 0;
58370
1.63M
  uint16_t v_one_lshift_scan_al = 0;
58371
1.63M
  wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer();
58372
1.63M
  wuffs_base__io_buffer* v_r = &u_r;
58373
1.63M
  const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
58374
1.63M
  const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
58375
1.63M
  const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
58376
1.63M
  const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
58377
1.63M
  uint32_t v_pos = 0;
58378
1.63M
  const uint16_t* v_ac_huff_table_fast = NULL;
58379
1.63M
  uint8_t v_ac_h = 0;
58380
1.63M
  uint32_t v_ac_symbol = 0;
58381
1.63M
  uint32_t v_ac_ht_fast = 0;
58382
1.63M
  uint32_t v_ac_bl = 0;
58383
1.63M
  uint32_t v_ac_code = 0;
58384
1.63M
  uint32_t v_ac_blm1 = 0;
58385
1.63M
  uint32_t v_ac_ht_slow = 0;
58386
1.63M
  uint16_t v_ac_value = 0;
58387
1.63M
  uint32_t v_ac_rrrr = 0;
58388
1.63M
  uint32_t v_ac_ssss = 0;
58389
1.63M
  uint8_t v_unzig = 0;
58390
1.63M
  bool v_bit = false;
58391
58392
1.63M
  v_bits = self->private_impl.f_bitstream_bits;
58393
1.63M
  v_n_bits = self->private_impl.f_bitstream_n_bits;
58394
1.63M
  v_one_lshift_scan_al = ((uint16_t)(((uint16_t)(1u)) << self->private_impl.f_scan_al));
58395
1.63M
  if (self->private_impl.f_bitstream_ri > self->private_impl.f_bitstream_wi) {
58396
0
    return 2u;
58397
0
  }
58398
1.63M
  {
58399
1.63M
    wuffs_base__io_buffer* o_0_v_r = v_r;
58400
1.63M
    const uint8_t* o_0_iop_v_r = iop_v_r;
58401
1.63M
    const uint8_t* o_0_io0_v_r = io0_v_r;
58402
1.63M
    const uint8_t* o_0_io1_v_r = io1_v_r;
58403
1.63M
    const uint8_t* o_0_io2_v_r = io2_v_r;
58404
1.63M
    v_r = wuffs_private_impl__io_reader__set(
58405
1.63M
        &u_r,
58406
1.63M
        &iop_v_r,
58407
1.63M
        &io0_v_r,
58408
1.63M
        &io1_v_r,
58409
1.63M
        &io2_v_r,
58410
1.63M
        wuffs_base__make_slice_u8_ij(self->private_data.f_bitstream_buffer,
58411
1.63M
        self->private_impl.f_bitstream_ri,
58412
1.63M
        self->private_impl.f_bitstream_wi),
58413
1.63M
        ((uint64_t)(self->private_impl.f_bitstream_ri)));
58414
1.63M
    do {
58415
1.63M
      do {
58416
1.63M
        if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) {
58417
28.2k
          v_ret = 1u;
58418
28.2k
          goto label__goto_done__break;
58419
28.2k
        }
58420
1.60M
        while (true) {
58421
1.60M
          if (self->private_impl.f_eob_run > 0u) {
58422
326k
            break;
58423
326k
          }
58424
1.27M
          v_ac_h = self->private_impl.f_mcu_blocks_ac_hselector[0u];
58425
1.27M
          v_ac_huff_table_fast = &self->private_impl.f_huff_tables_fast[v_ac_h][0u];
58426
5.11M
          while (true) {
58427
5.11M
            if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) {
58428
0
              v_ret = 2u;
58429
0
              goto label__goto_done__break;
58430
0
            }
58431
5.11M
            v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u));
58432
5.11M
            iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u);
58433
5.11M
            v_n_bits |= 56u;
58434
5.11M
            v_ac_ht_fast = ((uint32_t)(v_ac_huff_table_fast[(v_bits >> 56u)]));
58435
5.11M
            v_ac_bl = (v_ac_ht_fast >> 8u);
58436
5.11M
            if (v_n_bits >= v_ac_bl) {
58437
5.08M
              v_ac_symbol = (255u & v_ac_ht_fast);
58438
5.08M
              v_bits <<= (v_ac_bl & 63u);
58439
5.08M
              v_n_bits -= v_ac_bl;
58440
5.08M
            } else {
58441
26.1k
              v_ac_code = ((uint32_t)((v_bits >> 55u)));
58442
26.1k
              v_ac_blm1 = 8u;
58443
26.1k
              v_bits <<= 9u;
58444
26.1k
              v_n_bits -= 9u;
58445
136k
              while (true) {
58446
136k
                v_ac_ht_slow = self->private_impl.f_huff_tables_slow[v_ac_h][v_ac_blm1];
58447
136k
                if (v_ac_code < (v_ac_ht_slow >> 8u)) {
58448
25.5k
                  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)))]));
58449
25.5k
                  break;
58450
25.5k
                }
58451
111k
                v_ac_code = (((uint32_t)(v_ac_code << 1u)) | ((uint32_t)((v_bits >> 63u))));
58452
111k
                v_bits <<= 1u;
58453
111k
                v_n_bits -= 1u;
58454
111k
                v_ac_blm1 = ((v_ac_blm1 + 1u) & 15u);
58455
111k
                if (v_ac_blm1 == 0u) {
58456
607
                  v_ac_symbol = 0u;
58457
607
                  break;
58458
607
                }
58459
111k
              }
58460
26.1k
            }
58461
5.11M
            v_ac_rrrr = (v_ac_symbol >> 4u);
58462
5.11M
            v_ac_ssss = (v_ac_symbol & 15u);
58463
5.11M
            v_ac_value = 0u;
58464
5.11M
            if (v_ac_ssss > 0u) {
58465
4.22M
              v_ac_value = ((uint16_t)(((uint16_t)(1u)) << self->private_impl.f_scan_al));
58466
4.22M
              if ((v_bits >> 63u) == 0u) {
58467
4.11M
                v_ac_value = ((uint16_t)(((uint16_t)(65535u)) << self->private_impl.f_scan_al));
58468
4.11M
              }
58469
4.22M
              v_bits <<= 1u;
58470
4.22M
              v_n_bits -= 1u;
58471
4.22M
            } else if (v_ac_rrrr < 15u) {
58472
867k
              self->private_impl.f_eob_run = ((uint16_t)(((uint16_t)(1u)) << v_ac_rrrr));
58473
867k
              if (v_ac_rrrr > 0u) {
58474
5.79k
#if defined(__GNUC__)
58475
5.79k
#pragma GCC diagnostic push
58476
5.79k
#pragma GCC diagnostic ignored "-Wconversion"
58477
5.79k
#endif
58478
5.79k
                self->private_impl.f_eob_run += ((uint16_t)((v_bits >> (64u - v_ac_rrrr))));
58479
5.79k
#if defined(__GNUC__)
58480
5.79k
#pragma GCC diagnostic pop
58481
5.79k
#endif
58482
5.79k
                v_bits <<= v_ac_rrrr;
58483
5.79k
                v_n_bits -= v_ac_rrrr;
58484
5.79k
              }
58485
867k
              goto label__goto_do_eob__break;
58486
867k
            }
58487
11.3M
            while (true) {
58488
11.3M
              v_unzig = WUFFS_JPEG__UNZIG[(1u + self->private_impl.f_mcu_zig_index)];
58489
11.3M
              if (self->private_data.f_mcu_blocks[0u][v_unzig] != 0u) {
58490
6.96M
                if (v_n_bits == 0u) {
58491
1.33k
                  if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) {
58492
0
                    v_ret = 2u;
58493
0
                    goto label__goto_done__break;
58494
0
                  }
58495
1.33k
                  v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u));
58496
1.33k
                  iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u);
58497
1.33k
                  v_n_bits |= 56u;
58498
1.33k
                }
58499
6.96M
                v_bit = ((v_bits >> 63u) > 0u);
58500
6.96M
                v_bits <<= 1u;
58501
6.96M
                v_n_bits -= 1u;
58502
6.96M
                if (v_bit) {
58503
79.6k
                  if (self->private_data.f_mcu_blocks[0u][v_unzig] < 32768u) {
58504
13.9k
#if defined(__GNUC__)
58505
13.9k
#pragma GCC diagnostic push
58506
13.9k
#pragma GCC diagnostic ignored "-Wconversion"
58507
13.9k
#endif
58508
13.9k
                    self->private_data.f_mcu_blocks[0u][v_unzig] += v_one_lshift_scan_al;
58509
13.9k
#if defined(__GNUC__)
58510
13.9k
#pragma GCC diagnostic pop
58511
13.9k
#endif
58512
65.6k
                  } else {
58513
65.6k
#if defined(__GNUC__)
58514
65.6k
#pragma GCC diagnostic push
58515
65.6k
#pragma GCC diagnostic ignored "-Wconversion"
58516
65.6k
#endif
58517
65.6k
                    self->private_data.f_mcu_blocks[0u][v_unzig] -= v_one_lshift_scan_al;
58518
65.6k
#if defined(__GNUC__)
58519
65.6k
#pragma GCC diagnostic pop
58520
65.6k
#endif
58521
65.6k
                  }
58522
79.6k
                }
58523
6.96M
              } else if (v_ac_rrrr <= 0u) {
58524
3.98M
                break;
58525
3.98M
              } else {
58526
380k
                v_ac_rrrr -= 1u;
58527
380k
              }
58528
7.34M
              if (self->private_impl.f_mcu_zig_index >= ((uint32_t)(self->private_impl.f_scan_se))) {
58529
257k
                break;
58530
257k
              }
58531
7.09M
              self->private_impl.f_mcu_zig_index += 1u;
58532
7.09M
            }
58533
4.24M
            if (v_ac_value != 0u) {
58534
4.22M
              self->private_data.f_mcu_blocks[0u][WUFFS_JPEG__UNZIG[(1u + self->private_impl.f_mcu_zig_index)]] = v_ac_value;
58535
4.22M
            }
58536
4.24M
            if (self->private_impl.f_mcu_zig_index >= ((uint32_t)(self->private_impl.f_scan_se))) {
58537
408k
              break;
58538
408k
            }
58539
3.83M
            self->private_impl.f_mcu_zig_index += 1u;
58540
3.83M
          }
58541
408k
          goto label__block__break;
58542
1.27M
        }
58543
1.19M
        label__goto_do_eob__break:;
58544
1.19M
        if (self->private_impl.f_eob_run <= 0u) {
58545
0
          v_ret = 2u;
58546
0
          goto label__goto_done__break;
58547
0
        }
58548
26.9M
        while (true) {
58549
26.9M
          v_unzig = WUFFS_JPEG__UNZIG[(1u + self->private_impl.f_mcu_zig_index)];
58550
26.9M
          if (self->private_data.f_mcu_blocks[0u][v_unzig] != 0u) {
58551
133k
            if (v_n_bits == 0u) {
58552
1.28k
              if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) {
58553
0
                v_ret = 2u;
58554
0
                goto label__goto_done__break;
58555
0
              }
58556
1.28k
              v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u));
58557
1.28k
              iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u);
58558
1.28k
              v_n_bits |= 56u;
58559
1.28k
            }
58560
133k
            v_bit = ((v_bits >> 63u) > 0u);
58561
133k
            v_bits <<= 1u;
58562
133k
            v_n_bits -= 1u;
58563
133k
            if (v_bit) {
58564
21.2k
              if (self->private_data.f_mcu_blocks[0u][v_unzig] < 32768u) {
58565
3.45k
#if defined(__GNUC__)
58566
3.45k
#pragma GCC diagnostic push
58567
3.45k
#pragma GCC diagnostic ignored "-Wconversion"
58568
3.45k
#endif
58569
3.45k
                self->private_data.f_mcu_blocks[0u][v_unzig] += v_one_lshift_scan_al;
58570
3.45k
#if defined(__GNUC__)
58571
3.45k
#pragma GCC diagnostic pop
58572
3.45k
#endif
58573
17.8k
              } else {
58574
17.8k
#if defined(__GNUC__)
58575
17.8k
#pragma GCC diagnostic push
58576
17.8k
#pragma GCC diagnostic ignored "-Wconversion"
58577
17.8k
#endif
58578
17.8k
                self->private_data.f_mcu_blocks[0u][v_unzig] -= v_one_lshift_scan_al;
58579
17.8k
#if defined(__GNUC__)
58580
17.8k
#pragma GCC diagnostic pop
58581
17.8k
#endif
58582
17.8k
              }
58583
21.2k
            }
58584
133k
          }
58585
26.9M
          if (self->private_impl.f_mcu_zig_index >= ((uint32_t)(self->private_impl.f_scan_se))) {
58586
1.19M
            break;
58587
1.19M
          }
58588
25.7M
          self->private_impl.f_mcu_zig_index += 1u;
58589
25.7M
        }
58590
1.19M
#if defined(__GNUC__)
58591
1.19M
#pragma GCC diagnostic push
58592
1.19M
#pragma GCC diagnostic ignored "-Wconversion"
58593
1.19M
#endif
58594
1.19M
        self->private_impl.f_eob_run -= 1u;
58595
1.19M
#if defined(__GNUC__)
58596
1.19M
#pragma GCC diagnostic pop
58597
1.19M
#endif
58598
1.19M
      } while (0);
58599
1.60M
      label__block__break:;
58600
1.60M
    } while (0);
58601
1.63M
    label__goto_done__break:;
58602
1.63M
    v_pos = ((uint32_t)(wuffs_base__u64__sat_add((v_r ? v_r->meta.pos : 0), ((uint64_t)(iop_v_r - io0_v_r)))));
58603
1.63M
    if (v_pos > self->private_impl.f_bitstream_wi) {
58604
0
      v_ret = 2u;
58605
1.63M
    } else {
58606
1.63M
      self->private_impl.f_bitstream_ri = v_pos;
58607
1.63M
    }
58608
1.63M
    v_r = o_0_v_r;
58609
1.63M
    iop_v_r = o_0_iop_v_r;
58610
1.63M
    io0_v_r = o_0_io0_v_r;
58611
1.63M
    io1_v_r = o_0_io1_v_r;
58612
1.63M
    io2_v_r = o_0_io2_v_r;
58613
1.63M
  }
58614
0
  self->private_impl.f_bitstream_bits = v_bits;
58615
1.63M
  self->private_impl.f_bitstream_n_bits = v_n_bits;
58616
1.63M
  return v_ret;
58617
1.63M
}
58618
58619
// -------- func jpeg.decoder.decode_mcu_progressive_dc_high_bits
58620
58621
WUFFS_BASE__GENERATED_C_CODE
58622
static uint32_t
58623
wuffs_jpeg__decoder__decode_mcu_progressive_dc_high_bits(
58624
    wuffs_jpeg__decoder* self,
58625
    wuffs_base__pixel_buffer* a_dst,
58626
    wuffs_base__slice_u8 a_workbuf,
58627
    uint32_t a_mx,
58628
7.24M
    uint32_t a_my) {
58629
7.24M
  uint32_t v_ret = 0;
58630
7.24M
  uint64_t v_bits = 0;
58631
7.24M
  uint32_t v_n_bits = 0;
58632
7.24M
  uint8_t v_csel = 0;
58633
7.24M
  wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer();
58634
7.24M
  wuffs_base__io_buffer* v_r = &u_r;
58635
7.24M
  const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
58636
7.24M
  const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
58637
7.24M
  const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
58638
7.24M
  const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
58639
7.24M
  uint32_t v_pos = 0;
58640
7.24M
  uint8_t v_dc_h = 0;
58641
7.24M
  uint32_t v_dc_symbol = 0;
58642
7.24M
  uint32_t v_dc_ht_fast = 0;
58643
7.24M
  uint32_t v_dc_bl = 0;
58644
7.24M
  uint32_t v_dc_code = 0;
58645
7.24M
  uint32_t v_dc_blm1 = 0;
58646
7.24M
  uint32_t v_dc_ht_slow = 0;
58647
7.24M
  uint16_t v_dc_value = 0;
58648
7.24M
  uint16_t v_dc_extend = 0;
58649
58650
7.24M
  v_bits = self->private_impl.f_bitstream_bits;
58651
7.24M
  v_n_bits = self->private_impl.f_bitstream_n_bits;
58652
7.24M
  if (self->private_impl.f_bitstream_ri > self->private_impl.f_bitstream_wi) {
58653
0
    return 2u;
58654
0
  }
58655
7.24M
  {
58656
7.24M
    wuffs_base__io_buffer* o_0_v_r = v_r;
58657
7.24M
    const uint8_t* o_0_iop_v_r = iop_v_r;
58658
7.24M
    const uint8_t* o_0_io0_v_r = io0_v_r;
58659
7.24M
    const uint8_t* o_0_io1_v_r = io1_v_r;
58660
7.24M
    const uint8_t* o_0_io2_v_r = io2_v_r;
58661
7.24M
    v_r = wuffs_private_impl__io_reader__set(
58662
7.24M
        &u_r,
58663
7.24M
        &iop_v_r,
58664
7.24M
        &io0_v_r,
58665
7.24M
        &io1_v_r,
58666
7.24M
        &io2_v_r,
58667
7.24M
        wuffs_base__make_slice_u8_ij(self->private_data.f_bitstream_buffer,
58668
7.24M
        self->private_impl.f_bitstream_ri,
58669
7.24M
        self->private_impl.f_bitstream_wi),
58670
7.24M
        ((uint64_t)(self->private_impl.f_bitstream_ri)));
58671
7.24M
    do {
58672
17.6M
      while (self->private_impl.f_mcu_current_block < self->private_impl.f_mcu_num_blocks) {
58673
10.4M
        if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) {
58674
20.1k
          v_ret = 1u;
58675
20.1k
          goto label__goto_done__break;
58676
20.1k
        }
58677
10.4M
        do {
58678
10.4M
          if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) {
58679
0
            v_ret = 2u;
58680
0
            goto label__goto_done__break;
58681
0
          }
58682
10.4M
          v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u));
58683
10.4M
          iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u);
58684
10.4M
          v_n_bits |= 56u;
58685
10.4M
          v_dc_h = self->private_impl.f_mcu_blocks_dc_hselector[self->private_impl.f_mcu_current_block];
58686
10.4M
          v_dc_ht_fast = ((uint32_t)(self->private_impl.f_huff_tables_fast[v_dc_h][(v_bits >> 56u)]));
58687
10.4M
          v_dc_bl = (v_dc_ht_fast >> 8u);
58688
10.4M
          if (v_n_bits >= v_dc_bl) {
58689
10.4M
            v_dc_symbol = (15u & v_dc_ht_fast);
58690
10.4M
            v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol];
58691
10.4M
            v_bits <<= (v_dc_bl & 63u);
58692
10.4M
            v_n_bits -= v_dc_bl;
58693
10.4M
          } else {
58694
38.4k
            v_dc_code = ((uint32_t)((v_bits >> 55u)));
58695
38.4k
            v_dc_blm1 = 8u;
58696
38.4k
            v_bits <<= 9u;
58697
38.4k
            v_n_bits -= 9u;
58698
198k
            while (true) {
58699
198k
              v_dc_ht_slow = self->private_impl.f_huff_tables_slow[v_dc_h][v_dc_blm1];
58700
198k
              if (v_dc_code < (v_dc_ht_slow >> 8u)) {
58701
38.0k
                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)))])));
58702
38.0k
                v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol];
58703
38.0k
                break;
58704
38.0k
              }
58705
160k
              v_dc_code = (((uint32_t)(v_dc_code << 1u)) | ((uint32_t)((v_bits >> 63u))));
58706
160k
              v_bits <<= 1u;
58707
160k
              v_n_bits -= 1u;
58708
160k
              v_dc_blm1 = ((v_dc_blm1 + 1u) & 15u);
58709
160k
              if (v_dc_blm1 == 0u) {
58710
445
                v_dc_symbol = 0u;
58711
445
                v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol];
58712
445
                break;
58713
445
              }
58714
160k
            }
58715
38.4k
          }
58716
10.4M
          v_dc_value = ((uint16_t)(((v_bits >> 32u) >> (32u - v_dc_symbol))));
58717
10.4M
#if defined(__GNUC__)
58718
10.4M
#pragma GCC diagnostic push
58719
10.4M
#pragma GCC diagnostic ignored "-Wconversion"
58720
10.4M
#endif
58721
10.4M
          v_dc_value += ((uint16_t)(v_dc_extend & ((uint16_t)(((uint16_t)(wuffs_base__utility__sign_extend_rshift_u64(v_bits, 63u))) ^ 65535u))));
58722
10.4M
#if defined(__GNUC__)
58723
10.4M
#pragma GCC diagnostic pop
58724
10.4M
#endif
58725
10.4M
          v_bits <<= v_dc_symbol;
58726
10.4M
          v_n_bits -= v_dc_symbol;
58727
10.4M
          v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[self->private_impl.f_mcu_current_block]];
58728
10.4M
#if defined(__GNUC__)
58729
10.4M
#pragma GCC diagnostic push
58730
10.4M
#pragma GCC diagnostic ignored "-Wconversion"
58731
10.4M
#endif
58732
10.4M
          self->private_impl.f_mcu_previous_dc_values[v_csel] += v_dc_value;
58733
10.4M
#if defined(__GNUC__)
58734
10.4M
#pragma GCC diagnostic pop
58735
10.4M
#endif
58736
10.4M
          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));
58737
10.4M
        } while (0);
58738
10.4M
        self->private_impl.f_mcu_current_block += 1u;
58739
10.4M
      }
58740
7.22M
      self->private_impl.f_mcu_current_block = 0u;
58741
7.22M
    } while (0);
58742
7.24M
    label__goto_done__break:;
58743
7.24M
    v_pos = ((uint32_t)(wuffs_base__u64__sat_add((v_r ? v_r->meta.pos : 0), ((uint64_t)(iop_v_r - io0_v_r)))));
58744
7.24M
    if (v_pos > self->private_impl.f_bitstream_wi) {
58745
0
      v_ret = 2u;
58746
7.24M
    } else {
58747
7.24M
      self->private_impl.f_bitstream_ri = v_pos;
58748
7.24M
    }
58749
7.24M
    v_r = o_0_v_r;
58750
7.24M
    iop_v_r = o_0_iop_v_r;
58751
7.24M
    io0_v_r = o_0_io0_v_r;
58752
7.24M
    io1_v_r = o_0_io1_v_r;
58753
7.24M
    io2_v_r = o_0_io2_v_r;
58754
7.24M
  }
58755
0
  self->private_impl.f_bitstream_bits = v_bits;
58756
7.24M
  self->private_impl.f_bitstream_n_bits = v_n_bits;
58757
7.24M
  return v_ret;
58758
7.24M
}
58759
58760
// -------- func jpeg.decoder.decode_mcu_progressive_dc_low_bit
58761
58762
WUFFS_BASE__GENERATED_C_CODE
58763
static uint32_t
58764
wuffs_jpeg__decoder__decode_mcu_progressive_dc_low_bit(
58765
    wuffs_jpeg__decoder* self,
58766
    wuffs_base__pixel_buffer* a_dst,
58767
    wuffs_base__slice_u8 a_workbuf,
58768
    uint32_t a_mx,
58769
11.3M
    uint32_t a_my) {
58770
11.3M
  uint32_t v_ret = 0;
58771
11.3M
  uint64_t v_bits = 0;
58772
11.3M
  uint32_t v_n_bits = 0;
58773
11.3M
  uint16_t v_one_lshift_scan_al = 0;
58774
11.3M
  wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer();
58775
11.3M
  wuffs_base__io_buffer* v_r = &u_r;
58776
11.3M
  const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
58777
11.3M
  const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
58778
11.3M
  const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
58779
11.3M
  const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
58780
11.3M
  uint32_t v_pos = 0;
58781
58782
11.3M
  v_bits = self->private_impl.f_bitstream_bits;
58783
11.3M
  v_n_bits = self->private_impl.f_bitstream_n_bits;
58784
11.3M
  v_one_lshift_scan_al = ((uint16_t)(((uint16_t)(1u)) << self->private_impl.f_scan_al));
58785
11.3M
  if (self->private_impl.f_bitstream_ri > self->private_impl.f_bitstream_wi) {
58786
0
    return 2u;
58787
0
  }
58788
11.3M
  {
58789
11.3M
    wuffs_base__io_buffer* o_0_v_r = v_r;
58790
11.3M
    const uint8_t* o_0_iop_v_r = iop_v_r;
58791
11.3M
    const uint8_t* o_0_io0_v_r = io0_v_r;
58792
11.3M
    const uint8_t* o_0_io1_v_r = io1_v_r;
58793
11.3M
    const uint8_t* o_0_io2_v_r = io2_v_r;
58794
11.3M
    v_r = wuffs_private_impl__io_reader__set(
58795
11.3M
        &u_r,
58796
11.3M
        &iop_v_r,
58797
11.3M
        &io0_v_r,
58798
11.3M
        &io1_v_r,
58799
11.3M
        &io2_v_r,
58800
11.3M
        wuffs_base__make_slice_u8_ij(self->private_data.f_bitstream_buffer,
58801
11.3M
        self->private_impl.f_bitstream_ri,
58802
11.3M
        self->private_impl.f_bitstream_wi),
58803
11.3M
        ((uint64_t)(self->private_impl.f_bitstream_ri)));
58804
11.3M
    do {
58805
23.0M
      while (self->private_impl.f_mcu_current_block < self->private_impl.f_mcu_num_blocks) {
58806
11.6M
        if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) {
58807
5.97k
          v_ret = 1u;
58808
5.97k
          goto label__goto_done__break;
58809
5.97k
        }
58810
11.6M
        do {
58811
11.6M
          if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) {
58812
0
            v_ret = 2u;
58813
0
            goto label__goto_done__break;
58814
0
          }
58815
11.6M
          v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u));
58816
11.6M
          iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u);
58817
11.6M
          v_n_bits |= 56u;
58818
11.6M
          if ((v_bits >> 63u) != 0u) {
58819
107k
            self->private_data.f_mcu_blocks[self->private_impl.f_mcu_current_block][0u] |= v_one_lshift_scan_al;
58820
107k
          }
58821
11.6M
          v_bits <<= 1u;
58822
11.6M
          v_n_bits -= 1u;
58823
11.6M
        } while (0);
58824
11.6M
        self->private_impl.f_mcu_current_block += 1u;
58825
11.6M
      }
58826
11.3M
      self->private_impl.f_mcu_current_block = 0u;
58827
11.3M
    } while (0);
58828
11.3M
    label__goto_done__break:;
58829
11.3M
    v_pos = ((uint32_t)(wuffs_base__u64__sat_add((v_r ? v_r->meta.pos : 0), ((uint64_t)(iop_v_r - io0_v_r)))));
58830
11.3M
    if (v_pos > self->private_impl.f_bitstream_wi) {
58831
0
      v_ret = 2u;
58832
11.3M
    } else {
58833
11.3M
      self->private_impl.f_bitstream_ri = v_pos;
58834
11.3M
    }
58835
11.3M
    v_r = o_0_v_r;
58836
11.3M
    iop_v_r = o_0_iop_v_r;
58837
11.3M
    io0_v_r = o_0_io0_v_r;
58838
11.3M
    io1_v_r = o_0_io1_v_r;
58839
11.3M
    io2_v_r = o_0_io2_v_r;
58840
11.3M
  }
58841
0
  self->private_impl.f_bitstream_bits = v_bits;
58842
11.3M
  self->private_impl.f_bitstream_n_bits = v_n_bits;
58843
11.3M
  return v_ret;
58844
11.3M
}
58845
58846
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JPEG)
58847
58848
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JSON)
58849
58850
// ---------------- Status Codes Implementations
58851
58852
const char wuffs_json__error__bad_c0_control_code[] = "#json: bad C0 control code";
58853
const char wuffs_json__error__bad_utf_8[] = "#json: bad UTF-8";
58854
const char wuffs_json__error__bad_backslash_escape[] = "#json: bad backslash-escape";
58855
const char wuffs_json__error__bad_input[] = "#json: bad input";
58856
const char wuffs_json__error__bad_new_line_in_a_string[] = "#json: bad new-line in a string";
58857
const char wuffs_json__error__bad_quirk_combination[] = "#json: bad quirk combination";
58858
const char wuffs_json__error__unsupported_number_length[] = "#json: unsupported number length";
58859
const char wuffs_json__error__unsupported_recursion_depth[] = "#json: unsupported recursion depth";
58860
const char wuffs_json__error__internal_error_inconsistent_i_o[] = "#json: internal error: inconsistent I/O";
58861
58862
// ---------------- Private Consts
58863
58864
#define WUFFS_JSON__DECODER_NUMBER_LENGTH_MAX_INCL 99u
58865
58866
static const uint8_t
58867
WUFFS_JSON__LUT_BACKSLASHES[256] WUFFS_BASE__POTENTIALLY_UNUSED = {
58868
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58869
  0u, 0u, 3u, 0u, 0u, 0u, 0u, 0u,
58870
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58871
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58872
  0u, 0u, 162u, 0u, 0u, 0u, 0u, 5u,
58873
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 175u,
58874
  7u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58875
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 4u,
58876
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58877
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58878
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58879
  0u, 0u, 0u, 0u, 220u, 0u, 0u, 0u,
58880
  0u, 1u, 136u, 0u, 0u, 2u, 140u, 0u,
58881
  0u, 0u, 0u, 0u, 0u, 0u, 138u, 0u,
58882
  0u, 0u, 141u, 0u, 137u, 0u, 6u, 0u,
58883
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58884
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58885
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58886
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58887
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58888
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58889
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58890
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58891
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58892
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58893
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58894
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58895
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58896
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58897
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58898
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58899
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58900
};
58901
58902
static const uint8_t
58903
WUFFS_JSON__LUT_QUIRKY_BACKSLASHES_QUIRKS[8] WUFFS_BASE__POTENTIALLY_UNUSED = {
58904
  0u, 1u, 3u, 4u, 5u, 6u, 7u, 10u,
58905
};
58906
58907
static const uint8_t
58908
WUFFS_JSON__LUT_QUIRKY_BACKSLASHES_CHARS[8] WUFFS_BASE__POTENTIALLY_UNUSED = {
58909
  0u, 7u, 27u, 10u, 63u, 39u, 11u, 0u,
58910
};
58911
58912
static const uint8_t
58913
WUFFS_JSON__LUT_CHARS[256] WUFFS_BASE__POTENTIALLY_UNUSED = {
58914
  128u, 129u, 130u, 131u, 132u, 133u, 134u, 135u,
58915
  136u, 137u, 138u, 139u, 140u, 141u, 142u, 143u,
58916
  144u, 145u, 146u, 147u, 148u, 149u, 150u, 151u,
58917
  152u, 153u, 154u, 155u, 156u, 157u, 158u, 159u,
58918
  0u, 0u, 1u, 0u, 0u, 0u, 0u, 0u,
58919
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58920
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58921
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58922
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58923
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58924
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58925
  0u, 0u, 0u, 0u, 2u, 0u, 0u, 0u,
58926
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58927
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58928
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58929
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58930
  16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u,
58931
  16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u,
58932
  16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u,
58933
  16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u,
58934
  16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u,
58935
  16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u,
58936
  16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u,
58937
  16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u,
58938
  32u, 32u, 3u, 3u, 3u, 3u, 3u, 3u,
58939
  3u, 3u, 3u, 3u, 3u, 3u, 3u, 3u,
58940
  3u, 3u, 3u, 3u, 3u, 3u, 3u, 3u,
58941
  3u, 3u, 3u, 3u, 3u, 3u, 3u, 3u,
58942
  4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u,
58943
  4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u,
58944
  5u, 5u, 5u, 5u, 5u, 32u, 32u, 32u,
58945
  32u, 32u, 32u, 32u, 32u, 32u, 32u, 32u,
58946
};
58947
58948
#define WUFFS_JSON__CLASS_WHITESPACE 0u
58949
58950
#define WUFFS_JSON__CLASS_STRING 1u
58951
58952
#define WUFFS_JSON__CLASS_COMMA 2u
58953
58954
#define WUFFS_JSON__CLASS_COLON 3u
58955
58956
#define WUFFS_JSON__CLASS_NUMBER 4u
58957
58958
#define WUFFS_JSON__CLASS_OPEN_CURLY_BRACE 5u
58959
58960
#define WUFFS_JSON__CLASS_CLOSE_CURLY_BRACE 6u
58961
58962
#define WUFFS_JSON__CLASS_OPEN_SQUARE_BRACKET 7u
58963
58964
#define WUFFS_JSON__CLASS_CLOSE_SQUARE_BRACKET 8u
58965
58966
#define WUFFS_JSON__CLASS_FALSE 9u
58967
58968
#define WUFFS_JSON__CLASS_TRUE 10u
58969
58970
#define WUFFS_JSON__CLASS_NULL_NAN_INF 11u
58971
58972
#define WUFFS_JSON__CLASS_COMMENT 12u
58973
58974
#define WUFFS_JSON__EXPECT_VALUE 7858u
58975
58976
#define WUFFS_JSON__EXPECT_NON_STRING_VALUE 7856u
58977
58978
#define WUFFS_JSON__EXPECT_STRING 4098u
58979
58980
#define WUFFS_JSON__EXPECT_COMMA 4100u
58981
58982
#define WUFFS_JSON__EXPECT_COLON 4104u
58983
58984
#define WUFFS_JSON__EXPECT_NUMBER 4112u
58985
58986
#define WUFFS_JSON__EXPECT_CLOSE_CURLY_BRACE 4160u
58987
58988
#define WUFFS_JSON__EXPECT_CLOSE_SQUARE_BRACKET 4352u
58989
58990
static const uint8_t
58991
WUFFS_JSON__LUT_CLASSES[256] WUFFS_BASE__POTENTIALLY_UNUSED = {
58992
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
58993
  15u, 0u, 0u, 15u, 15u, 0u, 15u, 15u,
58994
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
58995
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
58996
  0u, 15u, 1u, 15u, 15u, 15u, 15u, 15u,
58997
  15u, 15u, 15u, 11u, 2u, 4u, 15u, 12u,
58998
  4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u,
58999
  4u, 4u, 3u, 15u, 15u, 15u, 15u, 15u,
59000
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
59001
  15u, 11u, 15u, 15u, 15u, 15u, 11u, 15u,
59002
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
59003
  15u, 15u, 15u, 7u, 15u, 8u, 15u, 15u,
59004
  15u, 15u, 15u, 15u, 15u, 15u, 9u, 15u,
59005
  15u, 11u, 15u, 15u, 15u, 15u, 11u, 15u,
59006
  15u, 15u, 15u, 15u, 10u, 15u, 15u, 15u,
59007
  15u, 15u, 15u, 5u, 15u, 6u, 15u, 15u,
59008
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
59009
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
59010
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
59011
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
59012
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
59013
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
59014
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
59015
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
59016
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
59017
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
59018
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
59019
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
59020
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
59021
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
59022
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
59023
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
59024
};
59025
59026
static const uint8_t
59027
WUFFS_JSON__LUT_DECIMAL_DIGITS[256] WUFFS_BASE__POTENTIALLY_UNUSED = {
59028
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59029
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59030
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59031
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59032
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59033
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59034
  128u, 129u, 130u, 131u, 132u, 133u, 134u, 135u,
59035
  136u, 137u, 0u, 0u, 0u, 0u, 0u, 0u,
59036
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59037
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59038
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59039
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59040
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59041
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59042
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59043
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59044
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59045
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59046
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59047
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59048
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59049
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59050
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59051
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59052
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59053
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59054
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59055
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59056
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59057
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59058
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59059
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59060
};
59061
59062
static const uint8_t
59063
WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[256] WUFFS_BASE__POTENTIALLY_UNUSED = {
59064
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59065
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59066
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59067
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59068
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59069
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59070
  128u, 129u, 130u, 131u, 132u, 133u, 134u, 135u,
59071
  136u, 137u, 0u, 0u, 0u, 0u, 0u, 0u,
59072
  0u, 138u, 139u, 140u, 141u, 142u, 143u, 0u,
59073
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59074
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59075
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59076
  0u, 138u, 139u, 140u, 141u, 142u, 143u, 0u,
59077
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59078
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59079
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59080
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59081
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59082
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59083
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59084
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59085
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59086
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59087
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59088
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59089
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59090
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59091
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59092
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59093
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59094
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59095
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
59096
};
59097
59098
#define WUFFS_JSON__QUIRKS_BASE 1167656960u
59099
59100
#define WUFFS_JSON__QUIRKS_COUNT 21u
59101
59102
// ---------------- Private Initializer Prototypes
59103
59104
// ---------------- Private Function Prototypes
59105
59106
WUFFS_BASE__GENERATED_C_CODE
59107
static uint32_t
59108
wuffs_json__decoder__decode_number(
59109
    wuffs_json__decoder* self,
59110
    wuffs_base__io_buffer* a_src);
59111
59112
WUFFS_BASE__GENERATED_C_CODE
59113
static uint32_t
59114
wuffs_json__decoder__decode_digits(
59115
    wuffs_json__decoder* self,
59116
    wuffs_base__io_buffer* a_src,
59117
    uint32_t a_n);
59118
59119
WUFFS_BASE__GENERATED_C_CODE
59120
static wuffs_base__status
59121
wuffs_json__decoder__decode_leading(
59122
    wuffs_json__decoder* self,
59123
    wuffs_base__token_buffer* a_dst,
59124
    wuffs_base__io_buffer* a_src);
59125
59126
WUFFS_BASE__GENERATED_C_CODE
59127
static wuffs_base__status
59128
wuffs_json__decoder__decode_comment(
59129
    wuffs_json__decoder* self,
59130
    wuffs_base__token_buffer* a_dst,
59131
    wuffs_base__io_buffer* a_src);
59132
59133
WUFFS_BASE__GENERATED_C_CODE
59134
static wuffs_base__status
59135
wuffs_json__decoder__decode_inf_nan(
59136
    wuffs_json__decoder* self,
59137
    wuffs_base__token_buffer* a_dst,
59138
    wuffs_base__io_buffer* a_src);
59139
59140
WUFFS_BASE__GENERATED_C_CODE
59141
static wuffs_base__status
59142
wuffs_json__decoder__decode_trailer(
59143
    wuffs_json__decoder* self,
59144
    wuffs_base__token_buffer* a_dst,
59145
    wuffs_base__io_buffer* a_src);
59146
59147
// ---------------- VTables
59148
59149
const wuffs_base__token_decoder__func_ptrs
59150
wuffs_json__decoder__func_ptrs_for__wuffs_base__token_decoder = {
59151
  (wuffs_base__status(*)(void*,
59152
      wuffs_base__token_buffer*,
59153
      wuffs_base__io_buffer*,
59154
      wuffs_base__slice_u8))(&wuffs_json__decoder__decode_tokens),
59155
  (uint64_t(*)(const void*,
59156
      uint32_t))(&wuffs_json__decoder__get_quirk),
59157
  (wuffs_base__status(*)(void*,
59158
      uint32_t,
59159
      uint64_t))(&wuffs_json__decoder__set_quirk),
59160
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_json__decoder__workbuf_len),
59161
};
59162
59163
// ---------------- Initializer Implementations
59164
59165
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
59166
wuffs_json__decoder__initialize(
59167
    wuffs_json__decoder* self,
59168
    size_t sizeof_star_self,
59169
    uint64_t wuffs_version,
59170
    uint32_t options){
59171
  if (!self) {
59172
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
59173
  }
59174
  if (sizeof(*self) != sizeof_star_self) {
59175
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
59176
  }
59177
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
59178
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
59179
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
59180
  }
59181
59182
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
59183
    // The whole point of this if-check is to detect an uninitialized *self.
59184
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
59185
#if !defined(__clang__) && defined(__GNUC__)
59186
#pragma GCC diagnostic push
59187
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
59188
#endif
59189
    if (self->private_impl.magic != 0) {
59190
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
59191
    }
59192
#if !defined(__clang__) && defined(__GNUC__)
59193
#pragma GCC diagnostic pop
59194
#endif
59195
  } else {
59196
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
59197
      memset(self, 0, sizeof(*self));
59198
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
59199
    } else {
59200
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
59201
    }
59202
  }
59203
59204
  self->private_impl.magic = WUFFS_BASE__MAGIC;
59205
  self->private_impl.vtable_for__wuffs_base__token_decoder.vtable_name =
59206
      wuffs_base__token_decoder__vtable_name;
59207
  self->private_impl.vtable_for__wuffs_base__token_decoder.function_pointers =
59208
      (const void*)(&wuffs_json__decoder__func_ptrs_for__wuffs_base__token_decoder);
59209
  return wuffs_base__make_status(NULL);
59210
}
59211
59212
wuffs_json__decoder*
59213
wuffs_json__decoder__alloc(void) {
59214
  wuffs_json__decoder* x =
59215
      (wuffs_json__decoder*)(calloc(1, sizeof(wuffs_json__decoder)));
59216
  if (!x) {
59217
    return NULL;
59218
  }
59219
  if (wuffs_json__decoder__initialize(
59220
      x, sizeof(wuffs_json__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
59221
    free(x);
59222
    return NULL;
59223
  }
59224
  return x;
59225
}
59226
59227
size_t
59228
sizeof__wuffs_json__decoder(void) {
59229
  return sizeof(wuffs_json__decoder);
59230
}
59231
59232
// ---------------- Function Implementations
59233
59234
// -------- func json.decoder.get_quirk
59235
59236
WUFFS_BASE__GENERATED_C_CODE
59237
WUFFS_BASE__MAYBE_STATIC uint64_t
59238
wuffs_json__decoder__get_quirk(
59239
    const wuffs_json__decoder* self,
59240
    uint32_t a_key) {
59241
  if (!self) {
59242
    return 0;
59243
  }
59244
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
59245
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
59246
    return 0;
59247
  }
59248
59249
  uint32_t v_key = 0;
59250
59251
  if (a_key >= 1167656960u) {
59252
    v_key = (a_key - 1167656960u);
59253
    if (v_key < 21u) {
59254
      if (self->private_impl.f_quirks[v_key]) {
59255
        return 1u;
59256
      }
59257
    }
59258
  }
59259
  return 0u;
59260
}
59261
59262
// -------- func json.decoder.set_quirk
59263
59264
WUFFS_BASE__GENERATED_C_CODE
59265
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
59266
wuffs_json__decoder__set_quirk(
59267
    wuffs_json__decoder* self,
59268
    uint32_t a_key,
59269
    uint64_t a_value) {
59270
  if (!self) {
59271
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
59272
  }
59273
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
59274
    return wuffs_base__make_status(
59275
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
59276
        ? wuffs_base__error__disabled_by_previous_error
59277
        : wuffs_base__error__initialize_not_called);
59278
  }
59279
59280
  if (a_key >= 1167656960u) {
59281
    a_key -= 1167656960u;
59282
    if (a_key < 21u) {
59283
      self->private_impl.f_quirks[a_key] = (a_value > 0u);
59284
      return wuffs_base__make_status(NULL);
59285
    }
59286
  }
59287
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
59288
}
59289
59290
// -------- func json.decoder.workbuf_len
59291
59292
WUFFS_BASE__GENERATED_C_CODE
59293
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
59294
wuffs_json__decoder__workbuf_len(
59295
    const wuffs_json__decoder* self) {
59296
  if (!self) {
59297
    return wuffs_base__utility__empty_range_ii_u64();
59298
  }
59299
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
59300
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
59301
    return wuffs_base__utility__empty_range_ii_u64();
59302
  }
59303
59304
  return wuffs_base__utility__empty_range_ii_u64();
59305
}
59306
59307
// -------- func json.decoder.decode_tokens
59308
59309
WUFFS_BASE__GENERATED_C_CODE
59310
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
59311
wuffs_json__decoder__decode_tokens(
59312
    wuffs_json__decoder* self,
59313
    wuffs_base__token_buffer* a_dst,
59314
    wuffs_base__io_buffer* a_src,
59315
    wuffs_base__slice_u8 a_workbuf) {
59316
  if (!self) {
59317
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
59318
  }
59319
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
59320
    return wuffs_base__make_status(
59321
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
59322
        ? wuffs_base__error__disabled_by_previous_error
59323
        : wuffs_base__error__initialize_not_called);
59324
  }
59325
  if (!a_dst || !a_src) {
59326
    self->private_impl.magic = WUFFS_BASE__DISABLED;
59327
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
59328
  }
59329
  if ((self->private_impl.active_coroutine != 0) &&
59330
      (self->private_impl.active_coroutine != 1)) {
59331
    self->private_impl.magic = WUFFS_BASE__DISABLED;
59332
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
59333
  }
59334
  self->private_impl.active_coroutine = 0;
59335
  wuffs_base__status status = wuffs_base__make_status(NULL);
59336
59337
  uint32_t v_vminor = 0;
59338
  uint32_t v_number_length = 0;
59339
  uint32_t v_number_status = 0;
59340
  uint32_t v_string_length = 0;
59341
  uint32_t v_whitespace_length = 0;
59342
  uint32_t v_depth = 0;
59343
  uint32_t v_stack_byte = 0;
59344
  uint32_t v_stack_bit = 0;
59345
  uint32_t v_match = 0;
59346
  uint32_t v_c32 = 0;
59347
  uint8_t v_c8 = 0;
59348
  uint8_t v_backslash = 0;
59349
  uint8_t v_char = 0;
59350
  uint8_t v_class = 0;
59351
  uint32_t v_multi_byte_utf8 = 0;
59352
  uint8_t v_backslash_x_ok = 0;
59353
  uint8_t v_backslash_x_value = 0;
59354
  uint32_t v_backslash_x_string = 0;
59355
  uint8_t v_uni4_ok = 0;
59356
  uint64_t v_uni4_string = 0;
59357
  uint32_t v_uni4_value = 0;
59358
  uint32_t v_uni4_high_surrogate = 0;
59359
  uint8_t v_uni8_ok = 0;
59360
  uint64_t v_uni8_string = 0;
59361
  uint32_t v_uni8_value = 0;
59362
  uint32_t v_expect = 0;
59363
  uint32_t v_expect_after_value = 0;
59364
59365
  wuffs_base__token* iop_a_dst = NULL;
59366
  wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
59367
  wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
59368
  wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
59369
  if (a_dst && a_dst->data.ptr) {
59370
    io0_a_dst = a_dst->data.ptr;
59371
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
59372
    iop_a_dst = io1_a_dst;
59373
    io2_a_dst = io0_a_dst + a_dst->data.len;
59374
    if (a_dst->meta.closed) {
59375
      io2_a_dst = iop_a_dst;
59376
    }
59377
  }
59378
  const uint8_t* iop_a_src = NULL;
59379
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
59380
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
59381
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
59382
  if (a_src && a_src->data.ptr) {
59383
    io0_a_src = a_src->data.ptr;
59384
    io1_a_src = io0_a_src + a_src->meta.ri;
59385
    iop_a_src = io1_a_src;
59386
    io2_a_src = io0_a_src + a_src->meta.wi;
59387
  }
59388
59389
  uint32_t coro_susp_point = self->private_impl.p_decode_tokens;
59390
  if (coro_susp_point) {
59391
    v_depth = self->private_data.s_decode_tokens.v_depth;
59392
    v_expect = self->private_data.s_decode_tokens.v_expect;
59393
    v_expect_after_value = self->private_data.s_decode_tokens.v_expect_after_value;
59394
  }
59395
  switch (coro_susp_point) {
59396
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
59397
59398
    if (self->private_impl.f_end_of_data) {
59399
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
59400
      goto ok;
59401
    }
59402
    if (self->private_impl.f_quirks[18u]) {
59403
      if (self->private_impl.f_quirks[11u] || self->private_impl.f_quirks[12u] || self->private_impl.f_quirks[17u]) {
59404
        status = wuffs_base__make_status(wuffs_json__error__bad_quirk_combination);
59405
        goto exit;
59406
      }
59407
    }
59408
    if (self->private_impl.f_quirks[15u] || self->private_impl.f_quirks[16u]) {
59409
      if (a_dst) {
59410
        a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
59411
      }
59412
      if (a_src) {
59413
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
59414
      }
59415
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
59416
      status = wuffs_json__decoder__decode_leading(self, a_dst, a_src);
59417
      if (a_dst) {
59418
        iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
59419
      }
59420
      if (a_src) {
59421
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
59422
      }
59423
      if (status.repr) {
59424
        goto suspend;
59425
      }
59426
    }
59427
    v_expect = 7858u;
59428
    label__outer__continue:;
59429
    while (true) {
59430
      while (true) {
59431
        if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
59432
          status = wuffs_base__make_status(wuffs_base__suspension__short_write);
59433
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2);
59434
          goto label__outer__continue;
59435
        }
59436
        v_whitespace_length = 0u;
59437
        v_c8 = 0u;
59438
        v_class = 0u;
59439
        while (true) {
59440
          if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
59441
            if (v_whitespace_length > 0u) {
59442
              *iop_a_dst++ = wuffs_base__make_token(
59443
                  (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59444
                  (((uint64_t)(v_whitespace_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59445
              v_whitespace_length = 0u;
59446
            }
59447
            if (a_src && a_src->meta.closed) {
59448
              status = wuffs_base__make_status(wuffs_json__error__bad_input);
59449
              goto exit;
59450
            }
59451
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
59452
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3);
59453
            goto label__outer__continue;
59454
          }
59455
          v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
59456
          v_class = WUFFS_JSON__LUT_CLASSES[v_c8];
59457
          if (v_class != 0u) {
59458
            break;
59459
          }
59460
          iop_a_src += 1u;
59461
          if (v_whitespace_length >= 65534u) {
59462
            *iop_a_dst++ = wuffs_base__make_token(
59463
                (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59464
                (((uint64_t)(65535u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59465
            v_whitespace_length = 0u;
59466
            goto label__outer__continue;
59467
          }
59468
          v_whitespace_length += 1u;
59469
        }
59470
        if (v_whitespace_length > 0u) {
59471
          *iop_a_dst++ = wuffs_base__make_token(
59472
              (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59473
              (((uint64_t)(v_whitespace_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59474
          v_whitespace_length = 0u;
59475
          if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
59476
            goto label__outer__continue;
59477
          }
59478
        }
59479
        if (0u == (v_expect & (((uint32_t)(1u)) << v_class))) {
59480
          status = wuffs_base__make_status(wuffs_json__error__bad_input);
59481
          goto exit;
59482
        }
59483
        if (v_class == 1u) {
59484
          *iop_a_dst++ = wuffs_base__make_token(
59485
              (((uint64_t)(4194579u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59486
              (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
59487
              (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59488
          iop_a_src += 1u;
59489
          label__string_loop_outer__continue:;
59490
          while (true) {
59491
            if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
59492
              status = wuffs_base__make_status(wuffs_base__suspension__short_write);
59493
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4);
59494
              continue;
59495
            }
59496
            v_string_length = 0u;
59497
            while (true) {
59498
              if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
59499
                if (v_string_length > 0u) {
59500
                  *iop_a_dst++ = wuffs_base__make_token(
59501
                      (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59502
                      (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
59503
                      (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59504
                  v_string_length = 0u;
59505
                }
59506
                if (a_src && a_src->meta.closed) {
59507
                  status = wuffs_base__make_status(wuffs_json__error__bad_input);
59508
                  goto exit;
59509
                }
59510
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
59511
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5);
59512
                goto label__string_loop_outer__continue;
59513
              }
59514
              while (((uint64_t)(io2_a_src - iop_a_src)) > 4u) {
59515
                v_c32 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
59516
                if (0u != (WUFFS_JSON__LUT_CHARS[(255u & (v_c32 >> 0u))] |
59517
                    WUFFS_JSON__LUT_CHARS[(255u & (v_c32 >> 8u))] |
59518
                    WUFFS_JSON__LUT_CHARS[(255u & (v_c32 >> 16u))] |
59519
                    WUFFS_JSON__LUT_CHARS[(255u & (v_c32 >> 24u))])) {
59520
                  break;
59521
                }
59522
                iop_a_src += 4u;
59523
                if (v_string_length > 65527u) {
59524
                  *iop_a_dst++ = wuffs_base__make_token(
59525
                      (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59526
                      (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
59527
                      (((uint64_t)((v_string_length + 4u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59528
                  v_string_length = 0u;
59529
                  goto label__string_loop_outer__continue;
59530
                }
59531
                v_string_length += 4u;
59532
              }
59533
              v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
59534
              v_char = WUFFS_JSON__LUT_CHARS[v_c8];
59535
              if (v_char == 0u) {
59536
                iop_a_src += 1u;
59537
                if (v_string_length >= 65531u) {
59538
                  *iop_a_dst++ = wuffs_base__make_token(
59539
                      (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59540
                      (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
59541
                      (((uint64_t)(65532u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59542
                  v_string_length = 0u;
59543
                  goto label__string_loop_outer__continue;
59544
                }
59545
                v_string_length += 1u;
59546
                continue;
59547
              } else if (v_char == 1u) {
59548
                if (v_string_length != 0u) {
59549
                  *iop_a_dst++ = wuffs_base__make_token(
59550
                      (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59551
                      (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
59552
                      (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59553
                  v_string_length = 0u;
59554
                }
59555
                goto label__string_loop_outer__break;
59556
              } else if (v_char == 2u) {
59557
                if (v_string_length > 0u) {
59558
                  *iop_a_dst++ = wuffs_base__make_token(
59559
                      (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59560
                      (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
59561
                      (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59562
                  v_string_length = 0u;
59563
                  if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
59564
                    goto label__string_loop_outer__continue;
59565
                  }
59566
                }
59567
                if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) {
59568
                  if (a_src && a_src->meta.closed) {
59569
                    status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape);
59570
                    goto exit;
59571
                  }
59572
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
59573
                  WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6);
59574
                  goto label__string_loop_outer__continue;
59575
                }
59576
                v_c8 = ((uint8_t)(((uint16_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src) >> 8u))));
59577
                v_backslash = WUFFS_JSON__LUT_BACKSLASHES[v_c8];
59578
                if (((uint8_t)(v_backslash & 128u)) != 0u) {
59579
                  iop_a_src += 2u;
59580
                  *iop_a_dst++ = wuffs_base__make_token(
59581
                      (((uint64_t)((6291456u | ((uint32_t)(((uint8_t)(v_backslash & 127u))))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59582
                      (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
59583
                      (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59584
                  goto label__string_loop_outer__continue;
59585
                } else if (v_backslash != 0u) {
59586
                  if (self->private_impl.f_quirks[WUFFS_JSON__LUT_QUIRKY_BACKSLASHES_QUIRKS[((uint8_t)(v_backslash & 7u))]]) {
59587
                    iop_a_src += 2u;
59588
                    *iop_a_dst++ = wuffs_base__make_token(
59589
                        (((uint64_t)((6291456u | ((uint32_t)(WUFFS_JSON__LUT_QUIRKY_BACKSLASHES_CHARS[((uint8_t)(v_backslash & 7u))]))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59590
                        (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
59591
                        (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59592
                    goto label__string_loop_outer__continue;
59593
                  }
59594
                } else if (v_c8 == 117u) {
59595
                  if (((uint64_t)(io2_a_src - iop_a_src)) < 6u) {
59596
                    if (a_src && a_src->meta.closed) {
59597
                      status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape);
59598
                      goto exit;
59599
                    }
59600
                    status = wuffs_base__make_status(wuffs_base__suspension__short_read);
59601
                    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7);
59602
                    goto label__string_loop_outer__continue;
59603
                  }
59604
                  v_uni4_string = (((uint64_t)(wuffs_base__peek_u48le__no_bounds_check(iop_a_src))) >> 16u);
59605
                  v_uni4_value = 0u;
59606
                  v_uni4_ok = 128u;
59607
                  v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 0u))];
59608
                  v_uni4_ok &= v_c8;
59609
                  v_uni4_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 12u);
59610
                  v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 8u))];
59611
                  v_uni4_ok &= v_c8;
59612
                  v_uni4_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 8u);
59613
                  v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 16u))];
59614
                  v_uni4_ok &= v_c8;
59615
                  v_uni4_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 4u);
59616
                  v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 24u))];
59617
                  v_uni4_ok &= v_c8;
59618
                  v_uni4_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 0u);
59619
                  if (v_uni4_ok == 0u) {
59620
                  } else if ((v_uni4_value < 55296u) || (57343u < v_uni4_value)) {
59621
                    iop_a_src += 6u;
59622
                    *iop_a_dst++ = wuffs_base__make_token(
59623
                        (((uint64_t)((6291456u | v_uni4_value))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59624
                        (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
59625
                        (((uint64_t)(6u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59626
                    goto label__string_loop_outer__continue;
59627
                  } else if (v_uni4_value >= 56320u) {
59628
                  } else {
59629
                    if (((uint64_t)(io2_a_src - iop_a_src)) < 12u) {
59630
                      if (a_src && a_src->meta.closed) {
59631
                        if (self->private_impl.f_quirks[20u]) {
59632
                          iop_a_src += 6u;
59633
                          *iop_a_dst++ = wuffs_base__make_token(
59634
                              (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59635
                              (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
59636
                              (((uint64_t)(6u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59637
                          goto label__string_loop_outer__continue;
59638
                        }
59639
                        status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape);
59640
                        goto exit;
59641
                      }
59642
                      status = wuffs_base__make_status(wuffs_base__suspension__short_read);
59643
                      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8);
59644
                      goto label__string_loop_outer__continue;
59645
                    }
59646
                    v_uni4_string = (wuffs_base__peek_u64le__no_bounds_check(iop_a_src + 4u) >> 16u);
59647
                    if (((255u & (v_uni4_string >> 0u)) != 92u) || ((255u & (v_uni4_string >> 8u)) != 117u)) {
59648
                      v_uni4_high_surrogate = 0u;
59649
                      v_uni4_value = 0u;
59650
                      v_uni4_ok = 0u;
59651
                    } else {
59652
                      v_uni4_high_surrogate = (65536u + ((v_uni4_value - 55296u) << 10u));
59653
                      v_uni4_value = 0u;
59654
                      v_uni4_ok = 128u;
59655
                      v_uni4_string >>= 16u;
59656
                      v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 0u))];
59657
                      v_uni4_ok &= v_c8;
59658
                      v_uni4_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 12u);
59659
                      v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 8u))];
59660
                      v_uni4_ok &= v_c8;
59661
                      v_uni4_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 8u);
59662
                      v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 16u))];
59663
                      v_uni4_ok &= v_c8;
59664
                      v_uni4_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 4u);
59665
                      v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 24u))];
59666
                      v_uni4_ok &= v_c8;
59667
                      v_uni4_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 0u);
59668
                    }
59669
                    if ((v_uni4_ok != 0u) && (56320u <= v_uni4_value) && (v_uni4_value <= 57343u)) {
59670
                      v_uni4_value -= 56320u;
59671
                      iop_a_src += 12u;
59672
                      *iop_a_dst++ = wuffs_base__make_token(
59673
                          (((uint64_t)((6291456u | v_uni4_high_surrogate | v_uni4_value))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59674
                          (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
59675
                          (((uint64_t)(12u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59676
                      goto label__string_loop_outer__continue;
59677
                    }
59678
                  }
59679
                  if (self->private_impl.f_quirks[20u]) {
59680
                    if (((uint64_t)(io2_a_src - iop_a_src)) < 6u) {
59681
                      status = wuffs_base__make_status(wuffs_json__error__internal_error_inconsistent_i_o);
59682
                      goto exit;
59683
                    }
59684
                    iop_a_src += 6u;
59685
                    *iop_a_dst++ = wuffs_base__make_token(
59686
                        (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59687
                        (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
59688
                        (((uint64_t)(6u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59689
                    goto label__string_loop_outer__continue;
59690
                  }
59691
                } else if ((v_c8 == 85u) && self->private_impl.f_quirks[2u]) {
59692
                  if (((uint64_t)(io2_a_src - iop_a_src)) < 10u) {
59693
                    if (a_src && a_src->meta.closed) {
59694
                      status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape);
59695
                      goto exit;
59696
                    }
59697
                    status = wuffs_base__make_status(wuffs_base__suspension__short_read);
59698
                    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9);
59699
                    goto label__string_loop_outer__continue;
59700
                  }
59701
                  v_uni8_string = wuffs_base__peek_u64le__no_bounds_check(iop_a_src + 2u);
59702
                  v_uni8_value = 0u;
59703
                  v_uni8_ok = 128u;
59704
                  v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 0u))];
59705
                  v_uni8_ok &= v_c8;
59706
                  v_uni8_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 28u);
59707
                  v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 8u))];
59708
                  v_uni8_ok &= v_c8;
59709
                  v_uni8_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 24u);
59710
                  v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 16u))];
59711
                  v_uni8_ok &= v_c8;
59712
                  v_uni8_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 20u);
59713
                  v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 24u))];
59714
                  v_uni8_ok &= v_c8;
59715
                  v_uni8_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 16u);
59716
                  v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 32u))];
59717
                  v_uni8_ok &= v_c8;
59718
                  v_uni8_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 12u);
59719
                  v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 40u))];
59720
                  v_uni8_ok &= v_c8;
59721
                  v_uni8_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 8u);
59722
                  v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 48u))];
59723
                  v_uni8_ok &= v_c8;
59724
                  v_uni8_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 4u);
59725
                  v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 56u))];
59726
                  v_uni8_ok &= v_c8;
59727
                  v_uni8_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 0u);
59728
                  if (v_uni8_ok == 0u) {
59729
                  } else if ((v_uni8_value < 55296u) || ((57343u < v_uni8_value) && (v_uni8_value <= 1114111u))) {
59730
                    iop_a_src += 10u;
59731
                    *iop_a_dst++ = wuffs_base__make_token(
59732
                        (((uint64_t)((6291456u | (v_uni8_value & 2097151u)))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59733
                        (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
59734
                        (((uint64_t)(10u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59735
                    goto label__string_loop_outer__continue;
59736
                  } else if (self->private_impl.f_quirks[20u]) {
59737
                    iop_a_src += 10u;
59738
                    *iop_a_dst++ = wuffs_base__make_token(
59739
                        (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59740
                        (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
59741
                        (((uint64_t)(10u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59742
                    goto label__string_loop_outer__continue;
59743
                  }
59744
                } else if ((v_c8 == 120u) && self->private_impl.f_quirks[9u]) {
59745
                  if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) {
59746
                    if (a_src && a_src->meta.closed) {
59747
                      status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape);
59748
                      goto exit;
59749
                    }
59750
                    status = wuffs_base__make_status(wuffs_base__suspension__short_read);
59751
                    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10);
59752
                    goto label__string_loop_outer__continue;
59753
                  }
59754
                  v_backslash_x_string = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
59755
                  v_backslash_x_ok = 128u;
59756
                  v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_backslash_x_string >> 16u))];
59757
                  v_backslash_x_ok &= v_c8;
59758
                  v_backslash_x_value = ((uint8_t)(((uint8_t)(((uint8_t)(v_c8 & 15u)) << 4u))));
59759
                  v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_backslash_x_string >> 24u))];
59760
                  v_backslash_x_ok &= v_c8;
59761
                  v_backslash_x_value = ((uint8_t)(((uint8_t)(v_backslash_x_value | ((uint8_t)(v_c8 & 15u))))));
59762
                  if ((v_backslash_x_ok == 0u) || ((v_backslash_x_string & 65535u) != 30812u)) {
59763
                    status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape);
59764
                    goto exit;
59765
                  }
59766
                  iop_a_src += 4u;
59767
                  *iop_a_dst++ = wuffs_base__make_token(
59768
                      (((uint64_t)((6291456u | ((uint32_t)(v_backslash_x_value))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59769
                      (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
59770
                      (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59771
                  goto label__string_loop_outer__continue;
59772
                }
59773
                status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape);
59774
                goto exit;
59775
              } else if (v_char == 3u) {
59776
                if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) {
59777
                  if (v_string_length > 0u) {
59778
                    *iop_a_dst++ = wuffs_base__make_token(
59779
                        (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59780
                        (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
59781
                        (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59782
                    v_string_length = 0u;
59783
                    if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
59784
                      goto label__string_loop_outer__continue;
59785
                    }
59786
                  }
59787
                  if (a_src && a_src->meta.closed) {
59788
                    if (self->private_impl.f_quirks[20u]) {
59789
                      *iop_a_dst++ = wuffs_base__make_token(
59790
                          (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59791
                          (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
59792
                          (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59793
                      iop_a_src += 1u;
59794
                      goto label__string_loop_outer__continue;
59795
                    }
59796
                    status = wuffs_base__make_status(wuffs_json__error__bad_utf_8);
59797
                    goto exit;
59798
                  }
59799
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
59800
                  WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(11);
59801
                  goto label__string_loop_outer__continue;
59802
                }
59803
                v_multi_byte_utf8 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
59804
                if ((v_multi_byte_utf8 & 49152u) == 32768u) {
59805
                  v_multi_byte_utf8 = ((1984u & ((uint32_t)(v_multi_byte_utf8 << 6u))) | (63u & (v_multi_byte_utf8 >> 8u)));
59806
                  iop_a_src += 2u;
59807
                  if (v_string_length >= 65528u) {
59808
                    *iop_a_dst++ = wuffs_base__make_token(
59809
                        (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59810
                        (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
59811
                        (((uint64_t)((v_string_length + 2u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59812
                    v_string_length = 0u;
59813
                    goto label__string_loop_outer__continue;
59814
                  }
59815
                  v_string_length += 2u;
59816
                  continue;
59817
                }
59818
              } else if (v_char == 4u) {
59819
                if (((uint64_t)(io2_a_src - iop_a_src)) < 3u) {
59820
                  if (v_string_length > 0u) {
59821
                    *iop_a_dst++ = wuffs_base__make_token(
59822
                        (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59823
                        (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
59824
                        (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59825
                    v_string_length = 0u;
59826
                    if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
59827
                      goto label__string_loop_outer__continue;
59828
                    }
59829
                  }
59830
                  if (a_src && a_src->meta.closed) {
59831
                    if (self->private_impl.f_quirks[20u]) {
59832
                      *iop_a_dst++ = wuffs_base__make_token(
59833
                          (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59834
                          (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
59835
                          (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59836
                      iop_a_src += 1u;
59837
                      goto label__string_loop_outer__continue;
59838
                    }
59839
                    status = wuffs_base__make_status(wuffs_json__error__bad_utf_8);
59840
                    goto exit;
59841
                  }
59842
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
59843
                  WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(12);
59844
                  goto label__string_loop_outer__continue;
59845
                }
59846
                v_multi_byte_utf8 = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src)));
59847
                if ((v_multi_byte_utf8 & 12632064u) == 8421376u) {
59848
                  v_multi_byte_utf8 = ((61440u & ((uint32_t)(v_multi_byte_utf8 << 12u))) | (4032u & (v_multi_byte_utf8 >> 2u)) | (63u & (v_multi_byte_utf8 >> 16u)));
59849
                  if ((2047u < v_multi_byte_utf8) && ((v_multi_byte_utf8 < 55296u) || (57343u < v_multi_byte_utf8))) {
59850
                    iop_a_src += 3u;
59851
                    if (v_string_length >= 65528u) {
59852
                      *iop_a_dst++ = wuffs_base__make_token(
59853
                          (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59854
                          (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
59855
                          (((uint64_t)((v_string_length + 3u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59856
                      v_string_length = 0u;
59857
                      goto label__string_loop_outer__continue;
59858
                    }
59859
                    v_string_length += 3u;
59860
                    continue;
59861
                  }
59862
                }
59863
              } else if (v_char == 5u) {
59864
                if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) {
59865
                  if (v_string_length > 0u) {
59866
                    *iop_a_dst++ = wuffs_base__make_token(
59867
                        (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59868
                        (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
59869
                        (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59870
                    v_string_length = 0u;
59871
                    if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
59872
                      goto label__string_loop_outer__continue;
59873
                    }
59874
                  }
59875
                  if (a_src && a_src->meta.closed) {
59876
                    if (self->private_impl.f_quirks[20u]) {
59877
                      *iop_a_dst++ = wuffs_base__make_token(
59878
                          (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59879
                          (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
59880
                          (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59881
                      iop_a_src += 1u;
59882
                      goto label__string_loop_outer__continue;
59883
                    }
59884
                    status = wuffs_base__make_status(wuffs_json__error__bad_utf_8);
59885
                    goto exit;
59886
                  }
59887
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
59888
                  WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(13);
59889
                  goto label__string_loop_outer__continue;
59890
                }
59891
                v_multi_byte_utf8 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
59892
                if ((v_multi_byte_utf8 & 3233857536u) == 2155905024u) {
59893
                  v_multi_byte_utf8 = ((1835008u & ((uint32_t)(v_multi_byte_utf8 << 18u))) |
59894
                      (258048u & ((uint32_t)(v_multi_byte_utf8 << 4u))) |
59895
                      (4032u & (v_multi_byte_utf8 >> 10u)) |
59896
                      (63u & (v_multi_byte_utf8 >> 24u)));
59897
                  if ((65535u < v_multi_byte_utf8) && (v_multi_byte_utf8 <= 1114111u)) {
59898
                    iop_a_src += 4u;
59899
                    if (v_string_length >= 65528u) {
59900
                      *iop_a_dst++ = wuffs_base__make_token(
59901
                          (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59902
                          (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
59903
                          (((uint64_t)((v_string_length + 4u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59904
                      v_string_length = 0u;
59905
                      goto label__string_loop_outer__continue;
59906
                    }
59907
                    v_string_length += 4u;
59908
                    continue;
59909
                  }
59910
                }
59911
              }
59912
              if (v_string_length > 0u) {
59913
                *iop_a_dst++ = wuffs_base__make_token(
59914
                    (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59915
                    (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
59916
                    (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59917
                v_string_length = 0u;
59918
                if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
59919
                  goto label__string_loop_outer__continue;
59920
                }
59921
              }
59922
              if (((uint8_t)(v_char & 128u)) != 0u) {
59923
                if (self->private_impl.f_quirks[0u]) {
59924
                  *iop_a_dst++ = wuffs_base__make_token(
59925
                      (((uint64_t)((6291456u | ((uint32_t)(((uint8_t)(v_char & 127u))))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59926
                      (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
59927
                      (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59928
                  iop_a_src += 1u;
59929
                  goto label__string_loop_outer__continue;
59930
                }
59931
                if (v_char == 138u) {
59932
                  status = wuffs_base__make_status(wuffs_json__error__bad_new_line_in_a_string);
59933
                  goto exit;
59934
                }
59935
                status = wuffs_base__make_status(wuffs_json__error__bad_c0_control_code);
59936
                goto exit;
59937
              }
59938
              if (self->private_impl.f_quirks[20u]) {
59939
                *iop_a_dst++ = wuffs_base__make_token(
59940
                    (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59941
                    (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
59942
                    (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59943
                iop_a_src += 1u;
59944
                goto label__string_loop_outer__continue;
59945
              }
59946
              status = wuffs_base__make_status(wuffs_json__error__bad_utf_8);
59947
              goto exit;
59948
            }
59949
          }
59950
          label__string_loop_outer__break:;
59951
          while (true) {
59952
            if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
59953
              if (a_src && a_src->meta.closed) {
59954
                status = wuffs_base__make_status(wuffs_json__error__bad_input);
59955
                goto exit;
59956
              }
59957
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
59958
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(14);
59959
              continue;
59960
            }
59961
            if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
59962
              status = wuffs_base__make_status(wuffs_base__suspension__short_write);
59963
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(15);
59964
              continue;
59965
            }
59966
            iop_a_src += 1u;
59967
            *iop_a_dst++ = wuffs_base__make_token(
59968
                (((uint64_t)(4194579u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59969
                (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59970
            break;
59971
          }
59972
          if (0u == (v_expect & (((uint32_t)(1u)) << 4u))) {
59973
            v_expect = 4104u;
59974
            goto label__outer__continue;
59975
          }
59976
          break;
59977
        } else if (v_class == 2u) {
59978
          iop_a_src += 1u;
59979
          *iop_a_dst++ = wuffs_base__make_token(
59980
              (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59981
              (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59982
          if (0u == (v_expect & (((uint32_t)(1u)) << 8u))) {
59983
            if (self->private_impl.f_quirks[13u]) {
59984
              v_expect = 4162u;
59985
            } else {
59986
              v_expect = 4098u;
59987
            }
59988
          } else {
59989
            if (self->private_impl.f_quirks[13u]) {
59990
              v_expect = 8114u;
59991
            } else {
59992
              v_expect = 7858u;
59993
            }
59994
          }
59995
          goto label__outer__continue;
59996
        } else if (v_class == 3u) {
59997
          iop_a_src += 1u;
59998
          *iop_a_dst++ = wuffs_base__make_token(
59999
              (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
60000
              (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
60001
          v_expect = 7858u;
60002
          goto label__outer__continue;
60003
        } else if (v_class == 4u) {
60004
          while (true) {
60005
            if (a_src) {
60006
              a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
60007
            }
60008
            v_number_length = wuffs_json__decoder__decode_number(self, a_src);
60009
            if (a_src) {
60010
              iop_a_src = a_src->data.ptr + a_src->meta.ri;
60011
            }
60012
            v_number_status = (v_number_length >> 8u);
60013
            v_vminor = 10486787u;
60014
            if ((v_number_length & 128u) != 0u) {
60015
              v_vminor = 10486785u;
60016
            }
60017
            v_number_length = (v_number_length & 127u);
60018
            if (v_number_status == 0u) {
60019
              *iop_a_dst++ = wuffs_base__make_token(
60020
                  (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
60021
                  (((uint64_t)(v_number_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
60022
              break;
60023
            }
60024
            while (v_number_length > 0u) {
60025
              v_number_length -= 1u;
60026
              if (iop_a_src > io1_a_src) {
60027
                iop_a_src--;
60028
              } else {
60029
                status = wuffs_base__make_status(wuffs_json__error__internal_error_inconsistent_i_o);
60030
                goto exit;
60031
              }
60032
            }
60033
            if (v_number_status == 1u) {
60034
              if (self->private_impl.f_quirks[14u]) {
60035
                if (a_dst) {
60036
                  a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
60037
                }
60038
                if (a_src) {
60039
                  a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
60040
                }
60041
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16);
60042
                status = wuffs_json__decoder__decode_inf_nan(self, a_dst, a_src);
60043
                if (a_dst) {
60044
                  iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
60045
                }
60046
                if (a_src) {
60047
                  iop_a_src = a_src->data.ptr + a_src->meta.ri;
60048
                }
60049
                if (status.repr) {
60050
                  goto suspend;
60051
                }
60052
                break;
60053
              }
60054
              status = wuffs_base__make_status(wuffs_json__error__bad_input);
60055
              goto exit;
60056
            } else if (v_number_status == 2u) {
60057
              status = wuffs_base__make_status(wuffs_json__error__unsupported_number_length);
60058
              goto exit;
60059
            } else {
60060
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
60061
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(17);
60062
              while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
60063
                status = wuffs_base__make_status(wuffs_base__suspension__short_write);
60064
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(18);
60065
              }
60066
            }
60067
          }
60068
          break;
60069
        } else if (v_class == 5u) {
60070
          v_vminor = 2113553u;
60071
          if (v_depth == 0u) {
60072
          } else if (0u != (v_expect_after_value & (((uint32_t)(1u)) << 6u))) {
60073
            v_vminor = 2113601u;
60074
          } else {
60075
            v_vminor = 2113569u;
60076
          }
60077
          if (v_depth >= 1024u) {
60078
            status = wuffs_base__make_status(wuffs_json__error__unsupported_recursion_depth);
60079
            goto exit;
60080
          }
60081
          v_stack_byte = (v_depth / 32u);
60082
          v_stack_bit = (v_depth & 31u);
60083
          self->private_data.f_stack[v_stack_byte] |= (((uint32_t)(1u)) << v_stack_bit);
60084
          v_depth += 1u;
60085
          iop_a_src += 1u;
60086
          *iop_a_dst++ = wuffs_base__make_token(
60087
              (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
60088
              (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
60089
          v_expect = 4162u;
60090
          v_expect_after_value = 4164u;
60091
          goto label__outer__continue;
60092
        } else if (v_class == 6u) {
60093
          iop_a_src += 1u;
60094
          if (v_depth <= 1u) {
60095
            *iop_a_dst++ = wuffs_base__make_token(
60096
                (((uint64_t)(2101314u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
60097
                (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
60098
            goto label__outer__break;
60099
          }
60100
          v_depth -= 1u;
60101
          v_stack_byte = ((v_depth - 1u) / 32u);
60102
          v_stack_bit = ((v_depth - 1u) & 31u);
60103
          if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) {
60104
            *iop_a_dst++ = wuffs_base__make_token(
60105
                (((uint64_t)(2105410u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
60106
                (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
60107
            v_expect = 4356u;
60108
            v_expect_after_value = 4356u;
60109
          } else {
60110
            *iop_a_dst++ = wuffs_base__make_token(
60111
                (((uint64_t)(2113602u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
60112
                (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
60113
            v_expect = 4164u;
60114
            v_expect_after_value = 4164u;
60115
          }
60116
          goto label__outer__continue;
60117
        } else if (v_class == 7u) {
60118
          v_vminor = 2105361u;
60119
          if (v_depth == 0u) {
60120
          } else if (0u != (v_expect_after_value & (((uint32_t)(1u)) << 6u))) {
60121
            v_vminor = 2105409u;
60122
          } else {
60123
            v_vminor = 2105377u;
60124
          }
60125
          if (v_depth >= 1024u) {
60126
            status = wuffs_base__make_status(wuffs_json__error__unsupported_recursion_depth);
60127
            goto exit;
60128
          }
60129
          v_stack_byte = (v_depth / 32u);
60130
          v_stack_bit = (v_depth & 31u);
60131
          self->private_data.f_stack[v_stack_byte] &= (4294967295u ^ (((uint32_t)(1u)) << v_stack_bit));
60132
          v_depth += 1u;
60133
          iop_a_src += 1u;
60134
          *iop_a_dst++ = wuffs_base__make_token(
60135
              (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
60136
              (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
60137
          v_expect = 8114u;
60138
          v_expect_after_value = 4356u;
60139
          goto label__outer__continue;
60140
        } else if (v_class == 8u) {
60141
          iop_a_src += 1u;
60142
          if (v_depth <= 1u) {
60143
            *iop_a_dst++ = wuffs_base__make_token(
60144
                (((uint64_t)(2101282u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
60145
                (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
60146
            goto label__outer__break;
60147
          }
60148
          v_depth -= 1u;
60149
          v_stack_byte = ((v_depth - 1u) / 32u);
60150
          v_stack_bit = ((v_depth - 1u) & 31u);
60151
          if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) {
60152
            *iop_a_dst++ = wuffs_base__make_token(
60153
                (((uint64_t)(2105378u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
60154
                (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
60155
            v_expect = 4356u;
60156
            v_expect_after_value = 4356u;
60157
          } else {
60158
            *iop_a_dst++ = wuffs_base__make_token(
60159
                (((uint64_t)(2113570u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
60160
                (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
60161
            v_expect = 4164u;
60162
            v_expect_after_value = 4164u;
60163
          }
60164
          goto label__outer__continue;
60165
        } else if (v_class == 9u) {
60166
          v_match = wuffs_private_impl__io_reader__match7(iop_a_src, io2_a_src, a_src, 111546413966853u);
60167
          if (v_match == 0u) {
60168
            *iop_a_dst++ = wuffs_base__make_token(
60169
                (((uint64_t)(8388612u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
60170
                (((uint64_t)(5u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
60171
            if (((uint64_t)(io2_a_src - iop_a_src)) < 5u) {
60172
              status = wuffs_base__make_status(wuffs_json__error__internal_error_inconsistent_i_o);
60173
              goto exit;
60174
            }
60175
            iop_a_src += 5u;
60176
            break;
60177
          } else if (v_match == 1u) {
60178
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
60179
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(19);
60180
            goto label__outer__continue;
60181
          }
60182
        } else if (v_class == 10u) {
60183
          v_match = wuffs_private_impl__io_reader__match7(iop_a_src, io2_a_src, a_src, 435762131972u);
60184
          if (v_match == 0u) {
60185
            *iop_a_dst++ = wuffs_base__make_token(
60186
                (((uint64_t)(8388616u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
60187
                (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
60188
            if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) {
60189
              status = wuffs_base__make_status(wuffs_json__error__internal_error_inconsistent_i_o);
60190
              goto exit;
60191
            }
60192
            iop_a_src += 4u;
60193
            break;
60194
          } else if (v_match == 1u) {
60195
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
60196
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(20);
60197
            goto label__outer__continue;
60198
          }
60199
        } else if (v_class == 11u) {
60200
          v_match = wuffs_private_impl__io_reader__match7(iop_a_src, io2_a_src, a_src, 465676103172u);
60201
          if (v_match == 0u) {
60202
            *iop_a_dst++ = wuffs_base__make_token(
60203
                (((uint64_t)(8388610u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
60204
                (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
60205
            if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) {
60206
              status = wuffs_base__make_status(wuffs_json__error__internal_error_inconsistent_i_o);
60207
              goto exit;
60208
            }
60209
            iop_a_src += 4u;
60210
            break;
60211
          } else if (v_match == 1u) {
60212
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
60213
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(21);
60214
            goto label__outer__continue;
60215
          }
60216
          if (self->private_impl.f_quirks[14u]) {
60217
            if (a_dst) {
60218
              a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
60219
            }
60220
            if (a_src) {
60221
              a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
60222
            }
60223
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(22);
60224
            status = wuffs_json__decoder__decode_inf_nan(self, a_dst, a_src);
60225
            if (a_dst) {
60226
              iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
60227
            }
60228
            if (a_src) {
60229
              iop_a_src = a_src->data.ptr + a_src->meta.ri;
60230
            }
60231
            if (status.repr) {
60232
              goto suspend;
60233
            }
60234
            break;
60235
          }
60236
        } else if (v_class == 12u) {
60237
          if (self->private_impl.f_quirks[11u] || self->private_impl.f_quirks[12u]) {
60238
            if (a_dst) {
60239
              a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
60240
            }
60241
            if (a_src) {
60242
              a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
60243
            }
60244
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(23);
60245
            status = wuffs_json__decoder__decode_comment(self, a_dst, a_src);
60246
            if (a_dst) {
60247
              iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
60248
            }
60249
            if (a_src) {
60250
              iop_a_src = a_src->data.ptr + a_src->meta.ri;
60251
            }
60252
            if (status.repr) {
60253
              goto suspend;
60254
            }
60255
            if (self->private_impl.f_comment_type > 0u) {
60256
              goto label__outer__continue;
60257
            }
60258
          }
60259
        }
60260
        status = wuffs_base__make_status(wuffs_json__error__bad_input);
60261
        goto exit;
60262
      }
60263
      if (v_depth == 0u) {
60264
        break;
60265
      }
60266
      v_expect = v_expect_after_value;
60267
    }
60268
    label__outer__break:;
60269
    if (self->private_impl.f_quirks[17u] || self->private_impl.f_quirks[18u]) {
60270
      if (a_dst) {
60271
        a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
60272
      }
60273
      if (a_src) {
60274
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
60275
      }
60276
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(24);
60277
      status = wuffs_json__decoder__decode_trailer(self, a_dst, a_src);
60278
      if (a_dst) {
60279
        iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
60280
      }
60281
      if (a_src) {
60282
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
60283
      }
60284
      if (status.repr) {
60285
        goto suspend;
60286
      }
60287
    }
60288
    self->private_impl.f_end_of_data = true;
60289
60290
    ok:
60291
    self->private_impl.p_decode_tokens = 0;
60292
    goto exit;
60293
  }
60294
60295
  goto suspend;
60296
  suspend:
60297
  self->private_impl.p_decode_tokens = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
60298
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
60299
  self->private_data.s_decode_tokens.v_depth = v_depth;
60300
  self->private_data.s_decode_tokens.v_expect = v_expect;
60301
  self->private_data.s_decode_tokens.v_expect_after_value = v_expect_after_value;
60302
60303
  goto exit;
60304
  exit:
60305
  if (a_dst && a_dst->data.ptr) {
60306
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
60307
  }
60308
  if (a_src && a_src->data.ptr) {
60309
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
60310
  }
60311
60312
  if (wuffs_base__status__is_error(&status)) {
60313
    self->private_impl.magic = WUFFS_BASE__DISABLED;
60314
  }
60315
  return status;
60316
}
60317
60318
// -------- func json.decoder.decode_number
60319
60320
WUFFS_BASE__GENERATED_C_CODE
60321
static uint32_t
60322
wuffs_json__decoder__decode_number(
60323
    wuffs_json__decoder* self,
60324
    wuffs_base__io_buffer* a_src) {
60325
  uint8_t v_c8 = 0;
60326
  uint32_t v_n = 0;
60327
  uint32_t v_floating_point = 0;
60328
60329
  const uint8_t* iop_a_src = NULL;
60330
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
60331
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
60332
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
60333
  if (a_src && a_src->data.ptr) {
60334
    io0_a_src = a_src->data.ptr;
60335
    io1_a_src = io0_a_src + a_src->meta.ri;
60336
    iop_a_src = io1_a_src;
60337
    io2_a_src = io0_a_src + a_src->meta.wi;
60338
  }
60339
60340
  do {
60341
    v_n = 0u;
60342
    if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
60343
      if ( ! (a_src && a_src->meta.closed)) {
60344
        v_n |= 768u;
60345
      }
60346
      break;
60347
    }
60348
    v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
60349
    if (v_c8 != 45u) {
60350
    } else {
60351
      v_n += 1u;
60352
      iop_a_src += 1u;
60353
      if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
60354
        if ( ! (a_src && a_src->meta.closed)) {
60355
          v_n |= 768u;
60356
        }
60357
        v_n |= 256u;
60358
        break;
60359
      }
60360
      v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
60361
    }
60362
    if (v_c8 == 48u) {
60363
      v_n += 1u;
60364
      iop_a_src += 1u;
60365
    } else {
60366
      if (a_src) {
60367
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
60368
      }
60369
      v_n = wuffs_json__decoder__decode_digits(self, a_src, v_n);
60370
      if (a_src) {
60371
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
60372
      }
60373
      if (v_n > 99u) {
60374
        break;
60375
      }
60376
    }
60377
    if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
60378
      if ( ! (a_src && a_src->meta.closed)) {
60379
        v_n |= 768u;
60380
      }
60381
      break;
60382
    }
60383
    v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
60384
    if (v_c8 != 46u) {
60385
    } else {
60386
      if (v_n >= 99u) {
60387
        v_n |= 512u;
60388
        break;
60389
      }
60390
      v_n += 1u;
60391
      iop_a_src += 1u;
60392
      v_floating_point = 128u;
60393
      if (a_src) {
60394
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
60395
      }
60396
      v_n = wuffs_json__decoder__decode_digits(self, a_src, v_n);
60397
      if (a_src) {
60398
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
60399
      }
60400
      if (v_n > 99u) {
60401
        break;
60402
      }
60403
      if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
60404
        if ( ! (a_src && a_src->meta.closed)) {
60405
          v_n |= 768u;
60406
        }
60407
        break;
60408
      }
60409
      v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
60410
    }
60411
    if ((v_c8 != 69u) && (v_c8 != 101u)) {
60412
      break;
60413
    }
60414
    if (v_n >= 99u) {
60415
      v_n |= 512u;
60416
      break;
60417
    }
60418
    v_n += 1u;
60419
    iop_a_src += 1u;
60420
    v_floating_point = 128u;
60421
    if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
60422
      if ( ! (a_src && a_src->meta.closed)) {
60423
        v_n |= 768u;
60424
      }
60425
      v_n |= 256u;
60426
      break;
60427
    }
60428
    v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
60429
    if ((v_c8 != 43u) && (v_c8 != 45u)) {
60430
    } else {
60431
      if (v_n >= 99u) {
60432
        v_n |= 512u;
60433
        break;
60434
      }
60435
      v_n += 1u;
60436
      iop_a_src += 1u;
60437
    }
60438
    if (a_src) {
60439
      a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
60440
    }
60441
    v_n = wuffs_json__decoder__decode_digits(self, a_src, v_n);
60442
    if (a_src) {
60443
      iop_a_src = a_src->data.ptr + a_src->meta.ri;
60444
    }
60445
  } while (0);
60446
  if (a_src && a_src->data.ptr) {
60447
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
60448
  }
60449
  return (v_n | v_floating_point);
60450
}
60451
60452
// -------- func json.decoder.decode_digits
60453
60454
WUFFS_BASE__GENERATED_C_CODE
60455
static uint32_t
60456
wuffs_json__decoder__decode_digits(
60457
    wuffs_json__decoder* self,
60458
    wuffs_base__io_buffer* a_src,
60459
    uint32_t a_n) {
60460
  uint8_t v_c8 = 0;
60461
  uint32_t v_n = 0;
60462
60463
  const uint8_t* iop_a_src = NULL;
60464
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
60465
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
60466
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
60467
  if (a_src && a_src->data.ptr) {
60468
    io0_a_src = a_src->data.ptr;
60469
    io1_a_src = io0_a_src + a_src->meta.ri;
60470
    iop_a_src = io1_a_src;
60471
    io2_a_src = io0_a_src + a_src->meta.wi;
60472
  }
60473
60474
  v_n = a_n;
60475
  while (true) {
60476
    if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
60477
      if ( ! (a_src && a_src->meta.closed)) {
60478
        v_n |= 768u;
60479
      }
60480
      break;
60481
    }
60482
    v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
60483
    if (0u == WUFFS_JSON__LUT_DECIMAL_DIGITS[v_c8]) {
60484
      break;
60485
    }
60486
    if (v_n >= 99u) {
60487
      v_n |= 512u;
60488
      break;
60489
    }
60490
    v_n += 1u;
60491
    iop_a_src += 1u;
60492
  }
60493
  if (v_n == a_n) {
60494
    v_n |= 256u;
60495
  }
60496
  if (a_src && a_src->data.ptr) {
60497
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
60498
  }
60499
  return v_n;
60500
}
60501
60502
// -------- func json.decoder.decode_leading
60503
60504
WUFFS_BASE__GENERATED_C_CODE
60505
static wuffs_base__status
60506
wuffs_json__decoder__decode_leading(
60507
    wuffs_json__decoder* self,
60508
    wuffs_base__token_buffer* a_dst,
60509
    wuffs_base__io_buffer* a_src) {
60510
  wuffs_base__status status = wuffs_base__make_status(NULL);
60511
60512
  uint8_t v_c8 = 0;
60513
  uint32_t v_u = 0;
60514
60515
  wuffs_base__token* iop_a_dst = NULL;
60516
  wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
60517
  wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
60518
  wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
60519
  if (a_dst && a_dst->data.ptr) {
60520
    io0_a_dst = a_dst->data.ptr;
60521
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
60522
    iop_a_dst = io1_a_dst;
60523
    io2_a_dst = io0_a_dst + a_dst->data.len;
60524
    if (a_dst->meta.closed) {
60525
      io2_a_dst = iop_a_dst;
60526
    }
60527
  }
60528
  const uint8_t* iop_a_src = NULL;
60529
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
60530
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
60531
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
60532
  if (a_src && a_src->data.ptr) {
60533
    io0_a_src = a_src->data.ptr;
60534
    io1_a_src = io0_a_src + a_src->meta.ri;
60535
    iop_a_src = io1_a_src;
60536
    io2_a_src = io0_a_src + a_src->meta.wi;
60537
  }
60538
60539
  uint32_t coro_susp_point = self->private_impl.p_decode_leading;
60540
  switch (coro_susp_point) {
60541
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
60542
60543
    self->private_impl.f_allow_leading_ars = self->private_impl.f_quirks[15u];
60544
    self->private_impl.f_allow_leading_ubom = self->private_impl.f_quirks[16u];
60545
    while (self->private_impl.f_allow_leading_ars || self->private_impl.f_allow_leading_ubom) {
60546
      if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
60547
        status = wuffs_base__make_status(wuffs_base__suspension__short_write);
60548
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
60549
        continue;
60550
      }
60551
      if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
60552
        if (a_src && a_src->meta.closed) {
60553
          break;
60554
        }
60555
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
60556
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2);
60557
        continue;
60558
      }
60559
      v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
60560
      if ((v_c8 == 30u) && self->private_impl.f_allow_leading_ars) {
60561
        self->private_impl.f_allow_leading_ars = false;
60562
        iop_a_src += 1u;
60563
        *iop_a_dst++ = wuffs_base__make_token(
60564
            (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
60565
            (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
60566
        continue;
60567
      } else if ((v_c8 == 239u) && self->private_impl.f_allow_leading_ubom) {
60568
        if (((uint64_t)(io2_a_src - iop_a_src)) < 3u) {
60569
          if (a_src && a_src->meta.closed) {
60570
            break;
60571
          }
60572
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
60573
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3);
60574
          continue;
60575
        }
60576
        v_u = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src)));
60577
        if (v_u == 12565487u) {
60578
          self->private_impl.f_allow_leading_ubom = false;
60579
          iop_a_src += 3u;
60580
          *iop_a_dst++ = wuffs_base__make_token(
60581
              (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
60582
              (((uint64_t)(3u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
60583
          continue;
60584
        }
60585
      }
60586
      break;
60587
    }
60588
60589
    ok:
60590
    self->private_impl.p_decode_leading = 0;
60591
    goto exit;
60592
  }
60593
60594
  goto suspend;
60595
  suspend:
60596
  self->private_impl.p_decode_leading = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
60597
60598
  goto exit;
60599
  exit:
60600
  if (a_dst && a_dst->data.ptr) {
60601
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
60602
  }
60603
  if (a_src && a_src->data.ptr) {
60604
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
60605
  }
60606
60607
  return status;
60608
}
60609
60610
// -------- func json.decoder.decode_comment
60611
60612
WUFFS_BASE__GENERATED_C_CODE
60613
static wuffs_base__status
60614
wuffs_json__decoder__decode_comment(
60615
    wuffs_json__decoder* self,
60616
    wuffs_base__token_buffer* a_dst,
60617
    wuffs_base__io_buffer* a_src) {
60618
  wuffs_base__status status = wuffs_base__make_status(NULL);
60619
60620
  uint8_t v_c8 = 0;
60621
  uint16_t v_c16 = 0;
60622
  uint32_t v_length = 0;
60623
60624
  wuffs_base__token* iop_a_dst = NULL;
60625
  wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
60626
  wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
60627
  wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
60628
  if (a_dst && a_dst->data.ptr) {
60629
    io0_a_dst = a_dst->data.ptr;
60630
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
60631
    iop_a_dst = io1_a_dst;
60632
    io2_a_dst = io0_a_dst + a_dst->data.len;
60633
    if (a_dst->meta.closed) {
60634
      io2_a_dst = iop_a_dst;
60635
    }
60636
  }
60637
  const uint8_t* iop_a_src = NULL;
60638
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
60639
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
60640
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
60641
  if (a_src && a_src->data.ptr) {
60642
    io0_a_src = a_src->data.ptr;
60643
    io1_a_src = io0_a_src + a_src->meta.ri;
60644
    iop_a_src = io1_a_src;
60645
    io2_a_src = io0_a_src + a_src->meta.wi;
60646
  }
60647
60648
  uint32_t coro_susp_point = self->private_impl.p_decode_comment;
60649
  switch (coro_susp_point) {
60650
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
60651
60652
    self->private_impl.f_comment_type = 0u;
60653
    while ((((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) || (((uint64_t)(io2_a_src - iop_a_src)) <= 1u)) {
60654
      if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
60655
        status = wuffs_base__make_status(wuffs_base__suspension__short_write);
60656
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
60657
        continue;
60658
      }
60659
      if (a_src && a_src->meta.closed) {
60660
        status = wuffs_base__make_status(NULL);
60661
        goto ok;
60662
      }
60663
      status = wuffs_base__make_status(wuffs_base__suspension__short_read);
60664
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2);
60665
    }
60666
    v_c16 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src);
60667
    if ((v_c16 == 10799u) && self->private_impl.f_quirks[11u]) {
60668
      iop_a_src += 2u;
60669
      v_length = 2u;
60670
      while (true) {
60671
        if (((uint64_t)(io2_a_src - iop_a_src)) <= 1u) {
60672
          if (v_length > 0u) {
60673
            *iop_a_dst++ = wuffs_base__make_token(
60674
                (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
60675
                (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
60676
                (((uint64_t)(v_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
60677
          }
60678
          if (a_src && a_src->meta.closed) {
60679
            status = wuffs_base__make_status(wuffs_json__error__bad_input);
60680
            goto exit;
60681
          }
60682
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
60683
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3);
60684
          while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
60685
            status = wuffs_base__make_status(wuffs_base__suspension__short_write);
60686
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4);
60687
          }
60688
          v_length = 0u;
60689
          continue;
60690
        }
60691
        v_c16 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src);
60692
        if (v_c16 == 12074u) {
60693
          iop_a_src += 2u;
60694
          *iop_a_dst++ = wuffs_base__make_token(
60695
              (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
60696
              (((uint64_t)((v_length + 2u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
60697
          self->private_impl.f_comment_type = 1u;
60698
          status = wuffs_base__make_status(NULL);
60699
          goto ok;
60700
        }
60701
        iop_a_src += 1u;
60702
        if (v_length >= 65533u) {
60703
          *iop_a_dst++ = wuffs_base__make_token(
60704
              (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
60705
              (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
60706
              (((uint64_t)((v_length + 1u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
60707
          while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
60708
            status = wuffs_base__make_status(wuffs_base__suspension__short_write);
60709
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5);
60710
          }
60711
          v_length = 0u;
60712
          continue;
60713
        }
60714
        v_length += 1u;
60715
      }
60716
    } else if ((v_c16 == 12079u) && self->private_impl.f_quirks[12u]) {
60717
      iop_a_src += 2u;
60718
      v_length = 2u;
60719
      while (true) {
60720
        if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
60721
          if (a_src && a_src->meta.closed) {
60722
            *iop_a_dst++ = wuffs_base__make_token(
60723
                (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
60724
                (((uint64_t)(v_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
60725
            self->private_impl.f_comment_type = 2u;
60726
            status = wuffs_base__make_status(NULL);
60727
            goto ok;
60728
          } else if (v_length > 0u) {
60729
            *iop_a_dst++ = wuffs_base__make_token(
60730
                (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
60731
                (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
60732
                (((uint64_t)(v_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
60733
          }
60734
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
60735
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6);
60736
          while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
60737
            status = wuffs_base__make_status(wuffs_base__suspension__short_write);
60738
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7);
60739
          }
60740
          v_length = 0u;
60741
          continue;
60742
        }
60743
        v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
60744
        if (v_c8 == 10u) {
60745
          *iop_a_dst++ = wuffs_base__make_token(
60746
              (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
60747
              (((uint64_t)(v_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
60748
          self->private_impl.f_comment_type = 2u;
60749
          status = wuffs_base__make_status(NULL);
60750
          goto ok;
60751
        }
60752
        iop_a_src += 1u;
60753
        if (v_length >= 65533u) {
60754
          *iop_a_dst++ = wuffs_base__make_token(
60755
              (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
60756
              (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
60757
              (((uint64_t)((v_length + 1u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
60758
          while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
60759
            status = wuffs_base__make_status(wuffs_base__suspension__short_write);
60760
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8);
60761
          }
60762
          v_length = 0u;
60763
          continue;
60764
        }
60765
        v_length += 1u;
60766
      }
60767
    }
60768
60769
    ok:
60770
    self->private_impl.p_decode_comment = 0;
60771
    goto exit;
60772
  }
60773
60774
  goto suspend;
60775
  suspend:
60776
  self->private_impl.p_decode_comment = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
60777
60778
  goto exit;
60779
  exit:
60780
  if (a_dst && a_dst->data.ptr) {
60781
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
60782
  }
60783
  if (a_src && a_src->data.ptr) {
60784
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
60785
  }
60786
60787
  return status;
60788
}
60789
60790
// -------- func json.decoder.decode_inf_nan
60791
60792
WUFFS_BASE__GENERATED_C_CODE
60793
static wuffs_base__status
60794
wuffs_json__decoder__decode_inf_nan(
60795
    wuffs_json__decoder* self,
60796
    wuffs_base__token_buffer* a_dst,
60797
    wuffs_base__io_buffer* a_src) {
60798
  wuffs_base__status status = wuffs_base__make_status(NULL);
60799
60800
  uint32_t v_c32 = 0;
60801
  uint32_t v_neg = 0;
60802
60803
  wuffs_base__token* iop_a_dst = NULL;
60804
  wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
60805
  wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
60806
  wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
60807
  if (a_dst && a_dst->data.ptr) {
60808
    io0_a_dst = a_dst->data.ptr;
60809
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
60810
    iop_a_dst = io1_a_dst;
60811
    io2_a_dst = io0_a_dst + a_dst->data.len;
60812
    if (a_dst->meta.closed) {
60813
      io2_a_dst = iop_a_dst;
60814
    }
60815
  }
60816
  const uint8_t* iop_a_src = NULL;
60817
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
60818
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
60819
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
60820
  if (a_src && a_src->data.ptr) {
60821
    io0_a_src = a_src->data.ptr;
60822
    io1_a_src = io0_a_src + a_src->meta.ri;
60823
    iop_a_src = io1_a_src;
60824
    io2_a_src = io0_a_src + a_src->meta.wi;
60825
  }
60826
60827
  uint32_t coro_susp_point = self->private_impl.p_decode_inf_nan;
60828
  switch (coro_susp_point) {
60829
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
60830
60831
    while (true) {
60832
      if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
60833
        status = wuffs_base__make_status(wuffs_base__suspension__short_write);
60834
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
60835
        continue;
60836
      }
60837
      if (((uint64_t)(io2_a_src - iop_a_src)) <= 2u) {
60838
        if (a_src && a_src->meta.closed) {
60839
          status = wuffs_base__make_status(wuffs_json__error__bad_input);
60840
          goto exit;
60841
        }
60842
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
60843
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2);
60844
        continue;
60845
      }
60846
      v_c32 = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src)));
60847
      if ((v_c32 | 2105376u) == 6712937u) {
60848
        if (((uint64_t)(io2_a_src - iop_a_src)) > 7u) {
60849
          if ((wuffs_base__peek_u64le__no_bounds_check(iop_a_src) | 2314885530818453536u) == 8751735898823356009u) {
60850
            *iop_a_dst++ = wuffs_base__make_token(
60851
                (((uint64_t)(10485792u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
60852
                (((uint64_t)(8u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
60853
            iop_a_src += 8u;
60854
            status = wuffs_base__make_status(NULL);
60855
            goto ok;
60856
          }
60857
        } else if ( ! (a_src && a_src->meta.closed)) {
60858
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
60859
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3);
60860
          continue;
60861
        }
60862
        *iop_a_dst++ = wuffs_base__make_token(
60863
            (((uint64_t)(10485792u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
60864
            (((uint64_t)(3u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
60865
        iop_a_src += 3u;
60866
        status = wuffs_base__make_status(NULL);
60867
        goto ok;
60868
      } else if ((v_c32 | 2105376u) == 7233902u) {
60869
        *iop_a_dst++ = wuffs_base__make_token(
60870
            (((uint64_t)(10485888u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
60871
            (((uint64_t)(3u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
60872
        iop_a_src += 3u;
60873
        status = wuffs_base__make_status(NULL);
60874
        goto ok;
60875
      } else if ((v_c32 & 255u) == 43u) {
60876
        v_neg = 0u;
60877
      } else if ((v_c32 & 255u) == 45u) {
60878
        v_neg = 1u;
60879
      } else {
60880
        status = wuffs_base__make_status(wuffs_json__error__bad_input);
60881
        goto exit;
60882
      }
60883
      if (((uint64_t)(io2_a_src - iop_a_src)) <= 3u) {
60884
        if (a_src && a_src->meta.closed) {
60885
          status = wuffs_base__make_status(wuffs_json__error__bad_input);
60886
          goto exit;
60887
        }
60888
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
60889
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4);
60890
        continue;
60891
      }
60892
      v_c32 = (wuffs_base__peek_u32le__no_bounds_check(iop_a_src) >> 8u);
60893
      if ((v_c32 | 2105376u) == 6712937u) {
60894
        if (((uint64_t)(io2_a_src - iop_a_src)) > 8u) {
60895
          if ((wuffs_base__peek_u64le__no_bounds_check(iop_a_src + 1u) | 2314885530818453536u) == 8751735898823356009u) {
60896
            *iop_a_dst++ = wuffs_base__make_token(
60897
                (((uint64_t)((10485760u | (((uint32_t)(32u)) >> v_neg)))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
60898
                (((uint64_t)(9u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
60899
            iop_a_src += 9u;
60900
            status = wuffs_base__make_status(NULL);
60901
            goto ok;
60902
          }
60903
        } else if ( ! (a_src && a_src->meta.closed)) {
60904
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
60905
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5);
60906
          continue;
60907
        }
60908
        *iop_a_dst++ = wuffs_base__make_token(
60909
            (((uint64_t)((10485760u | (((uint32_t)(32u)) >> v_neg)))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
60910
            (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
60911
        iop_a_src += 4u;
60912
        status = wuffs_base__make_status(NULL);
60913
        goto ok;
60914
      } else if ((v_c32 | 2105376u) == 7233902u) {
60915
        *iop_a_dst++ = wuffs_base__make_token(
60916
            (((uint64_t)((10485760u | (((uint32_t)(128u)) >> v_neg)))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
60917
            (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
60918
        iop_a_src += 4u;
60919
        status = wuffs_base__make_status(NULL);
60920
        goto ok;
60921
      }
60922
      status = wuffs_base__make_status(wuffs_json__error__bad_input);
60923
      goto exit;
60924
    }
60925
60926
    ok:
60927
    self->private_impl.p_decode_inf_nan = 0;
60928
    goto exit;
60929
  }
60930
60931
  goto suspend;
60932
  suspend:
60933
  self->private_impl.p_decode_inf_nan = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
60934
60935
  goto exit;
60936
  exit:
60937
  if (a_dst && a_dst->data.ptr) {
60938
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
60939
  }
60940
  if (a_src && a_src->data.ptr) {
60941
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
60942
  }
60943
60944
  return status;
60945
}
60946
60947
// -------- func json.decoder.decode_trailer
60948
60949
WUFFS_BASE__GENERATED_C_CODE
60950
static wuffs_base__status
60951
wuffs_json__decoder__decode_trailer(
60952
    wuffs_json__decoder* self,
60953
    wuffs_base__token_buffer* a_dst,
60954
    wuffs_base__io_buffer* a_src) {
60955
  wuffs_base__status status = wuffs_base__make_status(NULL);
60956
60957
  uint8_t v_c8 = 0;
60958
  uint32_t v_whitespace_length = 0;
60959
60960
  wuffs_base__token* iop_a_dst = NULL;
60961
  wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
60962
  wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
60963
  wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
60964
  if (a_dst && a_dst->data.ptr) {
60965
    io0_a_dst = a_dst->data.ptr;
60966
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
60967
    iop_a_dst = io1_a_dst;
60968
    io2_a_dst = io0_a_dst + a_dst->data.len;
60969
    if (a_dst->meta.closed) {
60970
      io2_a_dst = iop_a_dst;
60971
    }
60972
  }
60973
  const uint8_t* iop_a_src = NULL;
60974
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
60975
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
60976
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
60977
  if (a_src && a_src->data.ptr) {
60978
    io0_a_src = a_src->data.ptr;
60979
    io1_a_src = io0_a_src + a_src->meta.ri;
60980
    iop_a_src = io1_a_src;
60981
    io2_a_src = io0_a_src + a_src->meta.wi;
60982
  }
60983
60984
  uint32_t coro_susp_point = self->private_impl.p_decode_trailer;
60985
  switch (coro_susp_point) {
60986
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
60987
60988
    if (self->private_impl.f_quirks[18u]) {
60989
      self->private_impl.f_trailer_stop = 10u;
60990
    } else {
60991
      self->private_impl.f_trailer_stop = 0u;
60992
    }
60993
    label__outer__continue:;
60994
    while (true) {
60995
      if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
60996
        status = wuffs_base__make_status(wuffs_base__suspension__short_write);
60997
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
60998
        continue;
60999
      }
61000
      v_whitespace_length = 0u;
61001
      while (true) {
61002
        if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
61003
          if (v_whitespace_length > 0u) {
61004
            *iop_a_dst++ = wuffs_base__make_token(
61005
                (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
61006
                (((uint64_t)(v_whitespace_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
61007
          }
61008
          if (a_src && a_src->meta.closed) {
61009
            goto label__outer__break;
61010
          }
61011
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
61012
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2);
61013
          goto label__outer__continue;
61014
        }
61015
        v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
61016
        if (WUFFS_JSON__LUT_CLASSES[v_c8] != 0u) {
61017
          if (v_whitespace_length > 0u) {
61018
            *iop_a_dst++ = wuffs_base__make_token(
61019
                (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
61020
                (((uint64_t)(v_whitespace_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
61021
          }
61022
          if (self->private_impl.f_trailer_stop > 0u) {
61023
            status = wuffs_base__make_status(wuffs_json__error__bad_input);
61024
            goto exit;
61025
          }
61026
          if (a_dst) {
61027
            a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
61028
          }
61029
          if (a_src) {
61030
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
61031
          }
61032
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
61033
          status = wuffs_json__decoder__decode_comment(self, a_dst, a_src);
61034
          if (a_dst) {
61035
            iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
61036
          }
61037
          if (a_src) {
61038
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
61039
          }
61040
          if (status.repr) {
61041
            goto suspend;
61042
          }
61043
          if (self->private_impl.f_comment_type > 0u) {
61044
            goto label__outer__continue;
61045
          }
61046
          status = wuffs_base__make_status(NULL);
61047
          goto ok;
61048
        }
61049
        iop_a_src += 1u;
61050
        if ((v_whitespace_length >= 65534u) || (v_c8 == self->private_impl.f_trailer_stop)) {
61051
          *iop_a_dst++ = wuffs_base__make_token(
61052
              (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
61053
              (((uint64_t)((v_whitespace_length + 1u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
61054
          if (v_c8 == self->private_impl.f_trailer_stop) {
61055
            status = wuffs_base__make_status(NULL);
61056
            goto ok;
61057
          }
61058
          goto label__outer__continue;
61059
        }
61060
        v_whitespace_length += 1u;
61061
      }
61062
    }
61063
    label__outer__break:;
61064
61065
    ok:
61066
    self->private_impl.p_decode_trailer = 0;
61067
    goto exit;
61068
  }
61069
61070
  goto suspend;
61071
  suspend:
61072
  self->private_impl.p_decode_trailer = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
61073
61074
  goto exit;
61075
  exit:
61076
  if (a_dst && a_dst->data.ptr) {
61077
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
61078
  }
61079
  if (a_src && a_src->data.ptr) {
61080
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
61081
  }
61082
61083
  return status;
61084
}
61085
61086
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JSON)
61087
61088
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZMA)
61089
61090
// ---------------- Status Codes Implementations
61091
61092
const char wuffs_lzma__error__bad_lzma2_header[] = "#lzma: bad LZMA2 header";
61093
const char wuffs_lzma__error__bad_bitstream_trailer[] = "#lzma: bad bitstream trailer";
61094
const char wuffs_lzma__error__bad_code[] = "#lzma: bad code";
61095
const char wuffs_lzma__error__bad_decoded_length[] = "#lzma: bad decoded length";
61096
const char wuffs_lzma__error__bad_distance[] = "#lzma: bad distance";
61097
const char wuffs_lzma__error__bad_header[] = "#lzma: bad header";
61098
const char wuffs_lzma__error__truncated_input[] = "#lzma: truncated input";
61099
const char wuffs_lzma__error__unsupported_decoded_length[] = "#lzma: unsupported decoded length";
61100
const char wuffs_lzma__error__unsupported_properties[] = "#lzma: unsupported properties";
61101
const char wuffs_lzma__error__internal_error_inconsistent_i_o[] = "#lzma: internal error: inconsistent I/O";
61102
const char wuffs_lzma__error__internal_error_inconsistent_dictionary_state[] = "#lzma: internal error: inconsistent dictionary state";
61103
61104
// ---------------- Private Consts
61105
61106
static const uint8_t
61107
WUFFS_LZMA__STATE_TRANSITION_LITERAL[12] WUFFS_BASE__POTENTIALLY_UNUSED = {
61108
  0u, 0u, 0u, 0u, 1u, 2u, 3u, 4u,
61109
  5u, 6u, 4u, 5u,
61110
};
61111
61112
static const uint8_t
61113
WUFFS_LZMA__STATE_TRANSITION_MATCH[12] WUFFS_BASE__POTENTIALLY_UNUSED = {
61114
  7u, 7u, 7u, 7u, 7u, 7u, 7u, 10u,
61115
  10u, 10u, 10u, 10u,
61116
};
61117
61118
static const uint8_t
61119
WUFFS_LZMA__STATE_TRANSITION_LONGREP[12] WUFFS_BASE__POTENTIALLY_UNUSED = {
61120
  8u, 8u, 8u, 8u, 8u, 8u, 8u, 11u,
61121
  11u, 11u, 11u, 11u,
61122
};
61123
61124
static const uint8_t
61125
WUFFS_LZMA__STATE_TRANSITION_SHORTREP[12] WUFFS_BASE__POTENTIALLY_UNUSED = {
61126
  9u, 9u, 9u, 9u, 9u, 9u, 9u, 11u,
61127
  11u, 11u, 11u, 11u,
61128
};
61129
61130
static const uint8_t
61131
WUFFS_LZMA__CLAMP_NO_MORE_THAN_3[8] WUFFS_BASE__POTENTIALLY_UNUSED = {
61132
  0u, 1u, 2u, 3u, 3u, 3u, 3u, 3u,
61133
};
61134
61135
#define WUFFS_LZMA__QUIRKS_BASE 1290294272u
61136
61137
// ---------------- Private Initializer Prototypes
61138
61139
// ---------------- Private Function Prototypes
61140
61141
WUFFS_BASE__GENERATED_C_CODE
61142
static wuffs_base__status
61143
wuffs_lzma__decoder__decode_bitstream_fast(
61144
    wuffs_lzma__decoder* self,
61145
    wuffs_base__io_buffer* a_dst,
61146
    wuffs_base__io_buffer* a_src,
61147
    wuffs_base__slice_u8 a_workbuf);
61148
61149
WUFFS_BASE__GENERATED_C_CODE
61150
static wuffs_base__status
61151
wuffs_lzma__decoder__decode_bitstream_slow(
61152
    wuffs_lzma__decoder* self,
61153
    wuffs_base__io_buffer* a_dst,
61154
    wuffs_base__io_buffer* a_src,
61155
    wuffs_base__slice_u8 a_workbuf);
61156
61157
WUFFS_BASE__GENERATED_C_CODE
61158
static wuffs_base__status
61159
wuffs_lzma__decoder__add_history(
61160
    wuffs_lzma__decoder* self,
61161
    wuffs_base__slice_u8 a_hist,
61162
    wuffs_base__slice_u8 a_workbuf);
61163
61164
WUFFS_BASE__GENERATED_C_CODE
61165
static wuffs_base__status
61166
wuffs_lzma__decoder__do_transform_io(
61167
    wuffs_lzma__decoder* self,
61168
    wuffs_base__io_buffer* a_dst,
61169
    wuffs_base__io_buffer* a_src,
61170
    wuffs_base__slice_u8 a_workbuf);
61171
61172
WUFFS_BASE__GENERATED_C_CODE
61173
static wuffs_base__status
61174
wuffs_lzma__decoder__decode_bitstream(
61175
    wuffs_lzma__decoder* self,
61176
    wuffs_base__io_buffer* a_dst,
61177
    wuffs_base__io_buffer* a_src,
61178
    wuffs_base__slice_u8 a_workbuf);
61179
61180
WUFFS_BASE__GENERATED_C_CODE
61181
static wuffs_base__status
61182
wuffs_lzma__decoder__update_stashed_bytes(
61183
    wuffs_lzma__decoder* self,
61184
    wuffs_base__io_buffer* a_dst,
61185
    wuffs_base__slice_u8 a_workbuf);
61186
61187
WUFFS_BASE__GENERATED_C_CODE
61188
static wuffs_base__status
61189
wuffs_lzma__decoder__decode_optional_end_of_stream(
61190
    wuffs_lzma__decoder* self,
61191
    wuffs_base__io_buffer* a_src,
61192
    wuffs_base__slice_u8 a_workbuf);
61193
61194
WUFFS_BASE__GENERATED_C_CODE
61195
static wuffs_base__empty_struct
61196
wuffs_lzma__decoder__initialize_dict(
61197
    wuffs_lzma__decoder* self);
61198
61199
WUFFS_BASE__GENERATED_C_CODE
61200
static wuffs_base__empty_struct
61201
wuffs_lzma__decoder__initialize_probs(
61202
    wuffs_lzma__decoder* self);
61203
61204
// ---------------- VTables
61205
61206
const wuffs_base__io_transformer__func_ptrs
61207
wuffs_lzma__decoder__func_ptrs_for__wuffs_base__io_transformer = {
61208
  (wuffs_base__optional_u63(*)(const void*))(&wuffs_lzma__decoder__dst_history_retain_length),
61209
  (uint64_t(*)(const void*,
61210
      uint32_t))(&wuffs_lzma__decoder__get_quirk),
61211
  (wuffs_base__status(*)(void*,
61212
      uint32_t,
61213
      uint64_t))(&wuffs_lzma__decoder__set_quirk),
61214
  (wuffs_base__status(*)(void*,
61215
      wuffs_base__io_buffer*,
61216
      wuffs_base__io_buffer*,
61217
      wuffs_base__slice_u8))(&wuffs_lzma__decoder__transform_io),
61218
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_lzma__decoder__workbuf_len),
61219
};
61220
61221
// ---------------- Initializer Implementations
61222
61223
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
61224
wuffs_lzma__decoder__initialize(
61225
    wuffs_lzma__decoder* self,
61226
    size_t sizeof_star_self,
61227
    uint64_t wuffs_version,
61228
    uint32_t options){
61229
  if (!self) {
61230
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
61231
  }
61232
  if (sizeof(*self) != sizeof_star_self) {
61233
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
61234
  }
61235
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
61236
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
61237
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
61238
  }
61239
61240
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
61241
    // The whole point of this if-check is to detect an uninitialized *self.
61242
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
61243
#if !defined(__clang__) && defined(__GNUC__)
61244
#pragma GCC diagnostic push
61245
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
61246
#endif
61247
    if (self->private_impl.magic != 0) {
61248
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
61249
    }
61250
#if !defined(__clang__) && defined(__GNUC__)
61251
#pragma GCC diagnostic pop
61252
#endif
61253
  } else {
61254
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
61255
      memset(self, 0, sizeof(*self));
61256
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
61257
    } else {
61258
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
61259
    }
61260
  }
61261
61262
  self->private_impl.magic = WUFFS_BASE__MAGIC;
61263
  self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name =
61264
      wuffs_base__io_transformer__vtable_name;
61265
  self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers =
61266
      (const void*)(&wuffs_lzma__decoder__func_ptrs_for__wuffs_base__io_transformer);
61267
  return wuffs_base__make_status(NULL);
61268
}
61269
61270
wuffs_lzma__decoder*
61271
wuffs_lzma__decoder__alloc(void) {
61272
  wuffs_lzma__decoder* x =
61273
      (wuffs_lzma__decoder*)(calloc(1, sizeof(wuffs_lzma__decoder)));
61274
  if (!x) {
61275
    return NULL;
61276
  }
61277
  if (wuffs_lzma__decoder__initialize(
61278
      x, sizeof(wuffs_lzma__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
61279
    free(x);
61280
    return NULL;
61281
  }
61282
  return x;
61283
}
61284
61285
size_t
61286
sizeof__wuffs_lzma__decoder(void) {
61287
  return sizeof(wuffs_lzma__decoder);
61288
}
61289
61290
// ---------------- Function Implementations
61291
61292
// -------- func lzma.decoder.decode_bitstream_fast
61293
61294
WUFFS_BASE__GENERATED_C_CODE
61295
static wuffs_base__status
61296
wuffs_lzma__decoder__decode_bitstream_fast(
61297
    wuffs_lzma__decoder* self,
61298
    wuffs_base__io_buffer* a_dst,
61299
    wuffs_base__io_buffer* a_src,
61300
    wuffs_base__slice_u8 a_workbuf) {
61301
  wuffs_base__status status = wuffs_base__make_status(NULL);
61302
61303
  uint8_t v_c8 = 0;
61304
  uint32_t v_bits = 0;
61305
  uint32_t v_range = 0;
61306
  uint32_t v_state = 0;
61307
  uint32_t v_rep0 = 0;
61308
  uint32_t v_rep1 = 0;
61309
  uint32_t v_rep2 = 0;
61310
  uint32_t v_rep3 = 0;
61311
  uint32_t v_reptmp = 0;
61312
  uint32_t v_rep = 0;
61313
  uint64_t v_pos = 0;
61314
  uint64_t v_pos_end = 0;
61315
  uint32_t v_lc = 0;
61316
  uint64_t v_lp_mask = 0;
61317
  uint64_t v_pb_mask = 0;
61318
  uint32_t v_prob = 0;
61319
  uint32_t v_threshold = 0;
61320
  uint32_t v_tree_node = 0;
61321
  uint8_t v_prev_byte = 0;
61322
  uint32_t v_match_byte = 0;
61323
  uint32_t v_match_cusp = 0;
61324
  uint32_t v_len_state = 0;
61325
  uint32_t v_slot = 0;
61326
  uint32_t v_len = 0;
61327
  uint32_t v_lanl_offset = 0;
61328
  uint32_t v_lanl_old_offset = 0;
61329
  uint32_t v_lanl_index = 0;
61330
  uint32_t v_num_extra_bits = 0;
61331
  uint32_t v_dist_extra_bits = 0;
61332
  uint32_t v_high_bit_was_on = 0;
61333
  uint32_t v_i = 0;
61334
  uint32_t v_index_ao00 = 0;
61335
  uint32_t v_index_ao41 = 0;
61336
  uint32_t v_index_lit = 0;
61337
  uint32_t v_index_len = 0;
61338
  uint32_t v_index_small_dist_base = 0;
61339
  uint32_t v_index_small_dist_extra = 0;
61340
  uint32_t v_index_small_dist = 0;
61341
  uint32_t v_index_large_dist = 0;
61342
  uint32_t v_dist = 0;
61343
  uint32_t v_adj_dist = 0;
61344
  uint64_t v_wb_index = 0;
61345
61346
  uint8_t* iop_a_dst = NULL;
61347
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
61348
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
61349
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
61350
  if (a_dst && a_dst->data.ptr) {
61351
    io0_a_dst = a_dst->data.ptr;
61352
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
61353
    iop_a_dst = io1_a_dst;
61354
    io2_a_dst = io0_a_dst + a_dst->data.len;
61355
    if (a_dst->meta.closed) {
61356
      io2_a_dst = iop_a_dst;
61357
    }
61358
  }
61359
  const uint8_t* iop_a_src = NULL;
61360
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
61361
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
61362
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
61363
  if (a_src && a_src->data.ptr) {
61364
    io0_a_src = a_src->data.ptr;
61365
    io1_a_src = io0_a_src + a_src->meta.ri;
61366
    iop_a_src = io1_a_src;
61367
    io2_a_src = io0_a_src + a_src->meta.wi;
61368
  }
61369
61370
  v_prev_byte = self->private_impl.f_stashed_bytes[0u];
61371
  v_match_byte = ((uint32_t)(self->private_impl.f_stashed_bytes[1u]));
61372
  v_bits = self->private_impl.f_stashed_bits;
61373
  v_range = self->private_impl.f_stashed_range;
61374
  v_state = self->private_impl.f_stashed_state;
61375
  v_rep0 = self->private_impl.f_stashed_rep0;
61376
  v_rep1 = self->private_impl.f_stashed_rep1;
61377
  v_rep2 = self->private_impl.f_stashed_rep2;
61378
  v_rep3 = self->private_impl.f_stashed_rep3;
61379
  v_pos = self->private_impl.f_stashed_pos;
61380
  v_pos_end = self->private_impl.f_stashed_pos_end;
61381
  v_lc = self->private_impl.f_lc;
61382
  v_lp_mask = ((((uint64_t)(1u)) << self->private_impl.f_lp) - 1u);
61383
  v_pb_mask = ((((uint64_t)(1u)) << self->private_impl.f_pb) - 1u);
61384
  while ((((uint64_t)(io2_a_dst - iop_a_dst)) >= 282u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 48u)) {
61385
    if (v_pos >= v_pos_end) {
61386
      self->private_impl.f_end_of_chunk = true;
61387
      break;
61388
    }
61389
    v_index_ao00 = ((v_state << 4u) | ((uint32_t)((v_pos & v_pb_mask))));
61390
    v_prob = ((uint32_t)(self->private_data.f_probs_ao00[v_index_ao00]));
61391
    v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
61392
    if (v_bits < v_threshold) {
61393
      v_range = v_threshold;
61394
      v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
61395
      self->private_data.f_probs_ao00[v_index_ao00] = ((uint16_t)(v_prob));
61396
      if ((v_range >> 24u) == 0u) {
61397
        v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
61398
        iop_a_src += 1u;
61399
        v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61400
        v_range <<= 8u;
61401
      }
61402
      v_index_lit = (15u & ((((uint32_t)((v_pos & v_lp_mask))) << v_lc) | (((uint32_t)(v_prev_byte)) >> (8u - v_lc))));
61403
      v_lanl_offset = 0u;
61404
      if (v_state >= 7u) {
61405
        v_lanl_offset = 256u;
61406
      }
61407
      v_tree_node = 1u;
61408
      while (v_tree_node < 256u) {
61409
        v_match_byte <<= 1u;
61410
        v_lanl_old_offset = v_lanl_offset;
61411
        v_lanl_offset &= v_match_byte;
61412
        v_lanl_index = (v_lanl_offset + v_lanl_old_offset + v_tree_node);
61413
        v_prob = ((uint32_t)(self->private_data.f_probs_lit[v_index_lit][v_lanl_index]));
61414
        v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
61415
        if (v_bits < v_threshold) {
61416
          v_lanl_offset = ((v_lanl_offset ^ v_lanl_old_offset) & 256u);
61417
          v_range = v_threshold;
61418
          v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
61419
          self->private_data.f_probs_lit[v_index_lit][v_lanl_index] = ((uint16_t)(v_prob));
61420
          v_tree_node = (v_tree_node << 1u);
61421
        } else {
61422
          v_bits -= v_threshold;
61423
          v_range -= v_threshold;
61424
          v_prob -= (v_prob >> 5u);
61425
          self->private_data.f_probs_lit[v_index_lit][v_lanl_index] = ((uint16_t)(v_prob));
61426
          v_tree_node = ((v_tree_node << 1u) | 1u);
61427
        }
61428
        if ((v_range >> 24u) == 0u) {
61429
          if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
61430
            status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
61431
            goto exit;
61432
          }
61433
          v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
61434
          iop_a_src += 1u;
61435
          v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61436
          v_range <<= 8u;
61437
        }
61438
      }
61439
      v_prev_byte = ((uint8_t)(v_tree_node));
61440
      (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, v_prev_byte), iop_a_dst += 1);
61441
      v_pos += 1u;
61442
      v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_LITERAL[v_state]));
61443
      continue;
61444
    }
61445
    v_bits -= v_threshold;
61446
    v_range -= v_threshold;
61447
    v_prob -= (v_prob >> 5u);
61448
    self->private_data.f_probs_ao00[v_index_ao00] = ((uint16_t)(v_prob));
61449
    if ((v_range >> 24u) == 0u) {
61450
      v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
61451
      iop_a_src += 1u;
61452
      v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61453
      v_range <<= 8u;
61454
    } else {
61455
    }
61456
    do {
61457
      v_prob = ((uint32_t)(self->private_data.f_probs_ao20[v_state]));
61458
      v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
61459
      if (v_bits < v_threshold) {
61460
        v_range = v_threshold;
61461
        v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
61462
        self->private_data.f_probs_ao20[v_state] = ((uint16_t)(v_prob));
61463
        if ((v_range >> 24u) == 0u) {
61464
          v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
61465
          iop_a_src += 1u;
61466
          v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61467
          v_range <<= 8u;
61468
        } else {
61469
        }
61470
        do {
61471
          v_prob = ((uint32_t)(self->private_data.f_probs_match_len_low[0u][0u]));
61472
          v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
61473
          if (v_bits < v_threshold) {
61474
            v_range = v_threshold;
61475
            v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
61476
            self->private_data.f_probs_match_len_low[0u][0u] = ((uint16_t)(v_prob));
61477
            if ((v_range >> 24u) == 0u) {
61478
              v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
61479
              iop_a_src += 1u;
61480
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61481
              v_range <<= 8u;
61482
            }
61483
            v_index_len = ((uint32_t)((v_pos & v_pb_mask)));
61484
            v_tree_node = 1u;
61485
            while (v_tree_node < 8u) {
61486
              v_prob = ((uint32_t)(self->private_data.f_probs_match_len_low[v_index_len][v_tree_node]));
61487
              v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
61488
              if (v_bits < v_threshold) {
61489
                v_range = v_threshold;
61490
                v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
61491
                self->private_data.f_probs_match_len_low[v_index_len][v_tree_node] = ((uint16_t)(v_prob));
61492
                v_tree_node = (v_tree_node << 1u);
61493
              } else {
61494
                v_bits -= v_threshold;
61495
                v_range -= v_threshold;
61496
                v_prob -= (v_prob >> 5u);
61497
                self->private_data.f_probs_match_len_low[v_index_len][v_tree_node] = ((uint16_t)(v_prob));
61498
                v_tree_node = ((v_tree_node << 1u) | 1u);
61499
              }
61500
              if ((v_range >> 24u) == 0u) {
61501
                if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
61502
                  status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
61503
                  goto exit;
61504
                }
61505
                v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
61506
                iop_a_src += 1u;
61507
                v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61508
                v_range <<= 8u;
61509
              }
61510
            }
61511
            v_len_state = ((uint32_t)(WUFFS_LZMA__CLAMP_NO_MORE_THAN_3[(v_tree_node & 7u)]));
61512
            v_len = ((v_tree_node & 7u) + 2u);
61513
            break;
61514
          }
61515
          v_bits -= v_threshold;
61516
          v_range -= v_threshold;
61517
          v_prob -= (v_prob >> 5u);
61518
          self->private_data.f_probs_match_len_low[0u][0u] = ((uint16_t)(v_prob));
61519
          if ((v_range >> 24u) == 0u) {
61520
            if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
61521
              status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
61522
              goto exit;
61523
            }
61524
            v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
61525
            iop_a_src += 1u;
61526
            v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61527
            v_range <<= 8u;
61528
          }
61529
          v_prob = ((uint32_t)(self->private_data.f_probs_match_len_mid[0u][0u]));
61530
          v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
61531
          if (v_bits < v_threshold) {
61532
            v_range = v_threshold;
61533
            v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
61534
            self->private_data.f_probs_match_len_mid[0u][0u] = ((uint16_t)(v_prob));
61535
            if ((v_range >> 24u) == 0u) {
61536
              if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
61537
                status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
61538
                goto exit;
61539
              }
61540
              v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
61541
              iop_a_src += 1u;
61542
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61543
              v_range <<= 8u;
61544
            }
61545
            v_index_len = ((uint32_t)((v_pos & v_pb_mask)));
61546
            v_tree_node = 1u;
61547
            while (v_tree_node < 8u) {
61548
              v_prob = ((uint32_t)(self->private_data.f_probs_match_len_mid[v_index_len][v_tree_node]));
61549
              v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
61550
              if (v_bits < v_threshold) {
61551
                v_range = v_threshold;
61552
                v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
61553
                self->private_data.f_probs_match_len_mid[v_index_len][v_tree_node] = ((uint16_t)(v_prob));
61554
                v_tree_node = (v_tree_node << 1u);
61555
              } else {
61556
                v_bits -= v_threshold;
61557
                v_range -= v_threshold;
61558
                v_prob -= (v_prob >> 5u);
61559
                self->private_data.f_probs_match_len_mid[v_index_len][v_tree_node] = ((uint16_t)(v_prob));
61560
                v_tree_node = ((v_tree_node << 1u) | 1u);
61561
              }
61562
              if ((v_range >> 24u) == 0u) {
61563
                if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
61564
                  status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
61565
                  goto exit;
61566
                }
61567
                v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
61568
                iop_a_src += 1u;
61569
                v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61570
                v_range <<= 8u;
61571
              }
61572
            }
61573
            v_len = ((v_tree_node & 7u) + 10u);
61574
            v_len_state = 3u;
61575
            break;
61576
          }
61577
          v_bits -= v_threshold;
61578
          v_range -= v_threshold;
61579
          v_prob -= (v_prob >> 5u);
61580
          self->private_data.f_probs_match_len_mid[0u][0u] = ((uint16_t)(v_prob));
61581
          if ((v_range >> 24u) == 0u) {
61582
            if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
61583
              status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
61584
              goto exit;
61585
            }
61586
            v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
61587
            iop_a_src += 1u;
61588
            v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61589
            v_range <<= 8u;
61590
          }
61591
          v_tree_node = 1u;
61592
          while (v_tree_node < 256u) {
61593
            v_prob = ((uint32_t)(self->private_data.f_probs_match_len_high[0u][v_tree_node]));
61594
            v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
61595
            if (v_bits < v_threshold) {
61596
              v_range = v_threshold;
61597
              v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
61598
              self->private_data.f_probs_match_len_high[0u][v_tree_node] = ((uint16_t)(v_prob));
61599
              v_tree_node = (v_tree_node << 1u);
61600
            } else {
61601
              v_bits -= v_threshold;
61602
              v_range -= v_threshold;
61603
              v_prob -= (v_prob >> 5u);
61604
              self->private_data.f_probs_match_len_high[0u][v_tree_node] = ((uint16_t)(v_prob));
61605
              v_tree_node = ((v_tree_node << 1u) | 1u);
61606
            }
61607
            if ((v_range >> 24u) == 0u) {
61608
              if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
61609
                status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
61610
                goto exit;
61611
              }
61612
              v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
61613
              iop_a_src += 1u;
61614
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61615
              v_range <<= 8u;
61616
            }
61617
          }
61618
          v_len = ((v_tree_node & 255u) + 18u);
61619
          v_len_state = 3u;
61620
        } while (0);
61621
        v_slot = 1u;
61622
        while (v_slot < 64u) {
61623
          v_prob = ((uint32_t)(self->private_data.f_probs_slot[v_len_state][v_slot]));
61624
          v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
61625
          if (v_bits < v_threshold) {
61626
            v_range = v_threshold;
61627
            v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
61628
            self->private_data.f_probs_slot[v_len_state][v_slot] = ((uint16_t)(v_prob));
61629
            v_slot = (v_slot << 1u);
61630
          } else {
61631
            v_bits -= v_threshold;
61632
            v_range -= v_threshold;
61633
            v_prob -= (v_prob >> 5u);
61634
            self->private_data.f_probs_slot[v_len_state][v_slot] = ((uint16_t)(v_prob));
61635
            v_slot = ((v_slot << 1u) | 1u);
61636
          }
61637
          if ((v_range >> 24u) == 0u) {
61638
            if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
61639
              status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
61640
              goto exit;
61641
            }
61642
            v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
61643
            iop_a_src += 1u;
61644
            v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61645
            v_range <<= 8u;
61646
          }
61647
        }
61648
        v_slot &= 63u;
61649
        v_rep = v_slot;
61650
        if (v_slot < 4u) {
61651
        } else if (v_slot < 14u) {
61652
          v_num_extra_bits = ((v_slot >> 1u) - 1u);
61653
          v_rep = ((2u | (v_slot & 1u)) << v_num_extra_bits);
61654
          v_index_small_dist_base = ((uint32_t)(v_rep - v_slot));
61655
          v_index_small_dist_extra = 1u;
61656
          v_dist_extra_bits = 0u;
61657
          v_i = 0u;
61658
          while (v_i < v_num_extra_bits) {
61659
            v_index_small_dist = (((uint32_t)(v_index_small_dist_base + v_index_small_dist_extra)) & 127u);
61660
            v_prob = ((uint32_t)(self->private_data.f_probs_small_dist[v_index_small_dist]));
61661
            v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
61662
            if (v_bits < v_threshold) {
61663
              v_range = v_threshold;
61664
              v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
61665
              self->private_data.f_probs_small_dist[v_index_small_dist] = ((uint16_t)(v_prob));
61666
              v_index_small_dist_extra = ((uint32_t)(v_index_small_dist_extra << 1u));
61667
              v_i += 1u;
61668
            } else {
61669
              v_bits -= v_threshold;
61670
              v_range -= v_threshold;
61671
              v_prob -= (v_prob >> 5u);
61672
              self->private_data.f_probs_small_dist[v_index_small_dist] = ((uint16_t)(v_prob));
61673
              v_index_small_dist_extra = (((uint32_t)(v_index_small_dist_extra << 1u)) | 1u);
61674
              v_dist_extra_bits |= (((uint32_t)(1u)) << v_i);
61675
              v_i += 1u;
61676
            }
61677
            if ((v_range >> 24u) == 0u) {
61678
              if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
61679
                status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
61680
                goto exit;
61681
              }
61682
              v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
61683
              iop_a_src += 1u;
61684
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61685
              v_range <<= 8u;
61686
            }
61687
          }
61688
          v_rep += v_dist_extra_bits;
61689
        } else {
61690
          v_num_extra_bits = ((v_slot >> 1u) - 1u);
61691
          v_rep = ((2u | (v_slot & 1u)) << v_num_extra_bits);
61692
          v_dist_extra_bits = 0u;
61693
          while (true) {
61694
            v_range >>= 1u;
61695
            v_bits -= v_range;
61696
            v_high_bit_was_on = ((uint32_t)(0u - (v_bits >> 31u)));
61697
            v_bits += (v_range & v_high_bit_was_on);
61698
            v_dist_extra_bits = (((uint32_t)(v_dist_extra_bits << 1u)) | (((uint32_t)(v_high_bit_was_on + 1u)) & 1u));
61699
            if ((v_range >> 24u) == 0u) {
61700
              if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
61701
                status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
61702
                goto exit;
61703
              }
61704
              v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
61705
              iop_a_src += 1u;
61706
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61707
              v_range <<= 8u;
61708
            }
61709
            v_num_extra_bits -= 1u;
61710
            if (v_num_extra_bits <= 4u) {
61711
              break;
61712
            }
61713
          }
61714
          v_dist_extra_bits <<= 4u;
61715
          v_index_large_dist = 1u;
61716
          while (true) {
61717
            v_prob = ((uint32_t)(self->private_data.f_probs_large_dist[v_index_large_dist]));
61718
            v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
61719
            if (v_bits < v_threshold) {
61720
              v_range = v_threshold;
61721
              v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
61722
              self->private_data.f_probs_large_dist[v_index_large_dist] = ((uint16_t)(v_prob));
61723
              v_index_large_dist = (15u & ((uint32_t)(v_index_large_dist << 1u)));
61724
            } else {
61725
              v_bits -= v_threshold;
61726
              v_range -= v_threshold;
61727
              v_prob -= (v_prob >> 5u);
61728
              self->private_data.f_probs_large_dist[v_index_large_dist] = ((uint16_t)(v_prob));
61729
              v_index_large_dist = (15u & (((uint32_t)(v_index_large_dist << 1u)) | 1u));
61730
              v_dist_extra_bits |= (((uint32_t)(1u)) << (4u - v_num_extra_bits));
61731
            }
61732
            if ((v_range >> 24u) == 0u) {
61733
              if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
61734
                status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
61735
                goto exit;
61736
              }
61737
              v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
61738
              iop_a_src += 1u;
61739
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61740
              v_range <<= 8u;
61741
            }
61742
            v_num_extra_bits -= 1u;
61743
            if (v_num_extra_bits <= 0u) {
61744
              break;
61745
            }
61746
          }
61747
          v_rep += v_dist_extra_bits;
61748
        }
61749
        if (v_rep >= 4294967295u) {
61750
          self->private_impl.f_end_of_chunk = true;
61751
          goto label__outer__break;
61752
        }
61753
        v_rep3 = v_rep2;
61754
        v_rep2 = v_rep1;
61755
        v_rep1 = v_rep0;
61756
        v_rep0 = v_rep;
61757
        v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_MATCH[v_state]));
61758
        break;
61759
      }
61760
      v_bits -= v_threshold;
61761
      v_range -= v_threshold;
61762
      v_prob -= (v_prob >> 5u);
61763
      self->private_data.f_probs_ao20[v_state] = ((uint16_t)(v_prob));
61764
      if ((v_range >> 24u) == 0u) {
61765
        v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
61766
        iop_a_src += 1u;
61767
        v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61768
        v_range <<= 8u;
61769
      } else {
61770
      }
61771
      v_prob = ((uint32_t)(self->private_data.f_probs_ao40[v_state]));
61772
      v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
61773
      if (v_bits < v_threshold) {
61774
        v_range = v_threshold;
61775
        v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
61776
        self->private_data.f_probs_ao40[v_state] = ((uint16_t)(v_prob));
61777
        if ((v_range >> 24u) == 0u) {
61778
          v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
61779
          iop_a_src += 1u;
61780
          v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61781
          v_range <<= 8u;
61782
        } else {
61783
        }
61784
        v_index_ao41 = ((v_state << 4u) | ((uint32_t)((v_pos & v_pb_mask))));
61785
        v_prob = ((uint32_t)(self->private_data.f_probs_ao41[v_index_ao41]));
61786
        v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
61787
        if (v_bits < v_threshold) {
61788
          v_range = v_threshold;
61789
          v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
61790
          self->private_data.f_probs_ao41[v_index_ao41] = ((uint16_t)(v_prob));
61791
          if ((v_range >> 24u) == 0u) {
61792
            v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
61793
            iop_a_src += 1u;
61794
            v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61795
            v_range <<= 8u;
61796
          }
61797
          v_len = 1u;
61798
          v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_SHORTREP[v_state]));
61799
          break;
61800
        }
61801
        v_bits -= v_threshold;
61802
        v_range -= v_threshold;
61803
        v_prob -= (v_prob >> 5u);
61804
        self->private_data.f_probs_ao41[v_index_ao41] = ((uint16_t)(v_prob));
61805
        if ((v_range >> 24u) == 0u) {
61806
          v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
61807
          iop_a_src += 1u;
61808
          v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61809
          v_range <<= 8u;
61810
        }
61811
      } else {
61812
        v_bits -= v_threshold;
61813
        v_range -= v_threshold;
61814
        v_prob -= (v_prob >> 5u);
61815
        self->private_data.f_probs_ao40[v_state] = ((uint16_t)(v_prob));
61816
        if ((v_range >> 24u) == 0u) {
61817
          v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
61818
          iop_a_src += 1u;
61819
          v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61820
          v_range <<= 8u;
61821
        } else {
61822
        }
61823
        v_prob = ((uint32_t)(self->private_data.f_probs_ao60[v_state]));
61824
        v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
61825
        if (v_bits < v_threshold) {
61826
          v_range = v_threshold;
61827
          v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
61828
          self->private_data.f_probs_ao60[v_state] = ((uint16_t)(v_prob));
61829
          if ((v_range >> 24u) == 0u) {
61830
            v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
61831
            iop_a_src += 1u;
61832
            v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61833
            v_range <<= 8u;
61834
          }
61835
          v_reptmp = v_rep1;
61836
          v_rep1 = v_rep0;
61837
          v_rep0 = v_reptmp;
61838
        } else {
61839
          v_bits -= v_threshold;
61840
          v_range -= v_threshold;
61841
          v_prob -= (v_prob >> 5u);
61842
          self->private_data.f_probs_ao60[v_state] = ((uint16_t)(v_prob));
61843
          if ((v_range >> 24u) == 0u) {
61844
            v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
61845
            iop_a_src += 1u;
61846
            v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61847
            v_range <<= 8u;
61848
          } else {
61849
          }
61850
          v_prob = ((uint32_t)(self->private_data.f_probs_ao63[v_state]));
61851
          v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
61852
          if (v_bits < v_threshold) {
61853
            v_range = v_threshold;
61854
            v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
61855
            self->private_data.f_probs_ao63[v_state] = ((uint16_t)(v_prob));
61856
            if ((v_range >> 24u) == 0u) {
61857
              v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
61858
              iop_a_src += 1u;
61859
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61860
              v_range <<= 8u;
61861
            }
61862
            v_reptmp = v_rep2;
61863
            v_rep2 = v_rep1;
61864
            v_rep1 = v_rep0;
61865
            v_rep0 = v_reptmp;
61866
          } else {
61867
            v_bits -= v_threshold;
61868
            v_range -= v_threshold;
61869
            v_prob -= (v_prob >> 5u);
61870
            self->private_data.f_probs_ao63[v_state] = ((uint16_t)(v_prob));
61871
            if ((v_range >> 24u) == 0u) {
61872
              v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
61873
              iop_a_src += 1u;
61874
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61875
              v_range <<= 8u;
61876
            }
61877
            v_reptmp = v_rep3;
61878
            v_rep3 = v_rep2;
61879
            v_rep2 = v_rep1;
61880
            v_rep1 = v_rep0;
61881
            v_rep0 = v_reptmp;
61882
          }
61883
        }
61884
      }
61885
      do {
61886
        v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_low[0u][0u]));
61887
        v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
61888
        if (v_bits < v_threshold) {
61889
          v_range = v_threshold;
61890
          v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
61891
          self->private_data.f_probs_longrep_len_low[0u][0u] = ((uint16_t)(v_prob));
61892
          if ((v_range >> 24u) == 0u) {
61893
            if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
61894
              status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
61895
              goto exit;
61896
            }
61897
            v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
61898
            iop_a_src += 1u;
61899
            v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61900
            v_range <<= 8u;
61901
          }
61902
          v_index_len = ((uint32_t)((v_pos & v_pb_mask)));
61903
          v_tree_node = 1u;
61904
          while (v_tree_node < 8u) {
61905
            v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_low[v_index_len][v_tree_node]));
61906
            v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
61907
            if (v_bits < v_threshold) {
61908
              v_range = v_threshold;
61909
              v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
61910
              self->private_data.f_probs_longrep_len_low[v_index_len][v_tree_node] = ((uint16_t)(v_prob));
61911
              v_tree_node = (v_tree_node << 1u);
61912
            } else {
61913
              v_bits -= v_threshold;
61914
              v_range -= v_threshold;
61915
              v_prob -= (v_prob >> 5u);
61916
              self->private_data.f_probs_longrep_len_low[v_index_len][v_tree_node] = ((uint16_t)(v_prob));
61917
              v_tree_node = ((v_tree_node << 1u) | 1u);
61918
            }
61919
            if ((v_range >> 24u) == 0u) {
61920
              if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
61921
                status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
61922
                goto exit;
61923
              }
61924
              v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
61925
              iop_a_src += 1u;
61926
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61927
              v_range <<= 8u;
61928
            }
61929
          }
61930
          v_len = ((v_tree_node & 7u) + 2u);
61931
          v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_LONGREP[v_state]));
61932
          break;
61933
        }
61934
        v_bits -= v_threshold;
61935
        v_range -= v_threshold;
61936
        v_prob -= (v_prob >> 5u);
61937
        self->private_data.f_probs_longrep_len_low[0u][0u] = ((uint16_t)(v_prob));
61938
        if ((v_range >> 24u) == 0u) {
61939
          if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
61940
            status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
61941
            goto exit;
61942
          }
61943
          v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
61944
          iop_a_src += 1u;
61945
          v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61946
          v_range <<= 8u;
61947
        }
61948
        v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_mid[0u][0u]));
61949
        v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
61950
        if (v_bits < v_threshold) {
61951
          v_range = v_threshold;
61952
          v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
61953
          self->private_data.f_probs_longrep_len_mid[0u][0u] = ((uint16_t)(v_prob));
61954
          if ((v_range >> 24u) == 0u) {
61955
            if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
61956
              status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
61957
              goto exit;
61958
            }
61959
            v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
61960
            iop_a_src += 1u;
61961
            v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61962
            v_range <<= 8u;
61963
          }
61964
          v_index_len = ((uint32_t)((v_pos & v_pb_mask)));
61965
          v_tree_node = 1u;
61966
          while (v_tree_node < 8u) {
61967
            v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_mid[v_index_len][v_tree_node]));
61968
            v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
61969
            if (v_bits < v_threshold) {
61970
              v_range = v_threshold;
61971
              v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
61972
              self->private_data.f_probs_longrep_len_mid[v_index_len][v_tree_node] = ((uint16_t)(v_prob));
61973
              v_tree_node = (v_tree_node << 1u);
61974
            } else {
61975
              v_bits -= v_threshold;
61976
              v_range -= v_threshold;
61977
              v_prob -= (v_prob >> 5u);
61978
              self->private_data.f_probs_longrep_len_mid[v_index_len][v_tree_node] = ((uint16_t)(v_prob));
61979
              v_tree_node = ((v_tree_node << 1u) | 1u);
61980
            }
61981
            if ((v_range >> 24u) == 0u) {
61982
              if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
61983
                status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
61984
                goto exit;
61985
              }
61986
              v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
61987
              iop_a_src += 1u;
61988
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61989
              v_range <<= 8u;
61990
            }
61991
          }
61992
          v_len = ((v_tree_node & 7u) + 10u);
61993
          v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_LONGREP[v_state]));
61994
          break;
61995
        }
61996
        v_bits -= v_threshold;
61997
        v_range -= v_threshold;
61998
        v_prob -= (v_prob >> 5u);
61999
        self->private_data.f_probs_longrep_len_mid[0u][0u] = ((uint16_t)(v_prob));
62000
        if ((v_range >> 24u) == 0u) {
62001
          if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
62002
            status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
62003
            goto exit;
62004
          }
62005
          v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
62006
          iop_a_src += 1u;
62007
          v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
62008
          v_range <<= 8u;
62009
        }
62010
        v_tree_node = 1u;
62011
        while (v_tree_node < 256u) {
62012
          v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_high[0u][v_tree_node]));
62013
          v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
62014
          if (v_bits < v_threshold) {
62015
            v_range = v_threshold;
62016
            v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
62017
            self->private_data.f_probs_longrep_len_high[0u][v_tree_node] = ((uint16_t)(v_prob));
62018
            v_tree_node = (v_tree_node << 1u);
62019
          } else {
62020
            v_bits -= v_threshold;
62021
            v_range -= v_threshold;
62022
            v_prob -= (v_prob >> 5u);
62023
            self->private_data.f_probs_longrep_len_high[0u][v_tree_node] = ((uint16_t)(v_prob));
62024
            v_tree_node = ((v_tree_node << 1u) | 1u);
62025
          }
62026
          if ((v_range >> 24u) == 0u) {
62027
            if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
62028
              status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
62029
              goto exit;
62030
            }
62031
            v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
62032
            iop_a_src += 1u;
62033
            v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
62034
            v_range <<= 8u;
62035
          }
62036
        }
62037
        v_len = ((v_tree_node & 255u) + 18u);
62038
        v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_LONGREP[v_state]));
62039
      } while (0);
62040
    } while (0);
62041
    v_dist = (v_rep0 + 1u);
62042
    if ((((uint64_t)(v_dist)) > v_pos) || (((uint64_t)(v_dist)) > ((uint64_t)(self->private_impl.f_dict_size)))) {
62043
      status = wuffs_base__make_status(wuffs_lzma__error__bad_distance);
62044
      goto exit;
62045
    }
62046
    v_pos += ((uint64_t)(v_len));
62047
    if (((uint64_t)(v_dist)) > ((uint64_t)(iop_a_dst - io0_a_dst))) {
62048
      v_adj_dist = ((uint32_t)((((uint64_t)(v_dist)) - ((uint64_t)(iop_a_dst - io0_a_dst)))));
62049
      if (v_adj_dist > self->private_impl.f_dict_seen) {
62050
        status = wuffs_base__make_status(wuffs_lzma__error__bad_distance);
62051
        goto exit;
62052
      }
62053
      v_wb_index = ((uint64_t)(((uint64_t)(self->private_impl.f_dict_workbuf_index)) - ((uint64_t)(v_adj_dist))));
62054
      while (v_wb_index >= 9223372036854775808u) {
62055
        v_wb_index += ((uint64_t)(self->private_impl.f_dict_size));
62056
      }
62057
      if (v_wb_index >= ((uint64_t)(a_workbuf.len))) {
62058
        status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state);
62059
        goto exit;
62060
      }
62061
      if (v_len < v_adj_dist) {
62062
        wuffs_private_impl__io_writer__limited_copy_u32_from_slice(
62063
            &iop_a_dst, io2_a_dst,(v_len + 1u), wuffs_base__slice_u8__subslice_i(a_workbuf, v_wb_index));
62064
        if ( ! (iop_a_dst > io1_a_dst)) {
62065
          status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state);
62066
          goto exit;
62067
        }
62068
        v_match_byte = ((uint32_t)(iop_a_dst[-1]));
62069
        iop_a_dst--;
62070
        if ( ! (iop_a_dst > io1_a_dst)) {
62071
          status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state);
62072
          goto exit;
62073
        }
62074
        v_prev_byte = iop_a_dst[-1];
62075
        continue;
62076
      } else if (v_len == v_adj_dist) {
62077
        wuffs_private_impl__io_writer__limited_copy_u32_from_slice(
62078
            &iop_a_dst, io2_a_dst,v_len, wuffs_base__slice_u8__subslice_i(a_workbuf, v_wb_index));
62079
        wuffs_private_impl__io_writer__limited_copy_u32_from_history(
62080
            &iop_a_dst, io0_a_dst, io2_a_dst, 1u, v_dist);
62081
        if ( ! (iop_a_dst > io1_a_dst)) {
62082
          status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state);
62083
          goto exit;
62084
        }
62085
        v_match_byte = ((uint32_t)(iop_a_dst[-1]));
62086
        iop_a_dst--;
62087
        if ( ! (iop_a_dst > io1_a_dst)) {
62088
          status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state);
62089
          goto exit;
62090
        }
62091
        v_prev_byte = iop_a_dst[-1];
62092
        continue;
62093
      }
62094
      wuffs_private_impl__io_writer__limited_copy_u32_from_slice(
62095
          &iop_a_dst, io2_a_dst,v_adj_dist, wuffs_base__slice_u8__subslice_i(a_workbuf, v_wb_index));
62096
      v_len -= v_adj_dist;
62097
      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)))) {
62098
        status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state);
62099
        goto exit;
62100
      }
62101
    }
62102
    if (v_dist >= 8u) {
62103
      v_match_cusp = wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast_return_cusp(
62104
          &iop_a_dst, io0_a_dst, io2_a_dst, v_len, v_dist);
62105
      v_match_byte = (v_match_cusp >> 8u);
62106
      v_prev_byte = ((uint8_t)(v_match_cusp));
62107
    } else {
62108
      v_match_cusp = wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast_return_cusp(
62109
          &iop_a_dst, io0_a_dst, io2_a_dst, v_len, v_dist);
62110
      v_match_byte = (v_match_cusp >> 8u);
62111
      v_prev_byte = ((uint8_t)(v_match_cusp));
62112
    }
62113
  }
62114
  label__outer__break:;
62115
  self->private_impl.f_stashed_bytes[0u] = v_prev_byte;
62116
  self->private_impl.f_stashed_bytes[1u] = ((uint8_t)(v_match_byte));
62117
  self->private_impl.f_stashed_bits = v_bits;
62118
  self->private_impl.f_stashed_range = v_range;
62119
  self->private_impl.f_stashed_state = v_state;
62120
  self->private_impl.f_stashed_rep0 = v_rep0;
62121
  self->private_impl.f_stashed_rep1 = v_rep1;
62122
  self->private_impl.f_stashed_rep2 = v_rep2;
62123
  self->private_impl.f_stashed_rep3 = v_rep3;
62124
  self->private_impl.f_stashed_pos = v_pos;
62125
  self->private_impl.f_stashed_pos_end = v_pos_end;
62126
  goto exit;
62127
  exit:
62128
  if (a_dst && a_dst->data.ptr) {
62129
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
62130
  }
62131
  if (a_src && a_src->data.ptr) {
62132
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
62133
  }
62134
62135
  return status;
62136
}
62137
62138
// -------- func lzma.decoder.decode_bitstream_slow
62139
62140
WUFFS_BASE__GENERATED_C_CODE
62141
static wuffs_base__status
62142
wuffs_lzma__decoder__decode_bitstream_slow(
62143
    wuffs_lzma__decoder* self,
62144
    wuffs_base__io_buffer* a_dst,
62145
    wuffs_base__io_buffer* a_src,
62146
    wuffs_base__slice_u8 a_workbuf) {
62147
  wuffs_base__status status = wuffs_base__make_status(NULL);
62148
62149
  uint8_t v_c8 = 0;
62150
  uint32_t v_bits = 0;
62151
  uint32_t v_range = 0;
62152
  uint32_t v_state = 0;
62153
  uint32_t v_rep0 = 0;
62154
  uint32_t v_rep1 = 0;
62155
  uint32_t v_rep2 = 0;
62156
  uint32_t v_rep3 = 0;
62157
  uint32_t v_reptmp = 0;
62158
  uint32_t v_rep = 0;
62159
  uint64_t v_pos = 0;
62160
  uint64_t v_pos_end = 0;
62161
  uint32_t v_lc = 0;
62162
  uint64_t v_lp_mask = 0;
62163
  uint64_t v_pb_mask = 0;
62164
  uint32_t v_prob = 0;
62165
  uint32_t v_threshold = 0;
62166
  uint32_t v_tree_node = 0;
62167
  uint8_t v_prev_byte = 0;
62168
  uint32_t v_match_byte = 0;
62169
  uint32_t v_match_cusp = 0;
62170
  uint32_t v_len_state = 0;
62171
  uint32_t v_slot = 0;
62172
  uint32_t v_len = 0;
62173
  uint32_t v_lanl_offset = 0;
62174
  uint32_t v_lanl_old_offset = 0;
62175
  uint32_t v_lanl_index = 0;
62176
  uint32_t v_num_extra_bits = 0;
62177
  uint32_t v_dist_extra_bits = 0;
62178
  uint32_t v_high_bit_was_on = 0;
62179
  uint32_t v_i = 0;
62180
  uint32_t v_index_ao00 = 0;
62181
  uint32_t v_index_ao41 = 0;
62182
  uint32_t v_index_lit = 0;
62183
  uint32_t v_index_len = 0;
62184
  uint32_t v_index_small_dist_base = 0;
62185
  uint32_t v_index_small_dist_extra = 0;
62186
  uint32_t v_index_small_dist = 0;
62187
  uint32_t v_index_large_dist = 0;
62188
  uint32_t v_dist = 0;
62189
  uint32_t v_adj_dist = 0;
62190
  uint64_t v_wb_index = 0;
62191
62192
  uint8_t* iop_a_dst = NULL;
62193
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
62194
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
62195
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
62196
  if (a_dst && a_dst->data.ptr) {
62197
    io0_a_dst = a_dst->data.ptr;
62198
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
62199
    iop_a_dst = io1_a_dst;
62200
    io2_a_dst = io0_a_dst + a_dst->data.len;
62201
    if (a_dst->meta.closed) {
62202
      io2_a_dst = iop_a_dst;
62203
    }
62204
  }
62205
  const uint8_t* iop_a_src = NULL;
62206
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
62207
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
62208
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
62209
  if (a_src && a_src->data.ptr) {
62210
    io0_a_src = a_src->data.ptr;
62211
    io1_a_src = io0_a_src + a_src->meta.ri;
62212
    iop_a_src = io1_a_src;
62213
    io2_a_src = io0_a_src + a_src->meta.wi;
62214
  }
62215
62216
  uint32_t coro_susp_point = self->private_impl.p_decode_bitstream_slow;
62217
  if (coro_susp_point) {
62218
    v_bits = self->private_data.s_decode_bitstream_slow.v_bits;
62219
    v_range = self->private_data.s_decode_bitstream_slow.v_range;
62220
    v_state = self->private_data.s_decode_bitstream_slow.v_state;
62221
    v_rep0 = self->private_data.s_decode_bitstream_slow.v_rep0;
62222
    v_rep1 = self->private_data.s_decode_bitstream_slow.v_rep1;
62223
    v_rep2 = self->private_data.s_decode_bitstream_slow.v_rep2;
62224
    v_rep3 = self->private_data.s_decode_bitstream_slow.v_rep3;
62225
    v_rep = self->private_data.s_decode_bitstream_slow.v_rep;
62226
    v_pos = self->private_data.s_decode_bitstream_slow.v_pos;
62227
    v_pos_end = self->private_data.s_decode_bitstream_slow.v_pos_end;
62228
    v_lc = self->private_data.s_decode_bitstream_slow.v_lc;
62229
    v_lp_mask = self->private_data.s_decode_bitstream_slow.v_lp_mask;
62230
    v_pb_mask = self->private_data.s_decode_bitstream_slow.v_pb_mask;
62231
    v_tree_node = self->private_data.s_decode_bitstream_slow.v_tree_node;
62232
    v_prev_byte = self->private_data.s_decode_bitstream_slow.v_prev_byte;
62233
    v_match_byte = self->private_data.s_decode_bitstream_slow.v_match_byte;
62234
    v_len_state = self->private_data.s_decode_bitstream_slow.v_len_state;
62235
    v_slot = self->private_data.s_decode_bitstream_slow.v_slot;
62236
    v_len = self->private_data.s_decode_bitstream_slow.v_len;
62237
    v_lanl_offset = self->private_data.s_decode_bitstream_slow.v_lanl_offset;
62238
    v_num_extra_bits = self->private_data.s_decode_bitstream_slow.v_num_extra_bits;
62239
    v_dist_extra_bits = self->private_data.s_decode_bitstream_slow.v_dist_extra_bits;
62240
    v_i = self->private_data.s_decode_bitstream_slow.v_i;
62241
    v_index_lit = self->private_data.s_decode_bitstream_slow.v_index_lit;
62242
    v_index_len = self->private_data.s_decode_bitstream_slow.v_index_len;
62243
    v_index_small_dist_base = self->private_data.s_decode_bitstream_slow.v_index_small_dist_base;
62244
    v_index_small_dist_extra = self->private_data.s_decode_bitstream_slow.v_index_small_dist_extra;
62245
    v_index_large_dist = self->private_data.s_decode_bitstream_slow.v_index_large_dist;
62246
    v_dist = self->private_data.s_decode_bitstream_slow.v_dist;
62247
  }
62248
  switch (coro_susp_point) {
62249
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
62250
62251
    v_prev_byte = self->private_impl.f_stashed_bytes[0u];
62252
    v_match_byte = ((uint32_t)(self->private_impl.f_stashed_bytes[1u]));
62253
    v_bits = self->private_impl.f_stashed_bits;
62254
    v_range = self->private_impl.f_stashed_range;
62255
    v_state = self->private_impl.f_stashed_state;
62256
    v_rep0 = self->private_impl.f_stashed_rep0;
62257
    v_rep1 = self->private_impl.f_stashed_rep1;
62258
    v_rep2 = self->private_impl.f_stashed_rep2;
62259
    v_rep3 = self->private_impl.f_stashed_rep3;
62260
    v_pos = self->private_impl.f_stashed_pos;
62261
    v_pos_end = self->private_impl.f_stashed_pos_end;
62262
    v_lc = self->private_impl.f_lc;
62263
    v_lp_mask = ((((uint64_t)(1u)) << self->private_impl.f_lp) - 1u);
62264
    v_pb_mask = ((((uint64_t)(1u)) << self->private_impl.f_pb) - 1u);
62265
    while ( ! (self->private_impl.p_decode_bitstream_slow != 0)) {
62266
      if (v_pos >= v_pos_end) {
62267
        self->private_impl.f_end_of_chunk = true;
62268
        break;
62269
      }
62270
      v_index_ao00 = ((v_state << 4u) | ((uint32_t)((v_pos & v_pb_mask))));
62271
      v_prob = ((uint32_t)(self->private_data.f_probs_ao00[v_index_ao00]));
62272
      v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
62273
      if (v_bits < v_threshold) {
62274
        v_range = v_threshold;
62275
        v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
62276
        self->private_data.f_probs_ao00[v_index_ao00] = ((uint16_t)(v_prob));
62277
        if ((v_range >> 24u) == 0u) {
62278
          {
62279
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
62280
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62281
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62282
              goto suspend;
62283
            }
62284
            uint8_t t_0 = *iop_a_src++;
62285
            v_c8 = t_0;
62286
          }
62287
          v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
62288
          v_range <<= 8u;
62289
        }
62290
        v_index_lit = (15u & ((((uint32_t)((v_pos & v_lp_mask))) << v_lc) | (((uint32_t)(v_prev_byte)) >> (8u - v_lc))));
62291
        if (v_state >= 7u) {
62292
          v_lanl_offset = 256u;
62293
          v_tree_node = 1u;
62294
          while (v_tree_node < 256u) {
62295
            v_match_byte <<= 1u;
62296
            v_lanl_old_offset = v_lanl_offset;
62297
            v_lanl_offset &= v_match_byte;
62298
            v_lanl_index = (v_lanl_offset + v_lanl_old_offset + v_tree_node);
62299
            v_prob = ((uint32_t)(self->private_data.f_probs_lit[v_index_lit][v_lanl_index]));
62300
            v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
62301
            if (v_bits < v_threshold) {
62302
              v_lanl_offset = ((v_lanl_offset ^ v_lanl_old_offset) & 256u);
62303
              v_range = v_threshold;
62304
              v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
62305
              self->private_data.f_probs_lit[v_index_lit][v_lanl_index] = ((uint16_t)(v_prob));
62306
              v_tree_node = (v_tree_node << 1u);
62307
            } else {
62308
              v_bits -= v_threshold;
62309
              v_range -= v_threshold;
62310
              v_prob -= (v_prob >> 5u);
62311
              self->private_data.f_probs_lit[v_index_lit][v_lanl_index] = ((uint16_t)(v_prob));
62312
              v_tree_node = ((v_tree_node << 1u) | 1u);
62313
            }
62314
            if ((v_range >> 24u) == 0u) {
62315
              {
62316
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
62317
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62318
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62319
                  goto suspend;
62320
                }
62321
                uint8_t t_1 = *iop_a_src++;
62322
                v_c8 = t_1;
62323
              }
62324
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
62325
              v_range <<= 8u;
62326
            }
62327
          }
62328
        } else {
62329
          v_tree_node = 1u;
62330
          while (v_tree_node < 256u) {
62331
            v_prob = ((uint32_t)(self->private_data.f_probs_lit[v_index_lit][v_tree_node]));
62332
            v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
62333
            if (v_bits < v_threshold) {
62334
              v_range = v_threshold;
62335
              v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
62336
              self->private_data.f_probs_lit[v_index_lit][v_tree_node] = ((uint16_t)(v_prob));
62337
              v_tree_node = (v_tree_node << 1u);
62338
            } else {
62339
              v_bits -= v_threshold;
62340
              v_range -= v_threshold;
62341
              v_prob -= (v_prob >> 5u);
62342
              self->private_data.f_probs_lit[v_index_lit][v_tree_node] = ((uint16_t)(v_prob));
62343
              v_tree_node = ((v_tree_node << 1u) | 1u);
62344
            }
62345
            if ((v_range >> 24u) == 0u) {
62346
              {
62347
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
62348
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62349
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62350
                  goto suspend;
62351
                }
62352
                uint8_t t_2 = *iop_a_src++;
62353
                v_c8 = t_2;
62354
              }
62355
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
62356
              v_range <<= 8u;
62357
            }
62358
          }
62359
        }
62360
        v_prev_byte = ((uint8_t)(v_tree_node));
62361
        self->private_data.s_decode_bitstream_slow.scratch = v_prev_byte;
62362
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
62363
        if (iop_a_dst == io2_a_dst) {
62364
          status = wuffs_base__make_status(wuffs_base__suspension__short_write);
62365
          goto suspend;
62366
        }
62367
        *iop_a_dst++ = ((uint8_t)(self->private_data.s_decode_bitstream_slow.scratch));
62368
        v_pos += 1u;
62369
        v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_LITERAL[v_state]));
62370
        continue;
62371
      }
62372
      v_bits -= v_threshold;
62373
      v_range -= v_threshold;
62374
      v_prob -= (v_prob >> 5u);
62375
      self->private_data.f_probs_ao00[v_index_ao00] = ((uint16_t)(v_prob));
62376
      if ((v_range >> 24u) == 0u) {
62377
        {
62378
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
62379
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62380
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62381
            goto suspend;
62382
          }
62383
          uint8_t t_3 = *iop_a_src++;
62384
          v_c8 = t_3;
62385
        }
62386
        v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
62387
        v_range <<= 8u;
62388
      }
62389
      do {
62390
        v_prob = ((uint32_t)(self->private_data.f_probs_ao20[v_state]));
62391
        v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
62392
        if (v_bits < v_threshold) {
62393
          v_range = v_threshold;
62394
          v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
62395
          self->private_data.f_probs_ao20[v_state] = ((uint16_t)(v_prob));
62396
          if ((v_range >> 24u) == 0u) {
62397
            {
62398
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
62399
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62400
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62401
                goto suspend;
62402
              }
62403
              uint8_t t_4 = *iop_a_src++;
62404
              v_c8 = t_4;
62405
            }
62406
            v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
62407
            v_range <<= 8u;
62408
          }
62409
          do {
62410
            v_prob = ((uint32_t)(self->private_data.f_probs_match_len_low[0u][0u]));
62411
            v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
62412
            if (v_bits < v_threshold) {
62413
              v_range = v_threshold;
62414
              v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
62415
              self->private_data.f_probs_match_len_low[0u][0u] = ((uint16_t)(v_prob));
62416
              if ((v_range >> 24u) == 0u) {
62417
                {
62418
                  WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
62419
                  if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62420
                    status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62421
                    goto suspend;
62422
                  }
62423
                  uint8_t t_5 = *iop_a_src++;
62424
                  v_c8 = t_5;
62425
                }
62426
                v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
62427
                v_range <<= 8u;
62428
              }
62429
              v_index_len = ((uint32_t)((v_pos & v_pb_mask)));
62430
              v_tree_node = 1u;
62431
              while (v_tree_node < 8u) {
62432
                v_prob = ((uint32_t)(self->private_data.f_probs_match_len_low[v_index_len][v_tree_node]));
62433
                v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
62434
                if (v_bits < v_threshold) {
62435
                  v_range = v_threshold;
62436
                  v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
62437
                  self->private_data.f_probs_match_len_low[v_index_len][v_tree_node] = ((uint16_t)(v_prob));
62438
                  v_tree_node = (v_tree_node << 1u);
62439
                } else {
62440
                  v_bits -= v_threshold;
62441
                  v_range -= v_threshold;
62442
                  v_prob -= (v_prob >> 5u);
62443
                  self->private_data.f_probs_match_len_low[v_index_len][v_tree_node] = ((uint16_t)(v_prob));
62444
                  v_tree_node = ((v_tree_node << 1u) | 1u);
62445
                }
62446
                if ((v_range >> 24u) == 0u) {
62447
                  {
62448
                    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
62449
                    if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62450
                      status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62451
                      goto suspend;
62452
                    }
62453
                    uint8_t t_6 = *iop_a_src++;
62454
                    v_c8 = t_6;
62455
                  }
62456
                  v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
62457
                  v_range <<= 8u;
62458
                }
62459
              }
62460
              v_len_state = ((uint32_t)(WUFFS_LZMA__CLAMP_NO_MORE_THAN_3[(v_tree_node & 7u)]));
62461
              v_len = ((v_tree_node & 7u) + 2u);
62462
              break;
62463
            }
62464
            v_bits -= v_threshold;
62465
            v_range -= v_threshold;
62466
            v_prob -= (v_prob >> 5u);
62467
            self->private_data.f_probs_match_len_low[0u][0u] = ((uint16_t)(v_prob));
62468
            if ((v_range >> 24u) == 0u) {
62469
              {
62470
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
62471
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62472
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62473
                  goto suspend;
62474
                }
62475
                uint8_t t_7 = *iop_a_src++;
62476
                v_c8 = t_7;
62477
              }
62478
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
62479
              v_range <<= 8u;
62480
            }
62481
            v_prob = ((uint32_t)(self->private_data.f_probs_match_len_mid[0u][0u]));
62482
            v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
62483
            if (v_bits < v_threshold) {
62484
              v_range = v_threshold;
62485
              v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
62486
              self->private_data.f_probs_match_len_mid[0u][0u] = ((uint16_t)(v_prob));
62487
              if ((v_range >> 24u) == 0u) {
62488
                {
62489
                  WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
62490
                  if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62491
                    status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62492
                    goto suspend;
62493
                  }
62494
                  uint8_t t_8 = *iop_a_src++;
62495
                  v_c8 = t_8;
62496
                }
62497
                v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
62498
                v_range <<= 8u;
62499
              }
62500
              v_index_len = ((uint32_t)((v_pos & v_pb_mask)));
62501
              v_tree_node = 1u;
62502
              while (v_tree_node < 8u) {
62503
                v_prob = ((uint32_t)(self->private_data.f_probs_match_len_mid[v_index_len][v_tree_node]));
62504
                v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
62505
                if (v_bits < v_threshold) {
62506
                  v_range = v_threshold;
62507
                  v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
62508
                  self->private_data.f_probs_match_len_mid[v_index_len][v_tree_node] = ((uint16_t)(v_prob));
62509
                  v_tree_node = (v_tree_node << 1u);
62510
                } else {
62511
                  v_bits -= v_threshold;
62512
                  v_range -= v_threshold;
62513
                  v_prob -= (v_prob >> 5u);
62514
                  self->private_data.f_probs_match_len_mid[v_index_len][v_tree_node] = ((uint16_t)(v_prob));
62515
                  v_tree_node = ((v_tree_node << 1u) | 1u);
62516
                }
62517
                if ((v_range >> 24u) == 0u) {
62518
                  {
62519
                    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11);
62520
                    if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62521
                      status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62522
                      goto suspend;
62523
                    }
62524
                    uint8_t t_9 = *iop_a_src++;
62525
                    v_c8 = t_9;
62526
                  }
62527
                  v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
62528
                  v_range <<= 8u;
62529
                }
62530
              }
62531
              v_len = ((v_tree_node & 7u) + 10u);
62532
              v_len_state = 3u;
62533
              break;
62534
            }
62535
            v_bits -= v_threshold;
62536
            v_range -= v_threshold;
62537
            v_prob -= (v_prob >> 5u);
62538
            self->private_data.f_probs_match_len_mid[0u][0u] = ((uint16_t)(v_prob));
62539
            if ((v_range >> 24u) == 0u) {
62540
              {
62541
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12);
62542
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62543
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62544
                  goto suspend;
62545
                }
62546
                uint8_t t_10 = *iop_a_src++;
62547
                v_c8 = t_10;
62548
              }
62549
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
62550
              v_range <<= 8u;
62551
            }
62552
            v_tree_node = 1u;
62553
            while (v_tree_node < 256u) {
62554
              v_prob = ((uint32_t)(self->private_data.f_probs_match_len_high[0u][v_tree_node]));
62555
              v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
62556
              if (v_bits < v_threshold) {
62557
                v_range = v_threshold;
62558
                v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
62559
                self->private_data.f_probs_match_len_high[0u][v_tree_node] = ((uint16_t)(v_prob));
62560
                v_tree_node = (v_tree_node << 1u);
62561
              } else {
62562
                v_bits -= v_threshold;
62563
                v_range -= v_threshold;
62564
                v_prob -= (v_prob >> 5u);
62565
                self->private_data.f_probs_match_len_high[0u][v_tree_node] = ((uint16_t)(v_prob));
62566
                v_tree_node = ((v_tree_node << 1u) | 1u);
62567
              }
62568
              if ((v_range >> 24u) == 0u) {
62569
                {
62570
                  WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13);
62571
                  if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62572
                    status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62573
                    goto suspend;
62574
                  }
62575
                  uint8_t t_11 = *iop_a_src++;
62576
                  v_c8 = t_11;
62577
                }
62578
                v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
62579
                v_range <<= 8u;
62580
              }
62581
            }
62582
            v_len = ((v_tree_node & 255u) + 18u);
62583
            v_len_state = 3u;
62584
          } while (0);
62585
          v_slot = 1u;
62586
          while (v_slot < 64u) {
62587
            v_prob = ((uint32_t)(self->private_data.f_probs_slot[v_len_state][v_slot]));
62588
            v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
62589
            if (v_bits < v_threshold) {
62590
              v_range = v_threshold;
62591
              v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
62592
              self->private_data.f_probs_slot[v_len_state][v_slot] = ((uint16_t)(v_prob));
62593
              v_slot = (v_slot << 1u);
62594
            } else {
62595
              v_bits -= v_threshold;
62596
              v_range -= v_threshold;
62597
              v_prob -= (v_prob >> 5u);
62598
              self->private_data.f_probs_slot[v_len_state][v_slot] = ((uint16_t)(v_prob));
62599
              v_slot = ((v_slot << 1u) | 1u);
62600
            }
62601
            if ((v_range >> 24u) == 0u) {
62602
              {
62603
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14);
62604
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62605
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62606
                  goto suspend;
62607
                }
62608
                uint8_t t_12 = *iop_a_src++;
62609
                v_c8 = t_12;
62610
              }
62611
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
62612
              v_range <<= 8u;
62613
            }
62614
          }
62615
          v_slot &= 63u;
62616
          v_rep = v_slot;
62617
          if (v_slot < 4u) {
62618
          } else if (v_slot < 14u) {
62619
            v_num_extra_bits = ((v_slot >> 1u) - 1u);
62620
            v_rep = ((2u | (v_slot & 1u)) << v_num_extra_bits);
62621
            v_index_small_dist_base = ((uint32_t)(v_rep - v_slot));
62622
            v_index_small_dist_extra = 1u;
62623
            v_dist_extra_bits = 0u;
62624
            v_i = 0u;
62625
            while (v_i < v_num_extra_bits) {
62626
              v_index_small_dist = (((uint32_t)(v_index_small_dist_base + v_index_small_dist_extra)) & 127u);
62627
              v_prob = ((uint32_t)(self->private_data.f_probs_small_dist[v_index_small_dist]));
62628
              v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
62629
              if (v_bits < v_threshold) {
62630
                v_range = v_threshold;
62631
                v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
62632
                self->private_data.f_probs_small_dist[v_index_small_dist] = ((uint16_t)(v_prob));
62633
                v_index_small_dist_extra = ((uint32_t)(v_index_small_dist_extra << 1u));
62634
                v_i += 1u;
62635
              } else {
62636
                v_bits -= v_threshold;
62637
                v_range -= v_threshold;
62638
                v_prob -= (v_prob >> 5u);
62639
                self->private_data.f_probs_small_dist[v_index_small_dist] = ((uint16_t)(v_prob));
62640
                v_index_small_dist_extra = (((uint32_t)(v_index_small_dist_extra << 1u)) | 1u);
62641
                v_dist_extra_bits |= (((uint32_t)(1u)) << v_i);
62642
                v_i += 1u;
62643
              }
62644
              if ((v_range >> 24u) == 0u) {
62645
                {
62646
                  WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15);
62647
                  if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62648
                    status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62649
                    goto suspend;
62650
                  }
62651
                  uint8_t t_13 = *iop_a_src++;
62652
                  v_c8 = t_13;
62653
                }
62654
                v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
62655
                v_range <<= 8u;
62656
              }
62657
            }
62658
            v_rep += v_dist_extra_bits;
62659
          } else {
62660
            v_num_extra_bits = ((v_slot >> 1u) - 1u);
62661
            v_rep = ((2u | (v_slot & 1u)) << v_num_extra_bits);
62662
            v_dist_extra_bits = 0u;
62663
            while (true) {
62664
              v_range >>= 1u;
62665
              v_bits -= v_range;
62666
              v_high_bit_was_on = ((uint32_t)(0u - (v_bits >> 31u)));
62667
              v_bits += (v_range & v_high_bit_was_on);
62668
              v_dist_extra_bits = (((uint32_t)(v_dist_extra_bits << 1u)) | (((uint32_t)(v_high_bit_was_on + 1u)) & 1u));
62669
              if ((v_range >> 24u) == 0u) {
62670
                {
62671
                  WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16);
62672
                  if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62673
                    status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62674
                    goto suspend;
62675
                  }
62676
                  uint8_t t_14 = *iop_a_src++;
62677
                  v_c8 = t_14;
62678
                }
62679
                v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
62680
                v_range <<= 8u;
62681
              }
62682
              v_num_extra_bits -= 1u;
62683
              if (v_num_extra_bits <= 4u) {
62684
                break;
62685
              }
62686
            }
62687
            v_dist_extra_bits <<= 4u;
62688
            v_index_large_dist = 1u;
62689
            while (true) {
62690
              v_prob = ((uint32_t)(self->private_data.f_probs_large_dist[v_index_large_dist]));
62691
              v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
62692
              if (v_bits < v_threshold) {
62693
                v_range = v_threshold;
62694
                v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
62695
                self->private_data.f_probs_large_dist[v_index_large_dist] = ((uint16_t)(v_prob));
62696
                v_index_large_dist = (15u & ((uint32_t)(v_index_large_dist << 1u)));
62697
              } else {
62698
                v_bits -= v_threshold;
62699
                v_range -= v_threshold;
62700
                v_prob -= (v_prob >> 5u);
62701
                self->private_data.f_probs_large_dist[v_index_large_dist] = ((uint16_t)(v_prob));
62702
                v_index_large_dist = (15u & (((uint32_t)(v_index_large_dist << 1u)) | 1u));
62703
                v_dist_extra_bits |= (((uint32_t)(1u)) << (4u - v_num_extra_bits));
62704
              }
62705
              if ((v_range >> 24u) == 0u) {
62706
                {
62707
                  WUFFS_BASE__COROUTINE_SUSPENSION_POINT(17);
62708
                  if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62709
                    status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62710
                    goto suspend;
62711
                  }
62712
                  uint8_t t_15 = *iop_a_src++;
62713
                  v_c8 = t_15;
62714
                }
62715
                v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
62716
                v_range <<= 8u;
62717
              }
62718
              v_num_extra_bits -= 1u;
62719
              if (v_num_extra_bits <= 0u) {
62720
                break;
62721
              }
62722
            }
62723
            v_rep += v_dist_extra_bits;
62724
          }
62725
          if (v_rep >= 4294967295u) {
62726
            self->private_impl.f_end_of_chunk = true;
62727
            goto label__outer__break;
62728
          }
62729
          v_rep3 = v_rep2;
62730
          v_rep2 = v_rep1;
62731
          v_rep1 = v_rep0;
62732
          v_rep0 = v_rep;
62733
          v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_MATCH[v_state]));
62734
          break;
62735
        }
62736
        v_bits -= v_threshold;
62737
        v_range -= v_threshold;
62738
        v_prob -= (v_prob >> 5u);
62739
        self->private_data.f_probs_ao20[v_state] = ((uint16_t)(v_prob));
62740
        if ((v_range >> 24u) == 0u) {
62741
          {
62742
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(18);
62743
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62744
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62745
              goto suspend;
62746
            }
62747
            uint8_t t_16 = *iop_a_src++;
62748
            v_c8 = t_16;
62749
          }
62750
          v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
62751
          v_range <<= 8u;
62752
        }
62753
        v_prob = ((uint32_t)(self->private_data.f_probs_ao40[v_state]));
62754
        v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
62755
        if (v_bits < v_threshold) {
62756
          v_range = v_threshold;
62757
          v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
62758
          self->private_data.f_probs_ao40[v_state] = ((uint16_t)(v_prob));
62759
          if ((v_range >> 24u) == 0u) {
62760
            {
62761
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(19);
62762
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62763
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62764
                goto suspend;
62765
              }
62766
              uint8_t t_17 = *iop_a_src++;
62767
              v_c8 = t_17;
62768
            }
62769
            v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
62770
            v_range <<= 8u;
62771
          }
62772
          v_index_ao41 = ((v_state << 4u) | ((uint32_t)((v_pos & v_pb_mask))));
62773
          v_prob = ((uint32_t)(self->private_data.f_probs_ao41[v_index_ao41]));
62774
          v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
62775
          if (v_bits < v_threshold) {
62776
            v_range = v_threshold;
62777
            v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
62778
            self->private_data.f_probs_ao41[v_index_ao41] = ((uint16_t)(v_prob));
62779
            if ((v_range >> 24u) == 0u) {
62780
              {
62781
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT(20);
62782
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62783
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62784
                  goto suspend;
62785
                }
62786
                uint8_t t_18 = *iop_a_src++;
62787
                v_c8 = t_18;
62788
              }
62789
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
62790
              v_range <<= 8u;
62791
            }
62792
            v_len = 1u;
62793
            v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_SHORTREP[v_state]));
62794
            break;
62795
          }
62796
          v_bits -= v_threshold;
62797
          v_range -= v_threshold;
62798
          v_prob -= (v_prob >> 5u);
62799
          self->private_data.f_probs_ao41[v_index_ao41] = ((uint16_t)(v_prob));
62800
          if ((v_range >> 24u) == 0u) {
62801
            {
62802
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(21);
62803
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62804
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62805
                goto suspend;
62806
              }
62807
              uint8_t t_19 = *iop_a_src++;
62808
              v_c8 = t_19;
62809
            }
62810
            v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
62811
            v_range <<= 8u;
62812
          }
62813
        } else {
62814
          v_bits -= v_threshold;
62815
          v_range -= v_threshold;
62816
          v_prob -= (v_prob >> 5u);
62817
          self->private_data.f_probs_ao40[v_state] = ((uint16_t)(v_prob));
62818
          if ((v_range >> 24u) == 0u) {
62819
            {
62820
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(22);
62821
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62822
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62823
                goto suspend;
62824
              }
62825
              uint8_t t_20 = *iop_a_src++;
62826
              v_c8 = t_20;
62827
            }
62828
            v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
62829
            v_range <<= 8u;
62830
          }
62831
          v_prob = ((uint32_t)(self->private_data.f_probs_ao60[v_state]));
62832
          v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
62833
          if (v_bits < v_threshold) {
62834
            v_range = v_threshold;
62835
            v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
62836
            self->private_data.f_probs_ao60[v_state] = ((uint16_t)(v_prob));
62837
            if ((v_range >> 24u) == 0u) {
62838
              {
62839
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT(23);
62840
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62841
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62842
                  goto suspend;
62843
                }
62844
                uint8_t t_21 = *iop_a_src++;
62845
                v_c8 = t_21;
62846
              }
62847
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
62848
              v_range <<= 8u;
62849
            }
62850
            v_reptmp = v_rep1;
62851
            v_rep1 = v_rep0;
62852
            v_rep0 = v_reptmp;
62853
          } else {
62854
            v_bits -= v_threshold;
62855
            v_range -= v_threshold;
62856
            v_prob -= (v_prob >> 5u);
62857
            self->private_data.f_probs_ao60[v_state] = ((uint16_t)(v_prob));
62858
            if ((v_range >> 24u) == 0u) {
62859
              {
62860
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT(24);
62861
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62862
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62863
                  goto suspend;
62864
                }
62865
                uint8_t t_22 = *iop_a_src++;
62866
                v_c8 = t_22;
62867
              }
62868
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
62869
              v_range <<= 8u;
62870
            }
62871
            v_prob = ((uint32_t)(self->private_data.f_probs_ao63[v_state]));
62872
            v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
62873
            if (v_bits < v_threshold) {
62874
              v_range = v_threshold;
62875
              v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
62876
              self->private_data.f_probs_ao63[v_state] = ((uint16_t)(v_prob));
62877
              if ((v_range >> 24u) == 0u) {
62878
                {
62879
                  WUFFS_BASE__COROUTINE_SUSPENSION_POINT(25);
62880
                  if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62881
                    status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62882
                    goto suspend;
62883
                  }
62884
                  uint8_t t_23 = *iop_a_src++;
62885
                  v_c8 = t_23;
62886
                }
62887
                v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
62888
                v_range <<= 8u;
62889
              }
62890
              v_reptmp = v_rep2;
62891
              v_rep2 = v_rep1;
62892
              v_rep1 = v_rep0;
62893
              v_rep0 = v_reptmp;
62894
            } else {
62895
              v_bits -= v_threshold;
62896
              v_range -= v_threshold;
62897
              v_prob -= (v_prob >> 5u);
62898
              self->private_data.f_probs_ao63[v_state] = ((uint16_t)(v_prob));
62899
              if ((v_range >> 24u) == 0u) {
62900
                {
62901
                  WUFFS_BASE__COROUTINE_SUSPENSION_POINT(26);
62902
                  if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62903
                    status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62904
                    goto suspend;
62905
                  }
62906
                  uint8_t t_24 = *iop_a_src++;
62907
                  v_c8 = t_24;
62908
                }
62909
                v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
62910
                v_range <<= 8u;
62911
              }
62912
              v_reptmp = v_rep3;
62913
              v_rep3 = v_rep2;
62914
              v_rep2 = v_rep1;
62915
              v_rep1 = v_rep0;
62916
              v_rep0 = v_reptmp;
62917
            }
62918
          }
62919
        }
62920
        do {
62921
          v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_low[0u][0u]));
62922
          v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
62923
          if (v_bits < v_threshold) {
62924
            v_range = v_threshold;
62925
            v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
62926
            self->private_data.f_probs_longrep_len_low[0u][0u] = ((uint16_t)(v_prob));
62927
            if ((v_range >> 24u) == 0u) {
62928
              {
62929
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT(27);
62930
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62931
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62932
                  goto suspend;
62933
                }
62934
                uint8_t t_25 = *iop_a_src++;
62935
                v_c8 = t_25;
62936
              }
62937
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
62938
              v_range <<= 8u;
62939
            }
62940
            v_index_len = ((uint32_t)((v_pos & v_pb_mask)));
62941
            v_tree_node = 1u;
62942
            while (v_tree_node < 8u) {
62943
              v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_low[v_index_len][v_tree_node]));
62944
              v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
62945
              if (v_bits < v_threshold) {
62946
                v_range = v_threshold;
62947
                v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
62948
                self->private_data.f_probs_longrep_len_low[v_index_len][v_tree_node] = ((uint16_t)(v_prob));
62949
                v_tree_node = (v_tree_node << 1u);
62950
              } else {
62951
                v_bits -= v_threshold;
62952
                v_range -= v_threshold;
62953
                v_prob -= (v_prob >> 5u);
62954
                self->private_data.f_probs_longrep_len_low[v_index_len][v_tree_node] = ((uint16_t)(v_prob));
62955
                v_tree_node = ((v_tree_node << 1u) | 1u);
62956
              }
62957
              if ((v_range >> 24u) == 0u) {
62958
                {
62959
                  WUFFS_BASE__COROUTINE_SUSPENSION_POINT(28);
62960
                  if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62961
                    status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62962
                    goto suspend;
62963
                  }
62964
                  uint8_t t_26 = *iop_a_src++;
62965
                  v_c8 = t_26;
62966
                }
62967
                v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
62968
                v_range <<= 8u;
62969
              }
62970
            }
62971
            v_len = ((v_tree_node & 7u) + 2u);
62972
            v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_LONGREP[v_state]));
62973
            break;
62974
          }
62975
          v_bits -= v_threshold;
62976
          v_range -= v_threshold;
62977
          v_prob -= (v_prob >> 5u);
62978
          self->private_data.f_probs_longrep_len_low[0u][0u] = ((uint16_t)(v_prob));
62979
          if ((v_range >> 24u) == 0u) {
62980
            {
62981
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(29);
62982
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62983
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62984
                goto suspend;
62985
              }
62986
              uint8_t t_27 = *iop_a_src++;
62987
              v_c8 = t_27;
62988
            }
62989
            v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
62990
            v_range <<= 8u;
62991
          }
62992
          v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_mid[0u][0u]));
62993
          v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
62994
          if (v_bits < v_threshold) {
62995
            v_range = v_threshold;
62996
            v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
62997
            self->private_data.f_probs_longrep_len_mid[0u][0u] = ((uint16_t)(v_prob));
62998
            if ((v_range >> 24u) == 0u) {
62999
              {
63000
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT(30);
63001
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
63002
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
63003
                  goto suspend;
63004
                }
63005
                uint8_t t_28 = *iop_a_src++;
63006
                v_c8 = t_28;
63007
              }
63008
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
63009
              v_range <<= 8u;
63010
            }
63011
            v_index_len = ((uint32_t)((v_pos & v_pb_mask)));
63012
            v_tree_node = 1u;
63013
            while (v_tree_node < 8u) {
63014
              v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_mid[v_index_len][v_tree_node]));
63015
              v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
63016
              if (v_bits < v_threshold) {
63017
                v_range = v_threshold;
63018
                v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
63019
                self->private_data.f_probs_longrep_len_mid[v_index_len][v_tree_node] = ((uint16_t)(v_prob));
63020
                v_tree_node = (v_tree_node << 1u);
63021
              } else {
63022
                v_bits -= v_threshold;
63023
                v_range -= v_threshold;
63024
                v_prob -= (v_prob >> 5u);
63025
                self->private_data.f_probs_longrep_len_mid[v_index_len][v_tree_node] = ((uint16_t)(v_prob));
63026
                v_tree_node = ((v_tree_node << 1u) | 1u);
63027
              }
63028
              if ((v_range >> 24u) == 0u) {
63029
                {
63030
                  WUFFS_BASE__COROUTINE_SUSPENSION_POINT(31);
63031
                  if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
63032
                    status = wuffs_base__make_status(wuffs_base__suspension__short_read);
63033
                    goto suspend;
63034
                  }
63035
                  uint8_t t_29 = *iop_a_src++;
63036
                  v_c8 = t_29;
63037
                }
63038
                v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
63039
                v_range <<= 8u;
63040
              }
63041
            }
63042
            v_len = ((v_tree_node & 7u) + 10u);
63043
            v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_LONGREP[v_state]));
63044
            break;
63045
          }
63046
          v_bits -= v_threshold;
63047
          v_range -= v_threshold;
63048
          v_prob -= (v_prob >> 5u);
63049
          self->private_data.f_probs_longrep_len_mid[0u][0u] = ((uint16_t)(v_prob));
63050
          if ((v_range >> 24u) == 0u) {
63051
            {
63052
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(32);
63053
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
63054
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
63055
                goto suspend;
63056
              }
63057
              uint8_t t_30 = *iop_a_src++;
63058
              v_c8 = t_30;
63059
            }
63060
            v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
63061
            v_range <<= 8u;
63062
          }
63063
          v_tree_node = 1u;
63064
          while (v_tree_node < 256u) {
63065
            v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_high[0u][v_tree_node]));
63066
            v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
63067
            if (v_bits < v_threshold) {
63068
              v_range = v_threshold;
63069
              v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
63070
              self->private_data.f_probs_longrep_len_high[0u][v_tree_node] = ((uint16_t)(v_prob));
63071
              v_tree_node = (v_tree_node << 1u);
63072
            } else {
63073
              v_bits -= v_threshold;
63074
              v_range -= v_threshold;
63075
              v_prob -= (v_prob >> 5u);
63076
              self->private_data.f_probs_longrep_len_high[0u][v_tree_node] = ((uint16_t)(v_prob));
63077
              v_tree_node = ((v_tree_node << 1u) | 1u);
63078
            }
63079
            if ((v_range >> 24u) == 0u) {
63080
              {
63081
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT(33);
63082
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
63083
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
63084
                  goto suspend;
63085
                }
63086
                uint8_t t_31 = *iop_a_src++;
63087
                v_c8 = t_31;
63088
              }
63089
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
63090
              v_range <<= 8u;
63091
            }
63092
          }
63093
          v_len = ((v_tree_node & 255u) + 18u);
63094
          v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_LONGREP[v_state]));
63095
        } while (0);
63096
      } while (0);
63097
      v_dist = (v_rep0 + 1u);
63098
      if ((((uint64_t)(v_dist)) > v_pos) || (((uint64_t)(v_dist)) > ((uint64_t)(self->private_impl.f_dict_size)))) {
63099
        status = wuffs_base__make_status(wuffs_lzma__error__bad_distance);
63100
        goto exit;
63101
      }
63102
      v_pos += ((uint64_t)(v_len));
63103
      while (274u > ((uint64_t)(io2_a_dst - iop_a_dst))) {
63104
        status = wuffs_base__make_status(wuffs_base__suspension__short_write);
63105
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(34);
63106
      }
63107
      if (((uint64_t)(v_dist)) > ((uint64_t)(iop_a_dst - io0_a_dst))) {
63108
        v_adj_dist = ((uint32_t)((((uint64_t)(v_dist)) - ((uint64_t)(iop_a_dst - io0_a_dst)))));
63109
        if (v_adj_dist > self->private_impl.f_dict_seen) {
63110
          status = wuffs_base__make_status(wuffs_lzma__error__bad_distance);
63111
          goto exit;
63112
        }
63113
        v_wb_index = ((uint64_t)(((uint64_t)(self->private_impl.f_dict_workbuf_index)) - ((uint64_t)(v_adj_dist))));
63114
        while (v_wb_index >= 9223372036854775808u) {
63115
          v_wb_index += ((uint64_t)(self->private_impl.f_dict_size));
63116
        }
63117
        if (v_wb_index >= ((uint64_t)(a_workbuf.len))) {
63118
          status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state);
63119
          goto exit;
63120
        }
63121
        if (v_len < v_adj_dist) {
63122
          wuffs_private_impl__io_writer__limited_copy_u32_from_slice(
63123
              &iop_a_dst, io2_a_dst,(v_len + 1u), wuffs_base__slice_u8__subslice_i(a_workbuf, v_wb_index));
63124
          if ( ! (iop_a_dst > io1_a_dst)) {
63125
            status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state);
63126
            goto exit;
63127
          }
63128
          v_match_byte = ((uint32_t)(iop_a_dst[-1]));
63129
          iop_a_dst--;
63130
          if ( ! (iop_a_dst > io1_a_dst)) {
63131
            status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state);
63132
            goto exit;
63133
          }
63134
          v_prev_byte = iop_a_dst[-1];
63135
          continue;
63136
        } else if (v_len == v_adj_dist) {
63137
          wuffs_private_impl__io_writer__limited_copy_u32_from_slice(
63138
              &iop_a_dst, io2_a_dst,v_len, wuffs_base__slice_u8__subslice_i(a_workbuf, v_wb_index));
63139
          wuffs_private_impl__io_writer__limited_copy_u32_from_history(
63140
              &iop_a_dst, io0_a_dst, io2_a_dst, 1u, v_dist);
63141
          if ( ! (iop_a_dst > io1_a_dst)) {
63142
            status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state);
63143
            goto exit;
63144
          }
63145
          v_match_byte = ((uint32_t)(iop_a_dst[-1]));
63146
          iop_a_dst--;
63147
          if ( ! (iop_a_dst > io1_a_dst)) {
63148
            status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state);
63149
            goto exit;
63150
          }
63151
          v_prev_byte = iop_a_dst[-1];
63152
          continue;
63153
        }
63154
        wuffs_private_impl__io_writer__limited_copy_u32_from_slice(
63155
            &iop_a_dst, io2_a_dst,v_adj_dist, wuffs_base__slice_u8__subslice_i(a_workbuf, v_wb_index));
63156
        v_len -= v_adj_dist;
63157
        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)))) {
63158
          status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state);
63159
          goto exit;
63160
        }
63161
      }
63162
      v_match_cusp = wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast_return_cusp(
63163
          &iop_a_dst, io0_a_dst, io2_a_dst, v_len, v_dist);
63164
      v_match_byte = (v_match_cusp >> 8u);
63165
      v_prev_byte = ((uint8_t)(v_match_cusp));
63166
    }
63167
    label__outer__break:;
63168
    self->private_impl.f_stashed_bytes[0u] = v_prev_byte;
63169
    self->private_impl.f_stashed_bytes[1u] = ((uint8_t)(v_match_byte));
63170
    self->private_impl.f_stashed_bits = v_bits;
63171
    self->private_impl.f_stashed_range = v_range;
63172
    self->private_impl.f_stashed_state = v_state;
63173
    self->private_impl.f_stashed_rep0 = v_rep0;
63174
    self->private_impl.f_stashed_rep1 = v_rep1;
63175
    self->private_impl.f_stashed_rep2 = v_rep2;
63176
    self->private_impl.f_stashed_rep3 = v_rep3;
63177
    self->private_impl.f_stashed_pos = v_pos;
63178
    self->private_impl.f_stashed_pos_end = v_pos_end;
63179
63180
    ok:
63181
    self->private_impl.p_decode_bitstream_slow = 0;
63182
    goto exit;
63183
  }
63184
63185
  goto suspend;
63186
  suspend:
63187
  self->private_impl.p_decode_bitstream_slow = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
63188
  self->private_data.s_decode_bitstream_slow.v_bits = v_bits;
63189
  self->private_data.s_decode_bitstream_slow.v_range = v_range;
63190
  self->private_data.s_decode_bitstream_slow.v_state = v_state;
63191
  self->private_data.s_decode_bitstream_slow.v_rep0 = v_rep0;
63192
  self->private_data.s_decode_bitstream_slow.v_rep1 = v_rep1;
63193
  self->private_data.s_decode_bitstream_slow.v_rep2 = v_rep2;
63194
  self->private_data.s_decode_bitstream_slow.v_rep3 = v_rep3;
63195
  self->private_data.s_decode_bitstream_slow.v_rep = v_rep;
63196
  self->private_data.s_decode_bitstream_slow.v_pos = v_pos;
63197
  self->private_data.s_decode_bitstream_slow.v_pos_end = v_pos_end;
63198
  self->private_data.s_decode_bitstream_slow.v_lc = v_lc;
63199
  self->private_data.s_decode_bitstream_slow.v_lp_mask = v_lp_mask;
63200
  self->private_data.s_decode_bitstream_slow.v_pb_mask = v_pb_mask;
63201
  self->private_data.s_decode_bitstream_slow.v_tree_node = v_tree_node;
63202
  self->private_data.s_decode_bitstream_slow.v_prev_byte = v_prev_byte;
63203
  self->private_data.s_decode_bitstream_slow.v_match_byte = v_match_byte;
63204
  self->private_data.s_decode_bitstream_slow.v_len_state = v_len_state;
63205
  self->private_data.s_decode_bitstream_slow.v_slot = v_slot;
63206
  self->private_data.s_decode_bitstream_slow.v_len = v_len;
63207
  self->private_data.s_decode_bitstream_slow.v_lanl_offset = v_lanl_offset;
63208
  self->private_data.s_decode_bitstream_slow.v_num_extra_bits = v_num_extra_bits;
63209
  self->private_data.s_decode_bitstream_slow.v_dist_extra_bits = v_dist_extra_bits;
63210
  self->private_data.s_decode_bitstream_slow.v_i = v_i;
63211
  self->private_data.s_decode_bitstream_slow.v_index_lit = v_index_lit;
63212
  self->private_data.s_decode_bitstream_slow.v_index_len = v_index_len;
63213
  self->private_data.s_decode_bitstream_slow.v_index_small_dist_base = v_index_small_dist_base;
63214
  self->private_data.s_decode_bitstream_slow.v_index_small_dist_extra = v_index_small_dist_extra;
63215
  self->private_data.s_decode_bitstream_slow.v_index_large_dist = v_index_large_dist;
63216
  self->private_data.s_decode_bitstream_slow.v_dist = v_dist;
63217
63218
  goto exit;
63219
  exit:
63220
  if (a_dst && a_dst->data.ptr) {
63221
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
63222
  }
63223
  if (a_src && a_src->data.ptr) {
63224
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
63225
  }
63226
63227
  return status;
63228
}
63229
63230
// -------- func lzma.decoder.add_history
63231
63232
WUFFS_BASE__GENERATED_C_CODE
63233
static wuffs_base__status
63234
wuffs_lzma__decoder__add_history(
63235
    wuffs_lzma__decoder* self,
63236
    wuffs_base__slice_u8 a_hist,
63237
    wuffs_base__slice_u8 a_workbuf) {
63238
  uint64_t v_dict_workbuf_index = 0;
63239
  uint64_t v_dict_size = 0;
63240
  uint64_t v_hist_length = 0;
63241
  wuffs_base__slice_u8 v_s = {0};
63242
  uint64_t v_n_copied = 0;
63243
  uint64_t v_n = 0;
63244
63245
  v_dict_workbuf_index = ((uint64_t)(self->private_impl.f_dict_workbuf_index));
63246
  v_dict_size = ((uint64_t)(self->private_impl.f_dict_size));
63247
  if (((uint64_t)(a_hist.len)) == 0u) {
63248
    return wuffs_base__make_status(NULL);
63249
  }
63250
  if (((uint64_t)(a_workbuf.len)) < (v_dict_size + 273u)) {
63251
    return wuffs_base__make_status(wuffs_base__error__bad_workbuf_length);
63252
  }
63253
  v_hist_length = ((uint64_t)(a_hist.len));
63254
  if (v_hist_length > 4294967295u) {
63255
    self->private_impl.f_dict_seen = 4294967295u;
63256
  } else {
63257
    wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dict_seen, ((uint32_t)(v_hist_length)));
63258
  }
63259
  v_s = a_hist;
63260
  if (((uint64_t)(v_s.len)) >= v_dict_size) {
63261
    v_s = wuffs_private_impl__slice_u8__suffix(v_s, v_dict_size);
63262
    wuffs_private_impl__slice_u8__copy_from_slice(a_workbuf, v_s);
63263
    self->private_impl.f_dict_workbuf_index = 0u;
63264
  } else if (v_dict_workbuf_index > v_dict_size) {
63265
    return wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state);
63266
  } else {
63267
    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);
63268
    if (v_n_copied < ((uint64_t)(v_s.len))) {
63269
      v_n = wuffs_private_impl__slice_u8__copy_from_slice(a_workbuf, wuffs_base__slice_u8__subslice_i(v_s, v_n_copied));
63270
      self->private_impl.f_dict_workbuf_index = ((uint32_t)(v_n));
63271
    } else {
63272
      v_n = ((uint64_t)(v_dict_workbuf_index + v_n_copied));
63273
      if (v_n < v_dict_size) {
63274
        self->private_impl.f_dict_workbuf_index = ((uint32_t)(v_n));
63275
      } else {
63276
        self->private_impl.f_dict_workbuf_index = 0u;
63277
      }
63278
    }
63279
  }
63280
  if ((273u > v_dict_size) || (v_dict_size > ((uint64_t)(a_workbuf.len)))) {
63281
    return wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state);
63282
  }
63283
  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));
63284
  return wuffs_base__make_status(NULL);
63285
}
63286
63287
// -------- func lzma.decoder.get_quirk
63288
63289
WUFFS_BASE__GENERATED_C_CODE
63290
WUFFS_BASE__MAYBE_STATIC uint64_t
63291
wuffs_lzma__decoder__get_quirk(
63292
    const wuffs_lzma__decoder* self,
63293
    uint32_t a_key) {
63294
  if (!self) {
63295
    return 0;
63296
  }
63297
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
63298
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
63299
    return 0;
63300
  }
63301
63302
  if (a_key == 1290294272u) {
63303
    if (self->private_impl.f_allow_non_zero_initial_byte) {
63304
      return 1u;
63305
    }
63306
  } else if (a_key == 1290294273u) {
63307
    return ((uint64_t)(self->private_impl.f_format_extension));
63308
  }
63309
  return 0u;
63310
}
63311
63312
// -------- func lzma.decoder.set_quirk
63313
63314
WUFFS_BASE__GENERATED_C_CODE
63315
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
63316
wuffs_lzma__decoder__set_quirk(
63317
    wuffs_lzma__decoder* self,
63318
    uint32_t a_key,
63319
    uint64_t a_value) {
63320
  if (!self) {
63321
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
63322
  }
63323
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
63324
    return wuffs_base__make_status(
63325
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
63326
        ? wuffs_base__error__disabled_by_previous_error
63327
        : wuffs_base__error__initialize_not_called);
63328
  }
63329
63330
  uint32_t v_v = 0;
63331
  uint32_t v_n = 0;
63332
63333
  if (a_key == 1290294272u) {
63334
    self->private_impl.f_allow_non_zero_initial_byte = (a_value > 0u);
63335
  } else if (a_key == 1290294273u) {
63336
    if (a_value == 0u) {
63337
      self->private_impl.f_format_extension = 0u;
63338
      return wuffs_base__make_status(NULL);
63339
    } else if ((a_value & 255u) == 1u) {
63340
      if ((a_value >> 8u) <= 255u) {
63341
        self->private_impl.f_format_extension = ((uint32_t)(a_value));
63342
        v_v = (self->private_impl.f_format_extension >> 8u);
63343
        v_n = (((uint32_t)(1u)) << (v_v & 31u));
63344
        wuffs_private_impl__u32__sat_sub_indirect(&v_n, ((v_n >> 4u) * ((v_v >> 5u) & 7u)));
63345
        if ((v_n < 4096u) || (536870912u < v_n)) {
63346
          return wuffs_base__make_status(wuffs_base__error__bad_argument);
63347
        }
63348
        self->private_impl.f_dict_size = v_n;
63349
        return wuffs_base__make_status(NULL);
63350
      }
63351
    } else if ((a_value & 255u) == 2u) {
63352
      if ((a_value >> 8u) <= 40u) {
63353
        self->private_impl.f_format_extension = ((uint32_t)(a_value));
63354
        v_v = (self->private_impl.f_format_extension >> 8u);
63355
        if (v_v < 40u) {
63356
          self->private_impl.f_dict_size = ((2u | (v_v & 1u)) << ((v_v >> 1u) + 11u));
63357
        } else {
63358
          self->private_impl.f_dict_size = 4294967295u;
63359
        }
63360
        return wuffs_base__make_status(NULL);
63361
      }
63362
    }
63363
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
63364
  }
63365
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
63366
}
63367
63368
// -------- func lzma.decoder.dst_history_retain_length
63369
63370
WUFFS_BASE__GENERATED_C_CODE
63371
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
63372
wuffs_lzma__decoder__dst_history_retain_length(
63373
    const wuffs_lzma__decoder* self) {
63374
  if (!self) {
63375
    return wuffs_base__utility__make_optional_u63(false, 0u);
63376
  }
63377
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
63378
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
63379
    return wuffs_base__utility__make_optional_u63(false, 0u);
63380
  }
63381
63382
  return wuffs_base__utility__make_optional_u63(true, 0u);
63383
}
63384
63385
// -------- func lzma.decoder.workbuf_len
63386
63387
WUFFS_BASE__GENERATED_C_CODE
63388
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
63389
wuffs_lzma__decoder__workbuf_len(
63390
    const wuffs_lzma__decoder* self) {
63391
  if (!self) {
63392
    return wuffs_base__utility__empty_range_ii_u64();
63393
  }
63394
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
63395
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
63396
    return wuffs_base__utility__empty_range_ii_u64();
63397
  }
63398
63399
  uint64_t v_m = 0;
63400
63401
  if (self->private_impl.f_dict_size == 0u) {
63402
    return wuffs_base__utility__make_range_ii_u64(0u, 0u);
63403
  }
63404
  v_m = (((uint64_t)(self->private_impl.f_dict_size)) + 273u);
63405
  return wuffs_base__utility__make_range_ii_u64(v_m, v_m);
63406
}
63407
63408
// -------- func lzma.decoder.transform_io
63409
63410
WUFFS_BASE__GENERATED_C_CODE
63411
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
63412
wuffs_lzma__decoder__transform_io(
63413
    wuffs_lzma__decoder* self,
63414
    wuffs_base__io_buffer* a_dst,
63415
    wuffs_base__io_buffer* a_src,
63416
    wuffs_base__slice_u8 a_workbuf) {
63417
  if (!self) {
63418
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
63419
  }
63420
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
63421
    return wuffs_base__make_status(
63422
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
63423
        ? wuffs_base__error__disabled_by_previous_error
63424
        : wuffs_base__error__initialize_not_called);
63425
  }
63426
  if (!a_dst || !a_src) {
63427
    self->private_impl.magic = WUFFS_BASE__DISABLED;
63428
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
63429
  }
63430
  if ((self->private_impl.active_coroutine != 0) &&
63431
      (self->private_impl.active_coroutine != 1)) {
63432
    self->private_impl.magic = WUFFS_BASE__DISABLED;
63433
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
63434
  }
63435
  self->private_impl.active_coroutine = 0;
63436
  wuffs_base__status status = wuffs_base__make_status(NULL);
63437
63438
  uint64_t v_mark = 0;
63439
  wuffs_base__status v_dti_status = wuffs_base__make_status(NULL);
63440
  wuffs_base__status v_ah_status = wuffs_base__make_status(NULL);
63441
63442
  uint8_t* iop_a_dst = NULL;
63443
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
63444
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
63445
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
63446
  if (a_dst && a_dst->data.ptr) {
63447
    io0_a_dst = a_dst->data.ptr;
63448
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
63449
    iop_a_dst = io1_a_dst;
63450
    io2_a_dst = io0_a_dst + a_dst->data.len;
63451
    if (a_dst->meta.closed) {
63452
      io2_a_dst = iop_a_dst;
63453
    }
63454
  }
63455
63456
  uint32_t coro_susp_point = self->private_impl.p_transform_io;
63457
  switch (coro_susp_point) {
63458
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
63459
63460
    while (true) {
63461
      v_mark = ((uint64_t)(iop_a_dst - io0_a_dst));
63462
      {
63463
        if (a_dst) {
63464
          a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
63465
        }
63466
        wuffs_base__status t_0 = wuffs_lzma__decoder__do_transform_io(self, a_dst, a_src, a_workbuf);
63467
        v_dti_status = t_0;
63468
        if (a_dst) {
63469
          iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
63470
        }
63471
      }
63472
      if ( ! wuffs_base__status__is_suspension(&v_dti_status)) {
63473
        status = v_dti_status;
63474
        if (wuffs_base__status__is_error(&status)) {
63475
          goto exit;
63476
        } else if (wuffs_base__status__is_suspension(&status)) {
63477
          status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
63478
          goto exit;
63479
        }
63480
        goto ok;
63481
      } else if ((v_dti_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
63482
        status = wuffs_base__make_status(wuffs_lzma__error__truncated_input);
63483
        goto exit;
63484
      }
63485
      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);
63486
      if (wuffs_base__status__is_error(&v_ah_status)) {
63487
        status = v_ah_status;
63488
        goto exit;
63489
      }
63490
      status = v_dti_status;
63491
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
63492
    }
63493
63494
    ok:
63495
    self->private_impl.p_transform_io = 0;
63496
    goto exit;
63497
  }
63498
63499
  goto suspend;
63500
  suspend:
63501
  self->private_impl.p_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
63502
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
63503
63504
  goto exit;
63505
  exit:
63506
  if (a_dst && a_dst->data.ptr) {
63507
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
63508
  }
63509
63510
  if (wuffs_base__status__is_error(&status)) {
63511
    self->private_impl.magic = WUFFS_BASE__DISABLED;
63512
  }
63513
  return status;
63514
}
63515
63516
// -------- func lzma.decoder.do_transform_io
63517
63518
WUFFS_BASE__GENERATED_C_CODE
63519
static wuffs_base__status
63520
wuffs_lzma__decoder__do_transform_io(
63521
    wuffs_lzma__decoder* self,
63522
    wuffs_base__io_buffer* a_dst,
63523
    wuffs_base__io_buffer* a_src,
63524
    wuffs_base__slice_u8 a_workbuf) {
63525
  wuffs_base__status status = wuffs_base__make_status(NULL);
63526
63527
  uint8_t v_header_byte = 0;
63528
  uint8_t v_c8 = 0;
63529
  uint32_t v_c32 = 0;
63530
  uint8_t v_prop_byte = 0;
63531
  uint32_t v_lc = 0;
63532
  uint32_t v_lp = 0;
63533
  uint32_t v_pb = 0;
63534
  uint32_t v_length = 0;
63535
  uint32_t v_n_copied = 0;
63536
  uint64_t v_smark = 0;
63537
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
63538
63539
  uint8_t* iop_a_dst = NULL;
63540
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
63541
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
63542
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
63543
  if (a_dst && a_dst->data.ptr) {
63544
    io0_a_dst = a_dst->data.ptr;
63545
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
63546
    iop_a_dst = io1_a_dst;
63547
    io2_a_dst = io0_a_dst + a_dst->data.len;
63548
    if (a_dst->meta.closed) {
63549
      io2_a_dst = iop_a_dst;
63550
    }
63551
  }
63552
  const uint8_t* iop_a_src = NULL;
63553
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
63554
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
63555
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
63556
  if (a_src && a_src->data.ptr) {
63557
    io0_a_src = a_src->data.ptr;
63558
    io1_a_src = io0_a_src + a_src->meta.ri;
63559
    iop_a_src = io1_a_src;
63560
    io2_a_src = io0_a_src + a_src->meta.wi;
63561
  }
63562
63563
  uint32_t coro_susp_point = self->private_impl.p_do_transform_io;
63564
  if (coro_susp_point) {
63565
    v_header_byte = self->private_data.s_do_transform_io.v_header_byte;
63566
    v_length = self->private_data.s_do_transform_io.v_length;
63567
  }
63568
  switch (coro_susp_point) {
63569
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
63570
63571
    self->private_impl.f_lzma2_need_prob_reset = true;
63572
    self->private_impl.f_lzma2_need_properties = true;
63573
    self->private_impl.f_lzma2_need_dict_reset = true;
63574
    while (true) {
63575
      if ((self->private_impl.f_format_extension & 255u) == 0u) {
63576
        {
63577
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
63578
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
63579
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
63580
            goto suspend;
63581
          }
63582
          uint8_t t_0 = *iop_a_src++;
63583
          v_prop_byte = t_0;
63584
        }
63585
        if (v_prop_byte >= 225u) {
63586
          status = wuffs_base__make_status(wuffs_lzma__error__bad_header);
63587
          goto exit;
63588
        }
63589
        v_lc = ((uint32_t)(((uint8_t)(v_prop_byte % 9u))));
63590
#if defined(__GNUC__)
63591
#pragma GCC diagnostic push
63592
#pragma GCC diagnostic ignored "-Wconversion"
63593
#endif
63594
        v_prop_byte /= 9u;
63595
#if defined(__GNUC__)
63596
#pragma GCC diagnostic pop
63597
#endif
63598
        v_lp = ((uint32_t)(((uint8_t)(v_prop_byte % 5u))));
63599
        v_pb = ((uint32_t)(((uint8_t)(v_prop_byte / 5u))));
63600
        if ((v_lc + v_lp) > 4u) {
63601
          status = wuffs_base__make_status(wuffs_lzma__error__unsupported_properties);
63602
          goto exit;
63603
        }
63604
        self->private_impl.f_lc = wuffs_base__u32__min(v_lc, 4u);
63605
        self->private_impl.f_lp = v_lp;
63606
        self->private_impl.f_pb = v_pb;
63607
        {
63608
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
63609
          uint32_t t_1;
63610
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
63611
            t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
63612
            iop_a_src += 4;
63613
          } else {
63614
            self->private_data.s_do_transform_io.scratch = 0;
63615
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
63616
            while (true) {
63617
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
63618
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
63619
                goto suspend;
63620
              }
63621
              uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
63622
              uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
63623
              *scratch <<= 8;
63624
              *scratch >>= 8;
63625
              *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
63626
              if (num_bits_1 == 24) {
63627
                t_1 = ((uint32_t)(*scratch));
63628
                break;
63629
              }
63630
              num_bits_1 += 8u;
63631
              *scratch |= ((uint64_t)(num_bits_1)) << 56;
63632
            }
63633
          }
63634
          v_c32 = t_1;
63635
        }
63636
        self->private_impl.f_dict_size = wuffs_base__u32__max(v_c32, 4096u);
63637
        {
63638
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
63639
          uint64_t t_2;
63640
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) {
63641
            t_2 = wuffs_base__peek_u64le__no_bounds_check(iop_a_src);
63642
            iop_a_src += 8;
63643
          } else {
63644
            self->private_data.s_do_transform_io.scratch = 0;
63645
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
63646
            while (true) {
63647
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
63648
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
63649
                goto suspend;
63650
              }
63651
              uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
63652
              uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56));
63653
              *scratch <<= 8;
63654
              *scratch >>= 8;
63655
              *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2;
63656
              if (num_bits_2 == 56) {
63657
                t_2 = ((uint64_t)(*scratch));
63658
                break;
63659
              }
63660
              num_bits_2 += 8u;
63661
              *scratch |= ((uint64_t)(num_bits_2)) << 56;
63662
            }
63663
          }
63664
          self->private_impl.f_decoded_length = t_2;
63665
        }
63666
        if ((self->private_impl.f_decoded_length >= 9223372036854775808u) && (self->private_impl.f_decoded_length != 18446744073709551615u)) {
63667
          status = wuffs_base__make_status(wuffs_lzma__error__unsupported_decoded_length);
63668
          goto exit;
63669
        }
63670
        wuffs_lzma__decoder__initialize_probs(self);
63671
      } else if ((self->private_impl.f_format_extension & 255u) == 1u) {
63672
        self->private_impl.f_lc = 3u;
63673
        self->private_impl.f_lp = 0u;
63674
        self->private_impl.f_pb = 2u;
63675
        self->private_impl.f_decoded_length = 18446744073709551615u;
63676
        wuffs_lzma__decoder__initialize_probs(self);
63677
      } else {
63678
        while (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
63679
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
63680
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6);
63681
        }
63682
        if (wuffs_base__peek_u8be__no_bounds_check(iop_a_src) == 0u) {
63683
          iop_a_src += 1u;
63684
          break;
63685
        }
63686
        {
63687
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
63688
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
63689
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
63690
            goto suspend;
63691
          }
63692
          uint8_t t_3 = *iop_a_src++;
63693
          v_header_byte = t_3;
63694
        }
63695
        if (v_header_byte < 128u) {
63696
          if (v_header_byte < 2u) {
63697
            self->private_impl.f_lzma2_need_prob_reset = true;
63698
            self->private_impl.f_lzma2_need_properties = true;
63699
            self->private_impl.f_lzma2_need_dict_reset = false;
63700
            wuffs_lzma__decoder__initialize_dict(self);
63701
          } else if ((v_header_byte > 2u) || self->private_impl.f_lzma2_need_dict_reset) {
63702
            status = wuffs_base__make_status(wuffs_lzma__error__bad_lzma2_header);
63703
            goto exit;
63704
          }
63705
          self->private_impl.f_prev_lzma2_chunk_was_uncompressed = true;
63706
          {
63707
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
63708
            uint32_t t_4;
63709
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
63710
              t_4 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src)));
63711
              iop_a_src += 2;
63712
            } else {
63713
              self->private_data.s_do_transform_io.scratch = 0;
63714
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
63715
              while (true) {
63716
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
63717
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
63718
                  goto suspend;
63719
                }
63720
                uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
63721
                uint32_t num_bits_4 = ((uint32_t)(*scratch & 0xFFu));
63722
                *scratch >>= 8;
63723
                *scratch <<= 8;
63724
                *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_4);
63725
                if (num_bits_4 == 8) {
63726
                  t_4 = ((uint32_t)(*scratch >> 48));
63727
                  break;
63728
                }
63729
                num_bits_4 += 8u;
63730
                *scratch |= ((uint64_t)(num_bits_4));
63731
              }
63732
            }
63733
            v_c32 = t_4;
63734
          }
63735
          v_length = (1u + v_c32);
63736
          while (true) {
63737
            v_n_copied = wuffs_private_impl__io_writer__limited_copy_u32_from_reader(
63738
                &iop_a_dst, io2_a_dst,v_length, &iop_a_src, io2_a_src);
63739
            wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_stashed_pos, ((uint64_t)(v_n_copied)));
63740
            if (v_length <= v_n_copied) {
63741
              break;
63742
            }
63743
            v_length -= v_n_copied;
63744
            if (((uint64_t)(io2_a_dst - iop_a_dst)) == 0u) {
63745
              status = wuffs_base__make_status(wuffs_base__suspension__short_write);
63746
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10);
63747
            } else {
63748
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
63749
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(11);
63750
            }
63751
          }
63752
          continue;
63753
        }
63754
        self->private_impl.f_decoded_length = ((uint64_t)(v_header_byte));
63755
        {
63756
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12);
63757
          uint32_t t_5;
63758
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
63759
            t_5 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src)));
63760
            iop_a_src += 2;
63761
          } else {
63762
            self->private_data.s_do_transform_io.scratch = 0;
63763
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13);
63764
            while (true) {
63765
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
63766
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
63767
                goto suspend;
63768
              }
63769
              uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
63770
              uint32_t num_bits_5 = ((uint32_t)(*scratch & 0xFFu));
63771
              *scratch >>= 8;
63772
              *scratch <<= 8;
63773
              *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_5);
63774
              if (num_bits_5 == 8) {
63775
                t_5 = ((uint32_t)(*scratch >> 48));
63776
                break;
63777
              }
63778
              num_bits_5 += 8u;
63779
              *scratch |= ((uint64_t)(num_bits_5));
63780
            }
63781
          }
63782
          v_c32 = t_5;
63783
        }
63784
        self->private_impl.f_decoded_length = (((self->private_impl.f_decoded_length & 31u) << 16u) + ((uint64_t)((1u + v_c32))));
63785
        {
63786
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14);
63787
          uint32_t t_6;
63788
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
63789
            t_6 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src)));
63790
            iop_a_src += 2;
63791
          } else {
63792
            self->private_data.s_do_transform_io.scratch = 0;
63793
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15);
63794
            while (true) {
63795
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
63796
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
63797
                goto suspend;
63798
              }
63799
              uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
63800
              uint32_t num_bits_6 = ((uint32_t)(*scratch & 0xFFu));
63801
              *scratch >>= 8;
63802
              *scratch <<= 8;
63803
              *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_6);
63804
              if (num_bits_6 == 8) {
63805
                t_6 = ((uint32_t)(*scratch >> 48));
63806
                break;
63807
              }
63808
              num_bits_6 += 8u;
63809
              *scratch |= ((uint64_t)(num_bits_6));
63810
            }
63811
          }
63812
          v_c32 = t_6;
63813
        }
63814
        self->private_impl.f_lzma2_encoded_length_want = ((uint64_t)((1u + v_c32)));
63815
        if (v_header_byte >= 160u) {
63816
          wuffs_lzma__decoder__initialize_probs(self);
63817
          self->private_impl.f_lzma2_need_prob_reset = false;
63818
        }
63819
        if (v_header_byte >= 192u) {
63820
          {
63821
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16);
63822
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
63823
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
63824
              goto suspend;
63825
            }
63826
            uint8_t t_7 = *iop_a_src++;
63827
            v_prop_byte = t_7;
63828
          }
63829
          if (v_prop_byte >= 225u) {
63830
            status = wuffs_base__make_status(wuffs_lzma__error__bad_lzma2_header);
63831
            goto exit;
63832
          }
63833
          v_lc = ((uint32_t)(((uint8_t)(v_prop_byte % 9u))));
63834
#if defined(__GNUC__)
63835
#pragma GCC diagnostic push
63836
#pragma GCC diagnostic ignored "-Wconversion"
63837
#endif
63838
          v_prop_byte /= 9u;
63839
#if defined(__GNUC__)
63840
#pragma GCC diagnostic pop
63841
#endif
63842
          v_lp = ((uint32_t)(((uint8_t)(v_prop_byte % 5u))));
63843
          v_pb = ((uint32_t)(((uint8_t)(v_prop_byte / 5u))));
63844
          if ((v_lc + v_lp) > 4u) {
63845
            status = wuffs_base__make_status(wuffs_lzma__error__bad_lzma2_header);
63846
            goto exit;
63847
          }
63848
          self->private_impl.f_lc = wuffs_base__u32__min(v_lc, 4u);
63849
          self->private_impl.f_lp = v_lp;
63850
          self->private_impl.f_pb = v_pb;
63851
          self->private_impl.f_lzma2_need_properties = false;
63852
        }
63853
        if (v_header_byte >= 224u) {
63854
          self->private_impl.f_lzma2_need_dict_reset = false;
63855
          wuffs_lzma__decoder__initialize_dict(self);
63856
        } else if (self->private_impl.f_prev_lzma2_chunk_was_uncompressed) {
63857
          if (a_dst) {
63858
            a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
63859
          }
63860
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(17);
63861
          status = wuffs_lzma__decoder__update_stashed_bytes(self, a_dst, a_workbuf);
63862
          if (a_dst) {
63863
            iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
63864
          }
63865
          if (status.repr) {
63866
            goto suspend;
63867
          }
63868
        }
63869
        self->private_impl.f_prev_lzma2_chunk_was_uncompressed = false;
63870
        if (self->private_impl.f_lzma2_need_prob_reset || self->private_impl.f_lzma2_need_properties || self->private_impl.f_lzma2_need_dict_reset) {
63871
          status = wuffs_base__make_status(wuffs_lzma__error__bad_lzma2_header);
63872
          goto exit;
63873
        }
63874
      }
63875
      {
63876
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(18);
63877
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
63878
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
63879
          goto suspend;
63880
        }
63881
        uint8_t t_8 = *iop_a_src++;
63882
        v_c8 = t_8;
63883
      }
63884
      if ((v_c8 != 0u) &&  ! self->private_impl.f_allow_non_zero_initial_byte) {
63885
        status = wuffs_base__make_status(wuffs_lzma__error__bad_code);
63886
        goto exit;
63887
      }
63888
      {
63889
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(19);
63890
        uint32_t t_9;
63891
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
63892
          t_9 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
63893
          iop_a_src += 4;
63894
        } else {
63895
          self->private_data.s_do_transform_io.scratch = 0;
63896
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(20);
63897
          while (true) {
63898
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
63899
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
63900
              goto suspend;
63901
            }
63902
            uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
63903
            uint32_t num_bits_9 = ((uint32_t)(*scratch & 0xFFu));
63904
            *scratch >>= 8;
63905
            *scratch <<= 8;
63906
            *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_9);
63907
            if (num_bits_9 == 24) {
63908
              t_9 = ((uint32_t)(*scratch >> 32));
63909
              break;
63910
            }
63911
            num_bits_9 += 8u;
63912
            *scratch |= ((uint64_t)(num_bits_9));
63913
          }
63914
        }
63915
        self->private_impl.f_stashed_bits = t_9;
63916
      }
63917
      if (self->private_impl.f_stashed_bits == 4294967295u) {
63918
        status = wuffs_base__make_status(wuffs_lzma__error__bad_code);
63919
        goto exit;
63920
      }
63921
      self->private_impl.f_stashed_range = 4294967295u;
63922
      self->private_impl.f_stashed_pos_end = wuffs_base__u64__sat_add(self->private_impl.f_stashed_pos, self->private_impl.f_decoded_length);
63923
      if ((self->private_impl.f_stashed_pos_end == 18446744073709551615u) && (self->private_impl.f_decoded_length != 18446744073709551615u)) {
63924
        status = wuffs_base__make_status(wuffs_lzma__error__unsupported_decoded_length);
63925
        goto exit;
63926
      }
63927
      self->private_impl.f_lzma2_encoded_length_have = 5u;
63928
      while (((uint64_t)(a_workbuf.len)) < (((uint64_t)(self->private_impl.f_dict_size)) + 273u)) {
63929
        status = wuffs_base__make_status(wuffs_base__suspension__short_workbuf);
63930
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(21);
63931
      }
63932
      while (true) {
63933
        v_smark = ((uint64_t)(iop_a_src - io0_a_src));
63934
        {
63935
          if (a_dst) {
63936
            a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
63937
          }
63938
          if (a_src) {
63939
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
63940
          }
63941
          wuffs_base__status t_10 = wuffs_lzma__decoder__decode_bitstream(self, a_dst, a_src, a_workbuf);
63942
          v_status = t_10;
63943
          if (a_dst) {
63944
            iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
63945
          }
63946
          if (a_src) {
63947
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
63948
          }
63949
        }
63950
        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))));
63951
        if (wuffs_base__status__is_ok(&v_status)) {
63952
          break;
63953
        }
63954
        status = v_status;
63955
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(22);
63956
      }
63957
      if (self->private_impl.f_decoded_length == 18446744073709551615u) {
63958
        if (self->private_impl.f_stashed_bits != 0u) {
63959
          status = wuffs_base__make_status(wuffs_lzma__error__bad_bitstream_trailer);
63960
          goto exit;
63961
        }
63962
      } else if (self->private_impl.f_stashed_pos != self->private_impl.f_stashed_pos_end) {
63963
        status = wuffs_base__make_status(wuffs_lzma__error__bad_decoded_length);
63964
        goto exit;
63965
      } else if (self->private_impl.f_stashed_bits != 0u) {
63966
        if (a_src) {
63967
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
63968
        }
63969
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(23);
63970
        status = wuffs_lzma__decoder__decode_optional_end_of_stream(self, a_src, a_workbuf);
63971
        if (a_src) {
63972
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
63973
        }
63974
        if (status.repr) {
63975
          goto suspend;
63976
        }
63977
        if (self->private_impl.f_stashed_bits != 0u) {
63978
          status = wuffs_base__make_status(wuffs_lzma__error__bad_bitstream_trailer);
63979
          goto exit;
63980
        }
63981
      }
63982
      if ((self->private_impl.f_format_extension & 255u) < 2u) {
63983
        break;
63984
      } else if (self->private_impl.f_lzma2_encoded_length_have != self->private_impl.f_lzma2_encoded_length_want) {
63985
        status = wuffs_base__make_status(wuffs_lzma__error__bad_lzma2_header);
63986
        goto exit;
63987
      }
63988
    }
63989
63990
    ok:
63991
    self->private_impl.p_do_transform_io = 0;
63992
    goto exit;
63993
  }
63994
63995
  goto suspend;
63996
  suspend:
63997
  self->private_impl.p_do_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
63998
  self->private_data.s_do_transform_io.v_header_byte = v_header_byte;
63999
  self->private_data.s_do_transform_io.v_length = v_length;
64000
64001
  goto exit;
64002
  exit:
64003
  if (a_dst && a_dst->data.ptr) {
64004
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
64005
  }
64006
  if (a_src && a_src->data.ptr) {
64007
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
64008
  }
64009
64010
  return status;
64011
}
64012
64013
// -------- func lzma.decoder.decode_bitstream
64014
64015
WUFFS_BASE__GENERATED_C_CODE
64016
static wuffs_base__status
64017
wuffs_lzma__decoder__decode_bitstream(
64018
    wuffs_lzma__decoder* self,
64019
    wuffs_base__io_buffer* a_dst,
64020
    wuffs_base__io_buffer* a_src,
64021
    wuffs_base__slice_u8 a_workbuf) {
64022
  wuffs_base__status status = wuffs_base__make_status(NULL);
64023
64024
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
64025
64026
  uint32_t coro_susp_point = self->private_impl.p_decode_bitstream;
64027
  switch (coro_susp_point) {
64028
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
64029
64030
    self->private_impl.f_end_of_chunk = false;
64031
    while (true) {
64032
      v_status = wuffs_lzma__decoder__decode_bitstream_fast(self, a_dst, a_src, a_workbuf);
64033
      if (wuffs_base__status__is_error(&v_status)) {
64034
        status = v_status;
64035
        goto exit;
64036
      }
64037
      if (self->private_impl.f_end_of_chunk) {
64038
        break;
64039
      }
64040
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
64041
      status = wuffs_lzma__decoder__decode_bitstream_slow(self, a_dst, a_src, a_workbuf);
64042
      if (status.repr) {
64043
        goto suspend;
64044
      }
64045
      if (self->private_impl.f_end_of_chunk) {
64046
        break;
64047
      }
64048
    }
64049
64050
    goto ok;
64051
    ok:
64052
    self->private_impl.p_decode_bitstream = 0;
64053
    goto exit;
64054
  }
64055
64056
  goto suspend;
64057
  suspend:
64058
  self->private_impl.p_decode_bitstream = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
64059
64060
  goto exit;
64061
  exit:
64062
  return status;
64063
}
64064
64065
// -------- func lzma.decoder.update_stashed_bytes
64066
64067
WUFFS_BASE__GENERATED_C_CODE
64068
static wuffs_base__status
64069
wuffs_lzma__decoder__update_stashed_bytes(
64070
    wuffs_lzma__decoder* self,
64071
    wuffs_base__io_buffer* a_dst,
64072
    wuffs_base__slice_u8 a_workbuf) {
64073
  wuffs_base__status status = wuffs_base__make_status(NULL);
64074
64075
  uint32_t v_dist = 0;
64076
  uint32_t v_which = 0;
64077
  uint32_t v_adj_dist = 0;
64078
  uint64_t v_wb_index = 0;
64079
64080
  uint8_t* iop_a_dst = NULL;
64081
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
64082
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
64083
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
64084
  if (a_dst && a_dst->data.ptr) {
64085
    io0_a_dst = a_dst->data.ptr;
64086
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
64087
    iop_a_dst = io1_a_dst;
64088
    io2_a_dst = io0_a_dst + a_dst->data.len;
64089
    if (a_dst->meta.closed) {
64090
      io2_a_dst = iop_a_dst;
64091
    }
64092
  }
64093
64094
  uint32_t coro_susp_point = self->private_impl.p_update_stashed_bytes;
64095
  switch (coro_susp_point) {
64096
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
64097
64098
    while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
64099
      status = wuffs_base__make_status(wuffs_base__suspension__short_write);
64100
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
64101
    }
64102
    v_dist = 1u;
64103
    v_which = 0u;
64104
    while (v_which < 2u) {
64105
      if (((uint64_t)(v_dist)) <= ((uint64_t)(iop_a_dst - io0_a_dst))) {
64106
        wuffs_private_impl__io_writer__limited_copy_u32_from_history(
64107
            &iop_a_dst, io0_a_dst, io2_a_dst, 1u, v_dist);
64108
        if ( ! (iop_a_dst > io1_a_dst)) {
64109
          status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state);
64110
          goto exit;
64111
        }
64112
        self->private_impl.f_stashed_bytes[v_which] = iop_a_dst[-1];
64113
        iop_a_dst--;
64114
      } else {
64115
        v_adj_dist = ((uint32_t)((((uint64_t)(v_dist)) - ((uint64_t)(iop_a_dst - io0_a_dst)))));
64116
        v_wb_index = ((uint64_t)(((uint64_t)(self->private_impl.f_dict_workbuf_index)) - ((uint64_t)(v_adj_dist))));
64117
        while (v_wb_index >= 9223372036854775808u) {
64118
          v_wb_index += ((uint64_t)(self->private_impl.f_dict_size));
64119
        }
64120
        if (v_wb_index >= ((uint64_t)(a_workbuf.len))) {
64121
          status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state);
64122
          goto exit;
64123
        }
64124
        self->private_impl.f_stashed_bytes[v_which] = a_workbuf.ptr[v_wb_index];
64125
      }
64126
      v_dist = (1u + self->private_impl.f_stashed_rep0);
64127
      v_which += 1u;
64128
    }
64129
64130
    ok:
64131
    self->private_impl.p_update_stashed_bytes = 0;
64132
    goto exit;
64133
  }
64134
64135
  goto suspend;
64136
  suspend:
64137
  self->private_impl.p_update_stashed_bytes = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
64138
64139
  goto exit;
64140
  exit:
64141
  if (a_dst && a_dst->data.ptr) {
64142
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
64143
  }
64144
64145
  return status;
64146
}
64147
64148
// -------- func lzma.decoder.decode_optional_end_of_stream
64149
64150
WUFFS_BASE__GENERATED_C_CODE
64151
static wuffs_base__status
64152
wuffs_lzma__decoder__decode_optional_end_of_stream(
64153
    wuffs_lzma__decoder* self,
64154
    wuffs_base__io_buffer* a_src,
64155
    wuffs_base__slice_u8 a_workbuf) {
64156
  wuffs_base__status status = wuffs_base__make_status(NULL);
64157
64158
  wuffs_base__io_buffer u_w = wuffs_base__empty_io_buffer();
64159
  wuffs_base__io_buffer* v_w = &u_w;
64160
  uint8_t* iop_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
64161
  uint8_t* io0_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
64162
  uint8_t* io1_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
64163
  uint8_t* io2_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
64164
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
64165
64166
  uint32_t coro_susp_point = self->private_impl.p_decode_optional_end_of_stream;
64167
  switch (coro_susp_point) {
64168
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
64169
64170
    self->private_impl.f_stashed_pos_end = 18446744073709551615u;
64171
    while (true) {
64172
      {
64173
        wuffs_base__io_buffer* o_0_v_w = v_w;
64174
        uint8_t* o_0_iop_v_w = iop_v_w;
64175
        uint8_t* o_0_io0_v_w = io0_v_w;
64176
        uint8_t* o_0_io1_v_w = io1_v_w;
64177
        uint8_t* o_0_io2_v_w = io2_v_w;
64178
        v_w = wuffs_private_impl__io_writer__set(
64179
            &u_w,
64180
            &iop_v_w,
64181
            &io0_v_w,
64182
            &io1_v_w,
64183
            &io2_v_w,
64184
            wuffs_base__utility__empty_slice_u8(),
64185
            0u);
64186
        {
64187
          wuffs_base__status t_0 = wuffs_lzma__decoder__decode_bitstream_slow(self, v_w, a_src, a_workbuf);
64188
          v_status = t_0;
64189
        }
64190
        v_w = o_0_v_w;
64191
        iop_v_w = o_0_iop_v_w;
64192
        io0_v_w = o_0_io0_v_w;
64193
        io1_v_w = o_0_io1_v_w;
64194
        io2_v_w = o_0_io2_v_w;
64195
      }
64196
      if (wuffs_base__status__is_ok(&v_status)) {
64197
        break;
64198
      } else if (v_status.repr == wuffs_base__suspension__short_write) {
64199
        status = wuffs_base__make_status(wuffs_lzma__error__bad_bitstream_trailer);
64200
        goto exit;
64201
      }
64202
      status = v_status;
64203
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
64204
    }
64205
    self->private_impl.f_stashed_pos_end = self->private_impl.f_stashed_pos;
64206
64207
    ok:
64208
    self->private_impl.p_decode_optional_end_of_stream = 0;
64209
    goto exit;
64210
  }
64211
64212
  goto suspend;
64213
  suspend:
64214
  self->private_impl.p_decode_optional_end_of_stream = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
64215
64216
  goto exit;
64217
  exit:
64218
  return status;
64219
}
64220
64221
// -------- func lzma.decoder.initialize_dict
64222
64223
WUFFS_BASE__GENERATED_C_CODE
64224
static wuffs_base__empty_struct
64225
wuffs_lzma__decoder__initialize_dict(
64226
    wuffs_lzma__decoder* self) {
64227
  self->private_impl.f_dict_workbuf_index = 0u;
64228
  self->private_impl.f_dict_seen = 0u;
64229
  self->private_impl.f_stashed_bytes[0u] = 0u;
64230
  self->private_impl.f_stashed_bytes[1u] = 0u;
64231
  self->private_impl.f_stashed_pos = 0u;
64232
  return wuffs_base__make_empty_struct();
64233
}
64234
64235
// -------- func lzma.decoder.initialize_probs
64236
64237
WUFFS_BASE__GENERATED_C_CODE
64238
static wuffs_base__empty_struct
64239
wuffs_lzma__decoder__initialize_probs(
64240
    wuffs_lzma__decoder* self) {
64241
  uint32_t v_i = 0;
64242
  uint32_t v_j = 0;
64243
64244
  v_i = 0u;
64245
  while (v_i < 192u) {
64246
    self->private_data.f_probs_ao00[v_i] = 1024u;
64247
    v_i += 1u;
64248
  }
64249
  v_i = 0u;
64250
  while (v_i < 12u) {
64251
    self->private_data.f_probs_ao20[v_i] = 1024u;
64252
    v_i += 1u;
64253
  }
64254
  v_i = 0u;
64255
  while (v_i < 12u) {
64256
    self->private_data.f_probs_ao40[v_i] = 1024u;
64257
    v_i += 1u;
64258
  }
64259
  v_i = 0u;
64260
  while (v_i < 192u) {
64261
    self->private_data.f_probs_ao41[v_i] = 1024u;
64262
    v_i += 1u;
64263
  }
64264
  v_i = 0u;
64265
  while (v_i < 12u) {
64266
    self->private_data.f_probs_ao60[v_i] = 1024u;
64267
    v_i += 1u;
64268
  }
64269
  v_i = 0u;
64270
  while (v_i < 12u) {
64271
    self->private_data.f_probs_ao63[v_i] = 1024u;
64272
    v_i += 1u;
64273
  }
64274
  v_i = 0u;
64275
  while (v_i < 16u) {
64276
    v_j = 0u;
64277
    while (v_j < 8u) {
64278
      self->private_data.f_probs_match_len_low[v_i][v_j] = 1024u;
64279
      v_j += 1u;
64280
    }
64281
    v_i += 1u;
64282
  }
64283
  v_i = 0u;
64284
  while (v_i < 16u) {
64285
    v_j = 0u;
64286
    while (v_j < 8u) {
64287
      self->private_data.f_probs_match_len_mid[v_i][v_j] = 1024u;
64288
      v_j += 1u;
64289
    }
64290
    v_i += 1u;
64291
  }
64292
  v_i = 0u;
64293
  while (v_i < 256u) {
64294
    self->private_data.f_probs_match_len_high[0u][v_i] = 1024u;
64295
    v_i += 1u;
64296
  }
64297
  v_i = 0u;
64298
  while (v_i < 16u) {
64299
    v_j = 0u;
64300
    while (v_j < 8u) {
64301
      self->private_data.f_probs_longrep_len_low[v_i][v_j] = 1024u;
64302
      v_j += 1u;
64303
    }
64304
    v_i += 1u;
64305
  }
64306
  v_i = 0u;
64307
  while (v_i < 16u) {
64308
    v_j = 0u;
64309
    while (v_j < 8u) {
64310
      self->private_data.f_probs_longrep_len_mid[v_i][v_j] = 1024u;
64311
      v_j += 1u;
64312
    }
64313
    v_i += 1u;
64314
  }
64315
  v_i = 0u;
64316
  while (v_i < 256u) {
64317
    self->private_data.f_probs_longrep_len_high[0u][v_i] = 1024u;
64318
    v_i += 1u;
64319
  }
64320
  v_i = 0u;
64321
  while (v_i < 4u) {
64322
    v_j = 0u;
64323
    while (v_j < 64u) {
64324
      self->private_data.f_probs_slot[v_i][v_j] = 1024u;
64325
      v_j += 1u;
64326
    }
64327
    v_i += 1u;
64328
  }
64329
  v_i = 0u;
64330
  while (v_i < 128u) {
64331
    self->private_data.f_probs_small_dist[v_i] = 1024u;
64332
    v_i += 1u;
64333
  }
64334
  v_i = 0u;
64335
  while (v_i < 16u) {
64336
    self->private_data.f_probs_large_dist[v_i] = 1024u;
64337
    v_i += 1u;
64338
  }
64339
  v_i = 0u;
64340
  while (v_i < 16u) {
64341
    v_j = 0u;
64342
    while (v_j < 768u) {
64343
      self->private_data.f_probs_lit[v_i][v_j] = 1024u;
64344
      v_j += 1u;
64345
    }
64346
    v_i += 1u;
64347
  }
64348
  self->private_impl.f_stashed_state = 0u;
64349
  self->private_impl.f_stashed_rep0 = 0u;
64350
  self->private_impl.f_stashed_rep1 = 0u;
64351
  self->private_impl.f_stashed_rep2 = 0u;
64352
  self->private_impl.f_stashed_rep3 = 0u;
64353
  return wuffs_base__make_empty_struct();
64354
}
64355
64356
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZMA)
64357
64358
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZIP)
64359
64360
// ---------------- Status Codes Implementations
64361
64362
const char wuffs_lzip__error__bad_checksum[] = "#lzip: bad checksum";
64363
const char wuffs_lzip__error__bad_footer[] = "#lzip: bad footer";
64364
const char wuffs_lzip__error__bad_header[] = "#lzip: bad header";
64365
const char wuffs_lzip__error__truncated_input[] = "#lzip: truncated input";
64366
64367
// ---------------- Private Consts
64368
64369
// ---------------- Private Initializer Prototypes
64370
64371
// ---------------- Private Function Prototypes
64372
64373
WUFFS_BASE__GENERATED_C_CODE
64374
static wuffs_base__status
64375
wuffs_lzip__decoder__do_transform_io(
64376
    wuffs_lzip__decoder* self,
64377
    wuffs_base__io_buffer* a_dst,
64378
    wuffs_base__io_buffer* a_src,
64379
    wuffs_base__slice_u8 a_workbuf);
64380
64381
// ---------------- VTables
64382
64383
const wuffs_base__io_transformer__func_ptrs
64384
wuffs_lzip__decoder__func_ptrs_for__wuffs_base__io_transformer = {
64385
  (wuffs_base__optional_u63(*)(const void*))(&wuffs_lzip__decoder__dst_history_retain_length),
64386
  (uint64_t(*)(const void*,
64387
      uint32_t))(&wuffs_lzip__decoder__get_quirk),
64388
  (wuffs_base__status(*)(void*,
64389
      uint32_t,
64390
      uint64_t))(&wuffs_lzip__decoder__set_quirk),
64391
  (wuffs_base__status(*)(void*,
64392
      wuffs_base__io_buffer*,
64393
      wuffs_base__io_buffer*,
64394
      wuffs_base__slice_u8))(&wuffs_lzip__decoder__transform_io),
64395
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_lzip__decoder__workbuf_len),
64396
};
64397
64398
// ---------------- Initializer Implementations
64399
64400
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
64401
wuffs_lzip__decoder__initialize(
64402
    wuffs_lzip__decoder* self,
64403
    size_t sizeof_star_self,
64404
    uint64_t wuffs_version,
64405
    uint32_t options){
64406
  if (!self) {
64407
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
64408
  }
64409
  if (sizeof(*self) != sizeof_star_self) {
64410
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
64411
  }
64412
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
64413
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
64414
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
64415
  }
64416
64417
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
64418
    // The whole point of this if-check is to detect an uninitialized *self.
64419
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
64420
#if !defined(__clang__) && defined(__GNUC__)
64421
#pragma GCC diagnostic push
64422
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
64423
#endif
64424
    if (self->private_impl.magic != 0) {
64425
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
64426
    }
64427
#if !defined(__clang__) && defined(__GNUC__)
64428
#pragma GCC diagnostic pop
64429
#endif
64430
  } else {
64431
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
64432
      memset(self, 0, sizeof(*self));
64433
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
64434
    } else {
64435
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
64436
    }
64437
  }
64438
64439
  {
64440
    wuffs_base__status z = wuffs_crc32__ieee_hasher__initialize(
64441
        &self->private_data.f_crc32, sizeof(self->private_data.f_crc32), WUFFS_VERSION, options);
64442
    if (z.repr) {
64443
      return z;
64444
    }
64445
  }
64446
  {
64447
    wuffs_base__status z = wuffs_lzma__decoder__initialize(
64448
        &self->private_data.f_lzma, sizeof(self->private_data.f_lzma), WUFFS_VERSION, options);
64449
    if (z.repr) {
64450
      return z;
64451
    }
64452
  }
64453
  self->private_impl.magic = WUFFS_BASE__MAGIC;
64454
  self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name =
64455
      wuffs_base__io_transformer__vtable_name;
64456
  self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers =
64457
      (const void*)(&wuffs_lzip__decoder__func_ptrs_for__wuffs_base__io_transformer);
64458
  return wuffs_base__make_status(NULL);
64459
}
64460
64461
wuffs_lzip__decoder*
64462
wuffs_lzip__decoder__alloc(void) {
64463
  wuffs_lzip__decoder* x =
64464
      (wuffs_lzip__decoder*)(calloc(1, sizeof(wuffs_lzip__decoder)));
64465
  if (!x) {
64466
    return NULL;
64467
  }
64468
  if (wuffs_lzip__decoder__initialize(
64469
      x, sizeof(wuffs_lzip__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
64470
    free(x);
64471
    return NULL;
64472
  }
64473
  return x;
64474
}
64475
64476
size_t
64477
sizeof__wuffs_lzip__decoder(void) {
64478
  return sizeof(wuffs_lzip__decoder);
64479
}
64480
64481
// ---------------- Function Implementations
64482
64483
// -------- func lzip.decoder.get_quirk
64484
64485
WUFFS_BASE__GENERATED_C_CODE
64486
WUFFS_BASE__MAYBE_STATIC uint64_t
64487
wuffs_lzip__decoder__get_quirk(
64488
    const wuffs_lzip__decoder* self,
64489
    uint32_t a_key) {
64490
  if (!self) {
64491
    return 0;
64492
  }
64493
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
64494
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
64495
    return 0;
64496
  }
64497
64498
  if ((a_key == 1u) && self->private_impl.f_ignore_checksum) {
64499
    return 1u;
64500
  }
64501
  return 0u;
64502
}
64503
64504
// -------- func lzip.decoder.set_quirk
64505
64506
WUFFS_BASE__GENERATED_C_CODE
64507
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
64508
wuffs_lzip__decoder__set_quirk(
64509
    wuffs_lzip__decoder* self,
64510
    uint32_t a_key,
64511
    uint64_t a_value) {
64512
  if (!self) {
64513
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
64514
  }
64515
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
64516
    return wuffs_base__make_status(
64517
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
64518
        ? wuffs_base__error__disabled_by_previous_error
64519
        : wuffs_base__error__initialize_not_called);
64520
  }
64521
64522
  if (a_key == 1u) {
64523
    self->private_impl.f_ignore_checksum = (a_value > 0u);
64524
    return wuffs_base__make_status(NULL);
64525
  }
64526
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
64527
}
64528
64529
// -------- func lzip.decoder.dst_history_retain_length
64530
64531
WUFFS_BASE__GENERATED_C_CODE
64532
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
64533
wuffs_lzip__decoder__dst_history_retain_length(
64534
    const wuffs_lzip__decoder* self) {
64535
  if (!self) {
64536
    return wuffs_base__utility__make_optional_u63(false, 0u);
64537
  }
64538
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
64539
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
64540
    return wuffs_base__utility__make_optional_u63(false, 0u);
64541
  }
64542
64543
  return wuffs_lzma__decoder__dst_history_retain_length(&self->private_data.f_lzma);
64544
}
64545
64546
// -------- func lzip.decoder.workbuf_len
64547
64548
WUFFS_BASE__GENERATED_C_CODE
64549
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
64550
wuffs_lzip__decoder__workbuf_len(
64551
    const wuffs_lzip__decoder* self) {
64552
  if (!self) {
64553
    return wuffs_base__utility__empty_range_ii_u64();
64554
  }
64555
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
64556
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
64557
    return wuffs_base__utility__empty_range_ii_u64();
64558
  }
64559
64560
  return wuffs_lzma__decoder__workbuf_len(&self->private_data.f_lzma);
64561
}
64562
64563
// -------- func lzip.decoder.transform_io
64564
64565
WUFFS_BASE__GENERATED_C_CODE
64566
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
64567
wuffs_lzip__decoder__transform_io(
64568
    wuffs_lzip__decoder* self,
64569
    wuffs_base__io_buffer* a_dst,
64570
    wuffs_base__io_buffer* a_src,
64571
    wuffs_base__slice_u8 a_workbuf) {
64572
  if (!self) {
64573
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
64574
  }
64575
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
64576
    return wuffs_base__make_status(
64577
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
64578
        ? wuffs_base__error__disabled_by_previous_error
64579
        : wuffs_base__error__initialize_not_called);
64580
  }
64581
  if (!a_dst || !a_src) {
64582
    self->private_impl.magic = WUFFS_BASE__DISABLED;
64583
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
64584
  }
64585
  if ((self->private_impl.active_coroutine != 0) &&
64586
      (self->private_impl.active_coroutine != 1)) {
64587
    self->private_impl.magic = WUFFS_BASE__DISABLED;
64588
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
64589
  }
64590
  self->private_impl.active_coroutine = 0;
64591
  wuffs_base__status status = wuffs_base__make_status(NULL);
64592
64593
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
64594
64595
  uint32_t coro_susp_point = self->private_impl.p_transform_io;
64596
  switch (coro_susp_point) {
64597
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
64598
64599
    while (true) {
64600
      {
64601
        wuffs_base__status t_0 = wuffs_lzip__decoder__do_transform_io(self, a_dst, a_src, a_workbuf);
64602
        v_status = t_0;
64603
      }
64604
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
64605
        status = wuffs_base__make_status(wuffs_lzip__error__truncated_input);
64606
        goto exit;
64607
      }
64608
      status = v_status;
64609
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
64610
    }
64611
64612
    ok:
64613
    self->private_impl.p_transform_io = 0;
64614
    goto exit;
64615
  }
64616
64617
  goto suspend;
64618
  suspend:
64619
  self->private_impl.p_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
64620
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
64621
64622
  goto exit;
64623
  exit:
64624
  if (wuffs_base__status__is_error(&status)) {
64625
    self->private_impl.magic = WUFFS_BASE__DISABLED;
64626
  }
64627
  return status;
64628
}
64629
64630
// -------- func lzip.decoder.do_transform_io
64631
64632
WUFFS_BASE__GENERATED_C_CODE
64633
static wuffs_base__status
64634
wuffs_lzip__decoder__do_transform_io(
64635
    wuffs_lzip__decoder* self,
64636
    wuffs_base__io_buffer* a_dst,
64637
    wuffs_base__io_buffer* a_src,
64638
    wuffs_base__slice_u8 a_workbuf) {
64639
  wuffs_base__status status = wuffs_base__make_status(NULL);
64640
64641
  uint8_t v_c8 = 0;
64642
  uint32_t v_c32 = 0;
64643
  uint64_t v_c64 = 0;
64644
  uint64_t v_dmark = 0;
64645
  uint64_t v_smark = 0;
64646
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
64647
  uint32_t v_checksum_want = 0;
64648
  uint32_t v_checksum_have = 0;
64649
  uint64_t v_size_want = 0;
64650
64651
  uint8_t* iop_a_dst = NULL;
64652
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
64653
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
64654
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
64655
  if (a_dst && a_dst->data.ptr) {
64656
    io0_a_dst = a_dst->data.ptr;
64657
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
64658
    iop_a_dst = io1_a_dst;
64659
    io2_a_dst = io0_a_dst + a_dst->data.len;
64660
    if (a_dst->meta.closed) {
64661
      io2_a_dst = iop_a_dst;
64662
    }
64663
  }
64664
  const uint8_t* iop_a_src = NULL;
64665
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
64666
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
64667
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
64668
  if (a_src && a_src->data.ptr) {
64669
    io0_a_src = a_src->data.ptr;
64670
    io1_a_src = io0_a_src + a_src->meta.ri;
64671
    iop_a_src = io1_a_src;
64672
    io2_a_src = io0_a_src + a_src->meta.wi;
64673
  }
64674
64675
  uint32_t coro_susp_point = self->private_impl.p_do_transform_io;
64676
  switch (coro_susp_point) {
64677
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
64678
64679
    while (true) {
64680
      {
64681
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
64682
        uint64_t t_0;
64683
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 5)) {
64684
          t_0 = ((uint64_t)(wuffs_base__peek_u40le__no_bounds_check(iop_a_src)));
64685
          iop_a_src += 5;
64686
        } else {
64687
          self->private_data.s_do_transform_io.scratch = 0;
64688
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
64689
          while (true) {
64690
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
64691
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
64692
              goto suspend;
64693
            }
64694
            uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
64695
            uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
64696
            *scratch <<= 8;
64697
            *scratch >>= 8;
64698
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
64699
            if (num_bits_0 == 32) {
64700
              t_0 = ((uint64_t)(*scratch));
64701
              break;
64702
            }
64703
            num_bits_0 += 8u;
64704
            *scratch |= ((uint64_t)(num_bits_0)) << 56;
64705
          }
64706
        }
64707
        v_c64 = t_0;
64708
      }
64709
      if (v_c64 != 5641951820u) {
64710
        status = wuffs_base__make_status(wuffs_lzip__error__bad_header);
64711
        goto exit;
64712
      }
64713
      {
64714
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
64715
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
64716
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
64717
          goto suspend;
64718
        }
64719
        uint8_t t_1 = *iop_a_src++;
64720
        v_c8 = t_1;
64721
      }
64722
      v_status = wuffs_lzma__decoder__set_quirk(&self->private_data.f_lzma, 1290294273u, (1u | (((uint64_t)(v_c8)) << 8u)));
64723
      if ( ! wuffs_base__status__is_ok(&v_status)) {
64724
        if (v_status.repr == wuffs_base__error__bad_argument) {
64725
          status = wuffs_base__make_status(wuffs_lzip__error__bad_header);
64726
          goto exit;
64727
        }
64728
        status = v_status;
64729
        if (wuffs_base__status__is_error(&status)) {
64730
          goto exit;
64731
        } else if (wuffs_base__status__is_suspension(&status)) {
64732
          status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
64733
          goto exit;
64734
        }
64735
        goto ok;
64736
      }
64737
      self->private_impl.f_ssize_have = 0u;
64738
      self->private_impl.f_dsize_have = 0u;
64739
      wuffs_lzma__decoder__set_quirk(&self->private_data.f_lzma, 1290294272u, 1u);
64740
      while (true) {
64741
        v_dmark = ((uint64_t)(iop_a_dst - io0_a_dst));
64742
        v_smark = ((uint64_t)(iop_a_src - io0_a_src));
64743
        {
64744
          if (a_dst) {
64745
            a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
64746
          }
64747
          if (a_src) {
64748
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
64749
          }
64750
          wuffs_base__status t_2 = wuffs_lzma__decoder__transform_io(&self->private_data.f_lzma, a_dst, a_src, a_workbuf);
64751
          v_status = t_2;
64752
          if (a_dst) {
64753
            iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
64754
          }
64755
          if (a_src) {
64756
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
64757
          }
64758
        }
64759
        self->private_impl.f_ssize_have += wuffs_private_impl__io__count_since(v_smark, ((uint64_t)(iop_a_src - io0_a_src)));
64760
        self->private_impl.f_dsize_have += wuffs_private_impl__io__count_since(v_dmark, ((uint64_t)(iop_a_dst - io0_a_dst)));
64761
        if ( ! self->private_impl.f_ignore_checksum) {
64762
          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));
64763
        }
64764
        if (wuffs_base__status__is_ok(&v_status)) {
64765
          break;
64766
        }
64767
        status = v_status;
64768
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4);
64769
      }
64770
      {
64771
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
64772
        uint32_t t_3;
64773
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
64774
          t_3 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
64775
          iop_a_src += 4;
64776
        } else {
64777
          self->private_data.s_do_transform_io.scratch = 0;
64778
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
64779
          while (true) {
64780
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
64781
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
64782
              goto suspend;
64783
            }
64784
            uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
64785
            uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56));
64786
            *scratch <<= 8;
64787
            *scratch >>= 8;
64788
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3;
64789
            if (num_bits_3 == 24) {
64790
              t_3 = ((uint32_t)(*scratch));
64791
              break;
64792
            }
64793
            num_bits_3 += 8u;
64794
            *scratch |= ((uint64_t)(num_bits_3)) << 56;
64795
          }
64796
        }
64797
        v_checksum_want = t_3;
64798
      }
64799
      if ( ! self->private_impl.f_ignore_checksum) {
64800
        v_checksum_have = wuffs_crc32__ieee_hasher__checksum_u32(&self->private_data.f_crc32);
64801
        if (v_checksum_have != v_checksum_want) {
64802
          status = wuffs_base__make_status(wuffs_lzip__error__bad_checksum);
64803
          goto exit;
64804
        }
64805
      }
64806
      {
64807
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
64808
        uint64_t t_4;
64809
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) {
64810
          t_4 = wuffs_base__peek_u64le__no_bounds_check(iop_a_src);
64811
          iop_a_src += 8;
64812
        } else {
64813
          self->private_data.s_do_transform_io.scratch = 0;
64814
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
64815
          while (true) {
64816
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
64817
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
64818
              goto suspend;
64819
            }
64820
            uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
64821
            uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56));
64822
            *scratch <<= 8;
64823
            *scratch >>= 8;
64824
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4;
64825
            if (num_bits_4 == 56) {
64826
              t_4 = ((uint64_t)(*scratch));
64827
              break;
64828
            }
64829
            num_bits_4 += 8u;
64830
            *scratch |= ((uint64_t)(num_bits_4)) << 56;
64831
          }
64832
        }
64833
        v_size_want = t_4;
64834
      }
64835
      if (self->private_impl.f_dsize_have != v_size_want) {
64836
        status = wuffs_base__make_status(wuffs_lzip__error__bad_footer);
64837
        goto exit;
64838
      }
64839
      {
64840
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
64841
        uint64_t t_5;
64842
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) {
64843
          t_5 = wuffs_base__peek_u64le__no_bounds_check(iop_a_src);
64844
          iop_a_src += 8;
64845
        } else {
64846
          self->private_data.s_do_transform_io.scratch = 0;
64847
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
64848
          while (true) {
64849
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
64850
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
64851
              goto suspend;
64852
            }
64853
            uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
64854
            uint32_t num_bits_5 = ((uint32_t)(*scratch >> 56));
64855
            *scratch <<= 8;
64856
            *scratch >>= 8;
64857
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_5;
64858
            if (num_bits_5 == 56) {
64859
              t_5 = ((uint64_t)(*scratch));
64860
              break;
64861
            }
64862
            num_bits_5 += 8u;
64863
            *scratch |= ((uint64_t)(num_bits_5)) << 56;
64864
          }
64865
        }
64866
        v_size_want = t_5;
64867
      }
64868
      if ((v_size_want < 26u) || (2251799813685248u < v_size_want)) {
64869
        status = wuffs_base__make_status(wuffs_lzip__error__bad_footer);
64870
        goto exit;
64871
      } else if (self->private_impl.f_ssize_have != (v_size_want - 26u)) {
64872
        status = wuffs_base__make_status(wuffs_lzip__error__bad_footer);
64873
        goto exit;
64874
      }
64875
      while (((uint64_t)(io2_a_src - iop_a_src)) < 4u) {
64876
        if (a_src && a_src->meta.closed) {
64877
          goto label__outer__break;
64878
        }
64879
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
64880
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(11);
64881
      }
64882
      v_c32 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
64883
      if (v_c32 != 1346984524u) {
64884
        break;
64885
      }
64886
      wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32,
64887
          sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
64888
      wuffs_private_impl__ignore_status(wuffs_lzma__decoder__initialize(&self->private_data.f_lzma,
64889
          sizeof (wuffs_lzma__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
64890
    }
64891
    label__outer__break:;
64892
64893
    ok:
64894
    self->private_impl.p_do_transform_io = 0;
64895
    goto exit;
64896
  }
64897
64898
  goto suspend;
64899
  suspend:
64900
  self->private_impl.p_do_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
64901
64902
  goto exit;
64903
  exit:
64904
  if (a_dst && a_dst->data.ptr) {
64905
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
64906
  }
64907
  if (a_src && a_src->data.ptr) {
64908
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
64909
  }
64910
64911
  return status;
64912
}
64913
64914
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZIP)
64915
64916
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZW)
64917
64918
// ---------------- Status Codes Implementations
64919
64920
const char wuffs_lzw__error__bad_code[] = "#lzw: bad code";
64921
const char wuffs_lzw__error__truncated_input[] = "#lzw: truncated input";
64922
const char wuffs_lzw__error__internal_error_inconsistent_i_o[] = "#lzw: internal error: inconsistent I/O";
64923
64924
// ---------------- Private Consts
64925
64926
#define WUFFS_LZW__QUIRKS_BASE 1290672128u
64927
64928
// ---------------- Private Initializer Prototypes
64929
64930
// ---------------- Private Function Prototypes
64931
64932
WUFFS_BASE__GENERATED_C_CODE
64933
static wuffs_base__empty_struct
64934
wuffs_lzw__decoder__read_from(
64935
    wuffs_lzw__decoder* self,
64936
    wuffs_base__io_buffer* a_src);
64937
64938
WUFFS_BASE__GENERATED_C_CODE
64939
static wuffs_base__status
64940
wuffs_lzw__decoder__write_to(
64941
    wuffs_lzw__decoder* self,
64942
    wuffs_base__io_buffer* a_dst);
64943
64944
// ---------------- VTables
64945
64946
const wuffs_base__io_transformer__func_ptrs
64947
wuffs_lzw__decoder__func_ptrs_for__wuffs_base__io_transformer = {
64948
  (wuffs_base__optional_u63(*)(const void*))(&wuffs_lzw__decoder__dst_history_retain_length),
64949
  (uint64_t(*)(const void*,
64950
      uint32_t))(&wuffs_lzw__decoder__get_quirk),
64951
  (wuffs_base__status(*)(void*,
64952
      uint32_t,
64953
      uint64_t))(&wuffs_lzw__decoder__set_quirk),
64954
  (wuffs_base__status(*)(void*,
64955
      wuffs_base__io_buffer*,
64956
      wuffs_base__io_buffer*,
64957
      wuffs_base__slice_u8))(&wuffs_lzw__decoder__transform_io),
64958
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_lzw__decoder__workbuf_len),
64959
};
64960
64961
// ---------------- Initializer Implementations
64962
64963
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
64964
wuffs_lzw__decoder__initialize(
64965
    wuffs_lzw__decoder* self,
64966
    size_t sizeof_star_self,
64967
    uint64_t wuffs_version,
64968
    uint32_t options){
64969
  if (!self) {
64970
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
64971
  }
64972
  if (sizeof(*self) != sizeof_star_self) {
64973
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
64974
  }
64975
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
64976
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
64977
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
64978
  }
64979
64980
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
64981
    // The whole point of this if-check is to detect an uninitialized *self.
64982
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
64983
#if !defined(__clang__) && defined(__GNUC__)
64984
#pragma GCC diagnostic push
64985
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
64986
#endif
64987
    if (self->private_impl.magic != 0) {
64988
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
64989
    }
64990
#if !defined(__clang__) && defined(__GNUC__)
64991
#pragma GCC diagnostic pop
64992
#endif
64993
  } else {
64994
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
64995
      memset(self, 0, sizeof(*self));
64996
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
64997
    } else {
64998
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
64999
    }
65000
  }
65001
65002
  self->private_impl.magic = WUFFS_BASE__MAGIC;
65003
  self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name =
65004
      wuffs_base__io_transformer__vtable_name;
65005
  self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers =
65006
      (const void*)(&wuffs_lzw__decoder__func_ptrs_for__wuffs_base__io_transformer);
65007
  return wuffs_base__make_status(NULL);
65008
}
65009
65010
wuffs_lzw__decoder*
65011
wuffs_lzw__decoder__alloc(void) {
65012
  wuffs_lzw__decoder* x =
65013
      (wuffs_lzw__decoder*)(calloc(1, sizeof(wuffs_lzw__decoder)));
65014
  if (!x) {
65015
    return NULL;
65016
  }
65017
  if (wuffs_lzw__decoder__initialize(
65018
      x, sizeof(wuffs_lzw__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
65019
    free(x);
65020
    return NULL;
65021
  }
65022
  return x;
65023
}
65024
65025
size_t
65026
sizeof__wuffs_lzw__decoder(void) {
65027
  return sizeof(wuffs_lzw__decoder);
65028
}
65029
65030
// ---------------- Function Implementations
65031
65032
// -------- func lzw.decoder.get_quirk
65033
65034
WUFFS_BASE__GENERATED_C_CODE
65035
WUFFS_BASE__MAYBE_STATIC uint64_t
65036
wuffs_lzw__decoder__get_quirk(
65037
    const wuffs_lzw__decoder* self,
65038
    uint32_t a_key) {
65039
  if (!self) {
65040
    return 0;
65041
  }
65042
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
65043
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
65044
    return 0;
65045
  }
65046
65047
  if (a_key == 1290672128u) {
65048
    return ((uint64_t)(self->private_impl.f_pending_literal_width_plus_one));
65049
  }
65050
  return 0u;
65051
}
65052
65053
// -------- func lzw.decoder.set_quirk
65054
65055
WUFFS_BASE__GENERATED_C_CODE
65056
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
65057
wuffs_lzw__decoder__set_quirk(
65058
    wuffs_lzw__decoder* self,
65059
    uint32_t a_key,
65060
    uint64_t a_value) {
65061
  if (!self) {
65062
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
65063
  }
65064
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
65065
    return wuffs_base__make_status(
65066
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
65067
        ? wuffs_base__error__disabled_by_previous_error
65068
        : wuffs_base__error__initialize_not_called);
65069
  }
65070
65071
  if (a_key == 1290672128u) {
65072
    if (a_value > 9u) {
65073
      return wuffs_base__make_status(wuffs_base__error__bad_argument);
65074
    }
65075
    self->private_impl.f_pending_literal_width_plus_one = ((uint32_t)(a_value));
65076
    return wuffs_base__make_status(NULL);
65077
  }
65078
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
65079
}
65080
65081
// -------- func lzw.decoder.dst_history_retain_length
65082
65083
WUFFS_BASE__GENERATED_C_CODE
65084
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
65085
wuffs_lzw__decoder__dst_history_retain_length(
65086
    const wuffs_lzw__decoder* self) {
65087
  if (!self) {
65088
    return wuffs_base__utility__make_optional_u63(false, 0u);
65089
  }
65090
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
65091
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
65092
    return wuffs_base__utility__make_optional_u63(false, 0u);
65093
  }
65094
65095
  return wuffs_base__utility__make_optional_u63(true, 0u);
65096
}
65097
65098
// -------- func lzw.decoder.workbuf_len
65099
65100
WUFFS_BASE__GENERATED_C_CODE
65101
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
65102
wuffs_lzw__decoder__workbuf_len(
65103
    const wuffs_lzw__decoder* self) {
65104
  if (!self) {
65105
    return wuffs_base__utility__empty_range_ii_u64();
65106
  }
65107
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
65108
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
65109
    return wuffs_base__utility__empty_range_ii_u64();
65110
  }
65111
65112
  return wuffs_base__utility__make_range_ii_u64(0u, 0u);
65113
}
65114
65115
// -------- func lzw.decoder.transform_io
65116
65117
WUFFS_BASE__GENERATED_C_CODE
65118
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
65119
wuffs_lzw__decoder__transform_io(
65120
    wuffs_lzw__decoder* self,
65121
    wuffs_base__io_buffer* a_dst,
65122
    wuffs_base__io_buffer* a_src,
65123
    wuffs_base__slice_u8 a_workbuf) {
65124
  if (!self) {
65125
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
65126
  }
65127
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
65128
    return wuffs_base__make_status(
65129
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
65130
        ? wuffs_base__error__disabled_by_previous_error
65131
        : wuffs_base__error__initialize_not_called);
65132
  }
65133
  if (!a_dst || !a_src) {
65134
    self->private_impl.magic = WUFFS_BASE__DISABLED;
65135
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
65136
  }
65137
  if ((self->private_impl.active_coroutine != 0) &&
65138
      (self->private_impl.active_coroutine != 1)) {
65139
    self->private_impl.magic = WUFFS_BASE__DISABLED;
65140
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
65141
  }
65142
  self->private_impl.active_coroutine = 0;
65143
  wuffs_base__status status = wuffs_base__make_status(NULL);
65144
65145
  uint32_t v_i = 0;
65146
65147
  uint32_t coro_susp_point = self->private_impl.p_transform_io;
65148
  switch (coro_susp_point) {
65149
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
65150
65151
    self->private_impl.f_literal_width = 8u;
65152
    if (self->private_impl.f_pending_literal_width_plus_one > 0u) {
65153
      self->private_impl.f_literal_width = (self->private_impl.f_pending_literal_width_plus_one - 1u);
65154
    }
65155
    self->private_impl.f_clear_code = (((uint32_t)(1u)) << self->private_impl.f_literal_width);
65156
    self->private_impl.f_end_code = (self->private_impl.f_clear_code + 1u);
65157
    self->private_impl.f_save_code = self->private_impl.f_end_code;
65158
    self->private_impl.f_prev_code = self->private_impl.f_end_code;
65159
    self->private_impl.f_width = (self->private_impl.f_literal_width + 1u);
65160
    self->private_impl.f_bits = 0u;
65161
    self->private_impl.f_n_bits = 0u;
65162
    self->private_impl.f_output_ri = 0u;
65163
    self->private_impl.f_output_wi = 0u;
65164
    v_i = 0u;
65165
    while (v_i < self->private_impl.f_clear_code) {
65166
      self->private_data.f_lm1s[v_i] = 0u;
65167
      self->private_data.f_suffixes[v_i][0u] = ((uint8_t)(v_i));
65168
      v_i += 1u;
65169
    }
65170
    while (true) {
65171
      wuffs_lzw__decoder__read_from(self, a_src);
65172
      if (self->private_impl.f_output_wi > 0u) {
65173
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
65174
        status = wuffs_lzw__decoder__write_to(self, a_dst);
65175
        if (status.repr) {
65176
          goto suspend;
65177
        }
65178
      }
65179
      if (self->private_impl.f_read_from_return_value == 0u) {
65180
        break;
65181
      } else if (self->private_impl.f_read_from_return_value == 1u) {
65182
        continue;
65183
      } else if (self->private_impl.f_read_from_return_value == 2u) {
65184
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
65185
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2);
65186
      } else if (self->private_impl.f_read_from_return_value == 3u) {
65187
        status = wuffs_base__make_status(wuffs_lzw__error__truncated_input);
65188
        goto exit;
65189
      } else if (self->private_impl.f_read_from_return_value == 4u) {
65190
        status = wuffs_base__make_status(wuffs_lzw__error__bad_code);
65191
        goto exit;
65192
      } else {
65193
        status = wuffs_base__make_status(wuffs_lzw__error__internal_error_inconsistent_i_o);
65194
        goto exit;
65195
      }
65196
    }
65197
65198
    ok:
65199
    self->private_impl.p_transform_io = 0;
65200
    goto exit;
65201
  }
65202
65203
  goto suspend;
65204
  suspend:
65205
  self->private_impl.p_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
65206
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
65207
65208
  goto exit;
65209
  exit:
65210
  if (wuffs_base__status__is_error(&status)) {
65211
    self->private_impl.magic = WUFFS_BASE__DISABLED;
65212
  }
65213
  return status;
65214
}
65215
65216
// -------- func lzw.decoder.read_from
65217
65218
WUFFS_BASE__GENERATED_C_CODE
65219
static wuffs_base__empty_struct
65220
wuffs_lzw__decoder__read_from(
65221
    wuffs_lzw__decoder* self,
65222
    wuffs_base__io_buffer* a_src) {
65223
  uint32_t v_clear_code = 0;
65224
  uint32_t v_end_code = 0;
65225
  uint32_t v_save_code = 0;
65226
  uint32_t v_prev_code = 0;
65227
  uint32_t v_width = 0;
65228
  uint32_t v_bits = 0;
65229
  uint32_t v_n_bits = 0;
65230
  uint32_t v_output_wi = 0;
65231
  uint32_t v_code = 0;
65232
  uint32_t v_c = 0;
65233
  uint32_t v_o = 0;
65234
  uint32_t v_steps = 0;
65235
  uint8_t v_first_byte = 0;
65236
  uint16_t v_lm1_b = 0;
65237
  uint16_t v_lm1_a = 0;
65238
65239
  const uint8_t* iop_a_src = NULL;
65240
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
65241
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
65242
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
65243
  if (a_src && a_src->data.ptr) {
65244
    io0_a_src = a_src->data.ptr;
65245
    io1_a_src = io0_a_src + a_src->meta.ri;
65246
    iop_a_src = io1_a_src;
65247
    io2_a_src = io0_a_src + a_src->meta.wi;
65248
  }
65249
65250
  v_clear_code = self->private_impl.f_clear_code;
65251
  v_end_code = self->private_impl.f_end_code;
65252
  v_save_code = self->private_impl.f_save_code;
65253
  v_prev_code = self->private_impl.f_prev_code;
65254
  v_width = self->private_impl.f_width;
65255
  v_bits = self->private_impl.f_bits;
65256
  v_n_bits = self->private_impl.f_n_bits;
65257
  v_output_wi = self->private_impl.f_output_wi;
65258
  while (true) {
65259
    if (v_n_bits < v_width) {
65260
      if (((uint64_t)(io2_a_src - iop_a_src)) >= 4u) {
65261
        v_bits |= ((uint32_t)(wuffs_base__peek_u32le__no_bounds_check(iop_a_src) << v_n_bits));
65262
        iop_a_src += ((31u - v_n_bits) >> 3u);
65263
        v_n_bits |= 24u;
65264
      } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
65265
        if (a_src && a_src->meta.closed) {
65266
          self->private_impl.f_read_from_return_value = 3u;
65267
        } else {
65268
          self->private_impl.f_read_from_return_value = 2u;
65269
        }
65270
        break;
65271
      } else {
65272
        v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
65273
        iop_a_src += 1u;
65274
        v_n_bits += 8u;
65275
        if (v_n_bits >= v_width) {
65276
        } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
65277
          if (a_src && a_src->meta.closed) {
65278
            self->private_impl.f_read_from_return_value = 3u;
65279
          } else {
65280
            self->private_impl.f_read_from_return_value = 2u;
65281
          }
65282
          break;
65283
        } else {
65284
          v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
65285
          iop_a_src += 1u;
65286
          v_n_bits += 8u;
65287
          if (v_n_bits < v_width) {
65288
            self->private_impl.f_read_from_return_value = 5u;
65289
            break;
65290
          }
65291
        }
65292
      }
65293
    }
65294
    v_code = ((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(v_width));
65295
    v_bits >>= v_width;
65296
    v_n_bits -= v_width;
65297
    if (v_code < v_clear_code) {
65298
      self->private_data.f_output[v_output_wi] = ((uint8_t)(v_code));
65299
      v_output_wi = ((v_output_wi + 1u) & 8191u);
65300
      if (v_save_code <= 4095u) {
65301
        v_lm1_a = ((uint16_t)(((uint16_t)(self->private_data.f_lm1s[v_prev_code] + 1u)) & 4095u));
65302
        self->private_data.f_lm1s[v_save_code] = v_lm1_a;
65303
        if (((uint16_t)(v_lm1_a % 8u)) != 0u) {
65304
          self->private_impl.f_prefixes[v_save_code] = self->private_impl.f_prefixes[v_prev_code];
65305
          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]));
65306
          self->private_data.f_suffixes[v_save_code][((uint16_t)(v_lm1_a % 8u))] = ((uint8_t)(v_code));
65307
        } else {
65308
          self->private_impl.f_prefixes[v_save_code] = ((uint16_t)(v_prev_code));
65309
          self->private_data.f_suffixes[v_save_code][0u] = ((uint8_t)(v_code));
65310
        }
65311
        v_save_code += 1u;
65312
        if (v_width < 12u) {
65313
          v_width += (1u & (v_save_code >> v_width));
65314
        }
65315
        v_prev_code = v_code;
65316
      }
65317
    } else if (v_code <= v_end_code) {
65318
      if (v_code == v_end_code) {
65319
        self->private_impl.f_read_from_return_value = 0u;
65320
        break;
65321
      }
65322
      v_save_code = v_end_code;
65323
      v_prev_code = v_end_code;
65324
      v_width = (self->private_impl.f_literal_width + 1u);
65325
    } else if (v_code <= v_save_code) {
65326
      v_c = v_code;
65327
      if (v_code == v_save_code) {
65328
        v_c = v_prev_code;
65329
      }
65330
      v_o = ((v_output_wi + (((uint32_t)(self->private_data.f_lm1s[v_c])) & 4294967288u)) & 8191u);
65331
      v_output_wi = ((v_output_wi + 1u + ((uint32_t)(self->private_data.f_lm1s[v_c]))) & 8191u);
65332
      v_steps = (((uint32_t)(self->private_data.f_lm1s[v_c])) >> 3u);
65333
      while (true) {
65334
        memcpy((self->private_data.f_output)+(v_o), (self->private_data.f_suffixes[v_c]), 8u);
65335
        if (v_steps <= 0u) {
65336
          break;
65337
        }
65338
        v_steps -= 1u;
65339
        v_o = (((uint32_t)(v_o - 8u)) & 8191u);
65340
        v_c = ((uint32_t)(self->private_impl.f_prefixes[v_c]));
65341
      }
65342
      v_first_byte = self->private_data.f_suffixes[v_c][0u];
65343
      if (v_code == v_save_code) {
65344
        self->private_data.f_output[v_output_wi] = v_first_byte;
65345
        v_output_wi = ((v_output_wi + 1u) & 8191u);
65346
      }
65347
      if (v_save_code <= 4095u) {
65348
        v_lm1_b = ((uint16_t)(((uint16_t)(self->private_data.f_lm1s[v_prev_code] + 1u)) & 4095u));
65349
        self->private_data.f_lm1s[v_save_code] = v_lm1_b;
65350
        if (((uint16_t)(v_lm1_b % 8u)) != 0u) {
65351
          self->private_impl.f_prefixes[v_save_code] = self->private_impl.f_prefixes[v_prev_code];
65352
          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]));
65353
          self->private_data.f_suffixes[v_save_code][((uint16_t)(v_lm1_b % 8u))] = v_first_byte;
65354
        } else {
65355
          self->private_impl.f_prefixes[v_save_code] = ((uint16_t)(v_prev_code));
65356
          self->private_data.f_suffixes[v_save_code][0u] = ((uint8_t)(v_first_byte));
65357
        }
65358
        v_save_code += 1u;
65359
        if (v_width < 12u) {
65360
          v_width += (1u & (v_save_code >> v_width));
65361
        }
65362
        v_prev_code = v_code;
65363
      }
65364
    } else {
65365
      self->private_impl.f_read_from_return_value = 4u;
65366
      break;
65367
    }
65368
    if (v_output_wi > 4095u) {
65369
      self->private_impl.f_read_from_return_value = 1u;
65370
      break;
65371
    }
65372
  }
65373
  if (self->private_impl.f_read_from_return_value != 2u) {
65374
    while (v_n_bits >= 8u) {
65375
      v_n_bits -= 8u;
65376
      if (iop_a_src > io1_a_src) {
65377
        iop_a_src--;
65378
      } else {
65379
        self->private_impl.f_read_from_return_value = 5u;
65380
        break;
65381
      }
65382
    }
65383
  }
65384
  self->private_impl.f_save_code = v_save_code;
65385
  self->private_impl.f_prev_code = v_prev_code;
65386
  self->private_impl.f_width = v_width;
65387
  self->private_impl.f_bits = v_bits;
65388
  self->private_impl.f_n_bits = v_n_bits;
65389
  self->private_impl.f_output_wi = v_output_wi;
65390
  if (a_src && a_src->data.ptr) {
65391
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
65392
  }
65393
65394
  return wuffs_base__make_empty_struct();
65395
}
65396
65397
// -------- func lzw.decoder.write_to
65398
65399
WUFFS_BASE__GENERATED_C_CODE
65400
static wuffs_base__status
65401
wuffs_lzw__decoder__write_to(
65402
    wuffs_lzw__decoder* self,
65403
    wuffs_base__io_buffer* a_dst) {
65404
  wuffs_base__status status = wuffs_base__make_status(NULL);
65405
65406
  wuffs_base__slice_u8 v_s = {0};
65407
  uint64_t v_n = 0;
65408
65409
  uint8_t* iop_a_dst = NULL;
65410
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
65411
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
65412
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
65413
  if (a_dst && a_dst->data.ptr) {
65414
    io0_a_dst = a_dst->data.ptr;
65415
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
65416
    iop_a_dst = io1_a_dst;
65417
    io2_a_dst = io0_a_dst + a_dst->data.len;
65418
    if (a_dst->meta.closed) {
65419
      io2_a_dst = iop_a_dst;
65420
    }
65421
  }
65422
65423
  uint32_t coro_susp_point = self->private_impl.p_write_to;
65424
  switch (coro_susp_point) {
65425
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
65426
65427
    while (self->private_impl.f_output_wi > 0u) {
65428
      if (self->private_impl.f_output_ri > self->private_impl.f_output_wi) {
65429
        status = wuffs_base__make_status(wuffs_lzw__error__internal_error_inconsistent_i_o);
65430
        goto exit;
65431
      }
65432
      v_s = wuffs_base__make_slice_u8_ij(self->private_data.f_output,
65433
          self->private_impl.f_output_ri,
65434
          self->private_impl.f_output_wi);
65435
      v_n = wuffs_private_impl__io_writer__copy_from_slice(&iop_a_dst, io2_a_dst,v_s);
65436
      if (v_n == ((uint64_t)(v_s.len))) {
65437
        self->private_impl.f_output_ri = 0u;
65438
        self->private_impl.f_output_wi = 0u;
65439
        status = wuffs_base__make_status(NULL);
65440
        goto ok;
65441
      }
65442
      self->private_impl.f_output_ri = (((uint32_t)(self->private_impl.f_output_ri + ((uint32_t)(v_n)))) & 8191u);
65443
      status = wuffs_base__make_status(wuffs_base__suspension__short_write);
65444
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
65445
    }
65446
65447
    ok:
65448
    self->private_impl.p_write_to = 0;
65449
    goto exit;
65450
  }
65451
65452
  goto suspend;
65453
  suspend:
65454
  self->private_impl.p_write_to = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
65455
65456
  goto exit;
65457
  exit:
65458
  if (a_dst && a_dst->data.ptr) {
65459
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
65460
  }
65461
65462
  return status;
65463
}
65464
65465
// -------- func lzw.decoder.flush
65466
65467
WUFFS_BASE__GENERATED_C_CODE
65468
WUFFS_BASE__MAYBE_STATIC wuffs_base__slice_u8
65469
wuffs_lzw__decoder__flush(
65470
    wuffs_lzw__decoder* self) {
65471
  if (!self) {
65472
    return wuffs_base__empty_slice_u8();
65473
  }
65474
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
65475
    return wuffs_base__empty_slice_u8();
65476
  }
65477
65478
  uint32_t v_ri = 0;
65479
  uint32_t v_wi = 0;
65480
65481
  v_ri = self->private_impl.f_output_ri;
65482
  v_wi = self->private_impl.f_output_wi;
65483
  self->private_impl.f_output_ri = 0u;
65484
  self->private_impl.f_output_wi = 0u;
65485
  if (v_ri <= v_wi) {
65486
    return wuffs_base__make_slice_u8_ij(self->private_data.f_output, v_ri, v_wi);
65487
  }
65488
  return wuffs_base__make_slice_u8(self->private_data.f_output, 0);
65489
}
65490
65491
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZW)
65492
65493
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NETPBM)
65494
65495
// ---------------- Status Codes Implementations
65496
65497
const char wuffs_netpbm__error__bad_header[] = "#netpbm: bad header";
65498
const char wuffs_netpbm__error__truncated_input[] = "#netpbm: truncated input";
65499
const char wuffs_netpbm__error__unsupported_netpbm_file[] = "#netpbm: unsupported Netpbm file";
65500
const char wuffs_netpbm__note__internal_note_short_read[] = "@netpbm: internal note: short read";
65501
65502
// ---------------- Private Consts
65503
65504
// ---------------- Private Initializer Prototypes
65505
65506
// ---------------- Private Function Prototypes
65507
65508
WUFFS_BASE__GENERATED_C_CODE
65509
static wuffs_base__status
65510
wuffs_netpbm__decoder__do_decode_image_config(
65511
    wuffs_netpbm__decoder* self,
65512
    wuffs_base__image_config* a_dst,
65513
    wuffs_base__io_buffer* a_src);
65514
65515
WUFFS_BASE__GENERATED_C_CODE
65516
static wuffs_base__status
65517
wuffs_netpbm__decoder__do_decode_frame_config(
65518
    wuffs_netpbm__decoder* self,
65519
    wuffs_base__frame_config* a_dst,
65520
    wuffs_base__io_buffer* a_src);
65521
65522
WUFFS_BASE__GENERATED_C_CODE
65523
static wuffs_base__status
65524
wuffs_netpbm__decoder__do_decode_frame(
65525
    wuffs_netpbm__decoder* self,
65526
    wuffs_base__pixel_buffer* a_dst,
65527
    wuffs_base__io_buffer* a_src,
65528
    wuffs_base__pixel_blend a_blend,
65529
    wuffs_base__slice_u8 a_workbuf,
65530
    wuffs_base__decode_frame_options* a_opts);
65531
65532
WUFFS_BASE__GENERATED_C_CODE
65533
static wuffs_base__status
65534
wuffs_netpbm__decoder__swizzle_easy(
65535
    wuffs_netpbm__decoder* self,
65536
    wuffs_base__pixel_buffer* a_dst,
65537
    wuffs_base__io_buffer* a_src);
65538
65539
WUFFS_BASE__GENERATED_C_CODE
65540
static wuffs_base__status
65541
wuffs_netpbm__decoder__swizzle_hard(
65542
    wuffs_netpbm__decoder* self,
65543
    wuffs_base__pixel_buffer* a_dst,
65544
    wuffs_base__io_buffer* a_src);
65545
65546
// ---------------- VTables
65547
65548
const wuffs_base__image_decoder__func_ptrs
65549
wuffs_netpbm__decoder__func_ptrs_for__wuffs_base__image_decoder = {
65550
  (wuffs_base__status(*)(void*,
65551
      wuffs_base__pixel_buffer*,
65552
      wuffs_base__io_buffer*,
65553
      wuffs_base__pixel_blend,
65554
      wuffs_base__slice_u8,
65555
      wuffs_base__decode_frame_options*))(&wuffs_netpbm__decoder__decode_frame),
65556
  (wuffs_base__status(*)(void*,
65557
      wuffs_base__frame_config*,
65558
      wuffs_base__io_buffer*))(&wuffs_netpbm__decoder__decode_frame_config),
65559
  (wuffs_base__status(*)(void*,
65560
      wuffs_base__image_config*,
65561
      wuffs_base__io_buffer*))(&wuffs_netpbm__decoder__decode_image_config),
65562
  (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_netpbm__decoder__frame_dirty_rect),
65563
  (uint64_t(*)(const void*,
65564
      uint32_t))(&wuffs_netpbm__decoder__get_quirk),
65565
  (uint32_t(*)(const void*))(&wuffs_netpbm__decoder__num_animation_loops),
65566
  (uint64_t(*)(const void*))(&wuffs_netpbm__decoder__num_decoded_frame_configs),
65567
  (uint64_t(*)(const void*))(&wuffs_netpbm__decoder__num_decoded_frames),
65568
  (wuffs_base__status(*)(void*,
65569
      uint64_t,
65570
      uint64_t))(&wuffs_netpbm__decoder__restart_frame),
65571
  (wuffs_base__status(*)(void*,
65572
      uint32_t,
65573
      uint64_t))(&wuffs_netpbm__decoder__set_quirk),
65574
  (wuffs_base__empty_struct(*)(void*,
65575
      uint32_t,
65576
      bool))(&wuffs_netpbm__decoder__set_report_metadata),
65577
  (wuffs_base__status(*)(void*,
65578
      wuffs_base__io_buffer*,
65579
      wuffs_base__more_information*,
65580
      wuffs_base__io_buffer*))(&wuffs_netpbm__decoder__tell_me_more),
65581
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_netpbm__decoder__workbuf_len),
65582
};
65583
65584
// ---------------- Initializer Implementations
65585
65586
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
65587
wuffs_netpbm__decoder__initialize(
65588
    wuffs_netpbm__decoder* self,
65589
    size_t sizeof_star_self,
65590
    uint64_t wuffs_version,
65591
    uint32_t options){
65592
  if (!self) {
65593
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
65594
  }
65595
  if (sizeof(*self) != sizeof_star_self) {
65596
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
65597
  }
65598
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
65599
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
65600
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
65601
  }
65602
65603
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
65604
    // The whole point of this if-check is to detect an uninitialized *self.
65605
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
65606
#if !defined(__clang__) && defined(__GNUC__)
65607
#pragma GCC diagnostic push
65608
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
65609
#endif
65610
    if (self->private_impl.magic != 0) {
65611
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
65612
    }
65613
#if !defined(__clang__) && defined(__GNUC__)
65614
#pragma GCC diagnostic pop
65615
#endif
65616
  } else {
65617
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
65618
      memset(self, 0, sizeof(*self));
65619
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
65620
    } else {
65621
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
65622
    }
65623
  }
65624
65625
  self->private_impl.magic = WUFFS_BASE__MAGIC;
65626
  self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name =
65627
      wuffs_base__image_decoder__vtable_name;
65628
  self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers =
65629
      (const void*)(&wuffs_netpbm__decoder__func_ptrs_for__wuffs_base__image_decoder);
65630
  return wuffs_base__make_status(NULL);
65631
}
65632
65633
wuffs_netpbm__decoder*
65634
wuffs_netpbm__decoder__alloc(void) {
65635
  wuffs_netpbm__decoder* x =
65636
      (wuffs_netpbm__decoder*)(calloc(1, sizeof(wuffs_netpbm__decoder)));
65637
  if (!x) {
65638
    return NULL;
65639
  }
65640
  if (wuffs_netpbm__decoder__initialize(
65641
      x, sizeof(wuffs_netpbm__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
65642
    free(x);
65643
    return NULL;
65644
  }
65645
  return x;
65646
}
65647
65648
size_t
65649
sizeof__wuffs_netpbm__decoder(void) {
65650
  return sizeof(wuffs_netpbm__decoder);
65651
}
65652
65653
// ---------------- Function Implementations
65654
65655
// -------- func netpbm.decoder.get_quirk
65656
65657
WUFFS_BASE__GENERATED_C_CODE
65658
WUFFS_BASE__MAYBE_STATIC uint64_t
65659
wuffs_netpbm__decoder__get_quirk(
65660
    const wuffs_netpbm__decoder* self,
65661
    uint32_t a_key) {
65662
  if (!self) {
65663
    return 0;
65664
  }
65665
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
65666
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
65667
    return 0;
65668
  }
65669
65670
  return 0u;
65671
}
65672
65673
// -------- func netpbm.decoder.set_quirk
65674
65675
WUFFS_BASE__GENERATED_C_CODE
65676
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
65677
wuffs_netpbm__decoder__set_quirk(
65678
    wuffs_netpbm__decoder* self,
65679
    uint32_t a_key,
65680
    uint64_t a_value) {
65681
  if (!self) {
65682
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
65683
  }
65684
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
65685
    return wuffs_base__make_status(
65686
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
65687
        ? wuffs_base__error__disabled_by_previous_error
65688
        : wuffs_base__error__initialize_not_called);
65689
  }
65690
65691
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
65692
}
65693
65694
// -------- func netpbm.decoder.decode_image_config
65695
65696
WUFFS_BASE__GENERATED_C_CODE
65697
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
65698
wuffs_netpbm__decoder__decode_image_config(
65699
    wuffs_netpbm__decoder* self,
65700
    wuffs_base__image_config* a_dst,
65701
    wuffs_base__io_buffer* a_src) {
65702
  if (!self) {
65703
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
65704
  }
65705
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
65706
    return wuffs_base__make_status(
65707
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
65708
        ? wuffs_base__error__disabled_by_previous_error
65709
        : wuffs_base__error__initialize_not_called);
65710
  }
65711
  if (!a_src) {
65712
    self->private_impl.magic = WUFFS_BASE__DISABLED;
65713
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
65714
  }
65715
  if ((self->private_impl.active_coroutine != 0) &&
65716
      (self->private_impl.active_coroutine != 1)) {
65717
    self->private_impl.magic = WUFFS_BASE__DISABLED;
65718
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
65719
  }
65720
  self->private_impl.active_coroutine = 0;
65721
  wuffs_base__status status = wuffs_base__make_status(NULL);
65722
65723
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
65724
65725
  uint32_t coro_susp_point = self->private_impl.p_decode_image_config;
65726
  switch (coro_susp_point) {
65727
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
65728
65729
    while (true) {
65730
      {
65731
        wuffs_base__status t_0 = wuffs_netpbm__decoder__do_decode_image_config(self, a_dst, a_src);
65732
        v_status = t_0;
65733
      }
65734
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
65735
        status = wuffs_base__make_status(wuffs_netpbm__error__truncated_input);
65736
        goto exit;
65737
      }
65738
      status = v_status;
65739
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
65740
    }
65741
65742
    ok:
65743
    self->private_impl.p_decode_image_config = 0;
65744
    goto exit;
65745
  }
65746
65747
  goto suspend;
65748
  suspend:
65749
  self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
65750
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
65751
65752
  goto exit;
65753
  exit:
65754
  if (wuffs_base__status__is_error(&status)) {
65755
    self->private_impl.magic = WUFFS_BASE__DISABLED;
65756
  }
65757
  return status;
65758
}
65759
65760
// -------- func netpbm.decoder.do_decode_image_config
65761
65762
WUFFS_BASE__GENERATED_C_CODE
65763
static wuffs_base__status
65764
wuffs_netpbm__decoder__do_decode_image_config(
65765
    wuffs_netpbm__decoder* self,
65766
    wuffs_base__image_config* a_dst,
65767
    wuffs_base__io_buffer* a_src) {
65768
  wuffs_base__status status = wuffs_base__make_status(NULL);
65769
65770
  uint8_t v_c8 = 0;
65771
  uint32_t v_n = 0;
65772
65773
  const uint8_t* iop_a_src = NULL;
65774
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
65775
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
65776
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
65777
  if (a_src && a_src->data.ptr) {
65778
    io0_a_src = a_src->data.ptr;
65779
    io1_a_src = io0_a_src + a_src->meta.ri;
65780
    iop_a_src = io1_a_src;
65781
    io2_a_src = io0_a_src + a_src->meta.wi;
65782
  }
65783
65784
  uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config;
65785
  switch (coro_susp_point) {
65786
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
65787
65788
    if (self->private_impl.f_call_sequence != 0u) {
65789
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
65790
      goto exit;
65791
    }
65792
    {
65793
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
65794
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
65795
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
65796
        goto suspend;
65797
      }
65798
      uint8_t t_0 = *iop_a_src++;
65799
      v_c8 = t_0;
65800
    }
65801
    if (v_c8 != 80u) {
65802
      status = wuffs_base__make_status(wuffs_netpbm__error__bad_header);
65803
      goto exit;
65804
    }
65805
    {
65806
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
65807
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
65808
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
65809
        goto suspend;
65810
      }
65811
      uint8_t t_1 = *iop_a_src++;
65812
      v_c8 = t_1;
65813
    }
65814
    if ((v_c8 < 49u) || (55u < v_c8)) {
65815
      status = wuffs_base__make_status(wuffs_netpbm__error__bad_header);
65816
      goto exit;
65817
    } else if (v_c8 == 53u) {
65818
      self->private_impl.f_pixfmt = 536870920u;
65819
    } else if (v_c8 == 54u) {
65820
      self->private_impl.f_pixfmt = 2684356744u;
65821
    } else {
65822
      status = wuffs_base__make_status(wuffs_netpbm__error__unsupported_netpbm_file);
65823
      goto exit;
65824
    }
65825
    {
65826
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
65827
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
65828
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
65829
        goto suspend;
65830
      }
65831
      uint8_t t_2 = *iop_a_src++;
65832
      v_c8 = t_2;
65833
    }
65834
    if ((v_c8 != 32u) &&
65835
        (v_c8 != 9u) &&
65836
        (v_c8 != 10u) &&
65837
        (v_c8 != 13u)) {
65838
      status = wuffs_base__make_status(wuffs_netpbm__error__bad_header);
65839
      goto exit;
65840
    }
65841
    while (true) {
65842
      {
65843
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
65844
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
65845
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
65846
          goto suspend;
65847
        }
65848
        uint8_t t_3 = *iop_a_src++;
65849
        v_c8 = t_3;
65850
      }
65851
      if ((v_c8 == 32u) ||
65852
          (v_c8 == 9u) ||
65853
          (v_c8 == 10u) ||
65854
          (v_c8 == 13u)) {
65855
        continue;
65856
      } else if (v_c8 == 35u) {
65857
        while (true) {
65858
          {
65859
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
65860
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
65861
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
65862
              goto suspend;
65863
            }
65864
            uint8_t t_4 = *iop_a_src++;
65865
            v_c8 = t_4;
65866
          }
65867
          if (v_c8 == 10u) {
65868
            break;
65869
          }
65870
        }
65871
        continue;
65872
      } else if ((v_c8 < 48u) || (57u < v_c8)) {
65873
        status = wuffs_base__make_status(wuffs_netpbm__error__bad_header);
65874
        goto exit;
65875
      }
65876
      self->private_impl.f_width = ((uint32_t)(((uint8_t)(v_c8 - 48u))));
65877
      break;
65878
    }
65879
    while (true) {
65880
      {
65881
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
65882
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
65883
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
65884
          goto suspend;
65885
        }
65886
        uint8_t t_5 = *iop_a_src++;
65887
        v_c8 = t_5;
65888
      }
65889
      if ((v_c8 == 32u) ||
65890
          (v_c8 == 9u) ||
65891
          (v_c8 == 10u) ||
65892
          (v_c8 == 13u)) {
65893
        break;
65894
      } else if ((v_c8 < 48u) || (57u < v_c8)) {
65895
        status = wuffs_base__make_status(wuffs_netpbm__error__bad_header);
65896
        goto exit;
65897
      }
65898
      v_n = ((10u * self->private_impl.f_width) + ((uint32_t)(((uint8_t)(v_c8 - 48u)))));
65899
      if (v_n > 16777215u) {
65900
        status = wuffs_base__make_status(wuffs_netpbm__error__unsupported_netpbm_file);
65901
        goto exit;
65902
      }
65903
      self->private_impl.f_width = v_n;
65904
    }
65905
    while (true) {
65906
      {
65907
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
65908
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
65909
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
65910
          goto suspend;
65911
        }
65912
        uint8_t t_6 = *iop_a_src++;
65913
        v_c8 = t_6;
65914
      }
65915
      if ((v_c8 == 32u) ||
65916
          (v_c8 == 9u) ||
65917
          (v_c8 == 10u) ||
65918
          (v_c8 == 13u)) {
65919
        continue;
65920
      } else if (v_c8 == 35u) {
65921
        while (true) {
65922
          {
65923
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
65924
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
65925
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
65926
              goto suspend;
65927
            }
65928
            uint8_t t_7 = *iop_a_src++;
65929
            v_c8 = t_7;
65930
          }
65931
          if (v_c8 == 10u) {
65932
            break;
65933
          }
65934
        }
65935
        continue;
65936
      } else if ((v_c8 < 48u) || (57u < v_c8)) {
65937
        status = wuffs_base__make_status(wuffs_netpbm__error__bad_header);
65938
        goto exit;
65939
      }
65940
      self->private_impl.f_height = ((uint32_t)(((uint8_t)(v_c8 - 48u))));
65941
      break;
65942
    }
65943
    while (true) {
65944
      {
65945
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
65946
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
65947
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
65948
          goto suspend;
65949
        }
65950
        uint8_t t_8 = *iop_a_src++;
65951
        v_c8 = t_8;
65952
      }
65953
      if ((v_c8 == 32u) ||
65954
          (v_c8 == 9u) ||
65955
          (v_c8 == 10u) ||
65956
          (v_c8 == 13u)) {
65957
        break;
65958
      } else if ((v_c8 < 48u) || (57u < v_c8)) {
65959
        status = wuffs_base__make_status(wuffs_netpbm__error__bad_header);
65960
        goto exit;
65961
      }
65962
      v_n = ((10u * self->private_impl.f_height) + ((uint32_t)(((uint8_t)(v_c8 - 48u)))));
65963
      if (v_n > 16777215u) {
65964
        status = wuffs_base__make_status(wuffs_netpbm__error__unsupported_netpbm_file);
65965
        goto exit;
65966
      }
65967
      self->private_impl.f_height = v_n;
65968
    }
65969
    while (true) {
65970
      {
65971
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
65972
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
65973
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
65974
          goto suspend;
65975
        }
65976
        uint8_t t_9 = *iop_a_src++;
65977
        v_c8 = t_9;
65978
      }
65979
      if ((v_c8 == 32u) ||
65980
          (v_c8 == 9u) ||
65981
          (v_c8 == 10u) ||
65982
          (v_c8 == 13u)) {
65983
        continue;
65984
      } else if (v_c8 == 35u) {
65985
        while (true) {
65986
          {
65987
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11);
65988
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
65989
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
65990
              goto suspend;
65991
            }
65992
            uint8_t t_10 = *iop_a_src++;
65993
            v_c8 = t_10;
65994
          }
65995
          if (v_c8 == 10u) {
65996
            break;
65997
          }
65998
        }
65999
        continue;
66000
      } else if ((v_c8 < 48u) || (57u < v_c8)) {
66001
        status = wuffs_base__make_status(wuffs_netpbm__error__bad_header);
66002
        goto exit;
66003
      }
66004
      self->private_impl.f_max_value = ((uint32_t)(((uint8_t)(v_c8 - 48u))));
66005
      break;
66006
    }
66007
    while (true) {
66008
      {
66009
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12);
66010
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
66011
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
66012
          goto suspend;
66013
        }
66014
        uint8_t t_11 = *iop_a_src++;
66015
        v_c8 = t_11;
66016
      }
66017
      if ((v_c8 == 32u) ||
66018
          (v_c8 == 9u) ||
66019
          (v_c8 == 10u) ||
66020
          (v_c8 == 13u)) {
66021
        break;
66022
      } else if ((v_c8 < 48u) || (57u < v_c8)) {
66023
        status = wuffs_base__make_status(wuffs_netpbm__error__bad_header);
66024
        goto exit;
66025
      }
66026
      v_n = ((10u * self->private_impl.f_max_value) + ((uint32_t)(((uint8_t)(v_c8 - 48u)))));
66027
      if (v_n > 16777215u) {
66028
        status = wuffs_base__make_status(wuffs_netpbm__error__unsupported_netpbm_file);
66029
        goto exit;
66030
      }
66031
      self->private_impl.f_max_value = v_n;
66032
    }
66033
    if (self->private_impl.f_max_value == 255u) {
66034
    } else if (self->private_impl.f_max_value == 65535u) {
66035
      if (self->private_impl.f_pixfmt == 536870920u) {
66036
        self->private_impl.f_pixfmt = 537919499u;
66037
      } else if (self->private_impl.f_pixfmt == 2684356744u) {
66038
        self->private_impl.f_pixfmt = 2164308923u;
66039
      }
66040
    } else {
66041
      status = wuffs_base__make_status(wuffs_netpbm__error__unsupported_netpbm_file);
66042
      goto exit;
66043
    }
66044
    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)));
66045
    if (a_dst != NULL) {
66046
      wuffs_base__image_config__set(
66047
          a_dst,
66048
          self->private_impl.f_pixfmt,
66049
          0u,
66050
          self->private_impl.f_width,
66051
          self->private_impl.f_height,
66052
          self->private_impl.f_frame_config_io_position,
66053
          false);
66054
    }
66055
    self->private_impl.f_call_sequence = 32u;
66056
66057
    goto ok;
66058
    ok:
66059
    self->private_impl.p_do_decode_image_config = 0;
66060
    goto exit;
66061
  }
66062
66063
  goto suspend;
66064
  suspend:
66065
  self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
66066
66067
  goto exit;
66068
  exit:
66069
  if (a_src && a_src->data.ptr) {
66070
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
66071
  }
66072
66073
  return status;
66074
}
66075
66076
// -------- func netpbm.decoder.decode_frame_config
66077
66078
WUFFS_BASE__GENERATED_C_CODE
66079
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
66080
wuffs_netpbm__decoder__decode_frame_config(
66081
    wuffs_netpbm__decoder* self,
66082
    wuffs_base__frame_config* a_dst,
66083
    wuffs_base__io_buffer* a_src) {
66084
  if (!self) {
66085
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
66086
  }
66087
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
66088
    return wuffs_base__make_status(
66089
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
66090
        ? wuffs_base__error__disabled_by_previous_error
66091
        : wuffs_base__error__initialize_not_called);
66092
  }
66093
  if (!a_src) {
66094
    self->private_impl.magic = WUFFS_BASE__DISABLED;
66095
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
66096
  }
66097
  if ((self->private_impl.active_coroutine != 0) &&
66098
      (self->private_impl.active_coroutine != 2)) {
66099
    self->private_impl.magic = WUFFS_BASE__DISABLED;
66100
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
66101
  }
66102
  self->private_impl.active_coroutine = 0;
66103
  wuffs_base__status status = wuffs_base__make_status(NULL);
66104
66105
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
66106
66107
  uint32_t coro_susp_point = self->private_impl.p_decode_frame_config;
66108
  switch (coro_susp_point) {
66109
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
66110
66111
    while (true) {
66112
      {
66113
        wuffs_base__status t_0 = wuffs_netpbm__decoder__do_decode_frame_config(self, a_dst, a_src);
66114
        v_status = t_0;
66115
      }
66116
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
66117
        status = wuffs_base__make_status(wuffs_netpbm__error__truncated_input);
66118
        goto exit;
66119
      }
66120
      status = v_status;
66121
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
66122
    }
66123
66124
    ok:
66125
    self->private_impl.p_decode_frame_config = 0;
66126
    goto exit;
66127
  }
66128
66129
  goto suspend;
66130
  suspend:
66131
  self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
66132
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0;
66133
66134
  goto exit;
66135
  exit:
66136
  if (wuffs_base__status__is_error(&status)) {
66137
    self->private_impl.magic = WUFFS_BASE__DISABLED;
66138
  }
66139
  return status;
66140
}
66141
66142
// -------- func netpbm.decoder.do_decode_frame_config
66143
66144
WUFFS_BASE__GENERATED_C_CODE
66145
static wuffs_base__status
66146
wuffs_netpbm__decoder__do_decode_frame_config(
66147
    wuffs_netpbm__decoder* self,
66148
    wuffs_base__frame_config* a_dst,
66149
    wuffs_base__io_buffer* a_src) {
66150
  wuffs_base__status status = wuffs_base__make_status(NULL);
66151
66152
  const uint8_t* iop_a_src = NULL;
66153
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
66154
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
66155
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
66156
  if (a_src && a_src->data.ptr) {
66157
    io0_a_src = a_src->data.ptr;
66158
    io1_a_src = io0_a_src + a_src->meta.ri;
66159
    iop_a_src = io1_a_src;
66160
    io2_a_src = io0_a_src + a_src->meta.wi;
66161
  }
66162
66163
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config;
66164
  switch (coro_susp_point) {
66165
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
66166
66167
    if (self->private_impl.f_call_sequence == 32u) {
66168
    } else if (self->private_impl.f_call_sequence < 32u) {
66169
      if (a_src) {
66170
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
66171
      }
66172
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
66173
      status = wuffs_netpbm__decoder__do_decode_image_config(self, NULL, a_src);
66174
      if (a_src) {
66175
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
66176
      }
66177
      if (status.repr) {
66178
        goto suspend;
66179
      }
66180
    } else if (self->private_impl.f_call_sequence == 40u) {
66181
      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)))) {
66182
        status = wuffs_base__make_status(wuffs_base__error__bad_restart);
66183
        goto exit;
66184
      }
66185
    } else if (self->private_impl.f_call_sequence == 64u) {
66186
      self->private_impl.f_call_sequence = 96u;
66187
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
66188
      goto ok;
66189
    } else {
66190
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
66191
      goto ok;
66192
    }
66193
    if (a_dst != NULL) {
66194
      wuffs_base__frame_config__set(
66195
          a_dst,
66196
          wuffs_base__utility__make_rect_ie_u32(
66197
          0u,
66198
          0u,
66199
          self->private_impl.f_width,
66200
          self->private_impl.f_height),
66201
          ((wuffs_base__flicks)(0u)),
66202
          0u,
66203
          self->private_impl.f_frame_config_io_position,
66204
          0u,
66205
          false,
66206
          false,
66207
          4278190080u);
66208
    }
66209
    self->private_impl.f_call_sequence = 64u;
66210
66211
    ok:
66212
    self->private_impl.p_do_decode_frame_config = 0;
66213
    goto exit;
66214
  }
66215
66216
  goto suspend;
66217
  suspend:
66218
  self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
66219
66220
  goto exit;
66221
  exit:
66222
  if (a_src && a_src->data.ptr) {
66223
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
66224
  }
66225
66226
  return status;
66227
}
66228
66229
// -------- func netpbm.decoder.decode_frame
66230
66231
WUFFS_BASE__GENERATED_C_CODE
66232
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
66233
wuffs_netpbm__decoder__decode_frame(
66234
    wuffs_netpbm__decoder* self,
66235
    wuffs_base__pixel_buffer* a_dst,
66236
    wuffs_base__io_buffer* a_src,
66237
    wuffs_base__pixel_blend a_blend,
66238
    wuffs_base__slice_u8 a_workbuf,
66239
    wuffs_base__decode_frame_options* a_opts) {
66240
  if (!self) {
66241
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
66242
  }
66243
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
66244
    return wuffs_base__make_status(
66245
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
66246
        ? wuffs_base__error__disabled_by_previous_error
66247
        : wuffs_base__error__initialize_not_called);
66248
  }
66249
  if (!a_dst || !a_src) {
66250
    self->private_impl.magic = WUFFS_BASE__DISABLED;
66251
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
66252
  }
66253
  if ((self->private_impl.active_coroutine != 0) &&
66254
      (self->private_impl.active_coroutine != 3)) {
66255
    self->private_impl.magic = WUFFS_BASE__DISABLED;
66256
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
66257
  }
66258
  self->private_impl.active_coroutine = 0;
66259
  wuffs_base__status status = wuffs_base__make_status(NULL);
66260
66261
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
66262
66263
  uint32_t coro_susp_point = self->private_impl.p_decode_frame;
66264
  switch (coro_susp_point) {
66265
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
66266
66267
    while (true) {
66268
      {
66269
        wuffs_base__status t_0 = wuffs_netpbm__decoder__do_decode_frame(self,
66270
            a_dst,
66271
            a_src,
66272
            a_blend,
66273
            a_workbuf,
66274
            a_opts);
66275
        v_status = t_0;
66276
      }
66277
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
66278
        status = wuffs_base__make_status(wuffs_netpbm__error__truncated_input);
66279
        goto exit;
66280
      }
66281
      status = v_status;
66282
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
66283
    }
66284
66285
    ok:
66286
    self->private_impl.p_decode_frame = 0;
66287
    goto exit;
66288
  }
66289
66290
  goto suspend;
66291
  suspend:
66292
  self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
66293
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0;
66294
66295
  goto exit;
66296
  exit:
66297
  if (wuffs_base__status__is_error(&status)) {
66298
    self->private_impl.magic = WUFFS_BASE__DISABLED;
66299
  }
66300
  return status;
66301
}
66302
66303
// -------- func netpbm.decoder.do_decode_frame
66304
66305
WUFFS_BASE__GENERATED_C_CODE
66306
static wuffs_base__status
66307
wuffs_netpbm__decoder__do_decode_frame(
66308
    wuffs_netpbm__decoder* self,
66309
    wuffs_base__pixel_buffer* a_dst,
66310
    wuffs_base__io_buffer* a_src,
66311
    wuffs_base__pixel_blend a_blend,
66312
    wuffs_base__slice_u8 a_workbuf,
66313
    wuffs_base__decode_frame_options* a_opts) {
66314
  wuffs_base__status status = wuffs_base__make_status(NULL);
66315
66316
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
66317
66318
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame;
66319
  switch (coro_susp_point) {
66320
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
66321
66322
    if (self->private_impl.f_call_sequence == 64u) {
66323
    } else if (self->private_impl.f_call_sequence < 64u) {
66324
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
66325
      status = wuffs_netpbm__decoder__do_decode_frame_config(self, NULL, a_src);
66326
      if (status.repr) {
66327
        goto suspend;
66328
      }
66329
    } else {
66330
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
66331
      goto ok;
66332
    }
66333
    self->private_impl.f_dst_x = 0u;
66334
    self->private_impl.f_dst_y = 0u;
66335
    self->private_data.f_buffer[6u] = 255u;
66336
    self->private_data.f_buffer[7u] = 255u;
66337
    v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler,
66338
        wuffs_base__pixel_buffer__pixel_format(a_dst),
66339
        wuffs_base__pixel_buffer__palette(a_dst),
66340
        wuffs_base__utility__make_pixel_format(self->private_impl.f_pixfmt),
66341
        wuffs_base__utility__empty_slice_u8(),
66342
        a_blend);
66343
    if ( ! wuffs_base__status__is_ok(&v_status)) {
66344
      status = v_status;
66345
      if (wuffs_base__status__is_error(&status)) {
66346
        goto exit;
66347
      } else if (wuffs_base__status__is_suspension(&status)) {
66348
        status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
66349
        goto exit;
66350
      }
66351
      goto ok;
66352
    }
66353
    while (true) {
66354
      if (self->private_impl.f_pixfmt != 2164308923u) {
66355
        v_status = wuffs_netpbm__decoder__swizzle_easy(self, a_dst, a_src);
66356
      } else {
66357
        v_status = wuffs_netpbm__decoder__swizzle_hard(self, a_dst, a_src);
66358
      }
66359
      if (wuffs_base__status__is_ok(&v_status)) {
66360
        break;
66361
      } else if (v_status.repr != wuffs_netpbm__note__internal_note_short_read) {
66362
        status = v_status;
66363
        if (wuffs_base__status__is_error(&status)) {
66364
          goto exit;
66365
        } else if (wuffs_base__status__is_suspension(&status)) {
66366
          status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
66367
          goto exit;
66368
        }
66369
        goto ok;
66370
      }
66371
      status = wuffs_base__make_status(wuffs_base__suspension__short_read);
66372
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2);
66373
    }
66374
    self->private_impl.f_call_sequence = 96u;
66375
66376
    ok:
66377
    self->private_impl.p_do_decode_frame = 0;
66378
    goto exit;
66379
  }
66380
66381
  goto suspend;
66382
  suspend:
66383
  self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
66384
66385
  goto exit;
66386
  exit:
66387
  return status;
66388
}
66389
66390
// -------- func netpbm.decoder.swizzle_easy
66391
66392
WUFFS_BASE__GENERATED_C_CODE
66393
static wuffs_base__status
66394
wuffs_netpbm__decoder__swizzle_easy(
66395
    wuffs_netpbm__decoder* self,
66396
    wuffs_base__pixel_buffer* a_dst,
66397
    wuffs_base__io_buffer* a_src) {
66398
  wuffs_base__status status = wuffs_base__make_status(NULL);
66399
66400
  wuffs_base__pixel_format v_dst_pixfmt = {0};
66401
  uint32_t v_dst_bits_per_pixel = 0;
66402
  uint32_t v_dst_bytes_per_pixel = 0;
66403
  uint64_t v_dst_bytes_per_row = 0;
66404
  uint32_t v_src_bytes_per_pixel = 0;
66405
  wuffs_base__table_u8 v_tab = {0};
66406
  wuffs_base__slice_u8 v_dst = {0};
66407
  uint64_t v_i = 0;
66408
  uint64_t v_j = 0;
66409
  uint64_t v_n = 0;
66410
66411
  const uint8_t* iop_a_src = NULL;
66412
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
66413
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
66414
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
66415
  if (a_src && a_src->data.ptr) {
66416
    io0_a_src = a_src->data.ptr;
66417
    io1_a_src = io0_a_src + a_src->meta.ri;
66418
    iop_a_src = io1_a_src;
66419
    io2_a_src = io0_a_src + a_src->meta.wi;
66420
  }
66421
66422
  v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
66423
  v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
66424
  if ((v_dst_bits_per_pixel & 7u) != 0u) {
66425
    status = wuffs_base__make_status(wuffs_base__error__unsupported_option);
66426
    goto exit;
66427
  }
66428
  v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u);
66429
  v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel)));
66430
  v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
66431
  while (true) {
66432
    if (self->private_impl.f_dst_x == self->private_impl.f_width) {
66433
      self->private_impl.f_dst_x = 0u;
66434
      self->private_impl.f_dst_y += 1u;
66435
      if (self->private_impl.f_dst_y >= self->private_impl.f_height) {
66436
        break;
66437
      }
66438
    }
66439
    v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y);
66440
    if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) {
66441
      v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row);
66442
    }
66443
    v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel)));
66444
    if (v_i >= ((uint64_t)(v_dst.len))) {
66445
      v_src_bytes_per_pixel = 1u;
66446
      if (self->private_impl.f_pixfmt == 2684356744u) {
66447
        v_src_bytes_per_pixel = 3u;
66448
      } else if (self->private_impl.f_pixfmt == 537919499u) {
66449
        v_src_bytes_per_pixel = 2u;
66450
      }
66451
      v_n = (((uint64_t)(io2_a_src - iop_a_src)) / ((uint64_t)(v_src_bytes_per_pixel)));
66452
      v_n = wuffs_base__u64__min(v_n, ((uint64_t)(((uint32_t)(self->private_impl.f_width - self->private_impl.f_dst_x)))));
66453
      v_j = v_n;
66454
      while (v_j >= 8u) {
66455
        if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 8u)))) {
66456
          iop_a_src += (v_src_bytes_per_pixel * 8u);
66457
        }
66458
        v_j -= 8u;
66459
      }
66460
      while (v_j > 0u) {
66461
        if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 1u)))) {
66462
          iop_a_src += (v_src_bytes_per_pixel * 1u);
66463
        }
66464
        v_j -= 1u;
66465
      }
66466
    } else {
66467
      v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_reader(
66468
          &self->private_impl.f_swizzler,
66469
          wuffs_base__slice_u8__subslice_i(v_dst, v_i),
66470
          wuffs_base__pixel_buffer__palette(a_dst),
66471
          &iop_a_src,
66472
          io2_a_src);
66473
    }
66474
    if (v_n == 0u) {
66475
      status = wuffs_base__make_status(wuffs_netpbm__note__internal_note_short_read);
66476
      goto ok;
66477
    }
66478
    wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n)));
66479
  }
66480
  status = wuffs_base__make_status(NULL);
66481
  goto ok;
66482
66483
  ok:
66484
  goto exit;
66485
  exit:
66486
  if (a_src && a_src->data.ptr) {
66487
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
66488
  }
66489
66490
  return status;
66491
}
66492
66493
// -------- func netpbm.decoder.swizzle_hard
66494
66495
WUFFS_BASE__GENERATED_C_CODE
66496
static wuffs_base__status
66497
wuffs_netpbm__decoder__swizzle_hard(
66498
    wuffs_netpbm__decoder* self,
66499
    wuffs_base__pixel_buffer* a_dst,
66500
    wuffs_base__io_buffer* a_src) {
66501
  wuffs_base__status status = wuffs_base__make_status(NULL);
66502
66503
  wuffs_base__pixel_format v_dst_pixfmt = {0};
66504
  uint32_t v_dst_bits_per_pixel = 0;
66505
  uint64_t v_dst_bytes_per_pixel = 0;
66506
  wuffs_base__table_u8 v_tab = {0};
66507
  wuffs_base__slice_u8 v_dst = {0};
66508
  uint64_t v_i = 0;
66509
66510
  const uint8_t* iop_a_src = NULL;
66511
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
66512
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
66513
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
66514
  if (a_src && a_src->data.ptr) {
66515
    io0_a_src = a_src->data.ptr;
66516
    io1_a_src = io0_a_src + a_src->meta.ri;
66517
    iop_a_src = io1_a_src;
66518
    io2_a_src = io0_a_src + a_src->meta.wi;
66519
  }
66520
66521
  v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
66522
  v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
66523
  if ((v_dst_bits_per_pixel & 7u) != 0u) {
66524
    status = wuffs_base__make_status(wuffs_base__error__unsupported_option);
66525
    goto exit;
66526
  }
66527
  v_dst_bytes_per_pixel = ((uint64_t)((v_dst_bits_per_pixel / 8u)));
66528
  v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
66529
  while (self->private_impl.f_dst_y < self->private_impl.f_height) {
66530
    v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y);
66531
    v_i = (((uint64_t)(self->private_impl.f_dst_x)) * v_dst_bytes_per_pixel);
66532
    if (v_i <= ((uint64_t)(v_dst.len))) {
66533
      v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_i);
66534
    }
66535
    while (true) {
66536
      if (self->private_impl.f_dst_x >= self->private_impl.f_width) {
66537
        self->private_impl.f_dst_x = 0u;
66538
        self->private_impl.f_dst_y += 1u;
66539
        break;
66540
      }
66541
      if (((uint64_t)(io2_a_src - iop_a_src)) < 6u) {
66542
        status = wuffs_base__make_status(wuffs_netpbm__note__internal_note_short_read);
66543
        goto ok;
66544
      }
66545
      self->private_data.f_buffer[5u] = iop_a_src[0u];
66546
      self->private_data.f_buffer[4u] = iop_a_src[1u];
66547
      self->private_data.f_buffer[3u] = iop_a_src[2u];
66548
      self->private_data.f_buffer[2u] = iop_a_src[3u];
66549
      self->private_data.f_buffer[1u] = iop_a_src[4u];
66550
      self->private_data.f_buffer[0u] = iop_a_src[5u];
66551
      iop_a_src += 6u;
66552
      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));
66553
      if (v_dst_bytes_per_pixel <= ((uint64_t)(v_dst.len))) {
66554
        v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_bytes_per_pixel);
66555
      }
66556
      self->private_impl.f_dst_x += 1u;
66557
    }
66558
  }
66559
  status = wuffs_base__make_status(NULL);
66560
  goto ok;
66561
66562
  ok:
66563
  goto exit;
66564
  exit:
66565
  if (a_src && a_src->data.ptr) {
66566
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
66567
  }
66568
66569
  return status;
66570
}
66571
66572
// -------- func netpbm.decoder.frame_dirty_rect
66573
66574
WUFFS_BASE__GENERATED_C_CODE
66575
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
66576
wuffs_netpbm__decoder__frame_dirty_rect(
66577
    const wuffs_netpbm__decoder* self) {
66578
  if (!self) {
66579
    return wuffs_base__utility__empty_rect_ie_u32();
66580
  }
66581
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
66582
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
66583
    return wuffs_base__utility__empty_rect_ie_u32();
66584
  }
66585
66586
  return wuffs_base__utility__make_rect_ie_u32(
66587
      0u,
66588
      0u,
66589
      self->private_impl.f_width,
66590
      self->private_impl.f_height);
66591
}
66592
66593
// -------- func netpbm.decoder.num_animation_loops
66594
66595
WUFFS_BASE__GENERATED_C_CODE
66596
WUFFS_BASE__MAYBE_STATIC uint32_t
66597
wuffs_netpbm__decoder__num_animation_loops(
66598
    const wuffs_netpbm__decoder* self) {
66599
  if (!self) {
66600
    return 0;
66601
  }
66602
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
66603
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
66604
    return 0;
66605
  }
66606
66607
  return 0u;
66608
}
66609
66610
// -------- func netpbm.decoder.num_decoded_frame_configs
66611
66612
WUFFS_BASE__GENERATED_C_CODE
66613
WUFFS_BASE__MAYBE_STATIC uint64_t
66614
wuffs_netpbm__decoder__num_decoded_frame_configs(
66615
    const wuffs_netpbm__decoder* self) {
66616
  if (!self) {
66617
    return 0;
66618
  }
66619
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
66620
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
66621
    return 0;
66622
  }
66623
66624
  if (self->private_impl.f_call_sequence > 32u) {
66625
    return 1u;
66626
  }
66627
  return 0u;
66628
}
66629
66630
// -------- func netpbm.decoder.num_decoded_frames
66631
66632
WUFFS_BASE__GENERATED_C_CODE
66633
WUFFS_BASE__MAYBE_STATIC uint64_t
66634
wuffs_netpbm__decoder__num_decoded_frames(
66635
    const wuffs_netpbm__decoder* self) {
66636
  if (!self) {
66637
    return 0;
66638
  }
66639
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
66640
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
66641
    return 0;
66642
  }
66643
66644
  if (self->private_impl.f_call_sequence > 64u) {
66645
    return 1u;
66646
  }
66647
  return 0u;
66648
}
66649
66650
// -------- func netpbm.decoder.restart_frame
66651
66652
WUFFS_BASE__GENERATED_C_CODE
66653
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
66654
wuffs_netpbm__decoder__restart_frame(
66655
    wuffs_netpbm__decoder* self,
66656
    uint64_t a_index,
66657
    uint64_t a_io_position) {
66658
  if (!self) {
66659
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
66660
  }
66661
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
66662
    return wuffs_base__make_status(
66663
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
66664
        ? wuffs_base__error__disabled_by_previous_error
66665
        : wuffs_base__error__initialize_not_called);
66666
  }
66667
66668
  if (self->private_impl.f_call_sequence < 32u) {
66669
    return wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
66670
  }
66671
  if ((a_index != 0u) || (a_io_position != self->private_impl.f_frame_config_io_position)) {
66672
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
66673
  }
66674
  self->private_impl.f_call_sequence = 40u;
66675
  return wuffs_base__make_status(NULL);
66676
}
66677
66678
// -------- func netpbm.decoder.set_report_metadata
66679
66680
WUFFS_BASE__GENERATED_C_CODE
66681
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
66682
wuffs_netpbm__decoder__set_report_metadata(
66683
    wuffs_netpbm__decoder* self,
66684
    uint32_t a_fourcc,
66685
    bool a_report) {
66686
  return wuffs_base__make_empty_struct();
66687
}
66688
66689
// -------- func netpbm.decoder.tell_me_more
66690
66691
WUFFS_BASE__GENERATED_C_CODE
66692
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
66693
wuffs_netpbm__decoder__tell_me_more(
66694
    wuffs_netpbm__decoder* self,
66695
    wuffs_base__io_buffer* a_dst,
66696
    wuffs_base__more_information* a_minfo,
66697
    wuffs_base__io_buffer* a_src) {
66698
  if (!self) {
66699
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
66700
  }
66701
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
66702
    return wuffs_base__make_status(
66703
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
66704
        ? wuffs_base__error__disabled_by_previous_error
66705
        : wuffs_base__error__initialize_not_called);
66706
  }
66707
  if (!a_dst || !a_src) {
66708
    self->private_impl.magic = WUFFS_BASE__DISABLED;
66709
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
66710
  }
66711
  if ((self->private_impl.active_coroutine != 0) &&
66712
      (self->private_impl.active_coroutine != 4)) {
66713
    self->private_impl.magic = WUFFS_BASE__DISABLED;
66714
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
66715
  }
66716
  self->private_impl.active_coroutine = 0;
66717
  wuffs_base__status status = wuffs_base__make_status(NULL);
66718
66719
  status = wuffs_base__make_status(wuffs_base__error__no_more_information);
66720
  goto exit;
66721
66722
  goto ok;
66723
  ok:
66724
  goto exit;
66725
  exit:
66726
  if (wuffs_base__status__is_error(&status)) {
66727
    self->private_impl.magic = WUFFS_BASE__DISABLED;
66728
  }
66729
  return status;
66730
}
66731
66732
// -------- func netpbm.decoder.workbuf_len
66733
66734
WUFFS_BASE__GENERATED_C_CODE
66735
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
66736
wuffs_netpbm__decoder__workbuf_len(
66737
    const wuffs_netpbm__decoder* self) {
66738
  if (!self) {
66739
    return wuffs_base__utility__empty_range_ii_u64();
66740
  }
66741
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
66742
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
66743
    return wuffs_base__utility__empty_range_ii_u64();
66744
  }
66745
66746
  return wuffs_base__utility__make_range_ii_u64(0u, 0u);
66747
}
66748
66749
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NETPBM)
66750
66751
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NIE)
66752
66753
// ---------------- Status Codes Implementations
66754
66755
const char wuffs_nie__error__bad_frame[] = "#nie: bad frame";
66756
const char wuffs_nie__error__bad_header[] = "#nie: bad header";
66757
const char wuffs_nie__error__truncated_input[] = "#nie: truncated input";
66758
const char wuffs_nie__error__unsupported_restart_frame_index[] = "#nie: unsupported restart frame index";
66759
const char wuffs_nie__note__internal_note_short_read[] = "@nie: internal note: short read";
66760
66761
// ---------------- Private Consts
66762
66763
// ---------------- Private Initializer Prototypes
66764
66765
// ---------------- Private Function Prototypes
66766
66767
WUFFS_BASE__GENERATED_C_CODE
66768
static wuffs_base__status
66769
wuffs_nie__decoder__do_decode_image_config(
66770
    wuffs_nie__decoder* self,
66771
    wuffs_base__image_config* a_dst,
66772
    wuffs_base__io_buffer* a_src);
66773
66774
WUFFS_BASE__GENERATED_C_CODE
66775
static wuffs_base__status
66776
wuffs_nie__decoder__do_decode_frame_config(
66777
    wuffs_nie__decoder* self,
66778
    wuffs_base__frame_config* a_dst,
66779
    wuffs_base__io_buffer* a_src);
66780
66781
WUFFS_BASE__GENERATED_C_CODE
66782
static wuffs_base__status
66783
wuffs_nie__decoder__decode_animation_info(
66784
    wuffs_nie__decoder* self,
66785
    wuffs_base__io_buffer* a_src);
66786
66787
WUFFS_BASE__GENERATED_C_CODE
66788
static wuffs_base__status
66789
wuffs_nie__decoder__skip_frame(
66790
    wuffs_nie__decoder* self,
66791
    wuffs_base__io_buffer* a_src);
66792
66793
WUFFS_BASE__GENERATED_C_CODE
66794
static wuffs_base__status
66795
wuffs_nie__decoder__do_decode_frame(
66796
    wuffs_nie__decoder* self,
66797
    wuffs_base__pixel_buffer* a_dst,
66798
    wuffs_base__io_buffer* a_src,
66799
    wuffs_base__pixel_blend a_blend,
66800
    wuffs_base__slice_u8 a_workbuf,
66801
    wuffs_base__decode_frame_options* a_opts);
66802
66803
WUFFS_BASE__GENERATED_C_CODE
66804
static wuffs_base__status
66805
wuffs_nie__decoder__swizzle(
66806
    wuffs_nie__decoder* self,
66807
    wuffs_base__pixel_buffer* a_dst,
66808
    wuffs_base__io_buffer* a_src);
66809
66810
// ---------------- VTables
66811
66812
const wuffs_base__image_decoder__func_ptrs
66813
wuffs_nie__decoder__func_ptrs_for__wuffs_base__image_decoder = {
66814
  (wuffs_base__status(*)(void*,
66815
      wuffs_base__pixel_buffer*,
66816
      wuffs_base__io_buffer*,
66817
      wuffs_base__pixel_blend,
66818
      wuffs_base__slice_u8,
66819
      wuffs_base__decode_frame_options*))(&wuffs_nie__decoder__decode_frame),
66820
  (wuffs_base__status(*)(void*,
66821
      wuffs_base__frame_config*,
66822
      wuffs_base__io_buffer*))(&wuffs_nie__decoder__decode_frame_config),
66823
  (wuffs_base__status(*)(void*,
66824
      wuffs_base__image_config*,
66825
      wuffs_base__io_buffer*))(&wuffs_nie__decoder__decode_image_config),
66826
  (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_nie__decoder__frame_dirty_rect),
66827
  (uint64_t(*)(const void*,
66828
      uint32_t))(&wuffs_nie__decoder__get_quirk),
66829
  (uint32_t(*)(const void*))(&wuffs_nie__decoder__num_animation_loops),
66830
  (uint64_t(*)(const void*))(&wuffs_nie__decoder__num_decoded_frame_configs),
66831
  (uint64_t(*)(const void*))(&wuffs_nie__decoder__num_decoded_frames),
66832
  (wuffs_base__status(*)(void*,
66833
      uint64_t,
66834
      uint64_t))(&wuffs_nie__decoder__restart_frame),
66835
  (wuffs_base__status(*)(void*,
66836
      uint32_t,
66837
      uint64_t))(&wuffs_nie__decoder__set_quirk),
66838
  (wuffs_base__empty_struct(*)(void*,
66839
      uint32_t,
66840
      bool))(&wuffs_nie__decoder__set_report_metadata),
66841
  (wuffs_base__status(*)(void*,
66842
      wuffs_base__io_buffer*,
66843
      wuffs_base__more_information*,
66844
      wuffs_base__io_buffer*))(&wuffs_nie__decoder__tell_me_more),
66845
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_nie__decoder__workbuf_len),
66846
};
66847
66848
// ---------------- Initializer Implementations
66849
66850
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
66851
wuffs_nie__decoder__initialize(
66852
    wuffs_nie__decoder* self,
66853
    size_t sizeof_star_self,
66854
    uint64_t wuffs_version,
66855
    uint32_t options){
66856
  if (!self) {
66857
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
66858
  }
66859
  if (sizeof(*self) != sizeof_star_self) {
66860
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
66861
  }
66862
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
66863
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
66864
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
66865
  }
66866
66867
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
66868
    // The whole point of this if-check is to detect an uninitialized *self.
66869
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
66870
#if !defined(__clang__) && defined(__GNUC__)
66871
#pragma GCC diagnostic push
66872
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
66873
#endif
66874
    if (self->private_impl.magic != 0) {
66875
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
66876
    }
66877
#if !defined(__clang__) && defined(__GNUC__)
66878
#pragma GCC diagnostic pop
66879
#endif
66880
  } else {
66881
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
66882
      memset(self, 0, sizeof(*self));
66883
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
66884
    } else {
66885
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
66886
    }
66887
  }
66888
66889
  self->private_impl.magic = WUFFS_BASE__MAGIC;
66890
  self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name =
66891
      wuffs_base__image_decoder__vtable_name;
66892
  self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers =
66893
      (const void*)(&wuffs_nie__decoder__func_ptrs_for__wuffs_base__image_decoder);
66894
  return wuffs_base__make_status(NULL);
66895
}
66896
66897
wuffs_nie__decoder*
66898
wuffs_nie__decoder__alloc(void) {
66899
  wuffs_nie__decoder* x =
66900
      (wuffs_nie__decoder*)(calloc(1, sizeof(wuffs_nie__decoder)));
66901
  if (!x) {
66902
    return NULL;
66903
  }
66904
  if (wuffs_nie__decoder__initialize(
66905
      x, sizeof(wuffs_nie__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
66906
    free(x);
66907
    return NULL;
66908
  }
66909
  return x;
66910
}
66911
66912
size_t
66913
sizeof__wuffs_nie__decoder(void) {
66914
  return sizeof(wuffs_nie__decoder);
66915
}
66916
66917
// ---------------- Function Implementations
66918
66919
// -------- func nie.decoder.get_quirk
66920
66921
WUFFS_BASE__GENERATED_C_CODE
66922
WUFFS_BASE__MAYBE_STATIC uint64_t
66923
wuffs_nie__decoder__get_quirk(
66924
    const wuffs_nie__decoder* self,
66925
    uint32_t a_key) {
66926
  if (!self) {
66927
    return 0;
66928
  }
66929
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
66930
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
66931
    return 0;
66932
  }
66933
66934
  return 0u;
66935
}
66936
66937
// -------- func nie.decoder.set_quirk
66938
66939
WUFFS_BASE__GENERATED_C_CODE
66940
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
66941
wuffs_nie__decoder__set_quirk(
66942
    wuffs_nie__decoder* self,
66943
    uint32_t a_key,
66944
    uint64_t a_value) {
66945
  if (!self) {
66946
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
66947
  }
66948
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
66949
    return wuffs_base__make_status(
66950
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
66951
        ? wuffs_base__error__disabled_by_previous_error
66952
        : wuffs_base__error__initialize_not_called);
66953
  }
66954
66955
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
66956
}
66957
66958
// -------- func nie.decoder.decode_image_config
66959
66960
WUFFS_BASE__GENERATED_C_CODE
66961
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
66962
wuffs_nie__decoder__decode_image_config(
66963
    wuffs_nie__decoder* self,
66964
    wuffs_base__image_config* a_dst,
66965
    wuffs_base__io_buffer* a_src) {
66966
  if (!self) {
66967
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
66968
  }
66969
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
66970
    return wuffs_base__make_status(
66971
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
66972
        ? wuffs_base__error__disabled_by_previous_error
66973
        : wuffs_base__error__initialize_not_called);
66974
  }
66975
  if (!a_src) {
66976
    self->private_impl.magic = WUFFS_BASE__DISABLED;
66977
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
66978
  }
66979
  if ((self->private_impl.active_coroutine != 0) &&
66980
      (self->private_impl.active_coroutine != 1)) {
66981
    self->private_impl.magic = WUFFS_BASE__DISABLED;
66982
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
66983
  }
66984
  self->private_impl.active_coroutine = 0;
66985
  wuffs_base__status status = wuffs_base__make_status(NULL);
66986
66987
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
66988
66989
  uint32_t coro_susp_point = self->private_impl.p_decode_image_config;
66990
  switch (coro_susp_point) {
66991
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
66992
66993
    while (true) {
66994
      {
66995
        wuffs_base__status t_0 = wuffs_nie__decoder__do_decode_image_config(self, a_dst, a_src);
66996
        v_status = t_0;
66997
      }
66998
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
66999
        status = wuffs_base__make_status(wuffs_nie__error__truncated_input);
67000
        goto exit;
67001
      }
67002
      status = v_status;
67003
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
67004
    }
67005
67006
    ok:
67007
    self->private_impl.p_decode_image_config = 0;
67008
    goto exit;
67009
  }
67010
67011
  goto suspend;
67012
  suspend:
67013
  self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
67014
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
67015
67016
  goto exit;
67017
  exit:
67018
  if (wuffs_base__status__is_error(&status)) {
67019
    self->private_impl.magic = WUFFS_BASE__DISABLED;
67020
  }
67021
  return status;
67022
}
67023
67024
// -------- func nie.decoder.do_decode_image_config
67025
67026
WUFFS_BASE__GENERATED_C_CODE
67027
static wuffs_base__status
67028
wuffs_nie__decoder__do_decode_image_config(
67029
    wuffs_nie__decoder* self,
67030
    wuffs_base__image_config* a_dst,
67031
    wuffs_base__io_buffer* a_src) {
67032
  wuffs_base__status status = wuffs_base__make_status(NULL);
67033
67034
  uint32_t v_a = 0;
67035
67036
  const uint8_t* iop_a_src = NULL;
67037
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
67038
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
67039
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
67040
  if (a_src && a_src->data.ptr) {
67041
    io0_a_src = a_src->data.ptr;
67042
    io1_a_src = io0_a_src + a_src->meta.ri;
67043
    iop_a_src = io1_a_src;
67044
    io2_a_src = io0_a_src + a_src->meta.wi;
67045
  }
67046
67047
  uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config;
67048
  switch (coro_susp_point) {
67049
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
67050
67051
    if (self->private_impl.f_call_sequence != 0u) {
67052
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
67053
      goto exit;
67054
    }
67055
    {
67056
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
67057
      uint32_t t_0;
67058
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
67059
        t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
67060
        iop_a_src += 4;
67061
      } else {
67062
        self->private_data.s_do_decode_image_config.scratch = 0;
67063
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
67064
        while (true) {
67065
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
67066
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
67067
            goto suspend;
67068
          }
67069
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
67070
          uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
67071
          *scratch <<= 8;
67072
          *scratch >>= 8;
67073
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
67074
          if (num_bits_0 == 24) {
67075
            t_0 = ((uint32_t)(*scratch));
67076
            break;
67077
          }
67078
          num_bits_0 += 8u;
67079
          *scratch |= ((uint64_t)(num_bits_0)) << 56;
67080
        }
67081
      }
67082
      v_a = t_0;
67083
    }
67084
    if (v_a == 1102037870u) {
67085
      self->private_impl.f_animated = true;
67086
    } else if (v_a == 1169146734u) {
67087
      self->private_impl.f_animated = false;
67088
    } else {
67089
      status = wuffs_base__make_status(wuffs_nie__error__bad_header);
67090
      goto exit;
67091
    }
67092
    {
67093
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
67094
      uint32_t t_1;
67095
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
67096
        t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
67097
        iop_a_src += 4;
67098
      } else {
67099
        self->private_data.s_do_decode_image_config.scratch = 0;
67100
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
67101
        while (true) {
67102
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
67103
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
67104
            goto suspend;
67105
          }
67106
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
67107
          uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
67108
          *scratch <<= 8;
67109
          *scratch >>= 8;
67110
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
67111
          if (num_bits_1 == 24) {
67112
            t_1 = ((uint32_t)(*scratch));
67113
            break;
67114
          }
67115
          num_bits_1 += 8u;
67116
          *scratch |= ((uint64_t)(num_bits_1)) << 56;
67117
        }
67118
      }
67119
      v_a = t_1;
67120
    }
67121
    if (v_a == 879649535u) {
67122
      self->private_impl.f_pixfmt = 2164295816u;
67123
    } else if (v_a == 946758399u) {
67124
      self->private_impl.f_pixfmt = 2164308923u;
67125
    } else if (v_a == 879780607u) {
67126
      self->private_impl.f_pixfmt = 2181073032u;
67127
    } else if (v_a == 946889471u) {
67128
      self->private_impl.f_pixfmt = 2181086139u;
67129
    } else {
67130
      status = wuffs_base__make_status(wuffs_nie__error__bad_header);
67131
      goto exit;
67132
    }
67133
    self->private_impl.f_nie_config = v_a;
67134
    {
67135
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
67136
      uint32_t t_2;
67137
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
67138
        t_2 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
67139
        iop_a_src += 4;
67140
      } else {
67141
        self->private_data.s_do_decode_image_config.scratch = 0;
67142
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
67143
        while (true) {
67144
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
67145
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
67146
            goto suspend;
67147
          }
67148
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
67149
          uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56));
67150
          *scratch <<= 8;
67151
          *scratch >>= 8;
67152
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2;
67153
          if (num_bits_2 == 24) {
67154
            t_2 = ((uint32_t)(*scratch));
67155
            break;
67156
          }
67157
          num_bits_2 += 8u;
67158
          *scratch |= ((uint64_t)(num_bits_2)) << 56;
67159
        }
67160
      }
67161
      v_a = t_2;
67162
    }
67163
    if (v_a > 2147483647u) {
67164
      status = wuffs_base__make_status(wuffs_nie__error__bad_header);
67165
      goto exit;
67166
    } else if (v_a > 16777215u) {
67167
      status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension);
67168
      goto exit;
67169
    }
67170
    self->private_impl.f_width = v_a;
67171
    {
67172
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
67173
      uint32_t t_3;
67174
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
67175
        t_3 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
67176
        iop_a_src += 4;
67177
      } else {
67178
        self->private_data.s_do_decode_image_config.scratch = 0;
67179
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
67180
        while (true) {
67181
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
67182
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
67183
            goto suspend;
67184
          }
67185
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
67186
          uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56));
67187
          *scratch <<= 8;
67188
          *scratch >>= 8;
67189
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3;
67190
          if (num_bits_3 == 24) {
67191
            t_3 = ((uint32_t)(*scratch));
67192
            break;
67193
          }
67194
          num_bits_3 += 8u;
67195
          *scratch |= ((uint64_t)(num_bits_3)) << 56;
67196
        }
67197
      }
67198
      v_a = t_3;
67199
    }
67200
    if (v_a > 2147483647u) {
67201
      status = wuffs_base__make_status(wuffs_nie__error__bad_header);
67202
      goto exit;
67203
    } else if (v_a > 16777215u) {
67204
      status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension);
67205
      goto exit;
67206
    }
67207
    self->private_impl.f_height = v_a;
67208
    if (a_dst != NULL) {
67209
      wuffs_base__image_config__set(
67210
          a_dst,
67211
          self->private_impl.f_pixfmt,
67212
          0u,
67213
          self->private_impl.f_width,
67214
          self->private_impl.f_height,
67215
          16u,
67216
          false);
67217
    }
67218
    self->private_impl.f_call_sequence = 32u;
67219
67220
    goto ok;
67221
    ok:
67222
    self->private_impl.p_do_decode_image_config = 0;
67223
    goto exit;
67224
  }
67225
67226
  goto suspend;
67227
  suspend:
67228
  self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
67229
67230
  goto exit;
67231
  exit:
67232
  if (a_src && a_src->data.ptr) {
67233
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
67234
  }
67235
67236
  return status;
67237
}
67238
67239
// -------- func nie.decoder.decode_frame_config
67240
67241
WUFFS_BASE__GENERATED_C_CODE
67242
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
67243
wuffs_nie__decoder__decode_frame_config(
67244
    wuffs_nie__decoder* self,
67245
    wuffs_base__frame_config* a_dst,
67246
    wuffs_base__io_buffer* a_src) {
67247
  if (!self) {
67248
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
67249
  }
67250
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
67251
    return wuffs_base__make_status(
67252
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
67253
        ? wuffs_base__error__disabled_by_previous_error
67254
        : wuffs_base__error__initialize_not_called);
67255
  }
67256
  if (!a_src) {
67257
    self->private_impl.magic = WUFFS_BASE__DISABLED;
67258
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
67259
  }
67260
  if ((self->private_impl.active_coroutine != 0) &&
67261
      (self->private_impl.active_coroutine != 2)) {
67262
    self->private_impl.magic = WUFFS_BASE__DISABLED;
67263
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
67264
  }
67265
  self->private_impl.active_coroutine = 0;
67266
  wuffs_base__status status = wuffs_base__make_status(NULL);
67267
67268
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
67269
67270
  uint32_t coro_susp_point = self->private_impl.p_decode_frame_config;
67271
  switch (coro_susp_point) {
67272
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
67273
67274
    while (true) {
67275
      {
67276
        wuffs_base__status t_0 = wuffs_nie__decoder__do_decode_frame_config(self, a_dst, a_src);
67277
        v_status = t_0;
67278
      }
67279
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
67280
        status = wuffs_base__make_status(wuffs_nie__error__truncated_input);
67281
        goto exit;
67282
      }
67283
      status = v_status;
67284
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
67285
    }
67286
67287
    ok:
67288
    self->private_impl.p_decode_frame_config = 0;
67289
    goto exit;
67290
  }
67291
67292
  goto suspend;
67293
  suspend:
67294
  self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
67295
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0;
67296
67297
  goto exit;
67298
  exit:
67299
  if (wuffs_base__status__is_error(&status)) {
67300
    self->private_impl.magic = WUFFS_BASE__DISABLED;
67301
  }
67302
  return status;
67303
}
67304
67305
// -------- func nie.decoder.do_decode_frame_config
67306
67307
WUFFS_BASE__GENERATED_C_CODE
67308
static wuffs_base__status
67309
wuffs_nie__decoder__do_decode_frame_config(
67310
    wuffs_nie__decoder* self,
67311
    wuffs_base__frame_config* a_dst,
67312
    wuffs_base__io_buffer* a_src) {
67313
  wuffs_base__status status = wuffs_base__make_status(NULL);
67314
67315
  wuffs_base__pixel_format v_pixfmt = {0};
67316
  uint64_t v_io_position = 0;
67317
67318
  const uint8_t* iop_a_src = NULL;
67319
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
67320
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
67321
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
67322
  if (a_src && a_src->data.ptr) {
67323
    io0_a_src = a_src->data.ptr;
67324
    io1_a_src = io0_a_src + a_src->meta.ri;
67325
    iop_a_src = io1_a_src;
67326
    io2_a_src = io0_a_src + a_src->meta.wi;
67327
  }
67328
67329
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config;
67330
  switch (coro_susp_point) {
67331
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
67332
67333
    if (self->private_impl.f_call_sequence == 32u) {
67334
    } else if (self->private_impl.f_call_sequence < 32u) {
67335
      if (a_src) {
67336
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
67337
      }
67338
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
67339
      status = wuffs_nie__decoder__do_decode_image_config(self, NULL, a_src);
67340
      if (a_src) {
67341
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
67342
      }
67343
      if (status.repr) {
67344
        goto suspend;
67345
      }
67346
    } else if (self->private_impl.f_call_sequence == 40u) {
67347
      if (16u != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) {
67348
        status = wuffs_base__make_status(wuffs_base__error__bad_restart);
67349
        goto exit;
67350
      }
67351
    } else if (self->private_impl.f_call_sequence == 64u) {
67352
      if (a_src) {
67353
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
67354
      }
67355
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
67356
      status = wuffs_nie__decoder__skip_frame(self, a_src);
67357
      if (a_src) {
67358
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
67359
      }
67360
      if (status.repr) {
67361
        goto suspend;
67362
      }
67363
    } else {
67364
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
67365
      goto ok;
67366
    }
67367
    if (self->private_impl.f_animated) {
67368
      if (a_src) {
67369
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
67370
      }
67371
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
67372
      status = wuffs_nie__decoder__decode_animation_info(self, a_src);
67373
      if (a_src) {
67374
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
67375
      }
67376
      if (status.repr) {
67377
        goto suspend;
67378
      }
67379
    }
67380
    if (a_dst != NULL) {
67381
      v_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)));
67382
      if (self->private_impl.f_animated) {
67383
        wuffs_private_impl__u64__sat_sub_indirect(&v_io_position, 24u);
67384
      }
67385
      v_pixfmt = wuffs_base__utility__make_pixel_format(self->private_impl.f_pixfmt);
67386
      wuffs_base__frame_config__set(
67387
          a_dst,
67388
          wuffs_base__utility__make_rect_ie_u32(
67389
          0u,
67390
          0u,
67391
          self->private_impl.f_width,
67392
          self->private_impl.f_height),
67393
          ((wuffs_base__flicks)(wuffs_base__u64__sat_sub(self->private_impl.f_curr_duration, self->private_impl.f_prev_duration))),
67394
          self->private_impl.f_num_decoded_frame_configs_value,
67395
          v_io_position,
67396
          0u,
67397
          false,
67398
          false,
67399
          wuffs_base__pixel_format__default_background_color(&v_pixfmt));
67400
    }
67401
    wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frame_configs_value, 1u);
67402
    self->private_impl.f_call_sequence = 64u;
67403
67404
    ok:
67405
    self->private_impl.p_do_decode_frame_config = 0;
67406
    goto exit;
67407
  }
67408
67409
  goto suspend;
67410
  suspend:
67411
  self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
67412
67413
  goto exit;
67414
  exit:
67415
  if (a_src && a_src->data.ptr) {
67416
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
67417
  }
67418
67419
  return status;
67420
}
67421
67422
// -------- func nie.decoder.decode_animation_info
67423
67424
WUFFS_BASE__GENERATED_C_CODE
67425
static wuffs_base__status
67426
wuffs_nie__decoder__decode_animation_info(
67427
    wuffs_nie__decoder* self,
67428
    wuffs_base__io_buffer* a_src) {
67429
  wuffs_base__status status = wuffs_base__make_status(NULL);
67430
67431
  uint32_t v_c32 = 0;
67432
  uint64_t v_c64 = 0;
67433
67434
  const uint8_t* iop_a_src = NULL;
67435
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
67436
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
67437
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
67438
  if (a_src && a_src->data.ptr) {
67439
    io0_a_src = a_src->data.ptr;
67440
    io1_a_src = io0_a_src + a_src->meta.ri;
67441
    iop_a_src = io1_a_src;
67442
    io2_a_src = io0_a_src + a_src->meta.wi;
67443
  }
67444
67445
  uint32_t coro_susp_point = self->private_impl.p_decode_animation_info;
67446
  switch (coro_susp_point) {
67447
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
67448
67449
    {
67450
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
67451
      uint64_t t_0;
67452
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) {
67453
        t_0 = wuffs_base__peek_u64le__no_bounds_check(iop_a_src);
67454
        iop_a_src += 8;
67455
      } else {
67456
        self->private_data.s_decode_animation_info.scratch = 0;
67457
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
67458
        while (true) {
67459
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
67460
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
67461
            goto suspend;
67462
          }
67463
          uint64_t* scratch = &self->private_data.s_decode_animation_info.scratch;
67464
          uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
67465
          *scratch <<= 8;
67466
          *scratch >>= 8;
67467
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
67468
          if (num_bits_0 == 56) {
67469
            t_0 = ((uint64_t)(*scratch));
67470
            break;
67471
          }
67472
          num_bits_0 += 8u;
67473
          *scratch |= ((uint64_t)(num_bits_0)) << 56;
67474
        }
67475
      }
67476
      v_c64 = t_0;
67477
    }
67478
    if (v_c64 < 9223372036854775808u) {
67479
      if (v_c64 < self->private_impl.f_curr_duration) {
67480
        status = wuffs_base__make_status(wuffs_nie__error__bad_frame);
67481
        goto exit;
67482
      }
67483
      self->private_impl.f_prev_duration = self->private_impl.f_curr_duration;
67484
      self->private_impl.f_curr_duration = v_c64;
67485
    } else if ((v_c64 >> 32u) == 2147483648u) {
67486
      self->private_impl.f_call_sequence = 96u;
67487
      self->private_impl.f_num_animation_loops_value = ((uint32_t)(v_c64));
67488
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
67489
      goto ok;
67490
    } else {
67491
      status = wuffs_base__make_status(wuffs_nie__error__bad_frame);
67492
      goto exit;
67493
    }
67494
    {
67495
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
67496
      uint32_t t_1;
67497
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
67498
        t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
67499
        iop_a_src += 4;
67500
      } else {
67501
        self->private_data.s_decode_animation_info.scratch = 0;
67502
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
67503
        while (true) {
67504
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
67505
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
67506
            goto suspend;
67507
          }
67508
          uint64_t* scratch = &self->private_data.s_decode_animation_info.scratch;
67509
          uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
67510
          *scratch <<= 8;
67511
          *scratch >>= 8;
67512
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
67513
          if (num_bits_1 == 24) {
67514
            t_1 = ((uint32_t)(*scratch));
67515
            break;
67516
          }
67517
          num_bits_1 += 8u;
67518
          *scratch |= ((uint64_t)(num_bits_1)) << 56;
67519
        }
67520
      }
67521
      v_c32 = t_1;
67522
    }
67523
    if (v_c32 != 1169146734u) {
67524
      status = wuffs_base__make_status(wuffs_nie__error__bad_frame);
67525
      goto exit;
67526
    }
67527
    {
67528
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
67529
      uint32_t t_2;
67530
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
67531
        t_2 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
67532
        iop_a_src += 4;
67533
      } else {
67534
        self->private_data.s_decode_animation_info.scratch = 0;
67535
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
67536
        while (true) {
67537
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
67538
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
67539
            goto suspend;
67540
          }
67541
          uint64_t* scratch = &self->private_data.s_decode_animation_info.scratch;
67542
          uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56));
67543
          *scratch <<= 8;
67544
          *scratch >>= 8;
67545
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2;
67546
          if (num_bits_2 == 24) {
67547
            t_2 = ((uint32_t)(*scratch));
67548
            break;
67549
          }
67550
          num_bits_2 += 8u;
67551
          *scratch |= ((uint64_t)(num_bits_2)) << 56;
67552
        }
67553
      }
67554
      v_c32 = t_2;
67555
    }
67556
    if (v_c32 != self->private_impl.f_nie_config) {
67557
      status = wuffs_base__make_status(wuffs_nie__error__bad_frame);
67558
      goto exit;
67559
    }
67560
    {
67561
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
67562
      uint32_t t_3;
67563
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
67564
        t_3 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
67565
        iop_a_src += 4;
67566
      } else {
67567
        self->private_data.s_decode_animation_info.scratch = 0;
67568
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
67569
        while (true) {
67570
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
67571
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
67572
            goto suspend;
67573
          }
67574
          uint64_t* scratch = &self->private_data.s_decode_animation_info.scratch;
67575
          uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56));
67576
          *scratch <<= 8;
67577
          *scratch >>= 8;
67578
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3;
67579
          if (num_bits_3 == 24) {
67580
            t_3 = ((uint32_t)(*scratch));
67581
            break;
67582
          }
67583
          num_bits_3 += 8u;
67584
          *scratch |= ((uint64_t)(num_bits_3)) << 56;
67585
        }
67586
      }
67587
      v_c32 = t_3;
67588
    }
67589
    if (v_c32 != self->private_impl.f_width) {
67590
      status = wuffs_base__make_status(wuffs_nie__error__bad_frame);
67591
      goto exit;
67592
    }
67593
    {
67594
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
67595
      uint32_t t_4;
67596
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
67597
        t_4 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
67598
        iop_a_src += 4;
67599
      } else {
67600
        self->private_data.s_decode_animation_info.scratch = 0;
67601
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
67602
        while (true) {
67603
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
67604
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
67605
            goto suspend;
67606
          }
67607
          uint64_t* scratch = &self->private_data.s_decode_animation_info.scratch;
67608
          uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56));
67609
          *scratch <<= 8;
67610
          *scratch >>= 8;
67611
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4;
67612
          if (num_bits_4 == 24) {
67613
            t_4 = ((uint32_t)(*scratch));
67614
            break;
67615
          }
67616
          num_bits_4 += 8u;
67617
          *scratch |= ((uint64_t)(num_bits_4)) << 56;
67618
        }
67619
      }
67620
      v_c32 = t_4;
67621
    }
67622
    if (v_c32 != self->private_impl.f_height) {
67623
      status = wuffs_base__make_status(wuffs_nie__error__bad_frame);
67624
      goto exit;
67625
    }
67626
67627
    ok:
67628
    self->private_impl.p_decode_animation_info = 0;
67629
    goto exit;
67630
  }
67631
67632
  goto suspend;
67633
  suspend:
67634
  self->private_impl.p_decode_animation_info = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
67635
67636
  goto exit;
67637
  exit:
67638
  if (a_src && a_src->data.ptr) {
67639
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
67640
  }
67641
67642
  return status;
67643
}
67644
67645
// -------- func nie.decoder.skip_frame
67646
67647
WUFFS_BASE__GENERATED_C_CODE
67648
static wuffs_base__status
67649
wuffs_nie__decoder__skip_frame(
67650
    wuffs_nie__decoder* self,
67651
    wuffs_base__io_buffer* a_src) {
67652
  wuffs_base__status status = wuffs_base__make_status(NULL);
67653
67654
  uint64_t v_src_bytes_per_pixel = 0;
67655
67656
  const uint8_t* iop_a_src = NULL;
67657
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
67658
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
67659
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
67660
  if (a_src && a_src->data.ptr) {
67661
    io0_a_src = a_src->data.ptr;
67662
    io1_a_src = io0_a_src + a_src->meta.ri;
67663
    iop_a_src = io1_a_src;
67664
    io2_a_src = io0_a_src + a_src->meta.wi;
67665
  }
67666
67667
  uint32_t coro_susp_point = self->private_impl.p_skip_frame;
67668
  switch (coro_susp_point) {
67669
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
67670
67671
    if ((self->private_impl.f_pixfmt == 2164308923u) || (self->private_impl.f_pixfmt == 2181086139u)) {
67672
      v_src_bytes_per_pixel = 8u;
67673
    } else {
67674
      v_src_bytes_per_pixel = 4u;
67675
    }
67676
    self->private_data.s_skip_frame.scratch = (v_src_bytes_per_pixel * ((uint64_t)(self->private_impl.f_width)) * ((uint64_t)(self->private_impl.f_height)));
67677
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
67678
    if (self->private_data.s_skip_frame.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
67679
      self->private_data.s_skip_frame.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
67680
      iop_a_src = io2_a_src;
67681
      status = wuffs_base__make_status(wuffs_base__suspension__short_read);
67682
      goto suspend;
67683
    }
67684
    iop_a_src += self->private_data.s_skip_frame.scratch;
67685
    if (self->private_impl.f_animated) {
67686
      wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u);
67687
      self->private_impl.f_call_sequence = 32u;
67688
    } else {
67689
      wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u);
67690
      self->private_impl.f_call_sequence = 96u;
67691
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
67692
      goto ok;
67693
    }
67694
67695
    ok:
67696
    self->private_impl.p_skip_frame = 0;
67697
    goto exit;
67698
  }
67699
67700
  goto suspend;
67701
  suspend:
67702
  self->private_impl.p_skip_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
67703
67704
  goto exit;
67705
  exit:
67706
  if (a_src && a_src->data.ptr) {
67707
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
67708
  }
67709
67710
  return status;
67711
}
67712
67713
// -------- func nie.decoder.decode_frame
67714
67715
WUFFS_BASE__GENERATED_C_CODE
67716
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
67717
wuffs_nie__decoder__decode_frame(
67718
    wuffs_nie__decoder* self,
67719
    wuffs_base__pixel_buffer* a_dst,
67720
    wuffs_base__io_buffer* a_src,
67721
    wuffs_base__pixel_blend a_blend,
67722
    wuffs_base__slice_u8 a_workbuf,
67723
    wuffs_base__decode_frame_options* a_opts) {
67724
  if (!self) {
67725
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
67726
  }
67727
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
67728
    return wuffs_base__make_status(
67729
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
67730
        ? wuffs_base__error__disabled_by_previous_error
67731
        : wuffs_base__error__initialize_not_called);
67732
  }
67733
  if (!a_dst || !a_src) {
67734
    self->private_impl.magic = WUFFS_BASE__DISABLED;
67735
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
67736
  }
67737
  if ((self->private_impl.active_coroutine != 0) &&
67738
      (self->private_impl.active_coroutine != 3)) {
67739
    self->private_impl.magic = WUFFS_BASE__DISABLED;
67740
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
67741
  }
67742
  self->private_impl.active_coroutine = 0;
67743
  wuffs_base__status status = wuffs_base__make_status(NULL);
67744
67745
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
67746
67747
  uint32_t coro_susp_point = self->private_impl.p_decode_frame;
67748
  switch (coro_susp_point) {
67749
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
67750
67751
    while (true) {
67752
      {
67753
        wuffs_base__status t_0 = wuffs_nie__decoder__do_decode_frame(self,
67754
            a_dst,
67755
            a_src,
67756
            a_blend,
67757
            a_workbuf,
67758
            a_opts);
67759
        v_status = t_0;
67760
      }
67761
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
67762
        status = wuffs_base__make_status(wuffs_nie__error__truncated_input);
67763
        goto exit;
67764
      }
67765
      status = v_status;
67766
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
67767
    }
67768
67769
    ok:
67770
    self->private_impl.p_decode_frame = 0;
67771
    goto exit;
67772
  }
67773
67774
  goto suspend;
67775
  suspend:
67776
  self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
67777
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0;
67778
67779
  goto exit;
67780
  exit:
67781
  if (wuffs_base__status__is_error(&status)) {
67782
    self->private_impl.magic = WUFFS_BASE__DISABLED;
67783
  }
67784
  return status;
67785
}
67786
67787
// -------- func nie.decoder.do_decode_frame
67788
67789
WUFFS_BASE__GENERATED_C_CODE
67790
static wuffs_base__status
67791
wuffs_nie__decoder__do_decode_frame(
67792
    wuffs_nie__decoder* self,
67793
    wuffs_base__pixel_buffer* a_dst,
67794
    wuffs_base__io_buffer* a_src,
67795
    wuffs_base__pixel_blend a_blend,
67796
    wuffs_base__slice_u8 a_workbuf,
67797
    wuffs_base__decode_frame_options* a_opts) {
67798
  wuffs_base__status status = wuffs_base__make_status(NULL);
67799
67800
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
67801
  uint64_t v_c64 = 0;
67802
67803
  const uint8_t* iop_a_src = NULL;
67804
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
67805
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
67806
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
67807
  if (a_src && a_src->data.ptr) {
67808
    io0_a_src = a_src->data.ptr;
67809
    io1_a_src = io0_a_src + a_src->meta.ri;
67810
    iop_a_src = io1_a_src;
67811
    io2_a_src = io0_a_src + a_src->meta.wi;
67812
  }
67813
67814
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame;
67815
  switch (coro_susp_point) {
67816
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
67817
67818
    if (self->private_impl.f_call_sequence == 64u) {
67819
    } else if (self->private_impl.f_call_sequence < 64u) {
67820
      if (a_src) {
67821
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
67822
      }
67823
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
67824
      status = wuffs_nie__decoder__do_decode_frame_config(self, NULL, a_src);
67825
      if (a_src) {
67826
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
67827
      }
67828
      if (status.repr) {
67829
        goto suspend;
67830
      }
67831
    } else {
67832
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
67833
      goto ok;
67834
    }
67835
    self->private_impl.f_dst_x = 0u;
67836
    self->private_impl.f_dst_y = 0u;
67837
    v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler,
67838
        wuffs_base__pixel_buffer__pixel_format(a_dst),
67839
        wuffs_base__pixel_buffer__palette(a_dst),
67840
        wuffs_base__utility__make_pixel_format(self->private_impl.f_pixfmt),
67841
        wuffs_base__utility__empty_slice_u8(),
67842
        a_blend);
67843
    if ( ! wuffs_base__status__is_ok(&v_status)) {
67844
      status = v_status;
67845
      if (wuffs_base__status__is_error(&status)) {
67846
        goto exit;
67847
      } else if (wuffs_base__status__is_suspension(&status)) {
67848
        status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
67849
        goto exit;
67850
      }
67851
      goto ok;
67852
    }
67853
    while (true) {
67854
      if (a_src) {
67855
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
67856
      }
67857
      v_status = wuffs_nie__decoder__swizzle(self, a_dst, a_src);
67858
      if (a_src) {
67859
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
67860
      }
67861
      if (wuffs_base__status__is_ok(&v_status)) {
67862
        break;
67863
      } else if (v_status.repr != wuffs_nie__note__internal_note_short_read) {
67864
        status = v_status;
67865
        if (wuffs_base__status__is_error(&status)) {
67866
          goto exit;
67867
        } else if (wuffs_base__status__is_suspension(&status)) {
67868
          status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
67869
          goto exit;
67870
        }
67871
        goto ok;
67872
      }
67873
      status = wuffs_base__make_status(wuffs_base__suspension__short_read);
67874
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2);
67875
    }
67876
    if (self->private_impl.f_animated) {
67877
      while (((uint64_t)(io2_a_src - iop_a_src)) < 8u) {
67878
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
67879
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3);
67880
      }
67881
      v_c64 = wuffs_base__peek_u64le__no_bounds_check(iop_a_src);
67882
      if ((v_c64 >> 32u) == 2147483648u) {
67883
        self->private_impl.f_num_animation_loops_value = ((uint32_t)(v_c64));
67884
      }
67885
      wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u);
67886
      self->private_impl.f_call_sequence = 32u;
67887
    } else {
67888
      wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u);
67889
      self->private_impl.f_call_sequence = 96u;
67890
    }
67891
67892
    ok:
67893
    self->private_impl.p_do_decode_frame = 0;
67894
    goto exit;
67895
  }
67896
67897
  goto suspend;
67898
  suspend:
67899
  self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
67900
67901
  goto exit;
67902
  exit:
67903
  if (a_src && a_src->data.ptr) {
67904
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
67905
  }
67906
67907
  return status;
67908
}
67909
67910
// -------- func nie.decoder.swizzle
67911
67912
WUFFS_BASE__GENERATED_C_CODE
67913
static wuffs_base__status
67914
wuffs_nie__decoder__swizzle(
67915
    wuffs_nie__decoder* self,
67916
    wuffs_base__pixel_buffer* a_dst,
67917
    wuffs_base__io_buffer* a_src) {
67918
  wuffs_base__status status = wuffs_base__make_status(NULL);
67919
67920
  wuffs_base__pixel_format v_dst_pixfmt = {0};
67921
  uint32_t v_dst_bits_per_pixel = 0;
67922
  uint32_t v_dst_bytes_per_pixel = 0;
67923
  uint64_t v_dst_bytes_per_row = 0;
67924
  uint32_t v_src_bytes_per_pixel = 0;
67925
  wuffs_base__table_u8 v_tab = {0};
67926
  wuffs_base__slice_u8 v_dst = {0};
67927
  uint64_t v_i = 0;
67928
  uint64_t v_j = 0;
67929
  uint64_t v_n = 0;
67930
67931
  const uint8_t* iop_a_src = NULL;
67932
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
67933
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
67934
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
67935
  if (a_src && a_src->data.ptr) {
67936
    io0_a_src = a_src->data.ptr;
67937
    io1_a_src = io0_a_src + a_src->meta.ri;
67938
    iop_a_src = io1_a_src;
67939
    io2_a_src = io0_a_src + a_src->meta.wi;
67940
  }
67941
67942
  v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
67943
  v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
67944
  if ((v_dst_bits_per_pixel & 7u) != 0u) {
67945
    status = wuffs_base__make_status(wuffs_base__error__unsupported_option);
67946
    goto exit;
67947
  }
67948
  v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u);
67949
  v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel)));
67950
  v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
67951
  while (true) {
67952
    if (self->private_impl.f_dst_x == self->private_impl.f_width) {
67953
      self->private_impl.f_dst_x = 0u;
67954
      self->private_impl.f_dst_y += 1u;
67955
      if (self->private_impl.f_dst_y >= self->private_impl.f_height) {
67956
        break;
67957
      }
67958
    }
67959
    v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y);
67960
    if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) {
67961
      v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row);
67962
    }
67963
    v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel)));
67964
    if (v_i >= ((uint64_t)(v_dst.len))) {
67965
      v_src_bytes_per_pixel = 4u;
67966
      if ((self->private_impl.f_pixfmt == 2164308923u) || (self->private_impl.f_pixfmt == 2181086139u)) {
67967
        v_src_bytes_per_pixel = 8u;
67968
      }
67969
      v_n = (((uint64_t)(io2_a_src - iop_a_src)) / ((uint64_t)(v_src_bytes_per_pixel)));
67970
      v_n = wuffs_base__u64__min(v_n, ((uint64_t)(((uint32_t)(self->private_impl.f_width - self->private_impl.f_dst_x)))));
67971
      v_j = v_n;
67972
      while (v_j >= 8u) {
67973
        if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 8u)))) {
67974
          iop_a_src += (v_src_bytes_per_pixel * 8u);
67975
        }
67976
        v_j -= 8u;
67977
      }
67978
      while (v_j > 0u) {
67979
        if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 1u)))) {
67980
          iop_a_src += (v_src_bytes_per_pixel * 1u);
67981
        }
67982
        v_j -= 1u;
67983
      }
67984
    } else {
67985
      v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_reader(
67986
          &self->private_impl.f_swizzler,
67987
          wuffs_base__slice_u8__subslice_i(v_dst, v_i),
67988
          wuffs_base__pixel_buffer__palette(a_dst),
67989
          &iop_a_src,
67990
          io2_a_src);
67991
    }
67992
    if (v_n == 0u) {
67993
      status = wuffs_base__make_status(wuffs_nie__note__internal_note_short_read);
67994
      goto ok;
67995
    }
67996
    wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n)));
67997
  }
67998
  status = wuffs_base__make_status(NULL);
67999
  goto ok;
68000
68001
  ok:
68002
  goto exit;
68003
  exit:
68004
  if (a_src && a_src->data.ptr) {
68005
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
68006
  }
68007
68008
  return status;
68009
}
68010
68011
// -------- func nie.decoder.frame_dirty_rect
68012
68013
WUFFS_BASE__GENERATED_C_CODE
68014
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
68015
wuffs_nie__decoder__frame_dirty_rect(
68016
    const wuffs_nie__decoder* self) {
68017
  if (!self) {
68018
    return wuffs_base__utility__empty_rect_ie_u32();
68019
  }
68020
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
68021
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
68022
    return wuffs_base__utility__empty_rect_ie_u32();
68023
  }
68024
68025
  return wuffs_base__utility__make_rect_ie_u32(
68026
      0u,
68027
      0u,
68028
      self->private_impl.f_width,
68029
      self->private_impl.f_height);
68030
}
68031
68032
// -------- func nie.decoder.num_animation_loops
68033
68034
WUFFS_BASE__GENERATED_C_CODE
68035
WUFFS_BASE__MAYBE_STATIC uint32_t
68036
wuffs_nie__decoder__num_animation_loops(
68037
    const wuffs_nie__decoder* self) {
68038
  if (!self) {
68039
    return 0;
68040
  }
68041
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
68042
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
68043
    return 0;
68044
  }
68045
68046
  return self->private_impl.f_num_animation_loops_value;
68047
}
68048
68049
// -------- func nie.decoder.num_decoded_frame_configs
68050
68051
WUFFS_BASE__GENERATED_C_CODE
68052
WUFFS_BASE__MAYBE_STATIC uint64_t
68053
wuffs_nie__decoder__num_decoded_frame_configs(
68054
    const wuffs_nie__decoder* self) {
68055
  if (!self) {
68056
    return 0;
68057
  }
68058
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
68059
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
68060
    return 0;
68061
  }
68062
68063
  return self->private_impl.f_num_decoded_frame_configs_value;
68064
}
68065
68066
// -------- func nie.decoder.num_decoded_frames
68067
68068
WUFFS_BASE__GENERATED_C_CODE
68069
WUFFS_BASE__MAYBE_STATIC uint64_t
68070
wuffs_nie__decoder__num_decoded_frames(
68071
    const wuffs_nie__decoder* self) {
68072
  if (!self) {
68073
    return 0;
68074
  }
68075
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
68076
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
68077
    return 0;
68078
  }
68079
68080
  return self->private_impl.f_num_decoded_frames_value;
68081
}
68082
68083
// -------- func nie.decoder.restart_frame
68084
68085
WUFFS_BASE__GENERATED_C_CODE
68086
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
68087
wuffs_nie__decoder__restart_frame(
68088
    wuffs_nie__decoder* self,
68089
    uint64_t a_index,
68090
    uint64_t a_io_position) {
68091
  if (!self) {
68092
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
68093
  }
68094
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
68095
    return wuffs_base__make_status(
68096
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
68097
        ? wuffs_base__error__disabled_by_previous_error
68098
        : wuffs_base__error__initialize_not_called);
68099
  }
68100
68101
  if (self->private_impl.f_call_sequence < 32u) {
68102
    return wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
68103
  }
68104
  if (a_index != 0u) {
68105
    return wuffs_base__make_status(wuffs_nie__error__unsupported_restart_frame_index);
68106
  } else if (a_io_position != 16u) {
68107
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
68108
  }
68109
  self->private_impl.f_num_animation_loops_value = 0u;
68110
  self->private_impl.f_prev_duration = 0u;
68111
  self->private_impl.f_curr_duration = 0u;
68112
  self->private_impl.f_num_decoded_frame_configs_value = 0u;
68113
  self->private_impl.f_num_decoded_frames_value = 0u;
68114
  self->private_impl.f_call_sequence = 40u;
68115
  return wuffs_base__make_status(NULL);
68116
}
68117
68118
// -------- func nie.decoder.set_report_metadata
68119
68120
WUFFS_BASE__GENERATED_C_CODE
68121
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
68122
wuffs_nie__decoder__set_report_metadata(
68123
    wuffs_nie__decoder* self,
68124
    uint32_t a_fourcc,
68125
    bool a_report) {
68126
  return wuffs_base__make_empty_struct();
68127
}
68128
68129
// -------- func nie.decoder.tell_me_more
68130
68131
WUFFS_BASE__GENERATED_C_CODE
68132
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
68133
wuffs_nie__decoder__tell_me_more(
68134
    wuffs_nie__decoder* self,
68135
    wuffs_base__io_buffer* a_dst,
68136
    wuffs_base__more_information* a_minfo,
68137
    wuffs_base__io_buffer* a_src) {
68138
  if (!self) {
68139
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
68140
  }
68141
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
68142
    return wuffs_base__make_status(
68143
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
68144
        ? wuffs_base__error__disabled_by_previous_error
68145
        : wuffs_base__error__initialize_not_called);
68146
  }
68147
  if (!a_dst || !a_src) {
68148
    self->private_impl.magic = WUFFS_BASE__DISABLED;
68149
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
68150
  }
68151
  if ((self->private_impl.active_coroutine != 0) &&
68152
      (self->private_impl.active_coroutine != 4)) {
68153
    self->private_impl.magic = WUFFS_BASE__DISABLED;
68154
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
68155
  }
68156
  self->private_impl.active_coroutine = 0;
68157
  wuffs_base__status status = wuffs_base__make_status(NULL);
68158
68159
  status = wuffs_base__make_status(wuffs_base__error__no_more_information);
68160
  goto exit;
68161
68162
  goto ok;
68163
  ok:
68164
  goto exit;
68165
  exit:
68166
  if (wuffs_base__status__is_error(&status)) {
68167
    self->private_impl.magic = WUFFS_BASE__DISABLED;
68168
  }
68169
  return status;
68170
}
68171
68172
// -------- func nie.decoder.workbuf_len
68173
68174
WUFFS_BASE__GENERATED_C_CODE
68175
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
68176
wuffs_nie__decoder__workbuf_len(
68177
    const wuffs_nie__decoder* self) {
68178
  if (!self) {
68179
    return wuffs_base__utility__empty_range_ii_u64();
68180
  }
68181
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
68182
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
68183
    return wuffs_base__utility__empty_range_ii_u64();
68184
  }
68185
68186
  return wuffs_base__utility__make_range_ii_u64(0u, 0u);
68187
}
68188
68189
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NIE)
68190
68191
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ZLIB)
68192
68193
// ---------------- Status Codes Implementations
68194
68195
const char wuffs_zlib__note__dictionary_required[] = "@zlib: dictionary required";
68196
const char wuffs_zlib__error__bad_checksum[] = "#zlib: bad checksum";
68197
const char wuffs_zlib__error__bad_compression_method[] = "#zlib: bad compression method";
68198
const char wuffs_zlib__error__bad_compression_window_size[] = "#zlib: bad compression window size";
68199
const char wuffs_zlib__error__bad_parity_check[] = "#zlib: bad parity check";
68200
const char wuffs_zlib__error__incorrect_dictionary[] = "#zlib: incorrect dictionary";
68201
const char wuffs_zlib__error__truncated_input[] = "#zlib: truncated input";
68202
68203
// ---------------- Private Consts
68204
68205
#define WUFFS_ZLIB__QUIRKS_BASE 2056083456u
68206
68207
#define WUFFS_ZLIB__QUIRKS_COUNT 1u
68208
68209
// ---------------- Private Initializer Prototypes
68210
68211
// ---------------- Private Function Prototypes
68212
68213
WUFFS_BASE__GENERATED_C_CODE
68214
static wuffs_base__status
68215
wuffs_zlib__decoder__do_transform_io(
68216
    wuffs_zlib__decoder* self,
68217
    wuffs_base__io_buffer* a_dst,
68218
    wuffs_base__io_buffer* a_src,
68219
    wuffs_base__slice_u8 a_workbuf);
68220
68221
// ---------------- VTables
68222
68223
const wuffs_base__io_transformer__func_ptrs
68224
wuffs_zlib__decoder__func_ptrs_for__wuffs_base__io_transformer = {
68225
  (wuffs_base__optional_u63(*)(const void*))(&wuffs_zlib__decoder__dst_history_retain_length),
68226
  (uint64_t(*)(const void*,
68227
      uint32_t))(&wuffs_zlib__decoder__get_quirk),
68228
  (wuffs_base__status(*)(void*,
68229
      uint32_t,
68230
      uint64_t))(&wuffs_zlib__decoder__set_quirk),
68231
  (wuffs_base__status(*)(void*,
68232
      wuffs_base__io_buffer*,
68233
      wuffs_base__io_buffer*,
68234
      wuffs_base__slice_u8))(&wuffs_zlib__decoder__transform_io),
68235
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_zlib__decoder__workbuf_len),
68236
};
68237
68238
// ---------------- Initializer Implementations
68239
68240
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
68241
wuffs_zlib__decoder__initialize(
68242
    wuffs_zlib__decoder* self,
68243
    size_t sizeof_star_self,
68244
    uint64_t wuffs_version,
68245
    uint32_t options){
68246
  if (!self) {
68247
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
68248
  }
68249
  if (sizeof(*self) != sizeof_star_self) {
68250
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
68251
  }
68252
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
68253
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
68254
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
68255
  }
68256
68257
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
68258
    // The whole point of this if-check is to detect an uninitialized *self.
68259
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
68260
#if !defined(__clang__) && defined(__GNUC__)
68261
#pragma GCC diagnostic push
68262
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
68263
#endif
68264
    if (self->private_impl.magic != 0) {
68265
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
68266
    }
68267
#if !defined(__clang__) && defined(__GNUC__)
68268
#pragma GCC diagnostic pop
68269
#endif
68270
  } else {
68271
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
68272
      memset(self, 0, sizeof(*self));
68273
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
68274
    } else {
68275
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
68276
    }
68277
  }
68278
68279
  {
68280
    wuffs_base__status z = wuffs_adler32__hasher__initialize(
68281
        &self->private_data.f_checksum, sizeof(self->private_data.f_checksum), WUFFS_VERSION, options);
68282
    if (z.repr) {
68283
      return z;
68284
    }
68285
  }
68286
  {
68287
    wuffs_base__status z = wuffs_adler32__hasher__initialize(
68288
        &self->private_data.f_dict_id_hasher, sizeof(self->private_data.f_dict_id_hasher), WUFFS_VERSION, options);
68289
    if (z.repr) {
68290
      return z;
68291
    }
68292
  }
68293
  {
68294
    wuffs_base__status z = wuffs_deflate__decoder__initialize(
68295
        &self->private_data.f_flate, sizeof(self->private_data.f_flate), WUFFS_VERSION, options);
68296
    if (z.repr) {
68297
      return z;
68298
    }
68299
  }
68300
  self->private_impl.magic = WUFFS_BASE__MAGIC;
68301
  self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name =
68302
      wuffs_base__io_transformer__vtable_name;
68303
  self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers =
68304
      (const void*)(&wuffs_zlib__decoder__func_ptrs_for__wuffs_base__io_transformer);
68305
  return wuffs_base__make_status(NULL);
68306
}
68307
68308
wuffs_zlib__decoder*
68309
wuffs_zlib__decoder__alloc(void) {
68310
  wuffs_zlib__decoder* x =
68311
      (wuffs_zlib__decoder*)(calloc(1, sizeof(wuffs_zlib__decoder)));
68312
  if (!x) {
68313
    return NULL;
68314
  }
68315
  if (wuffs_zlib__decoder__initialize(
68316
      x, sizeof(wuffs_zlib__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
68317
    free(x);
68318
    return NULL;
68319
  }
68320
  return x;
68321
}
68322
68323
size_t
68324
sizeof__wuffs_zlib__decoder(void) {
68325
  return sizeof(wuffs_zlib__decoder);
68326
}
68327
68328
// ---------------- Function Implementations
68329
68330
// -------- func zlib.decoder.dictionary_id
68331
68332
WUFFS_BASE__GENERATED_C_CODE
68333
WUFFS_BASE__MAYBE_STATIC uint32_t
68334
wuffs_zlib__decoder__dictionary_id(
68335
    const wuffs_zlib__decoder* self) {
68336
  if (!self) {
68337
    return 0;
68338
  }
68339
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
68340
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
68341
    return 0;
68342
  }
68343
68344
  return self->private_impl.f_dict_id_want;
68345
}
68346
68347
// -------- func zlib.decoder.add_dictionary
68348
68349
WUFFS_BASE__GENERATED_C_CODE
68350
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
68351
wuffs_zlib__decoder__add_dictionary(
68352
    wuffs_zlib__decoder* self,
68353
    wuffs_base__slice_u8 a_dict) {
68354
  if (!self) {
68355
    return wuffs_base__make_empty_struct();
68356
  }
68357
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
68358
    return wuffs_base__make_empty_struct();
68359
  }
68360
68361
  if (self->private_impl.f_header_complete) {
68362
    self->private_impl.f_bad_call_sequence = true;
68363
  } else {
68364
    self->private_impl.f_dict_id_have = wuffs_adler32__hasher__update_u32(&self->private_data.f_dict_id_hasher, a_dict);
68365
    wuffs_deflate__decoder__add_history(&self->private_data.f_flate, a_dict);
68366
  }
68367
  self->private_impl.f_got_dictionary = true;
68368
  return wuffs_base__make_empty_struct();
68369
}
68370
68371
// -------- func zlib.decoder.get_quirk
68372
68373
WUFFS_BASE__GENERATED_C_CODE
68374
WUFFS_BASE__MAYBE_STATIC uint64_t
68375
wuffs_zlib__decoder__get_quirk(
68376
    const wuffs_zlib__decoder* self,
68377
    uint32_t a_key) {
68378
  if (!self) {
68379
    return 0;
68380
  }
68381
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
68382
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
68383
    return 0;
68384
  }
68385
68386
  uint32_t v_key = 0;
68387
68388
  if ((a_key == 1u) && self->private_impl.f_ignore_checksum) {
68389
    return 1u;
68390
  } else if (a_key >= 2056083456u) {
68391
    v_key = (a_key - 2056083456u);
68392
    if (v_key < 1u) {
68393
      if (self->private_impl.f_quirks[v_key]) {
68394
        return 1u;
68395
      }
68396
    }
68397
  }
68398
  return 0u;
68399
}
68400
68401
// -------- func zlib.decoder.set_quirk
68402
68403
WUFFS_BASE__GENERATED_C_CODE
68404
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
68405
wuffs_zlib__decoder__set_quirk(
68406
    wuffs_zlib__decoder* self,
68407
    uint32_t a_key,
68408
    uint64_t a_value) {
68409
  if (!self) {
68410
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
68411
  }
68412
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
68413
    return wuffs_base__make_status(
68414
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
68415
        ? wuffs_base__error__disabled_by_previous_error
68416
        : wuffs_base__error__initialize_not_called);
68417
  }
68418
68419
  if (self->private_impl.f_header_complete) {
68420
    self->private_impl.f_bad_call_sequence = true;
68421
    return wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
68422
  } else if (a_key == 1u) {
68423
    self->private_impl.f_ignore_checksum = (a_value > 0u);
68424
    return wuffs_base__make_status(NULL);
68425
  } else if (a_key >= 2056083456u) {
68426
    a_key -= 2056083456u;
68427
    if (a_key < 1u) {
68428
      self->private_impl.f_quirks[a_key] = (a_value > 0u);
68429
      return wuffs_base__make_status(NULL);
68430
    }
68431
  }
68432
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
68433
}
68434
68435
// -------- func zlib.decoder.dst_history_retain_length
68436
68437
WUFFS_BASE__GENERATED_C_CODE
68438
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
68439
wuffs_zlib__decoder__dst_history_retain_length(
68440
    const wuffs_zlib__decoder* self) {
68441
  if (!self) {
68442
    return wuffs_base__utility__make_optional_u63(false, 0u);
68443
  }
68444
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
68445
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
68446
    return wuffs_base__utility__make_optional_u63(false, 0u);
68447
  }
68448
68449
  return wuffs_base__utility__make_optional_u63(true, 0u);
68450
}
68451
68452
// -------- func zlib.decoder.workbuf_len
68453
68454
WUFFS_BASE__GENERATED_C_CODE
68455
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
68456
wuffs_zlib__decoder__workbuf_len(
68457
    const wuffs_zlib__decoder* self) {
68458
  if (!self) {
68459
    return wuffs_base__utility__empty_range_ii_u64();
68460
  }
68461
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
68462
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
68463
    return wuffs_base__utility__empty_range_ii_u64();
68464
  }
68465
68466
  return wuffs_base__utility__make_range_ii_u64(1u, 1u);
68467
}
68468
68469
// -------- func zlib.decoder.transform_io
68470
68471
WUFFS_BASE__GENERATED_C_CODE
68472
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
68473
wuffs_zlib__decoder__transform_io(
68474
    wuffs_zlib__decoder* self,
68475
    wuffs_base__io_buffer* a_dst,
68476
    wuffs_base__io_buffer* a_src,
68477
    wuffs_base__slice_u8 a_workbuf) {
68478
  if (!self) {
68479
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
68480
  }
68481
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
68482
    return wuffs_base__make_status(
68483
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
68484
        ? wuffs_base__error__disabled_by_previous_error
68485
        : wuffs_base__error__initialize_not_called);
68486
  }
68487
  if (!a_dst || !a_src) {
68488
    self->private_impl.magic = WUFFS_BASE__DISABLED;
68489
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
68490
  }
68491
  if ((self->private_impl.active_coroutine != 0) &&
68492
      (self->private_impl.active_coroutine != 1)) {
68493
    self->private_impl.magic = WUFFS_BASE__DISABLED;
68494
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
68495
  }
68496
  self->private_impl.active_coroutine = 0;
68497
  wuffs_base__status status = wuffs_base__make_status(NULL);
68498
68499
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
68500
68501
  uint32_t coro_susp_point = self->private_impl.p_transform_io;
68502
  switch (coro_susp_point) {
68503
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
68504
68505
    while (true) {
68506
      {
68507
        wuffs_base__status t_0 = wuffs_zlib__decoder__do_transform_io(self, a_dst, a_src, a_workbuf);
68508
        v_status = t_0;
68509
      }
68510
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
68511
        status = wuffs_base__make_status(wuffs_zlib__error__truncated_input);
68512
        goto exit;
68513
      }
68514
      status = v_status;
68515
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
68516
    }
68517
68518
    ok:
68519
    self->private_impl.p_transform_io = 0;
68520
    goto exit;
68521
  }
68522
68523
  goto suspend;
68524
  suspend:
68525
  self->private_impl.p_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
68526
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
68527
68528
  goto exit;
68529
  exit:
68530
  if (wuffs_base__status__is_error(&status)) {
68531
    self->private_impl.magic = WUFFS_BASE__DISABLED;
68532
  }
68533
  return status;
68534
}
68535
68536
// -------- func zlib.decoder.do_transform_io
68537
68538
WUFFS_BASE__GENERATED_C_CODE
68539
static wuffs_base__status
68540
wuffs_zlib__decoder__do_transform_io(
68541
    wuffs_zlib__decoder* self,
68542
    wuffs_base__io_buffer* a_dst,
68543
    wuffs_base__io_buffer* a_src,
68544
    wuffs_base__slice_u8 a_workbuf) {
68545
  wuffs_base__status status = wuffs_base__make_status(NULL);
68546
68547
  uint16_t v_x = 0;
68548
  uint32_t v_checksum_have = 0;
68549
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
68550
  uint32_t v_checksum_want = 0;
68551
  uint64_t v_mark = 0;
68552
68553
  uint8_t* iop_a_dst = NULL;
68554
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
68555
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
68556
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
68557
  if (a_dst && a_dst->data.ptr) {
68558
    io0_a_dst = a_dst->data.ptr;
68559
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
68560
    iop_a_dst = io1_a_dst;
68561
    io2_a_dst = io0_a_dst + a_dst->data.len;
68562
    if (a_dst->meta.closed) {
68563
      io2_a_dst = iop_a_dst;
68564
    }
68565
  }
68566
  const uint8_t* iop_a_src = NULL;
68567
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
68568
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
68569
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
68570
  if (a_src && a_src->data.ptr) {
68571
    io0_a_src = a_src->data.ptr;
68572
    io1_a_src = io0_a_src + a_src->meta.ri;
68573
    iop_a_src = io1_a_src;
68574
    io2_a_src = io0_a_src + a_src->meta.wi;
68575
  }
68576
68577
  uint32_t coro_susp_point = self->private_impl.p_do_transform_io;
68578
  if (coro_susp_point) {
68579
    v_checksum_have = self->private_data.s_do_transform_io.v_checksum_have;
68580
  }
68581
  switch (coro_susp_point) {
68582
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
68583
68584
    if (self->private_impl.f_bad_call_sequence) {
68585
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
68586
      goto exit;
68587
    } else if (self->private_impl.f_quirks[0u]) {
68588
    } else if ( ! self->private_impl.f_want_dictionary) {
68589
      {
68590
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
68591
        uint16_t t_0;
68592
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
68593
          t_0 = wuffs_base__peek_u16be__no_bounds_check(iop_a_src);
68594
          iop_a_src += 2;
68595
        } else {
68596
          self->private_data.s_do_transform_io.scratch = 0;
68597
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
68598
          while (true) {
68599
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
68600
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
68601
              goto suspend;
68602
            }
68603
            uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
68604
            uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu));
68605
            *scratch >>= 8;
68606
            *scratch <<= 8;
68607
            *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0);
68608
            if (num_bits_0 == 8) {
68609
              t_0 = ((uint16_t)(*scratch >> 48));
68610
              break;
68611
            }
68612
            num_bits_0 += 8u;
68613
            *scratch |= ((uint64_t)(num_bits_0));
68614
          }
68615
        }
68616
        v_x = t_0;
68617
      }
68618
      if (((uint16_t)(((uint16_t)(v_x >> 8u)) & 15u)) != 8u) {
68619
        status = wuffs_base__make_status(wuffs_zlib__error__bad_compression_method);
68620
        goto exit;
68621
      }
68622
      if (((uint16_t)(v_x >> 12u)) > 7u) {
68623
        status = wuffs_base__make_status(wuffs_zlib__error__bad_compression_window_size);
68624
        goto exit;
68625
      }
68626
      if (((uint16_t)(v_x % 31u)) != 0u) {
68627
        status = wuffs_base__make_status(wuffs_zlib__error__bad_parity_check);
68628
        goto exit;
68629
      }
68630
      self->private_impl.f_want_dictionary = (((uint16_t)(v_x & 32u)) != 0u);
68631
      if (self->private_impl.f_want_dictionary) {
68632
        self->private_impl.f_dict_id_have = 1u;
68633
        {
68634
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
68635
          uint32_t t_1;
68636
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
68637
            t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
68638
            iop_a_src += 4;
68639
          } else {
68640
            self->private_data.s_do_transform_io.scratch = 0;
68641
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
68642
            while (true) {
68643
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
68644
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
68645
                goto suspend;
68646
              }
68647
              uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
68648
              uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu));
68649
              *scratch >>= 8;
68650
              *scratch <<= 8;
68651
              *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1);
68652
              if (num_bits_1 == 24) {
68653
                t_1 = ((uint32_t)(*scratch >> 32));
68654
                break;
68655
              }
68656
              num_bits_1 += 8u;
68657
              *scratch |= ((uint64_t)(num_bits_1));
68658
            }
68659
          }
68660
          self->private_impl.f_dict_id_want = t_1;
68661
        }
68662
        status = wuffs_base__make_status(wuffs_zlib__note__dictionary_required);
68663
        goto ok;
68664
      } else if (self->private_impl.f_got_dictionary) {
68665
        status = wuffs_base__make_status(wuffs_zlib__error__incorrect_dictionary);
68666
        goto exit;
68667
      }
68668
    } else if (self->private_impl.f_dict_id_have != self->private_impl.f_dict_id_want) {
68669
      if (self->private_impl.f_got_dictionary) {
68670
        status = wuffs_base__make_status(wuffs_zlib__error__incorrect_dictionary);
68671
        goto exit;
68672
      }
68673
      status = wuffs_base__make_status(wuffs_zlib__note__dictionary_required);
68674
      goto ok;
68675
    }
68676
    self->private_impl.f_header_complete = true;
68677
    while (true) {
68678
      v_mark = ((uint64_t)(iop_a_dst - io0_a_dst));
68679
      {
68680
        if (a_dst) {
68681
          a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
68682
        }
68683
        if (a_src) {
68684
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
68685
        }
68686
        wuffs_base__status t_2 = wuffs_deflate__decoder__transform_io(&self->private_data.f_flate, a_dst, a_src, a_workbuf);
68687
        v_status = t_2;
68688
        if (a_dst) {
68689
          iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
68690
        }
68691
        if (a_src) {
68692
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
68693
        }
68694
      }
68695
      if ( ! self->private_impl.f_ignore_checksum &&  ! self->private_impl.f_quirks[0u]) {
68696
        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));
68697
      }
68698
      if (wuffs_base__status__is_ok(&v_status)) {
68699
        break;
68700
      }
68701
      status = v_status;
68702
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5);
68703
    }
68704
    if ( ! self->private_impl.f_quirks[0u]) {
68705
      {
68706
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
68707
        uint32_t t_3;
68708
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
68709
          t_3 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
68710
          iop_a_src += 4;
68711
        } else {
68712
          self->private_data.s_do_transform_io.scratch = 0;
68713
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
68714
          while (true) {
68715
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
68716
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
68717
              goto suspend;
68718
            }
68719
            uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
68720
            uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFFu));
68721
            *scratch >>= 8;
68722
            *scratch <<= 8;
68723
            *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3);
68724
            if (num_bits_3 == 24) {
68725
              t_3 = ((uint32_t)(*scratch >> 32));
68726
              break;
68727
            }
68728
            num_bits_3 += 8u;
68729
            *scratch |= ((uint64_t)(num_bits_3));
68730
          }
68731
        }
68732
        v_checksum_want = t_3;
68733
      }
68734
      if ( ! self->private_impl.f_ignore_checksum && (v_checksum_have != v_checksum_want)) {
68735
        status = wuffs_base__make_status(wuffs_zlib__error__bad_checksum);
68736
        goto exit;
68737
      }
68738
    }
68739
68740
    ok:
68741
    self->private_impl.p_do_transform_io = 0;
68742
    goto exit;
68743
  }
68744
68745
  goto suspend;
68746
  suspend:
68747
  self->private_impl.p_do_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
68748
  self->private_data.s_do_transform_io.v_checksum_have = v_checksum_have;
68749
68750
  goto exit;
68751
  exit:
68752
  if (a_dst && a_dst->data.ptr) {
68753
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
68754
  }
68755
  if (a_src && a_src->data.ptr) {
68756
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
68757
  }
68758
68759
  return status;
68760
}
68761
68762
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ZLIB)
68763
68764
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__PNG)
68765
68766
// ---------------- Status Codes Implementations
68767
68768
const char wuffs_png__error__bad_animation_sequence_number[] = "#png: bad animation sequence number";
68769
const char wuffs_png__error__bad_checksum[] = "#png: bad checksum";
68770
const char wuffs_png__error__bad_chunk[] = "#png: bad chunk";
68771
const char wuffs_png__error__bad_filter[] = "#png: bad filter";
68772
const char wuffs_png__error__bad_header[] = "#png: bad header";
68773
const char wuffs_png__error__bad_text_chunk_not_latin_1[] = "#png: bad text chunk (not Latin-1)";
68774
const char wuffs_png__error__missing_palette[] = "#png: missing palette";
68775
const char wuffs_png__error__truncated_input[] = "#png: truncated input";
68776
const char wuffs_png__error__unsupported_cgbi_extension[] = "#png: unsupported CgBI extension";
68777
const char wuffs_png__error__unsupported_png_compression_method[] = "#png: unsupported PNG compression method";
68778
const char wuffs_png__error__unsupported_png_file[] = "#png: unsupported PNG file";
68779
const char wuffs_png__error__internal_error_inconsistent_i_o[] = "#png: internal error: inconsistent I/O";
68780
const char wuffs_png__error__internal_error_inconsistent_chunk_type[] = "#png: internal error: inconsistent chunk type";
68781
const char wuffs_png__error__internal_error_inconsistent_workbuf_length[] = "#png: internal error: inconsistent workbuf length";
68782
const char wuffs_png__error__internal_error_zlib_decoder_did_not_exhaust_its_input[] = "#png: internal error: zlib decoder did not exhaust its input";
68783
68784
// ---------------- Private Consts
68785
68786
#define WUFFS_PNG__ANCILLARY_BIT 32u
68787
68788
static const uint8_t
68789
WUFFS_PNG__INTERLACING[8][6] WUFFS_BASE__POTENTIALLY_UNUSED = {
68790
  {
68791
    0u, 0u, 0u, 0u, 0u, 0u,
68792
  }, {
68793
    3u, 7u, 0u, 3u, 7u, 0u,
68794
  }, {
68795
    3u, 3u, 4u, 3u, 7u, 0u,
68796
  }, {
68797
    2u, 3u, 0u, 3u, 3u, 4u,
68798
  }, {
68799
    2u, 1u, 2u, 2u, 3u, 0u,
68800
  }, {
68801
    1u, 1u, 0u, 2u, 1u, 2u,
68802
  }, {
68803
    1u, 0u, 1u, 1u, 1u, 0u,
68804
  }, {
68805
    0u, 0u, 0u, 1u, 0u, 1u,
68806
  },
68807
};
68808
68809
static const uint8_t
68810
WUFFS_PNG__LOW_BIT_DEPTH_MULTIPLIERS[8] WUFFS_BASE__POTENTIALLY_UNUSED = {
68811
  0u, 255u, 85u, 0u, 17u, 0u, 0u, 0u,
68812
};
68813
68814
static const uint8_t
68815
WUFFS_PNG__LOW_BIT_DEPTH_NUM_PACKS[8] WUFFS_BASE__POTENTIALLY_UNUSED = {
68816
  0u, 8u, 4u, 0u, 2u, 0u, 0u, 0u,
68817
};
68818
68819
static const uint8_t
68820
WUFFS_PNG__NUM_CHANNELS[8] WUFFS_BASE__POTENTIALLY_UNUSED = {
68821
  1u, 0u, 3u, 1u, 2u, 0u, 4u, 0u,
68822
};
68823
68824
static const uint16_t
68825
WUFFS_PNG__LATIN_1[256] WUFFS_BASE__POTENTIALLY_UNUSED = {
68826
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
68827
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
68828
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
68829
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
68830
  32u, 33u, 34u, 35u, 36u, 37u, 38u, 39u,
68831
  40u, 41u, 42u, 43u, 44u, 45u, 46u, 47u,
68832
  48u, 49u, 50u, 51u, 52u, 53u, 54u, 55u,
68833
  56u, 57u, 58u, 59u, 60u, 61u, 62u, 63u,
68834
  64u, 65u, 66u, 67u, 68u, 69u, 70u, 71u,
68835
  72u, 73u, 74u, 75u, 76u, 77u, 78u, 79u,
68836
  80u, 81u, 82u, 83u, 84u, 85u, 86u, 87u,
68837
  88u, 89u, 90u, 91u, 92u, 93u, 94u, 95u,
68838
  96u, 97u, 98u, 99u, 100u, 101u, 102u, 103u,
68839
  104u, 105u, 106u, 107u, 108u, 109u, 110u, 111u,
68840
  112u, 113u, 114u, 115u, 116u, 117u, 118u, 119u,
68841
  120u, 121u, 122u, 123u, 124u, 125u, 126u, 0u,
68842
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
68843
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
68844
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
68845
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
68846
  0u, 41410u, 41666u, 41922u, 42178u, 42434u, 42690u, 42946u,
68847
  43202u, 43458u, 43714u, 43970u, 44226u, 44482u, 44738u, 44994u,
68848
  45250u, 45506u, 45762u, 46018u, 46274u, 46530u, 46786u, 47042u,
68849
  47298u, 47554u, 47810u, 48066u, 48322u, 48578u, 48834u, 49090u,
68850
  32963u, 33219u, 33475u, 33731u, 33987u, 34243u, 34499u, 34755u,
68851
  35011u, 35267u, 35523u, 35779u, 36035u, 36291u, 36547u, 36803u,
68852
  37059u, 37315u, 37571u, 37827u, 38083u, 38339u, 38595u, 38851u,
68853
  39107u, 39363u, 39619u, 39875u, 40131u, 40387u, 40643u, 40899u,
68854
  41155u, 41411u, 41667u, 41923u, 42179u, 42435u, 42691u, 42947u,
68855
  43203u, 43459u, 43715u, 43971u, 44227u, 44483u, 44739u, 44995u,
68856
  45251u, 45507u, 45763u, 46019u, 46275u, 46531u, 46787u, 47043u,
68857
  47299u, 47555u, 47811u, 48067u, 48323u, 48579u, 48835u, 49091u,
68858
};
68859
68860
// ---------------- Private Initializer Prototypes
68861
68862
// ---------------- Private Function Prototypes
68863
68864
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
68865
WUFFS_BASE__GENERATED_C_CODE
68866
static wuffs_base__empty_struct
68867
wuffs_png__decoder__filter_1_distance_4_arm_neon(
68868
    wuffs_png__decoder* self,
68869
    wuffs_base__slice_u8 a_curr);
68870
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
68871
68872
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
68873
WUFFS_BASE__GENERATED_C_CODE
68874
static wuffs_base__empty_struct
68875
wuffs_png__decoder__filter_3_distance_4_arm_neon(
68876
    wuffs_png__decoder* self,
68877
    wuffs_base__slice_u8 a_curr,
68878
    wuffs_base__slice_u8 a_prev);
68879
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
68880
68881
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
68882
WUFFS_BASE__GENERATED_C_CODE
68883
static wuffs_base__empty_struct
68884
wuffs_png__decoder__filter_4_distance_3_arm_neon(
68885
    wuffs_png__decoder* self,
68886
    wuffs_base__slice_u8 a_curr,
68887
    wuffs_base__slice_u8 a_prev);
68888
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
68889
68890
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
68891
WUFFS_BASE__GENERATED_C_CODE
68892
static wuffs_base__empty_struct
68893
wuffs_png__decoder__filter_4_distance_4_arm_neon(
68894
    wuffs_png__decoder* self,
68895
    wuffs_base__slice_u8 a_curr,
68896
    wuffs_base__slice_u8 a_prev);
68897
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
68898
68899
WUFFS_BASE__GENERATED_C_CODE
68900
static wuffs_base__empty_struct
68901
wuffs_png__decoder__filter_1(
68902
    wuffs_png__decoder* self,
68903
    wuffs_base__slice_u8 a_curr);
68904
68905
WUFFS_BASE__GENERATED_C_CODE
68906
static wuffs_base__empty_struct
68907
wuffs_png__decoder__filter_1__choosy_default(
68908
    wuffs_png__decoder* self,
68909
    wuffs_base__slice_u8 a_curr);
68910
68911
WUFFS_BASE__GENERATED_C_CODE
68912
static wuffs_base__empty_struct
68913
wuffs_png__decoder__filter_1_distance_3_fallback(
68914
    wuffs_png__decoder* self,
68915
    wuffs_base__slice_u8 a_curr);
68916
68917
WUFFS_BASE__GENERATED_C_CODE
68918
static wuffs_base__empty_struct
68919
wuffs_png__decoder__filter_1_distance_4_fallback(
68920
    wuffs_png__decoder* self,
68921
    wuffs_base__slice_u8 a_curr);
68922
68923
WUFFS_BASE__GENERATED_C_CODE
68924
static wuffs_base__empty_struct
68925
wuffs_png__decoder__filter_2(
68926
    wuffs_png__decoder* self,
68927
    wuffs_base__slice_u8 a_curr,
68928
    wuffs_base__slice_u8 a_prev);
68929
68930
WUFFS_BASE__GENERATED_C_CODE
68931
static wuffs_base__empty_struct
68932
wuffs_png__decoder__filter_3(
68933
    wuffs_png__decoder* self,
68934
    wuffs_base__slice_u8 a_curr,
68935
    wuffs_base__slice_u8 a_prev);
68936
68937
WUFFS_BASE__GENERATED_C_CODE
68938
static wuffs_base__empty_struct
68939
wuffs_png__decoder__filter_3__choosy_default(
68940
    wuffs_png__decoder* self,
68941
    wuffs_base__slice_u8 a_curr,
68942
    wuffs_base__slice_u8 a_prev);
68943
68944
WUFFS_BASE__GENERATED_C_CODE
68945
static wuffs_base__empty_struct
68946
wuffs_png__decoder__filter_3_distance_3_fallback(
68947
    wuffs_png__decoder* self,
68948
    wuffs_base__slice_u8 a_curr,
68949
    wuffs_base__slice_u8 a_prev);
68950
68951
WUFFS_BASE__GENERATED_C_CODE
68952
static wuffs_base__empty_struct
68953
wuffs_png__decoder__filter_3_distance_4_fallback(
68954
    wuffs_png__decoder* self,
68955
    wuffs_base__slice_u8 a_curr,
68956
    wuffs_base__slice_u8 a_prev);
68957
68958
WUFFS_BASE__GENERATED_C_CODE
68959
static wuffs_base__empty_struct
68960
wuffs_png__decoder__filter_4(
68961
    wuffs_png__decoder* self,
68962
    wuffs_base__slice_u8 a_curr,
68963
    wuffs_base__slice_u8 a_prev);
68964
68965
WUFFS_BASE__GENERATED_C_CODE
68966
static wuffs_base__empty_struct
68967
wuffs_png__decoder__filter_4__choosy_default(
68968
    wuffs_png__decoder* self,
68969
    wuffs_base__slice_u8 a_curr,
68970
    wuffs_base__slice_u8 a_prev);
68971
68972
WUFFS_BASE__GENERATED_C_CODE
68973
static wuffs_base__empty_struct
68974
wuffs_png__decoder__filter_4_distance_3_fallback(
68975
    wuffs_png__decoder* self,
68976
    wuffs_base__slice_u8 a_curr,
68977
    wuffs_base__slice_u8 a_prev);
68978
68979
WUFFS_BASE__GENERATED_C_CODE
68980
static wuffs_base__empty_struct
68981
wuffs_png__decoder__filter_4_distance_4_fallback(
68982
    wuffs_png__decoder* self,
68983
    wuffs_base__slice_u8 a_curr,
68984
    wuffs_base__slice_u8 a_prev);
68985
68986
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
68987
WUFFS_BASE__GENERATED_C_CODE
68988
static wuffs_base__empty_struct
68989
wuffs_png__decoder__filter_1_distance_4_x86_sse42(
68990
    wuffs_png__decoder* self,
68991
    wuffs_base__slice_u8 a_curr);
68992
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
68993
68994
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
68995
WUFFS_BASE__GENERATED_C_CODE
68996
static wuffs_base__empty_struct
68997
wuffs_png__decoder__filter_3_distance_4_x86_sse42(
68998
    wuffs_png__decoder* self,
68999
    wuffs_base__slice_u8 a_curr,
69000
    wuffs_base__slice_u8 a_prev);
69001
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
69002
69003
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
69004
WUFFS_BASE__GENERATED_C_CODE
69005
static wuffs_base__empty_struct
69006
wuffs_png__decoder__filter_4_distance_3_x86_sse42(
69007
    wuffs_png__decoder* self,
69008
    wuffs_base__slice_u8 a_curr,
69009
    wuffs_base__slice_u8 a_prev);
69010
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
69011
69012
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
69013
WUFFS_BASE__GENERATED_C_CODE
69014
static wuffs_base__empty_struct
69015
wuffs_png__decoder__filter_4_distance_4_x86_sse42(
69016
    wuffs_png__decoder* self,
69017
    wuffs_base__slice_u8 a_curr,
69018
    wuffs_base__slice_u8 a_prev);
69019
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
69020
69021
WUFFS_BASE__GENERATED_C_CODE
69022
static wuffs_base__status
69023
wuffs_png__decoder__do_decode_image_config(
69024
    wuffs_png__decoder* self,
69025
    wuffs_base__image_config* a_dst,
69026
    wuffs_base__io_buffer* a_src);
69027
69028
WUFFS_BASE__GENERATED_C_CODE
69029
static wuffs_base__status
69030
wuffs_png__decoder__decode_ihdr(
69031
    wuffs_png__decoder* self,
69032
    wuffs_base__io_buffer* a_src);
69033
69034
WUFFS_BASE__GENERATED_C_CODE
69035
static wuffs_base__empty_struct
69036
wuffs_png__decoder__assign_filter_distance(
69037
    wuffs_png__decoder* self);
69038
69039
WUFFS_BASE__GENERATED_C_CODE
69040
static uint64_t
69041
wuffs_png__decoder__calculate_bytes_per_row(
69042
    const wuffs_png__decoder* self,
69043
    uint32_t a_width);
69044
69045
WUFFS_BASE__GENERATED_C_CODE
69046
static wuffs_base__empty_struct
69047
wuffs_png__decoder__choose_filter_implementations(
69048
    wuffs_png__decoder* self);
69049
69050
WUFFS_BASE__GENERATED_C_CODE
69051
static wuffs_base__status
69052
wuffs_png__decoder__decode_other_chunk(
69053
    wuffs_png__decoder* self,
69054
    wuffs_base__io_buffer* a_src,
69055
    bool a_framy);
69056
69057
WUFFS_BASE__GENERATED_C_CODE
69058
static wuffs_base__status
69059
wuffs_png__decoder__decode_actl(
69060
    wuffs_png__decoder* self,
69061
    wuffs_base__io_buffer* a_src);
69062
69063
WUFFS_BASE__GENERATED_C_CODE
69064
static wuffs_base__status
69065
wuffs_png__decoder__decode_chrm(
69066
    wuffs_png__decoder* self,
69067
    wuffs_base__io_buffer* a_src);
69068
69069
WUFFS_BASE__GENERATED_C_CODE
69070
static wuffs_base__status
69071
wuffs_png__decoder__decode_exif(
69072
    wuffs_png__decoder* self,
69073
    wuffs_base__io_buffer* a_src);
69074
69075
WUFFS_BASE__GENERATED_C_CODE
69076
static wuffs_base__status
69077
wuffs_png__decoder__decode_fctl(
69078
    wuffs_png__decoder* self,
69079
    wuffs_base__io_buffer* a_src);
69080
69081
WUFFS_BASE__GENERATED_C_CODE
69082
static wuffs_base__status
69083
wuffs_png__decoder__decode_gama(
69084
    wuffs_png__decoder* self,
69085
    wuffs_base__io_buffer* a_src);
69086
69087
WUFFS_BASE__GENERATED_C_CODE
69088
static wuffs_base__status
69089
wuffs_png__decoder__decode_iccp(
69090
    wuffs_png__decoder* self,
69091
    wuffs_base__io_buffer* a_src);
69092
69093
WUFFS_BASE__GENERATED_C_CODE
69094
static wuffs_base__status
69095
wuffs_png__decoder__decode_plte(
69096
    wuffs_png__decoder* self,
69097
    wuffs_base__io_buffer* a_src);
69098
69099
WUFFS_BASE__GENERATED_C_CODE
69100
static wuffs_base__status
69101
wuffs_png__decoder__decode_srgb(
69102
    wuffs_png__decoder* self,
69103
    wuffs_base__io_buffer* a_src);
69104
69105
WUFFS_BASE__GENERATED_C_CODE
69106
static wuffs_base__status
69107
wuffs_png__decoder__decode_trns(
69108
    wuffs_png__decoder* self,
69109
    wuffs_base__io_buffer* a_src);
69110
69111
WUFFS_BASE__GENERATED_C_CODE
69112
static wuffs_base__status
69113
wuffs_png__decoder__do_decode_frame_config(
69114
    wuffs_png__decoder* self,
69115
    wuffs_base__frame_config* a_dst,
69116
    wuffs_base__io_buffer* a_src);
69117
69118
WUFFS_BASE__GENERATED_C_CODE
69119
static wuffs_base__status
69120
wuffs_png__decoder__skip_frame(
69121
    wuffs_png__decoder* self,
69122
    wuffs_base__io_buffer* a_src);
69123
69124
WUFFS_BASE__GENERATED_C_CODE
69125
static wuffs_base__status
69126
wuffs_png__decoder__do_decode_frame(
69127
    wuffs_png__decoder* self,
69128
    wuffs_base__pixel_buffer* a_dst,
69129
    wuffs_base__io_buffer* a_src,
69130
    wuffs_base__pixel_blend a_blend,
69131
    wuffs_base__slice_u8 a_workbuf,
69132
    wuffs_base__decode_frame_options* a_opts);
69133
69134
WUFFS_BASE__GENERATED_C_CODE
69135
static wuffs_base__status
69136
wuffs_png__decoder__decode_pass(
69137
    wuffs_png__decoder* self,
69138
    wuffs_base__io_buffer* a_src,
69139
    wuffs_base__slice_u8 a_workbuf);
69140
69141
WUFFS_BASE__GENERATED_C_CODE
69142
static wuffs_base__status
69143
wuffs_png__decoder__do_tell_me_more(
69144
    wuffs_png__decoder* self,
69145
    wuffs_base__io_buffer* a_dst,
69146
    wuffs_base__more_information* a_minfo,
69147
    wuffs_base__io_buffer* a_src);
69148
69149
WUFFS_BASE__GENERATED_C_CODE
69150
static wuffs_base__status
69151
wuffs_png__decoder__filter_and_swizzle(
69152
    wuffs_png__decoder* self,
69153
    wuffs_base__pixel_buffer* a_dst,
69154
    wuffs_base__slice_u8 a_workbuf);
69155
69156
WUFFS_BASE__GENERATED_C_CODE
69157
static wuffs_base__status
69158
wuffs_png__decoder__filter_and_swizzle__choosy_default(
69159
    wuffs_png__decoder* self,
69160
    wuffs_base__pixel_buffer* a_dst,
69161
    wuffs_base__slice_u8 a_workbuf);
69162
69163
WUFFS_BASE__GENERATED_C_CODE
69164
static wuffs_base__status
69165
wuffs_png__decoder__filter_and_swizzle_tricky(
69166
    wuffs_png__decoder* self,
69167
    wuffs_base__pixel_buffer* a_dst,
69168
    wuffs_base__slice_u8 a_workbuf);
69169
69170
// ---------------- VTables
69171
69172
const wuffs_base__image_decoder__func_ptrs
69173
wuffs_png__decoder__func_ptrs_for__wuffs_base__image_decoder = {
69174
  (wuffs_base__status(*)(void*,
69175
      wuffs_base__pixel_buffer*,
69176
      wuffs_base__io_buffer*,
69177
      wuffs_base__pixel_blend,
69178
      wuffs_base__slice_u8,
69179
      wuffs_base__decode_frame_options*))(&wuffs_png__decoder__decode_frame),
69180
  (wuffs_base__status(*)(void*,
69181
      wuffs_base__frame_config*,
69182
      wuffs_base__io_buffer*))(&wuffs_png__decoder__decode_frame_config),
69183
  (wuffs_base__status(*)(void*,
69184
      wuffs_base__image_config*,
69185
      wuffs_base__io_buffer*))(&wuffs_png__decoder__decode_image_config),
69186
  (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_png__decoder__frame_dirty_rect),
69187
  (uint64_t(*)(const void*,
69188
      uint32_t))(&wuffs_png__decoder__get_quirk),
69189
  (uint32_t(*)(const void*))(&wuffs_png__decoder__num_animation_loops),
69190
  (uint64_t(*)(const void*))(&wuffs_png__decoder__num_decoded_frame_configs),
69191
  (uint64_t(*)(const void*))(&wuffs_png__decoder__num_decoded_frames),
69192
  (wuffs_base__status(*)(void*,
69193
      uint64_t,
69194
      uint64_t))(&wuffs_png__decoder__restart_frame),
69195
  (wuffs_base__status(*)(void*,
69196
      uint32_t,
69197
      uint64_t))(&wuffs_png__decoder__set_quirk),
69198
  (wuffs_base__empty_struct(*)(void*,
69199
      uint32_t,
69200
      bool))(&wuffs_png__decoder__set_report_metadata),
69201
  (wuffs_base__status(*)(void*,
69202
      wuffs_base__io_buffer*,
69203
      wuffs_base__more_information*,
69204
      wuffs_base__io_buffer*))(&wuffs_png__decoder__tell_me_more),
69205
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_png__decoder__workbuf_len),
69206
};
69207
69208
// ---------------- Initializer Implementations
69209
69210
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
69211
wuffs_png__decoder__initialize(
69212
    wuffs_png__decoder* self,
69213
    size_t sizeof_star_self,
69214
    uint64_t wuffs_version,
69215
    uint32_t options){
69216
  if (!self) {
69217
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
69218
  }
69219
  if (sizeof(*self) != sizeof_star_self) {
69220
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
69221
  }
69222
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
69223
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
69224
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
69225
  }
69226
69227
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
69228
    // The whole point of this if-check is to detect an uninitialized *self.
69229
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
69230
#if !defined(__clang__) && defined(__GNUC__)
69231
#pragma GCC diagnostic push
69232
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
69233
#endif
69234
    if (self->private_impl.magic != 0) {
69235
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
69236
    }
69237
#if !defined(__clang__) && defined(__GNUC__)
69238
#pragma GCC diagnostic pop
69239
#endif
69240
  } else {
69241
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
69242
      memset(self, 0, sizeof(*self));
69243
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
69244
    } else {
69245
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
69246
    }
69247
  }
69248
69249
  self->private_impl.choosy_filter_1 = &wuffs_png__decoder__filter_1__choosy_default;
69250
  self->private_impl.choosy_filter_3 = &wuffs_png__decoder__filter_3__choosy_default;
69251
  self->private_impl.choosy_filter_4 = &wuffs_png__decoder__filter_4__choosy_default;
69252
  self->private_impl.choosy_filter_and_swizzle = &wuffs_png__decoder__filter_and_swizzle__choosy_default;
69253
69254
  {
69255
    wuffs_base__status z = wuffs_crc32__ieee_hasher__initialize(
69256
        &self->private_data.f_crc32, sizeof(self->private_data.f_crc32), WUFFS_VERSION, options);
69257
    if (z.repr) {
69258
      return z;
69259
    }
69260
  }
69261
  {
69262
    wuffs_base__status z = wuffs_zlib__decoder__initialize(
69263
        &self->private_data.f_zlib, sizeof(self->private_data.f_zlib), WUFFS_VERSION, options);
69264
    if (z.repr) {
69265
      return z;
69266
    }
69267
  }
69268
  self->private_impl.magic = WUFFS_BASE__MAGIC;
69269
  self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name =
69270
      wuffs_base__image_decoder__vtable_name;
69271
  self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers =
69272
      (const void*)(&wuffs_png__decoder__func_ptrs_for__wuffs_base__image_decoder);
69273
  return wuffs_base__make_status(NULL);
69274
}
69275
69276
wuffs_png__decoder*
69277
wuffs_png__decoder__alloc(void) {
69278
  wuffs_png__decoder* x =
69279
      (wuffs_png__decoder*)(calloc(1, sizeof(wuffs_png__decoder)));
69280
  if (!x) {
69281
    return NULL;
69282
  }
69283
  if (wuffs_png__decoder__initialize(
69284
      x, sizeof(wuffs_png__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
69285
    free(x);
69286
    return NULL;
69287
  }
69288
  return x;
69289
}
69290
69291
size_t
69292
sizeof__wuffs_png__decoder(void) {
69293
  return sizeof(wuffs_png__decoder);
69294
}
69295
69296
// ---------------- Function Implementations
69297
69298
// โ€ผ WUFFS MULTI-FILE SECTION +arm_neon
69299
// -------- func png.decoder.filter_1_distance_4_arm_neon
69300
69301
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
69302
WUFFS_BASE__GENERATED_C_CODE
69303
static wuffs_base__empty_struct
69304
wuffs_png__decoder__filter_1_distance_4_arm_neon(
69305
    wuffs_png__decoder* self,
69306
    wuffs_base__slice_u8 a_curr) {
69307
  wuffs_base__slice_u8 v_curr = {0};
69308
  uint8x8_t v_fa = {0};
69309
  uint8x8_t v_fx = {0};
69310
69311
  {
69312
    wuffs_base__slice_u8 i_slice_curr = a_curr;
69313
    v_curr.ptr = i_slice_curr.ptr;
69314
    v_curr.len = 4;
69315
    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));
69316
    while (v_curr.ptr < i_end0_curr) {
69317
      v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
69318
      v_fx = vadd_u8(v_fx, v_fa);
69319
      wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u));
69320
      v_fa = v_fx;
69321
      v_curr.ptr += 4;
69322
      v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
69323
      v_fx = vadd_u8(v_fx, v_fa);
69324
      wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u));
69325
      v_fa = v_fx;
69326
      v_curr.ptr += 4;
69327
    }
69328
    v_curr.len = 4;
69329
    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));
69330
    while (v_curr.ptr < i_end1_curr) {
69331
      v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
69332
      v_fx = vadd_u8(v_fx, v_fa);
69333
      wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u));
69334
      v_fa = v_fx;
69335
      v_curr.ptr += 4;
69336
    }
69337
    v_curr.len = 0;
69338
  }
69339
  return wuffs_base__make_empty_struct();
69340
}
69341
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
69342
// โ€ผ WUFFS MULTI-FILE SECTION -arm_neon
69343
69344
// โ€ผ WUFFS MULTI-FILE SECTION +arm_neon
69345
// -------- func png.decoder.filter_3_distance_4_arm_neon
69346
69347
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
69348
WUFFS_BASE__GENERATED_C_CODE
69349
static wuffs_base__empty_struct
69350
wuffs_png__decoder__filter_3_distance_4_arm_neon(
69351
    wuffs_png__decoder* self,
69352
    wuffs_base__slice_u8 a_curr,
69353
    wuffs_base__slice_u8 a_prev) {
69354
  wuffs_base__slice_u8 v_curr = {0};
69355
  wuffs_base__slice_u8 v_prev = {0};
69356
  uint8x8_t v_fa = {0};
69357
  uint8x8_t v_fb = {0};
69358
  uint8x8_t v_fx = {0};
69359
69360
  if (((uint64_t)(a_prev.len)) == 0u) {
69361
    {
69362
      wuffs_base__slice_u8 i_slice_curr = a_curr;
69363
      v_curr.ptr = i_slice_curr.ptr;
69364
      v_curr.len = 4;
69365
      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));
69366
      while (v_curr.ptr < i_end0_curr) {
69367
        v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
69368
        v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb));
69369
        wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u));
69370
        v_fa = v_fx;
69371
        v_curr.ptr += 4;
69372
        v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
69373
        v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb));
69374
        wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u));
69375
        v_fa = v_fx;
69376
        v_curr.ptr += 4;
69377
      }
69378
      v_curr.len = 4;
69379
      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));
69380
      while (v_curr.ptr < i_end1_curr) {
69381
        v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
69382
        v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb));
69383
        wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u));
69384
        v_fa = v_fx;
69385
        v_curr.ptr += 4;
69386
      }
69387
      v_curr.len = 0;
69388
    }
69389
  } else {
69390
    {
69391
      wuffs_base__slice_u8 i_slice_curr = a_curr;
69392
      v_curr.ptr = i_slice_curr.ptr;
69393
      wuffs_base__slice_u8 i_slice_prev = a_prev;
69394
      v_prev.ptr = i_slice_prev.ptr;
69395
      i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len)));
69396
      v_curr.len = 4;
69397
      v_prev.len = 4;
69398
      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));
69399
      while (v_curr.ptr < i_end0_curr) {
69400
        v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
69401
        v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
69402
        v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb));
69403
        wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u));
69404
        v_fa = v_fx;
69405
        v_curr.ptr += 4;
69406
        v_prev.ptr += 4;
69407
        v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
69408
        v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
69409
        v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb));
69410
        wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u));
69411
        v_fa = v_fx;
69412
        v_curr.ptr += 4;
69413
        v_prev.ptr += 4;
69414
      }
69415
      v_curr.len = 4;
69416
      v_prev.len = 4;
69417
      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));
69418
      while (v_curr.ptr < i_end1_curr) {
69419
        v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
69420
        v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
69421
        v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb));
69422
        wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u));
69423
        v_fa = v_fx;
69424
        v_curr.ptr += 4;
69425
        v_prev.ptr += 4;
69426
      }
69427
      v_curr.len = 0;
69428
      v_prev.len = 0;
69429
    }
69430
  }
69431
  return wuffs_base__make_empty_struct();
69432
}
69433
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
69434
// โ€ผ WUFFS MULTI-FILE SECTION -arm_neon
69435
69436
// โ€ผ WUFFS MULTI-FILE SECTION +arm_neon
69437
// -------- func png.decoder.filter_4_distance_3_arm_neon
69438
69439
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
69440
WUFFS_BASE__GENERATED_C_CODE
69441
static wuffs_base__empty_struct
69442
wuffs_png__decoder__filter_4_distance_3_arm_neon(
69443
    wuffs_png__decoder* self,
69444
    wuffs_base__slice_u8 a_curr,
69445
    wuffs_base__slice_u8 a_prev) {
69446
  wuffs_base__slice_u8 v_curr = {0};
69447
  wuffs_base__slice_u8 v_prev = {0};
69448
  uint8x8_t v_fa = {0};
69449
  uint8x8_t v_fb = {0};
69450
  uint8x8_t v_fc = {0};
69451
  uint8x8_t v_fx = {0};
69452
  uint16x8_t v_fafb = {0};
69453
  uint16x8_t v_fcfc = {0};
69454
  uint16x8_t v_pa = {0};
69455
  uint16x8_t v_pb = {0};
69456
  uint16x8_t v_pc = {0};
69457
  uint16x8_t v_cmpab = {0};
69458
  uint16x8_t v_cmpac = {0};
69459
  uint8x8_t v_picka = {0};
69460
  uint8x8_t v_pickb = {0};
69461
69462
  {
69463
    wuffs_base__slice_u8 i_slice_curr = a_curr;
69464
    v_curr.ptr = i_slice_curr.ptr;
69465
    wuffs_base__slice_u8 i_slice_prev = a_prev;
69466
    v_prev.ptr = i_slice_prev.ptr;
69467
    i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len)));
69468
    v_curr.len = 4;
69469
    v_prev.len = 4;
69470
    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));
69471
    while (v_curr.ptr < i_end0_curr) {
69472
      v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
69473
      v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
69474
      v_fafb = vaddl_u8(v_fa, v_fb);
69475
      v_fcfc = vaddl_u8(v_fc, v_fc);
69476
      v_pa = vabdl_u8(v_fb, v_fc);
69477
      v_pb = vabdl_u8(v_fa, v_fc);
69478
      v_pc = vabdq_u16(v_fafb, v_fcfc);
69479
      v_cmpab = vcleq_u16(v_pa, v_pb);
69480
      v_cmpac = vcleq_u16(v_pa, v_pc);
69481
      v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac));
69482
      v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc));
69483
      v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc)));
69484
      wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u));
69485
      v_fc = v_fb;
69486
      v_fa = v_fx;
69487
      v_curr.ptr += 3;
69488
      v_prev.ptr += 3;
69489
      v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
69490
      v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
69491
      v_fafb = vaddl_u8(v_fa, v_fb);
69492
      v_fcfc = vaddl_u8(v_fc, v_fc);
69493
      v_pa = vabdl_u8(v_fb, v_fc);
69494
      v_pb = vabdl_u8(v_fa, v_fc);
69495
      v_pc = vabdq_u16(v_fafb, v_fcfc);
69496
      v_cmpab = vcleq_u16(v_pa, v_pb);
69497
      v_cmpac = vcleq_u16(v_pa, v_pc);
69498
      v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac));
69499
      v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc));
69500
      v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc)));
69501
      wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u));
69502
      v_fc = v_fb;
69503
      v_fa = v_fx;
69504
      v_curr.ptr += 3;
69505
      v_prev.ptr += 3;
69506
    }
69507
    v_curr.len = 4;
69508
    v_prev.len = 4;
69509
    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));
69510
    while (v_curr.ptr < i_end1_curr) {
69511
      v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
69512
      v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
69513
      v_fafb = vaddl_u8(v_fa, v_fb);
69514
      v_fcfc = vaddl_u8(v_fc, v_fc);
69515
      v_pa = vabdl_u8(v_fb, v_fc);
69516
      v_pb = vabdl_u8(v_fa, v_fc);
69517
      v_pc = vabdq_u16(v_fafb, v_fcfc);
69518
      v_cmpab = vcleq_u16(v_pa, v_pb);
69519
      v_cmpac = vcleq_u16(v_pa, v_pc);
69520
      v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac));
69521
      v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc));
69522
      v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc)));
69523
      wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u));
69524
      v_fc = v_fb;
69525
      v_fa = v_fx;
69526
      v_curr.ptr += 3;
69527
      v_prev.ptr += 3;
69528
    }
69529
    v_curr.len = 3;
69530
    v_prev.len = 3;
69531
    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));
69532
    while (v_curr.ptr < i_end2_curr) {
69533
      v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u24le__no_bounds_check(v_prev.ptr)));
69534
      v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u24le__no_bounds_check(v_curr.ptr)));
69535
      v_fafb = vaddl_u8(v_fa, v_fb);
69536
      v_fcfc = vaddl_u8(v_fc, v_fc);
69537
      v_pa = vabdl_u8(v_fb, v_fc);
69538
      v_pb = vabdl_u8(v_fa, v_fc);
69539
      v_pc = vabdq_u16(v_fafb, v_fcfc);
69540
      v_cmpab = vcleq_u16(v_pa, v_pb);
69541
      v_cmpac = vcleq_u16(v_pa, v_pc);
69542
      v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac));
69543
      v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc));
69544
      v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc)));
69545
      wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u));
69546
      v_curr.ptr += 3;
69547
      v_prev.ptr += 3;
69548
    }
69549
    v_curr.len = 0;
69550
    v_prev.len = 0;
69551
  }
69552
  return wuffs_base__make_empty_struct();
69553
}
69554
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
69555
// โ€ผ WUFFS MULTI-FILE SECTION -arm_neon
69556
69557
// โ€ผ WUFFS MULTI-FILE SECTION +arm_neon
69558
// -------- func png.decoder.filter_4_distance_4_arm_neon
69559
69560
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
69561
WUFFS_BASE__GENERATED_C_CODE
69562
static wuffs_base__empty_struct
69563
wuffs_png__decoder__filter_4_distance_4_arm_neon(
69564
    wuffs_png__decoder* self,
69565
    wuffs_base__slice_u8 a_curr,
69566
    wuffs_base__slice_u8 a_prev) {
69567
  wuffs_base__slice_u8 v_curr = {0};
69568
  wuffs_base__slice_u8 v_prev = {0};
69569
  uint8x8_t v_fa = {0};
69570
  uint8x8_t v_fb = {0};
69571
  uint8x8_t v_fc = {0};
69572
  uint8x8_t v_fx = {0};
69573
  uint16x8_t v_fafb = {0};
69574
  uint16x8_t v_fcfc = {0};
69575
  uint16x8_t v_pa = {0};
69576
  uint16x8_t v_pb = {0};
69577
  uint16x8_t v_pc = {0};
69578
  uint16x8_t v_cmpab = {0};
69579
  uint16x8_t v_cmpac = {0};
69580
  uint8x8_t v_picka = {0};
69581
  uint8x8_t v_pickb = {0};
69582
69583
  {
69584
    wuffs_base__slice_u8 i_slice_curr = a_curr;
69585
    v_curr.ptr = i_slice_curr.ptr;
69586
    wuffs_base__slice_u8 i_slice_prev = a_prev;
69587
    v_prev.ptr = i_slice_prev.ptr;
69588
    i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len)));
69589
    v_curr.len = 4;
69590
    v_prev.len = 4;
69591
    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));
69592
    while (v_curr.ptr < i_end0_curr) {
69593
      v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
69594
      v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
69595
      v_fafb = vaddl_u8(v_fa, v_fb);
69596
      v_fcfc = vaddl_u8(v_fc, v_fc);
69597
      v_pa = vabdl_u8(v_fb, v_fc);
69598
      v_pb = vabdl_u8(v_fa, v_fc);
69599
      v_pc = vabdq_u16(v_fafb, v_fcfc);
69600
      v_cmpab = vcleq_u16(v_pa, v_pb);
69601
      v_cmpac = vcleq_u16(v_pa, v_pc);
69602
      v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac));
69603
      v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc));
69604
      v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc)));
69605
      wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u));
69606
      v_fc = v_fb;
69607
      v_fa = v_fx;
69608
      v_curr.ptr += 4;
69609
      v_prev.ptr += 4;
69610
      v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
69611
      v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
69612
      v_fafb = vaddl_u8(v_fa, v_fb);
69613
      v_fcfc = vaddl_u8(v_fc, v_fc);
69614
      v_pa = vabdl_u8(v_fb, v_fc);
69615
      v_pb = vabdl_u8(v_fa, v_fc);
69616
      v_pc = vabdq_u16(v_fafb, v_fcfc);
69617
      v_cmpab = vcleq_u16(v_pa, v_pb);
69618
      v_cmpac = vcleq_u16(v_pa, v_pc);
69619
      v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac));
69620
      v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc));
69621
      v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc)));
69622
      wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u));
69623
      v_fc = v_fb;
69624
      v_fa = v_fx;
69625
      v_curr.ptr += 4;
69626
      v_prev.ptr += 4;
69627
    }
69628
    v_curr.len = 4;
69629
    v_prev.len = 4;
69630
    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));
69631
    while (v_curr.ptr < i_end1_curr) {
69632
      v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
69633
      v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
69634
      v_fafb = vaddl_u8(v_fa, v_fb);
69635
      v_fcfc = vaddl_u8(v_fc, v_fc);
69636
      v_pa = vabdl_u8(v_fb, v_fc);
69637
      v_pb = vabdl_u8(v_fa, v_fc);
69638
      v_pc = vabdq_u16(v_fafb, v_fcfc);
69639
      v_cmpab = vcleq_u16(v_pa, v_pb);
69640
      v_cmpac = vcleq_u16(v_pa, v_pc);
69641
      v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac));
69642
      v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc));
69643
      v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc)));
69644
      wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u));
69645
      v_fc = v_fb;
69646
      v_fa = v_fx;
69647
      v_curr.ptr += 4;
69648
      v_prev.ptr += 4;
69649
    }
69650
    v_curr.len = 0;
69651
    v_prev.len = 0;
69652
  }
69653
  return wuffs_base__make_empty_struct();
69654
}
69655
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
69656
// โ€ผ WUFFS MULTI-FILE SECTION -arm_neon
69657
69658
// -------- func png.decoder.filter_1
69659
69660
WUFFS_BASE__GENERATED_C_CODE
69661
static wuffs_base__empty_struct
69662
wuffs_png__decoder__filter_1(
69663
    wuffs_png__decoder* self,
69664
    wuffs_base__slice_u8 a_curr) {
69665
  return (*self->private_impl.choosy_filter_1)(self, a_curr);
69666
}
69667
69668
WUFFS_BASE__GENERATED_C_CODE
69669
static wuffs_base__empty_struct
69670
wuffs_png__decoder__filter_1__choosy_default(
69671
    wuffs_png__decoder* self,
69672
    wuffs_base__slice_u8 a_curr) {
69673
  uint64_t v_filter_distance = 0;
69674
  uint8_t v_fa = 0;
69675
  uint64_t v_i_start = 0;
69676
  uint64_t v_i = 0;
69677
69678
  v_filter_distance = ((uint64_t)(self->private_impl.f_filter_distance));
69679
  v_i_start = 0u;
69680
  while (v_i_start < v_filter_distance) {
69681
    v_fa = 0u;
69682
    v_i = v_i_start;
69683
    while (v_i < ((uint64_t)(a_curr.len))) {
69684
      a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + v_fa));
69685
      v_fa = a_curr.ptr[v_i];
69686
      v_i += v_filter_distance;
69687
    }
69688
    v_i_start += 1u;
69689
  }
69690
  return wuffs_base__make_empty_struct();
69691
}
69692
69693
// -------- func png.decoder.filter_1_distance_3_fallback
69694
69695
WUFFS_BASE__GENERATED_C_CODE
69696
static wuffs_base__empty_struct
69697
wuffs_png__decoder__filter_1_distance_3_fallback(
69698
    wuffs_png__decoder* self,
69699
    wuffs_base__slice_u8 a_curr) {
69700
  wuffs_base__slice_u8 v_curr = {0};
69701
  uint8_t v_fa0 = 0;
69702
  uint8_t v_fa1 = 0;
69703
  uint8_t v_fa2 = 0;
69704
69705
  {
69706
    wuffs_base__slice_u8 i_slice_curr = a_curr;
69707
    v_curr.ptr = i_slice_curr.ptr;
69708
    v_curr.len = 3;
69709
    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));
69710
    while (v_curr.ptr < i_end0_curr) {
69711
      v_fa0 = ((uint8_t)(v_fa0 + v_curr.ptr[0u]));
69712
      v_curr.ptr[0u] = v_fa0;
69713
      v_fa1 = ((uint8_t)(v_fa1 + v_curr.ptr[1u]));
69714
      v_curr.ptr[1u] = v_fa1;
69715
      v_fa2 = ((uint8_t)(v_fa2 + v_curr.ptr[2u]));
69716
      v_curr.ptr[2u] = v_fa2;
69717
      v_curr.ptr += 3;
69718
      v_fa0 = ((uint8_t)(v_fa0 + v_curr.ptr[0u]));
69719
      v_curr.ptr[0u] = v_fa0;
69720
      v_fa1 = ((uint8_t)(v_fa1 + v_curr.ptr[1u]));
69721
      v_curr.ptr[1u] = v_fa1;
69722
      v_fa2 = ((uint8_t)(v_fa2 + v_curr.ptr[2u]));
69723
      v_curr.ptr[2u] = v_fa2;
69724
      v_curr.ptr += 3;
69725
    }
69726
    v_curr.len = 3;
69727
    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));
69728
    while (v_curr.ptr < i_end1_curr) {
69729
      v_fa0 = ((uint8_t)(v_fa0 + v_curr.ptr[0u]));
69730
      v_curr.ptr[0u] = v_fa0;
69731
      v_fa1 = ((uint8_t)(v_fa1 + v_curr.ptr[1u]));
69732
      v_curr.ptr[1u] = v_fa1;
69733
      v_fa2 = ((uint8_t)(v_fa2 + v_curr.ptr[2u]));
69734
      v_curr.ptr[2u] = v_fa2;
69735
      v_curr.ptr += 3;
69736
    }
69737
    v_curr.len = 0;
69738
  }
69739
  return wuffs_base__make_empty_struct();
69740
}
69741
69742
// -------- func png.decoder.filter_1_distance_4_fallback
69743
69744
WUFFS_BASE__GENERATED_C_CODE
69745
static wuffs_base__empty_struct
69746
wuffs_png__decoder__filter_1_distance_4_fallback(
69747
    wuffs_png__decoder* self,
69748
    wuffs_base__slice_u8 a_curr) {
69749
  wuffs_base__slice_u8 v_curr = {0};
69750
  uint8_t v_fa0 = 0;
69751
  uint8_t v_fa1 = 0;
69752
  uint8_t v_fa2 = 0;
69753
  uint8_t v_fa3 = 0;
69754
69755
  {
69756
    wuffs_base__slice_u8 i_slice_curr = a_curr;
69757
    v_curr.ptr = i_slice_curr.ptr;
69758
    v_curr.len = 4;
69759
    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));
69760
    while (v_curr.ptr < i_end0_curr) {
69761
      v_fa0 = ((uint8_t)(v_fa0 + v_curr.ptr[0u]));
69762
      v_curr.ptr[0u] = v_fa0;
69763
      v_fa1 = ((uint8_t)(v_fa1 + v_curr.ptr[1u]));
69764
      v_curr.ptr[1u] = v_fa1;
69765
      v_fa2 = ((uint8_t)(v_fa2 + v_curr.ptr[2u]));
69766
      v_curr.ptr[2u] = v_fa2;
69767
      v_fa3 = ((uint8_t)(v_fa3 + v_curr.ptr[3u]));
69768
      v_curr.ptr[3u] = v_fa3;
69769
      v_curr.ptr += 4;
69770
    }
69771
    v_curr.len = 0;
69772
  }
69773
  return wuffs_base__make_empty_struct();
69774
}
69775
69776
// -------- func png.decoder.filter_2
69777
69778
WUFFS_BASE__GENERATED_C_CODE
69779
static wuffs_base__empty_struct
69780
wuffs_png__decoder__filter_2(
69781
    wuffs_png__decoder* self,
69782
    wuffs_base__slice_u8 a_curr,
69783
    wuffs_base__slice_u8 a_prev) {
69784
  uint64_t v_n = 0;
69785
  uint64_t v_i = 0;
69786
69787
  v_n = wuffs_base__u64__min(((uint64_t)(a_curr.len)), ((uint64_t)(a_prev.len)));
69788
  v_i = 0u;
69789
  while (v_i < v_n) {
69790
    a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + a_prev.ptr[v_i]));
69791
    v_i += 1u;
69792
  }
69793
  return wuffs_base__make_empty_struct();
69794
}
69795
69796
// -------- func png.decoder.filter_3
69797
69798
WUFFS_BASE__GENERATED_C_CODE
69799
static wuffs_base__empty_struct
69800
wuffs_png__decoder__filter_3(
69801
    wuffs_png__decoder* self,
69802
    wuffs_base__slice_u8 a_curr,
69803
    wuffs_base__slice_u8 a_prev) {
69804
  return (*self->private_impl.choosy_filter_3)(self, a_curr, a_prev);
69805
}
69806
69807
WUFFS_BASE__GENERATED_C_CODE
69808
static wuffs_base__empty_struct
69809
wuffs_png__decoder__filter_3__choosy_default(
69810
    wuffs_png__decoder* self,
69811
    wuffs_base__slice_u8 a_curr,
69812
    wuffs_base__slice_u8 a_prev) {
69813
  uint64_t v_filter_distance = 0;
69814
  uint64_t v_n = 0;
69815
  uint64_t v_i = 0;
69816
69817
  v_filter_distance = ((uint64_t)(self->private_impl.f_filter_distance));
69818
  if (((uint64_t)(a_prev.len)) == 0u) {
69819
    v_i = v_filter_distance;
69820
    while (v_i < ((uint64_t)(a_curr.len))) {
69821
      a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + ((uint8_t)(a_curr.ptr[(v_i - v_filter_distance)] / 2u))));
69822
      v_i += 1u;
69823
    }
69824
  } else {
69825
    v_n = wuffs_base__u64__min(((uint64_t)(a_curr.len)), ((uint64_t)(a_prev.len)));
69826
    v_i = 0u;
69827
    while ((v_i < v_n) && (v_i < v_filter_distance)) {
69828
      a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + ((uint8_t)(a_prev.ptr[v_i] / 2u))));
69829
      v_i += 1u;
69830
    }
69831
    v_i = v_filter_distance;
69832
    while (v_i < v_n) {
69833
      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)))));
69834
      v_i += 1u;
69835
    }
69836
  }
69837
  return wuffs_base__make_empty_struct();
69838
}
69839
69840
// -------- func png.decoder.filter_3_distance_3_fallback
69841
69842
WUFFS_BASE__GENERATED_C_CODE
69843
static wuffs_base__empty_struct
69844
wuffs_png__decoder__filter_3_distance_3_fallback(
69845
    wuffs_png__decoder* self,
69846
    wuffs_base__slice_u8 a_curr,
69847
    wuffs_base__slice_u8 a_prev) {
69848
  wuffs_base__slice_u8 v_curr = {0};
69849
  wuffs_base__slice_u8 v_prev = {0};
69850
  uint8_t v_fa0 = 0;
69851
  uint8_t v_fa1 = 0;
69852
  uint8_t v_fa2 = 0;
69853
69854
  if (((uint64_t)(a_prev.len)) == 0u) {
69855
    {
69856
      wuffs_base__slice_u8 i_slice_curr = a_curr;
69857
      v_curr.ptr = i_slice_curr.ptr;
69858
      v_curr.len = 3;
69859
      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));
69860
      while (v_curr.ptr < i_end0_curr) {
69861
        v_fa0 = ((uint8_t)(((uint8_t)(v_fa0 / 2u)) + v_curr.ptr[0u]));
69862
        v_curr.ptr[0u] = v_fa0;
69863
        v_fa1 = ((uint8_t)(((uint8_t)(v_fa1 / 2u)) + v_curr.ptr[1u]));
69864
        v_curr.ptr[1u] = v_fa1;
69865
        v_fa2 = ((uint8_t)(((uint8_t)(v_fa2 / 2u)) + v_curr.ptr[2u]));
69866
        v_curr.ptr[2u] = v_fa2;
69867
        v_curr.ptr += 3;
69868
        v_fa0 = ((uint8_t)(((uint8_t)(v_fa0 / 2u)) + v_curr.ptr[0u]));
69869
        v_curr.ptr[0u] = v_fa0;
69870
        v_fa1 = ((uint8_t)(((uint8_t)(v_fa1 / 2u)) + v_curr.ptr[1u]));
69871
        v_curr.ptr[1u] = v_fa1;
69872
        v_fa2 = ((uint8_t)(((uint8_t)(v_fa2 / 2u)) + v_curr.ptr[2u]));
69873
        v_curr.ptr[2u] = v_fa2;
69874
        v_curr.ptr += 3;
69875
      }
69876
      v_curr.len = 3;
69877
      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));
69878
      while (v_curr.ptr < i_end1_curr) {
69879
        v_fa0 = ((uint8_t)(((uint8_t)(v_fa0 / 2u)) + v_curr.ptr[0u]));
69880
        v_curr.ptr[0u] = v_fa0;
69881
        v_fa1 = ((uint8_t)(((uint8_t)(v_fa1 / 2u)) + v_curr.ptr[1u]));
69882
        v_curr.ptr[1u] = v_fa1;
69883
        v_fa2 = ((uint8_t)(((uint8_t)(v_fa2 / 2u)) + v_curr.ptr[2u]));
69884
        v_curr.ptr[2u] = v_fa2;
69885
        v_curr.ptr += 3;
69886
      }
69887
      v_curr.len = 0;
69888
    }
69889
  } else {
69890
    {
69891
      wuffs_base__slice_u8 i_slice_curr = a_curr;
69892
      v_curr.ptr = i_slice_curr.ptr;
69893
      wuffs_base__slice_u8 i_slice_prev = a_prev;
69894
      v_prev.ptr = i_slice_prev.ptr;
69895
      i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len)));
69896
      v_curr.len = 3;
69897
      v_prev.len = 3;
69898
      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));
69899
      while (v_curr.ptr < i_end0_curr) {
69900
        v_fa0 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa0)) + ((uint32_t)(v_prev.ptr[0u]))) / 2u))) + v_curr.ptr[0u]));
69901
        v_curr.ptr[0u] = v_fa0;
69902
        v_fa1 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa1)) + ((uint32_t)(v_prev.ptr[1u]))) / 2u))) + v_curr.ptr[1u]));
69903
        v_curr.ptr[1u] = v_fa1;
69904
        v_fa2 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa2)) + ((uint32_t)(v_prev.ptr[2u]))) / 2u))) + v_curr.ptr[2u]));
69905
        v_curr.ptr[2u] = v_fa2;
69906
        v_curr.ptr += 3;
69907
        v_prev.ptr += 3;
69908
        v_fa0 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa0)) + ((uint32_t)(v_prev.ptr[0u]))) / 2u))) + v_curr.ptr[0u]));
69909
        v_curr.ptr[0u] = v_fa0;
69910
        v_fa1 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa1)) + ((uint32_t)(v_prev.ptr[1u]))) / 2u))) + v_curr.ptr[1u]));
69911
        v_curr.ptr[1u] = v_fa1;
69912
        v_fa2 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa2)) + ((uint32_t)(v_prev.ptr[2u]))) / 2u))) + v_curr.ptr[2u]));
69913
        v_curr.ptr[2u] = v_fa2;
69914
        v_curr.ptr += 3;
69915
        v_prev.ptr += 3;
69916
      }
69917
      v_curr.len = 3;
69918
      v_prev.len = 3;
69919
      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));
69920
      while (v_curr.ptr < i_end1_curr) {
69921
        v_fa0 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa0)) + ((uint32_t)(v_prev.ptr[0u]))) / 2u))) + v_curr.ptr[0u]));
69922
        v_curr.ptr[0u] = v_fa0;
69923
        v_fa1 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa1)) + ((uint32_t)(v_prev.ptr[1u]))) / 2u))) + v_curr.ptr[1u]));
69924
        v_curr.ptr[1u] = v_fa1;
69925
        v_fa2 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa2)) + ((uint32_t)(v_prev.ptr[2u]))) / 2u))) + v_curr.ptr[2u]));
69926
        v_curr.ptr[2u] = v_fa2;
69927
        v_curr.ptr += 3;
69928
        v_prev.ptr += 3;
69929
      }
69930
      v_curr.len = 0;
69931
      v_prev.len = 0;
69932
    }
69933
  }
69934
  return wuffs_base__make_empty_struct();
69935
}
69936
69937
// -------- func png.decoder.filter_3_distance_4_fallback
69938
69939
WUFFS_BASE__GENERATED_C_CODE
69940
static wuffs_base__empty_struct
69941
wuffs_png__decoder__filter_3_distance_4_fallback(
69942
    wuffs_png__decoder* self,
69943
    wuffs_base__slice_u8 a_curr,
69944
    wuffs_base__slice_u8 a_prev) {
69945
  wuffs_base__slice_u8 v_curr = {0};
69946
  wuffs_base__slice_u8 v_prev = {0};
69947
  uint8_t v_fa0 = 0;
69948
  uint8_t v_fa1 = 0;
69949
  uint8_t v_fa2 = 0;
69950
  uint8_t v_fa3 = 0;
69951
69952
  if (((uint64_t)(a_prev.len)) == 0u) {
69953
    {
69954
      wuffs_base__slice_u8 i_slice_curr = a_curr;
69955
      v_curr.ptr = i_slice_curr.ptr;
69956
      v_curr.len = 4;
69957
      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));
69958
      while (v_curr.ptr < i_end0_curr) {
69959
        v_fa0 = ((uint8_t)(((uint8_t)(v_fa0 / 2u)) + v_curr.ptr[0u]));
69960
        v_curr.ptr[0u] = v_fa0;
69961
        v_fa1 = ((uint8_t)(((uint8_t)(v_fa1 / 2u)) + v_curr.ptr[1u]));
69962
        v_curr.ptr[1u] = v_fa1;
69963
        v_fa2 = ((uint8_t)(((uint8_t)(v_fa2 / 2u)) + v_curr.ptr[2u]));
69964
        v_curr.ptr[2u] = v_fa2;
69965
        v_fa3 = ((uint8_t)(((uint8_t)(v_fa3 / 2u)) + v_curr.ptr[3u]));
69966
        v_curr.ptr[3u] = v_fa3;
69967
        v_curr.ptr += 4;
69968
      }
69969
      v_curr.len = 0;
69970
    }
69971
  } else {
69972
    {
69973
      wuffs_base__slice_u8 i_slice_curr = a_curr;
69974
      v_curr.ptr = i_slice_curr.ptr;
69975
      wuffs_base__slice_u8 i_slice_prev = a_prev;
69976
      v_prev.ptr = i_slice_prev.ptr;
69977
      i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len)));
69978
      v_curr.len = 4;
69979
      v_prev.len = 4;
69980
      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));
69981
      while (v_curr.ptr < i_end0_curr) {
69982
        v_fa0 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa0)) + ((uint32_t)(v_prev.ptr[0u]))) / 2u))) + v_curr.ptr[0u]));
69983
        v_curr.ptr[0u] = v_fa0;
69984
        v_fa1 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa1)) + ((uint32_t)(v_prev.ptr[1u]))) / 2u))) + v_curr.ptr[1u]));
69985
        v_curr.ptr[1u] = v_fa1;
69986
        v_fa2 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa2)) + ((uint32_t)(v_prev.ptr[2u]))) / 2u))) + v_curr.ptr[2u]));
69987
        v_curr.ptr[2u] = v_fa2;
69988
        v_fa3 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa3)) + ((uint32_t)(v_prev.ptr[3u]))) / 2u))) + v_curr.ptr[3u]));
69989
        v_curr.ptr[3u] = v_fa3;
69990
        v_curr.ptr += 4;
69991
        v_prev.ptr += 4;
69992
      }
69993
      v_curr.len = 0;
69994
      v_prev.len = 0;
69995
    }
69996
  }
69997
  return wuffs_base__make_empty_struct();
69998
}
69999
70000
// -------- func png.decoder.filter_4
70001
70002
WUFFS_BASE__GENERATED_C_CODE
70003
static wuffs_base__empty_struct
70004
wuffs_png__decoder__filter_4(
70005
    wuffs_png__decoder* self,
70006
    wuffs_base__slice_u8 a_curr,
70007
    wuffs_base__slice_u8 a_prev) {
70008
  return (*self->private_impl.choosy_filter_4)(self, a_curr, a_prev);
70009
}
70010
70011
WUFFS_BASE__GENERATED_C_CODE
70012
static wuffs_base__empty_struct
70013
wuffs_png__decoder__filter_4__choosy_default(
70014
    wuffs_png__decoder* self,
70015
    wuffs_base__slice_u8 a_curr,
70016
    wuffs_base__slice_u8 a_prev) {
70017
  uint64_t v_filter_distance = 0;
70018
  uint64_t v_n = 0;
70019
  uint64_t v_i = 0;
70020
  uint32_t v_fa = 0;
70021
  uint32_t v_fb = 0;
70022
  uint32_t v_fc = 0;
70023
  uint32_t v_pp = 0;
70024
  uint32_t v_pa = 0;
70025
  uint32_t v_pb = 0;
70026
  uint32_t v_pc = 0;
70027
70028
  v_filter_distance = ((uint64_t)(self->private_impl.f_filter_distance));
70029
  v_n = wuffs_base__u64__min(((uint64_t)(a_curr.len)), ((uint64_t)(a_prev.len)));
70030
  v_i = 0u;
70031
  while ((v_i < v_n) && (v_i < v_filter_distance)) {
70032
    a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + a_prev.ptr[v_i]));
70033
    v_i += 1u;
70034
  }
70035
  v_i = v_filter_distance;
70036
  while (v_i < v_n) {
70037
    v_fa = ((uint32_t)(a_curr.ptr[(v_i - v_filter_distance)]));
70038
    v_fb = ((uint32_t)(a_prev.ptr[v_i]));
70039
    v_fc = ((uint32_t)(a_prev.ptr[(v_i - v_filter_distance)]));
70040
    v_pp = ((uint32_t)(((uint32_t)(v_fa + v_fb)) - v_fc));
70041
    v_pa = ((uint32_t)(v_pp - v_fa));
70042
    if (v_pa >= 2147483648u) {
70043
      v_pa = ((uint32_t)(0u - v_pa));
70044
    }
70045
    v_pb = ((uint32_t)(v_pp - v_fb));
70046
    if (v_pb >= 2147483648u) {
70047
      v_pb = ((uint32_t)(0u - v_pb));
70048
    }
70049
    v_pc = ((uint32_t)(v_pp - v_fc));
70050
    if (v_pc >= 2147483648u) {
70051
      v_pc = ((uint32_t)(0u - v_pc));
70052
    }
70053
    if ((v_pa <= v_pb) && (v_pa <= v_pc)) {
70054
    } else if (v_pb <= v_pc) {
70055
      v_fa = v_fb;
70056
    } else {
70057
      v_fa = v_fc;
70058
    }
70059
    a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + ((uint8_t)(v_fa))));
70060
    v_i += 1u;
70061
  }
70062
  return wuffs_base__make_empty_struct();
70063
}
70064
70065
// -------- func png.decoder.filter_4_distance_3_fallback
70066
70067
WUFFS_BASE__GENERATED_C_CODE
70068
static wuffs_base__empty_struct
70069
wuffs_png__decoder__filter_4_distance_3_fallback(
70070
    wuffs_png__decoder* self,
70071
    wuffs_base__slice_u8 a_curr,
70072
    wuffs_base__slice_u8 a_prev) {
70073
  wuffs_base__slice_u8 v_curr = {0};
70074
  wuffs_base__slice_u8 v_prev = {0};
70075
  uint32_t v_fa0 = 0;
70076
  uint32_t v_fa1 = 0;
70077
  uint32_t v_fa2 = 0;
70078
  uint32_t v_fb0 = 0;
70079
  uint32_t v_fb1 = 0;
70080
  uint32_t v_fb2 = 0;
70081
  uint32_t v_fc0 = 0;
70082
  uint32_t v_fc1 = 0;
70083
  uint32_t v_fc2 = 0;
70084
  uint32_t v_pp0 = 0;
70085
  uint32_t v_pp1 = 0;
70086
  uint32_t v_pp2 = 0;
70087
  uint32_t v_pa0 = 0;
70088
  uint32_t v_pa1 = 0;
70089
  uint32_t v_pa2 = 0;
70090
  uint32_t v_pb0 = 0;
70091
  uint32_t v_pb1 = 0;
70092
  uint32_t v_pb2 = 0;
70093
  uint32_t v_pc0 = 0;
70094
  uint32_t v_pc1 = 0;
70095
  uint32_t v_pc2 = 0;
70096
70097
  {
70098
    wuffs_base__slice_u8 i_slice_curr = a_curr;
70099
    v_curr.ptr = i_slice_curr.ptr;
70100
    wuffs_base__slice_u8 i_slice_prev = a_prev;
70101
    v_prev.ptr = i_slice_prev.ptr;
70102
    i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len)));
70103
    v_curr.len = 3;
70104
    v_prev.len = 3;
70105
    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));
70106
    while (v_curr.ptr < i_end0_curr) {
70107
      v_fb0 = ((uint32_t)(v_prev.ptr[0u]));
70108
      v_pp0 = ((uint32_t)(((uint32_t)(v_fa0 + v_fb0)) - v_fc0));
70109
      v_pa0 = ((uint32_t)(v_pp0 - v_fa0));
70110
      if (v_pa0 >= 2147483648u) {
70111
        v_pa0 = ((uint32_t)(0u - v_pa0));
70112
      }
70113
      v_pb0 = ((uint32_t)(v_pp0 - v_fb0));
70114
      if (v_pb0 >= 2147483648u) {
70115
        v_pb0 = ((uint32_t)(0u - v_pb0));
70116
      }
70117
      v_pc0 = ((uint32_t)(v_pp0 - v_fc0));
70118
      if (v_pc0 >= 2147483648u) {
70119
        v_pc0 = ((uint32_t)(0u - v_pc0));
70120
      }
70121
      if ((v_pa0 <= v_pb0) && (v_pa0 <= v_pc0)) {
70122
      } else if (v_pb0 <= v_pc0) {
70123
        v_fa0 = v_fb0;
70124
      } else {
70125
        v_fa0 = v_fc0;
70126
      }
70127
      v_curr.ptr[0u] = ((uint8_t)(v_curr.ptr[0u] + ((uint8_t)(v_fa0))));
70128
      v_fa0 = ((uint32_t)(v_curr.ptr[0u]));
70129
      v_fc0 = v_fb0;
70130
      v_fb1 = ((uint32_t)(v_prev.ptr[1u]));
70131
      v_pp1 = ((uint32_t)(((uint32_t)(v_fa1 + v_fb1)) - v_fc1));
70132
      v_pa1 = ((uint32_t)(v_pp1 - v_fa1));
70133
      if (v_pa1 >= 2147483648u) {
70134
        v_pa1 = ((uint32_t)(0u - v_pa1));
70135
      }
70136
      v_pb1 = ((uint32_t)(v_pp1 - v_fb1));
70137
      if (v_pb1 >= 2147483648u) {
70138
        v_pb1 = ((uint32_t)(0u - v_pb1));
70139
      }
70140
      v_pc1 = ((uint32_t)(v_pp1 - v_fc1));
70141
      if (v_pc1 >= 2147483648u) {
70142
        v_pc1 = ((uint32_t)(0u - v_pc1));
70143
      }
70144
      if ((v_pa1 <= v_pb1) && (v_pa1 <= v_pc1)) {
70145
      } else if (v_pb1 <= v_pc1) {
70146
        v_fa1 = v_fb1;
70147
      } else {
70148
        v_fa1 = v_fc1;
70149
      }
70150
      v_curr.ptr[1u] = ((uint8_t)(v_curr.ptr[1u] + ((uint8_t)(v_fa1))));
70151
      v_fa1 = ((uint32_t)(v_curr.ptr[1u]));
70152
      v_fc1 = v_fb1;
70153
      v_fb2 = ((uint32_t)(v_prev.ptr[2u]));
70154
      v_pp2 = ((uint32_t)(((uint32_t)(v_fa2 + v_fb2)) - v_fc2));
70155
      v_pa2 = ((uint32_t)(v_pp2 - v_fa2));
70156
      if (v_pa2 >= 2147483648u) {
70157
        v_pa2 = ((uint32_t)(0u - v_pa2));
70158
      }
70159
      v_pb2 = ((uint32_t)(v_pp2 - v_fb2));
70160
      if (v_pb2 >= 2147483648u) {
70161
        v_pb2 = ((uint32_t)(0u - v_pb2));
70162
      }
70163
      v_pc2 = ((uint32_t)(v_pp2 - v_fc2));
70164
      if (v_pc2 >= 2147483648u) {
70165
        v_pc2 = ((uint32_t)(0u - v_pc2));
70166
      }
70167
      if ((v_pa2 <= v_pb2) && (v_pa2 <= v_pc2)) {
70168
      } else if (v_pb2 <= v_pc2) {
70169
        v_fa2 = v_fb2;
70170
      } else {
70171
        v_fa2 = v_fc2;
70172
      }
70173
      v_curr.ptr[2u] = ((uint8_t)(v_curr.ptr[2u] + ((uint8_t)(v_fa2))));
70174
      v_fa2 = ((uint32_t)(v_curr.ptr[2u]));
70175
      v_fc2 = v_fb2;
70176
      v_curr.ptr += 3;
70177
      v_prev.ptr += 3;
70178
    }
70179
    v_curr.len = 0;
70180
    v_prev.len = 0;
70181
  }
70182
  return wuffs_base__make_empty_struct();
70183
}
70184
70185
// -------- func png.decoder.filter_4_distance_4_fallback
70186
70187
WUFFS_BASE__GENERATED_C_CODE
70188
static wuffs_base__empty_struct
70189
wuffs_png__decoder__filter_4_distance_4_fallback(
70190
    wuffs_png__decoder* self,
70191
    wuffs_base__slice_u8 a_curr,
70192
    wuffs_base__slice_u8 a_prev) {
70193
  wuffs_base__slice_u8 v_curr = {0};
70194
  wuffs_base__slice_u8 v_prev = {0};
70195
  uint32_t v_fa0 = 0;
70196
  uint32_t v_fa1 = 0;
70197
  uint32_t v_fa2 = 0;
70198
  uint32_t v_fa3 = 0;
70199
  uint32_t v_fb0 = 0;
70200
  uint32_t v_fb1 = 0;
70201
  uint32_t v_fb2 = 0;
70202
  uint32_t v_fb3 = 0;
70203
  uint32_t v_fc0 = 0;
70204
  uint32_t v_fc1 = 0;
70205
  uint32_t v_fc2 = 0;
70206
  uint32_t v_fc3 = 0;
70207
  uint32_t v_pp0 = 0;
70208
  uint32_t v_pp1 = 0;
70209
  uint32_t v_pp2 = 0;
70210
  uint32_t v_pp3 = 0;
70211
  uint32_t v_pa0 = 0;
70212
  uint32_t v_pa1 = 0;
70213
  uint32_t v_pa2 = 0;
70214
  uint32_t v_pa3 = 0;
70215
  uint32_t v_pb0 = 0;
70216
  uint32_t v_pb1 = 0;
70217
  uint32_t v_pb2 = 0;
70218
  uint32_t v_pb3 = 0;
70219
  uint32_t v_pc0 = 0;
70220
  uint32_t v_pc1 = 0;
70221
  uint32_t v_pc2 = 0;
70222
  uint32_t v_pc3 = 0;
70223
70224
  {
70225
    wuffs_base__slice_u8 i_slice_curr = a_curr;
70226
    v_curr.ptr = i_slice_curr.ptr;
70227
    wuffs_base__slice_u8 i_slice_prev = a_prev;
70228
    v_prev.ptr = i_slice_prev.ptr;
70229
    i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len)));
70230
    v_curr.len = 4;
70231
    v_prev.len = 4;
70232
    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));
70233
    while (v_curr.ptr < i_end0_curr) {
70234
      v_fb0 = ((uint32_t)(v_prev.ptr[0u]));
70235
      v_pp0 = ((uint32_t)(((uint32_t)(v_fa0 + v_fb0)) - v_fc0));
70236
      v_pa0 = ((uint32_t)(v_pp0 - v_fa0));
70237
      if (v_pa0 >= 2147483648u) {
70238
        v_pa0 = ((uint32_t)(0u - v_pa0));
70239
      }
70240
      v_pb0 = ((uint32_t)(v_pp0 - v_fb0));
70241
      if (v_pb0 >= 2147483648u) {
70242
        v_pb0 = ((uint32_t)(0u - v_pb0));
70243
      }
70244
      v_pc0 = ((uint32_t)(v_pp0 - v_fc0));
70245
      if (v_pc0 >= 2147483648u) {
70246
        v_pc0 = ((uint32_t)(0u - v_pc0));
70247
      }
70248
      if ((v_pa0 <= v_pb0) && (v_pa0 <= v_pc0)) {
70249
      } else if (v_pb0 <= v_pc0) {
70250
        v_fa0 = v_fb0;
70251
      } else {
70252
        v_fa0 = v_fc0;
70253
      }
70254
      v_curr.ptr[0u] = ((uint8_t)(v_curr.ptr[0u] + ((uint8_t)(v_fa0))));
70255
      v_fa0 = ((uint32_t)(v_curr.ptr[0u]));
70256
      v_fc0 = v_fb0;
70257
      v_fb1 = ((uint32_t)(v_prev.ptr[1u]));
70258
      v_pp1 = ((uint32_t)(((uint32_t)(v_fa1 + v_fb1)) - v_fc1));
70259
      v_pa1 = ((uint32_t)(v_pp1 - v_fa1));
70260
      if (v_pa1 >= 2147483648u) {
70261
        v_pa1 = ((uint32_t)(0u - v_pa1));
70262
      }
70263
      v_pb1 = ((uint32_t)(v_pp1 - v_fb1));
70264
      if (v_pb1 >= 2147483648u) {
70265
        v_pb1 = ((uint32_t)(0u - v_pb1));
70266
      }
70267
      v_pc1 = ((uint32_t)(v_pp1 - v_fc1));
70268
      if (v_pc1 >= 2147483648u) {
70269
        v_pc1 = ((uint32_t)(0u - v_pc1));
70270
      }
70271
      if ((v_pa1 <= v_pb1) && (v_pa1 <= v_pc1)) {
70272
      } else if (v_pb1 <= v_pc1) {
70273
        v_fa1 = v_fb1;
70274
      } else {
70275
        v_fa1 = v_fc1;
70276
      }
70277
      v_curr.ptr[1u] = ((uint8_t)(v_curr.ptr[1u] + ((uint8_t)(v_fa1))));
70278
      v_fa1 = ((uint32_t)(v_curr.ptr[1u]));
70279
      v_fc1 = v_fb1;
70280
      v_fb2 = ((uint32_t)(v_prev.ptr[2u]));
70281
      v_pp2 = ((uint32_t)(((uint32_t)(v_fa2 + v_fb2)) - v_fc2));
70282
      v_pa2 = ((uint32_t)(v_pp2 - v_fa2));
70283
      if (v_pa2 >= 2147483648u) {
70284
        v_pa2 = ((uint32_t)(0u - v_pa2));
70285
      }
70286
      v_pb2 = ((uint32_t)(v_pp2 - v_fb2));
70287
      if (v_pb2 >= 2147483648u) {
70288
        v_pb2 = ((uint32_t)(0u - v_pb2));
70289
      }
70290
      v_pc2 = ((uint32_t)(v_pp2 - v_fc2));
70291
      if (v_pc2 >= 2147483648u) {
70292
        v_pc2 = ((uint32_t)(0u - v_pc2));
70293
      }
70294
      if ((v_pa2 <= v_pb2) && (v_pa2 <= v_pc2)) {
70295
      } else if (v_pb2 <= v_pc2) {
70296
        v_fa2 = v_fb2;
70297
      } else {
70298
        v_fa2 = v_fc2;
70299
      }
70300
      v_curr.ptr[2u] = ((uint8_t)(v_curr.ptr[2u] + ((uint8_t)(v_fa2))));
70301
      v_fa2 = ((uint32_t)(v_curr.ptr[2u]));
70302
      v_fc2 = v_fb2;
70303
      v_fb3 = ((uint32_t)(v_prev.ptr[3u]));
70304
      v_pp3 = ((uint32_t)(((uint32_t)(v_fa3 + v_fb3)) - v_fc3));
70305
      v_pa3 = ((uint32_t)(v_pp3 - v_fa3));
70306
      if (v_pa3 >= 2147483648u) {
70307
        v_pa3 = ((uint32_t)(0u - v_pa3));
70308
      }
70309
      v_pb3 = ((uint32_t)(v_pp3 - v_fb3));
70310
      if (v_pb3 >= 2147483648u) {
70311
        v_pb3 = ((uint32_t)(0u - v_pb3));
70312
      }
70313
      v_pc3 = ((uint32_t)(v_pp3 - v_fc3));
70314
      if (v_pc3 >= 2147483648u) {
70315
        v_pc3 = ((uint32_t)(0u - v_pc3));
70316
      }
70317
      if ((v_pa3 <= v_pb3) && (v_pa3 <= v_pc3)) {
70318
      } else if (v_pb3 <= v_pc3) {
70319
        v_fa3 = v_fb3;
70320
      } else {
70321
        v_fa3 = v_fc3;
70322
      }
70323
      v_curr.ptr[3u] = ((uint8_t)(v_curr.ptr[3u] + ((uint8_t)(v_fa3))));
70324
      v_fa3 = ((uint32_t)(v_curr.ptr[3u]));
70325
      v_fc3 = v_fb3;
70326
      v_curr.ptr += 4;
70327
      v_prev.ptr += 4;
70328
    }
70329
    v_curr.len = 0;
70330
    v_prev.len = 0;
70331
  }
70332
  return wuffs_base__make_empty_struct();
70333
}
70334
70335
// โ€ผ WUFFS MULTI-FILE SECTION +x86_sse42
70336
// -------- func png.decoder.filter_1_distance_4_x86_sse42
70337
70338
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
70339
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
70340
WUFFS_BASE__GENERATED_C_CODE
70341
static wuffs_base__empty_struct
70342
wuffs_png__decoder__filter_1_distance_4_x86_sse42(
70343
    wuffs_png__decoder* self,
70344
    wuffs_base__slice_u8 a_curr) {
70345
  wuffs_base__slice_u8 v_curr = {0};
70346
  __m128i v_x128 = {0};
70347
  __m128i v_a128 = {0};
70348
70349
  {
70350
    wuffs_base__slice_u8 i_slice_curr = a_curr;
70351
    v_curr.ptr = i_slice_curr.ptr;
70352
    v_curr.len = 4;
70353
    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));
70354
    while (v_curr.ptr < i_end0_curr) {
70355
      v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
70356
      v_x128 = _mm_add_epi8(v_x128, v_a128);
70357
      v_a128 = v_x128;
70358
      wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128))));
70359
      v_curr.ptr += 4;
70360
      v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
70361
      v_x128 = _mm_add_epi8(v_x128, v_a128);
70362
      v_a128 = v_x128;
70363
      wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128))));
70364
      v_curr.ptr += 4;
70365
    }
70366
    v_curr.len = 4;
70367
    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));
70368
    while (v_curr.ptr < i_end1_curr) {
70369
      v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
70370
      v_x128 = _mm_add_epi8(v_x128, v_a128);
70371
      v_a128 = v_x128;
70372
      wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128))));
70373
      v_curr.ptr += 4;
70374
    }
70375
    v_curr.len = 0;
70376
  }
70377
  return wuffs_base__make_empty_struct();
70378
}
70379
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
70380
// โ€ผ WUFFS MULTI-FILE SECTION -x86_sse42
70381
70382
// โ€ผ WUFFS MULTI-FILE SECTION +x86_sse42
70383
// -------- func png.decoder.filter_3_distance_4_x86_sse42
70384
70385
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
70386
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
70387
WUFFS_BASE__GENERATED_C_CODE
70388
static wuffs_base__empty_struct
70389
wuffs_png__decoder__filter_3_distance_4_x86_sse42(
70390
    wuffs_png__decoder* self,
70391
    wuffs_base__slice_u8 a_curr,
70392
    wuffs_base__slice_u8 a_prev) {
70393
  wuffs_base__slice_u8 v_curr = {0};
70394
  wuffs_base__slice_u8 v_prev = {0};
70395
  __m128i v_x128 = {0};
70396
  __m128i v_a128 = {0};
70397
  __m128i v_b128 = {0};
70398
  __m128i v_p128 = {0};
70399
  __m128i v_k128 = {0};
70400
70401
  if (((uint64_t)(a_prev.len)) == 0u) {
70402
    v_k128 = _mm_set1_epi8((int8_t)(254u));
70403
    {
70404
      wuffs_base__slice_u8 i_slice_curr = a_curr;
70405
      v_curr.ptr = i_slice_curr.ptr;
70406
      v_curr.len = 4;
70407
      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));
70408
      while (v_curr.ptr < i_end0_curr) {
70409
        v_p128 = _mm_avg_epu8(_mm_and_si128(v_a128, v_k128), v_b128);
70410
        v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
70411
        v_x128 = _mm_add_epi8(v_x128, v_p128);
70412
        v_a128 = v_x128;
70413
        wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128))));
70414
        v_curr.ptr += 4;
70415
        v_p128 = _mm_avg_epu8(_mm_and_si128(v_a128, v_k128), v_b128);
70416
        v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
70417
        v_x128 = _mm_add_epi8(v_x128, v_p128);
70418
        v_a128 = v_x128;
70419
        wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128))));
70420
        v_curr.ptr += 4;
70421
      }
70422
      v_curr.len = 4;
70423
      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));
70424
      while (v_curr.ptr < i_end1_curr) {
70425
        v_p128 = _mm_avg_epu8(_mm_and_si128(v_a128, v_k128), v_b128);
70426
        v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
70427
        v_x128 = _mm_add_epi8(v_x128, v_p128);
70428
        v_a128 = v_x128;
70429
        wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128))));
70430
        v_curr.ptr += 4;
70431
      }
70432
      v_curr.len = 0;
70433
    }
70434
  } else {
70435
    v_k128 = _mm_set1_epi8((int8_t)(1u));
70436
    {
70437
      wuffs_base__slice_u8 i_slice_curr = a_curr;
70438
      v_curr.ptr = i_slice_curr.ptr;
70439
      wuffs_base__slice_u8 i_slice_prev = a_prev;
70440
      v_prev.ptr = i_slice_prev.ptr;
70441
      i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len)));
70442
      v_curr.len = 4;
70443
      v_prev.len = 4;
70444
      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));
70445
      while (v_curr.ptr < i_end0_curr) {
70446
        v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
70447
        v_p128 = _mm_avg_epu8(v_a128, v_b128);
70448
        v_p128 = _mm_sub_epi8(v_p128, _mm_and_si128(v_k128, _mm_xor_si128(v_a128, v_b128)));
70449
        v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
70450
        v_x128 = _mm_add_epi8(v_x128, v_p128);
70451
        v_a128 = v_x128;
70452
        wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128))));
70453
        v_curr.ptr += 4;
70454
        v_prev.ptr += 4;
70455
        v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
70456
        v_p128 = _mm_avg_epu8(v_a128, v_b128);
70457
        v_p128 = _mm_sub_epi8(v_p128, _mm_and_si128(v_k128, _mm_xor_si128(v_a128, v_b128)));
70458
        v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
70459
        v_x128 = _mm_add_epi8(v_x128, v_p128);
70460
        v_a128 = v_x128;
70461
        wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128))));
70462
        v_curr.ptr += 4;
70463
        v_prev.ptr += 4;
70464
      }
70465
      v_curr.len = 4;
70466
      v_prev.len = 4;
70467
      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));
70468
      while (v_curr.ptr < i_end1_curr) {
70469
        v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
70470
        v_p128 = _mm_avg_epu8(v_a128, v_b128);
70471
        v_p128 = _mm_sub_epi8(v_p128, _mm_and_si128(v_k128, _mm_xor_si128(v_a128, v_b128)));
70472
        v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
70473
        v_x128 = _mm_add_epi8(v_x128, v_p128);
70474
        v_a128 = v_x128;
70475
        wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128))));
70476
        v_curr.ptr += 4;
70477
        v_prev.ptr += 4;
70478
      }
70479
      v_curr.len = 0;
70480
      v_prev.len = 0;
70481
    }
70482
  }
70483
  return wuffs_base__make_empty_struct();
70484
}
70485
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
70486
// โ€ผ WUFFS MULTI-FILE SECTION -x86_sse42
70487
70488
// โ€ผ WUFFS MULTI-FILE SECTION +x86_sse42
70489
// -------- func png.decoder.filter_4_distance_3_x86_sse42
70490
70491
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
70492
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
70493
WUFFS_BASE__GENERATED_C_CODE
70494
static wuffs_base__empty_struct
70495
wuffs_png__decoder__filter_4_distance_3_x86_sse42(
70496
    wuffs_png__decoder* self,
70497
    wuffs_base__slice_u8 a_curr,
70498
    wuffs_base__slice_u8 a_prev) {
70499
  wuffs_base__slice_u8 v_curr = {0};
70500
  wuffs_base__slice_u8 v_prev = {0};
70501
  __m128i v_x128 = {0};
70502
  __m128i v_a128 = {0};
70503
  __m128i v_b128 = {0};
70504
  __m128i v_c128 = {0};
70505
  __m128i v_p128 = {0};
70506
  __m128i v_pa128 = {0};
70507
  __m128i v_pb128 = {0};
70508
  __m128i v_pc128 = {0};
70509
  __m128i v_smallest128 = {0};
70510
  __m128i v_z128 = {0};
70511
70512
  {
70513
    wuffs_base__slice_u8 i_slice_curr = a_curr;
70514
    v_curr.ptr = i_slice_curr.ptr;
70515
    wuffs_base__slice_u8 i_slice_prev = a_prev;
70516
    v_prev.ptr = i_slice_prev.ptr;
70517
    i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len)));
70518
    v_curr.len = 4;
70519
    v_prev.len = 4;
70520
    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));
70521
    while (v_curr.ptr < i_end0_curr) {
70522
      v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
70523
      v_b128 = _mm_unpacklo_epi8(v_b128, v_z128);
70524
      v_pa128 = _mm_sub_epi16(v_b128, v_c128);
70525
      v_pb128 = _mm_sub_epi16(v_a128, v_c128);
70526
      v_pc128 = _mm_add_epi16(v_pa128, v_pb128);
70527
      v_pa128 = _mm_abs_epi16(v_pa128);
70528
      v_pb128 = _mm_abs_epi16(v_pb128);
70529
      v_pc128 = _mm_abs_epi16(v_pc128);
70530
      v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128));
70531
      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));
70532
      v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
70533
      v_x128 = _mm_unpacklo_epi8(v_x128, v_z128);
70534
      v_x128 = _mm_add_epi8(v_x128, v_p128);
70535
      v_a128 = v_x128;
70536
      v_c128 = v_b128;
70537
      v_x128 = _mm_packus_epi16(v_x128, v_x128);
70538
      wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128))));
70539
      v_curr.ptr += 3;
70540
      v_prev.ptr += 3;
70541
      v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
70542
      v_b128 = _mm_unpacklo_epi8(v_b128, v_z128);
70543
      v_pa128 = _mm_sub_epi16(v_b128, v_c128);
70544
      v_pb128 = _mm_sub_epi16(v_a128, v_c128);
70545
      v_pc128 = _mm_add_epi16(v_pa128, v_pb128);
70546
      v_pa128 = _mm_abs_epi16(v_pa128);
70547
      v_pb128 = _mm_abs_epi16(v_pb128);
70548
      v_pc128 = _mm_abs_epi16(v_pc128);
70549
      v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128));
70550
      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));
70551
      v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
70552
      v_x128 = _mm_unpacklo_epi8(v_x128, v_z128);
70553
      v_x128 = _mm_add_epi8(v_x128, v_p128);
70554
      v_a128 = v_x128;
70555
      v_c128 = v_b128;
70556
      v_x128 = _mm_packus_epi16(v_x128, v_x128);
70557
      wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128))));
70558
      v_curr.ptr += 3;
70559
      v_prev.ptr += 3;
70560
    }
70561
    v_curr.len = 4;
70562
    v_prev.len = 4;
70563
    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));
70564
    while (v_curr.ptr < i_end1_curr) {
70565
      v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
70566
      v_b128 = _mm_unpacklo_epi8(v_b128, v_z128);
70567
      v_pa128 = _mm_sub_epi16(v_b128, v_c128);
70568
      v_pb128 = _mm_sub_epi16(v_a128, v_c128);
70569
      v_pc128 = _mm_add_epi16(v_pa128, v_pb128);
70570
      v_pa128 = _mm_abs_epi16(v_pa128);
70571
      v_pb128 = _mm_abs_epi16(v_pb128);
70572
      v_pc128 = _mm_abs_epi16(v_pc128);
70573
      v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128));
70574
      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));
70575
      v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
70576
      v_x128 = _mm_unpacklo_epi8(v_x128, v_z128);
70577
      v_x128 = _mm_add_epi8(v_x128, v_p128);
70578
      v_a128 = v_x128;
70579
      v_c128 = v_b128;
70580
      v_x128 = _mm_packus_epi16(v_x128, v_x128);
70581
      wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128))));
70582
      v_curr.ptr += 3;
70583
      v_prev.ptr += 3;
70584
    }
70585
    v_curr.len = 3;
70586
    v_prev.len = 3;
70587
    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));
70588
    while (v_curr.ptr < i_end2_curr) {
70589
      v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u24le__no_bounds_check(v_prev.ptr)));
70590
      v_b128 = _mm_unpacklo_epi8(v_b128, v_z128);
70591
      v_pa128 = _mm_sub_epi16(v_b128, v_c128);
70592
      v_pb128 = _mm_sub_epi16(v_a128, v_c128);
70593
      v_pc128 = _mm_add_epi16(v_pa128, v_pb128);
70594
      v_pa128 = _mm_abs_epi16(v_pa128);
70595
      v_pb128 = _mm_abs_epi16(v_pb128);
70596
      v_pc128 = _mm_abs_epi16(v_pc128);
70597
      v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128));
70598
      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));
70599
      v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u24le__no_bounds_check(v_curr.ptr)));
70600
      v_x128 = _mm_unpacklo_epi8(v_x128, v_z128);
70601
      v_x128 = _mm_add_epi8(v_x128, v_p128);
70602
      v_x128 = _mm_packus_epi16(v_x128, v_x128);
70603
      wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128))));
70604
      v_curr.ptr += 3;
70605
      v_prev.ptr += 3;
70606
    }
70607
    v_curr.len = 0;
70608
    v_prev.len = 0;
70609
  }
70610
  return wuffs_base__make_empty_struct();
70611
}
70612
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
70613
// โ€ผ WUFFS MULTI-FILE SECTION -x86_sse42
70614
70615
// โ€ผ WUFFS MULTI-FILE SECTION +x86_sse42
70616
// -------- func png.decoder.filter_4_distance_4_x86_sse42
70617
70618
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
70619
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
70620
WUFFS_BASE__GENERATED_C_CODE
70621
static wuffs_base__empty_struct
70622
wuffs_png__decoder__filter_4_distance_4_x86_sse42(
70623
    wuffs_png__decoder* self,
70624
    wuffs_base__slice_u8 a_curr,
70625
    wuffs_base__slice_u8 a_prev) {
70626
  wuffs_base__slice_u8 v_curr = {0};
70627
  wuffs_base__slice_u8 v_prev = {0};
70628
  __m128i v_x128 = {0};
70629
  __m128i v_a128 = {0};
70630
  __m128i v_b128 = {0};
70631
  __m128i v_c128 = {0};
70632
  __m128i v_p128 = {0};
70633
  __m128i v_pa128 = {0};
70634
  __m128i v_pb128 = {0};
70635
  __m128i v_pc128 = {0};
70636
  __m128i v_smallest128 = {0};
70637
  __m128i v_z128 = {0};
70638
70639
  {
70640
    wuffs_base__slice_u8 i_slice_curr = a_curr;
70641
    v_curr.ptr = i_slice_curr.ptr;
70642
    wuffs_base__slice_u8 i_slice_prev = a_prev;
70643
    v_prev.ptr = i_slice_prev.ptr;
70644
    i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len)));
70645
    v_curr.len = 4;
70646
    v_prev.len = 4;
70647
    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));
70648
    while (v_curr.ptr < i_end0_curr) {
70649
      v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
70650
      v_b128 = _mm_unpacklo_epi8(v_b128, v_z128);
70651
      v_pa128 = _mm_sub_epi16(v_b128, v_c128);
70652
      v_pb128 = _mm_sub_epi16(v_a128, v_c128);
70653
      v_pc128 = _mm_add_epi16(v_pa128, v_pb128);
70654
      v_pa128 = _mm_abs_epi16(v_pa128);
70655
      v_pb128 = _mm_abs_epi16(v_pb128);
70656
      v_pc128 = _mm_abs_epi16(v_pc128);
70657
      v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128));
70658
      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));
70659
      v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
70660
      v_x128 = _mm_unpacklo_epi8(v_x128, v_z128);
70661
      v_x128 = _mm_add_epi8(v_x128, v_p128);
70662
      v_a128 = v_x128;
70663
      v_c128 = v_b128;
70664
      v_x128 = _mm_packus_epi16(v_x128, v_x128);
70665
      wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128))));
70666
      v_curr.ptr += 4;
70667
      v_prev.ptr += 4;
70668
      v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
70669
      v_b128 = _mm_unpacklo_epi8(v_b128, v_z128);
70670
      v_pa128 = _mm_sub_epi16(v_b128, v_c128);
70671
      v_pb128 = _mm_sub_epi16(v_a128, v_c128);
70672
      v_pc128 = _mm_add_epi16(v_pa128, v_pb128);
70673
      v_pa128 = _mm_abs_epi16(v_pa128);
70674
      v_pb128 = _mm_abs_epi16(v_pb128);
70675
      v_pc128 = _mm_abs_epi16(v_pc128);
70676
      v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128));
70677
      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));
70678
      v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
70679
      v_x128 = _mm_unpacklo_epi8(v_x128, v_z128);
70680
      v_x128 = _mm_add_epi8(v_x128, v_p128);
70681
      v_a128 = v_x128;
70682
      v_c128 = v_b128;
70683
      v_x128 = _mm_packus_epi16(v_x128, v_x128);
70684
      wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128))));
70685
      v_curr.ptr += 4;
70686
      v_prev.ptr += 4;
70687
    }
70688
    v_curr.len = 4;
70689
    v_prev.len = 4;
70690
    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));
70691
    while (v_curr.ptr < i_end1_curr) {
70692
      v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
70693
      v_b128 = _mm_unpacklo_epi8(v_b128, v_z128);
70694
      v_pa128 = _mm_sub_epi16(v_b128, v_c128);
70695
      v_pb128 = _mm_sub_epi16(v_a128, v_c128);
70696
      v_pc128 = _mm_add_epi16(v_pa128, v_pb128);
70697
      v_pa128 = _mm_abs_epi16(v_pa128);
70698
      v_pb128 = _mm_abs_epi16(v_pb128);
70699
      v_pc128 = _mm_abs_epi16(v_pc128);
70700
      v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128));
70701
      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));
70702
      v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
70703
      v_x128 = _mm_unpacklo_epi8(v_x128, v_z128);
70704
      v_x128 = _mm_add_epi8(v_x128, v_p128);
70705
      v_a128 = v_x128;
70706
      v_c128 = v_b128;
70707
      v_x128 = _mm_packus_epi16(v_x128, v_x128);
70708
      wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128))));
70709
      v_curr.ptr += 4;
70710
      v_prev.ptr += 4;
70711
    }
70712
    v_curr.len = 0;
70713
    v_prev.len = 0;
70714
  }
70715
  return wuffs_base__make_empty_struct();
70716
}
70717
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
70718
// โ€ผ WUFFS MULTI-FILE SECTION -x86_sse42
70719
70720
// -------- func png.decoder.get_quirk
70721
70722
WUFFS_BASE__GENERATED_C_CODE
70723
WUFFS_BASE__MAYBE_STATIC uint64_t
70724
wuffs_png__decoder__get_quirk(
70725
    const wuffs_png__decoder* self,
70726
    uint32_t a_key) {
70727
  if (!self) {
70728
    return 0;
70729
  }
70730
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
70731
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
70732
    return 0;
70733
  }
70734
70735
  if ((a_key == 1u) && self->private_impl.f_ignore_checksum) {
70736
    return 1u;
70737
  }
70738
  return 0u;
70739
}
70740
70741
// -------- func png.decoder.set_quirk
70742
70743
WUFFS_BASE__GENERATED_C_CODE
70744
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
70745
wuffs_png__decoder__set_quirk(
70746
    wuffs_png__decoder* self,
70747
    uint32_t a_key,
70748
    uint64_t a_value) {
70749
  if (!self) {
70750
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
70751
  }
70752
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
70753
    return wuffs_base__make_status(
70754
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
70755
        ? wuffs_base__error__disabled_by_previous_error
70756
        : wuffs_base__error__initialize_not_called);
70757
  }
70758
70759
  if (a_key == 1u) {
70760
    self->private_impl.f_ignore_checksum = (a_value > 0u);
70761
    wuffs_zlib__decoder__set_quirk(&self->private_data.f_zlib, a_key, a_value);
70762
    return wuffs_base__make_status(NULL);
70763
  }
70764
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
70765
}
70766
70767
// -------- func png.decoder.decode_image_config
70768
70769
WUFFS_BASE__GENERATED_C_CODE
70770
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
70771
wuffs_png__decoder__decode_image_config(
70772
    wuffs_png__decoder* self,
70773
    wuffs_base__image_config* a_dst,
70774
    wuffs_base__io_buffer* a_src) {
70775
  if (!self) {
70776
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
70777
  }
70778
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
70779
    return wuffs_base__make_status(
70780
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
70781
        ? wuffs_base__error__disabled_by_previous_error
70782
        : wuffs_base__error__initialize_not_called);
70783
  }
70784
  if (!a_src) {
70785
    self->private_impl.magic = WUFFS_BASE__DISABLED;
70786
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
70787
  }
70788
  if ((self->private_impl.active_coroutine != 0) &&
70789
      (self->private_impl.active_coroutine != 1)) {
70790
    self->private_impl.magic = WUFFS_BASE__DISABLED;
70791
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
70792
  }
70793
  self->private_impl.active_coroutine = 0;
70794
  wuffs_base__status status = wuffs_base__make_status(NULL);
70795
70796
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
70797
70798
  uint32_t coro_susp_point = self->private_impl.p_decode_image_config;
70799
  switch (coro_susp_point) {
70800
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
70801
70802
    while (true) {
70803
      {
70804
        wuffs_base__status t_0 = wuffs_png__decoder__do_decode_image_config(self, a_dst, a_src);
70805
        v_status = t_0;
70806
      }
70807
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
70808
        status = wuffs_base__make_status(wuffs_png__error__truncated_input);
70809
        goto exit;
70810
      }
70811
      status = v_status;
70812
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
70813
    }
70814
70815
    ok:
70816
    self->private_impl.p_decode_image_config = 0;
70817
    goto exit;
70818
  }
70819
70820
  goto suspend;
70821
  suspend:
70822
  self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
70823
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
70824
70825
  goto exit;
70826
  exit:
70827
  if (wuffs_base__status__is_error(&status)) {
70828
    self->private_impl.magic = WUFFS_BASE__DISABLED;
70829
  }
70830
  return status;
70831
}
70832
70833
// -------- func png.decoder.do_decode_image_config
70834
70835
WUFFS_BASE__GENERATED_C_CODE
70836
static wuffs_base__status
70837
wuffs_png__decoder__do_decode_image_config(
70838
    wuffs_png__decoder* self,
70839
    wuffs_base__image_config* a_dst,
70840
    wuffs_base__io_buffer* a_src) {
70841
  wuffs_base__status status = wuffs_base__make_status(NULL);
70842
70843
  uint64_t v_magic = 0;
70844
  uint64_t v_mark = 0;
70845
  uint32_t v_checksum_have = 0;
70846
  uint32_t v_checksum_want = 0;
70847
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
70848
70849
  const uint8_t* iop_a_src = NULL;
70850
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
70851
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
70852
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
70853
  if (a_src && a_src->data.ptr) {
70854
    io0_a_src = a_src->data.ptr;
70855
    io1_a_src = io0_a_src + a_src->meta.ri;
70856
    iop_a_src = io1_a_src;
70857
    io2_a_src = io0_a_src + a_src->meta.wi;
70858
  }
70859
70860
  uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config;
70861
  if (coro_susp_point) {
70862
    v_checksum_have = self->private_data.s_do_decode_image_config.v_checksum_have;
70863
  }
70864
  switch (coro_susp_point) {
70865
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
70866
70867
    if (self->private_impl.f_call_sequence != 0u) {
70868
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
70869
      goto exit;
70870
    } else if ( ! self->private_impl.f_seen_ihdr) {
70871
      {
70872
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
70873
        uint64_t t_0;
70874
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) {
70875
          t_0 = wuffs_base__peek_u64le__no_bounds_check(iop_a_src);
70876
          iop_a_src += 8;
70877
        } else {
70878
          self->private_data.s_do_decode_image_config.scratch = 0;
70879
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
70880
          while (true) {
70881
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
70882
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
70883
              goto suspend;
70884
            }
70885
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
70886
            uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
70887
            *scratch <<= 8;
70888
            *scratch >>= 8;
70889
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
70890
            if (num_bits_0 == 56) {
70891
              t_0 = ((uint64_t)(*scratch));
70892
              break;
70893
            }
70894
            num_bits_0 += 8u;
70895
            *scratch |= ((uint64_t)(num_bits_0)) << 56;
70896
          }
70897
        }
70898
        v_magic = t_0;
70899
      }
70900
      if (v_magic != 727905341920923785u) {
70901
        status = wuffs_base__make_status(wuffs_png__error__bad_header);
70902
        goto exit;
70903
      }
70904
      {
70905
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
70906
        uint64_t t_1;
70907
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) {
70908
          t_1 = wuffs_base__peek_u64le__no_bounds_check(iop_a_src);
70909
          iop_a_src += 8;
70910
        } else {
70911
          self->private_data.s_do_decode_image_config.scratch = 0;
70912
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
70913
          while (true) {
70914
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
70915
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
70916
              goto suspend;
70917
            }
70918
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
70919
            uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
70920
            *scratch <<= 8;
70921
            *scratch >>= 8;
70922
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
70923
            if (num_bits_1 == 56) {
70924
              t_1 = ((uint64_t)(*scratch));
70925
              break;
70926
            }
70927
            num_bits_1 += 8u;
70928
            *scratch |= ((uint64_t)(num_bits_1)) << 56;
70929
          }
70930
        }
70931
        v_magic = t_1;
70932
      }
70933
      if (v_magic != 5927942488114331648u) {
70934
        if (v_magic == 5278895250759221248u) {
70935
          status = wuffs_base__make_status(wuffs_png__error__unsupported_cgbi_extension);
70936
          goto exit;
70937
        }
70938
        status = wuffs_base__make_status(wuffs_png__error__bad_header);
70939
        goto exit;
70940
      }
70941
      self->private_impl.f_chunk_type_array[0u] = 73u;
70942
      self->private_impl.f_chunk_type_array[1u] = 72u;
70943
      self->private_impl.f_chunk_type_array[2u] = 68u;
70944
      self->private_impl.f_chunk_type_array[3u] = 82u;
70945
      wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32,
70946
          sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
70947
      wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__make_slice_u8(self->private_impl.f_chunk_type_array, 4));
70948
      while (true) {
70949
        v_mark = ((uint64_t)(iop_a_src - io0_a_src));
70950
        {
70951
          if (a_src) {
70952
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
70953
          }
70954
          wuffs_base__status t_2 = wuffs_png__decoder__decode_ihdr(self, a_src);
70955
          v_status = t_2;
70956
          if (a_src) {
70957
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
70958
          }
70959
        }
70960
        if ( ! self->private_impl.f_ignore_checksum) {
70961
          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));
70962
        }
70963
        if (wuffs_base__status__is_ok(&v_status)) {
70964
          break;
70965
        }
70966
        status = v_status;
70967
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5);
70968
      }
70969
      {
70970
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
70971
        uint32_t t_3;
70972
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
70973
          t_3 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
70974
          iop_a_src += 4;
70975
        } else {
70976
          self->private_data.s_do_decode_image_config.scratch = 0;
70977
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
70978
          while (true) {
70979
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
70980
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
70981
              goto suspend;
70982
            }
70983
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
70984
            uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFFu));
70985
            *scratch >>= 8;
70986
            *scratch <<= 8;
70987
            *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3);
70988
            if (num_bits_3 == 24) {
70989
              t_3 = ((uint32_t)(*scratch >> 32));
70990
              break;
70991
            }
70992
            num_bits_3 += 8u;
70993
            *scratch |= ((uint64_t)(num_bits_3));
70994
          }
70995
        }
70996
        v_checksum_want = t_3;
70997
      }
70998
      if ( ! self->private_impl.f_ignore_checksum && (v_checksum_have != v_checksum_want)) {
70999
        status = wuffs_base__make_status(wuffs_png__error__bad_checksum);
71000
        goto exit;
71001
      }
71002
      self->private_impl.f_seen_ihdr = true;
71003
    } else if (self->private_impl.f_metadata_fourcc != 0u) {
71004
      self->private_impl.f_call_sequence = 16u;
71005
      status = wuffs_base__make_status(wuffs_base__note__metadata_reported);
71006
      goto ok;
71007
    }
71008
    while (true) {
71009
      if (((uint64_t)(io2_a_src - iop_a_src)) < 8u) {
71010
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
71011
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8);
71012
        continue;
71013
      }
71014
      self->private_impl.f_chunk_length = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
71015
      self->private_impl.f_chunk_type = ((uint32_t)((wuffs_base__peek_u64le__no_bounds_check(iop_a_src) >> 32u)));
71016
      if (self->private_impl.f_chunk_type == 1413563465u) {
71017
        if ( ! self->private_impl.f_seen_actl || self->private_impl.f_seen_fctl) {
71018
          break;
71019
        }
71020
        self->private_impl.f_seen_idat = true;
71021
      } else if (self->private_impl.f_chunk_type == 1413571686u) {
71022
        if (self->private_impl.f_seen_idat && self->private_impl.f_seen_fctl) {
71023
          break;
71024
        }
71025
        status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
71026
        goto exit;
71027
      }
71028
      iop_a_src += 8u;
71029
      if ( ! self->private_impl.f_ignore_checksum && ((self->private_impl.f_chunk_type & 32u) == 0u)) {
71030
        self->private_impl.f_chunk_type_array[0u] = ((uint8_t)((self->private_impl.f_chunk_type >> 0u)));
71031
        self->private_impl.f_chunk_type_array[1u] = ((uint8_t)((self->private_impl.f_chunk_type >> 8u)));
71032
        self->private_impl.f_chunk_type_array[2u] = ((uint8_t)((self->private_impl.f_chunk_type >> 16u)));
71033
        self->private_impl.f_chunk_type_array[3u] = ((uint8_t)((self->private_impl.f_chunk_type >> 24u)));
71034
        wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32,
71035
            sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
71036
        wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__make_slice_u8(self->private_impl.f_chunk_type_array, 4));
71037
      }
71038
      while (true) {
71039
        v_mark = ((uint64_t)(iop_a_src - io0_a_src));
71040
        {
71041
          if (a_src) {
71042
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
71043
          }
71044
          wuffs_base__status t_4 = wuffs_png__decoder__decode_other_chunk(self, a_src, false);
71045
          v_status = t_4;
71046
          if (a_src) {
71047
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
71048
          }
71049
        }
71050
        if ( ! self->private_impl.f_ignore_checksum && ((self->private_impl.f_chunk_type & 32u) == 0u)) {
71051
          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));
71052
        }
71053
        if (wuffs_base__status__is_ok(&v_status)) {
71054
          break;
71055
        }
71056
        status = v_status;
71057
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9);
71058
      }
71059
      if (self->private_impl.f_metadata_fourcc != 0u) {
71060
        self->private_impl.f_call_sequence = 16u;
71061
        status = wuffs_base__make_status(wuffs_base__note__metadata_reported);
71062
        goto ok;
71063
      }
71064
      {
71065
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
71066
        uint32_t t_5;
71067
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
71068
          t_5 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
71069
          iop_a_src += 4;
71070
        } else {
71071
          self->private_data.s_do_decode_image_config.scratch = 0;
71072
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11);
71073
          while (true) {
71074
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
71075
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
71076
              goto suspend;
71077
            }
71078
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
71079
            uint32_t num_bits_5 = ((uint32_t)(*scratch & 0xFFu));
71080
            *scratch >>= 8;
71081
            *scratch <<= 8;
71082
            *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_5);
71083
            if (num_bits_5 == 24) {
71084
              t_5 = ((uint32_t)(*scratch >> 32));
71085
              break;
71086
            }
71087
            num_bits_5 += 8u;
71088
            *scratch |= ((uint64_t)(num_bits_5));
71089
          }
71090
        }
71091
        v_checksum_want = t_5;
71092
      }
71093
      if ( ! self->private_impl.f_ignore_checksum && ((self->private_impl.f_chunk_type & 32u) == 0u) && (v_checksum_have != v_checksum_want)) {
71094
        status = wuffs_base__make_status(wuffs_png__error__bad_checksum);
71095
        goto exit;
71096
      }
71097
    }
71098
    if ((self->private_impl.f_color_type == 3u) &&  ! self->private_impl.f_seen_plte) {
71099
      status = wuffs_base__make_status(wuffs_png__error__missing_palette);
71100
      goto exit;
71101
    }
71102
    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)));
71103
    self->private_impl.f_first_config_io_position = self->private_impl.f_frame_config_io_position;
71104
    if (a_dst != NULL) {
71105
      wuffs_base__image_config__set(
71106
          a_dst,
71107
          self->private_impl.f_dst_pixfmt,
71108
          0u,
71109
          self->private_impl.f_width,
71110
          self->private_impl.f_height,
71111
          self->private_impl.f_first_config_io_position,
71112
          ((self->private_impl.f_color_type <= 3u) &&  ! self->private_impl.f_seen_trns));
71113
    }
71114
    if ( ! self->private_impl.f_seen_actl) {
71115
      self->private_impl.f_num_animation_frames_value = 1u;
71116
      self->private_impl.f_first_rect_x0 = 0u;
71117
      self->private_impl.f_first_rect_y0 = 0u;
71118
      self->private_impl.f_first_rect_x1 = self->private_impl.f_width;
71119
      self->private_impl.f_first_rect_y1 = self->private_impl.f_height;
71120
      self->private_impl.f_first_duration = 0u;
71121
      self->private_impl.f_first_disposal = 0u;
71122
      self->private_impl.f_first_overwrite_instead_of_blend = false;
71123
    }
71124
    self->private_impl.f_call_sequence = 32u;
71125
71126
    ok:
71127
    self->private_impl.p_do_decode_image_config = 0;
71128
    goto exit;
71129
  }
71130
71131
  goto suspend;
71132
  suspend:
71133
  self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
71134
  self->private_data.s_do_decode_image_config.v_checksum_have = v_checksum_have;
71135
71136
  goto exit;
71137
  exit:
71138
  if (a_src && a_src->data.ptr) {
71139
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
71140
  }
71141
71142
  return status;
71143
}
71144
71145
// -------- func png.decoder.decode_ihdr
71146
71147
WUFFS_BASE__GENERATED_C_CODE
71148
static wuffs_base__status
71149
wuffs_png__decoder__decode_ihdr(
71150
    wuffs_png__decoder* self,
71151
    wuffs_base__io_buffer* a_src) {
71152
  wuffs_base__status status = wuffs_base__make_status(NULL);
71153
71154
  uint32_t v_a32 = 0;
71155
  uint8_t v_a8 = 0;
71156
71157
  const uint8_t* iop_a_src = NULL;
71158
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
71159
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
71160
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
71161
  if (a_src && a_src->data.ptr) {
71162
    io0_a_src = a_src->data.ptr;
71163
    io1_a_src = io0_a_src + a_src->meta.ri;
71164
    iop_a_src = io1_a_src;
71165
    io2_a_src = io0_a_src + a_src->meta.wi;
71166
  }
71167
71168
  uint32_t coro_susp_point = self->private_impl.p_decode_ihdr;
71169
  switch (coro_susp_point) {
71170
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
71171
71172
    {
71173
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
71174
      uint32_t t_0;
71175
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
71176
        t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
71177
        iop_a_src += 4;
71178
      } else {
71179
        self->private_data.s_decode_ihdr.scratch = 0;
71180
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
71181
        while (true) {
71182
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
71183
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
71184
            goto suspend;
71185
          }
71186
          uint64_t* scratch = &self->private_data.s_decode_ihdr.scratch;
71187
          uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu));
71188
          *scratch >>= 8;
71189
          *scratch <<= 8;
71190
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0);
71191
          if (num_bits_0 == 24) {
71192
            t_0 = ((uint32_t)(*scratch >> 32));
71193
            break;
71194
          }
71195
          num_bits_0 += 8u;
71196
          *scratch |= ((uint64_t)(num_bits_0));
71197
        }
71198
      }
71199
      v_a32 = t_0;
71200
    }
71201
    if ((v_a32 == 0u) || (v_a32 > 2147483647u)) {
71202
      status = wuffs_base__make_status(wuffs_png__error__bad_header);
71203
      goto exit;
71204
    } else if (v_a32 > 16777215u) {
71205
      status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension);
71206
      goto exit;
71207
    }
71208
    self->private_impl.f_width = v_a32;
71209
    {
71210
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
71211
      uint32_t t_1;
71212
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
71213
        t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
71214
        iop_a_src += 4;
71215
      } else {
71216
        self->private_data.s_decode_ihdr.scratch = 0;
71217
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
71218
        while (true) {
71219
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
71220
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
71221
            goto suspend;
71222
          }
71223
          uint64_t* scratch = &self->private_data.s_decode_ihdr.scratch;
71224
          uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu));
71225
          *scratch >>= 8;
71226
          *scratch <<= 8;
71227
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1);
71228
          if (num_bits_1 == 24) {
71229
            t_1 = ((uint32_t)(*scratch >> 32));
71230
            break;
71231
          }
71232
          num_bits_1 += 8u;
71233
          *scratch |= ((uint64_t)(num_bits_1));
71234
        }
71235
      }
71236
      v_a32 = t_1;
71237
    }
71238
    if ((v_a32 == 0u) || (v_a32 > 2147483647u)) {
71239
      status = wuffs_base__make_status(wuffs_png__error__bad_header);
71240
      goto exit;
71241
    } else if (v_a32 > 16777215u) {
71242
      status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension);
71243
      goto exit;
71244
    }
71245
    self->private_impl.f_height = v_a32;
71246
    {
71247
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
71248
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
71249
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
71250
        goto suspend;
71251
      }
71252
      uint8_t t_2 = *iop_a_src++;
71253
      v_a8 = t_2;
71254
    }
71255
    if (v_a8 > 16u) {
71256
      status = wuffs_base__make_status(wuffs_png__error__bad_header);
71257
      goto exit;
71258
    }
71259
    self->private_impl.f_depth = v_a8;
71260
    {
71261
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
71262
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
71263
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
71264
        goto suspend;
71265
      }
71266
      uint8_t t_3 = *iop_a_src++;
71267
      v_a8 = t_3;
71268
    }
71269
    if ((v_a8 == 1u) || (v_a8 == 5u) || (v_a8 > 6u)) {
71270
      status = wuffs_base__make_status(wuffs_png__error__bad_header);
71271
      goto exit;
71272
    }
71273
    self->private_impl.f_color_type = v_a8;
71274
    {
71275
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
71276
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
71277
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
71278
        goto suspend;
71279
      }
71280
      uint8_t t_4 = *iop_a_src++;
71281
      v_a8 = t_4;
71282
    }
71283
    if (v_a8 != 0u) {
71284
      status = wuffs_base__make_status(wuffs_png__error__unsupported_png_compression_method);
71285
      goto exit;
71286
    }
71287
    {
71288
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
71289
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
71290
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
71291
        goto suspend;
71292
      }
71293
      uint8_t t_5 = *iop_a_src++;
71294
      v_a8 = t_5;
71295
    }
71296
    if (v_a8 != 0u) {
71297
      status = wuffs_base__make_status(wuffs_png__error__bad_header);
71298
      goto exit;
71299
    }
71300
    {
71301
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
71302
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
71303
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
71304
        goto suspend;
71305
      }
71306
      uint8_t t_6 = *iop_a_src++;
71307
      v_a8 = t_6;
71308
    }
71309
    if (v_a8 == 0u) {
71310
      self->private_impl.f_interlace_pass = 0u;
71311
    } else if (v_a8 == 1u) {
71312
      self->private_impl.f_interlace_pass = 1u;
71313
      self->private_impl.choosy_filter_and_swizzle = (
71314
          &wuffs_png__decoder__filter_and_swizzle_tricky);
71315
    } else {
71316
      status = wuffs_base__make_status(wuffs_png__error__bad_header);
71317
      goto exit;
71318
    }
71319
    self->private_impl.f_filter_distance = 0u;
71320
    wuffs_png__decoder__assign_filter_distance(self);
71321
    if (self->private_impl.f_filter_distance == 0u) {
71322
      status = wuffs_base__make_status(wuffs_png__error__bad_header);
71323
      goto exit;
71324
    }
71325
    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)));
71326
    wuffs_png__decoder__choose_filter_implementations(self);
71327
71328
    goto ok;
71329
    ok:
71330
    self->private_impl.p_decode_ihdr = 0;
71331
    goto exit;
71332
  }
71333
71334
  goto suspend;
71335
  suspend:
71336
  self->private_impl.p_decode_ihdr = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
71337
71338
  goto exit;
71339
  exit:
71340
  if (a_src && a_src->data.ptr) {
71341
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
71342
  }
71343
71344
  return status;
71345
}
71346
71347
// -------- func png.decoder.assign_filter_distance
71348
71349
WUFFS_BASE__GENERATED_C_CODE
71350
static wuffs_base__empty_struct
71351
wuffs_png__decoder__assign_filter_distance(
71352
    wuffs_png__decoder* self) {
71353
  if (self->private_impl.f_depth < 8u) {
71354
    if ((self->private_impl.f_depth != 1u) && (self->private_impl.f_depth != 2u) && (self->private_impl.f_depth != 4u)) {
71355
      return wuffs_base__make_empty_struct();
71356
    } else if (self->private_impl.f_color_type == 0u) {
71357
      self->private_impl.f_dst_pixfmt = 536870920u;
71358
      self->private_impl.f_src_pixfmt = 536870920u;
71359
    } else if (self->private_impl.f_color_type == 3u) {
71360
      self->private_impl.f_dst_pixfmt = 2198077448u;
71361
      self->private_impl.f_src_pixfmt = 2198077448u;
71362
    } else {
71363
      return wuffs_base__make_empty_struct();
71364
    }
71365
    self->private_impl.f_filter_distance = 1u;
71366
    self->private_impl.choosy_filter_and_swizzle = (
71367
        &wuffs_png__decoder__filter_and_swizzle_tricky);
71368
  } else if (self->private_impl.f_color_type == 0u) {
71369
    if (self->private_impl.f_depth == 8u) {
71370
      self->private_impl.f_dst_pixfmt = 536870920u;
71371
      self->private_impl.f_src_pixfmt = 536870920u;
71372
      self->private_impl.f_filter_distance = 1u;
71373
    } else if (self->private_impl.f_depth == 16u) {
71374
      if (self->private_impl.f_interlace_pass == 0u) {
71375
        self->private_impl.f_dst_pixfmt = 536870923u;
71376
        self->private_impl.f_src_pixfmt = 537919499u;
71377
      } else {
71378
        self->private_impl.f_dst_pixfmt = 2164308923u;
71379
        self->private_impl.f_src_pixfmt = 2164308923u;
71380
      }
71381
      self->private_impl.f_filter_distance = 2u;
71382
    }
71383
  } else if (self->private_impl.f_color_type == 2u) {
71384
    if (self->private_impl.f_depth == 8u) {
71385
      self->private_impl.f_dst_pixfmt = 2147485832u;
71386
      self->private_impl.f_src_pixfmt = 2684356744u;
71387
      self->private_impl.f_filter_distance = 3u;
71388
    } else if (self->private_impl.f_depth == 16u) {
71389
      self->private_impl.f_dst_pixfmt = 2164308923u;
71390
      self->private_impl.f_src_pixfmt = 2164308923u;
71391
      self->private_impl.f_filter_distance = 6u;
71392
      self->private_impl.choosy_filter_and_swizzle = (
71393
          &wuffs_png__decoder__filter_and_swizzle_tricky);
71394
    }
71395
  } else if (self->private_impl.f_color_type == 3u) {
71396
    if (self->private_impl.f_depth == 8u) {
71397
      self->private_impl.f_dst_pixfmt = 2198077448u;
71398
      self->private_impl.f_src_pixfmt = 2198077448u;
71399
      self->private_impl.f_filter_distance = 1u;
71400
    }
71401
  } else if (self->private_impl.f_color_type == 4u) {
71402
    if (self->private_impl.f_depth == 8u) {
71403
      self->private_impl.f_dst_pixfmt = 553648264u;
71404
      self->private_impl.f_src_pixfmt = 553648264u;
71405
      self->private_impl.f_filter_distance = 2u;
71406
    } else if (self->private_impl.f_depth == 16u) {
71407
      self->private_impl.f_dst_pixfmt = 2164308923u;
71408
      self->private_impl.f_src_pixfmt = 2164308923u;
71409
      self->private_impl.f_filter_distance = 4u;
71410
      self->private_impl.choosy_filter_and_swizzle = (
71411
          &wuffs_png__decoder__filter_and_swizzle_tricky);
71412
    }
71413
  } else if (self->private_impl.f_color_type == 6u) {
71414
    if (self->private_impl.f_depth == 8u) {
71415
      self->private_impl.f_dst_pixfmt = 2164295816u;
71416
      self->private_impl.f_src_pixfmt = 2701166728u;
71417
      self->private_impl.f_filter_distance = 4u;
71418
    } else if (self->private_impl.f_depth == 16u) {
71419
      self->private_impl.f_dst_pixfmt = 2164308923u;
71420
      self->private_impl.f_src_pixfmt = 2164308923u;
71421
      self->private_impl.f_filter_distance = 8u;
71422
      self->private_impl.choosy_filter_and_swizzle = (
71423
          &wuffs_png__decoder__filter_and_swizzle_tricky);
71424
    }
71425
  }
71426
  return wuffs_base__make_empty_struct();
71427
}
71428
71429
// -------- func png.decoder.calculate_bytes_per_row
71430
71431
WUFFS_BASE__GENERATED_C_CODE
71432
static uint64_t
71433
wuffs_png__decoder__calculate_bytes_per_row(
71434
    const wuffs_png__decoder* self,
71435
    uint32_t a_width) {
71436
  uint64_t v_bytes_per_channel = 0;
71437
71438
  if (self->private_impl.f_depth == 1u) {
71439
    return ((uint64_t)(((a_width + 7u) / 8u)));
71440
  } else if (self->private_impl.f_depth == 2u) {
71441
    return ((uint64_t)(((a_width + 3u) / 4u)));
71442
  } else if (self->private_impl.f_depth == 4u) {
71443
    return ((uint64_t)(((a_width + 1u) / 2u)));
71444
  }
71445
  v_bytes_per_channel = ((uint64_t)(((uint8_t)(self->private_impl.f_depth >> 3u))));
71446
  return (((uint64_t)(a_width)) * v_bytes_per_channel * ((uint64_t)(WUFFS_PNG__NUM_CHANNELS[self->private_impl.f_color_type])));
71447
}
71448
71449
// -------- func png.decoder.choose_filter_implementations
71450
71451
WUFFS_BASE__GENERATED_C_CODE
71452
static wuffs_base__empty_struct
71453
wuffs_png__decoder__choose_filter_implementations(
71454
    wuffs_png__decoder* self) {
71455
  if (self->private_impl.f_filter_distance == 3u) {
71456
    self->private_impl.choosy_filter_1 = (
71457
        &wuffs_png__decoder__filter_1_distance_3_fallback);
71458
    self->private_impl.choosy_filter_3 = (
71459
        &wuffs_png__decoder__filter_3_distance_3_fallback);
71460
    self->private_impl.choosy_filter_4 = (
71461
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
71462
        wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_png__decoder__filter_4_distance_3_arm_neon :
71463
#endif
71464
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
71465
        wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_png__decoder__filter_4_distance_3_x86_sse42 :
71466
#endif
71467
        &wuffs_png__decoder__filter_4_distance_3_fallback);
71468
  } else if (self->private_impl.f_filter_distance == 4u) {
71469
    self->private_impl.choosy_filter_1 = (
71470
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
71471
        wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_png__decoder__filter_1_distance_4_arm_neon :
71472
#endif
71473
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
71474
        wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_png__decoder__filter_1_distance_4_x86_sse42 :
71475
#endif
71476
        &wuffs_png__decoder__filter_1_distance_4_fallback);
71477
    self->private_impl.choosy_filter_3 = (
71478
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
71479
        wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_png__decoder__filter_3_distance_4_arm_neon :
71480
#endif
71481
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
71482
        wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_png__decoder__filter_3_distance_4_x86_sse42 :
71483
#endif
71484
        &wuffs_png__decoder__filter_3_distance_4_fallback);
71485
    self->private_impl.choosy_filter_4 = (
71486
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
71487
        wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_png__decoder__filter_4_distance_4_arm_neon :
71488
#endif
71489
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
71490
        wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_png__decoder__filter_4_distance_4_x86_sse42 :
71491
#endif
71492
        &wuffs_png__decoder__filter_4_distance_4_fallback);
71493
  }
71494
  return wuffs_base__make_empty_struct();
71495
}
71496
71497
// -------- func png.decoder.decode_other_chunk
71498
71499
WUFFS_BASE__GENERATED_C_CODE
71500
static wuffs_base__status
71501
wuffs_png__decoder__decode_other_chunk(
71502
    wuffs_png__decoder* self,
71503
    wuffs_base__io_buffer* a_src,
71504
    bool a_framy) {
71505
  wuffs_base__status status = wuffs_base__make_status(NULL);
71506
71507
  const uint8_t* iop_a_src = NULL;
71508
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
71509
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
71510
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
71511
  if (a_src && a_src->data.ptr) {
71512
    io0_a_src = a_src->data.ptr;
71513
    io1_a_src = io0_a_src + a_src->meta.ri;
71514
    iop_a_src = io1_a_src;
71515
    io2_a_src = io0_a_src + a_src->meta.wi;
71516
  }
71517
71518
  uint32_t coro_susp_point = self->private_impl.p_decode_other_chunk;
71519
  switch (coro_susp_point) {
71520
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
71521
71522
    if ((self->private_impl.f_chunk_type == 1163152464u) &&  ! a_framy) {
71523
      if (self->private_impl.f_seen_plte) {
71524
        status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
71525
        goto exit;
71526
      } else if (self->private_impl.f_color_type == 3u) {
71527
        if (a_src) {
71528
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
71529
        }
71530
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
71531
        status = wuffs_png__decoder__decode_plte(self, a_src);
71532
        if (a_src) {
71533
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
71534
        }
71535
        if (status.repr) {
71536
          goto suspend;
71537
        }
71538
      } else if ((self->private_impl.f_color_type == 2u) || (self->private_impl.f_color_type == 6u)) {
71539
      } else {
71540
        status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
71541
        goto exit;
71542
      }
71543
      self->private_impl.f_seen_plte = true;
71544
    } else if ((self->private_impl.f_chunk_type & 32u) == 0u) {
71545
      if (self->private_impl.f_chunk_type != 1413563465u) {
71546
        status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
71547
        goto exit;
71548
      }
71549
    }
71550
    if (self->private_impl.f_chunk_type == 1716082789u) {
71551
      if (self->private_impl.f_report_metadata_exif) {
71552
        if (self->private_impl.f_seen_exif) {
71553
          status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
71554
          goto exit;
71555
        }
71556
        if (a_src) {
71557
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
71558
        }
71559
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
71560
        status = wuffs_png__decoder__decode_exif(self, a_src);
71561
        if (a_src) {
71562
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
71563
        }
71564
        if (status.repr) {
71565
          goto suspend;
71566
        }
71567
        self->private_impl.f_seen_exif = true;
71568
      }
71569
    } else if ((self->private_impl.f_chunk_type == 1951945833u) || (self->private_impl.f_chunk_type == 1951942004u) || (self->private_impl.f_chunk_type == 1951945850u)) {
71570
      if (self->private_impl.f_report_metadata_kvp) {
71571
        self->private_impl.f_metadata_flavor = 4u;
71572
        self->private_impl.f_metadata_fourcc = 1263947851u;
71573
        self->private_impl.f_metadata_x = 0u;
71574
        self->private_impl.f_metadata_y = 0u;
71575
        self->private_impl.f_metadata_z = 0u;
71576
      }
71577
    } else if ( ! a_framy) {
71578
      if (self->private_impl.f_chunk_type == 1280598881u) {
71579
        if (self->private_impl.f_seen_actl) {
71580
          status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
71581
          goto exit;
71582
        }
71583
        if (a_src) {
71584
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
71585
        }
71586
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
71587
        status = wuffs_png__decoder__decode_actl(self, a_src);
71588
        if (a_src) {
71589
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
71590
        }
71591
        if (status.repr) {
71592
          goto suspend;
71593
        }
71594
        self->private_impl.f_seen_actl = true;
71595
      } else if (self->private_impl.f_chunk_type == 1297238115u) {
71596
        if (self->private_impl.f_report_metadata_chrm) {
71597
          if (self->private_impl.f_seen_chrm) {
71598
            status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
71599
            goto exit;
71600
          }
71601
          if (a_src) {
71602
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
71603
          }
71604
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
71605
          status = wuffs_png__decoder__decode_chrm(self, a_src);
71606
          if (a_src) {
71607
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
71608
          }
71609
          if (status.repr) {
71610
            goto suspend;
71611
          }
71612
          self->private_impl.f_seen_chrm = true;
71613
        }
71614
      } else if (self->private_impl.f_chunk_type == 1280598886u) {
71615
        if (self->private_impl.f_seen_fctl) {
71616
          status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
71617
          goto exit;
71618
        }
71619
        if (a_src) {
71620
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
71621
        }
71622
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
71623
        status = wuffs_png__decoder__decode_fctl(self, a_src);
71624
        if (a_src) {
71625
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
71626
        }
71627
        if (status.repr) {
71628
          goto suspend;
71629
        }
71630
        self->private_impl.f_seen_fctl = true;
71631
      } else if (self->private_impl.f_chunk_type == 1095582055u) {
71632
        if (self->private_impl.f_report_metadata_gama) {
71633
          if (self->private_impl.f_seen_gama) {
71634
            status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
71635
            goto exit;
71636
          }
71637
          if (a_src) {
71638
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
71639
          }
71640
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
71641
          status = wuffs_png__decoder__decode_gama(self, a_src);
71642
          if (a_src) {
71643
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
71644
          }
71645
          if (status.repr) {
71646
            goto suspend;
71647
          }
71648
          self->private_impl.f_seen_gama = true;
71649
        }
71650
      } else if (self->private_impl.f_chunk_type == 1346585449u) {
71651
        if (self->private_impl.f_report_metadata_iccp) {
71652
          if (self->private_impl.f_seen_iccp) {
71653
            status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
71654
            goto exit;
71655
          }
71656
          if (a_src) {
71657
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
71658
          }
71659
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
71660
          status = wuffs_png__decoder__decode_iccp(self, a_src);
71661
          if (a_src) {
71662
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
71663
          }
71664
          if (status.repr) {
71665
            goto suspend;
71666
          }
71667
          self->private_impl.f_seen_iccp = true;
71668
        }
71669
      } else if (self->private_impl.f_chunk_type == 1111970419u) {
71670
        if (self->private_impl.f_report_metadata_srgb) {
71671
          if (self->private_impl.f_seen_srgb) {
71672
            status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
71673
            goto exit;
71674
          }
71675
          if (a_src) {
71676
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
71677
          }
71678
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
71679
          status = wuffs_png__decoder__decode_srgb(self, a_src);
71680
          if (a_src) {
71681
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
71682
          }
71683
          if (status.repr) {
71684
            goto suspend;
71685
          }
71686
          self->private_impl.f_seen_srgb = true;
71687
        }
71688
      } else if (self->private_impl.f_chunk_type == 1397641844u) {
71689
        if (self->private_impl.f_seen_trns || ((self->private_impl.f_color_type == 3u) &&  ! self->private_impl.f_seen_plte)) {
71690
          status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
71691
          goto exit;
71692
        } else if (self->private_impl.f_color_type > 3u) {
71693
        } else {
71694
          if (a_src) {
71695
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
71696
          }
71697
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
71698
          status = wuffs_png__decoder__decode_trns(self, a_src);
71699
          if (a_src) {
71700
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
71701
          }
71702
          if (status.repr) {
71703
            goto suspend;
71704
          }
71705
        }
71706
        self->private_impl.f_seen_trns = true;
71707
      }
71708
    }
71709
    if (self->private_impl.f_metadata_fourcc == 0u) {
71710
      self->private_data.s_decode_other_chunk.scratch = self->private_impl.f_chunk_length;
71711
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
71712
      if (self->private_data.s_decode_other_chunk.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
71713
        self->private_data.s_decode_other_chunk.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
71714
        iop_a_src = io2_a_src;
71715
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
71716
        goto suspend;
71717
      }
71718
      iop_a_src += self->private_data.s_decode_other_chunk.scratch;
71719
    }
71720
71721
    goto ok;
71722
    ok:
71723
    self->private_impl.p_decode_other_chunk = 0;
71724
    goto exit;
71725
  }
71726
71727
  goto suspend;
71728
  suspend:
71729
  self->private_impl.p_decode_other_chunk = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
71730
71731
  goto exit;
71732
  exit:
71733
  if (a_src && a_src->data.ptr) {
71734
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
71735
  }
71736
71737
  return status;
71738
}
71739
71740
// -------- func png.decoder.decode_actl
71741
71742
WUFFS_BASE__GENERATED_C_CODE
71743
static wuffs_base__status
71744
wuffs_png__decoder__decode_actl(
71745
    wuffs_png__decoder* self,
71746
    wuffs_base__io_buffer* a_src) {
71747
  wuffs_base__status status = wuffs_base__make_status(NULL);
71748
71749
  const uint8_t* iop_a_src = NULL;
71750
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
71751
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
71752
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
71753
  if (a_src && a_src->data.ptr) {
71754
    io0_a_src = a_src->data.ptr;
71755
    io1_a_src = io0_a_src + a_src->meta.ri;
71756
    iop_a_src = io1_a_src;
71757
    io2_a_src = io0_a_src + a_src->meta.wi;
71758
  }
71759
71760
  uint32_t coro_susp_point = self->private_impl.p_decode_actl;
71761
  switch (coro_susp_point) {
71762
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
71763
71764
    if (self->private_impl.f_chunk_length != 8u) {
71765
      status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
71766
      goto exit;
71767
    } else if (self->private_impl.f_interlace_pass > 0u) {
71768
      status = wuffs_base__make_status(wuffs_png__error__unsupported_png_file);
71769
      goto exit;
71770
    }
71771
    self->private_impl.f_chunk_length = 0u;
71772
    {
71773
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
71774
      uint32_t t_0;
71775
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
71776
        t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
71777
        iop_a_src += 4;
71778
      } else {
71779
        self->private_data.s_decode_actl.scratch = 0;
71780
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
71781
        while (true) {
71782
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
71783
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
71784
            goto suspend;
71785
          }
71786
          uint64_t* scratch = &self->private_data.s_decode_actl.scratch;
71787
          uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu));
71788
          *scratch >>= 8;
71789
          *scratch <<= 8;
71790
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0);
71791
          if (num_bits_0 == 24) {
71792
            t_0 = ((uint32_t)(*scratch >> 32));
71793
            break;
71794
          }
71795
          num_bits_0 += 8u;
71796
          *scratch |= ((uint64_t)(num_bits_0));
71797
        }
71798
      }
71799
      self->private_impl.f_num_animation_frames_value = t_0;
71800
    }
71801
    if (self->private_impl.f_num_animation_frames_value == 0u) {
71802
      status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
71803
      goto exit;
71804
    }
71805
    {
71806
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
71807
      uint32_t t_1;
71808
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
71809
        t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
71810
        iop_a_src += 4;
71811
      } else {
71812
        self->private_data.s_decode_actl.scratch = 0;
71813
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
71814
        while (true) {
71815
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
71816
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
71817
            goto suspend;
71818
          }
71819
          uint64_t* scratch = &self->private_data.s_decode_actl.scratch;
71820
          uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu));
71821
          *scratch >>= 8;
71822
          *scratch <<= 8;
71823
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1);
71824
          if (num_bits_1 == 24) {
71825
            t_1 = ((uint32_t)(*scratch >> 32));
71826
            break;
71827
          }
71828
          num_bits_1 += 8u;
71829
          *scratch |= ((uint64_t)(num_bits_1));
71830
        }
71831
      }
71832
      self->private_impl.f_num_animation_loops_value = t_1;
71833
    }
71834
71835
    goto ok;
71836
    ok:
71837
    self->private_impl.p_decode_actl = 0;
71838
    goto exit;
71839
  }
71840
71841
  goto suspend;
71842
  suspend:
71843
  self->private_impl.p_decode_actl = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
71844
71845
  goto exit;
71846
  exit:
71847
  if (a_src && a_src->data.ptr) {
71848
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
71849
  }
71850
71851
  return status;
71852
}
71853
71854
// -------- func png.decoder.decode_chrm
71855
71856
WUFFS_BASE__GENERATED_C_CODE
71857
static wuffs_base__status
71858
wuffs_png__decoder__decode_chrm(
71859
    wuffs_png__decoder* self,
71860
    wuffs_base__io_buffer* a_src) {
71861
  wuffs_base__status status = wuffs_base__make_status(NULL);
71862
71863
  uint64_t v_u = 0;
71864
71865
  const uint8_t* iop_a_src = NULL;
71866
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
71867
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
71868
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
71869
  if (a_src && a_src->data.ptr) {
71870
    io0_a_src = a_src->data.ptr;
71871
    io1_a_src = io0_a_src + a_src->meta.ri;
71872
    iop_a_src = io1_a_src;
71873
    io2_a_src = io0_a_src + a_src->meta.wi;
71874
  }
71875
71876
  uint32_t coro_susp_point = self->private_impl.p_decode_chrm;
71877
  switch (coro_susp_point) {
71878
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
71879
71880
    if (self->private_impl.f_chunk_length != 32u) {
71881
      status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
71882
      goto exit;
71883
    }
71884
    self->private_impl.f_chunk_length = 0u;
71885
    self->private_impl.f_metadata_flavor = 5u;
71886
    self->private_impl.f_metadata_fourcc = 1128813133u;
71887
    self->private_impl.f_metadata_x = 0u;
71888
    self->private_impl.f_metadata_y = 0u;
71889
    self->private_impl.f_metadata_z = 0u;
71890
    {
71891
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
71892
      uint64_t t_0;
71893
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
71894
        t_0 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src)));
71895
        iop_a_src += 4;
71896
      } else {
71897
        self->private_data.s_decode_chrm.scratch = 0;
71898
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
71899
        while (true) {
71900
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
71901
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
71902
            goto suspend;
71903
          }
71904
          uint64_t* scratch = &self->private_data.s_decode_chrm.scratch;
71905
          uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu));
71906
          *scratch >>= 8;
71907
          *scratch <<= 8;
71908
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0);
71909
          if (num_bits_0 == 24) {
71910
            t_0 = ((uint64_t)(*scratch >> 32));
71911
            break;
71912
          }
71913
          num_bits_0 += 8u;
71914
          *scratch |= ((uint64_t)(num_bits_0));
71915
        }
71916
      }
71917
      v_u = t_0;
71918
    }
71919
    self->private_impl.f_metadata_x |= ((16777215u & v_u) << 0u);
71920
    {
71921
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
71922
      uint64_t t_1;
71923
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
71924
        t_1 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src)));
71925
        iop_a_src += 4;
71926
      } else {
71927
        self->private_data.s_decode_chrm.scratch = 0;
71928
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
71929
        while (true) {
71930
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
71931
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
71932
            goto suspend;
71933
          }
71934
          uint64_t* scratch = &self->private_data.s_decode_chrm.scratch;
71935
          uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu));
71936
          *scratch >>= 8;
71937
          *scratch <<= 8;
71938
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1);
71939
          if (num_bits_1 == 24) {
71940
            t_1 = ((uint64_t)(*scratch >> 32));
71941
            break;
71942
          }
71943
          num_bits_1 += 8u;
71944
          *scratch |= ((uint64_t)(num_bits_1));
71945
        }
71946
      }
71947
      v_u = t_1;
71948
    }
71949
    self->private_impl.f_metadata_x |= ((16777215u & v_u) << 24u);
71950
    {
71951
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
71952
      uint64_t t_2;
71953
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
71954
        t_2 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src)));
71955
        iop_a_src += 4;
71956
      } else {
71957
        self->private_data.s_decode_chrm.scratch = 0;
71958
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
71959
        while (true) {
71960
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
71961
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
71962
            goto suspend;
71963
          }
71964
          uint64_t* scratch = &self->private_data.s_decode_chrm.scratch;
71965
          uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu));
71966
          *scratch >>= 8;
71967
          *scratch <<= 8;
71968
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2);
71969
          if (num_bits_2 == 24) {
71970
            t_2 = ((uint64_t)(*scratch >> 32));
71971
            break;
71972
          }
71973
          num_bits_2 += 8u;
71974
          *scratch |= ((uint64_t)(num_bits_2));
71975
        }
71976
      }
71977
      v_u = t_2;
71978
    }
71979
    self->private_impl.f_metadata_x |= ((uint64_t)((16777215u & v_u) << 48u));
71980
    self->private_impl.f_metadata_y |= ((16777215u & v_u) >> 16u);
71981
    {
71982
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
71983
      uint64_t t_3;
71984
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
71985
        t_3 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src)));
71986
        iop_a_src += 4;
71987
      } else {
71988
        self->private_data.s_decode_chrm.scratch = 0;
71989
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
71990
        while (true) {
71991
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
71992
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
71993
            goto suspend;
71994
          }
71995
          uint64_t* scratch = &self->private_data.s_decode_chrm.scratch;
71996
          uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFFu));
71997
          *scratch >>= 8;
71998
          *scratch <<= 8;
71999
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3);
72000
          if (num_bits_3 == 24) {
72001
            t_3 = ((uint64_t)(*scratch >> 32));
72002
            break;
72003
          }
72004
          num_bits_3 += 8u;
72005
          *scratch |= ((uint64_t)(num_bits_3));
72006
        }
72007
      }
72008
      v_u = t_3;
72009
    }
72010
    self->private_impl.f_metadata_y |= ((16777215u & v_u) << 8u);
72011
    {
72012
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
72013
      uint64_t t_4;
72014
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
72015
        t_4 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src)));
72016
        iop_a_src += 4;
72017
      } else {
72018
        self->private_data.s_decode_chrm.scratch = 0;
72019
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
72020
        while (true) {
72021
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
72022
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
72023
            goto suspend;
72024
          }
72025
          uint64_t* scratch = &self->private_data.s_decode_chrm.scratch;
72026
          uint32_t num_bits_4 = ((uint32_t)(*scratch & 0xFFu));
72027
          *scratch >>= 8;
72028
          *scratch <<= 8;
72029
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_4);
72030
          if (num_bits_4 == 24) {
72031
            t_4 = ((uint64_t)(*scratch >> 32));
72032
            break;
72033
          }
72034
          num_bits_4 += 8u;
72035
          *scratch |= ((uint64_t)(num_bits_4));
72036
        }
72037
      }
72038
      v_u = t_4;
72039
    }
72040
    self->private_impl.f_metadata_y |= ((16777215u & v_u) << 32u);
72041
    {
72042
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11);
72043
      uint64_t t_5;
72044
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
72045
        t_5 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src)));
72046
        iop_a_src += 4;
72047
      } else {
72048
        self->private_data.s_decode_chrm.scratch = 0;
72049
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12);
72050
        while (true) {
72051
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
72052
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
72053
            goto suspend;
72054
          }
72055
          uint64_t* scratch = &self->private_data.s_decode_chrm.scratch;
72056
          uint32_t num_bits_5 = ((uint32_t)(*scratch & 0xFFu));
72057
          *scratch >>= 8;
72058
          *scratch <<= 8;
72059
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_5);
72060
          if (num_bits_5 == 24) {
72061
            t_5 = ((uint64_t)(*scratch >> 32));
72062
            break;
72063
          }
72064
          num_bits_5 += 8u;
72065
          *scratch |= ((uint64_t)(num_bits_5));
72066
        }
72067
      }
72068
      v_u = t_5;
72069
    }
72070
    self->private_impl.f_metadata_y |= ((uint64_t)((16777215u & v_u) << 56u));
72071
    self->private_impl.f_metadata_z |= ((16777215u & v_u) >> 8u);
72072
    {
72073
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13);
72074
      uint64_t t_6;
72075
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
72076
        t_6 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src)));
72077
        iop_a_src += 4;
72078
      } else {
72079
        self->private_data.s_decode_chrm.scratch = 0;
72080
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14);
72081
        while (true) {
72082
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
72083
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
72084
            goto suspend;
72085
          }
72086
          uint64_t* scratch = &self->private_data.s_decode_chrm.scratch;
72087
          uint32_t num_bits_6 = ((uint32_t)(*scratch & 0xFFu));
72088
          *scratch >>= 8;
72089
          *scratch <<= 8;
72090
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_6);
72091
          if (num_bits_6 == 24) {
72092
            t_6 = ((uint64_t)(*scratch >> 32));
72093
            break;
72094
          }
72095
          num_bits_6 += 8u;
72096
          *scratch |= ((uint64_t)(num_bits_6));
72097
        }
72098
      }
72099
      v_u = t_6;
72100
    }
72101
    self->private_impl.f_metadata_z |= ((16777215u & v_u) << 16u);
72102
    {
72103
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15);
72104
      uint64_t t_7;
72105
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
72106
        t_7 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src)));
72107
        iop_a_src += 4;
72108
      } else {
72109
        self->private_data.s_decode_chrm.scratch = 0;
72110
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16);
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_decode_chrm.scratch;
72117
          uint32_t num_bits_7 = ((uint32_t)(*scratch & 0xFFu));
72118
          *scratch >>= 8;
72119
          *scratch <<= 8;
72120
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_7);
72121
          if (num_bits_7 == 24) {
72122
            t_7 = ((uint64_t)(*scratch >> 32));
72123
            break;
72124
          }
72125
          num_bits_7 += 8u;
72126
          *scratch |= ((uint64_t)(num_bits_7));
72127
        }
72128
      }
72129
      v_u = t_7;
72130
    }
72131
    self->private_impl.f_metadata_z |= ((16777215u & v_u) << 40u);
72132
72133
    goto ok;
72134
    ok:
72135
    self->private_impl.p_decode_chrm = 0;
72136
    goto exit;
72137
  }
72138
72139
  goto suspend;
72140
  suspend:
72141
  self->private_impl.p_decode_chrm = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
72142
72143
  goto exit;
72144
  exit:
72145
  if (a_src && a_src->data.ptr) {
72146
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
72147
  }
72148
72149
  return status;
72150
}
72151
72152
// -------- func png.decoder.decode_exif
72153
72154
WUFFS_BASE__GENERATED_C_CODE
72155
static wuffs_base__status
72156
wuffs_png__decoder__decode_exif(
72157
    wuffs_png__decoder* self,
72158
    wuffs_base__io_buffer* a_src) {
72159
  wuffs_base__status status = wuffs_base__make_status(NULL);
72160
72161
  const uint8_t* iop_a_src = NULL;
72162
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
72163
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
72164
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
72165
  if (a_src && a_src->data.ptr) {
72166
    io0_a_src = a_src->data.ptr;
72167
    io1_a_src = io0_a_src + a_src->meta.ri;
72168
    iop_a_src = io1_a_src;
72169
    io2_a_src = io0_a_src + a_src->meta.wi;
72170
  }
72171
72172
  if (self->private_impl.f_chunk_length < 4u) {
72173
    status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
72174
    goto exit;
72175
  }
72176
  self->private_impl.f_metadata_flavor = 3u;
72177
  self->private_impl.f_metadata_fourcc = 1163413830u;
72178
  self->private_impl.f_metadata_x = 0u;
72179
  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)));
72180
  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)));
72181
  self->private_impl.f_chunk_length = 0u;
72182
72183
  goto ok;
72184
  ok:
72185
  goto exit;
72186
  exit:
72187
  if (a_src && a_src->data.ptr) {
72188
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
72189
  }
72190
72191
  return status;
72192
}
72193
72194
// -------- func png.decoder.decode_fctl
72195
72196
WUFFS_BASE__GENERATED_C_CODE
72197
static wuffs_base__status
72198
wuffs_png__decoder__decode_fctl(
72199
    wuffs_png__decoder* self,
72200
    wuffs_base__io_buffer* a_src) {
72201
  wuffs_base__status status = wuffs_base__make_status(NULL);
72202
72203
  uint32_t v_x0 = 0;
72204
  uint32_t v_y0 = 0;
72205
  uint32_t v_x1 = 0;
72206
  uint32_t v_y1 = 0;
72207
72208
  const uint8_t* iop_a_src = NULL;
72209
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
72210
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
72211
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
72212
  if (a_src && a_src->data.ptr) {
72213
    io0_a_src = a_src->data.ptr;
72214
    io1_a_src = io0_a_src + a_src->meta.ri;
72215
    iop_a_src = io1_a_src;
72216
    io2_a_src = io0_a_src + a_src->meta.wi;
72217
  }
72218
72219
  uint32_t coro_susp_point = self->private_impl.p_decode_fctl;
72220
  if (coro_susp_point) {
72221
    v_x0 = self->private_data.s_decode_fctl.v_x0;
72222
    v_x1 = self->private_data.s_decode_fctl.v_x1;
72223
    v_y1 = self->private_data.s_decode_fctl.v_y1;
72224
  }
72225
  switch (coro_susp_point) {
72226
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
72227
72228
    if (self->private_impl.f_chunk_length != 26u) {
72229
      status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
72230
      goto exit;
72231
    }
72232
    self->private_impl.f_chunk_length = 0u;
72233
    {
72234
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
72235
      uint32_t t_0;
72236
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
72237
        t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
72238
        iop_a_src += 4;
72239
      } else {
72240
        self->private_data.s_decode_fctl.scratch = 0;
72241
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
72242
        while (true) {
72243
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
72244
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
72245
            goto suspend;
72246
          }
72247
          uint64_t* scratch = &self->private_data.s_decode_fctl.scratch;
72248
          uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu));
72249
          *scratch >>= 8;
72250
          *scratch <<= 8;
72251
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0);
72252
          if (num_bits_0 == 24) {
72253
            t_0 = ((uint32_t)(*scratch >> 32));
72254
            break;
72255
          }
72256
          num_bits_0 += 8u;
72257
          *scratch |= ((uint64_t)(num_bits_0));
72258
        }
72259
      }
72260
      v_x0 = t_0;
72261
    }
72262
    if (v_x0 != self->private_impl.f_next_animation_seq_num) {
72263
      status = wuffs_base__make_status(wuffs_png__error__bad_animation_sequence_number);
72264
      goto exit;
72265
    } else if (self->private_impl.f_next_animation_seq_num >= 4294967295u) {
72266
      status = wuffs_base__make_status(wuffs_png__error__unsupported_png_file);
72267
      goto exit;
72268
    }
72269
    self->private_impl.f_next_animation_seq_num += 1u;
72270
    {
72271
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
72272
      uint32_t t_1;
72273
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
72274
        t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
72275
        iop_a_src += 4;
72276
      } else {
72277
        self->private_data.s_decode_fctl.scratch = 0;
72278
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
72279
        while (true) {
72280
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
72281
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
72282
            goto suspend;
72283
          }
72284
          uint64_t* scratch = &self->private_data.s_decode_fctl.scratch;
72285
          uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu));
72286
          *scratch >>= 8;
72287
          *scratch <<= 8;
72288
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1);
72289
          if (num_bits_1 == 24) {
72290
            t_1 = ((uint32_t)(*scratch >> 32));
72291
            break;
72292
          }
72293
          num_bits_1 += 8u;
72294
          *scratch |= ((uint64_t)(num_bits_1));
72295
        }
72296
      }
72297
      v_x1 = t_1;
72298
    }
72299
    {
72300
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
72301
      uint32_t t_2;
72302
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
72303
        t_2 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
72304
        iop_a_src += 4;
72305
      } else {
72306
        self->private_data.s_decode_fctl.scratch = 0;
72307
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
72308
        while (true) {
72309
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
72310
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
72311
            goto suspend;
72312
          }
72313
          uint64_t* scratch = &self->private_data.s_decode_fctl.scratch;
72314
          uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu));
72315
          *scratch >>= 8;
72316
          *scratch <<= 8;
72317
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2);
72318
          if (num_bits_2 == 24) {
72319
            t_2 = ((uint32_t)(*scratch >> 32));
72320
            break;
72321
          }
72322
          num_bits_2 += 8u;
72323
          *scratch |= ((uint64_t)(num_bits_2));
72324
        }
72325
      }
72326
      v_y1 = t_2;
72327
    }
72328
    {
72329
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
72330
      uint32_t t_3;
72331
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
72332
        t_3 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
72333
        iop_a_src += 4;
72334
      } else {
72335
        self->private_data.s_decode_fctl.scratch = 0;
72336
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
72337
        while (true) {
72338
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
72339
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
72340
            goto suspend;
72341
          }
72342
          uint64_t* scratch = &self->private_data.s_decode_fctl.scratch;
72343
          uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFFu));
72344
          *scratch >>= 8;
72345
          *scratch <<= 8;
72346
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3);
72347
          if (num_bits_3 == 24) {
72348
            t_3 = ((uint32_t)(*scratch >> 32));
72349
            break;
72350
          }
72351
          num_bits_3 += 8u;
72352
          *scratch |= ((uint64_t)(num_bits_3));
72353
        }
72354
      }
72355
      v_x0 = t_3;
72356
    }
72357
    {
72358
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
72359
      uint32_t t_4;
72360
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
72361
        t_4 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
72362
        iop_a_src += 4;
72363
      } else {
72364
        self->private_data.s_decode_fctl.scratch = 0;
72365
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
72366
        while (true) {
72367
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
72368
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
72369
            goto suspend;
72370
          }
72371
          uint64_t* scratch = &self->private_data.s_decode_fctl.scratch;
72372
          uint32_t num_bits_4 = ((uint32_t)(*scratch & 0xFFu));
72373
          *scratch >>= 8;
72374
          *scratch <<= 8;
72375
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_4);
72376
          if (num_bits_4 == 24) {
72377
            t_4 = ((uint32_t)(*scratch >> 32));
72378
            break;
72379
          }
72380
          num_bits_4 += 8u;
72381
          *scratch |= ((uint64_t)(num_bits_4));
72382
        }
72383
      }
72384
      v_y0 = t_4;
72385
    }
72386
    v_x1 += v_x0;
72387
    v_y1 += v_y0;
72388
    if ((v_x0 >= v_x1) ||
72389
        (v_x0 > self->private_impl.f_width) ||
72390
        (v_x1 > self->private_impl.f_width) ||
72391
        (v_y0 >= v_y1) ||
72392
        (v_y0 > self->private_impl.f_height) ||
72393
        (v_y1 > self->private_impl.f_height)) {
72394
      status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
72395
      goto exit;
72396
    }
72397
    self->private_impl.f_frame_rect_x0 = v_x0;
72398
    self->private_impl.f_frame_rect_y0 = v_y0;
72399
    self->private_impl.f_frame_rect_x1 = v_x1;
72400
    self->private_impl.f_frame_rect_y1 = v_y1;
72401
    {
72402
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11);
72403
      uint32_t t_5;
72404
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
72405
        t_5 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src)));
72406
        iop_a_src += 2;
72407
      } else {
72408
        self->private_data.s_decode_fctl.scratch = 0;
72409
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12);
72410
        while (true) {
72411
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
72412
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
72413
            goto suspend;
72414
          }
72415
          uint64_t* scratch = &self->private_data.s_decode_fctl.scratch;
72416
          uint32_t num_bits_5 = ((uint32_t)(*scratch & 0xFFu));
72417
          *scratch >>= 8;
72418
          *scratch <<= 8;
72419
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_5);
72420
          if (num_bits_5 == 8) {
72421
            t_5 = ((uint32_t)(*scratch >> 48));
72422
            break;
72423
          }
72424
          num_bits_5 += 8u;
72425
          *scratch |= ((uint64_t)(num_bits_5));
72426
        }
72427
      }
72428
      v_x0 = t_5;
72429
    }
72430
    {
72431
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13);
72432
      uint32_t t_6;
72433
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
72434
        t_6 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src)));
72435
        iop_a_src += 2;
72436
      } else {
72437
        self->private_data.s_decode_fctl.scratch = 0;
72438
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14);
72439
        while (true) {
72440
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
72441
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
72442
            goto suspend;
72443
          }
72444
          uint64_t* scratch = &self->private_data.s_decode_fctl.scratch;
72445
          uint32_t num_bits_6 = ((uint32_t)(*scratch & 0xFFu));
72446
          *scratch >>= 8;
72447
          *scratch <<= 8;
72448
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_6);
72449
          if (num_bits_6 == 8) {
72450
            t_6 = ((uint32_t)(*scratch >> 48));
72451
            break;
72452
          }
72453
          num_bits_6 += 8u;
72454
          *scratch |= ((uint64_t)(num_bits_6));
72455
        }
72456
      }
72457
      v_x1 = t_6;
72458
    }
72459
    if (v_x1 <= 0u) {
72460
      self->private_impl.f_frame_duration = (((uint64_t)(v_x0)) * 7056000u);
72461
    } else {
72462
      self->private_impl.f_frame_duration = ((((uint64_t)(v_x0)) * 705600000u) / ((uint64_t)(v_x1)));
72463
    }
72464
    {
72465
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15);
72466
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
72467
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
72468
        goto suspend;
72469
      }
72470
      uint32_t t_7 = *iop_a_src++;
72471
      v_x0 = t_7;
72472
    }
72473
    if (v_x0 == 0u) {
72474
      self->private_impl.f_frame_disposal = 0u;
72475
    } else if (v_x0 == 1u) {
72476
      self->private_impl.f_frame_disposal = 1u;
72477
    } else if (v_x0 == 2u) {
72478
      self->private_impl.f_frame_disposal = 2u;
72479
    } else {
72480
      status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
72481
      goto exit;
72482
    }
72483
    {
72484
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16);
72485
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
72486
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
72487
        goto suspend;
72488
      }
72489
      uint32_t t_8 = *iop_a_src++;
72490
      v_x0 = t_8;
72491
    }
72492
    if (v_x0 == 0u) {
72493
      self->private_impl.f_frame_overwrite_instead_of_blend = true;
72494
    } else if (v_x0 == 1u) {
72495
      self->private_impl.f_frame_overwrite_instead_of_blend = false;
72496
    } else {
72497
      status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
72498
      goto exit;
72499
    }
72500
    if (self->private_impl.f_num_decoded_frame_configs_value == 0u) {
72501
      self->private_impl.f_first_rect_x0 = self->private_impl.f_frame_rect_x0;
72502
      self->private_impl.f_first_rect_y0 = self->private_impl.f_frame_rect_y0;
72503
      self->private_impl.f_first_rect_x1 = self->private_impl.f_frame_rect_x1;
72504
      self->private_impl.f_first_rect_y1 = self->private_impl.f_frame_rect_y1;
72505
      self->private_impl.f_first_duration = self->private_impl.f_frame_duration;
72506
      self->private_impl.f_first_disposal = self->private_impl.f_frame_disposal;
72507
      self->private_impl.f_first_overwrite_instead_of_blend = self->private_impl.f_frame_overwrite_instead_of_blend;
72508
    }
72509
72510
    goto ok;
72511
    ok:
72512
    self->private_impl.p_decode_fctl = 0;
72513
    goto exit;
72514
  }
72515
72516
  goto suspend;
72517
  suspend:
72518
  self->private_impl.p_decode_fctl = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
72519
  self->private_data.s_decode_fctl.v_x0 = v_x0;
72520
  self->private_data.s_decode_fctl.v_x1 = v_x1;
72521
  self->private_data.s_decode_fctl.v_y1 = v_y1;
72522
72523
  goto exit;
72524
  exit:
72525
  if (a_src && a_src->data.ptr) {
72526
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
72527
  }
72528
72529
  return status;
72530
}
72531
72532
// -------- func png.decoder.decode_gama
72533
72534
WUFFS_BASE__GENERATED_C_CODE
72535
static wuffs_base__status
72536
wuffs_png__decoder__decode_gama(
72537
    wuffs_png__decoder* self,
72538
    wuffs_base__io_buffer* a_src) {
72539
  wuffs_base__status status = wuffs_base__make_status(NULL);
72540
72541
  const uint8_t* iop_a_src = NULL;
72542
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
72543
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
72544
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
72545
  if (a_src && a_src->data.ptr) {
72546
    io0_a_src = a_src->data.ptr;
72547
    io1_a_src = io0_a_src + a_src->meta.ri;
72548
    iop_a_src = io1_a_src;
72549
    io2_a_src = io0_a_src + a_src->meta.wi;
72550
  }
72551
72552
  uint32_t coro_susp_point = self->private_impl.p_decode_gama;
72553
  switch (coro_susp_point) {
72554
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
72555
72556
    if (self->private_impl.f_chunk_length != 4u) {
72557
      status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
72558
      goto exit;
72559
    }
72560
    self->private_impl.f_chunk_length = 0u;
72561
    self->private_impl.f_metadata_flavor = 5u;
72562
    self->private_impl.f_metadata_fourcc = 1195461953u;
72563
    {
72564
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
72565
      uint64_t t_0;
72566
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
72567
        t_0 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src)));
72568
        iop_a_src += 4;
72569
      } else {
72570
        self->private_data.s_decode_gama.scratch = 0;
72571
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
72572
        while (true) {
72573
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
72574
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
72575
            goto suspend;
72576
          }
72577
          uint64_t* scratch = &self->private_data.s_decode_gama.scratch;
72578
          uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu));
72579
          *scratch >>= 8;
72580
          *scratch <<= 8;
72581
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0);
72582
          if (num_bits_0 == 24) {
72583
            t_0 = ((uint64_t)(*scratch >> 32));
72584
            break;
72585
          }
72586
          num_bits_0 += 8u;
72587
          *scratch |= ((uint64_t)(num_bits_0));
72588
        }
72589
      }
72590
      self->private_impl.f_metadata_x = t_0;
72591
    }
72592
    self->private_impl.f_metadata_y = 0u;
72593
    self->private_impl.f_metadata_z = 0u;
72594
72595
    goto ok;
72596
    ok:
72597
    self->private_impl.p_decode_gama = 0;
72598
    goto exit;
72599
  }
72600
72601
  goto suspend;
72602
  suspend:
72603
  self->private_impl.p_decode_gama = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
72604
72605
  goto exit;
72606
  exit:
72607
  if (a_src && a_src->data.ptr) {
72608
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
72609
  }
72610
72611
  return status;
72612
}
72613
72614
// -------- func png.decoder.decode_iccp
72615
72616
WUFFS_BASE__GENERATED_C_CODE
72617
static wuffs_base__status
72618
wuffs_png__decoder__decode_iccp(
72619
    wuffs_png__decoder* self,
72620
    wuffs_base__io_buffer* a_src) {
72621
  wuffs_base__status status = wuffs_base__make_status(NULL);
72622
72623
  uint8_t v_c8 = 0;
72624
72625
  const uint8_t* iop_a_src = NULL;
72626
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
72627
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
72628
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
72629
  if (a_src && a_src->data.ptr) {
72630
    io0_a_src = a_src->data.ptr;
72631
    io1_a_src = io0_a_src + a_src->meta.ri;
72632
    iop_a_src = io1_a_src;
72633
    io2_a_src = io0_a_src + a_src->meta.wi;
72634
  }
72635
72636
  uint32_t coro_susp_point = self->private_impl.p_decode_iccp;
72637
  switch (coro_susp_point) {
72638
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
72639
72640
    while (true) {
72641
      if (self->private_impl.f_chunk_length <= 0u) {
72642
        status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
72643
        goto exit;
72644
      }
72645
      self->private_impl.f_chunk_length -= 1u;
72646
      {
72647
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
72648
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
72649
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
72650
          goto suspend;
72651
        }
72652
        uint8_t t_0 = *iop_a_src++;
72653
        v_c8 = t_0;
72654
      }
72655
      if (v_c8 == 0u) {
72656
        break;
72657
      }
72658
    }
72659
    if (self->private_impl.f_chunk_length <= 0u) {
72660
      status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
72661
      goto exit;
72662
    }
72663
    self->private_impl.f_chunk_length -= 1u;
72664
    {
72665
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
72666
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
72667
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
72668
        goto suspend;
72669
      }
72670
      uint8_t t_1 = *iop_a_src++;
72671
      v_c8 = t_1;
72672
    }
72673
    if (v_c8 != 0u) {
72674
      status = wuffs_base__make_status(wuffs_png__error__unsupported_png_compression_method);
72675
      goto exit;
72676
    }
72677
    self->private_impl.f_metadata_is_zlib_compressed = true;
72678
    self->private_impl.f_metadata_flavor = 4u;
72679
    self->private_impl.f_metadata_fourcc = 1229144912u;
72680
    self->private_impl.f_metadata_x = 0u;
72681
    self->private_impl.f_metadata_y = 0u;
72682
    self->private_impl.f_metadata_z = 0u;
72683
72684
    goto ok;
72685
    ok:
72686
    self->private_impl.p_decode_iccp = 0;
72687
    goto exit;
72688
  }
72689
72690
  goto suspend;
72691
  suspend:
72692
  self->private_impl.p_decode_iccp = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
72693
72694
  goto exit;
72695
  exit:
72696
  if (a_src && a_src->data.ptr) {
72697
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
72698
  }
72699
72700
  return status;
72701
}
72702
72703
// -------- func png.decoder.decode_plte
72704
72705
WUFFS_BASE__GENERATED_C_CODE
72706
static wuffs_base__status
72707
wuffs_png__decoder__decode_plte(
72708
    wuffs_png__decoder* self,
72709
    wuffs_base__io_buffer* a_src) {
72710
  wuffs_base__status status = wuffs_base__make_status(NULL);
72711
72712
  uint32_t v_num_entries = 0;
72713
  uint32_t v_i = 0;
72714
  uint32_t v_argb = 0;
72715
72716
  const uint8_t* iop_a_src = NULL;
72717
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
72718
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
72719
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
72720
  if (a_src && a_src->data.ptr) {
72721
    io0_a_src = a_src->data.ptr;
72722
    io1_a_src = io0_a_src + a_src->meta.ri;
72723
    iop_a_src = io1_a_src;
72724
    io2_a_src = io0_a_src + a_src->meta.wi;
72725
  }
72726
72727
  uint32_t coro_susp_point = self->private_impl.p_decode_plte;
72728
  if (coro_susp_point) {
72729
    v_num_entries = self->private_data.s_decode_plte.v_num_entries;
72730
    v_i = self->private_data.s_decode_plte.v_i;
72731
  }
72732
  switch (coro_susp_point) {
72733
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
72734
72735
    if ((self->private_impl.f_chunk_length > 768u) || ((self->private_impl.f_chunk_length % 3u) != 0u)) {
72736
      status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
72737
      goto exit;
72738
    }
72739
    v_num_entries = (((uint32_t)(self->private_impl.f_chunk_length)) / 3u);
72740
    self->private_impl.f_chunk_length = 0u;
72741
    while (v_i < v_num_entries) {
72742
      {
72743
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
72744
        uint32_t t_0;
72745
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) {
72746
          t_0 = ((uint32_t)(wuffs_base__peek_u24be__no_bounds_check(iop_a_src)));
72747
          iop_a_src += 3;
72748
        } else {
72749
          self->private_data.s_decode_plte.scratch = 0;
72750
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
72751
          while (true) {
72752
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
72753
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
72754
              goto suspend;
72755
            }
72756
            uint64_t* scratch = &self->private_data.s_decode_plte.scratch;
72757
            uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu));
72758
            *scratch >>= 8;
72759
            *scratch <<= 8;
72760
            *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0);
72761
            if (num_bits_0 == 16) {
72762
              t_0 = ((uint32_t)(*scratch >> 40));
72763
              break;
72764
            }
72765
            num_bits_0 += 8u;
72766
            *scratch |= ((uint64_t)(num_bits_0));
72767
          }
72768
        }
72769
        v_argb = t_0;
72770
      }
72771
      v_argb |= 4278190080u;
72772
      self->private_data.f_src_palette[((4u * v_i) + 0u)] = ((uint8_t)((v_argb >> 0u)));
72773
      self->private_data.f_src_palette[((4u * v_i) + 1u)] = ((uint8_t)((v_argb >> 8u)));
72774
      self->private_data.f_src_palette[((4u * v_i) + 2u)] = ((uint8_t)((v_argb >> 16u)));
72775
      self->private_data.f_src_palette[((4u * v_i) + 3u)] = ((uint8_t)((v_argb >> 24u)));
72776
      v_i += 1u;
72777
    }
72778
    while (v_i < 256u) {
72779
      self->private_data.f_src_palette[((4u * v_i) + 0u)] = 0u;
72780
      self->private_data.f_src_palette[((4u * v_i) + 1u)] = 0u;
72781
      self->private_data.f_src_palette[((4u * v_i) + 2u)] = 0u;
72782
      self->private_data.f_src_palette[((4u * v_i) + 3u)] = 255u;
72783
      v_i += 1u;
72784
    }
72785
72786
    goto ok;
72787
    ok:
72788
    self->private_impl.p_decode_plte = 0;
72789
    goto exit;
72790
  }
72791
72792
  goto suspend;
72793
  suspend:
72794
  self->private_impl.p_decode_plte = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
72795
  self->private_data.s_decode_plte.v_num_entries = v_num_entries;
72796
  self->private_data.s_decode_plte.v_i = v_i;
72797
72798
  goto exit;
72799
  exit:
72800
  if (a_src && a_src->data.ptr) {
72801
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
72802
  }
72803
72804
  return status;
72805
}
72806
72807
// -------- func png.decoder.decode_srgb
72808
72809
WUFFS_BASE__GENERATED_C_CODE
72810
static wuffs_base__status
72811
wuffs_png__decoder__decode_srgb(
72812
    wuffs_png__decoder* self,
72813
    wuffs_base__io_buffer* a_src) {
72814
  wuffs_base__status status = wuffs_base__make_status(NULL);
72815
72816
  const uint8_t* iop_a_src = NULL;
72817
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
72818
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
72819
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
72820
  if (a_src && a_src->data.ptr) {
72821
    io0_a_src = a_src->data.ptr;
72822
    io1_a_src = io0_a_src + a_src->meta.ri;
72823
    iop_a_src = io1_a_src;
72824
    io2_a_src = io0_a_src + a_src->meta.wi;
72825
  }
72826
72827
  uint32_t coro_susp_point = self->private_impl.p_decode_srgb;
72828
  switch (coro_susp_point) {
72829
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
72830
72831
    if (self->private_impl.f_chunk_length != 1u) {
72832
      status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
72833
      goto exit;
72834
    }
72835
    self->private_impl.f_chunk_length = 0u;
72836
    self->private_impl.f_metadata_flavor = 5u;
72837
    self->private_impl.f_metadata_fourcc = 1397901122u;
72838
    {
72839
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
72840
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
72841
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
72842
        goto suspend;
72843
      }
72844
      uint64_t t_0 = *iop_a_src++;
72845
      self->private_impl.f_metadata_x = t_0;
72846
    }
72847
    self->private_impl.f_metadata_y = 0u;
72848
    self->private_impl.f_metadata_z = 0u;
72849
72850
    goto ok;
72851
    ok:
72852
    self->private_impl.p_decode_srgb = 0;
72853
    goto exit;
72854
  }
72855
72856
  goto suspend;
72857
  suspend:
72858
  self->private_impl.p_decode_srgb = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
72859
72860
  goto exit;
72861
  exit:
72862
  if (a_src && a_src->data.ptr) {
72863
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
72864
  }
72865
72866
  return status;
72867
}
72868
72869
// -------- func png.decoder.decode_trns
72870
72871
WUFFS_BASE__GENERATED_C_CODE
72872
static wuffs_base__status
72873
wuffs_png__decoder__decode_trns(
72874
    wuffs_png__decoder* self,
72875
    wuffs_base__io_buffer* a_src) {
72876
  wuffs_base__status status = wuffs_base__make_status(NULL);
72877
72878
  uint32_t v_i = 0;
72879
  uint32_t v_n = 0;
72880
  uint64_t v_u = 0;
72881
72882
  const uint8_t* iop_a_src = NULL;
72883
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
72884
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
72885
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
72886
  if (a_src && a_src->data.ptr) {
72887
    io0_a_src = a_src->data.ptr;
72888
    io1_a_src = io0_a_src + a_src->meta.ri;
72889
    iop_a_src = io1_a_src;
72890
    io2_a_src = io0_a_src + a_src->meta.wi;
72891
  }
72892
72893
  uint32_t coro_susp_point = self->private_impl.p_decode_trns;
72894
  if (coro_susp_point) {
72895
    v_i = self->private_data.s_decode_trns.v_i;
72896
    v_n = self->private_data.s_decode_trns.v_n;
72897
  }
72898
  switch (coro_susp_point) {
72899
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
72900
72901
    if (self->private_impl.f_color_type == 0u) {
72902
      self->private_impl.choosy_filter_and_swizzle = (
72903
          &wuffs_png__decoder__filter_and_swizzle_tricky);
72904
      if (self->private_impl.f_depth <= 8u) {
72905
        self->private_impl.f_dst_pixfmt = 2164295816u;
72906
        self->private_impl.f_src_pixfmt = 2164295816u;
72907
      } else {
72908
        self->private_impl.f_dst_pixfmt = 2164308923u;
72909
        self->private_impl.f_src_pixfmt = 2164308923u;
72910
      }
72911
      if (self->private_impl.f_chunk_length != 2u) {
72912
        status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
72913
        goto exit;
72914
      }
72915
      self->private_impl.f_chunk_length = 0u;
72916
      {
72917
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
72918
        uint64_t t_0;
72919
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
72920
          t_0 = ((uint64_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src)));
72921
          iop_a_src += 2;
72922
        } else {
72923
          self->private_data.s_decode_trns.scratch = 0;
72924
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
72925
          while (true) {
72926
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
72927
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
72928
              goto suspend;
72929
            }
72930
            uint64_t* scratch = &self->private_data.s_decode_trns.scratch;
72931
            uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu));
72932
            *scratch >>= 8;
72933
            *scratch <<= 8;
72934
            *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0);
72935
            if (num_bits_0 == 8) {
72936
              t_0 = ((uint64_t)(*scratch >> 48));
72937
              break;
72938
            }
72939
            num_bits_0 += 8u;
72940
            *scratch |= ((uint64_t)(num_bits_0));
72941
          }
72942
        }
72943
        v_u = t_0;
72944
      }
72945
      if (self->private_impl.f_depth <= 1u) {
72946
        self->private_impl.f_remap_transparency = (((v_u & 1u) * 16777215u) | 4278190080u);
72947
      } else if (self->private_impl.f_depth <= 2u) {
72948
        self->private_impl.f_remap_transparency = (((v_u & 3u) * 5592405u) | 4278190080u);
72949
      } else if (self->private_impl.f_depth <= 4u) {
72950
        self->private_impl.f_remap_transparency = (((v_u & 15u) * 1118481u) | 4278190080u);
72951
      } else if (self->private_impl.f_depth <= 8u) {
72952
        self->private_impl.f_remap_transparency = (((v_u & 255u) * 65793u) | 4278190080u);
72953
      } else {
72954
        self->private_impl.f_remap_transparency = ((v_u * 4295032833u) | 18446462598732840960u);
72955
      }
72956
    } else if (self->private_impl.f_color_type == 2u) {
72957
      self->private_impl.choosy_filter_and_swizzle = (
72958
          &wuffs_png__decoder__filter_and_swizzle_tricky);
72959
      if (self->private_impl.f_depth <= 8u) {
72960
        self->private_impl.f_dst_pixfmt = 2164295816u;
72961
        self->private_impl.f_src_pixfmt = 2164295816u;
72962
      } else {
72963
        self->private_impl.f_dst_pixfmt = 2164308923u;
72964
        self->private_impl.f_src_pixfmt = 2164308923u;
72965
      }
72966
      if (self->private_impl.f_chunk_length != 6u) {
72967
        status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
72968
        goto exit;
72969
      }
72970
      self->private_impl.f_chunk_length = 0u;
72971
      {
72972
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
72973
        uint64_t t_1;
72974
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 6)) {
72975
          t_1 = ((uint64_t)(wuffs_base__peek_u48be__no_bounds_check(iop_a_src)));
72976
          iop_a_src += 6;
72977
        } else {
72978
          self->private_data.s_decode_trns.scratch = 0;
72979
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
72980
          while (true) {
72981
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
72982
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
72983
              goto suspend;
72984
            }
72985
            uint64_t* scratch = &self->private_data.s_decode_trns.scratch;
72986
            uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu));
72987
            *scratch >>= 8;
72988
            *scratch <<= 8;
72989
            *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1);
72990
            if (num_bits_1 == 40) {
72991
              t_1 = ((uint64_t)(*scratch >> 16));
72992
              break;
72993
            }
72994
            num_bits_1 += 8u;
72995
            *scratch |= ((uint64_t)(num_bits_1));
72996
          }
72997
        }
72998
        v_u = t_1;
72999
      }
73000
      if (self->private_impl.f_depth <= 8u) {
73001
        self->private_impl.f_remap_transparency = ((255u & (v_u >> 0u)) |
73002
            (65280u & (v_u >> 8u)) |
73003
            (16711680u & (v_u >> 16u)) |
73004
            4278190080u);
73005
      } else {
73006
        self->private_impl.f_remap_transparency = (v_u | 18446462598732840960u);
73007
      }
73008
    } else if (self->private_impl.f_color_type == 3u) {
73009
      self->private_impl.f_dst_pixfmt = 2164523016u;
73010
      self->private_impl.f_src_pixfmt = 2164523016u;
73011
      if (self->private_impl.f_chunk_length > 256u) {
73012
        status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
73013
        goto exit;
73014
      }
73015
      v_n = ((uint32_t)(self->private_impl.f_chunk_length));
73016
      self->private_impl.f_chunk_length = 0u;
73017
      while (v_i < v_n) {
73018
        {
73019
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
73020
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
73021
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
73022
            goto suspend;
73023
          }
73024
          uint8_t t_2 = *iop_a_src++;
73025
          self->private_data.f_src_palette[((4u * v_i) + 3u)] = t_2;
73026
        }
73027
        v_i += 1u;
73028
      }
73029
    } else {
73030
      status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
73031
      goto exit;
73032
    }
73033
73034
    goto ok;
73035
    ok:
73036
    self->private_impl.p_decode_trns = 0;
73037
    goto exit;
73038
  }
73039
73040
  goto suspend;
73041
  suspend:
73042
  self->private_impl.p_decode_trns = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
73043
  self->private_data.s_decode_trns.v_i = v_i;
73044
  self->private_data.s_decode_trns.v_n = v_n;
73045
73046
  goto exit;
73047
  exit:
73048
  if (a_src && a_src->data.ptr) {
73049
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
73050
  }
73051
73052
  return status;
73053
}
73054
73055
// -------- func png.decoder.decode_frame_config
73056
73057
WUFFS_BASE__GENERATED_C_CODE
73058
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
73059
wuffs_png__decoder__decode_frame_config(
73060
    wuffs_png__decoder* self,
73061
    wuffs_base__frame_config* a_dst,
73062
    wuffs_base__io_buffer* a_src) {
73063
  if (!self) {
73064
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
73065
  }
73066
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
73067
    return wuffs_base__make_status(
73068
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
73069
        ? wuffs_base__error__disabled_by_previous_error
73070
        : wuffs_base__error__initialize_not_called);
73071
  }
73072
  if (!a_src) {
73073
    self->private_impl.magic = WUFFS_BASE__DISABLED;
73074
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
73075
  }
73076
  if ((self->private_impl.active_coroutine != 0) &&
73077
      (self->private_impl.active_coroutine != 2)) {
73078
    self->private_impl.magic = WUFFS_BASE__DISABLED;
73079
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
73080
  }
73081
  self->private_impl.active_coroutine = 0;
73082
  wuffs_base__status status = wuffs_base__make_status(NULL);
73083
73084
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
73085
73086
  uint32_t coro_susp_point = self->private_impl.p_decode_frame_config;
73087
  switch (coro_susp_point) {
73088
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
73089
73090
    while (true) {
73091
      {
73092
        wuffs_base__status t_0 = wuffs_png__decoder__do_decode_frame_config(self, a_dst, a_src);
73093
        v_status = t_0;
73094
      }
73095
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
73096
        status = wuffs_base__make_status(wuffs_png__error__truncated_input);
73097
        goto exit;
73098
      }
73099
      status = v_status;
73100
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
73101
    }
73102
73103
    ok:
73104
    self->private_impl.p_decode_frame_config = 0;
73105
    goto exit;
73106
  }
73107
73108
  goto suspend;
73109
  suspend:
73110
  self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
73111
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0;
73112
73113
  goto exit;
73114
  exit:
73115
  if (wuffs_base__status__is_error(&status)) {
73116
    self->private_impl.magic = WUFFS_BASE__DISABLED;
73117
  }
73118
  return status;
73119
}
73120
73121
// -------- func png.decoder.do_decode_frame_config
73122
73123
WUFFS_BASE__GENERATED_C_CODE
73124
static wuffs_base__status
73125
wuffs_png__decoder__do_decode_frame_config(
73126
    wuffs_png__decoder* self,
73127
    wuffs_base__frame_config* a_dst,
73128
    wuffs_base__io_buffer* a_src) {
73129
  wuffs_base__status status = wuffs_base__make_status(NULL);
73130
73131
  uint32_t v_checksum_have = 0;
73132
  wuffs_base__pixel_format v_pixfmt = {0};
73133
73134
  const uint8_t* iop_a_src = NULL;
73135
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
73136
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
73137
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
73138
  if (a_src && a_src->data.ptr) {
73139
    io0_a_src = a_src->data.ptr;
73140
    io1_a_src = io0_a_src + a_src->meta.ri;
73141
    iop_a_src = io1_a_src;
73142
    io2_a_src = io0_a_src + a_src->meta.wi;
73143
  }
73144
73145
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config;
73146
  switch (coro_susp_point) {
73147
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
73148
73149
    if (((uint8_t)(self->private_impl.f_call_sequence & 16u)) != 0u) {
73150
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
73151
      goto exit;
73152
    } else if (self->private_impl.f_call_sequence == 32u) {
73153
    } else if (self->private_impl.f_call_sequence < 32u) {
73154
      if (a_src) {
73155
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
73156
      }
73157
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
73158
      status = wuffs_png__decoder__do_decode_image_config(self, NULL, a_src);
73159
      if (a_src) {
73160
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
73161
      }
73162
      if (status.repr) {
73163
        goto suspend;
73164
      }
73165
    } else if (self->private_impl.f_call_sequence == 40u) {
73166
      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)))) {
73167
        status = wuffs_base__make_status(wuffs_base__error__bad_restart);
73168
        goto exit;
73169
      }
73170
    } else if (self->private_impl.f_call_sequence == 64u) {
73171
      if (a_src) {
73172
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
73173
      }
73174
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
73175
      status = wuffs_png__decoder__skip_frame(self, a_src);
73176
      if (a_src) {
73177
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
73178
      }
73179
      if (status.repr) {
73180
        goto suspend;
73181
      }
73182
    } else {
73183
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
73184
      goto ok;
73185
    }
73186
    if (self->private_impl.f_metadata_fourcc != 0u) {
73187
      self->private_impl.f_call_sequence = 48u;
73188
      status = wuffs_base__make_status(wuffs_base__note__metadata_reported);
73189
      goto ok;
73190
    }
73191
    if (self->private_impl.f_num_decoded_frame_configs_value == 0u) {
73192
      self->private_impl.f_frame_rect_x0 = self->private_impl.f_first_rect_x0;
73193
      self->private_impl.f_frame_rect_y0 = self->private_impl.f_first_rect_y0;
73194
      self->private_impl.f_frame_rect_x1 = self->private_impl.f_first_rect_x1;
73195
      self->private_impl.f_frame_rect_y1 = self->private_impl.f_first_rect_y1;
73196
      self->private_impl.f_frame_config_io_position = self->private_impl.f_first_config_io_position;
73197
      self->private_impl.f_frame_duration = self->private_impl.f_first_duration;
73198
      self->private_impl.f_frame_disposal = self->private_impl.f_first_disposal;
73199
      self->private_impl.f_frame_overwrite_instead_of_blend = self->private_impl.f_first_overwrite_instead_of_blend;
73200
    } else {
73201
      while (true) {
73202
        {
73203
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
73204
          uint32_t t_0;
73205
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
73206
            t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
73207
            iop_a_src += 4;
73208
          } else {
73209
            self->private_data.s_do_decode_frame_config.scratch = 0;
73210
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
73211
            while (true) {
73212
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
73213
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
73214
                goto suspend;
73215
              }
73216
              uint64_t* scratch = &self->private_data.s_do_decode_frame_config.scratch;
73217
              uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu));
73218
              *scratch >>= 8;
73219
              *scratch <<= 8;
73220
              *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0);
73221
              if (num_bits_0 == 24) {
73222
                t_0 = ((uint32_t)(*scratch >> 32));
73223
                break;
73224
              }
73225
              num_bits_0 += 8u;
73226
              *scratch |= ((uint64_t)(num_bits_0));
73227
            }
73228
          }
73229
          self->private_impl.f_chunk_length = t_0;
73230
        }
73231
        {
73232
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
73233
          uint32_t t_1;
73234
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
73235
            t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
73236
            iop_a_src += 4;
73237
          } else {
73238
            self->private_data.s_do_decode_frame_config.scratch = 0;
73239
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
73240
            while (true) {
73241
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
73242
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
73243
                goto suspend;
73244
              }
73245
              uint64_t* scratch = &self->private_data.s_do_decode_frame_config.scratch;
73246
              uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
73247
              *scratch <<= 8;
73248
              *scratch >>= 8;
73249
              *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
73250
              if (num_bits_1 == 24) {
73251
                t_1 = ((uint32_t)(*scratch));
73252
                break;
73253
              }
73254
              num_bits_1 += 8u;
73255
              *scratch |= ((uint64_t)(num_bits_1)) << 56;
73256
            }
73257
          }
73258
          self->private_impl.f_chunk_type = t_1;
73259
        }
73260
        if (self->private_impl.f_chunk_type == 1145980233u) {
73261
          if (self->private_impl.f_chunk_length != 0u) {
73262
            status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
73263
            goto exit;
73264
          }
73265
          {
73266
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
73267
            uint32_t t_2;
73268
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
73269
              t_2 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
73270
              iop_a_src += 4;
73271
            } else {
73272
              self->private_data.s_do_decode_frame_config.scratch = 0;
73273
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
73274
              while (true) {
73275
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
73276
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
73277
                  goto suspend;
73278
                }
73279
                uint64_t* scratch = &self->private_data.s_do_decode_frame_config.scratch;
73280
                uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56));
73281
                *scratch <<= 8;
73282
                *scratch >>= 8;
73283
                *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2;
73284
                if (num_bits_2 == 24) {
73285
                  t_2 = ((uint32_t)(*scratch));
73286
                  break;
73287
                }
73288
                num_bits_2 += 8u;
73289
                *scratch |= ((uint64_t)(num_bits_2)) << 56;
73290
              }
73291
            }
73292
            v_checksum_have = t_2;
73293
          }
73294
          if ( ! self->private_impl.f_ignore_checksum && (v_checksum_have != 2187346606u)) {
73295
            status = wuffs_base__make_status(wuffs_png__error__bad_checksum);
73296
            goto exit;
73297
          }
73298
          self->private_impl.f_call_sequence = 96u;
73299
          status = wuffs_base__make_status(wuffs_base__note__end_of_data);
73300
          goto ok;
73301
        } else if (self->private_impl.f_chunk_type == 1413571686u) {
73302
          status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
73303
          goto exit;
73304
        } else if (self->private_impl.f_chunk_type == 1280598886u) {
73305
          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));
73306
          if (a_src) {
73307
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
73308
          }
73309
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
73310
          status = wuffs_png__decoder__decode_fctl(self, a_src);
73311
          if (a_src) {
73312
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
73313
          }
73314
          if (status.repr) {
73315
            goto suspend;
73316
          }
73317
          self->private_data.s_do_decode_frame_config.scratch = 4u;
73318
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
73319
          if (self->private_data.s_do_decode_frame_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
73320
            self->private_data.s_do_decode_frame_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
73321
            iop_a_src = io2_a_src;
73322
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
73323
            goto suspend;
73324
          }
73325
          iop_a_src += self->private_data.s_do_decode_frame_config.scratch;
73326
          break;
73327
        }
73328
        if (a_src) {
73329
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
73330
        }
73331
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11);
73332
        status = wuffs_png__decoder__decode_other_chunk(self, a_src, true);
73333
        if (a_src) {
73334
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
73335
        }
73336
        if (status.repr) {
73337
          goto suspend;
73338
        }
73339
        if (self->private_impl.f_metadata_fourcc != 0u) {
73340
          self->private_impl.f_call_sequence = 48u;
73341
          status = wuffs_base__make_status(wuffs_base__note__metadata_reported);
73342
          goto ok;
73343
        }
73344
        self->private_data.s_do_decode_frame_config.scratch = 4u;
73345
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12);
73346
        if (self->private_data.s_do_decode_frame_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
73347
          self->private_data.s_do_decode_frame_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
73348
          iop_a_src = io2_a_src;
73349
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
73350
          goto suspend;
73351
        }
73352
        iop_a_src += self->private_data.s_do_decode_frame_config.scratch;
73353
        self->private_impl.f_chunk_length = 0u;
73354
      }
73355
    }
73356
    if (a_dst != NULL) {
73357
      v_pixfmt = wuffs_base__utility__make_pixel_format(self->private_impl.f_src_pixfmt);
73358
      wuffs_base__frame_config__set(
73359
          a_dst,
73360
          wuffs_base__utility__make_rect_ie_u32(
73361
          self->private_impl.f_frame_rect_x0,
73362
          self->private_impl.f_frame_rect_y0,
73363
          self->private_impl.f_frame_rect_x1,
73364
          self->private_impl.f_frame_rect_y1),
73365
          ((wuffs_base__flicks)(self->private_impl.f_frame_duration)),
73366
          ((uint64_t)(self->private_impl.f_num_decoded_frame_configs_value)),
73367
          self->private_impl.f_frame_config_io_position,
73368
          self->private_impl.f_frame_disposal,
73369
          ((self->private_impl.f_color_type <= 3u) &&  ! self->private_impl.f_seen_trns),
73370
          self->private_impl.f_frame_overwrite_instead_of_blend,
73371
          wuffs_base__pixel_format__default_background_color(&v_pixfmt));
73372
    }
73373
    wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_num_decoded_frame_configs_value, 1u);
73374
    self->private_impl.f_call_sequence = 64u;
73375
73376
    ok:
73377
    self->private_impl.p_do_decode_frame_config = 0;
73378
    goto exit;
73379
  }
73380
73381
  goto suspend;
73382
  suspend:
73383
  self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
73384
73385
  goto exit;
73386
  exit:
73387
  if (a_src && a_src->data.ptr) {
73388
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
73389
  }
73390
73391
  return status;
73392
}
73393
73394
// -------- func png.decoder.skip_frame
73395
73396
WUFFS_BASE__GENERATED_C_CODE
73397
static wuffs_base__status
73398
wuffs_png__decoder__skip_frame(
73399
    wuffs_png__decoder* self,
73400
    wuffs_base__io_buffer* a_src) {
73401
  wuffs_base__status status = wuffs_base__make_status(NULL);
73402
73403
  uint32_t v_seq_num = 0;
73404
73405
  const uint8_t* iop_a_src = NULL;
73406
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
73407
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
73408
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
73409
  if (a_src && a_src->data.ptr) {
73410
    io0_a_src = a_src->data.ptr;
73411
    io1_a_src = io0_a_src + a_src->meta.ri;
73412
    iop_a_src = io1_a_src;
73413
    io2_a_src = io0_a_src + a_src->meta.wi;
73414
  }
73415
73416
  uint32_t coro_susp_point = self->private_impl.p_skip_frame;
73417
  switch (coro_susp_point) {
73418
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
73419
73420
    self->private_impl.f_chunk_type_array[0u] = 0u;
73421
    self->private_impl.f_chunk_type_array[1u] = 0u;
73422
    self->private_impl.f_chunk_type_array[2u] = 0u;
73423
    self->private_impl.f_chunk_type_array[3u] = 0u;
73424
    while (true) {
73425
      if (((uint64_t)(io2_a_src - iop_a_src)) < 8u) {
73426
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
73427
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
73428
        continue;
73429
      }
73430
      self->private_impl.f_chunk_length = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
73431
      self->private_impl.f_chunk_type = ((uint32_t)((wuffs_base__peek_u64le__no_bounds_check(iop_a_src) >> 32u)));
73432
      if (self->private_impl.f_chunk_type == 1413563465u) {
73433
        if (self->private_impl.f_chunk_type_array[0u] == 102u) {
73434
          status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
73435
          goto exit;
73436
        }
73437
        self->private_impl.f_chunk_type_array[0u] = 73u;
73438
        self->private_impl.f_chunk_type_array[1u] = 68u;
73439
        self->private_impl.f_chunk_type_array[2u] = 65u;
73440
        self->private_impl.f_chunk_type_array[3u] = 84u;
73441
      } else if (self->private_impl.f_chunk_type == 1413571686u) {
73442
        if (self->private_impl.f_chunk_type_array[0u] == 73u) {
73443
          status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
73444
          goto exit;
73445
        }
73446
        self->private_impl.f_chunk_type_array[0u] = 102u;
73447
        self->private_impl.f_chunk_type_array[1u] = 100u;
73448
        self->private_impl.f_chunk_type_array[2u] = 65u;
73449
        self->private_impl.f_chunk_type_array[3u] = 84u;
73450
        if (self->private_impl.f_chunk_length < 4u) {
73451
          status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
73452
          goto exit;
73453
        }
73454
        self->private_impl.f_chunk_length -= 4u;
73455
        iop_a_src += 8u;
73456
        {
73457
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
73458
          uint32_t t_0;
73459
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
73460
            t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
73461
            iop_a_src += 4;
73462
          } else {
73463
            self->private_data.s_skip_frame.scratch = 0;
73464
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
73465
            while (true) {
73466
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
73467
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
73468
                goto suspend;
73469
              }
73470
              uint64_t* scratch = &self->private_data.s_skip_frame.scratch;
73471
              uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu));
73472
              *scratch >>= 8;
73473
              *scratch <<= 8;
73474
              *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0);
73475
              if (num_bits_0 == 24) {
73476
                t_0 = ((uint32_t)(*scratch >> 32));
73477
                break;
73478
              }
73479
              num_bits_0 += 8u;
73480
              *scratch |= ((uint64_t)(num_bits_0));
73481
            }
73482
          }
73483
          v_seq_num = t_0;
73484
        }
73485
        if (v_seq_num != self->private_impl.f_next_animation_seq_num) {
73486
          status = wuffs_base__make_status(wuffs_png__error__bad_animation_sequence_number);
73487
          goto exit;
73488
        } else if (self->private_impl.f_next_animation_seq_num >= 4294967295u) {
73489
          status = wuffs_base__make_status(wuffs_png__error__unsupported_png_file);
73490
          goto exit;
73491
        }
73492
        self->private_impl.f_next_animation_seq_num += 1u;
73493
        self->private_data.s_skip_frame.scratch = (((uint64_t)(self->private_impl.f_chunk_length)) + 4u);
73494
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
73495
        if (self->private_data.s_skip_frame.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
73496
          self->private_data.s_skip_frame.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
73497
          iop_a_src = io2_a_src;
73498
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
73499
          goto suspend;
73500
        }
73501
        iop_a_src += self->private_data.s_skip_frame.scratch;
73502
        self->private_impl.f_chunk_length = 0u;
73503
        continue;
73504
      } else if (self->private_impl.f_chunk_type_array[0u] != 0u) {
73505
        break;
73506
      } else if (self->private_impl.f_chunk_type == 1280598886u) {
73507
        status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
73508
        goto exit;
73509
      }
73510
      self->private_data.s_skip_frame.scratch = (((uint64_t)(self->private_impl.f_chunk_length)) + 12u);
73511
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
73512
      if (self->private_data.s_skip_frame.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
73513
        self->private_data.s_skip_frame.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
73514
        iop_a_src = io2_a_src;
73515
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
73516
        goto suspend;
73517
      }
73518
      iop_a_src += self->private_data.s_skip_frame.scratch;
73519
      self->private_impl.f_chunk_length = 0u;
73520
    }
73521
    wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u);
73522
    self->private_impl.f_call_sequence = 32u;
73523
73524
    ok:
73525
    self->private_impl.p_skip_frame = 0;
73526
    goto exit;
73527
  }
73528
73529
  goto suspend;
73530
  suspend:
73531
  self->private_impl.p_skip_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
73532
73533
  goto exit;
73534
  exit:
73535
  if (a_src && a_src->data.ptr) {
73536
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
73537
  }
73538
73539
  return status;
73540
}
73541
73542
// -------- func png.decoder.decode_frame
73543
73544
WUFFS_BASE__GENERATED_C_CODE
73545
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
73546
wuffs_png__decoder__decode_frame(
73547
    wuffs_png__decoder* self,
73548
    wuffs_base__pixel_buffer* a_dst,
73549
    wuffs_base__io_buffer* a_src,
73550
    wuffs_base__pixel_blend a_blend,
73551
    wuffs_base__slice_u8 a_workbuf,
73552
    wuffs_base__decode_frame_options* a_opts) {
73553
  if (!self) {
73554
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
73555
  }
73556
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
73557
    return wuffs_base__make_status(
73558
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
73559
        ? wuffs_base__error__disabled_by_previous_error
73560
        : wuffs_base__error__initialize_not_called);
73561
  }
73562
  if (!a_dst || !a_src) {
73563
    self->private_impl.magic = WUFFS_BASE__DISABLED;
73564
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
73565
  }
73566
  if ((self->private_impl.active_coroutine != 0) &&
73567
      (self->private_impl.active_coroutine != 3)) {
73568
    self->private_impl.magic = WUFFS_BASE__DISABLED;
73569
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
73570
  }
73571
  self->private_impl.active_coroutine = 0;
73572
  wuffs_base__status status = wuffs_base__make_status(NULL);
73573
73574
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
73575
73576
  uint32_t coro_susp_point = self->private_impl.p_decode_frame;
73577
  switch (coro_susp_point) {
73578
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
73579
73580
    while (true) {
73581
      {
73582
        wuffs_base__status t_0 = wuffs_png__decoder__do_decode_frame(self,
73583
            a_dst,
73584
            a_src,
73585
            a_blend,
73586
            a_workbuf,
73587
            a_opts);
73588
        v_status = t_0;
73589
      }
73590
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
73591
        status = wuffs_base__make_status(wuffs_png__error__truncated_input);
73592
        goto exit;
73593
      }
73594
      status = v_status;
73595
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
73596
    }
73597
73598
    ok:
73599
    self->private_impl.p_decode_frame = 0;
73600
    goto exit;
73601
  }
73602
73603
  goto suspend;
73604
  suspend:
73605
  self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
73606
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0;
73607
73608
  goto exit;
73609
  exit:
73610
  if (wuffs_base__status__is_error(&status)) {
73611
    self->private_impl.magic = WUFFS_BASE__DISABLED;
73612
  }
73613
  return status;
73614
}
73615
73616
// -------- func png.decoder.do_decode_frame
73617
73618
WUFFS_BASE__GENERATED_C_CODE
73619
static wuffs_base__status
73620
wuffs_png__decoder__do_decode_frame(
73621
    wuffs_png__decoder* self,
73622
    wuffs_base__pixel_buffer* a_dst,
73623
    wuffs_base__io_buffer* a_src,
73624
    wuffs_base__pixel_blend a_blend,
73625
    wuffs_base__slice_u8 a_workbuf,
73626
    wuffs_base__decode_frame_options* a_opts) {
73627
  wuffs_base__status status = wuffs_base__make_status(NULL);
73628
73629
  uint32_t v_seq_num = 0;
73630
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
73631
  uint32_t v_pass_width = 0;
73632
  uint32_t v_pass_height = 0;
73633
73634
  const uint8_t* iop_a_src = NULL;
73635
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
73636
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
73637
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
73638
  if (a_src && a_src->data.ptr) {
73639
    io0_a_src = a_src->data.ptr;
73640
    io1_a_src = io0_a_src + a_src->meta.ri;
73641
    iop_a_src = io1_a_src;
73642
    io2_a_src = io0_a_src + a_src->meta.wi;
73643
  }
73644
73645
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame;
73646
  switch (coro_susp_point) {
73647
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
73648
73649
    if (((uint8_t)(self->private_impl.f_call_sequence & 16u)) != 0u) {
73650
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
73651
      goto exit;
73652
    } else if (self->private_impl.f_call_sequence >= 96u) {
73653
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
73654
      goto ok;
73655
    } else if (self->private_impl.f_call_sequence != 64u) {
73656
      if (a_src) {
73657
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
73658
      }
73659
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
73660
      status = wuffs_png__decoder__do_decode_frame_config(self, NULL, a_src);
73661
      if (a_src) {
73662
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
73663
      }
73664
      if (status.repr) {
73665
        goto suspend;
73666
      }
73667
    }
73668
    while (true) {
73669
      if (((uint64_t)(io2_a_src - iop_a_src)) < 8u) {
73670
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
73671
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2);
73672
        continue;
73673
      }
73674
      self->private_impl.f_chunk_length = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
73675
      self->private_impl.f_chunk_type = ((uint32_t)((wuffs_base__peek_u64le__no_bounds_check(iop_a_src) >> 32u)));
73676
      if (self->private_impl.f_chunk_type == 1413563465u) {
73677
        self->private_impl.f_chunk_type_array[0u] = 73u;
73678
        self->private_impl.f_chunk_type_array[1u] = 68u;
73679
        self->private_impl.f_chunk_type_array[2u] = 65u;
73680
        self->private_impl.f_chunk_type_array[3u] = 84u;
73681
        iop_a_src += 8u;
73682
        if ( ! self->private_impl.f_ignore_checksum) {
73683
          wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32,
73684
              sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
73685
          wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__make_slice_u8(self->private_impl.f_chunk_type_array, 4));
73686
        }
73687
        break;
73688
      } else if (self->private_impl.f_chunk_type == 1413571686u) {
73689
        self->private_impl.f_chunk_type_array[0u] = 102u;
73690
        self->private_impl.f_chunk_type_array[1u] = 100u;
73691
        self->private_impl.f_chunk_type_array[2u] = 65u;
73692
        self->private_impl.f_chunk_type_array[3u] = 84u;
73693
        if (self->private_impl.f_chunk_length < 4u) {
73694
          status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
73695
          goto exit;
73696
        }
73697
        self->private_impl.f_chunk_length -= 4u;
73698
        iop_a_src += 8u;
73699
        {
73700
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
73701
          uint32_t t_0;
73702
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
73703
            t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
73704
            iop_a_src += 4;
73705
          } else {
73706
            self->private_data.s_do_decode_frame.scratch = 0;
73707
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
73708
            while (true) {
73709
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
73710
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
73711
                goto suspend;
73712
              }
73713
              uint64_t* scratch = &self->private_data.s_do_decode_frame.scratch;
73714
              uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu));
73715
              *scratch >>= 8;
73716
              *scratch <<= 8;
73717
              *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0);
73718
              if (num_bits_0 == 24) {
73719
                t_0 = ((uint32_t)(*scratch >> 32));
73720
                break;
73721
              }
73722
              num_bits_0 += 8u;
73723
              *scratch |= ((uint64_t)(num_bits_0));
73724
            }
73725
          }
73726
          v_seq_num = t_0;
73727
        }
73728
        if (v_seq_num != self->private_impl.f_next_animation_seq_num) {
73729
          status = wuffs_base__make_status(wuffs_png__error__bad_animation_sequence_number);
73730
          goto exit;
73731
        } else if (self->private_impl.f_next_animation_seq_num >= 4294967295u) {
73732
          status = wuffs_base__make_status(wuffs_png__error__unsupported_png_file);
73733
          goto exit;
73734
        }
73735
        self->private_impl.f_next_animation_seq_num += 1u;
73736
        break;
73737
      } else if (self->private_impl.f_chunk_type == 1280598886u) {
73738
        status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
73739
        goto exit;
73740
      }
73741
      self->private_data.s_do_decode_frame.scratch = (((uint64_t)(self->private_impl.f_chunk_length)) + 12u);
73742
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
73743
      if (self->private_data.s_do_decode_frame.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
73744
        self->private_data.s_do_decode_frame.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
73745
        iop_a_src = io2_a_src;
73746
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
73747
        goto suspend;
73748
      }
73749
      iop_a_src += self->private_data.s_do_decode_frame.scratch;
73750
      self->private_impl.f_chunk_length = 0u;
73751
    }
73752
    if (self->private_impl.f_zlib_is_dirty) {
73753
      wuffs_private_impl__ignore_status(wuffs_zlib__decoder__initialize(&self->private_data.f_zlib,
73754
          sizeof (wuffs_zlib__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
73755
      if (self->private_impl.f_ignore_checksum) {
73756
        wuffs_zlib__decoder__set_quirk(&self->private_data.f_zlib, 1u, 1u);
73757
      }
73758
    }
73759
    self->private_impl.f_zlib_is_dirty = true;
73760
    v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler,
73761
        wuffs_base__pixel_buffer__pixel_format(a_dst),
73762
        wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)),
73763
        wuffs_base__utility__make_pixel_format(self->private_impl.f_src_pixfmt),
73764
        wuffs_base__make_slice_u8(self->private_data.f_src_palette, 1024),
73765
        a_blend);
73766
    if ( ! wuffs_base__status__is_ok(&v_status)) {
73767
      status = v_status;
73768
      if (wuffs_base__status__is_error(&status)) {
73769
        goto exit;
73770
      } else if (wuffs_base__status__is_suspension(&status)) {
73771
        status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
73772
        goto exit;
73773
      }
73774
      goto ok;
73775
    }
73776
    self->private_impl.f_workbuf_hist_pos_base = 0u;
73777
    while (true) {
73778
      if (self->private_impl.f_chunk_type_array[0u] == 73u) {
73779
        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]));
73780
        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]));
73781
      } else {
73782
        v_pass_width = (16777215u & ((uint32_t)(self->private_impl.f_frame_rect_x1 - self->private_impl.f_frame_rect_x0)));
73783
        v_pass_height = (16777215u & ((uint32_t)(self->private_impl.f_frame_rect_y1 - self->private_impl.f_frame_rect_y0)));
73784
      }
73785
      if ((v_pass_width > 0u) && (v_pass_height > 0u)) {
73786
        self->private_impl.f_pass_bytes_per_row = wuffs_png__decoder__calculate_bytes_per_row(self, v_pass_width);
73787
        self->private_impl.f_pass_workbuf_length = (((uint64_t)(v_pass_height)) * (1u + self->private_impl.f_pass_bytes_per_row));
73788
        while (true) {
73789
          {
73790
            if (a_src) {
73791
              a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
73792
            }
73793
            wuffs_base__status t_1 = wuffs_png__decoder__decode_pass(self, a_src, a_workbuf);
73794
            v_status = t_1;
73795
            if (a_src) {
73796
              iop_a_src = a_src->data.ptr + a_src->meta.ri;
73797
            }
73798
          }
73799
          if (wuffs_base__status__is_ok(&v_status)) {
73800
            break;
73801
          } else if (wuffs_base__status__is_error(&v_status) || ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed))) {
73802
            if (self->private_impl.f_workbuf_wi <= ((uint64_t)(a_workbuf.len))) {
73803
              wuffs_png__decoder__filter_and_swizzle(self, a_dst, wuffs_base__slice_u8__subslice_j(a_workbuf, self->private_impl.f_workbuf_wi));
73804
            }
73805
            if (v_status.repr == wuffs_base__suspension__short_read) {
73806
              status = wuffs_base__make_status(wuffs_png__error__truncated_input);
73807
              goto exit;
73808
            }
73809
          }
73810
          status = v_status;
73811
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6);
73812
        }
73813
        v_status = wuffs_png__decoder__filter_and_swizzle(self, a_dst, a_workbuf);
73814
        if ( ! wuffs_base__status__is_ok(&v_status)) {
73815
          status = v_status;
73816
          if (wuffs_base__status__is_error(&status)) {
73817
            goto exit;
73818
          } else if (wuffs_base__status__is_suspension(&status)) {
73819
            status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
73820
            goto exit;
73821
          }
73822
          goto ok;
73823
        }
73824
        self->private_impl.f_workbuf_hist_pos_base += self->private_impl.f_pass_workbuf_length;
73825
      }
73826
      if ((self->private_impl.f_interlace_pass == 0u) || (self->private_impl.f_interlace_pass >= 7u)) {
73827
        break;
73828
      }
73829
#if defined(__GNUC__)
73830
#pragma GCC diagnostic push
73831
#pragma GCC diagnostic ignored "-Wconversion"
73832
#endif
73833
      self->private_impl.f_interlace_pass += 1u;
73834
#if defined(__GNUC__)
73835
#pragma GCC diagnostic pop
73836
#endif
73837
    }
73838
    wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u);
73839
    self->private_impl.f_call_sequence = 32u;
73840
73841
    ok:
73842
    self->private_impl.p_do_decode_frame = 0;
73843
    goto exit;
73844
  }
73845
73846
  goto suspend;
73847
  suspend:
73848
  self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
73849
73850
  goto exit;
73851
  exit:
73852
  if (a_src && a_src->data.ptr) {
73853
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
73854
  }
73855
73856
  return status;
73857
}
73858
73859
// -------- func png.decoder.decode_pass
73860
73861
WUFFS_BASE__GENERATED_C_CODE
73862
static wuffs_base__status
73863
wuffs_png__decoder__decode_pass(
73864
    wuffs_png__decoder* self,
73865
    wuffs_base__io_buffer* a_src,
73866
    wuffs_base__slice_u8 a_workbuf) {
73867
  wuffs_base__status status = wuffs_base__make_status(NULL);
73868
73869
  wuffs_base__io_buffer u_w = wuffs_base__empty_io_buffer();
73870
  wuffs_base__io_buffer* v_w = &u_w;
73871
  uint8_t* iop_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
73872
  uint8_t* io0_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
73873
  uint8_t* io1_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
73874
  uint8_t* io2_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
73875
  uint64_t v_w_mark = 0;
73876
  uint64_t v_r_mark = 0;
73877
  wuffs_base__status v_zlib_status = wuffs_base__make_status(NULL);
73878
  uint32_t v_checksum_have = 0;
73879
  uint32_t v_checksum_want = 0;
73880
  uint32_t v_seq_num = 0;
73881
73882
  const uint8_t* iop_a_src = NULL;
73883
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
73884
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
73885
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
73886
  if (a_src && a_src->data.ptr) {
73887
    io0_a_src = a_src->data.ptr;
73888
    io1_a_src = io0_a_src + a_src->meta.ri;
73889
    iop_a_src = io1_a_src;
73890
    io2_a_src = io0_a_src + a_src->meta.wi;
73891
  }
73892
73893
  uint32_t coro_susp_point = self->private_impl.p_decode_pass;
73894
  switch (coro_susp_point) {
73895
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
73896
73897
    self->private_impl.f_workbuf_wi = 0u;
73898
    while (true) {
73899
      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)))) {
73900
        status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length);
73901
        goto exit;
73902
      }
73903
      {
73904
        wuffs_base__io_buffer* o_0_v_w = v_w;
73905
        uint8_t* o_0_iop_v_w = iop_v_w;
73906
        uint8_t* o_0_io0_v_w = io0_v_w;
73907
        uint8_t* o_0_io1_v_w = io1_v_w;
73908
        uint8_t* o_0_io2_v_w = io2_v_w;
73909
        v_w = wuffs_private_impl__io_writer__set(
73910
            &u_w,
73911
            &iop_v_w,
73912
            &io0_v_w,
73913
            &io1_v_w,
73914
            &io2_v_w,
73915
            wuffs_base__slice_u8__subslice_ij(a_workbuf,
73916
            self->private_impl.f_workbuf_wi,
73917
            self->private_impl.f_pass_workbuf_length),
73918
            ((uint64_t)(self->private_impl.f_workbuf_hist_pos_base + self->private_impl.f_workbuf_wi)));
73919
        {
73920
          const bool o_1_closed_a_src = a_src->meta.closed;
73921
          const uint8_t* o_1_io2_a_src = io2_a_src;
73922
          wuffs_private_impl__io_reader__limit(&io2_a_src, iop_a_src,
73923
              ((uint64_t)(self->private_impl.f_chunk_length)));
73924
          if (a_src) {
73925
            size_t n = ((size_t)(io2_a_src - a_src->data.ptr));
73926
            a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n);
73927
            a_src->meta.wi = n;
73928
          }
73929
          v_w_mark = ((uint64_t)(iop_v_w - io0_v_w));
73930
          v_r_mark = ((uint64_t)(iop_a_src - io0_a_src));
73931
          {
73932
            u_w.meta.wi = ((size_t)(iop_v_w - u_w.data.ptr));
73933
            if (a_src) {
73934
              a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
73935
            }
73936
            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());
73937
            v_zlib_status = t_0;
73938
            iop_v_w = u_w.data.ptr + u_w.meta.wi;
73939
            if (a_src) {
73940
              iop_a_src = a_src->data.ptr + a_src->meta.ri;
73941
            }
73942
          }
73943
          if ( ! self->private_impl.f_ignore_checksum) {
73944
            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));
73945
          }
73946
          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))))));
73947
          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))));
73948
          io2_a_src = o_1_io2_a_src;
73949
          if (a_src) {
73950
            a_src->meta.closed = o_1_closed_a_src;
73951
            a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr));
73952
          }
73953
        }
73954
        v_w = o_0_v_w;
73955
        iop_v_w = o_0_iop_v_w;
73956
        io0_v_w = o_0_io0_v_w;
73957
        io1_v_w = o_0_io1_v_w;
73958
        io2_v_w = o_0_io2_v_w;
73959
      }
73960
      if (wuffs_base__status__is_ok(&v_zlib_status)) {
73961
        if (self->private_impl.f_chunk_length > 0u) {
73962
          status = wuffs_base__make_status(wuffs_base__error__too_much_data);
73963
          goto exit;
73964
        }
73965
        {
73966
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
73967
          uint32_t t_1;
73968
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
73969
            t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
73970
            iop_a_src += 4;
73971
          } else {
73972
            self->private_data.s_decode_pass.scratch = 0;
73973
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
73974
            while (true) {
73975
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
73976
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
73977
                goto suspend;
73978
              }
73979
              uint64_t* scratch = &self->private_data.s_decode_pass.scratch;
73980
              uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu));
73981
              *scratch >>= 8;
73982
              *scratch <<= 8;
73983
              *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1);
73984
              if (num_bits_1 == 24) {
73985
                t_1 = ((uint32_t)(*scratch >> 32));
73986
                break;
73987
              }
73988
              num_bits_1 += 8u;
73989
              *scratch |= ((uint64_t)(num_bits_1));
73990
            }
73991
          }
73992
          v_checksum_want = t_1;
73993
        }
73994
        if ( ! self->private_impl.f_ignore_checksum && (self->private_impl.f_chunk_type_array[0u] == 73u)) {
73995
          v_checksum_have = wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__utility__empty_slice_u8());
73996
          if (v_checksum_have != v_checksum_want) {
73997
            status = wuffs_base__make_status(wuffs_png__error__bad_checksum);
73998
            goto exit;
73999
          }
74000
        }
74001
        break;
74002
      } else if (v_zlib_status.repr == wuffs_base__suspension__short_write) {
74003
        if ((1u <= self->private_impl.f_interlace_pass) && (self->private_impl.f_interlace_pass <= 6u)) {
74004
          break;
74005
        }
74006
        status = wuffs_base__make_status(wuffs_base__error__too_much_data);
74007
        goto exit;
74008
      } else if (v_zlib_status.repr != wuffs_base__suspension__short_read) {
74009
        status = v_zlib_status;
74010
        if (wuffs_base__status__is_error(&status)) {
74011
          goto exit;
74012
        } else if (wuffs_base__status__is_suspension(&status)) {
74013
          status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
74014
          goto exit;
74015
        }
74016
        goto ok;
74017
      } else if (self->private_impl.f_chunk_length == 0u) {
74018
        {
74019
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
74020
          uint32_t t_2;
74021
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
74022
            t_2 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
74023
            iop_a_src += 4;
74024
          } else {
74025
            self->private_data.s_decode_pass.scratch = 0;
74026
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
74027
            while (true) {
74028
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
74029
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
74030
                goto suspend;
74031
              }
74032
              uint64_t* scratch = &self->private_data.s_decode_pass.scratch;
74033
              uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu));
74034
              *scratch >>= 8;
74035
              *scratch <<= 8;
74036
              *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2);
74037
              if (num_bits_2 == 24) {
74038
                t_2 = ((uint32_t)(*scratch >> 32));
74039
                break;
74040
              }
74041
              num_bits_2 += 8u;
74042
              *scratch |= ((uint64_t)(num_bits_2));
74043
            }
74044
          }
74045
          v_checksum_want = t_2;
74046
        }
74047
        if ( ! self->private_impl.f_ignore_checksum && (self->private_impl.f_chunk_type_array[0u] == 73u)) {
74048
          v_checksum_have = wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__utility__empty_slice_u8());
74049
          if (v_checksum_have != v_checksum_want) {
74050
            status = wuffs_base__make_status(wuffs_png__error__bad_checksum);
74051
            goto exit;
74052
          }
74053
        }
74054
        {
74055
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
74056
          uint32_t t_3;
74057
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
74058
            t_3 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
74059
            iop_a_src += 4;
74060
          } else {
74061
            self->private_data.s_decode_pass.scratch = 0;
74062
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
74063
            while (true) {
74064
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
74065
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
74066
                goto suspend;
74067
              }
74068
              uint64_t* scratch = &self->private_data.s_decode_pass.scratch;
74069
              uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFFu));
74070
              *scratch >>= 8;
74071
              *scratch <<= 8;
74072
              *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3);
74073
              if (num_bits_3 == 24) {
74074
                t_3 = ((uint32_t)(*scratch >> 32));
74075
                break;
74076
              }
74077
              num_bits_3 += 8u;
74078
              *scratch |= ((uint64_t)(num_bits_3));
74079
            }
74080
          }
74081
          self->private_impl.f_chunk_length = t_3;
74082
        }
74083
        {
74084
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
74085
          uint32_t t_4;
74086
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
74087
            t_4 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
74088
            iop_a_src += 4;
74089
          } else {
74090
            self->private_data.s_decode_pass.scratch = 0;
74091
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
74092
            while (true) {
74093
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
74094
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
74095
                goto suspend;
74096
              }
74097
              uint64_t* scratch = &self->private_data.s_decode_pass.scratch;
74098
              uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56));
74099
              *scratch <<= 8;
74100
              *scratch >>= 8;
74101
              *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4;
74102
              if (num_bits_4 == 24) {
74103
                t_4 = ((uint32_t)(*scratch));
74104
                break;
74105
              }
74106
              num_bits_4 += 8u;
74107
              *scratch |= ((uint64_t)(num_bits_4)) << 56;
74108
            }
74109
          }
74110
          self->private_impl.f_chunk_type = t_4;
74111
        }
74112
        if (self->private_impl.f_chunk_type_array[0u] == 73u) {
74113
          if (self->private_impl.f_chunk_type != 1413563465u) {
74114
            status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
74115
            goto exit;
74116
          }
74117
          if ( ! self->private_impl.f_ignore_checksum) {
74118
            wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32,
74119
                sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
74120
            wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__make_slice_u8(self->private_impl.f_chunk_type_array, 4));
74121
          }
74122
        } else {
74123
          if ((self->private_impl.f_chunk_type != 1413571686u) || (self->private_impl.f_chunk_length < 4u)) {
74124
            status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
74125
            goto exit;
74126
          }
74127
          self->private_impl.f_chunk_length -= 4u;
74128
          {
74129
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
74130
            uint32_t t_5;
74131
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
74132
              t_5 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
74133
              iop_a_src += 4;
74134
            } else {
74135
              self->private_data.s_decode_pass.scratch = 0;
74136
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
74137
              while (true) {
74138
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
74139
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
74140
                  goto suspend;
74141
                }
74142
                uint64_t* scratch = &self->private_data.s_decode_pass.scratch;
74143
                uint32_t num_bits_5 = ((uint32_t)(*scratch & 0xFFu));
74144
                *scratch >>= 8;
74145
                *scratch <<= 8;
74146
                *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_5);
74147
                if (num_bits_5 == 24) {
74148
                  t_5 = ((uint32_t)(*scratch >> 32));
74149
                  break;
74150
                }
74151
                num_bits_5 += 8u;
74152
                *scratch |= ((uint64_t)(num_bits_5));
74153
              }
74154
            }
74155
            v_seq_num = t_5;
74156
          }
74157
          if (v_seq_num != self->private_impl.f_next_animation_seq_num) {
74158
            status = wuffs_base__make_status(wuffs_png__error__bad_animation_sequence_number);
74159
            goto exit;
74160
          } else if (self->private_impl.f_next_animation_seq_num >= 4294967295u) {
74161
            status = wuffs_base__make_status(wuffs_png__error__unsupported_png_file);
74162
            goto exit;
74163
          }
74164
          self->private_impl.f_next_animation_seq_num += 1u;
74165
        }
74166
        continue;
74167
      } else if (((uint64_t)(io2_a_src - iop_a_src)) > 0u) {
74168
        status = wuffs_base__make_status(wuffs_png__error__internal_error_zlib_decoder_did_not_exhaust_its_input);
74169
        goto exit;
74170
      }
74171
      status = wuffs_base__make_status(wuffs_base__suspension__short_read);
74172
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(11);
74173
    }
74174
    if (self->private_impl.f_workbuf_wi != self->private_impl.f_pass_workbuf_length) {
74175
      status = wuffs_base__make_status(wuffs_base__error__not_enough_data);
74176
      goto exit;
74177
    } else if (0u < ((uint64_t)(a_workbuf.len))) {
74178
      if (a_workbuf.ptr[0u] == 4u) {
74179
        a_workbuf.ptr[0u] = 1u;
74180
      }
74181
    }
74182
74183
    ok:
74184
    self->private_impl.p_decode_pass = 0;
74185
    goto exit;
74186
  }
74187
74188
  goto suspend;
74189
  suspend:
74190
  self->private_impl.p_decode_pass = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
74191
74192
  goto exit;
74193
  exit:
74194
  if (a_src && a_src->data.ptr) {
74195
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
74196
  }
74197
74198
  return status;
74199
}
74200
74201
// -------- func png.decoder.frame_dirty_rect
74202
74203
WUFFS_BASE__GENERATED_C_CODE
74204
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
74205
wuffs_png__decoder__frame_dirty_rect(
74206
    const wuffs_png__decoder* self) {
74207
  if (!self) {
74208
    return wuffs_base__utility__empty_rect_ie_u32();
74209
  }
74210
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
74211
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
74212
    return wuffs_base__utility__empty_rect_ie_u32();
74213
  }
74214
74215
  return wuffs_base__utility__make_rect_ie_u32(
74216
      self->private_impl.f_frame_rect_x0,
74217
      self->private_impl.f_frame_rect_y0,
74218
      self->private_impl.f_frame_rect_x1,
74219
      self->private_impl.f_frame_rect_y1);
74220
}
74221
74222
// -------- func png.decoder.num_animation_loops
74223
74224
WUFFS_BASE__GENERATED_C_CODE
74225
WUFFS_BASE__MAYBE_STATIC uint32_t
74226
wuffs_png__decoder__num_animation_loops(
74227
    const wuffs_png__decoder* self) {
74228
  if (!self) {
74229
    return 0;
74230
  }
74231
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
74232
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
74233
    return 0;
74234
  }
74235
74236
  return self->private_impl.f_num_animation_loops_value;
74237
}
74238
74239
// -------- func png.decoder.num_decoded_frame_configs
74240
74241
WUFFS_BASE__GENERATED_C_CODE
74242
WUFFS_BASE__MAYBE_STATIC uint64_t
74243
wuffs_png__decoder__num_decoded_frame_configs(
74244
    const wuffs_png__decoder* self) {
74245
  if (!self) {
74246
    return 0;
74247
  }
74248
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
74249
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
74250
    return 0;
74251
  }
74252
74253
  return ((uint64_t)(self->private_impl.f_num_decoded_frame_configs_value));
74254
}
74255
74256
// -------- func png.decoder.num_decoded_frames
74257
74258
WUFFS_BASE__GENERATED_C_CODE
74259
WUFFS_BASE__MAYBE_STATIC uint64_t
74260
wuffs_png__decoder__num_decoded_frames(
74261
    const wuffs_png__decoder* self) {
74262
  if (!self) {
74263
    return 0;
74264
  }
74265
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
74266
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
74267
    return 0;
74268
  }
74269
74270
  return ((uint64_t)(self->private_impl.f_num_decoded_frames_value));
74271
}
74272
74273
// -------- func png.decoder.restart_frame
74274
74275
WUFFS_BASE__GENERATED_C_CODE
74276
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
74277
wuffs_png__decoder__restart_frame(
74278
    wuffs_png__decoder* self,
74279
    uint64_t a_index,
74280
    uint64_t a_io_position) {
74281
  if (!self) {
74282
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
74283
  }
74284
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
74285
    return wuffs_base__make_status(
74286
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
74287
        ? wuffs_base__error__disabled_by_previous_error
74288
        : wuffs_base__error__initialize_not_called);
74289
  }
74290
74291
  if (self->private_impl.f_call_sequence < 32u) {
74292
    return wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
74293
  } 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))) {
74294
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
74295
  }
74296
  self->private_impl.f_call_sequence = 40u;
74297
  if (self->private_impl.f_interlace_pass >= 1u) {
74298
    self->private_impl.f_interlace_pass = 1u;
74299
  }
74300
  self->private_impl.f_frame_config_io_position = a_io_position;
74301
  self->private_impl.f_num_decoded_frame_configs_value = ((uint32_t)(a_index));
74302
  self->private_impl.f_num_decoded_frames_value = self->private_impl.f_num_decoded_frame_configs_value;
74303
  return wuffs_base__make_status(NULL);
74304
}
74305
74306
// -------- func png.decoder.set_report_metadata
74307
74308
WUFFS_BASE__GENERATED_C_CODE
74309
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
74310
wuffs_png__decoder__set_report_metadata(
74311
    wuffs_png__decoder* self,
74312
    uint32_t a_fourcc,
74313
    bool a_report) {
74314
  if (!self) {
74315
    return wuffs_base__make_empty_struct();
74316
  }
74317
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
74318
    return wuffs_base__make_empty_struct();
74319
  }
74320
74321
  if (a_fourcc == 1128813133u) {
74322
    self->private_impl.f_report_metadata_chrm = a_report;
74323
  } else if (a_fourcc == 1163413830u) {
74324
    self->private_impl.f_report_metadata_exif = a_report;
74325
  } else if (a_fourcc == 1195461953u) {
74326
    self->private_impl.f_report_metadata_gama = a_report;
74327
  } else if (a_fourcc == 1229144912u) {
74328
    self->private_impl.f_report_metadata_iccp = a_report;
74329
  } else if (a_fourcc == 1263947808u) {
74330
    self->private_impl.f_report_metadata_kvp = a_report;
74331
  } else if (a_fourcc == 1397901122u) {
74332
    self->private_impl.f_report_metadata_srgb = a_report;
74333
  }
74334
  return wuffs_base__make_empty_struct();
74335
}
74336
74337
// -------- func png.decoder.tell_me_more
74338
74339
WUFFS_BASE__GENERATED_C_CODE
74340
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
74341
wuffs_png__decoder__tell_me_more(
74342
    wuffs_png__decoder* self,
74343
    wuffs_base__io_buffer* a_dst,
74344
    wuffs_base__more_information* a_minfo,
74345
    wuffs_base__io_buffer* a_src) {
74346
  if (!self) {
74347
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
74348
  }
74349
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
74350
    return wuffs_base__make_status(
74351
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
74352
        ? wuffs_base__error__disabled_by_previous_error
74353
        : wuffs_base__error__initialize_not_called);
74354
  }
74355
  if (!a_dst || !a_src) {
74356
    self->private_impl.magic = WUFFS_BASE__DISABLED;
74357
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
74358
  }
74359
  if ((self->private_impl.active_coroutine != 0) &&
74360
      (self->private_impl.active_coroutine != 4)) {
74361
    self->private_impl.magic = WUFFS_BASE__DISABLED;
74362
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
74363
  }
74364
  self->private_impl.active_coroutine = 0;
74365
  wuffs_base__status status = wuffs_base__make_status(NULL);
74366
74367
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
74368
74369
  uint32_t coro_susp_point = self->private_impl.p_tell_me_more;
74370
  switch (coro_susp_point) {
74371
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
74372
74373
    while (true) {
74374
      {
74375
        wuffs_base__status t_0 = wuffs_png__decoder__do_tell_me_more(self, a_dst, a_minfo, a_src);
74376
        v_status = t_0;
74377
      }
74378
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
74379
        status = wuffs_base__make_status(wuffs_png__error__truncated_input);
74380
        goto exit;
74381
      }
74382
      status = v_status;
74383
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
74384
    }
74385
74386
    ok:
74387
    self->private_impl.p_tell_me_more = 0;
74388
    goto exit;
74389
  }
74390
74391
  goto suspend;
74392
  suspend:
74393
  self->private_impl.p_tell_me_more = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
74394
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 4 : 0;
74395
74396
  goto exit;
74397
  exit:
74398
  if (wuffs_base__status__is_error(&status)) {
74399
    self->private_impl.magic = WUFFS_BASE__DISABLED;
74400
  }
74401
  return status;
74402
}
74403
74404
// -------- func png.decoder.do_tell_me_more
74405
74406
WUFFS_BASE__GENERATED_C_CODE
74407
static wuffs_base__status
74408
wuffs_png__decoder__do_tell_me_more(
74409
    wuffs_png__decoder* self,
74410
    wuffs_base__io_buffer* a_dst,
74411
    wuffs_base__more_information* a_minfo,
74412
    wuffs_base__io_buffer* a_src) {
74413
  wuffs_base__status status = wuffs_base__make_status(NULL);
74414
74415
  uint8_t v_c8 = 0;
74416
  uint16_t v_c16 = 0;
74417
  wuffs_base__io_buffer u_w = wuffs_base__empty_io_buffer();
74418
  wuffs_base__io_buffer* v_w = &u_w;
74419
  uint8_t* iop_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
74420
  uint8_t* io0_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
74421
  uint8_t* io1_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
74422
  uint8_t* io2_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
74423
  uint64_t v_num_written = 0;
74424
  uint64_t v_w_mark = 0;
74425
  uint64_t v_r_mark = 0;
74426
  wuffs_base__status v_zlib_status = wuffs_base__make_status(NULL);
74427
74428
  uint8_t* iop_a_dst = NULL;
74429
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
74430
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
74431
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
74432
  if (a_dst && a_dst->data.ptr) {
74433
    io0_a_dst = a_dst->data.ptr;
74434
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
74435
    iop_a_dst = io1_a_dst;
74436
    io2_a_dst = io0_a_dst + a_dst->data.len;
74437
    if (a_dst->meta.closed) {
74438
      io2_a_dst = iop_a_dst;
74439
    }
74440
  }
74441
  const uint8_t* iop_a_src = NULL;
74442
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
74443
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
74444
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
74445
  if (a_src && a_src->data.ptr) {
74446
    io0_a_src = a_src->data.ptr;
74447
    io1_a_src = io0_a_src + a_src->meta.ri;
74448
    iop_a_src = io1_a_src;
74449
    io2_a_src = io0_a_src + a_src->meta.wi;
74450
  }
74451
74452
  uint32_t coro_susp_point = self->private_impl.p_do_tell_me_more;
74453
  if (coro_susp_point) {
74454
    v_zlib_status = self->private_data.s_do_tell_me_more.v_zlib_status;
74455
  }
74456
  switch (coro_susp_point) {
74457
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
74458
74459
    if (((uint8_t)(self->private_impl.f_call_sequence & 16u)) == 0u) {
74460
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
74461
      goto exit;
74462
    }
74463
    if (self->private_impl.f_metadata_fourcc == 0u) {
74464
      status = wuffs_base__make_status(wuffs_base__error__no_more_information);
74465
      goto exit;
74466
    }
74467
    do {
74468
      if (self->private_impl.f_metadata_flavor == 3u) {
74469
        while (true) {
74470
          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) {
74471
            status = wuffs_base__make_status(wuffs_base__error__bad_i_o_position);
74472
            goto exit;
74473
          } else if (a_minfo != NULL) {
74474
            wuffs_base__more_information__set(a_minfo,
74475
                self->private_impl.f_metadata_flavor,
74476
                self->private_impl.f_metadata_fourcc,
74477
                self->private_impl.f_metadata_x,
74478
                self->private_impl.f_metadata_y,
74479
                self->private_impl.f_metadata_z);
74480
          }
74481
          if (self->private_impl.f_metadata_y >= self->private_impl.f_metadata_z) {
74482
            goto label__goto_done__break;
74483
          }
74484
          self->private_impl.f_metadata_y = self->private_impl.f_metadata_z;
74485
          status = wuffs_base__make_status(wuffs_base__suspension__even_more_information);
74486
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
74487
        }
74488
      }
74489
      if (self->private_impl.f_metadata_is_zlib_compressed) {
74490
        if (self->private_impl.f_zlib_is_dirty) {
74491
          wuffs_private_impl__ignore_status(wuffs_zlib__decoder__initialize(&self->private_data.f_zlib,
74492
              sizeof (wuffs_zlib__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
74493
          if (self->private_impl.f_ignore_checksum) {
74494
            wuffs_zlib__decoder__set_quirk(&self->private_data.f_zlib, 1u, 1u);
74495
          }
74496
        }
74497
        self->private_impl.f_zlib_is_dirty = true;
74498
        self->private_impl.f_ztxt_hist_pos = 0u;
74499
      }
74500
      label__loop__continue:;
74501
      while (true) {
74502
        if (a_minfo != NULL) {
74503
          wuffs_base__more_information__set(a_minfo,
74504
              self->private_impl.f_metadata_flavor,
74505
              self->private_impl.f_metadata_fourcc,
74506
              self->private_impl.f_metadata_x,
74507
              self->private_impl.f_metadata_y,
74508
              self->private_impl.f_metadata_z);
74509
        }
74510
        if (self->private_impl.f_metadata_flavor != 4u) {
74511
          break;
74512
        }
74513
        if (self->private_impl.f_metadata_is_zlib_compressed) {
74514
          if (self->private_impl.f_chunk_type == 1346585449u) {
74515
            {
74516
              const bool o_0_closed_a_src = a_src->meta.closed;
74517
              const uint8_t* o_0_io2_a_src = io2_a_src;
74518
              wuffs_private_impl__io_reader__limit(&io2_a_src, iop_a_src,
74519
                  ((uint64_t)(self->private_impl.f_chunk_length)));
74520
              if (a_src) {
74521
                size_t n = ((size_t)(io2_a_src - a_src->data.ptr));
74522
                a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n);
74523
                a_src->meta.wi = n;
74524
              }
74525
              v_r_mark = ((uint64_t)(iop_a_src - io0_a_src));
74526
              {
74527
                if (a_dst) {
74528
                  a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
74529
                }
74530
                if (a_src) {
74531
                  a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
74532
                }
74533
                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());
74534
                v_zlib_status = t_0;
74535
                if (a_dst) {
74536
                  iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
74537
                }
74538
                if (a_src) {
74539
                  iop_a_src = a_src->data.ptr + a_src->meta.ri;
74540
                }
74541
              }
74542
              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))))));
74543
              io2_a_src = o_0_io2_a_src;
74544
              if (a_src) {
74545
                a_src->meta.closed = o_0_closed_a_src;
74546
                a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr));
74547
              }
74548
            }
74549
            if (wuffs_base__status__is_ok(&v_zlib_status)) {
74550
              self->private_impl.f_metadata_is_zlib_compressed = false;
74551
              break;
74552
            } else if ( ! wuffs_base__status__is_suspension(&v_zlib_status)) {
74553
              status = v_zlib_status;
74554
              if (wuffs_base__status__is_error(&status)) {
74555
                goto exit;
74556
              } else if (wuffs_base__status__is_suspension(&status)) {
74557
                status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
74558
                goto exit;
74559
              }
74560
              goto ok;
74561
            }
74562
            status = v_zlib_status;
74563
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2);
74564
          } else if (self->private_impl.f_chunk_type == 1951945833u) {
74565
            {
74566
              const bool o_1_closed_a_src = a_src->meta.closed;
74567
              const uint8_t* o_1_io2_a_src = io2_a_src;
74568
              wuffs_private_impl__io_reader__limit(&io2_a_src, iop_a_src,
74569
                  ((uint64_t)(self->private_impl.f_chunk_length)));
74570
              if (a_src) {
74571
                size_t n = ((size_t)(io2_a_src - a_src->data.ptr));
74572
                a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n);
74573
                a_src->meta.wi = n;
74574
              }
74575
              v_r_mark = ((uint64_t)(iop_a_src - io0_a_src));
74576
              {
74577
                if (a_dst) {
74578
                  a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
74579
                }
74580
                if (a_src) {
74581
                  a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
74582
                }
74583
                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());
74584
                v_zlib_status = t_1;
74585
                if (a_dst) {
74586
                  iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
74587
                }
74588
                if (a_src) {
74589
                  iop_a_src = a_src->data.ptr + a_src->meta.ri;
74590
                }
74591
              }
74592
              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))))));
74593
              io2_a_src = o_1_io2_a_src;
74594
              if (a_src) {
74595
                a_src->meta.closed = o_1_closed_a_src;
74596
                a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr));
74597
              }
74598
            }
74599
            if (wuffs_base__status__is_ok(&v_zlib_status)) {
74600
              self->private_impl.f_metadata_is_zlib_compressed = false;
74601
              break;
74602
            } else if ( ! wuffs_base__status__is_suspension(&v_zlib_status)) {
74603
              status = v_zlib_status;
74604
              if (wuffs_base__status__is_error(&status)) {
74605
                goto exit;
74606
              } else if (wuffs_base__status__is_suspension(&status)) {
74607
                status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
74608
                goto exit;
74609
              }
74610
              goto ok;
74611
            }
74612
            status = v_zlib_status;
74613
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3);
74614
          } else if (self->private_impl.f_chunk_type == 1951945850u) {
74615
            if (self->private_impl.f_ztxt_ri == self->private_impl.f_ztxt_wi) {
74616
              {
74617
                wuffs_base__io_buffer* o_2_v_w = v_w;
74618
                uint8_t* o_2_iop_v_w = iop_v_w;
74619
                uint8_t* o_2_io0_v_w = io0_v_w;
74620
                uint8_t* o_2_io1_v_w = io1_v_w;
74621
                uint8_t* o_2_io2_v_w = io2_v_w;
74622
                v_w = wuffs_private_impl__io_writer__set(
74623
                    &u_w,
74624
                    &iop_v_w,
74625
                    &io0_v_w,
74626
                    &io1_v_w,
74627
                    &io2_v_w,
74628
                    wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024),
74629
                    self->private_impl.f_ztxt_hist_pos);
74630
                {
74631
                  const bool o_3_closed_a_src = a_src->meta.closed;
74632
                  const uint8_t* o_3_io2_a_src = io2_a_src;
74633
                  wuffs_private_impl__io_reader__limit(&io2_a_src, iop_a_src,
74634
                      ((uint64_t)(self->private_impl.f_chunk_length)));
74635
                  if (a_src) {
74636
                    size_t n = ((size_t)(io2_a_src - a_src->data.ptr));
74637
                    a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n);
74638
                    a_src->meta.wi = n;
74639
                  }
74640
                  v_w_mark = ((uint64_t)(iop_v_w - io0_v_w));
74641
                  v_r_mark = ((uint64_t)(iop_a_src - io0_a_src));
74642
                  {
74643
                    u_w.meta.wi = ((size_t)(iop_v_w - u_w.data.ptr));
74644
                    if (a_src) {
74645
                      a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
74646
                    }
74647
                    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());
74648
                    v_zlib_status = t_2;
74649
                    iop_v_w = u_w.data.ptr + u_w.meta.wi;
74650
                    if (a_src) {
74651
                      iop_a_src = a_src->data.ptr + a_src->meta.ri;
74652
                    }
74653
                  }
74654
                  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))))));
74655
                  v_num_written = wuffs_private_impl__io__count_since(v_w_mark, ((uint64_t)(iop_v_w - io0_v_w)));
74656
                  io2_a_src = o_3_io2_a_src;
74657
                  if (a_src) {
74658
                    a_src->meta.closed = o_3_closed_a_src;
74659
                    a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr));
74660
                  }
74661
                }
74662
                v_w = o_2_v_w;
74663
                iop_v_w = o_2_iop_v_w;
74664
                io0_v_w = o_2_io0_v_w;
74665
                io1_v_w = o_2_io1_v_w;
74666
                io2_v_w = o_2_io2_v_w;
74667
              }
74668
              if (v_num_written > 1024u) {
74669
                status = wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_i_o);
74670
                goto exit;
74671
              }
74672
              self->private_impl.f_ztxt_ri = 0u;
74673
              self->private_impl.f_ztxt_wi = ((uint32_t)(v_num_written));
74674
              wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_ztxt_hist_pos, v_num_written);
74675
            }
74676
            while (self->private_impl.f_ztxt_ri < self->private_impl.f_ztxt_wi) {
74677
              v_c16 = WUFFS_PNG__LATIN_1[self->private_data.f_dst_palette[self->private_impl.f_ztxt_ri]];
74678
              if (v_c16 == 0u) {
74679
                status = wuffs_base__make_status(wuffs_png__error__bad_text_chunk_not_latin_1);
74680
                goto exit;
74681
              } else if (v_c16 <= 127u) {
74682
                if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
74683
                  status = wuffs_base__make_status(wuffs_base__suspension__short_write);
74684
                  WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4);
74685
                  goto label__loop__continue;
74686
                }
74687
                self->private_impl.f_ztxt_ri += 1u;
74688
                (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)(v_c16))), iop_a_dst += 1);
74689
              } else {
74690
                if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 1u) {
74691
                  status = wuffs_base__make_status(wuffs_base__suspension__short_write);
74692
                  WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5);
74693
                  goto label__loop__continue;
74694
                }
74695
                self->private_impl.f_ztxt_ri += 1u;
74696
                (wuffs_base__poke_u16le__no_bounds_check(iop_a_dst, v_c16), iop_a_dst += 2);
74697
              }
74698
            }
74699
            if (wuffs_base__status__is_ok(&v_zlib_status)) {
74700
              self->private_impl.f_metadata_is_zlib_compressed = false;
74701
              break;
74702
            } else if ( ! wuffs_base__status__is_suspension(&v_zlib_status)) {
74703
              status = v_zlib_status;
74704
              if (wuffs_base__status__is_error(&status)) {
74705
                goto exit;
74706
              } else if (wuffs_base__status__is_suspension(&status)) {
74707
                status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
74708
                goto exit;
74709
              }
74710
              goto ok;
74711
            } else if (v_zlib_status.repr != wuffs_base__suspension__short_write) {
74712
              status = v_zlib_status;
74713
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6);
74714
            }
74715
          } else {
74716
            status = wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_chunk_type);
74717
            goto exit;
74718
          }
74719
        } else if ((self->private_impl.f_chunk_type == 1951945833u) && (self->private_impl.f_metadata_fourcc == 1263947862u)) {
74720
          while (true) {
74721
            if (self->private_impl.f_chunk_length <= 0u) {
74722
              goto label__loop__break;
74723
            } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
74724
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
74725
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7);
74726
              goto label__loop__continue;
74727
            } else if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
74728
              status = wuffs_base__make_status(wuffs_base__suspension__short_write);
74729
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8);
74730
              goto label__loop__continue;
74731
            }
74732
            self->private_impl.f_chunk_length -= 1u;
74733
            v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
74734
            iop_a_src += 1u;
74735
            (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, v_c8), iop_a_dst += 1);
74736
          }
74737
        } else {
74738
          while (true) {
74739
            if (self->private_impl.f_chunk_length <= 0u) {
74740
              if (self->private_impl.f_metadata_fourcc == 1263947851u) {
74741
                status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
74742
                goto exit;
74743
              }
74744
              goto label__loop__break;
74745
            } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
74746
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
74747
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9);
74748
              goto label__loop__continue;
74749
            }
74750
            v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
74751
            if (v_c8 == 0u) {
74752
              self->private_impl.f_chunk_length -= 1u;
74753
              iop_a_src += 1u;
74754
              goto label__loop__break;
74755
            }
74756
            v_c16 = WUFFS_PNG__LATIN_1[v_c8];
74757
            if (v_c16 == 0u) {
74758
              status = wuffs_base__make_status(wuffs_png__error__bad_text_chunk_not_latin_1);
74759
              goto exit;
74760
            } else if (v_c16 <= 127u) {
74761
              if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
74762
                status = wuffs_base__make_status(wuffs_base__suspension__short_write);
74763
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10);
74764
                goto label__loop__continue;
74765
              }
74766
              self->private_impl.f_chunk_length -= 1u;
74767
              iop_a_src += 1u;
74768
              (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)(v_c16))), iop_a_dst += 1);
74769
            } else {
74770
              if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 1u) {
74771
                status = wuffs_base__make_status(wuffs_base__suspension__short_write);
74772
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(11);
74773
                goto label__loop__continue;
74774
              }
74775
              self->private_impl.f_chunk_length -= 1u;
74776
              iop_a_src += 1u;
74777
              (wuffs_base__poke_u16le__no_bounds_check(iop_a_dst, v_c16), iop_a_dst += 2);
74778
            }
74779
          }
74780
        }
74781
      }
74782
      label__loop__break:;
74783
      if (self->private_impl.f_metadata_fourcc == 1263947851u) {
74784
        self->private_impl.f_metadata_fourcc = 1263947862u;
74785
        if (self->private_impl.f_chunk_type == 1951945833u) {
74786
          if (self->private_impl.f_chunk_length <= 1u) {
74787
            status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
74788
            goto exit;
74789
          }
74790
          self->private_impl.f_chunk_length -= 2u;
74791
          {
74792
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12);
74793
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
74794
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
74795
              goto suspend;
74796
            }
74797
            uint8_t t_3 = *iop_a_src++;
74798
            v_c8 = t_3;
74799
          }
74800
          if (v_c8 == 0u) {
74801
            self->private_impl.f_metadata_is_zlib_compressed = false;
74802
          } else if (v_c8 == 1u) {
74803
            self->private_impl.f_metadata_is_zlib_compressed = true;
74804
          } else {
74805
            status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
74806
            goto exit;
74807
          }
74808
          {
74809
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13);
74810
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
74811
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
74812
              goto suspend;
74813
            }
74814
            uint8_t t_4 = *iop_a_src++;
74815
            v_c8 = t_4;
74816
          }
74817
          if ((v_c8 != 0u) && self->private_impl.f_metadata_is_zlib_compressed) {
74818
            status = wuffs_base__make_status(wuffs_png__error__unsupported_png_compression_method);
74819
            goto exit;
74820
          }
74821
          self->private_impl.f_metadata_fourcc -= 2u;
74822
          while (self->private_impl.f_metadata_fourcc != 1263947862u) {
74823
            self->private_impl.f_metadata_fourcc += 1u;
74824
            while (true) {
74825
              if (self->private_impl.f_chunk_length <= 0u) {
74826
                status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
74827
                goto exit;
74828
              }
74829
              self->private_impl.f_chunk_length -= 1u;
74830
              {
74831
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14);
74832
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
74833
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
74834
                  goto suspend;
74835
                }
74836
                uint8_t t_5 = *iop_a_src++;
74837
                v_c8 = t_5;
74838
              }
74839
              if (v_c8 == 0u) {
74840
                break;
74841
              }
74842
            }
74843
          }
74844
        } else if (self->private_impl.f_chunk_type == 1951945850u) {
74845
          if (self->private_impl.f_chunk_length <= 0u) {
74846
            status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
74847
            goto exit;
74848
          }
74849
          self->private_impl.f_chunk_length -= 1u;
74850
          {
74851
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15);
74852
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
74853
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
74854
              goto suspend;
74855
            }
74856
            uint8_t t_6 = *iop_a_src++;
74857
            v_c8 = t_6;
74858
          }
74859
          if (v_c8 != 0u) {
74860
            status = wuffs_base__make_status(wuffs_png__error__unsupported_png_compression_method);
74861
            goto exit;
74862
          }
74863
          self->private_impl.f_metadata_is_zlib_compressed = true;
74864
        }
74865
        self->private_impl.f_call_sequence &= 239u;
74866
        status = wuffs_base__make_status(NULL);
74867
        goto ok;
74868
      }
74869
    } while (0);
74870
    label__goto_done__break:;
74871
    if (self->private_impl.f_chunk_length != 0u) {
74872
      status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
74873
      goto exit;
74874
    }
74875
    self->private_data.s_do_tell_me_more.scratch = 4u;
74876
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16);
74877
    if (self->private_data.s_do_tell_me_more.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
74878
      self->private_data.s_do_tell_me_more.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
74879
      iop_a_src = io2_a_src;
74880
      status = wuffs_base__make_status(wuffs_base__suspension__short_read);
74881
      goto suspend;
74882
    }
74883
    iop_a_src += self->private_data.s_do_tell_me_more.scratch;
74884
    self->private_impl.f_metadata_flavor = 0u;
74885
    self->private_impl.f_metadata_fourcc = 0u;
74886
    self->private_impl.f_metadata_x = 0u;
74887
    self->private_impl.f_metadata_y = 0u;
74888
    self->private_impl.f_metadata_z = 0u;
74889
    self->private_impl.f_call_sequence &= 239u;
74890
    status = wuffs_base__make_status(NULL);
74891
    goto ok;
74892
74893
    ok:
74894
    self->private_impl.p_do_tell_me_more = 0;
74895
    goto exit;
74896
  }
74897
74898
  goto suspend;
74899
  suspend:
74900
  self->private_impl.p_do_tell_me_more = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
74901
  self->private_data.s_do_tell_me_more.v_zlib_status = v_zlib_status;
74902
74903
  goto exit;
74904
  exit:
74905
  if (a_dst && a_dst->data.ptr) {
74906
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
74907
  }
74908
  if (a_src && a_src->data.ptr) {
74909
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
74910
  }
74911
74912
  return status;
74913
}
74914
74915
// -------- func png.decoder.workbuf_len
74916
74917
WUFFS_BASE__GENERATED_C_CODE
74918
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
74919
wuffs_png__decoder__workbuf_len(
74920
    const wuffs_png__decoder* self) {
74921
  if (!self) {
74922
    return wuffs_base__utility__empty_range_ii_u64();
74923
  }
74924
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
74925
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
74926
    return wuffs_base__utility__empty_range_ii_u64();
74927
  }
74928
74929
  return wuffs_base__utility__make_range_ii_u64(self->private_impl.f_overall_workbuf_length, self->private_impl.f_overall_workbuf_length);
74930
}
74931
74932
// -------- func png.decoder.filter_and_swizzle
74933
74934
WUFFS_BASE__GENERATED_C_CODE
74935
static wuffs_base__status
74936
wuffs_png__decoder__filter_and_swizzle(
74937
    wuffs_png__decoder* self,
74938
    wuffs_base__pixel_buffer* a_dst,
74939
    wuffs_base__slice_u8 a_workbuf) {
74940
  return (*self->private_impl.choosy_filter_and_swizzle)(self, a_dst, a_workbuf);
74941
}
74942
74943
WUFFS_BASE__GENERATED_C_CODE
74944
static wuffs_base__status
74945
wuffs_png__decoder__filter_and_swizzle__choosy_default(
74946
    wuffs_png__decoder* self,
74947
    wuffs_base__pixel_buffer* a_dst,
74948
    wuffs_base__slice_u8 a_workbuf) {
74949
  wuffs_base__pixel_format v_dst_pixfmt = {0};
74950
  uint32_t v_dst_bits_per_pixel = 0;
74951
  uint64_t v_dst_bytes_per_pixel = 0;
74952
  uint64_t v_dst_bytes_per_row0 = 0;
74953
  uint64_t v_dst_bytes_per_row1 = 0;
74954
  wuffs_base__slice_u8 v_dst_palette = {0};
74955
  wuffs_base__table_u8 v_tab = {0};
74956
  uint32_t v_y = 0;
74957
  wuffs_base__slice_u8 v_dst = {0};
74958
  uint8_t v_filter = 0;
74959
  wuffs_base__slice_u8 v_curr_row = {0};
74960
  wuffs_base__slice_u8 v_prev_row = {0};
74961
74962
  v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
74963
  v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
74964
  if ((v_dst_bits_per_pixel & 7u) != 0u) {
74965
    return wuffs_base__make_status(wuffs_base__error__unsupported_option);
74966
  }
74967
  v_dst_bytes_per_pixel = ((uint64_t)((v_dst_bits_per_pixel / 8u)));
74968
  v_dst_bytes_per_row0 = (((uint64_t)(self->private_impl.f_frame_rect_x0)) * v_dst_bytes_per_pixel);
74969
  v_dst_bytes_per_row1 = (((uint64_t)(self->private_impl.f_frame_rect_x1)) * v_dst_bytes_per_pixel);
74970
  v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024));
74971
  v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
74972
  if (v_dst_bytes_per_row1 < ((uint64_t)(v_tab.width))) {
74973
    v_tab = wuffs_base__table_u8__subtable_ij(v_tab,
74974
        0u,
74975
        0u,
74976
        v_dst_bytes_per_row1,
74977
        ((uint64_t)(v_tab.height)));
74978
  }
74979
  if (v_dst_bytes_per_row0 < ((uint64_t)(v_tab.width))) {
74980
    v_tab = wuffs_base__table_u8__subtable_ij(v_tab,
74981
        v_dst_bytes_per_row0,
74982
        0u,
74983
        ((uint64_t)(v_tab.width)),
74984
        ((uint64_t)(v_tab.height)));
74985
  } else {
74986
    v_tab = wuffs_base__table_u8__subtable_ij(v_tab,
74987
        0u,
74988
        0u,
74989
        0u,
74990
        0u);
74991
  }
74992
  v_y = self->private_impl.f_frame_rect_y0;
74993
  while (v_y < self->private_impl.f_frame_rect_y1) {
74994
    v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_y);
74995
    if (1u > ((uint64_t)(a_workbuf.len))) {
74996
      return wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_workbuf_length);
74997
    }
74998
    v_filter = a_workbuf.ptr[0u];
74999
    a_workbuf = wuffs_base__slice_u8__subslice_i(a_workbuf, 1u);
75000
    if (self->private_impl.f_pass_bytes_per_row > ((uint64_t)(a_workbuf.len))) {
75001
      return wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_workbuf_length);
75002
    }
75003
    v_curr_row = wuffs_base__slice_u8__subslice_j(a_workbuf, self->private_impl.f_pass_bytes_per_row);
75004
    a_workbuf = wuffs_base__slice_u8__subslice_i(a_workbuf, self->private_impl.f_pass_bytes_per_row);
75005
    if (v_filter == 0u) {
75006
    } else if (v_filter == 1u) {
75007
      wuffs_png__decoder__filter_1(self, v_curr_row);
75008
    } else if (v_filter == 2u) {
75009
      wuffs_png__decoder__filter_2(self, v_curr_row, v_prev_row);
75010
    } else if (v_filter == 3u) {
75011
      wuffs_png__decoder__filter_3(self, v_curr_row, v_prev_row);
75012
    } else if (v_filter == 4u) {
75013
      wuffs_png__decoder__filter_4(self, v_curr_row, v_prev_row);
75014
    } else {
75015
      return wuffs_base__make_status(wuffs_png__error__bad_filter);
75016
    }
75017
    wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, v_curr_row);
75018
    v_prev_row = v_curr_row;
75019
    v_y += 1u;
75020
  }
75021
  return wuffs_base__make_status(NULL);
75022
}
75023
75024
// -------- func png.decoder.filter_and_swizzle_tricky
75025
75026
WUFFS_BASE__GENERATED_C_CODE
75027
static wuffs_base__status
75028
wuffs_png__decoder__filter_and_swizzle_tricky(
75029
    wuffs_png__decoder* self,
75030
    wuffs_base__pixel_buffer* a_dst,
75031
    wuffs_base__slice_u8 a_workbuf) {
75032
  wuffs_base__pixel_format v_dst_pixfmt = {0};
75033
  uint32_t v_dst_bits_per_pixel = 0;
75034
  uint64_t v_dst_bytes_per_pixel = 0;
75035
  uint64_t v_dst_bytes_per_row1 = 0;
75036
  wuffs_base__slice_u8 v_dst_palette = {0};
75037
  wuffs_base__table_u8 v_tab = {0};
75038
  uint64_t v_src_bytes_per_pixel = 0;
75039
  uint32_t v_x = 0;
75040
  uint32_t v_y = 0;
75041
  uint64_t v_i = 0;
75042
  wuffs_base__slice_u8 v_dst = {0};
75043
  uint8_t v_filter = 0;
75044
  wuffs_base__slice_u8 v_s = {0};
75045
  wuffs_base__slice_u8 v_curr_row = {0};
75046
  wuffs_base__slice_u8 v_prev_row = {0};
75047
  uint8_t v_bits_unpacked[8] = {0};
75048
  uint8_t v_bits_packed = 0;
75049
  uint8_t v_packs_remaining = 0;
75050
  uint8_t v_multiplier = 0;
75051
  uint8_t v_shift = 0;
75052
75053
  v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
75054
  v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
75055
  if ((v_dst_bits_per_pixel & 7u) != 0u) {
75056
    return wuffs_base__make_status(wuffs_base__error__unsupported_option);
75057
  }
75058
  v_dst_bytes_per_pixel = ((uint64_t)((v_dst_bits_per_pixel / 8u)));
75059
  v_dst_bytes_per_row1 = (((uint64_t)(self->private_impl.f_frame_rect_x1)) * v_dst_bytes_per_pixel);
75060
  v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024));
75061
  v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
75062
  v_src_bytes_per_pixel = 1u;
75063
  if (self->private_impl.f_depth >= 8u) {
75064
    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)))));
75065
  }
75066
  if (self->private_impl.f_chunk_type_array[0u] == 73u) {
75067
    v_y = ((uint32_t)(WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][5u]));
75068
  } else {
75069
    v_y = self->private_impl.f_frame_rect_y0;
75070
  }
75071
  while (v_y < self->private_impl.f_frame_rect_y1) {
75072
    v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_y);
75073
    if (v_dst_bytes_per_row1 < ((uint64_t)(v_dst.len))) {
75074
      v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row1);
75075
    }
75076
    if (1u > ((uint64_t)(a_workbuf.len))) {
75077
      return wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_workbuf_length);
75078
    }
75079
    v_filter = a_workbuf.ptr[0u];
75080
    a_workbuf = wuffs_base__slice_u8__subslice_i(a_workbuf, 1u);
75081
    if (self->private_impl.f_pass_bytes_per_row > ((uint64_t)(a_workbuf.len))) {
75082
      return wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_workbuf_length);
75083
    }
75084
    v_curr_row = wuffs_base__slice_u8__subslice_j(a_workbuf, self->private_impl.f_pass_bytes_per_row);
75085
    a_workbuf = wuffs_base__slice_u8__subslice_i(a_workbuf, self->private_impl.f_pass_bytes_per_row);
75086
    if (v_filter == 0u) {
75087
    } else if (v_filter == 1u) {
75088
      wuffs_png__decoder__filter_1(self, v_curr_row);
75089
    } else if (v_filter == 2u) {
75090
      wuffs_png__decoder__filter_2(self, v_curr_row, v_prev_row);
75091
    } else if (v_filter == 3u) {
75092
      wuffs_png__decoder__filter_3(self, v_curr_row, v_prev_row);
75093
    } else if (v_filter == 4u) {
75094
      wuffs_png__decoder__filter_4(self, v_curr_row, v_prev_row);
75095
    } else {
75096
      return wuffs_base__make_status(wuffs_png__error__bad_filter);
75097
    }
75098
    v_s = v_curr_row;
75099
    if (self->private_impl.f_chunk_type_array[0u] == 73u) {
75100
      v_x = ((uint32_t)(WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][2u]));
75101
    } else {
75102
      v_x = self->private_impl.f_frame_rect_x0;
75103
    }
75104
    if (self->private_impl.f_depth == 8u) {
75105
      while (v_x < self->private_impl.f_frame_rect_x1) {
75106
        v_i = (((uint64_t)(v_x)) * v_dst_bytes_per_pixel);
75107
        if (v_i <= ((uint64_t)(v_dst.len))) {
75108
          if (((uint32_t)(self->private_impl.f_remap_transparency)) != 0u) {
75109
            if (self->private_impl.f_color_type == 0u) {
75110
              if (1u <= ((uint64_t)(v_s.len))) {
75111
                v_bits_unpacked[0u] = v_s.ptr[0u];
75112
                v_bits_unpacked[1u] = v_s.ptr[0u];
75113
                v_bits_unpacked[2u] = v_s.ptr[0u];
75114
                v_bits_unpacked[3u] = 255u;
75115
                v_s = wuffs_base__slice_u8__subslice_i(v_s, 1u);
75116
                if (((uint32_t)(self->private_impl.f_remap_transparency)) == ((((uint32_t)(v_bits_unpacked[0u])) << 0u) |
75117
                    (((uint32_t)(v_bits_unpacked[1u])) << 8u) |
75118
                    (((uint32_t)(v_bits_unpacked[2u])) << 16u) |
75119
                    (((uint32_t)(v_bits_unpacked[3u])) << 24u))) {
75120
                  v_bits_unpacked[0u] = 0u;
75121
                  v_bits_unpacked[1u] = 0u;
75122
                  v_bits_unpacked[2u] = 0u;
75123
                  v_bits_unpacked[3u] = 0u;
75124
                }
75125
                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));
75126
              }
75127
            } else {
75128
              if (3u <= ((uint64_t)(v_s.len))) {
75129
                v_bits_unpacked[0u] = v_s.ptr[2u];
75130
                v_bits_unpacked[1u] = v_s.ptr[1u];
75131
                v_bits_unpacked[2u] = v_s.ptr[0u];
75132
                v_bits_unpacked[3u] = 255u;
75133
                v_s = wuffs_base__slice_u8__subslice_i(v_s, 3u);
75134
                if (((uint32_t)(self->private_impl.f_remap_transparency)) == ((((uint32_t)(v_bits_unpacked[0u])) << 0u) |
75135
                    (((uint32_t)(v_bits_unpacked[1u])) << 8u) |
75136
                    (((uint32_t)(v_bits_unpacked[2u])) << 16u) |
75137
                    (((uint32_t)(v_bits_unpacked[3u])) << 24u))) {
75138
                  v_bits_unpacked[0u] = 0u;
75139
                  v_bits_unpacked[1u] = 0u;
75140
                  v_bits_unpacked[2u] = 0u;
75141
                  v_bits_unpacked[3u] = 0u;
75142
                }
75143
                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));
75144
              }
75145
            }
75146
          } else if (v_src_bytes_per_pixel <= ((uint64_t)(v_s.len))) {
75147
            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));
75148
            v_s = wuffs_base__slice_u8__subslice_i(v_s, v_src_bytes_per_pixel);
75149
          }
75150
        }
75151
        v_x += (((uint32_t)(1u)) << WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][0u]);
75152
      }
75153
    } else if (self->private_impl.f_depth < 8u) {
75154
      v_multiplier = 1u;
75155
      if (self->private_impl.f_color_type == 0u) {
75156
        v_multiplier = WUFFS_PNG__LOW_BIT_DEPTH_MULTIPLIERS[self->private_impl.f_depth];
75157
      }
75158
      v_shift = ((uint8_t)(((uint8_t)(8u - self->private_impl.f_depth)) & 7u));
75159
      v_packs_remaining = 0u;
75160
      while (v_x < self->private_impl.f_frame_rect_x1) {
75161
        v_i = (((uint64_t)(v_x)) * v_dst_bytes_per_pixel);
75162
        if (v_i <= ((uint64_t)(v_dst.len))) {
75163
          if ((v_packs_remaining == 0u) && (1u <= ((uint64_t)(v_s.len)))) {
75164
            v_packs_remaining = WUFFS_PNG__LOW_BIT_DEPTH_NUM_PACKS[self->private_impl.f_depth];
75165
            v_bits_packed = v_s.ptr[0u];
75166
            v_s = wuffs_base__slice_u8__subslice_i(v_s, 1u);
75167
          }
75168
          v_bits_unpacked[0u] = ((uint8_t)(((uint8_t)(v_bits_packed >> v_shift)) * v_multiplier));
75169
          v_bits_packed = ((uint8_t)(v_bits_packed << self->private_impl.f_depth));
75170
          v_packs_remaining = ((uint8_t)(v_packs_remaining - 1u));
75171
          if (((uint32_t)(self->private_impl.f_remap_transparency)) != 0u) {
75172
            v_bits_unpacked[1u] = v_bits_unpacked[0u];
75173
            v_bits_unpacked[2u] = v_bits_unpacked[0u];
75174
            v_bits_unpacked[3u] = 255u;
75175
            if (((uint32_t)(self->private_impl.f_remap_transparency)) == ((((uint32_t)(v_bits_unpacked[0u])) << 0u) |
75176
                (((uint32_t)(v_bits_unpacked[1u])) << 8u) |
75177
                (((uint32_t)(v_bits_unpacked[2u])) << 16u) |
75178
                (((uint32_t)(v_bits_unpacked[3u])) << 24u))) {
75179
              v_bits_unpacked[0u] = 0u;
75180
              v_bits_unpacked[1u] = 0u;
75181
              v_bits_unpacked[2u] = 0u;
75182
              v_bits_unpacked[3u] = 0u;
75183
            }
75184
            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));
75185
          } else {
75186
            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));
75187
          }
75188
        }
75189
        v_x += (((uint32_t)(1u)) << WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][0u]);
75190
      }
75191
    } else {
75192
      while (v_x < self->private_impl.f_frame_rect_x1) {
75193
        v_i = (((uint64_t)(v_x)) * v_dst_bytes_per_pixel);
75194
        if (v_i <= ((uint64_t)(v_dst.len))) {
75195
          if (self->private_impl.f_color_type == 0u) {
75196
            if (2u <= ((uint64_t)(v_s.len))) {
75197
              v_bits_unpacked[0u] = v_s.ptr[1u];
75198
              v_bits_unpacked[1u] = v_s.ptr[0u];
75199
              v_bits_unpacked[2u] = v_s.ptr[1u];
75200
              v_bits_unpacked[3u] = v_s.ptr[0u];
75201
              v_bits_unpacked[4u] = v_s.ptr[1u];
75202
              v_bits_unpacked[5u] = v_s.ptr[0u];
75203
              v_bits_unpacked[6u] = 255u;
75204
              v_bits_unpacked[7u] = 255u;
75205
              v_s = wuffs_base__slice_u8__subslice_i(v_s, 2u);
75206
              if (self->private_impl.f_remap_transparency == ((((uint64_t)(v_bits_unpacked[0u])) << 0u) |
75207
                  (((uint64_t)(v_bits_unpacked[1u])) << 8u) |
75208
                  (((uint64_t)(v_bits_unpacked[2u])) << 16u) |
75209
                  (((uint64_t)(v_bits_unpacked[3u])) << 24u) |
75210
                  (((uint64_t)(v_bits_unpacked[4u])) << 32u) |
75211
                  (((uint64_t)(v_bits_unpacked[5u])) << 40u) |
75212
                  (((uint64_t)(v_bits_unpacked[6u])) << 48u) |
75213
                  (((uint64_t)(v_bits_unpacked[7u])) << 56u))) {
75214
                v_bits_unpacked[0u] = 0u;
75215
                v_bits_unpacked[1u] = 0u;
75216
                v_bits_unpacked[2u] = 0u;
75217
                v_bits_unpacked[3u] = 0u;
75218
                v_bits_unpacked[4u] = 0u;
75219
                v_bits_unpacked[5u] = 0u;
75220
                v_bits_unpacked[6u] = 0u;
75221
                v_bits_unpacked[7u] = 0u;
75222
              }
75223
            }
75224
          } else if (self->private_impl.f_color_type == 2u) {
75225
            if (6u <= ((uint64_t)(v_s.len))) {
75226
              v_bits_unpacked[0u] = v_s.ptr[5u];
75227
              v_bits_unpacked[1u] = v_s.ptr[4u];
75228
              v_bits_unpacked[2u] = v_s.ptr[3u];
75229
              v_bits_unpacked[3u] = v_s.ptr[2u];
75230
              v_bits_unpacked[4u] = v_s.ptr[1u];
75231
              v_bits_unpacked[5u] = v_s.ptr[0u];
75232
              v_bits_unpacked[6u] = 255u;
75233
              v_bits_unpacked[7u] = 255u;
75234
              v_s = wuffs_base__slice_u8__subslice_i(v_s, 6u);
75235
              if (self->private_impl.f_remap_transparency == ((((uint64_t)(v_bits_unpacked[0u])) << 0u) |
75236
                  (((uint64_t)(v_bits_unpacked[1u])) << 8u) |
75237
                  (((uint64_t)(v_bits_unpacked[2u])) << 16u) |
75238
                  (((uint64_t)(v_bits_unpacked[3u])) << 24u) |
75239
                  (((uint64_t)(v_bits_unpacked[4u])) << 32u) |
75240
                  (((uint64_t)(v_bits_unpacked[5u])) << 40u) |
75241
                  (((uint64_t)(v_bits_unpacked[6u])) << 48u) |
75242
                  (((uint64_t)(v_bits_unpacked[7u])) << 56u))) {
75243
                v_bits_unpacked[0u] = 0u;
75244
                v_bits_unpacked[1u] = 0u;
75245
                v_bits_unpacked[2u] = 0u;
75246
                v_bits_unpacked[3u] = 0u;
75247
                v_bits_unpacked[4u] = 0u;
75248
                v_bits_unpacked[5u] = 0u;
75249
                v_bits_unpacked[6u] = 0u;
75250
                v_bits_unpacked[7u] = 0u;
75251
              }
75252
            }
75253
          } else if (self->private_impl.f_color_type == 4u) {
75254
            if (4u <= ((uint64_t)(v_s.len))) {
75255
              v_bits_unpacked[0u] = v_s.ptr[1u];
75256
              v_bits_unpacked[1u] = v_s.ptr[0u];
75257
              v_bits_unpacked[2u] = v_s.ptr[1u];
75258
              v_bits_unpacked[3u] = v_s.ptr[0u];
75259
              v_bits_unpacked[4u] = v_s.ptr[1u];
75260
              v_bits_unpacked[5u] = v_s.ptr[0u];
75261
              v_bits_unpacked[6u] = v_s.ptr[3u];
75262
              v_bits_unpacked[7u] = v_s.ptr[2u];
75263
              v_s = wuffs_base__slice_u8__subslice_i(v_s, 4u);
75264
            }
75265
          } else {
75266
            if (8u <= ((uint64_t)(v_s.len))) {
75267
              v_bits_unpacked[0u] = v_s.ptr[5u];
75268
              v_bits_unpacked[1u] = v_s.ptr[4u];
75269
              v_bits_unpacked[2u] = v_s.ptr[3u];
75270
              v_bits_unpacked[3u] = v_s.ptr[2u];
75271
              v_bits_unpacked[4u] = v_s.ptr[1u];
75272
              v_bits_unpacked[5u] = v_s.ptr[0u];
75273
              v_bits_unpacked[6u] = v_s.ptr[7u];
75274
              v_bits_unpacked[7u] = v_s.ptr[6u];
75275
              v_s = wuffs_base__slice_u8__subslice_i(v_s, 8u);
75276
            }
75277
          }
75278
          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));
75279
        }
75280
        v_x += (((uint32_t)(1u)) << WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][0u]);
75281
      }
75282
    }
75283
    v_prev_row = v_curr_row;
75284
    v_y += (((uint32_t)(1u)) << WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][3u]);
75285
  }
75286
  return wuffs_base__make_status(NULL);
75287
}
75288
75289
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__PNG)
75290
75291
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__QOI)
75292
75293
// ---------------- Status Codes Implementations
75294
75295
const char wuffs_qoi__error__bad_footer[] = "#qoi: bad footer";
75296
const char wuffs_qoi__error__bad_header[] = "#qoi: bad header";
75297
const char wuffs_qoi__error__truncated_input[] = "#qoi: truncated input";
75298
75299
// ---------------- Private Consts
75300
75301
// ---------------- Private Initializer Prototypes
75302
75303
// ---------------- Private Function Prototypes
75304
75305
WUFFS_BASE__GENERATED_C_CODE
75306
static wuffs_base__status
75307
wuffs_qoi__decoder__do_decode_image_config(
75308
    wuffs_qoi__decoder* self,
75309
    wuffs_base__image_config* a_dst,
75310
    wuffs_base__io_buffer* a_src);
75311
75312
WUFFS_BASE__GENERATED_C_CODE
75313
static wuffs_base__status
75314
wuffs_qoi__decoder__do_decode_frame_config(
75315
    wuffs_qoi__decoder* self,
75316
    wuffs_base__frame_config* a_dst,
75317
    wuffs_base__io_buffer* a_src);
75318
75319
WUFFS_BASE__GENERATED_C_CODE
75320
static wuffs_base__status
75321
wuffs_qoi__decoder__do_decode_frame(
75322
    wuffs_qoi__decoder* self,
75323
    wuffs_base__pixel_buffer* a_dst,
75324
    wuffs_base__io_buffer* a_src,
75325
    wuffs_base__pixel_blend a_blend,
75326
    wuffs_base__slice_u8 a_workbuf,
75327
    wuffs_base__decode_frame_options* a_opts);
75328
75329
WUFFS_BASE__GENERATED_C_CODE
75330
static wuffs_base__status
75331
wuffs_qoi__decoder__from_src_to_buffer(
75332
    wuffs_qoi__decoder* self,
75333
    wuffs_base__io_buffer* a_src);
75334
75335
WUFFS_BASE__GENERATED_C_CODE
75336
static wuffs_base__status
75337
wuffs_qoi__decoder__from_buffer_to_dst(
75338
    wuffs_qoi__decoder* self,
75339
    wuffs_base__pixel_buffer* a_dst);
75340
75341
// ---------------- VTables
75342
75343
const wuffs_base__image_decoder__func_ptrs
75344
wuffs_qoi__decoder__func_ptrs_for__wuffs_base__image_decoder = {
75345
  (wuffs_base__status(*)(void*,
75346
      wuffs_base__pixel_buffer*,
75347
      wuffs_base__io_buffer*,
75348
      wuffs_base__pixel_blend,
75349
      wuffs_base__slice_u8,
75350
      wuffs_base__decode_frame_options*))(&wuffs_qoi__decoder__decode_frame),
75351
  (wuffs_base__status(*)(void*,
75352
      wuffs_base__frame_config*,
75353
      wuffs_base__io_buffer*))(&wuffs_qoi__decoder__decode_frame_config),
75354
  (wuffs_base__status(*)(void*,
75355
      wuffs_base__image_config*,
75356
      wuffs_base__io_buffer*))(&wuffs_qoi__decoder__decode_image_config),
75357
  (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_qoi__decoder__frame_dirty_rect),
75358
  (uint64_t(*)(const void*,
75359
      uint32_t))(&wuffs_qoi__decoder__get_quirk),
75360
  (uint32_t(*)(const void*))(&wuffs_qoi__decoder__num_animation_loops),
75361
  (uint64_t(*)(const void*))(&wuffs_qoi__decoder__num_decoded_frame_configs),
75362
  (uint64_t(*)(const void*))(&wuffs_qoi__decoder__num_decoded_frames),
75363
  (wuffs_base__status(*)(void*,
75364
      uint64_t,
75365
      uint64_t))(&wuffs_qoi__decoder__restart_frame),
75366
  (wuffs_base__status(*)(void*,
75367
      uint32_t,
75368
      uint64_t))(&wuffs_qoi__decoder__set_quirk),
75369
  (wuffs_base__empty_struct(*)(void*,
75370
      uint32_t,
75371
      bool))(&wuffs_qoi__decoder__set_report_metadata),
75372
  (wuffs_base__status(*)(void*,
75373
      wuffs_base__io_buffer*,
75374
      wuffs_base__more_information*,
75375
      wuffs_base__io_buffer*))(&wuffs_qoi__decoder__tell_me_more),
75376
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_qoi__decoder__workbuf_len),
75377
};
75378
75379
// ---------------- Initializer Implementations
75380
75381
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
75382
wuffs_qoi__decoder__initialize(
75383
    wuffs_qoi__decoder* self,
75384
    size_t sizeof_star_self,
75385
    uint64_t wuffs_version,
75386
    uint32_t options){
75387
  if (!self) {
75388
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
75389
  }
75390
  if (sizeof(*self) != sizeof_star_self) {
75391
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
75392
  }
75393
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
75394
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
75395
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
75396
  }
75397
75398
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
75399
    // The whole point of this if-check is to detect an uninitialized *self.
75400
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
75401
#if !defined(__clang__) && defined(__GNUC__)
75402
#pragma GCC diagnostic push
75403
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
75404
#endif
75405
    if (self->private_impl.magic != 0) {
75406
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
75407
    }
75408
#if !defined(__clang__) && defined(__GNUC__)
75409
#pragma GCC diagnostic pop
75410
#endif
75411
  } else {
75412
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
75413
      memset(self, 0, sizeof(*self));
75414
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
75415
    } else {
75416
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
75417
    }
75418
  }
75419
75420
  self->private_impl.magic = WUFFS_BASE__MAGIC;
75421
  self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name =
75422
      wuffs_base__image_decoder__vtable_name;
75423
  self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers =
75424
      (const void*)(&wuffs_qoi__decoder__func_ptrs_for__wuffs_base__image_decoder);
75425
  return wuffs_base__make_status(NULL);
75426
}
75427
75428
wuffs_qoi__decoder*
75429
wuffs_qoi__decoder__alloc(void) {
75430
  wuffs_qoi__decoder* x =
75431
      (wuffs_qoi__decoder*)(calloc(1, sizeof(wuffs_qoi__decoder)));
75432
  if (!x) {
75433
    return NULL;
75434
  }
75435
  if (wuffs_qoi__decoder__initialize(
75436
      x, sizeof(wuffs_qoi__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
75437
    free(x);
75438
    return NULL;
75439
  }
75440
  return x;
75441
}
75442
75443
size_t
75444
sizeof__wuffs_qoi__decoder(void) {
75445
  return sizeof(wuffs_qoi__decoder);
75446
}
75447
75448
// ---------------- Function Implementations
75449
75450
// -------- func qoi.decoder.get_quirk
75451
75452
WUFFS_BASE__GENERATED_C_CODE
75453
WUFFS_BASE__MAYBE_STATIC uint64_t
75454
wuffs_qoi__decoder__get_quirk(
75455
    const wuffs_qoi__decoder* self,
75456
    uint32_t a_key) {
75457
  if (!self) {
75458
    return 0;
75459
  }
75460
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
75461
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
75462
    return 0;
75463
  }
75464
75465
  return 0u;
75466
}
75467
75468
// -------- func qoi.decoder.set_quirk
75469
75470
WUFFS_BASE__GENERATED_C_CODE
75471
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
75472
wuffs_qoi__decoder__set_quirk(
75473
    wuffs_qoi__decoder* self,
75474
    uint32_t a_key,
75475
    uint64_t a_value) {
75476
  if (!self) {
75477
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
75478
  }
75479
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
75480
    return wuffs_base__make_status(
75481
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
75482
        ? wuffs_base__error__disabled_by_previous_error
75483
        : wuffs_base__error__initialize_not_called);
75484
  }
75485
75486
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
75487
}
75488
75489
// -------- func qoi.decoder.decode_image_config
75490
75491
WUFFS_BASE__GENERATED_C_CODE
75492
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
75493
wuffs_qoi__decoder__decode_image_config(
75494
    wuffs_qoi__decoder* self,
75495
    wuffs_base__image_config* a_dst,
75496
    wuffs_base__io_buffer* a_src) {
75497
  if (!self) {
75498
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
75499
  }
75500
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
75501
    return wuffs_base__make_status(
75502
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
75503
        ? wuffs_base__error__disabled_by_previous_error
75504
        : wuffs_base__error__initialize_not_called);
75505
  }
75506
  if (!a_src) {
75507
    self->private_impl.magic = WUFFS_BASE__DISABLED;
75508
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
75509
  }
75510
  if ((self->private_impl.active_coroutine != 0) &&
75511
      (self->private_impl.active_coroutine != 1)) {
75512
    self->private_impl.magic = WUFFS_BASE__DISABLED;
75513
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
75514
  }
75515
  self->private_impl.active_coroutine = 0;
75516
  wuffs_base__status status = wuffs_base__make_status(NULL);
75517
75518
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
75519
75520
  uint32_t coro_susp_point = self->private_impl.p_decode_image_config;
75521
  switch (coro_susp_point) {
75522
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
75523
75524
    while (true) {
75525
      {
75526
        wuffs_base__status t_0 = wuffs_qoi__decoder__do_decode_image_config(self, a_dst, a_src);
75527
        v_status = t_0;
75528
      }
75529
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
75530
        status = wuffs_base__make_status(wuffs_qoi__error__truncated_input);
75531
        goto exit;
75532
      }
75533
      status = v_status;
75534
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
75535
    }
75536
75537
    ok:
75538
    self->private_impl.p_decode_image_config = 0;
75539
    goto exit;
75540
  }
75541
75542
  goto suspend;
75543
  suspend:
75544
  self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
75545
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
75546
75547
  goto exit;
75548
  exit:
75549
  if (wuffs_base__status__is_error(&status)) {
75550
    self->private_impl.magic = WUFFS_BASE__DISABLED;
75551
  }
75552
  return status;
75553
}
75554
75555
// -------- func qoi.decoder.do_decode_image_config
75556
75557
WUFFS_BASE__GENERATED_C_CODE
75558
static wuffs_base__status
75559
wuffs_qoi__decoder__do_decode_image_config(
75560
    wuffs_qoi__decoder* self,
75561
    wuffs_base__image_config* a_dst,
75562
    wuffs_base__io_buffer* a_src) {
75563
  wuffs_base__status status = wuffs_base__make_status(NULL);
75564
75565
  uint32_t v_a = 0;
75566
75567
  const uint8_t* iop_a_src = NULL;
75568
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
75569
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
75570
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
75571
  if (a_src && a_src->data.ptr) {
75572
    io0_a_src = a_src->data.ptr;
75573
    io1_a_src = io0_a_src + a_src->meta.ri;
75574
    iop_a_src = io1_a_src;
75575
    io2_a_src = io0_a_src + a_src->meta.wi;
75576
  }
75577
75578
  uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config;
75579
  switch (coro_susp_point) {
75580
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
75581
75582
    if (self->private_impl.f_call_sequence != 0u) {
75583
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
75584
      goto exit;
75585
    }
75586
    {
75587
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
75588
      uint32_t t_0;
75589
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
75590
        t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
75591
        iop_a_src += 4;
75592
      } else {
75593
        self->private_data.s_do_decode_image_config.scratch = 0;
75594
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
75595
        while (true) {
75596
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
75597
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
75598
            goto suspend;
75599
          }
75600
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
75601
          uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
75602
          *scratch <<= 8;
75603
          *scratch >>= 8;
75604
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
75605
          if (num_bits_0 == 24) {
75606
            t_0 = ((uint32_t)(*scratch));
75607
            break;
75608
          }
75609
          num_bits_0 += 8u;
75610
          *scratch |= ((uint64_t)(num_bits_0)) << 56;
75611
        }
75612
      }
75613
      v_a = t_0;
75614
    }
75615
    if (v_a != 1718185841u) {
75616
      status = wuffs_base__make_status(wuffs_qoi__error__bad_header);
75617
      goto exit;
75618
    }
75619
    {
75620
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
75621
      uint32_t t_1;
75622
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
75623
        t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
75624
        iop_a_src += 4;
75625
      } else {
75626
        self->private_data.s_do_decode_image_config.scratch = 0;
75627
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
75628
        while (true) {
75629
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
75630
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
75631
            goto suspend;
75632
          }
75633
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
75634
          uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu));
75635
          *scratch >>= 8;
75636
          *scratch <<= 8;
75637
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1);
75638
          if (num_bits_1 == 24) {
75639
            t_1 = ((uint32_t)(*scratch >> 32));
75640
            break;
75641
          }
75642
          num_bits_1 += 8u;
75643
          *scratch |= ((uint64_t)(num_bits_1));
75644
        }
75645
      }
75646
      v_a = t_1;
75647
    }
75648
    if (v_a > 16777215u) {
75649
      status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension);
75650
      goto exit;
75651
    }
75652
    self->private_impl.f_width = v_a;
75653
    {
75654
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
75655
      uint32_t t_2;
75656
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
75657
        t_2 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
75658
        iop_a_src += 4;
75659
      } else {
75660
        self->private_data.s_do_decode_image_config.scratch = 0;
75661
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
75662
        while (true) {
75663
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
75664
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
75665
            goto suspend;
75666
          }
75667
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
75668
          uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu));
75669
          *scratch >>= 8;
75670
          *scratch <<= 8;
75671
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2);
75672
          if (num_bits_2 == 24) {
75673
            t_2 = ((uint32_t)(*scratch >> 32));
75674
            break;
75675
          }
75676
          num_bits_2 += 8u;
75677
          *scratch |= ((uint64_t)(num_bits_2));
75678
        }
75679
      }
75680
      v_a = t_2;
75681
    }
75682
    if (v_a > 16777215u) {
75683
      status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension);
75684
      goto exit;
75685
    }
75686
    self->private_impl.f_height = v_a;
75687
    {
75688
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
75689
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
75690
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
75691
        goto suspend;
75692
      }
75693
      uint32_t t_3 = *iop_a_src++;
75694
      v_a = t_3;
75695
    }
75696
    if (v_a == 3u) {
75697
      self->private_impl.f_pixfmt = 2415954056u;
75698
    } else if (v_a == 4u) {
75699
      self->private_impl.f_pixfmt = 2164295816u;
75700
    } else {
75701
      status = wuffs_base__make_status(wuffs_qoi__error__bad_header);
75702
      goto exit;
75703
    }
75704
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
75705
    if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
75706
      status = wuffs_base__make_status(wuffs_base__suspension__short_read);
75707
      goto suspend;
75708
    }
75709
    iop_a_src++;
75710
    if (a_dst != NULL) {
75711
      wuffs_base__image_config__set(
75712
          a_dst,
75713
          self->private_impl.f_pixfmt,
75714
          0u,
75715
          self->private_impl.f_width,
75716
          self->private_impl.f_height,
75717
          14u,
75718
          (self->private_impl.f_pixfmt == 2415954056u));
75719
    }
75720
    self->private_impl.f_call_sequence = 32u;
75721
75722
    goto ok;
75723
    ok:
75724
    self->private_impl.p_do_decode_image_config = 0;
75725
    goto exit;
75726
  }
75727
75728
  goto suspend;
75729
  suspend:
75730
  self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
75731
75732
  goto exit;
75733
  exit:
75734
  if (a_src && a_src->data.ptr) {
75735
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
75736
  }
75737
75738
  return status;
75739
}
75740
75741
// -------- func qoi.decoder.decode_frame_config
75742
75743
WUFFS_BASE__GENERATED_C_CODE
75744
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
75745
wuffs_qoi__decoder__decode_frame_config(
75746
    wuffs_qoi__decoder* self,
75747
    wuffs_base__frame_config* a_dst,
75748
    wuffs_base__io_buffer* a_src) {
75749
  if (!self) {
75750
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
75751
  }
75752
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
75753
    return wuffs_base__make_status(
75754
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
75755
        ? wuffs_base__error__disabled_by_previous_error
75756
        : wuffs_base__error__initialize_not_called);
75757
  }
75758
  if (!a_src) {
75759
    self->private_impl.magic = WUFFS_BASE__DISABLED;
75760
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
75761
  }
75762
  if ((self->private_impl.active_coroutine != 0) &&
75763
      (self->private_impl.active_coroutine != 2)) {
75764
    self->private_impl.magic = WUFFS_BASE__DISABLED;
75765
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
75766
  }
75767
  self->private_impl.active_coroutine = 0;
75768
  wuffs_base__status status = wuffs_base__make_status(NULL);
75769
75770
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
75771
75772
  uint32_t coro_susp_point = self->private_impl.p_decode_frame_config;
75773
  switch (coro_susp_point) {
75774
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
75775
75776
    while (true) {
75777
      {
75778
        wuffs_base__status t_0 = wuffs_qoi__decoder__do_decode_frame_config(self, a_dst, a_src);
75779
        v_status = t_0;
75780
      }
75781
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
75782
        status = wuffs_base__make_status(wuffs_qoi__error__truncated_input);
75783
        goto exit;
75784
      }
75785
      status = v_status;
75786
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
75787
    }
75788
75789
    ok:
75790
    self->private_impl.p_decode_frame_config = 0;
75791
    goto exit;
75792
  }
75793
75794
  goto suspend;
75795
  suspend:
75796
  self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
75797
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0;
75798
75799
  goto exit;
75800
  exit:
75801
  if (wuffs_base__status__is_error(&status)) {
75802
    self->private_impl.magic = WUFFS_BASE__DISABLED;
75803
  }
75804
  return status;
75805
}
75806
75807
// -------- func qoi.decoder.do_decode_frame_config
75808
75809
WUFFS_BASE__GENERATED_C_CODE
75810
static wuffs_base__status
75811
wuffs_qoi__decoder__do_decode_frame_config(
75812
    wuffs_qoi__decoder* self,
75813
    wuffs_base__frame_config* a_dst,
75814
    wuffs_base__io_buffer* a_src) {
75815
  wuffs_base__status status = wuffs_base__make_status(NULL);
75816
75817
  wuffs_base__pixel_format v_pixfmt = {0};
75818
75819
  const uint8_t* iop_a_src = NULL;
75820
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
75821
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
75822
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
75823
  if (a_src && a_src->data.ptr) {
75824
    io0_a_src = a_src->data.ptr;
75825
    io1_a_src = io0_a_src + a_src->meta.ri;
75826
    iop_a_src = io1_a_src;
75827
    io2_a_src = io0_a_src + a_src->meta.wi;
75828
  }
75829
75830
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config;
75831
  switch (coro_susp_point) {
75832
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
75833
75834
    if (self->private_impl.f_call_sequence == 32u) {
75835
    } else if (self->private_impl.f_call_sequence < 32u) {
75836
      if (a_src) {
75837
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
75838
      }
75839
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
75840
      status = wuffs_qoi__decoder__do_decode_image_config(self, NULL, a_src);
75841
      if (a_src) {
75842
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
75843
      }
75844
      if (status.repr) {
75845
        goto suspend;
75846
      }
75847
    } else if (self->private_impl.f_call_sequence == 40u) {
75848
      if (14u != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) {
75849
        status = wuffs_base__make_status(wuffs_base__error__bad_restart);
75850
        goto exit;
75851
      }
75852
    } else if (self->private_impl.f_call_sequence == 64u) {
75853
      self->private_impl.f_call_sequence = 96u;
75854
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
75855
      goto ok;
75856
    } else {
75857
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
75858
      goto ok;
75859
    }
75860
    if (a_dst != NULL) {
75861
      v_pixfmt = wuffs_base__utility__make_pixel_format(self->private_impl.f_pixfmt);
75862
      wuffs_base__frame_config__set(
75863
          a_dst,
75864
          wuffs_base__utility__make_rect_ie_u32(
75865
          0u,
75866
          0u,
75867
          self->private_impl.f_width,
75868
          self->private_impl.f_height),
75869
          ((wuffs_base__flicks)(0u)),
75870
          0u,
75871
          14u,
75872
          0u,
75873
          (self->private_impl.f_pixfmt == 2415954056u),
75874
          false,
75875
          wuffs_base__pixel_format__default_background_color(&v_pixfmt));
75876
    }
75877
    self->private_impl.f_call_sequence = 64u;
75878
75879
    ok:
75880
    self->private_impl.p_do_decode_frame_config = 0;
75881
    goto exit;
75882
  }
75883
75884
  goto suspend;
75885
  suspend:
75886
  self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
75887
75888
  goto exit;
75889
  exit:
75890
  if (a_src && a_src->data.ptr) {
75891
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
75892
  }
75893
75894
  return status;
75895
}
75896
75897
// -------- func qoi.decoder.decode_frame
75898
75899
WUFFS_BASE__GENERATED_C_CODE
75900
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
75901
wuffs_qoi__decoder__decode_frame(
75902
    wuffs_qoi__decoder* self,
75903
    wuffs_base__pixel_buffer* a_dst,
75904
    wuffs_base__io_buffer* a_src,
75905
    wuffs_base__pixel_blend a_blend,
75906
    wuffs_base__slice_u8 a_workbuf,
75907
    wuffs_base__decode_frame_options* a_opts) {
75908
  if (!self) {
75909
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
75910
  }
75911
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
75912
    return wuffs_base__make_status(
75913
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
75914
        ? wuffs_base__error__disabled_by_previous_error
75915
        : wuffs_base__error__initialize_not_called);
75916
  }
75917
  if (!a_dst || !a_src) {
75918
    self->private_impl.magic = WUFFS_BASE__DISABLED;
75919
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
75920
  }
75921
  if ((self->private_impl.active_coroutine != 0) &&
75922
      (self->private_impl.active_coroutine != 3)) {
75923
    self->private_impl.magic = WUFFS_BASE__DISABLED;
75924
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
75925
  }
75926
  self->private_impl.active_coroutine = 0;
75927
  wuffs_base__status status = wuffs_base__make_status(NULL);
75928
75929
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
75930
75931
  uint32_t coro_susp_point = self->private_impl.p_decode_frame;
75932
  switch (coro_susp_point) {
75933
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
75934
75935
    while (true) {
75936
      {
75937
        wuffs_base__status t_0 = wuffs_qoi__decoder__do_decode_frame(self,
75938
            a_dst,
75939
            a_src,
75940
            a_blend,
75941
            a_workbuf,
75942
            a_opts);
75943
        v_status = t_0;
75944
      }
75945
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
75946
        status = wuffs_base__make_status(wuffs_qoi__error__truncated_input);
75947
        goto exit;
75948
      }
75949
      status = v_status;
75950
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
75951
    }
75952
75953
    ok:
75954
    self->private_impl.p_decode_frame = 0;
75955
    goto exit;
75956
  }
75957
75958
  goto suspend;
75959
  suspend:
75960
  self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
75961
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0;
75962
75963
  goto exit;
75964
  exit:
75965
  if (wuffs_base__status__is_error(&status)) {
75966
    self->private_impl.magic = WUFFS_BASE__DISABLED;
75967
  }
75968
  return status;
75969
}
75970
75971
// -------- func qoi.decoder.do_decode_frame
75972
75973
WUFFS_BASE__GENERATED_C_CODE
75974
static wuffs_base__status
75975
wuffs_qoi__decoder__do_decode_frame(
75976
    wuffs_qoi__decoder* self,
75977
    wuffs_base__pixel_buffer* a_dst,
75978
    wuffs_base__io_buffer* a_src,
75979
    wuffs_base__pixel_blend a_blend,
75980
    wuffs_base__slice_u8 a_workbuf,
75981
    wuffs_base__decode_frame_options* a_opts) {
75982
  wuffs_base__status status = wuffs_base__make_status(NULL);
75983
75984
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
75985
  uint64_t v_c64 = 0;
75986
75987
  const uint8_t* iop_a_src = NULL;
75988
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
75989
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
75990
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
75991
  if (a_src && a_src->data.ptr) {
75992
    io0_a_src = a_src->data.ptr;
75993
    io1_a_src = io0_a_src + a_src->meta.ri;
75994
    iop_a_src = io1_a_src;
75995
    io2_a_src = io0_a_src + a_src->meta.wi;
75996
  }
75997
75998
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame;
75999
  switch (coro_susp_point) {
76000
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
76001
76002
    if (self->private_impl.f_call_sequence == 64u) {
76003
    } else if (self->private_impl.f_call_sequence < 64u) {
76004
      if (a_src) {
76005
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
76006
      }
76007
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
76008
      status = wuffs_qoi__decoder__do_decode_frame_config(self, NULL, a_src);
76009
      if (a_src) {
76010
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
76011
      }
76012
      if (status.repr) {
76013
        goto suspend;
76014
      }
76015
    } else {
76016
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
76017
      goto ok;
76018
    }
76019
    v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler,
76020
        wuffs_base__pixel_buffer__pixel_format(a_dst),
76021
        wuffs_base__pixel_buffer__palette(a_dst),
76022
        wuffs_base__utility__make_pixel_format(self->private_impl.f_pixfmt),
76023
        wuffs_base__utility__empty_slice_u8(),
76024
        a_blend);
76025
    if ( ! wuffs_base__status__is_ok(&v_status)) {
76026
      status = v_status;
76027
      if (wuffs_base__status__is_error(&status)) {
76028
        goto exit;
76029
      } else if (wuffs_base__status__is_suspension(&status)) {
76030
        status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
76031
        goto exit;
76032
      }
76033
      goto ok;
76034
    }
76035
    self->private_impl.f_dst_x = 0u;
76036
    self->private_impl.f_dst_y = 0u;
76037
    self->private_data.f_pixel[0u] = 0u;
76038
    self->private_data.f_pixel[1u] = 0u;
76039
    self->private_data.f_pixel[2u] = 0u;
76040
    self->private_data.f_pixel[3u] = 255u;
76041
    wuffs_private_impl__bulk_memset(&self->private_data.f_cache[0], 256u, 0u);
76042
    self->private_impl.f_remaining_pixels_times_4 = (((uint64_t)(self->private_impl.f_width)) * ((uint64_t)(self->private_impl.f_height)) * 4u);
76043
    while (self->private_impl.f_remaining_pixels_times_4 > 0u) {
76044
      if (a_src) {
76045
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
76046
      }
76047
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
76048
      status = wuffs_qoi__decoder__from_src_to_buffer(self, a_src);
76049
      if (a_src) {
76050
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
76051
      }
76052
      if (status.repr) {
76053
        goto suspend;
76054
      }
76055
      if (self->private_impl.f_remaining_pixels_times_4 < ((uint64_t)(self->private_impl.f_buffer_index))) {
76056
        status = wuffs_base__make_status(wuffs_base__error__too_much_data);
76057
        goto exit;
76058
      }
76059
      self->private_impl.f_remaining_pixels_times_4 -= ((uint64_t)(self->private_impl.f_buffer_index));
76060
      v_status = wuffs_qoi__decoder__from_buffer_to_dst(self, a_dst);
76061
      if ( ! wuffs_base__status__is_ok(&v_status)) {
76062
        status = v_status;
76063
        if (wuffs_base__status__is_error(&status)) {
76064
          goto exit;
76065
        } else if (wuffs_base__status__is_suspension(&status)) {
76066
          status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
76067
          goto exit;
76068
        }
76069
        goto ok;
76070
      }
76071
    }
76072
    {
76073
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
76074
      uint64_t t_0;
76075
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) {
76076
        t_0 = wuffs_base__peek_u64be__no_bounds_check(iop_a_src);
76077
        iop_a_src += 8;
76078
      } else {
76079
        self->private_data.s_do_decode_frame.scratch = 0;
76080
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
76081
        while (true) {
76082
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
76083
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
76084
            goto suspend;
76085
          }
76086
          uint64_t* scratch = &self->private_data.s_do_decode_frame.scratch;
76087
          uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu));
76088
          *scratch >>= 8;
76089
          *scratch <<= 8;
76090
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0);
76091
          if (num_bits_0 == 56) {
76092
            t_0 = ((uint64_t)(*scratch >> 0));
76093
            break;
76094
          }
76095
          num_bits_0 += 8u;
76096
          *scratch |= ((uint64_t)(num_bits_0));
76097
        }
76098
      }
76099
      v_c64 = t_0;
76100
    }
76101
    if (v_c64 != 1u) {
76102
      status = wuffs_base__make_status(wuffs_qoi__error__bad_footer);
76103
      goto exit;
76104
    }
76105
    self->private_impl.f_call_sequence = 96u;
76106
76107
    ok:
76108
    self->private_impl.p_do_decode_frame = 0;
76109
    goto exit;
76110
  }
76111
76112
  goto suspend;
76113
  suspend:
76114
  self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
76115
76116
  goto exit;
76117
  exit:
76118
  if (a_src && a_src->data.ptr) {
76119
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
76120
  }
76121
76122
  return status;
76123
}
76124
76125
// -------- func qoi.decoder.from_src_to_buffer
76126
76127
WUFFS_BASE__GENERATED_C_CODE
76128
static wuffs_base__status
76129
wuffs_qoi__decoder__from_src_to_buffer(
76130
    wuffs_qoi__decoder* self,
76131
    wuffs_base__io_buffer* a_src) {
76132
  wuffs_base__status status = wuffs_base__make_status(NULL);
76133
76134
  uint8_t v_c8 = 0;
76135
  uint8_t v_dg = 0;
76136
  uint32_t v_bi = 0;
76137
  uint32_t v_bj = 0;
76138
  uint32_t v_bk = 0;
76139
  uint32_t v_ci = 0;
76140
  uint32_t v_hash4 = 0;
76141
76142
  const uint8_t* iop_a_src = NULL;
76143
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
76144
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
76145
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
76146
  if (a_src && a_src->data.ptr) {
76147
    io0_a_src = a_src->data.ptr;
76148
    io1_a_src = io0_a_src + a_src->meta.ri;
76149
    iop_a_src = io1_a_src;
76150
    io2_a_src = io0_a_src + a_src->meta.wi;
76151
  }
76152
76153
  uint32_t coro_susp_point = self->private_impl.p_from_src_to_buffer;
76154
  if (coro_susp_point) {
76155
    v_dg = self->private_data.s_from_src_to_buffer.v_dg;
76156
    v_bi = self->private_data.s_from_src_to_buffer.v_bi;
76157
    v_bk = self->private_data.s_from_src_to_buffer.v_bk;
76158
  }
76159
  switch (coro_susp_point) {
76160
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
76161
76162
    v_bk = 7936u;
76163
    if (self->private_impl.f_remaining_pixels_times_4 < 7936u) {
76164
      v_bk = ((uint32_t)(self->private_impl.f_remaining_pixels_times_4));
76165
    }
76166
    while (v_bi < v_bk) {
76167
      {
76168
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
76169
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
76170
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
76171
          goto suspend;
76172
        }
76173
        uint8_t t_0 = *iop_a_src++;
76174
        v_c8 = t_0;
76175
      }
76176
      if (v_c8 == 254u) {
76177
        {
76178
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
76179
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
76180
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
76181
            goto suspend;
76182
          }
76183
          uint8_t t_1 = *iop_a_src++;
76184
          self->private_data.f_pixel[2u] = t_1;
76185
        }
76186
        {
76187
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
76188
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
76189
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
76190
            goto suspend;
76191
          }
76192
          uint8_t t_2 = *iop_a_src++;
76193
          self->private_data.f_pixel[1u] = t_2;
76194
        }
76195
        {
76196
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
76197
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
76198
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
76199
            goto suspend;
76200
          }
76201
          uint8_t t_3 = *iop_a_src++;
76202
          self->private_data.f_pixel[0u] = t_3;
76203
        }
76204
      } else if (v_c8 == 255u) {
76205
        {
76206
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
76207
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
76208
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
76209
            goto suspend;
76210
          }
76211
          uint8_t t_4 = *iop_a_src++;
76212
          self->private_data.f_pixel[2u] = t_4;
76213
        }
76214
        {
76215
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
76216
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
76217
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
76218
            goto suspend;
76219
          }
76220
          uint8_t t_5 = *iop_a_src++;
76221
          self->private_data.f_pixel[1u] = t_5;
76222
        }
76223
        {
76224
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
76225
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
76226
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
76227
            goto suspend;
76228
          }
76229
          uint8_t t_6 = *iop_a_src++;
76230
          self->private_data.f_pixel[0u] = t_6;
76231
        }
76232
        {
76233
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
76234
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
76235
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
76236
            goto suspend;
76237
          }
76238
          uint8_t t_7 = *iop_a_src++;
76239
          self->private_data.f_pixel[3u] = t_7;
76240
        }
76241
      } else if (((uint8_t)(v_c8 >> 6u)) == 0u) {
76242
        v_ci = (4u * ((uint32_t)(((uint8_t)(v_c8 & 63u)))));
76243
        self->private_data.f_pixel[0u] = self->private_data.f_cache[(v_ci + 0u)];
76244
        self->private_data.f_pixel[1u] = self->private_data.f_cache[(v_ci + 1u)];
76245
        self->private_data.f_pixel[2u] = self->private_data.f_cache[(v_ci + 2u)];
76246
        self->private_data.f_pixel[3u] = self->private_data.f_cache[(v_ci + 3u)];
76247
        self->private_data.f_buffer[(v_bi + 0u)] = self->private_data.f_pixel[0u];
76248
        self->private_data.f_buffer[(v_bi + 1u)] = self->private_data.f_pixel[1u];
76249
        self->private_data.f_buffer[(v_bi + 2u)] = self->private_data.f_pixel[2u];
76250
        self->private_data.f_buffer[(v_bi + 3u)] = self->private_data.f_pixel[3u];
76251
        v_bi += 4u;
76252
        continue;
76253
      } else if (((uint8_t)(v_c8 >> 6u)) == 1u) {
76254
#if defined(__GNUC__)
76255
#pragma GCC diagnostic push
76256
#pragma GCC diagnostic ignored "-Wconversion"
76257
#endif
76258
        self->private_data.f_pixel[2u] += ((uint8_t)(((uint8_t)(((uint8_t)(v_c8 >> 4u)) & 3u)) + 254u));
76259
        self->private_data.f_pixel[1u] += ((uint8_t)(((uint8_t)(((uint8_t)(v_c8 >> 2u)) & 3u)) + 254u));
76260
        self->private_data.f_pixel[0u] += ((uint8_t)(((uint8_t)(((uint8_t)(v_c8 >> 0u)) & 3u)) + 254u));
76261
#if defined(__GNUC__)
76262
#pragma GCC diagnostic pop
76263
#endif
76264
      } else if (((uint8_t)(v_c8 >> 6u)) == 2u) {
76265
        v_dg = ((uint8_t)(((uint8_t)(v_c8 & 63u)) + 224u));
76266
        {
76267
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
76268
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
76269
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
76270
            goto suspend;
76271
          }
76272
          uint8_t t_8 = *iop_a_src++;
76273
          v_c8 = t_8;
76274
        }
76275
#if defined(__GNUC__)
76276
#pragma GCC diagnostic push
76277
#pragma GCC diagnostic ignored "-Wconversion"
76278
#endif
76279
        self->private_data.f_pixel[2u] += ((uint8_t)(((uint8_t)(v_dg + 248u)) + ((uint8_t)(15u & ((uint8_t)(v_c8 >> 4u))))));
76280
        self->private_data.f_pixel[1u] += v_dg;
76281
        self->private_data.f_pixel[0u] += ((uint8_t)(((uint8_t)(v_dg + 248u)) + ((uint8_t)(15u & ((uint8_t)(v_c8 >> 0u))))));
76282
#if defined(__GNUC__)
76283
#pragma GCC diagnostic pop
76284
#endif
76285
      } else {
76286
        v_bj = (v_bi + (4u * (63u & (1u + ((uint32_t)(v_c8))))));
76287
        while (v_bi < v_bj) {
76288
          self->private_data.f_buffer[(v_bi + 0u)] = self->private_data.f_pixel[0u];
76289
          self->private_data.f_buffer[(v_bi + 1u)] = self->private_data.f_pixel[1u];
76290
          self->private_data.f_buffer[(v_bi + 2u)] = self->private_data.f_pixel[2u];
76291
          self->private_data.f_buffer[(v_bi + 3u)] = self->private_data.f_pixel[3u];
76292
          v_bi += 4u;
76293
        }
76294
        continue;
76295
      }
76296
      v_hash4 = (4u * (63u & ((((uint32_t)(self->private_data.f_pixel[2u])) * 3u) +
76297
          (((uint32_t)(self->private_data.f_pixel[1u])) * 5u) +
76298
          (((uint32_t)(self->private_data.f_pixel[0u])) * 7u) +
76299
          (((uint32_t)(self->private_data.f_pixel[3u])) * 11u))));
76300
      self->private_data.f_cache[(v_hash4 + 0u)] = self->private_data.f_pixel[0u];
76301
      self->private_data.f_cache[(v_hash4 + 1u)] = self->private_data.f_pixel[1u];
76302
      self->private_data.f_cache[(v_hash4 + 2u)] = self->private_data.f_pixel[2u];
76303
      self->private_data.f_cache[(v_hash4 + 3u)] = self->private_data.f_pixel[3u];
76304
      self->private_data.f_buffer[(v_bi + 0u)] = self->private_data.f_pixel[0u];
76305
      self->private_data.f_buffer[(v_bi + 1u)] = self->private_data.f_pixel[1u];
76306
      self->private_data.f_buffer[(v_bi + 2u)] = self->private_data.f_pixel[2u];
76307
      self->private_data.f_buffer[(v_bi + 3u)] = self->private_data.f_pixel[3u];
76308
      v_bi += 4u;
76309
    }
76310
    self->private_impl.f_buffer_index = v_bi;
76311
76312
    goto ok;
76313
    ok:
76314
    self->private_impl.p_from_src_to_buffer = 0;
76315
    goto exit;
76316
  }
76317
76318
  goto suspend;
76319
  suspend:
76320
  self->private_impl.p_from_src_to_buffer = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
76321
  self->private_data.s_from_src_to_buffer.v_dg = v_dg;
76322
  self->private_data.s_from_src_to_buffer.v_bi = v_bi;
76323
  self->private_data.s_from_src_to_buffer.v_bk = v_bk;
76324
76325
  goto exit;
76326
  exit:
76327
  if (a_src && a_src->data.ptr) {
76328
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
76329
  }
76330
76331
  return status;
76332
}
76333
76334
// -------- func qoi.decoder.from_buffer_to_dst
76335
76336
WUFFS_BASE__GENERATED_C_CODE
76337
static wuffs_base__status
76338
wuffs_qoi__decoder__from_buffer_to_dst(
76339
    wuffs_qoi__decoder* self,
76340
    wuffs_base__pixel_buffer* a_dst) {
76341
  wuffs_base__pixel_format v_dst_pixfmt = {0};
76342
  uint32_t v_dst_bits_per_pixel = 0;
76343
  uint32_t v_dst_bytes_per_pixel = 0;
76344
  uint64_t v_dst_bytes_per_row = 0;
76345
  wuffs_base__table_u8 v_tab = {0};
76346
  uint32_t v_bi = 0;
76347
  uint32_t v_rem_x = 0;
76348
  wuffs_base__slice_u8 v_dst = {0};
76349
  wuffs_base__slice_u8 v_src = {0};
76350
  uint32_t v_src_length = 0;
76351
  uint64_t v_i = 0;
76352
76353
  v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
76354
  v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
76355
  if ((v_dst_bits_per_pixel & 7u) != 0u) {
76356
    return wuffs_base__make_status(wuffs_base__error__unsupported_option);
76357
  }
76358
  v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u);
76359
  v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel)));
76360
  v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
76361
  while (v_bi < self->private_impl.f_buffer_index) {
76362
    if (self->private_impl.f_width <= self->private_impl.f_dst_x) {
76363
      self->private_impl.f_dst_x = 0u;
76364
      self->private_impl.f_dst_y += 1u;
76365
      if (self->private_impl.f_dst_y >= self->private_impl.f_height) {
76366
        break;
76367
      }
76368
      v_rem_x = self->private_impl.f_width;
76369
    } else {
76370
      v_rem_x = (self->private_impl.f_width - self->private_impl.f_dst_x);
76371
    }
76372
    v_src = wuffs_base__make_slice_u8_ij(self->private_data.f_buffer, v_bi, self->private_impl.f_buffer_index);
76373
    if (((uint64_t)((4u * v_rem_x))) < ((uint64_t)(v_src.len))) {
76374
      v_src = wuffs_base__slice_u8__subslice_j(v_src, ((uint64_t)((4u * v_rem_x))));
76375
    }
76376
    v_src_length = ((uint32_t)(((uint64_t)(v_src.len))));
76377
    v_bi += v_src_length;
76378
    v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y);
76379
    if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) {
76380
      v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row);
76381
    }
76382
    v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel)));
76383
    self->private_impl.f_dst_x += (v_src_length / 4u);
76384
    if (v_i < ((uint64_t)(v_dst.len))) {
76385
      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);
76386
    }
76387
  }
76388
  return wuffs_base__make_status(NULL);
76389
}
76390
76391
// -------- func qoi.decoder.frame_dirty_rect
76392
76393
WUFFS_BASE__GENERATED_C_CODE
76394
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
76395
wuffs_qoi__decoder__frame_dirty_rect(
76396
    const wuffs_qoi__decoder* self) {
76397
  if (!self) {
76398
    return wuffs_base__utility__empty_rect_ie_u32();
76399
  }
76400
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
76401
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
76402
    return wuffs_base__utility__empty_rect_ie_u32();
76403
  }
76404
76405
  return wuffs_base__utility__make_rect_ie_u32(
76406
      0u,
76407
      0u,
76408
      self->private_impl.f_width,
76409
      self->private_impl.f_height);
76410
}
76411
76412
// -------- func qoi.decoder.num_animation_loops
76413
76414
WUFFS_BASE__GENERATED_C_CODE
76415
WUFFS_BASE__MAYBE_STATIC uint32_t
76416
wuffs_qoi__decoder__num_animation_loops(
76417
    const wuffs_qoi__decoder* self) {
76418
  if (!self) {
76419
    return 0;
76420
  }
76421
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
76422
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
76423
    return 0;
76424
  }
76425
76426
  return 0u;
76427
}
76428
76429
// -------- func qoi.decoder.num_decoded_frame_configs
76430
76431
WUFFS_BASE__GENERATED_C_CODE
76432
WUFFS_BASE__MAYBE_STATIC uint64_t
76433
wuffs_qoi__decoder__num_decoded_frame_configs(
76434
    const wuffs_qoi__decoder* self) {
76435
  if (!self) {
76436
    return 0;
76437
  }
76438
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
76439
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
76440
    return 0;
76441
  }
76442
76443
  if (self->private_impl.f_call_sequence > 32u) {
76444
    return 1u;
76445
  }
76446
  return 0u;
76447
}
76448
76449
// -------- func qoi.decoder.num_decoded_frames
76450
76451
WUFFS_BASE__GENERATED_C_CODE
76452
WUFFS_BASE__MAYBE_STATIC uint64_t
76453
wuffs_qoi__decoder__num_decoded_frames(
76454
    const wuffs_qoi__decoder* self) {
76455
  if (!self) {
76456
    return 0;
76457
  }
76458
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
76459
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
76460
    return 0;
76461
  }
76462
76463
  if (self->private_impl.f_call_sequence > 64u) {
76464
    return 1u;
76465
  }
76466
  return 0u;
76467
}
76468
76469
// -------- func qoi.decoder.restart_frame
76470
76471
WUFFS_BASE__GENERATED_C_CODE
76472
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
76473
wuffs_qoi__decoder__restart_frame(
76474
    wuffs_qoi__decoder* self,
76475
    uint64_t a_index,
76476
    uint64_t a_io_position) {
76477
  if (!self) {
76478
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
76479
  }
76480
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
76481
    return wuffs_base__make_status(
76482
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
76483
        ? wuffs_base__error__disabled_by_previous_error
76484
        : wuffs_base__error__initialize_not_called);
76485
  }
76486
76487
  if (self->private_impl.f_call_sequence < 32u) {
76488
    return wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
76489
  }
76490
  if ((a_index != 0u) || (a_io_position != 14u)) {
76491
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
76492
  }
76493
  self->private_impl.f_call_sequence = 40u;
76494
  return wuffs_base__make_status(NULL);
76495
}
76496
76497
// -------- func qoi.decoder.set_report_metadata
76498
76499
WUFFS_BASE__GENERATED_C_CODE
76500
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
76501
wuffs_qoi__decoder__set_report_metadata(
76502
    wuffs_qoi__decoder* self,
76503
    uint32_t a_fourcc,
76504
    bool a_report) {
76505
  return wuffs_base__make_empty_struct();
76506
}
76507
76508
// -------- func qoi.decoder.tell_me_more
76509
76510
WUFFS_BASE__GENERATED_C_CODE
76511
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
76512
wuffs_qoi__decoder__tell_me_more(
76513
    wuffs_qoi__decoder* self,
76514
    wuffs_base__io_buffer* a_dst,
76515
    wuffs_base__more_information* a_minfo,
76516
    wuffs_base__io_buffer* a_src) {
76517
  if (!self) {
76518
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
76519
  }
76520
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
76521
    return wuffs_base__make_status(
76522
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
76523
        ? wuffs_base__error__disabled_by_previous_error
76524
        : wuffs_base__error__initialize_not_called);
76525
  }
76526
  if (!a_dst || !a_src) {
76527
    self->private_impl.magic = WUFFS_BASE__DISABLED;
76528
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
76529
  }
76530
  if ((self->private_impl.active_coroutine != 0) &&
76531
      (self->private_impl.active_coroutine != 4)) {
76532
    self->private_impl.magic = WUFFS_BASE__DISABLED;
76533
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
76534
  }
76535
  self->private_impl.active_coroutine = 0;
76536
  wuffs_base__status status = wuffs_base__make_status(NULL);
76537
76538
  status = wuffs_base__make_status(wuffs_base__error__no_more_information);
76539
  goto exit;
76540
76541
  goto ok;
76542
  ok:
76543
  goto exit;
76544
  exit:
76545
  if (wuffs_base__status__is_error(&status)) {
76546
    self->private_impl.magic = WUFFS_BASE__DISABLED;
76547
  }
76548
  return status;
76549
}
76550
76551
// -------- func qoi.decoder.workbuf_len
76552
76553
WUFFS_BASE__GENERATED_C_CODE
76554
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
76555
wuffs_qoi__decoder__workbuf_len(
76556
    const wuffs_qoi__decoder* self) {
76557
  if (!self) {
76558
    return wuffs_base__utility__empty_range_ii_u64();
76559
  }
76560
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
76561
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
76562
    return wuffs_base__utility__empty_range_ii_u64();
76563
  }
76564
76565
  return wuffs_base__utility__make_range_ii_u64(0u, 0u);
76566
}
76567
76568
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__QOI)
76569
76570
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__SHA256)
76571
76572
// ---------------- Status Codes Implementations
76573
76574
// ---------------- Private Consts
76575
76576
static const uint32_t
76577
WUFFS_SHA256__INITIAL_SHA256_H[8] WUFFS_BASE__POTENTIALLY_UNUSED = {
76578
  1779033703u, 3144134277u, 1013904242u, 2773480762u, 1359893119u, 2600822924u, 528734635u, 1541459225u,
76579
};
76580
76581
static const uint32_t
76582
WUFFS_SHA256__K[64] WUFFS_BASE__POTENTIALLY_UNUSED = {
76583
  1116352408u, 1899447441u, 3049323471u, 3921009573u, 961987163u, 1508970993u, 2453635748u, 2870763221u,
76584
  3624381080u, 310598401u, 607225278u, 1426881987u, 1925078388u, 2162078206u, 2614888103u, 3248222580u,
76585
  3835390401u, 4022224774u, 264347078u, 604807628u, 770255983u, 1249150122u, 1555081692u, 1996064986u,
76586
  2554220882u, 2821834349u, 2952996808u, 3210313671u, 3336571891u, 3584528711u, 113926993u, 338241895u,
76587
  666307205u, 773529912u, 1294757372u, 1396182291u, 1695183700u, 1986661051u, 2177026350u, 2456956037u,
76588
  2730485921u, 2820302411u, 3259730800u, 3345764771u, 3516065817u, 3600352804u, 4094571909u, 275423344u,
76589
  430227734u, 506948616u, 659060556u, 883997877u, 958139571u, 1322822218u, 1537002063u, 1747873779u,
76590
  1955562222u, 2024104815u, 2227730452u, 2361852424u, 2428436474u, 2756734187u, 3204031479u, 3329325298u,
76591
};
76592
76593
// ---------------- Private Initializer Prototypes
76594
76595
// ---------------- Private Function Prototypes
76596
76597
WUFFS_BASE__GENERATED_C_CODE
76598
static wuffs_base__empty_struct
76599
wuffs_sha256__hasher__up(
76600
    wuffs_sha256__hasher* self,
76601
    wuffs_base__slice_u8 a_x);
76602
76603
// ---------------- VTables
76604
76605
const wuffs_base__hasher_bitvec256__func_ptrs
76606
wuffs_sha256__hasher__func_ptrs_for__wuffs_base__hasher_bitvec256 = {
76607
  (wuffs_base__bitvec256(*)(const void*))(&wuffs_sha256__hasher__checksum_bitvec256),
76608
  (uint64_t(*)(const void*,
76609
      uint32_t))(&wuffs_sha256__hasher__get_quirk),
76610
  (wuffs_base__status(*)(void*,
76611
      uint32_t,
76612
      uint64_t))(&wuffs_sha256__hasher__set_quirk),
76613
  (wuffs_base__empty_struct(*)(void*,
76614
      wuffs_base__slice_u8))(&wuffs_sha256__hasher__update),
76615
  (wuffs_base__bitvec256(*)(void*,
76616
      wuffs_base__slice_u8))(&wuffs_sha256__hasher__update_bitvec256),
76617
};
76618
76619
// ---------------- Initializer Implementations
76620
76621
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
76622
wuffs_sha256__hasher__initialize(
76623
    wuffs_sha256__hasher* self,
76624
    size_t sizeof_star_self,
76625
    uint64_t wuffs_version,
76626
    uint32_t options){
76627
  if (!self) {
76628
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
76629
  }
76630
  if (sizeof(*self) != sizeof_star_self) {
76631
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
76632
  }
76633
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
76634
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
76635
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
76636
  }
76637
76638
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
76639
    // The whole point of this if-check is to detect an uninitialized *self.
76640
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
76641
#if !defined(__clang__) && defined(__GNUC__)
76642
#pragma GCC diagnostic push
76643
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
76644
#endif
76645
    if (self->private_impl.magic != 0) {
76646
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
76647
    }
76648
#if !defined(__clang__) && defined(__GNUC__)
76649
#pragma GCC diagnostic pop
76650
#endif
76651
  } else {
76652
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
76653
      memset(self, 0, sizeof(*self));
76654
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
76655
    } else {
76656
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
76657
    }
76658
  }
76659
76660
  self->private_impl.magic = WUFFS_BASE__MAGIC;
76661
  self->private_impl.vtable_for__wuffs_base__hasher_bitvec256.vtable_name =
76662
      wuffs_base__hasher_bitvec256__vtable_name;
76663
  self->private_impl.vtable_for__wuffs_base__hasher_bitvec256.function_pointers =
76664
      (const void*)(&wuffs_sha256__hasher__func_ptrs_for__wuffs_base__hasher_bitvec256);
76665
  return wuffs_base__make_status(NULL);
76666
}
76667
76668
wuffs_sha256__hasher*
76669
wuffs_sha256__hasher__alloc(void) {
76670
  wuffs_sha256__hasher* x =
76671
      (wuffs_sha256__hasher*)(calloc(1, sizeof(wuffs_sha256__hasher)));
76672
  if (!x) {
76673
    return NULL;
76674
  }
76675
  if (wuffs_sha256__hasher__initialize(
76676
      x, sizeof(wuffs_sha256__hasher), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
76677
    free(x);
76678
    return NULL;
76679
  }
76680
  return x;
76681
}
76682
76683
size_t
76684
sizeof__wuffs_sha256__hasher(void) {
76685
  return sizeof(wuffs_sha256__hasher);
76686
}
76687
76688
// ---------------- Function Implementations
76689
76690
// -------- func sha256.hasher.get_quirk
76691
76692
WUFFS_BASE__GENERATED_C_CODE
76693
WUFFS_BASE__MAYBE_STATIC uint64_t
76694
wuffs_sha256__hasher__get_quirk(
76695
    const wuffs_sha256__hasher* self,
76696
    uint32_t a_key) {
76697
  if (!self) {
76698
    return 0;
76699
  }
76700
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
76701
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
76702
    return 0;
76703
  }
76704
76705
  return 0u;
76706
}
76707
76708
// -------- func sha256.hasher.set_quirk
76709
76710
WUFFS_BASE__GENERATED_C_CODE
76711
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
76712
wuffs_sha256__hasher__set_quirk(
76713
    wuffs_sha256__hasher* self,
76714
    uint32_t a_key,
76715
    uint64_t a_value) {
76716
  if (!self) {
76717
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
76718
  }
76719
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
76720
    return wuffs_base__make_status(
76721
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
76722
        ? wuffs_base__error__disabled_by_previous_error
76723
        : wuffs_base__error__initialize_not_called);
76724
  }
76725
76726
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
76727
}
76728
76729
// -------- func sha256.hasher.update
76730
76731
WUFFS_BASE__GENERATED_C_CODE
76732
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
76733
wuffs_sha256__hasher__update(
76734
    wuffs_sha256__hasher* self,
76735
    wuffs_base__slice_u8 a_x) {
76736
  if (!self) {
76737
    return wuffs_base__make_empty_struct();
76738
  }
76739
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
76740
    return wuffs_base__make_empty_struct();
76741
  }
76742
76743
  uint64_t v_new_lmu = 0;
76744
76745
  if ((self->private_impl.f_length_modulo_u64 == 0u) &&  ! self->private_impl.f_length_overflows_u64) {
76746
    self->private_impl.f_h0 = WUFFS_SHA256__INITIAL_SHA256_H[0u];
76747
    self->private_impl.f_h1 = WUFFS_SHA256__INITIAL_SHA256_H[1u];
76748
    self->private_impl.f_h2 = WUFFS_SHA256__INITIAL_SHA256_H[2u];
76749
    self->private_impl.f_h3 = WUFFS_SHA256__INITIAL_SHA256_H[3u];
76750
    self->private_impl.f_h4 = WUFFS_SHA256__INITIAL_SHA256_H[4u];
76751
    self->private_impl.f_h5 = WUFFS_SHA256__INITIAL_SHA256_H[5u];
76752
    self->private_impl.f_h6 = WUFFS_SHA256__INITIAL_SHA256_H[6u];
76753
    self->private_impl.f_h7 = WUFFS_SHA256__INITIAL_SHA256_H[7u];
76754
  }
76755
  v_new_lmu = ((uint64_t)(self->private_impl.f_length_modulo_u64 + ((uint64_t)(a_x.len))));
76756
  self->private_impl.f_length_overflows_u64 = ((v_new_lmu < self->private_impl.f_length_modulo_u64) || self->private_impl.f_length_overflows_u64);
76757
  self->private_impl.f_length_modulo_u64 = v_new_lmu;
76758
  if (self->private_impl.f_buf_len != 0u) {
76759
    while (self->private_impl.f_buf_len < 64u) {
76760
      if (((uint64_t)(a_x.len)) <= 0u) {
76761
        return wuffs_base__make_empty_struct();
76762
      }
76763
      self->private_impl.f_buf_data[self->private_impl.f_buf_len] = a_x.ptr[0u];
76764
      self->private_impl.f_buf_len += 1u;
76765
      a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u);
76766
    }
76767
    self->private_impl.f_buf_len = 0u;
76768
    wuffs_sha256__hasher__up(self, wuffs_base__make_slice_u8(self->private_impl.f_buf_data, 64));
76769
  }
76770
  wuffs_sha256__hasher__up(self, a_x);
76771
  return wuffs_base__make_empty_struct();
76772
}
76773
76774
// -------- func sha256.hasher.update_bitvec256
76775
76776
WUFFS_BASE__GENERATED_C_CODE
76777
WUFFS_BASE__MAYBE_STATIC wuffs_base__bitvec256
76778
wuffs_sha256__hasher__update_bitvec256(
76779
    wuffs_sha256__hasher* self,
76780
    wuffs_base__slice_u8 a_x) {
76781
  if (!self) {
76782
    return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u);
76783
  }
76784
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
76785
    return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u);
76786
  }
76787
76788
  wuffs_sha256__hasher__update(self, a_x);
76789
  return wuffs_sha256__hasher__checksum_bitvec256(self);
76790
}
76791
76792
// -------- func sha256.hasher.up
76793
76794
WUFFS_BASE__GENERATED_C_CODE
76795
static wuffs_base__empty_struct
76796
wuffs_sha256__hasher__up(
76797
    wuffs_sha256__hasher* self,
76798
    wuffs_base__slice_u8 a_x) {
76799
  wuffs_base__slice_u8 v_p = {0};
76800
  uint32_t v_w[64] = {0};
76801
  uint32_t v_w2 = 0;
76802
  uint32_t v_w15 = 0;
76803
  uint32_t v_s0 = 0;
76804
  uint32_t v_s1 = 0;
76805
  uint32_t v_t1 = 0;
76806
  uint32_t v_t2 = 0;
76807
  uint32_t v_a = 0;
76808
  uint32_t v_b = 0;
76809
  uint32_t v_c = 0;
76810
  uint32_t v_d = 0;
76811
  uint32_t v_e = 0;
76812
  uint32_t v_f = 0;
76813
  uint32_t v_g = 0;
76814
  uint32_t v_h = 0;
76815
  uint32_t v_i = 0;
76816
  uint32_t v_buf_len = 0;
76817
76818
  v_a = self->private_impl.f_h0;
76819
  v_b = self->private_impl.f_h1;
76820
  v_c = self->private_impl.f_h2;
76821
  v_d = self->private_impl.f_h3;
76822
  v_e = self->private_impl.f_h4;
76823
  v_f = self->private_impl.f_h5;
76824
  v_g = self->private_impl.f_h6;
76825
  v_h = self->private_impl.f_h7;
76826
  {
76827
    wuffs_base__slice_u8 i_slice_p = a_x;
76828
    v_p.ptr = i_slice_p.ptr;
76829
    v_p.len = 64;
76830
    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));
76831
    while (v_p.ptr < i_end0_p) {
76832
      v_w[0u] = ((((uint32_t)(v_p.ptr[0u])) << 24u) |
76833
          (((uint32_t)(v_p.ptr[1u])) << 16u) |
76834
          (((uint32_t)(v_p.ptr[2u])) << 8u) |
76835
          ((uint32_t)(v_p.ptr[3u])));
76836
      v_w[1u] = ((((uint32_t)(v_p.ptr[4u])) << 24u) |
76837
          (((uint32_t)(v_p.ptr[5u])) << 16u) |
76838
          (((uint32_t)(v_p.ptr[6u])) << 8u) |
76839
          ((uint32_t)(v_p.ptr[7u])));
76840
      v_w[2u] = ((((uint32_t)(v_p.ptr[8u])) << 24u) |
76841
          (((uint32_t)(v_p.ptr[9u])) << 16u) |
76842
          (((uint32_t)(v_p.ptr[10u])) << 8u) |
76843
          ((uint32_t)(v_p.ptr[11u])));
76844
      v_w[3u] = ((((uint32_t)(v_p.ptr[12u])) << 24u) |
76845
          (((uint32_t)(v_p.ptr[13u])) << 16u) |
76846
          (((uint32_t)(v_p.ptr[14u])) << 8u) |
76847
          ((uint32_t)(v_p.ptr[15u])));
76848
      v_w[4u] = ((((uint32_t)(v_p.ptr[16u])) << 24u) |
76849
          (((uint32_t)(v_p.ptr[17u])) << 16u) |
76850
          (((uint32_t)(v_p.ptr[18u])) << 8u) |
76851
          ((uint32_t)(v_p.ptr[19u])));
76852
      v_w[5u] = ((((uint32_t)(v_p.ptr[20u])) << 24u) |
76853
          (((uint32_t)(v_p.ptr[21u])) << 16u) |
76854
          (((uint32_t)(v_p.ptr[22u])) << 8u) |
76855
          ((uint32_t)(v_p.ptr[23u])));
76856
      v_w[6u] = ((((uint32_t)(v_p.ptr[24u])) << 24u) |
76857
          (((uint32_t)(v_p.ptr[25u])) << 16u) |
76858
          (((uint32_t)(v_p.ptr[26u])) << 8u) |
76859
          ((uint32_t)(v_p.ptr[27u])));
76860
      v_w[7u] = ((((uint32_t)(v_p.ptr[28u])) << 24u) |
76861
          (((uint32_t)(v_p.ptr[29u])) << 16u) |
76862
          (((uint32_t)(v_p.ptr[30u])) << 8u) |
76863
          ((uint32_t)(v_p.ptr[31u])));
76864
      v_w[8u] = ((((uint32_t)(v_p.ptr[32u])) << 24u) |
76865
          (((uint32_t)(v_p.ptr[33u])) << 16u) |
76866
          (((uint32_t)(v_p.ptr[34u])) << 8u) |
76867
          ((uint32_t)(v_p.ptr[35u])));
76868
      v_w[9u] = ((((uint32_t)(v_p.ptr[36u])) << 24u) |
76869
          (((uint32_t)(v_p.ptr[37u])) << 16u) |
76870
          (((uint32_t)(v_p.ptr[38u])) << 8u) |
76871
          ((uint32_t)(v_p.ptr[39u])));
76872
      v_w[10u] = ((((uint32_t)(v_p.ptr[40u])) << 24u) |
76873
          (((uint32_t)(v_p.ptr[41u])) << 16u) |
76874
          (((uint32_t)(v_p.ptr[42u])) << 8u) |
76875
          ((uint32_t)(v_p.ptr[43u])));
76876
      v_w[11u] = ((((uint32_t)(v_p.ptr[44u])) << 24u) |
76877
          (((uint32_t)(v_p.ptr[45u])) << 16u) |
76878
          (((uint32_t)(v_p.ptr[46u])) << 8u) |
76879
          ((uint32_t)(v_p.ptr[47u])));
76880
      v_w[12u] = ((((uint32_t)(v_p.ptr[48u])) << 24u) |
76881
          (((uint32_t)(v_p.ptr[49u])) << 16u) |
76882
          (((uint32_t)(v_p.ptr[50u])) << 8u) |
76883
          ((uint32_t)(v_p.ptr[51u])));
76884
      v_w[13u] = ((((uint32_t)(v_p.ptr[52u])) << 24u) |
76885
          (((uint32_t)(v_p.ptr[53u])) << 16u) |
76886
          (((uint32_t)(v_p.ptr[54u])) << 8u) |
76887
          ((uint32_t)(v_p.ptr[55u])));
76888
      v_w[14u] = ((((uint32_t)(v_p.ptr[56u])) << 24u) |
76889
          (((uint32_t)(v_p.ptr[57u])) << 16u) |
76890
          (((uint32_t)(v_p.ptr[58u])) << 8u) |
76891
          ((uint32_t)(v_p.ptr[59u])));
76892
      v_w[15u] = ((((uint32_t)(v_p.ptr[60u])) << 24u) |
76893
          (((uint32_t)(v_p.ptr[61u])) << 16u) |
76894
          (((uint32_t)(v_p.ptr[62u])) << 8u) |
76895
          ((uint32_t)(v_p.ptr[63u])));
76896
      v_i = 16u;
76897
      while (v_i < 64u) {
76898
        v_w2 = v_w[(v_i - 2u)];
76899
        v_s1 = ((v_w2 >> 10u) ^ (((uint32_t)(v_w2 << 15u)) | (v_w2 >> 17u)) ^ (((uint32_t)(v_w2 << 13u)) | (v_w2 >> 19u)));
76900
        v_w15 = v_w[(v_i - 15u)];
76901
        v_s0 = ((v_w15 >> 3u) ^ (((uint32_t)(v_w15 << 25u)) | (v_w15 >> 7u)) ^ (((uint32_t)(v_w15 << 14u)) | (v_w15 >> 18u)));
76902
        v_w[v_i] = ((uint32_t)(((uint32_t)(((uint32_t)(v_s1 + v_w[(v_i - 7u)])) + v_s0)) + v_w[(v_i - 16u)]));
76903
        v_i += 1u;
76904
      }
76905
      v_i = 0u;
76906
      while (v_i < 64u) {
76907
        v_t1 = v_h;
76908
        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)));
76909
        v_t1 += ((v_e & v_f) ^ ((4294967295u ^ v_e) & v_g));
76910
        v_t1 += WUFFS_SHA256__K[v_i];
76911
        v_t1 += v_w[v_i];
76912
        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)));
76913
        v_t2 += ((v_a & v_b) ^ (v_a & v_c) ^ (v_b & v_c));
76914
        v_h = v_g;
76915
        v_g = v_f;
76916
        v_f = v_e;
76917
        v_e = ((uint32_t)(v_d + v_t1));
76918
        v_d = v_c;
76919
        v_c = v_b;
76920
        v_b = v_a;
76921
        v_a = ((uint32_t)(v_t1 + v_t2));
76922
        v_i += 1u;
76923
      }
76924
      v_a += self->private_impl.f_h0;
76925
      self->private_impl.f_h0 = v_a;
76926
      v_b += self->private_impl.f_h1;
76927
      self->private_impl.f_h1 = v_b;
76928
      v_c += self->private_impl.f_h2;
76929
      self->private_impl.f_h2 = v_c;
76930
      v_d += self->private_impl.f_h3;
76931
      self->private_impl.f_h3 = v_d;
76932
      v_e += self->private_impl.f_h4;
76933
      self->private_impl.f_h4 = v_e;
76934
      v_f += self->private_impl.f_h5;
76935
      self->private_impl.f_h5 = v_f;
76936
      v_g += self->private_impl.f_h6;
76937
      self->private_impl.f_h6 = v_g;
76938
      v_h += self->private_impl.f_h7;
76939
      self->private_impl.f_h7 = v_h;
76940
      v_p.ptr += 64;
76941
    }
76942
    v_p.len = 1;
76943
    const uint8_t* i_end1_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len);
76944
    while (v_p.ptr < i_end1_p) {
76945
      self->private_impl.f_buf_data[v_buf_len] = v_p.ptr[0u];
76946
      v_buf_len = ((v_buf_len + 1u) & 63u);
76947
      v_p.ptr += 1;
76948
    }
76949
    v_p.len = 0;
76950
  }
76951
  self->private_impl.f_buf_len = ((uint32_t)((((uint64_t)(a_x.len)) & 63u)));
76952
  return wuffs_base__make_empty_struct();
76953
}
76954
76955
// -------- func sha256.hasher.checksum_bitvec256
76956
76957
WUFFS_BASE__GENERATED_C_CODE
76958
WUFFS_BASE__MAYBE_STATIC wuffs_base__bitvec256
76959
wuffs_sha256__hasher__checksum_bitvec256(
76960
    const wuffs_sha256__hasher* self) {
76961
  if (!self) {
76962
    return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u);
76963
  }
76964
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
76965
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
76966
    return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u);
76967
  }
76968
76969
  uint32_t v_buf_len = 0;
76970
  uint8_t v_buf_data[64] = {0};
76971
  uint64_t v_length_in_bits = 0;
76972
  uint32_t v_w[64] = {0};
76973
  uint32_t v_w2 = 0;
76974
  uint32_t v_w15 = 0;
76975
  uint32_t v_s0 = 0;
76976
  uint32_t v_s1 = 0;
76977
  uint32_t v_t1 = 0;
76978
  uint32_t v_t2 = 0;
76979
  uint32_t v_h0 = 0;
76980
  uint32_t v_h1 = 0;
76981
  uint32_t v_h2 = 0;
76982
  uint32_t v_h3 = 0;
76983
  uint32_t v_h4 = 0;
76984
  uint32_t v_h5 = 0;
76985
  uint32_t v_h6 = 0;
76986
  uint32_t v_h7 = 0;
76987
  uint32_t v_a = 0;
76988
  uint32_t v_b = 0;
76989
  uint32_t v_c = 0;
76990
  uint32_t v_d = 0;
76991
  uint32_t v_e = 0;
76992
  uint32_t v_f = 0;
76993
  uint32_t v_g = 0;
76994
  uint32_t v_h = 0;
76995
  uint32_t v_i = 0;
76996
  bool v_final_block = false;
76997
76998
  v_i = 0u;
76999
  while (v_i < 64u) {
77000
    v_buf_data[v_i] = self->private_impl.f_buf_data[v_i];
77001
    v_i += 1u;
77002
  }
77003
  v_buf_len = (self->private_impl.f_buf_len & 63u);
77004
  if (v_buf_len < 56u) {
77005
    v_buf_data[v_buf_len] = 128u;
77006
    v_buf_len += 1u;
77007
    while (v_buf_len < 56u) {
77008
      v_buf_data[v_buf_len] = 0u;
77009
      v_buf_len += 1u;
77010
    }
77011
    v_final_block = true;
77012
  } else {
77013
    v_buf_data[v_buf_len] = 128u;
77014
    v_buf_len += 1u;
77015
    while (v_buf_len < 64u) {
77016
      v_buf_data[v_buf_len] = 0u;
77017
      v_buf_len += 1u;
77018
    }
77019
  }
77020
  v_h0 = self->private_impl.f_h0;
77021
  v_a = v_h0;
77022
  v_h1 = self->private_impl.f_h1;
77023
  v_b = v_h1;
77024
  v_h2 = self->private_impl.f_h2;
77025
  v_c = v_h2;
77026
  v_h3 = self->private_impl.f_h3;
77027
  v_d = v_h3;
77028
  v_h4 = self->private_impl.f_h4;
77029
  v_e = v_h4;
77030
  v_h5 = self->private_impl.f_h5;
77031
  v_f = v_h5;
77032
  v_h6 = self->private_impl.f_h6;
77033
  v_g = v_h6;
77034
  v_h7 = self->private_impl.f_h7;
77035
  v_h = v_h7;
77036
  while (true) {
77037
    if (v_final_block) {
77038
      v_length_in_bits = ((uint64_t)(self->private_impl.f_length_modulo_u64 * 8u));
77039
      v_buf_data[56u] = ((uint8_t)((v_length_in_bits >> 56u)));
77040
      v_buf_data[57u] = ((uint8_t)((v_length_in_bits >> 48u)));
77041
      v_buf_data[58u] = ((uint8_t)((v_length_in_bits >> 40u)));
77042
      v_buf_data[59u] = ((uint8_t)((v_length_in_bits >> 32u)));
77043
      v_buf_data[60u] = ((uint8_t)((v_length_in_bits >> 24u)));
77044
      v_buf_data[61u] = ((uint8_t)((v_length_in_bits >> 16u)));
77045
      v_buf_data[62u] = ((uint8_t)((v_length_in_bits >> 8u)));
77046
      v_buf_data[63u] = ((uint8_t)(v_length_in_bits));
77047
    }
77048
    v_w[0u] = ((((uint32_t)(v_buf_data[0u])) << 24u) |
77049
        (((uint32_t)(v_buf_data[1u])) << 16u) |
77050
        (((uint32_t)(v_buf_data[2u])) << 8u) |
77051
        ((uint32_t)(v_buf_data[3u])));
77052
    v_w[1u] = ((((uint32_t)(v_buf_data[4u])) << 24u) |
77053
        (((uint32_t)(v_buf_data[5u])) << 16u) |
77054
        (((uint32_t)(v_buf_data[6u])) << 8u) |
77055
        ((uint32_t)(v_buf_data[7u])));
77056
    v_w[2u] = ((((uint32_t)(v_buf_data[8u])) << 24u) |
77057
        (((uint32_t)(v_buf_data[9u])) << 16u) |
77058
        (((uint32_t)(v_buf_data[10u])) << 8u) |
77059
        ((uint32_t)(v_buf_data[11u])));
77060
    v_w[3u] = ((((uint32_t)(v_buf_data[12u])) << 24u) |
77061
        (((uint32_t)(v_buf_data[13u])) << 16u) |
77062
        (((uint32_t)(v_buf_data[14u])) << 8u) |
77063
        ((uint32_t)(v_buf_data[15u])));
77064
    v_w[4u] = ((((uint32_t)(v_buf_data[16u])) << 24u) |
77065
        (((uint32_t)(v_buf_data[17u])) << 16u) |
77066
        (((uint32_t)(v_buf_data[18u])) << 8u) |
77067
        ((uint32_t)(v_buf_data[19u])));
77068
    v_w[5u] = ((((uint32_t)(v_buf_data[20u])) << 24u) |
77069
        (((uint32_t)(v_buf_data[21u])) << 16u) |
77070
        (((uint32_t)(v_buf_data[22u])) << 8u) |
77071
        ((uint32_t)(v_buf_data[23u])));
77072
    v_w[6u] = ((((uint32_t)(v_buf_data[24u])) << 24u) |
77073
        (((uint32_t)(v_buf_data[25u])) << 16u) |
77074
        (((uint32_t)(v_buf_data[26u])) << 8u) |
77075
        ((uint32_t)(v_buf_data[27u])));
77076
    v_w[7u] = ((((uint32_t)(v_buf_data[28u])) << 24u) |
77077
        (((uint32_t)(v_buf_data[29u])) << 16u) |
77078
        (((uint32_t)(v_buf_data[30u])) << 8u) |
77079
        ((uint32_t)(v_buf_data[31u])));
77080
    v_w[8u] = ((((uint32_t)(v_buf_data[32u])) << 24u) |
77081
        (((uint32_t)(v_buf_data[33u])) << 16u) |
77082
        (((uint32_t)(v_buf_data[34u])) << 8u) |
77083
        ((uint32_t)(v_buf_data[35u])));
77084
    v_w[9u] = ((((uint32_t)(v_buf_data[36u])) << 24u) |
77085
        (((uint32_t)(v_buf_data[37u])) << 16u) |
77086
        (((uint32_t)(v_buf_data[38u])) << 8u) |
77087
        ((uint32_t)(v_buf_data[39u])));
77088
    v_w[10u] = ((((uint32_t)(v_buf_data[40u])) << 24u) |
77089
        (((uint32_t)(v_buf_data[41u])) << 16u) |
77090
        (((uint32_t)(v_buf_data[42u])) << 8u) |
77091
        ((uint32_t)(v_buf_data[43u])));
77092
    v_w[11u] = ((((uint32_t)(v_buf_data[44u])) << 24u) |
77093
        (((uint32_t)(v_buf_data[45u])) << 16u) |
77094
        (((uint32_t)(v_buf_data[46u])) << 8u) |
77095
        ((uint32_t)(v_buf_data[47u])));
77096
    v_w[12u] = ((((uint32_t)(v_buf_data[48u])) << 24u) |
77097
        (((uint32_t)(v_buf_data[49u])) << 16u) |
77098
        (((uint32_t)(v_buf_data[50u])) << 8u) |
77099
        ((uint32_t)(v_buf_data[51u])));
77100
    v_w[13u] = ((((uint32_t)(v_buf_data[52u])) << 24u) |
77101
        (((uint32_t)(v_buf_data[53u])) << 16u) |
77102
        (((uint32_t)(v_buf_data[54u])) << 8u) |
77103
        ((uint32_t)(v_buf_data[55u])));
77104
    v_w[14u] = ((((uint32_t)(v_buf_data[56u])) << 24u) |
77105
        (((uint32_t)(v_buf_data[57u])) << 16u) |
77106
        (((uint32_t)(v_buf_data[58u])) << 8u) |
77107
        ((uint32_t)(v_buf_data[59u])));
77108
    v_w[15u] = ((((uint32_t)(v_buf_data[60u])) << 24u) |
77109
        (((uint32_t)(v_buf_data[61u])) << 16u) |
77110
        (((uint32_t)(v_buf_data[62u])) << 8u) |
77111
        ((uint32_t)(v_buf_data[63u])));
77112
    v_i = 16u;
77113
    while (v_i < 64u) {
77114
      v_w2 = v_w[(v_i - 2u)];
77115
      v_s1 = ((v_w2 >> 10u) ^ (((uint32_t)(v_w2 << 15u)) | (v_w2 >> 17u)) ^ (((uint32_t)(v_w2 << 13u)) | (v_w2 >> 19u)));
77116
      v_w15 = v_w[(v_i - 15u)];
77117
      v_s0 = ((v_w15 >> 3u) ^ (((uint32_t)(v_w15 << 25u)) | (v_w15 >> 7u)) ^ (((uint32_t)(v_w15 << 14u)) | (v_w15 >> 18u)));
77118
      v_w[v_i] = ((uint32_t)(((uint32_t)(((uint32_t)(v_s1 + v_w[(v_i - 7u)])) + v_s0)) + v_w[(v_i - 16u)]));
77119
      v_i += 1u;
77120
    }
77121
    v_i = 0u;
77122
    while (v_i < 64u) {
77123
      v_t1 = v_h;
77124
      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)));
77125
      v_t1 += ((v_e & v_f) ^ ((4294967295u ^ v_e) & v_g));
77126
      v_t1 += WUFFS_SHA256__K[v_i];
77127
      v_t1 += v_w[v_i];
77128
      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)));
77129
      v_t2 += ((v_a & v_b) ^ (v_a & v_c) ^ (v_b & v_c));
77130
      v_h = v_g;
77131
      v_g = v_f;
77132
      v_f = v_e;
77133
      v_e = ((uint32_t)(v_d + v_t1));
77134
      v_d = v_c;
77135
      v_c = v_b;
77136
      v_b = v_a;
77137
      v_a = ((uint32_t)(v_t1 + v_t2));
77138
      v_i += 1u;
77139
    }
77140
    v_a += v_h0;
77141
    v_b += v_h1;
77142
    v_c += v_h2;
77143
    v_d += v_h3;
77144
    v_e += v_h4;
77145
    v_f += v_h5;
77146
    v_g += v_h6;
77147
    v_h += v_h7;
77148
    if (v_final_block) {
77149
      break;
77150
    }
77151
    v_final_block = true;
77152
    v_h0 = v_a;
77153
    v_h1 = v_b;
77154
    v_h2 = v_c;
77155
    v_h3 = v_d;
77156
    v_h4 = v_e;
77157
    v_h5 = v_f;
77158
    v_h6 = v_g;
77159
    v_h7 = v_h;
77160
    v_buf_len = 0u;
77161
    while (v_buf_len < 56u) {
77162
      v_buf_data[v_buf_len] = 0u;
77163
      v_buf_len += 1u;
77164
    }
77165
  }
77166
  return wuffs_base__utility__make_bitvec256(
77167
      (((uint64_t)(v_h)) | (((uint64_t)(v_g)) << 32u)),
77168
      (((uint64_t)(v_f)) | (((uint64_t)(v_e)) << 32u)),
77169
      (((uint64_t)(v_d)) | (((uint64_t)(v_c)) << 32u)),
77170
      (((uint64_t)(v_b)) | (((uint64_t)(v_a)) << 32u)));
77171
}
77172
77173
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__SHA256)
77174
77175
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__TARGA)
77176
77177
// ---------------- Status Codes Implementations
77178
77179
const char wuffs_targa__error__bad_header[] = "#targa: bad header";
77180
const char wuffs_targa__error__bad_run_length_encoding[] = "#targa: bad run length encoding";
77181
const char wuffs_targa__error__truncated_input[] = "#targa: truncated input";
77182
const char wuffs_targa__error__unsupported_targa_file[] = "#targa: unsupported TARGA file";
77183
77184
// ---------------- Private Consts
77185
77186
// ---------------- Private Initializer Prototypes
77187
77188
// ---------------- Private Function Prototypes
77189
77190
WUFFS_BASE__GENERATED_C_CODE
77191
static wuffs_base__status
77192
wuffs_targa__decoder__do_decode_image_config(
77193
    wuffs_targa__decoder* self,
77194
    wuffs_base__image_config* a_dst,
77195
    wuffs_base__io_buffer* a_src);
77196
77197
WUFFS_BASE__GENERATED_C_CODE
77198
static wuffs_base__status
77199
wuffs_targa__decoder__do_decode_frame_config(
77200
    wuffs_targa__decoder* self,
77201
    wuffs_base__frame_config* a_dst,
77202
    wuffs_base__io_buffer* a_src);
77203
77204
WUFFS_BASE__GENERATED_C_CODE
77205
static wuffs_base__status
77206
wuffs_targa__decoder__do_decode_frame(
77207
    wuffs_targa__decoder* self,
77208
    wuffs_base__pixel_buffer* a_dst,
77209
    wuffs_base__io_buffer* a_src,
77210
    wuffs_base__pixel_blend a_blend,
77211
    wuffs_base__slice_u8 a_workbuf,
77212
    wuffs_base__decode_frame_options* a_opts);
77213
77214
// ---------------- VTables
77215
77216
const wuffs_base__image_decoder__func_ptrs
77217
wuffs_targa__decoder__func_ptrs_for__wuffs_base__image_decoder = {
77218
  (wuffs_base__status(*)(void*,
77219
      wuffs_base__pixel_buffer*,
77220
      wuffs_base__io_buffer*,
77221
      wuffs_base__pixel_blend,
77222
      wuffs_base__slice_u8,
77223
      wuffs_base__decode_frame_options*))(&wuffs_targa__decoder__decode_frame),
77224
  (wuffs_base__status(*)(void*,
77225
      wuffs_base__frame_config*,
77226
      wuffs_base__io_buffer*))(&wuffs_targa__decoder__decode_frame_config),
77227
  (wuffs_base__status(*)(void*,
77228
      wuffs_base__image_config*,
77229
      wuffs_base__io_buffer*))(&wuffs_targa__decoder__decode_image_config),
77230
  (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_targa__decoder__frame_dirty_rect),
77231
  (uint64_t(*)(const void*,
77232
      uint32_t))(&wuffs_targa__decoder__get_quirk),
77233
  (uint32_t(*)(const void*))(&wuffs_targa__decoder__num_animation_loops),
77234
  (uint64_t(*)(const void*))(&wuffs_targa__decoder__num_decoded_frame_configs),
77235
  (uint64_t(*)(const void*))(&wuffs_targa__decoder__num_decoded_frames),
77236
  (wuffs_base__status(*)(void*,
77237
      uint64_t,
77238
      uint64_t))(&wuffs_targa__decoder__restart_frame),
77239
  (wuffs_base__status(*)(void*,
77240
      uint32_t,
77241
      uint64_t))(&wuffs_targa__decoder__set_quirk),
77242
  (wuffs_base__empty_struct(*)(void*,
77243
      uint32_t,
77244
      bool))(&wuffs_targa__decoder__set_report_metadata),
77245
  (wuffs_base__status(*)(void*,
77246
      wuffs_base__io_buffer*,
77247
      wuffs_base__more_information*,
77248
      wuffs_base__io_buffer*))(&wuffs_targa__decoder__tell_me_more),
77249
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_targa__decoder__workbuf_len),
77250
};
77251
77252
// ---------------- Initializer Implementations
77253
77254
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
77255
wuffs_targa__decoder__initialize(
77256
    wuffs_targa__decoder* self,
77257
    size_t sizeof_star_self,
77258
    uint64_t wuffs_version,
77259
    uint32_t options){
77260
  if (!self) {
77261
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
77262
  }
77263
  if (sizeof(*self) != sizeof_star_self) {
77264
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
77265
  }
77266
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
77267
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
77268
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
77269
  }
77270
77271
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
77272
    // The whole point of this if-check is to detect an uninitialized *self.
77273
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
77274
#if !defined(__clang__) && defined(__GNUC__)
77275
#pragma GCC diagnostic push
77276
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
77277
#endif
77278
    if (self->private_impl.magic != 0) {
77279
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
77280
    }
77281
#if !defined(__clang__) && defined(__GNUC__)
77282
#pragma GCC diagnostic pop
77283
#endif
77284
  } else {
77285
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
77286
      memset(self, 0, sizeof(*self));
77287
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
77288
    } else {
77289
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
77290
    }
77291
  }
77292
77293
  self->private_impl.magic = WUFFS_BASE__MAGIC;
77294
  self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name =
77295
      wuffs_base__image_decoder__vtable_name;
77296
  self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers =
77297
      (const void*)(&wuffs_targa__decoder__func_ptrs_for__wuffs_base__image_decoder);
77298
  return wuffs_base__make_status(NULL);
77299
}
77300
77301
wuffs_targa__decoder*
77302
wuffs_targa__decoder__alloc(void) {
77303
  wuffs_targa__decoder* x =
77304
      (wuffs_targa__decoder*)(calloc(1, sizeof(wuffs_targa__decoder)));
77305
  if (!x) {
77306
    return NULL;
77307
  }
77308
  if (wuffs_targa__decoder__initialize(
77309
      x, sizeof(wuffs_targa__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
77310
    free(x);
77311
    return NULL;
77312
  }
77313
  return x;
77314
}
77315
77316
size_t
77317
sizeof__wuffs_targa__decoder(void) {
77318
  return sizeof(wuffs_targa__decoder);
77319
}
77320
77321
// ---------------- Function Implementations
77322
77323
// -------- func targa.decoder.get_quirk
77324
77325
WUFFS_BASE__GENERATED_C_CODE
77326
WUFFS_BASE__MAYBE_STATIC uint64_t
77327
wuffs_targa__decoder__get_quirk(
77328
    const wuffs_targa__decoder* self,
77329
    uint32_t a_key) {
77330
  if (!self) {
77331
    return 0;
77332
  }
77333
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
77334
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
77335
    return 0;
77336
  }
77337
77338
  return 0u;
77339
}
77340
77341
// -------- func targa.decoder.set_quirk
77342
77343
WUFFS_BASE__GENERATED_C_CODE
77344
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
77345
wuffs_targa__decoder__set_quirk(
77346
    wuffs_targa__decoder* self,
77347
    uint32_t a_key,
77348
    uint64_t a_value) {
77349
  if (!self) {
77350
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
77351
  }
77352
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
77353
    return wuffs_base__make_status(
77354
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
77355
        ? wuffs_base__error__disabled_by_previous_error
77356
        : wuffs_base__error__initialize_not_called);
77357
  }
77358
77359
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
77360
}
77361
77362
// -------- func targa.decoder.decode_image_config
77363
77364
WUFFS_BASE__GENERATED_C_CODE
77365
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
77366
wuffs_targa__decoder__decode_image_config(
77367
    wuffs_targa__decoder* self,
77368
    wuffs_base__image_config* a_dst,
77369
    wuffs_base__io_buffer* a_src) {
77370
  if (!self) {
77371
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
77372
  }
77373
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
77374
    return wuffs_base__make_status(
77375
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
77376
        ? wuffs_base__error__disabled_by_previous_error
77377
        : wuffs_base__error__initialize_not_called);
77378
  }
77379
  if (!a_src) {
77380
    self->private_impl.magic = WUFFS_BASE__DISABLED;
77381
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
77382
  }
77383
  if ((self->private_impl.active_coroutine != 0) &&
77384
      (self->private_impl.active_coroutine != 1)) {
77385
    self->private_impl.magic = WUFFS_BASE__DISABLED;
77386
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
77387
  }
77388
  self->private_impl.active_coroutine = 0;
77389
  wuffs_base__status status = wuffs_base__make_status(NULL);
77390
77391
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
77392
77393
  uint32_t coro_susp_point = self->private_impl.p_decode_image_config;
77394
  switch (coro_susp_point) {
77395
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
77396
77397
    while (true) {
77398
      {
77399
        wuffs_base__status t_0 = wuffs_targa__decoder__do_decode_image_config(self, a_dst, a_src);
77400
        v_status = t_0;
77401
      }
77402
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
77403
        status = wuffs_base__make_status(wuffs_targa__error__truncated_input);
77404
        goto exit;
77405
      }
77406
      status = v_status;
77407
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
77408
    }
77409
77410
    ok:
77411
    self->private_impl.p_decode_image_config = 0;
77412
    goto exit;
77413
  }
77414
77415
  goto suspend;
77416
  suspend:
77417
  self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
77418
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
77419
77420
  goto exit;
77421
  exit:
77422
  if (wuffs_base__status__is_error(&status)) {
77423
    self->private_impl.magic = WUFFS_BASE__DISABLED;
77424
  }
77425
  return status;
77426
}
77427
77428
// -------- func targa.decoder.do_decode_image_config
77429
77430
WUFFS_BASE__GENERATED_C_CODE
77431
static wuffs_base__status
77432
wuffs_targa__decoder__do_decode_image_config(
77433
    wuffs_targa__decoder* self,
77434
    wuffs_base__image_config* a_dst,
77435
    wuffs_base__io_buffer* a_src) {
77436
  wuffs_base__status status = wuffs_base__make_status(NULL);
77437
77438
  uint32_t v_c32 = 0;
77439
  uint32_t v_c5 = 0;
77440
  uint32_t v_i = 0;
77441
77442
  const uint8_t* iop_a_src = NULL;
77443
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
77444
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
77445
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
77446
  if (a_src && a_src->data.ptr) {
77447
    io0_a_src = a_src->data.ptr;
77448
    io1_a_src = io0_a_src + a_src->meta.ri;
77449
    iop_a_src = io1_a_src;
77450
    io2_a_src = io0_a_src + a_src->meta.wi;
77451
  }
77452
77453
  uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config;
77454
  if (coro_susp_point) {
77455
    v_i = self->private_data.s_do_decode_image_config.v_i;
77456
  }
77457
  switch (coro_susp_point) {
77458
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
77459
77460
    if (self->private_impl.f_call_sequence != 0u) {
77461
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
77462
      goto exit;
77463
    }
77464
    {
77465
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
77466
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
77467
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
77468
        goto suspend;
77469
      }
77470
      uint8_t t_0 = *iop_a_src++;
77471
      self->private_impl.f_header_id_length = t_0;
77472
    }
77473
    {
77474
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
77475
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
77476
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
77477
        goto suspend;
77478
      }
77479
      uint8_t t_1 = *iop_a_src++;
77480
      self->private_impl.f_header_color_map_type = t_1;
77481
    }
77482
    if (self->private_impl.f_header_color_map_type > 1u) {
77483
      status = wuffs_base__make_status(wuffs_targa__error__bad_header);
77484
      goto exit;
77485
    }
77486
    {
77487
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
77488
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
77489
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
77490
        goto suspend;
77491
      }
77492
      uint8_t t_2 = *iop_a_src++;
77493
      self->private_impl.f_header_image_type = t_2;
77494
    }
77495
    if ((self->private_impl.f_header_image_type == 1u) ||
77496
        (self->private_impl.f_header_image_type == 2u) ||
77497
        (self->private_impl.f_header_image_type == 3u) ||
77498
        (self->private_impl.f_header_image_type == 9u) ||
77499
        (self->private_impl.f_header_image_type == 10u) ||
77500
        (self->private_impl.f_header_image_type == 11u)) {
77501
    } else {
77502
      status = wuffs_base__make_status(wuffs_targa__error__bad_header);
77503
      goto exit;
77504
    }
77505
    {
77506
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
77507
      uint16_t t_3;
77508
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
77509
        t_3 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src);
77510
        iop_a_src += 2;
77511
      } else {
77512
        self->private_data.s_do_decode_image_config.scratch = 0;
77513
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
77514
        while (true) {
77515
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
77516
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
77517
            goto suspend;
77518
          }
77519
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
77520
          uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56));
77521
          *scratch <<= 8;
77522
          *scratch >>= 8;
77523
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3;
77524
          if (num_bits_3 == 8) {
77525
            t_3 = ((uint16_t)(*scratch));
77526
            break;
77527
          }
77528
          num_bits_3 += 8u;
77529
          *scratch |= ((uint64_t)(num_bits_3)) << 56;
77530
        }
77531
      }
77532
      self->private_impl.f_header_color_map_first_entry_index = t_3;
77533
    }
77534
    {
77535
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
77536
      uint16_t t_4;
77537
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
77538
        t_4 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src);
77539
        iop_a_src += 2;
77540
      } else {
77541
        self->private_data.s_do_decode_image_config.scratch = 0;
77542
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
77543
        while (true) {
77544
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
77545
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
77546
            goto suspend;
77547
          }
77548
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
77549
          uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56));
77550
          *scratch <<= 8;
77551
          *scratch >>= 8;
77552
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4;
77553
          if (num_bits_4 == 8) {
77554
            t_4 = ((uint16_t)(*scratch));
77555
            break;
77556
          }
77557
          num_bits_4 += 8u;
77558
          *scratch |= ((uint64_t)(num_bits_4)) << 56;
77559
        }
77560
      }
77561
      self->private_impl.f_header_color_map_length = t_4;
77562
    }
77563
    {
77564
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
77565
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
77566
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
77567
        goto suspend;
77568
      }
77569
      uint8_t t_5 = *iop_a_src++;
77570
      self->private_impl.f_header_color_map_entry_size = t_5;
77571
    }
77572
    if (self->private_impl.f_header_color_map_type != 0u) {
77573
      if ((self->private_impl.f_header_color_map_first_entry_index != 0u) || (self->private_impl.f_header_color_map_length > 256u)) {
77574
        status = wuffs_base__make_status(wuffs_targa__error__unsupported_targa_file);
77575
        goto exit;
77576
      } else if ((self->private_impl.f_header_color_map_entry_size != 15u) &&
77577
          (self->private_impl.f_header_color_map_entry_size != 16u) &&
77578
          (self->private_impl.f_header_color_map_entry_size != 24u) &&
77579
          (self->private_impl.f_header_color_map_entry_size != 32u)) {
77580
        status = wuffs_base__make_status(wuffs_targa__error__bad_header);
77581
        goto exit;
77582
      }
77583
    } else {
77584
      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)) {
77585
        status = wuffs_base__make_status(wuffs_targa__error__bad_header);
77586
        goto exit;
77587
      }
77588
    }
77589
    self->private_data.s_do_decode_image_config.scratch = 4u;
77590
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
77591
    if (self->private_data.s_do_decode_image_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
77592
      self->private_data.s_do_decode_image_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
77593
      iop_a_src = io2_a_src;
77594
      status = wuffs_base__make_status(wuffs_base__suspension__short_read);
77595
      goto suspend;
77596
    }
77597
    iop_a_src += self->private_data.s_do_decode_image_config.scratch;
77598
    {
77599
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
77600
      uint32_t t_6;
77601
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
77602
        t_6 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
77603
        iop_a_src += 2;
77604
      } else {
77605
        self->private_data.s_do_decode_image_config.scratch = 0;
77606
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11);
77607
        while (true) {
77608
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
77609
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
77610
            goto suspend;
77611
          }
77612
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
77613
          uint32_t num_bits_6 = ((uint32_t)(*scratch >> 56));
77614
          *scratch <<= 8;
77615
          *scratch >>= 8;
77616
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_6;
77617
          if (num_bits_6 == 8) {
77618
            t_6 = ((uint32_t)(*scratch));
77619
            break;
77620
          }
77621
          num_bits_6 += 8u;
77622
          *scratch |= ((uint64_t)(num_bits_6)) << 56;
77623
        }
77624
      }
77625
      self->private_impl.f_width = t_6;
77626
    }
77627
    {
77628
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12);
77629
      uint32_t t_7;
77630
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
77631
        t_7 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
77632
        iop_a_src += 2;
77633
      } else {
77634
        self->private_data.s_do_decode_image_config.scratch = 0;
77635
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13);
77636
        while (true) {
77637
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
77638
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
77639
            goto suspend;
77640
          }
77641
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
77642
          uint32_t num_bits_7 = ((uint32_t)(*scratch >> 56));
77643
          *scratch <<= 8;
77644
          *scratch >>= 8;
77645
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_7;
77646
          if (num_bits_7 == 8) {
77647
            t_7 = ((uint32_t)(*scratch));
77648
            break;
77649
          }
77650
          num_bits_7 += 8u;
77651
          *scratch |= ((uint64_t)(num_bits_7)) << 56;
77652
        }
77653
      }
77654
      self->private_impl.f_height = t_7;
77655
    }
77656
    {
77657
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14);
77658
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
77659
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
77660
        goto suspend;
77661
      }
77662
      uint8_t t_8 = *iop_a_src++;
77663
      self->private_impl.f_header_pixel_depth = t_8;
77664
    }
77665
    if ((self->private_impl.f_header_pixel_depth != 1u) &&
77666
        (self->private_impl.f_header_pixel_depth != 8u) &&
77667
        (self->private_impl.f_header_pixel_depth != 15u) &&
77668
        (self->private_impl.f_header_pixel_depth != 16u) &&
77669
        (self->private_impl.f_header_pixel_depth != 24u) &&
77670
        (self->private_impl.f_header_pixel_depth != 32u)) {
77671
      status = wuffs_base__make_status(wuffs_targa__error__bad_header);
77672
      goto exit;
77673
    }
77674
    if (((uint8_t)(self->private_impl.f_header_image_type | 8u)) == 9u) {
77675
      self->private_impl.f_scratch_bytes_per_pixel = 1u;
77676
      self->private_impl.f_src_bytes_per_pixel = 1u;
77677
      self->private_impl.f_src_pixfmt = 2164523016u;
77678
      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));
77679
    } else if (((uint8_t)(self->private_impl.f_header_image_type | 8u)) == 10u) {
77680
      if ((self->private_impl.f_header_pixel_depth == 15u) || (self->private_impl.f_header_pixel_depth == 16u)) {
77681
        self->private_impl.f_scratch_bytes_per_pixel = 4u;
77682
        self->private_impl.f_src_bytes_per_pixel = 0u;
77683
        self->private_impl.f_src_pixfmt = 2164295816u;
77684
      } else if (self->private_impl.f_header_pixel_depth == 24u) {
77685
        self->private_impl.f_scratch_bytes_per_pixel = 3u;
77686
        self->private_impl.f_src_bytes_per_pixel = 3u;
77687
        self->private_impl.f_src_pixfmt = 2147485832u;
77688
        self->private_impl.f_opaque = true;
77689
      } else if (self->private_impl.f_header_pixel_depth == 32u) {
77690
        self->private_impl.f_scratch_bytes_per_pixel = 4u;
77691
        self->private_impl.f_src_bytes_per_pixel = 4u;
77692
        self->private_impl.f_src_pixfmt = 2164295816u;
77693
      } else {
77694
        status = wuffs_base__make_status(wuffs_targa__error__unsupported_targa_file);
77695
        goto exit;
77696
      }
77697
    } else {
77698
      if (self->private_impl.f_header_pixel_depth == 8u) {
77699
        self->private_impl.f_scratch_bytes_per_pixel = 1u;
77700
        self->private_impl.f_src_bytes_per_pixel = 1u;
77701
        self->private_impl.f_src_pixfmt = 536870920u;
77702
        self->private_impl.f_opaque = true;
77703
      } else {
77704
        status = wuffs_base__make_status(wuffs_targa__error__unsupported_targa_file);
77705
        goto exit;
77706
      }
77707
    }
77708
    {
77709
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15);
77710
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
77711
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
77712
        goto suspend;
77713
      }
77714
      uint8_t t_9 = *iop_a_src++;
77715
      self->private_impl.f_header_image_descriptor = t_9;
77716
    }
77717
    if (((uint8_t)(self->private_impl.f_header_image_descriptor & 16u)) != 0u) {
77718
      status = wuffs_base__make_status(wuffs_targa__error__unsupported_targa_file);
77719
      goto exit;
77720
    }
77721
    self->private_data.s_do_decode_image_config.scratch = ((uint32_t)(self->private_impl.f_header_id_length));
77722
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16);
77723
    if (self->private_data.s_do_decode_image_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
77724
      self->private_data.s_do_decode_image_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
77725
      iop_a_src = io2_a_src;
77726
      status = wuffs_base__make_status(wuffs_base__suspension__short_read);
77727
      goto suspend;
77728
    }
77729
    iop_a_src += self->private_data.s_do_decode_image_config.scratch;
77730
    if (self->private_impl.f_header_color_map_type != 0u) {
77731
      while (v_i < ((uint32_t)(self->private_impl.f_header_color_map_length))) {
77732
        if (self->private_impl.f_header_color_map_entry_size == 24u) {
77733
          {
77734
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(17);
77735
            uint32_t t_10;
77736
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) {
77737
              t_10 = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src)));
77738
              iop_a_src += 3;
77739
            } else {
77740
              self->private_data.s_do_decode_image_config.scratch = 0;
77741
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(18);
77742
              while (true) {
77743
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
77744
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
77745
                  goto suspend;
77746
                }
77747
                uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
77748
                uint32_t num_bits_10 = ((uint32_t)(*scratch >> 56));
77749
                *scratch <<= 8;
77750
                *scratch >>= 8;
77751
                *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_10;
77752
                if (num_bits_10 == 16) {
77753
                  t_10 = ((uint32_t)(*scratch));
77754
                  break;
77755
                }
77756
                num_bits_10 += 8u;
77757
                *scratch |= ((uint64_t)(num_bits_10)) << 56;
77758
              }
77759
            }
77760
            v_c32 = t_10;
77761
          }
77762
          self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 0u)] = ((uint8_t)((v_c32 >> 0u)));
77763
          self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 1u)] = ((uint8_t)((v_c32 >> 8u)));
77764
          self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 2u)] = ((uint8_t)((v_c32 >> 16u)));
77765
          self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 3u)] = 255u;
77766
        } else if (self->private_impl.f_header_color_map_entry_size == 32u) {
77767
          {
77768
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(19);
77769
            uint32_t t_11;
77770
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
77771
              t_11 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
77772
              iop_a_src += 4;
77773
            } else {
77774
              self->private_data.s_do_decode_image_config.scratch = 0;
77775
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(20);
77776
              while (true) {
77777
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
77778
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
77779
                  goto suspend;
77780
                }
77781
                uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
77782
                uint32_t num_bits_11 = ((uint32_t)(*scratch >> 56));
77783
                *scratch <<= 8;
77784
                *scratch >>= 8;
77785
                *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_11;
77786
                if (num_bits_11 == 24) {
77787
                  t_11 = ((uint32_t)(*scratch));
77788
                  break;
77789
                }
77790
                num_bits_11 += 8u;
77791
                *scratch |= ((uint64_t)(num_bits_11)) << 56;
77792
              }
77793
            }
77794
            v_c32 = t_11;
77795
          }
77796
          self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 0u)] = ((uint8_t)((v_c32 >> 0u)));
77797
          self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 1u)] = ((uint8_t)((v_c32 >> 8u)));
77798
          self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 2u)] = ((uint8_t)((v_c32 >> 16u)));
77799
          self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 3u)] = ((uint8_t)((v_c32 >> 24u)));
77800
        } else {
77801
          {
77802
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(21);
77803
            uint32_t t_12;
77804
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
77805
              t_12 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
77806
              iop_a_src += 2;
77807
            } else {
77808
              self->private_data.s_do_decode_image_config.scratch = 0;
77809
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(22);
77810
              while (true) {
77811
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
77812
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
77813
                  goto suspend;
77814
                }
77815
                uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
77816
                uint32_t num_bits_12 = ((uint32_t)(*scratch >> 56));
77817
                *scratch <<= 8;
77818
                *scratch >>= 8;
77819
                *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_12;
77820
                if (num_bits_12 == 8) {
77821
                  t_12 = ((uint32_t)(*scratch));
77822
                  break;
77823
                }
77824
                num_bits_12 += 8u;
77825
                *scratch |= ((uint64_t)(num_bits_12)) << 56;
77826
              }
77827
            }
77828
            v_c32 = t_12;
77829
          }
77830
          v_c5 = (31u & (v_c32 >> 0u));
77831
          self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 0u)] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u))));
77832
          v_c5 = (31u & (v_c32 >> 5u));
77833
          self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 1u)] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u))));
77834
          v_c5 = (31u & (v_c32 >> 10u));
77835
          self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 2u)] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u))));
77836
          self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 3u)] = 255u;
77837
        }
77838
        v_i += 1u;
77839
      }
77840
      while (v_i < 256u) {
77841
        self->private_data.f_src_palette[((v_i * 4u) + 0u)] = 0u;
77842
        self->private_data.f_src_palette[((v_i * 4u) + 1u)] = 0u;
77843
        self->private_data.f_src_palette[((v_i * 4u) + 2u)] = 0u;
77844
        self->private_data.f_src_palette[((v_i * 4u) + 3u)] = 255u;
77845
        v_i += 1u;
77846
      }
77847
    }
77848
    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)));
77849
    if (a_dst != NULL) {
77850
      wuffs_base__image_config__set(
77851
          a_dst,
77852
          self->private_impl.f_src_pixfmt,
77853
          0u,
77854
          self->private_impl.f_width,
77855
          self->private_impl.f_height,
77856
          self->private_impl.f_frame_config_io_position,
77857
          self->private_impl.f_opaque);
77858
    }
77859
    self->private_impl.f_call_sequence = 32u;
77860
77861
    goto ok;
77862
    ok:
77863
    self->private_impl.p_do_decode_image_config = 0;
77864
    goto exit;
77865
  }
77866
77867
  goto suspend;
77868
  suspend:
77869
  self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
77870
  self->private_data.s_do_decode_image_config.v_i = v_i;
77871
77872
  goto exit;
77873
  exit:
77874
  if (a_src && a_src->data.ptr) {
77875
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
77876
  }
77877
77878
  return status;
77879
}
77880
77881
// -------- func targa.decoder.decode_frame_config
77882
77883
WUFFS_BASE__GENERATED_C_CODE
77884
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
77885
wuffs_targa__decoder__decode_frame_config(
77886
    wuffs_targa__decoder* self,
77887
    wuffs_base__frame_config* a_dst,
77888
    wuffs_base__io_buffer* a_src) {
77889
  if (!self) {
77890
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
77891
  }
77892
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
77893
    return wuffs_base__make_status(
77894
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
77895
        ? wuffs_base__error__disabled_by_previous_error
77896
        : wuffs_base__error__initialize_not_called);
77897
  }
77898
  if (!a_src) {
77899
    self->private_impl.magic = WUFFS_BASE__DISABLED;
77900
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
77901
  }
77902
  if ((self->private_impl.active_coroutine != 0) &&
77903
      (self->private_impl.active_coroutine != 2)) {
77904
    self->private_impl.magic = WUFFS_BASE__DISABLED;
77905
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
77906
  }
77907
  self->private_impl.active_coroutine = 0;
77908
  wuffs_base__status status = wuffs_base__make_status(NULL);
77909
77910
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
77911
77912
  uint32_t coro_susp_point = self->private_impl.p_decode_frame_config;
77913
  switch (coro_susp_point) {
77914
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
77915
77916
    while (true) {
77917
      {
77918
        wuffs_base__status t_0 = wuffs_targa__decoder__do_decode_frame_config(self, a_dst, a_src);
77919
        v_status = t_0;
77920
      }
77921
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
77922
        status = wuffs_base__make_status(wuffs_targa__error__truncated_input);
77923
        goto exit;
77924
      }
77925
      status = v_status;
77926
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
77927
    }
77928
77929
    ok:
77930
    self->private_impl.p_decode_frame_config = 0;
77931
    goto exit;
77932
  }
77933
77934
  goto suspend;
77935
  suspend:
77936
  self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
77937
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0;
77938
77939
  goto exit;
77940
  exit:
77941
  if (wuffs_base__status__is_error(&status)) {
77942
    self->private_impl.magic = WUFFS_BASE__DISABLED;
77943
  }
77944
  return status;
77945
}
77946
77947
// -------- func targa.decoder.do_decode_frame_config
77948
77949
WUFFS_BASE__GENERATED_C_CODE
77950
static wuffs_base__status
77951
wuffs_targa__decoder__do_decode_frame_config(
77952
    wuffs_targa__decoder* self,
77953
    wuffs_base__frame_config* a_dst,
77954
    wuffs_base__io_buffer* a_src) {
77955
  wuffs_base__status status = wuffs_base__make_status(NULL);
77956
77957
  wuffs_base__pixel_format v_pixfmt = {0};
77958
77959
  const uint8_t* iop_a_src = NULL;
77960
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
77961
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
77962
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
77963
  if (a_src && a_src->data.ptr) {
77964
    io0_a_src = a_src->data.ptr;
77965
    io1_a_src = io0_a_src + a_src->meta.ri;
77966
    iop_a_src = io1_a_src;
77967
    io2_a_src = io0_a_src + a_src->meta.wi;
77968
  }
77969
77970
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config;
77971
  switch (coro_susp_point) {
77972
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
77973
77974
    if (self->private_impl.f_call_sequence == 32u) {
77975
    } else if (self->private_impl.f_call_sequence < 32u) {
77976
      if (a_src) {
77977
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
77978
      }
77979
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
77980
      status = wuffs_targa__decoder__do_decode_image_config(self, NULL, a_src);
77981
      if (a_src) {
77982
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
77983
      }
77984
      if (status.repr) {
77985
        goto suspend;
77986
      }
77987
    } else if (self->private_impl.f_call_sequence == 40u) {
77988
      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)))) {
77989
        status = wuffs_base__make_status(wuffs_base__error__bad_restart);
77990
        goto exit;
77991
      }
77992
    } else if (self->private_impl.f_call_sequence == 64u) {
77993
      self->private_impl.f_call_sequence = 96u;
77994
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
77995
      goto ok;
77996
    } else {
77997
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
77998
      goto ok;
77999
    }
78000
    if (a_dst != NULL) {
78001
      v_pixfmt = wuffs_base__utility__make_pixel_format(self->private_impl.f_src_pixfmt);
78002
      wuffs_base__frame_config__set(
78003
          a_dst,
78004
          wuffs_base__utility__make_rect_ie_u32(
78005
          0u,
78006
          0u,
78007
          self->private_impl.f_width,
78008
          self->private_impl.f_height),
78009
          ((wuffs_base__flicks)(0u)),
78010
          0u,
78011
          self->private_impl.f_frame_config_io_position,
78012
          0u,
78013
          self->private_impl.f_opaque,
78014
          false,
78015
          wuffs_base__pixel_format__default_background_color(&v_pixfmt));
78016
    }
78017
    self->private_impl.f_call_sequence = 64u;
78018
78019
    ok:
78020
    self->private_impl.p_do_decode_frame_config = 0;
78021
    goto exit;
78022
  }
78023
78024
  goto suspend;
78025
  suspend:
78026
  self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
78027
78028
  goto exit;
78029
  exit:
78030
  if (a_src && a_src->data.ptr) {
78031
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
78032
  }
78033
78034
  return status;
78035
}
78036
78037
// -------- func targa.decoder.decode_frame
78038
78039
WUFFS_BASE__GENERATED_C_CODE
78040
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
78041
wuffs_targa__decoder__decode_frame(
78042
    wuffs_targa__decoder* self,
78043
    wuffs_base__pixel_buffer* a_dst,
78044
    wuffs_base__io_buffer* a_src,
78045
    wuffs_base__pixel_blend a_blend,
78046
    wuffs_base__slice_u8 a_workbuf,
78047
    wuffs_base__decode_frame_options* a_opts) {
78048
  if (!self) {
78049
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
78050
  }
78051
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
78052
    return wuffs_base__make_status(
78053
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
78054
        ? wuffs_base__error__disabled_by_previous_error
78055
        : wuffs_base__error__initialize_not_called);
78056
  }
78057
  if (!a_dst || !a_src) {
78058
    self->private_impl.magic = WUFFS_BASE__DISABLED;
78059
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
78060
  }
78061
  if ((self->private_impl.active_coroutine != 0) &&
78062
      (self->private_impl.active_coroutine != 3)) {
78063
    self->private_impl.magic = WUFFS_BASE__DISABLED;
78064
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
78065
  }
78066
  self->private_impl.active_coroutine = 0;
78067
  wuffs_base__status status = wuffs_base__make_status(NULL);
78068
78069
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
78070
78071
  uint32_t coro_susp_point = self->private_impl.p_decode_frame;
78072
  switch (coro_susp_point) {
78073
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
78074
78075
    while (true) {
78076
      {
78077
        wuffs_base__status t_0 = wuffs_targa__decoder__do_decode_frame(self,
78078
            a_dst,
78079
            a_src,
78080
            a_blend,
78081
            a_workbuf,
78082
            a_opts);
78083
        v_status = t_0;
78084
      }
78085
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
78086
        status = wuffs_base__make_status(wuffs_targa__error__truncated_input);
78087
        goto exit;
78088
      }
78089
      status = v_status;
78090
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
78091
    }
78092
78093
    ok:
78094
    self->private_impl.p_decode_frame = 0;
78095
    goto exit;
78096
  }
78097
78098
  goto suspend;
78099
  suspend:
78100
  self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
78101
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0;
78102
78103
  goto exit;
78104
  exit:
78105
  if (wuffs_base__status__is_error(&status)) {
78106
    self->private_impl.magic = WUFFS_BASE__DISABLED;
78107
  }
78108
  return status;
78109
}
78110
78111
// -------- func targa.decoder.do_decode_frame
78112
78113
WUFFS_BASE__GENERATED_C_CODE
78114
static wuffs_base__status
78115
wuffs_targa__decoder__do_decode_frame(
78116
    wuffs_targa__decoder* self,
78117
    wuffs_base__pixel_buffer* a_dst,
78118
    wuffs_base__io_buffer* a_src,
78119
    wuffs_base__pixel_blend a_blend,
78120
    wuffs_base__slice_u8 a_workbuf,
78121
    wuffs_base__decode_frame_options* a_opts) {
78122
  wuffs_base__status status = wuffs_base__make_status(NULL);
78123
78124
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
78125
  wuffs_base__pixel_format v_dst_pixfmt = {0};
78126
  uint32_t v_dst_bits_per_pixel = 0;
78127
  uint64_t v_dst_bytes_per_pixel = 0;
78128
  uint32_t v_dst_x = 0;
78129
  uint32_t v_dst_y = 0;
78130
  wuffs_base__table_u8 v_tab = {0};
78131
  wuffs_base__slice_u8 v_dst_palette = {0};
78132
  wuffs_base__slice_u8 v_dst = {0};
78133
  uint64_t v_dst_start = 0;
78134
  wuffs_base__slice_u8 v_src_palette = {0};
78135
  uint64_t v_mark = 0;
78136
  uint64_t v_num_pixels64 = 0;
78137
  uint32_t v_num_pixels32 = 0;
78138
  uint32_t v_lit_length = 0;
78139
  uint32_t v_run_length = 0;
78140
  uint64_t v_num_dst_bytes = 0;
78141
  uint32_t v_num_src_bytes = 0;
78142
  uint32_t v_c32 = 0;
78143
  uint32_t v_c5 = 0;
78144
78145
  const uint8_t* iop_a_src = NULL;
78146
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
78147
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
78148
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
78149
  if (a_src && a_src->data.ptr) {
78150
    io0_a_src = a_src->data.ptr;
78151
    io1_a_src = io0_a_src + a_src->meta.ri;
78152
    iop_a_src = io1_a_src;
78153
    io2_a_src = io0_a_src + a_src->meta.wi;
78154
  }
78155
78156
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame;
78157
  if (coro_susp_point) {
78158
    v_dst_bytes_per_pixel = self->private_data.s_do_decode_frame.v_dst_bytes_per_pixel;
78159
    v_dst_x = self->private_data.s_do_decode_frame.v_dst_x;
78160
    v_dst_y = self->private_data.s_do_decode_frame.v_dst_y;
78161
    v_mark = self->private_data.s_do_decode_frame.v_mark;
78162
    v_num_pixels32 = self->private_data.s_do_decode_frame.v_num_pixels32;
78163
    v_lit_length = self->private_data.s_do_decode_frame.v_lit_length;
78164
    v_run_length = self->private_data.s_do_decode_frame.v_run_length;
78165
    v_num_dst_bytes = self->private_data.s_do_decode_frame.v_num_dst_bytes;
78166
  }
78167
  switch (coro_susp_point) {
78168
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
78169
78170
    if (self->private_impl.f_call_sequence == 64u) {
78171
    } else if (self->private_impl.f_call_sequence < 64u) {
78172
      if (a_src) {
78173
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
78174
      }
78175
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
78176
      status = wuffs_targa__decoder__do_decode_frame_config(self, NULL, a_src);
78177
      if (a_src) {
78178
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
78179
      }
78180
      if (status.repr) {
78181
        goto suspend;
78182
      }
78183
    } else {
78184
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
78185
      goto ok;
78186
    }
78187
    if (self->private_impl.f_header_color_map_type != 0u) {
78188
      v_src_palette = wuffs_base__make_slice_u8(self->private_data.f_src_palette, 1024);
78189
    }
78190
    v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler,
78191
        wuffs_base__pixel_buffer__pixel_format(a_dst),
78192
        wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)),
78193
        wuffs_base__utility__make_pixel_format(self->private_impl.f_src_pixfmt),
78194
        v_src_palette,
78195
        a_blend);
78196
    if ( ! wuffs_base__status__is_ok(&v_status)) {
78197
      status = v_status;
78198
      if (wuffs_base__status__is_error(&status)) {
78199
        goto exit;
78200
      } else if (wuffs_base__status__is_suspension(&status)) {
78201
        status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
78202
        goto exit;
78203
      }
78204
      goto ok;
78205
    }
78206
    v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
78207
    v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
78208
    if ((v_dst_bits_per_pixel & 7u) != 0u) {
78209
      status = wuffs_base__make_status(wuffs_base__error__unsupported_option);
78210
      goto exit;
78211
    }
78212
    v_dst_bytes_per_pixel = ((uint64_t)((v_dst_bits_per_pixel / 8u)));
78213
    if (((uint8_t)(self->private_impl.f_header_image_descriptor & 32u)) == 0u) {
78214
      v_dst_y = ((uint32_t)(self->private_impl.f_height - 1u));
78215
    }
78216
    if (((uint8_t)(self->private_impl.f_header_image_type & 8u)) == 0u) {
78217
      v_lit_length = self->private_impl.f_width;
78218
    }
78219
    label__resume__continue:;
78220
    while (true) {
78221
      v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
78222
      v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024));
78223
      while (v_dst_y < self->private_impl.f_height) {
78224
        v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_dst_y);
78225
        v_dst_start = (((uint64_t)(v_dst_x)) * v_dst_bytes_per_pixel);
78226
        if (v_dst_start <= ((uint64_t)(v_dst.len))) {
78227
          v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_start);
78228
        } else {
78229
          v_dst = wuffs_base__utility__empty_slice_u8();
78230
        }
78231
        while (v_dst_x < self->private_impl.f_width) {
78232
          if (self->private_impl.f_src_bytes_per_pixel > 0u) {
78233
            if (v_lit_length > 0u) {
78234
              v_mark = ((uint64_t)(iop_a_src - io0_a_src));
78235
              v_num_pixels64 = (((uint64_t)(io2_a_src - iop_a_src)) / ((uint64_t)(self->private_impl.f_src_bytes_per_pixel)));
78236
              v_num_pixels32 = ((uint32_t)(wuffs_base__u64__min(v_num_pixels64, ((uint64_t)(v_lit_length)))));
78237
              v_num_dst_bytes = (((uint64_t)(v_num_pixels32)) * v_dst_bytes_per_pixel);
78238
              v_num_src_bytes = (v_num_pixels32 * self->private_impl.f_src_bytes_per_pixel);
78239
              self->private_data.s_do_decode_frame.scratch = v_num_src_bytes;
78240
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
78241
              if (self->private_data.s_do_decode_frame.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
78242
                self->private_data.s_do_decode_frame.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
78243
                iop_a_src = io2_a_src;
78244
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
78245
                goto suspend;
78246
              }
78247
              iop_a_src += self->private_data.s_do_decode_frame.scratch;
78248
              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));
78249
              if (v_num_dst_bytes <= ((uint64_t)(v_dst.len))) {
78250
                v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_num_dst_bytes);
78251
              } else {
78252
                v_dst = wuffs_base__utility__empty_slice_u8();
78253
              }
78254
              v_dst_x += v_num_pixels32;
78255
              v_lit_length = (((uint32_t)(v_lit_length - v_num_pixels32)) & 65535u);
78256
              if (v_lit_length > 0u) {
78257
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
78258
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3);
78259
                goto label__resume__continue;
78260
              }
78261
            } else if (v_run_length > 0u) {
78262
              v_run_length -= 1u;
78263
              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));
78264
              if (v_dst_bytes_per_pixel <= ((uint64_t)(v_dst.len))) {
78265
                v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_bytes_per_pixel);
78266
              }
78267
              v_dst_x += 1u;
78268
            } else {
78269
              if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
78270
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
78271
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4);
78272
                goto label__resume__continue;
78273
              }
78274
              if (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) < 128u) {
78275
                v_lit_length = (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) + 1u);
78276
                iop_a_src += 1u;
78277
                if ((v_lit_length + v_dst_x) > self->private_impl.f_width) {
78278
                  status = wuffs_base__make_status(wuffs_targa__error__bad_run_length_encoding);
78279
                  goto exit;
78280
                }
78281
              } else {
78282
                if (self->private_impl.f_src_bytes_per_pixel == 1u) {
78283
                  if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) {
78284
                    status = wuffs_base__make_status(wuffs_base__suspension__short_read);
78285
                    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5);
78286
                    goto label__resume__continue;
78287
                  }
78288
                  v_run_length = ((((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) & 127u) + 1u);
78289
                  iop_a_src += 1u;
78290
                  self->private_data.f_scratch[0u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
78291
                  iop_a_src += 1u;
78292
                } else if (self->private_impl.f_src_bytes_per_pixel == 3u) {
78293
                  if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) {
78294
                    status = wuffs_base__make_status(wuffs_base__suspension__short_read);
78295
                    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6);
78296
                    goto label__resume__continue;
78297
                  }
78298
                  v_run_length = ((((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) & 127u) + 1u);
78299
                  iop_a_src += 1u;
78300
                  self->private_data.f_scratch[0u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
78301
                  iop_a_src += 1u;
78302
                  self->private_data.f_scratch[1u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
78303
                  iop_a_src += 1u;
78304
                  self->private_data.f_scratch[2u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
78305
                  iop_a_src += 1u;
78306
                } else {
78307
                  if (((uint64_t)(io2_a_src - iop_a_src)) < 5u) {
78308
                    status = wuffs_base__make_status(wuffs_base__suspension__short_read);
78309
                    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7);
78310
                    goto label__resume__continue;
78311
                  }
78312
                  v_run_length = ((((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) & 127u) + 1u);
78313
                  iop_a_src += 1u;
78314
                  self->private_data.f_scratch[0u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
78315
                  iop_a_src += 1u;
78316
                  self->private_data.f_scratch[1u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
78317
                  iop_a_src += 1u;
78318
                  self->private_data.f_scratch[2u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
78319
                  iop_a_src += 1u;
78320
                  self->private_data.f_scratch[3u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
78321
                  iop_a_src += 1u;
78322
                }
78323
                if ((v_run_length + v_dst_x) > self->private_impl.f_width) {
78324
                  status = wuffs_base__make_status(wuffs_targa__error__bad_run_length_encoding);
78325
                  goto exit;
78326
                }
78327
              }
78328
            }
78329
          } else {
78330
            if (v_lit_length > 0u) {
78331
              if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) {
78332
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
78333
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8);
78334
                goto label__resume__continue;
78335
              }
78336
              v_c32 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
78337
              iop_a_src += 2u;
78338
              v_c5 = (31u & (v_c32 >> 0u));
78339
              self->private_data.f_scratch[0u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u))));
78340
              v_c5 = (31u & (v_c32 >> 5u));
78341
              self->private_data.f_scratch[1u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u))));
78342
              v_c5 = (31u & (v_c32 >> 10u));
78343
              self->private_data.f_scratch[2u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u))));
78344
              self->private_data.f_scratch[3u] = 255u;
78345
              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));
78346
              if (v_dst_bytes_per_pixel <= ((uint64_t)(v_dst.len))) {
78347
                v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_bytes_per_pixel);
78348
              }
78349
              v_dst_x += 1u;
78350
              v_lit_length -= 1u;
78351
            } else if (v_run_length > 0u) {
78352
              v_run_length -= 1u;
78353
              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));
78354
              if (v_dst_bytes_per_pixel <= ((uint64_t)(v_dst.len))) {
78355
                v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_bytes_per_pixel);
78356
              }
78357
              v_dst_x += 1u;
78358
            } else {
78359
              if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
78360
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
78361
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9);
78362
                goto label__resume__continue;
78363
              }
78364
              if (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) < 128u) {
78365
                v_lit_length = (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) + 1u);
78366
                iop_a_src += 1u;
78367
                if ((v_lit_length + v_dst_x) > self->private_impl.f_width) {
78368
                  status = wuffs_base__make_status(wuffs_targa__error__bad_run_length_encoding);
78369
                  goto exit;
78370
                }
78371
              } else {
78372
                if (((uint64_t)(io2_a_src - iop_a_src)) < 3u) {
78373
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
78374
                  WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10);
78375
                  goto label__resume__continue;
78376
                }
78377
                v_run_length = ((((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) & 127u) + 1u);
78378
                iop_a_src += 1u;
78379
                v_c32 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
78380
                iop_a_src += 2u;
78381
                v_c5 = (31u & (v_c32 >> 0u));
78382
                self->private_data.f_scratch[0u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u))));
78383
                v_c5 = (31u & (v_c32 >> 5u));
78384
                self->private_data.f_scratch[1u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u))));
78385
                v_c5 = (31u & (v_c32 >> 10u));
78386
                self->private_data.f_scratch[2u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u))));
78387
                self->private_data.f_scratch[3u] = 255u;
78388
                if ((v_run_length + v_dst_x) > self->private_impl.f_width) {
78389
                  status = wuffs_base__make_status(wuffs_targa__error__bad_run_length_encoding);
78390
                  goto exit;
78391
                }
78392
              }
78393
            }
78394
          }
78395
        }
78396
        v_dst_x = 0u;
78397
        if (((uint8_t)(self->private_impl.f_header_image_descriptor & 32u)) == 0u) {
78398
          v_dst_y -= 1u;
78399
        } else {
78400
          v_dst_y += 1u;
78401
        }
78402
        if (((uint8_t)(self->private_impl.f_header_image_type & 8u)) == 0u) {
78403
          v_lit_length = self->private_impl.f_width;
78404
        }
78405
      }
78406
      break;
78407
    }
78408
    self->private_impl.f_call_sequence = 96u;
78409
78410
    ok:
78411
    self->private_impl.p_do_decode_frame = 0;
78412
    goto exit;
78413
  }
78414
78415
  goto suspend;
78416
  suspend:
78417
  self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
78418
  self->private_data.s_do_decode_frame.v_dst_bytes_per_pixel = v_dst_bytes_per_pixel;
78419
  self->private_data.s_do_decode_frame.v_dst_x = v_dst_x;
78420
  self->private_data.s_do_decode_frame.v_dst_y = v_dst_y;
78421
  self->private_data.s_do_decode_frame.v_mark = v_mark;
78422
  self->private_data.s_do_decode_frame.v_num_pixels32 = v_num_pixels32;
78423
  self->private_data.s_do_decode_frame.v_lit_length = v_lit_length;
78424
  self->private_data.s_do_decode_frame.v_run_length = v_run_length;
78425
  self->private_data.s_do_decode_frame.v_num_dst_bytes = v_num_dst_bytes;
78426
78427
  goto exit;
78428
  exit:
78429
  if (a_src && a_src->data.ptr) {
78430
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
78431
  }
78432
78433
  return status;
78434
}
78435
78436
// -------- func targa.decoder.frame_dirty_rect
78437
78438
WUFFS_BASE__GENERATED_C_CODE
78439
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
78440
wuffs_targa__decoder__frame_dirty_rect(
78441
    const wuffs_targa__decoder* self) {
78442
  if (!self) {
78443
    return wuffs_base__utility__empty_rect_ie_u32();
78444
  }
78445
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
78446
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
78447
    return wuffs_base__utility__empty_rect_ie_u32();
78448
  }
78449
78450
  return wuffs_base__utility__make_rect_ie_u32(
78451
      0u,
78452
      0u,
78453
      self->private_impl.f_width,
78454
      self->private_impl.f_height);
78455
}
78456
78457
// -------- func targa.decoder.num_animation_loops
78458
78459
WUFFS_BASE__GENERATED_C_CODE
78460
WUFFS_BASE__MAYBE_STATIC uint32_t
78461
wuffs_targa__decoder__num_animation_loops(
78462
    const wuffs_targa__decoder* self) {
78463
  if (!self) {
78464
    return 0;
78465
  }
78466
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
78467
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
78468
    return 0;
78469
  }
78470
78471
  return 0u;
78472
}
78473
78474
// -------- func targa.decoder.num_decoded_frame_configs
78475
78476
WUFFS_BASE__GENERATED_C_CODE
78477
WUFFS_BASE__MAYBE_STATIC uint64_t
78478
wuffs_targa__decoder__num_decoded_frame_configs(
78479
    const wuffs_targa__decoder* self) {
78480
  if (!self) {
78481
    return 0;
78482
  }
78483
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
78484
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
78485
    return 0;
78486
  }
78487
78488
  if (self->private_impl.f_call_sequence > 32u) {
78489
    return 1u;
78490
  }
78491
  return 0u;
78492
}
78493
78494
// -------- func targa.decoder.num_decoded_frames
78495
78496
WUFFS_BASE__GENERATED_C_CODE
78497
WUFFS_BASE__MAYBE_STATIC uint64_t
78498
wuffs_targa__decoder__num_decoded_frames(
78499
    const wuffs_targa__decoder* self) {
78500
  if (!self) {
78501
    return 0;
78502
  }
78503
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
78504
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
78505
    return 0;
78506
  }
78507
78508
  if (self->private_impl.f_call_sequence > 64u) {
78509
    return 1u;
78510
  }
78511
  return 0u;
78512
}
78513
78514
// -------- func targa.decoder.restart_frame
78515
78516
WUFFS_BASE__GENERATED_C_CODE
78517
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
78518
wuffs_targa__decoder__restart_frame(
78519
    wuffs_targa__decoder* self,
78520
    uint64_t a_index,
78521
    uint64_t a_io_position) {
78522
  if (!self) {
78523
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
78524
  }
78525
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
78526
    return wuffs_base__make_status(
78527
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
78528
        ? wuffs_base__error__disabled_by_previous_error
78529
        : wuffs_base__error__initialize_not_called);
78530
  }
78531
78532
  if (self->private_impl.f_call_sequence < 32u) {
78533
    return wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
78534
  }
78535
  if (a_index != 0u) {
78536
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
78537
  }
78538
  self->private_impl.f_call_sequence = 40u;
78539
  self->private_impl.f_frame_config_io_position = a_io_position;
78540
  return wuffs_base__make_status(NULL);
78541
}
78542
78543
// -------- func targa.decoder.set_report_metadata
78544
78545
WUFFS_BASE__GENERATED_C_CODE
78546
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
78547
wuffs_targa__decoder__set_report_metadata(
78548
    wuffs_targa__decoder* self,
78549
    uint32_t a_fourcc,
78550
    bool a_report) {
78551
  return wuffs_base__make_empty_struct();
78552
}
78553
78554
// -------- func targa.decoder.tell_me_more
78555
78556
WUFFS_BASE__GENERATED_C_CODE
78557
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
78558
wuffs_targa__decoder__tell_me_more(
78559
    wuffs_targa__decoder* self,
78560
    wuffs_base__io_buffer* a_dst,
78561
    wuffs_base__more_information* a_minfo,
78562
    wuffs_base__io_buffer* a_src) {
78563
  if (!self) {
78564
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
78565
  }
78566
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
78567
    return wuffs_base__make_status(
78568
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
78569
        ? wuffs_base__error__disabled_by_previous_error
78570
        : wuffs_base__error__initialize_not_called);
78571
  }
78572
  if (!a_dst || !a_src) {
78573
    self->private_impl.magic = WUFFS_BASE__DISABLED;
78574
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
78575
  }
78576
  if ((self->private_impl.active_coroutine != 0) &&
78577
      (self->private_impl.active_coroutine != 4)) {
78578
    self->private_impl.magic = WUFFS_BASE__DISABLED;
78579
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
78580
  }
78581
  self->private_impl.active_coroutine = 0;
78582
  wuffs_base__status status = wuffs_base__make_status(NULL);
78583
78584
  status = wuffs_base__make_status(wuffs_base__error__no_more_information);
78585
  goto exit;
78586
78587
  goto ok;
78588
  ok:
78589
  goto exit;
78590
  exit:
78591
  if (wuffs_base__status__is_error(&status)) {
78592
    self->private_impl.magic = WUFFS_BASE__DISABLED;
78593
  }
78594
  return status;
78595
}
78596
78597
// -------- func targa.decoder.workbuf_len
78598
78599
WUFFS_BASE__GENERATED_C_CODE
78600
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
78601
wuffs_targa__decoder__workbuf_len(
78602
    const wuffs_targa__decoder* self) {
78603
  if (!self) {
78604
    return wuffs_base__utility__empty_range_ii_u64();
78605
  }
78606
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
78607
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
78608
    return wuffs_base__utility__empty_range_ii_u64();
78609
  }
78610
78611
  return wuffs_base__utility__make_range_ii_u64(0u, 0u);
78612
}
78613
78614
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__TARGA)
78615
78616
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__THUMBHASH)
78617
78618
// ---------------- Status Codes Implementations
78619
78620
const char wuffs_thumbhash__error__bad_header[] = "#thumbhash: bad header";
78621
const char wuffs_thumbhash__error__truncated_input[] = "#thumbhash: truncated input";
78622
78623
// ---------------- Private Consts
78624
78625
#define WUFFS_THUMBHASH__QUIRKS_BASE 1712283648u
78626
78627
static const uint8_t
78628
WUFFS_THUMBHASH__DIMENSIONS_FROM_DIMENSION_CODES[8] WUFFS_BASE__POTENTIALLY_UNUSED = {
78629
  0u, 14u, 18u, 19u, 23u, 26u, 27u, 32u,
78630
};
78631
78632
static const uint8_t
78633
WUFFS_THUMBHASH__CUMULATIVE_DIMENSIONS[8] WUFFS_BASE__POTENTIALLY_UNUSED = {
78634
  0u, 0u, 14u, 32u, 51u, 74u, 100u, 127u,
78635
};
78636
78637
static const uint8_t
78638
WUFFS_THUMBHASH__DIMENSION_CODES_FROM_HAS_ALPHA_AND_L_COUNT[2][8] WUFFS_BASE__POTENTIALLY_UNUSED = {
78639
  {
78640
    23u, 23u, 23u, 23u, 39u, 71u, 103u, 119u,
78641
  }, {
78642
    55u, 55u, 55u, 55u, 87u, 119u, 118u, 116u,
78643
  },
78644
};
78645
78646
static const uint16_t
78647
WUFFS_THUMBHASH__FROM_4_BITS_TO_PLUS_MINUS_1_00[16] WUFFS_BASE__POTENTIALLY_UNUSED = {
78648
  49152u, 51337u, 53521u, 55706u, 57890u, 60075u, 62259u, 64444u,
78649
  1092u, 3277u, 5461u, 7646u, 9830u, 12015u, 14199u, 16384u,
78650
};
78651
78652
static const uint16_t
78653
WUFFS_THUMBHASH__FROM_4_BITS_TO_PLUS_MINUS_1_25[16] WUFFS_BASE__POTENTIALLY_UNUSED = {
78654
  45056u, 47787u, 50517u, 53248u, 55979u, 58709u, 61440u, 64171u,
78655
  1365u, 4096u, 6827u, 9557u, 12288u, 15019u, 17749u, 20480u,
78656
};
78657
78658
static const uint16_t
78659
WUFFS_THUMBHASH__COSINES[159][6] WUFFS_BASE__POTENTIALLY_UNUSED = {
78660
  {
78661
    16281u, 15973u, 15465u, 14761u, 13873u, 12810u,
78662
  }, {
78663
    15465u, 12810u, 8717u, 3646u, 63702u, 58427u,
78664
  }, {
78665
    13873u, 7109u, 63702u, 55321u, 50071u, 49563u,
78666
  }, {
78667
    11585u, 0u, 53951u, 49152u, 53951u, 0u,
78668
  }, {
78669
    8717u, 58427u, 49255u, 55321u, 5411u, 15973u,
78670
  }, {
78671
    5411u, 52726u, 51663u, 3646u, 16281u, 7109u,
78672
  }, {
78673
    1834u, 49563u, 60125u, 14761u, 8717u, 52726u,
78674
  }, {
78675
    63702u, 49563u, 5411u, 14761u, 56819u, 52726u,
78676
  },
78677
  {
78678
    60125u, 52726u, 13873u, 3646u, 49255u, 7109u,
78679
  }, {
78680
    56819u, 58427u, 16281u, 55321u, 60125u, 15973u,
78681
  }, {
78682
    53951u, 0u, 11585u, 49152u, 11585u, 0u,
78683
  }, {
78684
    51663u, 7109u, 1834u, 55321u, 15465u, 49563u,
78685
  }, {
78686
    50071u, 12810u, 56819u, 3646u, 1834u, 58427u,
78687
  }, {
78688
    49255u, 15973u, 50071u, 14761u, 51663u, 12810u,
78689
  }, {
78690
    16322u, 16135u, 15826u, 15396u, 14849u, 14189u,
78691
  }, {
78692
    15826u, 14189u, 11585u, 8192u, 4240u, 0u,
78693
  },
78694
  {
78695
    14849u, 10531u, 4240u, 62691u, 56139u, 51347u,
78696
  }, {
78697
    13421u, 5604u, 61296u, 52985u, 49214u, 51347u,
78698
  }, {
78699
    11585u, 0u, 53951u, 49152u, 53951u, 0u,
78700
  }, {
78701
    9397u, 59932u, 49710u, 52985u, 1428u, 14189u,
78702
  }, {
78703
    6924u, 55005u, 49710u, 62691u, 13421u, 14189u,
78704
  }, {
78705
    4240u, 51347u, 53951u, 8192u, 15826u, 0u,
78706
  }, {
78707
    1428u, 49401u, 61296u, 15396u, 6924u, 51347u,
78708
  }, {
78709
    64108u, 49401u, 4240u, 15396u, 58612u, 51347u,
78710
  },
78711
  {
78712
    61296u, 51347u, 11585u, 8192u, 49710u, 0u,
78713
  }, {
78714
    58612u, 55005u, 15826u, 62691u, 52115u, 14189u,
78715
  }, {
78716
    56139u, 59932u, 15826u, 52985u, 64108u, 14189u,
78717
  }, {
78718
    53951u, 0u, 11585u, 49152u, 11585u, 0u,
78719
  }, {
78720
    52115u, 5604u, 4240u, 52985u, 16322u, 51347u,
78721
  }, {
78722
    50687u, 10531u, 61296u, 62691u, 9397u, 51347u,
78723
  }, {
78724
    49710u, 14189u, 53951u, 8192u, 61296u, 0u,
78725
  }, {
78726
    49214u, 16135u, 49710u, 15396u, 50687u, 14189u,
78727
  },
78728
  {
78729
    16328u, 16161u, 15883u, 15496u, 15004u, 14409u,
78730
  }, {
78731
    15883u, 14409u, 12054u, 8961u, 5320u, 1353u,
78732
  }, {
78733
    15004u, 11097u, 5320u, 64183u, 57738u, 52607u,
78734
  }, {
78735
    13716u, 6581u, 62839u, 54439u, 49653u, 50040u,
78736
  }, {
78737
    12054u, 1353u, 55473u, 49375u, 51820u, 61514u,
78738
  }, {
78739
    10063u, 61514u, 50532u, 51127u, 62839u, 11097u,
78740
  }, {
78741
    7798u, 56575u, 49208u, 58955u, 10063u, 16161u,
78742
  }, {
78743
    5320u, 52607u, 51820u, 4022u, 16328u, 6581u,
78744
  },
78745
  {
78746
    2697u, 50040u, 57738u, 12929u, 12054u, 56575u,
78747
  }, {
78748
    0u, 49152u, 0u, 16384u, 0u, 49152u,
78749
  }, {
78750
    62839u, 50040u, 7798u, 12929u, 53482u, 56575u,
78751
  }, {
78752
    60216u, 52607u, 13716u, 4022u, 49208u, 6581u,
78753
  }, {
78754
    57738u, 56575u, 16328u, 58955u, 55473u, 16161u,
78755
  }, {
78756
    55473u, 61514u, 15004u, 51127u, 2697u, 11097u,
78757
  }, {
78758
    53482u, 1353u, 10063u, 49375u, 13716u, 61514u,
78759
  }, {
78760
    51820u, 6581u, 2697u, 54439u, 15883u, 50040u,
78761
  },
78762
  {
78763
    50532u, 11097u, 60216u, 64183u, 7798u, 52607u,
78764
  }, {
78765
    49653u, 14409u, 53482u, 8961u, 60216u, 1353u,
78766
  }, {
78767
    49208u, 16161u, 49653u, 15496u, 50532u, 14409u,
78768
  }, {
78769
    16346u, 16231u, 16041u, 15776u, 15438u, 15028u,
78770
  }, {
78771
    16041u, 15028u, 13385u, 11183u, 8513u, 5487u,
78772
  }, {
78773
    15438u, 12709u, 8513u, 3333u, 63305u, 57998u,
78774
  }, {
78775
    14547u, 9448u, 2231u, 60049u, 53562u, 49760u,
78776
  }, {
78777
    13385u, 5487u, 61116u, 52827u, 49190u, 51537u,
78778
  },
78779
  {
78780
    11974u, 1118u, 55196u, 49305u, 52151u, 62203u,
78781
  }, {
78782
    10340u, 62203u, 50989u, 50508u, 61116u, 9448u,
78783
  }, {
78784
    8513u, 57998u, 49190u, 56088u, 6527u, 16231u,
78785
  }, {
78786
    6527u, 54353u, 50098u, 64418u, 14547u, 12709u,
78787
  }, {
78788
    4420u, 51537u, 53562u, 7538u, 16041u, 1118u,
78789
  }, {
78790
    2231u, 49760u, 59009u, 13999u, 10340u, 54353u,
78791
  }, {
78792
    0u, 49152u, 0u, 16384u, 0u, 49152u,
78793
  }, {
78794
    63305u, 49760u, 6527u, 13999u, 55196u, 54353u,
78795
  },
78796
  {
78797
    61116u, 51537u, 11974u, 7538u, 49495u, 1118u,
78798
  }, {
78799
    59009u, 54353u, 15438u, 64418u, 50989u, 12709u,
78800
  }, {
78801
    57023u, 57998u, 16346u, 56088u, 59009u, 16231u,
78802
  }, {
78803
    55196u, 62203u, 14547u, 50508u, 4420u, 9448u,
78804
  }, {
78805
    53562u, 1118u, 10340u, 49305u, 13385u, 62203u,
78806
  }, {
78807
    52151u, 5487u, 4420u, 52827u, 16346u, 51537u,
78808
  }, {
78809
    50989u, 9448u, 63305u, 60049u, 11974u, 49760u,
78810
  }, {
78811
    50098u, 12709u, 57023u, 3333u, 2231u, 57998u,
78812
  },
78813
  {
78814
    49495u, 15028u, 52151u, 11183u, 57023u, 5487u,
78815
  }, {
78816
    49190u, 16231u, 49495u, 15776u, 50098u, 15028u,
78817
  }, {
78818
    16354u, 16265u, 16116u, 15908u, 15642u, 15319u,
78819
  }, {
78820
    16116u, 15319u, 14021u, 12264u, 10104u, 7614u,
78821
  }, {
78822
    15642u, 13484u, 10104u, 5810u, 989u, 61615u,
78823
  }, {
78824
    14941u, 10865u, 4874u, 63561u, 57060u, 52052u,
78825
  }, {
78826
    14021u, 7614u, 64547u, 56229u, 50595u, 49271u,
78827
  }, {
78828
    12897u, 3921u, 58812u, 51029u, 49420u, 54671u,
78829
  },
78830
  {
78831
    11585u, 0u, 53951u, 49152u, 53951u, 0u,
78832
  }, {
78833
    10104u, 61615u, 50595u, 51029u, 62583u, 10865u,
78834
  }, {
78835
    8476u, 57922u, 49182u, 56229u, 6724u, 16265u,
78836
  }, {
78837
    6724u, 54671u, 49894u, 63561u, 14021u, 13484u,
78838
  }, {
78839
    4874u, 52052u, 52639u, 5810u, 16354u, 3921u,
78840
  }, {
78841
    2953u, 50217u, 57060u, 12264u, 12897u, 57922u,
78842
  }, {
78843
    989u, 49271u, 62583u, 15908u, 4874u, 50217u,
78844
  }, {
78845
    64547u, 49271u, 2953u, 15908u, 60662u, 50217u,
78846
  },
78847
  {
78848
    62583u, 50217u, 8476u, 12264u, 52639u, 57922u,
78849
  }, {
78850
    60662u, 52052u, 12897u, 5810u, 49182u, 3921u,
78851
  }, {
78852
    58812u, 54671u, 15642u, 63561u, 51515u, 13484u,
78853
  }, {
78854
    57060u, 57922u, 16354u, 56229u, 58812u, 16265u,
78855
  }, {
78856
    55432u, 61615u, 14941u, 51029u, 2953u, 10865u,
78857
  }, {
78858
    53951u, 0u, 11585u, 49152u, 11585u, 0u,
78859
  }, {
78860
    52639u, 3921u, 6724u, 51029u, 16116u, 54671u,
78861
  }, {
78862
    51515u, 7614u, 989u, 56229u, 14941u, 49271u,
78863
  },
78864
  {
78865
    50595u, 10865u, 60662u, 63561u, 8476u, 52052u,
78866
  }, {
78867
    49894u, 13484u, 55432u, 5810u, 64547u, 61615u,
78868
  }, {
78869
    49420u, 15319u, 51515u, 12264u, 55432u, 7614u,
78870
  }, {
78871
    49182u, 16265u, 49420u, 15908u, 49894u, 15319u,
78872
  }, {
78873
    16356u, 16273u, 16135u, 15942u, 15696u, 15396u,
78874
  }, {
78875
    16135u, 15396u, 14189u, 12551u, 10531u, 8192u,
78876
  }, {
78877
    15696u, 13689u, 10531u, 6489u, 1902u, 62691u,
78878
  }, {
78879
    15044u, 11243u, 5604u, 64583u, 58183u, 52985u,
78880
  },
78881
  {
78882
    14189u, 8192u, 0u, 57344u, 51347u, 49152u,
78883
  }, {
78884
    13142u, 4699u, 59932u, 51847u, 49180u, 52985u,
78885
  }, {
78886
    11917u, 953u, 55005u, 49263u, 52394u, 62691u,
78887
  }, {
78888
    10531u, 62691u, 51347u, 50140u, 59932u, 8192u,
78889
  }, {
78890
    9003u, 59047u, 49401u, 54293u, 3778u, 15396u,
78891
  }, {
78892
    7353u, 55752u, 49401u, 60837u, 11917u, 15396u,
78893
  }, {
78894
    5604u, 52985u, 51347u, 2845u, 16135u, 8192u,
78895
  }, {
78896
    3778u, 50895u, 55005u, 9784u, 15044u, 62691u,
78897
  },
78898
  {
78899
    1902u, 49594u, 59932u, 14641u, 9003u, 52985u,
78900
  }, {
78901
    0u, 49152u, 0u, 16384u, 0u, 49152u,
78902
  }, {
78903
    63634u, 49594u, 5604u, 14641u, 56533u, 52985u,
78904
  }, {
78905
    61758u, 50895u, 10531u, 9784u, 50492u, 62691u,
78906
  }, {
78907
    59932u, 52985u, 14189u, 2845u, 49401u, 8192u,
78908
  }, {
78909
    58183u, 55752u, 16135u, 60837u, 53619u, 15396u,
78910
  }, {
78911
    56533u, 59047u, 16135u, 54293u, 61758u, 15396u,
78912
  }, {
78913
    55005u, 62691u, 14189u, 50140u, 5604u, 8192u,
78914
  },
78915
  {
78916
    53619u, 953u, 10531u, 49263u, 13142u, 62691u,
78917
  }, {
78918
    52394u, 4699u, 5604u, 51847u, 16356u, 52985u,
78919
  }, {
78920
    51347u, 8192u, 0u, 57344u, 14189u, 49152u,
78921
  }, {
78922
    50492u, 11243u, 59932u, 64583u, 7353u, 52985u,
78923
  }, {
78924
    49840u, 13689u, 55005u, 6489u, 63634u, 62691u,
78925
  }, {
78926
    49401u, 15396u, 51347u, 12551u, 55005u, 8192u,
78927
  }, {
78928
    49180u, 16273u, 49401u, 15942u, 49840u, 15396u,
78929
  }, {
78930
    16364u, 16305u, 16207u, 16069u, 15893u, 15679u,
78931
  },
78932
  {
78933
    16207u, 15679u, 14811u, 13623u, 12140u, 10394u,
78934
  }, {
78935
    15893u, 14449u, 12140u, 9102u, 5520u, 1606u,
78936
  }, {
78937
    15426u, 12665u, 8423u, 3196u, 63132u, 57813u,
78938
  }, {
78939
    14811u, 10394u, 3981u, 62340u, 55776u, 51087u,
78940
  }, {
78941
    14053u, 7723u, 64732u, 56434u, 50725u, 49231u,
78942
  }, {
78943
    13160u, 4756u, 60016u, 51913u, 49172u, 52871u,
78944
  }, {
78945
    12140u, 1606u, 55776u, 49467u, 51483u, 60780u,
78946
  }, {
78947
    11003u, 63930u, 52376u, 49467u, 57113u, 4756u,
78948
  },
78949
  {
78950
    9760u, 60780u, 50110u, 51913u, 64732u, 12665u,
78951
  }, {
78952
    8423u, 57813u, 49172u, 56434u, 7005u, 16305u,
78953
  }, {
78954
    7005u, 55142u, 49643u, 62340u, 13160u, 14449u,
78955
  }, {
78956
    5520u, 52871u, 51483u, 3196u, 16207u, 7723u,
78957
  }, {
78958
    3981u, 51087u, 54533u, 9102u, 15426u, 63930u,
78959
  }, {
78960
    2404u, 49857u, 58531u, 13623u, 11003u, 55142u,
78961
  }, {
78962
    804u, 49231u, 63132u, 16069u, 3981u, 49857u,
78963
  }, {
78964
    64732u, 49231u, 2404u, 16069u, 61555u, 49857u,
78965
  },
78966
  {
78967
    63132u, 49857u, 7005u, 13623u, 54533u, 55142u,
78968
  }, {
78969
    61555u, 51087u, 11003u, 9102u, 50110u, 63930u,
78970
  }, {
78971
    60016u, 52871u, 14053u, 3196u, 49329u, 7723u,
78972
  }, {
78973
    58531u, 55142u, 15893u, 62340u, 52376u, 14449u,
78974
  }, {
78975
    57113u, 57813u, 16364u, 56434u, 58531u, 16305u,
78976
  }, {
78977
    55776u, 60780u, 15426u, 51913u, 804u, 12665u,
78978
  }, {
78979
    54533u, 63930u, 13160u, 49467u, 8423u, 4756u,
78980
  }, {
78981
    53396u, 1606u, 9760u, 49467u, 14053u, 60780u,
78982
  },
78983
  {
78984
    52376u, 4756u, 5520u, 51913u, 16364u, 52871u,
78985
  }, {
78986
    51483u, 7723u, 804u, 56434u, 14811u, 49231u,
78987
  }, {
78988
    50725u, 10394u, 61555u, 62340u, 9760u, 51087u,
78989
  }, {
78990
    50110u, 12665u, 57113u, 3196u, 2404u, 57813u,
78991
  }, {
78992
    49643u, 14449u, 53396u, 9102u, 60016u, 1606u,
78993
  }, {
78994
    49329u, 15679u, 50725u, 13623u, 53396u, 10394u,
78995
  }, {
78996
    49172u, 16305u, 49329u, 16069u, 49643u, 15679u,
78997
  },
78998
};
78999
79000
// ---------------- Private Initializer Prototypes
79001
79002
// ---------------- Private Function Prototypes
79003
79004
WUFFS_BASE__GENERATED_C_CODE
79005
static wuffs_base__status
79006
wuffs_thumbhash__decoder__do_decode_image_config(
79007
    wuffs_thumbhash__decoder* self,
79008
    wuffs_base__image_config* a_dst,
79009
    wuffs_base__io_buffer* a_src);
79010
79011
WUFFS_BASE__GENERATED_C_CODE
79012
static wuffs_base__status
79013
wuffs_thumbhash__decoder__do_decode_frame_config(
79014
    wuffs_thumbhash__decoder* self,
79015
    wuffs_base__frame_config* a_dst,
79016
    wuffs_base__io_buffer* a_src);
79017
79018
WUFFS_BASE__GENERATED_C_CODE
79019
static wuffs_base__status
79020
wuffs_thumbhash__decoder__do_decode_frame(
79021
    wuffs_thumbhash__decoder* self,
79022
    wuffs_base__pixel_buffer* a_dst,
79023
    wuffs_base__io_buffer* a_src,
79024
    wuffs_base__pixel_blend a_blend,
79025
    wuffs_base__slice_u8 a_workbuf,
79026
    wuffs_base__decode_frame_options* a_opts);
79027
79028
WUFFS_BASE__GENERATED_C_CODE
79029
static wuffs_base__status
79030
wuffs_thumbhash__decoder__from_src_to_coeffs(
79031
    wuffs_thumbhash__decoder* self,
79032
    wuffs_base__io_buffer* a_src);
79033
79034
WUFFS_BASE__GENERATED_C_CODE
79035
static wuffs_base__empty_struct
79036
wuffs_thumbhash__decoder__from_coeffs_to_pixels(
79037
    wuffs_thumbhash__decoder* self);
79038
79039
WUFFS_BASE__GENERATED_C_CODE
79040
static wuffs_base__status
79041
wuffs_thumbhash__decoder__from_pixels_to_dst(
79042
    wuffs_thumbhash__decoder* self,
79043
    wuffs_base__pixel_buffer* a_dst);
79044
79045
// ---------------- VTables
79046
79047
const wuffs_base__image_decoder__func_ptrs
79048
wuffs_thumbhash__decoder__func_ptrs_for__wuffs_base__image_decoder = {
79049
  (wuffs_base__status(*)(void*,
79050
      wuffs_base__pixel_buffer*,
79051
      wuffs_base__io_buffer*,
79052
      wuffs_base__pixel_blend,
79053
      wuffs_base__slice_u8,
79054
      wuffs_base__decode_frame_options*))(&wuffs_thumbhash__decoder__decode_frame),
79055
  (wuffs_base__status(*)(void*,
79056
      wuffs_base__frame_config*,
79057
      wuffs_base__io_buffer*))(&wuffs_thumbhash__decoder__decode_frame_config),
79058
  (wuffs_base__status(*)(void*,
79059
      wuffs_base__image_config*,
79060
      wuffs_base__io_buffer*))(&wuffs_thumbhash__decoder__decode_image_config),
79061
  (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_thumbhash__decoder__frame_dirty_rect),
79062
  (uint64_t(*)(const void*,
79063
      uint32_t))(&wuffs_thumbhash__decoder__get_quirk),
79064
  (uint32_t(*)(const void*))(&wuffs_thumbhash__decoder__num_animation_loops),
79065
  (uint64_t(*)(const void*))(&wuffs_thumbhash__decoder__num_decoded_frame_configs),
79066
  (uint64_t(*)(const void*))(&wuffs_thumbhash__decoder__num_decoded_frames),
79067
  (wuffs_base__status(*)(void*,
79068
      uint64_t,
79069
      uint64_t))(&wuffs_thumbhash__decoder__restart_frame),
79070
  (wuffs_base__status(*)(void*,
79071
      uint32_t,
79072
      uint64_t))(&wuffs_thumbhash__decoder__set_quirk),
79073
  (wuffs_base__empty_struct(*)(void*,
79074
      uint32_t,
79075
      bool))(&wuffs_thumbhash__decoder__set_report_metadata),
79076
  (wuffs_base__status(*)(void*,
79077
      wuffs_base__io_buffer*,
79078
      wuffs_base__more_information*,
79079
      wuffs_base__io_buffer*))(&wuffs_thumbhash__decoder__tell_me_more),
79080
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_thumbhash__decoder__workbuf_len),
79081
};
79082
79083
// ---------------- Initializer Implementations
79084
79085
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
79086
wuffs_thumbhash__decoder__initialize(
79087
    wuffs_thumbhash__decoder* self,
79088
    size_t sizeof_star_self,
79089
    uint64_t wuffs_version,
79090
    uint32_t options){
79091
  if (!self) {
79092
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
79093
  }
79094
  if (sizeof(*self) != sizeof_star_self) {
79095
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
79096
  }
79097
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
79098
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
79099
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
79100
  }
79101
79102
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
79103
    // The whole point of this if-check is to detect an uninitialized *self.
79104
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
79105
#if !defined(__clang__) && defined(__GNUC__)
79106
#pragma GCC diagnostic push
79107
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
79108
#endif
79109
    if (self->private_impl.magic != 0) {
79110
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
79111
    }
79112
#if !defined(__clang__) && defined(__GNUC__)
79113
#pragma GCC diagnostic pop
79114
#endif
79115
  } else {
79116
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
79117
      memset(self, 0, sizeof(*self));
79118
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
79119
    } else {
79120
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
79121
    }
79122
  }
79123
79124
  self->private_impl.magic = WUFFS_BASE__MAGIC;
79125
  self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name =
79126
      wuffs_base__image_decoder__vtable_name;
79127
  self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers =
79128
      (const void*)(&wuffs_thumbhash__decoder__func_ptrs_for__wuffs_base__image_decoder);
79129
  return wuffs_base__make_status(NULL);
79130
}
79131
79132
wuffs_thumbhash__decoder*
79133
wuffs_thumbhash__decoder__alloc(void) {
79134
  wuffs_thumbhash__decoder* x =
79135
      (wuffs_thumbhash__decoder*)(calloc(1, sizeof(wuffs_thumbhash__decoder)));
79136
  if (!x) {
79137
    return NULL;
79138
  }
79139
  if (wuffs_thumbhash__decoder__initialize(
79140
      x, sizeof(wuffs_thumbhash__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
79141
    free(x);
79142
    return NULL;
79143
  }
79144
  return x;
79145
}
79146
79147
size_t
79148
sizeof__wuffs_thumbhash__decoder(void) {
79149
  return sizeof(wuffs_thumbhash__decoder);
79150
}
79151
79152
// ---------------- Function Implementations
79153
79154
// -------- func thumbhash.decoder.get_quirk
79155
79156
WUFFS_BASE__GENERATED_C_CODE
79157
WUFFS_BASE__MAYBE_STATIC uint64_t
79158
wuffs_thumbhash__decoder__get_quirk(
79159
    const wuffs_thumbhash__decoder* self,
79160
    uint32_t a_key) {
79161
  if (!self) {
79162
    return 0;
79163
  }
79164
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
79165
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
79166
    return 0;
79167
  }
79168
79169
  if ((a_key == 1712283648u) && self->private_impl.f_quirk_just_raw_thumbhash) {
79170
    return 1u;
79171
  }
79172
  return 0u;
79173
}
79174
79175
// -------- func thumbhash.decoder.set_quirk
79176
79177
WUFFS_BASE__GENERATED_C_CODE
79178
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
79179
wuffs_thumbhash__decoder__set_quirk(
79180
    wuffs_thumbhash__decoder* self,
79181
    uint32_t a_key,
79182
    uint64_t a_value) {
79183
  if (!self) {
79184
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
79185
  }
79186
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
79187
    return wuffs_base__make_status(
79188
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
79189
        ? wuffs_base__error__disabled_by_previous_error
79190
        : wuffs_base__error__initialize_not_called);
79191
  }
79192
79193
  if (a_key == 1712283648u) {
79194
    self->private_impl.f_quirk_just_raw_thumbhash = (a_value > 0u);
79195
    return wuffs_base__make_status(NULL);
79196
  }
79197
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
79198
}
79199
79200
// -------- func thumbhash.decoder.decode_image_config
79201
79202
WUFFS_BASE__GENERATED_C_CODE
79203
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
79204
wuffs_thumbhash__decoder__decode_image_config(
79205
    wuffs_thumbhash__decoder* self,
79206
    wuffs_base__image_config* a_dst,
79207
    wuffs_base__io_buffer* a_src) {
79208
  if (!self) {
79209
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
79210
  }
79211
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
79212
    return wuffs_base__make_status(
79213
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
79214
        ? wuffs_base__error__disabled_by_previous_error
79215
        : wuffs_base__error__initialize_not_called);
79216
  }
79217
  if (!a_src) {
79218
    self->private_impl.magic = WUFFS_BASE__DISABLED;
79219
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
79220
  }
79221
  if ((self->private_impl.active_coroutine != 0) &&
79222
      (self->private_impl.active_coroutine != 1)) {
79223
    self->private_impl.magic = WUFFS_BASE__DISABLED;
79224
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
79225
  }
79226
  self->private_impl.active_coroutine = 0;
79227
  wuffs_base__status status = wuffs_base__make_status(NULL);
79228
79229
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
79230
79231
  uint32_t coro_susp_point = self->private_impl.p_decode_image_config;
79232
  switch (coro_susp_point) {
79233
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
79234
79235
    while (true) {
79236
      {
79237
        wuffs_base__status t_0 = wuffs_thumbhash__decoder__do_decode_image_config(self, a_dst, a_src);
79238
        v_status = t_0;
79239
      }
79240
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
79241
        status = wuffs_base__make_status(wuffs_thumbhash__error__truncated_input);
79242
        goto exit;
79243
      }
79244
      status = v_status;
79245
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
79246
    }
79247
79248
    ok:
79249
    self->private_impl.p_decode_image_config = 0;
79250
    goto exit;
79251
  }
79252
79253
  goto suspend;
79254
  suspend:
79255
  self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
79256
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
79257
79258
  goto exit;
79259
  exit:
79260
  if (wuffs_base__status__is_error(&status)) {
79261
    self->private_impl.magic = WUFFS_BASE__DISABLED;
79262
  }
79263
  return status;
79264
}
79265
79266
// -------- func thumbhash.decoder.do_decode_image_config
79267
79268
WUFFS_BASE__GENERATED_C_CODE
79269
static wuffs_base__status
79270
wuffs_thumbhash__decoder__do_decode_image_config(
79271
    wuffs_thumbhash__decoder* self,
79272
    wuffs_base__image_config* a_dst,
79273
    wuffs_base__io_buffer* a_src) {
79274
  wuffs_base__status status = wuffs_base__make_status(NULL);
79275
79276
  uint32_t v_c32 = 0;
79277
  uint8_t v_swap = 0;
79278
79279
  const uint8_t* iop_a_src = NULL;
79280
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
79281
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
79282
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
79283
  if (a_src && a_src->data.ptr) {
79284
    io0_a_src = a_src->data.ptr;
79285
    io1_a_src = io0_a_src + a_src->meta.ri;
79286
    iop_a_src = io1_a_src;
79287
    io2_a_src = io0_a_src + a_src->meta.wi;
79288
  }
79289
79290
  uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config;
79291
  switch (coro_susp_point) {
79292
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
79293
79294
    if (self->private_impl.f_call_sequence != 0u) {
79295
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
79296
      goto exit;
79297
    }
79298
    if ( ! self->private_impl.f_quirk_just_raw_thumbhash) {
79299
      {
79300
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
79301
        uint32_t t_0;
79302
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) {
79303
          t_0 = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src)));
79304
          iop_a_src += 3;
79305
        } else {
79306
          self->private_data.s_do_decode_image_config.scratch = 0;
79307
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
79308
          while (true) {
79309
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
79310
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
79311
              goto suspend;
79312
            }
79313
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
79314
            uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
79315
            *scratch <<= 8;
79316
            *scratch >>= 8;
79317
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
79318
            if (num_bits_0 == 16) {
79319
              t_0 = ((uint32_t)(*scratch));
79320
              break;
79321
            }
79322
            num_bits_0 += 8u;
79323
            *scratch |= ((uint64_t)(num_bits_0)) << 56;
79324
          }
79325
        }
79326
        v_c32 = t_0;
79327
      }
79328
      if (v_c32 != 16694979u) {
79329
        status = wuffs_base__make_status(wuffs_thumbhash__error__bad_header);
79330
        goto exit;
79331
      }
79332
    }
79333
    {
79334
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
79335
      uint32_t t_1;
79336
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) {
79337
        t_1 = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src)));
79338
        iop_a_src += 3;
79339
      } else {
79340
        self->private_data.s_do_decode_image_config.scratch = 0;
79341
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
79342
        while (true) {
79343
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
79344
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
79345
            goto suspend;
79346
          }
79347
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
79348
          uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
79349
          *scratch <<= 8;
79350
          *scratch >>= 8;
79351
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
79352
          if (num_bits_1 == 16) {
79353
            t_1 = ((uint32_t)(*scratch));
79354
            break;
79355
          }
79356
          num_bits_1 += 8u;
79357
          *scratch |= ((uint64_t)(num_bits_1)) << 56;
79358
        }
79359
      }
79360
      v_c32 = t_1;
79361
    }
79362
    self->private_impl.f_l_dc = (((uint64_t)(((v_c32 >> 0u) & 63u))) * 136339441844224u);
79363
    self->private_impl.f_p_dc = ((uint64_t)((((uint64_t)(((v_c32 >> 6u) & 63u))) * 272678883688448u) - 8589384836186112u));
79364
    self->private_impl.f_q_dc = ((uint64_t)((((uint64_t)(((v_c32 >> 12u) & 63u))) * 272678883688448u) - 8589384836186112u));
79365
    self->private_impl.f_l_scale = ((uint8_t)(((v_c32 >> 18u) & 31u)));
79366
    self->private_impl.f_has_alpha = ((uint8_t)(((v_c32 >> 23u) & 1u)));
79367
    {
79368
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
79369
      uint32_t t_2;
79370
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
79371
        t_2 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
79372
        iop_a_src += 2;
79373
      } else {
79374
        self->private_data.s_do_decode_image_config.scratch = 0;
79375
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
79376
        while (true) {
79377
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
79378
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
79379
            goto suspend;
79380
          }
79381
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
79382
          uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56));
79383
          *scratch <<= 8;
79384
          *scratch >>= 8;
79385
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2;
79386
          if (num_bits_2 == 8) {
79387
            t_2 = ((uint32_t)(*scratch));
79388
            break;
79389
          }
79390
          num_bits_2 += 8u;
79391
          *scratch |= ((uint64_t)(num_bits_2)) << 56;
79392
        }
79393
      }
79394
      v_c32 = t_2;
79395
    }
79396
    self->private_impl.f_l_count = ((uint8_t)(((v_c32 >> 0u) & 7u)));
79397
    self->private_impl.f_p_scale = ((uint8_t)(((v_c32 >> 3u) & 63u)));
79398
    self->private_impl.f_q_scale = ((uint8_t)(((v_c32 >> 9u) & 63u)));
79399
    self->private_impl.f_is_landscape = ((uint8_t)(((v_c32 >> 15u) & 1u)));
79400
    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));
79401
    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));
79402
    if (self->private_impl.f_is_landscape != 0u) {
79403
      v_swap = self->private_impl.f_w_dimension_code;
79404
      self->private_impl.f_w_dimension_code = self->private_impl.f_h_dimension_code;
79405
      self->private_impl.f_h_dimension_code = v_swap;
79406
    }
79407
    if (self->private_impl.f_is_landscape != 0u) {
79408
      self->private_impl.f_lx = ((uint32_t)(((uint8_t)(7u - ((uint8_t)(2u * self->private_impl.f_has_alpha))))));
79409
      self->private_impl.f_ly = ((uint32_t)(wuffs_base__u8__max(self->private_impl.f_l_count, 3u)));
79410
    } else {
79411
      self->private_impl.f_lx = ((uint32_t)(wuffs_base__u8__max(self->private_impl.f_l_count, 3u)));
79412
      self->private_impl.f_ly = ((uint32_t)(((uint8_t)(7u - ((uint8_t)(2u * self->private_impl.f_has_alpha))))));
79413
    }
79414
    self->private_impl.f_frame_config_io_position = 8u;
79415
    if (self->private_impl.f_has_alpha != 0u) {
79416
      {
79417
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
79418
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
79419
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
79420
          goto suspend;
79421
        }
79422
        uint32_t t_3 = *iop_a_src++;
79423
        v_c32 = t_3;
79424
      }
79425
      self->private_impl.f_a_dc = (((uint64_t)(((v_c32 >> 0u) & 15u))) << 42u);
79426
      self->private_impl.f_a_scale = ((uint8_t)(((v_c32 >> 4u) & 15u)));
79427
      self->private_impl.f_frame_config_io_position = 9u;
79428
    }
79429
    if (self->private_impl.f_quirk_just_raw_thumbhash) {
79430
#if defined(__GNUC__)
79431
#pragma GCC diagnostic push
79432
#pragma GCC diagnostic ignored "-Wconversion"
79433
#endif
79434
      self->private_impl.f_frame_config_io_position -= 3u;
79435
#if defined(__GNUC__)
79436
#pragma GCC diagnostic pop
79437
#endif
79438
    }
79439
    self->private_impl.f_pixfmt = 2415954056u;
79440
    if (self->private_impl.f_has_alpha != 0u) {
79441
      self->private_impl.f_pixfmt = 2164295816u;
79442
    }
79443
    if (a_dst != NULL) {
79444
      wuffs_base__image_config__set(
79445
          a_dst,
79446
          self->private_impl.f_pixfmt,
79447
          0u,
79448
          ((uint32_t)(WUFFS_THUMBHASH__DIMENSIONS_FROM_DIMENSION_CODES[self->private_impl.f_w_dimension_code])),
79449
          ((uint32_t)(WUFFS_THUMBHASH__DIMENSIONS_FROM_DIMENSION_CODES[self->private_impl.f_h_dimension_code])),
79450
          ((uint64_t)(self->private_impl.f_frame_config_io_position)),
79451
          (self->private_impl.f_has_alpha == 0u));
79452
    }
79453
    self->private_impl.f_call_sequence = 32u;
79454
79455
    goto ok;
79456
    ok:
79457
    self->private_impl.p_do_decode_image_config = 0;
79458
    goto exit;
79459
  }
79460
79461
  goto suspend;
79462
  suspend:
79463
  self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
79464
79465
  goto exit;
79466
  exit:
79467
  if (a_src && a_src->data.ptr) {
79468
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
79469
  }
79470
79471
  return status;
79472
}
79473
79474
// -------- func thumbhash.decoder.decode_frame_config
79475
79476
WUFFS_BASE__GENERATED_C_CODE
79477
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
79478
wuffs_thumbhash__decoder__decode_frame_config(
79479
    wuffs_thumbhash__decoder* self,
79480
    wuffs_base__frame_config* a_dst,
79481
    wuffs_base__io_buffer* a_src) {
79482
  if (!self) {
79483
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
79484
  }
79485
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
79486
    return wuffs_base__make_status(
79487
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
79488
        ? wuffs_base__error__disabled_by_previous_error
79489
        : wuffs_base__error__initialize_not_called);
79490
  }
79491
  if (!a_src) {
79492
    self->private_impl.magic = WUFFS_BASE__DISABLED;
79493
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
79494
  }
79495
  if ((self->private_impl.active_coroutine != 0) &&
79496
      (self->private_impl.active_coroutine != 2)) {
79497
    self->private_impl.magic = WUFFS_BASE__DISABLED;
79498
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
79499
  }
79500
  self->private_impl.active_coroutine = 0;
79501
  wuffs_base__status status = wuffs_base__make_status(NULL);
79502
79503
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
79504
79505
  uint32_t coro_susp_point = self->private_impl.p_decode_frame_config;
79506
  switch (coro_susp_point) {
79507
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
79508
79509
    while (true) {
79510
      {
79511
        wuffs_base__status t_0 = wuffs_thumbhash__decoder__do_decode_frame_config(self, a_dst, a_src);
79512
        v_status = t_0;
79513
      }
79514
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
79515
        status = wuffs_base__make_status(wuffs_thumbhash__error__truncated_input);
79516
        goto exit;
79517
      }
79518
      status = v_status;
79519
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
79520
    }
79521
79522
    ok:
79523
    self->private_impl.p_decode_frame_config = 0;
79524
    goto exit;
79525
  }
79526
79527
  goto suspend;
79528
  suspend:
79529
  self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
79530
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0;
79531
79532
  goto exit;
79533
  exit:
79534
  if (wuffs_base__status__is_error(&status)) {
79535
    self->private_impl.magic = WUFFS_BASE__DISABLED;
79536
  }
79537
  return status;
79538
}
79539
79540
// -------- func thumbhash.decoder.do_decode_frame_config
79541
79542
WUFFS_BASE__GENERATED_C_CODE
79543
static wuffs_base__status
79544
wuffs_thumbhash__decoder__do_decode_frame_config(
79545
    wuffs_thumbhash__decoder* self,
79546
    wuffs_base__frame_config* a_dst,
79547
    wuffs_base__io_buffer* a_src) {
79548
  wuffs_base__status status = wuffs_base__make_status(NULL);
79549
79550
  wuffs_base__pixel_format v_pixfmt = {0};
79551
79552
  const uint8_t* iop_a_src = NULL;
79553
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
79554
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
79555
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
79556
  if (a_src && a_src->data.ptr) {
79557
    io0_a_src = a_src->data.ptr;
79558
    io1_a_src = io0_a_src + a_src->meta.ri;
79559
    iop_a_src = io1_a_src;
79560
    io2_a_src = io0_a_src + a_src->meta.wi;
79561
  }
79562
79563
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config;
79564
  switch (coro_susp_point) {
79565
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
79566
79567
    if (self->private_impl.f_call_sequence == 32u) {
79568
    } else if (self->private_impl.f_call_sequence < 32u) {
79569
      if (a_src) {
79570
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
79571
      }
79572
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
79573
      status = wuffs_thumbhash__decoder__do_decode_image_config(self, NULL, a_src);
79574
      if (a_src) {
79575
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
79576
      }
79577
      if (status.repr) {
79578
        goto suspend;
79579
      }
79580
    } else if (self->private_impl.f_call_sequence == 40u) {
79581
      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)))) {
79582
        status = wuffs_base__make_status(wuffs_base__error__bad_restart);
79583
        goto exit;
79584
      }
79585
    } else if (self->private_impl.f_call_sequence == 64u) {
79586
      self->private_impl.f_call_sequence = 96u;
79587
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
79588
      goto ok;
79589
    } else {
79590
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
79591
      goto ok;
79592
    }
79593
    if (a_dst != NULL) {
79594
      v_pixfmt = wuffs_base__utility__make_pixel_format(self->private_impl.f_pixfmt);
79595
      wuffs_base__frame_config__set(
79596
          a_dst,
79597
          wuffs_base__utility__make_rect_ie_u32(
79598
          0u,
79599
          0u,
79600
          ((uint32_t)(WUFFS_THUMBHASH__DIMENSIONS_FROM_DIMENSION_CODES[self->private_impl.f_w_dimension_code])),
79601
          ((uint32_t)(WUFFS_THUMBHASH__DIMENSIONS_FROM_DIMENSION_CODES[self->private_impl.f_h_dimension_code]))),
79602
          ((wuffs_base__flicks)(0u)),
79603
          0u,
79604
          ((uint64_t)(self->private_impl.f_frame_config_io_position)),
79605
          0u,
79606
          (self->private_impl.f_has_alpha == 0u),
79607
          false,
79608
          wuffs_base__pixel_format__default_background_color(&v_pixfmt));
79609
    }
79610
    self->private_impl.f_call_sequence = 64u;
79611
79612
    ok:
79613
    self->private_impl.p_do_decode_frame_config = 0;
79614
    goto exit;
79615
  }
79616
79617
  goto suspend;
79618
  suspend:
79619
  self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
79620
79621
  goto exit;
79622
  exit:
79623
  if (a_src && a_src->data.ptr) {
79624
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
79625
  }
79626
79627
  return status;
79628
}
79629
79630
// -------- func thumbhash.decoder.decode_frame
79631
79632
WUFFS_BASE__GENERATED_C_CODE
79633
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
79634
wuffs_thumbhash__decoder__decode_frame(
79635
    wuffs_thumbhash__decoder* self,
79636
    wuffs_base__pixel_buffer* a_dst,
79637
    wuffs_base__io_buffer* a_src,
79638
    wuffs_base__pixel_blend a_blend,
79639
    wuffs_base__slice_u8 a_workbuf,
79640
    wuffs_base__decode_frame_options* a_opts) {
79641
  if (!self) {
79642
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
79643
  }
79644
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
79645
    return wuffs_base__make_status(
79646
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
79647
        ? wuffs_base__error__disabled_by_previous_error
79648
        : wuffs_base__error__initialize_not_called);
79649
  }
79650
  if (!a_dst || !a_src) {
79651
    self->private_impl.magic = WUFFS_BASE__DISABLED;
79652
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
79653
  }
79654
  if ((self->private_impl.active_coroutine != 0) &&
79655
      (self->private_impl.active_coroutine != 3)) {
79656
    self->private_impl.magic = WUFFS_BASE__DISABLED;
79657
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
79658
  }
79659
  self->private_impl.active_coroutine = 0;
79660
  wuffs_base__status status = wuffs_base__make_status(NULL);
79661
79662
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
79663
79664
  uint32_t coro_susp_point = self->private_impl.p_decode_frame;
79665
  switch (coro_susp_point) {
79666
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
79667
79668
    while (true) {
79669
      {
79670
        wuffs_base__status t_0 = wuffs_thumbhash__decoder__do_decode_frame(self,
79671
            a_dst,
79672
            a_src,
79673
            a_blend,
79674
            a_workbuf,
79675
            a_opts);
79676
        v_status = t_0;
79677
      }
79678
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
79679
        status = wuffs_base__make_status(wuffs_thumbhash__error__truncated_input);
79680
        goto exit;
79681
      }
79682
      status = v_status;
79683
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
79684
    }
79685
79686
    ok:
79687
    self->private_impl.p_decode_frame = 0;
79688
    goto exit;
79689
  }
79690
79691
  goto suspend;
79692
  suspend:
79693
  self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
79694
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0;
79695
79696
  goto exit;
79697
  exit:
79698
  if (wuffs_base__status__is_error(&status)) {
79699
    self->private_impl.magic = WUFFS_BASE__DISABLED;
79700
  }
79701
  return status;
79702
}
79703
79704
// -------- func thumbhash.decoder.do_decode_frame
79705
79706
WUFFS_BASE__GENERATED_C_CODE
79707
static wuffs_base__status
79708
wuffs_thumbhash__decoder__do_decode_frame(
79709
    wuffs_thumbhash__decoder* self,
79710
    wuffs_base__pixel_buffer* a_dst,
79711
    wuffs_base__io_buffer* a_src,
79712
    wuffs_base__pixel_blend a_blend,
79713
    wuffs_base__slice_u8 a_workbuf,
79714
    wuffs_base__decode_frame_options* a_opts) {
79715
  wuffs_base__status status = wuffs_base__make_status(NULL);
79716
79717
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
79718
79719
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame;
79720
  switch (coro_susp_point) {
79721
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
79722
79723
    if (self->private_impl.f_call_sequence == 64u) {
79724
    } else if (self->private_impl.f_call_sequence < 64u) {
79725
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
79726
      status = wuffs_thumbhash__decoder__do_decode_frame_config(self, NULL, a_src);
79727
      if (status.repr) {
79728
        goto suspend;
79729
      }
79730
    } else {
79731
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
79732
      goto ok;
79733
    }
79734
    v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler,
79735
        wuffs_base__pixel_buffer__pixel_format(a_dst),
79736
        wuffs_base__pixel_buffer__palette(a_dst),
79737
        wuffs_base__utility__make_pixel_format(self->private_impl.f_pixfmt),
79738
        wuffs_base__utility__empty_slice_u8(),
79739
        a_blend);
79740
    if ( ! wuffs_base__status__is_ok(&v_status)) {
79741
      status = v_status;
79742
      if (wuffs_base__status__is_error(&status)) {
79743
        goto exit;
79744
      } else if (wuffs_base__status__is_suspension(&status)) {
79745
        status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
79746
        goto exit;
79747
      }
79748
      goto ok;
79749
    }
79750
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
79751
    status = wuffs_thumbhash__decoder__from_src_to_coeffs(self, a_src);
79752
    if (status.repr) {
79753
      goto suspend;
79754
    }
79755
    wuffs_thumbhash__decoder__from_coeffs_to_pixels(self);
79756
    v_status = wuffs_thumbhash__decoder__from_pixels_to_dst(self, a_dst);
79757
    if ( ! wuffs_base__status__is_ok(&v_status)) {
79758
      status = v_status;
79759
      if (wuffs_base__status__is_error(&status)) {
79760
        goto exit;
79761
      } else if (wuffs_base__status__is_suspension(&status)) {
79762
        status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
79763
        goto exit;
79764
      }
79765
      goto ok;
79766
    }
79767
    self->private_impl.f_call_sequence = 96u;
79768
79769
    ok:
79770
    self->private_impl.p_do_decode_frame = 0;
79771
    goto exit;
79772
  }
79773
79774
  goto suspend;
79775
  suspend:
79776
  self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
79777
79778
  goto exit;
79779
  exit:
79780
  return status;
79781
}
79782
79783
// -------- func thumbhash.decoder.from_src_to_coeffs
79784
79785
WUFFS_BASE__GENERATED_C_CODE
79786
static wuffs_base__status
79787
wuffs_thumbhash__decoder__from_src_to_coeffs(
79788
    wuffs_thumbhash__decoder* self,
79789
    wuffs_base__io_buffer* a_src) {
79790
  wuffs_base__status status = wuffs_base__make_status(NULL);
79791
79792
  uint8_t v_c8 = 0;
79793
  uint32_t v_cy = 0;
79794
  uint32_t v_cx = 0;
79795
  uint32_t v_i = 0;
79796
  bool v_has_bits = false;
79797
79798
  const uint8_t* iop_a_src = NULL;
79799
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
79800
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
79801
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
79802
  if (a_src && a_src->data.ptr) {
79803
    io0_a_src = a_src->data.ptr;
79804
    io1_a_src = io0_a_src + a_src->meta.ri;
79805
    iop_a_src = io1_a_src;
79806
    io2_a_src = io0_a_src + a_src->meta.wi;
79807
  }
79808
79809
  uint32_t coro_susp_point = self->private_impl.p_from_src_to_coeffs;
79810
  if (coro_susp_point) {
79811
    v_cy = self->private_data.s_from_src_to_coeffs.v_cy;
79812
    v_cx = self->private_data.s_from_src_to_coeffs.v_cx;
79813
    v_i = self->private_data.s_from_src_to_coeffs.v_i;
79814
    v_has_bits = self->private_data.s_from_src_to_coeffs.v_has_bits;
79815
  }
79816
  switch (coro_susp_point) {
79817
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
79818
79819
    v_i = 0u;
79820
    v_cy = 0u;
79821
    while (v_cy < self->private_impl.f_ly) {
79822
      v_cx = 0u;
79823
      if (v_cy == 0u) {
79824
        v_cx = 1u;
79825
      }
79826
      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))))) {
79827
        if (v_has_bits) {
79828
          v_has_bits = false;
79829
#if defined(__GNUC__)
79830
#pragma GCC diagnostic push
79831
#pragma GCC diagnostic ignored "-Wconversion"
79832
#endif
79833
          v_c8 >>= 4u;
79834
#if defined(__GNUC__)
79835
#pragma GCC diagnostic pop
79836
#endif
79837
        } else {
79838
          v_has_bits = true;
79839
          {
79840
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
79841
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
79842
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
79843
              goto suspend;
79844
            }
79845
            uint8_t t_0 = *iop_a_src++;
79846
            v_c8 = t_0;
79847
          }
79848
        }
79849
        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))])));
79850
        v_i += 1u;
79851
        v_cx += 1u;
79852
      }
79853
      v_cy += 1u;
79854
    }
79855
    v_i = 0u;
79856
    v_cx = 0u;
79857
    while (v_cx < 5u) {
79858
      if (v_has_bits) {
79859
        v_has_bits = false;
79860
#if defined(__GNUC__)
79861
#pragma GCC diagnostic push
79862
#pragma GCC diagnostic ignored "-Wconversion"
79863
#endif
79864
        v_c8 >>= 4u;
79865
#if defined(__GNUC__)
79866
#pragma GCC diagnostic pop
79867
#endif
79868
      } else {
79869
        v_has_bits = true;
79870
        {
79871
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
79872
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
79873
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
79874
            goto suspend;
79875
          }
79876
          uint8_t t_1 = *iop_a_src++;
79877
          v_c8 = t_1;
79878
        }
79879
      }
79880
      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))])));
79881
      v_i += 1u;
79882
      v_cx += 1u;
79883
    }
79884
    v_i = 0u;
79885
    v_cx = 0u;
79886
    while (v_cx < 5u) {
79887
      if (v_has_bits) {
79888
        v_has_bits = false;
79889
#if defined(__GNUC__)
79890
#pragma GCC diagnostic push
79891
#pragma GCC diagnostic ignored "-Wconversion"
79892
#endif
79893
        v_c8 >>= 4u;
79894
#if defined(__GNUC__)
79895
#pragma GCC diagnostic pop
79896
#endif
79897
      } else {
79898
        v_has_bits = true;
79899
        {
79900
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
79901
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
79902
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
79903
            goto suspend;
79904
          }
79905
          uint8_t t_2 = *iop_a_src++;
79906
          v_c8 = t_2;
79907
        }
79908
      }
79909
      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))])));
79910
      v_i += 1u;
79911
      v_cx += 1u;
79912
    }
79913
    if (self->private_impl.f_has_alpha == 0u) {
79914
      status = wuffs_base__make_status(NULL);
79915
      goto ok;
79916
    }
79917
    v_i = 0u;
79918
    v_cx = 0u;
79919
    while (v_cx < 14u) {
79920
      if (v_has_bits) {
79921
        v_has_bits = false;
79922
#if defined(__GNUC__)
79923
#pragma GCC diagnostic push
79924
#pragma GCC diagnostic ignored "-Wconversion"
79925
#endif
79926
        v_c8 >>= 4u;
79927
#if defined(__GNUC__)
79928
#pragma GCC diagnostic pop
79929
#endif
79930
      } else {
79931
        v_has_bits = true;
79932
        {
79933
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
79934
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
79935
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
79936
            goto suspend;
79937
          }
79938
          uint8_t t_3 = *iop_a_src++;
79939
          v_c8 = t_3;
79940
        }
79941
      }
79942
      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))])));
79943
      v_i += 1u;
79944
      v_cx += 1u;
79945
    }
79946
79947
    ok:
79948
    self->private_impl.p_from_src_to_coeffs = 0;
79949
    goto exit;
79950
  }
79951
79952
  goto suspend;
79953
  suspend:
79954
  self->private_impl.p_from_src_to_coeffs = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
79955
  self->private_data.s_from_src_to_coeffs.v_cy = v_cy;
79956
  self->private_data.s_from_src_to_coeffs.v_cx = v_cx;
79957
  self->private_data.s_from_src_to_coeffs.v_i = v_i;
79958
  self->private_data.s_from_src_to_coeffs.v_has_bits = v_has_bits;
79959
79960
  goto exit;
79961
  exit:
79962
  if (a_src && a_src->data.ptr) {
79963
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
79964
  }
79965
79966
  return status;
79967
}
79968
79969
// -------- func thumbhash.decoder.from_coeffs_to_pixels
79970
79971
WUFFS_BASE__GENERATED_C_CODE
79972
static wuffs_base__empty_struct
79973
wuffs_thumbhash__decoder__from_coeffs_to_pixels(
79974
    wuffs_thumbhash__decoder* self) {
79975
  uint32_t v_h = 0;
79976
  uint32_t v_w = 0;
79977
  uint32_t v_fy[8] = {0};
79978
  uint32_t v_fx[8] = {0};
79979
  uint32_t v_cosines_base_y = 0;
79980
  uint32_t v_cosines_base_x = 0;
79981
  uint32_t v_y = 0;
79982
  uint32_t v_x = 0;
79983
  uint32_t v_f = 0;
79984
  uint64_t v_l = 0;
79985
  uint64_t v_p = 0;
79986
  uint64_t v_q = 0;
79987
  uint64_t v_b = 0;
79988
  uint64_t v_g = 0;
79989
  uint64_t v_r = 0;
79990
  uint64_t v_a = 0;
79991
  uint32_t v_i = 0;
79992
  uint32_t v_cy = 0;
79993
  uint32_t v_cx = 0;
79994
79995
  v_h = ((uint32_t)(WUFFS_THUMBHASH__DIMENSIONS_FROM_DIMENSION_CODES[self->private_impl.f_h_dimension_code]));
79996
  v_w = ((uint32_t)(WUFFS_THUMBHASH__DIMENSIONS_FROM_DIMENSION_CODES[self->private_impl.f_w_dimension_code]));
79997
  v_fy[0u] = 16384u;
79998
  v_fx[0u] = 16384u;
79999
  v_a = 255u;
80000
  v_y = 0u;
80001
  while (v_y < v_h) {
80002
    v_cosines_base_y = ((uint32_t)(WUFFS_THUMBHASH__CUMULATIVE_DIMENSIONS[self->private_impl.f_h_dimension_code]));
80003
    v_fy[1u] = wuffs_base__utility__sign_extend_convert_u16_u32(WUFFS_THUMBHASH__COSINES[(v_cosines_base_y + v_y)][0u]);
80004
    v_fy[2u] = wuffs_base__utility__sign_extend_convert_u16_u32(WUFFS_THUMBHASH__COSINES[(v_cosines_base_y + v_y)][1u]);
80005
    v_fy[3u] = wuffs_base__utility__sign_extend_convert_u16_u32(WUFFS_THUMBHASH__COSINES[(v_cosines_base_y + v_y)][2u]);
80006
    v_fy[4u] = wuffs_base__utility__sign_extend_convert_u16_u32(WUFFS_THUMBHASH__COSINES[(v_cosines_base_y + v_y)][3u]);
80007
    v_fy[5u] = wuffs_base__utility__sign_extend_convert_u16_u32(WUFFS_THUMBHASH__COSINES[(v_cosines_base_y + v_y)][4u]);
80008
    v_fy[6u] = wuffs_base__utility__sign_extend_convert_u16_u32(WUFFS_THUMBHASH__COSINES[(v_cosines_base_y + v_y)][5u]);
80009
    v_x = 0u;
80010
    while (v_x < v_w) {
80011
      v_cosines_base_x = ((uint32_t)(WUFFS_THUMBHASH__CUMULATIVE_DIMENSIONS[self->private_impl.f_w_dimension_code]));
80012
      v_fx[1u] = wuffs_base__utility__sign_extend_convert_u16_u32(WUFFS_THUMBHASH__COSINES[(v_cosines_base_x + v_x)][0u]);
80013
      v_fx[2u] = wuffs_base__utility__sign_extend_convert_u16_u32(WUFFS_THUMBHASH__COSINES[(v_cosines_base_x + v_x)][1u]);
80014
      v_fx[3u] = wuffs_base__utility__sign_extend_convert_u16_u32(WUFFS_THUMBHASH__COSINES[(v_cosines_base_x + v_x)][2u]);
80015
      v_fx[4u] = wuffs_base__utility__sign_extend_convert_u16_u32(WUFFS_THUMBHASH__COSINES[(v_cosines_base_x + v_x)][3u]);
80016
      v_fx[5u] = wuffs_base__utility__sign_extend_convert_u16_u32(WUFFS_THUMBHASH__COSINES[(v_cosines_base_x + v_x)][4u]);
80017
      v_fx[6u] = wuffs_base__utility__sign_extend_convert_u16_u32(WUFFS_THUMBHASH__COSINES[(v_cosines_base_x + v_x)][5u]);
80018
      v_l = self->private_impl.f_l_dc;
80019
      v_i = 0u;
80020
      v_cy = 0u;
80021
      while (v_cy < self->private_impl.f_ly) {
80022
        v_cx = 0u;
80023
        if (v_cy == 0u) {
80024
          v_cx = 1u;
80025
        }
80026
        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))))) {
80027
          v_f = ((uint32_t)(v_fx[(v_cx & 7u)] * v_fy[(v_cy & 7u)]));
80028
          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)])));
80029
          v_i += 1u;
80030
          v_cx += 1u;
80031
        }
80032
        v_cy += 1u;
80033
      }
80034
      v_p = self->private_impl.f_p_dc;
80035
      v_q = self->private_impl.f_q_dc;
80036
      v_i = 0u;
80037
      v_cy = 0u;
80038
      while (v_cy < 3u) {
80039
        v_cx = 0u;
80040
        if (v_cy == 0u) {
80041
          v_cx = 1u;
80042
        }
80043
        while (v_cx < (3u - v_cy)) {
80044
          v_f = ((uint32_t)(v_fx[v_cx] * v_fy[v_cy]));
80045
          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)])));
80046
          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)])));
80047
          v_i += 1u;
80048
          v_cx += 1u;
80049
        }
80050
        v_cy += 1u;
80051
      }
80052
      v_b = ((uint64_t)(v_l - wuffs_base__utility__i64_divide(((uint64_t)(2u * v_p)), 3u)));
80053
      v_r = wuffs_base__utility__sign_extend_rshift_u64(((uint64_t)(((uint64_t)(((uint64_t)(3u * v_l)) + v_q)) - v_b)), 1u);
80054
      v_g = ((uint64_t)(v_r - v_q));
80055
      if ((v_b >> 63u) != 0u) {
80056
        v_b = 0u;
80057
      } else if (v_b >= 8589384836185950u) {
80058
        v_b = 255u;
80059
      } else {
80060
        v_b /= 33683862102690u;
80061
      }
80062
      if ((v_g >> 63u) != 0u) {
80063
        v_g = 0u;
80064
      } else if (v_g >= 8589384836185950u) {
80065
        v_g = 255u;
80066
      } else {
80067
        v_g /= 33683862102690u;
80068
      }
80069
      if ((v_r >> 63u) != 0u) {
80070
        v_r = 0u;
80071
      } else if (v_r >= 8589384836185950u) {
80072
        v_r = 255u;
80073
      } else {
80074
        v_r /= 33683862102690u;
80075
      }
80076
      if (self->private_impl.f_has_alpha != 0u) {
80077
        v_a = self->private_impl.f_a_dc;
80078
        v_i = 0u;
80079
        v_cy = 0u;
80080
        while (v_cy < 5u) {
80081
          v_cx = 0u;
80082
          if (v_cy == 0u) {
80083
            v_cx = 1u;
80084
          }
80085
          while (v_cx < (5u - v_cy)) {
80086
            v_f = ((uint32_t)(v_fx[v_cx] * v_fy[v_cy]));
80087
            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)])));
80088
            v_i += 1u;
80089
            v_cx += 1u;
80090
          }
80091
          v_cy += 1u;
80092
        }
80093
        if ((v_a >> 63u) != 0u) {
80094
          v_a = 0u;
80095
        } else if (v_a >= 65970697666500u) {
80096
          v_a = 255u;
80097
        } else {
80098
          v_a /= 258708618300u;
80099
        }
80100
      }
80101
      self->private_data.f_pixels[v_y][((4u * v_x) + 0u)] = ((uint8_t)(v_b));
80102
      self->private_data.f_pixels[v_y][((4u * v_x) + 1u)] = ((uint8_t)(v_g));
80103
      self->private_data.f_pixels[v_y][((4u * v_x) + 2u)] = ((uint8_t)(v_r));
80104
      self->private_data.f_pixels[v_y][((4u * v_x) + 3u)] = ((uint8_t)(v_a));
80105
      v_x += 1u;
80106
    }
80107
    v_y += 1u;
80108
  }
80109
  return wuffs_base__make_empty_struct();
80110
}
80111
80112
// -------- func thumbhash.decoder.from_pixels_to_dst
80113
80114
WUFFS_BASE__GENERATED_C_CODE
80115
static wuffs_base__status
80116
wuffs_thumbhash__decoder__from_pixels_to_dst(
80117
    wuffs_thumbhash__decoder* self,
80118
    wuffs_base__pixel_buffer* a_dst) {
80119
  uint32_t v_h = 0;
80120
  uint32_t v_w = 0;
80121
  wuffs_base__pixel_format v_dst_pixfmt = {0};
80122
  uint32_t v_dst_bits_per_pixel = 0;
80123
  uint32_t v_dst_bytes_per_pixel = 0;
80124
  uint64_t v_dst_bytes_per_row = 0;
80125
  wuffs_base__table_u8 v_tab = {0};
80126
  uint32_t v_y = 0;
80127
  wuffs_base__slice_u8 v_dst = {0};
80128
  wuffs_base__slice_u8 v_src = {0};
80129
80130
  v_h = ((uint32_t)(WUFFS_THUMBHASH__DIMENSIONS_FROM_DIMENSION_CODES[self->private_impl.f_h_dimension_code]));
80131
  v_w = ((uint32_t)(WUFFS_THUMBHASH__DIMENSIONS_FROM_DIMENSION_CODES[self->private_impl.f_w_dimension_code]));
80132
  v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
80133
  v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
80134
  if ((v_dst_bits_per_pixel & 7u) != 0u) {
80135
    return wuffs_base__make_status(wuffs_base__error__unsupported_option);
80136
  }
80137
  v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u);
80138
  v_dst_bytes_per_row = ((uint64_t)((v_w * v_dst_bytes_per_pixel)));
80139
  v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
80140
  while (v_y < v_h) {
80141
    v_src = wuffs_base__make_slice_u8(self->private_data.f_pixels[v_y], (v_w * 4u));
80142
    v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_y);
80143
    if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) {
80144
      v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row);
80145
    }
80146
    wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, wuffs_base__pixel_buffer__palette(a_dst), v_src);
80147
    v_y += 1u;
80148
  }
80149
  return wuffs_base__make_status(NULL);
80150
}
80151
80152
// -------- func thumbhash.decoder.frame_dirty_rect
80153
80154
WUFFS_BASE__GENERATED_C_CODE
80155
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
80156
wuffs_thumbhash__decoder__frame_dirty_rect(
80157
    const wuffs_thumbhash__decoder* self) {
80158
  if (!self) {
80159
    return wuffs_base__utility__empty_rect_ie_u32();
80160
  }
80161
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
80162
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
80163
    return wuffs_base__utility__empty_rect_ie_u32();
80164
  }
80165
80166
  return wuffs_base__utility__make_rect_ie_u32(
80167
      0u,
80168
      0u,
80169
      ((uint32_t)(WUFFS_THUMBHASH__DIMENSIONS_FROM_DIMENSION_CODES[self->private_impl.f_w_dimension_code])),
80170
      ((uint32_t)(WUFFS_THUMBHASH__DIMENSIONS_FROM_DIMENSION_CODES[self->private_impl.f_h_dimension_code])));
80171
}
80172
80173
// -------- func thumbhash.decoder.num_animation_loops
80174
80175
WUFFS_BASE__GENERATED_C_CODE
80176
WUFFS_BASE__MAYBE_STATIC uint32_t
80177
wuffs_thumbhash__decoder__num_animation_loops(
80178
    const wuffs_thumbhash__decoder* self) {
80179
  if (!self) {
80180
    return 0;
80181
  }
80182
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
80183
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
80184
    return 0;
80185
  }
80186
80187
  return 0u;
80188
}
80189
80190
// -------- func thumbhash.decoder.num_decoded_frame_configs
80191
80192
WUFFS_BASE__GENERATED_C_CODE
80193
WUFFS_BASE__MAYBE_STATIC uint64_t
80194
wuffs_thumbhash__decoder__num_decoded_frame_configs(
80195
    const wuffs_thumbhash__decoder* self) {
80196
  if (!self) {
80197
    return 0;
80198
  }
80199
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
80200
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
80201
    return 0;
80202
  }
80203
80204
  if (self->private_impl.f_call_sequence > 32u) {
80205
    return 1u;
80206
  }
80207
  return 0u;
80208
}
80209
80210
// -------- func thumbhash.decoder.num_decoded_frames
80211
80212
WUFFS_BASE__GENERATED_C_CODE
80213
WUFFS_BASE__MAYBE_STATIC uint64_t
80214
wuffs_thumbhash__decoder__num_decoded_frames(
80215
    const wuffs_thumbhash__decoder* self) {
80216
  if (!self) {
80217
    return 0;
80218
  }
80219
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
80220
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
80221
    return 0;
80222
  }
80223
80224
  if (self->private_impl.f_call_sequence > 64u) {
80225
    return 1u;
80226
  }
80227
  return 0u;
80228
}
80229
80230
// -------- func thumbhash.decoder.restart_frame
80231
80232
WUFFS_BASE__GENERATED_C_CODE
80233
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
80234
wuffs_thumbhash__decoder__restart_frame(
80235
    wuffs_thumbhash__decoder* self,
80236
    uint64_t a_index,
80237
    uint64_t a_io_position) {
80238
  if (!self) {
80239
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
80240
  }
80241
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
80242
    return wuffs_base__make_status(
80243
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
80244
        ? wuffs_base__error__disabled_by_previous_error
80245
        : wuffs_base__error__initialize_not_called);
80246
  }
80247
80248
  if (self->private_impl.f_call_sequence < 32u) {
80249
    return wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
80250
  }
80251
  if ((a_index != 0u) || (a_io_position != ((uint64_t)(self->private_impl.f_frame_config_io_position)))) {
80252
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
80253
  }
80254
  self->private_impl.f_call_sequence = 40u;
80255
  return wuffs_base__make_status(NULL);
80256
}
80257
80258
// -------- func thumbhash.decoder.set_report_metadata
80259
80260
WUFFS_BASE__GENERATED_C_CODE
80261
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
80262
wuffs_thumbhash__decoder__set_report_metadata(
80263
    wuffs_thumbhash__decoder* self,
80264
    uint32_t a_fourcc,
80265
    bool a_report) {
80266
  return wuffs_base__make_empty_struct();
80267
}
80268
80269
// -------- func thumbhash.decoder.tell_me_more
80270
80271
WUFFS_BASE__GENERATED_C_CODE
80272
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
80273
wuffs_thumbhash__decoder__tell_me_more(
80274
    wuffs_thumbhash__decoder* self,
80275
    wuffs_base__io_buffer* a_dst,
80276
    wuffs_base__more_information* a_minfo,
80277
    wuffs_base__io_buffer* a_src) {
80278
  if (!self) {
80279
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
80280
  }
80281
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
80282
    return wuffs_base__make_status(
80283
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
80284
        ? wuffs_base__error__disabled_by_previous_error
80285
        : wuffs_base__error__initialize_not_called);
80286
  }
80287
  if (!a_dst || !a_src) {
80288
    self->private_impl.magic = WUFFS_BASE__DISABLED;
80289
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
80290
  }
80291
  if ((self->private_impl.active_coroutine != 0) &&
80292
      (self->private_impl.active_coroutine != 4)) {
80293
    self->private_impl.magic = WUFFS_BASE__DISABLED;
80294
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
80295
  }
80296
  self->private_impl.active_coroutine = 0;
80297
  wuffs_base__status status = wuffs_base__make_status(NULL);
80298
80299
  status = wuffs_base__make_status(wuffs_base__error__no_more_information);
80300
  goto exit;
80301
80302
  goto ok;
80303
  ok:
80304
  goto exit;
80305
  exit:
80306
  if (wuffs_base__status__is_error(&status)) {
80307
    self->private_impl.magic = WUFFS_BASE__DISABLED;
80308
  }
80309
  return status;
80310
}
80311
80312
// -------- func thumbhash.decoder.workbuf_len
80313
80314
WUFFS_BASE__GENERATED_C_CODE
80315
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
80316
wuffs_thumbhash__decoder__workbuf_len(
80317
    const wuffs_thumbhash__decoder* self) {
80318
  if (!self) {
80319
    return wuffs_base__utility__empty_range_ii_u64();
80320
  }
80321
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
80322
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
80323
    return wuffs_base__utility__empty_range_ii_u64();
80324
  }
80325
80326
  return wuffs_base__utility__make_range_ii_u64(0u, 0u);
80327
}
80328
80329
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__THUMBHASH)
80330
80331
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__VP8)
80332
80333
// ---------------- Status Codes Implementations
80334
80335
const char wuffs_vp8__error__bad_header[] = "#vp8: bad header";
80336
const char wuffs_vp8__error__truncated_input[] = "#vp8: truncated input";
80337
const char wuffs_vp8__error__unsupported_vp8_file[] = "#vp8: unsupported VP8 file";
80338
80339
// ---------------- Private Consts
80340
80341
// ---------------- Private Initializer Prototypes
80342
80343
// ---------------- Private Function Prototypes
80344
80345
WUFFS_BASE__GENERATED_C_CODE
80346
static wuffs_base__status
80347
wuffs_vp8__decoder__do_decode_image_config(
80348
    wuffs_vp8__decoder* self,
80349
    wuffs_base__image_config* a_dst,
80350
    wuffs_base__io_buffer* a_src);
80351
80352
WUFFS_BASE__GENERATED_C_CODE
80353
static wuffs_base__status
80354
wuffs_vp8__decoder__do_decode_frame_config(
80355
    wuffs_vp8__decoder* self,
80356
    wuffs_base__frame_config* a_dst,
80357
    wuffs_base__io_buffer* a_src);
80358
80359
WUFFS_BASE__GENERATED_C_CODE
80360
static wuffs_base__status
80361
wuffs_vp8__decoder__do_decode_frame(
80362
    wuffs_vp8__decoder* self,
80363
    wuffs_base__pixel_buffer* a_dst,
80364
    wuffs_base__io_buffer* a_src,
80365
    wuffs_base__pixel_blend a_blend,
80366
    wuffs_base__slice_u8 a_workbuf,
80367
    wuffs_base__decode_frame_options* a_opts);
80368
80369
WUFFS_BASE__GENERATED_C_CODE
80370
static wuffs_base__status
80371
wuffs_vp8__decoder__make_a_placeholder_gradient(
80372
    wuffs_vp8__decoder* self,
80373
    wuffs_base__pixel_buffer* a_dst);
80374
80375
// ---------------- VTables
80376
80377
const wuffs_base__image_decoder__func_ptrs
80378
wuffs_vp8__decoder__func_ptrs_for__wuffs_base__image_decoder = {
80379
  (wuffs_base__status(*)(void*,
80380
      wuffs_base__pixel_buffer*,
80381
      wuffs_base__io_buffer*,
80382
      wuffs_base__pixel_blend,
80383
      wuffs_base__slice_u8,
80384
      wuffs_base__decode_frame_options*))(&wuffs_vp8__decoder__decode_frame),
80385
  (wuffs_base__status(*)(void*,
80386
      wuffs_base__frame_config*,
80387
      wuffs_base__io_buffer*))(&wuffs_vp8__decoder__decode_frame_config),
80388
  (wuffs_base__status(*)(void*,
80389
      wuffs_base__image_config*,
80390
      wuffs_base__io_buffer*))(&wuffs_vp8__decoder__decode_image_config),
80391
  (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_vp8__decoder__frame_dirty_rect),
80392
  (uint64_t(*)(const void*,
80393
      uint32_t))(&wuffs_vp8__decoder__get_quirk),
80394
  (uint32_t(*)(const void*))(&wuffs_vp8__decoder__num_animation_loops),
80395
  (uint64_t(*)(const void*))(&wuffs_vp8__decoder__num_decoded_frame_configs),
80396
  (uint64_t(*)(const void*))(&wuffs_vp8__decoder__num_decoded_frames),
80397
  (wuffs_base__status(*)(void*,
80398
      uint64_t,
80399
      uint64_t))(&wuffs_vp8__decoder__restart_frame),
80400
  (wuffs_base__status(*)(void*,
80401
      uint32_t,
80402
      uint64_t))(&wuffs_vp8__decoder__set_quirk),
80403
  (wuffs_base__empty_struct(*)(void*,
80404
      uint32_t,
80405
      bool))(&wuffs_vp8__decoder__set_report_metadata),
80406
  (wuffs_base__status(*)(void*,
80407
      wuffs_base__io_buffer*,
80408
      wuffs_base__more_information*,
80409
      wuffs_base__io_buffer*))(&wuffs_vp8__decoder__tell_me_more),
80410
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_vp8__decoder__workbuf_len),
80411
};
80412
80413
// ---------------- Initializer Implementations
80414
80415
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
80416
wuffs_vp8__decoder__initialize(
80417
    wuffs_vp8__decoder* self,
80418
    size_t sizeof_star_self,
80419
    uint64_t wuffs_version,
80420
    uint32_t options){
80421
  if (!self) {
80422
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
80423
  }
80424
  if (sizeof(*self) != sizeof_star_self) {
80425
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
80426
  }
80427
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
80428
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
80429
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
80430
  }
80431
80432
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
80433
    // The whole point of this if-check is to detect an uninitialized *self.
80434
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
80435
#if !defined(__clang__) && defined(__GNUC__)
80436
#pragma GCC diagnostic push
80437
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
80438
#endif
80439
    if (self->private_impl.magic != 0) {
80440
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
80441
    }
80442
#if !defined(__clang__) && defined(__GNUC__)
80443
#pragma GCC diagnostic pop
80444
#endif
80445
  } else {
80446
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
80447
      memset(self, 0, sizeof(*self));
80448
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
80449
    } else {
80450
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
80451
    }
80452
  }
80453
80454
  self->private_impl.magic = WUFFS_BASE__MAGIC;
80455
  self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name =
80456
      wuffs_base__image_decoder__vtable_name;
80457
  self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers =
80458
      (const void*)(&wuffs_vp8__decoder__func_ptrs_for__wuffs_base__image_decoder);
80459
  return wuffs_base__make_status(NULL);
80460
}
80461
80462
wuffs_vp8__decoder*
80463
wuffs_vp8__decoder__alloc(void) {
80464
  wuffs_vp8__decoder* x =
80465
      (wuffs_vp8__decoder*)(calloc(1, sizeof(wuffs_vp8__decoder)));
80466
  if (!x) {
80467
    return NULL;
80468
  }
80469
  if (wuffs_vp8__decoder__initialize(
80470
      x, sizeof(wuffs_vp8__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
80471
    free(x);
80472
    return NULL;
80473
  }
80474
  return x;
80475
}
80476
80477
size_t
80478
sizeof__wuffs_vp8__decoder(void) {
80479
  return sizeof(wuffs_vp8__decoder);
80480
}
80481
80482
// ---------------- Function Implementations
80483
80484
// -------- func vp8.decoder.get_quirk
80485
80486
WUFFS_BASE__GENERATED_C_CODE
80487
WUFFS_BASE__MAYBE_STATIC uint64_t
80488
wuffs_vp8__decoder__get_quirk(
80489
    const wuffs_vp8__decoder* self,
80490
    uint32_t a_key) {
80491
  if (!self) {
80492
    return 0;
80493
  }
80494
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
80495
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
80496
    return 0;
80497
  }
80498
80499
  return 0u;
80500
}
80501
80502
// -------- func vp8.decoder.set_quirk
80503
80504
WUFFS_BASE__GENERATED_C_CODE
80505
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
80506
wuffs_vp8__decoder__set_quirk(
80507
    wuffs_vp8__decoder* self,
80508
    uint32_t a_key,
80509
    uint64_t a_value) {
80510
  if (!self) {
80511
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
80512
  }
80513
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
80514
    return wuffs_base__make_status(
80515
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
80516
        ? wuffs_base__error__disabled_by_previous_error
80517
        : wuffs_base__error__initialize_not_called);
80518
  }
80519
80520
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
80521
}
80522
80523
// -------- func vp8.decoder.decode_image_config
80524
80525
WUFFS_BASE__GENERATED_C_CODE
80526
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
80527
wuffs_vp8__decoder__decode_image_config(
80528
    wuffs_vp8__decoder* self,
80529
    wuffs_base__image_config* a_dst,
80530
    wuffs_base__io_buffer* a_src) {
80531
  if (!self) {
80532
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
80533
  }
80534
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
80535
    return wuffs_base__make_status(
80536
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
80537
        ? wuffs_base__error__disabled_by_previous_error
80538
        : wuffs_base__error__initialize_not_called);
80539
  }
80540
  if (!a_src) {
80541
    self->private_impl.magic = WUFFS_BASE__DISABLED;
80542
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
80543
  }
80544
  if ((self->private_impl.active_coroutine != 0) &&
80545
      (self->private_impl.active_coroutine != 1)) {
80546
    self->private_impl.magic = WUFFS_BASE__DISABLED;
80547
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
80548
  }
80549
  self->private_impl.active_coroutine = 0;
80550
  wuffs_base__status status = wuffs_base__make_status(NULL);
80551
80552
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
80553
80554
  uint32_t coro_susp_point = self->private_impl.p_decode_image_config;
80555
  switch (coro_susp_point) {
80556
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
80557
80558
    while (true) {
80559
      {
80560
        wuffs_base__status t_0 = wuffs_vp8__decoder__do_decode_image_config(self, a_dst, a_src);
80561
        v_status = t_0;
80562
      }
80563
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
80564
        status = wuffs_base__make_status(wuffs_vp8__error__truncated_input);
80565
        goto exit;
80566
      }
80567
      status = v_status;
80568
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
80569
    }
80570
80571
    ok:
80572
    self->private_impl.p_decode_image_config = 0;
80573
    goto exit;
80574
  }
80575
80576
  goto suspend;
80577
  suspend:
80578
  self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
80579
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
80580
80581
  goto exit;
80582
  exit:
80583
  if (wuffs_base__status__is_error(&status)) {
80584
    self->private_impl.magic = WUFFS_BASE__DISABLED;
80585
  }
80586
  return status;
80587
}
80588
80589
// -------- func vp8.decoder.do_decode_image_config
80590
80591
WUFFS_BASE__GENERATED_C_CODE
80592
static wuffs_base__status
80593
wuffs_vp8__decoder__do_decode_image_config(
80594
    wuffs_vp8__decoder* self,
80595
    wuffs_base__image_config* a_dst,
80596
    wuffs_base__io_buffer* a_src) {
80597
  wuffs_base__status status = wuffs_base__make_status(NULL);
80598
80599
  uint32_t v_c32 = 0;
80600
80601
  const uint8_t* iop_a_src = NULL;
80602
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
80603
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
80604
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
80605
  if (a_src && a_src->data.ptr) {
80606
    io0_a_src = a_src->data.ptr;
80607
    io1_a_src = io0_a_src + a_src->meta.ri;
80608
    iop_a_src = io1_a_src;
80609
    io2_a_src = io0_a_src + a_src->meta.wi;
80610
  }
80611
80612
  uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config;
80613
  switch (coro_susp_point) {
80614
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
80615
80616
    if (self->private_impl.f_call_sequence != 0u) {
80617
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
80618
      goto exit;
80619
    }
80620
    {
80621
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
80622
      uint32_t t_0;
80623
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) {
80624
        t_0 = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src)));
80625
        iop_a_src += 3;
80626
      } else {
80627
        self->private_data.s_do_decode_image_config.scratch = 0;
80628
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
80629
        while (true) {
80630
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
80631
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
80632
            goto suspend;
80633
          }
80634
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
80635
          uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
80636
          *scratch <<= 8;
80637
          *scratch >>= 8;
80638
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
80639
          if (num_bits_0 == 16) {
80640
            t_0 = ((uint32_t)(*scratch));
80641
            break;
80642
          }
80643
          num_bits_0 += 8u;
80644
          *scratch |= ((uint64_t)(num_bits_0)) << 56;
80645
        }
80646
      }
80647
      v_c32 = t_0;
80648
    }
80649
    if ((v_c32 & 1u) != 0u) {
80650
      status = wuffs_base__make_status(wuffs_vp8__error__unsupported_vp8_file);
80651
      goto exit;
80652
    }
80653
    {
80654
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
80655
      uint32_t t_1;
80656
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) {
80657
        t_1 = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src)));
80658
        iop_a_src += 3;
80659
      } else {
80660
        self->private_data.s_do_decode_image_config.scratch = 0;
80661
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
80662
        while (true) {
80663
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
80664
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
80665
            goto suspend;
80666
          }
80667
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
80668
          uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
80669
          *scratch <<= 8;
80670
          *scratch >>= 8;
80671
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
80672
          if (num_bits_1 == 16) {
80673
            t_1 = ((uint32_t)(*scratch));
80674
            break;
80675
          }
80676
          num_bits_1 += 8u;
80677
          *scratch |= ((uint64_t)(num_bits_1)) << 56;
80678
        }
80679
      }
80680
      v_c32 = t_1;
80681
    }
80682
    if (v_c32 != 2752925u) {
80683
      status = wuffs_base__make_status(wuffs_vp8__error__bad_header);
80684
      goto exit;
80685
    }
80686
    {
80687
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
80688
      uint32_t t_2;
80689
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
80690
        t_2 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
80691
        iop_a_src += 4;
80692
      } else {
80693
        self->private_data.s_do_decode_image_config.scratch = 0;
80694
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
80695
        while (true) {
80696
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
80697
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
80698
            goto suspend;
80699
          }
80700
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
80701
          uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56));
80702
          *scratch <<= 8;
80703
          *scratch >>= 8;
80704
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2;
80705
          if (num_bits_2 == 24) {
80706
            t_2 = ((uint32_t)(*scratch));
80707
            break;
80708
          }
80709
          num_bits_2 += 8u;
80710
          *scratch |= ((uint64_t)(num_bits_2)) << 56;
80711
        }
80712
      }
80713
      v_c32 = t_2;
80714
    }
80715
    self->private_impl.f_width = (16383u & (v_c32 >> 0u));
80716
    self->private_impl.f_height = (16383u & (v_c32 >> 16u));
80717
    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)));
80718
    if (a_dst != NULL) {
80719
      wuffs_base__image_config__set(
80720
          a_dst,
80721
          2415954056u,
80722
          0u,
80723
          self->private_impl.f_width,
80724
          self->private_impl.f_height,
80725
          self->private_impl.f_frame_config_io_position,
80726
          false);
80727
    }
80728
    self->private_impl.f_call_sequence = 32u;
80729
80730
    goto ok;
80731
    ok:
80732
    self->private_impl.p_do_decode_image_config = 0;
80733
    goto exit;
80734
  }
80735
80736
  goto suspend;
80737
  suspend:
80738
  self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
80739
80740
  goto exit;
80741
  exit:
80742
  if (a_src && a_src->data.ptr) {
80743
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
80744
  }
80745
80746
  return status;
80747
}
80748
80749
// -------- func vp8.decoder.decode_frame_config
80750
80751
WUFFS_BASE__GENERATED_C_CODE
80752
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
80753
wuffs_vp8__decoder__decode_frame_config(
80754
    wuffs_vp8__decoder* self,
80755
    wuffs_base__frame_config* a_dst,
80756
    wuffs_base__io_buffer* a_src) {
80757
  if (!self) {
80758
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
80759
  }
80760
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
80761
    return wuffs_base__make_status(
80762
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
80763
        ? wuffs_base__error__disabled_by_previous_error
80764
        : wuffs_base__error__initialize_not_called);
80765
  }
80766
  if (!a_src) {
80767
    self->private_impl.magic = WUFFS_BASE__DISABLED;
80768
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
80769
  }
80770
  if ((self->private_impl.active_coroutine != 0) &&
80771
      (self->private_impl.active_coroutine != 2)) {
80772
    self->private_impl.magic = WUFFS_BASE__DISABLED;
80773
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
80774
  }
80775
  self->private_impl.active_coroutine = 0;
80776
  wuffs_base__status status = wuffs_base__make_status(NULL);
80777
80778
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
80779
80780
  uint32_t coro_susp_point = self->private_impl.p_decode_frame_config;
80781
  switch (coro_susp_point) {
80782
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
80783
80784
    while (true) {
80785
      {
80786
        wuffs_base__status t_0 = wuffs_vp8__decoder__do_decode_frame_config(self, a_dst, a_src);
80787
        v_status = t_0;
80788
      }
80789
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
80790
        status = wuffs_base__make_status(wuffs_vp8__error__truncated_input);
80791
        goto exit;
80792
      }
80793
      status = v_status;
80794
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
80795
    }
80796
80797
    ok:
80798
    self->private_impl.p_decode_frame_config = 0;
80799
    goto exit;
80800
  }
80801
80802
  goto suspend;
80803
  suspend:
80804
  self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
80805
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0;
80806
80807
  goto exit;
80808
  exit:
80809
  if (wuffs_base__status__is_error(&status)) {
80810
    self->private_impl.magic = WUFFS_BASE__DISABLED;
80811
  }
80812
  return status;
80813
}
80814
80815
// -------- func vp8.decoder.do_decode_frame_config
80816
80817
WUFFS_BASE__GENERATED_C_CODE
80818
static wuffs_base__status
80819
wuffs_vp8__decoder__do_decode_frame_config(
80820
    wuffs_vp8__decoder* self,
80821
    wuffs_base__frame_config* a_dst,
80822
    wuffs_base__io_buffer* a_src) {
80823
  wuffs_base__status status = wuffs_base__make_status(NULL);
80824
80825
  const uint8_t* iop_a_src = NULL;
80826
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
80827
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
80828
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
80829
  if (a_src && a_src->data.ptr) {
80830
    io0_a_src = a_src->data.ptr;
80831
    io1_a_src = io0_a_src + a_src->meta.ri;
80832
    iop_a_src = io1_a_src;
80833
    io2_a_src = io0_a_src + a_src->meta.wi;
80834
  }
80835
80836
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config;
80837
  switch (coro_susp_point) {
80838
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
80839
80840
    if (self->private_impl.f_call_sequence == 32u) {
80841
    } else if (self->private_impl.f_call_sequence < 32u) {
80842
      if (a_src) {
80843
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
80844
      }
80845
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
80846
      status = wuffs_vp8__decoder__do_decode_image_config(self, NULL, a_src);
80847
      if (a_src) {
80848
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
80849
      }
80850
      if (status.repr) {
80851
        goto suspend;
80852
      }
80853
    } else if (self->private_impl.f_call_sequence == 40u) {
80854
      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)))) {
80855
        status = wuffs_base__make_status(wuffs_base__error__bad_restart);
80856
        goto exit;
80857
      }
80858
    } else if (self->private_impl.f_call_sequence == 64u) {
80859
      self->private_impl.f_call_sequence = 96u;
80860
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
80861
      goto ok;
80862
    } else {
80863
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
80864
      goto ok;
80865
    }
80866
    if (a_dst != NULL) {
80867
      wuffs_base__frame_config__set(
80868
          a_dst,
80869
          wuffs_base__utility__make_rect_ie_u32(
80870
          0u,
80871
          0u,
80872
          self->private_impl.f_width,
80873
          self->private_impl.f_height),
80874
          ((wuffs_base__flicks)(0u)),
80875
          0u,
80876
          self->private_impl.f_frame_config_io_position,
80877
          0u,
80878
          false,
80879
          false,
80880
          4278190080u);
80881
    }
80882
    self->private_impl.f_call_sequence = 64u;
80883
80884
    ok:
80885
    self->private_impl.p_do_decode_frame_config = 0;
80886
    goto exit;
80887
  }
80888
80889
  goto suspend;
80890
  suspend:
80891
  self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
80892
80893
  goto exit;
80894
  exit:
80895
  if (a_src && a_src->data.ptr) {
80896
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
80897
  }
80898
80899
  return status;
80900
}
80901
80902
// -------- func vp8.decoder.decode_frame
80903
80904
WUFFS_BASE__GENERATED_C_CODE
80905
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
80906
wuffs_vp8__decoder__decode_frame(
80907
    wuffs_vp8__decoder* self,
80908
    wuffs_base__pixel_buffer* a_dst,
80909
    wuffs_base__io_buffer* a_src,
80910
    wuffs_base__pixel_blend a_blend,
80911
    wuffs_base__slice_u8 a_workbuf,
80912
    wuffs_base__decode_frame_options* a_opts) {
80913
  if (!self) {
80914
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
80915
  }
80916
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
80917
    return wuffs_base__make_status(
80918
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
80919
        ? wuffs_base__error__disabled_by_previous_error
80920
        : wuffs_base__error__initialize_not_called);
80921
  }
80922
  if (!a_dst || !a_src) {
80923
    self->private_impl.magic = WUFFS_BASE__DISABLED;
80924
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
80925
  }
80926
  if ((self->private_impl.active_coroutine != 0) &&
80927
      (self->private_impl.active_coroutine != 3)) {
80928
    self->private_impl.magic = WUFFS_BASE__DISABLED;
80929
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
80930
  }
80931
  self->private_impl.active_coroutine = 0;
80932
  wuffs_base__status status = wuffs_base__make_status(NULL);
80933
80934
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
80935
80936
  uint32_t coro_susp_point = self->private_impl.p_decode_frame;
80937
  switch (coro_susp_point) {
80938
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
80939
80940
    while (true) {
80941
      {
80942
        wuffs_base__status t_0 = wuffs_vp8__decoder__do_decode_frame(self,
80943
            a_dst,
80944
            a_src,
80945
            a_blend,
80946
            a_workbuf,
80947
            a_opts);
80948
        v_status = t_0;
80949
      }
80950
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
80951
        status = wuffs_base__make_status(wuffs_vp8__error__truncated_input);
80952
        goto exit;
80953
      }
80954
      status = v_status;
80955
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
80956
    }
80957
80958
    ok:
80959
    self->private_impl.p_decode_frame = 0;
80960
    goto exit;
80961
  }
80962
80963
  goto suspend;
80964
  suspend:
80965
  self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
80966
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0;
80967
80968
  goto exit;
80969
  exit:
80970
  if (wuffs_base__status__is_error(&status)) {
80971
    self->private_impl.magic = WUFFS_BASE__DISABLED;
80972
  }
80973
  return status;
80974
}
80975
80976
// -------- func vp8.decoder.do_decode_frame
80977
80978
WUFFS_BASE__GENERATED_C_CODE
80979
static wuffs_base__status
80980
wuffs_vp8__decoder__do_decode_frame(
80981
    wuffs_vp8__decoder* self,
80982
    wuffs_base__pixel_buffer* a_dst,
80983
    wuffs_base__io_buffer* a_src,
80984
    wuffs_base__pixel_blend a_blend,
80985
    wuffs_base__slice_u8 a_workbuf,
80986
    wuffs_base__decode_frame_options* a_opts) {
80987
  wuffs_base__status status = wuffs_base__make_status(NULL);
80988
80989
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
80990
80991
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame;
80992
  switch (coro_susp_point) {
80993
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
80994
80995
    if (self->private_impl.f_call_sequence == 64u) {
80996
    } else if (self->private_impl.f_call_sequence < 64u) {
80997
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
80998
      status = wuffs_vp8__decoder__do_decode_frame_config(self, NULL, a_src);
80999
      if (status.repr) {
81000
        goto suspend;
81001
      }
81002
    } else {
81003
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
81004
      goto ok;
81005
    }
81006
    self->private_impl.f_dst_x = 0u;
81007
    self->private_impl.f_dst_y = 0u;
81008
    v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler,
81009
        wuffs_base__pixel_buffer__pixel_format(a_dst),
81010
        wuffs_base__pixel_buffer__palette(a_dst),
81011
        wuffs_base__utility__make_pixel_format(2415954056u),
81012
        wuffs_base__utility__empty_slice_u8(),
81013
        a_blend);
81014
    if ( ! wuffs_base__status__is_ok(&v_status)) {
81015
      status = v_status;
81016
      if (wuffs_base__status__is_error(&status)) {
81017
        goto exit;
81018
      } else if (wuffs_base__status__is_suspension(&status)) {
81019
        status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
81020
        goto exit;
81021
      }
81022
      goto ok;
81023
    }
81024
    v_status = wuffs_vp8__decoder__make_a_placeholder_gradient(self, a_dst);
81025
    if ( ! wuffs_base__status__is_ok(&v_status)) {
81026
      status = v_status;
81027
      if (wuffs_base__status__is_error(&status)) {
81028
        goto exit;
81029
      } else if (wuffs_base__status__is_suspension(&status)) {
81030
        status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
81031
        goto exit;
81032
      }
81033
      goto ok;
81034
    }
81035
    self->private_impl.f_call_sequence = 96u;
81036
81037
    ok:
81038
    self->private_impl.p_do_decode_frame = 0;
81039
    goto exit;
81040
  }
81041
81042
  goto suspend;
81043
  suspend:
81044
  self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
81045
81046
  goto exit;
81047
  exit:
81048
  return status;
81049
}
81050
81051
// -------- func vp8.decoder.make_a_placeholder_gradient
81052
81053
WUFFS_BASE__GENERATED_C_CODE
81054
static wuffs_base__status
81055
wuffs_vp8__decoder__make_a_placeholder_gradient(
81056
    wuffs_vp8__decoder* self,
81057
    wuffs_base__pixel_buffer* a_dst) {
81058
  wuffs_base__pixel_format v_dst_pixfmt = {0};
81059
  uint32_t v_dst_bits_per_pixel = 0;
81060
  uint32_t v_dst_bytes_per_pixel = 0;
81061
  uint64_t v_dst_bytes_per_row = 0;
81062
  wuffs_base__table_u8 v_tab = {0};
81063
  wuffs_base__slice_u8 v_dst = {0};
81064
  uint64_t v_i = 0;
81065
  uint8_t v_bgrx[4] = {0};
81066
81067
  v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
81068
  v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
81069
  if ((v_dst_bits_per_pixel & 7u) != 0u) {
81070
    return wuffs_base__make_status(wuffs_base__error__unsupported_option);
81071
  }
81072
  v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u);
81073
  v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel)));
81074
  v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
81075
  v_bgrx[0u] = 128u;
81076
  while (self->private_impl.f_dst_y < self->private_impl.f_height) {
81077
    v_bgrx[1u] = ((uint8_t)(self->private_impl.f_dst_y));
81078
    self->private_impl.f_dst_x = 0u;
81079
    while (self->private_impl.f_dst_x < self->private_impl.f_width) {
81080
      v_bgrx[2u] = ((uint8_t)(self->private_impl.f_dst_x));
81081
      v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y);
81082
      if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) {
81083
        v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row);
81084
      }
81085
      v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel)));
81086
      if (v_i < ((uint64_t)(v_dst.len))) {
81087
        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));
81088
      }
81089
      self->private_impl.f_dst_x += 1u;
81090
    }
81091
    self->private_impl.f_dst_y += 1u;
81092
  }
81093
  return wuffs_base__make_status(NULL);
81094
}
81095
81096
// -------- func vp8.decoder.frame_dirty_rect
81097
81098
WUFFS_BASE__GENERATED_C_CODE
81099
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
81100
wuffs_vp8__decoder__frame_dirty_rect(
81101
    const wuffs_vp8__decoder* self) {
81102
  if (!self) {
81103
    return wuffs_base__utility__empty_rect_ie_u32();
81104
  }
81105
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
81106
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
81107
    return wuffs_base__utility__empty_rect_ie_u32();
81108
  }
81109
81110
  return wuffs_base__utility__make_rect_ie_u32(
81111
      0u,
81112
      0u,
81113
      self->private_impl.f_width,
81114
      self->private_impl.f_height);
81115
}
81116
81117
// -------- func vp8.decoder.num_animation_loops
81118
81119
WUFFS_BASE__GENERATED_C_CODE
81120
WUFFS_BASE__MAYBE_STATIC uint32_t
81121
wuffs_vp8__decoder__num_animation_loops(
81122
    const wuffs_vp8__decoder* self) {
81123
  if (!self) {
81124
    return 0;
81125
  }
81126
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
81127
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
81128
    return 0;
81129
  }
81130
81131
  return 0u;
81132
}
81133
81134
// -------- func vp8.decoder.num_decoded_frame_configs
81135
81136
WUFFS_BASE__GENERATED_C_CODE
81137
WUFFS_BASE__MAYBE_STATIC uint64_t
81138
wuffs_vp8__decoder__num_decoded_frame_configs(
81139
    const wuffs_vp8__decoder* self) {
81140
  if (!self) {
81141
    return 0;
81142
  }
81143
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
81144
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
81145
    return 0;
81146
  }
81147
81148
  if (self->private_impl.f_call_sequence > 32u) {
81149
    return 1u;
81150
  }
81151
  return 0u;
81152
}
81153
81154
// -------- func vp8.decoder.num_decoded_frames
81155
81156
WUFFS_BASE__GENERATED_C_CODE
81157
WUFFS_BASE__MAYBE_STATIC uint64_t
81158
wuffs_vp8__decoder__num_decoded_frames(
81159
    const wuffs_vp8__decoder* self) {
81160
  if (!self) {
81161
    return 0;
81162
  }
81163
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
81164
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
81165
    return 0;
81166
  }
81167
81168
  if (self->private_impl.f_call_sequence > 64u) {
81169
    return 1u;
81170
  }
81171
  return 0u;
81172
}
81173
81174
// -------- func vp8.decoder.restart_frame
81175
81176
WUFFS_BASE__GENERATED_C_CODE
81177
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
81178
wuffs_vp8__decoder__restart_frame(
81179
    wuffs_vp8__decoder* self,
81180
    uint64_t a_index,
81181
    uint64_t a_io_position) {
81182
  if (!self) {
81183
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
81184
  }
81185
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
81186
    return wuffs_base__make_status(
81187
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
81188
        ? wuffs_base__error__disabled_by_previous_error
81189
        : wuffs_base__error__initialize_not_called);
81190
  }
81191
81192
  if (self->private_impl.f_call_sequence < 32u) {
81193
    return wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
81194
  }
81195
  if ((a_index != 0u) || (a_io_position != self->private_impl.f_frame_config_io_position)) {
81196
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
81197
  }
81198
  self->private_impl.f_call_sequence = 40u;
81199
  return wuffs_base__make_status(NULL);
81200
}
81201
81202
// -------- func vp8.decoder.set_report_metadata
81203
81204
WUFFS_BASE__GENERATED_C_CODE
81205
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
81206
wuffs_vp8__decoder__set_report_metadata(
81207
    wuffs_vp8__decoder* self,
81208
    uint32_t a_fourcc,
81209
    bool a_report) {
81210
  return wuffs_base__make_empty_struct();
81211
}
81212
81213
// -------- func vp8.decoder.tell_me_more
81214
81215
WUFFS_BASE__GENERATED_C_CODE
81216
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
81217
wuffs_vp8__decoder__tell_me_more(
81218
    wuffs_vp8__decoder* self,
81219
    wuffs_base__io_buffer* a_dst,
81220
    wuffs_base__more_information* a_minfo,
81221
    wuffs_base__io_buffer* a_src) {
81222
  if (!self) {
81223
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
81224
  }
81225
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
81226
    return wuffs_base__make_status(
81227
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
81228
        ? wuffs_base__error__disabled_by_previous_error
81229
        : wuffs_base__error__initialize_not_called);
81230
  }
81231
  if (!a_dst || !a_src) {
81232
    self->private_impl.magic = WUFFS_BASE__DISABLED;
81233
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
81234
  }
81235
  if ((self->private_impl.active_coroutine != 0) &&
81236
      (self->private_impl.active_coroutine != 4)) {
81237
    self->private_impl.magic = WUFFS_BASE__DISABLED;
81238
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
81239
  }
81240
  self->private_impl.active_coroutine = 0;
81241
  wuffs_base__status status = wuffs_base__make_status(NULL);
81242
81243
  status = wuffs_base__make_status(wuffs_base__error__no_more_information);
81244
  goto exit;
81245
81246
  goto ok;
81247
  ok:
81248
  goto exit;
81249
  exit:
81250
  if (wuffs_base__status__is_error(&status)) {
81251
    self->private_impl.magic = WUFFS_BASE__DISABLED;
81252
  }
81253
  return status;
81254
}
81255
81256
// -------- func vp8.decoder.workbuf_len
81257
81258
WUFFS_BASE__GENERATED_C_CODE
81259
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
81260
wuffs_vp8__decoder__workbuf_len(
81261
    const wuffs_vp8__decoder* self) {
81262
  if (!self) {
81263
    return wuffs_base__utility__empty_range_ii_u64();
81264
  }
81265
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
81266
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
81267
    return wuffs_base__utility__empty_range_ii_u64();
81268
  }
81269
81270
  return wuffs_base__utility__make_range_ii_u64(0u, 0u);
81271
}
81272
81273
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__VP8)
81274
81275
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WBMP)
81276
81277
// ---------------- Status Codes Implementations
81278
81279
const char wuffs_wbmp__error__bad_header[] = "#wbmp: bad header";
81280
const char wuffs_wbmp__error__truncated_input[] = "#wbmp: truncated input";
81281
81282
// ---------------- Private Consts
81283
81284
// ---------------- Private Initializer Prototypes
81285
81286
// ---------------- Private Function Prototypes
81287
81288
WUFFS_BASE__GENERATED_C_CODE
81289
static wuffs_base__status
81290
wuffs_wbmp__decoder__do_decode_image_config(
81291
    wuffs_wbmp__decoder* self,
81292
    wuffs_base__image_config* a_dst,
81293
    wuffs_base__io_buffer* a_src);
81294
81295
WUFFS_BASE__GENERATED_C_CODE
81296
static wuffs_base__status
81297
wuffs_wbmp__decoder__do_decode_frame_config(
81298
    wuffs_wbmp__decoder* self,
81299
    wuffs_base__frame_config* a_dst,
81300
    wuffs_base__io_buffer* a_src);
81301
81302
WUFFS_BASE__GENERATED_C_CODE
81303
static wuffs_base__status
81304
wuffs_wbmp__decoder__do_decode_frame(
81305
    wuffs_wbmp__decoder* self,
81306
    wuffs_base__pixel_buffer* a_dst,
81307
    wuffs_base__io_buffer* a_src,
81308
    wuffs_base__pixel_blend a_blend,
81309
    wuffs_base__slice_u8 a_workbuf,
81310
    wuffs_base__decode_frame_options* a_opts);
81311
81312
// ---------------- VTables
81313
81314
const wuffs_base__image_decoder__func_ptrs
81315
wuffs_wbmp__decoder__func_ptrs_for__wuffs_base__image_decoder = {
81316
  (wuffs_base__status(*)(void*,
81317
      wuffs_base__pixel_buffer*,
81318
      wuffs_base__io_buffer*,
81319
      wuffs_base__pixel_blend,
81320
      wuffs_base__slice_u8,
81321
      wuffs_base__decode_frame_options*))(&wuffs_wbmp__decoder__decode_frame),
81322
  (wuffs_base__status(*)(void*,
81323
      wuffs_base__frame_config*,
81324
      wuffs_base__io_buffer*))(&wuffs_wbmp__decoder__decode_frame_config),
81325
  (wuffs_base__status(*)(void*,
81326
      wuffs_base__image_config*,
81327
      wuffs_base__io_buffer*))(&wuffs_wbmp__decoder__decode_image_config),
81328
  (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_wbmp__decoder__frame_dirty_rect),
81329
  (uint64_t(*)(const void*,
81330
      uint32_t))(&wuffs_wbmp__decoder__get_quirk),
81331
  (uint32_t(*)(const void*))(&wuffs_wbmp__decoder__num_animation_loops),
81332
  (uint64_t(*)(const void*))(&wuffs_wbmp__decoder__num_decoded_frame_configs),
81333
  (uint64_t(*)(const void*))(&wuffs_wbmp__decoder__num_decoded_frames),
81334
  (wuffs_base__status(*)(void*,
81335
      uint64_t,
81336
      uint64_t))(&wuffs_wbmp__decoder__restart_frame),
81337
  (wuffs_base__status(*)(void*,
81338
      uint32_t,
81339
      uint64_t))(&wuffs_wbmp__decoder__set_quirk),
81340
  (wuffs_base__empty_struct(*)(void*,
81341
      uint32_t,
81342
      bool))(&wuffs_wbmp__decoder__set_report_metadata),
81343
  (wuffs_base__status(*)(void*,
81344
      wuffs_base__io_buffer*,
81345
      wuffs_base__more_information*,
81346
      wuffs_base__io_buffer*))(&wuffs_wbmp__decoder__tell_me_more),
81347
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_wbmp__decoder__workbuf_len),
81348
};
81349
81350
// ---------------- Initializer Implementations
81351
81352
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
81353
wuffs_wbmp__decoder__initialize(
81354
    wuffs_wbmp__decoder* self,
81355
    size_t sizeof_star_self,
81356
    uint64_t wuffs_version,
81357
    uint32_t options){
81358
  if (!self) {
81359
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
81360
  }
81361
  if (sizeof(*self) != sizeof_star_self) {
81362
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
81363
  }
81364
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
81365
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
81366
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
81367
  }
81368
81369
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
81370
    // The whole point of this if-check is to detect an uninitialized *self.
81371
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
81372
#if !defined(__clang__) && defined(__GNUC__)
81373
#pragma GCC diagnostic push
81374
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
81375
#endif
81376
    if (self->private_impl.magic != 0) {
81377
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
81378
    }
81379
#if !defined(__clang__) && defined(__GNUC__)
81380
#pragma GCC diagnostic pop
81381
#endif
81382
  } else {
81383
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
81384
      memset(self, 0, sizeof(*self));
81385
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
81386
    } else {
81387
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
81388
    }
81389
  }
81390
81391
  self->private_impl.magic = WUFFS_BASE__MAGIC;
81392
  self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name =
81393
      wuffs_base__image_decoder__vtable_name;
81394
  self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers =
81395
      (const void*)(&wuffs_wbmp__decoder__func_ptrs_for__wuffs_base__image_decoder);
81396
  return wuffs_base__make_status(NULL);
81397
}
81398
81399
wuffs_wbmp__decoder*
81400
wuffs_wbmp__decoder__alloc(void) {
81401
  wuffs_wbmp__decoder* x =
81402
      (wuffs_wbmp__decoder*)(calloc(1, sizeof(wuffs_wbmp__decoder)));
81403
  if (!x) {
81404
    return NULL;
81405
  }
81406
  if (wuffs_wbmp__decoder__initialize(
81407
      x, sizeof(wuffs_wbmp__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
81408
    free(x);
81409
    return NULL;
81410
  }
81411
  return x;
81412
}
81413
81414
size_t
81415
sizeof__wuffs_wbmp__decoder(void) {
81416
  return sizeof(wuffs_wbmp__decoder);
81417
}
81418
81419
// ---------------- Function Implementations
81420
81421
// -------- func wbmp.decoder.get_quirk
81422
81423
WUFFS_BASE__GENERATED_C_CODE
81424
WUFFS_BASE__MAYBE_STATIC uint64_t
81425
wuffs_wbmp__decoder__get_quirk(
81426
    const wuffs_wbmp__decoder* self,
81427
    uint32_t a_key) {
81428
  if (!self) {
81429
    return 0;
81430
  }
81431
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
81432
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
81433
    return 0;
81434
  }
81435
81436
  return 0u;
81437
}
81438
81439
// -------- func wbmp.decoder.set_quirk
81440
81441
WUFFS_BASE__GENERATED_C_CODE
81442
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
81443
wuffs_wbmp__decoder__set_quirk(
81444
    wuffs_wbmp__decoder* self,
81445
    uint32_t a_key,
81446
    uint64_t a_value) {
81447
  if (!self) {
81448
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
81449
  }
81450
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
81451
    return wuffs_base__make_status(
81452
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
81453
        ? wuffs_base__error__disabled_by_previous_error
81454
        : wuffs_base__error__initialize_not_called);
81455
  }
81456
81457
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
81458
}
81459
81460
// -------- func wbmp.decoder.decode_image_config
81461
81462
WUFFS_BASE__GENERATED_C_CODE
81463
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
81464
wuffs_wbmp__decoder__decode_image_config(
81465
    wuffs_wbmp__decoder* self,
81466
    wuffs_base__image_config* a_dst,
81467
    wuffs_base__io_buffer* a_src) {
81468
  if (!self) {
81469
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
81470
  }
81471
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
81472
    return wuffs_base__make_status(
81473
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
81474
        ? wuffs_base__error__disabled_by_previous_error
81475
        : wuffs_base__error__initialize_not_called);
81476
  }
81477
  if (!a_src) {
81478
    self->private_impl.magic = WUFFS_BASE__DISABLED;
81479
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
81480
  }
81481
  if ((self->private_impl.active_coroutine != 0) &&
81482
      (self->private_impl.active_coroutine != 1)) {
81483
    self->private_impl.magic = WUFFS_BASE__DISABLED;
81484
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
81485
  }
81486
  self->private_impl.active_coroutine = 0;
81487
  wuffs_base__status status = wuffs_base__make_status(NULL);
81488
81489
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
81490
81491
  uint32_t coro_susp_point = self->private_impl.p_decode_image_config;
81492
  switch (coro_susp_point) {
81493
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
81494
81495
    while (true) {
81496
      {
81497
        wuffs_base__status t_0 = wuffs_wbmp__decoder__do_decode_image_config(self, a_dst, a_src);
81498
        v_status = t_0;
81499
      }
81500
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
81501
        status = wuffs_base__make_status(wuffs_wbmp__error__truncated_input);
81502
        goto exit;
81503
      }
81504
      status = v_status;
81505
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
81506
    }
81507
81508
    ok:
81509
    self->private_impl.p_decode_image_config = 0;
81510
    goto exit;
81511
  }
81512
81513
  goto suspend;
81514
  suspend:
81515
  self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
81516
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
81517
81518
  goto exit;
81519
  exit:
81520
  if (wuffs_base__status__is_error(&status)) {
81521
    self->private_impl.magic = WUFFS_BASE__DISABLED;
81522
  }
81523
  return status;
81524
}
81525
81526
// -------- func wbmp.decoder.do_decode_image_config
81527
81528
WUFFS_BASE__GENERATED_C_CODE
81529
static wuffs_base__status
81530
wuffs_wbmp__decoder__do_decode_image_config(
81531
    wuffs_wbmp__decoder* self,
81532
    wuffs_base__image_config* a_dst,
81533
    wuffs_base__io_buffer* a_src) {
81534
  wuffs_base__status status = wuffs_base__make_status(NULL);
81535
81536
  uint8_t v_c8 = 0;
81537
  uint32_t v_i = 0;
81538
  uint32_t v_p = 0;
81539
81540
  const uint8_t* iop_a_src = NULL;
81541
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
81542
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
81543
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
81544
  if (a_src && a_src->data.ptr) {
81545
    io0_a_src = a_src->data.ptr;
81546
    io1_a_src = io0_a_src + a_src->meta.ri;
81547
    iop_a_src = io1_a_src;
81548
    io2_a_src = io0_a_src + a_src->meta.wi;
81549
  }
81550
81551
  uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config;
81552
  if (coro_susp_point) {
81553
    v_i = self->private_data.s_do_decode_image_config.v_i;
81554
    v_p = self->private_data.s_do_decode_image_config.v_p;
81555
  }
81556
  switch (coro_susp_point) {
81557
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
81558
81559
    if (self->private_impl.f_call_sequence != 0u) {
81560
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
81561
      goto exit;
81562
    }
81563
    v_i = 0u;
81564
    while (v_i < 2u) {
81565
      {
81566
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
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_0 = *iop_a_src++;
81572
        v_c8 = t_0;
81573
      }
81574
      if (v_c8 != 0u) {
81575
        status = wuffs_base__make_status(wuffs_wbmp__error__bad_header);
81576
        goto exit;
81577
      }
81578
      v_i += 1u;
81579
    }
81580
    v_i = 0u;
81581
    while (v_i < 2u) {
81582
      v_p = 0u;
81583
      while (true) {
81584
        {
81585
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
81586
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
81587
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
81588
            goto suspend;
81589
          }
81590
          uint8_t t_1 = *iop_a_src++;
81591
          v_c8 = t_1;
81592
        }
81593
        v_p |= ((uint32_t)(((uint8_t)(v_c8 & 127u))));
81594
        if (((uint8_t)(v_c8 >> 7u)) == 0u) {
81595
          break;
81596
        } else if (v_p > 131071u) {
81597
          status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension);
81598
          goto exit;
81599
        }
81600
        v_p <<= 7u;
81601
      }
81602
      if (v_i == 0u) {
81603
        self->private_impl.f_width = v_p;
81604
      } else {
81605
        self->private_impl.f_height = v_p;
81606
      }
81607
      v_i += 1u;
81608
    }
81609
    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)));
81610
    if (a_dst != NULL) {
81611
      wuffs_base__image_config__set(
81612
          a_dst,
81613
          2198077448u,
81614
          0u,
81615
          self->private_impl.f_width,
81616
          self->private_impl.f_height,
81617
          self->private_impl.f_frame_config_io_position,
81618
          true);
81619
    }
81620
    self->private_impl.f_call_sequence = 32u;
81621
81622
    goto ok;
81623
    ok:
81624
    self->private_impl.p_do_decode_image_config = 0;
81625
    goto exit;
81626
  }
81627
81628
  goto suspend;
81629
  suspend:
81630
  self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
81631
  self->private_data.s_do_decode_image_config.v_i = v_i;
81632
  self->private_data.s_do_decode_image_config.v_p = v_p;
81633
81634
  goto exit;
81635
  exit:
81636
  if (a_src && a_src->data.ptr) {
81637
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
81638
  }
81639
81640
  return status;
81641
}
81642
81643
// -------- func wbmp.decoder.decode_frame_config
81644
81645
WUFFS_BASE__GENERATED_C_CODE
81646
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
81647
wuffs_wbmp__decoder__decode_frame_config(
81648
    wuffs_wbmp__decoder* self,
81649
    wuffs_base__frame_config* a_dst,
81650
    wuffs_base__io_buffer* a_src) {
81651
  if (!self) {
81652
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
81653
  }
81654
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
81655
    return wuffs_base__make_status(
81656
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
81657
        ? wuffs_base__error__disabled_by_previous_error
81658
        : wuffs_base__error__initialize_not_called);
81659
  }
81660
  if (!a_src) {
81661
    self->private_impl.magic = WUFFS_BASE__DISABLED;
81662
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
81663
  }
81664
  if ((self->private_impl.active_coroutine != 0) &&
81665
      (self->private_impl.active_coroutine != 2)) {
81666
    self->private_impl.magic = WUFFS_BASE__DISABLED;
81667
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
81668
  }
81669
  self->private_impl.active_coroutine = 0;
81670
  wuffs_base__status status = wuffs_base__make_status(NULL);
81671
81672
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
81673
81674
  uint32_t coro_susp_point = self->private_impl.p_decode_frame_config;
81675
  switch (coro_susp_point) {
81676
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
81677
81678
    while (true) {
81679
      {
81680
        wuffs_base__status t_0 = wuffs_wbmp__decoder__do_decode_frame_config(self, a_dst, a_src);
81681
        v_status = t_0;
81682
      }
81683
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
81684
        status = wuffs_base__make_status(wuffs_wbmp__error__truncated_input);
81685
        goto exit;
81686
      }
81687
      status = v_status;
81688
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
81689
    }
81690
81691
    ok:
81692
    self->private_impl.p_decode_frame_config = 0;
81693
    goto exit;
81694
  }
81695
81696
  goto suspend;
81697
  suspend:
81698
  self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
81699
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0;
81700
81701
  goto exit;
81702
  exit:
81703
  if (wuffs_base__status__is_error(&status)) {
81704
    self->private_impl.magic = WUFFS_BASE__DISABLED;
81705
  }
81706
  return status;
81707
}
81708
81709
// -------- func wbmp.decoder.do_decode_frame_config
81710
81711
WUFFS_BASE__GENERATED_C_CODE
81712
static wuffs_base__status
81713
wuffs_wbmp__decoder__do_decode_frame_config(
81714
    wuffs_wbmp__decoder* self,
81715
    wuffs_base__frame_config* a_dst,
81716
    wuffs_base__io_buffer* a_src) {
81717
  wuffs_base__status status = wuffs_base__make_status(NULL);
81718
81719
  const uint8_t* iop_a_src = NULL;
81720
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
81721
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
81722
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
81723
  if (a_src && a_src->data.ptr) {
81724
    io0_a_src = a_src->data.ptr;
81725
    io1_a_src = io0_a_src + a_src->meta.ri;
81726
    iop_a_src = io1_a_src;
81727
    io2_a_src = io0_a_src + a_src->meta.wi;
81728
  }
81729
81730
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config;
81731
  switch (coro_susp_point) {
81732
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
81733
81734
    if (self->private_impl.f_call_sequence == 32u) {
81735
    } else if (self->private_impl.f_call_sequence < 32u) {
81736
      if (a_src) {
81737
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
81738
      }
81739
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
81740
      status = wuffs_wbmp__decoder__do_decode_image_config(self, NULL, a_src);
81741
      if (a_src) {
81742
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
81743
      }
81744
      if (status.repr) {
81745
        goto suspend;
81746
      }
81747
    } else if (self->private_impl.f_call_sequence == 40u) {
81748
      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)))) {
81749
        status = wuffs_base__make_status(wuffs_base__error__bad_restart);
81750
        goto exit;
81751
      }
81752
    } else if (self->private_impl.f_call_sequence == 64u) {
81753
      self->private_impl.f_call_sequence = 96u;
81754
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
81755
      goto ok;
81756
    } else {
81757
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
81758
      goto ok;
81759
    }
81760
    if (a_dst != NULL) {
81761
      wuffs_base__frame_config__set(
81762
          a_dst,
81763
          wuffs_base__utility__make_rect_ie_u32(
81764
          0u,
81765
          0u,
81766
          self->private_impl.f_width,
81767
          self->private_impl.f_height),
81768
          ((wuffs_base__flicks)(0u)),
81769
          0u,
81770
          self->private_impl.f_frame_config_io_position,
81771
          0u,
81772
          true,
81773
          false,
81774
          4278190080u);
81775
    }
81776
    self->private_impl.f_call_sequence = 64u;
81777
81778
    ok:
81779
    self->private_impl.p_do_decode_frame_config = 0;
81780
    goto exit;
81781
  }
81782
81783
  goto suspend;
81784
  suspend:
81785
  self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
81786
81787
  goto exit;
81788
  exit:
81789
  if (a_src && a_src->data.ptr) {
81790
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
81791
  }
81792
81793
  return status;
81794
}
81795
81796
// -------- func wbmp.decoder.decode_frame
81797
81798
WUFFS_BASE__GENERATED_C_CODE
81799
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
81800
wuffs_wbmp__decoder__decode_frame(
81801
    wuffs_wbmp__decoder* self,
81802
    wuffs_base__pixel_buffer* a_dst,
81803
    wuffs_base__io_buffer* a_src,
81804
    wuffs_base__pixel_blend a_blend,
81805
    wuffs_base__slice_u8 a_workbuf,
81806
    wuffs_base__decode_frame_options* a_opts) {
81807
  if (!self) {
81808
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
81809
  }
81810
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
81811
    return wuffs_base__make_status(
81812
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
81813
        ? wuffs_base__error__disabled_by_previous_error
81814
        : wuffs_base__error__initialize_not_called);
81815
  }
81816
  if (!a_dst || !a_src) {
81817
    self->private_impl.magic = WUFFS_BASE__DISABLED;
81818
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
81819
  }
81820
  if ((self->private_impl.active_coroutine != 0) &&
81821
      (self->private_impl.active_coroutine != 3)) {
81822
    self->private_impl.magic = WUFFS_BASE__DISABLED;
81823
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
81824
  }
81825
  self->private_impl.active_coroutine = 0;
81826
  wuffs_base__status status = wuffs_base__make_status(NULL);
81827
81828
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
81829
81830
  uint32_t coro_susp_point = self->private_impl.p_decode_frame;
81831
  switch (coro_susp_point) {
81832
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
81833
81834
    while (true) {
81835
      {
81836
        wuffs_base__status t_0 = wuffs_wbmp__decoder__do_decode_frame(self,
81837
            a_dst,
81838
            a_src,
81839
            a_blend,
81840
            a_workbuf,
81841
            a_opts);
81842
        v_status = t_0;
81843
      }
81844
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
81845
        status = wuffs_base__make_status(wuffs_wbmp__error__truncated_input);
81846
        goto exit;
81847
      }
81848
      status = v_status;
81849
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
81850
    }
81851
81852
    ok:
81853
    self->private_impl.p_decode_frame = 0;
81854
    goto exit;
81855
  }
81856
81857
  goto suspend;
81858
  suspend:
81859
  self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
81860
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0;
81861
81862
  goto exit;
81863
  exit:
81864
  if (wuffs_base__status__is_error(&status)) {
81865
    self->private_impl.magic = WUFFS_BASE__DISABLED;
81866
  }
81867
  return status;
81868
}
81869
81870
// -------- func wbmp.decoder.do_decode_frame
81871
81872
WUFFS_BASE__GENERATED_C_CODE
81873
static wuffs_base__status
81874
wuffs_wbmp__decoder__do_decode_frame(
81875
    wuffs_wbmp__decoder* self,
81876
    wuffs_base__pixel_buffer* a_dst,
81877
    wuffs_base__io_buffer* a_src,
81878
    wuffs_base__pixel_blend a_blend,
81879
    wuffs_base__slice_u8 a_workbuf,
81880
    wuffs_base__decode_frame_options* a_opts) {
81881
  wuffs_base__status status = wuffs_base__make_status(NULL);
81882
81883
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
81884
  wuffs_base__pixel_format v_dst_pixfmt = {0};
81885
  uint32_t v_dst_bits_per_pixel = 0;
81886
  uint64_t v_dst_bytes_per_pixel = 0;
81887
  uint64_t v_dst_x_in_bytes = 0;
81888
  uint32_t v_dst_x = 0;
81889
  uint32_t v_dst_y = 0;
81890
  wuffs_base__table_u8 v_tab = {0};
81891
  wuffs_base__slice_u8 v_dst = {0};
81892
  uint8_t v_src[1] = {0};
81893
  uint8_t v_c8 = 0;
81894
81895
  const uint8_t* iop_a_src = NULL;
81896
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
81897
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
81898
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
81899
  if (a_src && a_src->data.ptr) {
81900
    io0_a_src = a_src->data.ptr;
81901
    io1_a_src = io0_a_src + a_src->meta.ri;
81902
    iop_a_src = io1_a_src;
81903
    io2_a_src = io0_a_src + a_src->meta.wi;
81904
  }
81905
81906
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame;
81907
  if (coro_susp_point) {
81908
    v_dst_bytes_per_pixel = self->private_data.s_do_decode_frame.v_dst_bytes_per_pixel;
81909
    v_dst_x = self->private_data.s_do_decode_frame.v_dst_x;
81910
    v_dst_y = self->private_data.s_do_decode_frame.v_dst_y;
81911
    memcpy(v_src, self->private_data.s_do_decode_frame.v_src, sizeof(v_src));
81912
    v_c8 = self->private_data.s_do_decode_frame.v_c8;
81913
  }
81914
  switch (coro_susp_point) {
81915
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
81916
81917
    if (self->private_impl.f_call_sequence == 64u) {
81918
    } else if (self->private_impl.f_call_sequence < 64u) {
81919
      if (a_src) {
81920
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
81921
      }
81922
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
81923
      status = wuffs_wbmp__decoder__do_decode_frame_config(self, NULL, a_src);
81924
      if (a_src) {
81925
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
81926
      }
81927
      if (status.repr) {
81928
        goto suspend;
81929
      }
81930
    } else {
81931
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
81932
      goto ok;
81933
    }
81934
    v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler,
81935
        wuffs_base__pixel_buffer__pixel_format(a_dst),
81936
        wuffs_base__pixel_buffer__palette(a_dst),
81937
        wuffs_base__utility__make_pixel_format(536870920u),
81938
        wuffs_base__utility__empty_slice_u8(),
81939
        a_blend);
81940
    if ( ! wuffs_base__status__is_ok(&v_status)) {
81941
      status = v_status;
81942
      if (wuffs_base__status__is_error(&status)) {
81943
        goto exit;
81944
      } else if (wuffs_base__status__is_suspension(&status)) {
81945
        status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
81946
        goto exit;
81947
      }
81948
      goto ok;
81949
    }
81950
    v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
81951
    v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
81952
    if ((v_dst_bits_per_pixel & 7u) != 0u) {
81953
      status = wuffs_base__make_status(wuffs_base__error__unsupported_option);
81954
      goto exit;
81955
    }
81956
    v_dst_bytes_per_pixel = ((uint64_t)((v_dst_bits_per_pixel / 8u)));
81957
    if (self->private_impl.f_width > 0u) {
81958
      v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
81959
      while (v_dst_y < self->private_impl.f_height) {
81960
        v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_dst_y);
81961
        v_dst_x = 0u;
81962
        while (v_dst_x < self->private_impl.f_width) {
81963
          if ((v_dst_x & 7u) == 0u) {
81964
            while (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
81965
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
81966
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2);
81967
              v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
81968
              v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_dst_y);
81969
              v_dst_x_in_bytes = (((uint64_t)(v_dst_x)) * v_dst_bytes_per_pixel);
81970
              if (v_dst_x_in_bytes <= ((uint64_t)(v_dst.len))) {
81971
                v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_x_in_bytes);
81972
              }
81973
            }
81974
            v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
81975
            iop_a_src += 1u;
81976
          }
81977
          if (((uint8_t)(v_c8 & 128u)) == 0u) {
81978
            v_src[0u] = 0u;
81979
          } else {
81980
            v_src[0u] = 255u;
81981
          }
81982
          v_c8 = ((uint8_t)((((uint32_t)(v_c8)) << 1u)));
81983
          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));
81984
          if (v_dst_bytes_per_pixel <= ((uint64_t)(v_dst.len))) {
81985
            v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_bytes_per_pixel);
81986
          }
81987
          v_dst_x += 1u;
81988
        }
81989
        v_dst_y += 1u;
81990
      }
81991
    }
81992
    self->private_impl.f_call_sequence = 96u;
81993
81994
    ok:
81995
    self->private_impl.p_do_decode_frame = 0;
81996
    goto exit;
81997
  }
81998
81999
  goto suspend;
82000
  suspend:
82001
  self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
82002
  self->private_data.s_do_decode_frame.v_dst_bytes_per_pixel = v_dst_bytes_per_pixel;
82003
  self->private_data.s_do_decode_frame.v_dst_x = v_dst_x;
82004
  self->private_data.s_do_decode_frame.v_dst_y = v_dst_y;
82005
  memcpy(self->private_data.s_do_decode_frame.v_src, v_src, sizeof(v_src));
82006
  self->private_data.s_do_decode_frame.v_c8 = v_c8;
82007
82008
  goto exit;
82009
  exit:
82010
  if (a_src && a_src->data.ptr) {
82011
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
82012
  }
82013
82014
  return status;
82015
}
82016
82017
// -------- func wbmp.decoder.frame_dirty_rect
82018
82019
WUFFS_BASE__GENERATED_C_CODE
82020
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
82021
wuffs_wbmp__decoder__frame_dirty_rect(
82022
    const wuffs_wbmp__decoder* self) {
82023
  if (!self) {
82024
    return wuffs_base__utility__empty_rect_ie_u32();
82025
  }
82026
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
82027
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
82028
    return wuffs_base__utility__empty_rect_ie_u32();
82029
  }
82030
82031
  return wuffs_base__utility__make_rect_ie_u32(
82032
      0u,
82033
      0u,
82034
      self->private_impl.f_width,
82035
      self->private_impl.f_height);
82036
}
82037
82038
// -------- func wbmp.decoder.num_animation_loops
82039
82040
WUFFS_BASE__GENERATED_C_CODE
82041
WUFFS_BASE__MAYBE_STATIC uint32_t
82042
wuffs_wbmp__decoder__num_animation_loops(
82043
    const wuffs_wbmp__decoder* self) {
82044
  if (!self) {
82045
    return 0;
82046
  }
82047
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
82048
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
82049
    return 0;
82050
  }
82051
82052
  return 0u;
82053
}
82054
82055
// -------- func wbmp.decoder.num_decoded_frame_configs
82056
82057
WUFFS_BASE__GENERATED_C_CODE
82058
WUFFS_BASE__MAYBE_STATIC uint64_t
82059
wuffs_wbmp__decoder__num_decoded_frame_configs(
82060
    const wuffs_wbmp__decoder* self) {
82061
  if (!self) {
82062
    return 0;
82063
  }
82064
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
82065
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
82066
    return 0;
82067
  }
82068
82069
  if (self->private_impl.f_call_sequence > 32u) {
82070
    return 1u;
82071
  }
82072
  return 0u;
82073
}
82074
82075
// -------- func wbmp.decoder.num_decoded_frames
82076
82077
WUFFS_BASE__GENERATED_C_CODE
82078
WUFFS_BASE__MAYBE_STATIC uint64_t
82079
wuffs_wbmp__decoder__num_decoded_frames(
82080
    const wuffs_wbmp__decoder* self) {
82081
  if (!self) {
82082
    return 0;
82083
  }
82084
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
82085
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
82086
    return 0;
82087
  }
82088
82089
  if (self->private_impl.f_call_sequence > 64u) {
82090
    return 1u;
82091
  }
82092
  return 0u;
82093
}
82094
82095
// -------- func wbmp.decoder.restart_frame
82096
82097
WUFFS_BASE__GENERATED_C_CODE
82098
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
82099
wuffs_wbmp__decoder__restart_frame(
82100
    wuffs_wbmp__decoder* self,
82101
    uint64_t a_index,
82102
    uint64_t a_io_position) {
82103
  if (!self) {
82104
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
82105
  }
82106
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
82107
    return wuffs_base__make_status(
82108
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
82109
        ? wuffs_base__error__disabled_by_previous_error
82110
        : wuffs_base__error__initialize_not_called);
82111
  }
82112
82113
  if (self->private_impl.f_call_sequence < 32u) {
82114
    return wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
82115
  }
82116
  if (a_index != 0u) {
82117
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
82118
  }
82119
  self->private_impl.f_call_sequence = 40u;
82120
  self->private_impl.f_frame_config_io_position = a_io_position;
82121
  return wuffs_base__make_status(NULL);
82122
}
82123
82124
// -------- func wbmp.decoder.set_report_metadata
82125
82126
WUFFS_BASE__GENERATED_C_CODE
82127
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
82128
wuffs_wbmp__decoder__set_report_metadata(
82129
    wuffs_wbmp__decoder* self,
82130
    uint32_t a_fourcc,
82131
    bool a_report) {
82132
  return wuffs_base__make_empty_struct();
82133
}
82134
82135
// -------- func wbmp.decoder.tell_me_more
82136
82137
WUFFS_BASE__GENERATED_C_CODE
82138
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
82139
wuffs_wbmp__decoder__tell_me_more(
82140
    wuffs_wbmp__decoder* self,
82141
    wuffs_base__io_buffer* a_dst,
82142
    wuffs_base__more_information* a_minfo,
82143
    wuffs_base__io_buffer* a_src) {
82144
  if (!self) {
82145
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
82146
  }
82147
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
82148
    return wuffs_base__make_status(
82149
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
82150
        ? wuffs_base__error__disabled_by_previous_error
82151
        : wuffs_base__error__initialize_not_called);
82152
  }
82153
  if (!a_dst || !a_src) {
82154
    self->private_impl.magic = WUFFS_BASE__DISABLED;
82155
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
82156
  }
82157
  if ((self->private_impl.active_coroutine != 0) &&
82158
      (self->private_impl.active_coroutine != 4)) {
82159
    self->private_impl.magic = WUFFS_BASE__DISABLED;
82160
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
82161
  }
82162
  self->private_impl.active_coroutine = 0;
82163
  wuffs_base__status status = wuffs_base__make_status(NULL);
82164
82165
  status = wuffs_base__make_status(wuffs_base__error__no_more_information);
82166
  goto exit;
82167
82168
  goto ok;
82169
  ok:
82170
  goto exit;
82171
  exit:
82172
  if (wuffs_base__status__is_error(&status)) {
82173
    self->private_impl.magic = WUFFS_BASE__DISABLED;
82174
  }
82175
  return status;
82176
}
82177
82178
// -------- func wbmp.decoder.workbuf_len
82179
82180
WUFFS_BASE__GENERATED_C_CODE
82181
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
82182
wuffs_wbmp__decoder__workbuf_len(
82183
    const wuffs_wbmp__decoder* self) {
82184
  if (!self) {
82185
    return wuffs_base__utility__empty_range_ii_u64();
82186
  }
82187
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
82188
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
82189
    return wuffs_base__utility__empty_range_ii_u64();
82190
  }
82191
82192
  return wuffs_base__utility__make_range_ii_u64(0u, 0u);
82193
}
82194
82195
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WBMP)
82196
82197
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WEBP)
82198
82199
// ---------------- Status Codes Implementations
82200
82201
const char wuffs_webp__error__bad_huffman_code_over_subscribed[] = "#webp: bad Huffman code (over-subscribed)";
82202
const char wuffs_webp__error__bad_huffman_code_under_subscribed[] = "#webp: bad Huffman code (under-subscribed)";
82203
const char wuffs_webp__error__bad_huffman_code[] = "#webp: bad Huffman code";
82204
const char wuffs_webp__error__bad_back_reference[] = "#webp: bad back-reference";
82205
const char wuffs_webp__error__bad_color_cache[] = "#webp: bad color cache";
82206
const char wuffs_webp__error__bad_header[] = "#webp: bad header";
82207
const char wuffs_webp__error__bad_transform[] = "#webp: bad transform";
82208
const char wuffs_webp__error__short_chunk[] = "#webp: short chunk";
82209
const char wuffs_webp__error__truncated_input[] = "#webp: truncated input";
82210
const char wuffs_webp__error__unsupported_number_of_huffman_groups[] = "#webp: unsupported number of Huffman groups";
82211
const char wuffs_webp__error__unsupported_transform_after_color_indexing_transform[] = "#webp: unsupported transform after color indexing transform";
82212
const char wuffs_webp__error__unsupported_webp_file[] = "#webp: unsupported WebP file";
82213
const char wuffs_webp__error__internal_error_inconsistent_huffman_code[] = "#webp: internal error: inconsistent Huffman code";
82214
const char wuffs_webp__error__internal_error_inconsistent_dst_buffer[] = "#webp: internal error: inconsistent dst buffer";
82215
const char wuffs_webp__error__internal_error_inconsistent_n_bits[] = "#webp: internal error: inconsistent n_bits";
82216
82217
// ---------------- Private Consts
82218
82219
static const uint8_t
82220
WUFFS_WEBP__CODE_LENGTH_CODE_ORDER[19] WUFFS_BASE__POTENTIALLY_UNUSED = {
82221
  17u, 18u, 0u, 1u, 2u, 3u, 4u, 5u,
82222
  16u, 6u, 7u, 8u, 9u, 10u, 11u, 12u,
82223
  13u, 14u, 15u,
82224
};
82225
82226
static const uint8_t
82227
WUFFS_WEBP__REPEAT_N_BITS[4] WUFFS_BASE__POTENTIALLY_UNUSED = {
82228
  2u, 3u, 7u, 0u,
82229
};
82230
82231
static const uint8_t
82232
WUFFS_WEBP__REPEAT_COUNTS[4] WUFFS_BASE__POTENTIALLY_UNUSED = {
82233
  3u, 3u, 11u, 0u,
82234
};
82235
82236
static const uint16_t
82237
WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[5] WUFFS_BASE__POTENTIALLY_UNUSED = {
82238
  1612u, 0u, 511u, 1022u, 1533u,
82239
};
82240
82241
static const uint8_t
82242
WUFFS_WEBP__DISTANCE_MAP[120] WUFFS_BASE__POTENTIALLY_UNUSED = {
82243
  24u, 7u, 23u, 25u, 40u, 6u, 39u, 41u,
82244
  22u, 26u, 38u, 42u, 56u, 5u, 55u, 57u,
82245
  21u, 27u, 54u, 58u, 37u, 43u, 72u, 4u,
82246
  71u, 73u, 20u, 28u, 53u, 59u, 70u, 74u,
82247
  36u, 44u, 88u, 69u, 75u, 52u, 60u, 3u,
82248
  87u, 89u, 19u, 29u, 86u, 90u, 35u, 45u,
82249
  68u, 76u, 85u, 91u, 51u, 61u, 104u, 2u,
82250
  103u, 105u, 18u, 30u, 102u, 106u, 34u, 46u,
82251
  84u, 92u, 67u, 77u, 101u, 107u, 50u, 62u,
82252
  120u, 1u, 119u, 121u, 83u, 93u, 17u, 31u,
82253
  100u, 108u, 66u, 78u, 118u, 122u, 33u, 47u,
82254
  117u, 123u, 49u, 63u, 99u, 109u, 82u, 94u,
82255
  0u, 116u, 124u, 65u, 79u, 16u, 32u, 98u,
82256
  110u, 48u, 115u, 125u, 81u, 95u, 64u, 114u,
82257
  126u, 97u, 111u, 80u, 113u, 127u, 96u, 112u,
82258
};
82259
82260
// ---------------- Private Initializer Prototypes
82261
82262
// ---------------- Private Function Prototypes
82263
82264
WUFFS_BASE__GENERATED_C_CODE
82265
static wuffs_base__status
82266
wuffs_webp__decoder__decode_huffman_groups(
82267
    wuffs_webp__decoder* self,
82268
    wuffs_base__io_buffer* a_src,
82269
    uint32_t a_n_huffman_groups);
82270
82271
WUFFS_BASE__GENERATED_C_CODE
82272
static wuffs_base__status
82273
wuffs_webp__decoder__decode_huffman_tree(
82274
    wuffs_webp__decoder* self,
82275
    wuffs_base__io_buffer* a_src,
82276
    uint32_t a_hg,
82277
    uint32_t a_ht);
82278
82279
WUFFS_BASE__GENERATED_C_CODE
82280
static wuffs_base__status
82281
wuffs_webp__decoder__decode_huffman_tree_simple(
82282
    wuffs_webp__decoder* self,
82283
    wuffs_base__io_buffer* a_src,
82284
    uint32_t a_hg,
82285
    uint32_t a_ht);
82286
82287
WUFFS_BASE__GENERATED_C_CODE
82288
static wuffs_base__status
82289
wuffs_webp__decoder__decode_code_length_code_lengths(
82290
    wuffs_webp__decoder* self,
82291
    wuffs_base__io_buffer* a_src);
82292
82293
WUFFS_BASE__GENERATED_C_CODE
82294
static wuffs_base__status
82295
wuffs_webp__decoder__build_code_lengths_huffman_nodes(
82296
    wuffs_webp__decoder* self);
82297
82298
WUFFS_BASE__GENERATED_C_CODE
82299
static wuffs_base__status
82300
wuffs_webp__decoder__build_huffman_nodes(
82301
    wuffs_webp__decoder* self,
82302
    uint32_t a_hg,
82303
    uint32_t a_ht);
82304
82305
WUFFS_BASE__GENERATED_C_CODE
82306
static wuffs_base__status
82307
wuffs_webp__decoder__build_code_lengths(
82308
    wuffs_webp__decoder* self,
82309
    wuffs_base__io_buffer* a_src);
82310
82311
WUFFS_BASE__GENERATED_C_CODE
82312
static wuffs_base__status
82313
wuffs_webp__decoder__decode_pixels_slow(
82314
    wuffs_webp__decoder* self,
82315
    wuffs_base__slice_u8 a_dst,
82316
    wuffs_base__io_buffer* a_src,
82317
    uint32_t a_width,
82318
    uint32_t a_height,
82319
    wuffs_base__slice_u8 a_tile_data,
82320
    uint32_t a_tile_size_log2);
82321
82322
WUFFS_BASE__GENERATED_C_CODE
82323
static wuffs_base__empty_struct
82324
wuffs_webp__decoder__apply_transform_predictor(
82325
    wuffs_webp__decoder* self,
82326
    wuffs_base__slice_u8 a_pix,
82327
    wuffs_base__slice_u8 a_tile_data);
82328
82329
WUFFS_BASE__GENERATED_C_CODE
82330
static uint32_t
82331
wuffs_webp__decoder__absolute_difference(
82332
    const wuffs_webp__decoder* self,
82333
    uint32_t a_a,
82334
    uint32_t a_b);
82335
82336
WUFFS_BASE__GENERATED_C_CODE
82337
static uint8_t
82338
wuffs_webp__decoder__mode12(
82339
    const wuffs_webp__decoder* self,
82340
    uint8_t a_l,
82341
    uint8_t a_t,
82342
    uint8_t a_tl);
82343
82344
WUFFS_BASE__GENERATED_C_CODE
82345
static uint8_t
82346
wuffs_webp__decoder__mode13(
82347
    const wuffs_webp__decoder* self,
82348
    uint8_t a_l,
82349
    uint8_t a_t,
82350
    uint8_t a_tl);
82351
82352
WUFFS_BASE__GENERATED_C_CODE
82353
static wuffs_base__empty_struct
82354
wuffs_webp__decoder__apply_transform_cross_color(
82355
    wuffs_webp__decoder* self,
82356
    wuffs_base__slice_u8 a_pix,
82357
    wuffs_base__slice_u8 a_tile_data);
82358
82359
WUFFS_BASE__GENERATED_C_CODE
82360
static wuffs_base__empty_struct
82361
wuffs_webp__decoder__apply_transform_subtract_green(
82362
    wuffs_webp__decoder* self,
82363
    wuffs_base__slice_u8 a_pix);
82364
82365
WUFFS_BASE__GENERATED_C_CODE
82366
static wuffs_base__empty_struct
82367
wuffs_webp__decoder__apply_transform_color_indexing(
82368
    wuffs_webp__decoder* self,
82369
    wuffs_base__slice_u8 a_pix);
82370
82371
WUFFS_BASE__GENERATED_C_CODE
82372
static wuffs_base__status
82373
wuffs_webp__decoder__do_decode_image_config(
82374
    wuffs_webp__decoder* self,
82375
    wuffs_base__image_config* a_dst,
82376
    wuffs_base__io_buffer* a_src);
82377
82378
WUFFS_BASE__GENERATED_C_CODE
82379
static wuffs_base__status
82380
wuffs_webp__decoder__do_decode_image_config_limited(
82381
    wuffs_webp__decoder* self,
82382
    wuffs_base__image_config* a_dst,
82383
    wuffs_base__io_buffer* a_src);
82384
82385
WUFFS_BASE__GENERATED_C_CODE
82386
static wuffs_base__status
82387
wuffs_webp__decoder__do_decode_image_config_limited_vp8l(
82388
    wuffs_webp__decoder* self,
82389
    wuffs_base__io_buffer* a_src);
82390
82391
WUFFS_BASE__GENERATED_C_CODE
82392
static wuffs_base__status
82393
wuffs_webp__decoder__do_decode_frame_config(
82394
    wuffs_webp__decoder* self,
82395
    wuffs_base__frame_config* a_dst,
82396
    wuffs_base__io_buffer* a_src);
82397
82398
WUFFS_BASE__GENERATED_C_CODE
82399
static wuffs_base__status
82400
wuffs_webp__decoder__do_decode_frame(
82401
    wuffs_webp__decoder* self,
82402
    wuffs_base__pixel_buffer* a_dst,
82403
    wuffs_base__io_buffer* a_src,
82404
    wuffs_base__pixel_blend a_blend,
82405
    wuffs_base__slice_u8 a_workbuf,
82406
    wuffs_base__decode_frame_options* a_opts);
82407
82408
WUFFS_BASE__GENERATED_C_CODE
82409
static wuffs_base__status
82410
wuffs_webp__decoder__decode_transform(
82411
    wuffs_webp__decoder* self,
82412
    wuffs_base__io_buffer* a_src,
82413
    wuffs_base__slice_u8 a_workbuf);
82414
82415
WUFFS_BASE__GENERATED_C_CODE
82416
static wuffs_base__status
82417
wuffs_webp__decoder__decode_color_cache_parameters(
82418
    wuffs_webp__decoder* self,
82419
    wuffs_base__io_buffer* a_src);
82420
82421
WUFFS_BASE__GENERATED_C_CODE
82422
static wuffs_base__status
82423
wuffs_webp__decoder__decode_hg_table(
82424
    wuffs_webp__decoder* self,
82425
    wuffs_base__io_buffer* a_src,
82426
    uint32_t a_width,
82427
    wuffs_base__slice_u8 a_workbuf);
82428
82429
WUFFS_BASE__GENERATED_C_CODE
82430
static wuffs_base__status
82431
wuffs_webp__decoder__decode_pixels(
82432
    wuffs_webp__decoder* self,
82433
    wuffs_base__slice_u8 a_dst,
82434
    wuffs_base__io_buffer* a_src,
82435
    uint32_t a_width,
82436
    uint32_t a_height,
82437
    wuffs_base__slice_u8 a_tile_data,
82438
    uint32_t a_tile_size_log2);
82439
82440
WUFFS_BASE__GENERATED_C_CODE
82441
static wuffs_base__status
82442
wuffs_webp__decoder__swizzle(
82443
    wuffs_webp__decoder* self,
82444
    wuffs_base__pixel_buffer* a_dst,
82445
    wuffs_base__slice_u8 a_src,
82446
    wuffs_base__pixel_blend a_blend);
82447
82448
// ---------------- VTables
82449
82450
const wuffs_base__image_decoder__func_ptrs
82451
wuffs_webp__decoder__func_ptrs_for__wuffs_base__image_decoder = {
82452
  (wuffs_base__status(*)(void*,
82453
      wuffs_base__pixel_buffer*,
82454
      wuffs_base__io_buffer*,
82455
      wuffs_base__pixel_blend,
82456
      wuffs_base__slice_u8,
82457
      wuffs_base__decode_frame_options*))(&wuffs_webp__decoder__decode_frame),
82458
  (wuffs_base__status(*)(void*,
82459
      wuffs_base__frame_config*,
82460
      wuffs_base__io_buffer*))(&wuffs_webp__decoder__decode_frame_config),
82461
  (wuffs_base__status(*)(void*,
82462
      wuffs_base__image_config*,
82463
      wuffs_base__io_buffer*))(&wuffs_webp__decoder__decode_image_config),
82464
  (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_webp__decoder__frame_dirty_rect),
82465
  (uint64_t(*)(const void*,
82466
      uint32_t))(&wuffs_webp__decoder__get_quirk),
82467
  (uint32_t(*)(const void*))(&wuffs_webp__decoder__num_animation_loops),
82468
  (uint64_t(*)(const void*))(&wuffs_webp__decoder__num_decoded_frame_configs),
82469
  (uint64_t(*)(const void*))(&wuffs_webp__decoder__num_decoded_frames),
82470
  (wuffs_base__status(*)(void*,
82471
      uint64_t,
82472
      uint64_t))(&wuffs_webp__decoder__restart_frame),
82473
  (wuffs_base__status(*)(void*,
82474
      uint32_t,
82475
      uint64_t))(&wuffs_webp__decoder__set_quirk),
82476
  (wuffs_base__empty_struct(*)(void*,
82477
      uint32_t,
82478
      bool))(&wuffs_webp__decoder__set_report_metadata),
82479
  (wuffs_base__status(*)(void*,
82480
      wuffs_base__io_buffer*,
82481
      wuffs_base__more_information*,
82482
      wuffs_base__io_buffer*))(&wuffs_webp__decoder__tell_me_more),
82483
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_webp__decoder__workbuf_len),
82484
};
82485
82486
// ---------------- Initializer Implementations
82487
82488
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
82489
wuffs_webp__decoder__initialize(
82490
    wuffs_webp__decoder* self,
82491
    size_t sizeof_star_self,
82492
    uint64_t wuffs_version,
82493
    uint32_t options){
82494
  if (!self) {
82495
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
82496
  }
82497
  if (sizeof(*self) != sizeof_star_self) {
82498
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
82499
  }
82500
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
82501
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
82502
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
82503
  }
82504
82505
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
82506
    // The whole point of this if-check is to detect an uninitialized *self.
82507
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
82508
#if !defined(__clang__) && defined(__GNUC__)
82509
#pragma GCC diagnostic push
82510
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
82511
#endif
82512
    if (self->private_impl.magic != 0) {
82513
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
82514
    }
82515
#if !defined(__clang__) && defined(__GNUC__)
82516
#pragma GCC diagnostic pop
82517
#endif
82518
  } else {
82519
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
82520
      memset(self, 0, sizeof(*self));
82521
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
82522
    } else {
82523
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
82524
    }
82525
  }
82526
82527
  {
82528
    wuffs_base__status z = wuffs_vp8__decoder__initialize(
82529
        &self->private_data.f_vp8, sizeof(self->private_data.f_vp8), WUFFS_VERSION, options);
82530
    if (z.repr) {
82531
      return z;
82532
    }
82533
  }
82534
  self->private_impl.magic = WUFFS_BASE__MAGIC;
82535
  self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name =
82536
      wuffs_base__image_decoder__vtable_name;
82537
  self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers =
82538
      (const void*)(&wuffs_webp__decoder__func_ptrs_for__wuffs_base__image_decoder);
82539
  return wuffs_base__make_status(NULL);
82540
}
82541
82542
wuffs_webp__decoder*
82543
wuffs_webp__decoder__alloc(void) {
82544
  wuffs_webp__decoder* x =
82545
      (wuffs_webp__decoder*)(calloc(1, sizeof(wuffs_webp__decoder)));
82546
  if (!x) {
82547
    return NULL;
82548
  }
82549
  if (wuffs_webp__decoder__initialize(
82550
      x, sizeof(wuffs_webp__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
82551
    free(x);
82552
    return NULL;
82553
  }
82554
  return x;
82555
}
82556
82557
size_t
82558
sizeof__wuffs_webp__decoder(void) {
82559
  return sizeof(wuffs_webp__decoder);
82560
}
82561
82562
// ---------------- Function Implementations
82563
82564
// -------- func webp.decoder.decode_huffman_groups
82565
82566
WUFFS_BASE__GENERATED_C_CODE
82567
static wuffs_base__status
82568
wuffs_webp__decoder__decode_huffman_groups(
82569
    wuffs_webp__decoder* self,
82570
    wuffs_base__io_buffer* a_src,
82571
    uint32_t a_n_huffman_groups) {
82572
  wuffs_base__status status = wuffs_base__make_status(NULL);
82573
82574
  uint32_t v_hg = 0;
82575
  uint32_t v_ht = 0;
82576
82577
  uint32_t coro_susp_point = self->private_impl.p_decode_huffman_groups;
82578
  if (coro_susp_point) {
82579
    v_hg = self->private_data.s_decode_huffman_groups.v_hg;
82580
    v_ht = self->private_data.s_decode_huffman_groups.v_ht;
82581
  }
82582
  switch (coro_susp_point) {
82583
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
82584
82585
    v_hg = 0u;
82586
    while (v_hg < a_n_huffman_groups) {
82587
      v_ht = 0u;
82588
      while (v_ht < 5u) {
82589
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
82590
        status = wuffs_webp__decoder__decode_huffman_tree(self, a_src, v_hg, v_ht);
82591
        if (status.repr) {
82592
          goto suspend;
82593
        }
82594
        v_ht += 1u;
82595
      }
82596
      v_hg += 1u;
82597
    }
82598
82599
    goto ok;
82600
    ok:
82601
    self->private_impl.p_decode_huffman_groups = 0;
82602
    goto exit;
82603
  }
82604
82605
  goto suspend;
82606
  suspend:
82607
  self->private_impl.p_decode_huffman_groups = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
82608
  self->private_data.s_decode_huffman_groups.v_hg = v_hg;
82609
  self->private_data.s_decode_huffman_groups.v_ht = v_ht;
82610
82611
  goto exit;
82612
  exit:
82613
  return status;
82614
}
82615
82616
// -------- func webp.decoder.decode_huffman_tree
82617
82618
WUFFS_BASE__GENERATED_C_CODE
82619
static wuffs_base__status
82620
wuffs_webp__decoder__decode_huffman_tree(
82621
    wuffs_webp__decoder* self,
82622
    wuffs_base__io_buffer* a_src,
82623
    uint32_t a_hg,
82624
    uint32_t a_ht) {
82625
  wuffs_base__status status = wuffs_base__make_status(NULL);
82626
82627
  uint8_t v_c8 = 0;
82628
  uint32_t v_use_simple = 0;
82629
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
82630
82631
  const uint8_t* iop_a_src = NULL;
82632
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
82633
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
82634
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
82635
  if (a_src && a_src->data.ptr) {
82636
    io0_a_src = a_src->data.ptr;
82637
    io1_a_src = io0_a_src + a_src->meta.ri;
82638
    iop_a_src = io1_a_src;
82639
    io2_a_src = io0_a_src + a_src->meta.wi;
82640
  }
82641
82642
  uint32_t coro_susp_point = self->private_impl.p_decode_huffman_tree;
82643
  switch (coro_susp_point) {
82644
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
82645
82646
    if (a_ht >= 4u) {
82647
      self->private_impl.f_ht_n_symbols = 40u;
82648
    } else if (a_ht > 0u) {
82649
      self->private_impl.f_ht_n_symbols = 256u;
82650
    } else if (self->private_impl.f_color_cache_bits == 0u) {
82651
      self->private_impl.f_ht_n_symbols = 280u;
82652
    } else {
82653
      self->private_impl.f_ht_n_symbols = (280u + (((uint32_t)(1u)) << self->private_impl.f_color_cache_bits));
82654
    }
82655
    if (self->private_impl.f_n_bits < 1u) {
82656
      {
82657
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
82658
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
82659
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
82660
          goto suspend;
82661
        }
82662
        uint8_t t_0 = *iop_a_src++;
82663
        v_c8 = t_0;
82664
      }
82665
      self->private_impl.f_bits = ((uint32_t)(v_c8));
82666
      self->private_impl.f_n_bits = 8u;
82667
    }
82668
    v_use_simple = (self->private_impl.f_bits & 1u);
82669
    self->private_impl.f_bits >>= 1u;
82670
    self->private_impl.f_n_bits -= 1u;
82671
    if (v_use_simple != 0u) {
82672
      if (a_src) {
82673
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
82674
      }
82675
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
82676
      status = wuffs_webp__decoder__decode_huffman_tree_simple(self, a_src, a_hg, a_ht);
82677
      if (a_src) {
82678
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
82679
      }
82680
      if (status.repr) {
82681
        goto suspend;
82682
      }
82683
    } else {
82684
      if (a_src) {
82685
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
82686
      }
82687
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
82688
      status = wuffs_webp__decoder__decode_code_length_code_lengths(self, a_src);
82689
      if (a_src) {
82690
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
82691
      }
82692
      if (status.repr) {
82693
        goto suspend;
82694
      }
82695
      v_status = wuffs_webp__decoder__build_code_lengths_huffman_nodes(self);
82696
      if ( ! wuffs_base__status__is_ok(&v_status)) {
82697
        status = v_status;
82698
        if (wuffs_base__status__is_error(&status)) {
82699
          goto exit;
82700
        } else if (wuffs_base__status__is_suspension(&status)) {
82701
          status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
82702
          goto exit;
82703
        }
82704
        goto ok;
82705
      }
82706
      if (a_src) {
82707
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
82708
      }
82709
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
82710
      status = wuffs_webp__decoder__build_code_lengths(self, a_src);
82711
      if (a_src) {
82712
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
82713
      }
82714
      if (status.repr) {
82715
        goto suspend;
82716
      }
82717
      v_status = wuffs_webp__decoder__build_huffman_nodes(self, a_hg, a_ht);
82718
      if ( ! wuffs_base__status__is_ok(&v_status)) {
82719
        status = v_status;
82720
        if (wuffs_base__status__is_error(&status)) {
82721
          goto exit;
82722
        } else if (wuffs_base__status__is_suspension(&status)) {
82723
          status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
82724
          goto exit;
82725
        }
82726
        goto ok;
82727
      }
82728
    }
82729
82730
    ok:
82731
    self->private_impl.p_decode_huffman_tree = 0;
82732
    goto exit;
82733
  }
82734
82735
  goto suspend;
82736
  suspend:
82737
  self->private_impl.p_decode_huffman_tree = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
82738
82739
  goto exit;
82740
  exit:
82741
  if (a_src && a_src->data.ptr) {
82742
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
82743
  }
82744
82745
  return status;
82746
}
82747
82748
// -------- func webp.decoder.decode_huffman_tree_simple
82749
82750
WUFFS_BASE__GENERATED_C_CODE
82751
static wuffs_base__status
82752
wuffs_webp__decoder__decode_huffman_tree_simple(
82753
    wuffs_webp__decoder* self,
82754
    wuffs_base__io_buffer* a_src,
82755
    uint32_t a_hg,
82756
    uint32_t a_ht) {
82757
  wuffs_base__status status = wuffs_base__make_status(NULL);
82758
82759
  uint8_t v_c8 = 0;
82760
  uint32_t v_use_second_symbol = 0;
82761
  uint32_t v_first_symbol_n_bits = 0;
82762
  uint32_t v_symbol0 = 0;
82763
  uint32_t v_symbol1 = 0;
82764
  uint32_t v_base_offset = 0;
82765
82766
  const uint8_t* iop_a_src = NULL;
82767
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
82768
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
82769
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
82770
  if (a_src && a_src->data.ptr) {
82771
    io0_a_src = a_src->data.ptr;
82772
    io1_a_src = io0_a_src + a_src->meta.ri;
82773
    iop_a_src = io1_a_src;
82774
    io2_a_src = io0_a_src + a_src->meta.wi;
82775
  }
82776
82777
  uint32_t coro_susp_point = self->private_impl.p_decode_huffman_tree_simple;
82778
  if (coro_susp_point) {
82779
    v_use_second_symbol = self->private_data.s_decode_huffman_tree_simple.v_use_second_symbol;
82780
    v_first_symbol_n_bits = self->private_data.s_decode_huffman_tree_simple.v_first_symbol_n_bits;
82781
    v_symbol0 = self->private_data.s_decode_huffman_tree_simple.v_symbol0;
82782
    v_base_offset = self->private_data.s_decode_huffman_tree_simple.v_base_offset;
82783
  }
82784
  switch (coro_susp_point) {
82785
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
82786
82787
    if (self->private_impl.f_n_bits < 2u) {
82788
      {
82789
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
82790
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
82791
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
82792
          goto suspend;
82793
        }
82794
        uint8_t t_0 = *iop_a_src++;
82795
        v_c8 = t_0;
82796
      }
82797
      if (self->private_impl.f_n_bits >= 2u) {
82798
        status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
82799
        goto exit;
82800
      }
82801
      self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
82802
      self->private_impl.f_n_bits += 8u;
82803
    }
82804
    v_use_second_symbol = (self->private_impl.f_bits & 1u);
82805
    v_first_symbol_n_bits = ((((self->private_impl.f_bits & 2u) >> 1u) * 7u) + 1u);
82806
    self->private_impl.f_bits >>= 2u;
82807
    self->private_impl.f_n_bits -= 2u;
82808
    if (self->private_impl.f_n_bits < v_first_symbol_n_bits) {
82809
      {
82810
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
82811
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
82812
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
82813
          goto suspend;
82814
        }
82815
        uint8_t t_1 = *iop_a_src++;
82816
        v_c8 = t_1;
82817
      }
82818
      if (self->private_impl.f_n_bits >= v_first_symbol_n_bits) {
82819
        status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
82820
        goto exit;
82821
      }
82822
      self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
82823
      self->private_impl.f_n_bits += 8u;
82824
    }
82825
    v_symbol0 = (self->private_impl.f_bits & ((((uint32_t)(1u)) << v_first_symbol_n_bits) - 1u));
82826
    self->private_impl.f_bits >>= v_first_symbol_n_bits;
82827
    self->private_impl.f_n_bits -= v_first_symbol_n_bits;
82828
    v_base_offset = ((uint32_t)(WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[a_ht]));
82829
    if (v_use_second_symbol != 0u) {
82830
      if (self->private_impl.f_n_bits < 8u) {
82831
        {
82832
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
82833
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
82834
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
82835
            goto suspend;
82836
          }
82837
          uint8_t t_2 = *iop_a_src++;
82838
          v_c8 = t_2;
82839
        }
82840
        if (self->private_impl.f_n_bits >= 8u) {
82841
          status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
82842
          goto exit;
82843
        }
82844
        self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
82845
        self->private_impl.f_n_bits += 8u;
82846
      }
82847
      v_symbol1 = (self->private_impl.f_bits & 255u);
82848
      self->private_impl.f_bits >>= 8u;
82849
      self->private_impl.f_n_bits -= 8u;
82850
      self->private_data.f_huffman_nodes[a_hg][(v_base_offset + 0u)] = ((uint16_t)((v_base_offset + 1u)));
82851
      self->private_data.f_huffman_nodes[a_hg][(v_base_offset + 1u)] = ((uint16_t)((v_symbol0 | 32768u)));
82852
      self->private_data.f_huffman_nodes[a_hg][(v_base_offset + 2u)] = ((uint16_t)((v_symbol1 | 32768u)));
82853
    } else {
82854
      self->private_data.f_huffman_nodes[a_hg][v_base_offset] = ((uint16_t)((v_symbol0 | 32768u)));
82855
    }
82856
82857
    goto ok;
82858
    ok:
82859
    self->private_impl.p_decode_huffman_tree_simple = 0;
82860
    goto exit;
82861
  }
82862
82863
  goto suspend;
82864
  suspend:
82865
  self->private_impl.p_decode_huffman_tree_simple = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
82866
  self->private_data.s_decode_huffman_tree_simple.v_use_second_symbol = v_use_second_symbol;
82867
  self->private_data.s_decode_huffman_tree_simple.v_first_symbol_n_bits = v_first_symbol_n_bits;
82868
  self->private_data.s_decode_huffman_tree_simple.v_symbol0 = v_symbol0;
82869
  self->private_data.s_decode_huffman_tree_simple.v_base_offset = v_base_offset;
82870
82871
  goto exit;
82872
  exit:
82873
  if (a_src && a_src->data.ptr) {
82874
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
82875
  }
82876
82877
  return status;
82878
}
82879
82880
// -------- func webp.decoder.decode_code_length_code_lengths
82881
82882
WUFFS_BASE__GENERATED_C_CODE
82883
static wuffs_base__status
82884
wuffs_webp__decoder__decode_code_length_code_lengths(
82885
    wuffs_webp__decoder* self,
82886
    wuffs_base__io_buffer* a_src) {
82887
  wuffs_base__status status = wuffs_base__make_status(NULL);
82888
82889
  uint8_t v_c8 = 0;
82890
  uint32_t v_n_codes = 0;
82891
  uint32_t v_i = 0;
82892
82893
  const uint8_t* iop_a_src = NULL;
82894
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
82895
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
82896
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
82897
  if (a_src && a_src->data.ptr) {
82898
    io0_a_src = a_src->data.ptr;
82899
    io1_a_src = io0_a_src + a_src->meta.ri;
82900
    iop_a_src = io1_a_src;
82901
    io2_a_src = io0_a_src + a_src->meta.wi;
82902
  }
82903
82904
  uint32_t coro_susp_point = self->private_impl.p_decode_code_length_code_lengths;
82905
  if (coro_susp_point) {
82906
    v_n_codes = self->private_data.s_decode_code_length_code_lengths.v_n_codes;
82907
    v_i = self->private_data.s_decode_code_length_code_lengths.v_i;
82908
  }
82909
  switch (coro_susp_point) {
82910
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
82911
82912
    if (self->private_impl.f_n_bits < 4u) {
82913
      {
82914
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
82915
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
82916
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
82917
          goto suspend;
82918
        }
82919
        uint8_t t_0 = *iop_a_src++;
82920
        v_c8 = t_0;
82921
      }
82922
      if (self->private_impl.f_n_bits >= 4u) {
82923
        status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
82924
        goto exit;
82925
      }
82926
      self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
82927
      self->private_impl.f_n_bits += 8u;
82928
    }
82929
    v_n_codes = ((self->private_impl.f_bits & 15u) + 4u);
82930
    self->private_impl.f_bits >>= 4u;
82931
    self->private_impl.f_n_bits -= 4u;
82932
    v_i = 0u;
82933
    while (v_i < v_n_codes) {
82934
      if (self->private_impl.f_n_bits < 3u) {
82935
        {
82936
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
82937
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
82938
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
82939
            goto suspend;
82940
          }
82941
          uint8_t t_1 = *iop_a_src++;
82942
          v_c8 = t_1;
82943
        }
82944
        if (self->private_impl.f_n_bits >= 3u) {
82945
          status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
82946
          goto exit;
82947
        }
82948
        self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
82949
        self->private_impl.f_n_bits += 8u;
82950
      }
82951
      self->private_impl.f_code_length_code_lengths[WUFFS_WEBP__CODE_LENGTH_CODE_ORDER[v_i]] = ((uint8_t)((self->private_impl.f_bits & 7u)));
82952
      self->private_impl.f_bits >>= 3u;
82953
      self->private_impl.f_n_bits -= 3u;
82954
      v_i += 1u;
82955
    }
82956
    while (v_i < 19u) {
82957
      self->private_impl.f_code_length_code_lengths[WUFFS_WEBP__CODE_LENGTH_CODE_ORDER[v_i]] = 0u;
82958
      v_i += 1u;
82959
    }
82960
82961
    goto ok;
82962
    ok:
82963
    self->private_impl.p_decode_code_length_code_lengths = 0;
82964
    goto exit;
82965
  }
82966
82967
  goto suspend;
82968
  suspend:
82969
  self->private_impl.p_decode_code_length_code_lengths = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
82970
  self->private_data.s_decode_code_length_code_lengths.v_n_codes = v_n_codes;
82971
  self->private_data.s_decode_code_length_code_lengths.v_i = v_i;
82972
82973
  goto exit;
82974
  exit:
82975
  if (a_src && a_src->data.ptr) {
82976
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
82977
  }
82978
82979
  return status;
82980
}
82981
82982
// -------- func webp.decoder.build_code_lengths_huffman_nodes
82983
82984
WUFFS_BASE__GENERATED_C_CODE
82985
static wuffs_base__status
82986
wuffs_webp__decoder__build_code_lengths_huffman_nodes(
82987
    wuffs_webp__decoder* self) {
82988
  uint32_t v_code_bits = 0;
82989
  uint32_t v_code_len = 0;
82990
  uint32_t v_symbol = 0;
82991
  uint32_t v_histogram[8] = {0};
82992
  uint32_t v_n_used_symbols = 0;
82993
  uint32_t v_last_used_symbol = 0;
82994
  uint32_t v_subscription_weight = 0;
82995
  uint32_t v_subscription_total = 0;
82996
  uint32_t v_curr_code = 0;
82997
  uint32_t v_next_codes[9] = {0};
82998
  uint32_t v_n_branches = 0;
82999
  uint32_t v_h = 0;
83000
  uint32_t v_children = 0;
83001
  uint16_t v_node = 0;
83002
83003
  v_symbol = 0u;
83004
  while (v_symbol < 19u) {
83005
    v_code_len = ((uint32_t)(self->private_impl.f_code_length_code_lengths[v_symbol]));
83006
    if (v_code_len != 0u) {
83007
      v_histogram[v_code_len] += 1u;
83008
      v_n_used_symbols += 1u;
83009
      v_last_used_symbol = v_symbol;
83010
    }
83011
    v_symbol += 1u;
83012
  }
83013
  if (v_n_used_symbols < 1u) {
83014
    return wuffs_base__make_status(wuffs_webp__error__bad_huffman_code);
83015
  } else if (v_n_used_symbols == 1u) {
83016
    self->private_data.f_code_lengths_huffman_nodes[0u] = ((uint16_t)((v_last_used_symbol | 32768u)));
83017
    return wuffs_base__make_status(NULL);
83018
  }
83019
  v_subscription_weight = 16384u;
83020
  v_code_len = 1u;
83021
  while (true) {
83022
    v_curr_code = ((uint32_t)(((uint32_t)(v_curr_code + v_histogram[v_code_len])) << 1u));
83023
    v_next_codes[(v_code_len + 1u)] = v_curr_code;
83024
    v_subscription_total += ((uint32_t)(v_subscription_weight * v_histogram[v_code_len]));
83025
    v_subscription_weight >>= 1u;
83026
    if (v_code_len >= 7u) {
83027
      break;
83028
    }
83029
    v_code_len += 1u;
83030
  }
83031
  if (v_subscription_total > 32768u) {
83032
    return wuffs_base__make_status(wuffs_webp__error__bad_huffman_code_over_subscribed);
83033
  } else if (v_subscription_total < 32768u) {
83034
    return wuffs_base__make_status(wuffs_webp__error__bad_huffman_code_under_subscribed);
83035
  }
83036
  self->private_data.f_code_lengths_huffman_nodes[0u] = 0u;
83037
  v_symbol = 0u;
83038
  while (v_symbol < 19u) {
83039
    v_code_len = ((uint32_t)(self->private_impl.f_code_length_code_lengths[v_symbol]));
83040
    if (v_code_len > 0u) {
83041
      v_code_bits = v_next_codes[v_code_len];
83042
      v_next_codes[v_code_len] += 1u;
83043
      v_code_bits <<= (32u - v_code_len);
83044
      v_h = 0u;
83045
      while (v_code_len > 0u) {
83046
        v_node = self->private_data.f_code_lengths_huffman_nodes[v_h];
83047
        if (v_node == 0u) {
83048
          v_children = ((uint32_t)(1u + ((uint32_t)(2u * v_n_branches))));
83049
          v_children = wuffs_base__u32__min(v_children, 35u);
83050
          self->private_data.f_code_lengths_huffman_nodes[v_h] = ((uint16_t)(v_children));
83051
          self->private_data.f_code_lengths_huffman_nodes[(v_children + 0u)] = 0u;
83052
          self->private_data.f_code_lengths_huffman_nodes[(v_children + 1u)] = 0u;
83053
          v_h = (v_children + (v_code_bits >> 31u));
83054
          v_n_branches += 1u;
83055
        } else {
83056
          v_children = ((uint32_t)(v_node));
83057
          v_h = (wuffs_base__u32__min(v_children, 35u) + (v_code_bits >> 31u));
83058
        }
83059
        v_code_bits <<= 1u;
83060
        v_code_len -= 1u;
83061
      }
83062
      self->private_data.f_code_lengths_huffman_nodes[v_h] = ((uint16_t)((v_symbol | 32768u)));
83063
    }
83064
    v_symbol += 1u;
83065
  }
83066
  return wuffs_base__make_status(NULL);
83067
}
83068
83069
// -------- func webp.decoder.build_huffman_nodes
83070
83071
WUFFS_BASE__GENERATED_C_CODE
83072
static wuffs_base__status
83073
wuffs_webp__decoder__build_huffman_nodes(
83074
    wuffs_webp__decoder* self,
83075
    uint32_t a_hg,
83076
    uint32_t a_ht) {
83077
  uint32_t v_base_offset = 0;
83078
  uint32_t v_code_bits = 0;
83079
  uint32_t v_code_len = 0;
83080
  uint32_t v_symbol = 0;
83081
  uint32_t v_histogram[16] = {0};
83082
  uint32_t v_n_used_symbols = 0;
83083
  uint32_t v_last_used_symbol = 0;
83084
  uint32_t v_subscription_weight = 0;
83085
  uint32_t v_subscription_total = 0;
83086
  uint32_t v_curr_code = 0;
83087
  uint32_t v_next_codes[17] = {0};
83088
  uint32_t v_n_branches = 0;
83089
  uint32_t v_h = 0;
83090
  uint32_t v_children = 0;
83091
  uint16_t v_node = 0;
83092
83093
  v_base_offset = ((uint32_t)(WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[a_ht]));
83094
  v_symbol = 0u;
83095
  while (v_symbol < self->private_impl.f_ht_n_symbols) {
83096
    v_code_len = ((uint32_t)(((uint16_t)(self->private_data.f_code_lengths[v_symbol] & 15u))));
83097
    if (v_code_len != 0u) {
83098
      v_histogram[v_code_len] += 1u;
83099
      v_n_used_symbols += 1u;
83100
      v_last_used_symbol = v_symbol;
83101
    }
83102
    v_symbol += 1u;
83103
  }
83104
  if (v_n_used_symbols < 1u) {
83105
    return wuffs_base__make_status(wuffs_webp__error__bad_huffman_code);
83106
  } else if (v_n_used_symbols == 1u) {
83107
    self->private_data.f_huffman_nodes[a_hg][v_base_offset] = ((uint16_t)((v_last_used_symbol | 32768u)));
83108
    return wuffs_base__make_status(NULL);
83109
  }
83110
  v_subscription_weight = 16384u;
83111
  v_code_len = 1u;
83112
  while (true) {
83113
    v_curr_code = ((uint32_t)(((uint32_t)(v_curr_code + v_histogram[v_code_len])) << 1u));
83114
    v_next_codes[(v_code_len + 1u)] = v_curr_code;
83115
    v_subscription_total += ((uint32_t)(v_subscription_weight * v_histogram[v_code_len]));
83116
    v_subscription_weight >>= 1u;
83117
    if (v_code_len >= 15u) {
83118
      break;
83119
    }
83120
    v_code_len += 1u;
83121
  }
83122
  if (v_subscription_total > 32768u) {
83123
    return wuffs_base__make_status(wuffs_webp__error__bad_huffman_code_over_subscribed);
83124
  } else if (v_subscription_total < 32768u) {
83125
    return wuffs_base__make_status(wuffs_webp__error__bad_huffman_code_under_subscribed);
83126
  }
83127
  self->private_data.f_huffman_nodes[a_hg][v_base_offset] = 0u;
83128
  v_symbol = 0u;
83129
  while (v_symbol < self->private_impl.f_ht_n_symbols) {
83130
    v_code_len = ((uint32_t)(((uint16_t)(self->private_data.f_code_lengths[v_symbol] & 15u))));
83131
    if (v_code_len != 0u) {
83132
      v_code_bits = v_next_codes[v_code_len];
83133
      v_next_codes[v_code_len] += 1u;
83134
      v_code_bits <<= (32u - v_code_len);
83135
      v_h = v_base_offset;
83136
      while (v_code_len > 0u) {
83137
        v_node = self->private_data.f_huffman_nodes[a_hg][v_h];
83138
        if (v_node == 0u) {
83139
          v_children = ((uint32_t)(v_base_offset + ((uint32_t)(1u + ((uint32_t)(2u * v_n_branches))))));
83140
          v_children = wuffs_base__u32__min(v_children, 6265u);
83141
          self->private_data.f_huffman_nodes[a_hg][v_h] = ((uint16_t)(v_children));
83142
          self->private_data.f_huffman_nodes[a_hg][(v_children + 0u)] = 0u;
83143
          self->private_data.f_huffman_nodes[a_hg][(v_children + 1u)] = 0u;
83144
          v_h = (v_children + (v_code_bits >> 31u));
83145
          v_n_branches += 1u;
83146
        } else {
83147
          v_children = ((uint32_t)(v_node));
83148
          v_h = (wuffs_base__u32__min(v_children, 6265u) + (v_code_bits >> 31u));
83149
        }
83150
        v_code_bits <<= 1u;
83151
        v_code_len -= 1u;
83152
      }
83153
      self->private_data.f_huffman_nodes[a_hg][v_h] = ((uint16_t)((v_symbol | 32768u)));
83154
    }
83155
    v_symbol += 1u;
83156
  }
83157
  return wuffs_base__make_status(NULL);
83158
}
83159
83160
// -------- func webp.decoder.build_code_lengths
83161
83162
WUFFS_BASE__GENERATED_C_CODE
83163
static wuffs_base__status
83164
wuffs_webp__decoder__build_code_lengths(
83165
    wuffs_webp__decoder* self,
83166
    wuffs_base__io_buffer* a_src) {
83167
  wuffs_base__status status = wuffs_base__make_status(NULL);
83168
83169
  uint8_t v_c8 = 0;
83170
  uint32_t v_use_length = 0;
83171
  uint32_t v_length_n_bits = 0;
83172
  uint32_t v_length = 0;
83173
  uint16_t v_prev_code_length = 0;
83174
  uint32_t v_h = 0;
83175
  uint32_t v_s = 0;
83176
  uint32_t v_s_max = 0;
83177
  uint16_t v_node = 0;
83178
  uint32_t v_symbol = 0;
83179
  uint16_t v_repeat_value = 0;
83180
  uint32_t v_repeat_n_bits = 0;
83181
83182
  const uint8_t* iop_a_src = NULL;
83183
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
83184
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
83185
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
83186
  if (a_src && a_src->data.ptr) {
83187
    io0_a_src = a_src->data.ptr;
83188
    io1_a_src = io0_a_src + a_src->meta.ri;
83189
    iop_a_src = io1_a_src;
83190
    io2_a_src = io0_a_src + a_src->meta.wi;
83191
  }
83192
83193
  uint32_t coro_susp_point = self->private_impl.p_build_code_lengths;
83194
  if (coro_susp_point) {
83195
    v_length_n_bits = self->private_data.s_build_code_lengths.v_length_n_bits;
83196
    v_prev_code_length = self->private_data.s_build_code_lengths.v_prev_code_length;
83197
    v_s = self->private_data.s_build_code_lengths.v_s;
83198
    v_s_max = self->private_data.s_build_code_lengths.v_s_max;
83199
    v_node = self->private_data.s_build_code_lengths.v_node;
83200
    v_repeat_value = self->private_data.s_build_code_lengths.v_repeat_value;
83201
    v_repeat_n_bits = self->private_data.s_build_code_lengths.v_repeat_n_bits;
83202
  }
83203
  switch (coro_susp_point) {
83204
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
83205
83206
    if (self->private_impl.f_n_bits < 1u) {
83207
      {
83208
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
83209
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
83210
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
83211
          goto suspend;
83212
        }
83213
        uint8_t t_0 = *iop_a_src++;
83214
        v_c8 = t_0;
83215
      }
83216
      self->private_impl.f_bits = ((uint32_t)(v_c8));
83217
      self->private_impl.f_n_bits = 8u;
83218
    }
83219
    v_use_length = (self->private_impl.f_bits & 1u);
83220
    self->private_impl.f_bits >>= 1u;
83221
    self->private_impl.f_n_bits -= 1u;
83222
    self->private_impl.f_ht_code_lengths_remaining = self->private_impl.f_ht_n_symbols;
83223
    if (v_use_length != 0u) {
83224
      if (self->private_impl.f_n_bits < 3u) {
83225
        {
83226
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
83227
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
83228
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
83229
            goto suspend;
83230
          }
83231
          uint8_t t_1 = *iop_a_src++;
83232
          v_c8 = t_1;
83233
        }
83234
        if (self->private_impl.f_n_bits >= 3u) {
83235
          status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
83236
          goto exit;
83237
        }
83238
        self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
83239
        self->private_impl.f_n_bits += 8u;
83240
      }
83241
      v_length_n_bits = (((self->private_impl.f_bits & 7u) * 2u) + 2u);
83242
      self->private_impl.f_bits >>= 3u;
83243
      self->private_impl.f_n_bits -= 3u;
83244
      while (self->private_impl.f_n_bits < v_length_n_bits) {
83245
        {
83246
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
83247
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
83248
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
83249
            goto suspend;
83250
          }
83251
          uint8_t t_2 = *iop_a_src++;
83252
          v_c8 = t_2;
83253
        }
83254
        if (self->private_impl.f_n_bits >= v_length_n_bits) {
83255
          status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
83256
          goto exit;
83257
        }
83258
        self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
83259
        self->private_impl.f_n_bits += 8u;
83260
      }
83261
      v_length = ((self->private_impl.f_bits & ((((uint32_t)(1u)) << v_length_n_bits) - 1u)) + 2u);
83262
      self->private_impl.f_bits >>= v_length_n_bits;
83263
      self->private_impl.f_n_bits -= v_length_n_bits;
83264
      if (v_length > self->private_impl.f_ht_n_symbols) {
83265
        status = wuffs_base__make_status(wuffs_webp__error__bad_huffman_code);
83266
        goto exit;
83267
      }
83268
      self->private_impl.f_ht_code_lengths_remaining = v_length;
83269
    }
83270
    v_prev_code_length = 8u;
83271
    while (v_s < self->private_impl.f_ht_n_symbols) {
83272
      if (self->private_impl.f_ht_code_lengths_remaining <= 0u) {
83273
        while (v_s < self->private_impl.f_ht_n_symbols) {
83274
          self->private_data.f_code_lengths[v_s] = 0u;
83275
          v_s += 1u;
83276
        }
83277
        break;
83278
      }
83279
      self->private_impl.f_ht_code_lengths_remaining -= 1u;
83280
      v_h = 0u;
83281
      while (true) {
83282
        v_node = self->private_data.f_code_lengths_huffman_nodes[v_h];
83283
        if (v_node >= 32768u) {
83284
          break;
83285
        } else if (v_node > 35u) {
83286
          status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_huffman_code);
83287
          goto exit;
83288
        }
83289
        if (self->private_impl.f_n_bits < 1u) {
83290
          {
83291
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
83292
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
83293
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
83294
              goto suspend;
83295
            }
83296
            uint8_t t_3 = *iop_a_src++;
83297
            v_c8 = t_3;
83298
          }
83299
          self->private_impl.f_bits = ((uint32_t)(v_c8));
83300
          self->private_impl.f_n_bits = 8u;
83301
        }
83302
        v_h = (((uint32_t)(v_node)) + (self->private_impl.f_bits & 1u));
83303
        self->private_impl.f_bits >>= 1u;
83304
        self->private_impl.f_n_bits -= 1u;
83305
      }
83306
      v_symbol = ((uint32_t)(((uint16_t)(v_node & 32767u))));
83307
      if (v_symbol == 0u) {
83308
        self->private_data.f_code_lengths[v_s] = 0u;
83309
        v_s += 1u;
83310
        continue;
83311
      } else if (v_symbol < 16u) {
83312
        v_prev_code_length = ((uint16_t)(v_symbol));
83313
        self->private_data.f_code_lengths[v_s] = v_prev_code_length;
83314
        v_s += 1u;
83315
        continue;
83316
      } else if (v_symbol == 16u) {
83317
        v_repeat_value = v_prev_code_length;
83318
      } else {
83319
        v_repeat_value = 0u;
83320
      }
83321
      v_repeat_n_bits = ((uint32_t)(WUFFS_WEBP__REPEAT_N_BITS[(v_symbol & 3u)]));
83322
      v_s_max = ((uint32_t)(((uint32_t)(WUFFS_WEBP__REPEAT_COUNTS[(v_symbol & 3u)])) + v_s));
83323
      if (self->private_impl.f_n_bits < v_repeat_n_bits) {
83324
        {
83325
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
83326
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
83327
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
83328
            goto suspend;
83329
          }
83330
          uint8_t t_4 = *iop_a_src++;
83331
          v_c8 = t_4;
83332
        }
83333
        if (self->private_impl.f_n_bits >= v_repeat_n_bits) {
83334
          status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
83335
          goto exit;
83336
        }
83337
        self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
83338
        self->private_impl.f_n_bits += 8u;
83339
      }
83340
      v_s_max += (self->private_impl.f_bits & ((((uint32_t)(1u)) << v_repeat_n_bits) - 1u));
83341
      self->private_impl.f_bits >>= v_repeat_n_bits;
83342
      self->private_impl.f_n_bits -= v_repeat_n_bits;
83343
      if (v_s_max > self->private_impl.f_ht_n_symbols) {
83344
        status = wuffs_base__make_status(wuffs_webp__error__bad_huffman_code);
83345
        goto exit;
83346
      }
83347
      while (v_s < v_s_max) {
83348
        self->private_data.f_code_lengths[v_s] = v_repeat_value;
83349
        v_s += 1u;
83350
      }
83351
    }
83352
83353
    goto ok;
83354
    ok:
83355
    self->private_impl.p_build_code_lengths = 0;
83356
    goto exit;
83357
  }
83358
83359
  goto suspend;
83360
  suspend:
83361
  self->private_impl.p_build_code_lengths = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
83362
  self->private_data.s_build_code_lengths.v_length_n_bits = v_length_n_bits;
83363
  self->private_data.s_build_code_lengths.v_prev_code_length = v_prev_code_length;
83364
  self->private_data.s_build_code_lengths.v_s = v_s;
83365
  self->private_data.s_build_code_lengths.v_s_max = v_s_max;
83366
  self->private_data.s_build_code_lengths.v_node = v_node;
83367
  self->private_data.s_build_code_lengths.v_repeat_value = v_repeat_value;
83368
  self->private_data.s_build_code_lengths.v_repeat_n_bits = v_repeat_n_bits;
83369
83370
  goto exit;
83371
  exit:
83372
  if (a_src && a_src->data.ptr) {
83373
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
83374
  }
83375
83376
  return status;
83377
}
83378
83379
// -------- func webp.decoder.decode_pixels_slow
83380
83381
WUFFS_BASE__GENERATED_C_CODE
83382
static wuffs_base__status
83383
wuffs_webp__decoder__decode_pixels_slow(
83384
    wuffs_webp__decoder* self,
83385
    wuffs_base__slice_u8 a_dst,
83386
    wuffs_base__io_buffer* a_src,
83387
    uint32_t a_width,
83388
    uint32_t a_height,
83389
    wuffs_base__slice_u8 a_tile_data,
83390
    uint32_t a_tile_size_log2) {
83391
  wuffs_base__status status = wuffs_base__make_status(NULL);
83392
83393
  uint8_t v_c8 = 0;
83394
  uint64_t v_p = 0;
83395
  uint64_t v_p_max = 0;
83396
  uint32_t v_tile_size_log2 = 0;
83397
  uint32_t v_width_in_tiles = 0;
83398
  uint32_t v_x = 0;
83399
  uint32_t v_y = 0;
83400
  uint32_t v_i = 0;
83401
  uint32_t v_hg = 0;
83402
  uint32_t v_h = 0;
83403
  uint16_t v_node = 0;
83404
  uint32_t v_pixel_g = 0;
83405
  uint32_t v_color = 0;
83406
  wuffs_base__slice_u8 v_dst_pixel = {0};
83407
  uint32_t v_back_ref_len_n_bits = 0;
83408
  uint32_t v_back_ref_len_minus_1 = 0;
83409
  uint32_t v_back_ref_dist_n_bits = 0;
83410
  uint32_t v_back_ref_dist_sym = 0;
83411
  uint32_t v_back_ref_dist_premap_minus_1 = 0;
83412
  uint32_t v_back_ref_dist_minus_1 = 0;
83413
  uint32_t v_dm = 0;
83414
  uint32_t v_dx = 0;
83415
  uint32_t v_dy = 0;
83416
  uint64_t v_p_end = 0;
83417
  uint64_t v_dist4 = 0;
83418
  uint64_t v_q = 0;
83419
  wuffs_base__slice_u8 v_color_cache_pixels = {0};
83420
  uint64_t v_color_cache_p = 0;
83421
  uint32_t v_color_cache_shift = 0;
83422
83423
  const uint8_t* iop_a_src = NULL;
83424
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
83425
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
83426
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
83427
  if (a_src && a_src->data.ptr) {
83428
    io0_a_src = a_src->data.ptr;
83429
    io1_a_src = io0_a_src + a_src->meta.ri;
83430
    iop_a_src = io1_a_src;
83431
    io2_a_src = io0_a_src + a_src->meta.wi;
83432
  }
83433
83434
  uint32_t coro_susp_point = self->private_impl.p_decode_pixels_slow;
83435
  if (coro_susp_point) {
83436
    v_p = self->private_data.s_decode_pixels_slow.v_p;
83437
    v_p_max = self->private_data.s_decode_pixels_slow.v_p_max;
83438
    v_tile_size_log2 = self->private_data.s_decode_pixels_slow.v_tile_size_log2;
83439
    v_width_in_tiles = self->private_data.s_decode_pixels_slow.v_width_in_tiles;
83440
    v_x = self->private_data.s_decode_pixels_slow.v_x;
83441
    v_y = self->private_data.s_decode_pixels_slow.v_y;
83442
    v_hg = self->private_data.s_decode_pixels_slow.v_hg;
83443
    v_node = self->private_data.s_decode_pixels_slow.v_node;
83444
    v_color = self->private_data.s_decode_pixels_slow.v_color;
83445
    v_back_ref_len_n_bits = self->private_data.s_decode_pixels_slow.v_back_ref_len_n_bits;
83446
    v_back_ref_len_minus_1 = self->private_data.s_decode_pixels_slow.v_back_ref_len_minus_1;
83447
    v_back_ref_dist_n_bits = self->private_data.s_decode_pixels_slow.v_back_ref_dist_n_bits;
83448
    v_back_ref_dist_premap_minus_1 = self->private_data.s_decode_pixels_slow.v_back_ref_dist_premap_minus_1;
83449
    v_color_cache_p = self->private_data.s_decode_pixels_slow.v_color_cache_p;
83450
  }
83451
  switch (coro_susp_point) {
83452
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
83453
83454
    v_p_max = ((uint64_t)((4u * a_width * a_height)));
83455
    if (((uint64_t)(a_dst.len)) < v_p_max) {
83456
      status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_dst_buffer);
83457
      goto exit;
83458
    }
83459
    if (a_tile_size_log2 != 0u) {
83460
      v_tile_size_log2 = a_tile_size_log2;
83461
      v_width_in_tiles = ((a_width + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2);
83462
    } else {
83463
      v_tile_size_log2 = 31u;
83464
      v_width_in_tiles = 1u;
83465
    }
83466
    while (v_p < v_p_max) {
83467
      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));
83468
      if (((uint64_t)(v_i)) < ((uint64_t)(a_tile_data.len))) {
83469
        v_hg = ((uint32_t)(a_tile_data.ptr[((uint64_t)(v_i))]));
83470
      }
83471
      v_h = ((uint32_t)(WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[0u]));
83472
      while (true) {
83473
        v_node = self->private_data.f_huffman_nodes[v_hg][v_h];
83474
        if (v_node >= 32768u) {
83475
          break;
83476
        } else if (v_node > 6265u) {
83477
          status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_huffman_code);
83478
          goto exit;
83479
        }
83480
        if (self->private_impl.f_n_bits < 1u) {
83481
          {
83482
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
83483
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
83484
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
83485
              goto suspend;
83486
            }
83487
            uint8_t t_0 = *iop_a_src++;
83488
            v_c8 = t_0;
83489
          }
83490
          self->private_impl.f_bits = ((uint32_t)(v_c8));
83491
          self->private_impl.f_n_bits = 8u;
83492
        }
83493
        v_h = (((uint32_t)(v_node)) + (self->private_impl.f_bits & 1u));
83494
        self->private_impl.f_bits >>= 1u;
83495
        self->private_impl.f_n_bits -= 1u;
83496
      }
83497
      v_pixel_g = ((uint32_t)(((uint16_t)(v_node & 32767u))));
83498
      if (v_pixel_g < 256u) {
83499
        v_color = (v_pixel_g << 8u);
83500
        v_h = ((uint32_t)(WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[1u]));
83501
        while (true) {
83502
          v_node = self->private_data.f_huffman_nodes[v_hg][v_h];
83503
          if (v_node >= 32768u) {
83504
            break;
83505
          }
83506
          if (self->private_impl.f_n_bits < 1u) {
83507
            {
83508
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
83509
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
83510
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
83511
                goto suspend;
83512
              }
83513
              uint8_t t_1 = *iop_a_src++;
83514
              v_c8 = t_1;
83515
            }
83516
            self->private_impl.f_bits = ((uint32_t)(v_c8));
83517
            self->private_impl.f_n_bits = 8u;
83518
          }
83519
          v_h = ((((uint32_t)(v_node)) & 4095u) + (self->private_impl.f_bits & 1u));
83520
          self->private_impl.f_bits >>= 1u;
83521
          self->private_impl.f_n_bits -= 1u;
83522
        }
83523
        v_color |= (((uint32_t)(((uint16_t)(v_node & 255u)))) << 16u);
83524
        v_h = ((uint32_t)(WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[2u]));
83525
        while (true) {
83526
          v_node = self->private_data.f_huffman_nodes[v_hg][v_h];
83527
          if (v_node >= 32768u) {
83528
            break;
83529
          }
83530
          if (self->private_impl.f_n_bits < 1u) {
83531
            {
83532
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
83533
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
83534
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
83535
                goto suspend;
83536
              }
83537
              uint8_t t_2 = *iop_a_src++;
83538
              v_c8 = t_2;
83539
            }
83540
            self->private_impl.f_bits = ((uint32_t)(v_c8));
83541
            self->private_impl.f_n_bits = 8u;
83542
          }
83543
          v_h = ((((uint32_t)(v_node)) & 4095u) + (self->private_impl.f_bits & 1u));
83544
          self->private_impl.f_bits >>= 1u;
83545
          self->private_impl.f_n_bits -= 1u;
83546
        }
83547
        v_color |= (((uint32_t)(((uint16_t)(v_node & 255u)))) << 0u);
83548
        v_h = ((uint32_t)(WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[3u]));
83549
        while (true) {
83550
          v_node = self->private_data.f_huffman_nodes[v_hg][v_h];
83551
          if (v_node >= 32768u) {
83552
            break;
83553
          }
83554
          if (self->private_impl.f_n_bits < 1u) {
83555
            {
83556
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
83557
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
83558
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
83559
                goto suspend;
83560
              }
83561
              uint8_t t_3 = *iop_a_src++;
83562
              v_c8 = t_3;
83563
            }
83564
            self->private_impl.f_bits = ((uint32_t)(v_c8));
83565
            self->private_impl.f_n_bits = 8u;
83566
          }
83567
          v_h = ((((uint32_t)(v_node)) & 4095u) + (self->private_impl.f_bits & 1u));
83568
          self->private_impl.f_bits >>= 1u;
83569
          self->private_impl.f_n_bits -= 1u;
83570
        }
83571
        v_color |= (((uint32_t)(((uint16_t)(v_node & 255u)))) << 24u);
83572
      } else if (v_pixel_g < 280u) {
83573
        if (v_pixel_g < 260u) {
83574
          v_back_ref_len_minus_1 = (v_pixel_g - 256u);
83575
        } else {
83576
          v_back_ref_len_n_bits = ((v_pixel_g - 258u) >> 1u);
83577
          v_back_ref_len_minus_1 = ((((uint32_t)(2u)) + (v_pixel_g & 1u)) << v_back_ref_len_n_bits);
83578
          while (self->private_impl.f_n_bits < v_back_ref_len_n_bits) {
83579
            {
83580
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
83581
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
83582
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
83583
                goto suspend;
83584
              }
83585
              uint8_t t_4 = *iop_a_src++;
83586
              v_c8 = t_4;
83587
            }
83588
            if (self->private_impl.f_n_bits >= v_back_ref_len_n_bits) {
83589
              status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
83590
              goto exit;
83591
            }
83592
            self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
83593
            self->private_impl.f_n_bits += 8u;
83594
          }
83595
          v_back_ref_len_minus_1 += (self->private_impl.f_bits & ((((uint32_t)(1u)) << v_back_ref_len_n_bits) - 1u));
83596
          self->private_impl.f_bits >>= v_back_ref_len_n_bits;
83597
          self->private_impl.f_n_bits -= v_back_ref_len_n_bits;
83598
        }
83599
        v_h = ((uint32_t)(WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[4u]));
83600
        while (true) {
83601
          v_node = self->private_data.f_huffman_nodes[v_hg][v_h];
83602
          if (v_node >= 32768u) {
83603
            break;
83604
          }
83605
          if (self->private_impl.f_n_bits < 1u) {
83606
            {
83607
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
83608
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
83609
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
83610
                goto suspend;
83611
              }
83612
              uint8_t t_5 = *iop_a_src++;
83613
              v_c8 = t_5;
83614
            }
83615
            self->private_impl.f_bits = ((uint32_t)(v_c8));
83616
            self->private_impl.f_n_bits = 8u;
83617
          }
83618
          v_h = ((((uint32_t)(v_node)) & 4095u) + (self->private_impl.f_bits & 1u));
83619
          self->private_impl.f_bits >>= 1u;
83620
          self->private_impl.f_n_bits -= 1u;
83621
        }
83622
        v_back_ref_dist_sym = ((uint32_t)(((uint16_t)(v_node & 32767u))));
83623
        if (v_back_ref_dist_sym < 4u) {
83624
          v_back_ref_dist_premap_minus_1 = v_back_ref_dist_sym;
83625
        } else if (v_back_ref_dist_sym < 40u) {
83626
          v_back_ref_dist_n_bits = ((v_back_ref_dist_sym - 2u) >> 1u);
83627
          v_back_ref_dist_premap_minus_1 = ((((uint32_t)(2u)) + (v_back_ref_dist_sym & 1u)) << v_back_ref_dist_n_bits);
83628
          while (self->private_impl.f_n_bits < v_back_ref_dist_n_bits) {
83629
            {
83630
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
83631
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
83632
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
83633
                goto suspend;
83634
              }
83635
              uint8_t t_6 = *iop_a_src++;
83636
              v_c8 = t_6;
83637
            }
83638
            if (self->private_impl.f_n_bits >= v_back_ref_dist_n_bits) {
83639
              status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
83640
              goto exit;
83641
            }
83642
            self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
83643
            self->private_impl.f_n_bits += 8u;
83644
          }
83645
          v_back_ref_dist_premap_minus_1 += (self->private_impl.f_bits & ((((uint32_t)(1u)) << v_back_ref_dist_n_bits) - 1u));
83646
          self->private_impl.f_bits >>= v_back_ref_dist_n_bits;
83647
          self->private_impl.f_n_bits -= v_back_ref_dist_n_bits;
83648
        }
83649
        if (v_back_ref_dist_premap_minus_1 >= 120u) {
83650
          v_back_ref_dist_minus_1 = (v_back_ref_dist_premap_minus_1 - 120u);
83651
        } else {
83652
          v_dm = ((uint32_t)(WUFFS_WEBP__DISTANCE_MAP[v_back_ref_dist_premap_minus_1]));
83653
          v_dy = (v_dm >> 4u);
83654
          v_dx = ((uint32_t)(7u - (v_dm & 15u)));
83655
          v_back_ref_dist_minus_1 = ((uint32_t)((a_width * v_dy) + v_dx));
83656
        }
83657
        v_p_end = (v_p + ((uint64_t)(((v_back_ref_len_minus_1 + 1u) * 4u))));
83658
        v_dist4 = ((((uint64_t)(v_back_ref_dist_minus_1)) * 4u) + 4u);
83659
        if ((v_p_end > v_p_max) || (v_p_end > ((uint64_t)(a_dst.len))) || (v_p < v_dist4)) {
83660
          status = wuffs_base__make_status(wuffs_webp__error__bad_back_reference);
83661
          goto exit;
83662
        }
83663
        v_q = (v_p - v_dist4);
83664
        while ((v_q < v_p) && (v_p < v_p_end)) {
83665
          a_dst.ptr[v_p] = a_dst.ptr[v_q];
83666
          v_p += 1u;
83667
          v_q += 1u;
83668
        }
83669
        v_x += (v_back_ref_len_minus_1 + 1u);
83670
        while (v_x >= a_width) {
83671
          v_x -= a_width;
83672
          v_y += 1u;
83673
        }
83674
        continue;
83675
      } else {
83676
        if ((v_color_cache_p > v_p) || (v_p > ((uint64_t)(a_dst.len)))) {
83677
          status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_dst_buffer);
83678
          goto exit;
83679
        }
83680
        v_color_cache_pixels = wuffs_base__slice_u8__subslice_ij(a_dst, v_color_cache_p, v_p);
83681
        v_color_cache_p = v_p;
83682
        v_color_cache_shift = ((32u - self->private_impl.f_color_cache_bits) & 31u);
83683
        while (((uint64_t)(v_color_cache_pixels.len)) >= 4u) {
83684
          v_color = wuffs_base__peek_u32le__no_bounds_check(v_color_cache_pixels.ptr);
83685
          self->private_data.f_color_cache[((((uint32_t)(v_color * 506832829u)) >> v_color_cache_shift) & 2047u)] = v_color;
83686
          v_color_cache_pixels = wuffs_base__slice_u8__subslice_i(v_color_cache_pixels, 4u);
83687
        }
83688
        v_color = self->private_data.f_color_cache[((v_pixel_g - 280u) & 2047u)];
83689
      }
83690
      if (v_p > ((uint64_t)(a_dst.len))) {
83691
        status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_dst_buffer);
83692
        goto exit;
83693
      }
83694
      v_dst_pixel = wuffs_base__slice_u8__subslice_i(a_dst, v_p);
83695
      if (((uint64_t)(v_dst_pixel.len)) < 4u) {
83696
        status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_dst_buffer);
83697
        goto exit;
83698
      }
83699
      wuffs_base__poke_u32le__no_bounds_check(v_dst_pixel.ptr, v_color);
83700
      v_p += 4u;
83701
      v_x += 1u;
83702
      if (v_x == a_width) {
83703
        v_x = 0u;
83704
        v_y += 1u;
83705
      }
83706
    }
83707
83708
    goto ok;
83709
    ok:
83710
    self->private_impl.p_decode_pixels_slow = 0;
83711
    goto exit;
83712
  }
83713
83714
  goto suspend;
83715
  suspend:
83716
  self->private_impl.p_decode_pixels_slow = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
83717
  self->private_data.s_decode_pixels_slow.v_p = v_p;
83718
  self->private_data.s_decode_pixels_slow.v_p_max = v_p_max;
83719
  self->private_data.s_decode_pixels_slow.v_tile_size_log2 = v_tile_size_log2;
83720
  self->private_data.s_decode_pixels_slow.v_width_in_tiles = v_width_in_tiles;
83721
  self->private_data.s_decode_pixels_slow.v_x = v_x;
83722
  self->private_data.s_decode_pixels_slow.v_y = v_y;
83723
  self->private_data.s_decode_pixels_slow.v_hg = v_hg;
83724
  self->private_data.s_decode_pixels_slow.v_node = v_node;
83725
  self->private_data.s_decode_pixels_slow.v_color = v_color;
83726
  self->private_data.s_decode_pixels_slow.v_back_ref_len_n_bits = v_back_ref_len_n_bits;
83727
  self->private_data.s_decode_pixels_slow.v_back_ref_len_minus_1 = v_back_ref_len_minus_1;
83728
  self->private_data.s_decode_pixels_slow.v_back_ref_dist_n_bits = v_back_ref_dist_n_bits;
83729
  self->private_data.s_decode_pixels_slow.v_back_ref_dist_premap_minus_1 = v_back_ref_dist_premap_minus_1;
83730
  self->private_data.s_decode_pixels_slow.v_color_cache_p = v_color_cache_p;
83731
83732
  goto exit;
83733
  exit:
83734
  if (a_src && a_src->data.ptr) {
83735
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
83736
  }
83737
83738
  return status;
83739
}
83740
83741
// -------- func webp.decoder.apply_transform_predictor
83742
83743
WUFFS_BASE__GENERATED_C_CODE
83744
static wuffs_base__empty_struct
83745
wuffs_webp__decoder__apply_transform_predictor(
83746
    wuffs_webp__decoder* self,
83747
    wuffs_base__slice_u8 a_pix,
83748
    wuffs_base__slice_u8 a_tile_data) {
83749
  uint64_t v_w4 = 0;
83750
  wuffs_base__slice_u8 v_prev_row = {0};
83751
  wuffs_base__slice_u8 v_curr_row = {0};
83752
  uint32_t v_tile_size_log2 = 0;
83753
  uint32_t v_tiles_per_row = 0;
83754
  uint32_t v_mask = 0;
83755
  uint32_t v_y = 0;
83756
  uint32_t v_x = 0;
83757
  uint64_t v_t = 0;
83758
  wuffs_base__slice_u8 v_tile_data = {0};
83759
  uint8_t v_mode = 0;
83760
  uint32_t v_l0 = 0;
83761
  uint32_t v_l1 = 0;
83762
  uint32_t v_l2 = 0;
83763
  uint32_t v_l3 = 0;
83764
  uint32_t v_c0 = 0;
83765
  uint32_t v_c1 = 0;
83766
  uint32_t v_c2 = 0;
83767
  uint32_t v_c3 = 0;
83768
  uint32_t v_t0 = 0;
83769
  uint32_t v_t1 = 0;
83770
  uint32_t v_t2 = 0;
83771
  uint32_t v_t3 = 0;
83772
  uint32_t v_sum_l = 0;
83773
  uint32_t v_sum_t = 0;
83774
83775
  if ((self->private_impl.f_width <= 0u) || (self->private_impl.f_height <= 0u)) {
83776
    return wuffs_base__make_empty_struct();
83777
  }
83778
  v_w4 = ((uint64_t)((self->private_impl.f_width * 4u)));
83779
  v_curr_row = wuffs_base__utility__empty_slice_u8();
83780
  if (v_w4 <= ((uint64_t)(a_pix.len))) {
83781
    v_curr_row = wuffs_base__slice_u8__subslice_j(a_pix, v_w4);
83782
  }
83783
  if (((uint64_t)(v_curr_row.len)) >= 4u) {
83784
#if defined(__GNUC__)
83785
#pragma GCC diagnostic push
83786
#pragma GCC diagnostic ignored "-Wconversion"
83787
#endif
83788
    v_curr_row.ptr[3u] += 255u;
83789
#if defined(__GNUC__)
83790
#pragma GCC diagnostic pop
83791
#endif
83792
  }
83793
  while (((uint64_t)(v_curr_row.len)) >= 8u) {
83794
#if defined(__GNUC__)
83795
#pragma GCC diagnostic push
83796
#pragma GCC diagnostic ignored "-Wconversion"
83797
#endif
83798
    v_curr_row.ptr[4u] += v_curr_row.ptr[0u];
83799
    v_curr_row.ptr[5u] += v_curr_row.ptr[1u];
83800
    v_curr_row.ptr[6u] += v_curr_row.ptr[2u];
83801
    v_curr_row.ptr[7u] += v_curr_row.ptr[3u];
83802
#if defined(__GNUC__)
83803
#pragma GCC diagnostic pop
83804
#endif
83805
    v_curr_row = wuffs_base__slice_u8__subslice_i(v_curr_row, 4u);
83806
  }
83807
  v_tile_size_log2 = ((uint32_t)(self->private_impl.f_transform_tile_size_log2[0u]));
83808
  v_tiles_per_row = ((self->private_impl.f_width + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2);
83809
  v_mask = ((((uint32_t)(1u)) << v_tile_size_log2) - 1u);
83810
  v_y = 1u;
83811
  while (v_y < self->private_impl.f_height) {
83812
    v_t = ((uint64_t)((4u * (v_y >> v_tile_size_log2) * v_tiles_per_row)));
83813
    v_tile_data = wuffs_base__utility__empty_slice_u8();
83814
    if (v_t <= ((uint64_t)(a_tile_data.len))) {
83815
      v_tile_data = wuffs_base__slice_u8__subslice_i(a_tile_data, v_t);
83816
      if (((uint64_t)(v_tile_data.len)) >= 4u) {
83817
        v_mode = ((uint8_t)(v_tile_data.ptr[1u] & 15u));
83818
        v_tile_data = wuffs_base__slice_u8__subslice_i(v_tile_data, 4u);
83819
      }
83820
    }
83821
    if (v_w4 <= ((uint64_t)(a_pix.len))) {
83822
      v_prev_row = a_pix;
83823
      a_pix = wuffs_base__slice_u8__subslice_i(a_pix, v_w4);
83824
      v_curr_row = a_pix;
83825
    }
83826
    if ((((uint64_t)(v_prev_row.len)) >= 4u) && (((uint64_t)(v_curr_row.len)) >= 4u)) {
83827
#if defined(__GNUC__)
83828
#pragma GCC diagnostic push
83829
#pragma GCC diagnostic ignored "-Wconversion"
83830
#endif
83831
      v_curr_row.ptr[0u] += v_prev_row.ptr[0u];
83832
      v_curr_row.ptr[1u] += v_prev_row.ptr[1u];
83833
      v_curr_row.ptr[2u] += v_prev_row.ptr[2u];
83834
      v_curr_row.ptr[3u] += v_prev_row.ptr[3u];
83835
#if defined(__GNUC__)
83836
#pragma GCC diagnostic pop
83837
#endif
83838
    }
83839
    v_x = 1u;
83840
    while (v_x < self->private_impl.f_width) {
83841
      if (((v_x & v_mask) == 0u) && (((uint64_t)(v_tile_data.len)) >= 4u)) {
83842
        v_mode = ((uint8_t)(v_tile_data.ptr[1u] & 15u));
83843
        v_tile_data = wuffs_base__slice_u8__subslice_i(v_tile_data, 4u);
83844
      }
83845
      if ((((uint64_t)(v_prev_row.len)) < 12u) || (((uint64_t)(v_curr_row.len)) < 8u)) {
83846
        break;
83847
      }
83848
      if (v_mode == 0u) {
83849
#if defined(__GNUC__)
83850
#pragma GCC diagnostic push
83851
#pragma GCC diagnostic ignored "-Wconversion"
83852
#endif
83853
        v_curr_row.ptr[7u] += 255u;
83854
#if defined(__GNUC__)
83855
#pragma GCC diagnostic pop
83856
#endif
83857
      } else if (v_mode == 1u) {
83858
#if defined(__GNUC__)
83859
#pragma GCC diagnostic push
83860
#pragma GCC diagnostic ignored "-Wconversion"
83861
#endif
83862
        v_curr_row.ptr[4u] += v_curr_row.ptr[0u];
83863
        v_curr_row.ptr[5u] += v_curr_row.ptr[1u];
83864
        v_curr_row.ptr[6u] += v_curr_row.ptr[2u];
83865
        v_curr_row.ptr[7u] += v_curr_row.ptr[3u];
83866
#if defined(__GNUC__)
83867
#pragma GCC diagnostic pop
83868
#endif
83869
      } else if (v_mode == 2u) {
83870
#if defined(__GNUC__)
83871
#pragma GCC diagnostic push
83872
#pragma GCC diagnostic ignored "-Wconversion"
83873
#endif
83874
        v_curr_row.ptr[4u] += v_prev_row.ptr[4u];
83875
        v_curr_row.ptr[5u] += v_prev_row.ptr[5u];
83876
        v_curr_row.ptr[6u] += v_prev_row.ptr[6u];
83877
        v_curr_row.ptr[7u] += v_prev_row.ptr[7u];
83878
#if defined(__GNUC__)
83879
#pragma GCC diagnostic pop
83880
#endif
83881
      } else if (v_mode == 3u) {
83882
#if defined(__GNUC__)
83883
#pragma GCC diagnostic push
83884
#pragma GCC diagnostic ignored "-Wconversion"
83885
#endif
83886
        v_curr_row.ptr[4u] += v_prev_row.ptr[8u];
83887
        v_curr_row.ptr[5u] += v_prev_row.ptr[9u];
83888
        v_curr_row.ptr[6u] += v_prev_row.ptr[10u];
83889
        v_curr_row.ptr[7u] += v_prev_row.ptr[11u];
83890
#if defined(__GNUC__)
83891
#pragma GCC diagnostic pop
83892
#endif
83893
      } else if (v_mode == 4u) {
83894
#if defined(__GNUC__)
83895
#pragma GCC diagnostic push
83896
#pragma GCC diagnostic ignored "-Wconversion"
83897
#endif
83898
        v_curr_row.ptr[4u] += v_prev_row.ptr[0u];
83899
        v_curr_row.ptr[5u] += v_prev_row.ptr[1u];
83900
        v_curr_row.ptr[6u] += v_prev_row.ptr[2u];
83901
        v_curr_row.ptr[7u] += v_prev_row.ptr[3u];
83902
#if defined(__GNUC__)
83903
#pragma GCC diagnostic pop
83904
#endif
83905
      } else if (v_mode == 5u) {
83906
        v_l0 = ((((uint32_t)(v_curr_row.ptr[0u])) + ((uint32_t)(v_prev_row.ptr[8u]))) / 2u);
83907
        v_l1 = ((((uint32_t)(v_curr_row.ptr[1u])) + ((uint32_t)(v_prev_row.ptr[9u]))) / 2u);
83908
        v_l2 = ((((uint32_t)(v_curr_row.ptr[2u])) + ((uint32_t)(v_prev_row.ptr[10u]))) / 2u);
83909
        v_l3 = ((((uint32_t)(v_curr_row.ptr[3u])) + ((uint32_t)(v_prev_row.ptr[11u]))) / 2u);
83910
#if defined(__GNUC__)
83911
#pragma GCC diagnostic push
83912
#pragma GCC diagnostic ignored "-Wconversion"
83913
#endif
83914
        v_curr_row.ptr[4u] += ((uint8_t)(((v_l0 + ((uint32_t)(v_prev_row.ptr[4u]))) / 2u)));
83915
        v_curr_row.ptr[5u] += ((uint8_t)(((v_l1 + ((uint32_t)(v_prev_row.ptr[5u]))) / 2u)));
83916
        v_curr_row.ptr[6u] += ((uint8_t)(((v_l2 + ((uint32_t)(v_prev_row.ptr[6u]))) / 2u)));
83917
        v_curr_row.ptr[7u] += ((uint8_t)(((v_l3 + ((uint32_t)(v_prev_row.ptr[7u]))) / 2u)));
83918
#if defined(__GNUC__)
83919
#pragma GCC diagnostic pop
83920
#endif
83921
      } else if (v_mode == 6u) {
83922
#if defined(__GNUC__)
83923
#pragma GCC diagnostic push
83924
#pragma GCC diagnostic ignored "-Wconversion"
83925
#endif
83926
        v_curr_row.ptr[4u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[0u])) + ((uint32_t)(v_prev_row.ptr[0u]))) / 2u)));
83927
        v_curr_row.ptr[5u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[1u])) + ((uint32_t)(v_prev_row.ptr[1u]))) / 2u)));
83928
        v_curr_row.ptr[6u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[2u])) + ((uint32_t)(v_prev_row.ptr[2u]))) / 2u)));
83929
        v_curr_row.ptr[7u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[3u])) + ((uint32_t)(v_prev_row.ptr[3u]))) / 2u)));
83930
#if defined(__GNUC__)
83931
#pragma GCC diagnostic pop
83932
#endif
83933
      } else if (v_mode == 7u) {
83934
#if defined(__GNUC__)
83935
#pragma GCC diagnostic push
83936
#pragma GCC diagnostic ignored "-Wconversion"
83937
#endif
83938
        v_curr_row.ptr[4u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[0u])) + ((uint32_t)(v_prev_row.ptr[4u]))) / 2u)));
83939
        v_curr_row.ptr[5u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[1u])) + ((uint32_t)(v_prev_row.ptr[5u]))) / 2u)));
83940
        v_curr_row.ptr[6u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[2u])) + ((uint32_t)(v_prev_row.ptr[6u]))) / 2u)));
83941
        v_curr_row.ptr[7u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[3u])) + ((uint32_t)(v_prev_row.ptr[7u]))) / 2u)));
83942
#if defined(__GNUC__)
83943
#pragma GCC diagnostic pop
83944
#endif
83945
      } else if (v_mode == 8u) {
83946
#if defined(__GNUC__)
83947
#pragma GCC diagnostic push
83948
#pragma GCC diagnostic ignored "-Wconversion"
83949
#endif
83950
        v_curr_row.ptr[4u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[0u])) + ((uint32_t)(v_prev_row.ptr[4u]))) / 2u)));
83951
        v_curr_row.ptr[5u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[1u])) + ((uint32_t)(v_prev_row.ptr[5u]))) / 2u)));
83952
        v_curr_row.ptr[6u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[2u])) + ((uint32_t)(v_prev_row.ptr[6u]))) / 2u)));
83953
        v_curr_row.ptr[7u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[3u])) + ((uint32_t)(v_prev_row.ptr[7u]))) / 2u)));
83954
#if defined(__GNUC__)
83955
#pragma GCC diagnostic pop
83956
#endif
83957
      } else if (v_mode == 9u) {
83958
#if defined(__GNUC__)
83959
#pragma GCC diagnostic push
83960
#pragma GCC diagnostic ignored "-Wconversion"
83961
#endif
83962
        v_curr_row.ptr[4u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[4u])) + ((uint32_t)(v_prev_row.ptr[8u]))) / 2u)));
83963
        v_curr_row.ptr[5u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[5u])) + ((uint32_t)(v_prev_row.ptr[9u]))) / 2u)));
83964
        v_curr_row.ptr[6u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[6u])) + ((uint32_t)(v_prev_row.ptr[10u]))) / 2u)));
83965
        v_curr_row.ptr[7u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[7u])) + ((uint32_t)(v_prev_row.ptr[11u]))) / 2u)));
83966
#if defined(__GNUC__)
83967
#pragma GCC diagnostic pop
83968
#endif
83969
      } else if (v_mode == 10u) {
83970
        v_l0 = ((((uint32_t)(v_curr_row.ptr[0u])) + ((uint32_t)(v_prev_row.ptr[0u]))) / 2u);
83971
        v_l1 = ((((uint32_t)(v_curr_row.ptr[1u])) + ((uint32_t)(v_prev_row.ptr[1u]))) / 2u);
83972
        v_l2 = ((((uint32_t)(v_curr_row.ptr[2u])) + ((uint32_t)(v_prev_row.ptr[2u]))) / 2u);
83973
        v_l3 = ((((uint32_t)(v_curr_row.ptr[3u])) + ((uint32_t)(v_prev_row.ptr[3u]))) / 2u);
83974
        v_t0 = ((((uint32_t)(v_prev_row.ptr[4u])) + ((uint32_t)(v_prev_row.ptr[8u]))) / 2u);
83975
        v_t1 = ((((uint32_t)(v_prev_row.ptr[5u])) + ((uint32_t)(v_prev_row.ptr[9u]))) / 2u);
83976
        v_t2 = ((((uint32_t)(v_prev_row.ptr[6u])) + ((uint32_t)(v_prev_row.ptr[10u]))) / 2u);
83977
        v_t3 = ((((uint32_t)(v_prev_row.ptr[7u])) + ((uint32_t)(v_prev_row.ptr[11u]))) / 2u);
83978
#if defined(__GNUC__)
83979
#pragma GCC diagnostic push
83980
#pragma GCC diagnostic ignored "-Wconversion"
83981
#endif
83982
        v_curr_row.ptr[4u] += ((uint8_t)(((v_l0 + v_t0) / 2u)));
83983
        v_curr_row.ptr[5u] += ((uint8_t)(((v_l1 + v_t1) / 2u)));
83984
        v_curr_row.ptr[6u] += ((uint8_t)(((v_l2 + v_t2) / 2u)));
83985
        v_curr_row.ptr[7u] += ((uint8_t)(((v_l3 + v_t3) / 2u)));
83986
#if defined(__GNUC__)
83987
#pragma GCC diagnostic pop
83988
#endif
83989
      } else if (v_mode == 11u) {
83990
        v_l0 = ((uint32_t)(v_curr_row.ptr[0u]));
83991
        v_l1 = ((uint32_t)(v_curr_row.ptr[1u]));
83992
        v_l2 = ((uint32_t)(v_curr_row.ptr[2u]));
83993
        v_l3 = ((uint32_t)(v_curr_row.ptr[3u]));
83994
        v_c0 = ((uint32_t)(v_prev_row.ptr[0u]));
83995
        v_c1 = ((uint32_t)(v_prev_row.ptr[1u]));
83996
        v_c2 = ((uint32_t)(v_prev_row.ptr[2u]));
83997
        v_c3 = ((uint32_t)(v_prev_row.ptr[3u]));
83998
        v_t0 = ((uint32_t)(v_prev_row.ptr[4u]));
83999
        v_t1 = ((uint32_t)(v_prev_row.ptr[5u]));
84000
        v_t2 = ((uint32_t)(v_prev_row.ptr[6u]));
84001
        v_t3 = ((uint32_t)(v_prev_row.ptr[7u]));
84002
        v_sum_l = (wuffs_webp__decoder__absolute_difference(self, v_c0, v_t0) +
84003
            wuffs_webp__decoder__absolute_difference(self, v_c1, v_t1) +
84004
            wuffs_webp__decoder__absolute_difference(self, v_c2, v_t2) +
84005
            wuffs_webp__decoder__absolute_difference(self, v_c3, v_t3));
84006
        v_sum_t = (wuffs_webp__decoder__absolute_difference(self, v_c0, v_l0) +
84007
            wuffs_webp__decoder__absolute_difference(self, v_c1, v_l1) +
84008
            wuffs_webp__decoder__absolute_difference(self, v_c2, v_l2) +
84009
            wuffs_webp__decoder__absolute_difference(self, v_c3, v_l3));
84010
        if (v_sum_l < v_sum_t) {
84011
#if defined(__GNUC__)
84012
#pragma GCC diagnostic push
84013
#pragma GCC diagnostic ignored "-Wconversion"
84014
#endif
84015
          v_curr_row.ptr[4u] += ((uint8_t)(v_l0));
84016
          v_curr_row.ptr[5u] += ((uint8_t)(v_l1));
84017
          v_curr_row.ptr[6u] += ((uint8_t)(v_l2));
84018
          v_curr_row.ptr[7u] += ((uint8_t)(v_l3));
84019
#if defined(__GNUC__)
84020
#pragma GCC diagnostic pop
84021
#endif
84022
        } else {
84023
#if defined(__GNUC__)
84024
#pragma GCC diagnostic push
84025
#pragma GCC diagnostic ignored "-Wconversion"
84026
#endif
84027
          v_curr_row.ptr[4u] += ((uint8_t)(v_t0));
84028
          v_curr_row.ptr[5u] += ((uint8_t)(v_t1));
84029
          v_curr_row.ptr[6u] += ((uint8_t)(v_t2));
84030
          v_curr_row.ptr[7u] += ((uint8_t)(v_t3));
84031
#if defined(__GNUC__)
84032
#pragma GCC diagnostic pop
84033
#endif
84034
        }
84035
      } else if (v_mode == 12u) {
84036
#if defined(__GNUC__)
84037
#pragma GCC diagnostic push
84038
#pragma GCC diagnostic ignored "-Wconversion"
84039
#endif
84040
        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]);
84041
        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]);
84042
        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]);
84043
        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]);
84044
#if defined(__GNUC__)
84045
#pragma GCC diagnostic pop
84046
#endif
84047
      } else if (v_mode == 13u) {
84048
#if defined(__GNUC__)
84049
#pragma GCC diagnostic push
84050
#pragma GCC diagnostic ignored "-Wconversion"
84051
#endif
84052
        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]);
84053
        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]);
84054
        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]);
84055
        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]);
84056
#if defined(__GNUC__)
84057
#pragma GCC diagnostic pop
84058
#endif
84059
      }
84060
      v_curr_row = wuffs_base__slice_u8__subslice_i(v_curr_row, 4u);
84061
      v_prev_row = wuffs_base__slice_u8__subslice_i(v_prev_row, 4u);
84062
      v_x += 1u;
84063
    }
84064
    v_y += 1u;
84065
  }
84066
  return wuffs_base__make_empty_struct();
84067
}
84068
84069
// -------- func webp.decoder.absolute_difference
84070
84071
WUFFS_BASE__GENERATED_C_CODE
84072
static uint32_t
84073
wuffs_webp__decoder__absolute_difference(
84074
    const wuffs_webp__decoder* self,
84075
    uint32_t a_a,
84076
    uint32_t a_b) {
84077
  if (a_a < a_b) {
84078
    return (a_b - a_a);
84079
  }
84080
  return (a_a - a_b);
84081
}
84082
84083
// -------- func webp.decoder.mode12
84084
84085
WUFFS_BASE__GENERATED_C_CODE
84086
static uint8_t
84087
wuffs_webp__decoder__mode12(
84088
    const wuffs_webp__decoder* self,
84089
    uint8_t a_l,
84090
    uint8_t a_t,
84091
    uint8_t a_tl) {
84092
  uint32_t v_v = 0;
84093
84094
  v_v = ((uint32_t)((((uint32_t)(a_l)) + ((uint32_t)(a_t))) - ((uint32_t)(a_tl))));
84095
  if (v_v < 256u) {
84096
    return ((uint8_t)(v_v));
84097
  } else if (v_v < 512u) {
84098
    return 255u;
84099
  }
84100
  return 0u;
84101
}
84102
84103
// -------- func webp.decoder.mode13
84104
84105
WUFFS_BASE__GENERATED_C_CODE
84106
static uint8_t
84107
wuffs_webp__decoder__mode13(
84108
    const wuffs_webp__decoder* self,
84109
    uint8_t a_l,
84110
    uint8_t a_t,
84111
    uint8_t a_tl) {
84112
  uint32_t v_x = 0;
84113
  uint32_t v_y = 0;
84114
  uint32_t v_z = 0;
84115
  uint32_t v_v = 0;
84116
84117
  v_x = ((((uint32_t)(a_l)) + ((uint32_t)(a_t))) / 2u);
84118
  v_y = ((uint32_t)(a_tl));
84119
  v_z = ((uint32_t)(v_x - v_y));
84120
  v_v = ((uint32_t)(v_x + wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(v_z + (v_z >> 31u))), 1u)));
84121
  if (v_v < 256u) {
84122
    return ((uint8_t)(v_v));
84123
  } else if (v_v < 512u) {
84124
    return 255u;
84125
  }
84126
  return 0u;
84127
}
84128
84129
// -------- func webp.decoder.apply_transform_cross_color
84130
84131
WUFFS_BASE__GENERATED_C_CODE
84132
static wuffs_base__empty_struct
84133
wuffs_webp__decoder__apply_transform_cross_color(
84134
    wuffs_webp__decoder* self,
84135
    wuffs_base__slice_u8 a_pix,
84136
    wuffs_base__slice_u8 a_tile_data) {
84137
  uint32_t v_tile_size_log2 = 0;
84138
  uint32_t v_tiles_per_row = 0;
84139
  uint32_t v_mask = 0;
84140
  uint32_t v_y = 0;
84141
  uint32_t v_x = 0;
84142
  uint64_t v_t = 0;
84143
  wuffs_base__slice_u8 v_tile_data = {0};
84144
  uint32_t v_g2r = 0;
84145
  uint32_t v_g2b = 0;
84146
  uint32_t v_r2b = 0;
84147
  uint8_t v_b = 0;
84148
  uint8_t v_g = 0;
84149
  uint8_t v_r = 0;
84150
84151
  v_tile_size_log2 = ((uint32_t)(self->private_impl.f_transform_tile_size_log2[1u]));
84152
  v_tiles_per_row = ((self->private_impl.f_width + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2);
84153
  v_mask = ((((uint32_t)(1u)) << v_tile_size_log2) - 1u);
84154
  v_y = 0u;
84155
  while (v_y < self->private_impl.f_height) {
84156
    v_t = ((uint64_t)((4u * (v_y >> v_tile_size_log2) * v_tiles_per_row)));
84157
    v_tile_data = wuffs_base__utility__empty_slice_u8();
84158
    if (v_t <= ((uint64_t)(a_tile_data.len))) {
84159
      v_tile_data = wuffs_base__slice_u8__subslice_i(a_tile_data, v_t);
84160
    }
84161
    v_x = 0u;
84162
    while (v_x < self->private_impl.f_width) {
84163
      if (((v_x & v_mask) == 0u) && (((uint64_t)(v_tile_data.len)) >= 4u)) {
84164
        v_g2r = wuffs_base__utility__sign_extend_convert_u8_u32(v_tile_data.ptr[0u]);
84165
        v_g2b = wuffs_base__utility__sign_extend_convert_u8_u32(v_tile_data.ptr[1u]);
84166
        v_r2b = wuffs_base__utility__sign_extend_convert_u8_u32(v_tile_data.ptr[2u]);
84167
        v_tile_data = wuffs_base__slice_u8__subslice_i(v_tile_data, 4u);
84168
      }
84169
      if (((uint64_t)(a_pix.len)) >= 4u) {
84170
        v_b = a_pix.ptr[0u];
84171
        v_g = a_pix.ptr[1u];
84172
        v_r = a_pix.ptr[2u];
84173
#if defined(__GNUC__)
84174
#pragma GCC diagnostic push
84175
#pragma GCC diagnostic ignored "-Wconversion"
84176
#endif
84177
        v_r += ((uint8_t)((((uint32_t)(wuffs_base__utility__sign_extend_convert_u8_u32(v_g) * v_g2r)) >> 5u)));
84178
        v_b += ((uint8_t)((((uint32_t)(wuffs_base__utility__sign_extend_convert_u8_u32(v_g) * v_g2b)) >> 5u)));
84179
        v_b += ((uint8_t)((((uint32_t)(wuffs_base__utility__sign_extend_convert_u8_u32(v_r) * v_r2b)) >> 5u)));
84180
#if defined(__GNUC__)
84181
#pragma GCC diagnostic pop
84182
#endif
84183
        a_pix.ptr[0u] = v_b;
84184
        a_pix.ptr[2u] = v_r;
84185
        a_pix = wuffs_base__slice_u8__subslice_i(a_pix, 4u);
84186
      }
84187
      v_x += 1u;
84188
    }
84189
    v_y += 1u;
84190
  }
84191
  return wuffs_base__make_empty_struct();
84192
}
84193
84194
// -------- func webp.decoder.apply_transform_subtract_green
84195
84196
WUFFS_BASE__GENERATED_C_CODE
84197
static wuffs_base__empty_struct
84198
wuffs_webp__decoder__apply_transform_subtract_green(
84199
    wuffs_webp__decoder* self,
84200
    wuffs_base__slice_u8 a_pix) {
84201
  wuffs_base__slice_u8 v_p = {0};
84202
  uint8_t v_g = 0;
84203
84204
  {
84205
    wuffs_base__slice_u8 i_slice_p = a_pix;
84206
    v_p.ptr = i_slice_p.ptr;
84207
    v_p.len = 4;
84208
    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));
84209
    while (v_p.ptr < i_end0_p) {
84210
      v_g = v_p.ptr[1u];
84211
#if defined(__GNUC__)
84212
#pragma GCC diagnostic push
84213
#pragma GCC diagnostic ignored "-Wconversion"
84214
#endif
84215
      v_p.ptr[0u] += v_g;
84216
      v_p.ptr[2u] += v_g;
84217
#if defined(__GNUC__)
84218
#pragma GCC diagnostic pop
84219
#endif
84220
      v_p.ptr += 4;
84221
    }
84222
    v_p.len = 0;
84223
  }
84224
  return wuffs_base__make_empty_struct();
84225
}
84226
84227
// -------- func webp.decoder.apply_transform_color_indexing
84228
84229
WUFFS_BASE__GENERATED_C_CODE
84230
static wuffs_base__empty_struct
84231
wuffs_webp__decoder__apply_transform_color_indexing(
84232
    wuffs_webp__decoder* self,
84233
    wuffs_base__slice_u8 a_pix) {
84234
  uint32_t v_tile_size_log2 = 0;
84235
  uint32_t v_bits_per_pixel = 0;
84236
  uint32_t v_x_mask = 0;
84237
  uint32_t v_s_mask = 0;
84238
  uint64_t v_src_index = 0;
84239
  uint32_t v_y = 0;
84240
  uint64_t v_di = 0;
84241
  uint64_t v_dj = 0;
84242
  wuffs_base__slice_u8 v_dst = {0};
84243
  uint32_t v_x = 0;
84244
  uint32_t v_s = 0;
84245
  uint32_t v_p = 0;
84246
  uint8_t v_p0 = 0;
84247
  uint8_t v_p1 = 0;
84248
  uint8_t v_p2 = 0;
84249
  uint8_t v_p3 = 0;
84250
84251
  v_tile_size_log2 = ((uint32_t)(self->private_impl.f_transform_tile_size_log2[3u]));
84252
  if (v_tile_size_log2 == 0u) {
84253
    {
84254
      wuffs_base__slice_u8 i_slice_dst = a_pix;
84255
      v_dst.ptr = i_slice_dst.ptr;
84256
      v_dst.len = 4;
84257
      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));
84258
      while (v_dst.ptr < i_end0_dst) {
84259
        v_p = (((uint32_t)(v_dst.ptr[1u])) * 4u);
84260
        v_p0 = self->private_data.f_palette[(v_p + 0u)];
84261
        v_p1 = self->private_data.f_palette[(v_p + 1u)];
84262
        v_p2 = self->private_data.f_palette[(v_p + 2u)];
84263
        v_p3 = self->private_data.f_palette[(v_p + 3u)];
84264
        v_dst.ptr[0u] = v_p0;
84265
        v_dst.ptr[1u] = v_p1;
84266
        v_dst.ptr[2u] = v_p2;
84267
        v_dst.ptr[3u] = v_p3;
84268
        v_dst.ptr += 4;
84269
      }
84270
      v_dst.len = 0;
84271
    }
84272
    return wuffs_base__make_empty_struct();
84273
  }
84274
  v_bits_per_pixel = (((uint32_t)(8u)) >> v_tile_size_log2);
84275
  v_x_mask = ((((uint32_t)(1u)) << v_tile_size_log2) - 1u);
84276
  v_s_mask = ((((uint32_t)(1u)) << v_bits_per_pixel) - 1u);
84277
  v_src_index = ((uint64_t)((self->private_impl.f_workbuf_offset_for_color_indexing + 1u)));
84278
  v_y = 0u;
84279
  while (v_y < self->private_impl.f_height) {
84280
    v_di = ((uint64_t)((4u * (v_y + 0u) * self->private_impl.f_width)));
84281
    v_dj = ((uint64_t)((4u * (v_y + 1u) * self->private_impl.f_width)));
84282
    if ((v_di > v_dj) || (v_dj > ((uint64_t)(a_pix.len)))) {
84283
      break;
84284
    }
84285
    v_dst = wuffs_base__slice_u8__subslice_ij(a_pix, v_di, v_dj);
84286
    v_x = 0u;
84287
    while (((uint64_t)(v_dst.len)) >= 4u) {
84288
      if (((v_x & v_x_mask) == 0u) && (v_src_index < ((uint64_t)(a_pix.len)))) {
84289
        v_s = ((uint32_t)(a_pix.ptr[v_src_index]));
84290
        v_src_index += 4u;
84291
      }
84292
      v_p = ((v_s & v_s_mask) * 4u);
84293
      v_s >>= v_bits_per_pixel;
84294
      v_p0 = self->private_data.f_palette[(v_p + 0u)];
84295
      v_p1 = self->private_data.f_palette[(v_p + 1u)];
84296
      v_p2 = self->private_data.f_palette[(v_p + 2u)];
84297
      v_p3 = self->private_data.f_palette[(v_p + 3u)];
84298
      v_dst.ptr[0u] = v_p0;
84299
      v_dst.ptr[1u] = v_p1;
84300
      v_dst.ptr[2u] = v_p2;
84301
      v_dst.ptr[3u] = v_p3;
84302
      v_dst = wuffs_base__slice_u8__subslice_i(v_dst, 4u);
84303
      v_x += 1u;
84304
    }
84305
    v_y += 1u;
84306
  }
84307
  return wuffs_base__make_empty_struct();
84308
}
84309
84310
// -------- func webp.decoder.get_quirk
84311
84312
WUFFS_BASE__GENERATED_C_CODE
84313
WUFFS_BASE__MAYBE_STATIC uint64_t
84314
wuffs_webp__decoder__get_quirk(
84315
    const wuffs_webp__decoder* self,
84316
    uint32_t a_key) {
84317
  if (!self) {
84318
    return 0;
84319
  }
84320
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
84321
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
84322
    return 0;
84323
  }
84324
84325
  return 0u;
84326
}
84327
84328
// -------- func webp.decoder.set_quirk
84329
84330
WUFFS_BASE__GENERATED_C_CODE
84331
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
84332
wuffs_webp__decoder__set_quirk(
84333
    wuffs_webp__decoder* self,
84334
    uint32_t a_key,
84335
    uint64_t a_value) {
84336
  if (!self) {
84337
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
84338
  }
84339
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
84340
    return wuffs_base__make_status(
84341
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
84342
        ? wuffs_base__error__disabled_by_previous_error
84343
        : wuffs_base__error__initialize_not_called);
84344
  }
84345
84346
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
84347
}
84348
84349
// -------- func webp.decoder.decode_image_config
84350
84351
WUFFS_BASE__GENERATED_C_CODE
84352
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
84353
wuffs_webp__decoder__decode_image_config(
84354
    wuffs_webp__decoder* self,
84355
    wuffs_base__image_config* a_dst,
84356
    wuffs_base__io_buffer* a_src) {
84357
  if (!self) {
84358
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
84359
  }
84360
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
84361
    return wuffs_base__make_status(
84362
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
84363
        ? wuffs_base__error__disabled_by_previous_error
84364
        : wuffs_base__error__initialize_not_called);
84365
  }
84366
  if (!a_src) {
84367
    self->private_impl.magic = WUFFS_BASE__DISABLED;
84368
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
84369
  }
84370
  if ((self->private_impl.active_coroutine != 0) &&
84371
      (self->private_impl.active_coroutine != 1)) {
84372
    self->private_impl.magic = WUFFS_BASE__DISABLED;
84373
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
84374
  }
84375
  self->private_impl.active_coroutine = 0;
84376
  wuffs_base__status status = wuffs_base__make_status(NULL);
84377
84378
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
84379
84380
  uint32_t coro_susp_point = self->private_impl.p_decode_image_config;
84381
  switch (coro_susp_point) {
84382
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
84383
84384
    while (true) {
84385
      {
84386
        wuffs_base__status t_0 = wuffs_webp__decoder__do_decode_image_config(self, a_dst, a_src);
84387
        v_status = t_0;
84388
      }
84389
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
84390
        status = wuffs_base__make_status(wuffs_webp__error__truncated_input);
84391
        goto exit;
84392
      }
84393
      status = v_status;
84394
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
84395
    }
84396
84397
    ok:
84398
    self->private_impl.p_decode_image_config = 0;
84399
    goto exit;
84400
  }
84401
84402
  goto suspend;
84403
  suspend:
84404
  self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
84405
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
84406
84407
  goto exit;
84408
  exit:
84409
  if (wuffs_base__status__is_error(&status)) {
84410
    self->private_impl.magic = WUFFS_BASE__DISABLED;
84411
  }
84412
  return status;
84413
}
84414
84415
// -------- func webp.decoder.do_decode_image_config
84416
84417
WUFFS_BASE__GENERATED_C_CODE
84418
static wuffs_base__status
84419
wuffs_webp__decoder__do_decode_image_config(
84420
    wuffs_webp__decoder* self,
84421
    wuffs_base__image_config* a_dst,
84422
    wuffs_base__io_buffer* a_src) {
84423
  wuffs_base__status status = wuffs_base__make_status(NULL);
84424
84425
  uint32_t v_c32 = 0;
84426
  uint64_t v_r_mark = 0;
84427
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
84428
84429
  const uint8_t* iop_a_src = NULL;
84430
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
84431
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
84432
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
84433
  if (a_src && a_src->data.ptr) {
84434
    io0_a_src = a_src->data.ptr;
84435
    io1_a_src = io0_a_src + a_src->meta.ri;
84436
    iop_a_src = io1_a_src;
84437
    io2_a_src = io0_a_src + a_src->meta.wi;
84438
  }
84439
84440
  uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config;
84441
  switch (coro_susp_point) {
84442
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
84443
84444
    if (self->private_impl.f_call_sequence != 0u) {
84445
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
84446
      goto exit;
84447
    }
84448
    {
84449
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
84450
      uint32_t t_0;
84451
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
84452
        t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
84453
        iop_a_src += 4;
84454
      } else {
84455
        self->private_data.s_do_decode_image_config.scratch = 0;
84456
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
84457
        while (true) {
84458
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
84459
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
84460
            goto suspend;
84461
          }
84462
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
84463
          uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
84464
          *scratch <<= 8;
84465
          *scratch >>= 8;
84466
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
84467
          if (num_bits_0 == 24) {
84468
            t_0 = ((uint32_t)(*scratch));
84469
            break;
84470
          }
84471
          num_bits_0 += 8u;
84472
          *scratch |= ((uint64_t)(num_bits_0)) << 56;
84473
        }
84474
      }
84475
      v_c32 = t_0;
84476
    }
84477
    if (v_c32 != 1179011410u) {
84478
      status = wuffs_base__make_status(wuffs_webp__error__bad_header);
84479
      goto exit;
84480
    }
84481
    {
84482
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
84483
      uint32_t t_1;
84484
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
84485
        t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
84486
        iop_a_src += 4;
84487
      } else {
84488
        self->private_data.s_do_decode_image_config.scratch = 0;
84489
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
84490
        while (true) {
84491
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
84492
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
84493
            goto suspend;
84494
          }
84495
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
84496
          uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
84497
          *scratch <<= 8;
84498
          *scratch >>= 8;
84499
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
84500
          if (num_bits_1 == 24) {
84501
            t_1 = ((uint32_t)(*scratch));
84502
            break;
84503
          }
84504
          num_bits_1 += 8u;
84505
          *scratch |= ((uint64_t)(num_bits_1)) << 56;
84506
        }
84507
      }
84508
      self->private_impl.f_riff_chunk_length = t_1;
84509
    }
84510
    if ((self->private_impl.f_riff_chunk_length & 1u) != 0u) {
84511
      status = wuffs_base__make_status(wuffs_webp__error__bad_header);
84512
      goto exit;
84513
    }
84514
    while (true) {
84515
      {
84516
        const bool o_0_closed_a_src = a_src->meta.closed;
84517
        const uint8_t* o_0_io2_a_src = io2_a_src;
84518
        wuffs_private_impl__io_reader__limit(&io2_a_src, iop_a_src,
84519
            ((uint64_t)(self->private_impl.f_riff_chunk_length)));
84520
        if (a_src) {
84521
          size_t n = ((size_t)(io2_a_src - a_src->data.ptr));
84522
          a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n);
84523
          a_src->meta.wi = n;
84524
        }
84525
        v_r_mark = ((uint64_t)(iop_a_src - io0_a_src));
84526
        {
84527
          if (a_src) {
84528
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
84529
          }
84530
          wuffs_base__status t_2 = wuffs_webp__decoder__do_decode_image_config_limited(self, a_dst, a_src);
84531
          v_status = t_2;
84532
          if (a_src) {
84533
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
84534
          }
84535
        }
84536
        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))))));
84537
        io2_a_src = o_0_io2_a_src;
84538
        if (a_src) {
84539
          a_src->meta.closed = o_0_closed_a_src;
84540
          a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr));
84541
        }
84542
      }
84543
      if (wuffs_base__status__is_ok(&v_status)) {
84544
        break;
84545
      } else if ( ! wuffs_base__status__is_suspension(&v_status)) {
84546
        status = v_status;
84547
        if (wuffs_base__status__is_error(&status)) {
84548
          goto exit;
84549
        } else if (wuffs_base__status__is_suspension(&status)) {
84550
          status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
84551
          goto exit;
84552
        }
84553
        goto ok;
84554
      } else if ((v_status.repr == wuffs_base__suspension__short_read) && (self->private_impl.f_riff_chunk_length == 0u)) {
84555
        status = wuffs_base__make_status(wuffs_webp__error__short_chunk);
84556
        goto exit;
84557
      }
84558
      status = v_status;
84559
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5);
84560
    }
84561
    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)));
84562
    if ( ! self->private_impl.f_is_vp8_lossy && (a_dst != NULL)) {
84563
      wuffs_base__image_config__set(
84564
          a_dst,
84565
          self->private_impl.f_pixfmt,
84566
          0u,
84567
          self->private_impl.f_width,
84568
          self->private_impl.f_height,
84569
          self->private_impl.f_frame_config_io_position,
84570
          false);
84571
    }
84572
    self->private_impl.f_call_sequence = 32u;
84573
84574
    ok:
84575
    self->private_impl.p_do_decode_image_config = 0;
84576
    goto exit;
84577
  }
84578
84579
  goto suspend;
84580
  suspend:
84581
  self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
84582
84583
  goto exit;
84584
  exit:
84585
  if (a_src && a_src->data.ptr) {
84586
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
84587
  }
84588
84589
  return status;
84590
}
84591
84592
// -------- func webp.decoder.do_decode_image_config_limited
84593
84594
WUFFS_BASE__GENERATED_C_CODE
84595
static wuffs_base__status
84596
wuffs_webp__decoder__do_decode_image_config_limited(
84597
    wuffs_webp__decoder* self,
84598
    wuffs_base__image_config* a_dst,
84599
    wuffs_base__io_buffer* a_src) {
84600
  wuffs_base__status status = wuffs_base__make_status(NULL);
84601
84602
  uint32_t v_c32 = 0;
84603
  uint64_t v_r_mark = 0;
84604
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
84605
84606
  const uint8_t* iop_a_src = NULL;
84607
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
84608
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
84609
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
84610
  if (a_src && a_src->data.ptr) {
84611
    io0_a_src = a_src->data.ptr;
84612
    io1_a_src = io0_a_src + a_src->meta.ri;
84613
    iop_a_src = io1_a_src;
84614
    io2_a_src = io0_a_src + a_src->meta.wi;
84615
  }
84616
84617
  uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config_limited;
84618
  switch (coro_susp_point) {
84619
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
84620
84621
    {
84622
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
84623
      uint32_t t_0;
84624
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
84625
        t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
84626
        iop_a_src += 4;
84627
      } else {
84628
        self->private_data.s_do_decode_image_config_limited.scratch = 0;
84629
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
84630
        while (true) {
84631
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
84632
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
84633
            goto suspend;
84634
          }
84635
          uint64_t* scratch = &self->private_data.s_do_decode_image_config_limited.scratch;
84636
          uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
84637
          *scratch <<= 8;
84638
          *scratch >>= 8;
84639
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
84640
          if (num_bits_0 == 24) {
84641
            t_0 = ((uint32_t)(*scratch));
84642
            break;
84643
          }
84644
          num_bits_0 += 8u;
84645
          *scratch |= ((uint64_t)(num_bits_0)) << 56;
84646
        }
84647
      }
84648
      v_c32 = t_0;
84649
    }
84650
    if (v_c32 != 1346520407u) {
84651
      status = wuffs_base__make_status(wuffs_webp__error__bad_header);
84652
      goto exit;
84653
    }
84654
    {
84655
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
84656
      uint32_t t_1;
84657
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
84658
        t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
84659
        iop_a_src += 4;
84660
      } else {
84661
        self->private_data.s_do_decode_image_config_limited.scratch = 0;
84662
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
84663
        while (true) {
84664
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
84665
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
84666
            goto suspend;
84667
          }
84668
          uint64_t* scratch = &self->private_data.s_do_decode_image_config_limited.scratch;
84669
          uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
84670
          *scratch <<= 8;
84671
          *scratch >>= 8;
84672
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
84673
          if (num_bits_1 == 24) {
84674
            t_1 = ((uint32_t)(*scratch));
84675
            break;
84676
          }
84677
          num_bits_1 += 8u;
84678
          *scratch |= ((uint64_t)(num_bits_1)) << 56;
84679
        }
84680
      }
84681
      v_c32 = t_1;
84682
    }
84683
    if (v_c32 == 540561494u) {
84684
      self->private_impl.f_is_vp8_lossy = true;
84685
    } else if (v_c32 == 1278758998u) {
84686
    } else if (v_c32 == 1480085590u) {
84687
      status = wuffs_base__make_status(wuffs_webp__error__unsupported_webp_file);
84688
      goto exit;
84689
    } else {
84690
      status = wuffs_base__make_status(wuffs_webp__error__bad_header);
84691
      goto exit;
84692
    }
84693
    {
84694
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
84695
      uint32_t t_2;
84696
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
84697
        t_2 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
84698
        iop_a_src += 4;
84699
      } else {
84700
        self->private_data.s_do_decode_image_config_limited.scratch = 0;
84701
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
84702
        while (true) {
84703
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
84704
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
84705
            goto suspend;
84706
          }
84707
          uint64_t* scratch = &self->private_data.s_do_decode_image_config_limited.scratch;
84708
          uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56));
84709
          *scratch <<= 8;
84710
          *scratch >>= 8;
84711
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2;
84712
          if (num_bits_2 == 24) {
84713
            t_2 = ((uint32_t)(*scratch));
84714
            break;
84715
          }
84716
          num_bits_2 += 8u;
84717
          *scratch |= ((uint64_t)(num_bits_2)) << 56;
84718
        }
84719
      }
84720
      self->private_impl.f_sub_chunk_length = t_2;
84721
    }
84722
    if (self->private_impl.f_sub_chunk_length < 4u) {
84723
      status = wuffs_base__make_status(wuffs_webp__error__bad_header);
84724
      goto exit;
84725
    }
84726
    self->private_impl.f_sub_chunk_has_padding = ((self->private_impl.f_sub_chunk_length & 1u) != 0u);
84727
    while (true) {
84728
      {
84729
        const bool o_0_closed_a_src = a_src->meta.closed;
84730
        const uint8_t* o_0_io2_a_src = io2_a_src;
84731
        wuffs_private_impl__io_reader__limit(&io2_a_src, iop_a_src,
84732
            ((uint64_t)(self->private_impl.f_sub_chunk_length)));
84733
        if (a_src) {
84734
          size_t n = ((size_t)(io2_a_src - a_src->data.ptr));
84735
          a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n);
84736
          a_src->meta.wi = n;
84737
        }
84738
        v_r_mark = ((uint64_t)(iop_a_src - io0_a_src));
84739
        if (self->private_impl.f_is_vp8_lossy) {
84740
          {
84741
            if (a_src) {
84742
              a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
84743
            }
84744
            wuffs_base__status t_3 = wuffs_vp8__decoder__decode_image_config(&self->private_data.f_vp8, a_dst, a_src);
84745
            v_status = t_3;
84746
            if (a_src) {
84747
              iop_a_src = a_src->data.ptr + a_src->meta.ri;
84748
            }
84749
          }
84750
        } else {
84751
          {
84752
            if (a_src) {
84753
              a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
84754
            }
84755
            wuffs_base__status t_4 = wuffs_webp__decoder__do_decode_image_config_limited_vp8l(self, a_src);
84756
            v_status = t_4;
84757
            if (a_src) {
84758
              iop_a_src = a_src->data.ptr + a_src->meta.ri;
84759
            }
84760
          }
84761
        }
84762
        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))))));
84763
        io2_a_src = o_0_io2_a_src;
84764
        if (a_src) {
84765
          a_src->meta.closed = o_0_closed_a_src;
84766
          a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr));
84767
        }
84768
      }
84769
      if (wuffs_base__status__is_ok(&v_status)) {
84770
        break;
84771
      } else if ( ! wuffs_base__status__is_suspension(&v_status)) {
84772
        status = v_status;
84773
        if (wuffs_base__status__is_error(&status)) {
84774
          goto exit;
84775
        } else if (wuffs_base__status__is_suspension(&status)) {
84776
          status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
84777
          goto exit;
84778
        }
84779
        goto ok;
84780
      } else if ((v_status.repr == wuffs_base__suspension__short_read) && (self->private_impl.f_sub_chunk_length == 0u)) {
84781
        status = wuffs_base__make_status(wuffs_webp__error__short_chunk);
84782
        goto exit;
84783
      }
84784
      status = v_status;
84785
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7);
84786
    }
84787
84788
    ok:
84789
    self->private_impl.p_do_decode_image_config_limited = 0;
84790
    goto exit;
84791
  }
84792
84793
  goto suspend;
84794
  suspend:
84795
  self->private_impl.p_do_decode_image_config_limited = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
84796
84797
  goto exit;
84798
  exit:
84799
  if (a_src && a_src->data.ptr) {
84800
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
84801
  }
84802
84803
  return status;
84804
}
84805
84806
// -------- func webp.decoder.do_decode_image_config_limited_vp8l
84807
84808
WUFFS_BASE__GENERATED_C_CODE
84809
static wuffs_base__status
84810
wuffs_webp__decoder__do_decode_image_config_limited_vp8l(
84811
    wuffs_webp__decoder* self,
84812
    wuffs_base__io_buffer* a_src) {
84813
  wuffs_base__status status = wuffs_base__make_status(NULL);
84814
84815
  uint32_t v_c32 = 0;
84816
  uint32_t v_transform_size = 0;
84817
84818
  const uint8_t* iop_a_src = NULL;
84819
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
84820
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
84821
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
84822
  if (a_src && a_src->data.ptr) {
84823
    io0_a_src = a_src->data.ptr;
84824
    io1_a_src = io0_a_src + a_src->meta.ri;
84825
    iop_a_src = io1_a_src;
84826
    io2_a_src = io0_a_src + a_src->meta.wi;
84827
  }
84828
84829
  uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config_limited_vp8l;
84830
  switch (coro_susp_point) {
84831
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
84832
84833
    {
84834
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
84835
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
84836
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
84837
        goto suspend;
84838
      }
84839
      uint32_t t_0 = *iop_a_src++;
84840
      v_c32 = t_0;
84841
    }
84842
    if (v_c32 != 47u) {
84843
      status = wuffs_base__make_status(wuffs_webp__error__bad_header);
84844
      goto exit;
84845
    }
84846
    {
84847
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
84848
      uint32_t t_1;
84849
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
84850
        t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
84851
        iop_a_src += 4;
84852
      } else {
84853
        self->private_data.s_do_decode_image_config_limited_vp8l.scratch = 0;
84854
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
84855
        while (true) {
84856
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
84857
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
84858
            goto suspend;
84859
          }
84860
          uint64_t* scratch = &self->private_data.s_do_decode_image_config_limited_vp8l.scratch;
84861
          uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
84862
          *scratch <<= 8;
84863
          *scratch >>= 8;
84864
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
84865
          if (num_bits_1 == 24) {
84866
            t_1 = ((uint32_t)(*scratch));
84867
            break;
84868
          }
84869
          num_bits_1 += 8u;
84870
          *scratch |= ((uint64_t)(num_bits_1)) << 56;
84871
        }
84872
      }
84873
      v_c32 = t_1;
84874
    }
84875
    self->private_impl.f_width = ((v_c32 & 16383u) + 1u);
84876
    v_c32 >>= 14u;
84877
    self->private_impl.f_height = ((v_c32 & 16383u) + 1u);
84878
    v_c32 >>= 14u;
84879
    self->private_impl.f_pixfmt = 2415954056u;
84880
    if ((v_c32 & 1u) != 0u) {
84881
      self->private_impl.f_pixfmt = 2164295816u;
84882
    }
84883
    v_c32 >>= 1u;
84884
    if (v_c32 != 0u) {
84885
      status = wuffs_base__make_status(wuffs_webp__error__bad_header);
84886
      goto exit;
84887
    }
84888
    v_transform_size = (4u * ((self->private_impl.f_width + 3u) >> 2u) * ((self->private_impl.f_height + 3u) >> 2u));
84889
    self->private_impl.f_workbuf_offset_for_transform[0u] = ((4u * self->private_impl.f_width * self->private_impl.f_height) + (0u * v_transform_size));
84890
    self->private_impl.f_workbuf_offset_for_transform[1u] = ((4u * self->private_impl.f_width * self->private_impl.f_height) + (1u * v_transform_size));
84891
    self->private_impl.f_workbuf_offset_for_transform[2u] = ((4u * self->private_impl.f_width * self->private_impl.f_height) + (2u * v_transform_size));
84892
    self->private_impl.f_workbuf_offset_for_transform[3u] = ((4u * self->private_impl.f_width * self->private_impl.f_height) + (3u * v_transform_size));
84893
84894
    goto ok;
84895
    ok:
84896
    self->private_impl.p_do_decode_image_config_limited_vp8l = 0;
84897
    goto exit;
84898
  }
84899
84900
  goto suspend;
84901
  suspend:
84902
  self->private_impl.p_do_decode_image_config_limited_vp8l = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
84903
84904
  goto exit;
84905
  exit:
84906
  if (a_src && a_src->data.ptr) {
84907
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
84908
  }
84909
84910
  return status;
84911
}
84912
84913
// -------- func webp.decoder.decode_frame_config
84914
84915
WUFFS_BASE__GENERATED_C_CODE
84916
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
84917
wuffs_webp__decoder__decode_frame_config(
84918
    wuffs_webp__decoder* self,
84919
    wuffs_base__frame_config* a_dst,
84920
    wuffs_base__io_buffer* a_src) {
84921
  if (!self) {
84922
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
84923
  }
84924
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
84925
    return wuffs_base__make_status(
84926
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
84927
        ? wuffs_base__error__disabled_by_previous_error
84928
        : wuffs_base__error__initialize_not_called);
84929
  }
84930
  if (!a_src) {
84931
    self->private_impl.magic = WUFFS_BASE__DISABLED;
84932
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
84933
  }
84934
  if ((self->private_impl.active_coroutine != 0) &&
84935
      (self->private_impl.active_coroutine != 2)) {
84936
    self->private_impl.magic = WUFFS_BASE__DISABLED;
84937
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
84938
  }
84939
  self->private_impl.active_coroutine = 0;
84940
  wuffs_base__status status = wuffs_base__make_status(NULL);
84941
84942
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
84943
84944
  uint32_t coro_susp_point = self->private_impl.p_decode_frame_config;
84945
  switch (coro_susp_point) {
84946
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
84947
84948
    while (true) {
84949
      if (self->private_impl.f_is_vp8_lossy) {
84950
        {
84951
          wuffs_base__status t_0 = wuffs_vp8__decoder__decode_frame_config(&self->private_data.f_vp8, a_dst, a_src);
84952
          v_status = t_0;
84953
        }
84954
      } else {
84955
        {
84956
          wuffs_base__status t_1 = wuffs_webp__decoder__do_decode_frame_config(self, a_dst, a_src);
84957
          v_status = t_1;
84958
        }
84959
      }
84960
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
84961
        status = wuffs_base__make_status(wuffs_webp__error__truncated_input);
84962
        goto exit;
84963
      }
84964
      status = v_status;
84965
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
84966
    }
84967
84968
    ok:
84969
    self->private_impl.p_decode_frame_config = 0;
84970
    goto exit;
84971
  }
84972
84973
  goto suspend;
84974
  suspend:
84975
  self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
84976
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0;
84977
84978
  goto exit;
84979
  exit:
84980
  if (wuffs_base__status__is_error(&status)) {
84981
    self->private_impl.magic = WUFFS_BASE__DISABLED;
84982
  }
84983
  return status;
84984
}
84985
84986
// -------- func webp.decoder.do_decode_frame_config
84987
84988
WUFFS_BASE__GENERATED_C_CODE
84989
static wuffs_base__status
84990
wuffs_webp__decoder__do_decode_frame_config(
84991
    wuffs_webp__decoder* self,
84992
    wuffs_base__frame_config* a_dst,
84993
    wuffs_base__io_buffer* a_src) {
84994
  wuffs_base__status status = wuffs_base__make_status(NULL);
84995
84996
  wuffs_base__pixel_format v_pixfmt = {0};
84997
84998
  const uint8_t* iop_a_src = NULL;
84999
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
85000
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
85001
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
85002
  if (a_src && a_src->data.ptr) {
85003
    io0_a_src = a_src->data.ptr;
85004
    io1_a_src = io0_a_src + a_src->meta.ri;
85005
    iop_a_src = io1_a_src;
85006
    io2_a_src = io0_a_src + a_src->meta.wi;
85007
  }
85008
85009
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config;
85010
  switch (coro_susp_point) {
85011
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
85012
85013
    if (self->private_impl.f_call_sequence == 32u) {
85014
    } else if (self->private_impl.f_call_sequence < 32u) {
85015
      if (a_src) {
85016
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
85017
      }
85018
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
85019
      status = wuffs_webp__decoder__do_decode_image_config(self, NULL, a_src);
85020
      if (a_src) {
85021
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
85022
      }
85023
      if (status.repr) {
85024
        goto suspend;
85025
      }
85026
    } else if (self->private_impl.f_call_sequence == 40u) {
85027
      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)))) {
85028
        status = wuffs_base__make_status(wuffs_base__error__bad_restart);
85029
        goto exit;
85030
      }
85031
    } else if (self->private_impl.f_call_sequence == 64u) {
85032
      self->private_impl.f_call_sequence = 96u;
85033
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
85034
      goto ok;
85035
    } else {
85036
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
85037
      goto ok;
85038
    }
85039
    if (a_dst != NULL) {
85040
      v_pixfmt = wuffs_base__utility__make_pixel_format(self->private_impl.f_pixfmt);
85041
      wuffs_base__frame_config__set(
85042
          a_dst,
85043
          wuffs_base__utility__make_rect_ie_u32(
85044
          0u,
85045
          0u,
85046
          self->private_impl.f_width,
85047
          self->private_impl.f_height),
85048
          ((wuffs_base__flicks)(0u)),
85049
          0u,
85050
          self->private_impl.f_frame_config_io_position,
85051
          0u,
85052
          false,
85053
          false,
85054
          wuffs_base__pixel_format__default_background_color(&v_pixfmt));
85055
    }
85056
    self->private_impl.f_call_sequence = 64u;
85057
85058
    ok:
85059
    self->private_impl.p_do_decode_frame_config = 0;
85060
    goto exit;
85061
  }
85062
85063
  goto suspend;
85064
  suspend:
85065
  self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
85066
85067
  goto exit;
85068
  exit:
85069
  if (a_src && a_src->data.ptr) {
85070
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
85071
  }
85072
85073
  return status;
85074
}
85075
85076
// -------- func webp.decoder.decode_frame
85077
85078
WUFFS_BASE__GENERATED_C_CODE
85079
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
85080
wuffs_webp__decoder__decode_frame(
85081
    wuffs_webp__decoder* self,
85082
    wuffs_base__pixel_buffer* a_dst,
85083
    wuffs_base__io_buffer* a_src,
85084
    wuffs_base__pixel_blend a_blend,
85085
    wuffs_base__slice_u8 a_workbuf,
85086
    wuffs_base__decode_frame_options* a_opts) {
85087
  if (!self) {
85088
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
85089
  }
85090
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
85091
    return wuffs_base__make_status(
85092
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
85093
        ? wuffs_base__error__disabled_by_previous_error
85094
        : wuffs_base__error__initialize_not_called);
85095
  }
85096
  if (!a_dst || !a_src) {
85097
    self->private_impl.magic = WUFFS_BASE__DISABLED;
85098
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
85099
  }
85100
  if ((self->private_impl.active_coroutine != 0) &&
85101
      (self->private_impl.active_coroutine != 3)) {
85102
    self->private_impl.magic = WUFFS_BASE__DISABLED;
85103
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
85104
  }
85105
  self->private_impl.active_coroutine = 0;
85106
  wuffs_base__status status = wuffs_base__make_status(NULL);
85107
85108
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
85109
85110
  uint32_t coro_susp_point = self->private_impl.p_decode_frame;
85111
  switch (coro_susp_point) {
85112
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
85113
85114
    while (true) {
85115
      if (self->private_impl.f_is_vp8_lossy) {
85116
        {
85117
          wuffs_base__status t_0 = wuffs_vp8__decoder__decode_frame(&self->private_data.f_vp8,
85118
              a_dst,
85119
              a_src,
85120
              a_blend,
85121
              a_workbuf,
85122
              a_opts);
85123
          v_status = t_0;
85124
        }
85125
      } else {
85126
        {
85127
          wuffs_base__status t_1 = wuffs_webp__decoder__do_decode_frame(self,
85128
              a_dst,
85129
              a_src,
85130
              a_blend,
85131
              a_workbuf,
85132
              a_opts);
85133
          v_status = t_1;
85134
        }
85135
      }
85136
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
85137
        status = wuffs_base__make_status(wuffs_webp__error__truncated_input);
85138
        goto exit;
85139
      }
85140
      status = v_status;
85141
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
85142
    }
85143
85144
    ok:
85145
    self->private_impl.p_decode_frame = 0;
85146
    goto exit;
85147
  }
85148
85149
  goto suspend;
85150
  suspend:
85151
  self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
85152
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0;
85153
85154
  goto exit;
85155
  exit:
85156
  if (wuffs_base__status__is_error(&status)) {
85157
    self->private_impl.magic = WUFFS_BASE__DISABLED;
85158
  }
85159
  return status;
85160
}
85161
85162
// -------- func webp.decoder.do_decode_frame
85163
85164
WUFFS_BASE__GENERATED_C_CODE
85165
static wuffs_base__status
85166
wuffs_webp__decoder__do_decode_frame(
85167
    wuffs_webp__decoder* self,
85168
    wuffs_base__pixel_buffer* a_dst,
85169
    wuffs_base__io_buffer* a_src,
85170
    wuffs_base__pixel_blend a_blend,
85171
    wuffs_base__slice_u8 a_workbuf,
85172
    wuffs_base__decode_frame_options* a_opts) {
85173
  wuffs_base__status status = wuffs_base__make_status(NULL);
85174
85175
  uint8_t v_c8 = 0;
85176
  uint32_t v_has_more = 0;
85177
  uint32_t v_width = 0;
85178
  wuffs_base__slice_u8 v_dst = {0};
85179
  wuffs_base__slice_u8 v_tile_data = {0};
85180
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
85181
  wuffs_base__slice_u8 v_pix = {0};
85182
  uint32_t v_which = 0;
85183
  uint32_t v_transform_type = 0;
85184
  uint64_t v_ti = 0;
85185
  uint64_t v_tj = 0;
85186
85187
  const uint8_t* iop_a_src = NULL;
85188
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
85189
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
85190
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
85191
  if (a_src && a_src->data.ptr) {
85192
    io0_a_src = a_src->data.ptr;
85193
    io1_a_src = io0_a_src + a_src->meta.ri;
85194
    iop_a_src = io1_a_src;
85195
    io2_a_src = io0_a_src + a_src->meta.wi;
85196
  }
85197
85198
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame;
85199
  if (coro_susp_point) {
85200
    v_width = self->private_data.s_do_decode_frame.v_width;
85201
  }
85202
  switch (coro_susp_point) {
85203
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
85204
85205
    if (self->private_impl.f_call_sequence == 64u) {
85206
    } else if (self->private_impl.f_call_sequence < 64u) {
85207
      if (a_src) {
85208
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
85209
      }
85210
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
85211
      status = wuffs_webp__decoder__do_decode_frame_config(self, NULL, a_src);
85212
      if (a_src) {
85213
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
85214
      }
85215
      if (status.repr) {
85216
        goto suspend;
85217
      }
85218
    } else {
85219
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
85220
      goto ok;
85221
    }
85222
    self->private_impl.f_seen_transform[0u] = false;
85223
    self->private_impl.f_seen_transform[1u] = false;
85224
    self->private_impl.f_seen_transform[2u] = false;
85225
    self->private_impl.f_seen_transform[3u] = false;
85226
    self->private_impl.f_n_transforms = 0u;
85227
    while (true) {
85228
      if (self->private_impl.f_n_bits < 1u) {
85229
        {
85230
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
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
          uint8_t t_0 = *iop_a_src++;
85236
          v_c8 = t_0;
85237
        }
85238
        self->private_impl.f_bits = ((uint32_t)(v_c8));
85239
        self->private_impl.f_n_bits = 8u;
85240
      }
85241
      v_has_more = (self->private_impl.f_bits & 1u);
85242
      self->private_impl.f_bits >>= 1u;
85243
      self->private_impl.f_n_bits -= 1u;
85244
      if (v_has_more == 0u) {
85245
        break;
85246
      }
85247
      if (a_src) {
85248
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
85249
      }
85250
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
85251
      status = wuffs_webp__decoder__decode_transform(self, a_src, a_workbuf);
85252
      if (a_src) {
85253
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
85254
      }
85255
      if (status.repr) {
85256
        goto suspend;
85257
      }
85258
    }
85259
    v_width = self->private_impl.f_width;
85260
    if (self->private_impl.f_seen_transform[3u]) {
85261
      v_width = self->private_impl.f_color_indexing_width;
85262
    }
85263
    if (a_src) {
85264
      a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
85265
    }
85266
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
85267
    status = wuffs_webp__decoder__decode_color_cache_parameters(self, a_src);
85268
    if (a_src) {
85269
      iop_a_src = a_src->data.ptr + a_src->meta.ri;
85270
    }
85271
    if (status.repr) {
85272
      goto suspend;
85273
    }
85274
    self->private_impl.f_overall_color_cache_bits = self->private_impl.f_color_cache_bits;
85275
    if (a_src) {
85276
      a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
85277
    }
85278
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
85279
    status = wuffs_webp__decoder__decode_hg_table(self, a_src, v_width, a_workbuf);
85280
    if (a_src) {
85281
      iop_a_src = a_src->data.ptr + a_src->meta.ri;
85282
    }
85283
    if (status.repr) {
85284
      goto suspend;
85285
    }
85286
    self->private_impl.f_color_cache_bits = self->private_impl.f_overall_color_cache_bits;
85287
    if (a_src) {
85288
      a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
85289
    }
85290
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
85291
    status = wuffs_webp__decoder__decode_huffman_groups(self, a_src, self->private_impl.f_overall_n_huffman_groups);
85292
    if (a_src) {
85293
      iop_a_src = a_src->data.ptr + a_src->meta.ri;
85294
    }
85295
    if (status.repr) {
85296
      goto suspend;
85297
    }
85298
    while (true) {
85299
      if ((((uint64_t)(self->private_impl.f_workbuf_offset_for_color_indexing)) > ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u]))) ||
85300
          (((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])) > ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u]))) ||
85301
          (((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u])) > ((uint64_t)(a_workbuf.len))) ||
85302
          (((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])) > ((uint64_t)(a_workbuf.len)))) {
85303
        status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length);
85304
        goto exit;
85305
      }
85306
      v_dst = wuffs_base__slice_u8__subslice_ij(a_workbuf,
85307
          ((uint64_t)(self->private_impl.f_workbuf_offset_for_color_indexing)),
85308
          ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])));
85309
      v_tile_data = wuffs_base__slice_u8__subslice_ij(a_workbuf,
85310
          ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])),
85311
          ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u])));
85312
      {
85313
        if (a_src) {
85314
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
85315
        }
85316
        wuffs_base__status t_1 = wuffs_webp__decoder__decode_pixels(self,
85317
            v_dst,
85318
            a_src,
85319
            v_width,
85320
            self->private_impl.f_height,
85321
            v_tile_data,
85322
            self->private_impl.f_overall_tile_size_log2);
85323
        v_status = t_1;
85324
        if (a_src) {
85325
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
85326
        }
85327
      }
85328
      if (wuffs_base__status__is_ok(&v_status)) {
85329
        break;
85330
      }
85331
      status = v_status;
85332
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7);
85333
    }
85334
    if (((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])) > ((uint64_t)(a_workbuf.len))) {
85335
      status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length);
85336
      goto exit;
85337
    }
85338
    v_pix = wuffs_base__slice_u8__subslice_j(a_workbuf, ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])));
85339
    v_which = self->private_impl.f_n_transforms;
85340
    while (v_which > 0u) {
85341
      v_which -= 1u;
85342
      v_transform_type = ((uint32_t)(self->private_impl.f_transform_type[v_which]));
85343
      v_tile_data = wuffs_base__utility__empty_slice_u8();
85344
      if (v_transform_type < 2u) {
85345
        v_ti = ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[(v_transform_type + 1u)]));
85346
        v_tj = ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[(v_transform_type + 2u)]));
85347
        if ((v_ti <= v_tj) && (v_tj <= ((uint64_t)(a_workbuf.len)))) {
85348
          v_tile_data = wuffs_base__slice_u8__subslice_ij(a_workbuf, v_ti, v_tj);
85349
        }
85350
      }
85351
      if (v_transform_type == 0u) {
85352
        wuffs_webp__decoder__apply_transform_predictor(self, v_pix, v_tile_data);
85353
      } else if (v_transform_type == 1u) {
85354
        wuffs_webp__decoder__apply_transform_cross_color(self, v_pix, v_tile_data);
85355
      } else if (v_transform_type == 2u) {
85356
        wuffs_webp__decoder__apply_transform_subtract_green(self, v_pix);
85357
      } else {
85358
        wuffs_webp__decoder__apply_transform_color_indexing(self, v_pix);
85359
        v_width = self->private_impl.f_width;
85360
      }
85361
    }
85362
    v_status = wuffs_webp__decoder__swizzle(self, a_dst, v_pix, a_blend);
85363
    if ( ! wuffs_base__status__is_ok(&v_status)) {
85364
      status = v_status;
85365
      if (wuffs_base__status__is_error(&status)) {
85366
        goto exit;
85367
      } else if (wuffs_base__status__is_suspension(&status)) {
85368
        status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
85369
        goto exit;
85370
      }
85371
      goto ok;
85372
    }
85373
    self->private_impl.f_call_sequence = 96u;
85374
85375
    ok:
85376
    self->private_impl.p_do_decode_frame = 0;
85377
    goto exit;
85378
  }
85379
85380
  goto suspend;
85381
  suspend:
85382
  self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
85383
  self->private_data.s_do_decode_frame.v_width = v_width;
85384
85385
  goto exit;
85386
  exit:
85387
  if (a_src && a_src->data.ptr) {
85388
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
85389
  }
85390
85391
  return status;
85392
}
85393
85394
// -------- func webp.decoder.decode_transform
85395
85396
WUFFS_BASE__GENERATED_C_CODE
85397
static wuffs_base__status
85398
wuffs_webp__decoder__decode_transform(
85399
    wuffs_webp__decoder* self,
85400
    wuffs_base__io_buffer* a_src,
85401
    wuffs_base__slice_u8 a_workbuf) {
85402
  wuffs_base__status status = wuffs_base__make_status(NULL);
85403
85404
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
85405
  uint8_t v_c8 = 0;
85406
  uint32_t v_transform_type = 0;
85407
  uint32_t v_tile_size_log2 = 0;
85408
  wuffs_base__slice_u8 v_p = {0};
85409
85410
  const uint8_t* iop_a_src = NULL;
85411
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
85412
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
85413
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
85414
  if (a_src && a_src->data.ptr) {
85415
    io0_a_src = a_src->data.ptr;
85416
    io1_a_src = io0_a_src + a_src->meta.ri;
85417
    iop_a_src = io1_a_src;
85418
    io2_a_src = io0_a_src + a_src->meta.wi;
85419
  }
85420
85421
  uint32_t coro_susp_point = self->private_impl.p_decode_transform;
85422
  if (coro_susp_point) {
85423
    v_transform_type = self->private_data.s_decode_transform.v_transform_type;
85424
    v_tile_size_log2 = self->private_data.s_decode_transform.v_tile_size_log2;
85425
  }
85426
  switch (coro_susp_point) {
85427
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
85428
85429
    if (self->private_impl.f_n_bits < 2u) {
85430
      {
85431
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
85432
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
85433
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
85434
          goto suspend;
85435
        }
85436
        uint8_t t_0 = *iop_a_src++;
85437
        v_c8 = t_0;
85438
      }
85439
      if (self->private_impl.f_n_bits >= 2u) {
85440
        status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
85441
        goto exit;
85442
      }
85443
      self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
85444
      self->private_impl.f_n_bits += 8u;
85445
    }
85446
    v_transform_type = (self->private_impl.f_bits & 3u);
85447
    self->private_impl.f_bits >>= 2u;
85448
    self->private_impl.f_n_bits -= 2u;
85449
    if (self->private_impl.f_seen_transform[v_transform_type] || (self->private_impl.f_n_transforms >= 4u)) {
85450
      status = wuffs_base__make_status(wuffs_webp__error__bad_transform);
85451
      goto exit;
85452
    } else if (self->private_impl.f_seen_transform[3u]) {
85453
      status = wuffs_base__make_status(wuffs_webp__error__unsupported_transform_after_color_indexing_transform);
85454
      goto exit;
85455
    }
85456
    self->private_impl.f_seen_transform[v_transform_type] = true;
85457
    self->private_impl.f_transform_type[self->private_impl.f_n_transforms] = ((uint8_t)(v_transform_type));
85458
    self->private_impl.f_n_transforms += 1u;
85459
    if (v_transform_type < 2u) {
85460
      if (self->private_impl.f_n_bits < 3u) {
85461
        {
85462
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
85463
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
85464
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
85465
            goto suspend;
85466
          }
85467
          uint8_t t_1 = *iop_a_src++;
85468
          v_c8 = t_1;
85469
        }
85470
        if (self->private_impl.f_n_bits >= 3u) {
85471
          status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
85472
          goto exit;
85473
        }
85474
        self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
85475
        self->private_impl.f_n_bits += 8u;
85476
      }
85477
      v_tile_size_log2 = ((self->private_impl.f_bits & 7u) + 2u);
85478
      self->private_impl.f_transform_tile_size_log2[v_transform_type] = ((uint8_t)(v_tile_size_log2));
85479
      self->private_impl.f_bits >>= 3u;
85480
      self->private_impl.f_n_bits -= 3u;
85481
      if (a_src) {
85482
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
85483
      }
85484
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
85485
      status = wuffs_webp__decoder__decode_color_cache_parameters(self, a_src);
85486
      if (a_src) {
85487
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
85488
      }
85489
      if (status.repr) {
85490
        goto suspend;
85491
      }
85492
      if (a_src) {
85493
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
85494
      }
85495
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
85496
      status = wuffs_webp__decoder__decode_huffman_groups(self, a_src, 1u);
85497
      if (a_src) {
85498
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
85499
      }
85500
      if (status.repr) {
85501
        goto suspend;
85502
      }
85503
      while (true) {
85504
        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)))) {
85505
          status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length);
85506
          goto exit;
85507
        }
85508
        {
85509
          if (a_src) {
85510
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
85511
          }
85512
          wuffs_base__status t_2 = wuffs_webp__decoder__decode_pixels(self,
85513
              wuffs_base__slice_u8__subslice_ij(a_workbuf,
85514
              ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[(v_transform_type + 1u)])),
85515
              ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[(v_transform_type + 2u)]))),
85516
              a_src,
85517
              ((self->private_impl.f_width + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2),
85518
              ((self->private_impl.f_height + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2),
85519
              wuffs_base__utility__empty_slice_u8(),
85520
              0u);
85521
          v_status = t_2;
85522
          if (a_src) {
85523
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
85524
          }
85525
        }
85526
        if (wuffs_base__status__is_ok(&v_status)) {
85527
          break;
85528
        }
85529
        status = v_status;
85530
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5);
85531
      }
85532
    } else if (v_transform_type == 2u) {
85533
    } else {
85534
      if (self->private_impl.f_n_bits < 8u) {
85535
        {
85536
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
85537
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
85538
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
85539
            goto suspend;
85540
          }
85541
          uint8_t t_3 = *iop_a_src++;
85542
          v_c8 = t_3;
85543
        }
85544
        if (self->private_impl.f_n_bits >= 8u) {
85545
          status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
85546
          goto exit;
85547
        }
85548
        self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
85549
        self->private_impl.f_n_bits += 8u;
85550
      }
85551
      self->private_impl.f_color_indexing_palette_size = ((self->private_impl.f_bits & 255u) + 1u);
85552
      self->private_impl.f_bits >>= 8u;
85553
      self->private_impl.f_n_bits -= 8u;
85554
      if (self->private_impl.f_color_indexing_palette_size <= 2u) {
85555
        self->private_impl.f_color_indexing_width = ((self->private_impl.f_width + 7u) / 8u);
85556
        self->private_impl.f_transform_tile_size_log2[3u] = 3u;
85557
      } else if (self->private_impl.f_color_indexing_palette_size <= 4u) {
85558
        self->private_impl.f_color_indexing_width = ((self->private_impl.f_width + 3u) / 4u);
85559
        self->private_impl.f_transform_tile_size_log2[3u] = 2u;
85560
      } else if (self->private_impl.f_color_indexing_palette_size <= 16u) {
85561
        self->private_impl.f_color_indexing_width = ((self->private_impl.f_width + 1u) / 2u);
85562
        self->private_impl.f_transform_tile_size_log2[3u] = 1u;
85563
      } else {
85564
        self->private_impl.f_color_indexing_width = self->private_impl.f_width;
85565
        self->private_impl.f_transform_tile_size_log2[3u] = 0u;
85566
      }
85567
      if (self->private_impl.f_width >= self->private_impl.f_color_indexing_width) {
85568
        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);
85569
      }
85570
      if (a_src) {
85571
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
85572
      }
85573
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
85574
      status = wuffs_webp__decoder__decode_color_cache_parameters(self, a_src);
85575
      if (a_src) {
85576
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
85577
      }
85578
      if (status.repr) {
85579
        goto suspend;
85580
      }
85581
      if (a_src) {
85582
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
85583
      }
85584
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
85585
      status = wuffs_webp__decoder__decode_huffman_groups(self, a_src, 1u);
85586
      if (a_src) {
85587
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
85588
      }
85589
      if (status.repr) {
85590
        goto suspend;
85591
      }
85592
      if (a_src) {
85593
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
85594
      }
85595
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
85596
      status = wuffs_webp__decoder__decode_pixels(self,
85597
          wuffs_base__make_slice_u8(self->private_data.f_palette, (4u * self->private_impl.f_color_indexing_palette_size)),
85598
          a_src,
85599
          self->private_impl.f_color_indexing_palette_size,
85600
          1u,
85601
          wuffs_base__utility__empty_slice_u8(),
85602
          0u);
85603
      if (a_src) {
85604
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
85605
      }
85606
      if (status.repr) {
85607
        goto suspend;
85608
      }
85609
      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);
85610
      v_p = wuffs_base__make_slice_u8(self->private_data.f_palette, (4u * self->private_impl.f_color_indexing_palette_size));
85611
      while (((uint64_t)(v_p.len)) >= 8u) {
85612
#if defined(__GNUC__)
85613
#pragma GCC diagnostic push
85614
#pragma GCC diagnostic ignored "-Wconversion"
85615
#endif
85616
        v_p.ptr[4u] += v_p.ptr[0u];
85617
        v_p.ptr[5u] += v_p.ptr[1u];
85618
        v_p.ptr[6u] += v_p.ptr[2u];
85619
        v_p.ptr[7u] += v_p.ptr[3u];
85620
#if defined(__GNUC__)
85621
#pragma GCC diagnostic pop
85622
#endif
85623
        v_p = wuffs_base__slice_u8__subslice_i(v_p, 4u);
85624
      }
85625
    }
85626
85627
    ok:
85628
    self->private_impl.p_decode_transform = 0;
85629
    goto exit;
85630
  }
85631
85632
  goto suspend;
85633
  suspend:
85634
  self->private_impl.p_decode_transform = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
85635
  self->private_data.s_decode_transform.v_transform_type = v_transform_type;
85636
  self->private_data.s_decode_transform.v_tile_size_log2 = v_tile_size_log2;
85637
85638
  goto exit;
85639
  exit:
85640
  if (a_src && a_src->data.ptr) {
85641
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
85642
  }
85643
85644
  return status;
85645
}
85646
85647
// -------- func webp.decoder.decode_color_cache_parameters
85648
85649
WUFFS_BASE__GENERATED_C_CODE
85650
static wuffs_base__status
85651
wuffs_webp__decoder__decode_color_cache_parameters(
85652
    wuffs_webp__decoder* self,
85653
    wuffs_base__io_buffer* a_src) {
85654
  wuffs_base__status status = wuffs_base__make_status(NULL);
85655
85656
  uint8_t v_c8 = 0;
85657
  uint32_t v_use_color_cache = 0;
85658
  uint32_t v_color_cache_bits = 0;
85659
85660
  const uint8_t* iop_a_src = NULL;
85661
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
85662
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
85663
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
85664
  if (a_src && a_src->data.ptr) {
85665
    io0_a_src = a_src->data.ptr;
85666
    io1_a_src = io0_a_src + a_src->meta.ri;
85667
    iop_a_src = io1_a_src;
85668
    io2_a_src = io0_a_src + a_src->meta.wi;
85669
  }
85670
85671
  uint32_t coro_susp_point = self->private_impl.p_decode_color_cache_parameters;
85672
  switch (coro_susp_point) {
85673
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
85674
85675
    if (self->private_impl.f_n_bits < 1u) {
85676
      {
85677
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
85678
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
85679
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
85680
          goto suspend;
85681
        }
85682
        uint8_t t_0 = *iop_a_src++;
85683
        v_c8 = t_0;
85684
      }
85685
      self->private_impl.f_bits = ((uint32_t)(v_c8));
85686
      self->private_impl.f_n_bits = 8u;
85687
    }
85688
    v_use_color_cache = (self->private_impl.f_bits & 1u);
85689
    self->private_impl.f_bits >>= 1u;
85690
    self->private_impl.f_n_bits -= 1u;
85691
    self->private_impl.f_color_cache_bits = 0u;
85692
    if (v_use_color_cache != 0u) {
85693
      if (self->private_impl.f_n_bits < 4u) {
85694
        {
85695
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
85696
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
85697
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
85698
            goto suspend;
85699
          }
85700
          uint8_t t_1 = *iop_a_src++;
85701
          v_c8 = t_1;
85702
        }
85703
        if (self->private_impl.f_n_bits >= 4u) {
85704
          status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
85705
          goto exit;
85706
        }
85707
        self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
85708
        self->private_impl.f_n_bits += 8u;
85709
      }
85710
      v_color_cache_bits = (self->private_impl.f_bits & 15u);
85711
      self->private_impl.f_bits >>= 4u;
85712
      self->private_impl.f_n_bits -= 4u;
85713
      if ((v_color_cache_bits < 1u) || (11u < v_color_cache_bits)) {
85714
        status = wuffs_base__make_status(wuffs_webp__error__bad_color_cache);
85715
        goto exit;
85716
      }
85717
      self->private_impl.f_color_cache_bits = v_color_cache_bits;
85718
    }
85719
85720
    goto ok;
85721
    ok:
85722
    self->private_impl.p_decode_color_cache_parameters = 0;
85723
    goto exit;
85724
  }
85725
85726
  goto suspend;
85727
  suspend:
85728
  self->private_impl.p_decode_color_cache_parameters = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
85729
85730
  goto exit;
85731
  exit:
85732
  if (a_src && a_src->data.ptr) {
85733
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
85734
  }
85735
85736
  return status;
85737
}
85738
85739
// -------- func webp.decoder.decode_hg_table
85740
85741
WUFFS_BASE__GENERATED_C_CODE
85742
static wuffs_base__status
85743
wuffs_webp__decoder__decode_hg_table(
85744
    wuffs_webp__decoder* self,
85745
    wuffs_base__io_buffer* a_src,
85746
    uint32_t a_width,
85747
    wuffs_base__slice_u8 a_workbuf) {
85748
  wuffs_base__status status = wuffs_base__make_status(NULL);
85749
85750
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
85751
  uint8_t v_c8 = 0;
85752
  uint32_t v_use_hg_table = 0;
85753
  uint32_t v_tile_size_log2 = 0;
85754
  wuffs_base__slice_u8 v_hg_pixels = {0};
85755
  uint64_t v_n = 0;
85756
  wuffs_base__slice_u8 v_p = {0};
85757
  uint32_t v_hg_plus_1 = 0;
85758
85759
  const uint8_t* iop_a_src = NULL;
85760
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
85761
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
85762
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
85763
  if (a_src && a_src->data.ptr) {
85764
    io0_a_src = a_src->data.ptr;
85765
    io1_a_src = io0_a_src + a_src->meta.ri;
85766
    iop_a_src = io1_a_src;
85767
    io2_a_src = io0_a_src + a_src->meta.wi;
85768
  }
85769
85770
  uint32_t coro_susp_point = self->private_impl.p_decode_hg_table;
85771
  if (coro_susp_point) {
85772
    v_tile_size_log2 = self->private_data.s_decode_hg_table.v_tile_size_log2;
85773
  }
85774
  switch (coro_susp_point) {
85775
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
85776
85777
    if (self->private_impl.f_n_bits < 1u) {
85778
      {
85779
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
85780
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
85781
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
85782
          goto suspend;
85783
        }
85784
        uint8_t t_0 = *iop_a_src++;
85785
        v_c8 = t_0;
85786
      }
85787
      self->private_impl.f_bits = ((uint32_t)(v_c8));
85788
      self->private_impl.f_n_bits = 8u;
85789
    }
85790
    v_use_hg_table = (self->private_impl.f_bits & 1u);
85791
    self->private_impl.f_bits >>= 1u;
85792
    self->private_impl.f_n_bits -= 1u;
85793
    if (v_use_hg_table == 0u) {
85794
      self->private_impl.f_overall_n_huffman_groups = 1u;
85795
      self->private_impl.f_overall_tile_size_log2 = 0u;
85796
      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)))) {
85797
        status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length);
85798
        goto exit;
85799
      }
85800
      v_hg_pixels = wuffs_base__slice_u8__subslice_ij(a_workbuf,
85801
          ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])),
85802
          ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u])));
85803
      if (((uint64_t)(v_hg_pixels.len)) >= 4u) {
85804
        v_hg_pixels.ptr[0u] = 0u;
85805
        v_hg_pixels.ptr[1u] = 0u;
85806
        v_hg_pixels.ptr[2u] = 0u;
85807
        v_hg_pixels.ptr[3u] = 0u;
85808
      }
85809
      status = wuffs_base__make_status(NULL);
85810
      goto ok;
85811
    }
85812
    if (self->private_impl.f_n_bits < 3u) {
85813
      {
85814
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
85815
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
85816
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
85817
          goto suspend;
85818
        }
85819
        uint8_t t_1 = *iop_a_src++;
85820
        v_c8 = t_1;
85821
      }
85822
      if (self->private_impl.f_n_bits >= 3u) {
85823
        status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
85824
        goto exit;
85825
      }
85826
      self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
85827
      self->private_impl.f_n_bits += 8u;
85828
    }
85829
    v_tile_size_log2 = ((self->private_impl.f_bits & 7u) + 2u);
85830
    self->private_impl.f_bits >>= 3u;
85831
    self->private_impl.f_n_bits -= 3u;
85832
    self->private_impl.f_overall_tile_size_log2 = v_tile_size_log2;
85833
    if (a_src) {
85834
      a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
85835
    }
85836
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
85837
    status = wuffs_webp__decoder__decode_color_cache_parameters(self, a_src);
85838
    if (a_src) {
85839
      iop_a_src = a_src->data.ptr + a_src->meta.ri;
85840
    }
85841
    if (status.repr) {
85842
      goto suspend;
85843
    }
85844
    if (a_src) {
85845
      a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
85846
    }
85847
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
85848
    status = wuffs_webp__decoder__decode_huffman_groups(self, a_src, 1u);
85849
    if (a_src) {
85850
      iop_a_src = a_src->data.ptr + a_src->meta.ri;
85851
    }
85852
    if (status.repr) {
85853
      goto suspend;
85854
    }
85855
    while (true) {
85856
      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)))) {
85857
        status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length);
85858
        goto exit;
85859
      }
85860
      {
85861
        if (a_src) {
85862
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
85863
        }
85864
        wuffs_base__status t_2 = wuffs_webp__decoder__decode_pixels(self,
85865
            wuffs_base__slice_u8__subslice_ij(a_workbuf,
85866
            ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])),
85867
            ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u]))),
85868
            a_src,
85869
            ((a_width + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2),
85870
            ((self->private_impl.f_height + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2),
85871
            wuffs_base__utility__empty_slice_u8(),
85872
            0u);
85873
        v_status = t_2;
85874
        if (a_src) {
85875
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
85876
        }
85877
      }
85878
      if (wuffs_base__status__is_ok(&v_status)) {
85879
        break;
85880
      }
85881
      status = v_status;
85882
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5);
85883
    }
85884
    self->private_impl.f_overall_n_huffman_groups = 1u;
85885
    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)))) {
85886
      status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length);
85887
      goto exit;
85888
    }
85889
    v_hg_pixels = wuffs_base__slice_u8__subslice_ij(a_workbuf,
85890
        ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])),
85891
        ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u])));
85892
    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)));
85893
    if (v_n > ((uint64_t)(v_hg_pixels.len))) {
85894
      status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length);
85895
      goto exit;
85896
    }
85897
    v_p = wuffs_base__slice_u8__subslice_j(v_hg_pixels, v_n);
85898
    while (((uint64_t)(v_p.len)) >= 4u) {
85899
      if (v_p.ptr[2u] != 0u) {
85900
        status = wuffs_base__make_status(wuffs_webp__error__unsupported_number_of_huffman_groups);
85901
        goto exit;
85902
      }
85903
      v_hg_plus_1 = (((uint32_t)(v_p.ptr[1u])) + 1u);
85904
      if (self->private_impl.f_overall_n_huffman_groups < v_hg_plus_1) {
85905
        self->private_impl.f_overall_n_huffman_groups = v_hg_plus_1;
85906
      }
85907
      v_p = wuffs_base__slice_u8__subslice_i(v_p, 4u);
85908
    }
85909
85910
    ok:
85911
    self->private_impl.p_decode_hg_table = 0;
85912
    goto exit;
85913
  }
85914
85915
  goto suspend;
85916
  suspend:
85917
  self->private_impl.p_decode_hg_table = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
85918
  self->private_data.s_decode_hg_table.v_tile_size_log2 = v_tile_size_log2;
85919
85920
  goto exit;
85921
  exit:
85922
  if (a_src && a_src->data.ptr) {
85923
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
85924
  }
85925
85926
  return status;
85927
}
85928
85929
// -------- func webp.decoder.decode_pixels
85930
85931
WUFFS_BASE__GENERATED_C_CODE
85932
static wuffs_base__status
85933
wuffs_webp__decoder__decode_pixels(
85934
    wuffs_webp__decoder* self,
85935
    wuffs_base__slice_u8 a_dst,
85936
    wuffs_base__io_buffer* a_src,
85937
    uint32_t a_width,
85938
    uint32_t a_height,
85939
    wuffs_base__slice_u8 a_tile_data,
85940
    uint32_t a_tile_size_log2) {
85941
  wuffs_base__status status = wuffs_base__make_status(NULL);
85942
85943
  uint32_t v_i = 0;
85944
  uint32_t v_n = 0;
85945
85946
  uint32_t coro_susp_point = self->private_impl.p_decode_pixels;
85947
  switch (coro_susp_point) {
85948
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
85949
85950
    v_i = 0u;
85951
    v_n = (((uint32_t)(1u)) << self->private_impl.f_color_cache_bits);
85952
    while (v_i < v_n) {
85953
      self->private_data.f_color_cache[v_i] = 0u;
85954
      v_i += 1u;
85955
    }
85956
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
85957
    status = wuffs_webp__decoder__decode_pixels_slow(self,
85958
        a_dst,
85959
        a_src,
85960
        a_width,
85961
        a_height,
85962
        a_tile_data,
85963
        a_tile_size_log2);
85964
    if (status.repr) {
85965
      goto suspend;
85966
    }
85967
85968
    goto ok;
85969
    ok:
85970
    self->private_impl.p_decode_pixels = 0;
85971
    goto exit;
85972
  }
85973
85974
  goto suspend;
85975
  suspend:
85976
  self->private_impl.p_decode_pixels = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
85977
85978
  goto exit;
85979
  exit:
85980
  return status;
85981
}
85982
85983
// -------- func webp.decoder.swizzle
85984
85985
WUFFS_BASE__GENERATED_C_CODE
85986
static wuffs_base__status
85987
wuffs_webp__decoder__swizzle(
85988
    wuffs_webp__decoder* self,
85989
    wuffs_base__pixel_buffer* a_dst,
85990
    wuffs_base__slice_u8 a_src,
85991
    wuffs_base__pixel_blend a_blend) {
85992
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
85993
  wuffs_base__pixel_format v_dst_pixfmt = {0};
85994
  uint32_t v_dst_bits_per_pixel = 0;
85995
  uint32_t v_dst_bytes_per_pixel = 0;
85996
  uint64_t v_dst_bytes_per_row = 0;
85997
  wuffs_base__slice_u8 v_dst_palette = {0};
85998
  wuffs_base__table_u8 v_tab = {0};
85999
  uint64_t v_src_bytes_per_row = 0;
86000
  wuffs_base__slice_u8 v_dst = {0};
86001
  uint32_t v_y = 0;
86002
86003
  v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler,
86004
      wuffs_base__pixel_buffer__pixel_format(a_dst),
86005
      wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_palette, 1024)),
86006
      wuffs_base__utility__make_pixel_format(self->private_impl.f_pixfmt),
86007
      wuffs_base__utility__empty_slice_u8(),
86008
      a_blend);
86009
  if ( ! wuffs_base__status__is_ok(&v_status)) {
86010
    return wuffs_private_impl__status__ensure_not_a_suspension(v_status);
86011
  }
86012
  v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
86013
  v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
86014
  if ((v_dst_bits_per_pixel & 7u) != 0u) {
86015
    return wuffs_base__make_status(wuffs_base__error__unsupported_option);
86016
  }
86017
  v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u);
86018
  v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel)));
86019
  v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_palette, 1024));
86020
  v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
86021
  v_src_bytes_per_row = ((uint64_t)((self->private_impl.f_width * 4u)));
86022
  while (v_src_bytes_per_row <= ((uint64_t)(a_src.len))) {
86023
    v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_y);
86024
    if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) {
86025
      v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row);
86026
    }
86027
    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));
86028
    a_src = wuffs_base__slice_u8__subslice_i(a_src, v_src_bytes_per_row);
86029
    v_y += 1u;
86030
  }
86031
  return wuffs_base__make_status(NULL);
86032
}
86033
86034
// -------- func webp.decoder.frame_dirty_rect
86035
86036
WUFFS_BASE__GENERATED_C_CODE
86037
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
86038
wuffs_webp__decoder__frame_dirty_rect(
86039
    const wuffs_webp__decoder* self) {
86040
  if (!self) {
86041
    return wuffs_base__utility__empty_rect_ie_u32();
86042
  }
86043
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
86044
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
86045
    return wuffs_base__utility__empty_rect_ie_u32();
86046
  }
86047
86048
  if (self->private_impl.f_is_vp8_lossy) {
86049
    return wuffs_vp8__decoder__frame_dirty_rect(&self->private_data.f_vp8);
86050
  }
86051
  return wuffs_base__utility__make_rect_ie_u32(
86052
      0u,
86053
      0u,
86054
      self->private_impl.f_width,
86055
      self->private_impl.f_height);
86056
}
86057
86058
// -------- func webp.decoder.num_animation_loops
86059
86060
WUFFS_BASE__GENERATED_C_CODE
86061
WUFFS_BASE__MAYBE_STATIC uint32_t
86062
wuffs_webp__decoder__num_animation_loops(
86063
    const wuffs_webp__decoder* self) {
86064
  if (!self) {
86065
    return 0;
86066
  }
86067
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
86068
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
86069
    return 0;
86070
  }
86071
86072
  return 0u;
86073
}
86074
86075
// -------- func webp.decoder.num_decoded_frame_configs
86076
86077
WUFFS_BASE__GENERATED_C_CODE
86078
WUFFS_BASE__MAYBE_STATIC uint64_t
86079
wuffs_webp__decoder__num_decoded_frame_configs(
86080
    const wuffs_webp__decoder* self) {
86081
  if (!self) {
86082
    return 0;
86083
  }
86084
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
86085
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
86086
    return 0;
86087
  }
86088
86089
  if (self->private_impl.f_is_vp8_lossy) {
86090
    return wuffs_vp8__decoder__num_decoded_frame_configs(&self->private_data.f_vp8);
86091
  }
86092
  if (self->private_impl.f_call_sequence > 32u) {
86093
    return 1u;
86094
  }
86095
  return 0u;
86096
}
86097
86098
// -------- func webp.decoder.num_decoded_frames
86099
86100
WUFFS_BASE__GENERATED_C_CODE
86101
WUFFS_BASE__MAYBE_STATIC uint64_t
86102
wuffs_webp__decoder__num_decoded_frames(
86103
    const wuffs_webp__decoder* self) {
86104
  if (!self) {
86105
    return 0;
86106
  }
86107
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
86108
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
86109
    return 0;
86110
  }
86111
86112
  if (self->private_impl.f_is_vp8_lossy) {
86113
    return wuffs_vp8__decoder__num_decoded_frames(&self->private_data.f_vp8);
86114
  }
86115
  if (self->private_impl.f_call_sequence > 64u) {
86116
    return 1u;
86117
  }
86118
  return 0u;
86119
}
86120
86121
// -------- func webp.decoder.restart_frame
86122
86123
WUFFS_BASE__GENERATED_C_CODE
86124
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
86125
wuffs_webp__decoder__restart_frame(
86126
    wuffs_webp__decoder* self,
86127
    uint64_t a_index,
86128
    uint64_t a_io_position) {
86129
  if (!self) {
86130
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
86131
  }
86132
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
86133
    return wuffs_base__make_status(
86134
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
86135
        ? wuffs_base__error__disabled_by_previous_error
86136
        : wuffs_base__error__initialize_not_called);
86137
  }
86138
86139
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
86140
86141
  if (self->private_impl.f_is_vp8_lossy) {
86142
    v_status = wuffs_vp8__decoder__restart_frame(&self->private_data.f_vp8, a_index, a_io_position);
86143
    return wuffs_private_impl__status__ensure_not_a_suspension(v_status);
86144
  }
86145
  if (self->private_impl.f_call_sequence < 32u) {
86146
    return wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
86147
  }
86148
  if ((a_index != 0u) || (a_io_position != self->private_impl.f_frame_config_io_position)) {
86149
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
86150
  }
86151
  self->private_impl.f_call_sequence = 40u;
86152
  return wuffs_base__make_status(NULL);
86153
}
86154
86155
// -------- func webp.decoder.set_report_metadata
86156
86157
WUFFS_BASE__GENERATED_C_CODE
86158
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
86159
wuffs_webp__decoder__set_report_metadata(
86160
    wuffs_webp__decoder* self,
86161
    uint32_t a_fourcc,
86162
    bool a_report) {
86163
  return wuffs_base__make_empty_struct();
86164
}
86165
86166
// -------- func webp.decoder.tell_me_more
86167
86168
WUFFS_BASE__GENERATED_C_CODE
86169
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
86170
wuffs_webp__decoder__tell_me_more(
86171
    wuffs_webp__decoder* self,
86172
    wuffs_base__io_buffer* a_dst,
86173
    wuffs_base__more_information* a_minfo,
86174
    wuffs_base__io_buffer* a_src) {
86175
  if (!self) {
86176
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
86177
  }
86178
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
86179
    return wuffs_base__make_status(
86180
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
86181
        ? wuffs_base__error__disabled_by_previous_error
86182
        : wuffs_base__error__initialize_not_called);
86183
  }
86184
  if (!a_dst || !a_src) {
86185
    self->private_impl.magic = WUFFS_BASE__DISABLED;
86186
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
86187
  }
86188
  if ((self->private_impl.active_coroutine != 0) &&
86189
      (self->private_impl.active_coroutine != 4)) {
86190
    self->private_impl.magic = WUFFS_BASE__DISABLED;
86191
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
86192
  }
86193
  self->private_impl.active_coroutine = 0;
86194
  wuffs_base__status status = wuffs_base__make_status(NULL);
86195
86196
  status = wuffs_base__make_status(wuffs_base__error__no_more_information);
86197
  goto exit;
86198
86199
  goto ok;
86200
  ok:
86201
  goto exit;
86202
  exit:
86203
  if (wuffs_base__status__is_error(&status)) {
86204
    self->private_impl.magic = WUFFS_BASE__DISABLED;
86205
  }
86206
  return status;
86207
}
86208
86209
// -------- func webp.decoder.workbuf_len
86210
86211
WUFFS_BASE__GENERATED_C_CODE
86212
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
86213
wuffs_webp__decoder__workbuf_len(
86214
    const wuffs_webp__decoder* self) {
86215
  if (!self) {
86216
    return wuffs_base__utility__empty_range_ii_u64();
86217
  }
86218
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
86219
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
86220
    return wuffs_base__utility__empty_range_ii_u64();
86221
  }
86222
86223
  if (self->private_impl.f_is_vp8_lossy) {
86224
    return wuffs_vp8__decoder__workbuf_len(&self->private_data.f_vp8);
86225
  }
86226
  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])));
86227
}
86228
86229
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WEBP)
86230
86231
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH32)
86232
86233
// ---------------- Status Codes Implementations
86234
86235
// ---------------- Private Consts
86236
86237
#define WUFFS_XXHASH32__XXH_PRIME32_1 2654435761u
86238
86239
#define WUFFS_XXHASH32__XXH_PRIME32_2 2246822519u
86240
86241
#define WUFFS_XXHASH32__XXH_PRIME32_3 3266489917u
86242
86243
#define WUFFS_XXHASH32__XXH_PRIME32_4 668265263u
86244
86245
#define WUFFS_XXHASH32__XXH_PRIME32_5 374761393u
86246
86247
#define WUFFS_XXHASH32__INITIAL_V0 606290984u
86248
86249
#define WUFFS_XXHASH32__INITIAL_V1 2246822519u
86250
86251
#define WUFFS_XXHASH32__INITIAL_V2 0u
86252
86253
#define WUFFS_XXHASH32__INITIAL_V3 1640531535u
86254
86255
// ---------------- Private Initializer Prototypes
86256
86257
// ---------------- Private Function Prototypes
86258
86259
WUFFS_BASE__GENERATED_C_CODE
86260
static wuffs_base__empty_struct
86261
wuffs_xxhash32__hasher__up(
86262
    wuffs_xxhash32__hasher* self,
86263
    wuffs_base__slice_u8 a_x);
86264
86265
// ---------------- VTables
86266
86267
const wuffs_base__hasher_u32__func_ptrs
86268
wuffs_xxhash32__hasher__func_ptrs_for__wuffs_base__hasher_u32 = {
86269
  (uint32_t(*)(const void*))(&wuffs_xxhash32__hasher__checksum_u32),
86270
  (uint64_t(*)(const void*,
86271
      uint32_t))(&wuffs_xxhash32__hasher__get_quirk),
86272
  (wuffs_base__status(*)(void*,
86273
      uint32_t,
86274
      uint64_t))(&wuffs_xxhash32__hasher__set_quirk),
86275
  (wuffs_base__empty_struct(*)(void*,
86276
      wuffs_base__slice_u8))(&wuffs_xxhash32__hasher__update),
86277
  (uint32_t(*)(void*,
86278
      wuffs_base__slice_u8))(&wuffs_xxhash32__hasher__update_u32),
86279
};
86280
86281
// ---------------- Initializer Implementations
86282
86283
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
86284
wuffs_xxhash32__hasher__initialize(
86285
    wuffs_xxhash32__hasher* self,
86286
    size_t sizeof_star_self,
86287
    uint64_t wuffs_version,
86288
    uint32_t options){
86289
  if (!self) {
86290
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
86291
  }
86292
  if (sizeof(*self) != sizeof_star_self) {
86293
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
86294
  }
86295
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
86296
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
86297
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
86298
  }
86299
86300
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
86301
    // The whole point of this if-check is to detect an uninitialized *self.
86302
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
86303
#if !defined(__clang__) && defined(__GNUC__)
86304
#pragma GCC diagnostic push
86305
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
86306
#endif
86307
    if (self->private_impl.magic != 0) {
86308
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
86309
    }
86310
#if !defined(__clang__) && defined(__GNUC__)
86311
#pragma GCC diagnostic pop
86312
#endif
86313
  } else {
86314
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
86315
      memset(self, 0, sizeof(*self));
86316
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
86317
    } else {
86318
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
86319
    }
86320
  }
86321
86322
  self->private_impl.magic = WUFFS_BASE__MAGIC;
86323
  self->private_impl.vtable_for__wuffs_base__hasher_u32.vtable_name =
86324
      wuffs_base__hasher_u32__vtable_name;
86325
  self->private_impl.vtable_for__wuffs_base__hasher_u32.function_pointers =
86326
      (const void*)(&wuffs_xxhash32__hasher__func_ptrs_for__wuffs_base__hasher_u32);
86327
  return wuffs_base__make_status(NULL);
86328
}
86329
86330
wuffs_xxhash32__hasher*
86331
wuffs_xxhash32__hasher__alloc(void) {
86332
  wuffs_xxhash32__hasher* x =
86333
      (wuffs_xxhash32__hasher*)(calloc(1, sizeof(wuffs_xxhash32__hasher)));
86334
  if (!x) {
86335
    return NULL;
86336
  }
86337
  if (wuffs_xxhash32__hasher__initialize(
86338
      x, sizeof(wuffs_xxhash32__hasher), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
86339
    free(x);
86340
    return NULL;
86341
  }
86342
  return x;
86343
}
86344
86345
size_t
86346
sizeof__wuffs_xxhash32__hasher(void) {
86347
  return sizeof(wuffs_xxhash32__hasher);
86348
}
86349
86350
// ---------------- Function Implementations
86351
86352
// -------- func xxhash32.hasher.get_quirk
86353
86354
WUFFS_BASE__GENERATED_C_CODE
86355
WUFFS_BASE__MAYBE_STATIC uint64_t
86356
wuffs_xxhash32__hasher__get_quirk(
86357
    const wuffs_xxhash32__hasher* self,
86358
    uint32_t a_key) {
86359
  if (!self) {
86360
    return 0;
86361
  }
86362
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
86363
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
86364
    return 0;
86365
  }
86366
86367
  return 0u;
86368
}
86369
86370
// -------- func xxhash32.hasher.set_quirk
86371
86372
WUFFS_BASE__GENERATED_C_CODE
86373
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
86374
wuffs_xxhash32__hasher__set_quirk(
86375
    wuffs_xxhash32__hasher* self,
86376
    uint32_t a_key,
86377
    uint64_t a_value) {
86378
  if (!self) {
86379
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
86380
  }
86381
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
86382
    return wuffs_base__make_status(
86383
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
86384
        ? wuffs_base__error__disabled_by_previous_error
86385
        : wuffs_base__error__initialize_not_called);
86386
  }
86387
86388
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
86389
}
86390
86391
// -------- func xxhash32.hasher.update
86392
86393
WUFFS_BASE__GENERATED_C_CODE
86394
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
86395
wuffs_xxhash32__hasher__update(
86396
    wuffs_xxhash32__hasher* self,
86397
    wuffs_base__slice_u8 a_x) {
86398
  if (!self) {
86399
    return wuffs_base__make_empty_struct();
86400
  }
86401
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
86402
    return wuffs_base__make_empty_struct();
86403
  }
86404
86405
  wuffs_base__slice_u8 v_remaining = {0};
86406
86407
  if ((self->private_impl.f_length_modulo_u32 == 0u) &&  ! self->private_impl.f_length_overflows_u32) {
86408
    self->private_impl.f_v0 = 606290984u;
86409
    self->private_impl.f_v1 = 2246822519u;
86410
    self->private_impl.f_v2 = 0u;
86411
    self->private_impl.f_v3 = 1640531535u;
86412
  }
86413
  while (((uint64_t)(a_x.len)) > 0u) {
86414
    v_remaining = wuffs_base__slice_u8__subslice_j(a_x, 0u);
86415
    if (((uint64_t)(a_x.len)) > 16777216u) {
86416
      v_remaining = wuffs_base__slice_u8__subslice_i(a_x, 16777216u);
86417
      a_x = wuffs_base__slice_u8__subslice_j(a_x, 16777216u);
86418
    }
86419
    wuffs_xxhash32__hasher__up(self, a_x);
86420
    a_x = v_remaining;
86421
  }
86422
  return wuffs_base__make_empty_struct();
86423
}
86424
86425
// -------- func xxhash32.hasher.update_u32
86426
86427
WUFFS_BASE__GENERATED_C_CODE
86428
WUFFS_BASE__MAYBE_STATIC uint32_t
86429
wuffs_xxhash32__hasher__update_u32(
86430
    wuffs_xxhash32__hasher* self,
86431
    wuffs_base__slice_u8 a_x) {
86432
  if (!self) {
86433
    return 0;
86434
  }
86435
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
86436
    return 0;
86437
  }
86438
86439
  wuffs_xxhash32__hasher__update(self, a_x);
86440
  return wuffs_xxhash32__hasher__checksum_u32(self);
86441
}
86442
86443
// -------- func xxhash32.hasher.up
86444
86445
WUFFS_BASE__GENERATED_C_CODE
86446
static wuffs_base__empty_struct
86447
wuffs_xxhash32__hasher__up(
86448
    wuffs_xxhash32__hasher* self,
86449
    wuffs_base__slice_u8 a_x) {
86450
  uint32_t v_new_lmu = 0;
86451
  uint32_t v_buf_u32 = 0;
86452
  uint32_t v_buf_len = 0;
86453
  uint32_t v_v0 = 0;
86454
  uint32_t v_v1 = 0;
86455
  uint32_t v_v2 = 0;
86456
  uint32_t v_v3 = 0;
86457
  wuffs_base__slice_u8 v_p = {0};
86458
86459
  v_new_lmu = ((uint32_t)(self->private_impl.f_length_modulo_u32 + ((uint32_t)(((uint64_t)(a_x.len))))));
86460
  self->private_impl.f_length_overflows_u32 = ((v_new_lmu < self->private_impl.f_length_modulo_u32) || self->private_impl.f_length_overflows_u32);
86461
  self->private_impl.f_length_modulo_u32 = v_new_lmu;
86462
  while (true) {
86463
    if (self->private_impl.f_buf_len >= 16u) {
86464
      v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[0u])) |
86465
          (((uint32_t)(self->private_impl.f_buf_data[1u])) << 8u) |
86466
          (((uint32_t)(self->private_impl.f_buf_data[2u])) << 16u) |
86467
          (((uint32_t)(self->private_impl.f_buf_data[3u])) << 24u));
86468
      v_v0 = ((uint32_t)(self->private_impl.f_v0 + ((uint32_t)(v_buf_u32 * 2246822519u))));
86469
      v_v0 = (((uint32_t)(v_v0 << 13u)) | (v_v0 >> 19u));
86470
      self->private_impl.f_v0 = ((uint32_t)(v_v0 * 2654435761u));
86471
      v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[4u])) |
86472
          (((uint32_t)(self->private_impl.f_buf_data[5u])) << 8u) |
86473
          (((uint32_t)(self->private_impl.f_buf_data[6u])) << 16u) |
86474
          (((uint32_t)(self->private_impl.f_buf_data[7u])) << 24u));
86475
      v_v1 = ((uint32_t)(self->private_impl.f_v1 + ((uint32_t)(v_buf_u32 * 2246822519u))));
86476
      v_v1 = (((uint32_t)(v_v1 << 13u)) | (v_v1 >> 19u));
86477
      self->private_impl.f_v1 = ((uint32_t)(v_v1 * 2654435761u));
86478
      v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[8u])) |
86479
          (((uint32_t)(self->private_impl.f_buf_data[9u])) << 8u) |
86480
          (((uint32_t)(self->private_impl.f_buf_data[10u])) << 16u) |
86481
          (((uint32_t)(self->private_impl.f_buf_data[11u])) << 24u));
86482
      v_v2 = ((uint32_t)(self->private_impl.f_v2 + ((uint32_t)(v_buf_u32 * 2246822519u))));
86483
      v_v2 = (((uint32_t)(v_v2 << 13u)) | (v_v2 >> 19u));
86484
      self->private_impl.f_v2 = ((uint32_t)(v_v2 * 2654435761u));
86485
      v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[12u])) |
86486
          (((uint32_t)(self->private_impl.f_buf_data[13u])) << 8u) |
86487
          (((uint32_t)(self->private_impl.f_buf_data[14u])) << 16u) |
86488
          (((uint32_t)(self->private_impl.f_buf_data[15u])) << 24u));
86489
      v_v3 = ((uint32_t)(self->private_impl.f_v3 + ((uint32_t)(v_buf_u32 * 2246822519u))));
86490
      v_v3 = (((uint32_t)(v_v3 << 13u)) | (v_v3 >> 19u));
86491
      self->private_impl.f_v3 = ((uint32_t)(v_v3 * 2654435761u));
86492
      self->private_impl.f_buf_len = 0u;
86493
      break;
86494
    }
86495
    if (((uint64_t)(a_x.len)) <= 0u) {
86496
      return wuffs_base__make_empty_struct();
86497
    }
86498
    self->private_impl.f_buf_data[self->private_impl.f_buf_len] = a_x.ptr[0u];
86499
#if defined(__GNUC__)
86500
#pragma GCC diagnostic push
86501
#pragma GCC diagnostic ignored "-Wconversion"
86502
#endif
86503
    self->private_impl.f_buf_len += 1u;
86504
#if defined(__GNUC__)
86505
#pragma GCC diagnostic pop
86506
#endif
86507
    a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u);
86508
  }
86509
  v_buf_len = ((uint32_t)(((uint8_t)(self->private_impl.f_buf_len & 15u))));
86510
  v_v0 = self->private_impl.f_v0;
86511
  v_v1 = self->private_impl.f_v1;
86512
  v_v2 = self->private_impl.f_v2;
86513
  v_v3 = self->private_impl.f_v3;
86514
  {
86515
    wuffs_base__slice_u8 i_slice_p = a_x;
86516
    v_p.ptr = i_slice_p.ptr;
86517
    v_p.len = 16;
86518
    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));
86519
    while (v_p.ptr < i_end0_p) {
86520
      v_buf_u32 = (((uint32_t)(v_p.ptr[0u])) |
86521
          (((uint32_t)(v_p.ptr[1u])) << 8u) |
86522
          (((uint32_t)(v_p.ptr[2u])) << 16u) |
86523
          (((uint32_t)(v_p.ptr[3u])) << 24u));
86524
      v_v0 = ((uint32_t)(v_v0 + ((uint32_t)(v_buf_u32 * 2246822519u))));
86525
      v_v0 = (((uint32_t)(v_v0 << 13u)) | (v_v0 >> 19u));
86526
      v_v0 = ((uint32_t)(v_v0 * 2654435761u));
86527
      v_buf_u32 = (((uint32_t)(v_p.ptr[4u])) |
86528
          (((uint32_t)(v_p.ptr[5u])) << 8u) |
86529
          (((uint32_t)(v_p.ptr[6u])) << 16u) |
86530
          (((uint32_t)(v_p.ptr[7u])) << 24u));
86531
      v_v1 = ((uint32_t)(v_v1 + ((uint32_t)(v_buf_u32 * 2246822519u))));
86532
      v_v1 = (((uint32_t)(v_v1 << 13u)) | (v_v1 >> 19u));
86533
      v_v1 = ((uint32_t)(v_v1 * 2654435761u));
86534
      v_buf_u32 = (((uint32_t)(v_p.ptr[8u])) |
86535
          (((uint32_t)(v_p.ptr[9u])) << 8u) |
86536
          (((uint32_t)(v_p.ptr[10u])) << 16u) |
86537
          (((uint32_t)(v_p.ptr[11u])) << 24u));
86538
      v_v2 = ((uint32_t)(v_v2 + ((uint32_t)(v_buf_u32 * 2246822519u))));
86539
      v_v2 = (((uint32_t)(v_v2 << 13u)) | (v_v2 >> 19u));
86540
      v_v2 = ((uint32_t)(v_v2 * 2654435761u));
86541
      v_buf_u32 = (((uint32_t)(v_p.ptr[12u])) |
86542
          (((uint32_t)(v_p.ptr[13u])) << 8u) |
86543
          (((uint32_t)(v_p.ptr[14u])) << 16u) |
86544
          (((uint32_t)(v_p.ptr[15u])) << 24u));
86545
      v_v3 = ((uint32_t)(v_v3 + ((uint32_t)(v_buf_u32 * 2246822519u))));
86546
      v_v3 = (((uint32_t)(v_v3 << 13u)) | (v_v3 >> 19u));
86547
      v_v3 = ((uint32_t)(v_v3 * 2654435761u));
86548
      v_p.ptr += 16;
86549
    }
86550
    v_p.len = 1;
86551
    const uint8_t* i_end1_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len);
86552
    while (v_p.ptr < i_end1_p) {
86553
      self->private_impl.f_buf_data[v_buf_len] = v_p.ptr[0u];
86554
      v_buf_len = ((v_buf_len + 1u) & 15u);
86555
      v_p.ptr += 1;
86556
    }
86557
    v_p.len = 0;
86558
  }
86559
  self->private_impl.f_buf_len = ((uint8_t)(v_buf_len));
86560
  self->private_impl.f_v0 = v_v0;
86561
  self->private_impl.f_v1 = v_v1;
86562
  self->private_impl.f_v2 = v_v2;
86563
  self->private_impl.f_v3 = v_v3;
86564
  return wuffs_base__make_empty_struct();
86565
}
86566
86567
// -------- func xxhash32.hasher.checksum_u32
86568
86569
WUFFS_BASE__GENERATED_C_CODE
86570
WUFFS_BASE__MAYBE_STATIC uint32_t
86571
wuffs_xxhash32__hasher__checksum_u32(
86572
    const wuffs_xxhash32__hasher* self) {
86573
  if (!self) {
86574
    return 0;
86575
  }
86576
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
86577
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
86578
    return 0;
86579
  }
86580
86581
  uint32_t v_ret = 0;
86582
  uint32_t v_i = 0;
86583
  uint32_t v_n = 0;
86584
  uint32_t v_buf_u32 = 0;
86585
86586
  if ((self->private_impl.f_length_modulo_u32 >= 16u) || self->private_impl.f_length_overflows_u32) {
86587
    v_ret += (((uint32_t)(self->private_impl.f_v0 << 1u)) | (self->private_impl.f_v0 >> 31u));
86588
    v_ret += (((uint32_t)(self->private_impl.f_v1 << 7u)) | (self->private_impl.f_v1 >> 25u));
86589
    v_ret += (((uint32_t)(self->private_impl.f_v2 << 12u)) | (self->private_impl.f_v2 >> 20u));
86590
    v_ret += (((uint32_t)(self->private_impl.f_v3 << 18u)) | (self->private_impl.f_v3 >> 14u));
86591
    v_ret += self->private_impl.f_length_modulo_u32;
86592
  } else {
86593
    v_ret += 374761393u;
86594
    v_ret += self->private_impl.f_length_modulo_u32;
86595
  }
86596
  v_n = 16u;
86597
  v_n = wuffs_base__u32__min(v_n, ((uint32_t)(self->private_impl.f_buf_len)));
86598
  if (4u <= v_n) {
86599
    v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[0u])) |
86600
        (((uint32_t)(self->private_impl.f_buf_data[1u])) << 8u) |
86601
        (((uint32_t)(self->private_impl.f_buf_data[2u])) << 16u) |
86602
        (((uint32_t)(self->private_impl.f_buf_data[3u])) << 24u));
86603
    v_ret += ((uint32_t)(v_buf_u32 * 3266489917u));
86604
    v_ret = (((uint32_t)(v_ret << 17u)) | (v_ret >> 15u));
86605
    v_ret *= 668265263u;
86606
    v_i = 4u;
86607
  }
86608
  if (8u <= v_n) {
86609
    v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[4u])) |
86610
        (((uint32_t)(self->private_impl.f_buf_data[5u])) << 8u) |
86611
        (((uint32_t)(self->private_impl.f_buf_data[6u])) << 16u) |
86612
        (((uint32_t)(self->private_impl.f_buf_data[7u])) << 24u));
86613
    v_ret += ((uint32_t)(v_buf_u32 * 3266489917u));
86614
    v_ret = (((uint32_t)(v_ret << 17u)) | (v_ret >> 15u));
86615
    v_ret *= 668265263u;
86616
    v_i = 8u;
86617
  }
86618
  if (12u <= v_n) {
86619
    v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[8u])) |
86620
        (((uint32_t)(self->private_impl.f_buf_data[9u])) << 8u) |
86621
        (((uint32_t)(self->private_impl.f_buf_data[10u])) << 16u) |
86622
        (((uint32_t)(self->private_impl.f_buf_data[11u])) << 24u));
86623
    v_ret += ((uint32_t)(v_buf_u32 * 3266489917u));
86624
    v_ret = (((uint32_t)(v_ret << 17u)) | (v_ret >> 15u));
86625
    v_ret *= 668265263u;
86626
    v_i = 12u;
86627
  }
86628
  while (v_i < v_n) {
86629
    v_ret += ((uint32_t)(((uint32_t)(self->private_impl.f_buf_data[v_i])) * 374761393u));
86630
    v_ret = (((uint32_t)(v_ret << 11u)) | (v_ret >> 21u));
86631
    v_ret *= 2654435761u;
86632
    v_i += 1u;
86633
  }
86634
  v_ret ^= (v_ret >> 15u);
86635
  v_ret *= 2246822519u;
86636
  v_ret ^= (v_ret >> 13u);
86637
  v_ret *= 3266489917u;
86638
  v_ret ^= (v_ret >> 16u);
86639
  return v_ret;
86640
}
86641
86642
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH32)
86643
86644
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH64)
86645
86646
// ---------------- Status Codes Implementations
86647
86648
// ---------------- Private Consts
86649
86650
#define WUFFS_XXHASH64__XXH_PRIME64_1 11400714785074694791u
86651
86652
#define WUFFS_XXHASH64__XXH_PRIME64_2 14029467366897019727u
86653
86654
#define WUFFS_XXHASH64__XXH_PRIME64_3 1609587929392839161u
86655
86656
#define WUFFS_XXHASH64__XXH_PRIME64_4 9650029242287828579u
86657
86658
#define WUFFS_XXHASH64__XXH_PRIME64_5 2870177450012600261u
86659
86660
#define WUFFS_XXHASH64__INITIAL_V0 6983438078262162902u
86661
86662
#define WUFFS_XXHASH64__INITIAL_V1 14029467366897019727u
86663
86664
#define WUFFS_XXHASH64__INITIAL_V2 0u
86665
86666
#define WUFFS_XXHASH64__INITIAL_V3 7046029288634856825u
86667
86668
// ---------------- Private Initializer Prototypes
86669
86670
// ---------------- Private Function Prototypes
86671
86672
WUFFS_BASE__GENERATED_C_CODE
86673
static wuffs_base__empty_struct
86674
wuffs_xxhash64__hasher__up(
86675
    wuffs_xxhash64__hasher* self,
86676
    wuffs_base__slice_u8 a_x);
86677
86678
// ---------------- VTables
86679
86680
const wuffs_base__hasher_u64__func_ptrs
86681
wuffs_xxhash64__hasher__func_ptrs_for__wuffs_base__hasher_u64 = {
86682
  (uint64_t(*)(const void*))(&wuffs_xxhash64__hasher__checksum_u64),
86683
  (uint64_t(*)(const void*,
86684
      uint32_t))(&wuffs_xxhash64__hasher__get_quirk),
86685
  (wuffs_base__status(*)(void*,
86686
      uint32_t,
86687
      uint64_t))(&wuffs_xxhash64__hasher__set_quirk),
86688
  (wuffs_base__empty_struct(*)(void*,
86689
      wuffs_base__slice_u8))(&wuffs_xxhash64__hasher__update),
86690
  (uint64_t(*)(void*,
86691
      wuffs_base__slice_u8))(&wuffs_xxhash64__hasher__update_u64),
86692
};
86693
86694
// ---------------- Initializer Implementations
86695
86696
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
86697
wuffs_xxhash64__hasher__initialize(
86698
    wuffs_xxhash64__hasher* self,
86699
    size_t sizeof_star_self,
86700
    uint64_t wuffs_version,
86701
    uint32_t options){
86702
  if (!self) {
86703
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
86704
  }
86705
  if (sizeof(*self) != sizeof_star_self) {
86706
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
86707
  }
86708
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
86709
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
86710
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
86711
  }
86712
86713
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
86714
    // The whole point of this if-check is to detect an uninitialized *self.
86715
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
86716
#if !defined(__clang__) && defined(__GNUC__)
86717
#pragma GCC diagnostic push
86718
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
86719
#endif
86720
    if (self->private_impl.magic != 0) {
86721
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
86722
    }
86723
#if !defined(__clang__) && defined(__GNUC__)
86724
#pragma GCC diagnostic pop
86725
#endif
86726
  } else {
86727
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
86728
      memset(self, 0, sizeof(*self));
86729
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
86730
    } else {
86731
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
86732
    }
86733
  }
86734
86735
  self->private_impl.magic = WUFFS_BASE__MAGIC;
86736
  self->private_impl.vtable_for__wuffs_base__hasher_u64.vtable_name =
86737
      wuffs_base__hasher_u64__vtable_name;
86738
  self->private_impl.vtable_for__wuffs_base__hasher_u64.function_pointers =
86739
      (const void*)(&wuffs_xxhash64__hasher__func_ptrs_for__wuffs_base__hasher_u64);
86740
  return wuffs_base__make_status(NULL);
86741
}
86742
86743
wuffs_xxhash64__hasher*
86744
wuffs_xxhash64__hasher__alloc(void) {
86745
  wuffs_xxhash64__hasher* x =
86746
      (wuffs_xxhash64__hasher*)(calloc(1, sizeof(wuffs_xxhash64__hasher)));
86747
  if (!x) {
86748
    return NULL;
86749
  }
86750
  if (wuffs_xxhash64__hasher__initialize(
86751
      x, sizeof(wuffs_xxhash64__hasher), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
86752
    free(x);
86753
    return NULL;
86754
  }
86755
  return x;
86756
}
86757
86758
size_t
86759
sizeof__wuffs_xxhash64__hasher(void) {
86760
  return sizeof(wuffs_xxhash64__hasher);
86761
}
86762
86763
// ---------------- Function Implementations
86764
86765
// -------- func xxhash64.hasher.get_quirk
86766
86767
WUFFS_BASE__GENERATED_C_CODE
86768
WUFFS_BASE__MAYBE_STATIC uint64_t
86769
wuffs_xxhash64__hasher__get_quirk(
86770
    const wuffs_xxhash64__hasher* self,
86771
    uint32_t a_key) {
86772
  if (!self) {
86773
    return 0;
86774
  }
86775
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
86776
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
86777
    return 0;
86778
  }
86779
86780
  return 0u;
86781
}
86782
86783
// -------- func xxhash64.hasher.set_quirk
86784
86785
WUFFS_BASE__GENERATED_C_CODE
86786
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
86787
wuffs_xxhash64__hasher__set_quirk(
86788
    wuffs_xxhash64__hasher* self,
86789
    uint32_t a_key,
86790
    uint64_t a_value) {
86791
  if (!self) {
86792
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
86793
  }
86794
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
86795
    return wuffs_base__make_status(
86796
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
86797
        ? wuffs_base__error__disabled_by_previous_error
86798
        : wuffs_base__error__initialize_not_called);
86799
  }
86800
86801
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
86802
}
86803
86804
// -------- func xxhash64.hasher.update
86805
86806
WUFFS_BASE__GENERATED_C_CODE
86807
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
86808
wuffs_xxhash64__hasher__update(
86809
    wuffs_xxhash64__hasher* self,
86810
    wuffs_base__slice_u8 a_x) {
86811
  if (!self) {
86812
    return wuffs_base__make_empty_struct();
86813
  }
86814
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
86815
    return wuffs_base__make_empty_struct();
86816
  }
86817
86818
  if ((self->private_impl.f_length_modulo_u64 == 0u) &&  ! self->private_impl.f_length_overflows_u64) {
86819
    self->private_impl.f_v0 = 6983438078262162902u;
86820
    self->private_impl.f_v1 = 14029467366897019727u;
86821
    self->private_impl.f_v2 = 0u;
86822
    self->private_impl.f_v3 = 7046029288634856825u;
86823
  }
86824
  wuffs_xxhash64__hasher__up(self, a_x);
86825
  return wuffs_base__make_empty_struct();
86826
}
86827
86828
// -------- func xxhash64.hasher.update_u64
86829
86830
WUFFS_BASE__GENERATED_C_CODE
86831
WUFFS_BASE__MAYBE_STATIC uint64_t
86832
wuffs_xxhash64__hasher__update_u64(
86833
    wuffs_xxhash64__hasher* self,
86834
    wuffs_base__slice_u8 a_x) {
86835
  if (!self) {
86836
    return 0;
86837
  }
86838
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
86839
    return 0;
86840
  }
86841
86842
  wuffs_xxhash64__hasher__update(self, a_x);
86843
  return wuffs_xxhash64__hasher__checksum_u64(self);
86844
}
86845
86846
// -------- func xxhash64.hasher.up
86847
86848
WUFFS_BASE__GENERATED_C_CODE
86849
static wuffs_base__empty_struct
86850
wuffs_xxhash64__hasher__up(
86851
    wuffs_xxhash64__hasher* self,
86852
    wuffs_base__slice_u8 a_x) {
86853
  uint64_t v_new_lmu = 0;
86854
  uint64_t v_buf_u64 = 0;
86855
  uint32_t v_buf_len = 0;
86856
  uint64_t v_v0 = 0;
86857
  uint64_t v_v1 = 0;
86858
  uint64_t v_v2 = 0;
86859
  uint64_t v_v3 = 0;
86860
  wuffs_base__slice_u8 v_p = {0};
86861
86862
  v_new_lmu = ((uint64_t)(self->private_impl.f_length_modulo_u64 + ((uint64_t)(a_x.len))));
86863
  self->private_impl.f_length_overflows_u64 = ((v_new_lmu < self->private_impl.f_length_modulo_u64) || self->private_impl.f_length_overflows_u64);
86864
  self->private_impl.f_length_modulo_u64 = v_new_lmu;
86865
  while (true) {
86866
    if (self->private_impl.f_buf_len >= 32u) {
86867
      v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[0u])) |
86868
          (((uint64_t)(self->private_impl.f_buf_data[1u])) << 8u) |
86869
          (((uint64_t)(self->private_impl.f_buf_data[2u])) << 16u) |
86870
          (((uint64_t)(self->private_impl.f_buf_data[3u])) << 24u) |
86871
          (((uint64_t)(self->private_impl.f_buf_data[4u])) << 32u) |
86872
          (((uint64_t)(self->private_impl.f_buf_data[5u])) << 40u) |
86873
          (((uint64_t)(self->private_impl.f_buf_data[6u])) << 48u) |
86874
          (((uint64_t)(self->private_impl.f_buf_data[7u])) << 56u));
86875
      v_v0 = ((uint64_t)(self->private_impl.f_v0 + ((uint64_t)(v_buf_u64 * 14029467366897019727u))));
86876
      v_v0 = (((uint64_t)(v_v0 << 31u)) | (v_v0 >> 33u));
86877
      self->private_impl.f_v0 = ((uint64_t)(v_v0 * 11400714785074694791u));
86878
      v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[8u])) |
86879
          (((uint64_t)(self->private_impl.f_buf_data[9u])) << 8u) |
86880
          (((uint64_t)(self->private_impl.f_buf_data[10u])) << 16u) |
86881
          (((uint64_t)(self->private_impl.f_buf_data[11u])) << 24u) |
86882
          (((uint64_t)(self->private_impl.f_buf_data[12u])) << 32u) |
86883
          (((uint64_t)(self->private_impl.f_buf_data[13u])) << 40u) |
86884
          (((uint64_t)(self->private_impl.f_buf_data[14u])) << 48u) |
86885
          (((uint64_t)(self->private_impl.f_buf_data[15u])) << 56u));
86886
      v_v1 = ((uint64_t)(self->private_impl.f_v1 + ((uint64_t)(v_buf_u64 * 14029467366897019727u))));
86887
      v_v1 = (((uint64_t)(v_v1 << 31u)) | (v_v1 >> 33u));
86888
      self->private_impl.f_v1 = ((uint64_t)(v_v1 * 11400714785074694791u));
86889
      v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[16u])) |
86890
          (((uint64_t)(self->private_impl.f_buf_data[17u])) << 8u) |
86891
          (((uint64_t)(self->private_impl.f_buf_data[18u])) << 16u) |
86892
          (((uint64_t)(self->private_impl.f_buf_data[19u])) << 24u) |
86893
          (((uint64_t)(self->private_impl.f_buf_data[20u])) << 32u) |
86894
          (((uint64_t)(self->private_impl.f_buf_data[21u])) << 40u) |
86895
          (((uint64_t)(self->private_impl.f_buf_data[22u])) << 48u) |
86896
          (((uint64_t)(self->private_impl.f_buf_data[23u])) << 56u));
86897
      v_v2 = ((uint64_t)(self->private_impl.f_v2 + ((uint64_t)(v_buf_u64 * 14029467366897019727u))));
86898
      v_v2 = (((uint64_t)(v_v2 << 31u)) | (v_v2 >> 33u));
86899
      self->private_impl.f_v2 = ((uint64_t)(v_v2 * 11400714785074694791u));
86900
      v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[24u])) |
86901
          (((uint64_t)(self->private_impl.f_buf_data[25u])) << 8u) |
86902
          (((uint64_t)(self->private_impl.f_buf_data[26u])) << 16u) |
86903
          (((uint64_t)(self->private_impl.f_buf_data[27u])) << 24u) |
86904
          (((uint64_t)(self->private_impl.f_buf_data[28u])) << 32u) |
86905
          (((uint64_t)(self->private_impl.f_buf_data[29u])) << 40u) |
86906
          (((uint64_t)(self->private_impl.f_buf_data[30u])) << 48u) |
86907
          (((uint64_t)(self->private_impl.f_buf_data[31u])) << 56u));
86908
      v_v3 = ((uint64_t)(self->private_impl.f_v3 + ((uint64_t)(v_buf_u64 * 14029467366897019727u))));
86909
      v_v3 = (((uint64_t)(v_v3 << 31u)) | (v_v3 >> 33u));
86910
      self->private_impl.f_v3 = ((uint64_t)(v_v3 * 11400714785074694791u));
86911
      self->private_impl.f_buf_len = 0u;
86912
      break;
86913
    }
86914
    if (((uint64_t)(a_x.len)) <= 0u) {
86915
      return wuffs_base__make_empty_struct();
86916
    }
86917
    self->private_impl.f_buf_data[self->private_impl.f_buf_len] = a_x.ptr[0u];
86918
    self->private_impl.f_buf_len += 1u;
86919
    a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u);
86920
  }
86921
  v_buf_len = (self->private_impl.f_buf_len & 31u);
86922
  v_v0 = self->private_impl.f_v0;
86923
  v_v1 = self->private_impl.f_v1;
86924
  v_v2 = self->private_impl.f_v2;
86925
  v_v3 = self->private_impl.f_v3;
86926
  {
86927
    wuffs_base__slice_u8 i_slice_p = a_x;
86928
    v_p.ptr = i_slice_p.ptr;
86929
    v_p.len = 32;
86930
    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));
86931
    while (v_p.ptr < i_end0_p) {
86932
      v_buf_u64 = (((uint64_t)(v_p.ptr[0u])) |
86933
          (((uint64_t)(v_p.ptr[1u])) << 8u) |
86934
          (((uint64_t)(v_p.ptr[2u])) << 16u) |
86935
          (((uint64_t)(v_p.ptr[3u])) << 24u) |
86936
          (((uint64_t)(v_p.ptr[4u])) << 32u) |
86937
          (((uint64_t)(v_p.ptr[5u])) << 40u) |
86938
          (((uint64_t)(v_p.ptr[6u])) << 48u) |
86939
          (((uint64_t)(v_p.ptr[7u])) << 56u));
86940
      v_v0 = ((uint64_t)(v_v0 + ((uint64_t)(v_buf_u64 * 14029467366897019727u))));
86941
      v_v0 = (((uint64_t)(v_v0 << 31u)) | (v_v0 >> 33u));
86942
      v_v0 = ((uint64_t)(v_v0 * 11400714785074694791u));
86943
      v_buf_u64 = (((uint64_t)(v_p.ptr[8u])) |
86944
          (((uint64_t)(v_p.ptr[9u])) << 8u) |
86945
          (((uint64_t)(v_p.ptr[10u])) << 16u) |
86946
          (((uint64_t)(v_p.ptr[11u])) << 24u) |
86947
          (((uint64_t)(v_p.ptr[12u])) << 32u) |
86948
          (((uint64_t)(v_p.ptr[13u])) << 40u) |
86949
          (((uint64_t)(v_p.ptr[14u])) << 48u) |
86950
          (((uint64_t)(v_p.ptr[15u])) << 56u));
86951
      v_v1 = ((uint64_t)(v_v1 + ((uint64_t)(v_buf_u64 * 14029467366897019727u))));
86952
      v_v1 = (((uint64_t)(v_v1 << 31u)) | (v_v1 >> 33u));
86953
      v_v1 = ((uint64_t)(v_v1 * 11400714785074694791u));
86954
      v_buf_u64 = (((uint64_t)(v_p.ptr[16u])) |
86955
          (((uint64_t)(v_p.ptr[17u])) << 8u) |
86956
          (((uint64_t)(v_p.ptr[18u])) << 16u) |
86957
          (((uint64_t)(v_p.ptr[19u])) << 24u) |
86958
          (((uint64_t)(v_p.ptr[20u])) << 32u) |
86959
          (((uint64_t)(v_p.ptr[21u])) << 40u) |
86960
          (((uint64_t)(v_p.ptr[22u])) << 48u) |
86961
          (((uint64_t)(v_p.ptr[23u])) << 56u));
86962
      v_v2 = ((uint64_t)(v_v2 + ((uint64_t)(v_buf_u64 * 14029467366897019727u))));
86963
      v_v2 = (((uint64_t)(v_v2 << 31u)) | (v_v2 >> 33u));
86964
      v_v2 = ((uint64_t)(v_v2 * 11400714785074694791u));
86965
      v_buf_u64 = (((uint64_t)(v_p.ptr[24u])) |
86966
          (((uint64_t)(v_p.ptr[25u])) << 8u) |
86967
          (((uint64_t)(v_p.ptr[26u])) << 16u) |
86968
          (((uint64_t)(v_p.ptr[27u])) << 24u) |
86969
          (((uint64_t)(v_p.ptr[28u])) << 32u) |
86970
          (((uint64_t)(v_p.ptr[29u])) << 40u) |
86971
          (((uint64_t)(v_p.ptr[30u])) << 48u) |
86972
          (((uint64_t)(v_p.ptr[31u])) << 56u));
86973
      v_v3 = ((uint64_t)(v_v3 + ((uint64_t)(v_buf_u64 * 14029467366897019727u))));
86974
      v_v3 = (((uint64_t)(v_v3 << 31u)) | (v_v3 >> 33u));
86975
      v_v3 = ((uint64_t)(v_v3 * 11400714785074694791u));
86976
      v_p.ptr += 32;
86977
    }
86978
    v_p.len = 1;
86979
    const uint8_t* i_end1_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len);
86980
    while (v_p.ptr < i_end1_p) {
86981
      self->private_impl.f_buf_data[v_buf_len] = v_p.ptr[0u];
86982
      v_buf_len = ((v_buf_len + 1u) & 31u);
86983
      v_p.ptr += 1;
86984
    }
86985
    v_p.len = 0;
86986
  }
86987
  self->private_impl.f_buf_len = v_buf_len;
86988
  self->private_impl.f_v0 = v_v0;
86989
  self->private_impl.f_v1 = v_v1;
86990
  self->private_impl.f_v2 = v_v2;
86991
  self->private_impl.f_v3 = v_v3;
86992
  return wuffs_base__make_empty_struct();
86993
}
86994
86995
// -------- func xxhash64.hasher.checksum_u64
86996
86997
WUFFS_BASE__GENERATED_C_CODE
86998
WUFFS_BASE__MAYBE_STATIC uint64_t
86999
wuffs_xxhash64__hasher__checksum_u64(
87000
    const wuffs_xxhash64__hasher* self) {
87001
  if (!self) {
87002
    return 0;
87003
  }
87004
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
87005
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
87006
    return 0;
87007
  }
87008
87009
  uint64_t v_ret = 0;
87010
  uint64_t v_v0 = 0;
87011
  uint64_t v_v1 = 0;
87012
  uint64_t v_v2 = 0;
87013
  uint64_t v_v3 = 0;
87014
  uint32_t v_i = 0;
87015
  uint32_t v_i8 = 0;
87016
  uint32_t v_n = 0;
87017
  uint32_t v_buf_u32 = 0;
87018
  uint64_t v_buf_u64 = 0;
87019
87020
  if ((self->private_impl.f_length_modulo_u64 >= 32u) || self->private_impl.f_length_overflows_u64) {
87021
    v_ret += (((uint64_t)(self->private_impl.f_v0 << 1u)) | (self->private_impl.f_v0 >> 63u));
87022
    v_ret += (((uint64_t)(self->private_impl.f_v1 << 7u)) | (self->private_impl.f_v1 >> 57u));
87023
    v_ret += (((uint64_t)(self->private_impl.f_v2 << 12u)) | (self->private_impl.f_v2 >> 52u));
87024
    v_ret += (((uint64_t)(self->private_impl.f_v3 << 18u)) | (self->private_impl.f_v3 >> 46u));
87025
    v_v0 = ((uint64_t)(self->private_impl.f_v0 * 14029467366897019727u));
87026
    v_v0 = (((uint64_t)(v_v0 << 31u)) | (v_v0 >> 33u));
87027
    v_v0 *= 11400714785074694791u;
87028
    v_v1 = ((uint64_t)(self->private_impl.f_v1 * 14029467366897019727u));
87029
    v_v1 = (((uint64_t)(v_v1 << 31u)) | (v_v1 >> 33u));
87030
    v_v1 *= 11400714785074694791u;
87031
    v_v2 = ((uint64_t)(self->private_impl.f_v2 * 14029467366897019727u));
87032
    v_v2 = (((uint64_t)(v_v2 << 31u)) | (v_v2 >> 33u));
87033
    v_v2 *= 11400714785074694791u;
87034
    v_v3 = ((uint64_t)(self->private_impl.f_v3 * 14029467366897019727u));
87035
    v_v3 = (((uint64_t)(v_v3 << 31u)) | (v_v3 >> 33u));
87036
    v_v3 *= 11400714785074694791u;
87037
    v_ret = ((uint64_t)(((uint64_t)((v_ret ^ v_v0) * 11400714785074694791u)) + 9650029242287828579u));
87038
    v_ret = ((uint64_t)(((uint64_t)((v_ret ^ v_v1) * 11400714785074694791u)) + 9650029242287828579u));
87039
    v_ret = ((uint64_t)(((uint64_t)((v_ret ^ v_v2) * 11400714785074694791u)) + 9650029242287828579u));
87040
    v_ret = ((uint64_t)(((uint64_t)((v_ret ^ v_v3) * 11400714785074694791u)) + 9650029242287828579u));
87041
    v_ret += self->private_impl.f_length_modulo_u64;
87042
  } else {
87043
    v_ret += 2870177450012600261u;
87044
    v_ret += self->private_impl.f_length_modulo_u64;
87045
  }
87046
  v_n = 32u;
87047
  v_n = wuffs_base__u32__min(v_n, self->private_impl.f_buf_len);
87048
  if (8u <= v_n) {
87049
    v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[0u])) |
87050
        (((uint64_t)(self->private_impl.f_buf_data[1u])) << 8u) |
87051
        (((uint64_t)(self->private_impl.f_buf_data[2u])) << 16u) |
87052
        (((uint64_t)(self->private_impl.f_buf_data[3u])) << 24u) |
87053
        (((uint64_t)(self->private_impl.f_buf_data[4u])) << 32u) |
87054
        (((uint64_t)(self->private_impl.f_buf_data[5u])) << 40u) |
87055
        (((uint64_t)(self->private_impl.f_buf_data[6u])) << 48u) |
87056
        (((uint64_t)(self->private_impl.f_buf_data[7u])) << 56u));
87057
    v_buf_u64 *= 14029467366897019727u;
87058
    v_buf_u64 = (((uint64_t)(v_buf_u64 << 31u)) | (v_buf_u64 >> 33u));
87059
    v_buf_u64 *= 11400714785074694791u;
87060
    v_ret ^= v_buf_u64;
87061
    v_ret = (((uint64_t)(v_ret << 27u)) | (v_ret >> 37u));
87062
    v_ret *= 11400714785074694791u;
87063
    v_ret += 9650029242287828579u;
87064
    v_i = 8u;
87065
  }
87066
  if (16u <= v_n) {
87067
    v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[8u])) |
87068
        (((uint64_t)(self->private_impl.f_buf_data[9u])) << 8u) |
87069
        (((uint64_t)(self->private_impl.f_buf_data[10u])) << 16u) |
87070
        (((uint64_t)(self->private_impl.f_buf_data[11u])) << 24u) |
87071
        (((uint64_t)(self->private_impl.f_buf_data[12u])) << 32u) |
87072
        (((uint64_t)(self->private_impl.f_buf_data[13u])) << 40u) |
87073
        (((uint64_t)(self->private_impl.f_buf_data[14u])) << 48u) |
87074
        (((uint64_t)(self->private_impl.f_buf_data[15u])) << 56u));
87075
    v_buf_u64 *= 14029467366897019727u;
87076
    v_buf_u64 = (((uint64_t)(v_buf_u64 << 31u)) | (v_buf_u64 >> 33u));
87077
    v_buf_u64 *= 11400714785074694791u;
87078
    v_ret ^= v_buf_u64;
87079
    v_ret = (((uint64_t)(v_ret << 27u)) | (v_ret >> 37u));
87080
    v_ret *= 11400714785074694791u;
87081
    v_ret += 9650029242287828579u;
87082
    v_i = 16u;
87083
  }
87084
  if (24u <= v_n) {
87085
    v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[16u])) |
87086
        (((uint64_t)(self->private_impl.f_buf_data[17u])) << 8u) |
87087
        (((uint64_t)(self->private_impl.f_buf_data[18u])) << 16u) |
87088
        (((uint64_t)(self->private_impl.f_buf_data[19u])) << 24u) |
87089
        (((uint64_t)(self->private_impl.f_buf_data[20u])) << 32u) |
87090
        (((uint64_t)(self->private_impl.f_buf_data[21u])) << 40u) |
87091
        (((uint64_t)(self->private_impl.f_buf_data[22u])) << 48u) |
87092
        (((uint64_t)(self->private_impl.f_buf_data[23u])) << 56u));
87093
    v_buf_u64 *= 14029467366897019727u;
87094
    v_buf_u64 = (((uint64_t)(v_buf_u64 << 31u)) | (v_buf_u64 >> 33u));
87095
    v_buf_u64 *= 11400714785074694791u;
87096
    v_ret ^= v_buf_u64;
87097
    v_ret = (((uint64_t)(v_ret << 27u)) | (v_ret >> 37u));
87098
    v_ret *= 11400714785074694791u;
87099
    v_ret += 9650029242287828579u;
87100
    v_i = 24u;
87101
  }
87102
  if ((v_n & 4u) != 0u) {
87103
    v_i8 = (v_i & 24u);
87104
    v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[(v_i8 + 0u)])) |
87105
        (((uint32_t)(self->private_impl.f_buf_data[(v_i8 + 1u)])) << 8u) |
87106
        (((uint32_t)(self->private_impl.f_buf_data[(v_i8 + 2u)])) << 16u) |
87107
        (((uint32_t)(self->private_impl.f_buf_data[(v_i8 + 3u)])) << 24u));
87108
    v_ret ^= ((uint64_t)(((uint64_t)(v_buf_u32)) * 11400714785074694791u));
87109
    v_ret = (((uint64_t)(v_ret << 23u)) | (v_ret >> 41u));
87110
    v_ret *= 14029467366897019727u;
87111
    v_ret += 1609587929392839161u;
87112
    v_i = (v_i8 + 4u);
87113
  }
87114
  while (v_i < v_n) {
87115
    v_ret ^= ((uint64_t)(((uint64_t)(self->private_impl.f_buf_data[v_i])) * 2870177450012600261u));
87116
    v_ret = (((uint64_t)(v_ret << 11u)) | (v_ret >> 53u));
87117
    v_ret *= 11400714785074694791u;
87118
    v_i += 1u;
87119
  }
87120
  v_ret ^= (v_ret >> 33u);
87121
  v_ret *= 14029467366897019727u;
87122
  v_ret ^= (v_ret >> 29u);
87123
  v_ret *= 1609587929392839161u;
87124
  v_ret ^= (v_ret >> 32u);
87125
  return ((uint64_t)(v_ret));
87126
}
87127
87128
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH64)
87129
87130
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XZ)
87131
87132
// ---------------- Status Codes Implementations
87133
87134
const char wuffs_xz__error__bad_bcj_offset[] = "#xz: bad BCJ offset";
87135
const char wuffs_xz__error__bad_block_header[] = "#xz: bad block header";
87136
const char wuffs_xz__error__bad_checksum[] = "#xz: bad checksum";
87137
const char wuffs_xz__error__bad_filter[] = "#xz: bad filter";
87138
const char wuffs_xz__error__bad_footer[] = "#xz: bad footer";
87139
const char wuffs_xz__error__bad_header[] = "#xz: bad header";
87140
const char wuffs_xz__error__bad_header_concatenated_stream[] = "#xz: bad header (concatenated stream)";
87141
const char wuffs_xz__error__bad_index[] = "#xz: bad index";
87142
const char wuffs_xz__error__bad_padding[] = "#xz: bad padding";
87143
const char wuffs_xz__error__truncated_input[] = "#xz: truncated input";
87144
const char wuffs_xz__error__unsupported_checksum_algorithm[] = "#xz: unsupported checksum algorithm";
87145
const char wuffs_xz__error__unsupported_filter[] = "#xz: unsupported filter";
87146
const char wuffs_xz__error__unsupported_filter_combination[] = "#xz: unsupported filter combination";
87147
const char wuffs_xz__error__internal_error_inconsistent_bcj_filter_state[] = "#xz: internal error: inconsistent BCJ filter state";
87148
87149
// ---------------- Private Consts
87150
87151
static const bool
87152
WUFFS_XZ__FILTER_04_X86_MASK_TO_ALLOWED_STATUS[8] WUFFS_BASE__POTENTIALLY_UNUSED = {
87153
  1u, 1u, 1u, 0u, 1u, 0u, 0u, 0u,
87154
};
87155
87156
static const uint8_t
87157
WUFFS_XZ__FILTER_04_X86_MASK_TO_BIT_NUM[8] WUFFS_BASE__POTENTIALLY_UNUSED = {
87158
  0u, 1u, 2u, 2u, 3u, 3u, 3u, 3u,
87159
};
87160
87161
static const uint32_t
87162
WUFFS_XZ__FILTER_04_X86_MASK_TO_XOR_OPERAND[8] WUFFS_BASE__POTENTIALLY_UNUSED = {
87163
  4294967295u, 16777215u, 65535u, 65535u, 255u, 255u, 255u, 255u,
87164
};
87165
87166
static const uint8_t
87167
WUFFS_XZ__FILTER_06_IA64_BRANCH_TABLE[32] WUFFS_BASE__POTENTIALLY_UNUSED = {
87168
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
87169
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
87170
  4u, 4u, 6u, 6u, 0u, 0u, 7u, 7u,
87171
  4u, 4u, 0u, 0u, 4u, 4u, 0u, 0u,
87172
};
87173
87174
#define WUFFS_XZ__QUIRKS_BASE 1963655168u
87175
87176
static const uint8_t
87177
WUFFS_XZ__CHECKSUM_LENGTH[4] WUFFS_BASE__POTENTIALLY_UNUSED = {
87178
  0u, 4u, 8u, 32u,
87179
};
87180
87181
static const uint8_t
87182
WUFFS_XZ__ZEROES[3] WUFFS_BASE__POTENTIALLY_UNUSED = {
87183
  0u, 0u, 0u,
87184
};
87185
87186
static const uint8_t
87187
WUFFS_XZ__BCJ_OFFSET_ALIGNMENT[12] WUFFS_BASE__POTENTIALLY_UNUSED = {
87188
  0u, 0u, 0u, 0u, 1u, 4u, 16u, 4u,
87189
  2u, 4u, 4u, 2u,
87190
};
87191
87192
// ---------------- Private Initializer Prototypes
87193
87194
// ---------------- Private Function Prototypes
87195
87196
WUFFS_BASE__GENERATED_C_CODE
87197
static uint8_t
87198
wuffs_xz__decoder__apply_non_final_filters(
87199
    wuffs_xz__decoder* self,
87200
    wuffs_base__slice_u8 a_dst_slice);
87201
87202
WUFFS_BASE__GENERATED_C_CODE
87203
static uint8_t
87204
wuffs_xz__decoder__apply_non_final_filters__choosy_default(
87205
    wuffs_xz__decoder* self,
87206
    wuffs_base__slice_u8 a_dst_slice);
87207
87208
WUFFS_BASE__GENERATED_C_CODE
87209
static uint8_t
87210
wuffs_xz__decoder__apply_filter_04_x86(
87211
    wuffs_xz__decoder* self,
87212
    wuffs_base__slice_u8 a_dst_slice);
87213
87214
WUFFS_BASE__GENERATED_C_CODE
87215
static uint8_t
87216
wuffs_xz__decoder__apply_filter_05_powerpc(
87217
    wuffs_xz__decoder* self,
87218
    wuffs_base__slice_u8 a_dst_slice);
87219
87220
WUFFS_BASE__GENERATED_C_CODE
87221
static uint8_t
87222
wuffs_xz__decoder__apply_filter_06_ia64(
87223
    wuffs_xz__decoder* self,
87224
    wuffs_base__slice_u8 a_dst_slice);
87225
87226
WUFFS_BASE__GENERATED_C_CODE
87227
static uint8_t
87228
wuffs_xz__decoder__apply_filter_07_arm(
87229
    wuffs_xz__decoder* self,
87230
    wuffs_base__slice_u8 a_dst_slice);
87231
87232
WUFFS_BASE__GENERATED_C_CODE
87233
static uint8_t
87234
wuffs_xz__decoder__apply_filter_08_armthumb(
87235
    wuffs_xz__decoder* self,
87236
    wuffs_base__slice_u8 a_dst_slice);
87237
87238
WUFFS_BASE__GENERATED_C_CODE
87239
static uint8_t
87240
wuffs_xz__decoder__apply_filter_09_sparc(
87241
    wuffs_xz__decoder* self,
87242
    wuffs_base__slice_u8 a_dst_slice);
87243
87244
WUFFS_BASE__GENERATED_C_CODE
87245
static uint8_t
87246
wuffs_xz__decoder__apply_filter_0a_arm64(
87247
    wuffs_xz__decoder* self,
87248
    wuffs_base__slice_u8 a_dst_slice);
87249
87250
WUFFS_BASE__GENERATED_C_CODE
87251
static uint8_t
87252
wuffs_xz__decoder__apply_filter_0b_riscv(
87253
    wuffs_xz__decoder* self,
87254
    wuffs_base__slice_u8 a_dst_slice);
87255
87256
WUFFS_BASE__GENERATED_C_CODE
87257
static wuffs_base__status
87258
wuffs_xz__decoder__do_transform_io(
87259
    wuffs_xz__decoder* self,
87260
    wuffs_base__io_buffer* a_dst,
87261
    wuffs_base__io_buffer* a_src,
87262
    wuffs_base__slice_u8 a_workbuf);
87263
87264
WUFFS_BASE__GENERATED_C_CODE
87265
static wuffs_base__status
87266
wuffs_xz__decoder__decode_block_header_with_padding(
87267
    wuffs_xz__decoder* self,
87268
    wuffs_base__io_buffer* a_src);
87269
87270
WUFFS_BASE__GENERATED_C_CODE
87271
static wuffs_base__status
87272
wuffs_xz__decoder__decode_block_header_sans_padding(
87273
    wuffs_xz__decoder* self,
87274
    wuffs_base__io_buffer* a_src);
87275
87276
WUFFS_BASE__GENERATED_C_CODE
87277
static wuffs_base__status
87278
wuffs_xz__decoder__verify_index(
87279
    wuffs_xz__decoder* self,
87280
    wuffs_base__io_buffer* a_src);
87281
87282
WUFFS_BASE__GENERATED_C_CODE
87283
static wuffs_base__status
87284
wuffs_xz__decoder__verify_footer(
87285
    wuffs_xz__decoder* self,
87286
    wuffs_base__io_buffer* a_src);
87287
87288
// ---------------- VTables
87289
87290
const wuffs_base__io_transformer__func_ptrs
87291
wuffs_xz__decoder__func_ptrs_for__wuffs_base__io_transformer = {
87292
  (wuffs_base__optional_u63(*)(const void*))(&wuffs_xz__decoder__dst_history_retain_length),
87293
  (uint64_t(*)(const void*,
87294
      uint32_t))(&wuffs_xz__decoder__get_quirk),
87295
  (wuffs_base__status(*)(void*,
87296
      uint32_t,
87297
      uint64_t))(&wuffs_xz__decoder__set_quirk),
87298
  (wuffs_base__status(*)(void*,
87299
      wuffs_base__io_buffer*,
87300
      wuffs_base__io_buffer*,
87301
      wuffs_base__slice_u8))(&wuffs_xz__decoder__transform_io),
87302
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_xz__decoder__workbuf_len),
87303
};
87304
87305
// ---------------- Initializer Implementations
87306
87307
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
87308
wuffs_xz__decoder__initialize(
87309
    wuffs_xz__decoder* self,
87310
    size_t sizeof_star_self,
87311
    uint64_t wuffs_version,
87312
    uint32_t options){
87313
  if (!self) {
87314
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
87315
  }
87316
  if (sizeof(*self) != sizeof_star_self) {
87317
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
87318
  }
87319
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
87320
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
87321
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
87322
  }
87323
87324
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
87325
    // The whole point of this if-check is to detect an uninitialized *self.
87326
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
87327
#if !defined(__clang__) && defined(__GNUC__)
87328
#pragma GCC diagnostic push
87329
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
87330
#endif
87331
    if (self->private_impl.magic != 0) {
87332
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
87333
    }
87334
#if !defined(__clang__) && defined(__GNUC__)
87335
#pragma GCC diagnostic pop
87336
#endif
87337
  } else {
87338
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
87339
      memset(self, 0, sizeof(*self));
87340
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
87341
    } else {
87342
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
87343
    }
87344
  }
87345
87346
  self->private_impl.choosy_apply_non_final_filters = &wuffs_xz__decoder__apply_non_final_filters__choosy_default;
87347
87348
  {
87349
    wuffs_base__status z = wuffs_crc32__ieee_hasher__initialize(
87350
        &self->private_data.f_crc32, sizeof(self->private_data.f_crc32), WUFFS_VERSION, options);
87351
    if (z.repr) {
87352
      return z;
87353
    }
87354
  }
87355
  {
87356
    wuffs_base__status z = wuffs_crc64__ecma_hasher__initialize(
87357
        &self->private_data.f_crc64, sizeof(self->private_data.f_crc64), WUFFS_VERSION, options);
87358
    if (z.repr) {
87359
      return z;
87360
    }
87361
  }
87362
  {
87363
    wuffs_base__status z = wuffs_sha256__hasher__initialize(
87364
        &self->private_data.f_sha256, sizeof(self->private_data.f_sha256), WUFFS_VERSION, options);
87365
    if (z.repr) {
87366
      return z;
87367
    }
87368
  }
87369
  {
87370
    wuffs_base__status z = wuffs_lzma__decoder__initialize(
87371
        &self->private_data.f_lzma, sizeof(self->private_data.f_lzma), WUFFS_VERSION, options);
87372
    if (z.repr) {
87373
      return z;
87374
    }
87375
  }
87376
  self->private_impl.magic = WUFFS_BASE__MAGIC;
87377
  self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name =
87378
      wuffs_base__io_transformer__vtable_name;
87379
  self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers =
87380
      (const void*)(&wuffs_xz__decoder__func_ptrs_for__wuffs_base__io_transformer);
87381
  return wuffs_base__make_status(NULL);
87382
}
87383
87384
wuffs_xz__decoder*
87385
wuffs_xz__decoder__alloc(void) {
87386
  wuffs_xz__decoder* x =
87387
      (wuffs_xz__decoder*)(calloc(1, sizeof(wuffs_xz__decoder)));
87388
  if (!x) {
87389
    return NULL;
87390
  }
87391
  if (wuffs_xz__decoder__initialize(
87392
      x, sizeof(wuffs_xz__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
87393
    free(x);
87394
    return NULL;
87395
  }
87396
  return x;
87397
}
87398
87399
size_t
87400
sizeof__wuffs_xz__decoder(void) {
87401
  return sizeof(wuffs_xz__decoder);
87402
}
87403
87404
// ---------------- Function Implementations
87405
87406
// -------- func xz.decoder.apply_non_final_filters
87407
87408
WUFFS_BASE__GENERATED_C_CODE
87409
static uint8_t
87410
wuffs_xz__decoder__apply_non_final_filters(
87411
    wuffs_xz__decoder* self,
87412
    wuffs_base__slice_u8 a_dst_slice) {
87413
  return (*self->private_impl.choosy_apply_non_final_filters)(self, a_dst_slice);
87414
}
87415
87416
WUFFS_BASE__GENERATED_C_CODE
87417
static uint8_t
87418
wuffs_xz__decoder__apply_non_final_filters__choosy_default(
87419
    wuffs_xz__decoder* self,
87420
    wuffs_base__slice_u8 a_dst_slice) {
87421
  uint32_t v_f = 0;
87422
  uint64_t v_i = 0;
87423
  uint32_t v_filter_id = 0;
87424
  uint32_t v_delta_dist = 0;
87425
  uint32_t v_delta_pos = 0;
87426
  uint8_t v_c8 = 0;
87427
87428
  if (self->private_impl.f_num_non_final_filters <= 0u) {
87429
    return 0u;
87430
  }
87431
  v_f = (self->private_impl.f_num_non_final_filters - 1u);
87432
  while (true) {
87433
    v_filter_id = (self->private_impl.f_filters[v_f] & 127u);
87434
    if (v_filter_id == 3u) {
87435
      v_delta_dist = (((self->private_impl.f_filters[v_f] >> 8u) & 255u) + 1u);
87436
      v_delta_pos = (self->private_impl.f_filters[v_f] >> 24u);
87437
      v_i = 0u;
87438
      while (v_i < ((uint64_t)(a_dst_slice.len))) {
87439
        v_c8 = a_dst_slice.ptr[v_i];
87440
#if defined(__GNUC__)
87441
#pragma GCC diagnostic push
87442
#pragma GCC diagnostic ignored "-Wconversion"
87443
#endif
87444
        v_c8 += self->private_data.f_filter_data[v_f][(((uint32_t)(v_delta_dist + v_delta_pos)) & 255u)];
87445
#if defined(__GNUC__)
87446
#pragma GCC diagnostic pop
87447
#endif
87448
        self->private_data.f_filter_data[v_f][(v_delta_pos & 255u)] = v_c8;
87449
        v_delta_pos -= 1u;
87450
        a_dst_slice.ptr[v_i] = v_c8;
87451
        v_i += 1u;
87452
      }
87453
      self->private_impl.f_filters[v_f] &= 65535u;
87454
      self->private_impl.f_filters[v_f] |= ((uint32_t)(v_delta_pos << 24u));
87455
    }
87456
    if (v_f <= 0u) {
87457
      break;
87458
    }
87459
    v_f -= 1u;
87460
  }
87461
  return 0u;
87462
}
87463
87464
// -------- func xz.decoder.apply_filter_04_x86
87465
87466
WUFFS_BASE__GENERATED_C_CODE
87467
static uint8_t
87468
wuffs_xz__decoder__apply_filter_04_x86(
87469
    wuffs_xz__decoder* self,
87470
    wuffs_base__slice_u8 a_dst_slice) {
87471
  wuffs_base__slice_u8 v_s = {0};
87472
  uint32_t v_p = 0;
87473
  uint64_t v_i = 0;
87474
  uint64_t v_prev_pos = 0;
87475
  uint32_t v_prev_mask = 0;
87476
  uint8_t v_c8 = 0;
87477
  uint32_t v_src = 0;
87478
  uint32_t v_dst = 0;
87479
  uint32_t v_bit_num = 0;
87480
87481
  v_s = a_dst_slice;
87482
  v_p = ((uint32_t)(self->private_impl.f_bcj_pos + 5u));
87483
  v_prev_pos = 18446744073709551615u;
87484
  v_prev_mask = self->private_impl.f_bcj_x86_prev_mask;
87485
  while (((uint64_t)(v_s.len)) >= 5u) {
87486
    if (((uint8_t)(v_s.ptr[0u] & 254u)) != 232u) {
87487
      v_i += 1u;
87488
      v_p += 1u;
87489
      v_s = wuffs_base__slice_u8__subslice_i(v_s, 1u);
87490
      continue;
87491
    }
87492
    v_prev_pos = ((uint64_t)(v_i - v_prev_pos));
87493
    if (v_prev_pos > 3u) {
87494
      v_prev_mask = 0u;
87495
    } else if (v_prev_pos > 0u) {
87496
      v_prev_mask = (((uint32_t)(v_prev_mask << (v_prev_pos - 1u))) & 7u);
87497
      if (v_prev_mask != 0u) {
87498
        v_c8 = v_s.ptr[((uint8_t)(4u - WUFFS_XZ__FILTER_04_X86_MASK_TO_BIT_NUM[(v_prev_mask & 7u)]))];
87499
        if ( ! WUFFS_XZ__FILTER_04_X86_MASK_TO_ALLOWED_STATUS[(v_prev_mask & 7u)] || (v_c8 == 0u) || (v_c8 == 255u)) {
87500
          v_prev_pos = v_i;
87501
          v_prev_mask = (((uint32_t)(v_prev_mask << 1u)) | 1u);
87502
          v_i += 1u;
87503
          v_p += 1u;
87504
          v_s = wuffs_base__slice_u8__subslice_i(v_s, 1u);
87505
          continue;
87506
        }
87507
      }
87508
    }
87509
    v_prev_pos = v_i;
87510
    v_c8 = v_s.ptr[4u];
87511
    if ((v_c8 != 0u) && (v_c8 != 255u)) {
87512
      v_prev_mask = (((uint32_t)(v_prev_mask << 1u)) | 1u);
87513
      v_i += 1u;
87514
      v_p += 1u;
87515
      v_s = wuffs_base__slice_u8__subslice_i(v_s, 1u);
87516
      continue;
87517
    }
87518
    v_src = ((((uint32_t)(v_s.ptr[1u])) << 0u) |
87519
        (((uint32_t)(v_s.ptr[2u])) << 8u) |
87520
        (((uint32_t)(v_s.ptr[3u])) << 16u) |
87521
        (((uint32_t)(v_s.ptr[4u])) << 24u));
87522
    while (true) {
87523
      v_dst = ((uint32_t)(v_src - v_p));
87524
      if (v_prev_mask == 0u) {
87525
        break;
87526
      }
87527
      v_bit_num = ((uint32_t)(WUFFS_XZ__FILTER_04_X86_MASK_TO_BIT_NUM[(v_prev_mask & 7u)]));
87528
      v_c8 = ((uint8_t)((v_dst >> (24u - (v_bit_num * 8u)))));
87529
      if ((v_c8 != 0u) && (v_c8 != 255u)) {
87530
        break;
87531
      }
87532
      v_src = (v_dst ^ WUFFS_XZ__FILTER_04_X86_MASK_TO_XOR_OPERAND[(v_prev_mask & 7u)]);
87533
    }
87534
    v_dst &= 33554431u;
87535
    v_dst |= ((uint32_t)(0u - (v_dst & 16777216u)));
87536
    v_s.ptr[1u] = ((uint8_t)((v_dst >> 0u)));
87537
    v_s.ptr[2u] = ((uint8_t)((v_dst >> 8u)));
87538
    v_s.ptr[3u] = ((uint8_t)((v_dst >> 16u)));
87539
    v_s.ptr[4u] = ((uint8_t)((v_dst >> 24u)));
87540
    v_i += 5u;
87541
    v_p += 5u;
87542
    v_s = wuffs_base__slice_u8__subslice_i(v_s, 5u);
87543
  }
87544
  v_prev_pos = ((uint64_t)(v_i - v_prev_pos));
87545
  if (v_prev_pos > 3u) {
87546
    self->private_impl.f_bcj_x86_prev_mask = 0u;
87547
  } else if (v_prev_pos > 0u) {
87548
    self->private_impl.f_bcj_x86_prev_mask = ((uint32_t)(v_prev_mask << (v_prev_pos - 1u)));
87549
  }
87550
  self->private_impl.f_bcj_pos = ((uint32_t)(v_p - 5u));
87551
  return ((uint8_t)(((uint64_t)(v_s.len))));
87552
}
87553
87554
// -------- func xz.decoder.apply_filter_05_powerpc
87555
87556
WUFFS_BASE__GENERATED_C_CODE
87557
static uint8_t
87558
wuffs_xz__decoder__apply_filter_05_powerpc(
87559
    wuffs_xz__decoder* self,
87560
    wuffs_base__slice_u8 a_dst_slice) {
87561
  wuffs_base__slice_u8 v_s = {0};
87562
  uint32_t v_p = 0;
87563
  uint32_t v_x = 0;
87564
87565
  v_s = a_dst_slice;
87566
  v_p = self->private_impl.f_bcj_pos;
87567
  while (((uint64_t)(v_s.len)) >= 4u) {
87568
    v_x = ((((uint32_t)(v_s.ptr[0u])) << 24u) |
87569
        (((uint32_t)(v_s.ptr[1u])) << 16u) |
87570
        (((uint32_t)(v_s.ptr[2u])) << 8u) |
87571
        (((uint32_t)(v_s.ptr[3u])) << 0u));
87572
    if ((v_x & 4227858435u) == 1207959553u) {
87573
      v_x = ((((uint32_t)((v_x & 67108860u) - v_p)) & 67108860u) | 1207959553u);
87574
      v_s.ptr[0u] = ((uint8_t)((v_x >> 24u)));
87575
      v_s.ptr[1u] = ((uint8_t)((v_x >> 16u)));
87576
      v_s.ptr[2u] = ((uint8_t)((v_x >> 8u)));
87577
      v_s.ptr[3u] = ((uint8_t)((v_x >> 0u)));
87578
    }
87579
    v_p += 4u;
87580
    v_s = wuffs_base__slice_u8__subslice_i(v_s, 4u);
87581
  }
87582
  self->private_impl.f_bcj_pos = v_p;
87583
  return ((uint8_t)(((uint64_t)(v_s.len))));
87584
}
87585
87586
// -------- func xz.decoder.apply_filter_06_ia64
87587
87588
WUFFS_BASE__GENERATED_C_CODE
87589
static uint8_t
87590
wuffs_xz__decoder__apply_filter_06_ia64(
87591
    wuffs_xz__decoder* self,
87592
    wuffs_base__slice_u8 a_dst_slice) {
87593
  wuffs_base__slice_u8 v_s = {0};
87594
  uint32_t v_p = 0;
87595
  uint32_t v_mask = 0;
87596
  uint32_t v_slot = 0;
87597
  uint32_t v_bit_pos = 0;
87598
  uint32_t v_byte_pos = 0;
87599
  uint32_t v_bit_res = 0;
87600
  uint64_t v_x = 0;
87601
  uint32_t v_j = 0;
87602
  uint64_t v_norm = 0;
87603
  uint32_t v_addr = 0;
87604
87605
  v_s = a_dst_slice;
87606
  v_p = self->private_impl.f_bcj_pos;
87607
  while (((uint64_t)(v_s.len)) >= 16u) {
87608
    v_mask = ((uint32_t)(WUFFS_XZ__FILTER_06_IA64_BRANCH_TABLE[((uint8_t)(v_s.ptr[0u] & 31u))]));
87609
    v_slot = 0u;
87610
    while (true) {
87611
      do {
87612
        if (((v_mask >> v_slot) & 1u) == 0u) {
87613
          break;
87614
        }
87615
        v_bit_pos = ((v_slot * 41u) + 5u);
87616
        v_byte_pos = (v_bit_pos >> 3u);
87617
        v_bit_res = (v_bit_pos & 7u);
87618
        v_x = 0u;
87619
        v_j = 0u;
87620
        while (v_j < 6u) {
87621
          v_x |= (((uint64_t)(v_s.ptr[(v_j + v_byte_pos)])) << (8u * v_j));
87622
          v_j += 1u;
87623
        }
87624
        v_norm = (v_x >> v_bit_res);
87625
        if ((((v_norm >> 37u) & 15u) != 5u) || (((v_norm >> 9u) & 7u) != 0u)) {
87626
          break;
87627
        }
87628
        v_addr = ((uint32_t)(((v_norm >> 13u) & 1048575u)));
87629
        v_addr |= (((uint32_t)(((v_norm >> 36u) & 1u))) << 20u);
87630
        v_addr <<= 4u;
87631
        v_addr -= v_p;
87632
        v_addr >>= 4u;
87633
        v_norm &= 18446743996400148479u;
87634
        v_norm |= (((uint64_t)((v_addr & 1048575u))) << 13u);
87635
        v_norm |= (((uint64_t)((v_addr & 1048576u))) << 16u);
87636
        v_x &= ((((uint64_t)(1u)) << v_bit_res) - 1u);
87637
        v_x |= ((uint64_t)(v_norm << v_bit_res));
87638
        v_j = 0u;
87639
        while (v_j < 6u) {
87640
          v_s.ptr[(v_j + v_byte_pos)] = ((uint8_t)((v_x >> (8u * v_j))));
87641
          v_j += 1u;
87642
        }
87643
      } while (0);
87644
      if (v_slot >= 2u) {
87645
        break;
87646
      }
87647
      v_slot += 1u;
87648
    }
87649
    v_p += 16u;
87650
    v_s = wuffs_base__slice_u8__subslice_i(v_s, 16u);
87651
  }
87652
  self->private_impl.f_bcj_pos = v_p;
87653
  return ((uint8_t)(((uint64_t)(v_s.len))));
87654
}
87655
87656
// -------- func xz.decoder.apply_filter_07_arm
87657
87658
WUFFS_BASE__GENERATED_C_CODE
87659
static uint8_t
87660
wuffs_xz__decoder__apply_filter_07_arm(
87661
    wuffs_xz__decoder* self,
87662
    wuffs_base__slice_u8 a_dst_slice) {
87663
  wuffs_base__slice_u8 v_s = {0};
87664
  uint32_t v_p = 0;
87665
  uint32_t v_x = 0;
87666
87667
  v_s = a_dst_slice;
87668
  v_p = ((uint32_t)(self->private_impl.f_bcj_pos + 8u));
87669
  while (((uint64_t)(v_s.len)) >= 4u) {
87670
    if (v_s.ptr[3u] == 235u) {
87671
      v_x = ((((uint32_t)(v_s.ptr[0u])) << 0u) |
87672
          (((uint32_t)(v_s.ptr[1u])) << 8u) |
87673
          (((uint32_t)(v_s.ptr[2u])) << 16u) |
87674
          (((uint32_t)(v_s.ptr[3u])) << 24u));
87675
      v_x = (((uint32_t)(((v_x & 16777215u) << 2u) - v_p)) >> 2u);
87676
      v_s.ptr[0u] = ((uint8_t)((v_x >> 0u)));
87677
      v_s.ptr[1u] = ((uint8_t)((v_x >> 8u)));
87678
      v_s.ptr[2u] = ((uint8_t)((v_x >> 16u)));
87679
    }
87680
    v_p += 4u;
87681
    v_s = wuffs_base__slice_u8__subslice_i(v_s, 4u);
87682
  }
87683
  self->private_impl.f_bcj_pos = ((uint32_t)(v_p - 8u));
87684
  return ((uint8_t)(((uint64_t)(v_s.len))));
87685
}
87686
87687
// -------- func xz.decoder.apply_filter_08_armthumb
87688
87689
WUFFS_BASE__GENERATED_C_CODE
87690
static uint8_t
87691
wuffs_xz__decoder__apply_filter_08_armthumb(
87692
    wuffs_xz__decoder* self,
87693
    wuffs_base__slice_u8 a_dst_slice) {
87694
  wuffs_base__slice_u8 v_s = {0};
87695
  uint32_t v_p = 0;
87696
  uint32_t v_x = 0;
87697
  uint32_t v_y = 0;
87698
87699
  v_s = a_dst_slice;
87700
  v_p = ((uint32_t)(self->private_impl.f_bcj_pos + 4u));
87701
  while (((uint64_t)(v_s.len)) >= 4u) {
87702
    v_x = ((((uint32_t)(v_s.ptr[0u])) << 0u) |
87703
        (((uint32_t)(v_s.ptr[1u])) << 8u) |
87704
        (((uint32_t)(v_s.ptr[2u])) << 16u) |
87705
        (((uint32_t)(v_s.ptr[3u])) << 24u));
87706
    if ((v_x & 4160813056u) != 4160811008u) {
87707
      v_p += 2u;
87708
      v_s = wuffs_base__slice_u8__subslice_i(v_s, 2u);
87709
      continue;
87710
    }
87711
    v_y = ((((uint32_t)(((uint8_t)(v_s.ptr[0u] & 255u)))) << 11u) |
87712
        (((uint32_t)(((uint8_t)(v_s.ptr[1u] & 7u)))) << 19u) |
87713
        (((uint32_t)(((uint8_t)(v_s.ptr[2u] & 255u)))) << 0u) |
87714
        (((uint32_t)(((uint8_t)(v_s.ptr[3u] & 7u)))) << 8u));
87715
    v_y = (((uint32_t)(((uint32_t)(v_y << 1u)) - v_p)) >> 1u);
87716
    v_s.ptr[0u] = ((uint8_t)((v_y >> 11u)));
87717
    v_s.ptr[1u] = ((uint8_t)((((v_y >> 19u) & 7u) | 240u)));
87718
    v_s.ptr[2u] = ((uint8_t)((v_y >> 0u)));
87719
    v_s.ptr[3u] = ((uint8_t)((((v_y >> 8u) & 7u) | 248u)));
87720
    v_p += 4u;
87721
    v_s = wuffs_base__slice_u8__subslice_i(v_s, 4u);
87722
  }
87723
  self->private_impl.f_bcj_pos = ((uint32_t)(v_p - 4u));
87724
  return ((uint8_t)(((uint64_t)(v_s.len))));
87725
}
87726
87727
// -------- func xz.decoder.apply_filter_09_sparc
87728
87729
WUFFS_BASE__GENERATED_C_CODE
87730
static uint8_t
87731
wuffs_xz__decoder__apply_filter_09_sparc(
87732
    wuffs_xz__decoder* self,
87733
    wuffs_base__slice_u8 a_dst_slice) {
87734
  wuffs_base__slice_u8 v_s = {0};
87735
  uint32_t v_p = 0;
87736
  uint32_t v_x = 0;
87737
87738
  v_s = a_dst_slice;
87739
  v_p = self->private_impl.f_bcj_pos;
87740
  while (((uint64_t)(v_s.len)) >= 4u) {
87741
    v_x = ((((uint32_t)(v_s.ptr[0u])) << 24u) |
87742
        (((uint32_t)(v_s.ptr[1u])) << 16u) |
87743
        (((uint32_t)(v_s.ptr[2u])) << 8u) |
87744
        (((uint32_t)(v_s.ptr[3u])) << 0u));
87745
    if (((v_x >> 22u) == 256u) || ((v_x >> 22u) == 511u)) {
87746
      v_x = (((uint32_t)(((uint32_t)(v_x << 2u)) - v_p)) >> 2u);
87747
      v_x = ((1073741824u - (v_x & 4194304u)) | 1073741824u | (v_x & 4194303u));
87748
      v_s.ptr[0u] = ((uint8_t)((v_x >> 24u)));
87749
      v_s.ptr[1u] = ((uint8_t)((v_x >> 16u)));
87750
      v_s.ptr[2u] = ((uint8_t)((v_x >> 8u)));
87751
      v_s.ptr[3u] = ((uint8_t)((v_x >> 0u)));
87752
    }
87753
    v_p += 4u;
87754
    v_s = wuffs_base__slice_u8__subslice_i(v_s, 4u);
87755
  }
87756
  self->private_impl.f_bcj_pos = v_p;
87757
  return ((uint8_t)(((uint64_t)(v_s.len))));
87758
}
87759
87760
// -------- func xz.decoder.apply_filter_0a_arm64
87761
87762
WUFFS_BASE__GENERATED_C_CODE
87763
static uint8_t
87764
wuffs_xz__decoder__apply_filter_0a_arm64(
87765
    wuffs_xz__decoder* self,
87766
    wuffs_base__slice_u8 a_dst_slice) {
87767
  wuffs_base__slice_u8 v_s = {0};
87768
  uint32_t v_p = 0;
87769
  uint32_t v_x = 0;
87770
  uint32_t v_y = 0;
87771
87772
  v_s = a_dst_slice;
87773
  v_p = self->private_impl.f_bcj_pos;
87774
  while (((uint64_t)(v_s.len)) >= 4u) {
87775
    v_x = ((((uint32_t)(v_s.ptr[0u])) << 0u) |
87776
        (((uint32_t)(v_s.ptr[1u])) << 8u) |
87777
        (((uint32_t)(v_s.ptr[2u])) << 16u) |
87778
        (((uint32_t)(v_s.ptr[3u])) << 24u));
87779
    if ((v_x >> 26u) == 37u) {
87780
      v_y = ((uint32_t)(v_x - (v_p >> 2u)));
87781
      v_x = (2483027968u | (v_y & 67108863u));
87782
      v_s.ptr[0u] = ((uint8_t)((v_x >> 0u)));
87783
      v_s.ptr[1u] = ((uint8_t)((v_x >> 8u)));
87784
      v_s.ptr[2u] = ((uint8_t)((v_x >> 16u)));
87785
      v_s.ptr[3u] = ((uint8_t)((v_x >> 24u)));
87786
    } else if ((v_x & 2667577344u) == 2415919104u) {
87787
      v_y = (((v_x >> 29u) & 3u) | ((v_x >> 3u) & 2097148u));
87788
      if ((((uint32_t)(v_y + 131072u)) & 1835008u) == 0u) {
87789
        v_y -= (v_p >> 12u);
87790
        v_x &= 2415919135u;
87791
        v_x |= ((v_y & 3u) << 29u);
87792
        v_x |= ((v_y & 262140u) << 3u);
87793
        v_x |= (((uint32_t)(0u - (v_y & 131072u))) & 14680064u);
87794
        v_s.ptr[0u] = ((uint8_t)((v_x >> 0u)));
87795
        v_s.ptr[1u] = ((uint8_t)((v_x >> 8u)));
87796
        v_s.ptr[2u] = ((uint8_t)((v_x >> 16u)));
87797
        v_s.ptr[3u] = ((uint8_t)((v_x >> 24u)));
87798
      }
87799
    }
87800
    v_p += 4u;
87801
    v_s = wuffs_base__slice_u8__subslice_i(v_s, 4u);
87802
  }
87803
  self->private_impl.f_bcj_pos = v_p;
87804
  return ((uint8_t)(((uint64_t)(v_s.len))));
87805
}
87806
87807
// -------- func xz.decoder.apply_filter_0b_riscv
87808
87809
WUFFS_BASE__GENERATED_C_CODE
87810
static uint8_t
87811
wuffs_xz__decoder__apply_filter_0b_riscv(
87812
    wuffs_xz__decoder* self,
87813
    wuffs_base__slice_u8 a_dst_slice) {
87814
  wuffs_base__slice_u8 v_s = {0};
87815
  uint32_t v_p = 0;
87816
  uint32_t v_x = 0;
87817
  uint32_t v_x27 = 0;
87818
  uint32_t v_y = 0;
87819
  uint32_t v_addr = 0;
87820
87821
  v_s = a_dst_slice;
87822
  v_p = self->private_impl.f_bcj_pos;
87823
  while (((uint64_t)(v_s.len)) >= 8u) {
87824
    if (v_s.ptr[0u] == 239u) {
87825
      if (((uint8_t)(v_s.ptr[1u] & 13u)) != 0u) {
87826
        v_p += 2u;
87827
        v_s = wuffs_base__slice_u8__subslice_i(v_s, 2u);
87828
        continue;
87829
      }
87830
      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));
87831
      v_addr -= v_p;
87832
      v_s.ptr[1u] = ((uint8_t)(((uint8_t)(v_s.ptr[1u] & 15u)) | ((uint8_t)(((v_addr >> 8u) & 240u)))));
87833
      v_s.ptr[2u] = ((uint8_t)((((v_addr >> 16u) & 15u) | ((v_addr >> 7u) & 16u) | (((uint32_t)(v_addr << 4u)) & 224u))));
87834
      v_s.ptr[3u] = ((uint8_t)((((v_addr >> 4u) & 127u) | ((v_addr >> 13u) & 128u))));
87835
      v_p += 4u;
87836
      v_s = wuffs_base__slice_u8__subslice_i(v_s, 4u);
87837
      continue;
87838
    } else if (((uint8_t)(v_s.ptr[0u] & 127u)) == 23u) {
87839
      v_x = ((((uint32_t)(v_s.ptr[0u])) << 0u) |
87840
          (((uint32_t)(v_s.ptr[1u])) << 8u) |
87841
          (((uint32_t)(v_s.ptr[2u])) << 16u) |
87842
          (((uint32_t)(v_s.ptr[3u])) << 24u));
87843
      if ((v_x & 3712u) != 0u) {
87844
        v_y = ((((uint32_t)(v_s.ptr[4u])) << 0u) |
87845
            (((uint32_t)(v_s.ptr[5u])) << 8u) |
87846
            (((uint32_t)(v_s.ptr[6u])) << 16u) |
87847
            (((uint32_t)(v_s.ptr[7u])) << 24u));
87848
        if (((((uint32_t)(v_x << 8u)) ^ ((uint32_t)(v_y - 3u))) & 1015811u) != 0u) {
87849
          v_p += 6u;
87850
          v_s = wuffs_base__slice_u8__subslice_i(v_s, 6u);
87851
          continue;
87852
        }
87853
        v_addr = ((v_x & 4294963200u) | (v_y >> 20u));
87854
        v_x = (279u | ((uint32_t)(v_y << 12u)));
87855
        v_s.ptr[0u] = ((uint8_t)((v_x >> 0u)));
87856
        v_s.ptr[1u] = ((uint8_t)((v_x >> 8u)));
87857
        v_s.ptr[2u] = ((uint8_t)((v_x >> 16u)));
87858
        v_s.ptr[3u] = ((uint8_t)((v_x >> 24u)));
87859
        v_s.ptr[4u] = ((uint8_t)((v_addr >> 0u)));
87860
        v_s.ptr[5u] = ((uint8_t)((v_addr >> 8u)));
87861
        v_s.ptr[6u] = ((uint8_t)((v_addr >> 16u)));
87862
        v_s.ptr[7u] = ((uint8_t)((v_addr >> 24u)));
87863
        v_p += 8u;
87864
        v_s = wuffs_base__slice_u8__subslice_i(v_s, 8u);
87865
        continue;
87866
      }
87867
      v_x27 = (v_x >> 27u);
87868
      if (((uint32_t)(((uint32_t)(v_x - 12567u)) << 18u)) >= (v_x27 & 29u)) {
87869
        v_p += 4u;
87870
        v_s = wuffs_base__slice_u8__subslice_i(v_s, 4u);
87871
        continue;
87872
      }
87873
      v_addr = ((((uint32_t)(v_s.ptr[4u])) << 24u) |
87874
          (((uint32_t)(v_s.ptr[5u])) << 16u) |
87875
          (((uint32_t)(v_s.ptr[6u])) << 8u) |
87876
          (((uint32_t)(v_s.ptr[7u])) << 0u));
87877
      v_addr -= v_p;
87878
      v_y = ((v_x >> 12u) | ((uint32_t)(v_addr << 20u)));
87879
      v_x = (23u | (v_x27 << 7u) | (((uint32_t)(v_addr + 2048u)) & 4294963200u));
87880
      v_s.ptr[0u] = ((uint8_t)((v_x >> 0u)));
87881
      v_s.ptr[1u] = ((uint8_t)((v_x >> 8u)));
87882
      v_s.ptr[2u] = ((uint8_t)((v_x >> 16u)));
87883
      v_s.ptr[3u] = ((uint8_t)((v_x >> 24u)));
87884
      v_s.ptr[4u] = ((uint8_t)((v_y >> 0u)));
87885
      v_s.ptr[5u] = ((uint8_t)((v_y >> 8u)));
87886
      v_s.ptr[6u] = ((uint8_t)((v_y >> 16u)));
87887
      v_s.ptr[7u] = ((uint8_t)((v_y >> 24u)));
87888
      v_p += 8u;
87889
      v_s = wuffs_base__slice_u8__subslice_i(v_s, 8u);
87890
      continue;
87891
    }
87892
    v_p += 2u;
87893
    v_s = wuffs_base__slice_u8__subslice_i(v_s, 2u);
87894
  }
87895
  self->private_impl.f_bcj_pos = v_p;
87896
  return ((uint8_t)(((uint64_t)(v_s.len))));
87897
}
87898
87899
// -------- func xz.decoder.get_quirk
87900
87901
WUFFS_BASE__GENERATED_C_CODE
87902
WUFFS_BASE__MAYBE_STATIC uint64_t
87903
wuffs_xz__decoder__get_quirk(
87904
    const wuffs_xz__decoder* self,
87905
    uint32_t a_key) {
87906
  if (!self) {
87907
    return 0;
87908
  }
87909
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
87910
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
87911
    return 0;
87912
  }
87913
87914
  if (a_key == 1u) {
87915
    if (self->private_impl.f_ignore_checksum) {
87916
      return 1u;
87917
    }
87918
  } else if (a_key == 1963655168u) {
87919
    if (self->private_impl.f_standalone_format) {
87920
      return 1u;
87921
    }
87922
  }
87923
  return 0u;
87924
}
87925
87926
// -------- func xz.decoder.set_quirk
87927
87928
WUFFS_BASE__GENERATED_C_CODE
87929
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
87930
wuffs_xz__decoder__set_quirk(
87931
    wuffs_xz__decoder* self,
87932
    uint32_t a_key,
87933
    uint64_t a_value) {
87934
  if (!self) {
87935
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
87936
  }
87937
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
87938
    return wuffs_base__make_status(
87939
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
87940
        ? wuffs_base__error__disabled_by_previous_error
87941
        : wuffs_base__error__initialize_not_called);
87942
  }
87943
87944
  if (a_key == 1u) {
87945
    self->private_impl.f_ignore_checksum = (a_value > 0u);
87946
    return wuffs_base__make_status(NULL);
87947
  } else if (a_key == 1963655168u) {
87948
    self->private_impl.f_standalone_format = (a_value > 0u);
87949
    return wuffs_base__make_status(NULL);
87950
  }
87951
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
87952
}
87953
87954
// -------- func xz.decoder.dst_history_retain_length
87955
87956
WUFFS_BASE__GENERATED_C_CODE
87957
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
87958
wuffs_xz__decoder__dst_history_retain_length(
87959
    const wuffs_xz__decoder* self) {
87960
  if (!self) {
87961
    return wuffs_base__utility__make_optional_u63(false, 0u);
87962
  }
87963
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
87964
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
87965
    return wuffs_base__utility__make_optional_u63(false, 0u);
87966
  }
87967
87968
  return wuffs_lzma__decoder__dst_history_retain_length(&self->private_data.f_lzma);
87969
}
87970
87971
// -------- func xz.decoder.workbuf_len
87972
87973
WUFFS_BASE__GENERATED_C_CODE
87974
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
87975
wuffs_xz__decoder__workbuf_len(
87976
    const wuffs_xz__decoder* self) {
87977
  if (!self) {
87978
    return wuffs_base__utility__empty_range_ii_u64();
87979
  }
87980
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
87981
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
87982
    return wuffs_base__utility__empty_range_ii_u64();
87983
  }
87984
87985
  return wuffs_lzma__decoder__workbuf_len(&self->private_data.f_lzma);
87986
}
87987
87988
// -------- func xz.decoder.transform_io
87989
87990
WUFFS_BASE__GENERATED_C_CODE
87991
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
87992
wuffs_xz__decoder__transform_io(
87993
    wuffs_xz__decoder* self,
87994
    wuffs_base__io_buffer* a_dst,
87995
    wuffs_base__io_buffer* a_src,
87996
    wuffs_base__slice_u8 a_workbuf) {
87997
  if (!self) {
87998
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
87999
  }
88000
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
88001
    return wuffs_base__make_status(
88002
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
88003
        ? wuffs_base__error__disabled_by_previous_error
88004
        : wuffs_base__error__initialize_not_called);
88005
  }
88006
  if (!a_dst || !a_src) {
88007
    self->private_impl.magic = WUFFS_BASE__DISABLED;
88008
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
88009
  }
88010
  if ((self->private_impl.active_coroutine != 0) &&
88011
      (self->private_impl.active_coroutine != 1)) {
88012
    self->private_impl.magic = WUFFS_BASE__DISABLED;
88013
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
88014
  }
88015
  self->private_impl.active_coroutine = 0;
88016
  wuffs_base__status status = wuffs_base__make_status(NULL);
88017
88018
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
88019
88020
  uint32_t coro_susp_point = self->private_impl.p_transform_io;
88021
  switch (coro_susp_point) {
88022
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
88023
88024
    while (true) {
88025
      {
88026
        wuffs_base__status t_0 = wuffs_xz__decoder__do_transform_io(self, a_dst, a_src, a_workbuf);
88027
        v_status = t_0;
88028
      }
88029
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
88030
        status = wuffs_base__make_status(wuffs_xz__error__truncated_input);
88031
        goto exit;
88032
      }
88033
      status = v_status;
88034
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
88035
    }
88036
88037
    ok:
88038
    self->private_impl.p_transform_io = 0;
88039
    goto exit;
88040
  }
88041
88042
  goto suspend;
88043
  suspend:
88044
  self->private_impl.p_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
88045
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
88046
88047
  goto exit;
88048
  exit:
88049
  if (wuffs_base__status__is_error(&status)) {
88050
    self->private_impl.magic = WUFFS_BASE__DISABLED;
88051
  }
88052
  return status;
88053
}
88054
88055
// -------- func xz.decoder.do_transform_io
88056
88057
WUFFS_BASE__GENERATED_C_CODE
88058
static wuffs_base__status
88059
wuffs_xz__decoder__do_transform_io(
88060
    wuffs_xz__decoder* self,
88061
    wuffs_base__io_buffer* a_dst,
88062
    wuffs_base__io_buffer* a_src,
88063
    wuffs_base__slice_u8 a_workbuf) {
88064
  wuffs_base__status status = wuffs_base__make_status(NULL);
88065
88066
  uint64_t v_header_magic = 0;
88067
  uint64_t v_dmark = 0;
88068
  uint64_t v_smark = 0;
88069
  uint8_t v_i8 = 0;
88070
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
88071
  uint32_t v_checksum32_have = 0;
88072
  uint32_t v_checksum32_want = 0;
88073
  uint64_t v_checksum64_have = 0;
88074
  uint64_t v_checksum64_want = 0;
88075
  wuffs_base__bitvec256 v_checksum256_have = {0};
88076
  uint64_t v_compressed_size = 0;
88077
  uint64_t v_uncompressed_size = 0;
88078
  uint32_t v_hash = 0;
88079
  uint8_t v_c8 = 0;
88080
  uint32_t v_c32 = 0;
88081
  uint16_t v_footer_magic = 0;
88082
88083
  uint8_t* iop_a_dst = NULL;
88084
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
88085
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
88086
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
88087
  if (a_dst && a_dst->data.ptr) {
88088
    io0_a_dst = a_dst->data.ptr;
88089
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
88090
    iop_a_dst = io1_a_dst;
88091
    io2_a_dst = io0_a_dst + a_dst->data.len;
88092
    if (a_dst->meta.closed) {
88093
      io2_a_dst = iop_a_dst;
88094
    }
88095
  }
88096
  const uint8_t* iop_a_src = NULL;
88097
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
88098
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
88099
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
88100
  if (a_src && a_src->data.ptr) {
88101
    io0_a_src = a_src->data.ptr;
88102
    io1_a_src = io0_a_src + a_src->meta.ri;
88103
    iop_a_src = io1_a_src;
88104
    io2_a_src = io0_a_src + a_src->meta.wi;
88105
  }
88106
88107
  uint32_t coro_susp_point = self->private_impl.p_do_transform_io;
88108
  if (coro_susp_point) {
88109
    v_checksum32_have = self->private_data.s_do_transform_io.v_checksum32_have;
88110
    v_checksum32_want = self->private_data.s_do_transform_io.v_checksum32_want;
88111
    v_checksum256_have = self->private_data.s_do_transform_io.v_checksum256_have;
88112
    v_compressed_size = self->private_data.s_do_transform_io.v_compressed_size;
88113
    v_uncompressed_size = self->private_data.s_do_transform_io.v_uncompressed_size;
88114
  }
88115
  switch (coro_susp_point) {
88116
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
88117
88118
    while (true) {
88119
      {
88120
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
88121
        uint64_t t_0;
88122
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 6)) {
88123
          t_0 = ((uint64_t)(wuffs_base__peek_u48le__no_bounds_check(iop_a_src)));
88124
          iop_a_src += 6;
88125
        } else {
88126
          self->private_data.s_do_transform_io.scratch = 0;
88127
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
88128
          while (true) {
88129
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
88130
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
88131
              goto suspend;
88132
            }
88133
            uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
88134
            uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
88135
            *scratch <<= 8;
88136
            *scratch >>= 8;
88137
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
88138
            if (num_bits_0 == 40) {
88139
              t_0 = ((uint64_t)(*scratch));
88140
              break;
88141
            }
88142
            num_bits_0 += 8u;
88143
            *scratch |= ((uint64_t)(num_bits_0)) << 56;
88144
          }
88145
        }
88146
        v_header_magic = t_0;
88147
      }
88148
      if (v_header_magic != 388031461373u) {
88149
        status = wuffs_base__make_status(wuffs_xz__error__bad_header);
88150
        goto exit;
88151
      }
88152
      {
88153
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
88154
        uint64_t t_1;
88155
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 6)) {
88156
          t_1 = ((uint64_t)(wuffs_base__peek_u48le__no_bounds_check(iop_a_src)));
88157
          iop_a_src += 6;
88158
        } else {
88159
          self->private_data.s_do_transform_io.scratch = 0;
88160
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
88161
          while (true) {
88162
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
88163
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
88164
              goto suspend;
88165
            }
88166
            uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
88167
            uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
88168
            *scratch <<= 8;
88169
            *scratch >>= 8;
88170
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
88171
            if (num_bits_1 == 40) {
88172
              t_1 = ((uint64_t)(*scratch));
88173
              break;
88174
            }
88175
            num_bits_1 += 8u;
88176
            *scratch |= ((uint64_t)(num_bits_1)) << 56;
88177
          }
88178
        }
88179
        v_header_magic = t_1;
88180
      }
88181
      if (v_header_magic == 72400582410240u) {
88182
        self->private_impl.f_checksummer = 0u;
88183
      } else if (v_header_magic == 60327687946496u) {
88184
        self->private_impl.f_checksummer = 1u;
88185
      } else if (v_header_magic == 77742513456128u) {
88186
        self->private_impl.f_checksummer = 2u;
88187
      } else if (v_header_magic == 177077137508864u) {
88188
        self->private_impl.f_checksummer = 3u;
88189
      } else if ((v_header_magic & 61695u) != 0u) {
88190
        status = wuffs_base__make_status(wuffs_xz__error__bad_header);
88191
        goto exit;
88192
      } else {
88193
        v_header_magic = (15u & (v_header_magic >> 8u));
88194
        if ((v_header_magic != 0u) &&
88195
            (v_header_magic != 1u) &&
88196
            (v_header_magic != 4u) &&
88197
            (v_header_magic != 10u)) {
88198
          status = wuffs_base__make_status(wuffs_xz__error__unsupported_checksum_algorithm);
88199
          goto exit;
88200
        }
88201
        status = wuffs_base__make_status(wuffs_xz__error__bad_checksum);
88202
        goto exit;
88203
      }
88204
      self->private_impl.f_flags = ((uint16_t)(v_header_magic));
88205
      self->private_impl.f_num_actual_blocks = 0u;
88206
      while (true) {
88207
        if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
88208
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
88209
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5);
88210
          continue;
88211
        } else if (wuffs_base__peek_u8be__no_bounds_check(iop_a_src) == 0u) {
88212
          break;
88213
        }
88214
        self->private_impl.f_num_actual_blocks += 1u;
88215
        if ( ! self->private_impl.f_ignore_checksum) {
88216
          wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32,
88217
              sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
88218
        }
88219
        self->private_impl.f_compressed_size_for_index = 4u;
88220
        while (true) {
88221
          v_smark = ((uint64_t)(iop_a_src - io0_a_src));
88222
          {
88223
            if (a_src) {
88224
              a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
88225
            }
88226
            wuffs_base__status t_2 = wuffs_xz__decoder__decode_block_header_with_padding(self, a_src);
88227
            v_status = t_2;
88228
            if (a_src) {
88229
              iop_a_src = a_src->data.ptr + a_src->meta.ri;
88230
            }
88231
          }
88232
          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))));
88233
          if ( ! self->private_impl.f_ignore_checksum) {
88234
            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));
88235
          }
88236
          if (wuffs_base__status__is_ok(&v_status)) {
88237
            break;
88238
          }
88239
          status = v_status;
88240
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6);
88241
        }
88242
        {
88243
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
88244
          uint32_t t_3;
88245
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
88246
            t_3 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
88247
            iop_a_src += 4;
88248
          } else {
88249
            self->private_data.s_do_transform_io.scratch = 0;
88250
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
88251
            while (true) {
88252
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
88253
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
88254
                goto suspend;
88255
              }
88256
              uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
88257
              uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56));
88258
              *scratch <<= 8;
88259
              *scratch >>= 8;
88260
              *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3;
88261
              if (num_bits_3 == 24) {
88262
                t_3 = ((uint32_t)(*scratch));
88263
                break;
88264
              }
88265
              num_bits_3 += 8u;
88266
              *scratch |= ((uint64_t)(num_bits_3)) << 56;
88267
            }
88268
          }
88269
          v_checksum32_want = t_3;
88270
        }
88271
        if (self->private_impl.f_ignore_checksum) {
88272
        } else if (v_checksum32_have != v_checksum32_want) {
88273
          status = wuffs_base__make_status(wuffs_xz__error__bad_checksum);
88274
          goto exit;
88275
        } else {
88276
          wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32,
88277
              sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
88278
          wuffs_private_impl__ignore_status(wuffs_crc64__ecma_hasher__initialize(&self->private_data.f_crc64,
88279
              sizeof (wuffs_crc64__ecma_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
88280
          wuffs_private_impl__ignore_status(wuffs_sha256__hasher__initialize(&self->private_data.f_sha256,
88281
              sizeof (wuffs_sha256__hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
88282
        }
88283
        v_compressed_size = 0u;
88284
        v_uncompressed_size = 0u;
88285
        while (true) {
88286
          if (((uint64_t)(self->private_impl.f_bcj_undo_index)) > ((uint64_t)(io2_a_dst - iop_a_dst))) {
88287
            status = wuffs_base__make_status(wuffs_base__suspension__short_write);
88288
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9);
88289
            continue;
88290
          }
88291
          v_dmark = ((uint64_t)(iop_a_dst - io0_a_dst));
88292
          v_smark = ((uint64_t)(iop_a_src - io0_a_src));
88293
          if (self->private_impl.f_num_non_final_filters == 0u) {
88294
            {
88295
              if (a_dst) {
88296
                a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
88297
              }
88298
              if (a_src) {
88299
                a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
88300
              }
88301
              wuffs_base__status t_4 = wuffs_lzma__decoder__transform_io(&self->private_data.f_lzma, a_dst, a_src, a_workbuf);
88302
              v_status = t_4;
88303
              if (a_dst) {
88304
                iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
88305
              }
88306
              if (a_src) {
88307
                iop_a_src = a_src->data.ptr + a_src->meta.ri;
88308
              }
88309
            }
88310
          } else {
88311
            if (self->private_impl.f_bcj_undo_index > 0u) {
88312
              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));
88313
              self->private_impl.f_bcj_undo_index = 0u;
88314
            }
88315
            {
88316
              uint8_t* o_0_io0_a_dst = io0_a_dst;
88317
              uint8_t* o_0_io1_a_dst = io1_a_dst;
88318
              io0_a_dst = iop_a_dst;
88319
              io1_a_dst = iop_a_dst;
88320
              wuffs_base__io_buffer o_0_a_dst;
88321
              if (a_dst) {
88322
                memcpy(&o_0_a_dst, a_dst, sizeof(*a_dst));
88323
                size_t wi0 = a_dst->meta.wi;
88324
                a_dst->data.ptr += wi0;
88325
                a_dst->data.len -= wi0;
88326
                a_dst->meta.ri = 0;
88327
                a_dst->meta.wi = 0;
88328
                a_dst->meta.pos = wuffs_base__u64__sat_add(a_dst->meta.pos, wi0);
88329
              }
88330
              {
88331
                if (a_dst) {
88332
                  a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
88333
                }
88334
                if (a_src) {
88335
                  a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
88336
                }
88337
                wuffs_base__status t_5 = wuffs_lzma__decoder__transform_io(&self->private_data.f_lzma, a_dst, a_src, a_workbuf);
88338
                v_status = t_5;
88339
                if (a_dst) {
88340
                  iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
88341
                }
88342
                if (a_src) {
88343
                  iop_a_src = a_src->data.ptr + a_src->meta.ri;
88344
                }
88345
              }
88346
              if (a_dst) {
88347
                memcpy(a_dst, &o_0_a_dst, sizeof(*a_dst));
88348
                a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
88349
                io0_a_dst = o_0_io0_a_dst;
88350
                io1_a_dst = o_0_io1_a_dst;
88351
              }
88352
            }
88353
            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));
88354
            if ((self->private_impl.f_bcj_undo_index > 0u) &&  ! wuffs_base__status__is_ok(&v_status)) {
88355
              v_i8 = ((uint8_t)(self->private_impl.f_bcj_undo_index - 1u));
88356
              while (true) {
88357
                if ( ! (iop_a_dst > io1_a_dst)) {
88358
                  status = wuffs_base__make_status(wuffs_xz__error__internal_error_inconsistent_bcj_filter_state);
88359
                  goto exit;
88360
                }
88361
                self->private_data.f_filter_data[0u][v_i8] = iop_a_dst[-1];
88362
                iop_a_dst--;
88363
                if (v_i8 <= 0u) {
88364
                  break;
88365
                }
88366
#if defined(__GNUC__)
88367
#pragma GCC diagnostic push
88368
#pragma GCC diagnostic ignored "-Wconversion"
88369
#endif
88370
                v_i8 -= 1u;
88371
#if defined(__GNUC__)
88372
#pragma GCC diagnostic pop
88373
#endif
88374
              }
88375
            }
88376
          }
88377
          v_compressed_size += wuffs_private_impl__io__count_since(v_smark, ((uint64_t)(iop_a_src - io0_a_src)));
88378
          v_uncompressed_size += wuffs_private_impl__io__count_since(v_dmark, ((uint64_t)(iop_a_dst - io0_a_dst)));
88379
          if (self->private_impl.f_ignore_checksum) {
88380
          } else if (self->private_impl.f_checksummer == 1u) {
88381
            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));
88382
          } else if (self->private_impl.f_checksummer == 2u) {
88383
            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));
88384
          } else if (self->private_impl.f_checksummer == 3u) {
88385
            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));
88386
          }
88387
          if (wuffs_base__status__is_ok(&v_status)) {
88388
            break;
88389
          }
88390
          status = v_status;
88391
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10);
88392
        }
88393
        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))) {
88394
          status = wuffs_base__make_status(wuffs_xz__error__bad_block_header);
88395
          goto exit;
88396
        }
88397
        wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_compressed_size_for_index, v_compressed_size);
88398
        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])));
88399
        self->private_impl.f_verification_have_total_sizes[0u] += self->private_impl.f_compressed_size_for_index;
88400
        v_hash = ((uint32_t)((self->private_impl.f_compressed_size_for_index ^ (self->private_impl.f_compressed_size_for_index >> 32u))));
88401
        v_hash *= 3432918353u;
88402
        v_hash = (((uint32_t)(v_hash << 15u)) | (v_hash >> 17u));
88403
        v_hash *= 461845907u;
88404
        v_hash ^= self->private_impl.f_verification_have_hashed_sizes[0u];
88405
        v_hash = (((uint32_t)(v_hash << 13u)) | (v_hash >> 19u));
88406
        self->private_impl.f_verification_have_hashed_sizes[0u] = ((uint32_t)(((uint32_t)(v_hash * 5u)) + 3864292196u));
88407
        self->private_impl.f_verification_have_total_sizes[1u] += v_uncompressed_size;
88408
        v_hash = ((uint32_t)((v_uncompressed_size ^ (v_uncompressed_size >> 32u))));
88409
        v_hash *= 3432918353u;
88410
        v_hash = (((uint32_t)(v_hash << 15u)) | (v_hash >> 17u));
88411
        v_hash *= 461845907u;
88412
        v_hash ^= self->private_impl.f_verification_have_hashed_sizes[1u];
88413
        v_hash = (((uint32_t)(v_hash << 13u)) | (v_hash >> 19u));
88414
        self->private_impl.f_verification_have_hashed_sizes[1u] = ((uint32_t)(((uint32_t)(v_hash * 5u)) + 3864292196u));
88415
        while ((v_compressed_size & 3u) != 0u) {
88416
          {
88417
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11);
88418
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
88419
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
88420
              goto suspend;
88421
            }
88422
            uint8_t t_6 = *iop_a_src++;
88423
            v_c8 = t_6;
88424
          }
88425
          if (v_c8 != 0u) {
88426
            status = wuffs_base__make_status(wuffs_xz__error__bad_padding);
88427
            goto exit;
88428
          }
88429
          v_compressed_size += 1u;
88430
        }
88431
        self->private_impl.f_lzma_needs_reset = true;
88432
        if (self->private_impl.f_ignore_checksum) {
88433
          self->private_data.s_do_transform_io.scratch = ((uint32_t)(WUFFS_XZ__CHECKSUM_LENGTH[self->private_impl.f_checksummer]));
88434
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12);
88435
          if (self->private_data.s_do_transform_io.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
88436
            self->private_data.s_do_transform_io.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
88437
            iop_a_src = io2_a_src;
88438
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
88439
            goto suspend;
88440
          }
88441
          iop_a_src += self->private_data.s_do_transform_io.scratch;
88442
        } else if (self->private_impl.f_checksummer == 1u) {
88443
          {
88444
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13);
88445
            uint32_t t_7;
88446
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
88447
              t_7 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
88448
              iop_a_src += 4;
88449
            } else {
88450
              self->private_data.s_do_transform_io.scratch = 0;
88451
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14);
88452
              while (true) {
88453
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
88454
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
88455
                  goto suspend;
88456
                }
88457
                uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
88458
                uint32_t num_bits_7 = ((uint32_t)(*scratch >> 56));
88459
                *scratch <<= 8;
88460
                *scratch >>= 8;
88461
                *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_7;
88462
                if (num_bits_7 == 24) {
88463
                  t_7 = ((uint32_t)(*scratch));
88464
                  break;
88465
                }
88466
                num_bits_7 += 8u;
88467
                *scratch |= ((uint64_t)(num_bits_7)) << 56;
88468
              }
88469
            }
88470
            v_checksum32_want = t_7;
88471
          }
88472
          v_checksum32_have = wuffs_crc32__ieee_hasher__checksum_u32(&self->private_data.f_crc32);
88473
          if (v_checksum32_have != v_checksum32_want) {
88474
            status = wuffs_base__make_status(wuffs_xz__error__bad_checksum);
88475
            goto exit;
88476
          }
88477
        } else if (self->private_impl.f_checksummer == 2u) {
88478
          {
88479
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15);
88480
            uint64_t t_8;
88481
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) {
88482
              t_8 = wuffs_base__peek_u64le__no_bounds_check(iop_a_src);
88483
              iop_a_src += 8;
88484
            } else {
88485
              self->private_data.s_do_transform_io.scratch = 0;
88486
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16);
88487
              while (true) {
88488
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
88489
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
88490
                  goto suspend;
88491
                }
88492
                uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
88493
                uint32_t num_bits_8 = ((uint32_t)(*scratch >> 56));
88494
                *scratch <<= 8;
88495
                *scratch >>= 8;
88496
                *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_8;
88497
                if (num_bits_8 == 56) {
88498
                  t_8 = ((uint64_t)(*scratch));
88499
                  break;
88500
                }
88501
                num_bits_8 += 8u;
88502
                *scratch |= ((uint64_t)(num_bits_8)) << 56;
88503
              }
88504
            }
88505
            v_checksum64_want = t_8;
88506
          }
88507
          v_checksum64_have = wuffs_crc64__ecma_hasher__checksum_u64(&self->private_data.f_crc64);
88508
          if (v_checksum64_have != v_checksum64_want) {
88509
            status = wuffs_base__make_status(wuffs_xz__error__bad_checksum);
88510
            goto exit;
88511
          }
88512
        } else if (self->private_impl.f_checksummer == 3u) {
88513
          v_checksum256_have = wuffs_sha256__hasher__checksum_bitvec256(&self->private_data.f_sha256);
88514
          {
88515
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(17);
88516
            uint64_t t_9;
88517
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) {
88518
              t_9 = wuffs_base__peek_u64be__no_bounds_check(iop_a_src);
88519
              iop_a_src += 8;
88520
            } else {
88521
              self->private_data.s_do_transform_io.scratch = 0;
88522
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(18);
88523
              while (true) {
88524
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
88525
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
88526
                  goto suspend;
88527
                }
88528
                uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
88529
                uint32_t num_bits_9 = ((uint32_t)(*scratch & 0xFFu));
88530
                *scratch >>= 8;
88531
                *scratch <<= 8;
88532
                *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_9);
88533
                if (num_bits_9 == 56) {
88534
                  t_9 = ((uint64_t)(*scratch >> 0));
88535
                  break;
88536
                }
88537
                num_bits_9 += 8u;
88538
                *scratch |= ((uint64_t)(num_bits_9));
88539
              }
88540
            }
88541
            v_checksum64_want = t_9;
88542
          }
88543
          if (wuffs_base__bitvec256__get_u64(&v_checksum256_have, 3u) != v_checksum64_want) {
88544
            status = wuffs_base__make_status(wuffs_xz__error__bad_checksum);
88545
            goto exit;
88546
          }
88547
          {
88548
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(19);
88549
            uint64_t t_10;
88550
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) {
88551
              t_10 = wuffs_base__peek_u64be__no_bounds_check(iop_a_src);
88552
              iop_a_src += 8;
88553
            } else {
88554
              self->private_data.s_do_transform_io.scratch = 0;
88555
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(20);
88556
              while (true) {
88557
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
88558
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
88559
                  goto suspend;
88560
                }
88561
                uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
88562
                uint32_t num_bits_10 = ((uint32_t)(*scratch & 0xFFu));
88563
                *scratch >>= 8;
88564
                *scratch <<= 8;
88565
                *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_10);
88566
                if (num_bits_10 == 56) {
88567
                  t_10 = ((uint64_t)(*scratch >> 0));
88568
                  break;
88569
                }
88570
                num_bits_10 += 8u;
88571
                *scratch |= ((uint64_t)(num_bits_10));
88572
              }
88573
            }
88574
            v_checksum64_want = t_10;
88575
          }
88576
          if (wuffs_base__bitvec256__get_u64(&v_checksum256_have, 2u) != v_checksum64_want) {
88577
            status = wuffs_base__make_status(wuffs_xz__error__bad_checksum);
88578
            goto exit;
88579
          }
88580
          {
88581
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(21);
88582
            uint64_t t_11;
88583
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) {
88584
              t_11 = wuffs_base__peek_u64be__no_bounds_check(iop_a_src);
88585
              iop_a_src += 8;
88586
            } else {
88587
              self->private_data.s_do_transform_io.scratch = 0;
88588
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(22);
88589
              while (true) {
88590
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
88591
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
88592
                  goto suspend;
88593
                }
88594
                uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
88595
                uint32_t num_bits_11 = ((uint32_t)(*scratch & 0xFFu));
88596
                *scratch >>= 8;
88597
                *scratch <<= 8;
88598
                *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_11);
88599
                if (num_bits_11 == 56) {
88600
                  t_11 = ((uint64_t)(*scratch >> 0));
88601
                  break;
88602
                }
88603
                num_bits_11 += 8u;
88604
                *scratch |= ((uint64_t)(num_bits_11));
88605
              }
88606
            }
88607
            v_checksum64_want = t_11;
88608
          }
88609
          if (wuffs_base__bitvec256__get_u64(&v_checksum256_have, 1u) != v_checksum64_want) {
88610
            status = wuffs_base__make_status(wuffs_xz__error__bad_checksum);
88611
            goto exit;
88612
          }
88613
          {
88614
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(23);
88615
            uint64_t t_12;
88616
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) {
88617
              t_12 = wuffs_base__peek_u64be__no_bounds_check(iop_a_src);
88618
              iop_a_src += 8;
88619
            } else {
88620
              self->private_data.s_do_transform_io.scratch = 0;
88621
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(24);
88622
              while (true) {
88623
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
88624
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
88625
                  goto suspend;
88626
                }
88627
                uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
88628
                uint32_t num_bits_12 = ((uint32_t)(*scratch & 0xFFu));
88629
                *scratch >>= 8;
88630
                *scratch <<= 8;
88631
                *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_12);
88632
                if (num_bits_12 == 56) {
88633
                  t_12 = ((uint64_t)(*scratch >> 0));
88634
                  break;
88635
                }
88636
                num_bits_12 += 8u;
88637
                *scratch |= ((uint64_t)(num_bits_12));
88638
              }
88639
            }
88640
            v_checksum64_want = t_12;
88641
          }
88642
          if (wuffs_base__bitvec256__get_u64(&v_checksum256_have, 0u) != v_checksum64_want) {
88643
            status = wuffs_base__make_status(wuffs_xz__error__bad_checksum);
88644
            goto exit;
88645
          }
88646
        }
88647
      }
88648
      self->private_impl.f_backwards_size = 0u;
88649
      if ( ! self->private_impl.f_ignore_checksum) {
88650
        wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32,
88651
            sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
88652
      }
88653
      while (true) {
88654
        v_smark = ((uint64_t)(iop_a_src - io0_a_src));
88655
        {
88656
          if (a_src) {
88657
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
88658
          }
88659
          wuffs_base__status t_13 = wuffs_xz__decoder__verify_index(self, a_src);
88660
          v_status = t_13;
88661
          if (a_src) {
88662
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
88663
          }
88664
        }
88665
        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))));
88666
        if ( ! self->private_impl.f_ignore_checksum) {
88667
          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));
88668
        }
88669
        if (wuffs_base__status__is_ok(&v_status)) {
88670
          break;
88671
        }
88672
        status = v_status;
88673
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(25);
88674
      }
88675
      if ( ! self->private_impl.f_ignore_checksum) {
88676
        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))))));
88677
      }
88678
      while ((self->private_impl.f_backwards_size & 3u) != 0u) {
88679
        {
88680
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(26);
88681
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
88682
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
88683
            goto suspend;
88684
          }
88685
          uint8_t t_14 = *iop_a_src++;
88686
          v_c8 = t_14;
88687
        }
88688
        if (v_c8 != 0u) {
88689
          status = wuffs_base__make_status(wuffs_xz__error__bad_index);
88690
          goto exit;
88691
        }
88692
        self->private_impl.f_backwards_size += 1u;
88693
      }
88694
      self->private_impl.f_backwards_size >>= 2u;
88695
      if ((self->private_impl.f_backwards_size == 0u) || (self->private_impl.f_backwards_size > 4294967295u)) {
88696
        status = wuffs_base__make_status(wuffs_xz__error__bad_index);
88697
        goto exit;
88698
      }
88699
      {
88700
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(27);
88701
        uint32_t t_15;
88702
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
88703
          t_15 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
88704
          iop_a_src += 4;
88705
        } else {
88706
          self->private_data.s_do_transform_io.scratch = 0;
88707
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(28);
88708
          while (true) {
88709
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
88710
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
88711
              goto suspend;
88712
            }
88713
            uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
88714
            uint32_t num_bits_15 = ((uint32_t)(*scratch >> 56));
88715
            *scratch <<= 8;
88716
            *scratch >>= 8;
88717
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_15;
88718
            if (num_bits_15 == 24) {
88719
              t_15 = ((uint32_t)(*scratch));
88720
              break;
88721
            }
88722
            num_bits_15 += 8u;
88723
            *scratch |= ((uint64_t)(num_bits_15)) << 56;
88724
          }
88725
        }
88726
        v_checksum32_want = t_15;
88727
      }
88728
      if (self->private_impl.f_ignore_checksum) {
88729
      } else if (v_checksum32_want != wuffs_crc32__ieee_hasher__checksum_u32(&self->private_data.f_crc32)) {
88730
        status = wuffs_base__make_status(wuffs_xz__error__bad_checksum);
88731
        goto exit;
88732
      } else {
88733
        wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32,
88734
            sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
88735
      }
88736
      {
88737
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(29);
88738
        uint32_t t_16;
88739
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
88740
          t_16 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
88741
          iop_a_src += 4;
88742
        } else {
88743
          self->private_data.s_do_transform_io.scratch = 0;
88744
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(30);
88745
          while (true) {
88746
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
88747
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
88748
              goto suspend;
88749
            }
88750
            uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
88751
            uint32_t num_bits_16 = ((uint32_t)(*scratch >> 56));
88752
            *scratch <<= 8;
88753
            *scratch >>= 8;
88754
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_16;
88755
            if (num_bits_16 == 24) {
88756
              t_16 = ((uint32_t)(*scratch));
88757
              break;
88758
            }
88759
            num_bits_16 += 8u;
88760
            *scratch |= ((uint64_t)(num_bits_16)) << 56;
88761
          }
88762
        }
88763
        v_checksum32_want = t_16;
88764
      }
88765
      while (true) {
88766
        v_smark = ((uint64_t)(iop_a_src - io0_a_src));
88767
        {
88768
          if (a_src) {
88769
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
88770
          }
88771
          wuffs_base__status t_17 = wuffs_xz__decoder__verify_footer(self, a_src);
88772
          v_status = t_17;
88773
          if (a_src) {
88774
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
88775
          }
88776
        }
88777
        if ( ! self->private_impl.f_ignore_checksum) {
88778
          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));
88779
        }
88780
        if (wuffs_base__status__is_ok(&v_status)) {
88781
          break;
88782
        }
88783
        status = v_status;
88784
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(31);
88785
      }
88786
      if ( ! self->private_impl.f_ignore_checksum && (v_checksum32_want != wuffs_crc32__ieee_hasher__checksum_u32(&self->private_data.f_crc32))) {
88787
        status = wuffs_base__make_status(wuffs_xz__error__bad_checksum);
88788
        goto exit;
88789
      }
88790
      {
88791
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(32);
88792
        uint16_t t_18;
88793
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
88794
          t_18 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src);
88795
          iop_a_src += 2;
88796
        } else {
88797
          self->private_data.s_do_transform_io.scratch = 0;
88798
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(33);
88799
          while (true) {
88800
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
88801
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
88802
              goto suspend;
88803
            }
88804
            uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
88805
            uint32_t num_bits_18 = ((uint32_t)(*scratch >> 56));
88806
            *scratch <<= 8;
88807
            *scratch >>= 8;
88808
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_18;
88809
            if (num_bits_18 == 8) {
88810
              t_18 = ((uint16_t)(*scratch));
88811
              break;
88812
            }
88813
            num_bits_18 += 8u;
88814
            *scratch |= ((uint64_t)(num_bits_18)) << 56;
88815
          }
88816
        }
88817
        v_footer_magic = t_18;
88818
      }
88819
      if (v_footer_magic != 23129u) {
88820
        status = wuffs_base__make_status(wuffs_xz__error__bad_footer);
88821
        goto exit;
88822
      }
88823
      if ( ! self->private_impl.f_standalone_format) {
88824
        break;
88825
      }
88826
      while (true) {
88827
        while (((uint64_t)(io2_a_src - iop_a_src)) < 4u) {
88828
          if (a_src && a_src->meta.closed) {
88829
            if (((uint64_t)(io2_a_src - iop_a_src)) == 0u) {
88830
              goto label__streams__break;
88831
            } else {
88832
              status = wuffs_base__make_status(wuffs_xz__error__truncated_input);
88833
              goto exit;
88834
            }
88835
          }
88836
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
88837
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(34);
88838
        }
88839
        v_c32 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
88840
        if (v_c32 == 1484404733u) {
88841
          break;
88842
        } else if (v_c32 != 0u) {
88843
          status = wuffs_base__make_status(wuffs_xz__error__bad_header_concatenated_stream);
88844
          goto exit;
88845
        }
88846
        iop_a_src += 4u;
88847
      }
88848
      self->private_impl.f_started_verify_index = false;
88849
    }
88850
    label__streams__break:;
88851
88852
    ok:
88853
    self->private_impl.p_do_transform_io = 0;
88854
    goto exit;
88855
  }
88856
88857
  goto suspend;
88858
  suspend:
88859
  self->private_impl.p_do_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
88860
  self->private_data.s_do_transform_io.v_checksum32_have = v_checksum32_have;
88861
  self->private_data.s_do_transform_io.v_checksum32_want = v_checksum32_want;
88862
  self->private_data.s_do_transform_io.v_checksum256_have = v_checksum256_have;
88863
  self->private_data.s_do_transform_io.v_compressed_size = v_compressed_size;
88864
  self->private_data.s_do_transform_io.v_uncompressed_size = v_uncompressed_size;
88865
88866
  goto exit;
88867
  exit:
88868
  if (a_dst && a_dst->data.ptr) {
88869
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
88870
  }
88871
  if (a_src && a_src->data.ptr) {
88872
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
88873
  }
88874
88875
  return status;
88876
}
88877
88878
// -------- func xz.decoder.decode_block_header_with_padding
88879
88880
WUFFS_BASE__GENERATED_C_CODE
88881
static wuffs_base__status
88882
wuffs_xz__decoder__decode_block_header_with_padding(
88883
    wuffs_xz__decoder* self,
88884
    wuffs_base__io_buffer* a_src) {
88885
  wuffs_base__status status = wuffs_base__make_status(NULL);
88886
88887
  uint8_t v_c8 = 0;
88888
  uint64_t v_padded_size_have = 0;
88889
  uint64_t v_padded_size_want = 0;
88890
  uint64_t v_smark = 0;
88891
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
88892
88893
  const uint8_t* iop_a_src = NULL;
88894
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
88895
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
88896
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
88897
  if (a_src && a_src->data.ptr) {
88898
    io0_a_src = a_src->data.ptr;
88899
    io1_a_src = io0_a_src + a_src->meta.ri;
88900
    iop_a_src = io1_a_src;
88901
    io2_a_src = io0_a_src + a_src->meta.wi;
88902
  }
88903
88904
  uint32_t coro_susp_point = self->private_impl.p_decode_block_header_with_padding;
88905
  if (coro_susp_point) {
88906
    v_padded_size_have = self->private_data.s_decode_block_header_with_padding.v_padded_size_have;
88907
    v_padded_size_want = self->private_data.s_decode_block_header_with_padding.v_padded_size_want;
88908
  }
88909
  switch (coro_susp_point) {
88910
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
88911
88912
    {
88913
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
88914
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
88915
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
88916
        goto suspend;
88917
      }
88918
      uint8_t t_0 = *iop_a_src++;
88919
      v_c8 = t_0;
88920
    }
88921
    v_padded_size_want = ((uint64_t)((((uint64_t)(v_c8)) * 4u) - 1u));
88922
    while (true) {
88923
      v_smark = ((uint64_t)(iop_a_src - io0_a_src));
88924
      {
88925
        if (a_src) {
88926
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
88927
        }
88928
        wuffs_base__status t_1 = wuffs_xz__decoder__decode_block_header_sans_padding(self, a_src);
88929
        v_status = t_1;
88930
        if (a_src) {
88931
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
88932
        }
88933
      }
88934
      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))));
88935
      if (wuffs_base__status__is_ok(&v_status)) {
88936
        break;
88937
      }
88938
      status = v_status;
88939
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2);
88940
    }
88941
    if (v_padded_size_have > v_padded_size_want) {
88942
      status = wuffs_base__make_status(wuffs_xz__error__bad_block_header);
88943
      goto exit;
88944
    }
88945
    while (v_padded_size_have < v_padded_size_want) {
88946
      {
88947
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
88948
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
88949
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
88950
          goto suspend;
88951
        }
88952
        uint8_t t_2 = *iop_a_src++;
88953
        v_c8 = t_2;
88954
      }
88955
      if (v_c8 != 0u) {
88956
        status = wuffs_base__make_status(wuffs_xz__error__bad_block_header);
88957
        goto exit;
88958
      }
88959
      v_padded_size_have += 1u;
88960
    }
88961
88962
    ok:
88963
    self->private_impl.p_decode_block_header_with_padding = 0;
88964
    goto exit;
88965
  }
88966
88967
  goto suspend;
88968
  suspend:
88969
  self->private_impl.p_decode_block_header_with_padding = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
88970
  self->private_data.s_decode_block_header_with_padding.v_padded_size_have = v_padded_size_have;
88971
  self->private_data.s_decode_block_header_with_padding.v_padded_size_want = v_padded_size_want;
88972
88973
  goto exit;
88974
  exit:
88975
  if (a_src && a_src->data.ptr) {
88976
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
88977
  }
88978
88979
  return status;
88980
}
88981
88982
// -------- func xz.decoder.decode_block_header_sans_padding
88983
88984
WUFFS_BASE__GENERATED_C_CODE
88985
static wuffs_base__status
88986
wuffs_xz__decoder__decode_block_header_sans_padding(
88987
    wuffs_xz__decoder* self,
88988
    wuffs_base__io_buffer* a_src) {
88989
  wuffs_base__status status = wuffs_base__make_status(NULL);
88990
88991
  uint8_t v_c8 = 0;
88992
  uint32_t v_c32 = 0;
88993
  uint32_t v_alignment = 0;
88994
  uint8_t v_flags = 0;
88995
  uint8_t v_filter_id = 0;
88996
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
88997
  uint32_t v_shift = 0;
88998
  uint32_t v_f = 0;
88999
  uint32_t v_k = 0;
89000
89001
  const uint8_t* iop_a_src = NULL;
89002
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
89003
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
89004
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
89005
  if (a_src && a_src->data.ptr) {
89006
    io0_a_src = a_src->data.ptr;
89007
    io1_a_src = io0_a_src + a_src->meta.ri;
89008
    iop_a_src = io1_a_src;
89009
    io2_a_src = io0_a_src + a_src->meta.wi;
89010
  }
89011
89012
  uint32_t coro_susp_point = self->private_impl.p_decode_block_header_sans_padding;
89013
  if (coro_susp_point) {
89014
    v_flags = self->private_data.s_decode_block_header_sans_padding.v_flags;
89015
    v_filter_id = self->private_data.s_decode_block_header_sans_padding.v_filter_id;
89016
    v_shift = self->private_data.s_decode_block_header_sans_padding.v_shift;
89017
    v_f = self->private_data.s_decode_block_header_sans_padding.v_f;
89018
  }
89019
  switch (coro_susp_point) {
89020
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
89021
89022
    {
89023
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
89024
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
89025
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
89026
        goto suspend;
89027
      }
89028
      uint8_t t_0 = *iop_a_src++;
89029
      v_flags = t_0;
89030
    }
89031
    self->private_impl.f_num_non_final_filters = ((uint32_t)(((uint8_t)(v_flags & 3u))));
89032
    if (((uint8_t)(v_flags & 60u)) != 0u) {
89033
      status = wuffs_base__make_status(wuffs_xz__error__bad_block_header);
89034
      goto exit;
89035
    }
89036
    self->private_impl.f_block_has_compressed_size = (((uint8_t)(v_flags & 64u)) != 0u);
89037
    if (self->private_impl.f_block_has_compressed_size) {
89038
      self->private_impl.f_block_compressed_size = 0u;
89039
      v_shift = 0u;
89040
      while (true) {
89041
        {
89042
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
89043
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
89044
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
89045
            goto suspend;
89046
          }
89047
          uint8_t t_1 = *iop_a_src++;
89048
          v_c8 = t_1;
89049
        }
89050
        if (v_shift <= 56u) {
89051
          self->private_impl.f_block_compressed_size |= (((uint64_t)(((uint8_t)(v_c8 & 127u)))) << v_shift);
89052
          if (v_c8 >= 128u) {
89053
            v_shift += 7u;
89054
            continue;
89055
          } else if ((v_c8 == 0u) && (v_shift > 0u)) {
89056
            status = wuffs_base__make_status(wuffs_xz__error__bad_block_header);
89057
            goto exit;
89058
          }
89059
          break;
89060
        } else if (v_c8 != 1u) {
89061
          status = wuffs_base__make_status(wuffs_xz__error__bad_block_header);
89062
          goto exit;
89063
        }
89064
        self->private_impl.f_block_compressed_size |= (((uint64_t)(1u)) << 63u);
89065
        break;
89066
      }
89067
    }
89068
    self->private_impl.f_block_has_uncompressed_size = (((uint8_t)(v_flags & 128u)) != 0u);
89069
    if (self->private_impl.f_block_has_uncompressed_size) {
89070
      self->private_impl.f_block_uncompressed_size = 0u;
89071
      v_shift = 0u;
89072
      while (true) {
89073
        {
89074
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
89075
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
89076
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
89077
            goto suspend;
89078
          }
89079
          uint8_t t_2 = *iop_a_src++;
89080
          v_c8 = t_2;
89081
        }
89082
        if (v_shift <= 56u) {
89083
          self->private_impl.f_block_uncompressed_size |= (((uint64_t)(((uint8_t)(v_c8 & 127u)))) << v_shift);
89084
          if (v_c8 >= 128u) {
89085
            v_shift += 7u;
89086
            continue;
89087
          } else if ((v_c8 == 0u) && (v_shift > 0u)) {
89088
            status = wuffs_base__make_status(wuffs_xz__error__bad_block_header);
89089
            goto exit;
89090
          }
89091
          break;
89092
        } else if (v_c8 != 1u) {
89093
          status = wuffs_base__make_status(wuffs_xz__error__bad_block_header);
89094
          goto exit;
89095
        }
89096
        self->private_impl.f_block_uncompressed_size |= (((uint64_t)(1u)) << 63u);
89097
        break;
89098
      }
89099
    }
89100
    self->private_impl.f_bcj_x86_prev_mask = 0u;
89101
    self->private_impl.choosy_apply_non_final_filters = (
89102
        &wuffs_xz__decoder__apply_non_final_filters__choosy_default);
89103
    v_f = 0u;
89104
    while (v_f < self->private_impl.f_num_non_final_filters) {
89105
      {
89106
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
89107
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
89108
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
89109
          goto suspend;
89110
        }
89111
        uint8_t t_3 = *iop_a_src++;
89112
        v_filter_id = t_3;
89113
      }
89114
      if (v_filter_id == 33u) {
89115
        status = wuffs_base__make_status(wuffs_xz__error__bad_filter);
89116
        goto exit;
89117
      } else if (v_filter_id == 3u) {
89118
        {
89119
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
89120
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
89121
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
89122
            goto suspend;
89123
          }
89124
          uint8_t t_4 = *iop_a_src++;
89125
          v_c8 = t_4;
89126
        }
89127
        if (v_c8 != 1u) {
89128
          status = wuffs_base__make_status(wuffs_xz__error__bad_filter);
89129
          goto exit;
89130
        }
89131
        {
89132
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
89133
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
89134
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
89135
            goto suspend;
89136
          }
89137
          uint8_t t_5 = *iop_a_src++;
89138
          v_c8 = t_5;
89139
        }
89140
        self->private_impl.f_filters[v_f] = ((((uint32_t)(v_c8)) << 8u) | 3u);
89141
        v_k = 0u;
89142
        while (v_k < 256u) {
89143
          self->private_data.f_filter_data[v_f][v_k] = 0u;
89144
          v_k += 1u;
89145
        }
89146
      } else if ((v_filter_id < 3u) || (11u < v_filter_id)) {
89147
        status = wuffs_base__make_status(wuffs_xz__error__unsupported_filter);
89148
        goto exit;
89149
      } else if (v_f != 0u) {
89150
        status = wuffs_base__make_status(wuffs_xz__error__unsupported_filter_combination);
89151
        goto exit;
89152
      } else {
89153
        self->private_impl.f_filters[v_f] = ((uint32_t)(v_filter_id));
89154
        if (v_filter_id == 4u) {
89155
          self->private_impl.choosy_apply_non_final_filters = (
89156
              &wuffs_xz__decoder__apply_filter_04_x86);
89157
        } else if (v_filter_id == 5u) {
89158
          self->private_impl.choosy_apply_non_final_filters = (
89159
              &wuffs_xz__decoder__apply_filter_05_powerpc);
89160
        } else if (v_filter_id == 6u) {
89161
          self->private_impl.choosy_apply_non_final_filters = (
89162
              &wuffs_xz__decoder__apply_filter_06_ia64);
89163
        } else if (v_filter_id == 7u) {
89164
          self->private_impl.choosy_apply_non_final_filters = (
89165
              &wuffs_xz__decoder__apply_filter_07_arm);
89166
        } else if (v_filter_id == 8u) {
89167
          self->private_impl.choosy_apply_non_final_filters = (
89168
              &wuffs_xz__decoder__apply_filter_08_armthumb);
89169
        } else if (v_filter_id == 9u) {
89170
          self->private_impl.choosy_apply_non_final_filters = (
89171
              &wuffs_xz__decoder__apply_filter_09_sparc);
89172
        } else if (v_filter_id == 10u) {
89173
          self->private_impl.choosy_apply_non_final_filters = (
89174
              &wuffs_xz__decoder__apply_filter_0a_arm64);
89175
        } else {
89176
          self->private_impl.choosy_apply_non_final_filters = (
89177
              &wuffs_xz__decoder__apply_filter_0b_riscv);
89178
        }
89179
        {
89180
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
89181
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
89182
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
89183
            goto suspend;
89184
          }
89185
          uint8_t t_6 = *iop_a_src++;
89186
          v_c8 = t_6;
89187
        }
89188
        if (v_c8 == 0u) {
89189
          self->private_impl.f_bcj_pos = 0u;
89190
        } else if (v_c8 == 4u) {
89191
          {
89192
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
89193
            uint32_t t_7;
89194
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
89195
              t_7 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
89196
              iop_a_src += 4;
89197
            } else {
89198
              self->private_data.s_decode_block_header_sans_padding.scratch = 0;
89199
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
89200
              while (true) {
89201
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
89202
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
89203
                  goto suspend;
89204
                }
89205
                uint64_t* scratch = &self->private_data.s_decode_block_header_sans_padding.scratch;
89206
                uint32_t num_bits_7 = ((uint32_t)(*scratch >> 56));
89207
                *scratch <<= 8;
89208
                *scratch >>= 8;
89209
                *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_7;
89210
                if (num_bits_7 == 24) {
89211
                  t_7 = ((uint32_t)(*scratch));
89212
                  break;
89213
                }
89214
                num_bits_7 += 8u;
89215
                *scratch |= ((uint64_t)(num_bits_7)) << 56;
89216
              }
89217
            }
89218
            v_c32 = t_7;
89219
          }
89220
          v_alignment = ((uint32_t)(WUFFS_XZ__BCJ_OFFSET_ALIGNMENT[v_filter_id]));
89221
          if (v_alignment > 0u) {
89222
            if ((v_c32 % v_alignment) != 0u) {
89223
              status = wuffs_base__make_status(wuffs_xz__error__bad_bcj_offset);
89224
              goto exit;
89225
            }
89226
          }
89227
          self->private_impl.f_bcj_pos = v_c32;
89228
        } else {
89229
          status = wuffs_base__make_status(wuffs_xz__error__unsupported_filter);
89230
          goto exit;
89231
        }
89232
      }
89233
      v_f += 1u;
89234
    }
89235
    {
89236
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
89237
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
89238
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
89239
        goto suspend;
89240
      }
89241
      uint8_t t_8 = *iop_a_src++;
89242
      v_filter_id = t_8;
89243
    }
89244
    if (v_filter_id == 33u) {
89245
      if (self->private_impl.f_lzma_needs_reset) {
89246
        wuffs_private_impl__ignore_status(wuffs_lzma__decoder__initialize(&self->private_data.f_lzma,
89247
            sizeof (wuffs_lzma__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
89248
      }
89249
      {
89250
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11);
89251
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
89252
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
89253
          goto suspend;
89254
        }
89255
        uint8_t t_9 = *iop_a_src++;
89256
        v_c8 = t_9;
89257
      }
89258
      if (v_c8 != 1u) {
89259
        status = wuffs_base__make_status(wuffs_xz__error__bad_filter);
89260
        goto exit;
89261
      }
89262
      {
89263
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12);
89264
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
89265
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
89266
          goto suspend;
89267
        }
89268
        uint8_t t_10 = *iop_a_src++;
89269
        v_c8 = t_10;
89270
      }
89271
      v_status = wuffs_lzma__decoder__set_quirk(&self->private_data.f_lzma, 1290294273u, (2u | (((uint64_t)(v_c8)) << 8u)));
89272
      if ( ! wuffs_base__status__is_ok(&v_status)) {
89273
        status = wuffs_base__make_status(wuffs_xz__error__bad_filter);
89274
        goto exit;
89275
      }
89276
    } else if ((v_filter_id < 3u) || (11u < v_filter_id)) {
89277
      status = wuffs_base__make_status(wuffs_xz__error__unsupported_filter);
89278
      goto exit;
89279
    } else {
89280
      status = wuffs_base__make_status(wuffs_xz__error__bad_filter);
89281
      goto exit;
89282
    }
89283
89284
    goto ok;
89285
    ok:
89286
    self->private_impl.p_decode_block_header_sans_padding = 0;
89287
    goto exit;
89288
  }
89289
89290
  goto suspend;
89291
  suspend:
89292
  self->private_impl.p_decode_block_header_sans_padding = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
89293
  self->private_data.s_decode_block_header_sans_padding.v_flags = v_flags;
89294
  self->private_data.s_decode_block_header_sans_padding.v_filter_id = v_filter_id;
89295
  self->private_data.s_decode_block_header_sans_padding.v_shift = v_shift;
89296
  self->private_data.s_decode_block_header_sans_padding.v_f = v_f;
89297
89298
  goto exit;
89299
  exit:
89300
  if (a_src && a_src->data.ptr) {
89301
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
89302
  }
89303
89304
  return status;
89305
}
89306
89307
// -------- func xz.decoder.verify_index
89308
89309
WUFFS_BASE__GENERATED_C_CODE
89310
static wuffs_base__status
89311
wuffs_xz__decoder__verify_index(
89312
    wuffs_xz__decoder* self,
89313
    wuffs_base__io_buffer* a_src) {
89314
  wuffs_base__status status = wuffs_base__make_status(NULL);
89315
89316
  uint8_t v_c8 = 0;
89317
  uint32_t v_shift = 0;
89318
  uint32_t v_hash = 0;
89319
89320
  const uint8_t* iop_a_src = NULL;
89321
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
89322
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
89323
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
89324
  if (a_src && a_src->data.ptr) {
89325
    io0_a_src = a_src->data.ptr;
89326
    io1_a_src = io0_a_src + a_src->meta.ri;
89327
    iop_a_src = io1_a_src;
89328
    io2_a_src = io0_a_src + a_src->meta.wi;
89329
  }
89330
89331
  uint32_t coro_susp_point = self->private_impl.p_verify_index;
89332
  if (coro_susp_point) {
89333
    v_shift = self->private_data.s_verify_index.v_shift;
89334
  }
89335
  switch (coro_susp_point) {
89336
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
89337
89338
    if ( ! self->private_impl.f_started_verify_index) {
89339
      self->private_impl.f_started_verify_index = true;
89340
      {
89341
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
89342
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
89343
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
89344
          goto suspend;
89345
        }
89346
        uint8_t t_0 = *iop_a_src++;
89347
        v_c8 = t_0;
89348
      }
89349
      if (v_c8 != 0u) {
89350
        status = wuffs_base__make_status(wuffs_xz__error__bad_index);
89351
        goto exit;
89352
      }
89353
      self->private_impl.f_num_index_blocks = 0u;
89354
      v_shift = 0u;
89355
      while (true) {
89356
        {
89357
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
89358
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
89359
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
89360
            goto suspend;
89361
          }
89362
          uint8_t t_1 = *iop_a_src++;
89363
          v_c8 = t_1;
89364
        }
89365
        if (v_shift <= 56u) {
89366
          self->private_impl.f_num_index_blocks |= (((uint64_t)(((uint8_t)(v_c8 & 127u)))) << v_shift);
89367
          if (v_c8 >= 128u) {
89368
            v_shift += 7u;
89369
            continue;
89370
          } else if ((v_c8 == 0u) && (v_shift > 0u)) {
89371
            status = wuffs_base__make_status(wuffs_xz__error__bad_index);
89372
            goto exit;
89373
          }
89374
          break;
89375
        } else if (v_c8 != 1u) {
89376
          status = wuffs_base__make_status(wuffs_xz__error__bad_index);
89377
          goto exit;
89378
        }
89379
        self->private_impl.f_num_index_blocks |= (((uint64_t)(1u)) << 63u);
89380
        break;
89381
      }
89382
      if (self->private_impl.f_num_index_blocks != self->private_impl.f_num_actual_blocks) {
89383
        status = wuffs_base__make_status(wuffs_xz__error__bad_index);
89384
        goto exit;
89385
      }
89386
    }
89387
    while (self->private_impl.f_num_index_blocks > 0u) {
89388
      self->private_impl.f_num_index_blocks -= 1u;
89389
      self->private_impl.f_index_block_compressed_size = 0u;
89390
      v_shift = 0u;
89391
      while (true) {
89392
        {
89393
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
89394
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
89395
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
89396
            goto suspend;
89397
          }
89398
          uint8_t t_2 = *iop_a_src++;
89399
          v_c8 = t_2;
89400
        }
89401
        if (v_shift <= 56u) {
89402
          self->private_impl.f_index_block_compressed_size |= (((uint64_t)(((uint8_t)(v_c8 & 127u)))) << v_shift);
89403
          if (v_c8 >= 128u) {
89404
            v_shift += 7u;
89405
            continue;
89406
          } else if ((v_c8 == 0u) && (v_shift > 0u)) {
89407
            status = wuffs_base__make_status(wuffs_xz__error__bad_index);
89408
            goto exit;
89409
          }
89410
          break;
89411
        } else if (v_c8 != 1u) {
89412
          status = wuffs_base__make_status(wuffs_xz__error__bad_index);
89413
          goto exit;
89414
        }
89415
        self->private_impl.f_index_block_compressed_size |= (((uint64_t)(1u)) << 63u);
89416
        break;
89417
      }
89418
      self->private_impl.f_index_block_uncompressed_size = 0u;
89419
      v_shift = 0u;
89420
      while (true) {
89421
        {
89422
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
89423
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
89424
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
89425
            goto suspend;
89426
          }
89427
          uint8_t t_3 = *iop_a_src++;
89428
          v_c8 = t_3;
89429
        }
89430
        if (v_shift <= 56u) {
89431
          self->private_impl.f_index_block_uncompressed_size |= (((uint64_t)(((uint8_t)(v_c8 & 127u)))) << v_shift);
89432
          if (v_c8 >= 128u) {
89433
            v_shift += 7u;
89434
            continue;
89435
          } else if ((v_c8 == 0u) && (v_shift > 0u)) {
89436
            status = wuffs_base__make_status(wuffs_xz__error__bad_index);
89437
            goto exit;
89438
          }
89439
          break;
89440
        } else if (v_c8 != 1u) {
89441
          status = wuffs_base__make_status(wuffs_xz__error__bad_index);
89442
          goto exit;
89443
        }
89444
        self->private_impl.f_index_block_uncompressed_size |= (((uint64_t)(1u)) << 63u);
89445
        break;
89446
      }
89447
      self->private_impl.f_verification_want_total_sizes[0u] += self->private_impl.f_index_block_compressed_size;
89448
      v_hash = ((uint32_t)((self->private_impl.f_index_block_compressed_size ^ (self->private_impl.f_index_block_compressed_size >> 32u))));
89449
      v_hash *= 3432918353u;
89450
      v_hash = (((uint32_t)(v_hash << 15u)) | (v_hash >> 17u));
89451
      v_hash *= 461845907u;
89452
      v_hash ^= self->private_impl.f_verification_want_hashed_sizes[0u];
89453
      v_hash = (((uint32_t)(v_hash << 13u)) | (v_hash >> 19u));
89454
      self->private_impl.f_verification_want_hashed_sizes[0u] = ((uint32_t)(((uint32_t)(v_hash * 5u)) + 3864292196u));
89455
      self->private_impl.f_verification_want_total_sizes[1u] += self->private_impl.f_index_block_uncompressed_size;
89456
      v_hash = ((uint32_t)((self->private_impl.f_index_block_uncompressed_size ^ (self->private_impl.f_index_block_uncompressed_size >> 32u))));
89457
      v_hash *= 3432918353u;
89458
      v_hash = (((uint32_t)(v_hash << 15u)) | (v_hash >> 17u));
89459
      v_hash *= 461845907u;
89460
      v_hash ^= self->private_impl.f_verification_want_hashed_sizes[1u];
89461
      v_hash = (((uint32_t)(v_hash << 13u)) | (v_hash >> 19u));
89462
      self->private_impl.f_verification_want_hashed_sizes[1u] = ((uint32_t)(((uint32_t)(v_hash * 5u)) + 3864292196u));
89463
    }
89464
    if ((self->private_impl.f_verification_have_hashed_sizes[0u] != self->private_impl.f_verification_want_hashed_sizes[0u]) ||
89465
        (self->private_impl.f_verification_have_hashed_sizes[1u] != self->private_impl.f_verification_want_hashed_sizes[1u]) ||
89466
        (self->private_impl.f_verification_have_total_sizes[0u] != self->private_impl.f_verification_want_total_sizes[0u]) ||
89467
        (self->private_impl.f_verification_have_total_sizes[1u] != self->private_impl.f_verification_want_total_sizes[1u])) {
89468
      status = wuffs_base__make_status(wuffs_xz__error__bad_index);
89469
      goto exit;
89470
    }
89471
89472
    goto ok;
89473
    ok:
89474
    self->private_impl.p_verify_index = 0;
89475
    goto exit;
89476
  }
89477
89478
  goto suspend;
89479
  suspend:
89480
  self->private_impl.p_verify_index = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
89481
  self->private_data.s_verify_index.v_shift = v_shift;
89482
89483
  goto exit;
89484
  exit:
89485
  if (a_src && a_src->data.ptr) {
89486
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
89487
  }
89488
89489
  return status;
89490
}
89491
89492
// -------- func xz.decoder.verify_footer
89493
89494
WUFFS_BASE__GENERATED_C_CODE
89495
static wuffs_base__status
89496
wuffs_xz__decoder__verify_footer(
89497
    wuffs_xz__decoder* self,
89498
    wuffs_base__io_buffer* a_src) {
89499
  wuffs_base__status status = wuffs_base__make_status(NULL);
89500
89501
  uint32_t v_c32 = 0;
89502
89503
  const uint8_t* iop_a_src = NULL;
89504
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
89505
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
89506
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
89507
  if (a_src && a_src->data.ptr) {
89508
    io0_a_src = a_src->data.ptr;
89509
    io1_a_src = io0_a_src + a_src->meta.ri;
89510
    iop_a_src = io1_a_src;
89511
    io2_a_src = io0_a_src + a_src->meta.wi;
89512
  }
89513
89514
  uint32_t coro_susp_point = self->private_impl.p_verify_footer;
89515
  switch (coro_susp_point) {
89516
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
89517
89518
    {
89519
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
89520
      uint32_t t_0;
89521
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
89522
        t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
89523
        iop_a_src += 4;
89524
      } else {
89525
        self->private_data.s_verify_footer.scratch = 0;
89526
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
89527
        while (true) {
89528
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
89529
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
89530
            goto suspend;
89531
          }
89532
          uint64_t* scratch = &self->private_data.s_verify_footer.scratch;
89533
          uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
89534
          *scratch <<= 8;
89535
          *scratch >>= 8;
89536
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
89537
          if (num_bits_0 == 24) {
89538
            t_0 = ((uint32_t)(*scratch));
89539
            break;
89540
          }
89541
          num_bits_0 += 8u;
89542
          *scratch |= ((uint64_t)(num_bits_0)) << 56;
89543
        }
89544
      }
89545
      v_c32 = t_0;
89546
    }
89547
    if (v_c32 != ((uint32_t)(self->private_impl.f_backwards_size))) {
89548
      status = wuffs_base__make_status(wuffs_xz__error__bad_footer);
89549
      goto exit;
89550
    }
89551
    {
89552
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
89553
      uint32_t t_1;
89554
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
89555
        t_1 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
89556
        iop_a_src += 2;
89557
      } else {
89558
        self->private_data.s_verify_footer.scratch = 0;
89559
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
89560
        while (true) {
89561
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
89562
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
89563
            goto suspend;
89564
          }
89565
          uint64_t* scratch = &self->private_data.s_verify_footer.scratch;
89566
          uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
89567
          *scratch <<= 8;
89568
          *scratch >>= 8;
89569
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
89570
          if (num_bits_1 == 8) {
89571
            t_1 = ((uint32_t)(*scratch));
89572
            break;
89573
          }
89574
          num_bits_1 += 8u;
89575
          *scratch |= ((uint64_t)(num_bits_1)) << 56;
89576
        }
89577
      }
89578
      v_c32 = t_1;
89579
    }
89580
    if (v_c32 != ((uint32_t)(self->private_impl.f_flags))) {
89581
      status = wuffs_base__make_status(wuffs_xz__error__bad_footer);
89582
      goto exit;
89583
    }
89584
89585
    goto ok;
89586
    ok:
89587
    self->private_impl.p_verify_footer = 0;
89588
    goto exit;
89589
  }
89590
89591
  goto suspend;
89592
  suspend:
89593
  self->private_impl.p_verify_footer = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
89594
89595
  goto exit;
89596
  exit:
89597
  if (a_src && a_src->data.ptr) {
89598
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
89599
  }
89600
89601
  return status;
89602
}
89603
89604
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XZ)
89605
89606
#if defined(__cplusplus) && defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
89607
89608
// ---------------- Auxiliary - Base
89609
89610
// Auxiliary code is discussed at
89611
// https://github.com/google/wuffs/blob/main/doc/note/auxiliary-code.md
89612
89613
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__AUX__BASE)
89614
89615
namespace wuffs_aux {
89616
89617
namespace sync_io {
89618
89619
// --------
89620
89621
DynIOBuffer::DynIOBuffer(uint64_t max_incl)
89622
    : m_buf(wuffs_base__empty_io_buffer()), m_max_incl(max_incl) {}
89623
89624
DynIOBuffer::~DynIOBuffer() {
89625
  free(m_buf.data.ptr);
89626
}
89627
89628
void  //
89629
DynIOBuffer::drop() {
89630
  free(m_buf.data.ptr);
89631
  m_buf = wuffs_base__empty_io_buffer();
89632
}
89633
89634
DynIOBuffer::GrowResult  //
89635
DynIOBuffer::grow(uint64_t min_incl) {
89636
  uint64_t n = round_up(min_incl, m_max_incl);
89637
  if (n == 0) {
89638
    return ((min_incl == 0) && (m_max_incl == 0))
89639
               ? DynIOBuffer::GrowResult::OK
89640
               : DynIOBuffer::GrowResult::FailedMaxInclExceeded;
89641
  } else if (n > SIZE_MAX) {
89642
    return DynIOBuffer::GrowResult::FailedOutOfMemory;
89643
  } else if (n > m_buf.data.len) {
89644
    uint8_t* ptr =
89645
        static_cast<uint8_t*>(realloc(m_buf.data.ptr, static_cast<size_t>(n)));
89646
    if (!ptr) {
89647
      return DynIOBuffer::GrowResult::FailedOutOfMemory;
89648
    }
89649
    m_buf.data.ptr = ptr;
89650
    m_buf.data.len = static_cast<size_t>(n);
89651
  }
89652
  return DynIOBuffer::GrowResult::OK;
89653
}
89654
89655
// round_up rounds min_incl up, returning the smallest value x satisfying
89656
// (min_incl <= x) and (x <= max_incl) and some other constraints. It returns 0
89657
// if there is no such x.
89658
//
89659
// When max_incl <= 4096, the other constraints are:
89660
//  - (x == max_incl)
89661
//
89662
// When max_incl >  4096, the other constraints are:
89663
//  - (x == max_incl) or (x is a power of 2)
89664
//  - (x >= 4096)
89665
uint64_t  //
89666
DynIOBuffer::round_up(uint64_t min_incl, uint64_t max_incl) {
89667
  if (min_incl > max_incl) {
89668
    return 0;
89669
  }
89670
  uint64_t n = 4096;
89671
  if (n >= max_incl) {
89672
    return max_incl;
89673
  }
89674
  while (n < min_incl) {
89675
    if (n >= (max_incl / 2)) {
89676
      return max_incl;
89677
    }
89678
    n *= 2;
89679
  }
89680
  return n;
89681
}
89682
89683
// --------
89684
89685
Input::~Input() {}
89686
89687
IOBuffer*  //
89688
Input::BringsItsOwnIOBuffer() {
89689
  return nullptr;
89690
}
89691
89692
// --------
89693
89694
FileInput::FileInput(FILE* f) : m_f(f) {}
89695
89696
std::string  //
89697
FileInput::CopyIn(IOBuffer* dst) {
89698
  if (!m_f) {
89699
    return "wuffs_aux::sync_io::FileInput: nullptr file";
89700
  } else if (!dst) {
89701
    return "wuffs_aux::sync_io::FileInput: nullptr IOBuffer";
89702
  } else if (dst->meta.closed) {
89703
    return "wuffs_aux::sync_io::FileInput: end of file";
89704
  } else {
89705
    dst->compact();
89706
    size_t n = fread(dst->writer_pointer(), 1, dst->writer_length(), m_f);
89707
    dst->meta.wi += n;
89708
    dst->meta.closed = feof(m_f);
89709
    if (ferror(m_f)) {
89710
      return "wuffs_aux::sync_io::FileInput: error reading file";
89711
    }
89712
  }
89713
  return "";
89714
}
89715
89716
// --------
89717
89718
MemoryInput::MemoryInput(const char* ptr, size_t len)
89719
    : m_io(wuffs_base__ptr_u8__reader(
89720
          static_cast<uint8_t*>(static_cast<void*>(const_cast<char*>(ptr))),
89721
          len,
89722
          true)) {}
89723
89724
MemoryInput::MemoryInput(const uint8_t* ptr, size_t len)
89725
    : m_io(wuffs_base__ptr_u8__reader(const_cast<uint8_t*>(ptr), len, true)) {}
89726
89727
IOBuffer*  //
89728
MemoryInput::BringsItsOwnIOBuffer() {
89729
  return &m_io;
89730
}
89731
89732
std::string  //
89733
MemoryInput::CopyIn(IOBuffer* dst) {
89734
  if (!dst) {
89735
    return "wuffs_aux::sync_io::MemoryInput: nullptr IOBuffer";
89736
  } else if (dst->meta.closed) {
89737
    return "wuffs_aux::sync_io::MemoryInput: end of file";
89738
  } else if (wuffs_base__slice_u8__overlaps(dst->data, m_io.data)) {
89739
    // Treat m_io's data as immutable, so don't compact dst or otherwise write
89740
    // to it.
89741
    return "wuffs_aux::sync_io::MemoryInput: overlapping buffers";
89742
  } else {
89743
    dst->compact();
89744
    size_t nd = dst->writer_length();
89745
    size_t ns = m_io.reader_length();
89746
    size_t n = (nd < ns) ? nd : ns;
89747
    memcpy(dst->writer_pointer(), m_io.reader_pointer(), n);
89748
    m_io.meta.ri += n;
89749
    dst->meta.wi += n;
89750
    dst->meta.closed = m_io.reader_length() == 0;
89751
  }
89752
  return "";
89753
}
89754
89755
// --------
89756
89757
}  // namespace sync_io
89758
89759
namespace private_impl {
89760
89761
struct ErrorMessages {
89762
  const char* max_incl_metadata_length_exceeded;
89763
  const char* out_of_memory;
89764
  const char* unexpected_end_of_file;
89765
  const char* unsupported_metadata;
89766
  const char* unsupported_negative_advance;
89767
89768
  // If adding new "const char*" typed fields to this struct, either add them
89769
  // after existing fields or, if re-ordering fields, make sure that you update
89770
  // all of the "const private_impl::ErrorMessages FooBarErrorMessages" values
89771
  // in all of the sibling *.cc files.
89772
89773
  static inline const char* resolve(const char* s) {
89774
    return s ? s : "wuffs_aux::private_impl: unknown error";
89775
  };
89776
};
89777
89778
std::string  //
89779
AdvanceIOBufferTo(const ErrorMessages& error_messages,
89780
                  sync_io::Input& input,
89781
                  IOBuffer& io_buf,
89782
                  uint64_t absolute_position) {
89783
  if (absolute_position < io_buf.reader_position()) {
89784
    return error_messages.resolve(error_messages.unsupported_negative_advance);
89785
  }
89786
  while (true) {
89787
    uint64_t relative_position = absolute_position - io_buf.reader_position();
89788
    if (relative_position <= io_buf.reader_length()) {
89789
      io_buf.meta.ri += (size_t)relative_position;
89790
      break;
89791
    } else if (io_buf.meta.closed) {
89792
      return error_messages.resolve(error_messages.unexpected_end_of_file);
89793
    }
89794
    io_buf.meta.ri = io_buf.meta.wi;
89795
    if (!input.BringsItsOwnIOBuffer()) {
89796
      io_buf.compact();
89797
    }
89798
    std::string error_message = input.CopyIn(&io_buf);
89799
    if (!error_message.empty()) {
89800
      return error_message;
89801
    }
89802
  }
89803
  return "";
89804
}
89805
89806
std::string  //
89807
HandleMetadata(
89808
    const ErrorMessages& error_messages,
89809
    sync_io::Input& input,
89810
    wuffs_base__io_buffer& io_buf,
89811
    sync_io::DynIOBuffer& raw,
89812
    wuffs_base__status (*tell_me_more_func)(void*,
89813
                                            wuffs_base__io_buffer*,
89814
                                            wuffs_base__more_information*,
89815
                                            wuffs_base__io_buffer*),
89816
    void* tell_me_more_receiver,
89817
    std::string (*handle_metadata_func)(void*,
89818
                                        const wuffs_base__more_information*,
89819
                                        wuffs_base__slice_u8),
89820
    void* handle_metadata_receiver) {
89821
  wuffs_base__more_information minfo = wuffs_base__empty_more_information();
89822
  // Reset raw but keep its backing array (the raw.m_buf.data slice).
89823
  raw.m_buf.meta = wuffs_base__empty_io_buffer_meta();
89824
89825
  while (true) {
89826
    minfo = wuffs_base__empty_more_information();
89827
    wuffs_base__status status = (*tell_me_more_func)(
89828
        tell_me_more_receiver, &raw.m_buf, &minfo, &io_buf);
89829
    switch (minfo.flavor) {
89830
      case 0:
89831
      case WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA_RAW_TRANSFORM:
89832
      case WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA_PARSED:
89833
        break;
89834
89835
      case WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA_RAW_PASSTHROUGH: {
89836
        wuffs_base__range_ie_u64 r = minfo.metadata_raw_passthrough__range();
89837
        if (r.is_empty()) {
89838
          break;
89839
        }
89840
        uint64_t num_to_copy = r.length();
89841
        if (num_to_copy > (raw.m_max_incl - raw.m_buf.meta.wi)) {
89842
          return error_messages.resolve(
89843
              error_messages.max_incl_metadata_length_exceeded);
89844
        } else if (num_to_copy > (raw.m_buf.data.len - raw.m_buf.meta.wi)) {
89845
          switch (raw.grow(num_to_copy + raw.m_buf.meta.wi)) {
89846
            case sync_io::DynIOBuffer::GrowResult::OK:
89847
              break;
89848
            case sync_io::DynIOBuffer::GrowResult::FailedMaxInclExceeded:
89849
              return error_messages.resolve(
89850
                  error_messages.max_incl_metadata_length_exceeded);
89851
            case sync_io::DynIOBuffer::GrowResult::FailedOutOfMemory:
89852
              return error_messages.resolve(error_messages.out_of_memory);
89853
          }
89854
        }
89855
89856
        if (io_buf.reader_position() > r.min_incl) {
89857
          return error_messages.resolve(error_messages.unsupported_metadata);
89858
        } else {
89859
          std::string error_message =
89860
              AdvanceIOBufferTo(error_messages, input, io_buf, r.min_incl);
89861
          if (!error_message.empty()) {
89862
            return error_message;
89863
          }
89864
        }
89865
89866
        while (true) {
89867
          uint64_t n =
89868
              wuffs_base__u64__min(num_to_copy, io_buf.reader_length());
89869
          memcpy(raw.m_buf.writer_pointer(), io_buf.reader_pointer(), n);
89870
          raw.m_buf.meta.wi += n;
89871
          io_buf.meta.ri += n;
89872
          num_to_copy -= n;
89873
          if (num_to_copy == 0) {
89874
            break;
89875
          } else if (io_buf.meta.closed) {
89876
            return error_messages.resolve(
89877
                error_messages.unexpected_end_of_file);
89878
          } else if (!input.BringsItsOwnIOBuffer()) {
89879
            io_buf.compact();
89880
          }
89881
          std::string error_message = input.CopyIn(&io_buf);
89882
          if (!error_message.empty()) {
89883
            return error_message;
89884
          }
89885
        }
89886
        break;
89887
      }
89888
89889
      default:
89890
        return error_messages.resolve(error_messages.unsupported_metadata);
89891
    }
89892
89893
    if (status.repr == nullptr) {
89894
      break;
89895
    } else if (status.repr != wuffs_base__suspension__even_more_information) {
89896
      if (status.repr != wuffs_base__suspension__short_write) {
89897
        return status.message();
89898
      }
89899
      switch (raw.grow(wuffs_base__u64__sat_add(raw.m_buf.data.len, 1))) {
89900
        case sync_io::DynIOBuffer::GrowResult::OK:
89901
          break;
89902
        case sync_io::DynIOBuffer::GrowResult::FailedMaxInclExceeded:
89903
          return error_messages.resolve(
89904
              error_messages.max_incl_metadata_length_exceeded);
89905
        case sync_io::DynIOBuffer::GrowResult::FailedOutOfMemory:
89906
          return error_messages.resolve(error_messages.out_of_memory);
89907
      }
89908
    }
89909
  }
89910
89911
  return (*handle_metadata_func)(handle_metadata_receiver, &minfo,
89912
                                 raw.m_buf.reader_slice());
89913
}
89914
89915
}  // namespace private_impl
89916
89917
}  // namespace wuffs_aux
89918
89919
#endif  // !defined(WUFFS_CONFIG__MODULES) ||
89920
        // defined(WUFFS_CONFIG__MODULE__AUX__BASE)
89921
89922
// ---------------- Auxiliary - CBOR
89923
89924
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__AUX__CBOR)
89925
89926
#include <utility>
89927
89928
namespace wuffs_aux {
89929
89930
DecodeCborResult::DecodeCborResult(std::string&& error_message0,
89931
                                   uint64_t cursor_position0)
89932
    : error_message(std::move(error_message0)),
89933
      cursor_position(cursor_position0) {}
89934
89935
DecodeCborCallbacks::~DecodeCborCallbacks() {}
89936
89937
void  //
89938
DecodeCborCallbacks::Done(DecodeCborResult& result,
89939
                          sync_io::Input& input,
89940
                          IOBuffer& buffer) {}
89941
89942
DecodeCborArgQuirks::DecodeCborArgQuirks(const QuirkKeyValuePair* ptr0,
89943
                                         const size_t len0)
89944
    : ptr(ptr0), len(len0) {}
89945
89946
DecodeCborArgQuirks  //
89947
DecodeCborArgQuirks::DefaultValue() {
89948
  return DecodeCborArgQuirks(nullptr, 0);
89949
}
89950
89951
DecodeCborResult  //
89952
DecodeCbor(DecodeCborCallbacks& callbacks,
89953
           sync_io::Input& input,
89954
           DecodeCborArgQuirks quirks) {
89955
  // Prepare the wuffs_base__io_buffer and the resultant error_message.
89956
  wuffs_base__io_buffer* io_buf = input.BringsItsOwnIOBuffer();
89957
  wuffs_base__io_buffer fallback_io_buf = wuffs_base__empty_io_buffer();
89958
  std::unique_ptr<uint8_t[]> fallback_io_array(nullptr);
89959
  if (!io_buf) {
89960
    fallback_io_array = std::unique_ptr<uint8_t[]>(new uint8_t[4096]);
89961
    fallback_io_buf = wuffs_base__ptr_u8__writer(fallback_io_array.get(), 4096);
89962
    io_buf = &fallback_io_buf;
89963
  }
89964
  // cursor_index is discussed at
89965
  // https://nigeltao.github.io/blog/2020/jsonptr.html#the-cursor-index
89966
  size_t cursor_index = 0;
89967
  std::string ret_error_message;
89968
  std::string io_error_message;
89969
89970
  do {
89971
    // Prepare the low-level CBOR decoder.
89972
    wuffs_cbor__decoder::unique_ptr dec = wuffs_cbor__decoder::alloc();
89973
    if (!dec) {
89974
      ret_error_message = "wuffs_aux::DecodeCbor: out of memory";
89975
      goto done;
89976
    }
89977
    for (size_t i = 0; i < quirks.len; i++) {
89978
      dec->set_quirk(quirks.ptr[i].first, quirks.ptr[i].second);
89979
    }
89980
89981
    // Prepare the wuffs_base__tok_buffer. 256 tokens is 2KiB.
89982
    wuffs_base__token tok_array[256];
89983
    wuffs_base__token_buffer tok_buf =
89984
        wuffs_base__slice_token__writer(wuffs_base__make_slice_token(
89985
            &tok_array[0], (sizeof(tok_array) / sizeof(tok_array[0]))));
89986
    wuffs_base__status tok_status = wuffs_base__make_status(nullptr);
89987
89988
    // Prepare other state.
89989
    int32_t depth = 0;
89990
    std::string str;
89991
    int64_t extension_category = 0;
89992
    uint64_t extension_detail = 0;
89993
89994
    // Valid token's VBCs range in 0 ..= 15. Values over that are for tokens
89995
    // from outside of the base package, such as the CBOR package.
89996
    constexpr int64_t EXT_CAT__CBOR_TAG = 16;
89997
89998
    // Loop, doing these two things:
89999
    //  1. Get the next token.
90000
    //  2. Process that token.
90001
    while (true) {
90002
      // 1. Get the next token.
90003
90004
      while (tok_buf.meta.ri >= tok_buf.meta.wi) {
90005
        if (tok_status.repr == nullptr) {
90006
          // No-op.
90007
        } else if (tok_status.repr == wuffs_base__suspension__short_write) {
90008
          tok_buf.compact();
90009
        } else if (tok_status.repr == wuffs_base__suspension__short_read) {
90010
          // Read from input to io_buf.
90011
          if (!io_error_message.empty()) {
90012
            ret_error_message = std::move(io_error_message);
90013
            goto done;
90014
          } else if (cursor_index != io_buf->meta.ri) {
90015
            ret_error_message =
90016
                "wuffs_aux::DecodeCbor: internal error: bad cursor_index";
90017
            goto done;
90018
          } else if (io_buf->meta.closed) {
90019
            ret_error_message =
90020
                "wuffs_aux::DecodeCbor: internal error: io_buf is closed";
90021
            goto done;
90022
          }
90023
          io_buf->compact();
90024
          if (io_buf->meta.wi >= io_buf->data.len) {
90025
            ret_error_message =
90026
                "wuffs_aux::DecodeCbor: internal error: io_buf is full";
90027
            goto done;
90028
          }
90029
          cursor_index = io_buf->meta.ri;
90030
          io_error_message = input.CopyIn(io_buf);
90031
        } else {
90032
          ret_error_message = tok_status.message();
90033
          goto done;
90034
        }
90035
90036
        if (WUFFS_CBOR__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE != 0) {
90037
          ret_error_message =
90038
              "wuffs_aux::DecodeCbor: internal error: bad WORKBUF_LEN";
90039
          goto done;
90040
        }
90041
        wuffs_base__slice_u8 work_buf = wuffs_base__empty_slice_u8();
90042
        tok_status = dec->decode_tokens(&tok_buf, io_buf, work_buf);
90043
        if ((tok_buf.meta.ri > tok_buf.meta.wi) ||
90044
            (tok_buf.meta.wi > tok_buf.data.len) ||
90045
            (io_buf->meta.ri > io_buf->meta.wi) ||
90046
            (io_buf->meta.wi > io_buf->data.len)) {
90047
          ret_error_message =
90048
              "wuffs_aux::DecodeCbor: internal error: bad buffer indexes";
90049
          goto done;
90050
        }
90051
      }
90052
90053
      wuffs_base__token token = tok_buf.data.ptr[tok_buf.meta.ri++];
90054
      uint64_t token_len = token.length();
90055
      if ((io_buf->meta.ri < cursor_index) ||
90056
          ((io_buf->meta.ri - cursor_index) < token_len)) {
90057
        ret_error_message =
90058
            "wuffs_aux::DecodeCbor: internal error: bad token indexes";
90059
        goto done;
90060
      }
90061
      uint8_t* token_ptr = io_buf->data.ptr + cursor_index;
90062
      cursor_index += static_cast<size_t>(token_len);
90063
90064
      // 2. Process that token.
90065
90066
      uint64_t vbd = token.value_base_detail();
90067
90068
      if (extension_category != 0) {
90069
        int64_t ext = token.value_extension();
90070
        if ((ext >= 0) && !token.continued()) {
90071
          extension_detail = (extension_detail
90072
                              << WUFFS_BASE__TOKEN__VALUE_EXTENSION__NUM_BITS) |
90073
                             static_cast<uint64_t>(ext);
90074
          switch (extension_category) {
90075
            case WUFFS_BASE__TOKEN__VBC__INLINE_INTEGER_SIGNED:
90076
              extension_category = 0;
90077
              ret_error_message =
90078
                  callbacks.AppendI64(static_cast<int64_t>(extension_detail));
90079
              goto parsed_a_value;
90080
            case WUFFS_BASE__TOKEN__VBC__INLINE_INTEGER_UNSIGNED:
90081
              extension_category = 0;
90082
              ret_error_message = callbacks.AppendU64(extension_detail);
90083
              goto parsed_a_value;
90084
            case EXT_CAT__CBOR_TAG:
90085
              extension_category = 0;
90086
              ret_error_message = callbacks.AppendCborTag(extension_detail);
90087
              if (!ret_error_message.empty()) {
90088
                goto done;
90089
              }
90090
              continue;
90091
          }
90092
        }
90093
        ret_error_message =
90094
            "wuffs_aux::DecodeCbor: internal error: bad extended token";
90095
        goto done;
90096
      }
90097
90098
      switch (token.value_base_category()) {
90099
        case WUFFS_BASE__TOKEN__VBC__FILLER:
90100
          continue;
90101
90102
        case WUFFS_BASE__TOKEN__VBC__STRUCTURE: {
90103
          if (vbd & WUFFS_BASE__TOKEN__VBD__STRUCTURE__PUSH) {
90104
            ret_error_message = callbacks.Push(static_cast<uint32_t>(vbd));
90105
            if (!ret_error_message.empty()) {
90106
              goto done;
90107
            }
90108
            depth++;
90109
            if (depth > (int32_t)WUFFS_CBOR__DECODER_DEPTH_MAX_INCL) {
90110
              ret_error_message =
90111
                  "wuffs_aux::DecodeCbor: internal error: bad depth";
90112
              goto done;
90113
            }
90114
            continue;
90115
          }
90116
          ret_error_message = callbacks.Pop(static_cast<uint32_t>(vbd));
90117
          depth--;
90118
          if (depth < 0) {
90119
            ret_error_message =
90120
                "wuffs_aux::DecodeCbor: internal error: bad depth";
90121
            goto done;
90122
          }
90123
          goto parsed_a_value;
90124
        }
90125
90126
        case WUFFS_BASE__TOKEN__VBC__STRING: {
90127
          if (vbd & WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_0_DST_1_SRC_DROP) {
90128
            // No-op.
90129
          } else if (vbd &
90130
                     WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_1_DST_1_SRC_COPY) {
90131
            const char* ptr =  // Convert from (uint8_t*).
90132
                static_cast<const char*>(static_cast<void*>(token_ptr));
90133
            str.append(ptr, static_cast<size_t>(token_len));
90134
          } else {
90135
            goto fail;
90136
          }
90137
          if (token.continued()) {
90138
            continue;
90139
          }
90140
          ret_error_message =
90141
              (vbd & WUFFS_BASE__TOKEN__VBD__STRING__CHAIN_MUST_BE_UTF_8)
90142
                  ? callbacks.AppendTextString(std::move(str))
90143
                  : callbacks.AppendByteString(std::move(str));
90144
          str.clear();
90145
          goto parsed_a_value;
90146
        }
90147
90148
        case WUFFS_BASE__TOKEN__VBC__UNICODE_CODE_POINT: {
90149
          uint8_t u[WUFFS_BASE__UTF_8__BYTE_LENGTH__MAX_INCL];
90150
          size_t n = wuffs_base__utf_8__encode(
90151
              wuffs_base__make_slice_u8(
90152
                  &u[0], WUFFS_BASE__UTF_8__BYTE_LENGTH__MAX_INCL),
90153
              static_cast<uint32_t>(vbd));
90154
          const char* ptr =  // Convert from (uint8_t*).
90155
              static_cast<const char*>(static_cast<void*>(&u[0]));
90156
          str.append(ptr, n);
90157
          if (token.continued()) {
90158
            continue;
90159
          }
90160
          goto fail;
90161
        }
90162
90163
        case WUFFS_BASE__TOKEN__VBC__LITERAL: {
90164
          if (vbd & WUFFS_BASE__TOKEN__VBD__LITERAL__NULL) {
90165
            ret_error_message = callbacks.AppendNull();
90166
          } else if (vbd & WUFFS_BASE__TOKEN__VBD__LITERAL__UNDEFINED) {
90167
            ret_error_message = callbacks.AppendUndefined();
90168
          } else {
90169
            ret_error_message = callbacks.AppendBool(
90170
                vbd & WUFFS_BASE__TOKEN__VBD__LITERAL__TRUE);
90171
          }
90172
          goto parsed_a_value;
90173
        }
90174
90175
        case WUFFS_BASE__TOKEN__VBC__NUMBER: {
90176
          const uint64_t cfp_fbbe_fifb =
90177
              WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_FLOATING_POINT |
90178
              WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_BINARY_BIG_ENDIAN |
90179
              WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_IGNORE_FIRST_BYTE;
90180
          if ((vbd & cfp_fbbe_fifb) == cfp_fbbe_fifb) {
90181
            double f;
90182
            switch (token_len) {
90183
              case 3:
90184
                f = wuffs_base__ieee_754_bit_representation__from_u16_to_f64(
90185
                    wuffs_base__peek_u16be__no_bounds_check(token_ptr + 1));
90186
                break;
90187
              case 5:
90188
                f = wuffs_base__ieee_754_bit_representation__from_u32_to_f64(
90189
                    wuffs_base__peek_u32be__no_bounds_check(token_ptr + 1));
90190
                break;
90191
              case 9:
90192
                f = wuffs_base__ieee_754_bit_representation__from_u64_to_f64(
90193
                    wuffs_base__peek_u64be__no_bounds_check(token_ptr + 1));
90194
                break;
90195
              default:
90196
                goto fail;
90197
            }
90198
            ret_error_message = callbacks.AppendF64(f);
90199
            goto parsed_a_value;
90200
          }
90201
          goto fail;
90202
        }
90203
90204
        case WUFFS_BASE__TOKEN__VBC__INLINE_INTEGER_SIGNED: {
90205
          if (token.continued()) {
90206
            extension_category = WUFFS_BASE__TOKEN__VBC__INLINE_INTEGER_SIGNED;
90207
            extension_detail =
90208
                static_cast<uint64_t>(token.value_base_detail__sign_extended());
90209
            continue;
90210
          }
90211
          ret_error_message =
90212
              callbacks.AppendI64(token.value_base_detail__sign_extended());
90213
          goto parsed_a_value;
90214
        }
90215
90216
        case WUFFS_BASE__TOKEN__VBC__INLINE_INTEGER_UNSIGNED: {
90217
          if (token.continued()) {
90218
            extension_category =
90219
                WUFFS_BASE__TOKEN__VBC__INLINE_INTEGER_UNSIGNED;
90220
            extension_detail = vbd;
90221
            continue;
90222
          }
90223
          ret_error_message = callbacks.AppendU64(vbd);
90224
          goto parsed_a_value;
90225
        }
90226
      }
90227
90228
      if (token.value_major() == WUFFS_CBOR__TOKEN_VALUE_MAJOR) {
90229
        uint64_t value_minor = token.value_minor();
90230
        if (value_minor & WUFFS_CBOR__TOKEN_VALUE_MINOR__MINUS_1_MINUS_X) {
90231
          if (token_len == 9) {
90232
            ret_error_message = callbacks.AppendMinus1MinusX(
90233
                wuffs_base__peek_u64be__no_bounds_check(token_ptr + 1));
90234
            goto parsed_a_value;
90235
          }
90236
        } else if (value_minor & WUFFS_CBOR__TOKEN_VALUE_MINOR__SIMPLE_VALUE) {
90237
          ret_error_message =
90238
              callbacks.AppendCborSimpleValue(static_cast<uint8_t>(
90239
                  value_minor & WUFFS_CBOR__TOKEN_VALUE_MINOR__DETAIL_MASK));
90240
          goto parsed_a_value;
90241
        } else if (value_minor & WUFFS_CBOR__TOKEN_VALUE_MINOR__TAG) {
90242
          if (token.continued()) {
90243
            extension_category = EXT_CAT__CBOR_TAG;
90244
            extension_detail =
90245
                value_minor & WUFFS_CBOR__TOKEN_VALUE_MINOR__DETAIL_MASK;
90246
            continue;
90247
          }
90248
          ret_error_message = callbacks.AppendCborTag(
90249
              value_minor & WUFFS_CBOR__TOKEN_VALUE_MINOR__DETAIL_MASK);
90250
          if (!ret_error_message.empty()) {
90251
            goto done;
90252
          }
90253
          continue;
90254
        }
90255
      }
90256
90257
    fail:
90258
      ret_error_message =
90259
          "wuffs_aux::DecodeCbor: internal error: unexpected token";
90260
      goto done;
90261
90262
    parsed_a_value:
90263
      if (!ret_error_message.empty() || (depth == 0)) {
90264
        goto done;
90265
      }
90266
    }
90267
  } while (false);
90268
90269
done:
90270
  DecodeCborResult result(
90271
      std::move(ret_error_message),
90272
      wuffs_base__u64__sat_add(io_buf->meta.pos, cursor_index));
90273
  callbacks.Done(result, input, *io_buf);
90274
  return result;
90275
}
90276
90277
}  // namespace wuffs_aux
90278
90279
#endif  // !defined(WUFFS_CONFIG__MODULES) ||
90280
        // defined(WUFFS_CONFIG__MODULE__AUX__CBOR)
90281
90282
// ---------------- Auxiliary - Image
90283
90284
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__AUX__IMAGE)
90285
90286
#include <utility>
90287
90288
namespace wuffs_aux {
90289
90290
DecodeImageResult::DecodeImageResult(MemOwner&& pixbuf_mem_owner0,
90291
                                     wuffs_base__pixel_buffer pixbuf0,
90292
                                     std::string&& error_message0)
90293
    : pixbuf_mem_owner(std::move(pixbuf_mem_owner0)),
90294
      pixbuf(pixbuf0),
90295
      error_message(std::move(error_message0)) {}
90296
90297
DecodeImageResult::DecodeImageResult(std::string&& error_message0)
90298
    : pixbuf_mem_owner(nullptr, &free),
90299
      pixbuf(wuffs_base__null_pixel_buffer()),
90300
      error_message(std::move(error_message0)) {}
90301
90302
DecodeImageCallbacks::~DecodeImageCallbacks() {}
90303
90304
DecodeImageCallbacks::AllocPixbufResult::AllocPixbufResult(
90305
    MemOwner&& mem_owner0,
90306
    wuffs_base__pixel_buffer pixbuf0)
90307
    : mem_owner(std::move(mem_owner0)), pixbuf(pixbuf0), error_message("") {}
90308
90309
DecodeImageCallbacks::AllocPixbufResult::AllocPixbufResult(
90310
    std::string&& error_message0)
90311
    : mem_owner(nullptr, &free),
90312
      pixbuf(wuffs_base__null_pixel_buffer()),
90313
      error_message(std::move(error_message0)) {}
90314
90315
DecodeImageCallbacks::AllocWorkbufResult::AllocWorkbufResult(
90316
    MemOwner&& mem_owner0,
90317
    wuffs_base__slice_u8 workbuf0)
90318
    : mem_owner(std::move(mem_owner0)), workbuf(workbuf0), error_message("") {}
90319
90320
DecodeImageCallbacks::AllocWorkbufResult::AllocWorkbufResult(
90321
    std::string&& error_message0)
90322
    : mem_owner(nullptr, &free),
90323
      workbuf(wuffs_base__empty_slice_u8()),
90324
      error_message(std::move(error_message0)) {}
90325
90326
wuffs_base__image_decoder::unique_ptr  //
90327
DecodeImageCallbacks::SelectDecoder(uint32_t fourcc,
90328
                                    wuffs_base__slice_u8 prefix_data,
90329
                                    bool prefix_closed) {
90330
  switch (fourcc) {
90331
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BMP)
90332
    case WUFFS_BASE__FOURCC__BMP:
90333
      return wuffs_bmp__decoder::alloc_as__wuffs_base__image_decoder();
90334
#endif
90335
90336
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ETC2)
90337
    case WUFFS_BASE__FOURCC__ETC2:
90338
      return wuffs_etc2__decoder::alloc_as__wuffs_base__image_decoder();
90339
#endif
90340
90341
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GIF)
90342
    case WUFFS_BASE__FOURCC__GIF:
90343
      return wuffs_gif__decoder::alloc_as__wuffs_base__image_decoder();
90344
#endif
90345
90346
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__HANDSUM)
90347
    case WUFFS_BASE__FOURCC__HNSM:
90348
      return wuffs_handsum__decoder::alloc_as__wuffs_base__image_decoder();
90349
#endif
90350
90351
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JPEG)
90352
    case WUFFS_BASE__FOURCC__JPEG:
90353
      return wuffs_jpeg__decoder::alloc_as__wuffs_base__image_decoder();
90354
#endif
90355
90356
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NIE)
90357
    case WUFFS_BASE__FOURCC__NIE:
90358
      return wuffs_nie__decoder::alloc_as__wuffs_base__image_decoder();
90359
#endif
90360
90361
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NETPBM)
90362
    case WUFFS_BASE__FOURCC__NPBM:
90363
      return wuffs_netpbm__decoder::alloc_as__wuffs_base__image_decoder();
90364
#endif
90365
90366
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__PNG)
90367
    case WUFFS_BASE__FOURCC__PNG: {
90368
      auto dec = wuffs_png__decoder::alloc_as__wuffs_base__image_decoder();
90369
      // Favor faster decodes over rejecting invalid checksums.
90370
      dec->set_quirk(WUFFS_BASE__QUIRK_IGNORE_CHECKSUM, 1);
90371
      return dec;
90372
    }
90373
#endif
90374
90375
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__QOI)
90376
    case WUFFS_BASE__FOURCC__QOI:
90377
      return wuffs_qoi__decoder::alloc_as__wuffs_base__image_decoder();
90378
#endif
90379
90380
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__TARGA)
90381
    case WUFFS_BASE__FOURCC__TGA:
90382
      return wuffs_targa__decoder::alloc_as__wuffs_base__image_decoder();
90383
#endif
90384
90385
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__THUMBHASH)
90386
    case WUFFS_BASE__FOURCC__TH:
90387
      return wuffs_thumbhash__decoder::alloc_as__wuffs_base__image_decoder();
90388
#endif
90389
90390
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WBMP)
90391
    case WUFFS_BASE__FOURCC__WBMP:
90392
      return wuffs_wbmp__decoder::alloc_as__wuffs_base__image_decoder();
90393
#endif
90394
90395
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WEBP)
90396
    case WUFFS_BASE__FOURCC__WEBP:
90397
      return wuffs_webp__decoder::alloc_as__wuffs_base__image_decoder();
90398
#endif
90399
  }
90400
90401
  return wuffs_base__image_decoder::unique_ptr(nullptr);
90402
}
90403
90404
std::string  //
90405
DecodeImageCallbacks::HandleMetadata(const wuffs_base__more_information& minfo,
90406
                                     wuffs_base__slice_u8 raw) {
90407
  return "";
90408
}
90409
90410
wuffs_base__pixel_format  //
90411
DecodeImageCallbacks::SelectPixfmt(
90412
    const wuffs_base__image_config& image_config) {
90413
  return wuffs_base__make_pixel_format(WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL);
90414
}
90415
90416
DecodeImageCallbacks::AllocPixbufResult  //
90417
DecodeImageCallbacks::AllocPixbuf(const wuffs_base__image_config& image_config,
90418
                                  bool allow_uninitialized_memory) {
90419
  uint32_t w = image_config.pixcfg.width();
90420
  uint32_t h = image_config.pixcfg.height();
90421
  if ((w == 0) || (h == 0)) {
90422
    return AllocPixbufResult("");
90423
  }
90424
  uint64_t len = image_config.pixcfg.pixbuf_len();
90425
  if ((len == 0) || (SIZE_MAX < len)) {
90426
    return AllocPixbufResult(DecodeImage_UnsupportedPixelConfiguration);
90427
  }
90428
  void* ptr =
90429
      allow_uninitialized_memory ? malloc((size_t)len) : calloc(1, (size_t)len);
90430
  if (!ptr) {
90431
    return AllocPixbufResult(DecodeImage_OutOfMemory);
90432
  }
90433
  wuffs_base__pixel_buffer pixbuf;
90434
  wuffs_base__status status = pixbuf.set_from_slice(
90435
      &image_config.pixcfg,
90436
      wuffs_base__make_slice_u8((uint8_t*)ptr, (size_t)len));
90437
  if (!status.is_ok()) {
90438
    free(ptr);
90439
    return AllocPixbufResult(status.message());
90440
  }
90441
  return AllocPixbufResult(MemOwner(ptr, &free), pixbuf);
90442
}
90443
90444
DecodeImageCallbacks::AllocWorkbufResult  //
90445
DecodeImageCallbacks::AllocWorkbuf(wuffs_base__range_ii_u64 len_range,
90446
                                   bool allow_uninitialized_memory) {
90447
  uint64_t len = len_range.max_incl;
90448
  if (len == 0) {
90449
    return AllocWorkbufResult("");
90450
  } else if (SIZE_MAX < len) {
90451
    return AllocWorkbufResult(DecodeImage_OutOfMemory);
90452
  }
90453
  void* ptr =
90454
      allow_uninitialized_memory ? malloc((size_t)len) : calloc(1, (size_t)len);
90455
  if (!ptr) {
90456
    return AllocWorkbufResult(DecodeImage_OutOfMemory);
90457
  }
90458
  return AllocWorkbufResult(
90459
      MemOwner(ptr, &free),
90460
      wuffs_base__make_slice_u8((uint8_t*)ptr, (size_t)len));
90461
}
90462
90463
void  //
90464
DecodeImageCallbacks::Done(
90465
    DecodeImageResult& result,
90466
    sync_io::Input& input,
90467
    IOBuffer& buffer,
90468
    wuffs_base__image_decoder::unique_ptr image_decoder) {}
90469
90470
const char DecodeImage_BufferIsTooShort[] =  //
90471
    "wuffs_aux::DecodeImage: buffer is too short";
90472
const char DecodeImage_MaxInclDimensionExceeded[] =  //
90473
    "wuffs_aux::DecodeImage: max_incl_dimension exceeded";
90474
const char DecodeImage_MaxInclMetadataLengthExceeded[] =  //
90475
    "wuffs_aux::DecodeImage: max_incl_metadata_length exceeded";
90476
const char DecodeImage_OutOfMemory[] =  //
90477
    "wuffs_aux::DecodeImage: out of memory";
90478
const char DecodeImage_UnexpectedEndOfFile[] =  //
90479
    "wuffs_aux::DecodeImage: unexpected end of file";
90480
const char DecodeImage_UnsupportedImageFormat[] =  //
90481
    "wuffs_aux::DecodeImage: unsupported image format";
90482
const char DecodeImage_UnsupportedMetadata[] =  //
90483
    "wuffs_aux::DecodeImage: unsupported metadata";
90484
const char DecodeImage_UnsupportedPixelBlend[] =  //
90485
    "wuffs_aux::DecodeImage: unsupported pixel blend";
90486
const char DecodeImage_UnsupportedPixelConfiguration[] =  //
90487
    "wuffs_aux::DecodeImage: unsupported pixel configuration";
90488
const char DecodeImage_UnsupportedPixelFormat[] =  //
90489
    "wuffs_aux::DecodeImage: unsupported pixel format";
90490
90491
DecodeImageArgQuirks::DecodeImageArgQuirks(const QuirkKeyValuePair* ptr0,
90492
                                           const size_t len0)
90493
    : ptr(ptr0), len(len0) {}
90494
90495
DecodeImageArgQuirks  //
90496
DecodeImageArgQuirks::DefaultValue() {
90497
  return DecodeImageArgQuirks(nullptr, 0);
90498
}
90499
90500
DecodeImageArgFlags::DecodeImageArgFlags(uint64_t repr0) : repr(repr0) {}
90501
90502
DecodeImageArgFlags  //
90503
DecodeImageArgFlags::DefaultValue() {
90504
  return DecodeImageArgFlags(0);
90505
}
90506
90507
DecodeImageArgPixelBlend::DecodeImageArgPixelBlend(
90508
    wuffs_base__pixel_blend repr0)
90509
    : repr(repr0) {}
90510
90511
DecodeImageArgPixelBlend  //
90512
DecodeImageArgPixelBlend::DefaultValue() {
90513
  return DecodeImageArgPixelBlend(WUFFS_BASE__PIXEL_BLEND__SRC);
90514
}
90515
90516
DecodeImageArgBackgroundColor::DecodeImageArgBackgroundColor(
90517
    wuffs_base__color_u32_argb_premul repr0)
90518
    : repr(repr0) {}
90519
90520
DecodeImageArgBackgroundColor  //
90521
DecodeImageArgBackgroundColor::DefaultValue() {
90522
  return DecodeImageArgBackgroundColor(1);
90523
}
90524
90525
DecodeImageArgMaxInclDimension::DecodeImageArgMaxInclDimension(uint32_t repr0)
90526
    : repr(repr0) {}
90527
90528
DecodeImageArgMaxInclDimension  //
90529
DecodeImageArgMaxInclDimension::DefaultValue() {
90530
  return DecodeImageArgMaxInclDimension(1048575);
90531
}
90532
90533
DecodeImageArgMaxInclMetadataLength::DecodeImageArgMaxInclMetadataLength(
90534
    uint64_t repr0)
90535
    : repr(repr0) {}
90536
90537
DecodeImageArgMaxInclMetadataLength  //
90538
DecodeImageArgMaxInclMetadataLength::DefaultValue() {
90539
  return DecodeImageArgMaxInclMetadataLength(16777215);
90540
}
90541
90542
// --------
90543
90544
namespace {
90545
90546
const private_impl::ErrorMessages DecodeImageErrorMessages = {
90547
    DecodeImage_MaxInclMetadataLengthExceeded,  //
90548
    DecodeImage_OutOfMemory,                    //
90549
    DecodeImage_UnexpectedEndOfFile,            //
90550
    DecodeImage_UnsupportedMetadata,            //
90551
    DecodeImage_UnsupportedImageFormat,         //
90552
};
90553
90554
std::string  //
90555
DecodeImageAdvanceIOBufferTo(sync_io::Input& input,
90556
                             wuffs_base__io_buffer& io_buf,
90557
                             uint64_t absolute_position) {
90558
  return private_impl::AdvanceIOBufferTo(DecodeImageErrorMessages, input,
90559
                                         io_buf, absolute_position);
90560
}
90561
90562
wuffs_base__status  //
90563
DIHM0(void* self,
90564
      wuffs_base__io_buffer* a_dst,
90565
      wuffs_base__more_information* a_minfo,
90566
      wuffs_base__io_buffer* a_src) {
90567
  return wuffs_base__image_decoder__tell_me_more(
90568
      static_cast<wuffs_base__image_decoder*>(self), a_dst, a_minfo, a_src);
90569
}
90570
90571
std::string  //
90572
DIHM1(void* self,
90573
      const wuffs_base__more_information* minfo,
90574
      wuffs_base__slice_u8 raw) {
90575
  return static_cast<DecodeImageCallbacks*>(self)->HandleMetadata(*minfo, raw);
90576
}
90577
90578
std::string  //
90579
DecodeImageHandleMetadata(wuffs_base__image_decoder::unique_ptr& image_decoder,
90580
                          DecodeImageCallbacks& callbacks,
90581
                          sync_io::Input& input,
90582
                          wuffs_base__io_buffer& io_buf,
90583
                          sync_io::DynIOBuffer& raw_metadata_buf) {
90584
  return private_impl::HandleMetadata(DecodeImageErrorMessages, input, io_buf,
90585
                                      raw_metadata_buf, DIHM0,
90586
                                      static_cast<void*>(image_decoder.get()),
90587
                                      DIHM1, static_cast<void*>(&callbacks));
90588
}
90589
90590
DecodeImageResult  //
90591
DecodeImage0(wuffs_base__image_decoder::unique_ptr& image_decoder,
90592
             DecodeImageCallbacks& callbacks,
90593
             sync_io::Input& input,
90594
             wuffs_base__io_buffer& io_buf,
90595
             const QuirkKeyValuePair* quirks_ptr,
90596
             const size_t quirks_len,
90597
             uint64_t flags,
90598
             wuffs_base__pixel_blend pixel_blend,
90599
             wuffs_base__color_u32_argb_premul background_color,
90600
             uint32_t max_incl_dimension,
90601
             uint64_t max_incl_metadata_length) {
90602
  // Check args.
90603
  switch (pixel_blend) {
90604
    case WUFFS_BASE__PIXEL_BLEND__SRC:
90605
    case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
90606
      break;
90607
    default:
90608
      return DecodeImageResult(DecodeImage_UnsupportedPixelBlend);
90609
  }
90610
90611
  wuffs_base__image_config image_config = wuffs_base__null_image_config();
90612
  sync_io::DynIOBuffer raw_metadata_buf(max_incl_metadata_length);
90613
  uint64_t start_pos = io_buf.reader_position();
90614
  bool interested_in_metadata_after_the_frame = false;
90615
  bool redirected = false;
90616
  int32_t fourcc = 0;
90617
redirect:
90618
  do {
90619
    // Determine the image format.
90620
    if (!redirected) {
90621
      while (true) {
90622
        fourcc = wuffs_base__magic_number_guess_fourcc(io_buf.reader_slice(),
90623
                                                       io_buf.meta.closed);
90624
        if (fourcc > 0) {
90625
          break;
90626
        } else if ((fourcc == 0) && (io_buf.reader_length() >= 64)) {
90627
          // Having (fourcc == 0) means that Wuffs' built in MIME sniffer
90628
          // didn't recognize the image format. Nonetheless, custom callbacks
90629
          // may still be able to do their own MIME sniffing, for exotic image
90630
          // types. We try to give them at least 64 bytes of prefix data when
90631
          // one-shot-calling callbacks.SelectDecoder. There is no mechanism
90632
          // for the callbacks to request a longer prefix.
90633
          break;
90634
        } else if (io_buf.meta.closed || (io_buf.writer_length() == 0)) {
90635
          fourcc = 0;
90636
          break;
90637
        }
90638
        std::string error_message = input.CopyIn(&io_buf);
90639
        if (!error_message.empty()) {
90640
          return DecodeImageResult(std::move(error_message));
90641
        }
90642
      }
90643
    } else {
90644
      wuffs_base__io_buffer empty = wuffs_base__empty_io_buffer();
90645
      wuffs_base__more_information minfo = wuffs_base__empty_more_information();
90646
      wuffs_base__status tmm_status =
90647
          image_decoder->tell_me_more(&empty, &minfo, &io_buf);
90648
      if (tmm_status.repr != nullptr) {
90649
        return DecodeImageResult(tmm_status.message());
90650
      }
90651
      if (minfo.flavor != WUFFS_BASE__MORE_INFORMATION__FLAVOR__IO_REDIRECT) {
90652
        return DecodeImageResult(DecodeImage_UnsupportedImageFormat);
90653
      }
90654
      uint64_t pos = minfo.io_redirect__range().min_incl;
90655
      if (pos <= start_pos) {
90656
        // Redirects must go forward.
90657
        return DecodeImageResult(DecodeImage_UnsupportedImageFormat);
90658
      }
90659
      std::string error_message =
90660
          DecodeImageAdvanceIOBufferTo(input, io_buf, pos);
90661
      if (!error_message.empty()) {
90662
        return DecodeImageResult(std::move(error_message));
90663
      }
90664
      fourcc = (int32_t)(minfo.io_redirect__fourcc());
90665
      if (fourcc == 0) {
90666
        return DecodeImageResult(DecodeImage_UnsupportedImageFormat);
90667
      }
90668
      image_decoder.reset();
90669
    }
90670
90671
    // Select the image decoder.
90672
    image_decoder = callbacks.SelectDecoder(
90673
        (uint32_t)fourcc, io_buf.reader_slice(), io_buf.meta.closed);
90674
    if (!image_decoder) {
90675
      return DecodeImageResult(DecodeImage_UnsupportedImageFormat);
90676
    }
90677
90678
    // Apply quirks.
90679
    for (size_t i = 0; i < quirks_len; i++) {
90680
      image_decoder->set_quirk(quirks_ptr[i].first, quirks_ptr[i].second);
90681
    }
90682
90683
    // Apply flags.
90684
    if (flags != 0) {
90685
      if (flags & DecodeImageArgFlags::REPORT_METADATA_CHRM) {
90686
        image_decoder->set_report_metadata(WUFFS_BASE__FOURCC__CHRM, true);
90687
      }
90688
      if (flags & DecodeImageArgFlags::REPORT_METADATA_EXIF) {
90689
        interested_in_metadata_after_the_frame = true;
90690
        image_decoder->set_report_metadata(WUFFS_BASE__FOURCC__EXIF, true);
90691
      }
90692
      if (flags & DecodeImageArgFlags::REPORT_METADATA_GAMA) {
90693
        image_decoder->set_report_metadata(WUFFS_BASE__FOURCC__GAMA, true);
90694
      }
90695
      if (flags & DecodeImageArgFlags::REPORT_METADATA_ICCP) {
90696
        image_decoder->set_report_metadata(WUFFS_BASE__FOURCC__ICCP, true);
90697
      }
90698
      if (flags & DecodeImageArgFlags::REPORT_METADATA_KVP) {
90699
        interested_in_metadata_after_the_frame = true;
90700
        image_decoder->set_report_metadata(WUFFS_BASE__FOURCC__KVP, true);
90701
      }
90702
      if (flags & DecodeImageArgFlags::REPORT_METADATA_SRGB) {
90703
        image_decoder->set_report_metadata(WUFFS_BASE__FOURCC__SRGB, true);
90704
      }
90705
      if (flags & DecodeImageArgFlags::REPORT_METADATA_XMP) {
90706
        interested_in_metadata_after_the_frame = true;
90707
        image_decoder->set_report_metadata(WUFFS_BASE__FOURCC__XMP, true);
90708
      }
90709
    }
90710
90711
    // Decode the image config.
90712
    while (true) {
90713
      wuffs_base__status id_dic_status =
90714
          image_decoder->decode_image_config(&image_config, &io_buf);
90715
      if (id_dic_status.repr == nullptr) {
90716
        break;
90717
      } else if (id_dic_status.repr == wuffs_base__note__i_o_redirect) {
90718
        if (redirected) {
90719
          return DecodeImageResult(DecodeImage_UnsupportedImageFormat);
90720
        }
90721
        redirected = true;
90722
        goto redirect;
90723
      } else if (id_dic_status.repr == wuffs_base__note__metadata_reported) {
90724
        std::string error_message = DecodeImageHandleMetadata(
90725
            image_decoder, callbacks, input, io_buf, raw_metadata_buf);
90726
        if (!error_message.empty()) {
90727
          return DecodeImageResult(std::move(error_message));
90728
        }
90729
      } else if (id_dic_status.repr != wuffs_base__suspension__short_read) {
90730
        return DecodeImageResult(id_dic_status.message());
90731
      } else if (io_buf.meta.closed) {
90732
        return DecodeImageResult(DecodeImage_UnexpectedEndOfFile);
90733
      } else {
90734
        std::string error_message = input.CopyIn(&io_buf);
90735
        if (!error_message.empty()) {
90736
          return DecodeImageResult(std::move(error_message));
90737
        }
90738
      }
90739
    }
90740
  } while (false);
90741
  if (!interested_in_metadata_after_the_frame) {
90742
    raw_metadata_buf.drop();
90743
  }
90744
90745
  // Select the pixel format.
90746
  uint32_t w = image_config.pixcfg.width();
90747
  uint32_t h = image_config.pixcfg.height();
90748
  if ((w > max_incl_dimension) || (h > max_incl_dimension)) {
90749
    return DecodeImageResult(DecodeImage_MaxInclDimensionExceeded);
90750
  }
90751
  wuffs_base__pixel_format pixel_format = callbacks.SelectPixfmt(image_config);
90752
  if (pixel_format.repr != image_config.pixcfg.pixel_format().repr) {
90753
    switch (pixel_format.repr) {
90754
      case WUFFS_BASE__PIXEL_FORMAT__Y:
90755
      case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
90756
      case WUFFS_BASE__PIXEL_FORMAT__BGR:
90757
      case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
90758
      case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
90759
      case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
90760
      case WUFFS_BASE__PIXEL_FORMAT__RGB:
90761
      case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
90762
      case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
90763
        break;
90764
      default:
90765
        return DecodeImageResult(DecodeImage_UnsupportedPixelFormat);
90766
    }
90767
    image_config.pixcfg.set(pixel_format.repr,
90768
                            WUFFS_BASE__PIXEL_SUBSAMPLING__NONE, w, h);
90769
  }
90770
90771
  // Allocate the pixel buffer.
90772
  bool valid_background_color =
90773
      wuffs_base__color_u32_argb_premul__is_valid(background_color);
90774
  DecodeImageCallbacks::AllocPixbufResult alloc_pixbuf_result =
90775
      callbacks.AllocPixbuf(image_config, valid_background_color);
90776
  if (!alloc_pixbuf_result.error_message.empty()) {
90777
    return DecodeImageResult(std::move(alloc_pixbuf_result.error_message));
90778
  }
90779
  wuffs_base__pixel_buffer pixel_buffer = alloc_pixbuf_result.pixbuf;
90780
  if (valid_background_color) {
90781
    wuffs_base__status pb_scufr_status = pixel_buffer.set_color_u32_fill_rect(
90782
        pixel_buffer.pixcfg.bounds(), background_color);
90783
    if (pb_scufr_status.repr != nullptr) {
90784
      return DecodeImageResult(pb_scufr_status.message());
90785
    }
90786
  }
90787
90788
  // Allocate the work buffer. Wuffs' decoders conventionally assume that this
90789
  // can be uninitialized memory.
90790
  wuffs_base__range_ii_u64 workbuf_len = image_decoder->workbuf_len();
90791
  DecodeImageCallbacks::AllocWorkbufResult alloc_workbuf_result =
90792
      callbacks.AllocWorkbuf(workbuf_len, true);
90793
  if (!alloc_workbuf_result.error_message.empty()) {
90794
    return DecodeImageResult(std::move(alloc_workbuf_result.error_message));
90795
  } else if (alloc_workbuf_result.workbuf.len < workbuf_len.min_incl) {
90796
    return DecodeImageResult(DecodeImage_BufferIsTooShort);
90797
  }
90798
90799
  // Decode the frame config.
90800
  wuffs_base__frame_config frame_config = wuffs_base__null_frame_config();
90801
  while (true) {
90802
    wuffs_base__status id_dfc_status =
90803
        image_decoder->decode_frame_config(&frame_config, &io_buf);
90804
    if (id_dfc_status.repr == nullptr) {
90805
      break;
90806
    } else if (id_dfc_status.repr == wuffs_base__note__metadata_reported) {
90807
      std::string error_message = DecodeImageHandleMetadata(
90808
          image_decoder, callbacks, input, io_buf, raw_metadata_buf);
90809
      if (!error_message.empty()) {
90810
        return DecodeImageResult(std::move(error_message));
90811
      }
90812
    } else if (id_dfc_status.repr != wuffs_base__suspension__short_read) {
90813
      return DecodeImageResult(id_dfc_status.message());
90814
    } else if (io_buf.meta.closed) {
90815
      return DecodeImageResult(DecodeImage_UnexpectedEndOfFile);
90816
    } else {
90817
      std::string error_message = input.CopyIn(&io_buf);
90818
      if (!error_message.empty()) {
90819
        return DecodeImageResult(std::move(error_message));
90820
      }
90821
    }
90822
  }
90823
90824
  // Decode the frame (the pixels).
90825
  //
90826
  // From here on, always returns the pixel_buffer. If we get this far, we can
90827
  // still display a partial image, even if we encounter an error.
90828
  std::string message("");
90829
  if ((pixel_blend == WUFFS_BASE__PIXEL_BLEND__SRC_OVER) &&
90830
      frame_config.overwrite_instead_of_blend()) {
90831
    pixel_blend = WUFFS_BASE__PIXEL_BLEND__SRC;
90832
  }
90833
  while (true) {
90834
    wuffs_base__status id_df_status =
90835
        image_decoder->decode_frame(&pixel_buffer, &io_buf, pixel_blend,
90836
                                    alloc_workbuf_result.workbuf, nullptr);
90837
    if (id_df_status.repr == nullptr) {
90838
      break;
90839
    } else if (id_df_status.repr != wuffs_base__suspension__short_read) {
90840
      message = id_df_status.message();
90841
      break;
90842
    } else if (io_buf.meta.closed) {
90843
      message = DecodeImage_UnexpectedEndOfFile;
90844
      break;
90845
    } else {
90846
      std::string error_message = input.CopyIn(&io_buf);
90847
      if (!error_message.empty()) {
90848
        message = std::move(error_message);
90849
        break;
90850
      }
90851
    }
90852
  }
90853
90854
  // Decode any metadata after the frame.
90855
  if (interested_in_metadata_after_the_frame) {
90856
    while (true) {
90857
      wuffs_base__status id_dfc_status =
90858
          image_decoder->decode_frame_config(NULL, &io_buf);
90859
      if (id_dfc_status.repr == wuffs_base__note__end_of_data) {
90860
        break;
90861
      } else if (id_dfc_status.repr == nullptr) {
90862
        continue;
90863
      } else if (id_dfc_status.repr == wuffs_base__note__metadata_reported) {
90864
        std::string error_message = DecodeImageHandleMetadata(
90865
            image_decoder, callbacks, input, io_buf, raw_metadata_buf);
90866
        if (!error_message.empty()) {
90867
          return DecodeImageResult(std::move(error_message));
90868
        }
90869
      } else if (id_dfc_status.repr != wuffs_base__suspension__short_read) {
90870
        return DecodeImageResult(id_dfc_status.message());
90871
      } else if (io_buf.meta.closed) {
90872
        return DecodeImageResult(DecodeImage_UnexpectedEndOfFile);
90873
      } else {
90874
        std::string error_message = input.CopyIn(&io_buf);
90875
        if (!error_message.empty()) {
90876
          return DecodeImageResult(std::move(error_message));
90877
        }
90878
      }
90879
    }
90880
  }
90881
90882
  return DecodeImageResult(std::move(alloc_pixbuf_result.mem_owner),
90883
                           pixel_buffer, std::move(message));
90884
}
90885
90886
}  // namespace
90887
90888
DecodeImageResult  //
90889
DecodeImage(DecodeImageCallbacks& callbacks,
90890
            sync_io::Input& input,
90891
            DecodeImageArgQuirks quirks,
90892
            DecodeImageArgFlags flags,
90893
            DecodeImageArgPixelBlend pixel_blend,
90894
            DecodeImageArgBackgroundColor background_color,
90895
            DecodeImageArgMaxInclDimension max_incl_dimension,
90896
            DecodeImageArgMaxInclMetadataLength max_incl_metadata_length) {
90897
  wuffs_base__io_buffer* io_buf = input.BringsItsOwnIOBuffer();
90898
  wuffs_base__io_buffer fallback_io_buf = wuffs_base__empty_io_buffer();
90899
  std::unique_ptr<uint8_t[]> fallback_io_array(nullptr);
90900
  if (!io_buf) {
90901
    fallback_io_array = std::unique_ptr<uint8_t[]>(new uint8_t[32768]);
90902
    fallback_io_buf =
90903
        wuffs_base__ptr_u8__writer(fallback_io_array.get(), 32768);
90904
    io_buf = &fallback_io_buf;
90905
  }
90906
90907
  wuffs_base__image_decoder::unique_ptr image_decoder(nullptr);
90908
  DecodeImageResult result = DecodeImage0(
90909
      image_decoder, callbacks, input, *io_buf, quirks.ptr, quirks.len,
90910
      flags.repr, pixel_blend.repr, background_color.repr,
90911
      max_incl_dimension.repr, max_incl_metadata_length.repr);
90912
  callbacks.Done(result, input, *io_buf, std::move(image_decoder));
90913
  return result;
90914
}
90915
90916
}  // namespace wuffs_aux
90917
90918
#endif  // !defined(WUFFS_CONFIG__MODULES) ||
90919
        // defined(WUFFS_CONFIG__MODULE__AUX__IMAGE)
90920
90921
// ---------------- Auxiliary - JSON
90922
90923
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__AUX__JSON)
90924
90925
#include <utility>
90926
90927
namespace wuffs_aux {
90928
90929
DecodeJsonResult::DecodeJsonResult(std::string&& error_message0,
90930
                                   uint64_t cursor_position0)
90931
    : error_message(std::move(error_message0)),
90932
      cursor_position(cursor_position0) {}
90933
90934
DecodeJsonCallbacks::~DecodeJsonCallbacks() {}
90935
90936
void  //
90937
DecodeJsonCallbacks::Done(DecodeJsonResult& result,
90938
                          sync_io::Input& input,
90939
                          IOBuffer& buffer) {}
90940
90941
const char DecodeJson_BadJsonPointer[] =  //
90942
    "wuffs_aux::DecodeJson: bad JSON Pointer";
90943
const char DecodeJson_NoMatch[] =  //
90944
    "wuffs_aux::DecodeJson: no match";
90945
90946
DecodeJsonArgQuirks::DecodeJsonArgQuirks(const QuirkKeyValuePair* ptr0,
90947
                                         const size_t len0)
90948
    : ptr(ptr0), len(len0) {}
90949
90950
DecodeJsonArgQuirks  //
90951
DecodeJsonArgQuirks::DefaultValue() {
90952
  return DecodeJsonArgQuirks(nullptr, 0);
90953
}
90954
90955
DecodeJsonArgJsonPointer::DecodeJsonArgJsonPointer(std::string repr0)
90956
    : repr(repr0) {}
90957
90958
DecodeJsonArgJsonPointer  //
90959
DecodeJsonArgJsonPointer::DefaultValue() {
90960
  return DecodeJsonArgJsonPointer(std::string());
90961
}
90962
90963
// --------
90964
90965
#define WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN                          \
90966
  while (tok_buf.meta.ri >= tok_buf.meta.wi) {                              \
90967
    if (tok_status.repr == nullptr) {                                       \
90968
      goto done;                                                            \
90969
    } else if (tok_status.repr == wuffs_base__suspension__short_write) {    \
90970
      tok_buf.compact();                                                    \
90971
    } else if (tok_status.repr == wuffs_base__suspension__short_read) {     \
90972
      if (!io_error_message.empty()) {                                      \
90973
        ret_error_message = std::move(io_error_message);                    \
90974
        goto done;                                                          \
90975
      } else if (cursor_index != io_buf->meta.ri) {                         \
90976
        ret_error_message =                                                 \
90977
            "wuffs_aux::DecodeJson: internal error: bad cursor_index";      \
90978
        goto done;                                                          \
90979
      } else if (io_buf->meta.closed) {                                     \
90980
        ret_error_message =                                                 \
90981
            "wuffs_aux::DecodeJson: internal error: io_buf is closed";      \
90982
        goto done;                                                          \
90983
      }                                                                     \
90984
      io_buf->compact();                                                    \
90985
      if (io_buf->meta.wi >= io_buf->data.len) {                            \
90986
        ret_error_message =                                                 \
90987
            "wuffs_aux::DecodeJson: internal error: io_buf is full";        \
90988
        goto done;                                                          \
90989
      }                                                                     \
90990
      cursor_index = io_buf->meta.ri;                                       \
90991
      io_error_message = input.CopyIn(io_buf);                              \
90992
    } else {                                                                \
90993
      ret_error_message = tok_status.message();                             \
90994
      goto done;                                                            \
90995
    }                                                                       \
90996
    tok_status =                                                            \
90997
        dec->decode_tokens(&tok_buf, io_buf, wuffs_base__empty_slice_u8()); \
90998
    if ((tok_buf.meta.ri > tok_buf.meta.wi) ||                              \
90999
        (tok_buf.meta.wi > tok_buf.data.len) ||                             \
91000
        (io_buf->meta.ri > io_buf->meta.wi) ||                              \
91001
        (io_buf->meta.wi > io_buf->data.len)) {                             \
91002
      ret_error_message =                                                   \
91003
          "wuffs_aux::DecodeJson: internal error: bad buffer indexes";      \
91004
      goto done;                                                            \
91005
    }                                                                       \
91006
  }                                                                         \
91007
  wuffs_base__token token = tok_buf.data.ptr[tok_buf.meta.ri++];            \
91008
  uint64_t token_len = token.length();                                      \
91009
  if ((io_buf->meta.ri < cursor_index) ||                                   \
91010
      ((io_buf->meta.ri - cursor_index) < token_len)) {                     \
91011
    ret_error_message =                                                     \
91012
        "wuffs_aux::DecodeJson: internal error: bad token indexes";         \
91013
    goto done;                                                              \
91014
  }                                                                         \
91015
  uint8_t* token_ptr = io_buf->data.ptr + cursor_index;                     \
91016
  (void)(token_ptr);                                                        \
91017
  cursor_index += static_cast<size_t>(token_len)
91018
91019
// --------
91020
91021
namespace {
91022
91023
// DecodeJson_SplitJsonPointer returns ("bar", 8) for ("/foo/bar/b~1z/qux", 5,
91024
// etc). It returns a 0 size_t when s has invalid JSON Pointer syntax or i is
91025
// out of bounds.
91026
//
91027
// The string returned is unescaped. If calling it again, this time with i=8,
91028
// the "b~1z" substring would be returned as "b/z".
91029
std::pair<std::string, size_t>  //
91030
DecodeJson_SplitJsonPointer(std::string& s,
91031
                            size_t i,
91032
                            bool allow_tilde_n_tilde_r_tilde_t) {
91033
  std::string fragment;
91034
  if (i > s.size()) {
91035
    return std::make_pair(std::string(), 0);
91036
  }
91037
  while (i < s.size()) {
91038
    char c = s[i];
91039
    if (c == '/') {
91040
      break;
91041
    } else if (c != '~') {
91042
      fragment.push_back(c);
91043
      i++;
91044
      continue;
91045
    }
91046
    i++;
91047
    if (i >= s.size()) {
91048
      return std::make_pair(std::string(), 0);
91049
    }
91050
    c = s[i];
91051
    if (c == '0') {
91052
      fragment.push_back('~');
91053
      i++;
91054
      continue;
91055
    } else if (c == '1') {
91056
      fragment.push_back('/');
91057
      i++;
91058
      continue;
91059
    } else if (allow_tilde_n_tilde_r_tilde_t) {
91060
      if (c == 'n') {
91061
        fragment.push_back('\n');
91062
        i++;
91063
        continue;
91064
      } else if (c == 'r') {
91065
        fragment.push_back('\r');
91066
        i++;
91067
        continue;
91068
      } else if (c == 't') {
91069
        fragment.push_back('\t');
91070
        i++;
91071
        continue;
91072
      }
91073
    }
91074
    return std::make_pair(std::string(), 0);
91075
  }
91076
  return std::make_pair(std::move(fragment), i);
91077
}
91078
91079
// --------
91080
91081
std::string  //
91082
DecodeJson_WalkJsonPointerFragment(wuffs_base__token_buffer& tok_buf,
91083
                                   wuffs_base__status& tok_status,
91084
                                   wuffs_json__decoder::unique_ptr& dec,
91085
                                   wuffs_base__io_buffer* io_buf,
91086
                                   std::string& io_error_message,
91087
                                   size_t& cursor_index,
91088
                                   sync_io::Input& input,
91089
                                   std::string& json_pointer_fragment) {
91090
  std::string ret_error_message;
91091
  while (true) {
91092
    WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN;
91093
91094
    int64_t vbc = token.value_base_category();
91095
    uint64_t vbd = token.value_base_detail();
91096
    if (vbc == WUFFS_BASE__TOKEN__VBC__FILLER) {
91097
      continue;
91098
    } else if ((vbc != WUFFS_BASE__TOKEN__VBC__STRUCTURE) ||
91099
               !(vbd & WUFFS_BASE__TOKEN__VBD__STRUCTURE__PUSH)) {
91100
      return DecodeJson_NoMatch;
91101
    } else if (vbd & WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_LIST) {
91102
      goto do_list;
91103
    }
91104
    goto do_dict;
91105
  }
91106
91107
do_dict:
91108
  // Alternate between these two things:
91109
  //  1. Decode the next dict key (a string). If it matches the fragment, we're
91110
  //    done (success). If we've reached the dict's end (VBD__STRUCTURE__POP)
91111
  //    so that there was no next dict key, we're done (failure).
91112
  //  2. Otherwise, skip the next dict value.
91113
  while (true) {
91114
    for (std::string str; true;) {
91115
      WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN;
91116
91117
      int64_t vbc = token.value_base_category();
91118
      uint64_t vbd = token.value_base_detail();
91119
      switch (vbc) {
91120
        case WUFFS_BASE__TOKEN__VBC__FILLER:
91121
          continue;
91122
91123
        case WUFFS_BASE__TOKEN__VBC__STRUCTURE:
91124
          if (vbd & WUFFS_BASE__TOKEN__VBD__STRUCTURE__PUSH) {
91125
            goto fail;
91126
          }
91127
          return DecodeJson_NoMatch;
91128
91129
        case WUFFS_BASE__TOKEN__VBC__STRING: {
91130
          if (vbd & WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_0_DST_1_SRC_DROP) {
91131
            // No-op.
91132
          } else if (vbd &
91133
                     WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_1_DST_1_SRC_COPY) {
91134
            const char* ptr =  // Convert from (uint8_t*).
91135
                static_cast<const char*>(static_cast<void*>(token_ptr));
91136
            str.append(ptr, static_cast<size_t>(token_len));
91137
          } else {
91138
            goto fail;
91139
          }
91140
          break;
91141
        }
91142
91143
        case WUFFS_BASE__TOKEN__VBC__UNICODE_CODE_POINT: {
91144
          uint8_t u[WUFFS_BASE__UTF_8__BYTE_LENGTH__MAX_INCL];
91145
          size_t n = wuffs_base__utf_8__encode(
91146
              wuffs_base__make_slice_u8(
91147
                  &u[0], WUFFS_BASE__UTF_8__BYTE_LENGTH__MAX_INCL),
91148
              static_cast<uint32_t>(vbd));
91149
          const char* ptr =  // Convert from (uint8_t*).
91150
              static_cast<const char*>(static_cast<void*>(&u[0]));
91151
          str.append(ptr, n);
91152
          break;
91153
        }
91154
91155
        default:
91156
          goto fail;
91157
      }
91158
91159
      if (token.continued()) {
91160
        continue;
91161
      }
91162
      if (str == json_pointer_fragment) {
91163
        return "";
91164
      }
91165
      goto skip_the_next_dict_value;
91166
    }
91167
91168
  skip_the_next_dict_value:
91169
    for (uint32_t skip_depth = 0; true;) {
91170
      WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN;
91171
91172
      int64_t vbc = token.value_base_category();
91173
      uint64_t vbd = token.value_base_detail();
91174
      if (token.continued() || (vbc == WUFFS_BASE__TOKEN__VBC__FILLER)) {
91175
        continue;
91176
      } else if (vbc == WUFFS_BASE__TOKEN__VBC__STRUCTURE) {
91177
        if (vbd & WUFFS_BASE__TOKEN__VBD__STRUCTURE__PUSH) {
91178
          skip_depth++;
91179
          continue;
91180
        }
91181
        skip_depth--;
91182
      }
91183
91184
      if (skip_depth == 0) {
91185
        break;
91186
      }
91187
    }  // skip_the_next_dict_value
91188
  }    // do_dict
91189
91190
do_list:
91191
  do {
91192
    wuffs_base__result_u64 result_u64 = wuffs_base__parse_number_u64(
91193
        wuffs_base__make_slice_u8(
91194
            static_cast<uint8_t*>(static_cast<void*>(
91195
                const_cast<char*>(json_pointer_fragment.data()))),
91196
            json_pointer_fragment.size()),
91197
        WUFFS_BASE__PARSE_NUMBER_XXX__DEFAULT_OPTIONS);
91198
    if (!result_u64.status.is_ok()) {
91199
      return DecodeJson_NoMatch;
91200
    }
91201
    uint64_t remaining = result_u64.value;
91202
    if (remaining == 0) {
91203
      goto check_that_a_value_follows;
91204
    }
91205
    for (uint32_t skip_depth = 0; true;) {
91206
      WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN;
91207
91208
      int64_t vbc = token.value_base_category();
91209
      uint64_t vbd = token.value_base_detail();
91210
      if (token.continued() || (vbc == WUFFS_BASE__TOKEN__VBC__FILLER)) {
91211
        continue;
91212
      } else if (vbc == WUFFS_BASE__TOKEN__VBC__STRUCTURE) {
91213
        if (vbd & WUFFS_BASE__TOKEN__VBD__STRUCTURE__PUSH) {
91214
          skip_depth++;
91215
          continue;
91216
        }
91217
        if (skip_depth == 0) {
91218
          return DecodeJson_NoMatch;
91219
        }
91220
        skip_depth--;
91221
      }
91222
91223
      if (skip_depth > 0) {
91224
        continue;
91225
      }
91226
      remaining--;
91227
      if (remaining == 0) {
91228
        goto check_that_a_value_follows;
91229
      }
91230
    }
91231
  } while (false);  // do_list
91232
91233
check_that_a_value_follows:
91234
  while (true) {
91235
    WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN;
91236
91237
    int64_t vbc = token.value_base_category();
91238
    uint64_t vbd = token.value_base_detail();
91239
    if (vbc == WUFFS_BASE__TOKEN__VBC__FILLER) {
91240
      continue;
91241
    }
91242
91243
    // Undo the last part of WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN, so
91244
    // that we're only peeking at the next token.
91245
    tok_buf.meta.ri--;
91246
    cursor_index -= static_cast<size_t>(token_len);
91247
91248
    if ((vbc == WUFFS_BASE__TOKEN__VBC__STRUCTURE) &&
91249
        (vbd & WUFFS_BASE__TOKEN__VBD__STRUCTURE__POP)) {
91250
      return DecodeJson_NoMatch;
91251
    }
91252
    return "";
91253
  }  // check_that_a_value_follows
91254
91255
fail:
91256
  return "wuffs_aux::DecodeJson: internal error: unexpected token";
91257
done:
91258
  return ret_error_message;
91259
}
91260
91261
}  // namespace
91262
91263
// --------
91264
91265
DecodeJsonResult  //
91266
DecodeJson(DecodeJsonCallbacks& callbacks,
91267
           sync_io::Input& input,
91268
           DecodeJsonArgQuirks quirks,
91269
           DecodeJsonArgJsonPointer json_pointer) {
91270
  // Prepare the wuffs_base__io_buffer and the resultant error_message.
91271
  wuffs_base__io_buffer* io_buf = input.BringsItsOwnIOBuffer();
91272
  wuffs_base__io_buffer fallback_io_buf = wuffs_base__empty_io_buffer();
91273
  std::unique_ptr<uint8_t[]> fallback_io_array(nullptr);
91274
  if (!io_buf) {
91275
    fallback_io_array = std::unique_ptr<uint8_t[]>(new uint8_t[4096]);
91276
    fallback_io_buf = wuffs_base__ptr_u8__writer(fallback_io_array.get(), 4096);
91277
    io_buf = &fallback_io_buf;
91278
  }
91279
  // cursor_index is discussed at
91280
  // https://nigeltao.github.io/blog/2020/jsonptr.html#the-cursor-index
91281
  size_t cursor_index = 0;
91282
  std::string ret_error_message;
91283
  std::string io_error_message;
91284
91285
  do {
91286
    // Prepare the low-level JSON decoder.
91287
    wuffs_json__decoder::unique_ptr dec = wuffs_json__decoder::alloc();
91288
    if (!dec) {
91289
      ret_error_message = "wuffs_aux::DecodeJson: out of memory";
91290
      goto done;
91291
    } else if (WUFFS_JSON__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE != 0) {
91292
      ret_error_message =
91293
          "wuffs_aux::DecodeJson: internal error: bad WORKBUF_LEN";
91294
      goto done;
91295
    }
91296
    bool allow_tilde_n_tilde_r_tilde_t = false;
91297
    for (size_t i = 0; i < quirks.len; i++) {
91298
      dec->set_quirk(quirks.ptr[i].first, quirks.ptr[i].second);
91299
      if (quirks.ptr[i].first ==
91300
          WUFFS_JSON__QUIRK_JSON_POINTER_ALLOW_TILDE_N_TILDE_R_TILDE_T) {
91301
        allow_tilde_n_tilde_r_tilde_t = (quirks.ptr[i].second != 0);
91302
      }
91303
    }
91304
91305
    // Prepare the wuffs_base__tok_buffer. 256 tokens is 2KiB.
91306
    wuffs_base__token tok_array[256];
91307
    wuffs_base__token_buffer tok_buf =
91308
        wuffs_base__slice_token__writer(wuffs_base__make_slice_token(
91309
            &tok_array[0], (sizeof(tok_array) / sizeof(tok_array[0]))));
91310
    wuffs_base__status tok_status =
91311
        dec->decode_tokens(&tok_buf, io_buf, wuffs_base__empty_slice_u8());
91312
91313
    // Prepare other state.
91314
    int32_t depth = 0;
91315
    std::string str;
91316
91317
    // Walk the (optional) JSON Pointer.
91318
    for (size_t i = 0; i < json_pointer.repr.size();) {
91319
      if (json_pointer.repr[i] != '/') {
91320
        ret_error_message = DecodeJson_BadJsonPointer;
91321
        goto done;
91322
      }
91323
      std::pair<std::string, size_t> split = DecodeJson_SplitJsonPointer(
91324
          json_pointer.repr, i + 1, allow_tilde_n_tilde_r_tilde_t);
91325
      i = split.second;
91326
      if (i == 0) {
91327
        ret_error_message = DecodeJson_BadJsonPointer;
91328
        goto done;
91329
      }
91330
      ret_error_message = DecodeJson_WalkJsonPointerFragment(
91331
          tok_buf, tok_status, dec, io_buf, io_error_message, cursor_index,
91332
          input, split.first);
91333
      if (!ret_error_message.empty()) {
91334
        goto done;
91335
      }
91336
    }
91337
91338
    // Loop, doing these two things:
91339
    //  1. Get the next token.
91340
    //  2. Process that token.
91341
    while (true) {
91342
      WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN;
91343
91344
      int64_t vbc = token.value_base_category();
91345
      uint64_t vbd = token.value_base_detail();
91346
      switch (vbc) {
91347
        case WUFFS_BASE__TOKEN__VBC__FILLER:
91348
          continue;
91349
91350
        case WUFFS_BASE__TOKEN__VBC__STRUCTURE: {
91351
          if (vbd & WUFFS_BASE__TOKEN__VBD__STRUCTURE__PUSH) {
91352
            ret_error_message = callbacks.Push(static_cast<uint32_t>(vbd));
91353
            if (!ret_error_message.empty()) {
91354
              goto done;
91355
            }
91356
            depth++;
91357
            if (depth > (int32_t)WUFFS_JSON__DECODER_DEPTH_MAX_INCL) {
91358
              ret_error_message =
91359
                  "wuffs_aux::DecodeJson: internal error: bad depth";
91360
              goto done;
91361
            }
91362
            continue;
91363
          }
91364
          ret_error_message = callbacks.Pop(static_cast<uint32_t>(vbd));
91365
          depth--;
91366
          if (depth < 0) {
91367
            ret_error_message =
91368
                "wuffs_aux::DecodeJson: internal error: bad depth";
91369
            goto done;
91370
          }
91371
          goto parsed_a_value;
91372
        }
91373
91374
        case WUFFS_BASE__TOKEN__VBC__STRING: {
91375
          if (vbd & WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_0_DST_1_SRC_DROP) {
91376
            // No-op.
91377
          } else if (vbd &
91378
                     WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_1_DST_1_SRC_COPY) {
91379
            const char* ptr =  // Convert from (uint8_t*).
91380
                static_cast<const char*>(static_cast<void*>(token_ptr));
91381
            str.append(ptr, static_cast<size_t>(token_len));
91382
          } else {
91383
            goto fail;
91384
          }
91385
          if (token.continued()) {
91386
            continue;
91387
          }
91388
          ret_error_message = callbacks.AppendTextString(std::move(str));
91389
          str.clear();
91390
          goto parsed_a_value;
91391
        }
91392
91393
        case WUFFS_BASE__TOKEN__VBC__UNICODE_CODE_POINT: {
91394
          uint8_t u[WUFFS_BASE__UTF_8__BYTE_LENGTH__MAX_INCL];
91395
          size_t n = wuffs_base__utf_8__encode(
91396
              wuffs_base__make_slice_u8(
91397
                  &u[0], WUFFS_BASE__UTF_8__BYTE_LENGTH__MAX_INCL),
91398
              static_cast<uint32_t>(vbd));
91399
          const char* ptr =  // Convert from (uint8_t*).
91400
              static_cast<const char*>(static_cast<void*>(&u[0]));
91401
          str.append(ptr, n);
91402
          if (token.continued()) {
91403
            continue;
91404
          }
91405
          goto fail;
91406
        }
91407
91408
        case WUFFS_BASE__TOKEN__VBC__LITERAL: {
91409
          ret_error_message =
91410
              (vbd & WUFFS_BASE__TOKEN__VBD__LITERAL__NULL)
91411
                  ? callbacks.AppendNull()
91412
                  : callbacks.AppendBool(vbd &
91413
                                         WUFFS_BASE__TOKEN__VBD__LITERAL__TRUE);
91414
          goto parsed_a_value;
91415
        }
91416
91417
        case WUFFS_BASE__TOKEN__VBC__NUMBER: {
91418
          if (vbd & WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_TEXT) {
91419
            if (vbd & WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_INTEGER_SIGNED) {
91420
              wuffs_base__result_i64 r = wuffs_base__parse_number_i64(
91421
                  wuffs_base__make_slice_u8(token_ptr,
91422
                                            static_cast<size_t>(token_len)),
91423
                  WUFFS_BASE__PARSE_NUMBER_XXX__DEFAULT_OPTIONS);
91424
              if (r.status.is_ok()) {
91425
                ret_error_message = callbacks.AppendI64(r.value);
91426
                goto parsed_a_value;
91427
              }
91428
            }
91429
            if (vbd & WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_FLOATING_POINT) {
91430
              wuffs_base__result_f64 r = wuffs_base__parse_number_f64(
91431
                  wuffs_base__make_slice_u8(token_ptr,
91432
                                            static_cast<size_t>(token_len)),
91433
                  WUFFS_BASE__PARSE_NUMBER_XXX__DEFAULT_OPTIONS);
91434
              if (r.status.is_ok()) {
91435
                ret_error_message = callbacks.AppendF64(r.value);
91436
                goto parsed_a_value;
91437
              }
91438
            }
91439
          } else if (vbd & WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_NEG_INF) {
91440
            ret_error_message = callbacks.AppendF64(
91441
                wuffs_base__ieee_754_bit_representation__from_u64_to_f64(
91442
                    0xFFF0000000000000ul));
91443
            goto parsed_a_value;
91444
          } else if (vbd & WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_POS_INF) {
91445
            ret_error_message = callbacks.AppendF64(
91446
                wuffs_base__ieee_754_bit_representation__from_u64_to_f64(
91447
                    0x7FF0000000000000ul));
91448
            goto parsed_a_value;
91449
          } else if (vbd & WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_NEG_NAN) {
91450
            ret_error_message = callbacks.AppendF64(
91451
                wuffs_base__ieee_754_bit_representation__from_u64_to_f64(
91452
                    0xFFFFFFFFFFFFFFFFul));
91453
            goto parsed_a_value;
91454
          } else if (vbd & WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_POS_NAN) {
91455
            ret_error_message = callbacks.AppendF64(
91456
                wuffs_base__ieee_754_bit_representation__from_u64_to_f64(
91457
                    0x7FFFFFFFFFFFFFFFul));
91458
            goto parsed_a_value;
91459
          }
91460
          goto fail;
91461
        }
91462
      }
91463
91464
    fail:
91465
      ret_error_message =
91466
          "wuffs_aux::DecodeJson: internal error: unexpected token";
91467
      goto done;
91468
91469
    parsed_a_value:
91470
      // If an error was encountered, we are done. Otherwise, (depth == 0)
91471
      // after parsing a value is equivalent to having decoded the entire JSON
91472
      // value (for an empty json_pointer query) or having decoded the
91473
      // pointed-to JSON value (for a non-empty json_pointer query). In the
91474
      // latter case, we are also done.
91475
      //
91476
      // However, if quirks like WUFFS_JSON__QUIRK_ALLOW_TRAILING_FILLER or
91477
      // WUFFS_JSON__QUIRK_EXPECT_TRAILING_NEW_LINE_OR_EOF are passed, decoding
91478
      // the entire JSON value should also consume any trailing filler, in case
91479
      // the DecodeJson caller wants to subsequently check that the input is
91480
      // completely exhausted (and otherwise raise "valid JSON followed by
91481
      // further (unexpected) data"). We aren't done yet. Instead, keep the
91482
      // loop running until WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN's
91483
      // decode_tokens returns an ok status.
91484
      if (!ret_error_message.empty() ||
91485
          ((depth == 0) && !json_pointer.repr.empty())) {
91486
        goto done;
91487
      }
91488
    }
91489
  } while (false);
91490
91491
done:
91492
  DecodeJsonResult result(
91493
      std::move(ret_error_message),
91494
      wuffs_base__u64__sat_add(io_buf->meta.pos, cursor_index));
91495
  callbacks.Done(result, input, *io_buf);
91496
  return result;
91497
}
91498
91499
#undef WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN
91500
91501
}  // namespace wuffs_aux
91502
91503
#endif  // !defined(WUFFS_CONFIG__MODULES) ||
91504
        // defined(WUFFS_CONFIG__MODULE__AUX__JSON)
91505
91506
#endif  // defined(__cplusplus) && defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
91507
91508
91509
// ---------------- Wuffs' reimplementation of the STB API.
91510
//
91511
// This is a drop-in replacement of that third-party library.
91512
//
91513
// Disabled by default, unless you #define the
91514
// WUFFS_CONFIG__ENABLE_DROP_IN_REPLACEMENT__STB macro beforehand.
91515
//
91516
// For API docs, see https://github.com/nothings/stb
91517
91518
#if defined(WUFFS_CONFIG__ENABLE_DROP_IN_REPLACEMENT__STB)
91519
91520
#include <limits.h>
91521
#include <stdlib.h>
91522
91523
#ifdef __cplusplus
91524
extern "C" {
91525
#endif
91526
91527
// --------
91528
91529
#if defined(__GNUC__)
91530
__thread const char*  //
91531
    wuffs_drop_in__stb__g_failure_reason = NULL;
91532
#elif defined(_MSC_VER)
91533
__declspec(thread) const char*  //
91534
    wuffs_drop_in__stb__g_failure_reason = NULL;
91535
#else
91536
const char*  //
91537
    wuffs_drop_in__stb__g_failure_reason = NULL;
91538
#endif
91539
91540
// --------
91541
91542
static void                         //
91543
wuffs_drop_in__stb__read(           //
91544
    wuffs_base__io_buffer* srcbuf,  //
91545
    stbi_io_callbacks const* clbk,  //
91546
    void* user) {
91547
  uint8_t* ptr = wuffs_base__io_buffer__writer_pointer(srcbuf);
91548
  size_t len = wuffs_base__io_buffer__writer_length(srcbuf);
91549
  if (len > INT_MAX) {
91550
    len = INT_MAX;
91551
  }
91552
  int n = clbk->read(user, (char*)ptr, (int)len);
91553
  if (n > 0) {
91554
    srcbuf->meta.wi += (size_t)n;
91555
  } else {
91556
    srcbuf->meta.closed = clbk->eof(user);
91557
  }
91558
}
91559
91560
static wuffs_base__image_decoder*   //
91561
wuffs_drop_in__stb__make_decoder(   //
91562
    wuffs_base__io_buffer* srcbuf,  //
91563
    stbi_io_callbacks const* clbk,  //
91564
    void* user) {
91565
  while (1) {
91566
    int32_t fourcc = wuffs_base__magic_number_guess_fourcc(
91567
        wuffs_base__io_buffer__reader_slice(srcbuf), srcbuf->meta.closed);
91568
    if (fourcc < 0) {
91569
      if (srcbuf->meta.closed || !clbk) {
91570
        break;
91571
      }
91572
      wuffs_drop_in__stb__read(srcbuf, clbk, user);
91573
      continue;
91574
    }
91575
91576
    switch (fourcc) {
91577
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BMP)
91578
      case WUFFS_BASE__FOURCC__BMP:
91579
        return wuffs_bmp__decoder__alloc_as__wuffs_base__image_decoder();
91580
#endif
91581
91582
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ETC2)
91583
      case WUFFS_BASE__FOURCC__ETC2:
91584
        return wuffs_etc2__decoder__alloc_as__wuffs_base__image_decoder();
91585
#endif
91586
91587
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GIF)
91588
      case WUFFS_BASE__FOURCC__GIF:
91589
        return wuffs_gif__decoder__alloc_as__wuffs_base__image_decoder();
91590
#endif
91591
91592
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__HANDSUM)
91593
      case WUFFS_BASE__FOURCC__HNSM:
91594
        return wuffs_handsum__decoder__alloc_as__wuffs_base__image_decoder();
91595
#endif
91596
91597
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JPEG)
91598
      case WUFFS_BASE__FOURCC__JPEG:
91599
        return wuffs_jpeg__decoder__alloc_as__wuffs_base__image_decoder();
91600
#endif
91601
91602
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NIE)
91603
      case WUFFS_BASE__FOURCC__NIE:
91604
        return wuffs_nie__decoder__alloc_as__wuffs_base__image_decoder();
91605
#endif
91606
91607
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NETPBM)
91608
      case WUFFS_BASE__FOURCC__NPBM:
91609
        return wuffs_netpbm__decoder__alloc_as__wuffs_base__image_decoder();
91610
#endif
91611
91612
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__PNG)
91613
      case WUFFS_BASE__FOURCC__PNG:
91614
        return wuffs_png__decoder__alloc_as__wuffs_base__image_decoder();
91615
#endif
91616
91617
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__QOI)
91618
      case WUFFS_BASE__FOURCC__QOI:
91619
        return wuffs_qoi__decoder__alloc_as__wuffs_base__image_decoder();
91620
#endif
91621
91622
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__TARGA)
91623
      case WUFFS_BASE__FOURCC__TGA:
91624
        return wuffs_targa__decoder__alloc_as__wuffs_base__image_decoder();
91625
#endif
91626
91627
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__THUMBHASH)
91628
      case WUFFS_BASE__FOURCC__TH:
91629
        return wuffs_thumbhash__decoder__alloc_as__wuffs_base__image_decoder();
91630
#endif
91631
91632
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WBMP)
91633
      case WUFFS_BASE__FOURCC__WBMP:
91634
        return wuffs_wbmp__decoder__alloc_as__wuffs_base__image_decoder();
91635
#endif
91636
91637
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WEBP)
91638
      case WUFFS_BASE__FOURCC__WEBP:
91639
        return wuffs_webp__decoder__alloc_as__wuffs_base__image_decoder();
91640
#endif
91641
    }
91642
91643
    wuffs_drop_in__stb__g_failure_reason = "unknown image type";
91644
    break;
91645
  }
91646
  return NULL;
91647
}
91648
91649
// --------
91650
91651
static void*                         //
91652
wuffs_drop_in__stb__load1(           //
91653
    wuffs_base__io_buffer* srcbuf,   //
91654
    stbi_io_callbacks const* clbk,   //
91655
    void* user,                      //
91656
    wuffs_base__image_decoder* dec,  //
91657
    wuffs_base__image_config* ic,    //
91658
    uint32_t dst_pixfmt,             //
91659
    int desired_channels,            //
91660
    int info_only) {
91661
  // Favor faster decodes over rejecting invalid checksums.
91662
  wuffs_base__image_decoder__set_quirk(dec, WUFFS_BASE__QUIRK_IGNORE_CHECKSUM,
91663
                                       1);
91664
91665
  while (1) {
91666
    wuffs_base__status status =
91667
        wuffs_base__image_decoder__decode_image_config(dec, ic, srcbuf);
91668
    if (status.repr == NULL) {
91669
      break;
91670
    } else if ((status.repr != wuffs_base__suspension__short_read) || !clbk) {
91671
      wuffs_drop_in__stb__g_failure_reason = status.repr;
91672
      return NULL;
91673
    }
91674
91675
    if (wuffs_base__io_buffer__compact(srcbuf) <= 0) {
91676
      wuffs_drop_in__stb__g_failure_reason = "I/O buffer is too small";
91677
      return NULL;
91678
    }
91679
    wuffs_drop_in__stb__read(srcbuf, clbk, user);
91680
  }
91681
91682
  uint32_t w = wuffs_base__pixel_config__width(&ic->pixcfg);
91683
  uint32_t h = wuffs_base__pixel_config__height(&ic->pixcfg);
91684
  if ((w > 0xFFFFFF) || (h > 0xFFFFFF)) {
91685
    wuffs_drop_in__stb__g_failure_reason = "image is too large";
91686
    return NULL;
91687
  } else if (info_only) {
91688
    return NULL;
91689
  }
91690
91691
  uint64_t pixbuf_len = (uint64_t)w * (uint64_t)h * (uint64_t)desired_channels;
91692
  uint64_t workbuf_len = wuffs_base__image_decoder__workbuf_len(dec).max_incl;
91693
#if SIZE_MAX < 0xFFFFFFFFFFFFFFFFull
91694
  if ((pixbuf_len > ((uint64_t)SIZE_MAX)) ||
91695
      (workbuf_len > ((uint64_t)SIZE_MAX))) {
91696
    wuffs_drop_in__stb__g_failure_reason = "image is too large";
91697
    return NULL;
91698
  }
91699
#endif
91700
  void* pixbuf_ptr = malloc((size_t)pixbuf_len);
91701
  if (!pixbuf_ptr) {
91702
    wuffs_drop_in__stb__g_failure_reason = "out of memory";
91703
    return NULL;
91704
  }
91705
  void* workbuf_ptr = malloc((size_t)workbuf_len);
91706
  if (!workbuf_ptr) {
91707
    free(pixbuf_ptr);
91708
    wuffs_drop_in__stb__g_failure_reason = "out of memory";
91709
    return NULL;
91710
  }
91711
  wuffs_base__slice_u8 workbuf =
91712
      wuffs_base__make_slice_u8(workbuf_ptr, (size_t)workbuf_len);
91713
91714
  wuffs_base__pixel_config pc = ((wuffs_base__pixel_config){});
91715
  wuffs_base__pixel_config__set(&pc, dst_pixfmt,
91716
                                WUFFS_BASE__PIXEL_SUBSAMPLING__NONE, w, h);
91717
91718
  wuffs_base__pixel_buffer pb = ((wuffs_base__pixel_buffer){});
91719
  {
91720
    wuffs_base__status status = wuffs_base__pixel_buffer__set_from_slice(
91721
        &pb, &pc, wuffs_base__make_slice_u8(pixbuf_ptr, (size_t)pixbuf_len));
91722
    if (status.repr) {
91723
      free(workbuf_ptr);
91724
      free(pixbuf_ptr);
91725
      wuffs_drop_in__stb__g_failure_reason = status.repr;
91726
      return NULL;
91727
    }
91728
  }
91729
91730
  while (1) {
91731
    wuffs_base__status status = wuffs_base__image_decoder__decode_frame(
91732
        dec, &pb, srcbuf, WUFFS_BASE__PIXEL_BLEND__SRC, workbuf, NULL);
91733
    if (status.repr == NULL) {
91734
      break;
91735
    } else if ((status.repr != wuffs_base__suspension__short_read) || !clbk) {
91736
      free(workbuf_ptr);
91737
      free(pixbuf_ptr);
91738
      wuffs_drop_in__stb__g_failure_reason = status.repr;
91739
      return NULL;
91740
    }
91741
91742
    if (wuffs_base__io_buffer__compact(srcbuf) <= 0) {
91743
      free(workbuf_ptr);
91744
      free(pixbuf_ptr);
91745
      wuffs_drop_in__stb__g_failure_reason = "I/O buffer is too small";
91746
      return NULL;
91747
    }
91748
    wuffs_drop_in__stb__read(srcbuf, clbk, user);
91749
  }
91750
91751
  free(workbuf_ptr);
91752
  return pixbuf_ptr;
91753
}
91754
91755
static void*                        //
91756
wuffs_drop_in__stb__load0(          //
91757
    wuffs_base__io_buffer* srcbuf,  //
91758
    stbi_io_callbacks const* clbk,  //
91759
    void* user,                     //
91760
    int* x,                         //
91761
    int* y,                         //
91762
    int* channels_in_file,          //
91763
    int desired_channels,           //
91764
    int info_only) {
91765
  uint32_t dst_pixfmt = 0;
91766
  switch (desired_channels) {
91767
    case 1:
91768
      dst_pixfmt = WUFFS_BASE__PIXEL_FORMAT__Y;
91769
      break;
91770
    case 3:
91771
      dst_pixfmt = WUFFS_BASE__PIXEL_FORMAT__RGB;
91772
      break;
91773
    case 4:
91774
      dst_pixfmt = WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL;
91775
      break;
91776
    default:
91777
      wuffs_drop_in__stb__g_failure_reason = "unsupported format conversion";
91778
      return NULL;
91779
  }
91780
91781
  wuffs_base__image_decoder* dec =
91782
      wuffs_drop_in__stb__make_decoder(srcbuf, clbk, user);
91783
  if (!dec) {
91784
    if (wuffs_drop_in__stb__g_failure_reason == NULL) {
91785
      wuffs_drop_in__stb__g_failure_reason = "couldn't allocate image decoder";
91786
    }
91787
    return NULL;
91788
  }
91789
91790
  wuffs_base__image_config ic = ((wuffs_base__image_config){});
91791
  stbi_uc* ret = wuffs_drop_in__stb__load1(
91792
      srcbuf, clbk, user, dec, &ic, dst_pixfmt, desired_channels, info_only);
91793
  free(dec);
91794
91795
  if (!info_only && !ret) {
91796
    return NULL;
91797
  }
91798
91799
  if (x) {
91800
    *x = (int)wuffs_base__pixel_config__width(&ic.pixcfg);
91801
  }
91802
  if (y) {
91803
    *y = (int)wuffs_base__pixel_config__height(&ic.pixcfg);
91804
  }
91805
  if (channels_in_file) {
91806
    wuffs_base__pixel_format src_pixfmt =
91807
        wuffs_base__pixel_config__pixel_format(&ic.pixcfg);
91808
    uint32_t n_color = wuffs_base__pixel_format__coloration(&src_pixfmt);
91809
    uint32_t n_alpha = wuffs_base__pixel_format__transparency(&src_pixfmt) !=
91810
                       WUFFS_BASE__PIXEL_ALPHA_TRANSPARENCY__OPAQUE;
91811
    *channels_in_file = (int)(n_color + n_alpha);
91812
  }
91813
91814
  return ret;
91815
}
91816
91817
// --------
91818
91819
WUFFS_DROP_IN__STB__MAYBE_STATIC int  //
91820
stbi_info_from_memory(                //
91821
    stbi_uc const* buffer,            //
91822
    int len,                          //
91823
    int* x,                           //
91824
    int* y,                           //
91825
    int* comp) {
91826
  wuffs_drop_in__stb__g_failure_reason = NULL;
91827
  if (len < 0) {
91828
    wuffs_drop_in__stb__g_failure_reason = "negative buffer length";
91829
    return 0;
91830
  } else if (len == 0) {
91831
    wuffs_drop_in__stb__g_failure_reason = "empty buffer";
91832
    return 0;
91833
  }
91834
  wuffs_base__io_buffer srcbuf =
91835
      wuffs_base__ptr_u8__reader((uint8_t*)(stbi_uc*)buffer, (size_t)len, true);
91836
  wuffs_drop_in__stb__load0(&srcbuf, NULL, NULL, x, y, comp, 1, 1);
91837
  return wuffs_drop_in__stb__g_failure_reason == NULL;
91838
}
91839
91840
WUFFS_DROP_IN__STB__MAYBE_STATIC stbi_uc*  //
91841
stbi_load_from_memory(                     //
91842
    stbi_uc const* buffer,                 //
91843
    int len,                               //
91844
    int* x,                                //
91845
    int* y,                                //
91846
    int* channels_in_file,                 //
91847
    int desired_channels) {
91848
  wuffs_drop_in__stb__g_failure_reason = NULL;
91849
  if (len < 0) {
91850
    wuffs_drop_in__stb__g_failure_reason = "negative buffer length";
91851
    return NULL;
91852
  } else if (len == 0) {
91853
    wuffs_drop_in__stb__g_failure_reason = "empty buffer";
91854
    return NULL;
91855
  }
91856
  wuffs_base__io_buffer srcbuf =
91857
      wuffs_base__ptr_u8__reader((uint8_t*)(stbi_uc*)buffer, (size_t)len, true);
91858
  return wuffs_drop_in__stb__load0(&srcbuf, NULL, NULL, x, y, channels_in_file,
91859
                                   desired_channels, 0);
91860
}
91861
91862
WUFFS_DROP_IN__STB__MAYBE_STATIC int  //
91863
stbi_info_from_callbacks(             //
91864
    stbi_io_callbacks const* clbk,    //
91865
    void* user,                       //
91866
    int* x,                           //
91867
    int* y,                           //
91868
    int* comp) {
91869
  wuffs_drop_in__stb__g_failure_reason = NULL;
91870
  void* iobuf_ptr = malloc(65536u);
91871
  if (!iobuf_ptr) {
91872
    wuffs_drop_in__stb__g_failure_reason = "out of memory";
91873
    return 0;
91874
  }
91875
  wuffs_base__io_buffer srcbuf =
91876
      wuffs_base__ptr_u8__writer((uint8_t*)iobuf_ptr, 65536u);
91877
  wuffs_drop_in__stb__load0(&srcbuf, clbk, user, x, y, comp, 1, 1);
91878
  free(iobuf_ptr);
91879
  return wuffs_drop_in__stb__g_failure_reason == NULL;
91880
}
91881
91882
WUFFS_DROP_IN__STB__MAYBE_STATIC stbi_uc*  //
91883
stbi_load_from_callbacks(                  //
91884
    stbi_io_callbacks const* clbk,         //
91885
    void* user,                            //
91886
    int* x,                                //
91887
    int* y,                                //
91888
    int* channels_in_file,                 //
91889
    int desired_channels) {
91890
  wuffs_drop_in__stb__g_failure_reason = NULL;
91891
  void* iobuf_ptr = malloc(65536u);
91892
  if (!iobuf_ptr) {
91893
    wuffs_drop_in__stb__g_failure_reason = "out of memory";
91894
    return NULL;
91895
  }
91896
  wuffs_base__io_buffer srcbuf =
91897
      wuffs_base__ptr_u8__writer((uint8_t*)iobuf_ptr, 65536u);
91898
  stbi_uc* ret = wuffs_drop_in__stb__load0(
91899
      &srcbuf, clbk, user, x, y, channels_in_file, desired_channels, 0);
91900
  free(iobuf_ptr);
91901
  return ret;
91902
}
91903
91904
WUFFS_DROP_IN__STB__MAYBE_STATIC void  //
91905
stbi_image_free(                       //
91906
    void* retval_from_stbi_load) {
91907
  wuffs_drop_in__stb__g_failure_reason = NULL;
91908
  free(retval_from_stbi_load);
91909
}
91910
91911
WUFFS_DROP_IN__STB__MAYBE_STATIC const char*  //
91912
stbi_failure_reason(void) {
91913
  return wuffs_drop_in__stb__g_failure_reason
91914
             ? wuffs_drop_in__stb__g_failure_reason
91915
             : "ok";
91916
}
91917
91918
// --------
91919
91920
#if !defined(STBI_NO_STDIO)
91921
91922
#include <stdio.h>
91923
91924
// TODO: retry after EINTR?
91925
91926
static int                                 //
91927
wuffs_drop_in__stb__file_callbacks__read(  //
91928
    void* user,                            //
91929
    char* data,                            //
91930
    int size) {
91931
  return (int)fread(data, 1u, (size_t)size, (FILE*)user);
91932
}
91933
91934
static void                                //
91935
wuffs_drop_in__stb__file_callbacks__skip(  //
91936
    void* user,                            //
91937
    int n) {
91938
  fseek((FILE*)user, (long)n, SEEK_CUR);
91939
}
91940
91941
static int                                //
91942
wuffs_drop_in__stb__file_callbacks__eof(  //
91943
    void* user) {
91944
  return feof((FILE*)user);
91945
}
91946
91947
WUFFS_DROP_IN__STB__MAYBE_STATIC int  //
91948
stbi_info(                            //
91949
    char const* filename,             //
91950
    int* x,                           //
91951
    int* y,                           //
91952
    int* comp) {
91953
  wuffs_drop_in__stb__g_failure_reason = NULL;
91954
  FILE* f = fopen(filename, "rb");
91955
  if (!f) {
91956
    wuffs_drop_in__stb__g_failure_reason = "could not open file";
91957
    return 0;
91958
  }
91959
  int ret = stbi_info_from_file(f, x, y, comp);
91960
  fclose(f);
91961
  return ret;
91962
}
91963
91964
WUFFS_DROP_IN__STB__MAYBE_STATIC stbi_uc*  //
91965
stbi_load(                                 //
91966
    char const* filename,                  //
91967
    int* x,                                //
91968
    int* y,                                //
91969
    int* channels_in_file,                 //
91970
    int desired_channels) {
91971
  wuffs_drop_in__stb__g_failure_reason = NULL;
91972
  FILE* f = fopen(filename, "rb");
91973
  if (!f) {
91974
    wuffs_drop_in__stb__g_failure_reason = "could not open file";
91975
    return NULL;
91976
  }
91977
  stbi_uc* ret =
91978
      stbi_load_from_file(f, x, y, channels_in_file, desired_channels);
91979
  fclose(f);
91980
  return ret;
91981
}
91982
91983
WUFFS_DROP_IN__STB__MAYBE_STATIC int  //
91984
stbi_info_from_file(                  //
91985
    FILE* f,                          //
91986
    int* x,                           //
91987
    int* y,                           //
91988
    int* comp) {
91989
  wuffs_drop_in__stb__g_failure_reason = NULL;
91990
  void* iobuf_ptr = malloc(65536u);
91991
  if (!iobuf_ptr) {
91992
    wuffs_drop_in__stb__g_failure_reason = "out of memory";
91993
    return 0;
91994
  }
91995
  wuffs_base__io_buffer srcbuf =
91996
      wuffs_base__ptr_u8__writer((uint8_t*)iobuf_ptr, 65536u);
91997
  stbi_io_callbacks clbk;
91998
  clbk.read = &wuffs_drop_in__stb__file_callbacks__read;
91999
  clbk.skip = &wuffs_drop_in__stb__file_callbacks__skip;
92000
  clbk.eof = &wuffs_drop_in__stb__file_callbacks__eof;
92001
  wuffs_drop_in__stb__load0(&srcbuf, &clbk, f, x, y, comp, 1, 1);
92002
  free(iobuf_ptr);
92003
  return wuffs_drop_in__stb__g_failure_reason == NULL;
92004
}
92005
92006
WUFFS_DROP_IN__STB__MAYBE_STATIC stbi_uc*  //
92007
stbi_load_from_file(                       //
92008
    FILE* f,                               //
92009
    int* x,                                //
92010
    int* y,                                //
92011
    int* channels_in_file,                 //
92012
    int desired_channels) {
92013
  wuffs_drop_in__stb__g_failure_reason = NULL;
92014
  void* iobuf_ptr = malloc(65536u);
92015
  if (!iobuf_ptr) {
92016
    wuffs_drop_in__stb__g_failure_reason = "out of memory";
92017
    return NULL;
92018
  }
92019
  wuffs_base__io_buffer srcbuf =
92020
      wuffs_base__ptr_u8__writer((uint8_t*)iobuf_ptr, 65536u);
92021
  stbi_io_callbacks clbk;
92022
  clbk.read = &wuffs_drop_in__stb__file_callbacks__read;
92023
  clbk.skip = &wuffs_drop_in__stb__file_callbacks__skip;
92024
  clbk.eof = &wuffs_drop_in__stb__file_callbacks__eof;
92025
  stbi_uc* ret = wuffs_drop_in__stb__load0(
92026
      &srcbuf, &clbk, f, x, y, channels_in_file, desired_channels, 0);
92027
  free(iobuf_ptr);
92028
  return ret;
92029
}
92030
92031
#endif  // !defined(STBI_NO_STDIO)
92032
92033
// --------
92034
92035
#ifdef __cplusplus
92036
}  // extern "C"
92037
#endif
92038
92039
#endif  // defined (WUFFS_CONFIG__ENABLE_DROP_IN_REPLACEMENT__STB)
92040
#endif  // WUFFS_IMPLEMENTATION
92041
92042
#if defined(__GNUC__)
92043
#pragma GCC diagnostic pop
92044
#elif defined(__clang__)
92045
#pragma clang diagnostic pop
92046
#endif
92047
92048
#endif  // WUFFS_INCLUDE_GUARD