Run script/sync.sh: 0.4.0-alpha.6+3789.20240804
diff --git a/release/c/wuffs-v0.4.c b/release/c/wuffs-v0.4.c
index 3fe55ee..7aba0bc 100644
--- a/release/c/wuffs-v0.4.c
+++ b/release/c/wuffs-v0.4.c
@@ -81,15 +81,15 @@
// each major.minor branch, the commit count should increase monotonically.
//
// WUFFS_VERSION was overridden by "wuffs gen -version" based on revision
-// 3be81643cc77e83e0125b150502ea273bf02839d committed on 2024-07-09.
+// ffb64df0a0b127e20d5eb0e1aab40c29409c0c3e committed on 2024-08-04.
#define WUFFS_VERSION 0x000040000
#define WUFFS_VERSION_MAJOR 0
#define WUFFS_VERSION_MINOR 4
#define WUFFS_VERSION_PATCH 0
-#define WUFFS_VERSION_PRE_RELEASE_LABEL "alpha.5"
-#define WUFFS_VERSION_BUILD_METADATA_COMMIT_COUNT 3771
-#define WUFFS_VERSION_BUILD_METADATA_COMMIT_DATE 20240709
-#define WUFFS_VERSION_STRING "0.4.0-alpha.5+3771.20240709"
+#define WUFFS_VERSION_PRE_RELEASE_LABEL "alpha.6"
+#define WUFFS_VERSION_BUILD_METADATA_COMMIT_COUNT 3789
+#define WUFFS_VERSION_BUILD_METADATA_COMMIT_DATE 20240804
+#define WUFFS_VERSION_STRING "0.4.0-alpha.6+3789.20240804"
// ---------------- Private Implementation Macros Re-definition Check
@@ -176,12 +176,62 @@
#elif defined(_MSC_VER) // (#if-chain ref AVOID_CPU_ARCH_1)
#if defined(_M_X64)
-// We need <intrin.h> for the __cpuid function.
-#include <intrin.h>
+
+// On X86_64, Microsoft Visual C/C++ (MSVC) only supports SSE2 by default.
+// There are /arch:SSE2, /arch:AVX and /arch:AVX2 compiler flags (the AVX2 one
+// is roughly equivalent to X86_64_V3), but there is no /arch:SSE42 compiler
+// flag that's equivalent to X86_64_V2.
+//
+// For getting maximum performance with X86_64 MSVC and Wuffs, pass /arch:AVX2
+// (and then test on the oldest hardware you intend to support).
+//
+// Absent that compiler flag, either define one of the three macros listed
+// below or else the X86_64 SIMD code will be disabled and you'll get a #pragma
+// message stating this library "performs best with /arch:AVX2". This message
+// is harmless and ignorable, in that the non-SIMD code is still correct and
+// reasonably performant, but is a reminder that when combining Wuffs and MSVC,
+// some compiler configuration is required for maximum performance.
+//
+// - WUFFS_CONFIG__DISABLE_MSVC_CPU_ARCH__X86_64_FAMILY
+// - WUFFS_CONFIG__ENABLE_MSVC_CPU_ARCH__X86_64_V2 (enables SSE4.2 and below)
+// - WUFFS_CONFIG__ENABLE_MSVC_CPU_ARCH__X86_64_V3 (enables AVX2 and below)
+//
+// Defining the first one (WUFFS_CONFIG__DISABLE_MSVC_CPU_ARCH__X86_64_FAMILY)
+// or defining none of those three (the default state) are equivalent (in that
+// both disable the SIMD code paths), other than that pragma message.
+//
+// When defining these WUFFS_CONFIG__ENABLE_ETC macros with MSVC, be aware that
+// some users report it leading to ICEs (Internal Compiler Errors), but other
+// users report no problems at all (and improved performance). It's unclear
+// exactly what combination of SIMD code and MSVC configuration lead to ICEs.
+// Do your own testing with your own MSVC version and configuration.
+//
+// https://github.com/google/wuffs/issues/148
+// https://github.com/google/wuffs/issues/151
+// https://developercommunity.visualstudio.com/t/fatal--error-C1001:-Internal-compiler-er/10703305
+//
+// Clang (including clang-cl) and GCC don't need this WUFFS_CONFIG__ETC macro
+// machinery, or having the Wuffs-the-library user to fiddle with compiler
+// flags, because they support "__attribute__((target(arg)))".
+#if defined(__AVX2__) || defined(__clang__) || \
+ defined(WUFFS_CONFIG__ENABLE_MSVC_CPU_ARCH__X86_64_V3)
#define WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64
#define WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2
-#if defined(__AVX2__) || defined(__clang__)
+#define WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3
+#elif defined(WUFFS_CONFIG__ENABLE_MSVC_CPU_ARCH__X86_64_V2)
+#define WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64
+#define WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2
+#elif !defined(WUFFS_CONFIG__DISABLE_MSVC_CPU_ARCH__X86_64_FAMILY)
+#pragma message("Wuffs with MSVC+X64 performs best with /arch:AVX2")
+#endif // defined(__AVX2__) || defined(__clang__) || etc
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64)
+
+#if defined(WUFFS_CONFIG__DISABLE_MSVC_CPU_ARCH__X86_64_FAMILY)
+#error "MSVC_CPU_ARCH simultaneously enabled and disabled"
+#endif
+
+#include <intrin.h>
// intrin.h isn't enough for X64 SIMD, with clang-cl, if we want to use
// "__attribute__((target(arg)))" without e.g. "/arch:AVX".
//
@@ -191,23 +241,9 @@
#include <immintrin.h> // AVX, AVX2, FMA, POPCNT
#include <nmmintrin.h> // SSE4.2
#include <wmmintrin.h> // AES, PCLMUL
-#define WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3
-#else // defined(__AVX2__) || defined(__clang__)
-
-// clang-cl (which defines both __clang__ and _MSC_VER) supports
-// "__attribute__((target(arg)))".
-//
-// For MSVC's cl.exe (unlike clang or gcc), SIMD capability is a compile-time
-// property of the source file (e.g. a /arch:AVX2 or -mavx2 compiler flag), not
-// of individual functions (that can be conditionally selected at runtime).
-#if !defined(WUFFS_CONFIG__I_KNOW_THAT_WUFFS_MSVC_PERFORMS_BEST_WITH_ARCH_AVX2)
-#pragma message("Wuffs with MSVC+IX86/X64 performs best with /arch:AVX2")
-#endif
-
-#endif // defined(__AVX2__) || defined(__clang__)
+#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64)
#endif // defined(_M_X64)
-
#endif // (#if-chain ref AVOID_CPU_ARCH_1)
#endif // (#if-chain ref AVOID_CPU_ARCH_0)
@@ -914,6 +950,8 @@
#define WUFFS_BASE__QUIRK_IGNORE_CHECKSUM 1
+#define WUFFS_BASE__QUIRK_QUALITY 2
+
// --------
// Flicks are a unit of time. One flick (frame-tick) is 1 / 705_600_000 of a
@@ -1979,6 +2017,20 @@
wuffs_base__magic_number_guess_fourcc(wuffs_base__slice_u8 prefix_data,
bool prefix_closed);
+// ---------------- Quirk Values
+
+// These constants are the value half of a key-value pair, where the key is
+// WUFFS_BASE__QUIRK_QUALITY.
+//
+// In the Wuffs API, set_quirk takes a u64 value. These macro definitions are
+// likewise unsigned values (uint64_t) but for this particular key, they are
+// best interpreted as signed values (int64_t). "Lower-than-default quality"
+// and "higher-than-default quality", as signed values, are -1 and +1.
+//
+// See doc/note/quirks.md for some more discussion about trade-offs.
+#define WUFFS_BASE__QUIRK_QUALITY__VALUE__LOWER_QUALITY UINT64_MAX
+#define WUFFS_BASE__QUIRK_QUALITY__VALUE__HIGHER_QUALITY ((uint64_t)1)
+
// ---------------- Ranges and Rects
// See https://github.com/google/wuffs/blob/main/doc/note/ranges-and-rects.md
@@ -3351,49 +3403,53 @@
// --------
-#define WUFFS_BASE__TOKEN__LENGTH__MAX_INCL 0xFFFF
-
-#define WUFFS_BASE__TOKEN__VALUE__SHIFT 17
-#define WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT 17
-#define WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT 42
-#define WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT 17
-#define WUFFS_BASE__TOKEN__VALUE_BASE_CATEGORY__SHIFT 38
-#define WUFFS_BASE__TOKEN__VALUE_BASE_DETAIL__SHIFT 17
-#define WUFFS_BASE__TOKEN__CONTINUED__SHIFT 16
-#define WUFFS_BASE__TOKEN__LENGTH__SHIFT 0
-
-#define WUFFS_BASE__TOKEN__VALUE_EXTENSION__NUM_BITS 46
+// clang-format off
// --------
-#define WUFFS_BASE__TOKEN__VBC__FILLER 0
-#define WUFFS_BASE__TOKEN__VBC__STRUCTURE 1
-#define WUFFS_BASE__TOKEN__VBC__STRING 2
-#define WUFFS_BASE__TOKEN__VBC__UNICODE_CODE_POINT 3
-#define WUFFS_BASE__TOKEN__VBC__LITERAL 4
-#define WUFFS_BASE__TOKEN__VBC__NUMBER 5
-#define WUFFS_BASE__TOKEN__VBC__INLINE_INTEGER_SIGNED 6
+#define WUFFS_BASE__TOKEN__LENGTH__MAX_INCL 0xFFFF
+
+#define WUFFS_BASE__TOKEN__VALUE__SHIFT 17
+#define WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT 17
+#define WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT 42
+#define WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT 17
+#define WUFFS_BASE__TOKEN__VALUE_BASE_CATEGORY__SHIFT 38
+#define WUFFS_BASE__TOKEN__VALUE_BASE_DETAIL__SHIFT 17
+#define WUFFS_BASE__TOKEN__CONTINUED__SHIFT 16
+#define WUFFS_BASE__TOKEN__LENGTH__SHIFT 0
+
+#define WUFFS_BASE__TOKEN__VALUE_EXTENSION__NUM_BITS 46
+
+// --------
+
+#define WUFFS_BASE__TOKEN__VBC__FILLER 0
+#define WUFFS_BASE__TOKEN__VBC__STRUCTURE 1
+#define WUFFS_BASE__TOKEN__VBC__STRING 2
+#define WUFFS_BASE__TOKEN__VBC__UNICODE_CODE_POINT 3
+#define WUFFS_BASE__TOKEN__VBC__LITERAL 4
+#define WUFFS_BASE__TOKEN__VBC__NUMBER 5
+#define WUFFS_BASE__TOKEN__VBC__INLINE_INTEGER_SIGNED 6
#define WUFFS_BASE__TOKEN__VBC__INLINE_INTEGER_UNSIGNED 7
// --------
-#define WUFFS_BASE__TOKEN__VBD__FILLER__PUNCTUATION 0x00001
+#define WUFFS_BASE__TOKEN__VBD__FILLER__PUNCTUATION 0x00001
#define WUFFS_BASE__TOKEN__VBD__FILLER__COMMENT_BLOCK 0x00002
-#define WUFFS_BASE__TOKEN__VBD__FILLER__COMMENT_LINE 0x00004
+#define WUFFS_BASE__TOKEN__VBD__FILLER__COMMENT_LINE 0x00004
// COMMENT_ANY is a bit-wise or of COMMENT_BLOCK AND COMMENT_LINE.
-#define WUFFS_BASE__TOKEN__VBD__FILLER__COMMENT_ANY 0x00006
+#define WUFFS_BASE__TOKEN__VBD__FILLER__COMMENT_ANY 0x00006
// --------
-#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__PUSH 0x00001
-#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__POP 0x00002
+#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__PUSH 0x00001
+#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__POP 0x00002
#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_NONE 0x00010
#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_LIST 0x00020
#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_DICT 0x00040
-#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_NONE 0x01000
-#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_LIST 0x02000
-#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_DICT 0x04000
+#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_NONE 0x01000
+#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_LIST 0x02000
+#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_DICT 0x04000
// --------
@@ -3413,11 +3469,11 @@
//
// The lack of any particular bit is conservative: it is valid for all-ASCII
// strings, in a single- or multi-token chain, to have none of these bits set.
-#define WUFFS_BASE__TOKEN__VBD__STRING__DEFINITELY_UTF_8 0x00001
-#define WUFFS_BASE__TOKEN__VBD__STRING__CHAIN_MUST_BE_UTF_8 0x00002
+#define WUFFS_BASE__TOKEN__VBD__STRING__DEFINITELY_UTF_8 0x00001
+#define WUFFS_BASE__TOKEN__VBD__STRING__CHAIN_MUST_BE_UTF_8 0x00002
#define WUFFS_BASE__TOKEN__VBD__STRING__CHAIN_SHOULD_BE_UTF_8 0x00004
-#define WUFFS_BASE__TOKEN__VBD__STRING__DEFINITELY_ASCII 0x00010
-#define WUFFS_BASE__TOKEN__VBD__STRING__CHAIN_MUST_BE_ASCII 0x00020
+#define WUFFS_BASE__TOKEN__VBD__STRING__DEFINITELY_ASCII 0x00010
+#define WUFFS_BASE__TOKEN__VBD__STRING__CHAIN_MUST_BE_ASCII 0x00020
#define WUFFS_BASE__TOKEN__VBD__STRING__CHAIN_SHOULD_BE_ASCII 0x00040
// CONVERT_D_DST_S_SRC means that multiples of S source bytes (possibly padded)
@@ -3432,22 +3488,22 @@
// When src is the empty string, multiple conversion algorithms are applicable
// (so these bits are not necessarily mutually exclusive), all producing the
// same empty dst string.
-#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_0_DST_1_SRC_DROP 0x00100
-#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_1_DST_1_SRC_COPY 0x00200
+#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_0_DST_1_SRC_DROP 0x00100
+#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_1_DST_1_SRC_COPY 0x00200
#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_1_DST_2_SRC_HEXADECIMAL 0x00400
#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_1_DST_4_SRC_BACKSLASH_X 0x00800
#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_3_DST_4_SRC_BASE_64_STD 0x01000
#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_3_DST_4_SRC_BASE_64_URL 0x02000
-#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_4_DST_5_SRC_ASCII_85 0x04000
+#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_4_DST_5_SRC_ASCII_85 0x04000
#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_5_DST_8_SRC_BASE_32_HEX 0x08000
#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_5_DST_8_SRC_BASE_32_STD 0x10000
// --------
#define WUFFS_BASE__TOKEN__VBD__LITERAL__UNDEFINED 0x00001
-#define WUFFS_BASE__TOKEN__VBD__LITERAL__NULL 0x00002
-#define WUFFS_BASE__TOKEN__VBD__LITERAL__FALSE 0x00004
-#define WUFFS_BASE__TOKEN__VBD__LITERAL__TRUE 0x00008
+#define WUFFS_BASE__TOKEN__VBD__LITERAL__NULL 0x00002
+#define WUFFS_BASE__TOKEN__VBD__LITERAL__FALSE 0x00004
+#define WUFFS_BASE__TOKEN__VBD__LITERAL__TRUE 0x00008
// --------
@@ -3460,8 +3516,8 @@
// For a source string of "+123" or "-0x9A", only the first two are valid.
//
// For a source string of "123.", only the first one is valid.
-#define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_FLOATING_POINT 0x00001
-#define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_INTEGER_SIGNED 0x00002
+#define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_FLOATING_POINT 0x00001
+#define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_INTEGER_SIGNED 0x00002
#define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_INTEGER_UNSIGNED 0x00004
#define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_NEG_INF 0x00010
@@ -3473,11 +3529,15 @@
// "300", which are big-endian, little-endian or text. For binary formats, the
// token length (after adjusting for FORMAT_IGNORE_ETC) discriminates
// e.g. u16 little-endian vs u32 little-endian.
-#define WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_BINARY_BIG_ENDIAN 0x00100
+#define WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_BINARY_BIG_ENDIAN 0x00100
#define WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_BINARY_LITTLE_ENDIAN 0x00200
-#define WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_TEXT 0x00400
+#define WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_TEXT 0x00400
-#define WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_IGNORE_FIRST_BYTE 0x01000
+#define WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_IGNORE_FIRST_BYTE 0x01000
+
+// --------
+
+// clang-format on
// --------
@@ -9602,6 +9662,7 @@
extern const char wuffs_jpeg__error__bad_sos_marker[];
extern const char wuffs_jpeg__error__bad_header[];
extern const char wuffs_jpeg__error__bad_marker[];
+extern const char wuffs_jpeg__error__bad_scan_count[];
extern const char wuffs_jpeg__error__missing_huffman_table[];
extern const char wuffs_jpeg__error__missing_quantization_table[];
extern const char wuffs_jpeg__error__truncated_input[];
@@ -9846,6 +9907,12 @@
uint32_t f_bitstream_ri;
uint32_t f_bitstream_wi;
bool f_bitstream_is_closed;
+ bool f_expect_multiple_scans;
+ bool f_use_lower_quality;
+ bool f_swizzle_immediately;
+ wuffs_base__status f_swizzle_immediately_status;
+ uint32_t f_swizzle_immediately_b_offsets[10];
+ uint32_t f_swizzle_immediately_c_offsets[5];
uint32_t f_bitstream_padding;
uint16_t f_quant_tables[4][64];
uint16_t f_saved_quant_tables[4][64];
@@ -9881,6 +9948,7 @@
uint32_t p_skip_past_the_next_restart_marker;
uint32_t (*choosy_decode_mcu)(
wuffs_jpeg__decoder* self,
+ wuffs_base__pixel_buffer* a_dst,
wuffs_base__slice_u8 a_workbuf,
uint32_t a_mx,
uint32_t a_my);
@@ -9889,6 +9957,7 @@
struct {
uint8_t f_bitstream_buffer[2048];
uint16_t f_mcu_blocks[10][64];
+ uint8_t f_swizzle_immediately_buffer[640];
uint8_t f_swizzle_ycck_scratch_buffer_2k[2048];
uint8_t f_dht_temp_counts[16];
uint8_t f_dht_temp_bit_lengths[256];
@@ -14993,6 +15062,7 @@
#include <stdio.h>
#include <string>
+#include <utility>
namespace wuffs_aux {
@@ -15005,6 +15075,8 @@
// nullptr, since calling free(nullptr) is a no-op.
using MemOwner = std::unique_ptr<void, decltype(&free)>;
+using QuirkKeyValuePair = std::pair<uint32_t, uint64_t>;
+
namespace sync_io {
// --------
@@ -15187,13 +15259,14 @@
// DecodeCborArgQuirks wraps an optional argument to DecodeCbor.
struct DecodeCborArgQuirks {
- explicit DecodeCborArgQuirks(wuffs_base__slice_u32 repr0);
- explicit DecodeCborArgQuirks(uint32_t* ptr, size_t len);
+ explicit DecodeCborArgQuirks(const QuirkKeyValuePair* ptr0,
+ const size_t len0);
// DefaultValue returns an empty slice.
static DecodeCborArgQuirks DefaultValue();
- wuffs_base__slice_u32 repr;
+ const QuirkKeyValuePair* ptr;
+ const size_t len;
};
// DecodeCbor calls callbacks based on the CBOR-formatted data in input.
@@ -15401,13 +15474,14 @@
// DecodeImageArgQuirks wraps an optional argument to DecodeImage.
struct DecodeImageArgQuirks {
- explicit DecodeImageArgQuirks(wuffs_base__slice_u32 repr0);
- explicit DecodeImageArgQuirks(uint32_t* ptr, size_t len);
+ explicit DecodeImageArgQuirks(const QuirkKeyValuePair* ptr0,
+ const size_t len0);
// DefaultValue returns an empty slice.
static DecodeImageArgQuirks DefaultValue();
- wuffs_base__slice_u32 repr;
+ const QuirkKeyValuePair* ptr;
+ const size_t len;
};
// DecodeImageArgFlags wraps an optional argument to DecodeImage.
@@ -15619,13 +15693,14 @@
// DecodeJsonArgQuirks wraps an optional argument to DecodeJson.
struct DecodeJsonArgQuirks {
- explicit DecodeJsonArgQuirks(wuffs_base__slice_u32 repr0);
- explicit DecodeJsonArgQuirks(uint32_t* ptr, size_t len);
+ explicit DecodeJsonArgQuirks(const QuirkKeyValuePair* ptr0,
+ const size_t len0);
// DefaultValue returns an empty slice.
static DecodeJsonArgQuirks DefaultValue();
- wuffs_base__slice_u32 repr;
+ const QuirkKeyValuePair* ptr;
+ const size_t len;
};
// DecodeJsonArgJsonPointer wraps an optional argument to DecodeJson.
@@ -15835,6 +15910,9 @@
// ---------------- Numeric Types (Utility)
+#define wuffs_base__utility__sign_extend_convert_u8_u32(a) \
+ ((uint32_t)(int32_t)(int8_t)(a))
+
#define wuffs_base__utility__sign_extend_convert_u16_u32(a) \
((uint32_t)(int32_t)(int16_t)(a))
@@ -16544,8 +16622,10 @@
const wuffs_base__pixel_swizzler* p,
wuffs_base__pixel_buffer* dst,
wuffs_base__slice_u8 dst_palette,
- uint32_t width,
- uint32_t height,
+ uint32_t x_min_incl,
+ uint32_t x_max_excl,
+ uint32_t y_min_incl,
+ uint32_t y_max_excl,
wuffs_base__slice_u8 src0,
wuffs_base__slice_u8 src1,
wuffs_base__slice_u8 src2,
@@ -28480,8 +28560,10 @@
static void //
wuffs_private_impl__swizzle_ycck__general__triangle_filter(
wuffs_base__pixel_buffer* dst,
- uint32_t width,
- uint32_t height,
+ uint32_t x_min_incl,
+ uint32_t x_max_excl,
+ uint32_t y_min_incl,
+ uint32_t y_max_excl,
const uint8_t* src_ptr0,
const uint8_t* src_ptr1,
const uint8_t* src_ptr2,
@@ -28503,6 +28585,10 @@
uint8_t* scratch_buffer_2k_ptr,
wuffs_private_impl__swizzle_ycc__upsample_func (*upfuncs)[4][4],
wuffs_private_impl__swizzle_ycc__convert_4_func conv4func) {
+ if ((x_min_incl != 0) || (y_min_incl != 0)) {
+ return;
+ }
+
wuffs_private_impl__swizzle_ycc__upsample_func upfunc0 =
(*upfuncs)[(inv_h0 - 1u) & 3u][(inv_v0 - 1u) & 3u];
wuffs_private_impl__swizzle_ycc__upsample_func upfunc1 =
@@ -28515,7 +28601,7 @@
// First row.
uint32_t h1v2_bias = 1u;
wuffs_private_impl__swizzle_ycck__general__triangle_filter_edge_row(
- dst, width, 0u, //
+ dst, x_max_excl, 0u, //
src_ptr0, src_ptr1, src_ptr2, src_ptr3, //
stride0, stride1, stride2, stride3, //
inv_h0, inv_h1, inv_h2, inv_h3, //
@@ -28527,10 +28613,10 @@
h1v2_bias = 2u;
// Middle rows.
- bool last_row = height == 2u * half_height_for_2to1;
- uint32_t y_max_excl = last_row ? (height - 1u) : height;
+ bool last_row = y_max_excl == 2u * half_height_for_2to1;
+ uint32_t middle_y_max_excl = last_row ? (y_max_excl - 1u) : y_max_excl;
uint32_t y;
- for (y = 1u; y < y_max_excl; y++) {
+ for (y = 1u; y < middle_y_max_excl; y++) {
const uint8_t* src0_major = src_ptr0 + ((y / inv_v0) * (size_t)stride0);
const uint8_t* src0_minor =
(inv_v0 != 2u)
@@ -28557,11 +28643,11 @@
uint32_t total_src_len3 = 0u;
uint32_t x = 0u;
- while (x < width) {
+ while (x < x_max_excl) {
bool first_column = x == 0u;
uint32_t end = x + 480u;
- if (end > width) {
- end = width;
+ if (end > x_max_excl) {
+ end = x_max_excl;
}
uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0;
@@ -28617,9 +28703,9 @@
}
// Last row.
- if (y_max_excl != height) {
+ if (middle_y_max_excl != y_max_excl) {
wuffs_private_impl__swizzle_ycck__general__triangle_filter_edge_row(
- dst, width, height - 1u, //
+ dst, x_max_excl, middle_y_max_excl, //
src_ptr0, src_ptr1, src_ptr2, src_ptr3, //
stride0, stride1, stride2, stride3, //
inv_h0, inv_h1, inv_h2, inv_h3, //
@@ -28715,8 +28801,10 @@
static void //
wuffs_private_impl__swizzle_ycc__general__triangle_filter(
wuffs_base__pixel_buffer* dst,
- uint32_t width,
- uint32_t height,
+ uint32_t x_min_incl,
+ uint32_t x_max_excl,
+ uint32_t y_min_incl,
+ uint32_t y_max_excl,
const uint8_t* src_ptr0,
const uint8_t* src_ptr1,
const uint8_t* src_ptr2,
@@ -28734,6 +28822,10 @@
uint8_t* scratch_buffer_2k_ptr,
wuffs_private_impl__swizzle_ycc__upsample_func (*upfuncs)[4][4],
wuffs_private_impl__swizzle_ycc__convert_3_func conv3func) {
+ if ((x_min_incl != 0) || (y_min_incl != 0)) {
+ return;
+ }
+
wuffs_private_impl__swizzle_ycc__upsample_func upfunc0 =
(*upfuncs)[(inv_h0 - 1u) & 3u][(inv_v0 - 1u) & 3u];
wuffs_private_impl__swizzle_ycc__upsample_func upfunc1 =
@@ -28744,7 +28836,7 @@
// First row.
uint32_t h1v2_bias = 1u;
wuffs_private_impl__swizzle_ycc__general__triangle_filter_edge_row(
- dst, width, 0u, //
+ dst, x_max_excl, 0u, //
src_ptr0, src_ptr1, src_ptr2, //
stride0, stride1, stride2, //
inv_h0, inv_h1, inv_h2, //
@@ -28756,10 +28848,10 @@
h1v2_bias = 2u;
// Middle rows.
- bool last_row = height == 2u * half_height_for_2to1;
- uint32_t y_max_excl = last_row ? (height - 1u) : height;
+ bool last_row = y_max_excl == 2u * half_height_for_2to1;
+ uint32_t middle_y_max_excl = last_row ? (y_max_excl - 1u) : y_max_excl;
uint32_t y;
- for (y = 1u; y < y_max_excl; y++) {
+ for (y = 1u; y < middle_y_max_excl; y++) {
const uint8_t* src0_major = src_ptr0 + ((y / inv_v0) * (size_t)stride0);
const uint8_t* src0_minor =
(inv_v0 != 2u)
@@ -28780,11 +28872,11 @@
uint32_t total_src_len2 = 0u;
uint32_t x = 0u;
- while (x < width) {
+ while (x < x_max_excl) {
bool first_column = x == 0u;
uint32_t end = x + 672u;
- if (end > width) {
- end = width;
+ if (end > x_max_excl) {
+ end = x_max_excl;
}
uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0;
@@ -28829,16 +28921,16 @@
}
// Last row.
- if (y_max_excl != height) {
+ if (middle_y_max_excl != y_max_excl) {
wuffs_private_impl__swizzle_ycc__general__triangle_filter_edge_row(
- dst, width, height - 1u, //
- src_ptr0, src_ptr1, src_ptr2, //
- stride0, stride1, stride2, //
- inv_h0, inv_h1, inv_h2, //
- inv_v0, inv_v1, inv_v2, //
- half_width_for_2to1, //
- h1v2_bias, //
- scratch_buffer_2k_ptr, //
+ dst, x_max_excl, middle_y_max_excl, //
+ src_ptr0, src_ptr1, src_ptr2, //
+ stride0, stride1, stride2, //
+ inv_h0, inv_h1, inv_h2, //
+ inv_v0, inv_v1, inv_v2, //
+ half_width_for_2to1, //
+ h1v2_bias, //
+ scratch_buffer_2k_ptr, //
upfunc0, upfunc1, upfunc2, conv3func);
}
}
@@ -28846,8 +28938,10 @@
static void //
wuffs_private_impl__swizzle_ycc__general__box_filter(
wuffs_base__pixel_buffer* dst,
- uint32_t width,
- uint32_t height,
+ uint32_t x_min_incl,
+ uint32_t x_max_excl,
+ uint32_t y_min_incl,
+ uint32_t y_max_excl,
const uint8_t* src_ptr0,
const uint8_t* src_ptr1,
const uint8_t* src_ptr2,
@@ -28873,41 +28967,44 @@
(*upfuncs)[(inv_h2 - 1u) & 3u][(inv_v2 - 1u) & 3u];
uint32_t y;
- for (y = 0u; y < height; y++) {
- const uint8_t* src0_major = src_ptr0 + ((y / inv_v0) * (size_t)stride0);
- const uint8_t* src1_major = src_ptr1 + ((y / inv_v1) * (size_t)stride1);
- const uint8_t* src2_major = src_ptr2 + ((y / inv_v2) * (size_t)stride2);
+ for (y = y_min_incl; y < y_max_excl; y++) {
+ const uint8_t* src0_major =
+ src_ptr0 + (((y - y_min_incl) / inv_v0) * (size_t)stride0);
+ const uint8_t* src1_major =
+ src_ptr1 + (((y - y_min_incl) / inv_v1) * (size_t)stride1);
+ const uint8_t* src2_major =
+ src_ptr2 + (((y - y_min_incl) / inv_v2) * (size_t)stride2);
- uint32_t x = 0u;
- while (x < width) {
+ uint32_t x = x_min_incl;
+ while (x < x_max_excl) {
uint32_t end = x + 672u;
- if (end > width) {
- end = width;
+ if (end > x_max_excl) {
+ end = x_max_excl;
}
uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0;
uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1;
uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2;
- const uint8_t* up0 = (*upfunc0)( //
- scratch_buffer_2k_ptr + (0u * 672u), //
- src0_major + (x / inv_h0), //
- src0_major + (x / inv_h0), //
- src_len0, //
+ const uint8_t* up0 = (*upfunc0)( //
+ scratch_buffer_2k_ptr + (0u * 672u), //
+ src0_major + ((x - x_min_incl) / inv_h0), //
+ src0_major + ((x - x_min_incl) / inv_h0), //
+ src_len0, //
0u, false, false);
- const uint8_t* up1 = (*upfunc1)( //
- scratch_buffer_2k_ptr + (1u * 672u), //
- src1_major + (x / inv_h1), //
- src1_major + (x / inv_h1), //
- src_len1, //
+ const uint8_t* up1 = (*upfunc1)( //
+ scratch_buffer_2k_ptr + (1u * 672u), //
+ src1_major + ((x - x_min_incl) / inv_h1), //
+ src1_major + ((x - x_min_incl) / inv_h1), //
+ src_len1, //
0u, false, false);
- const uint8_t* up2 = (*upfunc2)( //
- scratch_buffer_2k_ptr + (2u * 672u), //
- src2_major + (x / inv_h2), //
- src2_major + (x / inv_h2), //
- src_len2, //
+ const uint8_t* up2 = (*upfunc2)( //
+ scratch_buffer_2k_ptr + (2u * 672u), //
+ src2_major + ((x - x_min_incl) / inv_h2), //
+ src2_major + ((x - x_min_incl) / inv_h2), //
+ src_len2, //
0u, false, false);
(*conv3func)(dst, x, end, y, up0, up1, up2);
@@ -28916,6 +29013,100 @@
}
}
+static void //
+wuffs_private_impl__swizzle_ycck__general__box_filter(
+ wuffs_base__pixel_buffer* dst,
+ uint32_t x_min_incl,
+ uint32_t x_max_excl,
+ uint32_t y_min_incl,
+ uint32_t y_max_excl,
+ const uint8_t* src_ptr0,
+ const uint8_t* src_ptr1,
+ const uint8_t* src_ptr2,
+ const uint8_t* src_ptr3,
+ uint32_t stride0,
+ uint32_t stride1,
+ uint32_t stride2,
+ uint32_t stride3,
+ uint32_t inv_h0,
+ uint32_t inv_h1,
+ uint32_t inv_h2,
+ uint32_t inv_h3,
+ uint32_t inv_v0,
+ uint32_t inv_v1,
+ uint32_t inv_v2,
+ uint32_t inv_v3,
+ uint32_t half_width_for_2to1,
+ uint32_t half_height_for_2to1,
+ uint8_t* scratch_buffer_2k_ptr,
+ wuffs_private_impl__swizzle_ycc__upsample_func (*upfuncs)[4][4],
+ wuffs_private_impl__swizzle_ycc__convert_4_func conv4func) {
+ wuffs_private_impl__swizzle_ycc__upsample_func upfunc0 =
+ (*upfuncs)[(inv_h0 - 1u) & 3u][(inv_v0 - 1u) & 3u];
+ wuffs_private_impl__swizzle_ycc__upsample_func upfunc1 =
+ (*upfuncs)[(inv_h1 - 1u) & 3u][(inv_v1 - 1u) & 3u];
+ wuffs_private_impl__swizzle_ycc__upsample_func upfunc2 =
+ (*upfuncs)[(inv_h2 - 1u) & 3u][(inv_v2 - 1u) & 3u];
+ wuffs_private_impl__swizzle_ycc__upsample_func upfunc3 =
+ (*upfuncs)[(inv_h3 - 1u) & 3u][(inv_v3 - 1u) & 3u];
+
+ uint32_t y;
+ for (y = y_min_incl; y < y_max_excl; y++) {
+ const uint8_t* src0_major =
+ src_ptr0 + (((y - y_min_incl) / inv_v0) * (size_t)stride0);
+ const uint8_t* src1_major =
+ src_ptr1 + (((y - y_min_incl) / inv_v1) * (size_t)stride1);
+ const uint8_t* src2_major =
+ src_ptr2 + (((y - y_min_incl) / inv_v2) * (size_t)stride2);
+ const uint8_t* src3_major =
+ src_ptr3 + (((y - y_min_incl) / inv_v3) * (size_t)stride3);
+
+ uint32_t x = x_min_incl;
+ while (x < x_max_excl) {
+ uint32_t end = x + 480u;
+ if (end > x_max_excl) {
+ end = x_max_excl;
+ }
+
+ uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0;
+ uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1;
+ uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2;
+ uint32_t src_len3 = ((end - x) + inv_h3 - 1u) / inv_h3;
+
+ const uint8_t* up0 = (*upfunc0)( //
+ scratch_buffer_2k_ptr + (0u * 480u), //
+ src0_major + ((x - x_min_incl) / inv_h0), //
+ src0_major + ((x - x_min_incl) / inv_h0), //
+ src_len0, //
+ 0u, false, false);
+
+ const uint8_t* up1 = (*upfunc1)( //
+ scratch_buffer_2k_ptr + (1u * 480u), //
+ src1_major + ((x - x_min_incl) / inv_h1), //
+ src1_major + ((x - x_min_incl) / inv_h1), //
+ src_len1, //
+ 0u, false, false);
+
+ const uint8_t* up2 = (*upfunc2)( //
+ scratch_buffer_2k_ptr + (2u * 480u), //
+ src2_major + ((x - x_min_incl) / inv_h2), //
+ src2_major + ((x - x_min_incl) / inv_h2), //
+ src_len2, //
+ 0u, false, false);
+
+ const uint8_t* up3 = (*upfunc3)( //
+ scratch_buffer_2k_ptr + (3u * 480u), //
+ src3_major + ((x - x_min_incl) / inv_h3), //
+ src3_major + ((x - x_min_incl) / inv_h3), //
+ src_len3, //
+ 0u, false, false);
+
+ (*conv4func)(dst, x, end, y, up0, up1, up2, up3);
+ x = end;
+ }
+ }
+}
+
// --------
// wuffs_private_impl__swizzle_flattened_length is like
@@ -28940,8 +29131,10 @@
const wuffs_base__pixel_swizzler* p,
wuffs_base__pixel_buffer* dst,
wuffs_base__slice_u8 dst_palette,
- uint32_t width,
- uint32_t height,
+ uint32_t x_min_incl,
+ uint32_t x_max_excl,
+ uint32_t y_min_incl,
+ uint32_t y_max_excl,
wuffs_base__slice_u8 src0,
wuffs_base__slice_u8 src1,
wuffs_base__slice_u8 src2,
@@ -28971,13 +29164,18 @@
wuffs_base__slice_u8 scratch_buffer_2k) {
if (!p) {
return wuffs_base__make_status(wuffs_base__error__bad_receiver);
- } else if (!dst || (width > 0xFFFFu) || (height > 0xFFFFu) || //
- (4u <= ((unsigned int)h0 - 1u)) || //
- (4u <= ((unsigned int)h1 - 1u)) || //
- (4u <= ((unsigned int)h2 - 1u)) || //
- (4u <= ((unsigned int)v0 - 1u)) || //
- (4u <= ((unsigned int)v1 - 1u)) || //
- (4u <= ((unsigned int)v2 - 1u)) || //
+ } else if (!dst || //
+ (x_min_incl > x_max_excl) || //
+ (x_max_excl > 0xFFFFu) || //
+ (y_min_incl > y_max_excl) || //
+ (y_max_excl > 0xFFFFu) || //
+ (4u <= ((unsigned int)h0 - 1u)) || //
+ (4u <= ((unsigned int)h1 - 1u)) || //
+ (4u <= ((unsigned int)h2 - 1u)) || //
+ (4u <= ((unsigned int)v0 - 1u)) || //
+ (4u <= ((unsigned int)v1 - 1u)) || //
+ (4u <= ((unsigned int)v2 - 1u)) || //
+ (triangle_filter_for_2to1 && ((x_min_incl | y_min_incl) > 0u)) ||
(scratch_buffer_2k.len < 2048u)) {
return wuffs_base__make_status(wuffs_base__error__bad_argument);
}
@@ -29004,21 +29202,69 @@
uint32_t inv_v2 = max_incl_v / v2;
uint32_t inv_v3 = v3 ? (max_incl_v / v3) : 0u;
- uint32_t half_width_for_2to1 = (width + 1u) / 2u;
- uint32_t half_height_for_2to1 = (height + 1u) / 2u;
+ if (x_min_incl != 0) {
+ if ((x_min_incl % inv_h0) || (x_min_incl % inv_h1) ||
+ (x_min_incl % inv_h2) || (inv_h3 && (x_min_incl % inv_h3))) {
+ return wuffs_base__make_status(wuffs_base__error__bad_argument);
+ }
+ }
+ if (y_min_incl != 0) {
+ if ((y_min_incl % inv_v0) || (y_min_incl % inv_v1) ||
+ (y_min_incl % inv_v2) || (inv_v3 && (y_min_incl % inv_v3))) {
+ return wuffs_base__make_status(wuffs_base__error__bad_argument);
+ }
+ }
- width = wuffs_private_impl__u32__min_of_5( //
- width, //
- width0 * inv_h0, //
- width1 * inv_h1, //
- width2 * inv_h2, //
- wuffs_base__pixel_config__width(&dst->pixcfg));
- height = wuffs_private_impl__u32__min_of_5( //
- height, //
- height0 * inv_v0, //
- height1 * inv_v1, //
- height2 * inv_v2, //
- wuffs_base__pixel_config__height(&dst->pixcfg));
+ uint32_t half_width_for_2to1 = ((x_max_excl - x_min_incl) + 1u) / 2u;
+ if (inv_h0 == 2) {
+ half_width_for_2to1 = wuffs_base__u32__min(half_width_for_2to1, width0);
+ }
+ if (inv_h1 == 2) {
+ half_width_for_2to1 = wuffs_base__u32__min(half_width_for_2to1, width1);
+ }
+ if (inv_h2 == 2) {
+ half_width_for_2to1 = wuffs_base__u32__min(half_width_for_2to1, width2);
+ }
+ if (inv_h3 == 2) {
+ half_width_for_2to1 = wuffs_base__u32__min(half_width_for_2to1, width3);
+ }
+
+ uint32_t half_height_for_2to1 = ((y_max_excl - y_min_incl) + 1u) / 2u;
+ if (inv_v0 == 2) {
+ half_height_for_2to1 = wuffs_base__u32__min(half_height_for_2to1, height0);
+ }
+ if (inv_v1 == 2) {
+ half_height_for_2to1 = wuffs_base__u32__min(half_height_for_2to1, height1);
+ }
+ if (inv_v2 == 2) {
+ half_height_for_2to1 = wuffs_base__u32__min(half_height_for_2to1, height2);
+ }
+ if (inv_v3 == 2) {
+ half_height_for_2to1 = wuffs_base__u32__min(half_height_for_2to1, height3);
+ }
+
+ x_max_excl = wuffs_base__u32__min( //
+ wuffs_base__pixel_config__width(&dst->pixcfg), //
+ x_min_incl + wuffs_private_impl__u32__min_of_5( //
+ x_max_excl - x_min_incl, //
+ width0 * inv_h0, //
+ width1 * inv_h1, //
+ width2 * inv_h2, //
+ inv_h3 ? (width3 * inv_h3) : 0xFFFFFFFF));
+ y_max_excl = wuffs_base__u32__min( //
+ wuffs_base__pixel_config__height(&dst->pixcfg), //
+ y_min_incl + wuffs_private_impl__u32__min_of_5( //
+ y_max_excl - y_min_incl, //
+ height0 * inv_v0, //
+ height1 * inv_v1, //
+ height2 * inv_v2, //
+ inv_v3 ? (height3 * inv_v3) : 0xFFFFFFFF));
+
+ if ((x_min_incl >= x_max_excl) || (y_min_incl >= y_max_excl)) {
+ return wuffs_base__make_status(NULL);
+ }
+ uint32_t width = x_max_excl - x_min_incl;
+ uint32_t height = y_max_excl - y_min_incl;
if (((h0 * inv_h0) != max_incl_h) || //
((h1 * inv_h1) != max_incl_h) || //
@@ -29119,10 +29365,6 @@
// ----
- if ((width <= 0u) || (height <= 0u)) {
- return wuffs_base__make_status(NULL);
- }
-
wuffs_private_impl__swizzle_ycc__convert_3_func conv3func = NULL;
if (is_rgb_or_cmyk) {
@@ -29157,28 +29399,58 @@
}
}
- void (*func)(wuffs_base__pixel_buffer * dst, //
- uint32_t width, //
- uint32_t height, //
- const uint8_t* src_ptr0, //
- const uint8_t* src_ptr1, //
- const uint8_t* src_ptr2, //
- uint32_t stride0, //
- uint32_t stride1, //
- uint32_t stride2, //
- uint32_t inv_h0, //
- uint32_t inv_h1, //
- uint32_t inv_h2, //
- uint32_t inv_v0, //
- uint32_t inv_v1, //
- uint32_t inv_v2, //
- uint32_t half_width_for_2to1, //
- uint32_t half_height_for_2to1, //
- uint8_t* scratch_buffer_2k_ptr, //
- wuffs_private_impl__swizzle_ycc__upsample_func(*upfuncs)[4][4],
- wuffs_private_impl__swizzle_ycc__convert_3_func conv3func) =
+ void (*func3)(wuffs_base__pixel_buffer * dst, //
+ uint32_t x_min_incl, //
+ uint32_t x_max_excl, //
+ uint32_t y_min_incl, //
+ uint32_t y_max_excl, //
+ const uint8_t* src_ptr0, //
+ const uint8_t* src_ptr1, //
+ const uint8_t* src_ptr2, //
+ uint32_t stride0, //
+ uint32_t stride1, //
+ uint32_t stride2, //
+ uint32_t inv_h0, //
+ uint32_t inv_h1, //
+ uint32_t inv_h2, //
+ uint32_t inv_v0, //
+ uint32_t inv_v1, //
+ uint32_t inv_v2, //
+ uint32_t half_width_for_2to1, //
+ uint32_t half_height_for_2to1, //
+ uint8_t* scratch_buffer_2k_ptr, //
+ wuffs_private_impl__swizzle_ycc__upsample_func(*upfuncs)[4][4],
+ wuffs_private_impl__swizzle_ycc__convert_3_func conv3func) =
&wuffs_private_impl__swizzle_ycc__general__box_filter;
+ void (*func4)(wuffs_base__pixel_buffer * dst, //
+ uint32_t x_min_incl, //
+ uint32_t x_max_excl, //
+ uint32_t y_min_incl, //
+ uint32_t y_max_excl, //
+ const uint8_t* src_ptr0, //
+ const uint8_t* src_ptr1, //
+ const uint8_t* src_ptr2, //
+ const uint8_t* src_ptr3, //
+ uint32_t stride0, //
+ uint32_t stride1, //
+ uint32_t stride2, //
+ uint32_t stride3, //
+ uint32_t inv_h0, //
+ uint32_t inv_h1, //
+ uint32_t inv_h2, //
+ uint32_t inv_h3, //
+ uint32_t inv_v0, //
+ uint32_t inv_v1, //
+ uint32_t inv_v2, //
+ uint32_t inv_v3, //
+ uint32_t half_width_for_2to1, //
+ uint32_t half_height_for_2to1, //
+ uint8_t* scratch_buffer_2k_ptr, //
+ wuffs_private_impl__swizzle_ycc__upsample_func(*upfuncs)[4][4],
+ wuffs_private_impl__swizzle_ycc__convert_4_func conv4func) =
+ &wuffs_private_impl__swizzle_ycck__general__box_filter;
+
wuffs_private_impl__swizzle_ycc__upsample_func upfuncs[4][4];
memcpy(&upfuncs, &wuffs_private_impl__swizzle_ycc__upsample_funcs,
sizeof upfuncs);
@@ -29186,8 +29458,10 @@
if (triangle_filter_for_2to1 &&
(wuffs_private_impl__swizzle_has_triangle_upsampler(inv_h0, inv_v0) ||
wuffs_private_impl__swizzle_has_triangle_upsampler(inv_h1, inv_v1) ||
- wuffs_private_impl__swizzle_has_triangle_upsampler(inv_h2, inv_v2))) {
- func = &wuffs_private_impl__swizzle_ycc__general__triangle_filter;
+ wuffs_private_impl__swizzle_has_triangle_upsampler(inv_h2, inv_v2) ||
+ wuffs_private_impl__swizzle_has_triangle_upsampler(inv_h3, inv_v3))) {
+ func3 = &wuffs_private_impl__swizzle_ycc__general__triangle_filter;
+ func4 = &wuffs_private_impl__swizzle_ycck__general__triangle_filter;
upfuncs[0][1] = wuffs_private_impl__swizzle_ycc__upsample_inv_h1v2_triangle;
upfuncs[1][0] = wuffs_private_impl__swizzle_ycc__upsample_inv_h2v1_triangle;
@@ -29219,23 +29493,23 @@
wuffs_private_impl__swizzle_ycc__convert_4_func conv4func =
is_rgb_or_cmyk ? &wuffs_private_impl__swizzle_cmyk__convert_4_general
: &wuffs_private_impl__swizzle_ycck__convert_4_general;
- wuffs_private_impl__swizzle_ycck__general__triangle_filter( //
- dst, width, height, //
- src0.ptr, src1.ptr, src2.ptr, src3.ptr, //
- stride0, stride1, stride2, stride3, //
- inv_h0, inv_h1, inv_h2, inv_h3, //
- inv_v0, inv_v1, inv_v2, inv_v3, //
- half_width_for_2to1, half_height_for_2to1, //
+ (*func4)( //
+ dst, x_min_incl, x_max_excl, y_min_incl, y_max_excl, //
+ src0.ptr, src1.ptr, src2.ptr, src3.ptr, //
+ stride0, stride1, stride2, stride3, //
+ inv_h0, inv_h1, inv_h2, inv_h3, //
+ inv_v0, inv_v1, inv_v2, inv_v3, //
+ half_width_for_2to1, half_height_for_2to1, //
scratch_buffer_2k.ptr, &upfuncs, conv4func);
} else {
- (*func)( //
- dst, width, height, //
- src0.ptr, src1.ptr, src2.ptr, //
- stride0, stride1, stride2, //
- inv_h0, inv_h1, inv_h2, //
- inv_v0, inv_v1, inv_v2, //
- half_width_for_2to1, half_height_for_2to1, //
+ (*func3)( //
+ dst, x_min_incl, x_max_excl, y_min_incl, y_max_excl, //
+ src0.ptr, src1.ptr, src2.ptr, //
+ stride0, stride1, stride2, //
+ inv_h0, inv_h1, inv_h2, //
+ inv_v0, inv_v1, inv_v2, //
+ half_width_for_2to1, half_height_for_2to1, //
scratch_buffer_2k.ptr, &upfuncs, conv3func);
}
@@ -30954,6 +31228,7 @@
uint32_t v_width = 0;
uint32_t v_height = 0;
uint32_t v_planes = 0;
+ uint32_t v_n = 0;
uint32_t v_dst_pixfmt = 0;
uint32_t v_byte_width = 0;
@@ -31711,7 +31986,8 @@
}
}
} else if (self->private_impl.f_bitmap_info_len >= 40u) {
- self->private_data.s_do_decode_image_config.scratch = (self->private_impl.f_bitmap_info_len - 40u);
+ v_n = (self->private_impl.f_bitmap_info_len - 40u);
+ self->private_data.s_do_decode_image_config.scratch = v_n;
WUFFS_BASE__COROUTINE_SUSPENSION_POINT(45);
if (self->private_data.s_do_decode_image_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
self->private_data.s_do_decode_image_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
@@ -43656,6 +43932,7 @@
const char wuffs_jpeg__error__bad_sos_marker[] = "#jpeg: bad SOS marker";
const char wuffs_jpeg__error__bad_header[] = "#jpeg: bad header";
const char wuffs_jpeg__error__bad_marker[] = "#jpeg: bad marker";
+const char wuffs_jpeg__error__bad_scan_count[] = "#jpeg: bad scan count";
const char wuffs_jpeg__error__missing_huffman_table[] = "#jpeg: missing Huffman table";
const char wuffs_jpeg__error__missing_quantization_table[] = "#jpeg: missing Quantization table";
const char wuffs_jpeg__error__truncated_input[] = "#jpeg: truncated input";
@@ -44000,6 +44277,7 @@
static wuffs_base__status
wuffs_jpeg__decoder__decode_sos(
wuffs_jpeg__decoder* self,
+ wuffs_base__pixel_buffer* a_dst,
wuffs_base__io_buffer* a_src,
wuffs_base__slice_u8 a_workbuf);
@@ -44082,14 +44360,23 @@
wuffs_jpeg__decoder__swizzle_gray(
wuffs_jpeg__decoder* self,
wuffs_base__pixel_buffer* a_dst,
- wuffs_base__slice_u8 a_workbuf);
+ wuffs_base__slice_u8 a_workbuf,
+ uint32_t a_x0,
+ uint32_t a_x1,
+ uint32_t a_y0,
+ uint32_t a_y1,
+ uint64_t a_stride);
WUFFS_BASE__GENERATED_C_CODE
static wuffs_base__status
wuffs_jpeg__decoder__swizzle_colorful(
wuffs_jpeg__decoder* self,
wuffs_base__pixel_buffer* a_dst,
- wuffs_base__slice_u8 a_workbuf);
+ wuffs_base__slice_u8 a_workbuf,
+ uint32_t a_x0,
+ uint32_t a_x1,
+ uint32_t a_y0,
+ uint32_t a_y1);
WUFFS_BASE__GENERATED_C_CODE
static bool
@@ -44110,6 +44397,7 @@
static uint32_t
wuffs_jpeg__decoder__decode_mcu(
wuffs_jpeg__decoder* self,
+ wuffs_base__pixel_buffer* a_dst,
wuffs_base__slice_u8 a_workbuf,
uint32_t a_mx,
uint32_t a_my);
@@ -44118,6 +44406,7 @@
static uint32_t
wuffs_jpeg__decoder__decode_mcu__choosy_default(
wuffs_jpeg__decoder* self,
+ wuffs_base__pixel_buffer* a_dst,
wuffs_base__slice_u8 a_workbuf,
uint32_t a_mx,
uint32_t a_my);
@@ -44126,6 +44415,7 @@
static uint32_t
wuffs_jpeg__decoder__decode_mcu_progressive_ac_high_bits(
wuffs_jpeg__decoder* self,
+ wuffs_base__pixel_buffer* a_dst,
wuffs_base__slice_u8 a_workbuf,
uint32_t a_mx,
uint32_t a_my);
@@ -44134,6 +44424,7 @@
static uint32_t
wuffs_jpeg__decoder__decode_mcu_progressive_ac_low_bit(
wuffs_jpeg__decoder* self,
+ wuffs_base__pixel_buffer* a_dst,
wuffs_base__slice_u8 a_workbuf,
uint32_t a_mx,
uint32_t a_my);
@@ -44142,6 +44433,7 @@
static uint32_t
wuffs_jpeg__decoder__decode_mcu_progressive_dc_high_bits(
wuffs_jpeg__decoder* self,
+ wuffs_base__pixel_buffer* a_dst,
wuffs_base__slice_u8 a_workbuf,
uint32_t a_mx,
uint32_t a_my);
@@ -44150,6 +44442,7 @@
static uint32_t
wuffs_jpeg__decoder__decode_mcu_progressive_dc_low_bit(
wuffs_jpeg__decoder* self,
+ wuffs_base__pixel_buffer* a_dst,
wuffs_base__slice_u8 a_workbuf,
uint32_t a_mx,
uint32_t a_my);
@@ -45793,6 +46086,11 @@
return 0;
}
+ if (a_key == 2u) {
+ if (self->private_impl.f_use_lower_quality) {
+ return 18446744073709551615u;
+ }
+ }
return 0u;
}
@@ -45814,6 +46112,10 @@
: wuffs_base__error__initialize_not_called);
}
+ if (a_key == 2u) {
+ self->private_impl.f_use_lower_quality = (a_value >= 9223372036854775808u);
+ return wuffs_base__make_status(NULL);
+ }
return wuffs_base__make_status(wuffs_base__error__unsupported_option);
}
@@ -47100,14 +47402,27 @@
if ((v_ddf_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
v_ddf_status = wuffs_base__make_status(wuffs_jpeg__error__truncated_input);
}
- if (wuffs_base__status__is_error(&v_ddf_status) || (v_scan_count < self->private_impl.f_scan_count)) {
+ if ( ! self->private_impl.f_swizzle_immediately && (wuffs_base__status__is_error(&v_ddf_status) || (v_scan_count < self->private_impl.f_scan_count))) {
if (self->private_impl.f_sof_marker >= 194u) {
wuffs_jpeg__decoder__apply_progressive_idct(self, a_workbuf);
}
if (self->private_impl.f_num_components == 1u) {
- v_swizzle_status = wuffs_jpeg__decoder__swizzle_gray(self, a_dst, a_workbuf);
+ v_swizzle_status = wuffs_jpeg__decoder__swizzle_gray(self,
+ a_dst,
+ a_workbuf,
+ 0u,
+ 4294967295u,
+ 0u,
+ 4294967295u,
+ ((uint64_t)(self->private_impl.f_components_workbuf_widths[0u])));
} else {
- v_swizzle_status = wuffs_jpeg__decoder__swizzle_colorful(self, a_dst, a_workbuf);
+ v_swizzle_status = wuffs_jpeg__decoder__swizzle_colorful(self,
+ a_dst,
+ a_workbuf,
+ 0u,
+ 4294967295u,
+ 0u,
+ 4294967295u);
}
if (wuffs_base__status__is_error(&v_ddf_status)) {
status = v_ddf_status;
@@ -47212,9 +47527,14 @@
}
goto ok;
}
+ self->private_impl.f_swizzle_immediately = false;
if (self->private_impl.f_components_workbuf_offsets[8u] > ((uint64_t)(a_workbuf.len))) {
- status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length);
- goto exit;
+ if (self->private_impl.f_sof_marker >= 194u) {
+ status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length);
+ goto exit;
+ }
+ self->private_impl.f_swizzle_immediately = self->private_impl.f_use_lower_quality;
+ self->private_impl.f_swizzle_immediately_status = wuffs_base__make_status(NULL);
} else if (self->private_impl.f_components_workbuf_offsets[4u] < self->private_impl.f_components_workbuf_offsets[8u]) {
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);
}
@@ -47327,7 +47647,7 @@
a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
}
WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
- status = wuffs_jpeg__decoder__decode_sos(self, a_src, a_workbuf);
+ status = wuffs_jpeg__decoder__decode_sos(self, a_dst, a_src, a_workbuf);
if (a_src) {
iop_a_src = a_src->data.ptr + a_src->meta.ri;
}
@@ -47674,13 +47994,6 @@
#pragma GCC diagnostic ignored "-Wconversion"
#endif
v_k += 1u;
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
v_j += 1u;
#if defined(__GNUC__)
#pragma GCC diagnostic pop
@@ -47697,6 +48010,7 @@
static wuffs_base__status
wuffs_jpeg__decoder__decode_sos(
wuffs_jpeg__decoder* self,
+ wuffs_base__pixel_buffer* a_dst,
wuffs_base__io_buffer* a_src,
wuffs_base__slice_u8 a_workbuf) {
wuffs_base__status status = wuffs_base__make_status(NULL);
@@ -47714,9 +48028,12 @@
switch (coro_susp_point) {
WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
- if (self->private_impl.f_scan_count >= 64u) {
+ if (self->private_impl.f_scan_count >= 32u) {
status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_scan_count);
goto exit;
+ } else if ((self->private_impl.f_scan_count > 0u) && ! self->private_impl.f_expect_multiple_scans) {
+ status = wuffs_base__make_status(wuffs_jpeg__error__bad_scan_count);
+ goto exit;
}
WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
status = wuffs_jpeg__decoder__prepare_scan(self, a_src);
@@ -47746,12 +48063,26 @@
wuffs_jpeg__decoder__load_mcu_blocks(self, v_mx, v_my, a_workbuf);
}
while (true) {
- v_decode_mcu_result = wuffs_jpeg__decoder__decode_mcu(self, a_workbuf, v_mx, v_my);
+ v_decode_mcu_result = wuffs_jpeg__decoder__decode_mcu(self,
+ a_dst,
+ a_workbuf,
+ v_mx,
+ v_my);
if (v_decode_mcu_result == 0u) {
break;
- } else if (v_decode_mcu_result != 1u) {
+ } else if (v_decode_mcu_result == 1u) {
+ } else if (v_decode_mcu_result == 2u) {
status = wuffs_base__make_status(wuffs_jpeg__error__internal_error_inconsistent_decoder_state);
goto exit;
+ } else {
+ status = self->private_impl.f_swizzle_immediately_status;
+ if (wuffs_base__status__is_error(&status)) {
+ goto exit;
+ } else if (wuffs_base__status__is_suspension(&status)) {
+ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
+ goto exit;
+ }
+ goto ok;
}
while (true) {
v_bitstream_length = ((uint32_t)(self->private_impl.f_bitstream_wi - self->private_impl.f_bitstream_ri));
@@ -47940,6 +48271,9 @@
}
v_i += 1u;
}
+ if (self->private_impl.f_scan_count == 0u) {
+ 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));
+ }
if (self->private_impl.f_sof_marker < 194u) {
self->private_data.s_prepare_scan.scratch = 3u;
WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
@@ -48189,6 +48523,7 @@
uint32_t v_b = 0;
uint32_t v_bx_offset = 0;
uint32_t v_by_offset = 0;
+ uint32_t v_sibo = 0;
uint8_t v_ssel = 0;
uint8_t v_csel = 0;
@@ -48201,6 +48536,7 @@
v_h = ((uint32_t)(self->private_impl.f_components_h[self->private_impl.f_scan_comps_cselector[v_i]]));
v_v = ((uint32_t)(self->private_impl.f_components_v[self->private_impl.f_scan_comps_cselector[v_i]]));
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]])));
+ self->private_impl.f_swizzle_immediately_c_offsets[v_i] = ((uint32_t)(64u * v_total_hv));
v_total_hv += v_hv;
while (v_hv > 0u) {
self->private_impl.f_scan_comps_bx_offset[(v_b & 15u)] = ((uint8_t)((v_bx_offset & 3u)));
@@ -48223,6 +48559,7 @@
return true;
}
self->private_impl.f_mcu_num_blocks = v_total_hv;
+ self->private_impl.f_swizzle_immediately_c_offsets[self->private_impl.f_scan_num_components] = ((uint32_t)(64u * v_total_hv));
v_b = 0u;
while (v_b < self->private_impl.f_mcu_num_blocks) {
v_ssel = self->private_impl.f_mcu_blocks_sselector[v_b];
@@ -48232,6 +48569,8 @@
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]);
self->private_impl.f_mcu_blocks_dc_hselector[v_b] = ((uint8_t)(0u | self->private_impl.f_scan_comps_td[v_ssel]));
self->private_impl.f_mcu_blocks_ac_hselector[v_b] = ((uint8_t)(4u | self->private_impl.f_scan_comps_ta[v_ssel]));
+ 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]))))));
+ self->private_impl.f_swizzle_immediately_b_offsets[v_b] = wuffs_base__u32__min(v_sibo, 576u);
v_b += 1u;
}
self->private_impl.f_scan_width_in_mcus = self->private_impl.f_width_in_mcus;
@@ -48567,15 +48906,21 @@
wuffs_jpeg__decoder__swizzle_gray(
wuffs_jpeg__decoder* self,
wuffs_base__pixel_buffer* a_dst,
- wuffs_base__slice_u8 a_workbuf) {
+ wuffs_base__slice_u8 a_workbuf,
+ uint32_t a_x0,
+ uint32_t a_x1,
+ uint32_t a_y0,
+ uint32_t a_y1,
+ uint64_t a_stride) {
wuffs_base__pixel_format v_dst_pixfmt = {0};
uint32_t v_dst_bits_per_pixel = 0;
uint32_t v_dst_bytes_per_pixel = 0;
- uint64_t v_dst_length = 0;
+ uint64_t v_x0 = 0;
+ uint64_t v_x1 = 0;
wuffs_base__table_u8 v_tab = {0};
wuffs_base__slice_u8 v_dst = {0};
uint32_t v_y = 0;
- uint64_t v_stride = 0;
+ uint32_t v_y1 = 0;
v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
@@ -48583,18 +48928,24 @@
return wuffs_base__make_status(wuffs_base__error__unsupported_option);
}
v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u);
- v_dst_length = ((uint64_t)((v_dst_bytes_per_pixel * self->private_impl.f_width)));
+ v_x0 = ((uint64_t)((v_dst_bytes_per_pixel * wuffs_base__u32__min(a_x0, self->private_impl.f_width))));
+ v_x1 = ((uint64_t)((v_dst_bytes_per_pixel * wuffs_base__u32__min(a_x1, self->private_impl.f_width))));
v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
- v_y = 0u;
- while (v_y < self->private_impl.f_height) {
+ v_y = a_y0;
+ v_y1 = wuffs_base__u32__min(a_y1, self->private_impl.f_height);
+ while (v_y < v_y1) {
v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_y);
- if (v_dst_length < ((uint64_t)(v_dst.len))) {
- v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_length);
+ if (v_x1 < ((uint64_t)(v_dst.len))) {
+ v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_x1);
+ }
+ if (v_x0 < ((uint64_t)(v_dst.len))) {
+ v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_x0);
+ } else {
+ v_dst = wuffs_base__utility__empty_slice_u8();
}
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);
- v_stride = ((uint64_t)(self->private_impl.f_components_workbuf_widths[0u]));
- if (v_stride <= ((uint64_t)(a_workbuf.len))) {
- a_workbuf = wuffs_base__slice_u8__subslice_i(a_workbuf, v_stride);
+ if (a_stride <= ((uint64_t)(a_workbuf.len))) {
+ a_workbuf = wuffs_base__slice_u8__subslice_i(a_workbuf, a_stride);
} else {
a_workbuf = wuffs_base__utility__empty_slice_u8();
}
@@ -48610,54 +48961,109 @@
wuffs_jpeg__decoder__swizzle_colorful(
wuffs_jpeg__decoder* self,
wuffs_base__pixel_buffer* a_dst,
- wuffs_base__slice_u8 a_workbuf) {
+ wuffs_base__slice_u8 a_workbuf,
+ uint32_t a_x0,
+ uint32_t a_x1,
+ uint32_t a_y0,
+ uint32_t a_y1) {
+ uint64_t v_i = 0;
+ uint64_t v_j = 0;
wuffs_base__slice_u8 v_src0 = {0};
wuffs_base__slice_u8 v_src1 = {0};
wuffs_base__slice_u8 v_src2 = {0};
wuffs_base__slice_u8 v_src3 = {0};
+ uint32_t v_width0 = 0;
+ uint32_t v_width1 = 0;
+ uint32_t v_width2 = 0;
+ uint32_t v_width3 = 0;
+ uint32_t v_height0 = 0;
+ uint32_t v_height1 = 0;
+ uint32_t v_height2 = 0;
+ uint32_t v_height3 = 0;
wuffs_base__status v_status = wuffs_base__make_status(NULL);
- 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)))) {
- v_src0 = wuffs_base__slice_u8__subslice_ij(a_workbuf,
- self->private_impl.f_components_workbuf_offsets[0u],
- self->private_impl.f_components_workbuf_offsets[1u]);
- }
- 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)))) {
- v_src1 = wuffs_base__slice_u8__subslice_ij(a_workbuf,
- self->private_impl.f_components_workbuf_offsets[1u],
- self->private_impl.f_components_workbuf_offsets[2u]);
- }
- 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)))) {
- v_src2 = wuffs_base__slice_u8__subslice_ij(a_workbuf,
- self->private_impl.f_components_workbuf_offsets[2u],
- self->private_impl.f_components_workbuf_offsets[3u]);
- }
- 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)))) {
- v_src3 = wuffs_base__slice_u8__subslice_ij(a_workbuf,
- self->private_impl.f_components_workbuf_offsets[3u],
- self->private_impl.f_components_workbuf_offsets[4u]);
+ if (self->private_impl.f_swizzle_immediately) {
+ v_i = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[0u]));
+ v_j = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[1u]));
+ if ((v_i <= v_j) && (v_j <= 640u)) {
+ v_src0 = wuffs_base__make_slice_u8_ij(self->private_data.f_swizzle_immediately_buffer, v_i, v_j);
+ v_width0 = (8u * ((uint32_t)(self->private_impl.f_components_h[0u])));
+ v_height0 = (8u * ((uint32_t)(self->private_impl.f_components_v[0u])));
+ }
+ v_i = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[1u]));
+ v_j = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[2u]));
+ if ((v_i <= v_j) && (v_j <= 640u)) {
+ v_src1 = wuffs_base__make_slice_u8_ij(self->private_data.f_swizzle_immediately_buffer, v_i, v_j);
+ v_width1 = (8u * ((uint32_t)(self->private_impl.f_components_h[1u])));
+ v_height1 = (8u * ((uint32_t)(self->private_impl.f_components_v[1u])));
+ }
+ v_i = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[2u]));
+ v_j = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[3u]));
+ if ((v_i <= v_j) && (v_j <= 640u)) {
+ v_src2 = wuffs_base__make_slice_u8_ij(self->private_data.f_swizzle_immediately_buffer, v_i, v_j);
+ v_width2 = (8u * ((uint32_t)(self->private_impl.f_components_h[2u])));
+ v_height2 = (8u * ((uint32_t)(self->private_impl.f_components_v[2u])));
+ }
+ v_i = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[3u]));
+ v_j = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[4u]));
+ if ((v_i <= v_j) && (v_j <= 640u)) {
+ v_src3 = wuffs_base__make_slice_u8_ij(self->private_data.f_swizzle_immediately_buffer, v_i, v_j);
+ v_width3 = (8u * ((uint32_t)(self->private_impl.f_components_h[3u])));
+ v_height3 = (8u * ((uint32_t)(self->private_impl.f_components_v[3u])));
+ }
+ } else {
+ 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)))) {
+ v_src0 = wuffs_base__slice_u8__subslice_ij(a_workbuf,
+ self->private_impl.f_components_workbuf_offsets[0u],
+ self->private_impl.f_components_workbuf_offsets[1u]);
+ v_width0 = self->private_impl.f_components_workbuf_widths[0u];
+ v_height0 = self->private_impl.f_components_workbuf_heights[0u];
+ }
+ 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)))) {
+ v_src1 = wuffs_base__slice_u8__subslice_ij(a_workbuf,
+ self->private_impl.f_components_workbuf_offsets[1u],
+ self->private_impl.f_components_workbuf_offsets[2u]);
+ v_width1 = self->private_impl.f_components_workbuf_widths[1u];
+ v_height1 = self->private_impl.f_components_workbuf_heights[1u];
+ }
+ 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)))) {
+ v_src2 = wuffs_base__slice_u8__subslice_ij(a_workbuf,
+ self->private_impl.f_components_workbuf_offsets[2u],
+ self->private_impl.f_components_workbuf_offsets[3u]);
+ v_width2 = self->private_impl.f_components_workbuf_widths[2u];
+ v_height2 = self->private_impl.f_components_workbuf_heights[2u];
+ }
+ 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)))) {
+ v_src3 = wuffs_base__slice_u8__subslice_ij(a_workbuf,
+ self->private_impl.f_components_workbuf_offsets[3u],
+ self->private_impl.f_components_workbuf_offsets[4u]);
+ v_width3 = self->private_impl.f_components_workbuf_widths[3u];
+ v_height3 = self->private_impl.f_components_workbuf_heights[3u];
+ }
}
v_status = wuffs_base__pixel_swizzler__swizzle_ycck(&self->private_impl.f_swizzler,
a_dst,
wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)),
- self->private_impl.f_width,
- self->private_impl.f_height,
+ (a_x0 & 65535u),
+ wuffs_base__u32__min(a_x1, self->private_impl.f_width),
+ (a_y0 & 65535u),
+ wuffs_base__u32__min(a_y1, self->private_impl.f_height),
v_src0,
v_src1,
v_src2,
v_src3,
- self->private_impl.f_components_workbuf_widths[0u],
- self->private_impl.f_components_workbuf_widths[1u],
- self->private_impl.f_components_workbuf_widths[2u],
- self->private_impl.f_components_workbuf_widths[3u],
- self->private_impl.f_components_workbuf_heights[0u],
- self->private_impl.f_components_workbuf_heights[1u],
- self->private_impl.f_components_workbuf_heights[2u],
- self->private_impl.f_components_workbuf_heights[3u],
- self->private_impl.f_components_workbuf_widths[0u],
- self->private_impl.f_components_workbuf_widths[1u],
- self->private_impl.f_components_workbuf_widths[2u],
- self->private_impl.f_components_workbuf_widths[3u],
+ v_width0,
+ v_width1,
+ v_width2,
+ v_width3,
+ v_height0,
+ v_height1,
+ v_height2,
+ v_height3,
+ v_width0,
+ v_width1,
+ v_width2,
+ v_width3,
self->private_impl.f_components_h[0u],
self->private_impl.f_components_h[1u],
self->private_impl.f_components_h[2u],
@@ -48667,7 +49073,7 @@
self->private_impl.f_components_v[2u],
self->private_impl.f_components_v[3u],
self->private_impl.f_is_rgb_or_cmyk,
- true,
+ ! self->private_impl.f_use_lower_quality,
wuffs_base__make_slice_u8(self->private_data.f_swizzle_ycck_scratch_buffer_2k, 2048));
return wuffs_private_impl__status__ensure_not_a_suspension(v_status);
}
@@ -48779,6 +49185,7 @@
}
self->private_impl.f_call_sequence = 40u;
self->private_impl.f_bitstream_is_closed = false;
+ self->private_impl.f_expect_multiple_scans = false;
self->private_impl.f_frame_config_io_position = a_io_position;
self->private_impl.f_scan_count = 0u;
self->private_impl.f_restart_interval = self->private_impl.f_saved_restart_interval;
@@ -48877,6 +49284,9 @@
return wuffs_base__utility__empty_range_ii_u64();
}
+ if (self->private_impl.f_use_lower_quality && (self->private_impl.f_sof_marker < 194u)) {
+ return wuffs_base__utility__make_range_ii_u64(0u, self->private_impl.f_components_workbuf_offsets[8u]);
+ }
return wuffs_base__utility__make_range_ii_u64(self->private_impl.f_components_workbuf_offsets[8u], self->private_impl.f_components_workbuf_offsets[8u]);
}
@@ -49513,16 +49923,18 @@
static uint32_t
wuffs_jpeg__decoder__decode_mcu(
wuffs_jpeg__decoder* self,
+ wuffs_base__pixel_buffer* a_dst,
wuffs_base__slice_u8 a_workbuf,
uint32_t a_mx,
uint32_t a_my) {
- return (*self->private_impl.choosy_decode_mcu)(self, a_workbuf, a_mx, a_my);
+ return (*self->private_impl.choosy_decode_mcu)(self, a_dst, a_workbuf, a_mx, a_my);
}
WUFFS_BASE__GENERATED_C_CODE
static uint32_t
wuffs_jpeg__decoder__decode_mcu__choosy_default(
wuffs_jpeg__decoder* self,
+ wuffs_base__pixel_buffer* a_dst,
wuffs_base__slice_u8 a_workbuf,
uint32_t a_mx,
uint32_t a_my) {
@@ -49722,11 +50134,47 @@
if (self->private_impl.f_test_only_interrupt_decode_mcu) {
goto label__goto_done__break;
}
- v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[v_mcb]];
- v_stride = ((uint64_t)(self->private_impl.f_components_workbuf_widths[v_csel]));
- 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))));
- if (v_offset <= ((uint64_t)(a_workbuf.len))) {
- 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])));
+ if ( ! self->private_impl.f_swizzle_immediately) {
+ v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[v_mcb]];
+ v_stride = ((uint64_t)(self->private_impl.f_components_workbuf_widths[v_csel]));
+ 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))));
+ if (v_offset <= ((uint64_t)(a_workbuf.len))) {
+ 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])));
+ }
+ } else if (self->private_impl.f_num_components == 1u) {
+ 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])));
+ self->private_impl.f_swizzle_immediately_status = wuffs_jpeg__decoder__swizzle_gray(self,
+ a_dst,
+ wuffs_base__make_slice_u8(self->private_data.f_swizzle_immediately_buffer, 64),
+ ((a_mx + 0u) * 8u),
+ ((a_mx + 1u) * 8u),
+ ((a_my + 0u) * 8u),
+ ((a_my + 1u) * 8u),
+ 8u);
+ if ( ! wuffs_base__status__is_ok(&self->private_impl.f_swizzle_immediately_status)) {
+ v_ret = 3u;
+ goto label__goto_done__break;
+ }
+ break;
+ } else {
+ v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[v_mcb]];
+ v_stride = (8u * ((uint64_t)(self->private_impl.f_components_h[v_csel])));
+ 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])));
+ if (self->private_impl.f_mcu_current_block < self->private_impl.f_mcu_num_blocks) {
+ continue;
+ }
+ self->private_impl.f_swizzle_immediately_status = wuffs_jpeg__decoder__swizzle_colorful(self,
+ a_dst,
+ wuffs_base__utility__empty_slice_u8(),
+ ((a_mx + 0u) * 8u * ((uint32_t)(self->private_impl.f_max_incl_components_h))),
+ ((a_mx + 1u) * 8u * ((uint32_t)(self->private_impl.f_max_incl_components_h))),
+ ((a_my + 0u) * 8u * ((uint32_t)(self->private_impl.f_max_incl_components_v))),
+ ((a_my + 1u) * 8u * ((uint32_t)(self->private_impl.f_max_incl_components_v))));
+ if ( ! wuffs_base__status__is_ok(&self->private_impl.f_swizzle_immediately_status)) {
+ v_ret = 3u;
+ goto label__goto_done__break;
+ }
+ break;
}
}
self->private_impl.f_mcu_current_block = 0u;
@@ -49755,6 +50203,7 @@
static uint32_t
wuffs_jpeg__decoder__decode_mcu_progressive_ac_high_bits(
wuffs_jpeg__decoder* self,
+ wuffs_base__pixel_buffer* a_dst,
wuffs_base__slice_u8 a_workbuf,
uint32_t a_mx,
uint32_t a_my) {
@@ -49922,6 +50371,7 @@
static uint32_t
wuffs_jpeg__decoder__decode_mcu_progressive_ac_low_bit(
wuffs_jpeg__decoder* self,
+ wuffs_base__pixel_buffer* a_dst,
wuffs_base__slice_u8 a_workbuf,
uint32_t a_mx,
uint32_t a_my) {
@@ -50183,6 +50633,7 @@
static uint32_t
wuffs_jpeg__decoder__decode_mcu_progressive_dc_high_bits(
wuffs_jpeg__decoder* self,
+ wuffs_base__pixel_buffer* a_dst,
wuffs_base__slice_u8 a_workbuf,
uint32_t a_mx,
uint32_t a_my) {
@@ -50323,6 +50774,7 @@
static uint32_t
wuffs_jpeg__decoder__decode_mcu_progressive_dc_low_bit(
wuffs_jpeg__decoder* self,
+ wuffs_base__pixel_buffer* a_dst,
wuffs_base__slice_u8 a_workbuf,
uint32_t a_mx,
uint32_t a_my) {
@@ -69437,42 +69889,6 @@
1612u, 0u, 511u, 1022u, 1533u,
};
-static const uint32_t
-WUFFS_WEBP__SIGN_EXTEND_I8_I32[256] WUFFS_BASE__POTENTIALLY_UNUSED = {
- 0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u,
- 8u, 9u, 10u, 11u, 12u, 13u, 14u, 15u,
- 16u, 17u, 18u, 19u, 20u, 21u, 22u, 23u,
- 24u, 25u, 26u, 27u, 28u, 29u, 30u, 31u,
- 32u, 33u, 34u, 35u, 36u, 37u, 38u, 39u,
- 40u, 41u, 42u, 43u, 44u, 45u, 46u, 47u,
- 48u, 49u, 50u, 51u, 52u, 53u, 54u, 55u,
- 56u, 57u, 58u, 59u, 60u, 61u, 62u, 63u,
- 64u, 65u, 66u, 67u, 68u, 69u, 70u, 71u,
- 72u, 73u, 74u, 75u, 76u, 77u, 78u, 79u,
- 80u, 81u, 82u, 83u, 84u, 85u, 86u, 87u,
- 88u, 89u, 90u, 91u, 92u, 93u, 94u, 95u,
- 96u, 97u, 98u, 99u, 100u, 101u, 102u, 103u,
- 104u, 105u, 106u, 107u, 108u, 109u, 110u, 111u,
- 112u, 113u, 114u, 115u, 116u, 117u, 118u, 119u,
- 120u, 121u, 122u, 123u, 124u, 125u, 126u, 127u,
- 4294967168u, 4294967169u, 4294967170u, 4294967171u, 4294967172u, 4294967173u, 4294967174u, 4294967175u,
- 4294967176u, 4294967177u, 4294967178u, 4294967179u, 4294967180u, 4294967181u, 4294967182u, 4294967183u,
- 4294967184u, 4294967185u, 4294967186u, 4294967187u, 4294967188u, 4294967189u, 4294967190u, 4294967191u,
- 4294967192u, 4294967193u, 4294967194u, 4294967195u, 4294967196u, 4294967197u, 4294967198u, 4294967199u,
- 4294967200u, 4294967201u, 4294967202u, 4294967203u, 4294967204u, 4294967205u, 4294967206u, 4294967207u,
- 4294967208u, 4294967209u, 4294967210u, 4294967211u, 4294967212u, 4294967213u, 4294967214u, 4294967215u,
- 4294967216u, 4294967217u, 4294967218u, 4294967219u, 4294967220u, 4294967221u, 4294967222u, 4294967223u,
- 4294967224u, 4294967225u, 4294967226u, 4294967227u, 4294967228u, 4294967229u, 4294967230u, 4294967231u,
- 4294967232u, 4294967233u, 4294967234u, 4294967235u, 4294967236u, 4294967237u, 4294967238u, 4294967239u,
- 4294967240u, 4294967241u, 4294967242u, 4294967243u, 4294967244u, 4294967245u, 4294967246u, 4294967247u,
- 4294967248u, 4294967249u, 4294967250u, 4294967251u, 4294967252u, 4294967253u, 4294967254u, 4294967255u,
- 4294967256u, 4294967257u, 4294967258u, 4294967259u, 4294967260u, 4294967261u, 4294967262u, 4294967263u,
- 4294967264u, 4294967265u, 4294967266u, 4294967267u, 4294967268u, 4294967269u, 4294967270u, 4294967271u,
- 4294967272u, 4294967273u, 4294967274u, 4294967275u, 4294967276u, 4294967277u, 4294967278u, 4294967279u,
- 4294967280u, 4294967281u, 4294967282u, 4294967283u, 4294967284u, 4294967285u, 4294967286u, 4294967287u,
- 4294967288u, 4294967289u, 4294967290u, 4294967291u, 4294967292u, 4294967293u, 4294967294u, 4294967295u,
-};
-
static const uint8_t
WUFFS_WEBP__DISTANCE_MAP[120] WUFFS_BASE__POTENTIALLY_UNUSED = {
24u, 7u, 23u, 25u, 40u, 6u, 39u, 41u,
@@ -71023,29 +71439,8 @@
#pragma GCC diagnostic ignored "-Wconversion"
#endif
v_curr_row.ptr[4u] += v_curr_row.ptr[0u];
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
v_curr_row.ptr[5u] += v_curr_row.ptr[1u];
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
v_curr_row.ptr[6u] += v_curr_row.ptr[2u];
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
v_curr_row.ptr[7u] += v_curr_row.ptr[3u];
#if defined(__GNUC__)
#pragma GCC diagnostic pop
@@ -71077,29 +71472,8 @@
#pragma GCC diagnostic ignored "-Wconversion"
#endif
v_curr_row.ptr[0u] += v_prev_row.ptr[0u];
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
v_curr_row.ptr[1u] += v_prev_row.ptr[1u];
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
v_curr_row.ptr[2u] += v_prev_row.ptr[2u];
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
v_curr_row.ptr[3u] += v_prev_row.ptr[3u];
#if defined(__GNUC__)
#pragma GCC diagnostic pop
@@ -71129,29 +71503,8 @@
#pragma GCC diagnostic ignored "-Wconversion"
#endif
v_curr_row.ptr[4u] += v_curr_row.ptr[0u];
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
v_curr_row.ptr[5u] += v_curr_row.ptr[1u];
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
v_curr_row.ptr[6u] += v_curr_row.ptr[2u];
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
v_curr_row.ptr[7u] += v_curr_row.ptr[3u];
#if defined(__GNUC__)
#pragma GCC diagnostic pop
@@ -71162,29 +71515,8 @@
#pragma GCC diagnostic ignored "-Wconversion"
#endif
v_curr_row.ptr[4u] += v_prev_row.ptr[4u];
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
v_curr_row.ptr[5u] += v_prev_row.ptr[5u];
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
v_curr_row.ptr[6u] += v_prev_row.ptr[6u];
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
v_curr_row.ptr[7u] += v_prev_row.ptr[7u];
#if defined(__GNUC__)
#pragma GCC diagnostic pop
@@ -71195,29 +71527,8 @@
#pragma GCC diagnostic ignored "-Wconversion"
#endif
v_curr_row.ptr[4u] += v_prev_row.ptr[8u];
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
v_curr_row.ptr[5u] += v_prev_row.ptr[9u];
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
v_curr_row.ptr[6u] += v_prev_row.ptr[10u];
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
v_curr_row.ptr[7u] += v_prev_row.ptr[11u];
#if defined(__GNUC__)
#pragma GCC diagnostic pop
@@ -71228,29 +71539,8 @@
#pragma GCC diagnostic ignored "-Wconversion"
#endif
v_curr_row.ptr[4u] += v_prev_row.ptr[0u];
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
v_curr_row.ptr[5u] += v_prev_row.ptr[1u];
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
v_curr_row.ptr[6u] += v_prev_row.ptr[2u];
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
v_curr_row.ptr[7u] += v_prev_row.ptr[3u];
#if defined(__GNUC__)
#pragma GCC diagnostic pop
@@ -71265,29 +71555,8 @@
#pragma GCC diagnostic ignored "-Wconversion"
#endif
v_curr_row.ptr[4u] += ((uint8_t)(((v_l0 + ((uint32_t)(v_prev_row.ptr[4u]))) / 2u)));
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
v_curr_row.ptr[5u] += ((uint8_t)(((v_l1 + ((uint32_t)(v_prev_row.ptr[5u]))) / 2u)));
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
v_curr_row.ptr[6u] += ((uint8_t)(((v_l2 + ((uint32_t)(v_prev_row.ptr[6u]))) / 2u)));
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
v_curr_row.ptr[7u] += ((uint8_t)(((v_l3 + ((uint32_t)(v_prev_row.ptr[7u]))) / 2u)));
#if defined(__GNUC__)
#pragma GCC diagnostic pop
@@ -71298,29 +71567,8 @@
#pragma GCC diagnostic ignored "-Wconversion"
#endif
v_curr_row.ptr[4u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[0u])) + ((uint32_t)(v_prev_row.ptr[0u]))) / 2u)));
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
v_curr_row.ptr[5u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[1u])) + ((uint32_t)(v_prev_row.ptr[1u]))) / 2u)));
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
v_curr_row.ptr[6u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[2u])) + ((uint32_t)(v_prev_row.ptr[2u]))) / 2u)));
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
v_curr_row.ptr[7u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[3u])) + ((uint32_t)(v_prev_row.ptr[3u]))) / 2u)));
#if defined(__GNUC__)
#pragma GCC diagnostic pop
@@ -71331,29 +71579,8 @@
#pragma GCC diagnostic ignored "-Wconversion"
#endif
v_curr_row.ptr[4u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[0u])) + ((uint32_t)(v_prev_row.ptr[4u]))) / 2u)));
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
v_curr_row.ptr[5u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[1u])) + ((uint32_t)(v_prev_row.ptr[5u]))) / 2u)));
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
v_curr_row.ptr[6u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[2u])) + ((uint32_t)(v_prev_row.ptr[6u]))) / 2u)));
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
v_curr_row.ptr[7u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[3u])) + ((uint32_t)(v_prev_row.ptr[7u]))) / 2u)));
#if defined(__GNUC__)
#pragma GCC diagnostic pop
@@ -71364,29 +71591,8 @@
#pragma GCC diagnostic ignored "-Wconversion"
#endif
v_curr_row.ptr[4u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[0u])) + ((uint32_t)(v_prev_row.ptr[4u]))) / 2u)));
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
v_curr_row.ptr[5u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[1u])) + ((uint32_t)(v_prev_row.ptr[5u]))) / 2u)));
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
v_curr_row.ptr[6u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[2u])) + ((uint32_t)(v_prev_row.ptr[6u]))) / 2u)));
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
v_curr_row.ptr[7u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[3u])) + ((uint32_t)(v_prev_row.ptr[7u]))) / 2u)));
#if defined(__GNUC__)
#pragma GCC diagnostic pop
@@ -71397,29 +71603,8 @@
#pragma GCC diagnostic ignored "-Wconversion"
#endif
v_curr_row.ptr[4u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[4u])) + ((uint32_t)(v_prev_row.ptr[8u]))) / 2u)));
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
v_curr_row.ptr[5u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[5u])) + ((uint32_t)(v_prev_row.ptr[9u]))) / 2u)));
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
v_curr_row.ptr[6u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[6u])) + ((uint32_t)(v_prev_row.ptr[10u]))) / 2u)));
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
v_curr_row.ptr[7u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[7u])) + ((uint32_t)(v_prev_row.ptr[11u]))) / 2u)));
#if defined(__GNUC__)
#pragma GCC diagnostic pop
@@ -71438,29 +71623,8 @@
#pragma GCC diagnostic ignored "-Wconversion"
#endif
v_curr_row.ptr[4u] += ((uint8_t)(((v_l0 + v_t0) / 2u)));
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
v_curr_row.ptr[5u] += ((uint8_t)(((v_l1 + v_t1) / 2u)));
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
v_curr_row.ptr[6u] += ((uint8_t)(((v_l2 + v_t2) / 2u)));
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
v_curr_row.ptr[7u] += ((uint8_t)(((v_l3 + v_t3) / 2u)));
#if defined(__GNUC__)
#pragma GCC diagnostic pop
@@ -71492,29 +71656,8 @@
#pragma GCC diagnostic ignored "-Wconversion"
#endif
v_curr_row.ptr[4u] += ((uint8_t)(v_l0));
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
v_curr_row.ptr[5u] += ((uint8_t)(v_l1));
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
v_curr_row.ptr[6u] += ((uint8_t)(v_l2));
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
v_curr_row.ptr[7u] += ((uint8_t)(v_l3));
#if defined(__GNUC__)
#pragma GCC diagnostic pop
@@ -71525,29 +71668,8 @@
#pragma GCC diagnostic ignored "-Wconversion"
#endif
v_curr_row.ptr[4u] += ((uint8_t)(v_t0));
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
v_curr_row.ptr[5u] += ((uint8_t)(v_t1));
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
v_curr_row.ptr[6u] += ((uint8_t)(v_t2));
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
v_curr_row.ptr[7u] += ((uint8_t)(v_t3));
#if defined(__GNUC__)
#pragma GCC diagnostic pop
@@ -71559,29 +71681,8 @@
#pragma GCC diagnostic ignored "-Wconversion"
#endif
v_curr_row.ptr[4u] += wuffs_webp__decoder__mode12(self, v_curr_row.ptr[0u], v_prev_row.ptr[4u], v_prev_row.ptr[0u]);
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
v_curr_row.ptr[5u] += wuffs_webp__decoder__mode12(self, v_curr_row.ptr[1u], v_prev_row.ptr[5u], v_prev_row.ptr[1u]);
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
v_curr_row.ptr[6u] += wuffs_webp__decoder__mode12(self, v_curr_row.ptr[2u], v_prev_row.ptr[6u], v_prev_row.ptr[2u]);
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
v_curr_row.ptr[7u] += wuffs_webp__decoder__mode12(self, v_curr_row.ptr[3u], v_prev_row.ptr[7u], v_prev_row.ptr[3u]);
#if defined(__GNUC__)
#pragma GCC diagnostic pop
@@ -71592,29 +71693,8 @@
#pragma GCC diagnostic ignored "-Wconversion"
#endif
v_curr_row.ptr[4u] += wuffs_webp__decoder__mode13(self, v_curr_row.ptr[0u], v_prev_row.ptr[4u], v_prev_row.ptr[0u]);
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
v_curr_row.ptr[5u] += wuffs_webp__decoder__mode13(self, v_curr_row.ptr[1u], v_prev_row.ptr[5u], v_prev_row.ptr[1u]);
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
v_curr_row.ptr[6u] += wuffs_webp__decoder__mode13(self, v_curr_row.ptr[2u], v_prev_row.ptr[6u], v_prev_row.ptr[2u]);
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
v_curr_row.ptr[7u] += wuffs_webp__decoder__mode13(self, v_curr_row.ptr[3u], v_prev_row.ptr[7u], v_prev_row.ptr[3u]);
#if defined(__GNUC__)
#pragma GCC diagnostic pop
@@ -71724,9 +71804,9 @@
v_x = 0u;
while (v_x < self->private_impl.f_width) {
if (((v_x & v_mask) == 0u) && (((uint64_t)(v_tile_data.len)) >= 4u)) {
- v_g2r = WUFFS_WEBP__SIGN_EXTEND_I8_I32[v_tile_data.ptr[0u]];
- v_g2b = WUFFS_WEBP__SIGN_EXTEND_I8_I32[v_tile_data.ptr[1u]];
- v_r2b = WUFFS_WEBP__SIGN_EXTEND_I8_I32[v_tile_data.ptr[2u]];
+ v_g2r = wuffs_base__utility__sign_extend_convert_u8_u32(v_tile_data.ptr[0u]);
+ v_g2b = wuffs_base__utility__sign_extend_convert_u8_u32(v_tile_data.ptr[1u]);
+ v_r2b = wuffs_base__utility__sign_extend_convert_u8_u32(v_tile_data.ptr[2u]);
v_tile_data = wuffs_base__slice_u8__subslice_i(v_tile_data, 4u);
}
if (((uint64_t)(a_pix.len)) >= 4u) {
@@ -71737,23 +71817,9 @@
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wconversion"
#endif
- v_r += ((uint8_t)((((uint32_t)(WUFFS_WEBP__SIGN_EXTEND_I8_I32[v_g] * v_g2r)) >> 5u)));
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
- v_b += ((uint8_t)((((uint32_t)(WUFFS_WEBP__SIGN_EXTEND_I8_I32[v_g] * v_g2b)) >> 5u)));
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
- v_b += ((uint8_t)((((uint32_t)(WUFFS_WEBP__SIGN_EXTEND_I8_I32[v_r] * v_r2b)) >> 5u)));
+ v_r += ((uint8_t)((((uint32_t)(wuffs_base__utility__sign_extend_convert_u8_u32(v_g) * v_g2r)) >> 5u)));
+ v_b += ((uint8_t)((((uint32_t)(wuffs_base__utility__sign_extend_convert_u8_u32(v_g) * v_g2b)) >> 5u)));
+ v_b += ((uint8_t)((((uint32_t)(wuffs_base__utility__sign_extend_convert_u8_u32(v_r) * v_r2b)) >> 5u)));
#if defined(__GNUC__)
#pragma GCC diagnostic pop
#endif
@@ -71790,13 +71856,6 @@
#pragma GCC diagnostic ignored "-Wconversion"
#endif
v_p.ptr[0u] += v_g;
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
v_p.ptr[2u] += v_g;
#if defined(__GNUC__)
#pragma GCC diagnostic pop
@@ -71834,6 +71893,26 @@
v_tile_size_log2 = ((uint32_t)(self->private_impl.f_transform_tile_size_log2[3u]));
if (v_tile_size_log2 == 0u) {
+ {
+ wuffs_base__slice_u8 i_slice_dst = a_pix;
+ v_dst.ptr = i_slice_dst.ptr;
+ v_dst.len = 4;
+ 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));
+ while (v_dst.ptr < i_end0_dst) {
+ v_p = (((uint32_t)(v_dst.ptr[1u])) * 4u);
+ v_p0 = self->private_data.f_palette[(v_p + 0u)];
+ v_p1 = self->private_data.f_palette[(v_p + 1u)];
+ v_p2 = self->private_data.f_palette[(v_p + 2u)];
+ v_p3 = self->private_data.f_palette[(v_p + 3u)];
+ v_dst.ptr[0u] = v_p0;
+ v_dst.ptr[1u] = v_p1;
+ v_dst.ptr[2u] = v_p2;
+ v_dst.ptr[3u] = v_p3;
+ v_dst.ptr += 4;
+ }
+ v_dst.len = 0;
+ }
+ return wuffs_base__make_empty_struct();
}
v_bits_per_pixel = (((uint32_t)(8u)) >> v_tile_size_log2);
v_x_mask = ((((uint32_t)(1u)) << v_tile_size_log2) - 1u);
@@ -72930,6 +73009,7 @@
wuffs_base__slice_u8 a_workbuf) {
wuffs_base__status status = wuffs_base__make_status(NULL);
+ wuffs_base__status v_status = wuffs_base__make_status(NULL);
uint8_t v_c8 = 0;
uint32_t v_transform_type = 0;
uint32_t v_tile_size_log2 = 0;
@@ -73028,28 +73108,34 @@
if (status.repr) {
goto suspend;
}
- if ((((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[(v_transform_type + 1u)])) > ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[(v_transform_type + 2u)]))) || (((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[(v_transform_type + 2u)])) > ((uint64_t)(a_workbuf.len)))) {
- status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length);
- goto exit;
- }
- if (a_src) {
- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
- }
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
- status = wuffs_webp__decoder__decode_pixels(self,
- wuffs_base__slice_u8__subslice_ij(a_workbuf,
- ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[(v_transform_type + 1u)])),
- ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[(v_transform_type + 2u)]))),
- a_src,
- ((self->private_impl.f_width + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2),
- ((self->private_impl.f_height + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2),
- wuffs_base__utility__empty_slice_u8(),
- 0u);
- if (a_src) {
- iop_a_src = a_src->data.ptr + a_src->meta.ri;
- }
- if (status.repr) {
- goto suspend;
+ while (true) {
+ if ((((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[(v_transform_type + 1u)])) > ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[(v_transform_type + 2u)]))) || (((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[(v_transform_type + 2u)])) > ((uint64_t)(a_workbuf.len)))) {
+ status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length);
+ goto exit;
+ }
+ {
+ if (a_src) {
+ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+ }
+ wuffs_base__status t_2 = wuffs_webp__decoder__decode_pixels(self,
+ wuffs_base__slice_u8__subslice_ij(a_workbuf,
+ ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[(v_transform_type + 1u)])),
+ ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[(v_transform_type + 2u)]))),
+ a_src,
+ ((self->private_impl.f_width + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2),
+ ((self->private_impl.f_height + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2),
+ wuffs_base__utility__empty_slice_u8(),
+ 0u);
+ v_status = t_2;
+ if (a_src) {
+ iop_a_src = a_src->data.ptr + a_src->meta.ri;
+ }
+ }
+ if (wuffs_base__status__is_ok(&v_status)) {
+ break;
+ }
+ status = v_status;
+ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5);
}
} else if (v_transform_type == 2u) {
} else {
@@ -73060,8 +73146,8 @@
status = wuffs_base__make_status(wuffs_base__suspension__short_read);
goto suspend;
}
- uint8_t t_2 = *iop_a_src++;
- v_c8 = t_2;
+ uint8_t t_3 = *iop_a_src++;
+ v_c8 = t_3;
}
if (self->private_impl.f_n_bits >= 8u) {
status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
@@ -73136,29 +73222,8 @@
#pragma GCC diagnostic ignored "-Wconversion"
#endif
v_p.ptr[4u] += v_p.ptr[0u];
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
v_p.ptr[5u] += v_p.ptr[1u];
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
v_p.ptr[6u] += v_p.ptr[2u];
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
v_p.ptr[7u] += v_p.ptr[3u];
#if defined(__GNUC__)
#pragma GCC diagnostic pop
@@ -73167,7 +73232,6 @@
}
}
- goto ok;
ok:
self->private_impl.p_decode_transform = 0;
goto exit;
@@ -73291,6 +73355,7 @@
wuffs_base__slice_u8 a_workbuf) {
wuffs_base__status status = wuffs_base__make_status(NULL);
+ wuffs_base__status v_status = wuffs_base__make_status(NULL);
uint8_t v_c8 = 0;
uint32_t v_use_hg_table = 0;
uint32_t v_tile_size_log2 = 0;
@@ -73395,28 +73460,34 @@
if (status.repr) {
goto suspend;
}
- if ((((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])) > ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u]))) || (((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u])) > ((uint64_t)(a_workbuf.len)))) {
- status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length);
- goto exit;
- }
- if (a_src) {
- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
- }
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
- status = wuffs_webp__decoder__decode_pixels(self,
- wuffs_base__slice_u8__subslice_ij(a_workbuf,
- ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])),
- ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u]))),
- a_src,
- ((a_width + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2),
- ((self->private_impl.f_height + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2),
- wuffs_base__utility__empty_slice_u8(),
- 0u);
- if (a_src) {
- iop_a_src = a_src->data.ptr + a_src->meta.ri;
- }
- if (status.repr) {
- goto suspend;
+ while (true) {
+ if ((((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])) > ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u]))) || (((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u])) > ((uint64_t)(a_workbuf.len)))) {
+ status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length);
+ goto exit;
+ }
+ {
+ if (a_src) {
+ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+ }
+ wuffs_base__status t_2 = wuffs_webp__decoder__decode_pixels(self,
+ wuffs_base__slice_u8__subslice_ij(a_workbuf,
+ ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])),
+ ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u]))),
+ a_src,
+ ((a_width + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2),
+ ((self->private_impl.f_height + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2),
+ wuffs_base__utility__empty_slice_u8(),
+ 0u);
+ v_status = t_2;
+ if (a_src) {
+ iop_a_src = a_src->data.ptr + a_src->meta.ri;
+ }
+ }
+ if (wuffs_base__status__is_ok(&v_status)) {
+ break;
+ }
+ status = v_status;
+ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5);
}
self->private_impl.f_overall_n_huffman_groups = 1u;
if ((((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])) > ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u]))) || (((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u])) > ((uint64_t)(a_workbuf.len)))) {
@@ -77458,15 +77529,13 @@
sync_io::Input& input,
IOBuffer& buffer) {}
-DecodeCborArgQuirks::DecodeCborArgQuirks(wuffs_base__slice_u32 repr0)
- : repr(repr0) {}
-
-DecodeCborArgQuirks::DecodeCborArgQuirks(uint32_t* ptr0, size_t len0)
- : repr(wuffs_base__make_slice_u32(ptr0, len0)) {}
+DecodeCborArgQuirks::DecodeCborArgQuirks(const QuirkKeyValuePair* ptr0,
+ const size_t len0)
+ : ptr(ptr0), len(len0) {}
DecodeCborArgQuirks //
DecodeCborArgQuirks::DefaultValue() {
- return DecodeCborArgQuirks(wuffs_base__empty_slice_u32());
+ return DecodeCborArgQuirks(nullptr, 0);
}
DecodeCborResult //
@@ -77495,8 +77564,8 @@
ret_error_message = "wuffs_aux::DecodeCbor: out of memory";
goto done;
}
- for (size_t i = 0; i < quirks.repr.len; i++) {
- dec->set_quirk(quirks.repr.ptr[i], 1);
+ for (size_t i = 0; i < quirks.len; i++) {
+ dec->set_quirk(quirks.ptr[i].first, quirks.ptr[i].second);
}
// Prepare the wuffs_base__tok_buffer. 256 tokens is 2KiB.
@@ -77989,15 +78058,13 @@
const char DecodeImage_UnsupportedPixelFormat[] = //
"wuffs_aux::DecodeImage: unsupported pixel format";
-DecodeImageArgQuirks::DecodeImageArgQuirks(wuffs_base__slice_u32 repr0)
- : repr(repr0) {}
-
-DecodeImageArgQuirks::DecodeImageArgQuirks(uint32_t* ptr0, size_t len0)
- : repr(wuffs_base__make_slice_u32(ptr0, len0)) {}
+DecodeImageArgQuirks::DecodeImageArgQuirks(const QuirkKeyValuePair* ptr0,
+ const size_t len0)
+ : ptr(ptr0), len(len0) {}
DecodeImageArgQuirks //
DecodeImageArgQuirks::DefaultValue() {
- return DecodeImageArgQuirks(wuffs_base__empty_slice_u32());
+ return DecodeImageArgQuirks(nullptr, 0);
}
DecodeImageArgFlags::DecodeImageArgFlags(uint64_t repr0) : repr(repr0) {}
@@ -78095,7 +78162,8 @@
DecodeImageCallbacks& callbacks,
sync_io::Input& input,
wuffs_base__io_buffer& io_buf,
- wuffs_base__slice_u32 quirks,
+ const QuirkKeyValuePair* quirks_ptr,
+ const size_t quirks_len,
uint64_t flags,
wuffs_base__pixel_blend pixel_blend,
wuffs_base__color_u32_argb_premul background_color,
@@ -78178,8 +78246,8 @@
}
// Apply quirks.
- for (size_t i = 0; i < quirks.len; i++) {
- image_decoder->set_quirk(quirks.ptr[i], 1);
+ for (size_t i = 0; i < quirks_len; i++) {
+ image_decoder->set_quirk(quirks_ptr[i].first, quirks_ptr[i].second);
}
// Apply flags.
@@ -78406,10 +78474,10 @@
}
wuffs_base__image_decoder::unique_ptr image_decoder(nullptr);
- DecodeImageResult result =
- DecodeImage0(image_decoder, callbacks, input, *io_buf, quirks.repr,
- flags.repr, pixel_blend.repr, background_color.repr,
- max_incl_dimension.repr, max_incl_metadata_length.repr);
+ DecodeImageResult result = DecodeImage0(
+ image_decoder, callbacks, input, *io_buf, quirks.ptr, quirks.len,
+ flags.repr, pixel_blend.repr, background_color.repr,
+ max_incl_dimension.repr, max_incl_metadata_length.repr);
callbacks.Done(result, input, *io_buf, std::move(image_decoder));
return result;
}
@@ -78444,15 +78512,13 @@
const char DecodeJson_NoMatch[] = //
"wuffs_aux::DecodeJson: no match";
-DecodeJsonArgQuirks::DecodeJsonArgQuirks(wuffs_base__slice_u32 repr0)
- : repr(repr0) {}
-
-DecodeJsonArgQuirks::DecodeJsonArgQuirks(uint32_t* ptr0, size_t len0)
- : repr(wuffs_base__make_slice_u32(ptr0, len0)) {}
+DecodeJsonArgQuirks::DecodeJsonArgQuirks(const QuirkKeyValuePair* ptr0,
+ const size_t len0)
+ : ptr(ptr0), len(len0) {}
DecodeJsonArgQuirks //
DecodeJsonArgQuirks::DefaultValue() {
- return DecodeJsonArgQuirks(wuffs_base__empty_slice_u32());
+ return DecodeJsonArgQuirks(nullptr, 0);
}
DecodeJsonArgJsonPointer::DecodeJsonArgJsonPointer(std::string repr0)
@@ -78797,11 +78863,11 @@
goto done;
}
bool allow_tilde_n_tilde_r_tilde_t = false;
- for (size_t i = 0; i < quirks.repr.len; i++) {
- dec->set_quirk(quirks.repr.ptr[i], 1);
- if (quirks.repr.ptr[i] ==
+ for (size_t i = 0; i < quirks.len; i++) {
+ dec->set_quirk(quirks.ptr[i].first, quirks.ptr[i].second);
+ if (quirks.ptr[i].first ==
WUFFS_JSON__QUIRK_JSON_POINTER_ALLOW_TILDE_N_TILDE_R_TILDE_T) {
- allow_tilde_n_tilde_r_tilde_t = true;
+ allow_tilde_n_tilde_r_tilde_t = (quirks.ptr[i].second != 0);
}
}
diff --git a/sync.txt b/sync.txt
index bb70427..96ae672 100644
--- a/sync.txt
+++ b/sync.txt
@@ -1,10 +1,10 @@
-script/sync.sh ran on 2024-07-09
-Sibling directory (../wuffs) git revision is fab0dd534a9ee22f9f4aa0f9896355ba19bff82c
+script/sync.sh ran on 2024-08-05
+Sibling directory (../wuffs) git revision is 870cfd18a7fe77a97a2258f564e9806d3474d56b
Manifest (sha256sum values, filenames, versions):
994126492f24a3edae9b95efa92820647cedc42ee933ce3ff2a364fa9c62aba3 release/c/README.md
3b6a0c78f663bb495d1972fbb2a87c717d70fbac5ea8cc1a50cb9afaa4b03f92 release/c/wuffs-v0.2.c
#define WUFFS_VERSION_STRING "0.2.0+2078.20191219"
a3db4bd979663423de00309d1ba07d7fa8576845223d3e02764181bd6da23f90 release/c/wuffs-v0.3.c
#define WUFFS_VERSION_STRING "0.3.4+3401.20240419"
-1c90b9bbe662d6f7ca18b94bd56ee9156e00ca33ee350dba9ec1900f7e746d80 release/c/wuffs-v0.4.c
- #define WUFFS_VERSION_STRING "0.4.0-alpha.5+3771.20240709"
+b4803e34c57aa8ab2062c1609a07a01e2777d913af2f898e132bef6da0a25f97 release/c/wuffs-v0.4.c
+ #define WUFFS_VERSION_STRING "0.4.0-alpha.6+3789.20240804"