chiark / gitweb /
Faster, by more in-bulk processing of incoming pixels
[ypp-sc-tools.db-test.git] / pctb / pages.c
index 1a9970162ce10c8fd667208b5476f1ca9cde44f8..d298ac4597cd7096e7f733b65d97228fdc25a52a 100644 (file)
@@ -301,7 +301,7 @@ static int identical(const Snapshot *a, const Snapshot *b) {
     return 0;
 
   int compare_to= a->h;
-  if (max_relevant_y && compare_to > max_relevant_y)
+  if (max_relevant_y>=0 && compare_to > max_relevant_y)
     compare_to= max_relevant_y;
   
   return !memcmp(a->data, b->data, a->w * 3 * compare_to);
@@ -327,14 +327,21 @@ static void wait_for_stability(Snapshot **output,
 
   char *doing;
   sysassert( vasprintf(&doing,fmt,al) >=0 );
-  progress("%s",doing);
 
   debugf("PAGING  wait_for_stability"
          "  last_input=%f previously=%p `%s'\n",
          last_input, previously, doing);
 
+  double min_interval= 25000; /*us*/
   for (;;) {
-    usleep(250000);
+    progress_spinner("%s",doing);
+    
+    double since_last_input= timestamp() - last_input;
+    double this_interval= min_interval - since_last_input;
+
+    if (this_interval >= 0)
+      usleep(this_interval);
+
     snapshot(output);
 
     if (!last) {
@@ -344,23 +351,27 @@ static void wait_for_stability(Snapshot **output,
       debugf("PAGING  wait_for_stability changed...\n");
       free(last); last=*output; *output=0;
       nidentical=0;
+      if (!with_keypress) {
+       min_interval *= 3.0;
+       min_interval += 0.5;
+      }
     } else {
       nidentical++;
       int threshold=
        !previously ? 3 :
-       identical(*output,previously) ? 3
+       identical(*output,previously) ? 5
        : 1;
       debugf("PAGING  wait_for_stability nidentical=%d threshold=%d\n",
              nidentical, threshold);
       if (nidentical >= threshold)
        break;
+
+      min_interval += 0.5;
+      min_interval *= 2.0;
     }
-    progress_spinner("%s",doing);
 
     if (with_keypress)
       with_keypress();
-
-    usleep(250000);
   }
 
   free_snapshot(&last);
@@ -486,24 +497,18 @@ static void set_focus_commodity(void) {
 static CanonImage *convert_page(Snapshot *sn, RgbImage *ri) {
   CanonImage *im;
 
-  fprintf(screenshot_file,
-         "P6\n"
-         "%d %d\n"
-         "255\n", sn->w, sn->h);
+  fwrite_ppmraw(screenshot_file, sn);
+  if (ri) memcpy(ri->data, sn->data, ri->h * ri->w * 3);
 
+  unsigned char *pixel= sn->data;
   CANONICALISE_IMAGE(im, sn->w, sn->h, {
-    int i;
-    rgb= 0;
-    for (i=0; i<3; i++) {
-      rgb <<= 8;
-      unsigned long sample= RI_PIXEL(sn,x,y)[i];
-      rgb |= sample;
-      fputc(sample, screenshot_file);
-    }
-    if (ri)
-      CANONIMG_ALSO_STORERGB(ri);
+    rgb=
+      (pixel[0] << 16) |
+      (pixel[1] <<  8) |
+      (pixel[2]      );
+    pixel += 3;
   });
-
+    
   sysassert(!ferror(screenshot_file));
   sysassert(!fflush(screenshot_file));