1 /* 2 * Copyright (C) Volition, Inc. 1999. All rights reserved. 3 * 4 * All source code herein is the property of Volition, Inc. You may not sell 5 * or otherwise commercially exploit the source or things you created based on the 6 * source. 7 * 8 */ 9 10 11 12 #ifndef _LINE_H 13 #define _LINE_H 14 15 //void gr8_line(int x1,int y1,int x2,int y2, bool b); 16 //void gr8_aaline(vertex *v1, vertex *v2); 17 18 19 #define INT_EXCHG(a,b) do { \ 20 int __temp__ = (a); \ 21 (a) = (b); \ 22 (b) = __temp__; \ 23 } while(false) 24 25 //#define INT_SCALE(var,arg,num,den) ((var) = ((arg) * (num)) / (den)) 26 #define INT_SCALE(var,arg,num,den) ((var) = MulDiv(arg, num, den)) 27 28 #define INT_CLIPLINE(x1,y1,x2,y2,XMIN,YMIN,XMAX,YMAX,WHEN_OUTSIDE,WHEN_CLIPPED,WHEN_SWAPPED) do { \ 29 int temp; \ 30 \ 31 if(y1 > y2) \ 32 { INT_EXCHG(y1,y2); INT_EXCHG(x1,x2); WHEN_SWAPPED; } \ 33 if((y2 < YMIN) || (y1 > YMAX)) \ 34 { WHEN_OUTSIDE; } \ 35 if(x1 < x2) { \ 36 if((x2 < XMIN) || (x1 > XMAX)) { \ 37 WHEN_OUTSIDE; \ 38 } \ 39 if(x1 < XMIN) { \ 40 INT_SCALE(temp,(y2 - y1),(XMIN - x1),(x2 - x1)); \ 41 if((y1 += temp) > YMAX) { WHEN_OUTSIDE; } \ 42 x1 = XMIN; \ 43 WHEN_CLIPPED; \ 44 } \ 45 if(x2 > XMAX) { \ 46 INT_SCALE(temp,(y2 - y1),(x2 - XMAX),(x2 - x1)); \ 47 if((y2 -= temp) < YMIN) { WHEN_OUTSIDE; } \ 48 x2 = XMAX; \ 49 WHEN_CLIPPED; \ 50 } \ 51 if(y1 < YMIN) { \ 52 INT_SCALE(temp,(x2 - x1),(YMIN - y1),(y2 - y1)); \ 53 x1 += temp; \ 54 y1 = YMIN; \ 55 WHEN_CLIPPED; \ 56 } \ 57 if(y2 > YMAX) { \ 58 INT_SCALE(temp,(x2 - x1),(y2 - YMAX),(y2 - y1)); \ 59 x2 -= temp; \ 60 y2 = YMAX; \ 61 WHEN_CLIPPED; \ 62 } \ 63 } \ 64 else { \ 65 if((x1 < XMIN) || (x2 > XMAX)) { \ 66 WHEN_OUTSIDE; \ 67 } \ 68 if(x1 > XMAX) { \ 69 INT_SCALE(temp,(y2 - y1),(x1 - XMAX),(x1 - x2)); \ 70 if((y1 += temp) > YMAX) { WHEN_OUTSIDE; } \ 71 x1 = XMAX; \ 72 WHEN_CLIPPED; \ 73 } \ 74 if(x2 < XMIN) { \ 75 INT_SCALE(temp,(y2 - y1),(XMIN - x2),(x1 - x2)); \ 76 if((y2 -= temp) < YMIN) { WHEN_OUTSIDE; } \ 77 x2 = XMIN; \ 78 WHEN_CLIPPED; \ 79 } \ 80 if(y1 < YMIN) { \ 81 INT_SCALE(temp,(x1 - x2),(YMIN - y1),(y2 - y1)); \ 82 x1 -= temp; \ 83 y1 = YMIN; \ 84 WHEN_CLIPPED; \ 85 } \ 86 if(y2 > YMAX) { \ 87 INT_SCALE(temp,(x1 - x2),(y2 - YMAX),(y2 - y1)); \ 88 x2 += temp; \ 89 y2 = YMAX; \ 90 WHEN_CLIPPED; \ 91 } \ 92 } \ 93 } while(false) 94 95 #define FL_EXCHG(a,b) do { \ 96 float __temp__ = (a); \ 97 (a) = (b); \ 98 (b) = __temp__; \ 99 } while(false) 100 101 #define FL_SCALE(var,arg,num,den) ((var) = ((arg) * (num)) / (den)) 102 103 #define FL_CLIPLINE(x1,y1,x2,y2,XMIN,YMIN,XMAX,YMAX,WHEN_OUTSIDE,WHEN_CLIPPED,WHEN_SWAPPED) do { \ 104 float temp; \ 105 \ 106 if(y1 > y2) \ 107 { FL_EXCHG(y1,y2); FL_EXCHG(x1,x2); WHEN_SWAPPED; } \ 108 if((y2 < YMIN) || (y1 > YMAX)) \ 109 { WHEN_OUTSIDE; } \ 110 if(x1 < x2) { \ 111 if((x2 < XMIN) || (x1 > XMAX)) { \ 112 WHEN_OUTSIDE; \ 113 } \ 114 if(x1 < XMIN) { \ 115 FL_SCALE(temp,(y2 - y1),(XMIN - x1),(x2 - x1)); \ 116 if((y1 += temp) > YMAX) { WHEN_OUTSIDE; } \ 117 x1 = XMIN; \ 118 WHEN_CLIPPED; \ 119 } \ 120 if(x2 > XMAX) { \ 121 FL_SCALE(temp,(y2 - y1),(x2 - XMAX),(x2 - x1)); \ 122 if((y2 -= temp) < YMIN) { WHEN_OUTSIDE; } \ 123 x2 = XMAX; \ 124 WHEN_CLIPPED; \ 125 } \ 126 if(y1 < YMIN) { \ 127 FL_SCALE(temp,(x2 - x1),(YMIN - y1),(y2 - y1)); \ 128 x1 += temp; \ 129 y1 = YMIN; \ 130 WHEN_CLIPPED; \ 131 } \ 132 if(y2 > YMAX) { \ 133 FL_SCALE(temp,(x2 - x1),(y2 - YMAX),(y2 - y1)); \ 134 x2 -= temp; \ 135 y2 = YMAX; \ 136 WHEN_CLIPPED; \ 137 } \ 138 } \ 139 else { \ 140 if((x1 < XMIN) || (x2 > XMAX)) { \ 141 WHEN_OUTSIDE; \ 142 } \ 143 if(x1 > XMAX) { \ 144 FL_SCALE(temp,(y2 - y1),(x1 - XMAX),(x1 - x2)); \ 145 if((y1 += temp) > YMAX) { WHEN_OUTSIDE; } \ 146 x1 = XMAX; \ 147 WHEN_CLIPPED; \ 148 } \ 149 if(x2 < XMIN) { \ 150 FL_SCALE(temp,(y2 - y1),(XMIN - x2),(x1 - x2)); \ 151 if((y2 -= temp) < YMIN) { WHEN_OUTSIDE; } \ 152 x2 = XMIN; \ 153 WHEN_CLIPPED; \ 154 } \ 155 if(y1 < YMIN) { \ 156 FL_SCALE(temp,(x1 - x2),(YMIN - y1),(y2 - y1)); \ 157 x1 -= temp; \ 158 y1 = YMIN; \ 159 WHEN_CLIPPED; \ 160 } \ 161 if(y2 > YMAX) { \ 162 FL_SCALE(temp,(x1 - x2),(y2 - YMAX),(y2 - y1)); \ 163 x2 += temp; \ 164 y2 = YMAX; \ 165 WHEN_CLIPPED; \ 166 } \ 167 } \ 168 } while(false) 169 170 #endif 171