#include #include #include #include #include int scan(void); int doblock(FILE *f1); int readlbm(FILE *f1); int showline(int y); int bluecol=1; int backcol=15; char tablex[256]; char tabley[256]; int tablep=0; FILE *out; long f_off[256]; char f_wid[256]; char f_hig[256]; char f_base[256]; long averwid; int avercnt; main(int argc,char *argv[]) { int a; FILE *f1; if(argc==1) { printf("usage: FONT "); return(0); } _setvideomode(_VRES16COLOR); for(a=0;a<256;a++) { f_off[a]=0; f_wid[a]=0; f_hig[a]=0; } avercnt=0; averwid=0; out=fopen(argv[2],"wb"); putw(0x1a1a,out); putw(tablep,out); fwrite(tablex,1,256,out); fwrite(tabley,1,256,out); f1=fopen(argv[1],"rb"); readlbm(f1); { char buf[64]; int x0,y0,x,y,a; for(y0=2;y0<7*8-2;y0+=8) for(x0=0;x0<56*8;x0+=8) { for(a=x=0;x<8;x++) for(y=0;y<8;y++) { if((buf[x+y*8]=_getpixel(x0+x,y0+y))==0) a=1; } if(a) { tablex[tablep]=x0/8; tabley[tablep++]=(y0-2)/8; for(y=0;y<8;y++) { for(a=x=0;x<8;x++) { if(!buf[x+y*8]) a+=128>>x; } putc(a,out); } _setcolor(15); } else _setcolor(8); _setpixel(x0,y0); } } getch(); fclose(f1); fseek(out,0L,SEEK_SET); putw(0x1a1a,out); putw(tablep,out); fwrite(tablex,1,256,out); fwrite(tabley,1,256,out); fclose(out); _setvideomode(_DEFAULTMODE); printf("tablecount:%i",tablep); } unsigned char linebuf[1024]; unsigned char pal[768]; int showline(int y) { int x; for(x=0;x<640;x++) { _setcolor(linebuf[x]); _setpixel(x,y); } return(0); } int cbits[8]={1,2,4,8,16,32,64,128}; int lbmmode; /* 1=DPII, 2=DPIIe */ char *errtxt; char lasttype[5]; char type[5]={"----"}; long len; int xsz,ysz,planes,stencil,colors,mode; char lbmtype[4]; int checktype=0; int eschit(void) { if(kbhit()) { if(getch()==27) return(1); } return(0); } int getaw(FILE *f1) { unsigned int a; a=getc(f1)*256; a+=getc(f1); return(a); } int readlbm(FILE *f1) { int x,y,a,b,c; long l; unsigned u; int firstone=1; errtxt=NULL; do { memcpy(lasttype,type,5); /* get header */ do { type[0]=getc(f1); } while(type[0]==0 && !feof(f1)); type[1]=getc(f1); type[2]=getc(f1); type[4]=0; type[3]=getc(f1); len=getc(f1)*256L*65536L; if(firstone && memcmp(type,"FORM",4)) return(2); firstone=0; len+=getc(f1)*65536L; len+=getc(f1)*256L; len+=getc(f1); /* process it */ a=doblock(f1); if(errtxt!=NULL) { printf("%s\n",errtxt); return(1); } if(a==-1) { printf("Not a Deluxepaint file!"); return(2); } if(a==2) { printf("OLD:<%s> NEW<%s>\n",lasttype,type); return(1); } else if(a==1) break; } while(!feof(f1)); return(0); } int doblock(FILE *f1) { /* processes one block */ long lastpos=ftell(f1); int a,b,c,d,e,f; if(!strcmp(type,"CMAP")) { /* color map */ for(b=0;b127) { c=getc(f1); a=256-a; if(a==0) c=0; for(b=0;b<=a;b++) linebuf[lp++]=c; } else { for(b=0;b<=a;b++) { c=getc(f1); linebuf[lp++]=c; } } } } showline(y); y++; } return(1); } else if(!strcmp(type,"BODY") && lbmmode==1) { int lp,cbit,y=0; while(!eschit() && y127) { c=getc(f1); a=256-a; if(a==0) c=0; for(b=0;b<=a;b++) { linebuf[lp++]|=c&128?cbit:0; linebuf[lp++]|=c&64?cbit:0; linebuf[lp++]|=c&32?cbit:0; linebuf[lp++]|=c&16?cbit:0; linebuf[lp++]|=c&8?cbit:0; linebuf[lp++]|=c&4?cbit:0; linebuf[lp++]|=c&2?cbit:0; linebuf[lp++]|=c&1?cbit:0; } } else { for(b=0;b<=a;b++) { c=getc(f1); linebuf[lp++]|=c&128?cbit:0; linebuf[lp++]|=c&64?cbit:0; linebuf[lp++]|=c&32?cbit:0; linebuf[lp++]|=c&16?cbit:0; linebuf[lp++]|=c&8?cbit:0; linebuf[lp++]|=c&4?cbit:0; linebuf[lp++]|=c&2?cbit:0; linebuf[lp++]|=c&1?cbit:0; } } } } if(stencil) for(lp=0;lp127) { c=getc(f1); a=256-a; lp+=a*8+8; } else { for(b=0;b<=a;b++) { c=getc(f1); } lp+=a*8+8; } } showline(y); y++; } return(1); } else if(checktype) { return(2); } fseek(f1,lastpos+len,SEEK_SET); return(0); } int letter(int chr,int x,int y) { int basey; int x1,y1,x2,y2,a,c=1; x1=x2=x; y1=y2=y; /* expand box */ while(c) { c=0; for(a=x1;a<=x2;a++) { if(y1>=0 && _getpixel(a,y1)!=backcol) { y1--; c=1; } if(y2<=479 && _getpixel(a,y2)!=backcol) { y2++; c=1; } } for(a=y1;a<=y2;a++) { if(x1>=0 && _getpixel(x1,a)!=backcol) { x1--; c=1; } if(x2<=639 && _getpixel(x2,a)!=backcol) { x2++; c=1; } } if(x1<=0 || y1<=0 || x2>=639 || y2>=479) exit(1); } basey=y-y1; /* erase blue */ for(y=y1;y<=y2;y++) for(x=x1;x<=x2;x++) { if(_getpixel(x,y)==bluecol) { _setcolor(backcol); _setpixel(x,y); } } /* save font */ { avercnt++; averwid+=x2-x1+1; f_wid[chr]=x2-x1+1; f_hig[chr]=y2-y1+1; f_base[chr]=basey; f_off[chr]=ftell(out); for(y=y1;y<=y2;y++) for(x=x1;x<=x2;x++) { if(_getpixel(x,y)!=backcol) putc(1,out); else putc(0,out); } } /* erase box */ _setcolor(backcol); _rectangle(_GFILLINTERIOR,x1,y1,x2,y2); return(0); } unsigned char order[256]={ "!\"#$%&'()*+,-./0123456789:;<=>?" "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_" "`abcdefghijklmnopqrstuvwxyz{|}~" "ЏЋ™†„”" "абвгдежзийклмноп"}; int scan(void) { int y,x,a=0; for(y=0;y<480;y++) if((bluecol=_getpixel(0,y))!=backcol) { for(x=1;x<640;x++) if(_getpixel(x,y)!=backcol) { if(letter(order[a++],x,y)) return(1); } } return(0); }