Remove gif.config_decoder
The original motivation (having a low-featured low-memory decoder just
for counting GIF frames) is obsolete: https://crbug.com/1132828
Binary size, before:
42264 gen/lib/c/clang-9-dynamic/wuffs-std-gif.lo
42392 gen/lib/c/clang-9-static/wuffs-std-gif.o
44824 gen/lib/c/gcc-dynamic/wuffs-std-gif.lo
45624 gen/lib/c/gcc-static/wuffs-std-gif.o
After:
26736 gen/lib/c/clang-9-dynamic/wuffs-std-gif.lo
26712 gen/lib/c/clang-9-static/wuffs-std-gif.o
27976 gen/lib/c/gcc-dynamic/wuffs-std-gif.lo
28392 gen/lib/c/gcc-static/wuffs-std-gif.o
diff --git a/release/c/wuffs-unsupported-snapshot.c b/release/c/wuffs-unsupported-snapshot.c
index dae44d4..d82edab 100644
--- a/release/c/wuffs-unsupported-snapshot.c
+++ b/release/c/wuffs-unsupported-snapshot.c
@@ -6750,8 +6750,6 @@
// ---------------- Struct Declarations
-typedef struct wuffs_gif__config_decoder__struct wuffs_gif__config_decoder;
-
typedef struct wuffs_gif__decoder__struct wuffs_gif__decoder;
// ---------------- Public Initializer Prototypes
@@ -6763,16 +6761,6 @@
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
-wuffs_gif__config_decoder__initialize(
- wuffs_gif__config_decoder* self,
- size_t sizeof_star_self,
- uint64_t wuffs_version,
- uint32_t options);
-
-size_t
-sizeof__wuffs_gif__config_decoder();
-
-wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
wuffs_gif__decoder__initialize(
wuffs_gif__decoder* self,
size_t sizeof_star_self,
@@ -6790,14 +6778,6 @@
// calling free on the returned pointer. That pointer is effectively a C++
// std::unique_ptr<T, decltype(&free)>.
-wuffs_gif__config_decoder*
-wuffs_gif__config_decoder__alloc();
-
-static inline wuffs_base__image_decoder*
-wuffs_gif__config_decoder__alloc_as__wuffs_base__image_decoder() {
- return (wuffs_base__image_decoder*)(wuffs_gif__config_decoder__alloc());
-}
-
wuffs_gif__decoder*
wuffs_gif__decoder__alloc();
@@ -6809,12 +6789,6 @@
// ---------------- Upcasts
static inline wuffs_base__image_decoder*
-wuffs_gif__config_decoder__upcast_as__wuffs_base__image_decoder(
- wuffs_gif__config_decoder* p) {
- return (wuffs_base__image_decoder*)p;
-}
-
-static inline wuffs_base__image_decoder*
wuffs_gif__decoder__upcast_as__wuffs_base__image_decoder(
wuffs_gif__decoder* p) {
return (wuffs_base__image_decoder*)p;
@@ -6823,72 +6797,6 @@
// ---------------- Public Function Prototypes
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
-wuffs_gif__config_decoder__set_quirk_enabled(
- wuffs_gif__config_decoder* self,
- uint32_t a_quirk,
- bool a_enabled);
-
-WUFFS_BASE__MAYBE_STATIC wuffs_base__status
-wuffs_gif__config_decoder__decode_image_config(
- wuffs_gif__config_decoder* self,
- wuffs_base__image_config* a_dst,
- wuffs_base__io_buffer* a_src);
-
-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
-wuffs_gif__config_decoder__set_report_metadata(
- wuffs_gif__config_decoder* self,
- uint32_t a_fourcc,
- bool a_report);
-
-WUFFS_BASE__MAYBE_STATIC wuffs_base__status
-wuffs_gif__config_decoder__tell_me_more(
- wuffs_gif__config_decoder* self,
- wuffs_base__io_buffer* a_dst,
- wuffs_base__more_information* a_minfo,
- wuffs_base__io_buffer* a_src);
-
-WUFFS_BASE__MAYBE_STATIC uint32_t
-wuffs_gif__config_decoder__num_animation_loops(
- const wuffs_gif__config_decoder* self);
-
-WUFFS_BASE__MAYBE_STATIC uint64_t
-wuffs_gif__config_decoder__num_decoded_frame_configs(
- const wuffs_gif__config_decoder* self);
-
-WUFFS_BASE__MAYBE_STATIC uint64_t
-wuffs_gif__config_decoder__num_decoded_frames(
- const wuffs_gif__config_decoder* self);
-
-WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
-wuffs_gif__config_decoder__frame_dirty_rect(
- const wuffs_gif__config_decoder* self);
-
-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
-wuffs_gif__config_decoder__workbuf_len(
- const wuffs_gif__config_decoder* self);
-
-WUFFS_BASE__MAYBE_STATIC wuffs_base__status
-wuffs_gif__config_decoder__restart_frame(
- wuffs_gif__config_decoder* self,
- uint64_t a_index,
- uint64_t a_io_position);
-
-WUFFS_BASE__MAYBE_STATIC wuffs_base__status
-wuffs_gif__config_decoder__decode_frame_config(
- wuffs_gif__config_decoder* self,
- wuffs_base__frame_config* a_dst,
- wuffs_base__io_buffer* a_src);
-
-WUFFS_BASE__MAYBE_STATIC wuffs_base__status
-wuffs_gif__config_decoder__decode_frame(
- wuffs_gif__config_decoder* self,
- wuffs_base__pixel_buffer* a_dst,
- wuffs_base__io_buffer* a_src,
- wuffs_base__pixel_blend a_blend,
- wuffs_base__slice_u8 a_workbuf,
- wuffs_base__decode_frame_options* a_opts);
-
-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
wuffs_gif__decoder__set_quirk_enabled(
wuffs_gif__decoder* self,
uint32_t a_quirk,
@@ -6963,245 +6871,6 @@
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
-struct wuffs_gif__config_decoder__struct {
- // Do not access the private_impl's or private_data's fields directly. There
- // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
- // the wuffs_foo__bar__baz functions.
- //
- // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
- // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
-
- struct {
- uint32_t magic;
- uint32_t active_coroutine;
- wuffs_base__vtable vtable_for__wuffs_base__image_decoder;
- wuffs_base__vtable null_vtable;
-
- uint32_t f_width;
- uint32_t f_height;
- uint8_t f_call_sequence;
- bool f_ignore_metadata;
- bool f_report_metadata_iccp;
- bool f_report_metadata_xmp;
- uint32_t f_metadata_fourcc;
- uint64_t f_metadata_io_position;
- bool f_quirks[7];
- bool f_delayed_num_decoded_frames;
- bool f_end_of_data;
- bool f_restarted;
- bool f_previous_lzw_decode_ended_abruptly;
- bool f_has_global_palette;
- uint8_t f_interlace;
- bool f_seen_num_loops;
- uint32_t f_num_loops;
- uint32_t f_background_color_u32_argb_premul;
- uint32_t f_black_color_u32_argb_premul;
- bool f_gc_has_transparent_index;
- uint8_t f_gc_transparent_index;
- uint8_t f_gc_disposal;
- uint64_t f_gc_duration;
- uint64_t f_frame_config_io_position;
- uint64_t f_num_decoded_frame_configs_value;
- uint64_t f_num_decoded_frames_value;
- uint32_t f_frame_rect_x0;
- uint32_t f_frame_rect_y0;
- uint32_t f_frame_rect_x1;
- uint32_t f_frame_rect_y1;
-
- uint32_t p_decode_image_config[1];
- uint32_t p_tell_me_more[1];
- uint32_t p_decode_frame_config[1];
- uint32_t p_skip_frame[1];
- uint32_t p_decode_up_to_id_part1[1];
- uint32_t p_decode_header[1];
- uint32_t p_decode_lsd[1];
- uint32_t p_decode_extension[1];
- uint32_t p_skip_blocks[1];
- uint32_t p_decode_ae[1];
- uint32_t p_decode_gc[1];
- uint32_t p_decode_id_part0[1];
- } private_impl;
-
- struct {
- uint8_t f_palettes[1][1024];
-
- struct {
- uint32_t v_background_color;
- } s_decode_frame_config[1];
- struct {
- uint64_t scratch;
- } s_skip_frame[1];
- struct {
- uint8_t v_c[6];
- uint32_t v_i;
- } s_decode_header[1];
- struct {
- uint8_t v_flags;
- uint8_t v_background_color_index;
- uint32_t v_num_palette_entries;
- uint32_t v_i;
- uint64_t scratch;
- } s_decode_lsd[1];
- struct {
- uint64_t scratch;
- } s_skip_blocks[1];
- struct {
- uint8_t v_block_size;
- bool v_is_animexts;
- bool v_is_netscape;
- bool v_is_iccp;
- bool v_is_xmp;
- uint64_t scratch;
- } s_decode_ae[1];
- struct {
- uint64_t scratch;
- } s_decode_gc[1];
- struct {
- uint64_t scratch;
- } s_decode_id_part0[1];
- } private_data;
-
-#ifdef __cplusplus
-#if (__cplusplus >= 201103L)
- using unique_ptr = std::unique_ptr<wuffs_gif__config_decoder, decltype(&free)>;
-
- // On failure, the alloc_etc functions return nullptr. They don't throw.
-
- static inline unique_ptr
- alloc() {
- return unique_ptr(wuffs_gif__config_decoder__alloc(), &free);
- }
-
- static inline wuffs_base__image_decoder::unique_ptr
- alloc_as__wuffs_base__image_decoder() {
- return wuffs_base__image_decoder::unique_ptr(
- wuffs_gif__config_decoder__alloc_as__wuffs_base__image_decoder(), &free);
- }
-#endif // (__cplusplus >= 201103L)
-
-#if (__cplusplus >= 201103L) && !defined(WUFFS_IMPLEMENTATION)
- // Disallow constructing or copying an object via standard C++ mechanisms,
- // e.g. the "new" operator, as this struct is intentionally opaque. Its total
- // size and field layout is not part of the public, stable, memory-safe API.
- // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
- // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
- // their first argument) rather than tweaking bar.private_impl.qux fields.
- //
- // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
- // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
- // order to provide convenience methods. These forward on "this", so that you
- // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
- wuffs_gif__config_decoder__struct() = delete;
- wuffs_gif__config_decoder__struct(const wuffs_gif__config_decoder__struct&) = delete;
- wuffs_gif__config_decoder__struct& operator=(
- const wuffs_gif__config_decoder__struct&) = delete;
-
- // As above, the size of the struct is not part of the public API, and unless
- // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
- // allocated, not stack allocated. Its size is not intended to be known at
- // compile time, but it is unfortunately divulged as a side effect of
- // defining C++ convenience methods. Use "sizeof__T()", calling the function,
- // instead of "sizeof T", invoking the operator. To make the two values
- // different, so that passing the latter will be rejected by the initialize
- // function, we add an arbitrary amount of dead weight.
- uint8_t dead_weight[123000000]; // 123 MB.
-#endif // (__cplusplus >= 201103L) && !defined(WUFFS_IMPLEMENTATION)
-
- inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
- initialize(
- size_t sizeof_star_self,
- uint64_t wuffs_version,
- uint32_t options) {
- return wuffs_gif__config_decoder__initialize(
- this, sizeof_star_self, wuffs_version, options);
- }
-
- inline wuffs_base__image_decoder*
- upcast_as__wuffs_base__image_decoder() {
- return (wuffs_base__image_decoder*)this;
- }
-
- inline wuffs_base__empty_struct
- set_quirk_enabled(
- uint32_t a_quirk,
- bool a_enabled) {
- return wuffs_gif__config_decoder__set_quirk_enabled(this, a_quirk, a_enabled);
- }
-
- inline wuffs_base__status
- decode_image_config(
- wuffs_base__image_config* a_dst,
- wuffs_base__io_buffer* a_src) {
- return wuffs_gif__config_decoder__decode_image_config(this, a_dst, a_src);
- }
-
- inline wuffs_base__empty_struct
- set_report_metadata(
- uint32_t a_fourcc,
- bool a_report) {
- return wuffs_gif__config_decoder__set_report_metadata(this, a_fourcc, a_report);
- }
-
- inline wuffs_base__status
- tell_me_more(
- wuffs_base__io_buffer* a_dst,
- wuffs_base__more_information* a_minfo,
- wuffs_base__io_buffer* a_src) {
- return wuffs_gif__config_decoder__tell_me_more(this, a_dst, a_minfo, a_src);
- }
-
- inline uint32_t
- num_animation_loops() const {
- return wuffs_gif__config_decoder__num_animation_loops(this);
- }
-
- inline uint64_t
- num_decoded_frame_configs() const {
- return wuffs_gif__config_decoder__num_decoded_frame_configs(this);
- }
-
- inline uint64_t
- num_decoded_frames() const {
- return wuffs_gif__config_decoder__num_decoded_frames(this);
- }
-
- inline wuffs_base__rect_ie_u32
- frame_dirty_rect() const {
- return wuffs_gif__config_decoder__frame_dirty_rect(this);
- }
-
- inline wuffs_base__range_ii_u64
- workbuf_len() const {
- return wuffs_gif__config_decoder__workbuf_len(this);
- }
-
- inline wuffs_base__status
- restart_frame(
- uint64_t a_index,
- uint64_t a_io_position) {
- return wuffs_gif__config_decoder__restart_frame(this, a_index, a_io_position);
- }
-
- inline wuffs_base__status
- decode_frame_config(
- wuffs_base__frame_config* a_dst,
- wuffs_base__io_buffer* a_src) {
- return wuffs_gif__config_decoder__decode_frame_config(this, a_dst, a_src);
- }
-
- inline wuffs_base__status
- decode_frame(
- wuffs_base__pixel_buffer* a_dst,
- wuffs_base__io_buffer* a_src,
- wuffs_base__pixel_blend a_blend,
- wuffs_base__slice_u8 a_workbuf,
- wuffs_base__decode_frame_options* a_opts) {
- return wuffs_gif__config_decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts);
- }
-
-#endif // __cplusplus
-}; // struct wuffs_gif__config_decoder__struct
-
struct wuffs_gif__decoder__struct {
// Do not access the private_impl's or private_data's fields directly. There
// is no API/ABI compatibility or safety guarantee if you do so. Instead, use
@@ -22729,55 +22398,6 @@
// ---------------- Private Function Prototypes
static wuffs_base__status
-wuffs_gif__config_decoder__skip_frame(
- wuffs_gif__config_decoder* self,
- wuffs_base__io_buffer* a_src);
-
-static wuffs_base__empty_struct
-wuffs_gif__config_decoder__reset_gc(
- wuffs_gif__config_decoder* self);
-
-static wuffs_base__status
-wuffs_gif__config_decoder__decode_up_to_id_part1(
- wuffs_gif__config_decoder* self,
- wuffs_base__io_buffer* a_src);
-
-static wuffs_base__status
-wuffs_gif__config_decoder__decode_header(
- wuffs_gif__config_decoder* self,
- wuffs_base__io_buffer* a_src);
-
-static wuffs_base__status
-wuffs_gif__config_decoder__decode_lsd(
- wuffs_gif__config_decoder* self,
- wuffs_base__io_buffer* a_src);
-
-static wuffs_base__status
-wuffs_gif__config_decoder__decode_extension(
- wuffs_gif__config_decoder* self,
- wuffs_base__io_buffer* a_src);
-
-static wuffs_base__status
-wuffs_gif__config_decoder__skip_blocks(
- wuffs_gif__config_decoder* self,
- wuffs_base__io_buffer* a_src);
-
-static wuffs_base__status
-wuffs_gif__config_decoder__decode_ae(
- wuffs_gif__config_decoder* self,
- wuffs_base__io_buffer* a_src);
-
-static wuffs_base__status
-wuffs_gif__config_decoder__decode_gc(
- wuffs_gif__config_decoder* self,
- wuffs_base__io_buffer* a_src);
-
-static wuffs_base__status
-wuffs_gif__config_decoder__decode_id_part0(
- wuffs_gif__config_decoder* self,
- wuffs_base__io_buffer* a_src);
-
-static wuffs_base__status
wuffs_gif__decoder__skip_frame(
wuffs_gif__decoder* self,
wuffs_base__io_buffer* a_src);
@@ -22849,40 +22469,6 @@
// ---------------- VTables
const wuffs_base__image_decoder__func_ptrs
-wuffs_gif__config_decoder__func_ptrs_for__wuffs_base__image_decoder = {
- (wuffs_base__status(*)(void*,
- wuffs_base__pixel_buffer*,
- wuffs_base__io_buffer*,
- wuffs_base__pixel_blend,
- wuffs_base__slice_u8,
- wuffs_base__decode_frame_options*))(&wuffs_gif__config_decoder__decode_frame),
- (wuffs_base__status(*)(void*,
- wuffs_base__frame_config*,
- wuffs_base__io_buffer*))(&wuffs_gif__config_decoder__decode_frame_config),
- (wuffs_base__status(*)(void*,
- wuffs_base__image_config*,
- wuffs_base__io_buffer*))(&wuffs_gif__config_decoder__decode_image_config),
- (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_gif__config_decoder__frame_dirty_rect),
- (uint32_t(*)(const void*))(&wuffs_gif__config_decoder__num_animation_loops),
- (uint64_t(*)(const void*))(&wuffs_gif__config_decoder__num_decoded_frame_configs),
- (uint64_t(*)(const void*))(&wuffs_gif__config_decoder__num_decoded_frames),
- (wuffs_base__status(*)(void*,
- uint64_t,
- uint64_t))(&wuffs_gif__config_decoder__restart_frame),
- (wuffs_base__empty_struct(*)(void*,
- uint32_t,
- bool))(&wuffs_gif__config_decoder__set_quirk_enabled),
- (wuffs_base__empty_struct(*)(void*,
- uint32_t,
- bool))(&wuffs_gif__config_decoder__set_report_metadata),
- (wuffs_base__status(*)(void*,
- wuffs_base__io_buffer*,
- wuffs_base__more_information*,
- wuffs_base__io_buffer*))(&wuffs_gif__config_decoder__tell_me_more),
- (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_gif__config_decoder__workbuf_len),
-};
-
-const wuffs_base__image_decoder__func_ptrs
wuffs_gif__decoder__func_ptrs_for__wuffs_base__image_decoder = {
(wuffs_base__status(*)(void*,
wuffs_base__pixel_buffer*,
@@ -22919,73 +22505,6 @@
// ---------------- Initializer Implementations
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
-wuffs_gif__config_decoder__initialize(
- wuffs_gif__config_decoder* self,
- size_t sizeof_star_self,
- uint64_t wuffs_version,
- uint32_t options){
- if (!self) {
- return wuffs_base__make_status(wuffs_base__error__bad_receiver);
- }
- if (sizeof(*self) != sizeof_star_self) {
- return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
- }
- if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
- (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
- return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
- }
-
- if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
- // The whole point of this if-check is to detect an uninitialized *self.
- // We disable the warning on GCC. Clang-5.0 does not have this warning.
-#if !defined(__clang__) && defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
-#endif
- if (self->private_impl.magic != 0) {
- return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
- }
-#if !defined(__clang__) && defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
- } else {
- if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
- memset(self, 0, sizeof(*self));
- options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
- } else {
- memset(&(self->private_impl), 0, sizeof(self->private_impl));
- }
- }
-
- self->private_impl.magic = WUFFS_BASE__MAGIC;
- self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name =
- wuffs_base__image_decoder__vtable_name;
- self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers =
- (const void*)(&wuffs_gif__config_decoder__func_ptrs_for__wuffs_base__image_decoder);
- return wuffs_base__make_status(NULL);
-}
-
-wuffs_gif__config_decoder*
-wuffs_gif__config_decoder__alloc() {
- wuffs_gif__config_decoder* x =
- (wuffs_gif__config_decoder*)(calloc(sizeof(wuffs_gif__config_decoder), 1));
- if (!x) {
- return NULL;
- }
- if (wuffs_gif__config_decoder__initialize(
- x, sizeof(wuffs_gif__config_decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
- free(x);
- return NULL;
- }
- return x;
-}
-
-size_t
-sizeof__wuffs_gif__config_decoder() {
- return sizeof(wuffs_gif__config_decoder);
-}
-
-wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
wuffs_gif__decoder__initialize(
wuffs_gif__decoder* self,
size_t sizeof_star_self,
@@ -23061,1773 +22580,6 @@
// ---------------- Function Implementations
-// -------- func gif.config_decoder.set_quirk_enabled
-
-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
-wuffs_gif__config_decoder__set_quirk_enabled(
- wuffs_gif__config_decoder* self,
- uint32_t a_quirk,
- bool a_enabled) {
- if (!self) {
- return wuffs_base__make_empty_struct();
- }
- if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
- return wuffs_base__make_empty_struct();
- }
-
- if ((self->private_impl.f_call_sequence == 0) && (a_quirk >= 1041635328)) {
- a_quirk -= 1041635328;
- if (a_quirk < 7) {
- self->private_impl.f_quirks[a_quirk] = a_enabled;
- }
- }
- return wuffs_base__make_empty_struct();
-}
-
-// -------- func gif.config_decoder.decode_image_config
-
-WUFFS_BASE__MAYBE_STATIC wuffs_base__status
-wuffs_gif__config_decoder__decode_image_config(
- wuffs_gif__config_decoder* self,
- wuffs_base__image_config* a_dst,
- wuffs_base__io_buffer* a_src) {
- if (!self) {
- return wuffs_base__make_status(wuffs_base__error__bad_receiver);
- }
- if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
- return wuffs_base__make_status(
- (self->private_impl.magic == WUFFS_BASE__DISABLED)
- ? wuffs_base__error__disabled_by_previous_error
- : wuffs_base__error__initialize_not_called);
- }
- if (!a_src) {
- self->private_impl.magic = WUFFS_BASE__DISABLED;
- return wuffs_base__make_status(wuffs_base__error__bad_argument);
- }
- if ((self->private_impl.active_coroutine != 0) &&
- (self->private_impl.active_coroutine != 1)) {
- self->private_impl.magic = WUFFS_BASE__DISABLED;
- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
- }
- self->private_impl.active_coroutine = 0;
- wuffs_base__status status = wuffs_base__make_status(NULL);
-
- bool v_ffio = false;
-
- uint32_t coro_susp_point = self->private_impl.p_decode_image_config[0];
- switch (coro_susp_point) {
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
-
- if (self->private_impl.f_call_sequence == 0) {
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
- status = wuffs_gif__config_decoder__decode_header(self, a_src);
- if (status.repr) {
- goto suspend;
- }
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
- status = wuffs_gif__config_decoder__decode_lsd(self, a_src);
- if (status.repr) {
- goto suspend;
- }
- } else if (self->private_impl.f_call_sequence != 2) {
- status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
- goto exit;
- }
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
- status = wuffs_gif__config_decoder__decode_up_to_id_part1(self, a_src);
- if (status.repr) {
- goto suspend;
- }
- v_ffio = ! self->private_impl.f_gc_has_transparent_index;
- if ( ! self->private_impl.f_quirks[2]) {
- v_ffio = (v_ffio &&
- (self->private_impl.f_frame_rect_x0 == 0) &&
- (self->private_impl.f_frame_rect_y0 == 0) &&
- (self->private_impl.f_frame_rect_x1 == self->private_impl.f_width) &&
- (self->private_impl.f_frame_rect_y1 == self->private_impl.f_height));
- } else if (v_ffio) {
- self->private_impl.f_black_color_u32_argb_premul = 4278190080;
- }
- if (self->private_impl.f_background_color_u32_argb_premul == 77) {
- self->private_impl.f_background_color_u32_argb_premul = self->private_impl.f_black_color_u32_argb_premul;
- }
- if (a_dst != NULL) {
- wuffs_base__image_config__set(
- a_dst,
- 2198077448,
- 0,
- self->private_impl.f_width,
- self->private_impl.f_height,
- self->private_impl.f_frame_config_io_position,
- v_ffio);
- }
- self->private_impl.f_call_sequence = 3;
-
- goto ok;
- ok:
- self->private_impl.p_decode_image_config[0] = 0;
- goto exit;
- }
-
- goto suspend;
- suspend:
- self->private_impl.p_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
-
- goto exit;
- exit:
- if (wuffs_base__status__is_error(&status)) {
- self->private_impl.magic = WUFFS_BASE__DISABLED;
- }
- return status;
-}
-
-// -------- func gif.config_decoder.set_report_metadata
-
-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
-wuffs_gif__config_decoder__set_report_metadata(
- wuffs_gif__config_decoder* self,
- uint32_t a_fourcc,
- bool a_report) {
- if (!self) {
- return wuffs_base__make_empty_struct();
- }
- if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
- return wuffs_base__make_empty_struct();
- }
-
- if (a_fourcc == 1229144912) {
- self->private_impl.f_report_metadata_iccp = a_report;
- } else if (a_fourcc == 1481461792) {
- self->private_impl.f_report_metadata_xmp = a_report;
- }
- return wuffs_base__make_empty_struct();
-}
-
-// -------- func gif.config_decoder.tell_me_more
-
-WUFFS_BASE__MAYBE_STATIC wuffs_base__status
-wuffs_gif__config_decoder__tell_me_more(
- wuffs_gif__config_decoder* self,
- wuffs_base__io_buffer* a_dst,
- wuffs_base__more_information* a_minfo,
- wuffs_base__io_buffer* a_src) {
- if (!self) {
- return wuffs_base__make_status(wuffs_base__error__bad_receiver);
- }
- if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
- return wuffs_base__make_status(
- (self->private_impl.magic == WUFFS_BASE__DISABLED)
- ? wuffs_base__error__disabled_by_previous_error
- : wuffs_base__error__initialize_not_called);
- }
- if (!a_dst || !a_src) {
- self->private_impl.magic = WUFFS_BASE__DISABLED;
- return wuffs_base__make_status(wuffs_base__error__bad_argument);
- }
- if ((self->private_impl.active_coroutine != 0) &&
- (self->private_impl.active_coroutine != 2)) {
- self->private_impl.magic = WUFFS_BASE__DISABLED;
- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
- }
- self->private_impl.active_coroutine = 0;
- wuffs_base__status status = wuffs_base__make_status(NULL);
-
- uint64_t v_chunk_length = 0;
-
- const uint8_t* iop_a_src = NULL;
- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
- if (a_src) {
- io0_a_src = a_src->data.ptr;
- io1_a_src = io0_a_src + a_src->meta.ri;
- iop_a_src = io1_a_src;
- io2_a_src = io0_a_src + a_src->meta.wi;
- }
-
- uint32_t coro_susp_point = self->private_impl.p_tell_me_more[0];
- switch (coro_susp_point) {
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
-
- if (self->private_impl.f_call_sequence != 1) {
- status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
- goto exit;
- }
- if (self->private_impl.f_metadata_fourcc == 0) {
- status = wuffs_base__make_status(wuffs_base__error__no_more_information);
- goto exit;
- }
- while (true) {
- label__0__continue:;
- while (true) {
- if (wuffs_base__u64__sat_add(a_src->meta.pos, ((uint64_t)(iop_a_src - io0_a_src))) != self->private_impl.f_metadata_io_position) {
- if (a_minfo != NULL) {
- wuffs_base__more_information__set(a_minfo,
- 2,
- 0,
- self->private_impl.f_metadata_io_position,
- 0,
- 0);
- }
- status = wuffs_base__make_status(wuffs_base__suspension__mispositioned_read);
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
- goto label__0__continue;
- }
- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0) {
- if (a_minfo != NULL) {
- wuffs_base__more_information__set(a_minfo,
- 0,
- 0,
- 0,
- 0,
- 0);
- }
- status = wuffs_base__make_status(wuffs_base__suspension__short_read);
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2);
- goto label__0__continue;
- }
- goto label__0__break;
- }
- label__0__break:;
- v_chunk_length = ((uint64_t)(wuffs_base__load_u8be__no_bounds_check(iop_a_src)));
- if (v_chunk_length <= 0) {
- (iop_a_src += 1, wuffs_base__make_empty_struct());
- goto label__1__break;
- }
- if (self->private_impl.f_metadata_fourcc == 1481461792) {
- v_chunk_length += 1;
- } else {
- (iop_a_src += 1, wuffs_base__make_empty_struct());
- }
- self->private_impl.f_metadata_io_position = wuffs_base__u64__sat_add(wuffs_base__u64__sat_add(a_src->meta.pos, ((uint64_t)(iop_a_src - io0_a_src))), v_chunk_length);
- if (a_minfo != NULL) {
- wuffs_base__more_information__set(a_minfo,
- 3,
- self->private_impl.f_metadata_fourcc,
- 0,
- wuffs_base__u64__sat_add(a_src->meta.pos, ((uint64_t)(iop_a_src - io0_a_src))),
- self->private_impl.f_metadata_io_position);
- }
- status = wuffs_base__make_status(wuffs_base__suspension__even_more_information);
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3);
- }
- label__1__break:;
- if (a_minfo != NULL) {
- wuffs_base__more_information__set(a_minfo,
- 3,
- self->private_impl.f_metadata_fourcc,
- 0,
- self->private_impl.f_metadata_io_position,
- self->private_impl.f_metadata_io_position);
- }
- self->private_impl.f_call_sequence = 2;
- self->private_impl.f_metadata_fourcc = 0;
- self->private_impl.f_metadata_io_position = 0;
- status = wuffs_base__make_status(NULL);
- goto ok;
-
- goto ok;
- ok:
- self->private_impl.p_tell_me_more[0] = 0;
- goto exit;
- }
-
- goto suspend;
- suspend:
- self->private_impl.p_tell_me_more[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0;
-
- goto exit;
- exit:
- if (a_src) {
- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
- }
-
- if (wuffs_base__status__is_error(&status)) {
- self->private_impl.magic = WUFFS_BASE__DISABLED;
- }
- return status;
-}
-
-// -------- func gif.config_decoder.num_animation_loops
-
-WUFFS_BASE__MAYBE_STATIC uint32_t
-wuffs_gif__config_decoder__num_animation_loops(
- const wuffs_gif__config_decoder* self) {
- if (!self) {
- return 0;
- }
- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
- (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
- return 0;
- }
-
- if (self->private_impl.f_seen_num_loops) {
- return self->private_impl.f_num_loops;
- }
- return 1;
-}
-
-// -------- func gif.config_decoder.num_decoded_frame_configs
-
-WUFFS_BASE__MAYBE_STATIC uint64_t
-wuffs_gif__config_decoder__num_decoded_frame_configs(
- const wuffs_gif__config_decoder* self) {
- if (!self) {
- return 0;
- }
- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
- (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
- return 0;
- }
-
- return self->private_impl.f_num_decoded_frame_configs_value;
-}
-
-// -------- func gif.config_decoder.num_decoded_frames
-
-WUFFS_BASE__MAYBE_STATIC uint64_t
-wuffs_gif__config_decoder__num_decoded_frames(
- const wuffs_gif__config_decoder* self) {
- if (!self) {
- return 0;
- }
- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
- (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
- return 0;
- }
-
- return self->private_impl.f_num_decoded_frames_value;
-}
-
-// -------- func gif.config_decoder.frame_dirty_rect
-
-WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
-wuffs_gif__config_decoder__frame_dirty_rect(
- const wuffs_gif__config_decoder* self) {
- if (!self) {
- return wuffs_base__utility__empty_rect_ie_u32();
- }
- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
- (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
- return wuffs_base__utility__empty_rect_ie_u32();
- }
-
- return wuffs_base__utility__empty_rect_ie_u32();
-}
-
-// -------- func gif.config_decoder.workbuf_len
-
-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
-wuffs_gif__config_decoder__workbuf_len(
- const wuffs_gif__config_decoder* self) {
- if (!self) {
- return wuffs_base__utility__empty_range_ii_u64();
- }
- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
- (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
- return wuffs_base__utility__empty_range_ii_u64();
- }
-
- return wuffs_base__utility__empty_range_ii_u64();
-}
-
-// -------- func gif.config_decoder.restart_frame
-
-WUFFS_BASE__MAYBE_STATIC wuffs_base__status
-wuffs_gif__config_decoder__restart_frame(
- wuffs_gif__config_decoder* self,
- uint64_t a_index,
- uint64_t a_io_position) {
- if (!self) {
- return wuffs_base__make_status(wuffs_base__error__bad_receiver);
- }
- if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
- return wuffs_base__make_status(
- (self->private_impl.magic == WUFFS_BASE__DISABLED)
- ? wuffs_base__error__disabled_by_previous_error
- : wuffs_base__error__initialize_not_called);
- }
-
- if (self->private_impl.f_call_sequence == 0) {
- return wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
- }
- self->private_impl.f_delayed_num_decoded_frames = false;
- self->private_impl.f_end_of_data = false;
- self->private_impl.f_restarted = true;
- self->private_impl.f_frame_config_io_position = a_io_position;
- self->private_impl.f_num_decoded_frame_configs_value = a_index;
- self->private_impl.f_num_decoded_frames_value = a_index;
- wuffs_gif__config_decoder__reset_gc(self);
- return wuffs_base__make_status(NULL);
-}
-
-// -------- func gif.config_decoder.decode_frame_config
-
-WUFFS_BASE__MAYBE_STATIC wuffs_base__status
-wuffs_gif__config_decoder__decode_frame_config(
- wuffs_gif__config_decoder* self,
- wuffs_base__frame_config* a_dst,
- wuffs_base__io_buffer* a_src) {
- if (!self) {
- return wuffs_base__make_status(wuffs_base__error__bad_receiver);
- }
- if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
- return wuffs_base__make_status(
- (self->private_impl.magic == WUFFS_BASE__DISABLED)
- ? wuffs_base__error__disabled_by_previous_error
- : wuffs_base__error__initialize_not_called);
- }
- if (!a_src) {
- self->private_impl.magic = WUFFS_BASE__DISABLED;
- return wuffs_base__make_status(wuffs_base__error__bad_argument);
- }
- if ((self->private_impl.active_coroutine != 0) &&
- (self->private_impl.active_coroutine != 3)) {
- self->private_impl.magic = WUFFS_BASE__DISABLED;
- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
- }
- self->private_impl.active_coroutine = 0;
- wuffs_base__status status = wuffs_base__make_status(NULL);
-
- uint32_t v_background_color = 0;
- uint8_t v_flags = 0;
-
- const uint8_t* iop_a_src = NULL;
- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
- if (a_src) {
- io0_a_src = a_src->data.ptr;
- io1_a_src = io0_a_src + a_src->meta.ri;
- iop_a_src = io1_a_src;
- io2_a_src = io0_a_src + a_src->meta.wi;
- }
-
- uint32_t coro_susp_point = self->private_impl.p_decode_frame_config[0];
- if (coro_susp_point) {
- v_background_color = self->private_data.s_decode_frame_config[0].v_background_color;
- }
- switch (coro_susp_point) {
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
-
- self->private_impl.f_ignore_metadata = true;
- if ( ! self->private_impl.f_end_of_data) {
- if (self->private_impl.f_call_sequence == 0) {
- if (a_src) {
- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
- }
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
- status = wuffs_gif__config_decoder__decode_image_config(self, NULL, a_src);
- if (a_src) {
- iop_a_src = a_src->data.ptr + a_src->meta.ri;
- }
- if (status.repr) {
- goto suspend;
- }
- } else if (self->private_impl.f_call_sequence != 3) {
- if (self->private_impl.f_call_sequence == 4) {
- if (a_src) {
- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
- }
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
- status = wuffs_gif__config_decoder__skip_frame(self, a_src);
- if (a_src) {
- iop_a_src = a_src->data.ptr + a_src->meta.ri;
- }
- if (status.repr) {
- goto suspend;
- }
- }
- if (a_src) {
- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
- }
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
- status = wuffs_gif__config_decoder__decode_up_to_id_part1(self, a_src);
- if (a_src) {
- iop_a_src = a_src->data.ptr + a_src->meta.ri;
- }
- if (status.repr) {
- goto suspend;
- }
- }
- }
- if (self->private_impl.f_end_of_data) {
- status = wuffs_base__make_status(wuffs_base__note__end_of_data);
- goto ok;
- }
- v_background_color = self->private_impl.f_black_color_u32_argb_premul;
- if ( ! self->private_impl.f_gc_has_transparent_index) {
- v_background_color = self->private_impl.f_background_color_u32_argb_premul;
- if (self->private_impl.f_quirks[1] && (self->private_impl.f_num_decoded_frame_configs_value == 0)) {
- while (((uint64_t)(io2_a_src - iop_a_src)) <= 0) {
- status = wuffs_base__make_status(wuffs_base__suspension__short_read);
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4);
- }
- v_flags = wuffs_base__load_u8be__no_bounds_check(iop_a_src);
- if ((v_flags & 128) != 0) {
- v_background_color = self->private_impl.f_black_color_u32_argb_premul;
- }
- }
- }
- if (a_dst != NULL) {
- wuffs_base__frame_config__set(
- a_dst,
- wuffs_base__utility__make_rect_ie_u32(
- wuffs_base__u32__min(self->private_impl.f_frame_rect_x0, self->private_impl.f_width),
- wuffs_base__u32__min(self->private_impl.f_frame_rect_y0, self->private_impl.f_height),
- wuffs_base__u32__min(self->private_impl.f_frame_rect_x1, self->private_impl.f_width),
- wuffs_base__u32__min(self->private_impl.f_frame_rect_y1, self->private_impl.f_height)),
- ((wuffs_base__flicks)(self->private_impl.f_gc_duration)),
- self->private_impl.f_num_decoded_frame_configs_value,
- self->private_impl.f_frame_config_io_position,
- self->private_impl.f_gc_disposal,
- ! self->private_impl.f_gc_has_transparent_index,
- false,
- v_background_color);
- }
- wuffs_base__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frame_configs_value, 1);
- self->private_impl.f_call_sequence = 4;
-
- goto ok;
- ok:
- self->private_impl.p_decode_frame_config[0] = 0;
- goto exit;
- }
-
- goto suspend;
- suspend:
- self->private_impl.p_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0;
- self->private_data.s_decode_frame_config[0].v_background_color = v_background_color;
-
- goto exit;
- exit:
- if (a_src) {
- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
- }
-
- if (wuffs_base__status__is_error(&status)) {
- self->private_impl.magic = WUFFS_BASE__DISABLED;
- }
- return status;
-}
-
-// -------- func gif.config_decoder.skip_frame
-
-static wuffs_base__status
-wuffs_gif__config_decoder__skip_frame(
- wuffs_gif__config_decoder* self,
- wuffs_base__io_buffer* a_src) {
- wuffs_base__status status = wuffs_base__make_status(NULL);
-
- uint8_t v_flags = 0;
- uint8_t v_lw = 0;
-
- const uint8_t* iop_a_src = NULL;
- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
- if (a_src) {
- io0_a_src = a_src->data.ptr;
- io1_a_src = io0_a_src + a_src->meta.ri;
- iop_a_src = io1_a_src;
- io2_a_src = io0_a_src + a_src->meta.wi;
- }
-
- uint32_t coro_susp_point = self->private_impl.p_skip_frame[0];
- switch (coro_susp_point) {
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
-
- {
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
- status = wuffs_base__make_status(wuffs_base__suspension__short_read);
- goto suspend;
- }
- uint8_t t_0 = *iop_a_src++;
- v_flags = t_0;
- }
- if ((v_flags & 128) != 0) {
- self->private_data.s_skip_frame[0].scratch = (((uint32_t)(3)) << (1 + (v_flags & 7)));
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
- if (self->private_data.s_skip_frame[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
- self->private_data.s_skip_frame[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src));
- iop_a_src = io2_a_src;
- status = wuffs_base__make_status(wuffs_base__suspension__short_read);
- goto suspend;
- }
- iop_a_src += self->private_data.s_skip_frame[0].scratch;
- }
- {
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
- status = wuffs_base__make_status(wuffs_base__suspension__short_read);
- goto suspend;
- }
- uint8_t t_1 = *iop_a_src++;
- v_lw = t_1;
- }
- if (v_lw > 8) {
- status = wuffs_base__make_status(wuffs_gif__error__bad_literal_width);
- goto exit;
- }
- if (a_src) {
- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
- }
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
- status = wuffs_gif__config_decoder__skip_blocks(self, a_src);
- if (a_src) {
- iop_a_src = a_src->data.ptr + a_src->meta.ri;
- }
- if (status.repr) {
- goto suspend;
- }
- if (self->private_impl.f_quirks[0]) {
- self->private_impl.f_delayed_num_decoded_frames = true;
- } else {
- wuffs_base__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1);
- }
- wuffs_gif__config_decoder__reset_gc(self);
-
- goto ok;
- ok:
- self->private_impl.p_skip_frame[0] = 0;
- goto exit;
- }
-
- goto suspend;
- suspend:
- self->private_impl.p_skip_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
-
- goto exit;
- exit:
- if (a_src) {
- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
- }
-
- return status;
-}
-
-// -------- func gif.config_decoder.decode_frame
-
-WUFFS_BASE__MAYBE_STATIC wuffs_base__status
-wuffs_gif__config_decoder__decode_frame(
- wuffs_gif__config_decoder* self,
- wuffs_base__pixel_buffer* a_dst,
- wuffs_base__io_buffer* a_src,
- wuffs_base__pixel_blend a_blend,
- wuffs_base__slice_u8 a_workbuf,
- wuffs_base__decode_frame_options* a_opts) {
- if (!self) {
- return wuffs_base__make_status(wuffs_base__error__bad_receiver);
- }
- if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
- return wuffs_base__make_status(
- (self->private_impl.magic == WUFFS_BASE__DISABLED)
- ? wuffs_base__error__disabled_by_previous_error
- : wuffs_base__error__initialize_not_called);
- }
- if (!a_dst || !a_src) {
- self->private_impl.magic = WUFFS_BASE__DISABLED;
- return wuffs_base__make_status(wuffs_base__error__bad_argument);
- }
- if ((self->private_impl.active_coroutine != 0) &&
- (self->private_impl.active_coroutine != 4)) {
- self->private_impl.magic = WUFFS_BASE__DISABLED;
- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
- }
- self->private_impl.active_coroutine = 0;
- wuffs_base__status status = wuffs_base__make_status(NULL);
-
- status = wuffs_base__make_status(wuffs_base__error__unsupported_method);
- goto exit;
-
- goto ok;
- ok:
- goto exit;
- exit:
- if (wuffs_base__status__is_error(&status)) {
- self->private_impl.magic = WUFFS_BASE__DISABLED;
- }
- return status;
-}
-
-// -------- func gif.config_decoder.reset_gc
-
-static wuffs_base__empty_struct
-wuffs_gif__config_decoder__reset_gc(
- wuffs_gif__config_decoder* self) {
- self->private_impl.f_call_sequence = 5;
- self->private_impl.f_gc_has_transparent_index = false;
- self->private_impl.f_gc_transparent_index = 0;
- self->private_impl.f_gc_disposal = 0;
- self->private_impl.f_gc_duration = 0;
- return wuffs_base__make_empty_struct();
-}
-
-// -------- func gif.config_decoder.decode_up_to_id_part1
-
-static wuffs_base__status
-wuffs_gif__config_decoder__decode_up_to_id_part1(
- wuffs_gif__config_decoder* self,
- wuffs_base__io_buffer* a_src) {
- wuffs_base__status status = wuffs_base__make_status(NULL);
-
- uint8_t v_block_type = 0;
-
- const uint8_t* iop_a_src = NULL;
- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
- if (a_src) {
- io0_a_src = a_src->data.ptr;
- io1_a_src = io0_a_src + a_src->meta.ri;
- iop_a_src = io1_a_src;
- io2_a_src = io0_a_src + a_src->meta.wi;
- }
-
- uint32_t coro_susp_point = self->private_impl.p_decode_up_to_id_part1[0];
- switch (coro_susp_point) {
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
-
- if ( ! self->private_impl.f_restarted) {
- if (self->private_impl.f_call_sequence != 2) {
- self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add(a_src->meta.pos, ((uint64_t)(iop_a_src - io0_a_src)));
- }
- } else if (self->private_impl.f_frame_config_io_position != wuffs_base__u64__sat_add(a_src->meta.pos, ((uint64_t)(iop_a_src - io0_a_src)))) {
- status = wuffs_base__make_status(wuffs_base__error__bad_restart);
- goto exit;
- } else {
- self->private_impl.f_restarted = false;
- }
- while (true) {
- {
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
- status = wuffs_base__make_status(wuffs_base__suspension__short_read);
- goto suspend;
- }
- uint8_t t_0 = *iop_a_src++;
- v_block_type = t_0;
- }
- if (v_block_type == 33) {
- if (a_src) {
- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
- }
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
- status = wuffs_gif__config_decoder__decode_extension(self, a_src);
- if (a_src) {
- iop_a_src = a_src->data.ptr + a_src->meta.ri;
- }
- if (status.repr) {
- goto suspend;
- }
- } else if (v_block_type == 44) {
- if (self->private_impl.f_delayed_num_decoded_frames) {
- self->private_impl.f_delayed_num_decoded_frames = false;
- wuffs_base__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1);
- }
- if (a_src) {
- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
- }
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
- status = wuffs_gif__config_decoder__decode_id_part0(self, a_src);
- if (a_src) {
- iop_a_src = a_src->data.ptr + a_src->meta.ri;
- }
- if (status.repr) {
- goto suspend;
- }
- goto label__0__break;
- } else {
- if (self->private_impl.f_delayed_num_decoded_frames) {
- self->private_impl.f_delayed_num_decoded_frames = false;
- wuffs_base__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1);
- }
- self->private_impl.f_end_of_data = true;
- goto label__0__break;
- }
- }
- label__0__break:;
-
- goto ok;
- ok:
- self->private_impl.p_decode_up_to_id_part1[0] = 0;
- goto exit;
- }
-
- goto suspend;
- suspend:
- self->private_impl.p_decode_up_to_id_part1[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
-
- goto exit;
- exit:
- if (a_src) {
- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
- }
-
- return status;
-}
-
-// -------- func gif.config_decoder.decode_header
-
-static wuffs_base__status
-wuffs_gif__config_decoder__decode_header(
- wuffs_gif__config_decoder* self,
- wuffs_base__io_buffer* a_src) {
- wuffs_base__status status = wuffs_base__make_status(NULL);
-
- uint8_t v_c[6] = {0};
- uint32_t v_i = 0;
-
- const uint8_t* iop_a_src = NULL;
- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
- if (a_src) {
- io0_a_src = a_src->data.ptr;
- io1_a_src = io0_a_src + a_src->meta.ri;
- iop_a_src = io1_a_src;
- io2_a_src = io0_a_src + a_src->meta.wi;
- }
-
- uint32_t coro_susp_point = self->private_impl.p_decode_header[0];
- if (coro_susp_point) {
- memcpy(v_c, self->private_data.s_decode_header[0].v_c, sizeof(v_c));
- v_i = self->private_data.s_decode_header[0].v_i;
- }
- switch (coro_susp_point) {
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
-
- while (v_i < 6) {
- {
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
- status = wuffs_base__make_status(wuffs_base__suspension__short_read);
- goto suspend;
- }
- uint8_t t_0 = *iop_a_src++;
- v_c[v_i] = t_0;
- }
- v_i += 1;
- }
- if ((v_c[0] != 71) ||
- (v_c[1] != 73) ||
- (v_c[2] != 70) ||
- (v_c[3] != 56) ||
- ((v_c[4] != 55) && (v_c[4] != 57)) ||
- (v_c[5] != 97)) {
- status = wuffs_base__make_status(wuffs_gif__error__bad_header);
- goto exit;
- }
-
- goto ok;
- ok:
- self->private_impl.p_decode_header[0] = 0;
- goto exit;
- }
-
- goto suspend;
- suspend:
- self->private_impl.p_decode_header[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
- memcpy(self->private_data.s_decode_header[0].v_c, v_c, sizeof(v_c));
- self->private_data.s_decode_header[0].v_i = v_i;
-
- goto exit;
- exit:
- if (a_src) {
- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
- }
-
- return status;
-}
-
-// -------- func gif.config_decoder.decode_lsd
-
-static wuffs_base__status
-wuffs_gif__config_decoder__decode_lsd(
- wuffs_gif__config_decoder* self,
- wuffs_base__io_buffer* a_src) {
- wuffs_base__status status = wuffs_base__make_status(NULL);
-
- uint8_t v_flags = 0;
- uint8_t v_background_color_index = 0;
- uint32_t v_num_palette_entries = 0;
- uint32_t v_i = 0;
- uint32_t v_j = 0;
- uint32_t v_argb = 0;
-
- const uint8_t* iop_a_src = NULL;
- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
- if (a_src) {
- io0_a_src = a_src->data.ptr;
- io1_a_src = io0_a_src + a_src->meta.ri;
- iop_a_src = io1_a_src;
- io2_a_src = io0_a_src + a_src->meta.wi;
- }
-
- uint32_t coro_susp_point = self->private_impl.p_decode_lsd[0];
- if (coro_susp_point) {
- v_flags = self->private_data.s_decode_lsd[0].v_flags;
- v_background_color_index = self->private_data.s_decode_lsd[0].v_background_color_index;
- v_num_palette_entries = self->private_data.s_decode_lsd[0].v_num_palette_entries;
- v_i = self->private_data.s_decode_lsd[0].v_i;
- }
- switch (coro_susp_point) {
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
-
- {
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
- uint32_t t_0;
- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
- t_0 = ((uint32_t)(wuffs_base__load_u16le__no_bounds_check(iop_a_src)));
- iop_a_src += 2;
- } else {
- self->private_data.s_decode_lsd[0].scratch = 0;
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
- while (true) {
- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
- status = wuffs_base__make_status(wuffs_base__suspension__short_read);
- goto suspend;
- }
- uint64_t* scratch = &self->private_data.s_decode_lsd[0].scratch;
- uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
- *scratch <<= 8;
- *scratch >>= 8;
- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
- if (num_bits_0 == 8) {
- t_0 = ((uint32_t)(*scratch));
- break;
- }
- num_bits_0 += 8;
- *scratch |= ((uint64_t)(num_bits_0)) << 56;
- }
- }
- self->private_impl.f_width = t_0;
- }
- {
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
- uint32_t t_1;
- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
- t_1 = ((uint32_t)(wuffs_base__load_u16le__no_bounds_check(iop_a_src)));
- iop_a_src += 2;
- } else {
- self->private_data.s_decode_lsd[0].scratch = 0;
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
- while (true) {
- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
- status = wuffs_base__make_status(wuffs_base__suspension__short_read);
- goto suspend;
- }
- uint64_t* scratch = &self->private_data.s_decode_lsd[0].scratch;
- uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
- *scratch <<= 8;
- *scratch >>= 8;
- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
- if (num_bits_1 == 8) {
- t_1 = ((uint32_t)(*scratch));
- break;
- }
- num_bits_1 += 8;
- *scratch |= ((uint64_t)(num_bits_1)) << 56;
- }
- }
- self->private_impl.f_height = t_1;
- }
- {
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
- status = wuffs_base__make_status(wuffs_base__suspension__short_read);
- goto suspend;
- }
- uint8_t t_2 = *iop_a_src++;
- v_flags = t_2;
- }
- {
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
- status = wuffs_base__make_status(wuffs_base__suspension__short_read);
- goto suspend;
- }
- uint8_t t_3 = *iop_a_src++;
- v_background_color_index = t_3;
- }
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
- status = wuffs_base__make_status(wuffs_base__suspension__short_read);
- goto suspend;
- }
- iop_a_src++;
- v_i = 0;
- self->private_impl.f_has_global_palette = ((v_flags & 128) != 0);
- if (self->private_impl.f_has_global_palette) {
- v_num_palette_entries = (((uint32_t)(1)) << (1 + (v_flags & 7)));
- while (v_i < v_num_palette_entries) {
- {
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
- uint32_t t_4;
- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) {
- t_4 = ((uint32_t)(wuffs_base__load_u24be__no_bounds_check(iop_a_src)));
- iop_a_src += 3;
- } else {
- self->private_data.s_decode_lsd[0].scratch = 0;
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
- while (true) {
- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
- status = wuffs_base__make_status(wuffs_base__suspension__short_read);
- goto suspend;
- }
- uint64_t* scratch = &self->private_data.s_decode_lsd[0].scratch;
- uint32_t num_bits_4 = ((uint32_t)(*scratch & 0xFF));
- *scratch >>= 8;
- *scratch <<= 8;
- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_4);
- if (num_bits_4 == 16) {
- t_4 = ((uint32_t)(*scratch >> 40));
- break;
- }
- num_bits_4 += 8;
- *scratch |= ((uint64_t)(num_bits_4));
- }
- }
- v_argb = t_4;
- }
- v_argb |= 4278190080;
- self->private_data.f_palettes[0][((4 * v_i) + 0)] = ((uint8_t)(((v_argb >> 0) & 255)));
- self->private_data.f_palettes[0][((4 * v_i) + 1)] = ((uint8_t)(((v_argb >> 8) & 255)));
- self->private_data.f_palettes[0][((4 * v_i) + 2)] = ((uint8_t)(((v_argb >> 16) & 255)));
- self->private_data.f_palettes[0][((4 * v_i) + 3)] = ((uint8_t)(((v_argb >> 24) & 255)));
- v_i += 1;
- }
- if (self->private_impl.f_quirks[2]) {
- if ((v_background_color_index != 0) && (((uint32_t)(v_background_color_index)) < v_num_palette_entries)) {
- v_j = (4 * ((uint32_t)(v_background_color_index)));
- self->private_impl.f_background_color_u32_argb_premul = ((((uint32_t)(self->private_data.f_palettes[0][(v_j + 0)])) << 0) |
- (((uint32_t)(self->private_data.f_palettes[0][(v_j + 1)])) << 8) |
- (((uint32_t)(self->private_data.f_palettes[0][(v_j + 2)])) << 16) |
- (((uint32_t)(self->private_data.f_palettes[0][(v_j + 3)])) << 24));
- } else {
- self->private_impl.f_background_color_u32_argb_premul = 77;
- }
- }
- }
- while (v_i < 256) {
- self->private_data.f_palettes[0][((4 * v_i) + 0)] = 0;
- self->private_data.f_palettes[0][((4 * v_i) + 1)] = 0;
- self->private_data.f_palettes[0][((4 * v_i) + 2)] = 0;
- self->private_data.f_palettes[0][((4 * v_i) + 3)] = 255;
- v_i += 1;
- }
-
- goto ok;
- ok:
- self->private_impl.p_decode_lsd[0] = 0;
- goto exit;
- }
-
- goto suspend;
- suspend:
- self->private_impl.p_decode_lsd[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
- self->private_data.s_decode_lsd[0].v_flags = v_flags;
- self->private_data.s_decode_lsd[0].v_background_color_index = v_background_color_index;
- self->private_data.s_decode_lsd[0].v_num_palette_entries = v_num_palette_entries;
- self->private_data.s_decode_lsd[0].v_i = v_i;
-
- goto exit;
- exit:
- if (a_src) {
- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
- }
-
- return status;
-}
-
-// -------- func gif.config_decoder.decode_extension
-
-static wuffs_base__status
-wuffs_gif__config_decoder__decode_extension(
- wuffs_gif__config_decoder* self,
- wuffs_base__io_buffer* a_src) {
- wuffs_base__status status = wuffs_base__make_status(NULL);
-
- uint8_t v_label = 0;
-
- const uint8_t* iop_a_src = NULL;
- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
- if (a_src) {
- io0_a_src = a_src->data.ptr;
- io1_a_src = io0_a_src + a_src->meta.ri;
- iop_a_src = io1_a_src;
- io2_a_src = io0_a_src + a_src->meta.wi;
- }
-
- uint32_t coro_susp_point = self->private_impl.p_decode_extension[0];
- switch (coro_susp_point) {
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
-
- {
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
- status = wuffs_base__make_status(wuffs_base__suspension__short_read);
- goto suspend;
- }
- uint8_t t_0 = *iop_a_src++;
- v_label = t_0;
- }
- if (v_label == 249) {
- if (a_src) {
- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
- }
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
- status = wuffs_gif__config_decoder__decode_gc(self, a_src);
- if (a_src) {
- iop_a_src = a_src->data.ptr + a_src->meta.ri;
- }
- if (status.repr) {
- goto suspend;
- }
- status = wuffs_base__make_status(NULL);
- goto ok;
- } else if (v_label == 255) {
- if (a_src) {
- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
- }
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
- status = wuffs_gif__config_decoder__decode_ae(self, a_src);
- if (a_src) {
- iop_a_src = a_src->data.ptr + a_src->meta.ri;
- }
- if (status.repr) {
- goto suspend;
- }
- status = wuffs_base__make_status(NULL);
- goto ok;
- }
- if (a_src) {
- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
- }
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
- status = wuffs_gif__config_decoder__skip_blocks(self, a_src);
- if (a_src) {
- iop_a_src = a_src->data.ptr + a_src->meta.ri;
- }
- if (status.repr) {
- goto suspend;
- }
-
- goto ok;
- ok:
- self->private_impl.p_decode_extension[0] = 0;
- goto exit;
- }
-
- goto suspend;
- suspend:
- self->private_impl.p_decode_extension[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
-
- goto exit;
- exit:
- if (a_src) {
- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
- }
-
- return status;
-}
-
-// -------- func gif.config_decoder.skip_blocks
-
-static wuffs_base__status
-wuffs_gif__config_decoder__skip_blocks(
- wuffs_gif__config_decoder* self,
- wuffs_base__io_buffer* a_src) {
- wuffs_base__status status = wuffs_base__make_status(NULL);
-
- uint8_t v_block_size = 0;
-
- const uint8_t* iop_a_src = NULL;
- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
- if (a_src) {
- io0_a_src = a_src->data.ptr;
- io1_a_src = io0_a_src + a_src->meta.ri;
- iop_a_src = io1_a_src;
- io2_a_src = io0_a_src + a_src->meta.wi;
- }
-
- uint32_t coro_susp_point = self->private_impl.p_skip_blocks[0];
- switch (coro_susp_point) {
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
-
- while (true) {
- {
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
- status = wuffs_base__make_status(wuffs_base__suspension__short_read);
- goto suspend;
- }
- uint8_t t_0 = *iop_a_src++;
- v_block_size = t_0;
- }
- if (v_block_size == 0) {
- status = wuffs_base__make_status(NULL);
- goto ok;
- }
- self->private_data.s_skip_blocks[0].scratch = ((uint32_t)(v_block_size));
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
- if (self->private_data.s_skip_blocks[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
- self->private_data.s_skip_blocks[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src));
- iop_a_src = io2_a_src;
- status = wuffs_base__make_status(wuffs_base__suspension__short_read);
- goto suspend;
- }
- iop_a_src += self->private_data.s_skip_blocks[0].scratch;
- }
-
- goto ok;
- ok:
- self->private_impl.p_skip_blocks[0] = 0;
- goto exit;
- }
-
- goto suspend;
- suspend:
- self->private_impl.p_skip_blocks[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
-
- goto exit;
- exit:
- if (a_src) {
- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
- }
-
- return status;
-}
-
-// -------- func gif.config_decoder.decode_ae
-
-static wuffs_base__status
-wuffs_gif__config_decoder__decode_ae(
- wuffs_gif__config_decoder* self,
- wuffs_base__io_buffer* a_src) {
- wuffs_base__status status = wuffs_base__make_status(NULL);
-
- uint8_t v_c = 0;
- uint8_t v_block_size = 0;
- bool v_is_animexts = false;
- bool v_is_netscape = false;
- bool v_is_iccp = false;
- bool v_is_xmp = false;
-
- const uint8_t* iop_a_src = NULL;
- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
- if (a_src) {
- io0_a_src = a_src->data.ptr;
- io1_a_src = io0_a_src + a_src->meta.ri;
- iop_a_src = io1_a_src;
- io2_a_src = io0_a_src + a_src->meta.wi;
- }
-
- uint32_t coro_susp_point = self->private_impl.p_decode_ae[0];
- if (coro_susp_point) {
- v_block_size = self->private_data.s_decode_ae[0].v_block_size;
- v_is_animexts = self->private_data.s_decode_ae[0].v_is_animexts;
- v_is_netscape = self->private_data.s_decode_ae[0].v_is_netscape;
- v_is_iccp = self->private_data.s_decode_ae[0].v_is_iccp;
- v_is_xmp = self->private_data.s_decode_ae[0].v_is_xmp;
- }
- switch (coro_susp_point) {
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
-
- while (true) {
- if (self->private_impl.f_metadata_fourcc != 0) {
- status = wuffs_base__make_status(wuffs_base__note__metadata_reported);
- goto ok;
- }
- {
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
- status = wuffs_base__make_status(wuffs_base__suspension__short_read);
- goto suspend;
- }
- uint8_t t_0 = *iop_a_src++;
- v_block_size = t_0;
- }
- if (v_block_size == 0) {
- status = wuffs_base__make_status(NULL);
- goto ok;
- }
- if (v_block_size != 11) {
- self->private_data.s_decode_ae[0].scratch = ((uint32_t)(v_block_size));
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
- if (self->private_data.s_decode_ae[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
- self->private_data.s_decode_ae[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src));
- iop_a_src = io2_a_src;
- status = wuffs_base__make_status(wuffs_base__suspension__short_read);
- goto suspend;
- }
- iop_a_src += self->private_data.s_decode_ae[0].scratch;
- goto label__goto_done__break;
- }
- v_is_animexts = true;
- v_is_netscape = true;
- v_is_iccp = true;
- v_is_xmp = true;
- v_block_size = 0;
- while (v_block_size < 11) {
- {
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
- status = wuffs_base__make_status(wuffs_base__suspension__short_read);
- goto suspend;
- }
- uint8_t t_1 = *iop_a_src++;
- v_c = t_1;
- }
- v_is_animexts = (v_is_animexts && (v_c == WUFFS_GIF__ANIMEXTS1DOT0[v_block_size]));
- v_is_netscape = (v_is_netscape && (v_c == WUFFS_GIF__NETSCAPE2DOT0[v_block_size]));
- v_is_iccp = (v_is_iccp && (v_c == WUFFS_GIF__ICCRGBG1012[v_block_size]));
- v_is_xmp = (v_is_xmp && (v_c == WUFFS_GIF__XMPDATAXMP[v_block_size]));
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
- v_block_size += 1;
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
- }
- if (v_is_animexts || v_is_netscape) {
- {
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
- status = wuffs_base__make_status(wuffs_base__suspension__short_read);
- goto suspend;
- }
- uint8_t t_2 = *iop_a_src++;
- v_block_size = t_2;
- }
- if (v_block_size != 3) {
- self->private_data.s_decode_ae[0].scratch = ((uint32_t)(v_block_size));
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
- if (self->private_data.s_decode_ae[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
- self->private_data.s_decode_ae[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src));
- iop_a_src = io2_a_src;
- status = wuffs_base__make_status(wuffs_base__suspension__short_read);
- goto suspend;
- }
- iop_a_src += self->private_data.s_decode_ae[0].scratch;
- goto label__goto_done__break;
- }
- {
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
- status = wuffs_base__make_status(wuffs_base__suspension__short_read);
- goto suspend;
- }
- uint8_t t_3 = *iop_a_src++;
- v_c = t_3;
- }
- if (v_c != 1) {
- self->private_data.s_decode_ae[0].scratch = 2;
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
- if (self->private_data.s_decode_ae[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
- self->private_data.s_decode_ae[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src));
- iop_a_src = io2_a_src;
- status = wuffs_base__make_status(wuffs_base__suspension__short_read);
- goto suspend;
- }
- iop_a_src += self->private_data.s_decode_ae[0].scratch;
- goto label__goto_done__break;
- }
- {
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
- uint32_t t_4;
- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
- t_4 = ((uint32_t)(wuffs_base__load_u16le__no_bounds_check(iop_a_src)));
- iop_a_src += 2;
- } else {
- self->private_data.s_decode_ae[0].scratch = 0;
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
- while (true) {
- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
- status = wuffs_base__make_status(wuffs_base__suspension__short_read);
- goto suspend;
- }
- uint64_t* scratch = &self->private_data.s_decode_ae[0].scratch;
- uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56));
- *scratch <<= 8;
- *scratch >>= 8;
- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4;
- if (num_bits_4 == 8) {
- t_4 = ((uint32_t)(*scratch));
- break;
- }
- num_bits_4 += 8;
- *scratch |= ((uint64_t)(num_bits_4)) << 56;
- }
- }
- self->private_impl.f_num_loops = t_4;
- }
- self->private_impl.f_seen_num_loops = true;
- if ((0 < self->private_impl.f_num_loops) && (self->private_impl.f_num_loops <= 65535)) {
- self->private_impl.f_num_loops += 1;
- }
- } else if (self->private_impl.f_ignore_metadata) {
- } else if (v_is_iccp && self->private_impl.f_report_metadata_iccp) {
- self->private_impl.f_metadata_fourcc = 1229144912;
- self->private_impl.f_metadata_io_position = wuffs_base__u64__sat_add(a_src->meta.pos, ((uint64_t)(iop_a_src - io0_a_src)));
- self->private_impl.f_call_sequence = 1;
- status = wuffs_base__make_status(wuffs_base__note__metadata_reported);
- goto ok;
- } else if (v_is_xmp && self->private_impl.f_report_metadata_xmp) {
- self->private_impl.f_metadata_fourcc = 1481461792;
- self->private_impl.f_metadata_io_position = wuffs_base__u64__sat_add(a_src->meta.pos, ((uint64_t)(iop_a_src - io0_a_src)));
- self->private_impl.f_call_sequence = 1;
- status = wuffs_base__make_status(wuffs_base__note__metadata_reported);
- goto ok;
- }
- goto label__goto_done__break;
- }
- label__goto_done__break:;
- if (a_src) {
- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
- }
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
- status = wuffs_gif__config_decoder__skip_blocks(self, a_src);
- if (a_src) {
- iop_a_src = a_src->data.ptr + a_src->meta.ri;
- }
- if (status.repr) {
- goto suspend;
- }
-
- goto ok;
- ok:
- self->private_impl.p_decode_ae[0] = 0;
- goto exit;
- }
-
- goto suspend;
- suspend:
- self->private_impl.p_decode_ae[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
- self->private_data.s_decode_ae[0].v_block_size = v_block_size;
- self->private_data.s_decode_ae[0].v_is_animexts = v_is_animexts;
- self->private_data.s_decode_ae[0].v_is_netscape = v_is_netscape;
- self->private_data.s_decode_ae[0].v_is_iccp = v_is_iccp;
- self->private_data.s_decode_ae[0].v_is_xmp = v_is_xmp;
-
- goto exit;
- exit:
- if (a_src) {
- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
- }
-
- return status;
-}
-
-// -------- func gif.config_decoder.decode_gc
-
-static wuffs_base__status
-wuffs_gif__config_decoder__decode_gc(
- wuffs_gif__config_decoder* self,
- wuffs_base__io_buffer* a_src) {
- wuffs_base__status status = wuffs_base__make_status(NULL);
-
- uint8_t v_c = 0;
- uint8_t v_flags = 0;
- uint16_t v_gc_duration_centiseconds = 0;
-
- const uint8_t* iop_a_src = NULL;
- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
- if (a_src) {
- io0_a_src = a_src->data.ptr;
- io1_a_src = io0_a_src + a_src->meta.ri;
- iop_a_src = io1_a_src;
- io2_a_src = io0_a_src + a_src->meta.wi;
- }
-
- uint32_t coro_susp_point = self->private_impl.p_decode_gc[0];
- switch (coro_susp_point) {
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
-
- {
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
- status = wuffs_base__make_status(wuffs_base__suspension__short_read);
- goto suspend;
- }
- uint8_t t_0 = *iop_a_src++;
- v_c = t_0;
- }
- if (v_c != 4) {
- status = wuffs_base__make_status(wuffs_gif__error__bad_graphic_control);
- goto exit;
- }
- {
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
- status = wuffs_base__make_status(wuffs_base__suspension__short_read);
- goto suspend;
- }
- uint8_t t_1 = *iop_a_src++;
- v_flags = t_1;
- }
- self->private_impl.f_gc_has_transparent_index = ((v_flags & 1) != 0);
- v_flags = ((v_flags >> 2) & 7);
- if (v_flags == 2) {
- self->private_impl.f_gc_disposal = 1;
- } else if ((v_flags == 3) || (v_flags == 4)) {
- self->private_impl.f_gc_disposal = 2;
- } else {
- self->private_impl.f_gc_disposal = 0;
- }
- {
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
- uint16_t t_2;
- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
- t_2 = wuffs_base__load_u16le__no_bounds_check(iop_a_src);
- iop_a_src += 2;
- } else {
- self->private_data.s_decode_gc[0].scratch = 0;
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
- while (true) {
- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
- status = wuffs_base__make_status(wuffs_base__suspension__short_read);
- goto suspend;
- }
- uint64_t* scratch = &self->private_data.s_decode_gc[0].scratch;
- uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56));
- *scratch <<= 8;
- *scratch >>= 8;
- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2;
- if (num_bits_2 == 8) {
- t_2 = ((uint16_t)(*scratch));
- break;
- }
- num_bits_2 += 8;
- *scratch |= ((uint64_t)(num_bits_2)) << 56;
- }
- }
- v_gc_duration_centiseconds = t_2;
- }
- self->private_impl.f_gc_duration = (((uint64_t)(v_gc_duration_centiseconds)) * 7056000);
- {
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
- status = wuffs_base__make_status(wuffs_base__suspension__short_read);
- goto suspend;
- }
- uint8_t t_3 = *iop_a_src++;
- self->private_impl.f_gc_transparent_index = t_3;
- }
- {
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
- status = wuffs_base__make_status(wuffs_base__suspension__short_read);
- goto suspend;
- }
- uint8_t t_4 = *iop_a_src++;
- v_c = t_4;
- }
- if (v_c != 0) {
- status = wuffs_base__make_status(wuffs_gif__error__bad_graphic_control);
- goto exit;
- }
-
- goto ok;
- ok:
- self->private_impl.p_decode_gc[0] = 0;
- goto exit;
- }
-
- goto suspend;
- suspend:
- self->private_impl.p_decode_gc[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
-
- goto exit;
- exit:
- if (a_src) {
- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
- }
-
- return status;
-}
-
-// -------- func gif.config_decoder.decode_id_part0
-
-static wuffs_base__status
-wuffs_gif__config_decoder__decode_id_part0(
- wuffs_gif__config_decoder* self,
- wuffs_base__io_buffer* a_src) {
- wuffs_base__status status = wuffs_base__make_status(NULL);
-
- const uint8_t* iop_a_src = NULL;
- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
- if (a_src) {
- io0_a_src = a_src->data.ptr;
- io1_a_src = io0_a_src + a_src->meta.ri;
- iop_a_src = io1_a_src;
- io2_a_src = io0_a_src + a_src->meta.wi;
- }
-
- uint32_t coro_susp_point = self->private_impl.p_decode_id_part0[0];
- switch (coro_susp_point) {
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
-
- {
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
- uint32_t t_0;
- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
- t_0 = ((uint32_t)(wuffs_base__load_u16le__no_bounds_check(iop_a_src)));
- iop_a_src += 2;
- } else {
- self->private_data.s_decode_id_part0[0].scratch = 0;
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
- while (true) {
- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
- status = wuffs_base__make_status(wuffs_base__suspension__short_read);
- goto suspend;
- }
- uint64_t* scratch = &self->private_data.s_decode_id_part0[0].scratch;
- uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
- *scratch <<= 8;
- *scratch >>= 8;
- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
- if (num_bits_0 == 8) {
- t_0 = ((uint32_t)(*scratch));
- break;
- }
- num_bits_0 += 8;
- *scratch |= ((uint64_t)(num_bits_0)) << 56;
- }
- }
- self->private_impl.f_frame_rect_x0 = t_0;
- }
- {
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
- uint32_t t_1;
- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
- t_1 = ((uint32_t)(wuffs_base__load_u16le__no_bounds_check(iop_a_src)));
- iop_a_src += 2;
- } else {
- self->private_data.s_decode_id_part0[0].scratch = 0;
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
- while (true) {
- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
- status = wuffs_base__make_status(wuffs_base__suspension__short_read);
- goto suspend;
- }
- uint64_t* scratch = &self->private_data.s_decode_id_part0[0].scratch;
- uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
- *scratch <<= 8;
- *scratch >>= 8;
- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
- if (num_bits_1 == 8) {
- t_1 = ((uint32_t)(*scratch));
- break;
- }
- num_bits_1 += 8;
- *scratch |= ((uint64_t)(num_bits_1)) << 56;
- }
- }
- self->private_impl.f_frame_rect_y0 = t_1;
- }
- {
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
- uint32_t t_2;
- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
- t_2 = ((uint32_t)(wuffs_base__load_u16le__no_bounds_check(iop_a_src)));
- iop_a_src += 2;
- } else {
- self->private_data.s_decode_id_part0[0].scratch = 0;
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
- while (true) {
- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
- status = wuffs_base__make_status(wuffs_base__suspension__short_read);
- goto suspend;
- }
- uint64_t* scratch = &self->private_data.s_decode_id_part0[0].scratch;
- uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56));
- *scratch <<= 8;
- *scratch >>= 8;
- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2;
- if (num_bits_2 == 8) {
- t_2 = ((uint32_t)(*scratch));
- break;
- }
- num_bits_2 += 8;
- *scratch |= ((uint64_t)(num_bits_2)) << 56;
- }
- }
- self->private_impl.f_frame_rect_x1 = t_2;
- }
- self->private_impl.f_frame_rect_x1 += self->private_impl.f_frame_rect_x0;
- {
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
- uint32_t t_3;
- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
- t_3 = ((uint32_t)(wuffs_base__load_u16le__no_bounds_check(iop_a_src)));
- iop_a_src += 2;
- } else {
- self->private_data.s_decode_id_part0[0].scratch = 0;
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
- while (true) {
- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
- status = wuffs_base__make_status(wuffs_base__suspension__short_read);
- goto suspend;
- }
- uint64_t* scratch = &self->private_data.s_decode_id_part0[0].scratch;
- uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56));
- *scratch <<= 8;
- *scratch >>= 8;
- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3;
- if (num_bits_3 == 8) {
- t_3 = ((uint32_t)(*scratch));
- break;
- }
- num_bits_3 += 8;
- *scratch |= ((uint64_t)(num_bits_3)) << 56;
- }
- }
- self->private_impl.f_frame_rect_y1 = t_3;
- }
- self->private_impl.f_frame_rect_y1 += self->private_impl.f_frame_rect_y0;
- if ((self->private_impl.f_call_sequence == 0) && ! self->private_impl.f_quirks[4]) {
- self->private_impl.f_width = wuffs_base__u32__max(self->private_impl.f_width, self->private_impl.f_frame_rect_x1);
- self->private_impl.f_height = wuffs_base__u32__max(self->private_impl.f_height, self->private_impl.f_frame_rect_y1);
- }
-
- goto ok;
- ok:
- self->private_impl.p_decode_id_part0[0] = 0;
- goto exit;
- }
-
- goto suspend;
- suspend:
- self->private_impl.p_decode_id_part0[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
-
- goto exit;
- exit:
- if (a_src) {
- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
- }
-
- return status;
-}
-
// -------- func gif.decoder.set_quirk_enabled
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
diff --git a/std/gif/decode_config.wuffs b/std/gif/decode_config.wuffs
deleted file mode 100644
index afe61fa..0000000
--- a/std/gif/decode_config.wuffs
+++ /dev/null
@@ -1,733 +0,0 @@
-// This file was automatically generated by "preprocess-wuffs.go".
-
-// --------
-
-// Copyright 2017 The Wuffs Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// --------
-
-// --------
-
-pub struct config_decoder? implements base.image_decoder(
- width : base.u32,
- height : base.u32,
-
- // Call sequence states:
- // - 0: initial state.
- // - 1: metadata reported; image config decode is in progress.
- // - 2: metadata finished; image config decode is in progress.
- // - 3: image config decoded, including the first frame's bounds, but not
- // the first frame's pixels.
- // - 4: frame config decoded.
- // - 5: frame decoded.
- //
- // State transitions:
- //
- // - 0 -> 1: via IC (metadata reported)
- // - 0 -> 3: via IC (metadata not reported)
- // - 0 -> 4: via FC with implicit IC
- // - 0 -> 5: via F with implicit IC and FC
- //
- // - 1 -> 2: via AMC
- //
- // - 2 -> 1: via IC (metadata reported)
- // - 2 -> 3: via IC (metadata not reported)
- //
- // - 3 -> 4: via FC
- // - 3 -> 5: via F with implicit FC
- //
- // - 4 -> 4: via FC with implicit F
- // - 4 -> 5: via F
- //
- // - 5 -> 4: via FC
- // - 5 -> 5: via F with implicit FC
- //
- // Where:
- // - AMC is ack_metadata_chunk
- // - F is decode_frame, implicit means skip_frame
- // - FC is decode_frame_config, implicit means nullptr args.dst
- // - IC is decode_image_config, implicit means nullptr args.dst
- call_sequence : base.u8,
-
- ignore_metadata : base.bool,
- report_metadata_iccp : base.bool,
- report_metadata_xmp : base.bool,
- metadata_fourcc : base.u32,
- metadata_io_position : base.u64,
-
- quirks : array[QUIRKS_COUNT] base.bool,
-
- delayed_num_decoded_frames : base.bool,
- end_of_data : base.bool,
- restarted : base.bool,
- previous_lzw_decode_ended_abruptly : base.bool,
-
- has_global_palette : base.bool,
-
- // interlace indexes the INTERLACE_START and INTERLACE_DELTA arrays.
- interlace : base.u8[..= 4],
-
- // Absent an ANIMEXTS1.0 or NETSCAPE2.0 extension, the implicit number of
- // animation loops is 1.
- seen_num_loops : base.bool,
- num_loops : base.u32,
-
- background_color_u32_argb_premul : base.u32,
- black_color_u32_argb_premul : base.u32,
-
- gc_has_transparent_index : base.bool,
- gc_transparent_index : base.u8,
- gc_disposal : base.u8,
- // There are 7_056000 flicks per centisecond.
- gc_duration : base.u64[..= 0xFFFF * 7_056000],
-
- frame_config_io_position : base.u64,
- num_decoded_frame_configs_value : base.u64,
- num_decoded_frames_value : base.u64,
-
- frame_rect_x0 : base.u32,
- frame_rect_y0 : base.u32,
- frame_rect_x1 : base.u32,
- frame_rect_y1 : base.u32,
-
- util : base.utility,
-)(
- palettes : array[1] array[4 * 256] base.u8,
-)
-
-pub func config_decoder.set_quirk_enabled!(quirk: base.u32, enabled: base.bool) {
- if (this.call_sequence == 0) and (args.quirk >= QUIRKS_BASE) {
- args.quirk -= QUIRKS_BASE
- if args.quirk < QUIRKS_COUNT {
- this.quirks[args.quirk] = args.enabled
- }
- }
-}
-
-pub func config_decoder.decode_image_config?(dst: nptr base.image_config, src: base.io_reader) {
- var ffio : base.bool
-
- if this.call_sequence == 0 {
- this.decode_header?(src: args.src)
- this.decode_lsd?(src: args.src)
- } else if this.call_sequence <> 2 {
- return base."#bad call sequence"
- }
-
- this.decode_up_to_id_part1?(src: args.src)
-
- // TODO: if this.end_of_data, return an error and/or set dst to zero?
-
- ffio = not this.gc_has_transparent_index
- if not this.quirks[QUIRK_HONOR_BACKGROUND_COLOR - QUIRKS_BASE] {
- ffio = ffio and
- (this.frame_rect_x0 == 0) and
- (this.frame_rect_y0 == 0) and
- (this.frame_rect_x1 == this.width) and
- (this.frame_rect_y1 == this.height)
- } else if ffio {
- // Use opaque black, not transparent black.
- this.black_color_u32_argb_premul = 0xFF00_0000
- }
-
- if this.background_color_u32_argb_premul == 77 {
- this.background_color_u32_argb_premul = this.black_color_u32_argb_premul
- }
-
- if args.dst <> nullptr {
- args.dst.set!(
- pixfmt: base.PIXEL_FORMAT__INDEXED__BGRA_BINARY,
- pixsub: 0,
- width: this.width,
- height: this.height,
- first_frame_io_position: this.frame_config_io_position,
- first_frame_is_opaque: ffio)
- }
-
- this.call_sequence = 3
-}
-
-pub func config_decoder.set_report_metadata!(fourcc: base.u32, report: base.bool) {
- if args.fourcc == 'ICCP'be {
- this.report_metadata_iccp = args.report
- } else if args.fourcc == 'XMP 'be {
- this.report_metadata_xmp = args.report
- }
-}
-
-pub func config_decoder.tell_me_more?(dst: base.io_writer, minfo: nptr base.more_information, src: base.io_reader) {
- var chunk_length : base.u64
-
- if this.call_sequence <> 1 {
- return base."#bad call sequence"
- }
- if this.metadata_fourcc == 0 {
- return base."#no more information"
- }
-
- while true {
- while true,
- post args.src.length() > 0,
- {
- if args.src.position() <> this.metadata_io_position {
- if args.minfo <> nullptr {
- args.minfo.set!(
- flavor: 2, // WUFFS_BASE__MORE_INFORMATION__FLAVOR__IO_SEEK
- w: 0,
- x: this.metadata_io_position,
- y: 0,
- z: 0)
- }
- yield? base."$mispositioned read"
- continue
- }
-
- if args.src.length() <= 0 {
- if args.minfo <> nullptr {
- args.minfo.set!(
- flavor: 0,
- w: 0,
- x: 0,
- y: 0,
- z: 0)
- }
- yield? base."$short read"
- continue
- }
-
- break
- } endwhile
-
- chunk_length = args.src.peek_u8_as_u64()
- if chunk_length <= 0 {
- // Consume the '\x00' that means a zero-length block.
- args.src.skip_u32_fast!(actual: 1, worst_case: 1)
- break
- }
-
- if this.metadata_fourcc == 'XMP 'be {
- // The +1 is because XMP metadata's encoding includes each
- // block's leading byte (the block size) as part of the
- // metadata passed to the caller.
- chunk_length += 1
- } else {
- args.src.skip_u32_fast!(actual: 1, worst_case: 1)
- }
- this.metadata_io_position = args.src.position() ~sat+ chunk_length
-
- if args.minfo <> nullptr {
- args.minfo.set!(
- flavor: 3, // WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA
- w: this.metadata_fourcc,
- x: 0,
- y: args.src.position(),
- z: this.metadata_io_position)
- }
-
- yield? base."$even more information"
- } endwhile
-
- if args.minfo <> nullptr {
- args.minfo.set!(
- flavor: 3, // WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA
- w: this.metadata_fourcc,
- x: 0,
- y: this.metadata_io_position,
- z: this.metadata_io_position)
- }
- this.call_sequence = 2
- this.metadata_fourcc = 0
- this.metadata_io_position = 0
- return ok
-}
-
-pub func config_decoder.num_animation_loops() base.u32 {
- if this.seen_num_loops {
- return this.num_loops
- }
- return 1
-}
-
-pub func config_decoder.num_decoded_frame_configs() base.u64 {
- return this.num_decoded_frame_configs_value
-}
-
-pub func config_decoder.num_decoded_frames() base.u64 {
- return this.num_decoded_frames_value
-}
-
-pub func config_decoder.frame_dirty_rect() base.rect_ie_u32 {
- return this.util.empty_rect_ie_u32()
-}
-
-pub func config_decoder.workbuf_len() base.range_ii_u64 {
- return this.util.empty_range_ii_u64()
-}
-
-pub func config_decoder.restart_frame!(index: base.u64, io_position: base.u64) base.status {
- if this.call_sequence == 0 {
- return base."#bad call sequence"
- }
- this.delayed_num_decoded_frames = false
- this.end_of_data = false
- this.restarted = true
- this.frame_config_io_position = args.io_position
- this.num_decoded_frame_configs_value = args.index
- this.num_decoded_frames_value = args.index
- this.reset_gc!()
- return ok
-}
-
-pub func config_decoder.decode_frame_config?(dst: nptr base.frame_config, src: base.io_reader) {
- var background_color : base.u32
- var flags : base.u8
-
- this.ignore_metadata = true
-
- if not this.end_of_data {
- if this.call_sequence == 0 {
- this.decode_image_config?(dst: nullptr, src: args.src)
- } else if this.call_sequence <> 3 {
- if this.call_sequence == 4 {
- this.skip_frame?(src: args.src)
- }
- this.decode_up_to_id_part1?(src: args.src)
- }
- }
-
- // This is a new "if", not an "else", because the calls above can modify
- // this.end_of_data.
- if this.end_of_data {
- return base."@end of data"
- }
-
- background_color = this.black_color_u32_argb_premul
- if not this.gc_has_transparent_index {
- background_color = this.background_color_u32_argb_premul
-
- // If the quirk is enabled and the first frame has a local color
- // palette, its background color is black.
- if this.quirks[QUIRK_FIRST_FRAME_LOCAL_PALETTE_MEANS_BLACK_BACKGROUND - QUIRKS_BASE] and
- (this.num_decoded_frame_configs_value == 0) {
-
- while args.src.length() <= 0,
- post args.src.length() > 0,
- {
- yield? base."$short read"
- } endwhile
- flags = args.src.peek_u8()
- if (flags & 0x80) <> 0 {
- background_color = this.black_color_u32_argb_premul
- }
- }
- }
-
- if args.dst <> nullptr {
- // The "foo.min(a:this.width_or_height)" calls clip the nominal
- // frame_rect to the image_rect.
- args.dst.set!(bounds: this.util.make_rect_ie_u32(
- min_incl_x: this.frame_rect_x0.min(a: this.width),
- min_incl_y: this.frame_rect_y0.min(a: this.height),
- max_excl_x: this.frame_rect_x1.min(a: this.width),
- max_excl_y: this.frame_rect_y1.min(a: this.height)),
- duration: this.gc_duration,
- index: this.num_decoded_frame_configs_value,
- io_position: this.frame_config_io_position,
- disposal: this.gc_disposal,
- opaque_within_bounds: not this.gc_has_transparent_index,
- overwrite_instead_of_blend: false,
- background_color: background_color)
- }
-
- this.num_decoded_frame_configs_value ~sat+= 1
- this.call_sequence = 4
-}
-
-pri func config_decoder.skip_frame?(src: base.io_reader) {
- var flags : base.u8
- var lw : base.u8
-
- // Skip the optional Local Color Table, 3 bytes (RGB) per entry.
- flags = args.src.read_u8?()
- if (flags & 0x80) <> 0 {
- args.src.skip_u32?(n: (3 as base.u32) << (1 + (flags & 0x07)))
- }
-
- // Process the LZW literal width.
- lw = args.src.read_u8?()
- if lw > 8 {
- return "#bad literal width"
- }
-
- // Skip the blocks of LZW-compressed data.
- this.skip_blocks?(src: args.src)
-
- if this.quirks[QUIRK_DELAY_NUM_DECODED_FRAMES - QUIRKS_BASE] {
- this.delayed_num_decoded_frames = true
- } else {
- this.num_decoded_frames_value ~sat+= 1
- }
- this.reset_gc!()
-}
-
-// TODO: honor args.opts.
-pub func config_decoder.decode_frame?(dst: ptr base.pixel_buffer, src: base.io_reader, blend: base.pixel_blend, workbuf: slice base.u8, opts: nptr base.decode_frame_options) {
- return base."#unsupported method"
-}
-
-pri func config_decoder.reset_gc!() {
- this.call_sequence = 5
- // The Image Descriptor is mandatory, but the Graphic Control extension is
- // optional. Reset the GC related fields for the next decode_frame call.
- this.gc_has_transparent_index = false
- this.gc_transparent_index = 0
- this.gc_disposal = 0
- this.gc_duration = 0
-}
-
-pri func config_decoder.decode_up_to_id_part1?(src: base.io_reader) {
- var block_type : base.u8
-
- if not this.restarted {
- if this.call_sequence <> 2 {
- this.frame_config_io_position = args.src.position()
- }
- } else if this.frame_config_io_position <> args.src.position() {
- return base."#bad restart"
- } else {
- this.restarted = false
- }
-
- while true {
- block_type = args.src.read_u8?()
- if block_type == 0x21 { // The spec calls 0x21 the "Extension Introducer".
- this.decode_extension?(src: args.src)
- } else if block_type == 0x2C { // The spec calls 0x2C the "Image Separator".
- if this.delayed_num_decoded_frames {
- this.delayed_num_decoded_frames = false
- this.num_decoded_frames_value ~sat+= 1
- }
- this.decode_id_part0?(src: args.src)
- break
- } else {
- // If we don't have 0x21 or 0x2C then, according to the spec, the
- // only valid byte is 0x3B, called the "Trailer". In practice, some
- // other popular decoders allow anything (other than 0x21 or 0x2C)
- // to be equivalent to 0x3B, which ends the animated GIF image, and
- // we do likewise here. Some real world GIF files that exhibit this
- // are at https://github.com/golang/go/issues/38853
- //
- // Chromium's decoder
- // https://skia.googlesource.com/libgifcodec/+/c002ec500aba1e1b0189547629787cb02db78193/SkGifImageReader.cpp#563
- //
- // Firefox's decoder
- // https://dxr.mozilla.org/mozilla-central/rev/93a33cb7f2369ac4f1d1f2ac97ec14ba60e1e7d7/image/decoders/nsGIFDecoder2.cpp#569
- if this.delayed_num_decoded_frames {
- this.delayed_num_decoded_frames = false
- this.num_decoded_frames_value ~sat+= 1
- }
- this.end_of_data = true
- break
- }
- } endwhile
-}
-
-// decode_header reads either "GIF87a" or "GIF89a".
-//
-// See the spec section 17 "Header" on page 7.
-pri func config_decoder.decode_header?(src: base.io_reader) {
- var c : array[6] base.u8
- var i : base.u32
-
- while i < 6 {
- c[i] = args.src.read_u8?()
- i += 1
- } endwhile
- if (c[0] <> 'G') or (c[1] <> 'I') or (c[2] <> 'F') or (c[3] <> '8') or
- ((c[4] <> '7') and (c[4] <> '9')) or (c[5] <> 'a') {
- return "#bad header"
- }
-}
-
-// decode_lsd reads the Logical Screen Descriptor.
-//
-// See the spec section 18 "Logical Screen Descriptor" on page 8.
-pri func config_decoder.decode_lsd?(src: base.io_reader) {
- var flags : base.u8
- var background_color_index : base.u8
- var num_palette_entries : base.u32[..= 256]
- var i : base.u32
- var j : base.u32[..= 1020]
- var argb : base.u32
-
- this.width = args.src.read_u16le_as_u32?()
- this.height = args.src.read_u16le_as_u32?()
- flags = args.src.read_u8?()
- background_color_index = args.src.read_u8?()
- // Ignore the Pixel Aspect Ratio byte.
- args.src.skip_u32?(n: 1)
-
- // Read the optional Global Color Table.
- i = 0
- this.has_global_palette = (flags & 0x80) <> 0
- if this.has_global_palette {
- num_palette_entries = (1 as base.u32) << (1 + (flags & 0x07))
- while i < num_palette_entries {
- assert i < 256 via "a < b: a < c; c <= b"(c: num_palette_entries)
- // Convert from RGB (in memory order) to ARGB (in native u32 order)
- // to BGRA (in memory order).
- argb = args.src.read_u24be_as_u32?()
- argb |= 0xFF00_0000
- this.palettes[0][(4 * i) + 0] = ((argb >> 0) & 0xFF) as base.u8
- this.palettes[0][(4 * i) + 1] = ((argb >> 8) & 0xFF) as base.u8
- this.palettes[0][(4 * i) + 2] = ((argb >> 16) & 0xFF) as base.u8
- this.palettes[0][(4 * i) + 3] = ((argb >> 24) & 0xFF) as base.u8
- i += 1
- } endwhile
-
- if this.quirks[QUIRK_HONOR_BACKGROUND_COLOR - QUIRKS_BASE] {
- if (background_color_index <> 0) and
- ((background_color_index as base.u32) < num_palette_entries) {
-
- j = 4 * (background_color_index as base.u32)
- this.background_color_u32_argb_premul =
- ((this.palettes[0][j + 0] as base.u32) << 0) |
- ((this.palettes[0][j + 1] as base.u32) << 8) |
- ((this.palettes[0][j + 2] as base.u32) << 16) |
- ((this.palettes[0][j + 3] as base.u32) << 24)
- } else {
- // The background color is either opaque black or transparent
- // black. We set it to an arbitrary nonsense value (77) for
- // now, and set it to its real value later, once we know
- // whether the first frame is opaque (the ffio value).
- this.background_color_u32_argb_premul = 77
- }
- }
- }
-
- // Set the remaining palette entries to opaque black.
- while i < 256 {
- this.palettes[0][(4 * i) + 0] = 0x00
- this.palettes[0][(4 * i) + 1] = 0x00
- this.palettes[0][(4 * i) + 2] = 0x00
- this.palettes[0][(4 * i) + 3] = 0xFF
- i += 1
- } endwhile
-}
-
-// decode_extension reads an extension. The Extension Introducer byte has
-// already been read.
-//
-// See the spec:
-// - section 23 "Graphic Control Extension" on page 15.
-// - section 24 "Comment Extension" on page 17.
-// - section 25 "Plain Text Extension" on page 18.
-// - section 26 "Application Extension" on page 21.
-pri func config_decoder.decode_extension?(src: base.io_reader) {
- var label : base.u8
-
- label = args.src.read_u8?()
- if label == 0xF9 { // The spec calls 0xF9 the "Graphic Control Label".
- this.decode_gc?(src: args.src)
- return ok
- } else if label == 0xFF { // The spec calls 0xFF the "Application Extension Label".
- this.decode_ae?(src: args.src)
- return ok
- }
- // We skip over all other extensions, including 0x01 "Plain Text Label" and
- // 0xFE "Comment Label".
- this.skip_blocks?(src: args.src)
-}
-
-pri func config_decoder.skip_blocks?(src: base.io_reader) {
- var block_size : base.u8
-
- while true {
- block_size = args.src.read_u8?()
- if block_size == 0 {
- return ok
- }
- args.src.skip_u32?(n: block_size as base.u32)
- } endwhile
-}
-
-// decode_ae reads an Application Extension.
-pri func config_decoder.decode_ae?(src: base.io_reader) {
- var c : base.u8
- var block_size : base.u8
- var is_animexts : base.bool
- var is_netscape : base.bool
- var is_iccp : base.bool
- var is_xmp : base.bool
-
- while.goto_done true {{
- if this.metadata_fourcc <> 0 {
- return base."@metadata reported"
- }
-
- block_size = args.src.read_u8?()
- if block_size == 0 {
- return ok
- }
-
- // Look only for an 11 byte "ANIMEXTS1.0", "NETSCAPE2.0" or other
- // extension, as per:
- // - http://www.vurdalakov.net/misc/gif/animexts-looping-application-extension
- // - http://www.vurdalakov.net/misc/gif/netscape-looping-application-extension
- //
- // Other extensions include XMP metadata.
- if block_size <> 11 {
- args.src.skip_u32?(n: block_size as base.u32)
- break.goto_done
- }
- is_animexts = true
- is_netscape = true
- is_iccp = true
- is_xmp = true
- block_size = 0 // Re-purpose the block_size variable as a counter.
- while block_size < 11 {
- c = args.src.read_u8?()
- is_animexts = is_animexts and (c == ANIMEXTS1DOT0[block_size])
- is_netscape = is_netscape and (c == NETSCAPE2DOT0[block_size])
- is_iccp = is_iccp and (c == ICCRGBG1012[block_size])
- is_xmp = is_xmp and (c == XMPDATAXMP[block_size])
- block_size += 1
- } endwhile
-
- if is_animexts or is_netscape {
- // Those 11 bytes should be followed by 0x03, 0x01 and then the loop
- // count.
- block_size = args.src.read_u8?()
- if block_size <> 3 {
- args.src.skip_u32?(n: block_size as base.u32)
- break.goto_done
- }
- c = args.src.read_u8?()
- if c <> 0x01 {
- args.src.skip_u32?(n: 2)
- break.goto_done
- }
- this.num_loops = args.src.read_u16le_as_u32?()
- this.seen_num_loops = true
-
- // A loop count of N, in the wire format, actually means "repeat N
- // times after the first play", if N is positive. A zero N means to
- // loop forever. Playing the frames exactly once is denoted by the
- // *absence* of this NETSCAPE2.0 application extension.
- //
- // For example, if there are four frames: A, B, C, D, and N is 2, then
- // each frame is actually played N+1 or 3 times: ABCDABCDABCD.
- //
- // Thus, we increment N if it is positive. The comparison against
- // 0xFFFF will never fail, but is necessary for the overflow checker.
- if (0 < this.num_loops) and (this.num_loops <= 0xFFFF) {
- this.num_loops += 1
- }
-
- } else if this.ignore_metadata {
- // No-op.
-
- } else if is_iccp and this.report_metadata_iccp {
- this.metadata_fourcc = 'ICCP'be
- this.metadata_io_position = args.src.position()
- this.call_sequence = 1
- return base."@metadata reported"
-
- } else if is_xmp and this.report_metadata_xmp {
- this.metadata_fourcc = 'XMP 'be
- this.metadata_io_position = args.src.position()
- this.call_sequence = 1
- return base."@metadata reported"
- }
-
- break.goto_done
- }} endwhile.goto_done
-
- this.skip_blocks?(src: args.src)
-}
-
-// decode_gc reads a Graphic Control.
-pri func config_decoder.decode_gc?(src: base.io_reader) {
- var c : base.u8
- var flags : base.u8
- var gc_duration_centiseconds : base.u16
-
- c = args.src.read_u8?()
- if c <> 4 {
- return "#bad graphic control"
- }
-
- flags = args.src.read_u8?()
- this.gc_has_transparent_index = (flags & 0x01) <> 0
-
- // Convert the disposal method from GIF's wire format to Wuffs constants.
- //
- // The GIF spec discusses the 3-bit flag value being 0, 1, 2 or 3. Values
- // in the range [4 ..= 7] are "to be defined". In practice, some encoders also
- // use 4 for "restore previous". See
- // https://cs.chromium.org/chromium/src/third_party/blink/renderer/platform/image-decoders/gif/gif_image_reader.cc?rcl=5161173c43324da2b13e1aa45bbe69901daa1279&l=625
- //
- // TODO: named constants instead of assigning 1 for
- // WUFFS_BASE__ANIMATION_DISPOSAL__RESTORE_BACKGROUND, etc.
- flags = (flags >> 2) & 0x07
- if flags == 2 {
- this.gc_disposal = 1 // 1 is WUFFS_BASE__ANIMATION_DISPOSAL__RESTORE_BACKGROUND
- } else if (flags == 3) or (flags == 4) {
- this.gc_disposal = 2 // 2 is WUFFS_BASE__ANIMATION_DISPOSAL__RESTORE_PREVIOUS
- } else {
- this.gc_disposal = 0
- }
-
- // There are 7_056000 flicks per centisecond.
- gc_duration_centiseconds = args.src.read_u16le?()
- this.gc_duration = (gc_duration_centiseconds as base.u64) * 7_056000
- this.gc_transparent_index = args.src.read_u8?()
-
- c = args.src.read_u8?()
- if c <> 0 {
- return "#bad graphic control"
- }
-}
-
-// decode_id_partX reads an Image Descriptor. The Image Separator byte has
-// already been read.
-//
-// See the spec section 20 "Image Descriptor" on page 11.
-//
-// The code is split into three parts (part0, part 1 and part12 because
-// determining the overall image's width and height also requires decoding the
-// first frame's bounds (part0), but doesn't require decoding the first frame's
-// pixels (the other two parts). Decoding the actual pixels is split into two
-// (part1 and part2) not out of necessity, just for the general programming
-// principle that smaller functions are easier to understand.
-
-pri func config_decoder.decode_id_part0?(src: base.io_reader) {
- this.frame_rect_x0 = args.src.read_u16le_as_u32?()
- this.frame_rect_y0 = args.src.read_u16le_as_u32?()
- this.frame_rect_x1 = args.src.read_u16le_as_u32?()
- this.frame_rect_x1 ~mod+= this.frame_rect_x0
- this.frame_rect_y1 = args.src.read_u16le_as_u32?()
- this.frame_rect_y1 ~mod+= this.frame_rect_y0
-
- // Set the image's overall width and height to be the maximum of the
- // nominal image width and height (given in the Logical Screen Descriptor)
- // and the bottom right extent of the first frame. See
- // test/data/artificial/gif-frame-out-of-bounds.gif.make-artificial.txt for
- // more discussion.
- if (this.call_sequence == 0) and (not this.quirks[QUIRK_IMAGE_BOUNDS_ARE_STRICT - QUIRKS_BASE]) {
- this.width = this.width.max(a: this.frame_rect_x1)
- this.height = this.height.max(a: this.frame_rect_y1)
- }
-}
diff --git a/std/gif/decode_gif.wuffs b/std/gif/decode_gif.wuffs
index f0e5c47..17d83c5 100644
--- a/std/gif/decode_gif.wuffs
+++ b/std/gif/decode_gif.wuffs
@@ -14,27 +14,6 @@
// --------
-//#USE "go run preprocess-wuffs.go" TO MAKE decode_config.wuffs
-//#WHEN PREPROC000
-//
-// This file defines "struct decoder". It is also preprocessed (copied with
-// automatic edits) to generate the decode_config.wuffs file that defines
-// "struct config_decoder". See preprocess-wuffs.go for more detail about the
-// preprocessor language (the //#FOOBAR comments).
-//
-// config_decoder does not implement decode_frame, only decode_frame_config and
-// decode_image_config (and other miscellaneous methods). The sizeof the
-// config_decoder can be substantially smaller than the sizeof the full
-// decoder, as it does not need any internal buffers for understanding the
-// underlying compression format.
-//
-//#WHEN PREPROC000 decode_config.wuffs
-//#REPLACE "func decoder" WITH "func config_decoder"
-//#REPLACE "struct decoder" WITH "struct config_decoder"
-//#DONE PREPROC000
-
-// --------
-
pub struct decoder? implements base.image_decoder(
width : base.u32,
height : base.u32,
@@ -117,7 +96,6 @@
frame_rect_x1 : base.u32,
frame_rect_y1 : base.u32,
- //#WHEN PREPROC100
// The dst_etc fields are the output cursor during copy_to_image_buffer.
dst_x : base.u32,
dst_y : base.u32,
@@ -128,11 +106,9 @@
compressed_wi : base.u64,
swizzler : base.pixel_swizzler,
- //#DONE PREPROC100
util : base.utility,
)(
- //#WHEN PREPROC101
compressed : array[4096] base.u8,
// palettes[0] and palettes[1] are the Global and Local Color Table.
@@ -141,9 +117,6 @@
dst_palette : array[4 * 256] base.u8,
lzw : lzw.decoder,
- //#WHEN PREPROC101 decode_config.wuffs
- //## palettes : array[1] array[4 * 256] base.u8,
- //#DONE PREPROC101
)
pub func decoder.set_quirk_enabled!(quirk: base.u32, enabled: base.bool) {
@@ -308,7 +281,6 @@
}
pub func decoder.frame_dirty_rect() base.rect_ie_u32 {
- //#WHEN PREPROC200
// The "foo.min(a:this.width_or_height)" calls clip the nominal frame_rect
// to the image_rect.
return this.util.make_rect_ie_u32(
@@ -316,19 +288,12 @@
min_incl_y: this.frame_rect_y0.min(a: this.height),
max_excl_x: this.frame_rect_x1.min(a: this.width),
max_excl_y: this.dirty_max_excl_y.min(a: this.height))
- //#WHEN PREPROC200 decode_config.wuffs
- //## return this.util.empty_rect_ie_u32()
- //#DONE PREPROC200
}
pub func decoder.workbuf_len() base.range_ii_u64 {
- //#WHEN PREPROC201
return this.util.make_range_ii_u64(
min_incl: DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE,
max_incl: DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE)
- //#WHEN PREPROC201 decode_config.wuffs
- //## return this.util.empty_range_ii_u64()
- //#DONE PREPROC201
}
pub func decoder.restart_frame!(index: base.u64, io_position: base.u64) base.status {
@@ -351,9 +316,7 @@
this.ignore_metadata = true
- //#WHEN PREPROC202
this.dirty_max_excl_y = 0
- //#DONE PREPROC202
if not this.end_of_data {
if this.call_sequence == 0 {
@@ -443,7 +406,6 @@
// TODO: honor args.opts.
pub func decoder.decode_frame?(dst: ptr base.pixel_buffer, src: base.io_reader, blend: base.pixel_blend, workbuf: slice base.u8, opts: nptr base.decode_frame_options) {
- //#WHEN PREPROC300
this.ignore_metadata = true
if this.call_sequence <> 4 {
this.decode_frame_config?(dst: nullptr, src: args.src)
@@ -457,9 +419,6 @@
this.num_decoded_frames_value ~sat+= 1
this.reset_gc!()
- //#WHEN PREPROC300 decode_config.wuffs
- //## return base."#unsupported method"
- //#DONE PREPROC300
}
pri func decoder.reset_gc!() {
@@ -796,10 +755,8 @@
this.frame_rect_y1 = args.src.read_u16le_as_u32?()
this.frame_rect_y1 ~mod+= this.frame_rect_y0
- //#WHEN PREPROC400
this.dst_x = this.frame_rect_x0
this.dst_y = this.frame_rect_y0
- //#DONE PREPROC400
// Set the image's overall width and height to be the maximum of the
// nominal image width and height (given in the Logical Screen Descriptor)
@@ -812,7 +769,6 @@
}
}
-//#WHEN PREPROC900
pri func decoder.decode_id_part1?(dst: ptr base.pixel_buffer, src: base.io_reader, blend: base.pixel_blend) {
var flags : base.u8
var which_palette : base.u8[..= 1]
@@ -1146,4 +1102,3 @@
} endwhile
return ok
}
-//#DONE PREPROC900
diff --git a/test/c/std/gif.c b/test/c/std/gif.c
index ca3e510..319d298 100644
--- a/test/c/std/gif.c
+++ b/test/c/std/gif.c
@@ -170,19 +170,6 @@
// ---------------- GIF Tests
const char* //
-test_wuffs_gif_decode_interface_image_config_decoder() {
- CHECK_FOCUS(__func__);
- wuffs_gif__config_decoder dec;
- CHECK_STATUS("initialize",
- wuffs_gif__config_decoder__initialize(
- &dec, sizeof dec, WUFFS_VERSION,
- WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
- return do_test__wuffs_base__image_config_decoder(
- wuffs_gif__config_decoder__upcast_as__wuffs_base__image_decoder(&dec),
- "test/data/animated-red-blue.gif", 0, SIZE_MAX, 4);
-}
-
-const char* //
test_wuffs_gif_decode_interface_image_decoder() {
CHECK_FOCUS(__func__);
wuffs_gif__decoder dec;
@@ -1998,21 +1985,6 @@
return NULL;
}
-const char* //
-test_wuffs_gif_sizeof() {
- CHECK_FOCUS(__func__);
- size_t n0 = sizeof(wuffs_gif__config_decoder);
- size_t n1 = sizeof(wuffs_gif__decoder);
- // As of 2020-02-05, the two sizeof's differ by over 60KiB. The exact
- // difference doesn't really matter, just that it's non-trivial.
- if ((n1 < n0) || ((n1 - n0) < 8192)) {
- RETURN_FAIL(
- "config_decoder (%zu) not substantially smaller than decoder (%zu)", n0,
- n1);
- }
- return NULL;
-}
-
// ---------------- Mimic Tests
#ifdef WUFFS_MIMIC
@@ -2358,7 +2330,6 @@
test_wuffs_gif_decode_input_is_a_gif_many_medium_reads,
test_wuffs_gif_decode_input_is_a_gif_many_small_reads,
test_wuffs_gif_decode_input_is_a_png,
- test_wuffs_gif_decode_interface_image_config_decoder,
test_wuffs_gif_decode_interface_image_decoder,
test_wuffs_gif_decode_interlaced_truncated,
test_wuffs_gif_decode_metadata_empty,
@@ -2383,7 +2354,6 @@
test_wuffs_gif_io_position_one_chunk,
test_wuffs_gif_io_position_two_chunks,
test_wuffs_gif_small_frame_interlaced,
- test_wuffs_gif_sizeof,
#ifdef WUFFS_MIMIC
diff --git a/test/c/testlib/testlib.c b/test/c/testlib/testlib.c
index d7cd760..5dc741f 100644
--- a/test/c/testlib/testlib.c
+++ b/test/c/testlib/testlib.c
@@ -1059,35 +1059,6 @@
}
const char* //
-do_test__wuffs_base__image_config_decoder(wuffs_base__image_decoder* b,
- const char* src_filename,
- size_t src_ri,
- size_t src_wi,
- uint64_t want_num_frames) {
- wuffs_base__io_buffer src = ((wuffs_base__io_buffer){
- .data = g_src_slice_u8,
- });
- CHECK_STRING(read_file_fragment(&src, src_filename, src_ri, src_wi));
-
- uint64_t have_num_frames;
- for (have_num_frames = 0;; have_num_frames++) {
- wuffs_base__status status =
- wuffs_base__image_decoder__decode_frame_config(b, NULL, &src);
- if (status.repr == wuffs_base__note__end_of_data) {
- break;
- } else if (!wuffs_base__status__is_ok(&status)) {
- RETURN_FAIL("decode_frame_config: \"%s\"", status.repr);
- }
- }
-
- if (have_num_frames != want_num_frames) {
- RETURN_FAIL("num_frames: have %" PRIu64 ", want %" PRIu64, have_num_frames,
- want_num_frames);
- }
- return NULL;
-}
-
-const char* //
do_test__wuffs_base__image_decoder(
wuffs_base__image_decoder* b,
const char* src_filename,