X-Git-Url: http://git.asbjorn.it/?a=blobdiff_plain;f=lib%2Fgocr%2Foutput.c;fp=lib%2Fgocr%2Foutput.c;h=62d55872e08a5ddd53bf9f960aeab4f2f8ce86cc;hb=8154e11e1c06aefe18c16b33f2b12d6de21273a4;hp=0000000000000000000000000000000000000000;hpb=e8fe2f290123fc66181709a8a5263ad9e91c6939;p=swftools.git diff --git a/lib/gocr/output.c b/lib/gocr/output.c new file mode 100644 index 0000000..62d5587 --- /dev/null +++ b/lib/gocr/output.c @@ -0,0 +1,193 @@ +/* +This is a Optical-Character-Recognition program +Copyright (C) 2000-2006 Joerg Schulenburg + +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 2 +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, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + see README for EMAIL address +*/ + +#include +#include "unicode.h" +#include "output.h" +#include "gocr.h" /* extern job_t JOB; */ + +/* function is only for debugging and for developing + it prints out a part of pixmap b at point x0,y0 to stderr + using dots .,; if no pixel, and @xoO for pixels + modify n_run and print out what would happen on 2nd, 3th loop! + new: output original and copied pixmap in the same figure + */ +void out_b(struct box *px, pix *b, int x0, int y0, int dx, int dy, int cs ){ + int x,y,x2,y2,yy0,tx,ty,n1,i; + char c1, c2; + yy0=y0; + if(px){ /* overwrite rest of arguments */ + if (!b) { + b=px->p; + x0=px->x0; dx=px->x1-px->x0+1; + y0=px->y0; dy=px->y1-px->y0+1; yy0=y0; + } + if(cs==0) cs=JOB->cfg.cs; + fprintf(stderr,"\n# list box x= %4d %4d d= %3d %3d r= %3d %3d" + " nrun=%d p=%p", /* ToDo: r,nrun is obsolete */ + px->x0, px->y0, px->x1 - px->x0 + 1, px->y1 - px->y0 + 1, + px->x - px->x0, px->y - px->y0, JOB->tmp.n_run, (void*)px); + fprintf(stderr,"\n# dots=%d boxes=%d subboxes=%d c=%s mod=%s" + " line=%d m= %d %d %d %d", + px->dots, px->num_boxes, px->num_subboxes, + decode(px->c,ASCII), decode(px->modifier,ASCII), px->line, + px->m1 - px->y0, px->m2 - px->y0, px->m3 - px->y0, px->m4 - px->y0); + if (px->num_frames) { + int i,j,jo; + fprintf(stderr,"\n# frames= %d (sumvects=%d)",px->num_frames, + ((px->num_frames)?px->num_frame_vectors[px->num_frames-1]:-1)); + for (jo=j=i=0; inum_frames; i++, jo=j) { + fprintf(stderr,"\n# frame %d (%+4d,%3d,%2d) ", + i, px->frame_vol[i], px->frame_per[i], + px->num_frame_vectors[i]-jo); + /* print only the first vectors of each frame */ + for (;jnum_frame_vectors[i] && jframe_vector[j][0] - px->x0, + px->frame_vector[j][1] - px->y0); + } + } + if (px->num_ac){ /* output table of chars and its probabilities */ + fprintf(stderr,"\n# list box char: "); + for(i=0;inum_ac && itas[i]) + fprintf(stderr," %s(%d)", px->tas[i] ,px->wac[i]); + else + fprintf(stderr," %s(%d)",decode(px->tac[i],ASCII),px->wac[i]); + } + fprintf(stderr,"\n"); + if (px->dots && px->m2 && px->m1m1; dy=px->y1-yy0+1; } + } + tx=dx/80+1; + ty=dy/40+1; /* step, usually 1, but greater on large maps */ + fprintf(stderr,"# list pattern x= %4d %4d d= %3d %3d t= %d %d\n", + x0,y0,dx,dy,tx,ty); + if (dx>0) + for(y=yy0;yp,x2-x0+px->x0, + y2-y0+px->y0)num_frames) { /* mark vectors */ + int i; + if (c1!='$' && c1!='S') /* dont mark twice */ + for (i=0;inum_frame_vectors[px->num_frames-1];i++) + if ((px->frame_vector[i][0]-px->x0)/tx==(x-x0)/tx + && (px->frame_vector[i][1]-px->y0)/ty==(y-y0)/ty) + { c1=((c1=='@')?'$':'S'); break; } + } + fprintf(stderr,"%c", c1 ); + } + + /* 2nd image is the boxframe in the original bitmap */ + if (dx<40) fprintf(stderr," "); + if (dx<40) /* do it only, if we have enough place */ + for(x=x0;xy0==px->m1 || y-y0+px->y0==px->m2 + || y-y0+px->y0==px->m3 || y-y0+px->y0==px->m4) c1='<'; + if (y==y0 || y==yy0+dy-1) c2='-'; /* boxmarks */ + + fprintf(stderr,"%c%c\n",c1,c2); + } +} + +/* same as out_b, but for faster use, only a box as argument + */ +void out_x(struct box *px) { + out_b(px,NULL,0, 0, 0, 0, JOB->cfg.cs); +} + + +/* print out two boxes side by side, for debugging comparision algos */ +void out_x2(struct box *box1, struct box *box2){ + int x,y,i,tx,ty,dy; + /*FIXME jb static*/static char *c1="OXXXXxx@.,,,,,,,"; + pix *b=&JOB->src.p; + dy=(box1->y1-box1->y0+1); + if(dyy1-box2->y0+1)dy=box2->y1-box2->y0+1; + tx=(box1->x1-box1->x0)/40+1; + ty=(box1->y1-box1->y0)/40+1; /* step, usually 1, but greater on large maps */ + if(box2)fprintf(stderr,"\n# list 2 patterns"); + for(i=0;iy0+i; + for(x=box1->x0;x<=box1->x1;x+=tx) + fprintf(stderr,"%c", c1[ ((getpixel(b,x,y)cfg.cs)?0:8)+marked(b,x,y) ] ); + if(!box2) continue; + fprintf(stderr," "); y=box2->y0+i; + for(x=box2->x0;x<=box2->x1;x+=tx) + fprintf(stderr,"%c", c1[ ((getpixel(b,x,y)cfg.cs)?0:8)+marked(b,x,y) ] ); + } +} + + +/* ---- list output ---- for debugging --- + * list all boxes where the results can be found within the c-option + */ +int output_list(job_t *job) { + int i = 0, j; + struct box *box2; + pix *pp = &job->src.p; + char *lc = job->cfg.lc; + + fprintf(stderr,"\n# list shape for charlist %s",lc); + for_each_data(&(JOB->res.boxlist)) { + box2 = (struct box *) list_get_current(&(JOB->res.boxlist)); + for (j=0; jnum_ac; j++) + if (!lc || (box2->tac[j] && strchr(lc, box2->tac[j])) + || (box2->tas[j] && strstr(lc, box2->tas[j]))) break; + if (jnum_ac) + fprintf(stderr,"\n# box found in charlist"); + if (!lc || (strchr(lc, box2->c) && box2->c < 256 && box2->c) + || (strchr(lc, '_') && box2->c==UNKNOWN) /* for compability */ + || jnum_ac ){ /* also list alternative chars */ + if (!pp) pp=box2->p; + fprintf(stderr, + "\n# list shape %3d x=%4d %4d d= %3d %3d vf=%d ac=%d %04x %s", + i, box2->x0, box2->y0, + box2->x1 - box2->x0 + 1, + box2->y1 - box2->y0 + 1, + box2->num_frames, box2->num_ac, + (int)box2->c, /* wchar_t -> char ???? */ + decode(box2->c,ASCII) ); + if (JOB->cfg.verbose & 4) out_x(box2); + } + i++; + } end_for_each(&(JOB->res.boxlist)); + fprintf(stderr,"\n"); + return 0; +} +