From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1MgLwf-0002Pb-VF for qemu-devel@nongnu.org; Wed, 26 Aug 2009 13:06:02 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1MgLwZ-0002Eq-8X for qemu-devel@nongnu.org; Wed, 26 Aug 2009 13:05:59 -0400 Received: from [199.232.76.173] (port=45781 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1MgLwY-0002EU-DU for qemu-devel@nongnu.org; Wed, 26 Aug 2009 13:05:54 -0400 Received: from mx1.redhat.com ([209.132.183.28]:61911) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1MgLwX-0000Xo-No for qemu-devel@nongnu.org; Wed, 26 Aug 2009 13:05:54 -0400 From: Glauber Costa Date: Wed, 26 Aug 2009 09:05:41 -0400 Message-Id: <1251291946-25821-8-git-send-email-glommer@redhat.com> In-Reply-To: <1251291946-25821-7-git-send-email-glommer@redhat.com> References: <1251291946-25821-1-git-send-email-glommer@redhat.com> <1251291946-25821-2-git-send-email-glommer@redhat.com> <1251291946-25821-3-git-send-email-glommer@redhat.com> <1251291946-25821-4-git-send-email-glommer@redhat.com> <1251291946-25821-5-git-send-email-glommer@redhat.com> <1251291946-25821-6-git-send-email-glommer@redhat.com> <1251291946-25821-7-git-send-email-glommer@redhat.com> Subject: [Qemu-devel] [PATCH 07/12] BACKPORT: vnc: fix copyrect screen corruption List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: aliguori@us.ibm.com, Gerd Hoffmann From: Gerd Hoffmann When sending a copyrect command to the vnc client, we must also update the local server surface. Otherwise the server's and the client's idea of the screen content run out of sync and screen updates don't work correctly. [ backport: uses ds_get_data() instead of direct dereference ] Signed-off-by: Anthony Liguori Signed-off-by: Glauber Costa --- vnc.c | 23 +++++++++++++++++++++++ 1 files changed, 23 insertions(+), 0 deletions(-) diff --git a/vnc.c b/vnc.c index 1d8ebe7..c0700c0 100644 --- a/vnc.c +++ b/vnc.c @@ -633,8 +633,14 @@ static void send_framebuffer_update(VncState *vs, int x, int y, int w, int h) static void vnc_copy(VncState *vs, int src_x, int src_y, int dst_x, int dst_y, int w, int h) { + + uint8_t *src_row; + uint8_t *dst_row; + int y,pitch,depth; + vnc_update_client(vs); + /* send bitblit op to the vnc client */ vnc_write_u8(vs, 0); /* msg id */ vnc_write_u8(vs, 0); vnc_write_u16(vs, 1); /* number of rects */ @@ -642,6 +648,23 @@ static void vnc_copy(VncState *vs, int src_x, int src_y, int dst_x, int dst_y, i vnc_write_u16(vs, src_x); vnc_write_u16(vs, src_y); vnc_flush(vs); + + /* do bitblit op on the local surface too */ + pitch = ds_get_linesize(vs->ds); + depth = ds_get_bytes_per_pixel(vs->ds); + src_row = ds_get_data(vs->ds) + pitch * src_y + depth * src_x; + dst_row = ds_get_data(vs->ds) + pitch * dst_y + depth * dst_x; + if (dst_y > src_y) { + /* copy backwards */ + src_row += pitch * (h-1); + dst_row += pitch * (h-1); + pitch = -pitch; + } + for (y = 0; y < h; y++) { + memmove(dst_row, src_row, w * depth); + src_row += pitch; + dst_row += pitch; + } } static void vnc_dpy_copy(DisplayState *ds, int src_x, int src_y, int dst_x, int dst_y, int w, int h) -- 1.6.2.2