X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?p=ypp-sc-tools.db-test.git;a=blobdiff_plain;f=pctb%2Focr.c;h=d12218f39fd2953eef1f892c9bb7fbd360e3b64c;hp=5fdc4575ec4f64540129d00055e3847478f36a4f;hb=344df47a4f31ad647d31152a56a6cc8b004ce087;hpb=89dfaeec1540f73ba85dbd25dd5332416f98778e diff --git a/pctb/ocr.c b/pctb/ocr.c index 5fdc457..d12218f 100644 --- a/pctb/ocr.c +++ b/pctb/ocr.c @@ -1,5 +1,29 @@ /* - */ + * Core OCR algorithm (first exact bitmap match) + */ +/* + * This is part of ypp-sc-tools, a set of third-party tools for assisting + * players of Yohoho Puzzle Pirates. + * + * Copyright (C) 2009 Ian Jackson + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * Yohoho and Puzzle Pirates are probably trademarks of Three Rings and + * are used without permission. This program is not endorsed or + * sponsored by Three Rings. + */ #include "ocr.h" @@ -22,10 +46,27 @@ static const char *context_names[]= { "Upper", "Digit" }; +struct OcrCellTypeInfo { + /* bitmaps of indices into context_names: */ + unsigned initial, nextword, midword; + int space_spaces; + const char *name; +}; +const struct OcrCellTypeInfo ocr_celltype_number= { + 4,4,4, + .space_spaces= 5, + .name= "number" +}; +const struct OcrCellTypeInfo ocr_celltype_text= { + .initial=2, /* Uppercase */ + .nextword=3, /* Either */ + .midword=1, /* Lower only */ + .space_spaces= 4, + .name= "text" +}; -#define NCONTEXTS (sizeof(context_names)/sizeof(context_names[0])) -#define SPACE_SPACES 4 +#define NCONTEXTS (sizeof(context_names)/sizeof(context_names[0])) struct OcrReader { int h; @@ -296,20 +337,6 @@ static void add_result(OcrReader *rd, const char *s, int l, int r, rd->nresults++; } -struct OcrCellTypeInfo { - unsigned initial, nextword, midword; - const char *name; -}; -const struct OcrCellTypeInfo ocr_celltype_number= { - 4,4,4, - .name= "number" -}; -const struct OcrCellTypeInfo ocr_celltype_text= { - .initial=2, /* Uppercase */ - .nextword=3, /* Either */ - .midword=1, /* Lower only */ - .name= "text" -}; const char *ocr_celltype_name(OcrCellType ct) { return ct->name; } @@ -338,7 +365,7 @@ OcrResultGlyph *ocr(OcrReader *rd, OcrCellType ct, int w, Pixcol cols[]) { if (!cols[x]) { nspaces++; x++; - if (nspaces==SPACE_SPACES) { + if (nspaces == ct->space_spaces) { debugf("OCR x=%x nspaces=%d space\n",x,nspaces); ctxmap= ct->nextword; } @@ -346,7 +373,7 @@ OcrResultGlyph *ocr(OcrReader *rd, OcrCellType ct, int w, Pixcol cols[]) { } /* something here, so we need to add the spaces */ - if (nspaces>=SPACE_SPACES) + if (nspaces >= ct->space_spaces) add_result(rd," ",x-nspaces,x+1,0); nspaces=0; @@ -411,7 +438,7 @@ OcrResultGlyph *ocr(OcrReader *rd, OcrCellType ct, int w, Pixcol cols[]) { if (uniquematch->s[0]) ctxmap= ct->midword; else debugf(" (empty)"); if (uniquematch->endsword) { - nspaces= SPACE_SPACES; + nspaces= ct->space_spaces; debugf("_"); ctxmap= ct->nextword; }