|
|
1.1 root 1: #include <jerq.h>
2: /*
3: * Images are encoded as arrays of characters, and interpreted into
4: * bitmaps by buildimage(). The coordinate system has (0,0) at the
5: * "location" of the object.
6: *
7: * Operators are:
8: * 'R' minimum enclosing rectangle (must be first!)
9: * 'p' point
10: * 'r' rectf
11: * 's' segment
12: * 'm' moveto
13: * 'l' lineto
14: * 0 end
15: *
16: * All objects are drawn with F_OR.
17: */
18: Point
19: pscale(p)
20: Point p;
21: {
22: #define o Drect.origin
23: #define c Drect.corner
24: p.x=muldiv(c.x-o.x, p.x, Drect.corner.x);
25: p.y=muldiv(c.y-o.y, p.y, Drect.corner.y);
26: #undef c
27: #undef o
28: return p;
29: }
30: Rectangle
31: rscale(r)
32: Rectangle r;
33: {
34: r.origin=pscale(r.origin);
35: r.corner=pscale(r.corner);
36: return r;
37: }
38: /*
39: * Reduce *p to be on the screen
40: */
41: onscreen(p)
42: register Point *p;
43: {
44: p->x%=Drect.corner.x;
45: p->y%=Drect.corner.y;
46: if(p->x < 0)
47: p->x+=Drect.corner.x;
48: if(p->y < 0)
49: p->y+=Drect.corner.y;
50: }
51: Bitmap *
52: buildimage(s)
53: register char *s;
54: {
55: register Bitmap *b=0;
56: Rectangle r;
57: Point p, curpt;
58: if(sext(*s++) != 'R')
59: quit();
60: r.origin.x= sext(*s++);
61: r.origin.y= sext(*s++);
62: r.corner.x= sext(*s++);
63: r.corner.y= sext(*s++);
64: b=balloc(rscale(r));
65: if(b==0)
66: quit();
67: rectf(b, b->rect, F_CLR);
68: for(;;){
69: switch(sext(*s++)){
70: case 'p':
71: p.x= sext(*s++);
72: p.y= sext(*s++);
73: point(b, pscale(p), F_OR);/**/
74: break;
75: case 'r':
76: r.origin.x= sext(*s++);
77: r.origin.y= sext(*s++);
78: r.corner.x= sext(*s++);
79: r.corner.y= sext(*s++);
80: rectf(b, rscale(r), F_OR);/**/
81: break;
82: case 's':
83: r.origin.x= sext(*s++);
84: r.origin.y= sext(*s++);
85: r.corner.x= sext(*s++);
86: r.corner.y= sext(*s++);
87: r=rscale(r);
88: segment(b, r.origin, r.corner, F_OR);/**/
89: break;
90: case 'm':
91: p.x= sext(*s++);
92: p.y= sext(*s++);
93: curpt=pscale(p);/**/
94: break;
95: case 'l':
96: p.x= sext(*s++);
97: p.y= sext(*s++);
98: p=pscale(p);
99: segment(b, curpt, p, F_OR);/**/
100: curpt=p;
101: break;
102: case 0:
103: return b;
104: }
105: }
106: }
107:
108: sext(c)
109: register c;
110: {
111: if(c&0x80) c |= 0xFFFFFF00;
112: return(c);
113: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.