|
|
1.1 root 1: /*
2: * jp - interpret pic on jerq
3: */
4:
5: #include <jerq.h>
6: #define YFUDGE 5 /* move chars down this much */
7: extern POINT current;
8: char input[10000];
9: char *ip = input;
10: POINT mpos;
11: POINT scanpoint();
12:
13: main(argc, argv)
14: char *argv[];
15: {
16: jinit();
17: sysinit();
18: spl0();
19: jBonW(); /* black on white */
20: getpic();
21: printpic();
22: for (;;) {
23: if (button1()) {
24: jclear();
25: printpic();
26: } else if (button23()) {
27: jclear();
28: getpic();
29: printpic();
30: }
31: }
32: }
33:
34: getpic()
35: {
36: char temp[10];
37: register char *start, *ip;
38: static POINT pos = {20,20};
39:
40: ip = input;
41: do {
42: start = ip;
43: while ((*ip++ = jgetchar()) != '\n')
44: ;
45: } while (*start != 'S');
46: *ip++ = 0;
47: sprintf(temp, "%d", ip-input);
48: jmoveto(pos);
49: jstring(temp);
50: }
51:
52: printpic()
53: {
54: register int c;
55: int i, n;
56: POINT pos, pos1, pos2;
57: char s[100];
58:
59: mpos = mouse.xy;
60: cursinhibit();
61: for (ip = input; *ip; ) {
62: switch (*ip++) {
63: case ' ':
64: case '\n':
65: case '\t':
66: break;
67: case 'm':
68: pos = scanpoint();
69: jmoveto(add(pos, mpos));
70: break;
71: case 'e':
72: pos = scanpoint();
73: scanint();
74: scanint();
75: break;
76: case 'c':
77: pos = scanpoint();
78: jcircle(add(pos, mpos), scanint(), F_STORE);
79: break;
80: case 'a':
81: pos = add(scanpoint(), mpos);
82: pos2 = add(scanpoint(), mpos);
83: pos1 = add(scanpoint(), mpos);
84: jarc(pos, pos1, pos2, F_STORE);
85: break;
86: case 'l':
87: pos = scanpoint();
88: jmoveto(add(pos, mpos));
89: pos = scanpoint();
90: jlineto(add(pos, mpos), F_STORE);
91: break;
92: case 'b':
93: pos1 = add(scanpoint(), mpos);
94: pos2 = add(scanpoint(), mpos);
95: jmoveto(pos1);
96: pos.x = pos2.x;
97: pos.y = pos1.y;
98: jlineto(pos, F_STORE);
99: jlineto(pos2, F_STORE);
100: pos.x = pos1.x;
101: pos.y = pos2.y;
102: jlineto(pos, F_STORE);
103: jlineto(pos1, F_STORE);
104: break;
105: case 't':
106: pos = scanpoint();
107: while ((c = *ip++) == ' ')
108: ; /* find type */
109: for (i = 0; (s[i++] = *ip++) != '\n'; )
110: ;
111: s[i] = 0;
112: pos.y += YFUDGE;
113: n = strwidth(s);
114: switch (c) {
115: case 'C':
116: pos.x -= n/2;
117: break;
118: case 'L':
119: break;
120: case 'R':
121: pos.x -= n;
122: break;
123: }
124: jmoveto(add(pos, mpos));
125: jstring(s);
126: break;
127: case '~': /* spline, expressed in delta's */
128: dospline();
129: break;
130: default:
131: while (*ip++ != '\n')
132: ;
133: break;
134: }
135: }
136: cursallow();
137: }
138:
139: dospline()
140: {
141: long w, t1, t2, t3;
142: int x[50], y[50];
143: int i, j, xp, yp, n;
144: long scale = 1000;
145: int steps = 10;
146: POINT p;
147:
148: n = scanint();
149: for (i = 1; i <= n; i++) {
150: x[i] = scanint();
151: y[i] = scanint();
152: }
153: x[0] = x[1]; y[0] = y[1];
154: x[n+1] = x[n]; y[n+1] = y[n];
155: p.x = x[0]; p.y = y[0];
156: jmoveto(add(p, mpos));
157:
158: for (i = 0; i < n; i++) {
159: for (j = 0; j < steps; j++) {
160: w = scale * j / steps;
161: t1 = w * w / (2 * scale);
162: w = w - scale/2;
163: t2 = 3*scale/4 - w * w / scale;
164: w = w - scale/2;
165: t3 = w * w / (2*scale);
166: p.x = (t1*x[i+2] + t2*x[i+1] + t3*x[i] + scale/2) / scale;
167: p.y = (t1*y[i+2] + t2*y[i+1] + t3*y[i] + scale/2) / scale;
168: jlineto(add(p, mpos), F_STORE);
169: }
170: }
171: }
172:
173: jclear()
174: {
175: cursinhibit();
176: jrectf(screenmap.rect, F_CLR);
177: cursallow();
178: }
179:
180: POINT
181: scanpoint()
182: {
183: POINT p;
184:
185: p.x = scanint();
186: p.y = scanint();
187: return p;
188: }
189:
190: scanint()
191: {
192: register int n, c;
193:
194: while ((c = *ip++) == ' ' || c == '\t')
195: ;
196: n = 0;
197: do {
198: n = 10 * n + c - '0';
199: } while ((c = *ip++) >= '0' && c <= '9');
200: return(n);
201: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.