xref: /inferno-os/libinterp/geom.c (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1*37da2899SCharles.Forsyth #include "lib9.h"
2*37da2899SCharles.Forsyth #include "interp.h"
3*37da2899SCharles.Forsyth #include "isa.h"
4*37da2899SCharles.Forsyth #include "draw.h"
5*37da2899SCharles.Forsyth #include "runt.h"
6*37da2899SCharles.Forsyth #include "raise.h"
7*37da2899SCharles.Forsyth 
8*37da2899SCharles.Forsyth void
Point_add(void * fp)9*37da2899SCharles.Forsyth Point_add(void *fp)
10*37da2899SCharles.Forsyth {
11*37da2899SCharles.Forsyth 	F_Point_add *f;
12*37da2899SCharles.Forsyth 	Draw_Point *ret;
13*37da2899SCharles.Forsyth 
14*37da2899SCharles.Forsyth 	f = fp;
15*37da2899SCharles.Forsyth 
16*37da2899SCharles.Forsyth 	ret = f->ret;
17*37da2899SCharles.Forsyth 	ret->x = f->p.x + f->q.x;
18*37da2899SCharles.Forsyth 	ret->y = f->p.y + f->q.y;
19*37da2899SCharles.Forsyth }
20*37da2899SCharles.Forsyth 
21*37da2899SCharles.Forsyth void
Point_sub(void * fp)22*37da2899SCharles.Forsyth Point_sub(void *fp)
23*37da2899SCharles.Forsyth {
24*37da2899SCharles.Forsyth 	F_Point_sub *f;
25*37da2899SCharles.Forsyth 	Draw_Point *ret;
26*37da2899SCharles.Forsyth 
27*37da2899SCharles.Forsyth 	f = fp;
28*37da2899SCharles.Forsyth 
29*37da2899SCharles.Forsyth 	ret = f->ret;
30*37da2899SCharles.Forsyth 	ret->x = f->p.x - f->q.x;
31*37da2899SCharles.Forsyth 	ret->y = f->p.y - f->q.y;
32*37da2899SCharles.Forsyth }
33*37da2899SCharles.Forsyth 
34*37da2899SCharles.Forsyth void
Point_mul(void * fp)35*37da2899SCharles.Forsyth Point_mul(void *fp)
36*37da2899SCharles.Forsyth {
37*37da2899SCharles.Forsyth 	F_Point_mul *f;
38*37da2899SCharles.Forsyth 	Draw_Point *ret;
39*37da2899SCharles.Forsyth 
40*37da2899SCharles.Forsyth 	f = fp;
41*37da2899SCharles.Forsyth 
42*37da2899SCharles.Forsyth 	ret = f->ret;
43*37da2899SCharles.Forsyth 	ret->x = f->p.x * f->i;
44*37da2899SCharles.Forsyth 	ret->y = f->p.y * f->i;
45*37da2899SCharles.Forsyth }
46*37da2899SCharles.Forsyth 
47*37da2899SCharles.Forsyth void
Point_div(void * fp)48*37da2899SCharles.Forsyth Point_div(void *fp)
49*37da2899SCharles.Forsyth {
50*37da2899SCharles.Forsyth 	F_Point_div *f;
51*37da2899SCharles.Forsyth 	Draw_Point *ret;
52*37da2899SCharles.Forsyth 
53*37da2899SCharles.Forsyth 	f = fp;
54*37da2899SCharles.Forsyth 
55*37da2899SCharles.Forsyth 	if(f->i == 0)
56*37da2899SCharles.Forsyth 		error(exZdiv);
57*37da2899SCharles.Forsyth 	ret = f->ret;
58*37da2899SCharles.Forsyth 	ret->x = f->p.x / f->i;
59*37da2899SCharles.Forsyth 	ret->y = f->p.y / f->i;
60*37da2899SCharles.Forsyth }
61*37da2899SCharles.Forsyth 
62*37da2899SCharles.Forsyth void
Point_eq(void * fp)63*37da2899SCharles.Forsyth Point_eq(void *fp)
64*37da2899SCharles.Forsyth {
65*37da2899SCharles.Forsyth 	F_Point_eq *f;
66*37da2899SCharles.Forsyth 
67*37da2899SCharles.Forsyth 	f = fp;
68*37da2899SCharles.Forsyth 	*f->ret = f->p.x == f->q.x && f->p.y == f->q.y;
69*37da2899SCharles.Forsyth }
70*37da2899SCharles.Forsyth 
71*37da2899SCharles.Forsyth void
Point_in(void * fp)72*37da2899SCharles.Forsyth Point_in(void *fp)
73*37da2899SCharles.Forsyth {
74*37da2899SCharles.Forsyth 	F_Point_in *f;
75*37da2899SCharles.Forsyth 
76*37da2899SCharles.Forsyth 	f = fp;
77*37da2899SCharles.Forsyth 	*f->ret = f->p.x >= f->r.min.x && f->p.x < f->r.max.x &&
78*37da2899SCharles.Forsyth 	       f->p.y >= f->r.min.y && f->p.y < f->r.max.y;
79*37da2899SCharles.Forsyth }
80*37da2899SCharles.Forsyth 
81*37da2899SCharles.Forsyth void
Rect_canon(void * fp)82*37da2899SCharles.Forsyth Rect_canon(void *fp)
83*37da2899SCharles.Forsyth {
84*37da2899SCharles.Forsyth 	F_Rect_canon *f;
85*37da2899SCharles.Forsyth 	Draw_Rect *ret;
86*37da2899SCharles.Forsyth 	WORD t;
87*37da2899SCharles.Forsyth 
88*37da2899SCharles.Forsyth 	f = fp;
89*37da2899SCharles.Forsyth 
90*37da2899SCharles.Forsyth 	ret = f->ret;
91*37da2899SCharles.Forsyth 	if(f->r.max.x < f->r.min.x){
92*37da2899SCharles.Forsyth 		t = f->r.max.x;
93*37da2899SCharles.Forsyth 		ret->max.x = f->r.min.x;
94*37da2899SCharles.Forsyth 		ret->min.x = t;
95*37da2899SCharles.Forsyth 	}else{
96*37da2899SCharles.Forsyth 		t = f->r.max.x;
97*37da2899SCharles.Forsyth 		ret->min.x = f->r.min.x;
98*37da2899SCharles.Forsyth 		ret->max.x = t;
99*37da2899SCharles.Forsyth 	}
100*37da2899SCharles.Forsyth 	if(f->r.max.y < f->r.min.y){
101*37da2899SCharles.Forsyth 		t = f->r.max.y;
102*37da2899SCharles.Forsyth 		ret->max.y = f->r.min.y;
103*37da2899SCharles.Forsyth 		ret->min.y = t;
104*37da2899SCharles.Forsyth 	}else{
105*37da2899SCharles.Forsyth 		t = f->r.max.y;
106*37da2899SCharles.Forsyth 		ret->min.y = f->r.min.y;
107*37da2899SCharles.Forsyth 		ret->max.y = t;
108*37da2899SCharles.Forsyth 	}
109*37da2899SCharles.Forsyth }
110*37da2899SCharles.Forsyth 
111*37da2899SCharles.Forsyth void
Rect_combine(void * fp)112*37da2899SCharles.Forsyth Rect_combine(void *fp)
113*37da2899SCharles.Forsyth {
114*37da2899SCharles.Forsyth 	F_Rect_combine *f;
115*37da2899SCharles.Forsyth 	Draw_Rect *ret;
116*37da2899SCharles.Forsyth 
117*37da2899SCharles.Forsyth 	f = fp;
118*37da2899SCharles.Forsyth 	ret = f->ret;
119*37da2899SCharles.Forsyth 	*ret = f->r;
120*37da2899SCharles.Forsyth 	if(f->r.min.x > f->s.min.x)
121*37da2899SCharles.Forsyth 		ret->min.x = f->s.min.x;
122*37da2899SCharles.Forsyth 	if(f->r.min.y > f->s.min.y)
123*37da2899SCharles.Forsyth 		ret->min.y = f->s.min.y;
124*37da2899SCharles.Forsyth 	if(f->r.max.x < f->s.max.x)
125*37da2899SCharles.Forsyth 		ret->max.x = f->s.max.x;
126*37da2899SCharles.Forsyth 	if(f->r.max.y < f->s.max.y)
127*37da2899SCharles.Forsyth 		ret->max.y = f->s.max.y;
128*37da2899SCharles.Forsyth }
129*37da2899SCharles.Forsyth 
130*37da2899SCharles.Forsyth void
Rect_eq(void * fp)131*37da2899SCharles.Forsyth Rect_eq(void *fp)
132*37da2899SCharles.Forsyth {
133*37da2899SCharles.Forsyth 	F_Rect_eq *f;
134*37da2899SCharles.Forsyth 
135*37da2899SCharles.Forsyth 	f = fp;
136*37da2899SCharles.Forsyth 
137*37da2899SCharles.Forsyth 	*f->ret = f->r.min.x == f->s.min.x
138*37da2899SCharles.Forsyth 		&& f->r.max.x == f->s.max.x
139*37da2899SCharles.Forsyth 		&& f->r.min.y == f->s.min.y
140*37da2899SCharles.Forsyth 		&& f->r.max.y == f->s.max.y;
141*37da2899SCharles.Forsyth }
142*37da2899SCharles.Forsyth 
143*37da2899SCharles.Forsyth void
Rect_Xrect(void * fp)144*37da2899SCharles.Forsyth Rect_Xrect(void *fp)
145*37da2899SCharles.Forsyth {
146*37da2899SCharles.Forsyth 	F_Rect_Xrect *f;
147*37da2899SCharles.Forsyth 
148*37da2899SCharles.Forsyth 	f = fp;
149*37da2899SCharles.Forsyth 
150*37da2899SCharles.Forsyth 	*f->ret = f->r.min.x < f->s.max.x
151*37da2899SCharles.Forsyth 		&& f->s.min.x < f->r.max.x
152*37da2899SCharles.Forsyth 		&& f->r.min.y < f->s.max.y
153*37da2899SCharles.Forsyth 		&& f->s.min.y < f->r.max.y;
154*37da2899SCharles.Forsyth }
155*37da2899SCharles.Forsyth 
156*37da2899SCharles.Forsyth void
Rect_clip(void * fp)157*37da2899SCharles.Forsyth Rect_clip(void *fp)
158*37da2899SCharles.Forsyth {
159*37da2899SCharles.Forsyth 	F_Rect_clip *f;
160*37da2899SCharles.Forsyth 	Draw_Rect *r, *s, *ret;
161*37da2899SCharles.Forsyth 
162*37da2899SCharles.Forsyth 	f = fp;
163*37da2899SCharles.Forsyth 
164*37da2899SCharles.Forsyth 	r = &f->r;
165*37da2899SCharles.Forsyth 	s = &f->s;
166*37da2899SCharles.Forsyth 	ret = &f->ret->t0;
167*37da2899SCharles.Forsyth 
168*37da2899SCharles.Forsyth 	/*
169*37da2899SCharles.Forsyth 	 * Expand rectXrect() in line for speed
170*37da2899SCharles.Forsyth 	 */
171*37da2899SCharles.Forsyth 	if(!(r->min.x<s->max.x && s->min.x<r->max.x
172*37da2899SCharles.Forsyth 	&& r->min.y<s->max.y && s->min.y<r->max.y)){
173*37da2899SCharles.Forsyth 		*ret = *r;
174*37da2899SCharles.Forsyth 		f->ret->t1 = 0;
175*37da2899SCharles.Forsyth 		return;
176*37da2899SCharles.Forsyth 	}
177*37da2899SCharles.Forsyth 
178*37da2899SCharles.Forsyth 	/* They must overlap */
179*37da2899SCharles.Forsyth 	if(r->min.x < s->min.x)
180*37da2899SCharles.Forsyth 		ret->min.x = s->min.x;
181*37da2899SCharles.Forsyth 	else
182*37da2899SCharles.Forsyth 		ret->min.x = r->min.x;
183*37da2899SCharles.Forsyth 	if(r->min.y < s->min.y)
184*37da2899SCharles.Forsyth 		ret->min.y = s->min.y;
185*37da2899SCharles.Forsyth 	else
186*37da2899SCharles.Forsyth 		ret->min.y = r->min.y;
187*37da2899SCharles.Forsyth 	if(r->max.x > s->max.x)
188*37da2899SCharles.Forsyth 		ret->max.x = s->max.x;
189*37da2899SCharles.Forsyth 	else
190*37da2899SCharles.Forsyth 		ret->max.x = r->max.x;
191*37da2899SCharles.Forsyth 	if(r->max.y > s->max.y)
192*37da2899SCharles.Forsyth 		ret->max.y = s->max.y;
193*37da2899SCharles.Forsyth 	else
194*37da2899SCharles.Forsyth 		ret->max.y = r->max.y;
195*37da2899SCharles.Forsyth 	f->ret->t1 = 1;
196*37da2899SCharles.Forsyth }
197*37da2899SCharles.Forsyth 
198*37da2899SCharles.Forsyth void
Rect_inrect(void * fp)199*37da2899SCharles.Forsyth Rect_inrect(void *fp)
200*37da2899SCharles.Forsyth {
201*37da2899SCharles.Forsyth 	F_Rect_inrect *f;
202*37da2899SCharles.Forsyth 
203*37da2899SCharles.Forsyth 	f = fp;
204*37da2899SCharles.Forsyth 
205*37da2899SCharles.Forsyth 	*f->ret = f->s.min.x <= f->r.min.x
206*37da2899SCharles.Forsyth 		&& f->r.max.x <= f->s.max.x
207*37da2899SCharles.Forsyth 		&& f->s.min.y <= f->r.min.y
208*37da2899SCharles.Forsyth 		&& f->r.max.y <= f->s.max.y;
209*37da2899SCharles.Forsyth }
210*37da2899SCharles.Forsyth 
211*37da2899SCharles.Forsyth void
Rect_contains(void * fp)212*37da2899SCharles.Forsyth Rect_contains(void *fp)
213*37da2899SCharles.Forsyth {
214*37da2899SCharles.Forsyth 	F_Rect_contains *f;
215*37da2899SCharles.Forsyth 	WORD x, y;
216*37da2899SCharles.Forsyth 
217*37da2899SCharles.Forsyth 	f = fp;
218*37da2899SCharles.Forsyth 
219*37da2899SCharles.Forsyth 	x = f->p.x;
220*37da2899SCharles.Forsyth 	y = f->p.y;
221*37da2899SCharles.Forsyth 	*f->ret = x >= f->r.min.x && x < f->r.max.x
222*37da2899SCharles.Forsyth 		&& y >= f->r.min.y && y < f->r.max.y;
223*37da2899SCharles.Forsyth }
224*37da2899SCharles.Forsyth 
225*37da2899SCharles.Forsyth void
Rect_addpt(void * fp)226*37da2899SCharles.Forsyth Rect_addpt(void *fp)
227*37da2899SCharles.Forsyth {
228*37da2899SCharles.Forsyth 	F_Rect_addpt *f;
229*37da2899SCharles.Forsyth 	Draw_Rect *ret;
230*37da2899SCharles.Forsyth 	WORD n;
231*37da2899SCharles.Forsyth 
232*37da2899SCharles.Forsyth 	f = fp;
233*37da2899SCharles.Forsyth 
234*37da2899SCharles.Forsyth 	ret = f->ret;
235*37da2899SCharles.Forsyth 	n = f->p.x;
236*37da2899SCharles.Forsyth 	ret->min.x = f->r.min.x + n;
237*37da2899SCharles.Forsyth 	ret->max.x = f->r.max.x + n;
238*37da2899SCharles.Forsyth 	n = f->p.y;
239*37da2899SCharles.Forsyth 	ret->min.y = f->r.min.y + n;
240*37da2899SCharles.Forsyth 	ret->max.y = f->r.max.y + n;
241*37da2899SCharles.Forsyth }
242*37da2899SCharles.Forsyth 
243*37da2899SCharles.Forsyth void
Rect_subpt(void * fp)244*37da2899SCharles.Forsyth Rect_subpt(void *fp)
245*37da2899SCharles.Forsyth {
246*37da2899SCharles.Forsyth 	WORD n;
247*37da2899SCharles.Forsyth 	F_Rect_subpt *f;
248*37da2899SCharles.Forsyth 	Draw_Rect *ret;
249*37da2899SCharles.Forsyth 
250*37da2899SCharles.Forsyth 	f = fp;
251*37da2899SCharles.Forsyth 
252*37da2899SCharles.Forsyth 	ret = f->ret;
253*37da2899SCharles.Forsyth 	n = f->p.x;
254*37da2899SCharles.Forsyth 	ret->min.x = f->r.min.x - n;
255*37da2899SCharles.Forsyth 	ret->max.x = f->r.max.x - n;
256*37da2899SCharles.Forsyth 	n = f->p.y;
257*37da2899SCharles.Forsyth 	ret->min.y = f->r.min.y - n;
258*37da2899SCharles.Forsyth 	ret->max.y = f->r.max.y - n;
259*37da2899SCharles.Forsyth }
260*37da2899SCharles.Forsyth 
261*37da2899SCharles.Forsyth void
Rect_inset(void * fp)262*37da2899SCharles.Forsyth Rect_inset(void *fp)
263*37da2899SCharles.Forsyth {
264*37da2899SCharles.Forsyth 	WORD n;
265*37da2899SCharles.Forsyth 	Draw_Rect *ret;
266*37da2899SCharles.Forsyth 	F_Rect_inset *f;
267*37da2899SCharles.Forsyth 
268*37da2899SCharles.Forsyth 	f = fp;
269*37da2899SCharles.Forsyth 
270*37da2899SCharles.Forsyth 	ret = f->ret;
271*37da2899SCharles.Forsyth 	n = f->n;
272*37da2899SCharles.Forsyth 	ret->min.x = f->r.min.x + n;
273*37da2899SCharles.Forsyth 	ret->min.y = f->r.min.y + n;
274*37da2899SCharles.Forsyth 	ret->max.x = f->r.max.x - n;
275*37da2899SCharles.Forsyth 	ret->max.y = f->r.max.y - n;
276*37da2899SCharles.Forsyth }
277*37da2899SCharles.Forsyth 
278*37da2899SCharles.Forsyth void
Rect_dx(void * fp)279*37da2899SCharles.Forsyth Rect_dx(void *fp)
280*37da2899SCharles.Forsyth {
281*37da2899SCharles.Forsyth 	F_Rect_dx *f;
282*37da2899SCharles.Forsyth 
283*37da2899SCharles.Forsyth 	f = fp;
284*37da2899SCharles.Forsyth 
285*37da2899SCharles.Forsyth 	*f->ret = f->r.max.x-f->r.min.x;
286*37da2899SCharles.Forsyth }
287*37da2899SCharles.Forsyth 
288*37da2899SCharles.Forsyth void
Rect_dy(void * fp)289*37da2899SCharles.Forsyth Rect_dy(void *fp)
290*37da2899SCharles.Forsyth {
291*37da2899SCharles.Forsyth 	F_Rect_dy *f;
292*37da2899SCharles.Forsyth 
293*37da2899SCharles.Forsyth 	f = fp;
294*37da2899SCharles.Forsyth 
295*37da2899SCharles.Forsyth 	*f->ret = f->r.max.y-f->r.min.y;
296*37da2899SCharles.Forsyth }
297*37da2899SCharles.Forsyth 
298*37da2899SCharles.Forsyth void
Rect_size(void * fp)299*37da2899SCharles.Forsyth Rect_size(void *fp)
300*37da2899SCharles.Forsyth {
301*37da2899SCharles.Forsyth 	F_Rect_size *f;
302*37da2899SCharles.Forsyth 	Draw_Point *ret;
303*37da2899SCharles.Forsyth 
304*37da2899SCharles.Forsyth 	f = fp;
305*37da2899SCharles.Forsyth 
306*37da2899SCharles.Forsyth 	ret = f->ret;
307*37da2899SCharles.Forsyth 	ret->x = f->r.max.x-f->r.min.x;
308*37da2899SCharles.Forsyth 	ret->y = f->r.max.y-f->r.min.y;
309*37da2899SCharles.Forsyth }
310