CanonImage *page_images[MAX_PAGES];
int npages;
-RgbImage *page0_rgbimage;
const char *ocean, *pirate;
static struct timeval tv_startup;
static unsigned wwidth, wheight;
static int max_relevant_y= -1;
+static Point commod_focus_point, commod_page_point, commod_focuslast_point;
static XImage *shmim;
static XShmSegmentInfo shminfo;
Window dummy;
xassert( XTranslateCoordinates(disp, id,attr.root, wx,wy, rx,ry, &dummy) );
}
+static void translate_coords_toroot_p(Point w, int *rx, int *ry) {
+ translate_coords_toroot(w.x, w.y, rx, ry);
+}
static void check_client_window_all_on_screen(void) {
Rect onroot;
}
static void mouse_1_updown_here(void) {
check_not_disturbed();
- XTestFakeButtonEvent(disp,1,1, 50);
- XTestFakeButtonEvent(disp,1,0, 50);
+ XTestFakeButtonEvent(disp,1,1, 10);
+ XTestFakeButtonEvent(disp,1,0, 10);
}
static void mouse_1_updown(int x, int y) {
check_not_disturbed();
XTestFakeMotionEvent(disp, screen, xpos,ypos, 0);
mouse_1_updown_here();
}
+static void pgdown_by_mouse(void) {
+ check_not_disturbed();
+ debugf("PAGING Mouse\n");
+ mouse_1_updown_here();
+ sync_after_input();
+}
static int pgupdown;
debugf("PAGING PageUp x %d\n",i);
sync_after_input();
}
-static void send_pgdown(void) {
- send_key(XK_Next);
- pgupdown++;
- debugf("PAGING PageDown\n");
- sync_after_input();
-}
static void send_pgdown_torestore(void) {
debugf("PAGING PageDown x %d\n", -pgupdown);
while (pgupdown < 0) {
}
assert(sm->lshift < LONG_BIT);
assert(sm->rshift < LONG_BIT);
+ debugf("SHIFTMASK %p={.lshift=%d, .rshift=%d} image_mask=%lx\n",
+ sm, sm->lshift, sm->rshift, ximage_mask);
}
static void rtimestamp(double *t, const char *wh) {
int x,y,i;
unsigned char *op= (*output)->data;
for (y=0; y<wheight; y++) {
- for (x=0; x<wwidth; x++) {
- long xrgb= XGetPixel(im_use,x,y);
- for (i=0; i<3; i++) {
- unsigned long sample=
- ((xrgb << shiftmasks[i].lshift) >> shiftmasks[i].rshift)
- & SAMPLEMASK;
- *op++= sample;
+ if (im_use->xoffset == 0 &&
+ im_use->format == ZPixmap &&
+ im_use->byte_order == LSBFirst &&
+ im_use->depth == 24 &&
+ im_use->bits_per_pixel == 32 &&
+ im_use->red_mask == 0x0000ffU &&
+ im_use->green_mask == 0x00ff00U &&
+ im_use->blue_mask == 0xff0000U) {
+ const char *p= im_use->data + y * im_use->bytes_per_line;
+// debugf("optimised copy y=%d",y);
+ for (x=0; x<wwidth; x++) {
+ *op++ = *p++;
+ *op++ = *p++;
+ *op++ = *p++;
+ p++;
+ }
+ } else {
+ for (x=0; x<wwidth; x++) {
+ long xrgb= XGetPixel(im_use,x,y);
+ for (i=0; i<3; i++) {
+ unsigned long sample=
+ ((xrgb << shiftmasks[i].lshift) >> shiftmasks[i].rshift)
+ & SAMPLEMASK;
+ *op++= sample;
+ }
}
}
}
last=*output; *output=0;
} else if (!identical(*output,last)) {
debugf("PAGING wait_for_stability changed...\n");
- free(last); last=*output; *output=0;
+ free_snapshot(&last); last=*output; *output=0;
nidentical=0;
if (!with_keypress) {
min_interval *= 3.0;
if (!(wwidth >= 320 && wheight >= 320))
fatal("YPP client window is implausibly small?");
+ if (attr.depth < 24)
+ fatal("Display is not 24bpp.");
+
check_client_window_all_on_screen();
Bool shmpixmaps=0;
debugf("PAGING set_focus\n");
- mouse_1_updown(160,160);
+ mouse_1_updown(commod_focus_point.x, commod_focus_point.y);
sync_after_input();
delay(0.5);
) );
int xpos,ypos;
- translate_coords_toroot(10,10, &xpos,&ypos);
- XTestFakeMotionEvent(disp,screen, xpos,ypos, 0);
+ translate_coords_toroot_p(commod_page_point, &xpos,&ypos);
+ XTestFakeMotionEvent(disp, screen, xpos,ypos, 0);
sync_after_input();
debugf("PAGING raise_and_set_focus done.\n");
}
-static CanonImage *convert_page(Snapshot *sn, RgbImage *ri) {
+static CanonImage *convert_page(const Snapshot *sn) {
CanonImage *im;
fwrite_ppmraw(screenshot_file, sn);
- if (ri) memcpy(ri->data, sn->data, ri->h * ri->w * 3);
- unsigned char *pixel= sn->data;
+ const unsigned char *pixel= sn->data;
CANONICALISE_IMAGE(im, sn->w, sn->h, {
- rgb=
- (pixel[0] << 16) |
- (pixel[1] << 8) |
- (pixel[2] );
- pixel += 3;
+ r= *pixel++;
+ g= *pixel++;
+ b= *pixel++;
});
sysassert(!ferror(screenshot_file));
raise_and_get_details();
wait_for_stability(¤t,0,0, "checking current YPP client screen...");
- test= convert_page(current, 0);
- find_structure(test, &max_relevant_y);
+ test= convert_page(current);
+ find_structure(test, &max_relevant_y,
+ &commod_focus_point,
+ &commod_page_point,
+ &commod_focuslast_point);
check_correct_commodities();
Rect sunshine= find_sunshine_widget();
void take_screenshots(void) {
Snapshot *current=0, *last=0;
- RgbImage *page0_store;
prepare_ypp_client();
wait_for_stability(¤t,0, send_pgup_many,
"paging up to top of commodity list...");
- page0_rgbimage= page0_store= alloc_rgb_image(current->w, current->h);
-
/* now to actually page down */
for (;;) {
debugf("paging page %d\n",npages);
fatal("Paging down seems to generate too many pages - max is %d.",
MAX_PAGES);
- page_images[npages]= convert_page(current, page0_store);
- free_snapshot(&last); last=current; current=0; page0_store=0;
+ page_images[npages]= convert_page(current);
+ free_snapshot(&last); last=current; current=0;
debugf("PAGING page %d converted\n",npages);
break;
}
- send_pgdown();
+ pgdown_by_mouse();
npages++;
}
progress("finishing with the YPP client...");
+ mouse_1_updown(commod_focuslast_point.x, commod_focuslast_point.y);
+ sync_after_input();
send_pgdown_torestore();
+ sync_after_input();
debugf("PAGING all done.\n");
progress_log("collected %d screenshots.",npages);
- assert(!page0_store);
}
void take_one_screenshot(void) {
prepare_ypp_client();
wait_for_stability(¤t,0,0, "taking screenshot...");
- page0_rgbimage= alloc_rgb_image(current->w, current->h);
- page_images[0]= convert_page(current, page0_rgbimage);
+ page_images[0]= convert_page(current);
npages= 1;
progress_log("collected single screenshot.");
}