chiark / gitweb /
Reverse order of samples in Rgb and other optimisations
[ypp-sc-tools.main.git] / pctb / pages.c
index 95a1c460688716a710f216fd8d92a5d8c69f409f..e7d3ec909cb4663c74486fa8e94a25ec3d3288a8 100644 (file)
@@ -264,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);
@@ -274,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; y<wheight; y++) {
     if (im_use->xoffset == 0 &&
        im_use->format == ZPixmap &&
@@ -286,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<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;
       }
     }
   }
@@ -519,22 +517,20 @@ static void set_focus_commodity(void) {
 
 static CanonImage *convert_page(const Snapshot *sn, RgbImage **rgb_r) {
   CanonImage *im;
-  RgbImage *rgb;
+  RgbImage *ri;
 
   fwrite_ppmraw(screenshot_file, sn);
 
-  const unsigned char *pixel= sn->data;
-  CANONICALISE_IMAGE(im, sn->w, sn->h, rgb, {
-    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= rgb;
-  else free(rgb);
+  if (rgb_r) *rgb_r= ri;
+  else free(ri);
 
   return im;
 }
@@ -583,8 +579,12 @@ static void convert_store_page(Snapshot *current) {
   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);
 }
 
@@ -612,7 +612,7 @@ void take_screenshots(void) {
     debugf("PAGING page %d converted\n",npages);
 
     wait_for_stability(&current,last, 0,
-                      "page %d collecting...",
+                      "page %d collecting    ...",
                       npages+1);
 
     if (npages &&  /* first pagedown doesn't do much */