VNC: Add support for (1) an 8-bit local frame buffer format and (2) a configurable server name

This commit is contained in:
Gregory Nutt 2016-04-20 17:47:47 -06:00
parent f8604d11a9
commit 79e577eae1
4 changed files with 128 additions and 36 deletions

View File

@ -35,6 +35,10 @@ config VNCSERVER_NDISPLAYS
Specifies the number of RFB displays supported by the server. Specifies the number of RFB displays supported by the server.
Normally this should be one. Normally this should be one.
config VNCSERVER_NAME
string "VNC display name"
default "NuttX"
config VNCSERVER_PRIO config VNCSERVER_PRIO
int "VNC server task priority" int "VNC server task priority"
default 100 default 100
@ -55,11 +59,14 @@ choice
prompt "VNC color format" prompt "VNC color format"
default VNCSERVER_COLORFMT_RGB16 default VNCSERVER_COLORFMT_RGB16
config VNCSERVER_COLORFMT_RGB8
bool "RGB8 3:3:2"
config VNCSERVER_COLORFMT_RGB16 config VNCSERVER_COLORFMT_RGB16
bool "RGB16 5:6:5" bool "RGB16 5:6:5"
config VNCSERVER_COLORFMT_RGB32 config VNCSERVER_COLORFMT_RGB32
bool "RGB24 (32-bit) or RGB32 (w/tranparency)" bool "RGB32 8:8:8"
endchoice # VNC color format endchoice # VNC color format

View File

@ -53,9 +53,10 @@
* Name: vnc_convert_rgbNN * Name: vnc_convert_rgbNN
* *
* Description: * Description:
* Convert the native framebuffer color format (either RGB16 5:6:5 or RGB32 * Convert the native framebuffer color format (either RGB8 3:3:2,
* 8:8:8) to the remote framebuffer color format (either RGB16 5:6:5, * RGB16 5:6:5, or RGB32 8:8:8) to the remote framebuffer color format
* RGB16 5:5:5, or RGB32 8:8:) * (either RGB8 2:2:2, RGB8 3:3:2, RGB16 5:5:5, RGB16 5:6:5, or RGB32
* 8:8:8)
* *
* Input Parameters: * Input Parameters:
* pixel - The src color in local framebuffer format. * pixel - The src color in local framebuffer format.
@ -65,7 +66,71 @@
* *
****************************************************************************/ ****************************************************************************/
#if defined(CONFIG_VNCSERVER_COLORFMT_RGB16) #if defined(CONFIG_VNCSERVER_COLORFMT_RGB8)
uint8_t vnc_convert_rgb8_222(lfb_color_t rgb)
{
/* 76543210
* --------
* RRRGGGBB
* ..RRGGBB
*/
return (uint8_t)(((rgb >> 2) & 0x30) |
((rgb >> 1) & 0x0c) |
( rgb & 0x03));
}
uint8_t vnc_convert_rgb8_332(lfb_color_t rgb)
{
/* Identity mapping */
return (uint8_t)rgb;
}
uint16_t vnc_convert_rgb16_555(lfb_color_t rgb)
{
/* 111111
* 54321098 76543210
* -----------------
* RRRGGGBB
* .RRR..GG G..BB...
*/
return (uint8_t)((((uint16_t)rgb << 8) & 0x7000) |
(((uint16_t)rgb << 5) & 0x0380) |
(((uint16_t)rgb << 3) & 0x0018));
}
uint16_t vnc_convert_rgb16_565(lfb_color_t rgb)
{
/* 111111
* 54321098 76543210
* -----------------
* RRRGGGBB
* RRR..GGG ...BB...
*/
return (uint8_t)((((uint16_t)rgb << 8) & 0xe000) |
(((uint16_t)rgb << 6) & 0x0700) |
(((uint16_t)rgb << 3) & 0x0018));
}
uint32_t vnc_convert_rgb32_888(lfb_color_t rgb)
{
/* 33222222 22221111 111111
* 10987654 32109876 54321098 76543210
* ----------------------------------
* RRRGGGBB
* RRR..... GGG..... BB......
*/
return (((uint32_t)rgb << 16) & 0x00e00000) |
(((uint32_t)rgb << 11) & 0x0000e000) |
(((uint32_t)rgb << 6) & 0x000000c0);
}
#elif defined(CONFIG_VNCSERVER_COLORFMT_RGB16)
uint8_t vnc_convert_rgb8_222(lfb_color_t rgb) uint8_t vnc_convert_rgb8_222(lfb_color_t rgb)
{ {
@ -104,14 +169,14 @@ uint16_t vnc_convert_rgb16_555(lfb_color_t rgb)
* .RRRRRGG GGGBBBBB * .RRRRRGG GGGBBBBB
*/ */
return (((rgb >> 1) & ~0x1f) | (rgb & 0x1f)); return (((rgb >> 1) & ~0x001f) | (rgb & 0x001f));
} }
uint16_t vnc_convert_rgb16_565(lfb_color_t rgb) uint16_t vnc_convert_rgb16_565(lfb_color_t rgb)
{ {
/* Identity mapping */ /* Identity mapping */
return rgb; return (uint32_t)rgb;
} }
uint32_t vnc_convert_rgb32_888(lfb_color_t rgb) uint32_t vnc_convert_rgb32_888(lfb_color_t rgb)
@ -139,9 +204,9 @@ uint8_t vnc_convert_rgb8_222(lfb_color_t rgb)
* ..RRGGBB * ..RRGGBB
*/ */
return (uint8_t)(((rgb >> 18) & 0x0030) | return (uint8_t)(((rgb >> 18) & 0x00000030) |
((rgb >> 12) & 0x000c) | ((rgb >> 12) & 0x0000000c) |
(rgb >> 6) & 0x0003)); (rgb >> 6) & 0x00000003));
} }
uint8_t vnc_convert_rgb8_332(lfb_color_t rgb) uint8_t vnc_convert_rgb8_332(lfb_color_t rgb)
@ -153,9 +218,9 @@ uint8_t vnc_convert_rgb8_332(lfb_color_t rgb)
* RRRGGGBB * RRRGGGBB
*/ */
return (uint8_t)(((rgb >> 16) & 0x0070) | return (uint8_t)(((rgb >> 16) & 0x00000070) |
((rgb >> 11) & 0x001c) | ((rgb >> 11) & 0x0000001c) |
(rgb >> 6) & 0x0003)); (rgb >> 6) & 0x00000003));
} }
uint16_t vnc_convert_rgb16_555(lfb_color_t rgb) uint16_t vnc_convert_rgb16_555(lfb_color_t rgb)
@ -167,10 +232,9 @@ uint16_t vnc_convert_rgb16_555(lfb_color_t rgb)
* .RRRRRGG GGGBBBBB * .RRRRRGG GGGBBBBB
*/ */
return (uint16_t) return (uint16_t)(((rgb >> 9) & 0x00007c00) |
(((rgb >> 9) & 0x00007c00) | ((rgb >> 6) & 0x000003e0) |
((rgb >> 6) & 0x000003e0) | ((rgb >> 3) & 0x0000001f));
((rgb >> 3) & 0x0000001f));
} }
uint16_t vnc_convert_rgb16_565(lfb_color_t rgb) uint16_t vnc_convert_rgb16_565(lfb_color_t rgb)
@ -182,10 +246,9 @@ uint16_t vnc_convert_rgb16_565(lfb_color_t rgb)
* RRRRRGGG GGGBBBBB * RRRRRGGG GGGBBBBB
*/ */
return (uint16_t) return (uint16_t)(((rgb >> 8) & 0x0000f800) |
(((rgb >> 8) & 0x0000f800) | ((rgb >> 5) & 0x000007e0) |
((rgb >> 5) & 0x000007e0) | ((rgb >> 3) & 0x0000001f));
((rgb >> 3) & 0x0000001f));
} }
uint32_t vnc_convert_rgb32_888(lfb_color_t rgb) uint32_t vnc_convert_rgb32_888(lfb_color_t rgb)

View File

@ -64,6 +64,7 @@ static const char g_vncproto[] = RFB_PROTOCOL_VERSION_3p3;
static const char g_vncproto[] = RFB_PROTOCOL_VERSION_3p8; static const char g_vncproto[] = RFB_PROTOCOL_VERSION_3p8;
static const char g_nosecurity[] = "No security types are supported"; static const char g_nosecurity[] = "No security types are supported";
#endif #endif
static const char g_vncname[] = CONFIG_VNCSERVER_NAME;
/**************************************************************************** /****************************************************************************
* Public Functions * Public Functions
@ -326,7 +327,6 @@ int vnc_negotiate(FAR struct vnc_session_s *session)
rfb_putbe16(serverinit->width, CONFIG_VNCSERVER_SCREENWIDTH); rfb_putbe16(serverinit->width, CONFIG_VNCSERVER_SCREENWIDTH);
rfb_putbe16(serverinit->height, CONFIG_VNCSERVER_SCREENHEIGHT); rfb_putbe16(serverinit->height, CONFIG_VNCSERVER_SCREENHEIGHT);
rfb_putbe32(serverinit->namelen, 0);
pixelfmt = &serverinit->format; pixelfmt = &serverinit->format;
@ -343,8 +343,12 @@ int vnc_negotiate(FAR struct vnc_session_s *session)
pixelfmt->gshift = RFB_GSHIFT; pixelfmt->gshift = RFB_GSHIFT;
pixelfmt->bshift = RFB_BSHIFT; pixelfmt->bshift = RFB_BSHIFT;
len = strlen(g_vncname);
rfb_putbe32(serverinit->namelen, len);
memcpy(serverinit->name, g_vncname, len);
nsent = psock_send(&session->connect, serverinit, nsent = psock_send(&session->connect, serverinit,
SIZEOF_RFB_SERVERINIT_S(0), 0); SIZEOF_RFB_SERVERINIT_S(len), 0);
if (nsent < 0) if (nsent < 0)
{ {
errcode = get_errno(); errcode = get_errno();
@ -352,7 +356,7 @@ int vnc_negotiate(FAR struct vnc_session_s *session)
return -errcode; return -errcode;
} }
DEBUGASSERT(nsent == SIZEOF_RFB_SERVERINIT_S(0)); DEBUGASSERT(nsent == SIZEOF_RFB_SERVERINIT_S(len));
/* We now expect to receive the SetPixelFormat message from the client. /* We now expect to receive the SetPixelFormat message from the client.
* This may override some of our framebuffer settings. * This may override some of our framebuffer settings.

View File

@ -79,14 +79,25 @@
# define CONFIG_VNCSERVER_NDISPLAYS 1 # define CONFIG_VNCSERVER_NDISPLAYS 1
#endif #endif
#if defined(CONFIG_VNCSERVER_COLORFMT_RGB16) #if defined(CONFIG_VNCSERVER_COLORFMT_RGB8)
# define RFB_COLORFMT FB_FMT_RGB8_332
# define RFB_BITSPERPIXEL 8
# define RFB_PIXELDEPTH 8
# define RFB_TRUECOLOR 1
# define RFB_RMAX 0x07
# define RFB_GMAX 0x07
# define RFB_BMAX 0x03
# define RFB_RSHIFT 5
# define RFB_GSHIFT 2
# define RFB_BSHIFT 0
#elif defined(CONFIG_VNCSERVER_COLORFMT_RGB16)
# define RFB_COLORFMT FB_FMT_RGB16_565 # define RFB_COLORFMT FB_FMT_RGB16_565
# define RFB_BITSPERPIXEL 16 # define RFB_BITSPERPIXEL 16
# define RFB_PIXELDEPTH 16 # define RFB_PIXELDEPTH 16
# define RFB_TRUECOLOR 1 # define RFB_TRUECOLOR 1
# define RFB_RMAX 0x1f # define RFB_RMAX 0x001f
# define RFB_GMAX 0x3f # define RFB_GMAX 0x003f
# define RFB_BMAX 0x1f # define RFB_BMAX 0x001f
# define RFB_RSHIFT 11 # define RFB_RSHIFT 11
# define RFB_GSHIFT 5 # define RFB_GSHIFT 5
# define RFB_BSHIFT 0 # define RFB_BSHIFT 0
@ -95,9 +106,9 @@
# define RFB_BITSPERPIXEL 32 # define RFB_BITSPERPIXEL 32
# define RFB_PIXELDEPTH 24 # define RFB_PIXELDEPTH 24
# define RFB_TRUECOLOR 1 # define RFB_TRUECOLOR 1
# define RFB_RMAX 0xff # define RFB_RMAX 0x000000ff
# define RFB_GMAX 0xff # define RFB_GMAX 0x000000ff
# define RFB_BMAX 0xff # define RFB_BMAX 0x000000ff
# define RFB_RSHIFT 16 # define RFB_RSHIFT 16
# define RFB_GSHIFT 8 # define RFB_GSHIFT 8
# define RFB_BSHIFT 0 # define RFB_BSHIFT 0
@ -113,6 +124,10 @@
# define CONFIG_VNCSERVER_SCREENHEIGHT 240 # define CONFIG_VNCSERVER_SCREENHEIGHT 240
#endif #endif
#ifndef CONFIG_VNCSERVER_NAME
# define CONFIG_VNCSERVER_NAME "NuttX"
#endif
#ifndef CONFIG_VNCSERVER_PRIO #ifndef CONFIG_VNCSERVER_PRIO
# define CONFIG_VNCSERVER_PRIO 100 # define CONFIG_VNCSERVER_PRIO 100
#endif #endif
@ -243,7 +258,9 @@ struct fb_startup_s
/* The size of the color type in the local framebuffer */ /* The size of the color type in the local framebuffer */
#if defined(CONFIG_VNCSERVER_COLORFMT_RGB16) #if defined(CONFIG_VNCSERVER_COLORFMT_RGB8)
typedef uint8_t lfb_color_t;
#elif defined(CONFIG_VNCSERVER_COLORFMT_RGB16)
typedef uint16_t lfb_color_t; typedef uint16_t lfb_color_t;
#elif defined(CONFIG_VNCSERVER_COLORFMT_RGB32) #elif defined(CONFIG_VNCSERVER_COLORFMT_RGB32)
typedef uint32_t lfb_color_t; typedef uint32_t lfb_color_t;
@ -512,12 +529,13 @@ FAR struct vnc_session_s *vnc_find_session(int display);
* Name: vnc_convert_rgbNN * Name: vnc_convert_rgbNN
* *
* Description: * Description:
* Convert the native framebuffer color format (either RGB16 5:6:5 or RGB32 * Convert the native framebuffer color format (either RGB8 3:3:2,
* 8:8:8) to the remote framebuffer color format (either RGB16 5:6:5, * RGB16 5:6:5, or RGB32 8:8:8) to the remote framebuffer color format
* RGB16 5:5:5, or RGB32 8:8:) * (either RGB8 2:2:2, RGB8 3:3:2, RGB16 5:5:5, RGB16 5:6:5, or RGB32
* 8:8:8)
* *
* Input Parameters: * Input Parameters:
* rgb - The RGB src color in local framebuffer color format. * pixel - The src color in local framebuffer format.
* *
* Returned Value: * Returned Value:
* The pixel in the remote framebuffer color format. * The pixel in the remote framebuffer color format.