arith.c 2.6 KB

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