CLIP.H 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. /*
  2. THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
  3. SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO
  4. END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
  5. ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
  6. IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
  7. SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
  8. FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
  9. CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS
  10. AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
  11. COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
  12. */
  13. #define MIN(a,b) (((a) < (b)) ? (a) : (b))
  14. #define MAX(a,b) (((a) > (b)) ? (a) : (b))
  15. #define IABS(x) (((x) < 0) ? -(x) : (x))
  16. #define EXCHG(a,b) do { \
  17. int __temp__ = (a); \
  18. (a) = (b); \
  19. (b) = __temp__; \
  20. } while(0)
  21. // sort two values
  22. #define SORT2(a,b) do { \
  23. if((a) > (b)) EXCHG(a,b); \
  24. } while(0)
  25. # define SCALE(var,arg,num,den) \
  26. ((var) = ((arg) * (num)) / (den))
  27. # define USCALE(var,arg,num,den) \
  28. ((var) = ((unsigned)(arg) * (unsigned)(num)) / (unsigned)(den))
  29. # define FSCALE(var,arg,num,den) ((var) = fixmuldiv((arg),(num),(den)))
  30. #define CLIPDOT(xx,yy,WHEN_OUTSIDE,WHEN_CLIPPED) { \
  31. if((xx > XMAX) || (xx < XMIN)) { WHEN_OUTSIDE; } \
  32. if((yy > YMAX) || (yy < YMIN)) { WHEN_OUTSIDE; } \
  33. }
  34. #define CLIPHLINE(x1,x2,yy,WHEN_OUTSIDE,WHEN_CLIPPED) { \
  35. if(x1 > x2) EXCHG(x1,x2); \
  36. if((x1 > XMAX) || (x2 < XMIN)) { WHEN_OUTSIDE; } \
  37. if((yy > YMAX) || (yy < YMIN)) { WHEN_OUTSIDE; } \
  38. if(x1 < XMIN) { x1 = XMIN; WHEN_CLIPPED; } \
  39. if(x2 > XMAX) { x2 = XMAX; WHEN_CLIPPED; } \
  40. }
  41. #define CLIPVLINE(xx,y1,y2,WHEN_OUTSIDE,WHEN_CLIPPED) { \
  42. if(y1 > y2) EXCHG(y1,y2); \
  43. if((xx > XMAX) || (xx < XMIN)) { WHEN_OUTSIDE; } \
  44. if((y1 > YMAX) || (y2 < YMIN)) { WHEN_OUTSIDE; } \
  45. if(y1 < YMIN) { y1 = YMIN; WHEN_CLIPPED; } \
  46. if(y2 > YMAX) { y2 = YMAX; WHEN_CLIPPED; } \
  47. }
  48. #define CLIPBOX(x1,y1,x2,y2,WHEN_OUTSIDE,WHEN_CLIPPED) { \
  49. if(x1 > x2) EXCHG(x1,x2); \
  50. if(y1 > y2) EXCHG(y1,y2); \
  51. if((x1 > XMAX) || (x2 < 0)) { WHEN_OUTSIDE; } \
  52. if((y1 > YMAX) || (y2 < 0)) { WHEN_OUTSIDE; } \
  53. if(x1 < 0) { x1 = 0; WHEN_CLIPPED; } \
  54. if(y1 < 0) { y1 = 0; WHEN_CLIPPED; } \
  55. if(x2 > XMAX) { x2 = XMAX; WHEN_CLIPPED; } \
  56. if(y2 > YMAX) { y2 = YMAX; WHEN_CLIPPED; } \
  57. }
  58. #define CLIPLINE(x1,y1,x2,y2,XMIN,YMIN,XMAX,YMAX,WHEN_OUTSIDE,WHEN_CLIPPED,MY_SCALE) do { \
  59. register int temp; \
  60. \
  61. if(y1 > y2) \
  62. { EXCHG(y1,y2); EXCHG(x1,x2); } \
  63. if((y2 < YMIN) || (y1 > YMAX)) \
  64. { WHEN_OUTSIDE; } \
  65. if(x1 < x2) { \
  66. if((x2 < XMIN) || (x1 > XMAX)) { \
  67. WHEN_OUTSIDE; \
  68. } \
  69. if(x1 < XMIN) { \
  70. MY_SCALE(temp,(y2 - y1),(XMIN - x1),(x2 - x1)); \
  71. if((y1 += temp) > YMAX) { WHEN_OUTSIDE; } \
  72. x1 = XMIN; \
  73. WHEN_CLIPPED; \
  74. } \
  75. if(x2 > XMAX) { \
  76. MY_SCALE(temp,(y2 - y1),(x2 - XMAX),(x2 - x1)); \
  77. if((y2 -= temp) < YMIN) { WHEN_OUTSIDE; } \
  78. x2 = XMAX; \
  79. WHEN_CLIPPED; \
  80. } \
  81. if(y1 < YMIN) { \
  82. MY_SCALE(temp,(x2 - x1),(YMIN - y1),(y2 - y1)); \
  83. x1 += temp; \
  84. y1 = YMIN; \
  85. WHEN_CLIPPED; \
  86. } \
  87. if(y2 > YMAX) { \
  88. MY_SCALE(temp,(x2 - x1),(y2 - YMAX),(y2 - y1)); \
  89. x2 -= temp; \
  90. y2 = YMAX; \
  91. WHEN_CLIPPED; \
  92. } \
  93. } \
  94. else { \
  95. if((x1 < XMIN) || (x2 > XMAX)) { \
  96. WHEN_OUTSIDE; \
  97. } \
  98. if(x1 > XMAX) { \
  99. MY_SCALE(temp,(y2 - y1),(x1 - XMAX),(x1 - x2)); \
  100. if((y1 += temp) > YMAX) { WHEN_OUTSIDE; } \
  101. x1 = XMAX; \
  102. WHEN_CLIPPED; \
  103. } \
  104. if(x2 < XMIN) { \
  105. MY_SCALE(temp,(y2 - y1),(XMIN - x2),(x1 - x2)); \
  106. if((y2 -= temp) < YMIN) { WHEN_OUTSIDE; } \
  107. x2 = XMIN; \
  108. WHEN_CLIPPED; \
  109. } \
  110. if(y1 < YMIN) { \
  111. MY_SCALE(temp,(x1 - x2),(YMIN - y1),(y2 - y1)); \
  112. x1 -= temp; \
  113. y1 = YMIN; \
  114. WHEN_CLIPPED; \
  115. } \
  116. if(y2 > YMAX) { \
  117. MY_SCALE(temp,(x1 - x2),(y2 - YMAX),(y2 - y1)); \
  118. x2 += temp; \
  119. y2 = YMAX; \
  120. WHEN_CLIPPED; \
  121. } \
  122. } \
  123. } while(0)