/* CLAZ.c v2.0 */ /* by Steve Ludtke */ /* Created : 05/31/87 */ #include #include #include /* define IFF structures */ struct CMAP { UBYTE r,g,b; }; struct BMHD { UWORD w,h; WORD x,y; UBYTE npl; UBYTE masking,compression,pad1; UWORD tcolor; UBYTE xas,yas; WORD pWid,pHig; }; char *malloc(); main (argc,argv) int argc; char *argv[]; { struct BMHD mhd; long *len1,*len2,cnt,rsz,m,h,i,j,k,d,lr,lb,lg,q1,q2,x1,x2,y1,y2,fl; int fl1,b; BYTE t; UBYTE cmap[100]; char *raster,*rp,*fspin,*outfsp,hex[20],msc1[12],q,x,y,c,msc2[8],*misc; FILE *fin,*fout; hex[0]='0'; hex[1]='1'; hex[2]='2'; hex[3]='3'; hex[4]='4'; hex[5]='5'; hex[6]='6'; hex[7]='7'; hex[8]='8'; hex[9]='9'; hex[10]='A'; hex[11]='B'; hex[12]='C'; hex[13]='D'; hex[14]='E'; hex[15]='E'; fl=0; x1=10; y1=10; x2=550; y2=480; /* Get enough memory, figure out filespecs */ raster=malloc(200000); misc=malloc(2000); if (raster==NULL) { printf("Not enough memory.\n"); exit(0); } if (argc<3) outfsp="out.ps"; if (argc>2) outfsp=argv[2]; if (argc>3) { sscanf(argv[3],"%ld",&x1); sscanf(argv[4],"%ld",&y1); sscanf(argv[5],"%ld",&x2); sscanf(argv[6],"%ld",&y2); } if (argc==8 || argc==4) fl|=1; printf("\n\n CLAZ - IFF to POSTSCRIPT converter V2.0\n"); printf(" by Steve Ludtke\n"); printf(" N\251 - No Copyright 1987\n\n"); printf("File in : "); if (argc>1) { fspin=argv[1]; printf("%s\n",fspin); } if (argc==1) { fspin=malloc(80); scanf("%s",fspin); } fin=fopen(fspin,"r"); if (fin==NULL) { printf("Sorry, can't open input file.\n"); exit(0); } if ((fread(msc1,12,1,fin))==0) { printf("Sorry, input file problem #1. \n"); exit (0); } len1=(long *)&msc1[4]; printf("main : %d,%s\n",*len1,msc1); cnt=14; /* *len1=# bytes in file according to IFF */ /* msc2=the name of the current chunk */ /* *len2=# bytes in current chunk */ /* by the way, UNID is symply any chunk the program doesn't deal with */ /* Reads in the IFF file : */ while(cnt < *len1) { fl1=0; if ((fread(msc2,8,1,fin))==0) { printf("Sorry, bad input file. \n"); exit(0); } len2=(long *)&msc2[4]; if (strncmp(msc2,"CMAP",4)==0) { if ((fread(cmap,*len2,1,fin))==0) { printf("Sorry, bad CMAP. \n"); exit(0); } printf("CMAP\n"); fl1=1; } if ((strncmp(msc2,"BMHD",4))==0) { if ((fread(&mhd,*len2,1,fin))==0) { printf("Sorry, bad BMHD. \n"); exit(0); } printf("BMHD\n"); fl1=1; } if (strncmp(msc2,"BODY",4)==0) { printf("BODY\n"); fl1=1; m=0; rp=raster; if (mhd.compression==1) { while (m<=*len2) { t=getc(fin); m++; if (t>=0) { t++; fread(rp,(long) t,1,fin); rp+=t; m+=t; } if (t<0) { t=(-t)+1; c=getc(fin); m++; for (i=0; i1) { printf("Sorry, unknown compression type.\n"); exit(0); } } if (fl1==0) { if (*len2>2000) { printf("Sorry, UNID too long.\n"); exit(0); } if ((fread(misc,*len2,1,fin))==0) { printf("Sorry, UNID bad. \n"); exit(0); } printf("UNID\n"); } cnt+=*len2; cnt+=8; } fclose(fin); free(fspin); if ((fout=fopen(outfsp,"a"))==NULL) { printf("Sorry, cannot open output file.\n"); exit(0); } /* Standard POSTSCRIPT program, the only part following the data is */ /* the showpage command. */ fprintf(fout,"[0 0 0 0 0 0] defaultmatrix setmatrix"); fprintf(fout,"/picstr %d string def\r",mhd.w); fprintf(fout,"%ld %ld translate\r",x1,y1); fprintf(fout,"%ld %ld scale\r",x2,y2); fprintf(fout,"%d %d 4 [%d 0 0 -%d 0 %d]\r",mhd.w,mhd.h,mhd.w,mhd.h,mhd.h); fprintf(fout,"{currentfile picstr readhexstring pop} image\r"); /* calculate and output file */ lb=lr=lg=0; rsz=mhd.w*mhd.h/8; printf("rast size : %d #planes : %d\n",rsz,mhd.npl); for (h=0; h<96; h++) cmap[h]=cmap[h]/16; for (h=0; h=0;k--) { b=0; for(j=0; j>k; c&=1; b|=c; b<<=1; } b>>=1; /* this is for HAM pictures */ if (mhd.npl==6) { c=(b&48)>>4; b&=15; if (c==0) { b*=3; lr=cmap[b]; lb=cmap[b+1]; lg=cmap[b+2]; } if (c==1) lb=b; if (c==2) lr=b; if (c==3) lg=b; } if (mhd.npl!=6) { b&=31; b*=3; lr=cmap[b]; lb=cmap[b+1]; lg=cmap[b+2]; } m=lr+lb+lg; m=m/3; if (m<0) m=0; if (m>14) m=14; putc(hex[m],fout); } } } fprintf(fout,"\r"); /* Hold the 'showpage' if there is an appended character */ if (!(fl&1)) fprintf(fout,"showpage\r"); fclose(fout); printf("Done !!!\n"); free(misc); free(raster); }