pixconv: allow swizzle from PIXEL_FORMAT__Y_16LE
Binary size, before:
142648 gen/lib/c/clang-dynamic/wuffs-base-pixconv.lo
142648 gen/lib/c/clang-static/wuffs-base-pixconv.o
243368 gen/lib/c/gcc-dynamic/wuffs-base-pixconv.lo
243240 gen/lib/c/gcc-static/wuffs-base-pixconv.o
After:
145472 gen/lib/c/clang-dynamic/wuffs-base-pixconv.lo
145472 gen/lib/c/clang-static/wuffs-base-pixconv.o
247720 gen/lib/c/gcc-dynamic/wuffs-base-pixconv.lo
247688 gen/lib/c/gcc-static/wuffs-base-pixconv.o
diff --git a/fuzz/c/std/pixel_swizzler_fuzzer.c b/fuzz/c/std/pixel_swizzler_fuzzer.c
index 6fbdf24..c9c384c 100644
--- a/fuzz/c/std/pixel_swizzler_fuzzer.c
+++ b/fuzz/c/std/pixel_swizzler_fuzzer.c
@@ -72,6 +72,7 @@
const uint32_t pixfmts[] = {
WUFFS_BASE__PIXEL_FORMAT__Y,
WUFFS_BASE__PIXEL_FORMAT__Y_16BE,
+ WUFFS_BASE__PIXEL_FORMAT__Y_16LE,
WUFFS_BASE__PIXEL_FORMAT__YA_NONPREMUL,
WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL,
WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY,
diff --git a/internal/cgen/base/pixconv-submodule-regular.c b/internal/cgen/base/pixconv-submodule-regular.c
index 1314602..0428e07 100644
--- a/internal/cgen/base/pixconv-submodule-regular.c
+++ b/internal/cgen/base/pixconv-submodule-regular.c
@@ -1748,6 +1748,36 @@
}
static uint64_t //
+wuffs_private_impl__swizzle_bgr_565__y_16le(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len2 = dst_len / 2;
+ size_t src_len2 = src_len / 2;
+ size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ // TODO: unroll.
+
+ while (n >= 1) {
+ uint32_t y5 = (uint32_t)(s[1] >> 3);
+ uint32_t y6 = (uint32_t)(s[1] >> 2);
+ uint32_t rgb_565 = (y5 << 11) | (y6 << 5) | (y5 << 0);
+ wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565);
+
+ s += 1 * 2;
+ d += 1 * 2;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
wuffs_private_impl__swizzle_bgr_565__ya_nonpremul__src(uint8_t* dst_ptr,
size_t dst_len,
uint8_t* dst_palette_ptr,
@@ -4400,6 +4430,36 @@
}
static uint64_t //
+wuffs_private_impl__swizzle_xxx__y_16le(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len3 = dst_len / 3;
+ size_t src_len2 = src_len / 2;
+ size_t len = (dst_len3 < src_len2) ? dst_len3 : src_len2;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ // TODO: unroll.
+
+ while (n >= 1) {
+ uint8_t s0 = s[1];
+ d[0] = s0;
+ d[1] = s0;
+ d[2] = s0;
+
+ s += 1 * 2;
+ d += 1 * 3;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
wuffs_private_impl__swizzle_xxx__ya_nonpremul__src(uint8_t* dst_ptr,
size_t dst_len,
uint8_t* dst_palette_ptr,
@@ -4679,6 +4739,32 @@
return len;
}
+static uint64_t //
+wuffs_private_impl__swizzle_xxxx__y_16le(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len4 = dst_len / 4;
+ size_t src_len2 = src_len / 2;
+ size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ while (n >= 1) {
+ wuffs_base__poke_u32le__no_bounds_check(
+ d + (0 * 4), 0xFF000000 | (0x010101 * (uint32_t)s[1]));
+
+ s += 1 * 2;
+ d += 1 * 4;
+ n -= 1;
+ }
+
+ return len;
+}
+
// --------
static uint64_t //
@@ -4799,6 +4885,34 @@
return len;
}
+static uint64_t //
+wuffs_private_impl__swizzle_xxxxxxxx__y_16le(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len8 = dst_len / 8;
+ size_t src_len2 = src_len / 2;
+ size_t len = (dst_len8 < src_len2) ? dst_len8 : src_len2;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ while (n >= 1) {
+ uint64_t s0 =
+ ((uint64_t)(wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2))));
+ wuffs_base__poke_u64le__no_bounds_check(
+ d + (0 * 8), 0xFFFF000000000000 | (0x000100010001 * s0));
+
+ s += 1 * 2;
+ d += 1 * 8;
+ n -= 1;
+ }
+
+ return len;
+}
+
// --------
static uint64_t //
@@ -5265,6 +5379,32 @@
}
static uint64_t //
+wuffs_private_impl__swizzle_y__y_16le(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t src_len2 = src_len / 2;
+ size_t len = (dst_len < src_len2) ? dst_len : src_len2;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ // TODO: unroll.
+
+ while (n >= 1) {
+ d[0] = s[1];
+
+ s += 1 * 2;
+ d += 1 * 1;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
wuffs_private_impl__swizzle_y__ya_nonpremul__src(uint8_t* dst_ptr,
size_t dst_len,
uint8_t* dst_palette_ptr,
@@ -5601,6 +5741,49 @@
}
static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func //
+wuffs_private_impl__pixel_swizzler__prepare__y_16le(
+ wuffs_base__pixel_swizzler* p,
+ wuffs_base__pixel_format dst_pixfmt,
+ wuffs_base__slice_u8 dst_palette,
+ wuffs_base__slice_u8 src_palette,
+ wuffs_base__pixel_blend blend) {
+ switch (dst_pixfmt.repr) {
+ case WUFFS_BASE__PIXEL_FORMAT__Y:
+ return wuffs_private_impl__swizzle_y__y_16le;
+
+ case WUFFS_BASE__PIXEL_FORMAT__Y_16LE:
+ return wuffs_private_impl__swizzle_copy_2_2;
+
+ case WUFFS_BASE__PIXEL_FORMAT__Y_16BE:
+ return wuffs_private_impl__swizzle_y_16le__y_16be;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
+ return wuffs_private_impl__swizzle_bgr_565__y_16le;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGR:
+ case WUFFS_BASE__PIXEL_FORMAT__RGB:
+ return wuffs_private_impl__swizzle_xxx__y_16le;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
+ case WUFFS_BASE__PIXEL_FORMAT__BGRX:
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
+ case WUFFS_BASE__PIXEL_FORMAT__RGBX:
+ return wuffs_private_impl__swizzle_xxxx__y_16le;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE:
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL_4X16LE:
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL_4X16LE:
+ return wuffs_private_impl__swizzle_xxxxxxxx__y_16le;
+ }
+ return NULL;
+}
+
+static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func //
wuffs_private_impl__pixel_swizzler__prepare__ya_nonpremul(
wuffs_base__pixel_swizzler* p,
wuffs_base__pixel_format dst_pixfmt,
@@ -6901,6 +7084,11 @@
p, dst_pixfmt, dst_palette, src_palette, blend);
break;
+ case WUFFS_BASE__PIXEL_FORMAT__Y_16LE:
+ func = wuffs_private_impl__pixel_swizzler__prepare__y_16le(
+ p, dst_pixfmt, dst_palette, src_palette, blend);
+ break;
+
case WUFFS_BASE__PIXEL_FORMAT__YA_NONPREMUL:
func = wuffs_private_impl__pixel_swizzler__prepare__ya_nonpremul(
p, dst_pixfmt, dst_palette, src_palette, blend);
diff --git a/release/c/wuffs-unsupported-snapshot.c b/release/c/wuffs-unsupported-snapshot.c
index a44ad52..5d20ca2 100644
--- a/release/c/wuffs-unsupported-snapshot.c
+++ b/release/c/wuffs-unsupported-snapshot.c
@@ -25773,6 +25773,36 @@
}
static uint64_t //
+wuffs_private_impl__swizzle_bgr_565__y_16le(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len2 = dst_len / 2;
+ size_t src_len2 = src_len / 2;
+ size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ // TODO: unroll.
+
+ while (n >= 1) {
+ uint32_t y5 = (uint32_t)(s[1] >> 3);
+ uint32_t y6 = (uint32_t)(s[1] >> 2);
+ uint32_t rgb_565 = (y5 << 11) | (y6 << 5) | (y5 << 0);
+ wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565);
+
+ s += 1 * 2;
+ d += 1 * 2;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
wuffs_private_impl__swizzle_bgr_565__ya_nonpremul__src(uint8_t* dst_ptr,
size_t dst_len,
uint8_t* dst_palette_ptr,
@@ -28425,6 +28455,36 @@
}
static uint64_t //
+wuffs_private_impl__swizzle_xxx__y_16le(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len3 = dst_len / 3;
+ size_t src_len2 = src_len / 2;
+ size_t len = (dst_len3 < src_len2) ? dst_len3 : src_len2;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ // TODO: unroll.
+
+ while (n >= 1) {
+ uint8_t s0 = s[1];
+ d[0] = s0;
+ d[1] = s0;
+ d[2] = s0;
+
+ s += 1 * 2;
+ d += 1 * 3;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
wuffs_private_impl__swizzle_xxx__ya_nonpremul__src(uint8_t* dst_ptr,
size_t dst_len,
uint8_t* dst_palette_ptr,
@@ -28704,6 +28764,32 @@
return len;
}
+static uint64_t //
+wuffs_private_impl__swizzle_xxxx__y_16le(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len4 = dst_len / 4;
+ size_t src_len2 = src_len / 2;
+ size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ while (n >= 1) {
+ wuffs_base__poke_u32le__no_bounds_check(
+ d + (0 * 4), 0xFF000000 | (0x010101 * (uint32_t)s[1]));
+
+ s += 1 * 2;
+ d += 1 * 4;
+ n -= 1;
+ }
+
+ return len;
+}
+
// --------
static uint64_t //
@@ -28824,6 +28910,34 @@
return len;
}
+static uint64_t //
+wuffs_private_impl__swizzle_xxxxxxxx__y_16le(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t dst_len8 = dst_len / 8;
+ size_t src_len2 = src_len / 2;
+ size_t len = (dst_len8 < src_len2) ? dst_len8 : src_len2;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ while (n >= 1) {
+ uint64_t s0 =
+ ((uint64_t)(wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2))));
+ wuffs_base__poke_u64le__no_bounds_check(
+ d + (0 * 8), 0xFFFF000000000000 | (0x000100010001 * s0));
+
+ s += 1 * 2;
+ d += 1 * 8;
+ n -= 1;
+ }
+
+ return len;
+}
+
// --------
static uint64_t //
@@ -29290,6 +29404,32 @@
}
static uint64_t //
+wuffs_private_impl__swizzle_y__y_16le(uint8_t* dst_ptr,
+ size_t dst_len,
+ uint8_t* dst_palette_ptr,
+ size_t dst_palette_len,
+ const uint8_t* src_ptr,
+ size_t src_len) {
+ size_t src_len2 = src_len / 2;
+ size_t len = (dst_len < src_len2) ? dst_len : src_len2;
+ uint8_t* d = dst_ptr;
+ const uint8_t* s = src_ptr;
+ size_t n = len;
+
+ // TODO: unroll.
+
+ while (n >= 1) {
+ d[0] = s[1];
+
+ s += 1 * 2;
+ d += 1 * 1;
+ n -= 1;
+ }
+
+ return len;
+}
+
+static uint64_t //
wuffs_private_impl__swizzle_y__ya_nonpremul__src(uint8_t* dst_ptr,
size_t dst_len,
uint8_t* dst_palette_ptr,
@@ -29626,6 +29766,49 @@
}
static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func //
+wuffs_private_impl__pixel_swizzler__prepare__y_16le(
+ wuffs_base__pixel_swizzler* p,
+ wuffs_base__pixel_format dst_pixfmt,
+ wuffs_base__slice_u8 dst_palette,
+ wuffs_base__slice_u8 src_palette,
+ wuffs_base__pixel_blend blend) {
+ switch (dst_pixfmt.repr) {
+ case WUFFS_BASE__PIXEL_FORMAT__Y:
+ return wuffs_private_impl__swizzle_y__y_16le;
+
+ case WUFFS_BASE__PIXEL_FORMAT__Y_16LE:
+ return wuffs_private_impl__swizzle_copy_2_2;
+
+ case WUFFS_BASE__PIXEL_FORMAT__Y_16BE:
+ return wuffs_private_impl__swizzle_y_16le__y_16be;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
+ return wuffs_private_impl__swizzle_bgr_565__y_16le;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGR:
+ case WUFFS_BASE__PIXEL_FORMAT__RGB:
+ return wuffs_private_impl__swizzle_xxx__y_16le;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
+ case WUFFS_BASE__PIXEL_FORMAT__BGRX:
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
+ case WUFFS_BASE__PIXEL_FORMAT__RGBX:
+ return wuffs_private_impl__swizzle_xxxx__y_16le;
+
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
+ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE:
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL_4X16LE:
+ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL_4X16LE:
+ return wuffs_private_impl__swizzle_xxxxxxxx__y_16le;
+ }
+ return NULL;
+}
+
+static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func //
wuffs_private_impl__pixel_swizzler__prepare__ya_nonpremul(
wuffs_base__pixel_swizzler* p,
wuffs_base__pixel_format dst_pixfmt,
@@ -30926,6 +31109,11 @@
p, dst_pixfmt, dst_palette, src_palette, blend);
break;
+ case WUFFS_BASE__PIXEL_FORMAT__Y_16LE:
+ func = wuffs_private_impl__pixel_swizzler__prepare__y_16le(
+ p, dst_pixfmt, dst_palette, src_palette, blend);
+ break;
+
case WUFFS_BASE__PIXEL_FORMAT__YA_NONPREMUL:
func = wuffs_private_impl__pixel_swizzler__prepare__ya_nonpremul(
p, dst_pixfmt, dst_palette, src_palette, blend);
diff --git a/test/c/std/wbmp.c b/test/c/std/wbmp.c
index 2a96541..c938978 100644
--- a/test/c/std/wbmp.c
+++ b/test/c/std/wbmp.c
@@ -318,6 +318,10 @@
.pixfmt_repr = WUFFS_BASE__PIXEL_FORMAT__Y_16BE,
},
{
+ .color = 0xFF444444,
+ .pixfmt_repr = WUFFS_BASE__PIXEL_FORMAT__Y_16LE,
+ },
+ {
.color = 0x55444444,
.pixfmt_repr = WUFFS_BASE__PIXEL_FORMAT__YA_NONPREMUL,
},