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