The headline feature is that the GIF decoder is now of production quality. There is now API for overall metadata (e.g. ICCP color profiles) and to recreate each frame (width, height, BGRA pixels, timing, etc.) of a GIF animation, instead of version 0.1's proof-of-concept GIF decoder API, which just gave you a one-dimensional stream of palette indexes. It also now accepts a variety of GIF images that are invalid, when strictly following the GIF specifiction, but are nonetheless accepted by other real world GIF implementations. The Wuffs GIF decoder has also been optimized to be about 1.5x faster than Wuffs version 0.1 and about 2x faster than giflib (the C library).
skipgendeps flag.nullptr literal and nptr T type.io_bind and io_limit keywords.use keyword.yield keyword.return value mandatory; added ok literal.var statements to the top of functions.= RHS out of var x T = RHS.in variable to args.coroutine_resumed variable.std/adler32, std/crc32 and std/gzip.std/gif quirks.std/lzw out of std/gif.std/zlib out of std/flate.std/gzip and std/zlib decoder ignore checksums.std/flate to std/deflate.!= to <>; ! is now only for impure functions.~+ to ~mod+; added ~mod-, ~sat+ and ~sat-.&^.$(etc) to [etc].[i..j] to [i ..= j], consistent with Rust syntax.[i:j] to [i .. j], consistent with Rust syntax.[N] T and [] T types to array[N] T and slice T.while:label to while.label.u32, buf1, etc to base.u32, base.io_buffer, etc.unread_u8? to undo_byte!; added can_undo_byte.decode? methods to decode_io_writer?.= try foo with =? foo.{frame,image,pixel}_config and pixel_buffer types.reset method.peek_uxx, skip_fast and write_fast_uxx methods.read_uxx methods as read_uxx_as_uyy.io_buffer / io_reader distinction in C and Wuffs.error "foo" to "#foo" or base."#bar".const char *, not an int32_t.__double_underscore prefixed names.WUFFS_CONFIG__MODULES.WUFFS_CONFIG__STATIC_FUNCTIONS.mimic_deflate_xxx benchmarks.lang/base38 to lib/base38.lib/interval package.Updated on August 2019.