Have wuffs_aux SelectPixfmt default to BGRA_PREMUL
diff --git a/example/imageviewer/imageviewer.cc b/example/imageviewer/imageviewer.cc
index 3b12f89..c196ee7 100644
--- a/example/imageviewer/imageviewer.cc
+++ b/example/imageviewer/imageviewer.cc
@@ -89,6 +89,17 @@
 wuffs_base__slice_u8 g_pixbuf_mem_slice = {0};
 uint32_t g_background_color_index = 0;
 
+class MyCallbacks : public wuffs_aux::DecodeImageCallbacks {
+ public:
+  // This override is redundant - it is the same as the default
+  // implementation. It exists because this is example code and shows how to
+  // decode to other pixel formats such as BGR_565 or RGBA_NONPREMUL.
+  wuffs_base__pixel_format  //
+  SelectPixfmt(const wuffs_base__image_config& image_config) override {
+    return wuffs_base__make_pixel_format(WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL);
+  }
+};
+
 bool  //
 load_image(const char* filename) {
   FILE* file = stdin;
@@ -108,7 +119,7 @@
   g_pixbuf_mem_owner.reset();
   g_pixbuf_mem_slice = wuffs_base__empty_slice_u8();
 
-  wuffs_aux::DecodeImageCallbacks callbacks;
+  MyCallbacks callbacks;
   wuffs_aux::sync_io::FileInput input(file);
   wuffs_aux::DecodeImageResult res = wuffs_aux::DecodeImage(
       callbacks, input,
diff --git a/internal/cgen/auxiliary/image.cc b/internal/cgen/auxiliary/image.cc
index 125349d..6661383 100644
--- a/internal/cgen/auxiliary/image.cc
+++ b/internal/cgen/auxiliary/image.cc
@@ -88,8 +88,7 @@
 wuffs_base__pixel_format  //
 DecodeImageCallbacks::SelectPixfmt(
     const wuffs_base__image_config& image_config) {
-  return wuffs_base__make_pixel_format(
-      WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL);
+  return wuffs_base__make_pixel_format(WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL);
 }
 
 DecodeImageCallbacks::AllocResult  //
diff --git a/internal/cgen/auxiliary/image.hh b/internal/cgen/auxiliary/image.hh
index c46d2be..266f276 100644
--- a/internal/cgen/auxiliary/image.hh
+++ b/internal/cgen/auxiliary/image.hh
@@ -96,8 +96,8 @@
   // Returning otherwise means failure (DecodeImage_UnsupportedPixelFormat).
   //
   // The default SelectPixfmt implementation returns
-  // wuffs_base__make_pixel_format(WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL)
-  // which is 4 bytes per pixel (8 bits per channel × 4 channels).
+  // wuffs_base__make_pixel_format(WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL) which
+  // is 4 bytes per pixel (8 bits per channel × 4 channels).
   virtual wuffs_base__pixel_format  //
   SelectPixfmt(const wuffs_base__image_config& image_config);
 
diff --git a/internal/cgen/data/data.go b/internal/cgen/data/data.go
index da6e086..7903ad1 100644
--- a/internal/cgen/data/data.go
+++ b/internal/cgen/data/data.go
@@ -804,10 +804,10 @@
 const AuxImageCc = "" +
 	"// ---------------- Auxiliary - Image\n\n#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__AUX__IMAGE)\n\n#include <utility>\n\nnamespace wuffs_aux {\n\nDecodeImageResult::DecodeImageResult(MemOwner&& pixbuf_mem_owner0,\n                                     wuffs_base__slice_u8 pixbuf_mem_slice0,\n                                     wuffs_base__pixel_buffer pixbuf0,\n                                     std::string&& error_message0)\n    : pixbuf_mem_owner(std::move(pixbuf_mem_owner0)),\n      pixbuf_mem_slice(pixbuf_mem_slice0),\n      pixbuf(pixbuf0),\n      error_message(std::move(error_message0)) {}\n\nDecodeImageResult::DecodeImageResult(std::string&& error_message0)\n    : pixbuf_mem_owner(nullptr, &free),\n      pixbuf_mem_slice(wuffs_base__empty_slice_u8()),\n      pixbuf(wuffs_base__null_pixel_buffer()),\n      error_message(std::move(error_message0)) {}\n\nDecodeImageCallbacks::AllocResult::AllocResult(MemOwner&& mem_owner0,\n                                               wuffs_base__slice_u8 mem_slice0" +
 	")\n    : mem_owner(std::move(mem_owner0)),\n      mem_slice(mem_slice0),\n      error_message(\"\") {}\n\nDecodeImageCallbacks::AllocResult::AllocResult(std::string&& error_message0)\n    : mem_owner(nullptr, &free),\n      mem_slice(wuffs_base__empty_slice_u8()),\n      error_message(std::move(error_message0)) {}\n\nwuffs_base__image_decoder::unique_ptr  //\nDecodeImageCallbacks::SelectDecoder(uint32_t fourcc,\n                                    wuffs_base__slice_u8 prefix) {\n  switch (fourcc) {\n#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BMP)\n    case WUFFS_BASE__FOURCC__BMP:\n      return wuffs_bmp__decoder::alloc_as__wuffs_base__image_decoder();\n#endif\n\n#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GIF)\n    case WUFFS_BASE__FOURCC__GIF:\n      return wuffs_gif__decoder::alloc_as__wuffs_base__image_decoder();\n#endif\n\n#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NIE)\n    case WUFFS_BASE__FOURCC__NIE:\n      return wuffs_nie__decoder::alloc_as__wuffs_ba" +
-	"se__image_decoder();\n#endif\n\n#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__PNG)\n    case WUFFS_BASE__FOURCC__PNG: {\n      auto dec = wuffs_png__decoder::alloc_as__wuffs_base__image_decoder();\n      // Favor faster decodes over rejecting invalid checksums.\n      dec->set_quirk_enabled(WUFFS_BASE__QUIRK_IGNORE_CHECKSUM, true);\n      return dec;\n    }\n#endif\n\n#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WBMP)\n    case WUFFS_BASE__FOURCC__WBMP:\n      return wuffs_wbmp__decoder::alloc_as__wuffs_base__image_decoder();\n#endif\n  }\n\n  return wuffs_base__image_decoder::unique_ptr(nullptr, &free);\n}\n\nwuffs_base__pixel_format  //\nDecodeImageCallbacks::SelectPixfmt(\n    const wuffs_base__image_config& image_config) {\n  return wuffs_base__make_pixel_format(\n      WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL);\n}\n\nDecodeImageCallbacks::AllocResult  //\nDecodeImageCallbacks::AllocPixbuf(const wuffs_base__image_config& image_config,\n                                  bool allow_uninitia" +
-	"lized_memory) {\n  uint32_t w = image_config.pixcfg.width();\n  uint32_t h = image_config.pixcfg.height();\n  if ((w == 0) || (h == 0)) {\n    return AllocResult(\"\");\n  }\n  uint64_t len = image_config.pixcfg.pixbuf_len();\n  if ((len == 0) || (SIZE_MAX < len)) {\n    return AllocResult(DecodeImage_UnsupportedPixelConfiguration);\n  }\n  void* ptr =\n      allow_uninitialized_memory ? malloc((size_t)len) : calloc((size_t)len, 1);\n  return ptr ? AllocResult(\n                   MemOwner(ptr, &free),\n                   wuffs_base__make_slice_u8((uint8_t*)ptr, (size_t)len))\n             : AllocResult(DecodeImage_OutOfMemory);\n}\n\nDecodeImageCallbacks::AllocResult  //\nDecodeImageCallbacks::AllocWorkbuf(wuffs_base__range_ii_u64 len_range,\n                                   bool allow_uninitialized_memory) {\n  uint64_t len = len_range.max_incl;\n  if (len == 0) {\n    return AllocResult(\"\");\n  } else if (SIZE_MAX < len) {\n    return AllocResult(DecodeImage_OutOfMemory);\n  }\n  void* ptr =\n      allow_uninitialized_memory ? malloc" +
-	"((size_t)len) : calloc((size_t)len, 1);\n  return ptr ? AllocResult(\n                   MemOwner(ptr, &free),\n                   wuffs_base__make_slice_u8((uint8_t*)ptr, (size_t)len))\n             : AllocResult(DecodeImage_OutOfMemory);\n}\n\nvoid  //\nDecodeImageCallbacks::Done(\n    DecodeImageResult& result,\n    sync_io::Input& input,\n    IOBuffer& buffer,\n    wuffs_base__image_decoder::unique_ptr image_decoder) {}\n\nconst char DecodeImage_BufferIsTooShort[] =  //\n    \"wuffs_aux::DecodeImage: buffer is too short\";\nconst char DecodeImage_MaxInclDimensionExceeded[] =  //\n    \"wuffs_aux::DecodeImage: max_incl_dimension exceeded\";\nconst char DecodeImage_OutOfMemory[] =  //\n    \"wuffs_aux::DecodeImage: out of memory\";\nconst char DecodeImage_UnexpectedEndOfFile[] =  //\n    \"wuffs_aux::DecodeImage: unexpected end of file\";\nconst char DecodeImage_UnsupportedImageFormat[] =  //\n    \"wuffs_aux::DecodeImage: unsupported image format\";\nconst char DecodeImage_UnsupportedPixelBlend[] =  //\n    \"wuffs_aux::DecodeImage: unsuppor" +
-	"ted pixel blend\";\nconst char DecodeImage_UnsupportedPixelConfiguration[] =  //\n    \"wuffs_aux::DecodeImage: unsupported pixel configuration\";\nconst char DecodeImage_UnsupportedPixelFormat[] =  //\n    \"wuffs_aux::DecodeImage: unsupported pixel format\";\n\n" +
+	"se__image_decoder();\n#endif\n\n#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__PNG)\n    case WUFFS_BASE__FOURCC__PNG: {\n      auto dec = wuffs_png__decoder::alloc_as__wuffs_base__image_decoder();\n      // Favor faster decodes over rejecting invalid checksums.\n      dec->set_quirk_enabled(WUFFS_BASE__QUIRK_IGNORE_CHECKSUM, true);\n      return dec;\n    }\n#endif\n\n#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WBMP)\n    case WUFFS_BASE__FOURCC__WBMP:\n      return wuffs_wbmp__decoder::alloc_as__wuffs_base__image_decoder();\n#endif\n  }\n\n  return wuffs_base__image_decoder::unique_ptr(nullptr, &free);\n}\n\nwuffs_base__pixel_format  //\nDecodeImageCallbacks::SelectPixfmt(\n    const wuffs_base__image_config& image_config) {\n  return wuffs_base__make_pixel_format(WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL);\n}\n\nDecodeImageCallbacks::AllocResult  //\nDecodeImageCallbacks::AllocPixbuf(const wuffs_base__image_config& image_config,\n                                  bool allow_uninitialized_memo" +
+	"ry) {\n  uint32_t w = image_config.pixcfg.width();\n  uint32_t h = image_config.pixcfg.height();\n  if ((w == 0) || (h == 0)) {\n    return AllocResult(\"\");\n  }\n  uint64_t len = image_config.pixcfg.pixbuf_len();\n  if ((len == 0) || (SIZE_MAX < len)) {\n    return AllocResult(DecodeImage_UnsupportedPixelConfiguration);\n  }\n  void* ptr =\n      allow_uninitialized_memory ? malloc((size_t)len) : calloc((size_t)len, 1);\n  return ptr ? AllocResult(\n                   MemOwner(ptr, &free),\n                   wuffs_base__make_slice_u8((uint8_t*)ptr, (size_t)len))\n             : AllocResult(DecodeImage_OutOfMemory);\n}\n\nDecodeImageCallbacks::AllocResult  //\nDecodeImageCallbacks::AllocWorkbuf(wuffs_base__range_ii_u64 len_range,\n                                   bool allow_uninitialized_memory) {\n  uint64_t len = len_range.max_incl;\n  if (len == 0) {\n    return AllocResult(\"\");\n  } else if (SIZE_MAX < len) {\n    return AllocResult(DecodeImage_OutOfMemory);\n  }\n  void* ptr =\n      allow_uninitialized_memory ? malloc((size_t)l" +
+	"en) : calloc((size_t)len, 1);\n  return ptr ? AllocResult(\n                   MemOwner(ptr, &free),\n                   wuffs_base__make_slice_u8((uint8_t*)ptr, (size_t)len))\n             : AllocResult(DecodeImage_OutOfMemory);\n}\n\nvoid  //\nDecodeImageCallbacks::Done(\n    DecodeImageResult& result,\n    sync_io::Input& input,\n    IOBuffer& buffer,\n    wuffs_base__image_decoder::unique_ptr image_decoder) {}\n\nconst char DecodeImage_BufferIsTooShort[] =  //\n    \"wuffs_aux::DecodeImage: buffer is too short\";\nconst char DecodeImage_MaxInclDimensionExceeded[] =  //\n    \"wuffs_aux::DecodeImage: max_incl_dimension exceeded\";\nconst char DecodeImage_OutOfMemory[] =  //\n    \"wuffs_aux::DecodeImage: out of memory\";\nconst char DecodeImage_UnexpectedEndOfFile[] =  //\n    \"wuffs_aux::DecodeImage: unexpected end of file\";\nconst char DecodeImage_UnsupportedImageFormat[] =  //\n    \"wuffs_aux::DecodeImage: unsupported image format\";\nconst char DecodeImage_UnsupportedPixelBlend[] =  //\n    \"wuffs_aux::DecodeImage: unsupported pixel " +
+	"blend\";\nconst char DecodeImage_UnsupportedPixelConfiguration[] =  //\n    \"wuffs_aux::DecodeImage: unsupported pixel configuration\";\nconst char DecodeImage_UnsupportedPixelFormat[] =  //\n    \"wuffs_aux::DecodeImage: unsupported pixel format\";\n\n" +
 	"" +
 	"// --------\n\nnamespace {\n\nstd::string  //\nDecodeImageAdvanceIOBuf(sync_io::Input& input,\n                        wuffs_base__io_buffer& io_buf,\n                        bool compactable,\n                        uint64_t min_excl_pos,\n                        uint64_t pos) {\n  if ((pos <= min_excl_pos) || (pos < io_buf.reader_position())) {\n    // Redirects must go forward.\n    return DecodeImage_UnsupportedImageFormat;\n  }\n  while (true) {\n    uint64_t relative_pos = pos - io_buf.reader_position();\n    if (relative_pos <= io_buf.reader_length()) {\n      io_buf.meta.ri += (size_t)relative_pos;\n      break;\n    } else if (io_buf.meta.closed) {\n      return DecodeImage_UnexpectedEndOfFile;\n    }\n    io_buf.meta.ri = io_buf.meta.wi;\n    if (compactable) {\n      io_buf.compact();\n    }\n    std::string error_message = input.CopyIn(&io_buf);\n    if (!error_message.empty()) {\n      return error_message;\n    }\n  }\n  return \"\";\n}\n\nDecodeImageResult  //\nDecodeImage0(wuffs_base__image_decoder::unique_ptr& image_decoder,\n  " +
 	"           DecodeImageCallbacks& callbacks,\n             sync_io::Input& input,\n             wuffs_base__io_buffer& io_buf,\n             wuffs_base__pixel_blend pixel_blend,\n             wuffs_base__color_u32_argb_premul background_color,\n             uint32_t max_incl_dimension) {\n  // Check args.\n  switch (pixel_blend) {\n    case WUFFS_BASE__PIXEL_BLEND__SRC:\n    case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:\n      break;\n    default:\n      return DecodeImageResult(DecodeImage_UnsupportedPixelBlend);\n  }\n\n  wuffs_base__image_config image_config = wuffs_base__null_image_config();\n  uint64_t start_pos = io_buf.reader_position();\n  bool redirected = false;\n  int32_t fourcc = 0;\nredirect:\n  do {\n    // Determine the image format.\n    if (!redirected) {\n      while (true) {\n        fourcc = wuffs_base__magic_number_guess_fourcc(io_buf.reader_slice());\n        if (fourcc > 0) {\n          break;\n        } else if ((fourcc == 0) && (io_buf.reader_length() >= 64)) {\n          break;\n        } else if (io_buf.meta.closed ||" +
@@ -826,12 +826,12 @@
 	"// ---------------- Auxiliary - Image\n\nnamespace wuffs_aux {\n\nstruct DecodeImageResult {\n  DecodeImageResult(MemOwner&& pixbuf_mem_owner0,\n                    wuffs_base__slice_u8 pixbuf_mem_slice0,\n                    wuffs_base__pixel_buffer pixbuf0,\n                    std::string&& error_message0);\n  DecodeImageResult(std::string&& error_message0);\n\n  MemOwner pixbuf_mem_owner;\n  wuffs_base__slice_u8 pixbuf_mem_slice;\n  wuffs_base__pixel_buffer pixbuf;\n  std::string error_message;\n};\n\n// DecodeImageCallbacks are the callbacks given to DecodeImage. They are always\n// called in this order:\n//  1. SelectDecoder\n//  2. SelectPixfmt\n//  3. AllocPixbuf\n//  4. AllocWorkbuf\n//  5. Done\n//\n// It may return early - the third callback might not be invoked if the second\n// one fails - but the final callback (Done) is always invoked.\nclass DecodeImageCallbacks {\n public:\n  // AllocResult holds a memory allocation (the result of malloc or new, a\n  // statically allocated pointer, etc), or an error message. The memory i" +
 	"s\n  // de-allocated when mem_owner goes out of scope and is destroyed.\n  struct AllocResult {\n    AllocResult(MemOwner&& mem_owner0, wuffs_base__slice_u8 mem_slice0);\n    AllocResult(std::string&& error_message0);\n\n    MemOwner mem_owner;\n    wuffs_base__slice_u8 mem_slice;\n    std::string error_message;\n  };\n\n  // SelectDecoder returns the image decoder for the input data's file format.\n  // Returning a nullptr means failure (DecodeImage_UnsupportedImageFormat).\n  //\n  // Common formats will have a FourCC value in the range [1 ..= 0x7FFF_FFFF],\n  // such as WUFFS_BASE__FOURCC__JPEG. A zero FourCC value means that the\n  // caller is responsible for examining the opening bytes (a prefix) of the\n  // input data. SelectDecoder implementations should not modify those bytes.\n  //\n  // SelectDecoder might be called more than once, since some image file\n  // formats can wrap others. For example, a nominal BMP file can actually\n  // contain a JPEG or a PNG.\n  //\n  // The default SelectDecoder accepts the FOURCC codes" +
 	" listed below. For\n  // modular builds (i.e. when #define'ing WUFFS_CONFIG__MODULES), acceptance\n  // of the ETC file format is optional (for each value of ETC) and depends on\n  // the corresponding module to be enabled at compile time (i.e. #define'ing\n  // WUFFS_CONFIG__MODULE__ETC).\n  //  - WUFFS_BASE__FOURCC__BMP\n  //  - WUFFS_BASE__FOURCC__GIF\n  //  - WUFFS_BASE__FOURCC__NIE\n  //  - WUFFS_BASE__FOURCC__PNG\n  //  - WUFFS_BASE__FOURCC__WBMP\n  virtual wuffs_base__image_decoder::unique_ptr  //\n  SelectDecoder(uint32_t fourcc, wuffs_base__slice_u8 prefix);\n\n  // SelectPixfmt returns the destination pixel format for AllocPixbuf. It\n  // should return wuffs_base__make_pixel_format(etc) called with one of:\n  //  - WUFFS_BASE__PIXEL_FORMAT__BGR_565\n  //  - WUFFS_BASE__PIXEL_FORMAT__BGR\n  //  - WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL\n  //  - WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE\n  //  - WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL\n  //  - WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL\n  //  - WUFFS_BASE__PIXEL_FORMA" +
-	"T__RGBA_PREMUL\n  // or return image_config.pixcfg.pixel_format(). The latter means to use the\n  // image file's natural pixel format. For example, GIF images' natural pixel\n  // format is an indexed one.\n  //\n  // Returning otherwise means failure (DecodeImage_UnsupportedPixelFormat).\n  //\n  // The default SelectPixfmt implementation returns\n  // wuffs_base__make_pixel_format(WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL)\n  // which is 4 bytes per pixel (8 bits per channel × 4 channels).\n  virtual wuffs_base__pixel_format  //\n  SelectPixfmt(const wuffs_base__image_config& image_config);\n\n  // AllocPixbuf allocates the pixel buffer.\n  //\n  // allow_uninitialized_memory will be true if a valid background_color was\n  // passed to DecodeImage, since the pixel buffer's contents will be\n  // overwritten with that color after AllocPixbuf returns.\n  //\n  // The default AllocPixbuf implementation allocates either uninitialized or\n  // zeroed memory. Zeroed memory typically corresponds to filling with opaque\n  // black or " +
-	"transparent black, depending on the pixel format.\n  virtual AllocResult  //\n  AllocPixbuf(const wuffs_base__image_config& image_config,\n              bool allow_uninitialized_memory);\n\n  // AllocWorkbuf allocates the work buffer. The allocated buffer's length\n  // should be at least len_range.min_incl, but larger allocations (up to\n  // len_range.max_incl) may have better performance (by using more memory).\n  //\n  // The default AllocWorkbuf implementation allocates len_range.max_incl bytes\n  // of either uninitialized or zeroed memory.\n  virtual AllocResult  //\n  AllocWorkbuf(wuffs_base__range_ii_u64 len_range,\n               bool allow_uninitialized_memory);\n\n  // Done is always the last Callback method called by DecodeImage, whether or\n  // not parsing the input encountered an error. Even when successful, trailing\n  // data may remain in input and buffer.\n  //\n  // The image_decoder is the one returned by SelectDecoder (if SelectDecoder\n  // was successful), or a no-op unique_ptr otherwise. Like any unique" +
-	"_ptr,\n  // ownership moves to the Done implementation.\n  //\n  // Do not keep a reference to buffer or buffer.data.ptr after Done returns,\n  // as DecodeImage may then de-allocate the backing array.\n  //\n  // The default Done implementation is a no-op, other than running the\n  // image_decoder unique_ptr destructor.\n  virtual void  //\n  Done(DecodeImageResult& result,\n       sync_io::Input& input,\n       IOBuffer& buffer,\n       wuffs_base__image_decoder::unique_ptr image_decoder);\n};\n\nextern const char DecodeImage_BufferIsTooShort[];\nextern const char DecodeImage_MaxInclDimensionExceeded[];\nextern const char DecodeImage_OutOfMemory[];\nextern const char DecodeImage_UnexpectedEndOfFile[];\nextern const char DecodeImage_UnsupportedImageFormat[];\nextern const char DecodeImage_UnsupportedPixelBlend[];\nextern const char DecodeImage_UnsupportedPixelConfiguration[];\nextern const char DecodeImage_UnsupportedPixelFormat[];\n\n// DecodeImage decodes the image data in input. A variety of image file formats\n// can be decoded" +
-	", depending on what callbacks.SelectDecoder returns.\n//\n// For animated formats, only the first frame is returned, since the API is\n// simpler for synchronous I/O and having DecodeImage only return when\n// completely done, but rendering animation often involves handling other\n// events in between animation frames. To decode multiple frames of animated\n// images, or for asynchronous I/O (e.g. when decoding an image streamed over\n// the network), use Wuffs' lower level C API instead of its higher level,\n// simplified C++ API (the wuffs_aux API).\n//\n// The DecodeImageResult's fields depend on whether decoding succeeded:\n//  - On total success, the error_message is empty and pixbuf.pixcfg.is_valid()\n//    is true.\n//  - On partial success (e.g. the input file was truncated but we are still\n//    able to decode some of the pixels), error_message is non-empty but\n//    pixbuf.pixcfg.is_valid() is still true. It is up to the caller whether to\n//    accept or reject partial success.\n//  - On failure, the error_messag" +
-	"e is non_empty and pixbuf.pixcfg.is_valid()\n//    is false.\n//\n// The callbacks allocate the pixel buffer memory and work buffer memory. On\n// success, pixel buffer memory ownership is passed to the DecodeImage caller\n// as the returned pixbuf_mem_owner. Regardless of success or failure, the work\n// buffer memory is deleted.\n//\n// The pixel_blend (one of the constants listed below) determines how to\n// composite the decoded image over the pixel buffer's original pixels (as\n// returned by callbacks.AllocPixbuf):\n//  - WUFFS_BASE__PIXEL_BLEND__SRC\n//  - WUFFS_BASE__PIXEL_BLEND__SRC_OVER\n//\n// The background_color is used to fill the pixel buffer after\n// callbacks.AllocPixbuf returns, if it is valid in the\n// wuffs_base__color_u32_argb_premul__is_valid sense. The default value,\n// 0x0000_0001, is not valid since its Blue channel value (0x01) is greater\n// than its Alpha channel value (0x00). A valid background_color will typically\n// be overwritten when pixel_blend is WUFFS_BASE__PIXEL_BLEND__SRC, but might\n// " +
-	"still be visible on partial (not total) success or when pixel_blend is\n// WUFFS_BASE__PIXEL_BLEND__SRC_OVER and the decoded image is not fully opaque.\n//\n// Decoding fails (with DecodeImage_MaxInclDimensionExceeded) if the image's\n// width or height is greater than max_incl_dimension.\nDecodeImageResult  //\nDecodeImage(DecodeImageCallbacks& callbacks,\n            sync_io::Input& input,\n            wuffs_base__pixel_blend pixel_blend = WUFFS_BASE__PIXEL_BLEND__SRC,\n            wuffs_base__color_u32_argb_premul background_color = 1,  // Invalid.\n            uint32_t max_incl_dimension = 1048575);  // 0x000F_FFFF\n\n}  // namespace wuffs_aux\n" +
+	"T__RGBA_PREMUL\n  // or return image_config.pixcfg.pixel_format(). The latter means to use the\n  // image file's natural pixel format. For example, GIF images' natural pixel\n  // format is an indexed one.\n  //\n  // Returning otherwise means failure (DecodeImage_UnsupportedPixelFormat).\n  //\n  // The default SelectPixfmt implementation returns\n  // wuffs_base__make_pixel_format(WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL) which\n  // is 4 bytes per pixel (8 bits per channel × 4 channels).\n  virtual wuffs_base__pixel_format  //\n  SelectPixfmt(const wuffs_base__image_config& image_config);\n\n  // AllocPixbuf allocates the pixel buffer.\n  //\n  // allow_uninitialized_memory will be true if a valid background_color was\n  // passed to DecodeImage, since the pixel buffer's contents will be\n  // overwritten with that color after AllocPixbuf returns.\n  //\n  // The default AllocPixbuf implementation allocates either uninitialized or\n  // zeroed memory. Zeroed memory typically corresponds to filling with opaque\n  // black or tra" +
+	"nsparent black, depending on the pixel format.\n  virtual AllocResult  //\n  AllocPixbuf(const wuffs_base__image_config& image_config,\n              bool allow_uninitialized_memory);\n\n  // AllocWorkbuf allocates the work buffer. The allocated buffer's length\n  // should be at least len_range.min_incl, but larger allocations (up to\n  // len_range.max_incl) may have better performance (by using more memory).\n  //\n  // The default AllocWorkbuf implementation allocates len_range.max_incl bytes\n  // of either uninitialized or zeroed memory.\n  virtual AllocResult  //\n  AllocWorkbuf(wuffs_base__range_ii_u64 len_range,\n               bool allow_uninitialized_memory);\n\n  // Done is always the last Callback method called by DecodeImage, whether or\n  // not parsing the input encountered an error. Even when successful, trailing\n  // data may remain in input and buffer.\n  //\n  // The image_decoder is the one returned by SelectDecoder (if SelectDecoder\n  // was successful), or a no-op unique_ptr otherwise. Like any unique_pt" +
+	"r,\n  // ownership moves to the Done implementation.\n  //\n  // Do not keep a reference to buffer or buffer.data.ptr after Done returns,\n  // as DecodeImage may then de-allocate the backing array.\n  //\n  // The default Done implementation is a no-op, other than running the\n  // image_decoder unique_ptr destructor.\n  virtual void  //\n  Done(DecodeImageResult& result,\n       sync_io::Input& input,\n       IOBuffer& buffer,\n       wuffs_base__image_decoder::unique_ptr image_decoder);\n};\n\nextern const char DecodeImage_BufferIsTooShort[];\nextern const char DecodeImage_MaxInclDimensionExceeded[];\nextern const char DecodeImage_OutOfMemory[];\nextern const char DecodeImage_UnexpectedEndOfFile[];\nextern const char DecodeImage_UnsupportedImageFormat[];\nextern const char DecodeImage_UnsupportedPixelBlend[];\nextern const char DecodeImage_UnsupportedPixelConfiguration[];\nextern const char DecodeImage_UnsupportedPixelFormat[];\n\n// DecodeImage decodes the image data in input. A variety of image file formats\n// can be decoded, d" +
+	"epending on what callbacks.SelectDecoder returns.\n//\n// For animated formats, only the first frame is returned, since the API is\n// simpler for synchronous I/O and having DecodeImage only return when\n// completely done, but rendering animation often involves handling other\n// events in between animation frames. To decode multiple frames of animated\n// images, or for asynchronous I/O (e.g. when decoding an image streamed over\n// the network), use Wuffs' lower level C API instead of its higher level,\n// simplified C++ API (the wuffs_aux API).\n//\n// The DecodeImageResult's fields depend on whether decoding succeeded:\n//  - On total success, the error_message is empty and pixbuf.pixcfg.is_valid()\n//    is true.\n//  - On partial success (e.g. the input file was truncated but we are still\n//    able to decode some of the pixels), error_message is non-empty but\n//    pixbuf.pixcfg.is_valid() is still true. It is up to the caller whether to\n//    accept or reject partial success.\n//  - On failure, the error_message i" +
+	"s non_empty and pixbuf.pixcfg.is_valid()\n//    is false.\n//\n// The callbacks allocate the pixel buffer memory and work buffer memory. On\n// success, pixel buffer memory ownership is passed to the DecodeImage caller\n// as the returned pixbuf_mem_owner. Regardless of success or failure, the work\n// buffer memory is deleted.\n//\n// The pixel_blend (one of the constants listed below) determines how to\n// composite the decoded image over the pixel buffer's original pixels (as\n// returned by callbacks.AllocPixbuf):\n//  - WUFFS_BASE__PIXEL_BLEND__SRC\n//  - WUFFS_BASE__PIXEL_BLEND__SRC_OVER\n//\n// The background_color is used to fill the pixel buffer after\n// callbacks.AllocPixbuf returns, if it is valid in the\n// wuffs_base__color_u32_argb_premul__is_valid sense. The default value,\n// 0x0000_0001, is not valid since its Blue channel value (0x01) is greater\n// than its Alpha channel value (0x00). A valid background_color will typically\n// be overwritten when pixel_blend is WUFFS_BASE__PIXEL_BLEND__SRC, but might\n// sti" +
+	"ll be visible on partial (not total) success or when pixel_blend is\n// WUFFS_BASE__PIXEL_BLEND__SRC_OVER and the decoded image is not fully opaque.\n//\n// Decoding fails (with DecodeImage_MaxInclDimensionExceeded) if the image's\n// width or height is greater than max_incl_dimension.\nDecodeImageResult  //\nDecodeImage(DecodeImageCallbacks& callbacks,\n            sync_io::Input& input,\n            wuffs_base__pixel_blend pixel_blend = WUFFS_BASE__PIXEL_BLEND__SRC,\n            wuffs_base__color_u32_argb_premul background_color = 1,  // Invalid.\n            uint32_t max_incl_dimension = 1048575);  // 0x000F_FFFF\n\n}  // namespace wuffs_aux\n" +
 	""
 
 const AuxJsonCc = "" +
diff --git a/release/c/wuffs-unsupported-snapshot.c b/release/c/wuffs-unsupported-snapshot.c
index 1fc441d..083c64d 100644
--- a/release/c/wuffs-unsupported-snapshot.c
+++ b/release/c/wuffs-unsupported-snapshot.c
@@ -9567,8 +9567,8 @@
   // Returning otherwise means failure (DecodeImage_UnsupportedPixelFormat).
   //
   // The default SelectPixfmt implementation returns
-  // wuffs_base__make_pixel_format(WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL)
-  // which is 4 bytes per pixel (8 bits per channel × 4 channels).
+  // wuffs_base__make_pixel_format(WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL) which
+  // is 4 bytes per pixel (8 bits per channel × 4 channels).
   virtual wuffs_base__pixel_format  //
   SelectPixfmt(const wuffs_base__image_config& image_config);
 
@@ -38920,8 +38920,7 @@
 wuffs_base__pixel_format  //
 DecodeImageCallbacks::SelectPixfmt(
     const wuffs_base__image_config& image_config) {
-  return wuffs_base__make_pixel_format(
-      WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL);
+  return wuffs_base__make_pixel_format(WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL);
 }
 
 DecodeImageCallbacks::AllocResult  //