xref: /plan9-contrib/sys/src/cmd/unix/drawterm/libdraw/arith.c (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
1*7dd7cddfSDavid du Colombier #include "../lib9.h"
2*7dd7cddfSDavid du Colombier 
3*7dd7cddfSDavid du Colombier #include "../libdraw/draw.h"
4*7dd7cddfSDavid du Colombier 
5*7dd7cddfSDavid du Colombier Point
6*7dd7cddfSDavid du Colombier Pt(int x, int y)
7*7dd7cddfSDavid du Colombier {
8*7dd7cddfSDavid du Colombier 	Point p;
9*7dd7cddfSDavid du Colombier 
10*7dd7cddfSDavid du Colombier 	p.x = x;
11*7dd7cddfSDavid du Colombier 	p.y = y;
12*7dd7cddfSDavid du Colombier 	return p;
13*7dd7cddfSDavid du Colombier }
14*7dd7cddfSDavid du Colombier 
15*7dd7cddfSDavid du Colombier Rectangle
16*7dd7cddfSDavid du Colombier Rect(int x, int y, int bx, int by)
17*7dd7cddfSDavid du Colombier {
18*7dd7cddfSDavid du Colombier 	Rectangle r;
19*7dd7cddfSDavid du Colombier 
20*7dd7cddfSDavid du Colombier 	r.min.x = x;
21*7dd7cddfSDavid du Colombier 	r.min.y = y;
22*7dd7cddfSDavid du Colombier 	r.max.x = bx;
23*7dd7cddfSDavid du Colombier 	r.max.y = by;
24*7dd7cddfSDavid du Colombier 	return r;
25*7dd7cddfSDavid du Colombier }
26*7dd7cddfSDavid du Colombier 
27*7dd7cddfSDavid du Colombier Rectangle
28*7dd7cddfSDavid du Colombier Rpt(Point min, Point max)
29*7dd7cddfSDavid du Colombier {
30*7dd7cddfSDavid du Colombier 	Rectangle r;
31*7dd7cddfSDavid du Colombier 
32*7dd7cddfSDavid du Colombier 	r.min = min;
33*7dd7cddfSDavid du Colombier 	r.max = max;
34*7dd7cddfSDavid du Colombier 	return r;
35*7dd7cddfSDavid du Colombier }
36*7dd7cddfSDavid du Colombier 
37*7dd7cddfSDavid du Colombier Point
38*7dd7cddfSDavid du Colombier addpt(Point a, Point b)
39*7dd7cddfSDavid du Colombier {
40*7dd7cddfSDavid du Colombier 	a.x += b.x;
41*7dd7cddfSDavid du Colombier 	a.y += b.y;
42*7dd7cddfSDavid du Colombier 	return a;
43*7dd7cddfSDavid du Colombier }
44*7dd7cddfSDavid du Colombier 
45*7dd7cddfSDavid du Colombier Point
46*7dd7cddfSDavid du Colombier subpt(Point a, Point b)
47*7dd7cddfSDavid du Colombier {
48*7dd7cddfSDavid du Colombier 	a.x -= b.x;
49*7dd7cddfSDavid du Colombier 	a.y -= b.y;
50*7dd7cddfSDavid du Colombier 	return a;
51*7dd7cddfSDavid du Colombier }
52*7dd7cddfSDavid du Colombier 
53*7dd7cddfSDavid du Colombier Rectangle
54*7dd7cddfSDavid du Colombier insetrect(Rectangle r, int n)
55*7dd7cddfSDavid du Colombier {
56*7dd7cddfSDavid du Colombier 	r.min.x += n;
57*7dd7cddfSDavid du Colombier 	r.min.y += n;
58*7dd7cddfSDavid du Colombier 	r.max.x -= n;
59*7dd7cddfSDavid du Colombier 	r.max.y -= n;
60*7dd7cddfSDavid du Colombier 	return r;
61*7dd7cddfSDavid du Colombier }
62*7dd7cddfSDavid du Colombier 
63*7dd7cddfSDavid du Colombier Point
64*7dd7cddfSDavid du Colombier divpt(Point a, int b)
65*7dd7cddfSDavid du Colombier {
66*7dd7cddfSDavid du Colombier 	a.x /= b;
67*7dd7cddfSDavid du Colombier 	a.y /= b;
68*7dd7cddfSDavid du Colombier 	return a;
69*7dd7cddfSDavid du Colombier }
70*7dd7cddfSDavid du Colombier 
71*7dd7cddfSDavid du Colombier Point
72*7dd7cddfSDavid du Colombier mulpt(Point a, int b)
73*7dd7cddfSDavid du Colombier {
74*7dd7cddfSDavid du Colombier 	a.x *= b;
75*7dd7cddfSDavid du Colombier 	a.y *= b;
76*7dd7cddfSDavid du Colombier 	return a;
77*7dd7cddfSDavid du Colombier }
78*7dd7cddfSDavid du Colombier 
79*7dd7cddfSDavid du Colombier Rectangle
80*7dd7cddfSDavid du Colombier rectsubpt(Rectangle r, Point p)
81*7dd7cddfSDavid du Colombier {
82*7dd7cddfSDavid du Colombier 	r.min.x -= p.x;
83*7dd7cddfSDavid du Colombier 	r.min.y -= p.y;
84*7dd7cddfSDavid du Colombier 	r.max.x -= p.x;
85*7dd7cddfSDavid du Colombier 	r.max.y -= p.y;
86*7dd7cddfSDavid du Colombier 	return r;
87*7dd7cddfSDavid du Colombier }
88*7dd7cddfSDavid du Colombier 
89*7dd7cddfSDavid du Colombier Rectangle
90*7dd7cddfSDavid du Colombier rectaddpt(Rectangle r, Point p)
91*7dd7cddfSDavid du Colombier {
92*7dd7cddfSDavid du Colombier 	r.min.x += p.x;
93*7dd7cddfSDavid du Colombier 	r.min.y += p.y;
94*7dd7cddfSDavid du Colombier 	r.max.x += p.x;
95*7dd7cddfSDavid du Colombier 	r.max.y += p.y;
96*7dd7cddfSDavid du Colombier 	return r;
97*7dd7cddfSDavid du Colombier }
98*7dd7cddfSDavid du Colombier 
99*7dd7cddfSDavid du Colombier int
100*7dd7cddfSDavid du Colombier eqpt(Point p, Point q)
101*7dd7cddfSDavid du Colombier {
102*7dd7cddfSDavid du Colombier 	return p.x==q.x && p.y==q.y;
103*7dd7cddfSDavid du Colombier }
104*7dd7cddfSDavid du Colombier 
105*7dd7cddfSDavid du Colombier int
106*7dd7cddfSDavid du Colombier eqrect(Rectangle r, Rectangle s)
107*7dd7cddfSDavid du Colombier {
108*7dd7cddfSDavid du Colombier 	return r.min.x==s.min.x && r.max.x==s.max.x &&
109*7dd7cddfSDavid du Colombier 	       r.min.y==s.min.y && r.max.y==s.max.y;
110*7dd7cddfSDavid du Colombier }
111*7dd7cddfSDavid du Colombier 
112*7dd7cddfSDavid du Colombier int
113*7dd7cddfSDavid du Colombier rectXrect(Rectangle r, Rectangle s)
114*7dd7cddfSDavid du Colombier {
115*7dd7cddfSDavid du Colombier 	return r.min.x<s.max.x && s.min.x<r.max.x &&
116*7dd7cddfSDavid du Colombier 	       r.min.y<s.max.y && s.min.y<r.max.y;
117*7dd7cddfSDavid du Colombier }
118*7dd7cddfSDavid du Colombier 
119*7dd7cddfSDavid du Colombier int
120*7dd7cddfSDavid du Colombier rectinrect(Rectangle r, Rectangle s)
121*7dd7cddfSDavid du Colombier {
122*7dd7cddfSDavid du Colombier 	return s.min.x<=r.min.x && r.max.x<=s.max.x && s.min.y<=r.min.y && r.max.y<=s.max.y;
123*7dd7cddfSDavid du Colombier }
124*7dd7cddfSDavid du Colombier 
125*7dd7cddfSDavid du Colombier int
126*7dd7cddfSDavid du Colombier ptinrect(Point p, Rectangle r)
127*7dd7cddfSDavid du Colombier {
128*7dd7cddfSDavid du Colombier 	return p.x>=r.min.x && p.x<r.max.x &&
129*7dd7cddfSDavid du Colombier 	       p.y>=r.min.y && p.y<r.max.y;
130*7dd7cddfSDavid du Colombier }
131*7dd7cddfSDavid du Colombier 
132*7dd7cddfSDavid du Colombier Rectangle
133*7dd7cddfSDavid du Colombier canonrect(Rectangle r)
134*7dd7cddfSDavid du Colombier {
135*7dd7cddfSDavid du Colombier 	int t;
136*7dd7cddfSDavid du Colombier 	if (r.max.x < r.min.x) {
137*7dd7cddfSDavid du Colombier 		t = r.min.x;
138*7dd7cddfSDavid du Colombier 		r.min.x = r.max.x;
139*7dd7cddfSDavid du Colombier 		r.max.x = t;
140*7dd7cddfSDavid du Colombier 	}
141*7dd7cddfSDavid du Colombier 	if (r.max.y < r.min.y) {
142*7dd7cddfSDavid du Colombier 		t = r.min.y;
143*7dd7cddfSDavid du Colombier 		r.min.y = r.max.y;
144*7dd7cddfSDavid du Colombier 		r.max.y = t;
145*7dd7cddfSDavid du Colombier 	}
146*7dd7cddfSDavid du Colombier 	return r;
147*7dd7cddfSDavid du Colombier }
148*7dd7cddfSDavid du Colombier 
149*7dd7cddfSDavid du Colombier void
150*7dd7cddfSDavid du Colombier combinerect(Rectangle *r1, Rectangle r2)
151*7dd7cddfSDavid du Colombier {
152*7dd7cddfSDavid du Colombier 	if(r1->min.x > r2.min.x)
153*7dd7cddfSDavid du Colombier 		r1->min.x = r2.min.x;
154*7dd7cddfSDavid du Colombier 	if(r1->min.y > r2.min.y)
155*7dd7cddfSDavid du Colombier 		r1->min.y = r2.min.y;
156*7dd7cddfSDavid du Colombier 	if(r1->max.x < r2.max.x)
157*7dd7cddfSDavid du Colombier 		r1->max.x = r2.max.x;
158*7dd7cddfSDavid du Colombier 	if(r1->max.y < r2.max.y)
159*7dd7cddfSDavid du Colombier 		r1->max.y = r2.max.y;
160*7dd7cddfSDavid du Colombier }
161