From: Steinar H. Gunderson Date: Fri, 4 Feb 2005 16:44:22 +0000 (+0000) Subject: We have picture! X-Git-Url: https://git.sesse.net/?p=rdpsrv;a=commitdiff_plain;h=98742a5ac6a2170d0d5b219a69a9cc6d57915547;hp=25e1484eafa79fa2b644af1d923513b549c6bfd9 We have picture! --- diff --git a/rdpsrv.c b/rdpsrv.c index 432147b..1bf41d7 100644 --- a/rdpsrv.c +++ b/rdpsrv.c @@ -159,10 +159,10 @@ int vnc_init() buf[3] = 0; buf[4] = 0; // ypos buf[5] = 0; - buf[6] = 0; // width - buf[7] = 640 % 0xff; - buf[8] = 0; // height - buf[9] = 480 % 0xff; + buf[6] = 640 >> 8; // width + buf[7] = 640 & 0xff; + buf[8] = 480 >> 8; // height + buf[9] = 480 & 0xff; write(vnc_sock, buf, 10); @@ -179,25 +179,31 @@ struct vnc_rectangle { void handle_vnc_fbupdate(int vnc_sock) { struct vnc_rectangle rect; - unsigned char *data, *ptr; + unsigned char *data, *ptr, *src, *dst; unsigned short num_rect; - int ret, data_left, i; + int ret, data_left, i, xt, yt; + unsigned char smallblock[64 * 64 * 3]; if (read(vnc_sock, &num_rect, 2) != 2) error("short read on num_rect\n"); - for (i = 0; i < ntohs(num_rect); ++i) { + for (i = 0; i < ntohs(num_rect); ++i) { + int width, height; + if (read(vnc_sock, &rect, sizeof(struct vnc_rectangle)) != sizeof(struct vnc_rectangle)) error("short read on vnc_rectangle\n"); - printf("UPDATE: %ux%u at (%u,%u)\n", ntohs(rect.width), ntohs(rect.height), - ntohs(rect.x), ntohs(rect.y)); - if (ntohl(rect.encoding) != 0) error("unsupported encoding\n"); - ptr = data = xmalloc(ntohs(rect.width) * ntohs(rect.height) * 3); - data_left = ntohs(rect.width) * ntohs(rect.height) * 3; + width = ntohs(rect.width); + height = ntohs(rect.height); + + printf("UPDATE: %ux%u at (%u,%u)\n", width, height, + ntohs(rect.x), ntohs(rect.y)); + + ptr = data = xmalloc(width * height * 4); + data_left = width * height * 4; while (data_left > 0) { ret = read(vnc_sock, ptr, data_left); @@ -208,7 +214,34 @@ void handle_vnc_fbupdate(int vnc_sock) data_left -= ret; } -// rdp_send_bitmap_update(ntohs(rect.x), ntohs(rect.y), ntohs(rect.width), ntohs(rect.height), data); + // push our 32-bit RGB data into small enough chunks + // (64x64) so we are sure we can send them without + // everything crashing and stuff :-) + for (yt = 0; yt < (height + 63) / 64; ++yt) { + for (xt = 0; xt < (width + 63) / 64; ++xt) { + int x, y; + int bw = width - xt * 64; + int bh = height - yt * 64; + if (bw > 64) + bw = 64; + if (bh > 64) + bh = 64; + + dst = smallblock; + for (y = 0; y < bh; ++y) { + src = data + ((yt * 64 + (bh + 1 - y)) * width + (xt * 64)) * 4; + for (x = 0; x < bw; ++x) { + *dst++ = *src++; + *dst++ = *src++; + *dst++ = *src++; + ++src; + } + } + + rdp_send_bitmap_update(ntohs(rect.x) + xt * 64, ntohs(rect.y) + yt * 64, bw, bh, smallblock); + } + } + xfree(data); } } @@ -273,7 +306,7 @@ int serve_client() break; default: printf("Unknown VNC server message %x\n", buf[0]); -// exit(1); + exit(1); } } }