chiark / gitweb /
Merge branch 'origin'
authorIan Jackson <ian@liberator.relativity.greenend.org.uk>
Sun, 19 Jul 2009 16:35:21 +0000 (17:35 +0100)
committerIan Jackson <ian@liberator.relativity.greenend.org.uk>
Sun, 19 Jul 2009 16:35:21 +0000 (17:35 +0100)
1  2 
pctb/pages.c

diff --combined pctb/pages.c
index e7d3ec909cb4663c74486fa8e94a25ec3d3288a8,9e7a2b2058d7aa3d37d9e4143f2fa7f61bb1cab2..2e3edde72d4b3fb68ecd48f20e430cac1739252b
@@@ -41,6 -41,9 +41,6 @@@
  #include <sys/ipc.h>
  #include <sys/shm.h>
  
 -CanonImage *page_images[MAX_PAGES];
 -int npages;
 -
  const char *ocean, *pirate;
  
  static XWindowAttributes attr;
@@@ -264,9 -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);
    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; y<wheight; y++) {
      if (im_use->xoffset == 0 &&
        im_use->format == ZPixmap &&
        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++;
 -      }
 +      memcpy(op32, p, wwidth*sizeof(*op32));
 +      op32 += wwidth;
      } else {
        for (x=0; x<wwidth; x++) {
        long xrgb= XGetPixel(im_use,x,y);
 +      Rgb sample= 0;
        for (i=0; i<3; i++) {
 -        unsigned long sample=
 +        sample <<= 8;
 +        sample |=
            ((xrgb << shiftmasks[i].lshift) >> shiftmasks[i].rshift)
            & SAMPLEMASK;
 -        *op++= sample;
        }
 +      *op32++= sample;
        }
      }
    }
@@@ -350,7 -355,7 +350,7 @@@ static void wait_for_stability(Snapsho
          "  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);
      
@@@ -515,23 -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;
  }
  
@@@ -543,8 -546,8 +543,8 @@@ static void prepare_ypp_client(void) 
    raise_and_get_details();
    wait_for_stability(&current,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);
    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;
  
  
    /* 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(&current,last, 0,
 -                     "collecting screenshot of page %d...",
 +                     "page %d collecting    ...",
                       npages+1);
  
      if (npages &&  /* first pagedown doesn't do much */
        identical(current,last)) {
+       npages++;
        free_snapshot(&current);
        break;
      }
@@@ -639,7 -629,7 +640,7 @@@ void take_one_screenshot(void) 
  
    prepare_ypp_client();
    wait_for_stability(&current,0,0, "taking screenshot...");
 -  page_images[0]= convert_page(current);
 +  convert_store_page(current);
    npages= 1;
    progress_log("collected single screenshot.");
  }