Subversion Repositories wimsdev

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
10 reyssat 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 {
1122 bpr 55
        if(varcnt>=MAX_VARS || varnameptr>=varnamebuf+sizeof(varnamebuf)-1) return;
3718 reyssat 56
        ovlstrcpy(varnameptr,p);
10 reyssat 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;
3718 reyssat 85
    else ovlstrcpy(p,pp+1);
10 reyssat 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;
1024 bpr 152
    for(i=0;i<cnt*2 && i<MAX_PARMS;i+=2) {
10 reyssat 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];}
1024 bpr 158
        scale_buf[i]=x+transx; scale_buf[i+1]=y+transy;
10 reyssat 159
        ibuf[i]=rint((x-xstart+transx)*xscale);
160
        ibuf[i+1]=rint((y-ystart+transy)*yscale);
161
        if(ibuf[i]<-BOUND) ibuf[i]=-BOUND;if(ibuf[i]>BOUND) ibuf[i]=BOUND;
162
        if(ibuf[i+1]<-BOUND) ibuf[i+1]=-BOUND;if(ibuf[i+1]>BOUND) ibuf[i+1]=BOUND;
163
    }
164
}
165
 
166
        /* scale without displacement */
167
void scale2(double xin, double yin, double *xout, double *yout)
168
{
169
    if(transform) {
170
        *xout=xin*matrix[0]+yin*matrix[1];
171
        *yout=xin*matrix[2]+yin*matrix[3];
172
    }
173
    else {
174
        *xout=xin; *yout=yin;
175
    }
176
    *xout*=xscale; *yout*=yscale;
177
}
178