You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2023/11/22 05:53:13 UTC
(nuttx) branch master updated: arch/sim: sim support 16bbp
This is an automated email from the ASF dual-hosted git repository.
xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new e5eabbb411 arch/sim: sim support 16bbp
e5eabbb411 is described below
commit e5eabbb411cce22d877593d7a04b21023016dce2
Author: qinshijing <qi...@xiaomi.com>
AuthorDate: Thu Oct 26 14:06:49 2023 +0800
arch/sim: sim support 16bbp
Signed-off-by: qinshijing <qi...@xiaomi.com>
---
arch/sim/src/sim/posix/sim_x11framebuffer.c | 102 +++++++++++++++++++++++++++-
1 file changed, 100 insertions(+), 2 deletions(-)
diff --git a/arch/sim/src/sim/posix/sim_x11framebuffer.c b/arch/sim/src/sim/posix/sim_x11framebuffer.c
index 5da0365d11..4307871182 100644
--- a/arch/sim/src/sim/posix/sim_x11framebuffer.c
+++ b/arch/sim/src/sim/posix/sim_x11framebuffer.c
@@ -39,6 +39,29 @@
* Public Data
****************************************************************************/
+typedef union
+{
+ struct
+ {
+ uint16_t blue : 5;
+ uint16_t green : 6;
+ uint16_t red : 5;
+ };
+ uint16_t full;
+} x11_color16_t;
+
+typedef union
+{
+ struct
+ {
+ uint8_t blue;
+ uint8_t green;
+ uint8_t red;
+ uint8_t alpha;
+ };
+ uint32_t full;
+} x11_color32_t;
+
/* Also used in sim_x11eventloop */
Display *g_display;
@@ -58,9 +81,14 @@ static XImage *g_image;
static char *g_framebuffer;
static unsigned short g_fbpixelwidth;
static unsigned short g_fbpixelheight;
+static int g_fbbpp;
+static int g_fblen;
+static int g_fbcount;
static int g_shmcheckpoint = 0;
static int b_useshm;
+static unsigned char *g_trans_framebuffer;
+
/****************************************************************************
* Private Functions
****************************************************************************/
@@ -348,6 +376,27 @@ shmerror:
return 0;
}
+/****************************************************************************
+ * Name: sim_x11depth16to32
+ ****************************************************************************/
+
+static inline void sim_x11depth16to32(void *d_mem, size_t size,
+ const void *s_mem)
+{
+ x11_color32_t *dst = d_mem;
+ const x11_color16_t *src = s_mem;
+
+ for (size /= 4; size; size--)
+ {
+ dst->red = (src->red * 263 + 7) >> 5;
+ dst->green = (src->green * 259 + 3) >> 6;
+ dst->blue = (src->blue * 263 + 7) >> 5;
+ dst->alpha = 0xff;
+ dst++;
+ src++;
+ }
+}
+
/****************************************************************************
* Public Functions
****************************************************************************/
@@ -373,6 +422,11 @@ int sim_x11initialize(unsigned short width, unsigned short height,
g_fbpixelwidth = width;
g_fbpixelheight = height;
+ if (fbcount < 1)
+ {
+ return -EINVAL;
+ }
+
/* Create the X11 window */
display = sim_x11createframe();
@@ -396,6 +450,11 @@ int sim_x11initialize(unsigned short width, unsigned short height,
depth = 32;
}
+ if (depth != CONFIG_SIM_FBBPP && depth != 32 && CONFIG_SIM_FBBPP != 16)
+ {
+ return -1;
+ }
+
*bpp = depth;
*stride = (depth * width / 8);
*fblen = (*stride * height);
@@ -404,7 +463,32 @@ int sim_x11initialize(unsigned short width, unsigned short height,
sim_x11mapsharedmem(display, windowattributes.depth, *fblen, fbcount);
- *fbmem = (void *)g_framebuffer;
+ g_fbbpp = depth;
+ g_fblen = *fblen;
+ g_fbcount = fbcount;
+
+ /* Create conversion framebuffer */
+
+ if (depth == 32 && CONFIG_SIM_FBBPP == 16)
+ {
+ *bpp = CONFIG_SIM_FBBPP;
+ *stride = (CONFIG_SIM_FBBPP * width / 8);
+ *fblen = (*stride * height);
+
+ g_trans_framebuffer = malloc((*fblen) * fbcount);
+ if (g_trans_framebuffer == NULL)
+ {
+ syslog(LOG_ERR, "Failed to allocate g_trans_framebuffer\n");
+ return -1;
+ }
+
+ *fbmem = g_trans_framebuffer;
+ }
+ else
+ {
+ *fbmem = g_framebuffer;
+ }
+
g_display = display;
return 0;
}
@@ -454,7 +538,14 @@ int sim_x11setoffset(unsigned int offset)
return -ENODEV;
}
- g_image->data = g_framebuffer + offset;
+ if (g_fbbpp == 32 && CONFIG_SIM_FBBPP == 16)
+ {
+ g_image->data = g_framebuffer + (offset << 1);
+ }
+ else
+ {
+ g_image->data = g_framebuffer + offset;
+ }
return 0;
}
@@ -527,6 +618,13 @@ int sim_x11update(void)
g_fbpixelwidth, g_fbpixelheight);
}
+ if (g_fbbpp == 32 && CONFIG_SIM_FBBPP == 16)
+ {
+ sim_x11depth16to32(g_framebuffer,
+ g_fblen * g_fbcount,
+ g_trans_framebuffer);
+ }
+
XSync(g_display, 0);
return 0;