/xbmc/visualizations/Goom/goom2k4-0/src/drawmethods.c

http://github.com/xbmc/xbmc · C · 203 lines · 129 code · 9 blank · 65 comment · 37 complexity · 8a9cc5a81ce760f5a54e536e79885d88 MD5 · raw file

  1. #include "drawmethods.h"
  2. #define DRAWMETHOD_PLUS(_out,_backbuf,_col) \
  3. {\
  4. int tra=0,i=0;\
  5. unsigned char *bra = (unsigned char*)&(_backbuf);\
  6. unsigned char *dra = (unsigned char*)&(_out);\
  7. unsigned char *cra = (unsigned char*)&(_col);\
  8. for (;i<4;i++) {\
  9. tra = *cra;\
  10. tra += *bra;\
  11. if (tra>255) tra=255;\
  12. *dra = tra;\
  13. ++dra;++cra;++bra;\
  14. }\
  15. }
  16. #define DRAWMETHOD DRAWMETHOD_PLUS(*p,*p,col)
  17. void draw_line (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny)
  18. {
  19. int x, y, dx, dy, yy, xx;
  20. Pixel *p;
  21. if ((y1 < 0) || (y2 < 0) || (x1 < 0) || (x2 < 0) || (y1 >= screeny) || (y2 >= screeny) || (x1 >= screenx) || (x2 >= screenx)) return;
  22. /* clip to top edge
  23. if ((y1 < 0) && (y2 < 0))
  24. return;
  25. if (y1 < 0) {
  26. x1 += (y1 * (x1 - x2)) / (y2 - y1);
  27. y1 = 0;
  28. }
  29. if (y2 < 0) {
  30. x2 += (y2 * (x1 - x2)) / (y2 - y1);
  31. y2 = 0;
  32. }
  33. clip to bottom edge
  34. if ((y1 >= screeny) && (y2 >= screeny))
  35. return;
  36. if (y1 >= screeny) {
  37. x1 -= ((screeny - y1) * (x1 - x2)) / (y2 - y1);
  38. y1 = screeny - 1;
  39. }
  40. if (y2 >= screeny) {
  41. x2 -= ((screeny - y2) * (x1 - x2)) / (y2 - y1);
  42. y2 = screeny - 1;
  43. }
  44. clip to left edge
  45. if ((x1 < 0) && (x2 < 0))
  46. return;
  47. if (x1 < 0) {
  48. y1 += (x1 * (y1 - y2)) / (x2 - x1);
  49. x1 = 0;
  50. }
  51. if (x2 < 0) {
  52. y2 += (x2 * (y1 - y2)) / (x2 - x1);
  53. x2 = 0;
  54. }
  55. clip to right edge
  56. if ((x1 >= screenx) && (x2 >= screenx))
  57. return;
  58. if (x1 >= screenx) {
  59. y1 -= ((screenx - x1) * (y1 - y2)) / (x2 - x1);
  60. x1 = screenx - 1;
  61. }
  62. if (x2 >= screenx) {
  63. y2 -= ((screenx - x2) * (y1 - y2)) / (x2 - x1);
  64. x2 = screenx - 1;
  65. }
  66. */
  67. dx = x2 - x1;
  68. dy = y2 - y1;
  69. if (x1 > x2) {
  70. int tmp;
  71. tmp = x1;
  72. x1 = x2;
  73. x2 = tmp;
  74. tmp = y1;
  75. y1 = y2;
  76. y2 = tmp;
  77. dx = x2 - x1;
  78. dy = y2 - y1;
  79. }
  80. /* vertical line */
  81. if (dx == 0) {
  82. if (y1 < y2) {
  83. p = &(data[(screenx * y1) + x1]);
  84. for (y = y1; y <= y2; y++) {
  85. DRAWMETHOD;
  86. p += screenx;
  87. }
  88. }
  89. else {
  90. p = &(data[(screenx * y2) + x1]);
  91. for (y = y2; y <= y1; y++) {
  92. DRAWMETHOD;
  93. p += screenx;
  94. }
  95. }
  96. return;
  97. }
  98. /* horizontal line */
  99. if (dy == 0) {
  100. if (x1 < x2) {
  101. p = &(data[(screenx * y1) + x1]);
  102. for (x = x1; x <= x2; x++) {
  103. DRAWMETHOD;
  104. p++;
  105. }
  106. return;
  107. }
  108. else {
  109. p = &(data[(screenx * y1) + x2]);
  110. for (x = x2; x <= x1; x++) {
  111. DRAWMETHOD;
  112. p++;
  113. }
  114. return;
  115. }
  116. }
  117. /* 1 */
  118. /* \ */
  119. /* \ */
  120. /* 2 */
  121. if (y2 > y1) {
  122. /* steep */
  123. if (dy > dx) {
  124. dx = ((dx << 16) / dy);
  125. x = x1 << 16;
  126. for (y = y1; y <= y2; y++) {
  127. xx = x >> 16;
  128. p = &(data[(screenx * y) + xx]);
  129. DRAWMETHOD;
  130. if (xx < (screenx - 1)) {
  131. p++;
  132. /* DRAWMETHOD; */
  133. }
  134. x += dx;
  135. }
  136. return;
  137. }
  138. /* shallow */
  139. else {
  140. dy = ((dy << 16) / dx);
  141. y = y1 << 16;
  142. for (x = x1; x <= x2; x++) {
  143. yy = y >> 16;
  144. p = &(data[(screenx * yy) + x]);
  145. DRAWMETHOD;
  146. if (yy < (screeny - 1)) {
  147. p += screeny;
  148. /* DRAWMETHOD; */
  149. }
  150. y += dy;
  151. }
  152. }
  153. }
  154. /* 2 */
  155. /* / */
  156. /* / */
  157. /* 1 */
  158. else {
  159. /* steep */
  160. if (-dy > dx) {
  161. dx = ((dx << 16) / -dy);
  162. x = (x1 + 1) << 16;
  163. for (y = y1; y >= y2; y--) {
  164. xx = x >> 16;
  165. p = &(data[(screenx * y) + xx]);
  166. DRAWMETHOD;
  167. if (xx < (screenx - 1)) {
  168. p--;
  169. /* DRAWMETHOD; */
  170. }
  171. x += dx;
  172. }
  173. return;
  174. }
  175. /* shallow */
  176. else {
  177. dy = ((dy << 16) / dx);
  178. y = y1 << 16;
  179. for (x = x1; x <= x2; x++) {
  180. yy = y >> 16;
  181. p = &(data[(screenx * yy) + x]);
  182. DRAWMETHOD;
  183. if (yy < (screeny - 1)) {
  184. p += screeny;
  185. /* DRAWMETHOD; */
  186. }
  187. y += dy;
  188. }
  189. return;
  190. }
  191. }
  192. }