root / ui / vnc-enc-zrle.c @ 7bd427d8
History | View | Annotate | Download (10.4 kB)
1 | 148954fa | Corentin Chary | /*
|
---|---|---|---|
2 | 148954fa | Corentin Chary | * QEMU VNC display driver: Zlib Run-length Encoding (ZRLE)
|
3 | 148954fa | Corentin Chary | *
|
4 | 148954fa | Corentin Chary | * From libvncserver/libvncserver/zrle.c
|
5 | 148954fa | Corentin Chary | * Copyright (C) 2002 RealVNC Ltd. All Rights Reserved.
|
6 | 148954fa | Corentin Chary | * Copyright (C) 2003 Sun Microsystems, Inc.
|
7 | 148954fa | Corentin Chary | *
|
8 | 148954fa | Corentin Chary | * Copyright (C) 2010 Corentin Chary <corentin.chary@gmail.com>
|
9 | 148954fa | Corentin Chary | *
|
10 | 148954fa | Corentin Chary | * Permission is hereby granted, free of charge, to any person obtaining a copy
|
11 | 148954fa | Corentin Chary | * of this software and associated documentation files (the "Software"), to deal
|
12 | 148954fa | Corentin Chary | * in the Software without restriction, including without limitation the rights
|
13 | 148954fa | Corentin Chary | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
14 | 148954fa | Corentin Chary | * copies of the Software, and to permit persons to whom the Software is
|
15 | 148954fa | Corentin Chary | * furnished to do so, subject to the following conditions:
|
16 | 148954fa | Corentin Chary | *
|
17 | 148954fa | Corentin Chary | * The above copyright notice and this permission notice shall be included in
|
18 | 148954fa | Corentin Chary | * all copies or substantial portions of the Software.
|
19 | 148954fa | Corentin Chary | *
|
20 | 148954fa | Corentin Chary | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
21 | 148954fa | Corentin Chary | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
22 | 148954fa | Corentin Chary | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
23 | 148954fa | Corentin Chary | * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
24 | 148954fa | Corentin Chary | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
25 | 148954fa | Corentin Chary | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
26 | 148954fa | Corentin Chary | * THE SOFTWARE.
|
27 | 148954fa | Corentin Chary | */
|
28 | 148954fa | Corentin Chary | |
29 | 148954fa | Corentin Chary | #include "vnc.h" |
30 | 148954fa | Corentin Chary | #include "vnc-enc-zrle.h" |
31 | 148954fa | Corentin Chary | |
32 | 148954fa | Corentin Chary | static const int bits_per_packed_pixel[] = { |
33 | 148954fa | Corentin Chary | 0, 1, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 |
34 | 148954fa | Corentin Chary | }; |
35 | 148954fa | Corentin Chary | |
36 | 148954fa | Corentin Chary | |
37 | 148954fa | Corentin Chary | static void vnc_zrle_start(VncState *vs) |
38 | 148954fa | Corentin Chary | { |
39 | 148954fa | Corentin Chary | buffer_reset(&vs->zrle.zrle); |
40 | 148954fa | Corentin Chary | |
41 | 148954fa | Corentin Chary | /* make the output buffer be the zlib buffer, so we can compress it later */
|
42 | 148954fa | Corentin Chary | vs->zrle.tmp = vs->output; |
43 | 148954fa | Corentin Chary | vs->output = vs->zrle.zrle; |
44 | 148954fa | Corentin Chary | } |
45 | 148954fa | Corentin Chary | |
46 | 148954fa | Corentin Chary | static void vnc_zrle_stop(VncState *vs) |
47 | 148954fa | Corentin Chary | { |
48 | 148954fa | Corentin Chary | /* switch back to normal output/zlib buffers */
|
49 | 148954fa | Corentin Chary | vs->zrle.zrle = vs->output; |
50 | 148954fa | Corentin Chary | vs->output = vs->zrle.tmp; |
51 | 148954fa | Corentin Chary | } |
52 | 148954fa | Corentin Chary | |
53 | 148954fa | Corentin Chary | static void *zrle_convert_fb(VncState *vs, int x, int y, int w, int h, |
54 | 148954fa | Corentin Chary | int bpp)
|
55 | 148954fa | Corentin Chary | { |
56 | 148954fa | Corentin Chary | Buffer tmp; |
57 | 148954fa | Corentin Chary | |
58 | 148954fa | Corentin Chary | buffer_reset(&vs->zrle.fb); |
59 | 148954fa | Corentin Chary | buffer_reserve(&vs->zrle.fb, w * h * bpp + bpp); |
60 | 148954fa | Corentin Chary | |
61 | 148954fa | Corentin Chary | tmp = vs->output; |
62 | 148954fa | Corentin Chary | vs->output = vs->zrle.fb; |
63 | 148954fa | Corentin Chary | |
64 | 148954fa | Corentin Chary | vnc_raw_send_framebuffer_update(vs, x, y, w, h); |
65 | 148954fa | Corentin Chary | |
66 | 148954fa | Corentin Chary | vs->zrle.fb = vs->output; |
67 | 148954fa | Corentin Chary | vs->output = tmp; |
68 | 148954fa | Corentin Chary | return vs->zrle.fb.buffer;
|
69 | 148954fa | Corentin Chary | } |
70 | 148954fa | Corentin Chary | |
71 | 148954fa | Corentin Chary | static int zrle_compress_data(VncState *vs, int level) |
72 | 148954fa | Corentin Chary | { |
73 | 148954fa | Corentin Chary | z_streamp zstream = &vs->zrle.stream; |
74 | 148954fa | Corentin Chary | |
75 | 148954fa | Corentin Chary | buffer_reset(&vs->zrle.zlib); |
76 | 148954fa | Corentin Chary | |
77 | 148954fa | Corentin Chary | if (zstream->opaque != vs) {
|
78 | 148954fa | Corentin Chary | int err;
|
79 | 148954fa | Corentin Chary | |
80 | 148954fa | Corentin Chary | zstream->zalloc = vnc_zlib_zalloc; |
81 | 148954fa | Corentin Chary | zstream->zfree = vnc_zlib_zfree; |
82 | 148954fa | Corentin Chary | |
83 | 148954fa | Corentin Chary | err = deflateInit2(zstream, level, Z_DEFLATED, MAX_WBITS, |
84 | 148954fa | Corentin Chary | MAX_MEM_LEVEL, Z_DEFAULT_STRATEGY); |
85 | 148954fa | Corentin Chary | |
86 | 148954fa | Corentin Chary | if (err != Z_OK) {
|
87 | 148954fa | Corentin Chary | fprintf(stderr, "VNC: error initializing zlib\n");
|
88 | 148954fa | Corentin Chary | return -1; |
89 | 148954fa | Corentin Chary | } |
90 | 148954fa | Corentin Chary | |
91 | 148954fa | Corentin Chary | zstream->opaque = vs; |
92 | 148954fa | Corentin Chary | } |
93 | 148954fa | Corentin Chary | |
94 | 148954fa | Corentin Chary | /* reserve memory in output buffer */
|
95 | 148954fa | Corentin Chary | buffer_reserve(&vs->zrle.zlib, vs->zrle.zrle.offset + 64);
|
96 | 148954fa | Corentin Chary | |
97 | 148954fa | Corentin Chary | /* set pointers */
|
98 | 148954fa | Corentin Chary | zstream->next_in = vs->zrle.zrle.buffer; |
99 | 148954fa | Corentin Chary | zstream->avail_in = vs->zrle.zrle.offset; |
100 | 148954fa | Corentin Chary | zstream->next_out = vs->zrle.zlib.buffer + vs->zrle.zlib.offset; |
101 | 148954fa | Corentin Chary | zstream->avail_out = vs->zrle.zlib.capacity - vs->zrle.zlib.offset; |
102 | 148954fa | Corentin Chary | zstream->data_type = Z_BINARY; |
103 | 148954fa | Corentin Chary | |
104 | 148954fa | Corentin Chary | /* start encoding */
|
105 | 148954fa | Corentin Chary | if (deflate(zstream, Z_SYNC_FLUSH) != Z_OK) {
|
106 | 148954fa | Corentin Chary | fprintf(stderr, "VNC: error during zrle compression\n");
|
107 | 148954fa | Corentin Chary | return -1; |
108 | 148954fa | Corentin Chary | } |
109 | 148954fa | Corentin Chary | |
110 | 148954fa | Corentin Chary | vs->zrle.zlib.offset = vs->zrle.zlib.capacity - zstream->avail_out; |
111 | 148954fa | Corentin Chary | return vs->zrle.zlib.offset;
|
112 | 148954fa | Corentin Chary | } |
113 | 148954fa | Corentin Chary | |
114 | 148954fa | Corentin Chary | /* Try to work out whether to use RLE and/or a palette. We do this by
|
115 | 148954fa | Corentin Chary | * estimating the number of bytes which will be generated and picking the
|
116 | 148954fa | Corentin Chary | * method which results in the fewest bytes. Of course this may not result
|
117 | 148954fa | Corentin Chary | * in the fewest bytes after compression... */
|
118 | 148954fa | Corentin Chary | static void zrle_choose_palette_rle(VncState *vs, int w, int h, |
119 | 148954fa | Corentin Chary | VncPalette *palette, int bpp_out,
|
120 | 148954fa | Corentin Chary | int runs, int single_pixels, |
121 | 148954fa | Corentin Chary | int zywrle_level,
|
122 | 148954fa | Corentin Chary | bool *use_rle, bool *use_palette) |
123 | 148954fa | Corentin Chary | { |
124 | 148954fa | Corentin Chary | size_t estimated_bytes; |
125 | 148954fa | Corentin Chary | size_t plain_rle_bytes; |
126 | 148954fa | Corentin Chary | |
127 | 148954fa | Corentin Chary | *use_palette = *use_rle = false;
|
128 | 148954fa | Corentin Chary | |
129 | 148954fa | Corentin Chary | estimated_bytes = w * h * (bpp_out / 8); /* start assuming raw */ |
130 | 148954fa | Corentin Chary | |
131 | 148954fa | Corentin Chary | if (bpp_out != 8) { |
132 | 148954fa | Corentin Chary | if (zywrle_level > 0 && !(zywrle_level & 0x80)) |
133 | 148954fa | Corentin Chary | estimated_bytes >>= zywrle_level; |
134 | 148954fa | Corentin Chary | } |
135 | 148954fa | Corentin Chary | |
136 | 148954fa | Corentin Chary | plain_rle_bytes = ((bpp_out / 8) + 1) * (runs + single_pixels); |
137 | 148954fa | Corentin Chary | |
138 | 148954fa | Corentin Chary | if (plain_rle_bytes < estimated_bytes) {
|
139 | 148954fa | Corentin Chary | *use_rle = true;
|
140 | 148954fa | Corentin Chary | estimated_bytes = plain_rle_bytes; |
141 | 148954fa | Corentin Chary | } |
142 | 148954fa | Corentin Chary | |
143 | 148954fa | Corentin Chary | if (palette_size(palette) < 128) { |
144 | 148954fa | Corentin Chary | int palette_rle_bytes;
|
145 | 148954fa | Corentin Chary | |
146 | 148954fa | Corentin Chary | palette_rle_bytes = (bpp_out / 8) * palette_size(palette);
|
147 | 148954fa | Corentin Chary | palette_rle_bytes += 2 * runs + single_pixels;
|
148 | 148954fa | Corentin Chary | |
149 | 148954fa | Corentin Chary | if (palette_rle_bytes < estimated_bytes) {
|
150 | 148954fa | Corentin Chary | *use_rle = true;
|
151 | 148954fa | Corentin Chary | *use_palette = true;
|
152 | 148954fa | Corentin Chary | estimated_bytes = palette_rle_bytes; |
153 | 148954fa | Corentin Chary | } |
154 | 148954fa | Corentin Chary | |
155 | 148954fa | Corentin Chary | if (palette_size(palette) < 17) { |
156 | 148954fa | Corentin Chary | int packed_bytes;
|
157 | 148954fa | Corentin Chary | |
158 | 148954fa | Corentin Chary | packed_bytes = (bpp_out / 8) * palette_size(palette);
|
159 | 148954fa | Corentin Chary | packed_bytes += w * h * |
160 | 148954fa | Corentin Chary | bits_per_packed_pixel[palette_size(palette)-1] / 8; |
161 | 148954fa | Corentin Chary | |
162 | 148954fa | Corentin Chary | if (packed_bytes < estimated_bytes) {
|
163 | 148954fa | Corentin Chary | *use_rle = false;
|
164 | 148954fa | Corentin Chary | *use_palette = true;
|
165 | 148954fa | Corentin Chary | estimated_bytes = packed_bytes; |
166 | 148954fa | Corentin Chary | } |
167 | 148954fa | Corentin Chary | } |
168 | 148954fa | Corentin Chary | } |
169 | 148954fa | Corentin Chary | } |
170 | 148954fa | Corentin Chary | |
171 | 148954fa | Corentin Chary | static void zrle_write_u32(VncState *vs, uint32_t value) |
172 | 148954fa | Corentin Chary | { |
173 | 148954fa | Corentin Chary | vnc_write(vs, (uint8_t *)&value, 4);
|
174 | 148954fa | Corentin Chary | } |
175 | 148954fa | Corentin Chary | |
176 | 148954fa | Corentin Chary | static void zrle_write_u24a(VncState *vs, uint32_t value) |
177 | 148954fa | Corentin Chary | { |
178 | 148954fa | Corentin Chary | vnc_write(vs, (uint8_t *)&value, 3);
|
179 | 148954fa | Corentin Chary | } |
180 | 148954fa | Corentin Chary | |
181 | 148954fa | Corentin Chary | static void zrle_write_u24b(VncState *vs, uint32_t value) |
182 | 148954fa | Corentin Chary | { |
183 | 148954fa | Corentin Chary | vnc_write(vs, ((uint8_t *)&value) + 1, 3); |
184 | 148954fa | Corentin Chary | } |
185 | 148954fa | Corentin Chary | |
186 | 148954fa | Corentin Chary | static void zrle_write_u16(VncState *vs, uint16_t value) |
187 | 148954fa | Corentin Chary | { |
188 | 148954fa | Corentin Chary | vnc_write(vs, (uint8_t *)&value, 2);
|
189 | 148954fa | Corentin Chary | } |
190 | 148954fa | Corentin Chary | |
191 | 148954fa | Corentin Chary | static void zrle_write_u8(VncState *vs, uint8_t value) |
192 | 148954fa | Corentin Chary | { |
193 | 148954fa | Corentin Chary | vnc_write_u8(vs, value); |
194 | 148954fa | Corentin Chary | } |
195 | 148954fa | Corentin Chary | |
196 | 148954fa | Corentin Chary | #define ENDIAN_LITTLE 0 |
197 | 148954fa | Corentin Chary | #define ENDIAN_BIG 1 |
198 | 148954fa | Corentin Chary | #define ENDIAN_NO 2 |
199 | 148954fa | Corentin Chary | |
200 | 148954fa | Corentin Chary | #define ZRLE_BPP 8 |
201 | 148954fa | Corentin Chary | #define ZYWRLE_ENDIAN ENDIAN_NO
|
202 | 148954fa | Corentin Chary | #include "vnc-enc-zrle-template.c" |
203 | 148954fa | Corentin Chary | #undef ZRLE_BPP
|
204 | 148954fa | Corentin Chary | |
205 | 148954fa | Corentin Chary | #define ZRLE_BPP 15 |
206 | 148954fa | Corentin Chary | #undef ZYWRLE_ENDIAN
|
207 | 148954fa | Corentin Chary | #define ZYWRLE_ENDIAN ENDIAN_LITTLE
|
208 | 148954fa | Corentin Chary | #include "vnc-enc-zrle-template.c" |
209 | 148954fa | Corentin Chary | |
210 | 148954fa | Corentin Chary | #undef ZYWRLE_ENDIAN
|
211 | 148954fa | Corentin Chary | #define ZYWRLE_ENDIAN ENDIAN_BIG
|
212 | 148954fa | Corentin Chary | #include "vnc-enc-zrle-template.c" |
213 | 148954fa | Corentin Chary | |
214 | 148954fa | Corentin Chary | #undef ZRLE_BPP
|
215 | 148954fa | Corentin Chary | #define ZRLE_BPP 16 |
216 | 148954fa | Corentin Chary | #undef ZYWRLE_ENDIAN
|
217 | 148954fa | Corentin Chary | #define ZYWRLE_ENDIAN ENDIAN_LITTLE
|
218 | 148954fa | Corentin Chary | #include "vnc-enc-zrle-template.c" |
219 | 148954fa | Corentin Chary | |
220 | 148954fa | Corentin Chary | #undef ZYWRLE_ENDIAN
|
221 | 148954fa | Corentin Chary | #define ZYWRLE_ENDIAN ENDIAN_BIG
|
222 | 148954fa | Corentin Chary | #include "vnc-enc-zrle-template.c" |
223 | 148954fa | Corentin Chary | |
224 | 148954fa | Corentin Chary | #undef ZRLE_BPP
|
225 | 148954fa | Corentin Chary | #define ZRLE_BPP 32 |
226 | 148954fa | Corentin Chary | #undef ZYWRLE_ENDIAN
|
227 | 148954fa | Corentin Chary | #define ZYWRLE_ENDIAN ENDIAN_LITTLE
|
228 | 148954fa | Corentin Chary | #include "vnc-enc-zrle-template.c" |
229 | 148954fa | Corentin Chary | |
230 | 148954fa | Corentin Chary | #undef ZYWRLE_ENDIAN
|
231 | 148954fa | Corentin Chary | #define ZYWRLE_ENDIAN ENDIAN_BIG
|
232 | 148954fa | Corentin Chary | #include "vnc-enc-zrle-template.c" |
233 | 148954fa | Corentin Chary | |
234 | 148954fa | Corentin Chary | #define ZRLE_COMPACT_PIXEL 24a |
235 | 148954fa | Corentin Chary | #undef ZYWRLE_ENDIAN
|
236 | 148954fa | Corentin Chary | #define ZYWRLE_ENDIAN ENDIAN_LITTLE
|
237 | 148954fa | Corentin Chary | #include "vnc-enc-zrle-template.c" |
238 | 148954fa | Corentin Chary | |
239 | 148954fa | Corentin Chary | #undef ZYWRLE_ENDIAN
|
240 | 148954fa | Corentin Chary | #define ZYWRLE_ENDIAN ENDIAN_BIG
|
241 | 148954fa | Corentin Chary | #include "vnc-enc-zrle-template.c" |
242 | 148954fa | Corentin Chary | |
243 | 148954fa | Corentin Chary | #undef ZRLE_COMPACT_PIXEL
|
244 | 148954fa | Corentin Chary | #define ZRLE_COMPACT_PIXEL 24b |
245 | 148954fa | Corentin Chary | #undef ZYWRLE_ENDIAN
|
246 | 148954fa | Corentin Chary | #define ZYWRLE_ENDIAN ENDIAN_LITTLE
|
247 | 148954fa | Corentin Chary | #include "vnc-enc-zrle-template.c" |
248 | 148954fa | Corentin Chary | |
249 | 148954fa | Corentin Chary | #undef ZYWRLE_ENDIAN
|
250 | 148954fa | Corentin Chary | #define ZYWRLE_ENDIAN ENDIAN_BIG
|
251 | 148954fa | Corentin Chary | #include "vnc-enc-zrle-template.c" |
252 | 148954fa | Corentin Chary | #undef ZRLE_COMPACT_PIXEL
|
253 | 148954fa | Corentin Chary | #undef ZRLE_BPP
|
254 | 148954fa | Corentin Chary | |
255 | 148954fa | Corentin Chary | static int zrle_send_framebuffer_update(VncState *vs, int x, int y, |
256 | 148954fa | Corentin Chary | int w, int h) |
257 | 148954fa | Corentin Chary | { |
258 | 148954fa | Corentin Chary | bool be = !!(vs->clientds.flags & QEMU_BIG_ENDIAN_FLAG);
|
259 | 148954fa | Corentin Chary | size_t bytes; |
260 | 148954fa | Corentin Chary | int zywrle_level;
|
261 | 148954fa | Corentin Chary | |
262 | 148954fa | Corentin Chary | if (vs->zrle.type == VNC_ENCODING_ZYWRLE) {
|
263 | 368d2588 | Corentin Chary | if (!vs->vd->lossy || vs->tight.quality == (uint8_t)-1 |
264 | 368d2588 | Corentin Chary | || vs->tight.quality == 9) {
|
265 | 148954fa | Corentin Chary | zywrle_level = 0;
|
266 | 148954fa | Corentin Chary | vs->zrle.type = VNC_ENCODING_ZRLE; |
267 | 148954fa | Corentin Chary | } else if (vs->tight.quality < 3) { |
268 | 148954fa | Corentin Chary | zywrle_level = 3;
|
269 | 148954fa | Corentin Chary | } else if (vs->tight.quality < 6) { |
270 | 148954fa | Corentin Chary | zywrle_level = 2;
|
271 | 148954fa | Corentin Chary | } else {
|
272 | 148954fa | Corentin Chary | zywrle_level = 1;
|
273 | 148954fa | Corentin Chary | } |
274 | 148954fa | Corentin Chary | } else {
|
275 | 148954fa | Corentin Chary | zywrle_level = 0;
|
276 | 148954fa | Corentin Chary | } |
277 | 148954fa | Corentin Chary | |
278 | 148954fa | Corentin Chary | vnc_zrle_start(vs); |
279 | 148954fa | Corentin Chary | |
280 | 148954fa | Corentin Chary | switch(vs->clientds.pf.bytes_per_pixel) {
|
281 | 148954fa | Corentin Chary | case 1: |
282 | 148954fa | Corentin Chary | zrle_encode_8ne(vs, x, y, w, h, zywrle_level); |
283 | 148954fa | Corentin Chary | break;
|
284 | 148954fa | Corentin Chary | |
285 | 148954fa | Corentin Chary | case 2: |
286 | 148954fa | Corentin Chary | if (vs->clientds.pf.gmax > 0x1F) { |
287 | 148954fa | Corentin Chary | if (be) {
|
288 | 148954fa | Corentin Chary | zrle_encode_16be(vs, x, y, w, h, zywrle_level); |
289 | 148954fa | Corentin Chary | } else {
|
290 | 148954fa | Corentin Chary | zrle_encode_16le(vs, x, y, w, h, zywrle_level); |
291 | 148954fa | Corentin Chary | } |
292 | 148954fa | Corentin Chary | } else {
|
293 | 148954fa | Corentin Chary | if (be) {
|
294 | 148954fa | Corentin Chary | zrle_encode_15be(vs, x, y, w, h, zywrle_level); |
295 | 148954fa | Corentin Chary | } else {
|
296 | 148954fa | Corentin Chary | zrle_encode_15le(vs, x, y, w, h, zywrle_level); |
297 | 148954fa | Corentin Chary | } |
298 | 148954fa | Corentin Chary | } |
299 | 148954fa | Corentin Chary | break;
|
300 | 148954fa | Corentin Chary | |
301 | 148954fa | Corentin Chary | case 4: |
302 | 148954fa | Corentin Chary | { |
303 | 148954fa | Corentin Chary | bool fits_in_ls3bytes;
|
304 | 148954fa | Corentin Chary | bool fits_in_ms3bytes;
|
305 | 148954fa | Corentin Chary | |
306 | 148954fa | Corentin Chary | fits_in_ls3bytes = |
307 | 148954fa | Corentin Chary | ((vs->clientds.pf.rmax << vs->clientds.pf.rshift) < (1 << 24) && |
308 | 148954fa | Corentin Chary | (vs->clientds.pf.gmax << vs->clientds.pf.gshift) < (1 << 24) && |
309 | 148954fa | Corentin Chary | (vs->clientds.pf.bmax << vs->clientds.pf.bshift) < (1 << 24)); |
310 | 148954fa | Corentin Chary | |
311 | 148954fa | Corentin Chary | fits_in_ms3bytes = (vs->clientds.pf.rshift > 7 &&
|
312 | 148954fa | Corentin Chary | vs->clientds.pf.gshift > 7 &&
|
313 | 148954fa | Corentin Chary | vs->clientds.pf.bshift > 7);
|
314 | 148954fa | Corentin Chary | |
315 | 148954fa | Corentin Chary | if ((fits_in_ls3bytes && !be) || (fits_in_ms3bytes && be)) {
|
316 | 148954fa | Corentin Chary | if (be) {
|
317 | 148954fa | Corentin Chary | zrle_encode_24abe(vs, x, y, w, h, zywrle_level); |
318 | 148954fa | Corentin Chary | } else {
|
319 | 148954fa | Corentin Chary | zrle_encode_24ale(vs, x, y, w, h, zywrle_level); |
320 | 148954fa | Corentin Chary | } |
321 | 148954fa | Corentin Chary | } else if ((fits_in_ls3bytes && be) || (fits_in_ms3bytes && !be)) { |
322 | 148954fa | Corentin Chary | if (be) {
|
323 | 148954fa | Corentin Chary | zrle_encode_24bbe(vs, x, y, w, h, zywrle_level); |
324 | 148954fa | Corentin Chary | } else {
|
325 | 148954fa | Corentin Chary | zrle_encode_24ble(vs, x, y, w, h, zywrle_level); |
326 | 148954fa | Corentin Chary | } |
327 | 148954fa | Corentin Chary | } else {
|
328 | 148954fa | Corentin Chary | if (be) {
|
329 | 148954fa | Corentin Chary | zrle_encode_32be(vs, x, y, w, h, zywrle_level); |
330 | 148954fa | Corentin Chary | } else {
|
331 | 148954fa | Corentin Chary | zrle_encode_32le(vs, x, y, w, h, zywrle_level); |
332 | 148954fa | Corentin Chary | } |
333 | 148954fa | Corentin Chary | } |
334 | 148954fa | Corentin Chary | } |
335 | 148954fa | Corentin Chary | break;
|
336 | 148954fa | Corentin Chary | } |
337 | 148954fa | Corentin Chary | |
338 | 148954fa | Corentin Chary | vnc_zrle_stop(vs); |
339 | 148954fa | Corentin Chary | bytes = zrle_compress_data(vs, Z_DEFAULT_COMPRESSION); |
340 | 148954fa | Corentin Chary | vnc_framebuffer_update(vs, x, y, w, h, vs->zrle.type); |
341 | 148954fa | Corentin Chary | vnc_write_u32(vs, bytes); |
342 | 148954fa | Corentin Chary | vnc_write(vs, vs->zrle.zlib.buffer, vs->zrle.zlib.offset); |
343 | 148954fa | Corentin Chary | return 1; |
344 | 148954fa | Corentin Chary | } |
345 | 148954fa | Corentin Chary | |
346 | 148954fa | Corentin Chary | int vnc_zrle_send_framebuffer_update(VncState *vs, int x, int y, int w, int h) |
347 | 148954fa | Corentin Chary | { |
348 | 148954fa | Corentin Chary | vs->zrle.type = VNC_ENCODING_ZRLE; |
349 | 148954fa | Corentin Chary | return zrle_send_framebuffer_update(vs, x, y, w, h);
|
350 | 148954fa | Corentin Chary | } |
351 | 148954fa | Corentin Chary | |
352 | 148954fa | Corentin Chary | int vnc_zywrle_send_framebuffer_update(VncState *vs, int x, int y, int w, int h) |
353 | 148954fa | Corentin Chary | { |
354 | 148954fa | Corentin Chary | vs->zrle.type = VNC_ENCODING_ZYWRLE; |
355 | 148954fa | Corentin Chary | return zrle_send_framebuffer_update(vs, x, y, w, h);
|
356 | 148954fa | Corentin Chary | } |
357 | 148954fa | Corentin Chary | |
358 | 148954fa | Corentin Chary | void vnc_zrle_clear(VncState *vs)
|
359 | 148954fa | Corentin Chary | { |
360 | 148954fa | Corentin Chary | if (vs->zrle.stream.opaque) {
|
361 | 148954fa | Corentin Chary | deflateEnd(&vs->zrle.stream); |
362 | 148954fa | Corentin Chary | } |
363 | 148954fa | Corentin Chary | buffer_free(&vs->zrle.zrle); |
364 | 148954fa | Corentin Chary | buffer_free(&vs->zrle.fb); |
365 | 148954fa | Corentin Chary | buffer_free(&vs->zrle.zlib); |
366 | 148954fa | Corentin Chary | } |