chiark / gitweb /
Fixups to new Upper/Lower/Digit/Word ocr arrangements; make dictionary-manager only...
authorIan Jackson <ian@liberator.relativity.greenend.org.uk>
Tue, 30 Jun 2009 18:50:00 +0000 (19:50 +0100)
committerIan Jackson <ian@liberator.relativity.greenend.org.uk>
Tue, 30 Jun 2009 18:50:00 +0000 (19:50 +0100)
pctb/README.charset
pctb/ocr.c
pctb/ocr.h
pctb/x.gdb

index c57f2f5187a537b85c77f793493eefd9f7f0a3e3..4301a0a495a7a6c6f44e32bd360ef9d7cf5d7a34 100644 (file)
@@ -102,9 +102,12 @@ containing `yw' and define it as `yw'.
 Fixing mistakes
 ---------------
 
 Fixing mistakes
 ---------------
 
-The OCR query UI allows you to delete things from the glyph dictionary.
-However since you are not guaranteed to actually get an OCR query at
-all if the dictionary contains errors, you shouldn't rely on this.
+The OCR query UI allows you to delete things from the glyph
+dictionary.  However since you are not guaranteed to actually get an
+OCR query at all (and since it is not possible to override the
+presence of an entry in the master database with the absence of one in
+the local database), if the dictionary contains errors, you shouldn't
+rely on this.
 
 If you think you have made mistakes answering OCR queries (for
 example, the recognised data is wrong), you should delete the file
 
 If you think you have made mistakes answering OCR queries (for
 example, the recognised data is wrong), you should delete the file
index f6104452dc1c1854e6ccd19aac77882caae0aba9..7655659f902546278529397e0fecc225ea6da4e6 100644 (file)
@@ -235,7 +235,7 @@ static void callout_unknown(OcrReader *rd, int w, Pixcol cols[],
   for (i=0, s=rd->results; i<rd->nresults; i++, s++) {
     if (!strcmp(s->s," ")) continue;
     fprintf(resolver," %d %d ",s->l,s->r);
   for (i=0, s=rd->results; i<rd->nresults; i++, s++) {
     if (!strcmp(s->s," ")) continue;
     fprintf(resolver," %d %d ",s->l,s->r);
-    cu_pr_ctxmap(resolver,s->ctxmap);
+    cu_pr_ctxmap(resolver, 1u << s->ctxi);
     fprintf(resolver," ");
     for (p=s->s; (c= *p); p++) {
       if (c=='\\') fprintf(resolver,"\\%c",c);
     fprintf(resolver," ");
     for (p=s->s; (c= *p); p++) {
       if (c=='\\') fprintf(resolver,"\\%c",c);
@@ -265,8 +265,7 @@ static void callout_unknown(OcrReader *rd, int w, Pixcol cols[],
   readdb(rd);
 }
 
   readdb(rd);
 }
 
-static void add_result(OcrReader *rd, const char *s, int l, int r,
-                      unsigned ctxmap) {
+static void add_result(OcrReader *rd, const char *s, int l, int r, int ctxi) {
   if (rd->nresults >= rd->aresults) {
     rd->aresults++; rd->aresults<<=1;
     rd->results= mrealloc(rd->results, sizeof(*rd->results)*rd->aresults);
   if (rd->nresults >= rd->aresults) {
     rd->aresults++; rd->aresults<<=1;
     rd->results= mrealloc(rd->results, sizeof(*rd->results)*rd->aresults);
@@ -274,7 +273,7 @@ static void add_result(OcrReader *rd, const char *s, int l, int r,
   rd->results[rd->nresults].s= s;
   rd->results[rd->nresults].l= l;
   rd->results[rd->nresults].r= r;
   rd->results[rd->nresults].s= s;
   rd->results[rd->nresults].l= l;
   rd->results[rd->nresults].r= r;
-  rd->results[rd->nresults].ctxmap= ctxmap;
+  rd->results[rd->nresults].ctxi= ctxi;
   rd->nresults++;
 }
 
   rd->nresults++;
 }
 
@@ -314,7 +313,8 @@ static DatabaseNode *findchar_1ctx(const FindCharArgs *fca,
   return bestmatch;
 }  
 
   return bestmatch;
 }  
 
-static DatabaseNode *findchar(const FindCharArgs *fca, int *match_rx) {
+static DatabaseNode *findchar(const FindCharArgs *fca,
+                             int *match_rx, int *match_rctxi) {
   FindCharResults results[NCONTEXTS];
   int ctxi, match=-1, nmatches=0;
 
   FindCharResults results[NCONTEXTS];
   int ctxi, match=-1, nmatches=0;
 
@@ -342,8 +342,9 @@ static DatabaseNode *findchar(const FindCharArgs *fca, int *match_rx) {
   if (match<0)
     return 0;
   
   if (match<0)
     return 0;
   
-  *match_rx= results[ctxi].rx;
-  return results[ctxi].match;
+  *match_rx= results[match].rx;
+  if (match_rctxi) *match_rctxi= match;
+  return results[match].match;
 }
 
 static int findchar_select_text(const FindCharArgs *fca,
 }
 
 static int findchar_select_text(const FindCharArgs *fca,
@@ -366,7 +367,7 @@ const struct OcrCellTypeInfo ocr_celltype_number= {
 const struct OcrCellTypeInfo ocr_celltype_text= {
   .initial=  012, /* Digit|Upper */
   .nextword= 017, /* Digit|Upper|Lower|Word */
 const struct OcrCellTypeInfo ocr_celltype_text= {
   .initial=  012, /* Digit|Upper */
   .nextword= 017, /* Digit|Upper|Lower|Word */
-  .midword=  014, /* Digit|Lower */
+  .midword=  011, /* Digit|Lower */
   .space_spaces= 4,
   .name= "text",
   .findchar_select= findchar_select_text
   .space_spaces= 4,
   .name= "text",
   .findchar_select= findchar_select_text
@@ -415,17 +416,18 @@ OcrResultGlyph *ocr(OcrReader *rd, OcrCellType ct, int w, Pixcol cols[]) {
 
     /* something here, so we need to add the spaces */
     if (nspaces >= ct->space_spaces)
 
     /* something here, so we need to add the spaces */
     if (nspaces >= ct->space_spaces)
-      add_result(rd," ",x-nspaces,x+1,0);
+      add_result(rd," ",x-nspaces,x+1,-1);
     nspaces=0;
 
     fca.x= x;
 
     int match_rx=-1;
     nspaces=0;
 
     fca.x= x;
 
     int match_rx=-1;
-    DatabaseNode *match= findchar(&fca, &match_rx);
+    int match_ctxi=-1;
+    DatabaseNode *match= findchar(&fca, &match_rx, &match_ctxi);
     
     if (match) {
       debugf(" || YES");
     
     if (match) {
       debugf(" || YES");
-      add_result(rd, match->str, x, match_rx, fca.ctxmap);
+      add_result(rd, match->str, x, match_rx, match_ctxi);
       x= match_rx+1;
       if (match->match) fca.ctxmap= ct->midword;
       else debugf(" (empty)");
       x= match_rx+1;
       if (match->match) fca.ctxmap= ct->midword;
       else debugf(" (empty)");
@@ -446,7 +448,7 @@ OcrResultGlyph *ocr(OcrReader *rd, OcrCellType ct, int w, Pixcol cols[]) {
     }
 
   }
     }
 
   }
-  add_result(rd, 0,-1,-1,0);
+  add_result(rd, 0,-1,-1,-1);
   debugf("OCR  finished %d glyphs\n",rd->nresults);
   debug_flush();
   return rd->results;
   debugf("OCR  finished %d glyphs\n",rd->nresults);
   debug_flush();
   return rd->results;
index 97a5c66997f16efa2abdf586979e21ffc5c9b1be..389a7d27a8224b4925081de24bff63fb568ce5eb 100644 (file)
@@ -38,7 +38,7 @@ typedef uint32_t Pixcol;
 typedef struct {
   const char *s; /* valid until next call to ocr() */
   int l,r; /* column numbers */
 typedef struct {
   const char *s; /* valid until next call to ocr() */
   int l,r; /* column numbers */
-  unsigned ctxmap; /* match context index */
+  int ctxi; /* match context index */
 } OcrResultGlyph;
 
 
 } OcrResultGlyph;
 
 
index 5adf557e0ffb9d27784328376e6030b4664de9d1..208882594ddd660df747f93373dd47a29c6a826a 100644 (file)
@@ -1,8 +1,4 @@
 file ypp-commodities
 file ypp-commodities
-set args -Dpages --test-servers --find-island
-break pages.c:596
-
-#set args -Dcallout --ocean midnight --pirate aristarchus --same --raw-tsv >raw.tsv 
-#break convert.c:260
-
+set args --same --test-servers --raw-tsv
+break findchar
 run
 run