]> xenbits.xensource.com Git - xen.git/commitdiff
ioemu: Allow VNC buffer sharing when linesize != width * depth
authorKeir Fraser <keir.fraser@citrix.com>
Thu, 20 Mar 2008 10:48:21 +0000 (10:48 +0000)
committerKeir Fraser <keir.fraser@citrix.com>
Thu, 20 Mar 2008 10:48:21 +0000 (10:48 +0000)
Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
tools/ioemu/hw/vga.c
tools/ioemu/vnc.c

index 81de6c18c76c80ee2a45afc8c04f4a740da7a2d9..02f898fee701f6dc8968ea5f9edf5df71e7c2bc8 100644 (file)
@@ -1148,7 +1148,7 @@ static void vga_draw_text(VGAState *s, int full_update)
         cw != s->last_cw || cheight != s->last_ch) {
         s->last_scr_width = width * cw;
         s->last_scr_height = height * cheight;
-        dpy_resize(s->ds, s->last_scr_width, s->last_scr_height, s->last_scr_width * (depth / 8));
+        dpy_resize(s->ds, s->last_scr_width, s->last_scr_height, s->last_scr_width * (s->ds->depth / 8));
         s->last_width = width;
         s->last_height = height;
         s->last_ch = cheight;
@@ -1571,7 +1571,7 @@ static void vga_draw_graphic(VGAState *s, int full_update)
     vga_draw_line = vga_draw_line_table[v * NB_DEPTHS + get_depth_index(s->ds)];
     if (disp_width != s->last_width ||
         height != s->last_height) {
-        dpy_resize(s->ds, disp_width, height, disp_width * (depth / 8));
+        dpy_resize(s->ds, disp_width, height, s->line_offset);
         s->last_scr_width = disp_width;
         s->last_scr_height = height;
         s->last_width = disp_width;
index edd2bd53dc36d5898044f354a35a1967df557c26..c7ab7ebcdbad87e7aa37bd088bfc856a66eebcbe 100644 (file)
@@ -369,20 +369,17 @@ static void vnc_dpy_resize(DisplayState *ds, int w, int h, int linesize)
     VncState *vs = ds->opaque;
     int o;
 
-    if (linesize != w * vs->depth)
-        ds->shared_buf = 0;
-
     if (!ds->shared_buf) {
         if (allocated)
-            ds->data = realloc(ds->data, w * h * vs->depth);
+            ds->data = realloc(ds->data,  h * linesize);
         else
-            ds->data = malloc(w * h * vs->depth);
+            ds->data = malloc(h * linesize);
         allocated = 1;
     } else if (allocated) {
         free(ds->data);
         allocated = 0;
     }
-    vs->old_data = realloc(vs->old_data, w * h * vs->depth);
+    vs->old_data = realloc(vs->old_data, h * linesize);
     vs->dirty_row = realloc(vs->dirty_row, h * sizeof(vs->dirty_row[0]));
     vs->update_row = realloc(vs->update_row, h * sizeof(vs->dirty_row[0]));
 
@@ -399,7 +396,7 @@ static void vnc_dpy_resize(DisplayState *ds, int w, int h, int linesize)
     size_changed = ds->width != w || ds->height != h;
     ds->width = w;
     ds->height = h;
-    ds->linesize = w * vs->depth;
+    ds->linesize = linesize;
     if (vs->csock != -1 && vs->has_resize && size_changed) {
         vs->width = ds->width;
         vs->height = ds->height;
@@ -2494,6 +2491,7 @@ void vnc_display_init(DisplayState *ds)
 
     vs->ds->width = 640;
     vs->ds->height = 400;
+    vs->ds->linesize = 640 * 4;
     vnc_dpy_colourdepth(vs->ds, 24);
 }