blob: 2401dfdb003febe0ddd6297c0787d08e7f70cd53 [file] [log] [blame]
// Copyright 2024 The Wuffs Authors.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// https://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
//
// SPDX-License-Identifier: Apache-2.0 OR MIT
// --------
// Quirks are discussed in (/doc/note/quirks.md).
//
// The base38 encoding of "jpeg" is 0x11_53D3. Left shifting by 10 gives
// 0x454F_4C00.
pri const QUIRKS_BASE : base.u32 = 0x454F_4C00
// --------
// When this quirk value is non-zero, the decoder will not support progressive
// JPEG images. When combined with setting base.QUIRK_QUALITY to "lower
// quality", this means that decoding will never require any temporary "work
// buffer" memory: decoder.workbuf_len will always return a range (a min and
// max pair) whose minimum value is zero.
//
// The maximum value can still be positive, as using more memory might lead to
// faster decoding, but a zero minimum means that it's valid for the caller to
// not allocate any memory for a work buffer.
//
// When opted into lower quality decoding, the workbuf_len minimum will be zero
// and positive for sequential and progressive JPEGs respectively, regardless
// of this QUIRK_REJECT_PROGRESSIVE_JPEGS key's value. But setting this quirk
// explicitly will produce a "#rejected progressive JPEG" error when
// encountering a progressive JPEG. This results in more readable calling code,
// instead of commenting about "positive work buffer minimum length implies a
// progressive JPEG".
pub const QUIRK_REJECT_PROGRESSIVE_JPEGS : base.u32 = 0x454F_4C00 | 0x00
// --------
// The base.QUIRK_QUALITY key is defined in the base package, not this package.
// Still, here's some documentation on how this package responds to that (key,
// value) quirk pair.
//
// If decoder.set_quirk is passed a base.QUIRK_QUALITY as the key argument
// then, when re-interpreting the u64 value argument as a signed i64 number, a
// negative number opts the decoder in to a slightly worse quality but leaner
// (less memory required) chroma upsampling algorithm.
//
// Negative (in i64 space) means >= 0x8000_0000_0000_0000 (in u64 space).
// base.QUIRK_QUALITY__VALUE__LOWER_QUALITY is one such value.
//
// Specifically, a negative quirk value uses a box filter. A non-negative quirk
// value (including the default value, zero) uses the same triangle filter that
// libjpeg-turbo also uses by default, which requires chroma upsampling on the
// edges of a MCU (Minimum Coded Unit) to remember adjacent MCU's values.
//
// Leaner means that for common (sequential) JPEG images, the range returned by
// decoder.workbuf_len will have a minimum value of zero, meaning that no work
// buffer memory needs to be allocated. Decoding rarer (progressive) JPEGs will
// still always require a positive amount of work buffer memory, for reasons
// unrelated to chroma upsampling. The exact amount required depends on factors
// like the JPEG image's width, height, component count and subsampling ratios.
//
// Regardless of the quirk value, as always, the workbuf_len method returns a
// range, whose min and max can be different. The caller is able to choose
// between providing the minimal amount of work buffer memory (for slightly
// slower decoding) or the maximal amount (for slightly faster decoding).
//
// Callers that never wish to allocate work buffer memory can simply reject
// progressive JPEGs (where "workbuf_len().min_incl > 0" despite setting the
// base.QUIRK_QUALITY key to a negative quirk value) as unsupported. See also
// QUIRK_REJECT_PROGRESSIVE_JPEGS.
//
// For some pictures comparing box and triangle filter decodings, see
// https://nigeltao.github.io/blog/2024/jpeg-chroma-upsampling.html