[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v3 09/12] vnc: return the number of rectangles
From: |
Corentin Chary |
Subject: |
[Qemu-devel] [PATCH v3 09/12] vnc: return the number of rectangles |
Date: |
Wed, 19 May 2010 09:24:09 +0200 |
Some encodings like tight supports tiling (spliting in
multiple sub-rectangles). So we needed a way to tell
vnc_update_client() how much rectangles are in the buffer.
zlib, raw and hextile always send a full rectangle.
Signed-off-by: Corentin Chary <address@hidden>
---
vnc-encoding-hextile.c | 5 +++--
vnc-encoding-zlib.c | 6 ++++--
vnc.c | 25 ++++++++++++++++---------
vnc.h | 6 +++---
4 files changed, 26 insertions(+), 16 deletions(-)
diff --git a/vnc-encoding-hextile.c b/vnc-encoding-hextile.c
index a01c5e2..728f25e 100644
--- a/vnc-encoding-hextile.c
+++ b/vnc-encoding-hextile.c
@@ -62,8 +62,8 @@ static void hextile_enc_cord(uint8_t *ptr, int x, int y, int
w, int h)
#undef BPP
#undef GENERIC
-void vnc_hextile_send_framebuffer_update(VncState *vs, int x,
- int y, int w, int h)
+int vnc_hextile_send_framebuffer_update(VncState *vs, int x,
+ int y, int w, int h)
{
int i, j;
int has_fg, has_bg;
@@ -83,6 +83,7 @@ void vnc_hextile_send_framebuffer_update(VncState *vs, int x,
free(last_fg);
free(last_bg);
+ return 1;
}
void vnc_hextile_set_pixel_conversion(VncState *vs, int generic)
diff --git a/vnc-encoding-zlib.c b/vnc-encoding-zlib.c
index 1d4dd1a..88ac863 100644
--- a/vnc-encoding-zlib.c
+++ b/vnc-encoding-zlib.c
@@ -116,7 +116,7 @@ static int vnc_zlib_stop(VncState *vs)
return zstream->total_out - previous_out;
}
-void vnc_zlib_send_framebuffer_update(VncState *vs, int x, int y, int w, int h)
+int vnc_zlib_send_framebuffer_update(VncState *vs, int x, int y, int w, int h)
{
int old_offset, new_offset, bytes_written;
@@ -132,13 +132,15 @@ void vnc_zlib_send_framebuffer_update(VncState *vs, int
x, int y, int w, int h)
bytes_written = vnc_zlib_stop(vs);
if (bytes_written == -1)
- return;
+ return 0;
// hack in the size
new_offset = vs->output.offset;
vs->output.offset = old_offset;
vnc_write_u32(vs, bytes_written);
vs->output.offset = new_offset;
+
+ return 1;
}
void vnc_zlib_clear(VncState *vs)
diff --git a/vnc.c b/vnc.c
index d622a5a..34da9a2 100644
--- a/vnc.c
+++ b/vnc.c
@@ -646,7 +646,7 @@ static void vnc_write_pixels_generic(VncState *vs, void
*pixels1, int size)
}
}
-void vnc_raw_send_framebuffer_update(VncState *vs, int x, int y, int w, int h)
+int vnc_raw_send_framebuffer_update(VncState *vs, int x, int y, int w, int h)
{
int i;
uint8_t *row;
@@ -657,23 +657,27 @@ void vnc_raw_send_framebuffer_update(VncState *vs, int x,
int y, int w, int h)
vs->write_pixels(vs, row, w * ds_get_bytes_per_pixel(vs->ds));
row += ds_get_linesize(vs->ds);
}
+ return 1;
}
-static void send_framebuffer_update(VncState *vs, int x, int y, int w, int h)
+static int send_framebuffer_update(VncState *vs, int x, int y, int w, int h)
{
+ int n = 0;
+
switch(vs->vnc_encoding) {
case VNC_ENCODING_ZLIB:
- vnc_zlib_send_framebuffer_update(vs, x, y, w, h);
+ n = vnc_zlib_send_framebuffer_update(vs, x, y, w, h);
break;
case VNC_ENCODING_HEXTILE:
vnc_framebuffer_update(vs, x, y, w, h, VNC_ENCODING_HEXTILE);
- vnc_hextile_send_framebuffer_update(vs, x, y, w, h);
+ n = vnc_hextile_send_framebuffer_update(vs, x, y, w, h);
break;
default:
vnc_framebuffer_update(vs, x, y, w, h, VNC_ENCODING_RAW);
- vnc_raw_send_framebuffer_update(vs, x, y, w, h);
+ n = vnc_raw_send_framebuffer_update(vs, x, y, w, h);
break;
}
+ return n;
}
static void vnc_copy(VncState *vs, int src_x, int src_y, int dst_x, int dst_y,
int w, int h)
@@ -784,6 +788,7 @@ static int vnc_update_client(VncState *vs, int has_dirty)
int y;
int n_rectangles;
int saved_offset;
+ int n;
if (vs->output.offset && !vs->audio_cap && !vs->force_update)
/* kernel send buffers are full -> drop frames to throttle */
@@ -816,16 +821,18 @@ static int vnc_update_client(VncState *vs, int has_dirty)
} else {
if (last_x != -1) {
int h = find_and_clear_dirty_height(vs, y, last_x, x);
- send_framebuffer_update(vs, last_x * 16, y, (x -
last_x) * 16, h);
- n_rectangles++;
+ n = send_framebuffer_update(vs, last_x * 16, y,
+ (x - last_x) * 16, h);
+ n_rectangles += n;
}
last_x = -1;
}
}
if (last_x != -1) {
int h = find_and_clear_dirty_height(vs, y, last_x, x);
- send_framebuffer_update(vs, last_x * 16, y, (x - last_x) * 16,
h);
- n_rectangles++;
+ n = send_framebuffer_update(vs, last_x * 16, y,
+ (x - last_x) * 16, h);
+ n_rectangles += n;
}
}
vs->output.buffer[saved_offset] = (n_rectangles >> 8) & 0xFF;
diff --git a/vnc.h b/vnc.h
index ffcbc52..c3b2173 100644
--- a/vnc.h
+++ b/vnc.h
@@ -392,13 +392,13 @@ void vnc_framebuffer_update(VncState *vs, int x, int y,
int w, int h,
void vnc_convert_pixel(VncState *vs, uint8_t *buf, uint32_t v);
/* Encodings */
-void vnc_raw_send_framebuffer_update(VncState *vs, int x, int y, int w, int h);
+int vnc_raw_send_framebuffer_update(VncState *vs, int x, int y, int w, int h);
-void vnc_hextile_send_framebuffer_update(VncState *vs, int x,
+int vnc_hextile_send_framebuffer_update(VncState *vs, int x,
int y, int w, int h);
void vnc_hextile_set_pixel_conversion(VncState *vs, int generic);
-void vnc_zlib_send_framebuffer_update(VncState *vs, int x, int y, int w, int
h);
+int vnc_zlib_send_framebuffer_update(VncState *vs, int x, int y, int w, int h);
void vnc_zlib_clear(VncState *vs);
#endif /* __QEMU_VNC_H */
--
1.7.0.2
- [Qemu-devel] [PATCH v3 04/12] vnc: only use a single zlib stream, (continued)
- [Qemu-devel] [PATCH v3 04/12] vnc: only use a single zlib stream, Corentin Chary, 2010/05/19
- [Qemu-devel] [PATCH v3 03/12] vnc: really call zlib if we want zlib, Corentin Chary, 2010/05/19
- [Qemu-devel] [PATCH v3 02/12] vnc: explain why set_encodings loop is reversed, Corentin Chary, 2010/05/19
- [Qemu-devel] [PATCH v3 05/12] vnc: adjust compression zstream level, Corentin Chary, 2010/05/19
- [Qemu-devel] [PATCH v3 08/12] vnc: remove a memory leak in zlib, Corentin Chary, 2010/05/19
- [Qemu-devel] [PATCH v3 12/12] vnc: tight: add palette encoding, Corentin Chary, 2010/05/19
- [Qemu-devel] [PATCH v3 07/12] vnc: add buffer_free(), Corentin Chary, 2010/05/19
- [Qemu-devel] [PATCH v3 06/12] vnc: don't clear zlib stream on set_encoding, Corentin Chary, 2010/05/19
- [Qemu-devel] [PATCH v3 10/12] vnc: add basic tight support, Corentin Chary, 2010/05/19
- [Qemu-devel] [PATCH v3 11/12] vnc: add support for tight fill encoding, Corentin Chary, 2010/05/19
- [Qemu-devel] [PATCH v3 09/12] vnc: return the number of rectangles,
Corentin Chary <=
- Re: [Qemu-devel] [PATCH v3 00/12] *** SUBJECT HERE ***, Corentin Chary, 2010/05/19
- [Qemu-devel] [PATCH 3/3] vnc: add missing target for vnc-encodings-*.o, Corentin Chary, 2010/05/27
- [Qemu-devel] [PATCH 1/3] vnc: tight: don't forget last pixel in tight_encode_indexed_rect, Corentin Chary, 2010/05/27
- [Qemu-devel] [PATCH 2/3] vnc: tight: don't forget the third color, Corentin Chary, 2010/05/27