xref: /plan9/sys/src/libdraw/arith.c (revision bacfa46c74e1c310aff15aef9cb6bc4e6302513a)
17dd7cddfSDavid du Colombier #include <u.h>
27dd7cddfSDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier #include <draw.h>
47dd7cddfSDavid du Colombier 
57dd7cddfSDavid du Colombier Point
Pt(int x,int y)67dd7cddfSDavid du Colombier Pt(int x, int y)
77dd7cddfSDavid du Colombier {
87dd7cddfSDavid du Colombier 	Point p;
97dd7cddfSDavid du Colombier 
107dd7cddfSDavid du Colombier 	p.x = x;
117dd7cddfSDavid du Colombier 	p.y = y;
127dd7cddfSDavid du Colombier 	return p;
137dd7cddfSDavid du Colombier }
147dd7cddfSDavid du Colombier 
157dd7cddfSDavid du Colombier Rectangle
Rect(int x,int y,int bx,int by)167dd7cddfSDavid du Colombier Rect(int x, int y, int bx, int by)
177dd7cddfSDavid du Colombier {
187dd7cddfSDavid du Colombier 	Rectangle r;
197dd7cddfSDavid du Colombier 
207dd7cddfSDavid du Colombier 	r.min.x = x;
217dd7cddfSDavid du Colombier 	r.min.y = y;
227dd7cddfSDavid du Colombier 	r.max.x = bx;
237dd7cddfSDavid du Colombier 	r.max.y = by;
247dd7cddfSDavid du Colombier 	return r;
257dd7cddfSDavid du Colombier }
267dd7cddfSDavid du Colombier 
277dd7cddfSDavid du Colombier Rectangle
Rpt(Point min,Point max)287dd7cddfSDavid du Colombier Rpt(Point min, Point max)
297dd7cddfSDavid du Colombier {
307dd7cddfSDavid du Colombier 	Rectangle r;
317dd7cddfSDavid du Colombier 
327dd7cddfSDavid du Colombier 	r.min = min;
337dd7cddfSDavid du Colombier 	r.max = max;
347dd7cddfSDavid du Colombier 	return r;
357dd7cddfSDavid du Colombier }
367dd7cddfSDavid du Colombier 
377dd7cddfSDavid du Colombier Point
addpt(Point a,Point b)387dd7cddfSDavid du Colombier addpt(Point a, Point b)
397dd7cddfSDavid du Colombier {
407dd7cddfSDavid du Colombier 	a.x += b.x;
417dd7cddfSDavid du Colombier 	a.y += b.y;
427dd7cddfSDavid du Colombier 	return a;
437dd7cddfSDavid du Colombier }
447dd7cddfSDavid du Colombier 
457dd7cddfSDavid du Colombier Point
subpt(Point a,Point b)467dd7cddfSDavid du Colombier subpt(Point a, Point b)
477dd7cddfSDavid du Colombier {
487dd7cddfSDavid du Colombier 	a.x -= b.x;
497dd7cddfSDavid du Colombier 	a.y -= b.y;
507dd7cddfSDavid du Colombier 	return a;
517dd7cddfSDavid du Colombier }
527dd7cddfSDavid du Colombier 
537dd7cddfSDavid du Colombier Rectangle
insetrect(Rectangle r,int n)547dd7cddfSDavid du Colombier insetrect(Rectangle r, int n)
557dd7cddfSDavid du Colombier {
567dd7cddfSDavid du Colombier 	r.min.x += n;
577dd7cddfSDavid du Colombier 	r.min.y += n;
587dd7cddfSDavid du Colombier 	r.max.x -= n;
597dd7cddfSDavid du Colombier 	r.max.y -= n;
607dd7cddfSDavid du Colombier 	return r;
617dd7cddfSDavid du Colombier }
627dd7cddfSDavid du Colombier 
637dd7cddfSDavid du Colombier Point
divpt(Point a,int b)647dd7cddfSDavid du Colombier divpt(Point a, int b)
657dd7cddfSDavid du Colombier {
667dd7cddfSDavid du Colombier 	a.x /= b;
677dd7cddfSDavid du Colombier 	a.y /= b;
687dd7cddfSDavid du Colombier 	return a;
697dd7cddfSDavid du Colombier }
707dd7cddfSDavid du Colombier 
717dd7cddfSDavid du Colombier Point
mulpt(Point a,int b)727dd7cddfSDavid du Colombier mulpt(Point a, int b)
737dd7cddfSDavid du Colombier {
747dd7cddfSDavid du Colombier 	a.x *= b;
757dd7cddfSDavid du Colombier 	a.y *= b;
767dd7cddfSDavid du Colombier 	return a;
777dd7cddfSDavid du Colombier }
787dd7cddfSDavid du Colombier 
797dd7cddfSDavid du Colombier Rectangle
rectsubpt(Rectangle r,Point p)807dd7cddfSDavid du Colombier rectsubpt(Rectangle r, Point p)
817dd7cddfSDavid du Colombier {
827dd7cddfSDavid du Colombier 	r.min.x -= p.x;
837dd7cddfSDavid du Colombier 	r.min.y -= p.y;
847dd7cddfSDavid du Colombier 	r.max.x -= p.x;
857dd7cddfSDavid du Colombier 	r.max.y -= p.y;
867dd7cddfSDavid du Colombier 	return r;
877dd7cddfSDavid du Colombier }
887dd7cddfSDavid du Colombier 
897dd7cddfSDavid du Colombier Rectangle
rectaddpt(Rectangle r,Point p)907dd7cddfSDavid du Colombier rectaddpt(Rectangle r, Point p)
917dd7cddfSDavid du Colombier {
927dd7cddfSDavid du Colombier 	r.min.x += p.x;
937dd7cddfSDavid du Colombier 	r.min.y += p.y;
947dd7cddfSDavid du Colombier 	r.max.x += p.x;
957dd7cddfSDavid du Colombier 	r.max.y += p.y;
967dd7cddfSDavid du Colombier 	return r;
977dd7cddfSDavid du Colombier }
987dd7cddfSDavid du Colombier 
997dd7cddfSDavid du Colombier int
eqpt(Point p,Point q)1007dd7cddfSDavid du Colombier eqpt(Point p, Point q)
1017dd7cddfSDavid du Colombier {
1027dd7cddfSDavid du Colombier 	return p.x==q.x && p.y==q.y;
1037dd7cddfSDavid du Colombier }
1047dd7cddfSDavid du Colombier 
1057dd7cddfSDavid du Colombier int
eqrect(Rectangle r,Rectangle s)1067dd7cddfSDavid du Colombier eqrect(Rectangle r, Rectangle s)
1077dd7cddfSDavid du Colombier {
1087dd7cddfSDavid du Colombier 	return r.min.x==s.min.x && r.max.x==s.max.x &&
1097dd7cddfSDavid du Colombier 	       r.min.y==s.min.y && r.max.y==s.max.y;
1107dd7cddfSDavid du Colombier }
1117dd7cddfSDavid du Colombier 
1127dd7cddfSDavid du Colombier int
rectXrect(Rectangle r,Rectangle s)1137dd7cddfSDavid du Colombier rectXrect(Rectangle r, Rectangle s)
1147dd7cddfSDavid du Colombier {
1157dd7cddfSDavid du Colombier 	return r.min.x<s.max.x && s.min.x<r.max.x &&
1167dd7cddfSDavid du Colombier 	       r.min.y<s.max.y && s.min.y<r.max.y;
1177dd7cddfSDavid du Colombier }
1187dd7cddfSDavid du Colombier 
1197dd7cddfSDavid du Colombier int
rectinrect(Rectangle r,Rectangle s)1207dd7cddfSDavid du Colombier rectinrect(Rectangle r, Rectangle s)
1217dd7cddfSDavid du Colombier {
1227dd7cddfSDavid 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;
1237dd7cddfSDavid du Colombier }
1247dd7cddfSDavid du Colombier 
1257dd7cddfSDavid du Colombier int
ptinrect(Point p,Rectangle r)1267dd7cddfSDavid du Colombier ptinrect(Point p, Rectangle r)
1277dd7cddfSDavid du Colombier {
1287dd7cddfSDavid du Colombier 	return p.x>=r.min.x && p.x<r.max.x &&
1297dd7cddfSDavid du Colombier 	       p.y>=r.min.y && p.y<r.max.y;
1307dd7cddfSDavid du Colombier }
1317dd7cddfSDavid du Colombier 
1327dd7cddfSDavid du Colombier Rectangle
canonrect(Rectangle r)1337dd7cddfSDavid du Colombier canonrect(Rectangle r)
1347dd7cddfSDavid du Colombier {
1357dd7cddfSDavid du Colombier 	int t;
1367dd7cddfSDavid du Colombier 	if (r.max.x < r.min.x) {
1377dd7cddfSDavid du Colombier 		t = r.min.x;
1387dd7cddfSDavid du Colombier 		r.min.x = r.max.x;
1397dd7cddfSDavid du Colombier 		r.max.x = t;
1407dd7cddfSDavid du Colombier 	}
1417dd7cddfSDavid du Colombier 	if (r.max.y < r.min.y) {
1427dd7cddfSDavid du Colombier 		t = r.min.y;
1437dd7cddfSDavid du Colombier 		r.min.y = r.max.y;
1447dd7cddfSDavid du Colombier 		r.max.y = t;
1457dd7cddfSDavid du Colombier 	}
1467dd7cddfSDavid du Colombier 	return r;
1477dd7cddfSDavid du Colombier }
1487dd7cddfSDavid du Colombier 
1497dd7cddfSDavid du Colombier void
combinerect(Rectangle * r1,Rectangle r2)1507dd7cddfSDavid du Colombier combinerect(Rectangle *r1, Rectangle r2)
1517dd7cddfSDavid du Colombier {
1527dd7cddfSDavid du Colombier 	if(r1->min.x > r2.min.x)
1537dd7cddfSDavid du Colombier 		r1->min.x = r2.min.x;
1547dd7cddfSDavid du Colombier 	if(r1->min.y > r2.min.y)
1557dd7cddfSDavid du Colombier 		r1->min.y = r2.min.y;
1567dd7cddfSDavid du Colombier 	if(r1->max.x < r2.max.x)
1577dd7cddfSDavid du Colombier 		r1->max.x = r2.max.x;
1587dd7cddfSDavid du Colombier 	if(r1->max.y < r2.max.y)
1597dd7cddfSDavid du Colombier 		r1->max.y = r2.max.y;
1607dd7cddfSDavid du Colombier }
1619a747e4fSDavid du Colombier 
162e4dddb8fSDavid du Colombier ulong drawld2chan[] = {
1639a747e4fSDavid du Colombier 	GREY1,
1649a747e4fSDavid du Colombier 	GREY2,
1659a747e4fSDavid du Colombier 	GREY4,
1669a747e4fSDavid du Colombier 	CMAP8,
1679a747e4fSDavid du Colombier };
1689a747e4fSDavid du Colombier 
169*bacfa46cSDavid du Colombier /*
170*bacfa46cSDavid du Colombier  * was used by libmemlayer/line.c; made static, instead of deleting it,
171*bacfa46cSDavid du Colombier  * to avoid updating many binaries on sources.
172*bacfa46cSDavid du Colombier  */
173*bacfa46cSDavid du Colombier static int log2[] = { -1, 0, 1, -1, 2, -1, -1, -1, 3, -1, -1, -1, -1, -1, -1, -1, 4, -1, -1, -1, -1, -1, -1, -1, 4 /* BUG */, -1, -1, -1, -1, -1, -1, -1, 5 };
1749a747e4fSDavid du Colombier 
1759a747e4fSDavid du Colombier ulong
setalpha(ulong color,uchar alpha)1769a747e4fSDavid du Colombier setalpha(ulong color, uchar alpha)
1779a747e4fSDavid du Colombier {
1789a747e4fSDavid du Colombier 	int red, green, blue;
1799a747e4fSDavid du Colombier 
1809a747e4fSDavid du Colombier 	red = (color >> 3*8) & 0xFF;
1819a747e4fSDavid du Colombier 	green = (color >> 2*8) & 0xFF;
1829a747e4fSDavid du Colombier 	blue = (color >> 1*8) & 0xFF;
1839a747e4fSDavid du Colombier 	/* ignore incoming alpha */
1849a747e4fSDavid du Colombier 	red = (red * alpha)/255;
1859a747e4fSDavid du Colombier 	green = (green * alpha)/255;
1869a747e4fSDavid du Colombier 	blue = (blue * alpha)/255;
1879a747e4fSDavid du Colombier 	return (red<<3*8) | (green<<2*8) | (blue<<1*8) | (alpha<<0*8);
1889a747e4fSDavid du Colombier }
1899a747e4fSDavid du Colombier 
1909a747e4fSDavid du Colombier Point	ZP;
1919a747e4fSDavid du Colombier Rectangle ZR;
192