# HG changeset patch # User gthomas # Date 1063721712 0 # Node ID e0c748e0a46bd3622db16ea1fba1a5053473e176 # Parent 0e1c2770aa9dd31fab864422a2510fcc3e6c8f83 Add region masks, cursor in demo - from Chris Garry diff --git a/packages/net/vnc_server/current/ChangeLog b/packages/net/vnc_server/current/ChangeLog --- a/packages/net/vnc_server/current/ChangeLog +++ b/packages/net/vnc_server/current/ChangeLog @@ -1,3 +1,13 @@ +2003-09-16 Chris Garry + + * doc/vnc-server.html: + * src/vnc-server.c: + * include/vnc-server.h: + Added new function VncCopyBuffer2RectMask(). + + * tests/vnc-test.c: + Modifed to include a cursor. + 2003-09-02 Chris Garry * tests/vnc-test.c: diff --git a/packages/net/vnc_server/current/doc/vnc-server.html b/packages/net/vnc_server/current/doc/vnc-server.html --- a/packages/net/vnc_server/current/doc/vnc-server.html +++ b/packages/net/vnc_server/current/doc/vnc-server.html @@ -246,8 +246,6 @@  /* rectangle width on display */
                   20,  /* rectangle heigth on display */
-                    20, -  /* rectangle heigth on display */
                                      (void *)my_buffer, /* Address of buffer */
                   50, @@ -268,7 +266,8 @@ -

 

+

 

+

void @@ -325,6 +324,37 @@

+

 

+ + + +
+

void + VncCopyBuffer2RectMask(void *buffer,
+                             + cyg_uint16 buff_w,
+                             + cyg_uint16 buff_h,
+                             + cyg_uint16 x_off,
+                             + cyg_uint16 y_off,
+                             + cyg_uint16 x,
+                             + cyg_uint16 y,
+                             + cyg_uint16 width,
+                             + cyg_uint16 height,
+                             vnc_colour_t + mask_colour )

+

The VNC copy buffer to rectangle with mask function works exactly like + VncCopyRect2Buffer(), except that a mask colour is also specified. Any + pixels in the buffer that have the value mask_colour, will not be copied + to the frame buffer - leaving the original pixels untouched. +

+

 

@@ -590,7 +620,7 @@

The cyg_io_read() function is a non-blocking function and each keystroke event - generates 4bytes of data:

+ generates 4 bytes of data:

Byte 0: Padding - always zero
Byte 1: Key pressed/released (1 when key pressed)
Byte 2: Keysym value for key MSB
diff --git a/packages/net/vnc_server/current/include/vnc-server.h b/packages/net/vnc_server/current/include/vnc-server.h --- a/packages/net/vnc_server/current/include/vnc-server.h +++ b/packages/net/vnc_server/current/include/vnc-server.h @@ -119,6 +119,8 @@ void VncCopyRect2Buffer(cyg_uint16 x, cy void *buffer, cyg_uint16 buff_w, cyg_uint16 buff_h, cyg_uint16 x_off, cyg_uint16 y_off); void VncCopyBuffer2Rect(void *buffer, cyg_uint16 buff_w, cyg_uint16 buff_h, cyg_uint16 x_off, cyg_uint16 y_off, cyg_uint16 x, cyg_uint16 y, cyg_uint16 width, cyg_uint16 height); +void VncCopyBuffer2RectMask( void *buffer, cyg_uint16 buff_w, cyg_uint16 buff_h ,cyg_uint16 x_off, cyg_uint16 y_off, + cyg_uint16 x, cyg_uint16 y, cyg_uint16 width, cyg_uint16 height, vnc_colour_t col); void VncSoundBell(void); #ifdef CYGNUM_VNC_SERVER_INCLUDE_VNC_PRINTF vnc_printf_return_t VncPrintf(MWCFONT* font, int do_print, vnc_colour_t colour, int x, int y, const char *fmt, ... ); diff --git a/packages/net/vnc_server/current/src/vnc-server.c b/packages/net/vnc_server/current/src/vnc-server.c --- a/packages/net/vnc_server/current/src/vnc-server.c +++ b/packages/net/vnc_server/current/src/vnc-server.c @@ -1535,7 +1535,7 @@ void VncCopyBuffer2Rect( void *buffer, c src_buffer += x_off; /* Allow for an x offset into supplied buffer */ for (j = x; j < x + width; j++) { - /* Copy each pixel in the rectangle to the supplied buffer */ + /* Copy each pixel in the supplied buffer to the frame buffer */ frame_buffer[i][j] = *src_buffer; src_buffer++; } @@ -1554,6 +1554,48 @@ void VncCopyBuffer2Rect( void *buffer, c } +/* Function to copy data from a supplied buffer to a rectangle in the frame buffer with mask */ +void VncCopyBuffer2RectMask( void *buffer, cyg_uint16 buff_w, cyg_uint16 buff_h ,cyg_uint16 x_off, cyg_uint16 y_off, + cyg_uint16 x, cyg_uint16 y, cyg_uint16 width, cyg_uint16 height, vnc_colour_t col) +{ + int i, j; + cyg_uint16 eol_padding = buff_w - width - x_off; + +#if (BITS_PER_PIXEL == 8) + cyg_uint8 *src_buffer = (cyg_uint8 *)buffer; +#else + cyg_uint16 *src_buffer = (cyg_uint16 *)buffer; +#endif + + src_buffer += ((x_off + width) * y_off); /* Allow for a y offset into supplied buffer */ + for (i = y; i < y + height; i++) + { + src_buffer += x_off; /* Allow for an x offset into supplied buffer */ + for (j = x; j < x + width; j++) + { + /* Copy each non-mask pixel in the supplied buffer to the frame buffer */ + if (*src_buffer != col) + { + frame_buffer[i][j] = *src_buffer; + } + + src_buffer++; + } + + src_buffer += eol_padding; /* Allow for unused space at the end of each line */ + } + + /* Mark the required tiles for update */ + for (i = y/TILE_SIZE; i <= (y + height - 1) /TILE_SIZE; i++) + { + for (j = x/TILE_SIZE; j <= (x + width - 1)/TILE_SIZE; j++) + { + tile_updated[i][j] = 1; + } + } +} + + void VncSoundBell(void) { cyg_mutex_lock(&SoundBell_lock); @@ -1646,14 +1688,13 @@ vnc_printf_return_t VncPrintf(MWCFONT* f y_max = y_pos; + if (do_print) + { /* Draw the character in the frame buffer */ for (i = char_offset; i < (char_offset + sel_font->height); i++) { if ((y_pos + i - char_offset) < CYGNUM_VNC_SERVER_FRAME_HEIGHT) { - if (do_print) - { - /* Actually print the text */ /* This has not gone off the bottom of the frame */ for (j = 0; j < char_width; j++) { diff --git a/packages/net/vnc_server/current/tests/vnc-test.c b/packages/net/vnc_server/current/tests/vnc-test.c --- a/packages/net/vnc_server/current/tests/vnc-test.c +++ b/packages/net/vnc_server/current/tests/vnc-test.c @@ -29,6 +29,12 @@ #include /* read() */ #include /* rand() */ +void DrawCursor(void); +void HideCursor(void); + +int cursor_x, cursor_y; /* Cursor position */ +vnc_frame_format_t *display_info; /* Display Info */ + int main() { int mouse_handle = -1; @@ -47,8 +53,6 @@ int main() fd_set sock_desc; /* Set of descriptors for select */ int max_handle; - vnc_frame_format_t *display_info; - int bell_text_state = 0; char bell_message[] = "***** Click on a yellow pixel to sound the bell *****"; @@ -196,6 +200,11 @@ int main() /* Write the text on the background */ VncPrintf(0, 1, VNC_YELLOW, bell_text_x_pos, bell_text_y_pos, "%s", bell_message); + /* Initialise the cursor */ + cursor_x = display_info->frame_width / 2; + cursor_y = display_info->frame_height / 2; + DrawCursor(); + /* Initialse the max handle variable */ max_handle = -1; if (kbd_handle > max_handle) @@ -266,6 +275,10 @@ int main() if (mouse_len == 8) { + HideCursor(); /* Hide the old cursor */ + cursor_x = mouse_data[2]*256 + mouse_data[3]; + cursor_y = mouse_data[4]*256 + mouse_data[5]; + if (mouse_data[1] && !last_mouse_button) { /* Ring bell and change colours of bell message text if the */ @@ -304,6 +317,7 @@ int main() } last_mouse_button = mouse_data[1]; /* Save mouse button data */ + DrawCursor(); /* Draw the new cursor */ } } @@ -312,3 +326,116 @@ int main() return 1; } + + +vnc_colour_t under_cursor[16][16]; /* Buffer to hold display area under cursor */ + + /* Buffer holding cursor data */ +#define BLK VNC_BLACK +#define TRN VNC_BLUE +#define WHT VNC_WHITE +#define GRY VNC_LTGRAY +vnc_colour_t cursor[16][16] = {{BLK, BLK, BLK, TRN, TRN, TRN, TRN, TRN, TRN, TRN, TRN, TRN, TRN, TRN, TRN, TRN}, + {BLK, GRY, GRY, BLK, BLK, TRN, TRN, TRN, TRN, TRN, TRN, TRN, TRN, TRN, TRN, TRN}, + {BLK, WHT, GRY, GRY, GRY, BLK, BLK, TRN, TRN, TRN, TRN, TRN, TRN, TRN, TRN, TRN}, + {TRN, BLK, WHT, GRY, GRY, GRY, GRY, BLK, BLK, TRN, TRN, TRN, TRN, TRN, TRN, TRN}, + {TRN, BLK, WHT, WHT, GRY, GRY, GRY, GRY, GRY, BLK, BLK, TRN, TRN, TRN, TRN, TRN}, + {TRN, TRN, BLK, WHT, WHT, GRY, GRY, GRY, GRY, GRY, GRY, BLK, BLK, TRN, TRN, TRN}, + {TRN, TRN, BLK, WHT, WHT, WHT, GRY, GRY, GRY, GRY, GRY, GRY, GRY, BLK, TRN, TRN}, + {TRN, TRN, TRN, BLK, WHT, WHT, WHT, GRY, GRY, BLK, BLK, BLK, BLK, BLK, TRN, TRN}, + {TRN, TRN, TRN, BLK, WHT, WHT, WHT, WHT, GRY, GRY, BLK, TRN, TRN, TRN, TRN, TRN}, + {TRN, TRN, TRN, TRN, BLK, WHT, WHT, BLK, WHT, GRY, GRY, BLK, TRN, TRN, TRN, TRN}, + {TRN, TRN, TRN, TRN, BLK, WHT, WHT, BLK, BLK, WHT, GRY, GRY, BLK, TRN, TRN, TRN}, + {TRN, TRN, TRN, TRN, TRN, BLK, WHT, BLK, TRN, BLK, WHT, GRY, GRY, BLK, TRN, TRN}, + {TRN, TRN, TRN, TRN, TRN, BLK, WHT, BLK, TRN, TRN, BLK, WHT, GRY, GRY, BLK, TRN}, + {TRN, TRN, TRN, TRN, TRN, TRN, BLK, TRN, TRN, TRN, TRN, BLK, WHT, GRY, GRY, BLK}, + {TRN, TRN, TRN, TRN, TRN, TRN, TRN, TRN, TRN, TRN, TRN, TRN, BLK, WHT, BLK, TRN}, + {TRN, TRN, TRN, TRN, TRN, TRN, TRN, TRN, TRN, TRN, TRN, TRN, TRN, BLK, TRN, TRN}}; +#undef BLK +#undef TRN +#undef WHT +#undef GRY + +void DrawCursor(void) +{ + int rect_width, rect_height; + + if (cursor_x >= display_info->frame_width) + { + /* Cursor is off the screen */ + return; + } + else if ((cursor_x + 16) >= display_info->frame_width) + { + /* Cursor is partially off the screen */ + rect_width = display_info->frame_width - cursor_x; + } + else + { + /* Cursor is fully on the screen */ + rect_width = 16; + } + + if (cursor_y >= display_info->frame_height) + { + /* Cursor is off the screen */ + return; + } + else if ((cursor_y + 16) >= display_info->frame_height) + { + /* Cursor is partially off the screen */ + rect_height = display_info->frame_height - cursor_y; + } + else + { + /* Cursor is fully on the screen */ + rect_height = 16; + } + + /* Save the area under the cursor */ + VncCopyRect2Buffer(cursor_x, cursor_y, rect_width, rect_height, under_cursor, 16, 16, 0, 0); + + /* Draw the new cursor */ + VncCopyBuffer2RectMask(cursor, 16, 16, 0, 0, cursor_x, cursor_y, rect_width, rect_height, VNC_BLUE); +} + + +void HideCursor(void) +{ + int rect_width, rect_height; + + if (cursor_x >= display_info->frame_width) + { + /* Cursor is off the screen */ + return; + } + else if ((cursor_x + 16) >= display_info->frame_width) + { + /* Cursor is partially off the screen */ + rect_width = display_info->frame_width - cursor_x; + } + else + { + /* Cursor is fully on the screen */ + rect_width = 16; + } + + if (cursor_y >= display_info->frame_height) + { + /* Cursor is off the screen */ + return; + } + else if ((cursor_y + 16) >= display_info->frame_height) + { + /* Cursor is partially off the screen */ + rect_height = display_info->frame_height - cursor_y; + } + else + { + /* Cursor is fully on the screen */ + rect_height = 16; + } + + /* Restore the saved area under the cursor */ + VncCopyBuffer2Rect(under_cursor, 16, 16, 0, 0, cursor_x, cursor_y, rect_width, rect_height); +}