chiark / gitweb /
Adjust colours early so that we don't have to keep all RGBs in RAM
[ypp-sc-tools.db-live.git] / pctb / pages.c
index 72f9bb478a982f5b0206af12c2cc0b6209c6df83..95a1c460688716a710f216fd8d92a5d8c69f409f 100644 (file)
@@ -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;
@@ -355,7 +352,7 @@ static void wait_for_stability(Snapshot **output,
          "  last_input=%f previously=%p `%s'\n",
          last_input, previously, doing);
 
-  double min_interval= 25000; /*us*/
+  double min_interval= 0.025;
   for (;;) {
     progress_spinner("%s",doing);
     
@@ -363,7 +360,7 @@ static void wait_for_stability(Snapshot **output,
     double this_interval= min_interval - since_last_input;
 
     if (this_interval >= 0)
-      usleep(this_interval);
+      delay(this_interval);
 
     snapshot(output);
 
@@ -376,7 +373,7 @@ static void wait_for_stability(Snapshot **output,
       nidentical=0;
       if (!with_keypress) {
        min_interval *= 3.0;
-       min_interval += 0.5;
+       min_interval += 0.1;
       }
     } else {
       nidentical++;
@@ -389,7 +386,7 @@ static void wait_for_stability(Snapshot **output,
       if (nidentical >= threshold)
        break;
 
-      min_interval += 0.5;
+      min_interval += 0.1;
       min_interval *= 2.0;
     }
 
@@ -520,21 +517,25 @@ 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 *rgb;
 
   fwrite_ppmraw(screenshot_file, sn);
 
   const unsigned char *pixel= sn->data;
-  CANONICALISE_IMAGE(im, sn->w, sn->h, {
+  CANONICALISE_IMAGE(im, sn->w, sn->h, rgb, {
     r= *pixel++;
     g= *pixel++;
     b= *pixel++;
   });
-    
+
   sysassert(!ferror(screenshot_file));
   sysassert(!fflush(screenshot_file));
 
+  if (rgb_r) *rgb_r= rgb;
+  else free(rgb);
+
   return im;
 }
 
@@ -546,8 +547,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);
@@ -577,6 +578,16 @@ static void prepare_ypp_client(void) {
   free_snapshot(&status);
 }
 
+static void convert_store_page(Snapshot *current) {
+  RgbImage *rgb;
+  CanonImage *ci;
+  PageStruct *pstruct;
+  
+  ci= convert_page(current,&rgb);
+  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(&current,last, 0,
-                      "collecting screenshot of page %d...",
+                      "page %d collecting...",
                       npages+1);
 
     if (npages &&  /* first pagedown doesn't do much */
@@ -628,7 +639,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.");
 }