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