From 84b3a4a7544017fd8cd9d91798b9ff1ac08d5a37 Mon Sep 17 00:00:00 2001 From: dscho Date: Tue, 12 Sep 2006 17:30:37 +0000 Subject: [PATCH] VisualNaCro: add magic key 'd' to display the current reference image --- VisualNaCro/NEWS | 2 + VisualNaCro/nacro.c | 100 +++++++++++++++++++++++++++++++--------- VisualNaCro/nacro.h | 2 + VisualNaCro/recorder.pl | 26 ++++++++--- 4 files changed, 100 insertions(+), 30 deletions(-) diff --git a/VisualNaCro/NEWS b/VisualNaCro/NEWS index 5b5fd29..6707d33 100644 --- a/VisualNaCro/NEWS +++ b/VisualNaCro/NEWS @@ -6,3 +6,5 @@ Clipboard is supported (thanks to Uwe). Keys are recorded by their symbols with the --symbolic switch, provided you have the X11::Keysyms module. + +After pressing Control twice, you can show the last reference image with 'd'. diff --git a/VisualNaCro/nacro.c b/VisualNaCro/nacro.c index f0f2149..7cdc5b4 100644 --- a/VisualNaCro/nacro.c +++ b/VisualNaCro/nacro.c @@ -330,6 +330,83 @@ static void free_image(image_t* image) free(image); } +static void copy_line(rfbScreenInfo *dest, char *backup, + int x0, int y0, int x1, int y1, int color_offset) +{ + uint8_t *d = (uint8_t *)dest->frameBuffer, *s = (uint8_t *)backup; + int i; + int steps0 = x1 > x0 ? x1 - x0 : x0 - x1; + int steps1 = y1 > y0 ? y1 - y0 : y0 - y1; + + if (steps1 > steps0) + steps0 = steps1; + else if (steps0 == 0) + steps0 = 1; + + for (i = 0; i <= steps0; i++) { + int j, index = 4 * (x0 + i * (x1 - x0) / steps0 + + dest->width * (y0 + i * (y1 - y0) / steps0)); + for (j = 0; j < 4; j++) + d[index + j] = s[index + j] + color_offset; + } + + rfbMarkRectAsModified(dest, x0 - 5, y0 - 5, x1 + 1, y1 + 2); +} + +result_t displaypnm(resource_t resource, const char *filename, + coordinate_t x, coordinate_t y, bool_t border, + timeout_t timeout_in_seconds) +{ + private_resource_t* res = get_resource(resource); + image_t *image; + char* fake_frame_buffer; + char* backup; + int w, h, i, j, w2, h2; + result_t result; + + if (res == NULL || res->server == NULL || + (image = loadpnm(filename)) == NULL) + return 0; + + w = res->server->width; + h = res->server->height; + fake_frame_buffer = malloc(w * 4 * h); + if(!fake_frame_buffer) + return 0; + memcpy(fake_frame_buffer, res->server->frameBuffer, w * 4 * h); + + backup = res->server->frameBuffer; + res->server->frameBuffer = fake_frame_buffer; + + w2 = image->width; + if (x + w2 > w) + w2 = w - x; + h2 = image->height; + if (y + h2 > h) + h2 = h - y; + for (j = 0; j < h2; j++) + memcpy(fake_frame_buffer + 4 * (x + (y + j) * w), + image->buffer + j * 4 * image->width, 4 * w2); + free(image); + if (border) { + copy_line(res->server, backup, x, y, x + w2, y, 0x80); + copy_line(res->server, backup, x, y, x, y + h2, 0x80); + copy_line(res->server, backup, x + w2, y, x + w2, y + h2, 0x80); + copy_line(res->server, backup, x, y + h2, x + w2, y + h2, 0x80); + } + rfbMarkRectAsModified(res->server, + x - 1, y - 1, x + w2 + 1, y + h2 + 1); + + result = waitforinput(resource, timeout_in_seconds); + + res->server->frameBuffer=backup; + free(fake_frame_buffer); + rfbMarkRectAsModified(res->server, + x - 1, y - 1, x + w2 + 1, y + h2 + 1); + + return result; +} + /* process() and friends */ /* this function returns only if res->result in return_mask */ @@ -575,29 +652,6 @@ const char *gettext_client(resource_t res) return r->text_client; } -static void copy_line(rfbScreenInfo *dest, char *backup, - int x0, int y0, int x1, int y1, int color_offset) -{ - uint8_t *d = (uint8_t *)dest->frameBuffer, *s = (uint8_t *)backup; - int i; - int steps0 = x1 > x0 ? x1 - x0 : x0 - x1; - int steps1 = y1 > y0 ? y1 - y0 : y0 - y1; - - if (steps1 > steps0) - steps0 = steps1; - else if (steps0 == 0) - steps0 = 1; - - for (i = 0; i <= steps0; i++) { - int j, index = 4 * (x0 + i * (x1 - x0) / steps0 - + dest->width * (y0 + i * (y1 - y0) / steps0)); - for (j = 0; j < 4; j++) - d[index + j] = s[index + j] + color_offset; - } - - rfbMarkRectAsModified(dest, x0 - 5, y0 - 5, x1 + 1, y1 + 2); -} - result_t rubberband(resource_t resource, coordinate_t x0, coordinate_t y0) { private_resource_t* res=get_resource(resource); diff --git a/VisualNaCro/nacro.h b/VisualNaCro/nacro.h index 2d33104..8bb2f60 100644 --- a/VisualNaCro/nacro.h +++ b/VisualNaCro/nacro.h @@ -105,6 +105,8 @@ coordinate_t getyorigin(resource_t res); bool_t savepnm(resource_t res,const char* filename,coordinate_t x1, coordinate_t y1, coordinate_t x2, coordinate_t y2); +result_t displaypnm(resource_t res, const char *filename, coordinate_t x, coordinate_t y, bool_t border, timeout_t timeout); + /* this displays an overlay which is shown for a certain time */ result_t alert(resource_t res,const char* message,timeout_t timeout); diff --git a/VisualNaCro/recorder.pl b/VisualNaCro/recorder.pl index 53dfbc2..6573a9a 100644 --- a/VisualNaCro/recorder.pl +++ b/VisualNaCro/recorder.pl @@ -112,12 +112,14 @@ while(1) { } } if($keysym==0xffe3 || $keysym==0xffe4) { - # Control pressed - $magickey++; - if($magickey>3 && !$keydown) { - $magickey=0; - $mode="menu"; - nacro::alert($vnc,"VisualNaCro: press 'q' to quit\nor mark reference rectangle by dragging",10); + if (!$keydown) { + # Control pressed + $magickey++; + if ($magickey > 1) { + $magickey = 0; + $mode = "menu"; + nacro::alert($vnc,"VisualNaCro: press 'q' to quit,\n'd' to display current reference image,\nor mark reference rectangle by dragging",10); + } } } else { $magickey=0; @@ -160,8 +162,18 @@ while(1) { close OUT; nacro::closevnc($vnc); exit 0; + } elsif ($keysym == ord('d')) { + $pnm=$output.($image_counter - 1).".pnm"; + $res = nacro::displaypnm($vnc, $pnm, + $x_origin, $y_origin, 1, 10); + #0, 0, 1, 10); + if ($res == 0) { + nacro::alert($vnc, "Error displaying " + . $pnm); + } + } else { + nacro::alert($vnc,"Unknown key",10); } - nacro::alert($vnc,"Unknown key",10); $mode="passthru"; } if($result&$nacro::RESULT_MOUSE) {