#include #include #include #include "kg.h" #include "gd.h" #define D90 (3.14159265/2) /* color map -- black < blue < green < red < white */ static unsigned char KG_ecol01[384]={ 0,0,0, 12,0,12, 24,0,24, 36,0,37, 48,0,49, 59,0,61, 70,0,74, 80,0,85, 89,0,97, 98,0,109, 105,0,120, 112,0,131, 117,0,141, 121,0,151, 124,0,161, 126,0,171, 127,0,180, 126,0,188, 124,0,197, 121,0,204, 117,0,212, 112,0,218, 105,0,224, 98,0,230, 89,0,235, 80,0,240, 70,0,244, 59,0,247, 48,0,250, 36,0,252, 24,0,253, 12,0,254, 0,0,255, 9,12,254, 18,24,254, 27,37,252, 36,49,251, 44,61,248, 52,74,246, 60,85,243, 67,97,239, 73,109,235, 78,120,230, 83,131,225, 87,141,219, 90,151,213, 93,161,207, 94,171,200, 95,180,193, 94,188,185, 93,197,177, 90,204,168, 87,212,159, 83,218,149, 78,224,139, 73,230,129, 67,235,118, 60,240,106, 52,244,94, 44,247,82, 36,250,68, 27,252,54, 18,253,39, 9,254,22, 0,255,0, 41,254,9, 63,254,18, 80,253,27, 95,252,36, 109,251,44, 121,249,52, 132,247,60, 143,245,67, 153,242,73, 162,239,78, 171,236,83, 179,232,87, 186,228,90, 194,224,93, 200,219,94, 207,214,95, 213,208,94, 218,203,93, 223,196,90, 228,190,87, 232,182,83, 236,175,78, 240,166,73, 243,157,67, 245,148,60, 248,137,52, 250,125,44, 252,112,36, 253,97,27, 254,79,18, 254,56,9, 255,0,0, 254,0,12, 254,0,24, 254,0,37, 254,0,49, 253,0,61, 253,0,74, 252,0,85, 251,0,97, 250,0,109, 249,0,120, 248,0,131, 247,0,141, 245,0,151, 244,0,161, 242,0,171, 241,0,180, 242,24,188, 244,49,197, 245,74,204, 247,97,212, 248,120,218, 249,141,224, 250,161,230, 251,180,235, 252,197,240, 253,212,244, 253,224,247, 254,235,250, 254,244,252, 254,250,253, 254,253,254}; static char *fileseq[]={ /*00*/ "%%EndComments", /*01*/ "/xpdict 40 dict def", /*02*/ "xpdict begin", /*03*/ "/MD {", /*04*/ " moveto lineto", /*05*/ " stroke", /*06*/ "} bind def", /*07*/ "/FB {", /*08*/ " newpath", /*09*/ " moveto rlineto rlineto rlineto closepath", /*10*/ " fill", /*11*/ "} bind def", /*12*/ "/LS {", /*13*/ " moveto show", /*14*/ "} bind def", /*15*/ "/RS {", /*16*/ " moveto", /*17*/ " dup stringwidth neg exch neg exch", /*18*/ " rmoveto show", /*19*/ "} bind def", /*20*/ "/CS {", /*21*/ " moveto dup stringwidth", /*22*/ " 2 div neg exch 2 div neg exch", /*23*/ " rmoveto show", /*24*/ "} bind def", /*25*/ "/0g { 0 setgray } bind def", /*26*/ "end", /*27*/ "%%EndProlog", /*28*/ "xpdict begin", /*29*/ "gsave", /*30*/ "0 0 translate", /*31*/ "1.0 1.0 scale"}; /* 595 842(A4) */ /* public variables */ int col[128]; /* color number for default mapped color */ int white; /* color number for white */ int black; /* color number for black */ int red; /* color number for red */ int green; /* color number for green */ int blue; /* color number for blue */ int pwhite; /* color number for pseudo white (black in eps) */ int pblack; /* color number for pseudp black (white in eps) */ int yellow; /* color number for yellow */ int cyan; /* color number for cyan */ int magenta; /* color number for magenta */ int gray; /* color number for gray */ int lgray; /* color number for light gray */ int dgray; /* color number for dark gray */ /* private variables */ static int KG_output; /* output format (0:PNG,1:EPS) */ static gdImagePtr KG_im; /* pointer for GD */ static int KG_w,KG_h; /* image size */ static FILE *KG_fp; /* pointer for output file*/ static int KG_colormap; /* color map select (0:none,1:color,2:gray) */ static int KG_cm[512][3]; /* color map contens */ static int KG_cc=0; /* color map counter */ static int KG_c=-1; /* buffer (minimumize change of color) */ static int KG_f=-1; /* buffer (minimumize change of font) */ static char KG_ttf[64]="./lib/times.ttf"; int KGcolormap(int r,int g,int b) { switch (KG_output) { case 0: return(gdImageColorAllocate(KG_im,r,g,b)); case 1: KG_cm[KG_cc][0]=r; KG_cm[KG_cc][1]=g; KG_cm[KG_cc][2]=b; KG_cc++; return(KG_cc-1); } } void KGopen(int w,int h,char *color,char *output,FILE *fp) { int i,c; KG_cc=0;KG_c=-1;KG_f=-1; KG_w=w;KG_h=h;KG_fp=fp; switch (output[0]) { case 'p':case 'g':KG_output=0;break; /* png */ case 'e': KG_output=1;break; /* eps */ case 'x': KG_output=2;break; /* X */ } switch (KG_output) { case 0: KG_im=gdImageCreate(w,h); break; case 1: fprintf(KG_fp,"%%!PS-Adobe-2.0 EPSF-2.0\n"); fprintf(KG_fp,"%%%%Creator:\n"); fprintf(KG_fp,"%%%%BoundingBox: 0 0 %d %d\n",w,h); for (i=0;i<32;i++) fprintf(KG_fp,"%s\n",fileseq[i]); break; } white=KGcolormap(255,255,255); black=KGcolormap( 0, 0, 0); switch (color[0]) { case 'n':KG_colormap=0;break; /* none */ case 'm':KG_colormap=1;break; /* mono */ case 'c':KG_colormap=2;break; /* color */ case 'g':KG_colormap=3;break; /* gray */ case 'a':KG_colormap=4;break; /* ar */ case 'p':KG_colormap=5;break; /* phase */ } switch (KG_colormap) { case 0: case 1: for (i=0;i<128;i++) col[i]=black; break; case 2: for (i=0;i<128;i++) col[i]=KGcolormap(KG_ecol01[3*i],KG_ecol01[3*i+1],KG_ecol01[3*i+2]); break; case 3: for (i=0;i<128;i++) {c=(248*(127-i))/127;col[i]=KGcolormap(c,c,c);} break; case 4: for (i=0;i<64;i++) {c=i*4;col[i ]=KGcolormap(c ,255,0);} for (i=0;i<64;i++) {c=i*4;col[127-i]=KGcolormap(255,c ,0);} break; case 5: for (i=0;i<22;i++) {c=i*12;col[i ]=KGcolormap(0 ,c ,255 );} for (i=0;i<21;i++) {c=i*12;col[i+ 22]=KGcolormap(0 ,255 ,255-c);} for (i=0;i<22;i++) {c=i*12;col[i+ 43]=KGcolormap(c ,255 ,0 );} for (i=0;i<21;i++) {c=i*12;col[i+ 65]=KGcolormap(255 ,255-c,0 );} for (i=0;i<21;i++) {c=i*12;col[i+ 86]=KGcolormap(255 ,0 ,c );} for (i=0;i<21;i++) {c=i*12;col[i+107]=KGcolormap(255-c,0 ,255 );} break; } switch (KG_colormap) { case 1: case 3: red =KGcolormap(0,0,0); green =KGcolormap(0,0,0); blue =KGcolormap(0,0,0); yellow =KGcolormap(0,0,0); cyan =KGcolormap(0,0,0); magenta=KGcolormap(0,0,0); gray =KGcolormap(128,128,128); lgray =KGcolormap(192,192,192); dgray =KGcolormap( 64, 64, 64); break; default: red =KGcolormap(255, 0, 0); green =KGcolormap( 0,255, 0); blue =KGcolormap( 0, 0,255); yellow =KGcolormap(255,255, 0); cyan =KGcolormap( 0,255,255); magenta=KGcolormap(255, 0,255); gray =KGcolormap(128,128,128); lgray =KGcolormap(192,192,192); dgray =KGcolormap( 64, 64, 64); break; } switch (KG_output) { case 0: KGbox(0,0,KG_w,KG_h,white); pwhite=white;pblack=black; break; case 1: pwhite=black;pblack=white; break; } } void KGclose(void) { switch (KG_output) { case 0: gdImagePng(KG_im,KG_fp); gdImageDestroy(KG_im); break; case 1: fprintf(KG_fp,"stroke\n"); fprintf(KG_fp,"grestore\n"); fprintf(KG_fp,"end\n"); fprintf(KG_fp,"showpage\n"); fprintf(KG_fp,"%%Trailer\n"); fclose(KG_fp); break; } } void KGlinew(int w) { switch (KG_output) { case 1: fprintf(KG_fp,"%d setlinewidth\n",w); break; } } static void KG_ComC(int c) { if (KG_c!=c) { KG_c=c; switch (KG_colormap) { case 1: case 3: if (c==red) fprintf(KG_fp,"[2 2] 0 setdash\n"); else if (c==green) fprintf(KG_fp,"[2 4] 0 setdash\n"); else if (c==blue) fprintf(KG_fp,"[4 2] 0 setdash\n"); else if (c==yellow) fprintf(KG_fp,"[4 2 2 2] 0 setdash\n"); else if (c==cyan) fprintf(KG_fp,"[4 2 2 2 2 2] 0 setdash\n"); else if (c==magenta) fprintf(KG_fp,"[4 2 2 2 2 2 2 2] 0 setdash\n"); else fprintf(KG_fp,"[] 0 setdash\n"); break; } if ((KG_cm[c][0]==KG_cm[c][1])&&(KG_cm[c][0]==KG_cm[c][2])) fprintf(KG_fp,"%lf setgray\n",(double)KG_cm[c][0]/255.0); else fprintf(KG_fp,"%lf %lf %lf setrgbcolor\n", (double)KG_cm[c][0]/255.0, (double)KG_cm[c][1]/255.0, (double)KG_cm[c][2]/255.0); } } static void KG_ComF(int f) { if (KG_f!=f) { KG_f=f; fprintf(KG_fp,"/font /Times-Roman findfont def\n"); fprintf(KG_fp,"font %d scalefont setfont\n",f); } } void KGline(int x0,int y0,int x1,int y1,int c) { switch (KG_output) { case 0: gdImageLine(KG_im,x0,y0,x1,y1,c); break; case 1: KG_ComC(c); fprintf(KG_fp,"%d %d %d %d MD\n",x0,KG_h-y0,x1,KG_h-y1); break; } } void KGarc(int x,int y,int rw,int rh,int as,int ae,int c) { switch (KG_output) { case 0: gdImageArc(KG_im,x,y,rw,rh,as,ae,c); break; case 1: KG_ComC(c); fprintf(KG_fp,"newpath\n"); fprintf(KG_fp,"%d %d %d %d %d arc\n",x,KG_h-y,rw/2,as,ae); fprintf(KG_fp,"stroke\n"); break; } } void KGpngfont(char *str) { sprintf(KG_ttf,"%s",str); } void KGstring(int font,int x,int y,int orig,char *str,int c) { int x0,y0; char xx; static int br[8]; switch (KG_output) { case 0: if (orig>0) gdImageStringTTF(NULL,br,0,KG_ttf,font*0.9,0.0,0,0,str); else gdImageStringTTF(NULL,br,0,KG_ttf,font*0.9,D90,0,0,str); //if (orig>0) gdImageStringFT(NULL,br,0,KG_ttf,font*0.9,0.0,0,0,str); //else gdImageStringFT(NULL,br,0,KG_ttf,font*0.9,D90,0,0,str); switch (orig) { case 1:x0=x- br[0] ;y0=y- br[1] ;break; case 2:x0=x-(br[0]+br[4])/2;y0=y- br[1] ;break; case 3:x0=x- br[4] ;y0=y- br[1] ;break; case 4:x0=x- br[0] ;y0=y-(br[1]+br[5])/2;break; case 5:x0=x-(br[0]+br[4])/2;y0=y-(br[1]+br[5])/2;break; case 6:x0=x- br[4] ;y0=y-(br[1]+br[5])/2;break; case 7:x0=x- br[0] ;y0=y- br[5] ;break; case 8:x0=x-(br[0]+br[4])/2;y0=y- br[5] ;break; case 9:x0=x- br[4] ;y0=y- br[5] ;break; case -1:x0=x- br[0] ;y0=y- br[1] ;break; case -2:x0=x- br[0] ;y0=y-(br[1]+br[5])/2;break; case -3:x0=x- br[0] ;y0=y- br[5] ;break; case -4:x0=x-(br[0]+br[4])/2;y0=y- br[1] ;break; case -5:x0=x-(br[0]+br[4])/2;y0=y-(br[1]+br[5])/2;break; case -6:x0=x-(br[0]+br[4])/2;y0=y- br[5] ;break; case -7:x0=x- br[4] ;y0=y- br[1] ;break; case -8:x0=x- br[4] ;y0=y-(br[1]+br[5])/2;break; case -9:x0=x- br[4] ;y0=y- br[5] ;break; } if (orig>0) gdImageStringTTF(KG_im,br,c,KG_ttf,font*0.9,0.0,x0,y0,str); else gdImageStringTTF(KG_im,br,c,KG_ttf,font*0.9,D90,x0,y0,str); //if (orig>0) gdImageStringFT(KG_im,br,c,KG_ttf,font*0.9,0.0,x0,y0,str); //else gdImageStringFT(KG_im,br,c,KG_ttf,font*0.9,D90,x0,y0,str); break; case 1: KG_ComC(c);KG_ComF(font); switch (orig) { case 1:xx='L';y0=y ;break; case 2:xx='C';y0=y ;break; case 3:xx='R';y0=y ;break; case 4:xx='L';y0=y+KG_f/2;break; case 5:xx='C';y0=y+KG_f/2;break; case 6:xx='R';y0=y+KG_f/2;break; case 7:xx='L';y0=y+KG_f ;break; case 8:xx='C';y0=y+KG_f ;break; case 9:xx='R';y0=y+KG_f ;break; case -1:xx='L';x0=x ;break; case -2:xx='C';x0=x ;break; case -3:xx='R';x0=x ;break; case -4:xx='L';x0=x+KG_f/2;break; case -5:xx='C';x0=x+KG_f/2;break; case -6:xx='R';x0=x+KG_f/2;break; case -7:xx='L';x0=x+KG_f ;break; case -8:xx='C';x0=x+KG_f ;break; case -9:xx='R';x0=x+KG_f ;break; } if (orig>0) { y0-=KG_f/6; fprintf(KG_fp,"(%s) %d %d %cS\n",str,x,KG_h-y0,xx); } else { x0-=KG_f/6; fprintf(KG_fp,"gsave\n"); fprintf(KG_fp,"90 rotate\n"); fprintf(KG_fp,"(%s) %d %d %cS\n",str,KG_h-y,-x0,xx); fprintf(KG_fp,"grestore\n"); } break; } } void KGbox(int x0,int y0,int x1,int y1,int c) { int xx0,yy0,xx1,yy1; switch (KG_output) { case 0: if (x0<=x1) {xx0=x0;xx1=x1;} else {xx0=x1;xx1=x0;} if (y0<=y1) {yy0=y0;yy1=y1;} else {yy0=y1;yy1=y0;} gdImageFilledRectangle(KG_im,x0,y0,x1,y1,c); break; case 1: KG_ComC(c); fprintf(KG_fp,"%d 0 0 %d %d 0 %.1lf %.1lf FB\n", x0-x1-1,-y1-1+y0,x1-x0+1,x0-0.5,KG_h-y0+0.5); break; } } void KGframe(int x0,int y0,int x1,int y1,int c) { KGline(x0,y0,x1,y0,c); KGline(x0,y1,x1,y1,c); KGline(x0,y0,x0,y1,c); KGline(x1,y0,x1,y1,c); }