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])