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, },