qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH v3 1 of 4] vnc: fix copyrect screen corruption


From: Stefano Stabellini
Subject: [Qemu-devel] [PATCH v3 1 of 4] vnc: fix copyrect screen corruption
Date: Mon, 3 Aug 2009 10:53:47 +0100
User-agent: Alpine 2.00 (DEB 1167 2008-08-23)

This is the patch Gerd submitted few days ago to fix CopyRect.

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.

Gerd didn't add a Signed-off line so neither am I.

---
 vnc.c |   22 ++++++++++++++++++++++
 1 files changed, 22 insertions(+), 0 deletions(-)

diff --git a/vnc.c b/vnc.c
index de0ff87..a50ee0c 100644
--- a/vnc.c
+++ b/vnc.c
@@ -654,6 +654,11 @@ 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;
+
+    /* 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 */
@@ -661,6 +666,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 = vs->server.ds->data + pitch * src_y + depth * src_x;
+    dst_row = vs->server.ds->data + 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.5.4.3





reply via email to

[Prev in Thread] Current Thread [Next in Thread]