From f9fd2c2b565a336eaafc695de037e3b35b21fbe9 Mon Sep 17 00:00:00 2001 From: Richard Henderson <richard.henderson@linaro.org> Date: Sat, 4 Feb 2023 08:01:53 -1000 Subject: [PATCH] Provide generic implementation for blt Fall back to system memmove for each complete row. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> --- pixman/pixman-general.c | 58 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/pixman/pixman-general.c b/pixman/pixman-general.c index 7e5a0d09..61bde6c3 100644 --- a/pixman/pixman-general.c +++ b/pixman/pixman-general.c @@ -249,6 +249,63 @@ static const pixman_fast_path_t general_fast_path[] = { PIXMAN_OP_NONE } }; +static pixman_bool_t +general_blt (pixman_implementation_t *imp, + uint32_t * src_bits, + uint32_t * dst_bits, + int src_stride, + int dst_stride, + int src_bpp, + int dst_bpp, + int src_x, + int src_y, + int dest_x, + int dest_y, + int width, + int height) +{ + void *src_bytes; + void *dst_bytes; + int byte_width; + + if (src_bpp != dst_bpp) + return FALSE; + + if (src_bpp == 16) + { + src_stride = src_stride * (int) sizeof (uint32_t) / 2; + dst_stride = dst_stride * (int) sizeof (uint32_t) / 2; + src_bytes = (uint16_t *)src_bits + src_stride * src_y + src_x; + dst_bytes = (uint16_t *)dst_bits + dst_stride * dest_y + dest_x; + byte_width = 2 * width; + src_stride *= 2; + dst_stride *= 2; + } + else if (src_bpp == 32) + { + src_stride = src_stride * (int) sizeof (uint32_t) / 4; + dst_stride = dst_stride * (int) sizeof (uint32_t) / 4; + src_bytes = (uint32_t *)src_bits + src_stride * src_y + src_x; + dst_bytes = (uint32_t *)dst_bits + dst_stride * dest_y + dest_x; + byte_width = 4 * width; + src_stride *= 4; + dst_stride *= 4; + } + else + { + return FALSE; + } + + while (height--) + { + memmove (dst_bytes, src_bytes, byte_width); + src_bytes = (uint8_t *)src_bytes + src_stride; + dst_bytes = (uint8_t *)dst_bytes + dst_stride; + } + + return TRUE; +} + pixman_implementation_t * _pixman_implementation_create_general (void) { @@ -258,6 +315,7 @@ _pixman_implementation_create_general (void) _pixman_setup_combiner_functions_float (imp); imp->iter_info = general_iters; + imp->blt = general_blt; return imp; } -- GitLab