chiark / gitweb /
New paging arrangements:
authorIan Jackson <ian@liberator.relativity.greenend.org.uk>
Fri, 28 Aug 2009 22:16:51 +0000 (23:16 +0100)
committerIan Jackson <ian@liberator.relativity.greenend.org.uk>
Fri, 28 Aug 2009 22:17:09 +0000 (23:17 +0100)
 - check pager motion to detect multi-paging
 - do not duplicate first page
This is the bugfix `checkpager'

yarrg/Commods.pm
yarrg/convert.h
yarrg/pages.c
yarrg/structure.c

index f81e1b8..f282313 100644 (file)
@@ -214,7 +214,7 @@ sub parse_pctb_commodmap () {
 sub get_our_version ($$) {
     my ($aref,$prefix) = @_;
     $aref->{"${prefix}name"}= 'ypp-sc-tools yarrg';
-    $aref->{"${prefix}fixes"}= 'lastpage';
+    $aref->{"${prefix}fixes"}= 'lastpage checkpager';
 
     my $version= `git-describe --tags HEAD || echo 0unknown`; $? and die $?;
     chomp($version);
index 82ea369..fadfe93 100644 (file)
@@ -76,6 +76,7 @@ void store_current_page(CanonImage *ci /*pointer saved*/,
 void adjust_colours(CanonImage *ci, const RgbImage *rgb);
 
 void select_page(int page);
+void check_pager_motion(int first, int stop);
 
 Rect find_sunshine_widget(void);
 
index 8f1332c..02cacd9 100644 (file)
@@ -605,28 +605,24 @@ void take_screenshots(void) {
   for (;;) {
     debugf("page %d paging\n",npages);
 
+    pgdown_by_mouse();
+
     if (!(npages < MAX_PAGES))
       fatal("Paging down seems to generate too many pages - max is %d.",
            MAX_PAGES);
 
     convert_store_page(current);
     free_snapshot(&last); last=current; current=0;
-
     debugf("PAGING page %d converted\n",npages);
+    npages++;
 
     wait_for_stability(&current,last, 0,
                       "page %d collecting    ...",
-                      npages+1);
-
-    if (npages &&  /* first pagedown doesn't do much */
-       identical(current,last)) {
-      npages++;
+                      npages);
+    if (identical(current,last)) {
       free_snapshot(&current);
       break;
     }
-
-    pgdown_by_mouse();
-    npages++;
   }
   progress("finishing with the YPP client...");
   send_mouse_1_updown(commod_focuslast_point.x, commod_focuslast_point.y);
@@ -636,6 +632,7 @@ void take_screenshots(void) {
 
   debugf("PAGING all done.\n");
   progress_log("collected %d screenshots.",npages);
+  check_pager_motion(0,npages);
 }    
 
 void take_one_screenshot(void) {
index 99042d0..8aae1c4 100644 (file)
@@ -37,7 +37,7 @@ DEBUG_DEFINE_DEBUGF(struct)
 
 struct PageStruct {
   Rect mr;
-  int commbasey, comminty;
+  int commbasey, comminty, pagerheight;
   int colrightx[INTERESTING_COLUMNS];
 };
 
@@ -401,6 +401,13 @@ void find_structure(const CanonImage *im,
   ADJUST_BOX(pager, "o",>=,RECT_W(pager)-2, s.mr.tl.y,LIMIT_QUITEQ, tl,y,-1);
   debug_rect("pager",__LINE__,pager);
 
+  pager.br.y= pager.tl.y;
+  pager.tl.y= pager.tl.y-1;
+  if (pager.tl.y > s.mr.tl.y)
+    ADJUST_BOX(pager, "+",>,1, s.mr.tl.y,LIMIT_QUITEQ, tl,y,-1);
+  debug_rect("pager",__LINE__,pager);
+  s.pagerheight= pager.br.y - pager.tl.y;
+
 #define SET_ONCE(var,val) do{                                          \
     int v= (val);                                                      \
     if ((var)==-1) (var)= v;                                           \
@@ -430,7 +437,7 @@ void find_structure(const CanonImage *im,
   }
   if (commod_page_point_r) {
     commod_page_point_r->x= (pager.tl.x + pager.br.x) / 2;
-    commod_page_point_r->y=  pager.tl.y - 1;
+    commod_page_point_r->y=  pager.br.y - 1;
   }
 
   MUST( text_h <= OCR_MAX_H, MI(text_h) );
@@ -533,6 +540,7 @@ void store_current_page(CanonImage *ci, PageStruct *pstruct, RgbImage *rgb) {
   else free(rgb);
   page_images[npages]= cim;
   page_structs[npages]= *pstruct;
+  debugf("STORED page %d  pagerheight=%d\n", npages, pstruct->pagerheight);
   free(pstruct);
 }
 
@@ -560,6 +568,12 @@ void read_screenshots(void) {
   }
   sysassert(!ferror(screenshot_file));
   progress_log("read %d screenshots.",npages);
+
+  check_pager_motion(1,npages);
+  /* When we are reading screenshots, the pages file contains the
+   * `determine where we're to click' page as well as the first
+   * actual data page, which we have to skip.
+   */
 }
 
 #define FIXPT_SHIFT 15
@@ -1010,3 +1024,55 @@ void find_islandname(void) {
   island= masprintf("%s", delim+3);
 
 }
+
+void check_pager_motion(int first, int stop) {
+  /* We check that the pager moved by an appropriate amount.
+   * The last gap can be smaller but not bigger.
+   */
+  int count= stop-first;
+
+#define PH(p) (page_structs[(p)].pagerheight)
+
+  debugf("CHECK_PAGER_MOTION %d..%d count=%d\n", first,stop,count);
+
+  if (count <= 1) return; /* only one page */
+
+  double firstheight= PH(first);
+  double max= count>2 ? firstheight / (count-2) : 0;
+  double min=           firstheight / (count-1);
+  max *= 1.1;
+  min /= 1.1;
+  max += 1.0;
+  min -= 1.0;
+  debugf("CHECK_PAGER_MOTION min=%g max=%g\n", min,max);
+  assert(max>min);
+
+  int skips=0, firstskip=1;
+  int stops=0, firststop=1;
+
+#define REPORT(skipstop,msg) do{                       \
+      skipstop##s++;                                   \
+      if (first##skipstop<0) first##skipstop= page;    \
+      if (skipstop##s<5)                               \
+       fprintf(stderr,msg " (page %d)\n",page);        \
+    }while(0)
+
+  int page;
+  for (page=first+1; page<stop; page++) {
+    int gap= PH(page-1) - PH(page);
+    debugf("CHECK_PAGER_MOTION  page=%2d gap=%2d\n", page, gap);
+    if (gap>max)
+      REPORT(skip, "scrollbar motion probable page skip detected!");
+    if (gap<min && page<stop-1)
+      REPORT(stop, "scrollbar short motion gives lie to our ideas!");
+  }
+  MUST(!skips && !stops,
+       MI(skips);MI(firstskip);MF(max);MI(PH(firstskip));MI(PH(firstskip-1));
+       MI(stops);MI(firststop);MF(min);MI(PH(firststop));MI(PH(firststop-1));
+       MF(firstheight);MI(PH(stop-2));MI(PH(stop-1));
+       MSB(
+"\n\n"
+"Your YPP client seems to be paging irregularly.  Perhaps your computer\n"
+"is too slow or overloaded or perhaps you are messing with the mouse ?\n"
+       ));
+}