Spin out std/gif/decode_quirks.wuffs
diff --git a/std/gif/decode_gif.wuffs b/std/gif/decode_gif.wuffs
index 271084c..a486b23 100644
--- a/std/gif/decode_gif.wuffs
+++ b/std/gif/decode_gif.wuffs
@@ -29,80 +29,6 @@
// need a per-pixel-row workbuf.
pub const decoder_workbuf_len_max_incl_worst_case base.u64 = 1
-// --------
-
-// Quirks are discussed in (/doc/note/quirks.md).
-//
-// The base38 encoding of "gif " is 0xF8586.
-
-// When this quirk is enabled, when skipping over frames, the number of frames
-// visited isn't incremented when the last byte of the N'th frame is seen.
-// Instead, it is incremented when the first byte of the N+1'th frame's header
-// is seen. There may be zero or more GIF extensions between the N'th frame's
-// payload and the N+1'th frame's header.
-//
-// For a well-formed GIF, this won't have much effect. For a malformed GIF,
-// this can affect the number of valid frames, if there is an error detected in
-// the extensions between one frame's payload and the next frame's header.
-//
-// Some other GIF decoders don't register the N'th frame as complete until they
-// see the N+1'th frame's header (or the end-of-animation terminator), so that
-// e.g. the API for visiting the N'th frame can also return whether it's the
-// final frame. Enabling this quirk allows for matching that behavior.
-pub const quirk_delay_num_decoded_frames base.u32 = (0xF8586 << 10) | 0
-
-// When this quirk is enabled, the background color of the first frame is set
-// to black whenever that first frame has a local (frame-specific) palette.
-// That black can be either opaque black or transparent black, depending on
-// whether or not that first frame is opaque: whether that local palette
-// contains a transparent color.
-//
-// This has no effect unless quirk_honor_background_color is also enabled.
-//
-// There isn't really much of a rationale for this, other than it matches the
-// behavior of another GIF implementation.
-pub const quirk_first_frame_local_palette_means_black_background base.u32 = (0xF8586 << 10) | 1
-
-// When this quirk is enabled, the background color is taken from the GIF
-// instead of always being transparent black. If the background color index in
-// the GIF header is non-zero but less than the global palette's size, the
-// global background color is that global palette's entry. Otherwise, it is
-// opaque black. A frame's background color is transparent if the frame palette
-// contains a transparent color. Otherwise, it is the global background color.
-// Note that different frames can have different background colors.
-//
-// Specifically, if the initial frame bounds is smaller than the image bounds,
-// those pixels outside the initial frame bounds are assumed to start as that
-// frame background color. The frame background color should also be used when
-// processing WUFFS_BASE__ANIMATION_DISPOSAL__RESTORE_BACKGROUND. In both
-// cases, the caller of Wuffs, not Wuffs itself, is responsible for filling the
-// pixel buffer with that color.
-pub const quirk_honor_background_color base.u32 = (0xF8586 << 10) | 2
-
-// When this quirk is enabled, silently ignore e.g. a frame that reports a
-// width and height of 6 pixels each, followed by 50 pixel values. In that
-// case, we process the first 36 pixel values and discard the excess 14.
-pub const quirk_ignore_too_much_pixel_data base.u32 = (0xF8586 << 10) | 3
-
-// When this quirk is enabled, if the initial frame bounds extends beyond the
-// image bounds, then the image bounds stay unchanged. By default (with this
-// quirk disabled), the image bounds are adjusted to always contain the first
-// frame's bounds (but not necessarily subsequent frame's bounds).
-//
-// For more discussion, see
-// https://github.com/google/wuffs/blob/master/test/data/artificial/gif-frame-out-of-bounds.gif.make-artificial.txt
-pub const quirk_image_bounds_are_strict base.u32 = (0xF8586 << 10) | 4
-
-// When this quirk is enabled, a frame with zero width or height is rejected
-// during decode_frame (but accepted during decode_frame_config).
-pub const quirk_reject_empty_frame base.u32 = (0xF8586 << 10) | 5
-
-// When this quirk is enabled, a frame with no explicit palette is rejected,
-// instead of implicitly having a palette with every entry being opaque black.
-pub const quirk_reject_empty_palette base.u32 = (0xF8586 << 10) | 6
-
-// --------
-
// See the spec appendix E "Interlaced Images" on page 29. The first element
// represents either that the frame was non-interlaced, or that all interlace
// stages are complete. Otherwise, the four interlace stages are elements 4, 3,
diff --git a/std/gif/decode_quirks.wuffs b/std/gif/decode_quirks.wuffs
new file mode 100644
index 0000000..27fbf86
--- /dev/null
+++ b/std/gif/decode_quirks.wuffs
@@ -0,0 +1,85 @@
+// 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.
+
+// --------
+
+// Quirks are discussed in (/doc/note/quirks.md).
+//
+// The base38 encoding of "gif " is 0xF8586.
+
+// When this quirk is enabled, when skipping over frames, the number of frames
+// visited isn't incremented when the last byte of the N'th frame is seen.
+// Instead, it is incremented when the first byte of the N+1'th frame's header
+// is seen. There may be zero or more GIF extensions between the N'th frame's
+// payload and the N+1'th frame's header.
+//
+// For a well-formed GIF, this won't have much effect. For a malformed GIF,
+// this can affect the number of valid frames, if there is an error detected in
+// the extensions between one frame's payload and the next frame's header.
+//
+// Some other GIF decoders don't register the N'th frame as complete until they
+// see the N+1'th frame's header (or the end-of-animation terminator), so that
+// e.g. the API for visiting the N'th frame can also return whether it's the
+// final frame. Enabling this quirk allows for matching that behavior.
+pub const quirk_delay_num_decoded_frames base.u32 = (0xF8586 << 10) | 0
+
+// When this quirk is enabled, the background color of the first frame is set
+// to black whenever that first frame has a local (frame-specific) palette.
+// That black can be either opaque black or transparent black, depending on
+// whether or not that first frame is opaque: whether that local palette
+// contains a transparent color.
+//
+// This has no effect unless quirk_honor_background_color is also enabled.
+//
+// There isn't really much of a rationale for this, other than it matches the
+// behavior of another GIF implementation.
+pub const quirk_first_frame_local_palette_means_black_background base.u32 = (0xF8586 << 10) | 1
+
+// When this quirk is enabled, the background color is taken from the GIF
+// instead of always being transparent black. If the background color index in
+// the GIF header is non-zero but less than the global palette's size, the
+// global background color is that global palette's entry. Otherwise, it is
+// opaque black. A frame's background color is transparent if the frame palette
+// contains a transparent color. Otherwise, it is the global background color.
+// Note that different frames can have different background colors.
+//
+// Specifically, if the initial frame bounds is smaller than the image bounds,
+// those pixels outside the initial frame bounds are assumed to start as that
+// frame background color. The frame background color should also be used when
+// processing WUFFS_BASE__ANIMATION_DISPOSAL__RESTORE_BACKGROUND. In both
+// cases, the caller of Wuffs, not Wuffs itself, is responsible for filling the
+// pixel buffer with that color.
+pub const quirk_honor_background_color base.u32 = (0xF8586 << 10) | 2
+
+// When this quirk is enabled, silently ignore e.g. a frame that reports a
+// width and height of 6 pixels each, followed by 50 pixel values. In that
+// case, we process the first 36 pixel values and discard the excess 14.
+pub const quirk_ignore_too_much_pixel_data base.u32 = (0xF8586 << 10) | 3
+
+// When this quirk is enabled, if the initial frame bounds extends beyond the
+// image bounds, then the image bounds stay unchanged. By default (with this
+// quirk disabled), the image bounds are adjusted to always contain the first
+// frame's bounds (but not necessarily subsequent frame's bounds).
+//
+// For more discussion, see
+// https://github.com/google/wuffs/blob/master/test/data/artificial/gif-frame-out-of-bounds.gif.make-artificial.txt
+pub const quirk_image_bounds_are_strict base.u32 = (0xF8586 << 10) | 4
+
+// When this quirk is enabled, a frame with zero width or height is rejected
+// during decode_frame (but accepted during decode_frame_config).
+pub const quirk_reject_empty_frame base.u32 = (0xF8586 << 10) | 5
+
+// When this quirk is enabled, a frame with no explicit palette is rejected,
+// instead of implicitly having a palette with every entry being opaque black.
+pub const quirk_reject_empty_palette base.u32 = (0xF8586 << 10) | 6