xref: /inferno-os/libdraw/arith.c (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1*37da2899SCharles.Forsyth #include "lib9.h"
2*37da2899SCharles.Forsyth #include "draw.h"
3*37da2899SCharles.Forsyth 
4*37da2899SCharles.Forsyth Point
Pt(int x,int y)5*37da2899SCharles.Forsyth Pt(int x, int y)
6*37da2899SCharles.Forsyth {
7*37da2899SCharles.Forsyth 	Point p;
8*37da2899SCharles.Forsyth 
9*37da2899SCharles.Forsyth 	p.x = x;
10*37da2899SCharles.Forsyth 	p.y = y;
11*37da2899SCharles.Forsyth 	return p;
12*37da2899SCharles.Forsyth }
13*37da2899SCharles.Forsyth 
14*37da2899SCharles.Forsyth Rectangle
Rect(int x,int y,int bx,int by)15*37da2899SCharles.Forsyth Rect(int x, int y, int bx, int by)
16*37da2899SCharles.Forsyth {
17*37da2899SCharles.Forsyth 	Rectangle r;
18*37da2899SCharles.Forsyth 
19*37da2899SCharles.Forsyth 	r.min.x = x;
20*37da2899SCharles.Forsyth 	r.min.y = y;
21*37da2899SCharles.Forsyth 	r.max.x = bx;
22*37da2899SCharles.Forsyth 	r.max.y = by;
23*37da2899SCharles.Forsyth 	return r;
24*37da2899SCharles.Forsyth }
25*37da2899SCharles.Forsyth 
26*37da2899SCharles.Forsyth Rectangle
Rpt(Point min,Point max)27*37da2899SCharles.Forsyth Rpt(Point min, Point max)
28*37da2899SCharles.Forsyth {
29*37da2899SCharles.Forsyth 	Rectangle r;
30*37da2899SCharles.Forsyth 
31*37da2899SCharles.Forsyth 	r.min = min;
32*37da2899SCharles.Forsyth 	r.max = max;
33*37da2899SCharles.Forsyth 	return r;
34*37da2899SCharles.Forsyth }
35*37da2899SCharles.Forsyth 
36*37da2899SCharles.Forsyth Point
addpt(Point a,Point b)37*37da2899SCharles.Forsyth addpt(Point a, Point b)
38*37da2899SCharles.Forsyth {
39*37da2899SCharles.Forsyth 	a.x += b.x;
40*37da2899SCharles.Forsyth 	a.y += b.y;
41*37da2899SCharles.Forsyth 	return a;
42*37da2899SCharles.Forsyth }
43*37da2899SCharles.Forsyth 
44*37da2899SCharles.Forsyth Point
subpt(Point a,Point b)45*37da2899SCharles.Forsyth subpt(Point a, Point b)
46*37da2899SCharles.Forsyth {
47*37da2899SCharles.Forsyth 	a.x -= b.x;
48*37da2899SCharles.Forsyth 	a.y -= b.y;
49*37da2899SCharles.Forsyth 	return a;
50*37da2899SCharles.Forsyth }
51*37da2899SCharles.Forsyth 
52*37da2899SCharles.Forsyth Rectangle
insetrect(Rectangle r,int n)53*37da2899SCharles.Forsyth insetrect(Rectangle r, int n)
54*37da2899SCharles.Forsyth {
55*37da2899SCharles.Forsyth 	r.min.x += n;
56*37da2899SCharles.Forsyth 	r.min.y += n;
57*37da2899SCharles.Forsyth 	r.max.x -= n;
58*37da2899SCharles.Forsyth 	r.max.y -= n;
59*37da2899SCharles.Forsyth 	return r;
60*37da2899SCharles.Forsyth }
61*37da2899SCharles.Forsyth 
62*37da2899SCharles.Forsyth Point
divpt(Point a,int b)63*37da2899SCharles.Forsyth divpt(Point a, int b)
64*37da2899SCharles.Forsyth {
65*37da2899SCharles.Forsyth 	a.x /= b;
66*37da2899SCharles.Forsyth 	a.y /= b;
67*37da2899SCharles.Forsyth 	return a;
68*37da2899SCharles.Forsyth }
69*37da2899SCharles.Forsyth 
70*37da2899SCharles.Forsyth Point
mulpt(Point a,int b)71*37da2899SCharles.Forsyth mulpt(Point a, int b)
72*37da2899SCharles.Forsyth {
73*37da2899SCharles.Forsyth 	a.x *= b;
74*37da2899SCharles.Forsyth 	a.y *= b;
75*37da2899SCharles.Forsyth 	return a;
76*37da2899SCharles.Forsyth }
77*37da2899SCharles.Forsyth 
78*37da2899SCharles.Forsyth Rectangle
rectsubpt(Rectangle r,Point p)79*37da2899SCharles.Forsyth rectsubpt(Rectangle r, Point p)
80*37da2899SCharles.Forsyth {
81*37da2899SCharles.Forsyth 	r.min.x -= p.x;
82*37da2899SCharles.Forsyth 	r.min.y -= p.y;
83*37da2899SCharles.Forsyth 	r.max.x -= p.x;
84*37da2899SCharles.Forsyth 	r.max.y -= p.y;
85*37da2899SCharles.Forsyth 	return r;
86*37da2899SCharles.Forsyth }
87*37da2899SCharles.Forsyth 
88*37da2899SCharles.Forsyth Rectangle
rectaddpt(Rectangle r,Point p)89*37da2899SCharles.Forsyth rectaddpt(Rectangle r, Point p)
90*37da2899SCharles.Forsyth {
91*37da2899SCharles.Forsyth 	r.min.x += p.x;
92*37da2899SCharles.Forsyth 	r.min.y += p.y;
93*37da2899SCharles.Forsyth 	r.max.x += p.x;
94*37da2899SCharles.Forsyth 	r.max.y += p.y;
95*37da2899SCharles.Forsyth 	return r;
96*37da2899SCharles.Forsyth }
97*37da2899SCharles.Forsyth 
98*37da2899SCharles.Forsyth int
eqpt(Point p,Point q)99*37da2899SCharles.Forsyth eqpt(Point p, Point q)
100*37da2899SCharles.Forsyth {
101*37da2899SCharles.Forsyth 	return p.x==q.x && p.y==q.y;
102*37da2899SCharles.Forsyth }
103*37da2899SCharles.Forsyth 
104*37da2899SCharles.Forsyth int
eqrect(Rectangle r,Rectangle s)105*37da2899SCharles.Forsyth eqrect(Rectangle r, Rectangle s)
106*37da2899SCharles.Forsyth {
107*37da2899SCharles.Forsyth 	return r.min.x==s.min.x && r.max.x==s.max.x &&
108*37da2899SCharles.Forsyth 	       r.min.y==s.min.y && r.max.y==s.max.y;
109*37da2899SCharles.Forsyth }
110*37da2899SCharles.Forsyth 
111*37da2899SCharles.Forsyth int
rectXrect(Rectangle r,Rectangle s)112*37da2899SCharles.Forsyth rectXrect(Rectangle r, Rectangle s)
113*37da2899SCharles.Forsyth {
114*37da2899SCharles.Forsyth 	return r.min.x<s.max.x && s.min.x<r.max.x &&
115*37da2899SCharles.Forsyth 	       r.min.y<s.max.y && s.min.y<r.max.y;
116*37da2899SCharles.Forsyth }
117*37da2899SCharles.Forsyth 
118*37da2899SCharles.Forsyth int
rectinrect(Rectangle r,Rectangle s)119*37da2899SCharles.Forsyth rectinrect(Rectangle r, Rectangle s)
120*37da2899SCharles.Forsyth {
121*37da2899SCharles.Forsyth 	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;
122*37da2899SCharles.Forsyth }
123*37da2899SCharles.Forsyth 
124*37da2899SCharles.Forsyth int
ptinrect(Point p,Rectangle r)125*37da2899SCharles.Forsyth ptinrect(Point p, Rectangle r)
126*37da2899SCharles.Forsyth {
127*37da2899SCharles.Forsyth 	return p.x>=r.min.x && p.x<r.max.x &&
128*37da2899SCharles.Forsyth 	       p.y>=r.min.y && p.y<r.max.y;
129*37da2899SCharles.Forsyth }
130*37da2899SCharles.Forsyth 
131*37da2899SCharles.Forsyth Rectangle
canonrect(Rectangle r)132*37da2899SCharles.Forsyth canonrect(Rectangle r)
133*37da2899SCharles.Forsyth {
134*37da2899SCharles.Forsyth 	int t;
135*37da2899SCharles.Forsyth 	if (r.max.x < r.min.x) {
136*37da2899SCharles.Forsyth 		t = r.min.x;
137*37da2899SCharles.Forsyth 		r.min.x = r.max.x;
138*37da2899SCharles.Forsyth 		r.max.x = t;
139*37da2899SCharles.Forsyth 	}
140*37da2899SCharles.Forsyth 	if (r.max.y < r.min.y) {
141*37da2899SCharles.Forsyth 		t = r.min.y;
142*37da2899SCharles.Forsyth 		r.min.y = r.max.y;
143*37da2899SCharles.Forsyth 		r.max.y = t;
144*37da2899SCharles.Forsyth 	}
145*37da2899SCharles.Forsyth 	return r;
146*37da2899SCharles.Forsyth }
147*37da2899SCharles.Forsyth 
148*37da2899SCharles.Forsyth void
combinerect(Rectangle * r1,Rectangle r2)149*37da2899SCharles.Forsyth combinerect(Rectangle *r1, Rectangle r2)
150*37da2899SCharles.Forsyth {
151*37da2899SCharles.Forsyth 	if(r1->min.x > r2.min.x)
152*37da2899SCharles.Forsyth 		r1->min.x = r2.min.x;
153*37da2899SCharles.Forsyth 	if(r1->min.y > r2.min.y)
154*37da2899SCharles.Forsyth 		r1->min.y = r2.min.y;
155*37da2899SCharles.Forsyth 	if(r1->max.x < r2.max.x)
156*37da2899SCharles.Forsyth 		r1->max.x = r2.max.x;
157*37da2899SCharles.Forsyth 	if(r1->max.y < r2.max.y)
158*37da2899SCharles.Forsyth 		r1->max.y = r2.max.y;
159*37da2899SCharles.Forsyth }
160*37da2899SCharles.Forsyth 
161*37da2899SCharles.Forsyth ulong
162*37da2899SCharles.Forsyth drawld2chan[] = {
163*37da2899SCharles.Forsyth 	GREY1,
164*37da2899SCharles.Forsyth 	GREY2,
165*37da2899SCharles.Forsyth 	GREY4,
166*37da2899SCharles.Forsyth 	CMAP8,
167*37da2899SCharles.Forsyth };
168*37da2899SCharles.Forsyth 
169*37da2899SCharles.Forsyth ulong
setalpha(ulong color,uchar alpha)170*37da2899SCharles.Forsyth setalpha(ulong color, uchar alpha)
171*37da2899SCharles.Forsyth {
172*37da2899SCharles.Forsyth 	int red, green, blue;
173*37da2899SCharles.Forsyth 
174*37da2899SCharles.Forsyth 	red = (color >> 3*8) & 0xFF;
175*37da2899SCharles.Forsyth 	green = (color >> 2*8) & 0xFF;
176*37da2899SCharles.Forsyth 	blue = (color >> 1*8) & 0xFF;
177*37da2899SCharles.Forsyth 	/* ignore incoming alpha */
178*37da2899SCharles.Forsyth 	red = (red * alpha)/255;
179*37da2899SCharles.Forsyth 	green = (green * alpha)/255;
180*37da2899SCharles.Forsyth 	blue = (blue * alpha)/255;
181*37da2899SCharles.Forsyth 	return (red<<3*8) | (green<<2*8) | (blue<<1*8) | (alpha<<0*8);
182*37da2899SCharles.Forsyth }
183*37da2899SCharles.Forsyth 
184*37da2899SCharles.Forsyth Point	ZP;
185*37da2899SCharles.Forsyth Rectangle ZR;
186*37da2899SCharles.Forsyth int
Rfmt(Fmt * f)187*37da2899SCharles.Forsyth Rfmt(Fmt *f)
188*37da2899SCharles.Forsyth {
189*37da2899SCharles.Forsyth 	Rectangle r;
190*37da2899SCharles.Forsyth 
191*37da2899SCharles.Forsyth 	r = va_arg(f->args, Rectangle);
192*37da2899SCharles.Forsyth 	return fmtprint(f, "%P %P", r.min, r.max);
193*37da2899SCharles.Forsyth }
194*37da2899SCharles.Forsyth 
195*37da2899SCharles.Forsyth int
Pfmt(Fmt * f)196*37da2899SCharles.Forsyth Pfmt(Fmt *f)
197*37da2899SCharles.Forsyth {
198*37da2899SCharles.Forsyth 	Point p;
199*37da2899SCharles.Forsyth 
200*37da2899SCharles.Forsyth 	p = va_arg(f->args, Point);
201*37da2899SCharles.Forsyth 	return fmtprint(f, "[%d %d]", p.x, p.y);
202*37da2899SCharles.Forsyth }
203*37da2899SCharles.Forsyth 
204