std/jpeg: let use_lower_quality work with CMYK
diff --git a/internal/cgen/base/pixconv-submodule-ycck.c b/internal/cgen/base/pixconv-submodule-ycck.c
index 0760b74..01d7b01 100644
--- a/internal/cgen/base/pixconv-submodule-ycck.c
+++ b/internal/cgen/base/pixconv-submodule-ycck.c
@@ -1078,6 +1078,100 @@
   }
 }
 
+static void  //
+wuffs_private_impl__swizzle_ycck__general__box_filter(
+    wuffs_base__pixel_buffer* dst,
+    uint32_t x_min_incl,
+    uint32_t x_max_excl,
+    uint32_t y_min_incl,
+    uint32_t y_max_excl,
+    const uint8_t* src_ptr0,
+    const uint8_t* src_ptr1,
+    const uint8_t* src_ptr2,
+    const uint8_t* src_ptr3,
+    uint32_t stride0,
+    uint32_t stride1,
+    uint32_t stride2,
+    uint32_t stride3,
+    uint32_t inv_h0,
+    uint32_t inv_h1,
+    uint32_t inv_h2,
+    uint32_t inv_h3,
+    uint32_t inv_v0,
+    uint32_t inv_v1,
+    uint32_t inv_v2,
+    uint32_t inv_v3,
+    uint32_t half_width_for_2to1,
+    uint32_t half_height_for_2to1,
+    uint8_t* scratch_buffer_2k_ptr,
+    wuffs_private_impl__swizzle_ycc__upsample_func (*upfuncs)[4][4],
+    wuffs_private_impl__swizzle_ycc__convert_4_func conv4func) {
+  wuffs_private_impl__swizzle_ycc__upsample_func upfunc0 =
+      (*upfuncs)[(inv_h0 - 1u) & 3u][(inv_v0 - 1u) & 3u];
+  wuffs_private_impl__swizzle_ycc__upsample_func upfunc1 =
+      (*upfuncs)[(inv_h1 - 1u) & 3u][(inv_v1 - 1u) & 3u];
+  wuffs_private_impl__swizzle_ycc__upsample_func upfunc2 =
+      (*upfuncs)[(inv_h2 - 1u) & 3u][(inv_v2 - 1u) & 3u];
+  wuffs_private_impl__swizzle_ycc__upsample_func upfunc3 =
+      (*upfuncs)[(inv_h3 - 1u) & 3u][(inv_v3 - 1u) & 3u];
+
+  uint32_t y;
+  for (y = y_min_incl; y < y_max_excl; y++) {
+    const uint8_t* src0_major =
+        src_ptr0 + (((y - y_min_incl) / inv_v0) * (size_t)stride0);
+    const uint8_t* src1_major =
+        src_ptr1 + (((y - y_min_incl) / inv_v1) * (size_t)stride1);
+    const uint8_t* src2_major =
+        src_ptr2 + (((y - y_min_incl) / inv_v2) * (size_t)stride2);
+    const uint8_t* src3_major =
+        src_ptr3 + (((y - y_min_incl) / inv_v3) * (size_t)stride3);
+
+    uint32_t x = x_min_incl;
+    while (x < x_max_excl) {
+      uint32_t end = x + 480u;
+      if (end > x_max_excl) {
+        end = x_max_excl;
+      }
+
+      uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0;
+      uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1;
+      uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2;
+      uint32_t src_len3 = ((end - x) + inv_h3 - 1u) / inv_h3;
+
+      const uint8_t* up0 = (*upfunc0)(               //
+          scratch_buffer_2k_ptr + (0u * 480u),       //
+          src0_major + ((x - x_min_incl) / inv_h0),  //
+          src0_major + ((x - x_min_incl) / inv_h0),  //
+          src_len0,                                  //
+          0u, false, false);
+
+      const uint8_t* up1 = (*upfunc1)(               //
+          scratch_buffer_2k_ptr + (1u * 480u),       //
+          src1_major + ((x - x_min_incl) / inv_h1),  //
+          src1_major + ((x - x_min_incl) / inv_h1),  //
+          src_len1,                                  //
+          0u, false, false);
+
+      const uint8_t* up2 = (*upfunc2)(               //
+          scratch_buffer_2k_ptr + (2u * 480u),       //
+          src2_major + ((x - x_min_incl) / inv_h2),  //
+          src2_major + ((x - x_min_incl) / inv_h2),  //
+          src_len2,                                  //
+          0u, false, false);
+
+      const uint8_t* up3 = (*upfunc3)(               //
+          scratch_buffer_2k_ptr + (3u * 480u),       //
+          src3_major + ((x - x_min_incl) / inv_h3),  //
+          src3_major + ((x - x_min_incl) / inv_h3),  //
+          src_len3,                                  //
+          0u, false, false);
+
+      (*conv4func)(dst, x, end, y, up0, up1, up2, up3);
+      x = end;
+    }
+  }
+}
+
 // --------
 
 // wuffs_private_impl__swizzle_flattened_length is like
@@ -1147,7 +1241,6 @@
              (4u <= ((unsigned int)v1 - 1u)) ||  //
              (4u <= ((unsigned int)v2 - 1u)) ||  //
              (triangle_filter_for_2to1 && ((x_min_incl | y_min_incl) > 0u)) ||
-             (!triangle_filter_for_2to1 && ((h3 | v3) > 0u)) ||
              (scratch_buffer_2k.len < 2048u)) {
     return wuffs_base__make_status(wuffs_base__error__bad_argument);
   }
@@ -1371,30 +1464,58 @@
     }
   }
 
-  void (*func)(wuffs_base__pixel_buffer * dst,  //
-               uint32_t x_min_incl,             //
-               uint32_t x_max_excl,             //
-               uint32_t y_min_incl,             //
-               uint32_t y_max_excl,             //
-               const uint8_t* src_ptr0,         //
-               const uint8_t* src_ptr1,         //
-               const uint8_t* src_ptr2,         //
-               uint32_t stride0,                //
-               uint32_t stride1,                //
-               uint32_t stride2,                //
-               uint32_t inv_h0,                 //
-               uint32_t inv_h1,                 //
-               uint32_t inv_h2,                 //
-               uint32_t inv_v0,                 //
-               uint32_t inv_v1,                 //
-               uint32_t inv_v2,                 //
-               uint32_t half_width_for_2to1,    //
-               uint32_t half_height_for_2to1,   //
-               uint8_t* scratch_buffer_2k_ptr,  //
-               wuffs_private_impl__swizzle_ycc__upsample_func(*upfuncs)[4][4],
-               wuffs_private_impl__swizzle_ycc__convert_3_func conv3func) =
+  void (*func3)(wuffs_base__pixel_buffer * dst,  //
+                uint32_t x_min_incl,             //
+                uint32_t x_max_excl,             //
+                uint32_t y_min_incl,             //
+                uint32_t y_max_excl,             //
+                const uint8_t* src_ptr0,         //
+                const uint8_t* src_ptr1,         //
+                const uint8_t* src_ptr2,         //
+                uint32_t stride0,                //
+                uint32_t stride1,                //
+                uint32_t stride2,                //
+                uint32_t inv_h0,                 //
+                uint32_t inv_h1,                 //
+                uint32_t inv_h2,                 //
+                uint32_t inv_v0,                 //
+                uint32_t inv_v1,                 //
+                uint32_t inv_v2,                 //
+                uint32_t half_width_for_2to1,    //
+                uint32_t half_height_for_2to1,   //
+                uint8_t* scratch_buffer_2k_ptr,  //
+                wuffs_private_impl__swizzle_ycc__upsample_func(*upfuncs)[4][4],
+                wuffs_private_impl__swizzle_ycc__convert_3_func conv3func) =
       &wuffs_private_impl__swizzle_ycc__general__box_filter;
 
+  void (*func4)(wuffs_base__pixel_buffer * dst,  //
+                uint32_t x_min_incl,             //
+                uint32_t x_max_excl,             //
+                uint32_t y_min_incl,             //
+                uint32_t y_max_excl,             //
+                const uint8_t* src_ptr0,         //
+                const uint8_t* src_ptr1,         //
+                const uint8_t* src_ptr2,         //
+                const uint8_t* src_ptr3,         //
+                uint32_t stride0,                //
+                uint32_t stride1,                //
+                uint32_t stride2,                //
+                uint32_t stride3,                //
+                uint32_t inv_h0,                 //
+                uint32_t inv_h1,                 //
+                uint32_t inv_h2,                 //
+                uint32_t inv_h3,                 //
+                uint32_t inv_v0,                 //
+                uint32_t inv_v1,                 //
+                uint32_t inv_v2,                 //
+                uint32_t inv_v3,                 //
+                uint32_t half_width_for_2to1,    //
+                uint32_t half_height_for_2to1,   //
+                uint8_t* scratch_buffer_2k_ptr,  //
+                wuffs_private_impl__swizzle_ycc__upsample_func(*upfuncs)[4][4],
+                wuffs_private_impl__swizzle_ycc__convert_4_func conv4func) =
+      &wuffs_private_impl__swizzle_ycck__general__box_filter;
+
   wuffs_private_impl__swizzle_ycc__upsample_func upfuncs[4][4];
   memcpy(&upfuncs, &wuffs_private_impl__swizzle_ycc__upsample_funcs,
          sizeof upfuncs);
@@ -1402,8 +1523,10 @@
   if (triangle_filter_for_2to1 &&
       (wuffs_private_impl__swizzle_has_triangle_upsampler(inv_h0, inv_v0) ||
        wuffs_private_impl__swizzle_has_triangle_upsampler(inv_h1, inv_v1) ||
-       wuffs_private_impl__swizzle_has_triangle_upsampler(inv_h2, inv_v2))) {
-    func = &wuffs_private_impl__swizzle_ycc__general__triangle_filter;
+       wuffs_private_impl__swizzle_has_triangle_upsampler(inv_h2, inv_v2) ||
+       wuffs_private_impl__swizzle_has_triangle_upsampler(inv_h3, inv_v3))) {
+    func3 = &wuffs_private_impl__swizzle_ycc__general__triangle_filter;
+    func4 = &wuffs_private_impl__swizzle_ycck__general__triangle_filter;
 
     upfuncs[0][1] = wuffs_private_impl__swizzle_ycc__upsample_inv_h1v2_triangle;
     upfuncs[1][0] = wuffs_private_impl__swizzle_ycc__upsample_inv_h2v1_triangle;
@@ -1435,17 +1558,17 @@
     wuffs_private_impl__swizzle_ycc__convert_4_func conv4func =
         is_rgb_or_cmyk ? &wuffs_private_impl__swizzle_cmyk__convert_4_general
                        : &wuffs_private_impl__swizzle_ycck__convert_4_general;
-    wuffs_private_impl__swizzle_ycck__general__triangle_filter(  //
-        dst, x_min_incl, x_max_excl, y_min_incl, y_max_excl,     //
-        src0.ptr, src1.ptr, src2.ptr, src3.ptr,                  //
-        stride0, stride1, stride2, stride3,                      //
-        inv_h0, inv_h1, inv_h2, inv_h3,                          //
-        inv_v0, inv_v1, inv_v2, inv_v3,                          //
-        half_width_for_2to1, half_height_for_2to1,               //
+    (*func4)(                                                 //
+        dst, x_min_incl, x_max_excl, y_min_incl, y_max_excl,  //
+        src0.ptr, src1.ptr, src2.ptr, src3.ptr,               //
+        stride0, stride1, stride2, stride3,                   //
+        inv_h0, inv_h1, inv_h2, inv_h3,                       //
+        inv_v0, inv_v1, inv_v2, inv_v3,                       //
+        half_width_for_2to1, half_height_for_2to1,            //
         scratch_buffer_2k.ptr, &upfuncs, conv4func);
 
   } else {
-    (*func)(                                                  //
+    (*func3)(                                                 //
         dst, x_min_incl, x_max_excl, y_min_incl, y_max_excl,  //
         src0.ptr, src1.ptr, src2.ptr,                         //
         stride0, stride1, stride2,                            //
diff --git a/release/c/wuffs-unsupported-snapshot.c b/release/c/wuffs-unsupported-snapshot.c
index de9d5d3..f86c55c 100644
--- a/release/c/wuffs-unsupported-snapshot.c
+++ b/release/c/wuffs-unsupported-snapshot.c
@@ -29006,6 +29006,100 @@
   }
 }
 
+static void  //
+wuffs_private_impl__swizzle_ycck__general__box_filter(
+    wuffs_base__pixel_buffer* dst,
+    uint32_t x_min_incl,
+    uint32_t x_max_excl,
+    uint32_t y_min_incl,
+    uint32_t y_max_excl,
+    const uint8_t* src_ptr0,
+    const uint8_t* src_ptr1,
+    const uint8_t* src_ptr2,
+    const uint8_t* src_ptr3,
+    uint32_t stride0,
+    uint32_t stride1,
+    uint32_t stride2,
+    uint32_t stride3,
+    uint32_t inv_h0,
+    uint32_t inv_h1,
+    uint32_t inv_h2,
+    uint32_t inv_h3,
+    uint32_t inv_v0,
+    uint32_t inv_v1,
+    uint32_t inv_v2,
+    uint32_t inv_v3,
+    uint32_t half_width_for_2to1,
+    uint32_t half_height_for_2to1,
+    uint8_t* scratch_buffer_2k_ptr,
+    wuffs_private_impl__swizzle_ycc__upsample_func (*upfuncs)[4][4],
+    wuffs_private_impl__swizzle_ycc__convert_4_func conv4func) {
+  wuffs_private_impl__swizzle_ycc__upsample_func upfunc0 =
+      (*upfuncs)[(inv_h0 - 1u) & 3u][(inv_v0 - 1u) & 3u];
+  wuffs_private_impl__swizzle_ycc__upsample_func upfunc1 =
+      (*upfuncs)[(inv_h1 - 1u) & 3u][(inv_v1 - 1u) & 3u];
+  wuffs_private_impl__swizzle_ycc__upsample_func upfunc2 =
+      (*upfuncs)[(inv_h2 - 1u) & 3u][(inv_v2 - 1u) & 3u];
+  wuffs_private_impl__swizzle_ycc__upsample_func upfunc3 =
+      (*upfuncs)[(inv_h3 - 1u) & 3u][(inv_v3 - 1u) & 3u];
+
+  uint32_t y;
+  for (y = y_min_incl; y < y_max_excl; y++) {
+    const uint8_t* src0_major =
+        src_ptr0 + (((y - y_min_incl) / inv_v0) * (size_t)stride0);
+    const uint8_t* src1_major =
+        src_ptr1 + (((y - y_min_incl) / inv_v1) * (size_t)stride1);
+    const uint8_t* src2_major =
+        src_ptr2 + (((y - y_min_incl) / inv_v2) * (size_t)stride2);
+    const uint8_t* src3_major =
+        src_ptr3 + (((y - y_min_incl) / inv_v3) * (size_t)stride3);
+
+    uint32_t x = x_min_incl;
+    while (x < x_max_excl) {
+      uint32_t end = x + 480u;
+      if (end > x_max_excl) {
+        end = x_max_excl;
+      }
+
+      uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0;
+      uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1;
+      uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2;
+      uint32_t src_len3 = ((end - x) + inv_h3 - 1u) / inv_h3;
+
+      const uint8_t* up0 = (*upfunc0)(               //
+          scratch_buffer_2k_ptr + (0u * 480u),       //
+          src0_major + ((x - x_min_incl) / inv_h0),  //
+          src0_major + ((x - x_min_incl) / inv_h0),  //
+          src_len0,                                  //
+          0u, false, false);
+
+      const uint8_t* up1 = (*upfunc1)(               //
+          scratch_buffer_2k_ptr + (1u * 480u),       //
+          src1_major + ((x - x_min_incl) / inv_h1),  //
+          src1_major + ((x - x_min_incl) / inv_h1),  //
+          src_len1,                                  //
+          0u, false, false);
+
+      const uint8_t* up2 = (*upfunc2)(               //
+          scratch_buffer_2k_ptr + (2u * 480u),       //
+          src2_major + ((x - x_min_incl) / inv_h2),  //
+          src2_major + ((x - x_min_incl) / inv_h2),  //
+          src_len2,                                  //
+          0u, false, false);
+
+      const uint8_t* up3 = (*upfunc3)(               //
+          scratch_buffer_2k_ptr + (3u * 480u),       //
+          src3_major + ((x - x_min_incl) / inv_h3),  //
+          src3_major + ((x - x_min_incl) / inv_h3),  //
+          src_len3,                                  //
+          0u, false, false);
+
+      (*conv4func)(dst, x, end, y, up0, up1, up2, up3);
+      x = end;
+    }
+  }
+}
+
 // --------
 
 // wuffs_private_impl__swizzle_flattened_length is like
@@ -29075,7 +29169,6 @@
              (4u <= ((unsigned int)v1 - 1u)) ||  //
              (4u <= ((unsigned int)v2 - 1u)) ||  //
              (triangle_filter_for_2to1 && ((x_min_incl | y_min_incl) > 0u)) ||
-             (!triangle_filter_for_2to1 && ((h3 | v3) > 0u)) ||
              (scratch_buffer_2k.len < 2048u)) {
     return wuffs_base__make_status(wuffs_base__error__bad_argument);
   }
@@ -29299,30 +29392,58 @@
     }
   }
 
-  void (*func)(wuffs_base__pixel_buffer * dst,  //
-               uint32_t x_min_incl,             //
-               uint32_t x_max_excl,             //
-               uint32_t y_min_incl,             //
-               uint32_t y_max_excl,             //
-               const uint8_t* src_ptr0,         //
-               const uint8_t* src_ptr1,         //
-               const uint8_t* src_ptr2,         //
-               uint32_t stride0,                //
-               uint32_t stride1,                //
-               uint32_t stride2,                //
-               uint32_t inv_h0,                 //
-               uint32_t inv_h1,                 //
-               uint32_t inv_h2,                 //
-               uint32_t inv_v0,                 //
-               uint32_t inv_v1,                 //
-               uint32_t inv_v2,                 //
-               uint32_t half_width_for_2to1,    //
-               uint32_t half_height_for_2to1,   //
-               uint8_t* scratch_buffer_2k_ptr,  //
-               wuffs_private_impl__swizzle_ycc__upsample_func(*upfuncs)[4][4],
-               wuffs_private_impl__swizzle_ycc__convert_3_func conv3func) =
+  void (*func3)(wuffs_base__pixel_buffer * dst,  //
+                uint32_t x_min_incl,             //
+                uint32_t x_max_excl,             //
+                uint32_t y_min_incl,             //
+                uint32_t y_max_excl,             //
+                const uint8_t* src_ptr0,         //
+                const uint8_t* src_ptr1,         //
+                const uint8_t* src_ptr2,         //
+                uint32_t stride0,                //
+                uint32_t stride1,                //
+                uint32_t stride2,                //
+                uint32_t inv_h0,                 //
+                uint32_t inv_h1,                 //
+                uint32_t inv_h2,                 //
+                uint32_t inv_v0,                 //
+                uint32_t inv_v1,                 //
+                uint32_t inv_v2,                 //
+                uint32_t half_width_for_2to1,    //
+                uint32_t half_height_for_2to1,   //
+                uint8_t* scratch_buffer_2k_ptr,  //
+                wuffs_private_impl__swizzle_ycc__upsample_func(*upfuncs)[4][4],
+                wuffs_private_impl__swizzle_ycc__convert_3_func conv3func) =
       &wuffs_private_impl__swizzle_ycc__general__box_filter;
 
+  void (*func4)(wuffs_base__pixel_buffer * dst,  //
+                uint32_t x_min_incl,             //
+                uint32_t x_max_excl,             //
+                uint32_t y_min_incl,             //
+                uint32_t y_max_excl,             //
+                const uint8_t* src_ptr0,         //
+                const uint8_t* src_ptr1,         //
+                const uint8_t* src_ptr2,         //
+                const uint8_t* src_ptr3,         //
+                uint32_t stride0,                //
+                uint32_t stride1,                //
+                uint32_t stride2,                //
+                uint32_t stride3,                //
+                uint32_t inv_h0,                 //
+                uint32_t inv_h1,                 //
+                uint32_t inv_h2,                 //
+                uint32_t inv_h3,                 //
+                uint32_t inv_v0,                 //
+                uint32_t inv_v1,                 //
+                uint32_t inv_v2,                 //
+                uint32_t inv_v3,                 //
+                uint32_t half_width_for_2to1,    //
+                uint32_t half_height_for_2to1,   //
+                uint8_t* scratch_buffer_2k_ptr,  //
+                wuffs_private_impl__swizzle_ycc__upsample_func(*upfuncs)[4][4],
+                wuffs_private_impl__swizzle_ycc__convert_4_func conv4func) =
+      &wuffs_private_impl__swizzle_ycck__general__box_filter;
+
   wuffs_private_impl__swizzle_ycc__upsample_func upfuncs[4][4];
   memcpy(&upfuncs, &wuffs_private_impl__swizzle_ycc__upsample_funcs,
          sizeof upfuncs);
@@ -29330,8 +29451,10 @@
   if (triangle_filter_for_2to1 &&
       (wuffs_private_impl__swizzle_has_triangle_upsampler(inv_h0, inv_v0) ||
        wuffs_private_impl__swizzle_has_triangle_upsampler(inv_h1, inv_v1) ||
-       wuffs_private_impl__swizzle_has_triangle_upsampler(inv_h2, inv_v2))) {
-    func = &wuffs_private_impl__swizzle_ycc__general__triangle_filter;
+       wuffs_private_impl__swizzle_has_triangle_upsampler(inv_h2, inv_v2) ||
+       wuffs_private_impl__swizzle_has_triangle_upsampler(inv_h3, inv_v3))) {
+    func3 = &wuffs_private_impl__swizzle_ycc__general__triangle_filter;
+    func4 = &wuffs_private_impl__swizzle_ycck__general__triangle_filter;
 
     upfuncs[0][1] = wuffs_private_impl__swizzle_ycc__upsample_inv_h1v2_triangle;
     upfuncs[1][0] = wuffs_private_impl__swizzle_ycc__upsample_inv_h2v1_triangle;
@@ -29363,17 +29486,17 @@
     wuffs_private_impl__swizzle_ycc__convert_4_func conv4func =
         is_rgb_or_cmyk ? &wuffs_private_impl__swizzle_cmyk__convert_4_general
                        : &wuffs_private_impl__swizzle_ycck__convert_4_general;
-    wuffs_private_impl__swizzle_ycck__general__triangle_filter(  //
-        dst, x_min_incl, x_max_excl, y_min_incl, y_max_excl,     //
-        src0.ptr, src1.ptr, src2.ptr, src3.ptr,                  //
-        stride0, stride1, stride2, stride3,                      //
-        inv_h0, inv_h1, inv_h2, inv_h3,                          //
-        inv_v0, inv_v1, inv_v2, inv_v3,                          //
-        half_width_for_2to1, half_height_for_2to1,               //
+    (*func4)(                                                 //
+        dst, x_min_incl, x_max_excl, y_min_incl, y_max_excl,  //
+        src0.ptr, src1.ptr, src2.ptr, src3.ptr,               //
+        stride0, stride1, stride2, stride3,                   //
+        inv_h0, inv_h1, inv_h2, inv_h3,                       //
+        inv_v0, inv_v1, inv_v2, inv_v3,                       //
+        half_width_for_2to1, half_height_for_2to1,            //
         scratch_buffer_2k.ptr, &upfuncs, conv4func);
 
   } else {
-    (*func)(                                                  //
+    (*func3)(                                                 //
         dst, x_min_incl, x_max_excl, y_min_incl, y_max_excl,  //
         src0.ptr, src1.ptr, src2.ptr,                         //
         stride0, stride1, stride2,                            //
@@ -47403,7 +47526,7 @@
         status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length);
         goto exit;
       }
-      self->private_impl.f_swizzle_immediately = (self->private_impl.f_use_lower_quality && (self->private_impl.f_num_components < 4u));
+      self->private_impl.f_swizzle_immediately = self->private_impl.f_use_lower_quality;
       self->private_impl.f_swizzle_immediately_status = wuffs_base__make_status(NULL);
     } else if (self->private_impl.f_components_workbuf_offsets[4u] < self->private_impl.f_components_workbuf_offsets[8u]) {
       wuffs_private_impl__bulk_memset(a_workbuf.ptr + self->private_impl.f_components_workbuf_offsets[4u], (self->private_impl.f_components_workbuf_offsets[8u] - self->private_impl.f_components_workbuf_offsets[4u]), 0u);
@@ -48943,7 +49066,7 @@
       self->private_impl.f_components_v[2u],
       self->private_impl.f_components_v[3u],
       self->private_impl.f_is_rgb_or_cmyk,
-      ! (self->private_impl.f_use_lower_quality && (self->private_impl.f_num_components < 4u)),
+      ! self->private_impl.f_use_lower_quality,
       wuffs_base__make_slice_u8(self->private_data.f_swizzle_ycck_scratch_buffer_2k, 2048));
   return wuffs_private_impl__status__ensure_not_a_suspension(v_status);
 }
@@ -49154,7 +49277,7 @@
     return wuffs_base__utility__empty_range_ii_u64();
   }
 
-  if (self->private_impl.f_use_lower_quality && (self->private_impl.f_num_components < 4u) && (self->private_impl.f_sof_marker < 194u)) {
+  if (self->private_impl.f_use_lower_quality && (self->private_impl.f_sof_marker < 194u)) {
     return wuffs_base__utility__make_range_ii_u64(0u, self->private_impl.f_components_workbuf_offsets[8u]);
   }
   return wuffs_base__utility__make_range_ii_u64(self->private_impl.f_components_workbuf_offsets[8u], self->private_impl.f_components_workbuf_offsets[8u]);
diff --git a/std/jpeg/decode_jpeg.wuffs b/std/jpeg/decode_jpeg.wuffs
index bde62b0..5616ec1 100644
--- a/std/jpeg/decode_jpeg.wuffs
+++ b/std/jpeg/decode_jpeg.wuffs
@@ -357,13 +357,12 @@
 // 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 (but not all) JPEG images, the range returned
-// by decoder.workbuf_len can have a minimum value of zero, meaning that no
-// work buffer memory needs to be allocated. "Common" includes sequential (not
-// progressive) JPEGs that have either 1 component (gray) or 3 components (RGB
-// or YCbCr). Decoding rarer JPEGs will still require a positive amount of work
-// buffer memory. The exact amount required depends on factors like the JPEG
-// image's width, height, component count and subsampling ratios.
+// Leaner means that for common (sequential) JPEG images, the range returned by
+// decoder.workbuf_len can have a minimum value of zero, meaning that no work
+// buffer memory needs to be allocated. Decoding rarer (progressive) JPEGs will
+// still require a positive amount of work buffer memory. 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
@@ -371,7 +370,8 @@
 // slower decoding) or the maximal amount (for slightly faster decoding).
 //
 // Callers that never wish to allocate work buffer memory can simply reject
-// these rarer JPEGs as unsupported.
+// progressive JPEGs (where workbuf_len().min_incl > 0 despite setting the
+// base.QUIRK_QUALITY key to a negative quirk value) as unsupported.
 pub func decoder.set_quirk!(key: base.u32, value: base.u64) base.status {
     if args.key == base.QUIRK_QUALITY {
         this.use_lower_quality = args.value >= 0x8000_0000_0000_0000
@@ -996,7 +996,7 @@
         if this.sof_marker >= 0xC2 {
             return base."#bad workbuf length"
         }
-        this.swizzle_immediately = this.use_lower_quality and (this.num_components < 4)
+        this.swizzle_immediately = this.use_lower_quality
         this.swizzle_immediately_status = ok
     } else if this.components_workbuf_offsets[4] < this.components_workbuf_offsets[8] {
         args.workbuf[this.components_workbuf_offsets[4] .. this.components_workbuf_offsets[8]].bulk_memset!(byte_value: 0)
@@ -2166,7 +2166,7 @@
             v2: this.components_v[2],
             v3: this.components_v[3],
             is_rgb_or_cmyk: this.is_rgb_or_cmyk,
-            triangle_filter_for_2to1: not (this.use_lower_quality and (this.num_components < 4)),
+            triangle_filter_for_2to1: not this.use_lower_quality,
             scratch_buffer_2k: this.swizzle_ycck_scratch_buffer_2k[..])
     return status
 }
@@ -2258,7 +2258,7 @@
 }
 
 pub func decoder.workbuf_len() base.range_ii_u64 {
-    if this.use_lower_quality and (this.num_components < 4) and (this.sof_marker < 0xC2) {
+    if this.use_lower_quality and (this.sof_marker < 0xC2) {
         return this.util.make_range_ii_u64(
                 min_incl: 0,
                 max_incl: this.components_workbuf_offsets[8])