X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?a=blobdiff_plain;f=pctb%2Fconvert.c;h=3a2b79fed91f6d50ed7141ddf262fd395c0bc440;hb=80b5d5ede35cfb393591ed6326ca97ca23ce0c31;hp=546ac6e4864cefd5b34fe6ce40f96145382358e4;hpb=2c8c96bac370d3b5bc40815cd38b2007ed8fecc2;p=ypp-sc-tools.main.git diff --git a/pctb/convert.c b/pctb/convert.c index 546ac6e..3a2b79f 100644 --- a/pctb/convert.c +++ b/pctb/convert.c @@ -6,8 +6,7 @@ typedef struct { char c; /* canonical */ } CanonColourInfo; -static int height, width; -static char *image; +static CanonImage *cim; void debug_flush(void) { eassert(!fflush(debug)); @@ -23,7 +22,7 @@ typedef struct { /* both inclusive */ Point br; } Rect; -static inline char get(int x, int y) { return image[y * width + x]; } +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); } @@ -93,7 +92,7 @@ static void debug_rect(const char *what, int whati, Rect rr) { w= rr.br.x - rr.tl.x + 1; for (y=rr.tl.y; y<=rr.br.y; y++) { fprintf(debug, "%4d%*s|", y, rr.tl.x,""); - r= fwrite(image + y*width + rr.tl.x, 1, w, debug); + r= fwrite(cim->d + y*cim->w + rr.tl.x, 1, w, debug); eassert(r==w); fputc('|',debug); fputc('\n',debug); @@ -116,7 +115,7 @@ static void debug_rect(const char *what, int whati, Rect rr) { } while(0) static void find_structure(void) { - Rect whole = { {0,0}, {width-1,height-1} }; + Rect whole = { {0,0}, {cim->w-1,cim->h-1} }; WALK_UNTIL_MUST(mainr.tl, x,-1, whole.tl.x, '*'); WALK_UNTIL_MUST(mainr.tl, y,-1, whole.tl.y, '*'); @@ -163,7 +162,7 @@ static void find_structure(void) { int xscaleunit, y,x; for (y=0, xscaleunit=1; y<4; y++, xscaleunit*=10) { fprintf(debug," "); - for (x=0; x<=width; x++) { + for (x=0; x<=cim->w; x++) { if (x % xscaleunit) fputc(' ',debug); else fprintf(debug,"%d",(x / xscaleunit)%10); } @@ -222,42 +221,49 @@ static void find_table_entry(Rect commod, int colno, Rect *cellr) { require_rectangle_r(*cellr, " o"); } -static void load_image_and_canonify(void) { +CanonImage *file_read_image(FILE *f) { struct pam inpam; unsigned char rgb[3]; int x,y,r; const CanonColourInfo *cci; - pnm_readpaminit(stdin, &inpam, sizeof(inpam)); - height= inpam.height; - width= inpam.width; + pnm_readpaminit(f, &inpam, sizeof(inpam)); eassert(inpam.maxval == 255); eassert(inpam.bytes_per_sample == 1); - image= malloc(width*height); - eassert(image); - memset(image,'?',width*height); + CanonImage *im= malloc(sizeof(CanonImage) + inpam.width*inpam.height); + eassert(im); + im->h= inpam.height; + im->w= inpam.width; + + memset(im->d,'?',inpam.width*inpam.height); - for (y=0; yc; cci++) if (cci->rgb == rgb_l) { - image[y*width + x]= cci->c; + im->d[y*inpam.width + x]= cci->c; break; } } #ifdef DEBUG_RECTANGLES fprintf(debug, "%4d ",y); - r= fwrite(image + y*width, 1,width, debug); eassert(r==width); + r= fwrite(im->d + y*inpam.width, 1,inpam.width, debug); + eassert(r==inpam.width); fputc('\n',debug); #endif } debug_flush(); + return im; +} + +static void load_image_and_canonify(void) { + cim= file_read_image(stdin); } static void ocr_rectangle(Rect r, const OcrCellType ct) { @@ -288,7 +294,7 @@ static void ocr_rectangle(Rect r, const OcrCellType ct) { eassert(!fflush(stdout)); } -int main(void) { +int main_test(void) { Rect thisr, entryr; int tryrect, colno; @@ -296,7 +302,7 @@ int main(void) { find_structure(); rd= ocr_init(text_h); - for (tryrect= +height; tryrect >= -height; tryrect--) { + for (tryrect= +cim->h; tryrect >= -cim->h; tryrect--) { find_commodity(tryrect, &thisr); if (thisr.tl.x < 0) continue;