chiark / gitweb /
invokes yppsc-ocr-resolver for unrecognised pixmap
authorIan Jackson <ian@liberator.relativity.greenend.org.uk>
Sun, 14 Jun 2009 22:39:19 +0000 (23:39 +0100)
committerIan Jackson <ian@liberator.relativity.greenend.org.uk>
Sun, 14 Jun 2009 22:39:19 +0000 (23:39 +0100)
pctb/pages.c
pctb/rgbimage.c
pctb/yppsc-ocr-resolver

index 6003ea9..dfa9108 100644 (file)
@@ -152,6 +152,19 @@ static void send_key(KeySym sym) {
   XTestFakeKeyEvent(disp, keycode(sym),1, 10);
   XTestFakeKeyEvent(disp, keycode(sym),0, 10);
 }
+static void mouse_1_updown_here(void) {
+  check_not_disturbed();
+  XTestFakeButtonEvent(disp,1,1, 50);
+  XTestFakeButtonEvent(disp,1,0, 50);
+}
+static void mouse_1_updown(int x, int y) {
+  check_not_disturbed();
+  int screen= XScreenNumberOfScreen(attr.screen);
+  int xpos, ypos;
+  translate_coords_toroot(x,y, &xpos,&ypos);
+  XTestFakeMotionEvent(disp, screen, xpos,ypos, 0);
+  mouse_1_updown_here();
+}
 
 static int pgupdown;
 
@@ -310,20 +323,14 @@ static void raise_and_get_details(void) {
   check_client_window_all_on_screen();
 }
 
-static void set_focus(void) {
+static void set_focus_commodity(void) {
   int screen= XScreenNumberOfScreen(attr.screen);
 
   progress("taking control of YPP client window...");
 
   debugf("PAGING set_focus\n");
 
-  int xpos, ypos;
-  translate_coords_toroot(160,160, &xpos,&ypos);
-  XTestFakeMotionEvent(disp,screen, xpos,ypos, 0);
-
-  XTestFakeButtonEvent(disp,1,1, 50);
-  XTestFakeButtonEvent(disp,1,0, 50);
-
+  mouse_1_updown(160,160);
   sync_after_input();
 
   delay(0.5);
@@ -333,6 +340,7 @@ static void set_focus(void) {
                        FocusChangeMask
                        ) );
 
+  int xpos,ypos;
   translate_coords_toroot(10,10, &xpos,&ypos);
   XTestFakeMotionEvent(disp,screen, xpos,ypos, 0);
 
@@ -402,10 +410,10 @@ static CanonImage *convert_page(Snapshot *sn, RgbImage *ri) {
   return im;
 }
 
-void take_screenshots(void) {
-  Snapshot *current=0, *last=0;
+static void prepare_ypp_client(void) {
   CanonImage *test;
-
+  Snapshot *current=0;
+  
   /* find the window and check it's on the right kind of screen */
   raise_and_get_details();
   wait_for_stability(&current,0,0, "checking current YPP client screen...");
@@ -413,9 +421,27 @@ void take_screenshots(void) {
   find_structure(test, &max_relevant_y);
   check_correct_commodities();
   free(test);
+  free_snapshot(&current);
+
+  progress("requesting status information...");
+  mouse_1_updown(250, wheight-10);
+  mouse_1_updown_here();
+  mouse_1_updown_here();
+  XSync(disp,False);
+  check_not_disturbed();
+  send_key(XK_slash);
+  send_key(XK_w);
+  send_key(XK_Return);
+  sync_after_input();
+}
 
+void take_screenshots(void) {
+  Snapshot *current=0, *last=0;
+
+  prepare_ypp_client();
+  
   /* page to the top - keep pressing page up until the image stops changing */
-  set_focus();
+  set_focus_commodity();
   wait_for_stability(&current,0, send_pgup_many,
                     "paging up to top of commodity list...");
 
@@ -454,9 +480,8 @@ void take_screenshots(void) {
 
 void take_one_screenshot(void) {
   Snapshot *current=0;
-  
-  raise_and_get_details();
-  sync_after_input();
+
+  prepare_ypp_client();
   wait_for_stability(&current,0,0, "taking screenshot...");
   page0_rgbimage= alloc_rgb_image(current->width, current->height);
   page_images[0]= convert_page(current, 0);
index 634ead1..798a104 100644 (file)
@@ -101,25 +101,42 @@ found:
   dbfile_close();
   return !!result[0];
 }
+
+static void fwrite_ppm(FILE *f, const RgbImage *base, Rect portion) {
+  int x,y,i;
+  fprintf(f,"P3\n%d %d\n255\n", RECT_W(portion), RECT_H(portion));
+  for (y=portion.tl.y; y<=portion.br.y; y++) {
+    for (x=portion.tl.x; x<=portion.br.x; x++) {
+      putc(' ',f);
+      for (i=0; i<3; i++)
+       fprintf(f," %3d", RI_PIXEL(base,x,y)[i]);
+    }
+    putc('\n',f);
+  }
+  sysassert(!ferror(f));
+  sysassert(!fflush(f));
+}
+
 void identify_rgbimage(const RgbImage *base, Rect portion,
                       char result[MAXIMGIDENT], const char *what) {
-  int ok= identify(base, portion, result, what);
-  if (ok) return;
+  for (;;) {
+    int ok= identify(base, portion, result, what);
+    if (ok) return;
+    
+    if (DEBUGP(pixmap))
+      fwrite_ppm(stderr,base,portion);
 
-  if (DEBUGP(pixmap)) {
-    int x,y,i;
-    fprintf(stderr,"P3\n%d %d\n255\n", RECT_W(portion), RECT_H(portion));
-    for (y=portion.tl.y; y<=portion.br.y; y++) {
-      for (x=portion.tl.x; x<=portion.br.x; x++) {
-       putc(' ',stderr);
-       for (i=0; i<3; i++)
-         fprintf(stderr," %3d", RI_PIXEL(base,x,y)[i]);
-      }
-      putc('\n',stderr);
-    }
+    FILE *resolver= resolve_start();
+    if (!resolver)
+       fatal("Image recognition failed - unrecognised island.\n"
+             "See FIXME.FIXME\n");
+
+    fprintf(resolver, "pixmap\n" "%s\n", what);
+    fwrite_ppm(resolver, base, portion);
+    putc('\n',resolver);
+
+    resolve_finish();
   }
-  fatal("Unrecognised pixmap for %s.", what);
 }
 
 RgbImage *alloc_rgb_image(int w, int h) {
index bb55d3d..ec4473d 100755 (executable)
@@ -126,6 +126,11 @@ proc resize_widgets {} {
 
 #---------- xpm input processor ----------
 
+proc must_gets {f lvar} {
+    upvar 1 $lvar l
+    if {[gets $f l] < 0} { error "huh?" }
+}
+
 proc read_xpm {f} {
     global glyphsdone mul inter rhsmost_max unk_l unk_r mulcols mulrows
     global cols rows wordmap
@@ -133,7 +138,7 @@ proc read_xpm {f} {
     set o {}
     set y -3
     while 1 {
-       if {[gets $f l] < 0} { error "huh? "}
+       must_gets $f l
        if {![regexp {^"(.*)",$} $l dummy l]} {
            append o "$l\n"
            if {[regexp {^\}\;$} $l]} break
@@ -552,6 +557,19 @@ proc required {} {
        return
     }
     init_widgets
+
+    required/$l
+}
+
+proc required/pixmap {} {
+    global unk_what
+    must_gets stdin unk_what
+    error nyi
+}
+
+proc required/char {} {
+    must_gets stdin l
+
     manyset [lrange $l 0 3] unk_l unk_r unk_contexts
     set glyphsdone [lrange $l 3 end]
     debug "GOT $l"