chiark / gitweb /
rationalise debugging output
[ypp-sc-tools.db-live.git] / pctb / convert.c
index b518dbabf6913e202761dfc9b34cd524d77d4d55..1d516f9cbfdb5ca5cb9ae2c0babb27d032ed47a5 100644 (file)
@@ -1,11 +1,5 @@
-#include <pam.h>
-#include <stdint.h>
-#include <inttypes.h>
-#include <assert.h>
-#include <string.h>
 
-#define eassert assert
-#define debug stdout
+#include "ocr.h"
 
 typedef struct {
   unsigned long rgb; /* on screen */
@@ -15,7 +9,7 @@ typedef struct {
 static int height, width;
 static char *image;
 
-static void debug_flush(void) {
+void debug_flush(void) {
   eassert(!fflush(debug));
   eassert(!ferror(debug));
 }
@@ -34,13 +28,16 @@ static inline char get_p(Point p) { return get(p.x,p.y); }
 
 
 #define START_MAIN {200,200}
+#define MIN_COLUMNS         6
 #define INTERESTING_COLUMNS 6
-#define MAX_COLUMNS 7
+#define TEXT_COLUMNS        2
+#define MAX_COLUMNS         7
 
 static Rect mainr = { START_MAIN,START_MAIN };
 static int commbasey, comminty;
 static int colrightx[INTERESTING_COLUMNS];
-
+static int text_h;
+static OcrReader *rd;
 
 static const CanonColourInfo canoncolourinfos[]= {
   { 0x475A5E, '*' }, /* edge */
@@ -68,6 +65,7 @@ static void require_rectangle_r(Rect rr, const char *ok) {
 }
 
 static void debug_rect(const char *what, int whati, Rect rr) {
+#ifdef DEBUG_RECTANGLES
   int y,r,w;
   fprintf(debug, "%s %d: %d,%d..%d,%d:\n", what, whati,
          rr.tl.x,rr.tl.y, rr.br.x,rr.br.y);
@@ -79,6 +77,7 @@ static void debug_rect(const char *what, int whati, Rect rr) {
     fputc('|',debug);
     fputc('\n',debug);
   }
+#endif
   debug_flush();
 }
 
@@ -139,6 +138,7 @@ static void find_structure(void) {
   down.y++;
   WALK_UNTIL_MUST(down, y,+1, mainr.br.y, '+');
 
+#ifdef DEBUG_RECTANGLES
   int xscaleunit, y,x;
   for (y=0, xscaleunit=1; y<4; y++, xscaleunit*=10) {
     fprintf(debug,"     ");
@@ -148,11 +148,10 @@ static void find_structure(void) {
     }
     fputc('\n',debug);
   }
+#endif
 
   commbasey= up.y;
   comminty= down.y - up.y + 2;
-  fprintf(debug, "up.y=%d down.y=%d commbasey=%d comminty=%d\n",
-         up.y,down.y, commbasey,comminty);
 
   Point across= { mainr.tl.x, commbasey };
   int colno=0;
@@ -162,12 +161,8 @@ static void find_structure(void) {
     eassert(colno < MAX_COLUMNS);
     int colrx= across.x;
     if (colrx > mainr.br.x) colrx= mainr.br.x;
-    if (colno < INTERESTING_COLUMNS) {
+    if (colno < INTERESTING_COLUMNS)
       colrightx[colno]= colrx;
-      fprintf(debug,"colrightx[%d]= %d\n",colno,colrx);
-    } else {
-      fprintf(debug,"extra colr %d  %d\n",colno,colrx);
-    }
       
     colno++;
     
@@ -178,7 +173,9 @@ static void find_structure(void) {
     require_rectangle(across.x,mainr.tl.y, across.x,mainr.br.y, "+");
     across.x++;
   }
-  
+  eassert(colno >= MIN_COLUMNS);
+
+  text_h = comminty - 1;
 }                  
 
 static void find_commodity(int offset, Rect *rr) {
@@ -195,6 +192,15 @@ static void find_commodity(int offset, Rect *rr) {
   rr->br.x= mainr.br.x;
 }
 
+static void find_table_entry(Rect commod, int colno, Rect *cellr) {
+  cellr->tl.y= commod.tl.y;
+  cellr->br.y= commod.br.y;
+  cellr->tl.x= !colno ? commod.tl.x : colrightx[colno-1]+2;
+  cellr->br.x=                        colrightx[colno];
+  debug_rect("cell", colno, *cellr);
+  require_rectangle_r(*cellr, " o");
+}
+
 static void load_image_and_canonify(void) {
   struct pam inpam;
   unsigned char rgb[3];
@@ -224,23 +230,66 @@ static void load_image_and_canonify(void) {
          break;
        }
     }
+#ifdef DEBUG_RECTANGLES
     fprintf(debug, "%4d ",y);
     r= fwrite(image + y*width, 1,width, debug);  eassert(r==width);
     fputc('\n',debug);
+#endif
   }
   debug_flush();
 }
 
+static void ocr_rectangle(Rect r, const OcrCellType ct) {
+  OcrResultGlyph *results, *res;
+
+  int w= r.br.x - r.tl.x + 1;
+  Pixcol cols[w+1];
+  int x,y;
+  for (x=0; x<w; x++) {
+    Pixcol cx, rv;
+    for (y=0, cx=0, rv=1; y<text_h; y++, rv<<=1) {
+      switch (get(x+r.tl.x, y+r.tl.y)) {
+      case ' ':           break;
+      case 'o': cx |= rv; break;
+      default: eassert(!"wrong pixel");
+      }
+    }
+    cols[x]= cx;
+  }
+  cols[w]= 0;
+
+  results= ocr(rd,ct,w,cols);
+  printf("YES! \"");
+  for (res=results; res->s; res++)
+    printf("%s",res->s);
+  printf("\"\n");
+  eassert(!ferror(stdout));
+  eassert(!fflush(stdout));
+}
+
 int main(void) {
+  Rect thisr, entryr;
+  int tryrect, colno;
+
   load_image_and_canonify();
   find_structure();
+  rd= ocr_init(text_h);
 
-  Rect thisr;
-  int tryrect;
   for (tryrect= +height; tryrect >= -height; tryrect--) {
     find_commodity(tryrect, &thisr);
-    if (thisr.tl.x >= 0)
-      debug_rect("commod",tryrect, thisr);
+    if (thisr.tl.x < 0)
+      continue;
+    debug_rect("commod",tryrect, thisr);
+    
+    for (colno=0; colno<MIN_COLUMNS; colno++) {
+      find_table_entry(thisr,colno,&entryr);
+      ocr_rectangle(entryr,
+                   colno<TEXT_COLUMNS
+                   ? &ocr_celltype_text
+                   : &ocr_celltype_number);
+    }
   }
   return 0;
 }
+
+const char *get_vardir(void) { return "."; }