blob: b18e4865b5e9d3cb700dab22caa6a10419d06e27 [file] [log] [blame] [view]
# Quirks
Quirks are configuration options that let Wuffs more closely match other codec
implementations.
Some codecs and file formats are more tightly specified than others. When a
spec doesn't fully dictate how to treat malformed files, different codec
implementations have disagreed on whether to accept it (e.g. whether they
follow Postel's Principle of "be liberal in what you accept") and if so, how to
interpret it. Some implementations also raise those decisions to the
application level, not the library level: "provide mechanism, not policy".
For example, in an animated GIF image, the first frame might not fill out the
entire image, and different implementations choose a different default color
for the outside pixels: opaque black, transparent black, or something else.
Wuffs, out of the box, makes particular choices (typically mimicking the de
facto canonical implementation), but enabling various quirks results in
different choices. In particular, quirks are useful in regression testing that
Wuffs and another implementation produce the same output for the same input,
even for malformed input.
## Wuffs API
Each quirk is assigned a `uint32_t` value, packed using the [base38 namespace
convention](/doc/note/base38-and-fourcc.md). Decoders and encoders can have a
`set_quirk_enabled!(quirk base.u32, enabled base.bool)` method whose first
argument is this `uint32_t` value.
For example, the base38 encoding of `"gif "` is `0xF8586`, so that the
GIF-specific quirks have a `uint32_t` value of `((0xF8586 << 10) | n)`, for
some small integer `n`. The generated `C` language file defines human-readable
names for those constant values.
## Listing
- [GIF image decoder quirks](/std/gif/decode_quirks.wuffs)