chiark / gitweb /
WIP check commodity, before delete pixel searcher
authorIan Jackson <ian@liberator.relativity.greenend.org.uk>
Sun, 7 Jun 2009 23:02:42 +0000 (00:02 +0100)
committerIan Jackson <ian@liberator.relativity.greenend.org.uk>
Sun, 7 Jun 2009 23:02:42 +0000 (00:02 +0100)
pctb/common.h
pctb/convert.h
pctb/pages.c
pctb/structure.c
pctb/x.gdb

index f942c72..8b66cf5 100644 (file)
@@ -57,6 +57,7 @@ typedef struct { /* both inclusive */
    DF(findypp)                                 \
    DF(pages)                                   \
    DF(rect)                                    \
+   DF(struct)                                  \
    DF(ocr)                                     \
    DF(callout)
 
index 7a9e252..8c6efef 100644 (file)
@@ -41,6 +41,7 @@
 /*----- from structure.c -----*/
 
 void find_structure(CanonImage *im, int *max_relevant_y_r);
+void check_correct_commodities(void);
 void read_screenshots(void);
 void read_one_screenshot(void);
 void analyse(FILE *tsv_output);
index 1abc5ed..ab3a2b0 100644 (file)
@@ -408,6 +408,7 @@ void take_screenshots(void) {
   wait_for_stability(&current,0,0, "checking current YPP client screen...");
   test= convert_page(current);
   find_structure(test, &max_relevant_y);
+  check_correct_commodities();
   free(test);
 
   /* page to the top - keep pressing page up until the image stops changing */
index 8fabe18..63cd641 100644 (file)
@@ -32,7 +32,9 @@ static CanonImage *cim;
 static inline char get(int x, int y) { return cim->d[y * cim->w + x]; }
 static inline char get_p(Point p) { return get(p.x,p.y); }
 
-#define START_MAIN {200,200}
+DEBUG_DEFINE_DEBUGF(struct)
+
+#define START_MAIN {200,100}
 #define MIN_COLUMNS         6
 #define INTERESTING_COLUMNS 7
 #define TEXT_COLUMNS        2
@@ -256,6 +258,75 @@ void find_structure(CanonImage *im, int *max_relevant_y_r) {
     SET_ONCE(*max_relevant_y_r, mainr.br.y + 10);
 }                  
 
+void check_correct_commodities(void) {
+  Rect search= { { 50,39 }, { 130,59 } };
+
+#define SEARCH_UPDOWN(this,increm)                             \
+  for (;;) {                                                   \
+    MUST( search.tl.y != search.br.y, MR(search);MSB(#this); );        \
+    int x, got=0;                                              \
+    for (x=search.tl.x; x<=search.br.x; x++)                   \
+      got += (get(x,this.y) == '_');                           \
+    if (got > 10)                                              \
+      break;                                                   \
+    this.y += increm;                                          \
+  }
+    
+  SEARCH_UPDOWN(search.tl, +1);
+  SEARCH_UPDOWN(search.br, -1);
+
+  debug_rect("commodselr",1, search);
+
+  static const char *all[]= {
+    "   ___________________________________   ",
+    "  ________X____X__X____________________  ",
+    " ________ X___ X_ X_____XXXXXXXXXXX_____ ",
+    "_________X_X__ X_ X______XXXXXXXXX_______",
+    "________ X X__ X_ X_______XXXXXXX________",
+    "________X_ _X_ X_ X________XXXXX_________",
+    "_______ X__ X_ X_ X_________XXX__________",
+    "_______XXXXXXX X_ X__________X___________",
+    " _____ X     X X_ X______________________",
+    "  ____X_____ _XX_ X______________________",
+    "   __ _______  __ ______________________ ",
+  };
+
+  static int allh= sizeof(all)/sizeof(all[0]);
+  const int allw= strlen(all[0]);
+
+  int alloffy, alloffx;
+  for (alloffy=0; alloffy < search.br.y; alloffy++) {
+    if (alloffy+allh-1 < search.tl.y) continue;
+    for (alloffx=search.tl.x; alloffx+allw-1 <= search.br.x; alloffx++) {
+      int good=0, bad=0;
+      int x,y;
+      for (x=0; x<allw; x++)
+       for (y=0; y<allh; y++) {
+         int want= all[y][x];
+         if (want==' ') continue;
+#define PIXCHECK(dx,dy) \
+          if (get(alloffx+x+dx, alloffy+y+dy) == want) goto pix_found
+         PIXCHECK( 0, 0);
+         PIXCHECK(-1,-1);
+         PIXCHECK(-1,+1);
+         PIXCHECK(+1,-1);
+         PIXCHECK(+1,+1);
+         bad++;
+         continue;
+       pix_found:
+         good++;
+       }
+      debugf("CHECKCOMMOD alloff=%d,%d good=%d bad=%d\n",
+            alloffx,alloffy, good,bad);
+      if (good > 20*bad)
+       goto all_found;
+    }
+  }
+  fatal("Commodities selector not set to `All'.");
+
+ all_found:;
+}
+
 CanonImage *alloc_canon_image(int w, int h) {
   CanonImage *im= mmalloc(sizeof(CanonImage) + w*h);
   im->w= w;
@@ -380,6 +451,9 @@ void analyse(FILE *tsv_output) {
   for (page=0; page<npages; page++) {
     find_structure(page_images[page], 0);
 
+    if (!page)
+      check_correct_commodities();
+
     if (!rd)
       rd= ocr_init(text_h);
 
index 131c503..477c23d 100644 (file)
@@ -1,6 +1,6 @@
 file ypp-commodities
 set confirm off
-set args --raw-tsv --same --screenshots-file many-arbitrage-pages.ppm  >t
-watch o_screenshots_fn
-break convert.c:125
+set args -Drect --same --arbitrage
+#watch o_screenshots_fn
+#break convert.c:125
 run