chiark / gitweb /
WIP check commodity, before delete pixel searcher
[ypp-sc-tools.db-test.git] / pctb / structure.c
index 8fabe1887b9063b12715843046afe9ef72556110..63cd641e82ebb843977bf0797ab5f589cf685d62 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);