/* verctorop.c vectorization routine for stscan.c */ #include #include #include #include #include #include #include #include #include #include #include #include #include "stscan.h" #define REGION_SIZE 64 #define CHAINLEN 16384 static UWORD chpixels[2][CHAINLEN]; static UWORD lnpixels[2][CHAINLEN]; static UWORD regio_x[128][128]; static UWORD regio_y[128][128]; static UBYTE regio_done[128][128]; static UBYTE regio_numx,regio_numy; static char str_filenam[REQ_FCHARS+REQ_DSIZE]=""; static UWORD maxdiff=4; static UBYTE getpixel(UWORD x,UWORD y) { return((*(memptr+(ULONG)y*(ULONG)membpl+(ULONG)(x>>3))&bitval[x&7])?0:1); } static void clrpixel(UWORD x,UWORD y) { *(memptr+(ULONG)y*(ULONG)membpl+(ULONG)(x>>3))|=bitval[x&7]; } static void setpixel(UWORD x,UWORD y) { *(memptr+(ULONG)y*(ULONG)membpl+(ULONG)(x>>3))&=invbitval[x&7]; } static UBYTE subiter(UWORD nx,UWORD ny) { UWORD x,y; UBYTE f,vw,vnw,vn,vne,ve,vse,vs,vsw; f=0; for (y=regio_y[nx][ny];y>3); pgofs1=(memwidth>>3)*(memheight-1); for (i=0;i<(memwidth>>3);i++) { *(memptr+i)=255; *(memptr+pgofs1+i)=255; } pgofs1=0; pgofs2=membpl-1; for (i=0;iydiff) { sum=xdiff/2; while (x0!=x1) { x0+=xstep; sum-=ydiff; if (sum<0) { y0+=ystep; sum+=xdiff; } lnpixels[0][i]=x0; lnpixels[1][i]=y0; i++; } } else { sum=ydiff/2; while (y0!=y1) { y0+=ystep; sum-=xdiff; if (sum<0) { x0+=xstep; sum+=ydiff; } lnpixels[0][i]=x0; lnpixels[1][i]=y0; i++; } } return(i); } static void polygon(UWORD startpos,UWORD len,FILE *vecfile) { UWORD sx0,sy0,sx1,sy1,m,n,s,lnlen,cbdist,mcbdist,mdpos; sx0=chpixels[0][startpos]; sy0=chpixels[1][startpos]; sx1=chpixels[0][startpos+len-1]; sy1=chpixels[1][startpos+len-1]; lnlen=getline(sx0,sy0,sx1,sy1); mdpos=0; mcbdist=0; s=len/lnlen; if (s<1) s=1; for(m=0,n=startpos;mmcbdist) { mdpos=m; mcbdist=cbdist; } } if (mcbdist>maxdiff) { polygon(startpos,mdpos,vecfile); polygon(startpos+mdpos,len-mdpos,vecfile); } else { fprintf(vecfile,"%d %d\n",sx0,memheight-sy0); fprintf(vecfile,"%d %d\n\n",sx1,memheight-sy1); } } void vectorize() { UWORD p,x,y,len; FILE *vecfile; char wtitel[80]; if (filerequest("Save Vector TXT File",str_filenam)) { p=0; membpl=(memwidth>>3); vecfile=fopen(str_filenam,"w"); for (y=1;ypr_WindowPtr; OurTask->pr_WindowPtr = win; memset(&gnum,0,sizeof(gnum)); gnum.titlebar = "Enter vectorization accuracy."; gnum.defaultval = maxdiff; gnum.minlimit = 2; gnum.maxlimit = 100; if (GetLong(&gnum)) maxdiff=gnum.result; OurTask->pr_WindowPtr = old_pr_WindowPtr; }