X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?a=blobdiff_plain;ds=sidebyside;f=pctb%2Fpages.c;h=2e3edde72d4b3fb68ecd48f20e430cac1739252b;hb=b3a5bc5d04aa5c9d52f3987965fdb2a4cd4c8e14;hp=9e7a2b2058d7aa3d37d9e4143f2fa7f61bb1cab2;hpb=609d1bc79abd962d7722607d5dda7c202db9497d;p=ypp-sc-tools.web-live.git diff --git a/pctb/pages.c b/pctb/pages.c index 9e7a2b2..2e3edde 100644 --- a/pctb/pages.c +++ b/pctb/pages.c @@ -41,9 +41,6 @@ #include #include -CanonImage *page_images[MAX_PAGES]; -int npages; - const char *ocean, *pirate; static XWindowAttributes attr; @@ -267,9 +264,9 @@ static void snapshot(Snapshot **output) { #define COMPUTE_SHIFT_MASK(ix, rgb) \ compute_shift_mask(&shiftmasks[ix], im_use->rgb##_mask) - COMPUTE_SHIFT_MASK(0, red); + COMPUTE_SHIFT_MASK(0, blue); COMPUTE_SHIFT_MASK(1, green); - COMPUTE_SHIFT_MASK(2, blue); + COMPUTE_SHIFT_MASK(2, red); if (!*output) *output= alloc_rgb_image(wwidth, wheight); @@ -277,7 +274,7 @@ static void snapshot(Snapshot **output) { rtimestamp(&begin, "compute_shift_masks+alloc_rgb_image"); int x,y,i; - unsigned char *op= (*output)->data; + uint32_t *op32= (*output)->data; for (y=0; yxoffset == 0 && im_use->format == ZPixmap && @@ -289,21 +286,19 @@ static void snapshot(Snapshot **output) { 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> shiftmasks[i].rshift) & SAMPLEMASK; - *op++= sample; } + *op32++= sample; } } } @@ -355,7 +350,7 @@ static void wait_for_stability(Snapshot **output, " last_input=%f previously=%p `%s'\n", last_input, previously, doing); - double min_interval= 0.025; /*us*/ + double min_interval= 0.025; for (;;) { progress_spinner("%s",doing); @@ -520,21 +515,23 @@ static void set_focus_commodity(void) { debugf("PAGING raise_and_set_focus done.\n"); } -static CanonImage *convert_page(const Snapshot *sn) { +static CanonImage *convert_page(const Snapshot *sn, RgbImage **rgb_r) { CanonImage *im; + RgbImage *ri; fwrite_ppmraw(screenshot_file, sn); - const unsigned char *pixel= sn->data; - CANONICALISE_IMAGE(im, sn->w, sn->h, { - r= *pixel++; - g= *pixel++; - b= *pixel++; + const Rgb *pixel= sn->data; + CANONICALISE_IMAGE(im, sn->w, sn->h, ri, { + rgb= *pixel++; }); - + sysassert(!ferror(screenshot_file)); sysassert(!fflush(screenshot_file)); + if (rgb_r) *rgb_r= ri; + else free(ri); + return im; } @@ -546,8 +543,8 @@ static void prepare_ypp_client(void) { raise_and_get_details(); wait_for_stability(¤t,0,0, "checking current YPP client screen..."); - test= convert_page(current); - find_structure(test, &max_relevant_y, + test= convert_page(current,0); + find_structure(test,0, &max_relevant_y, &commod_focus_point, &commod_page_point, &commod_focuslast_point); @@ -577,6 +574,20 @@ static void prepare_ypp_client(void) { free_snapshot(&status); } +static void convert_store_page(Snapshot *current) { + RgbImage *rgb; + CanonImage *ci; + PageStruct *pstruct; + + progress("page %d prescanning ...",npages); + ci= convert_page(current,&rgb); + + progress("page %d overview ...",npages); + find_structure(ci,&pstruct, 0,0,0,0); + + store_current_page(ci,pstruct,rgb); +} + void take_screenshots(void) { Snapshot *current=0, *last=0; @@ -589,19 +600,19 @@ void take_screenshots(void) { /* now to actually page down */ for (;;) { - debugf("paging page %d\n",npages); + debugf("page %d paging\n",npages); if (!(npages < MAX_PAGES)) fatal("Paging down seems to generate too many pages - max is %d.", MAX_PAGES); - - page_images[npages]= convert_page(current); + + convert_store_page(current); free_snapshot(&last); last=current; current=0; debugf("PAGING page %d converted\n",npages); wait_for_stability(¤t,last, 0, - "collecting screenshot of page %d...", + "page %d collecting ...", npages+1); if (npages && /* first pagedown doesn't do much */ @@ -629,7 +640,7 @@ void take_one_screenshot(void) { prepare_ypp_client(); wait_for_stability(¤t,0,0, "taking screenshot..."); - page_images[0]= convert_page(current); + convert_store_page(current); npages= 1; progress_log("collected single screenshot."); }