Subversion Repositories wimsdev

Rev

Blame | Last modification | View Log | RSS feed

  1. /*    Copyright (C) 1998-2003 XIAO, Gang of Universite de Nice - Sophia Antipolis
  2.  *
  3.  *  This program is free software; you can redistribute it and/or modify
  4.  *  it under the terms of the GNU General Public License as published by
  5.  *  the Free Software Foundation; either version 2 of the License, or
  6.  *  (at your option) any later version.
  7.  *
  8.  *  This program is distributed in the hope that it will be useful,
  9.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11.  *  GNU General Public License for more details.
  12.  *
  13.  *  You should have received a copy of the GNU General Public License
  14.  *  along with this program; if not, write to the Free Software
  15.  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  16.  */
  17.         /* line input / output / translation routines
  18.          * and error routines */
  19.  
  20. void error(char *p)
  21. {
  22.     fprintf(stderr,"%s %d\n",p,linecnt);
  23. }
  24.  
  25.         /* Get a line in a stored working file.
  26.          * Buffer length is always MAX_LINELEN. */
  27. int ggetline(char buf[])
  28. {
  29.     int c;
  30.     int i;
  31.     for(i=0,c=getchar();i<MAX_LINELEN;i++,c=getchar()) {
  32.         if(c=='\n' || c==EOF) break;
  33.         buf[i]=c;
  34.     }
  35.     buf[i]=0;
  36.     if(linecnt!=-100000) linecnt++;
  37.     return c;
  38. }
  39.  
  40. double getvar(char *p)
  41. {
  42.     int i;
  43.     for(i=0;i<varcnt && strcmp(p,vartab[i].name)!=0;i++);
  44.     if(i<varcnt) return vartab[i].value;
  45.     else return 0;
  46. }
  47.  
  48. void setvar(char *p, double v)
  49. {
  50.     int i;
  51.     if((strlen(p)>2 && strcmp(p,"animstep")!=0) || !isalpha(*p)) return;
  52.     for(i=0;i<varcnt && strcmp(p,vartab[i].name)!=0;i++);
  53.     if(i<varcnt) {vartab[i].value=v; return;}
  54.     else {
  55.         if(varcnt>=MAX_VARS || varnameptr>=varnamebuf+MAX_NAMELEN+1) return;
  56.         strcpy(varnameptr,p);
  57.         vartab[varcnt].name=varnameptr; vartab[varcnt].value=v;
  58.         varnameptr+=strlen(varnameptr)+1; (varcnt)++;
  59.     }
  60. }
  61.  
  62.         /* Points to the end of a name */
  63. char *find_name_end(char *p)
  64. {
  65.     int i;
  66.     for(i=0;isalnum(*p) && i<MAX_LINELEN; p++,i++);
  67.     return p;
  68. }
  69.  
  70.         /* Find the beginning of a name */
  71. char *find_name_start(char *p)
  72. {
  73.     int i;
  74.     for(i=0; !isalpha(*p) && i<MAX_LINELEN; p++,i++);
  75.     return p;
  76. }
  77.  
  78. void collapse_item(char *p, int n)
  79. {
  80.     int i;
  81.     char *pp;
  82.     if(n<1) return;
  83.     for(i=1,pp=strchr(p,','); i<n && pp!=NULL; i++,pp=strchr(pp+1,','));
  84.     if(pp==NULL) *p=0;
  85.     else strcpy(p,pp+1);
  86. }
  87.  
  88. int getcolor(int r, int g, int b)
  89. {
  90.     int col;
  91.     if(r>255) r=255; if(r<0) r=0;
  92.     if(g>255) g=255; if(g<0) g=0;
  93.     if(b>255) b=255; if(b<0) b=0;
  94.     col=gdImageColorExact(image, r, g, b);
  95.     if(col==-1) col=gdImageColorAllocate(image,r,g,b);
  96.     return col;
  97. }
  98.  
  99. int widthcolor(int w, int color)
  100. {
  101.     int bg,fg,sh,e;
  102.             /* already allocated */
  103.     if(wimg!=NULL && savew==w && wcolor==color) goto end;
  104.     if(wimg!=NULL) gdImageDestroy(wimg);
  105.     wimg=gdImageCreate(w,w);
  106.     if(wimg==NULL) {
  107.         error("width_creation_failure"); return color;
  108.     }
  109.     bg=gdImageColorAllocate(wimg,255,255,255);
  110.     gdImageColorTransparent(wimg,bg);
  111.     fg=gdImageColorAllocate(wimg,gdImageRed(image,color),
  112.                             gdImageGreen(image,color),
  113.                             gdImageBlue(image,color));
  114.     e=w-1;sh=e/3;
  115.     switch(w) {
  116.         case 2: {
  117.             gdImageFill(wimg,0,0,fg); break;
  118.         }
  119.         case 3: {
  120.             gdImageFill(wimg,0,0,fg);
  121.             gdImageSetPixel(wimg,2,0,bg);gdImageSetPixel(wimg,2,2,bg);
  122.             break;
  123.         }
  124.         case 4:
  125.         case 5:
  126.         case 6:
  127.         case 7:
  128.         case 8:
  129.         case 9:
  130.         case 10:
  131.         case 11:
  132.         case 12: {
  133.             int pl[]={0,sh, sh,0, e-sh,0, e,sh,
  134.                   e,e-sh, e-sh,e, sh,e, 0,e-sh};
  135.             gdImageFilledPolygon(wimg,(gdPointPtr) pl,8,fg);
  136.             break;
  137.         }
  138.         default: {
  139.             gdImageArc(wimg,w/2,w/2,w,w,0,360,fg);
  140.             gdImageFillToBorder(wimg,w/2,w/2,fg,fg);
  141.             break;
  142.         }
  143.     }
  144.     savew=w; wcolor=color;
  145.     end: gdImageSetBrush(image,wimg); return gdBrushed;
  146. }
  147.  
  148.         /* scale coordinates, x then y */
  149. void scale(double dbuf[], int ibuf[], int cnt)
  150. {
  151.     int i; double x,y;
  152.     for(i=0;i<cnt*2;i+=2) {
  153.         if(transform) {
  154.             x=dbuf[i]*matrix[0]+dbuf[i+1]*matrix[1];
  155.             y=dbuf[i]*matrix[2]+dbuf[i+1]*matrix[3];
  156.         }
  157.         else {x=dbuf[i]; y=dbuf[i+1];}
  158.         ibuf[i]=rint((x-xstart+transx)*xscale);
  159.         ibuf[i+1]=rint((y-ystart+transy)*yscale);
  160.         if(ibuf[i]<-BOUND) ibuf[i]=-BOUND;if(ibuf[i]>BOUND) ibuf[i]=BOUND;
  161.         if(ibuf[i+1]<-BOUND) ibuf[i+1]=-BOUND;if(ibuf[i+1]>BOUND) ibuf[i+1]=BOUND;
  162.     }
  163. }
  164.  
  165.         /* scale without displacement */
  166. void scale2(double xin, double yin, double *xout, double *yout)
  167. {
  168.     if(transform) {
  169.         *xout=xin*matrix[0]+yin*matrix[1];
  170.         *yout=xin*matrix[2]+yin*matrix[3];
  171.     }
  172.     else {
  173.         *xout=xin; *yout=yin;
  174.     }
  175.     *xout*=xscale; *yout*=yscale;
  176. }
  177.  
  178.