| 72 | |
| 73 | |
| 74 | int FastLineClip::LineClip(double *x0, double *y0, double *x1, double *y1) |
| 75 | { |
| 76 | int Code= 0; |
| 77 | int visible= 0; // visible state |
| 78 | |
| 79 | FC_xn= *x0; FC_yn= *y0; |
| 80 | FC_xk= *x1; FC_yk= *y1; |
| 81 | |
| 82 | |
| 83 | // "Code" evaluation - bits 0..3 - end point, bits 4..7 - start point. |
| 84 | |
| 85 | //start point is |
| 86 | if (FC_yk > Wybot) Code|= 0x08; else //lower |
| 87 | if (FC_yk < Wytop) Code|= 0x04; //higher |
| 88 | |
| 89 | if (FC_xk > Wxrig) Code|= 0x02; else //righter |
| 90 | if (FC_xk < Wxlef) Code|= 0x01; //lefter |
| 91 | |
| 92 | //end point is |
| 93 | if (FC_yn > Wybot) Code|= 0x80; else //lower |
| 94 | if (FC_yn < Wytop) Code|= 0x40; //higher |
| 95 | |
| 96 | if (FC_xn > Wxrig) Code|= 0x20; else //righter |
| 97 | if (FC_xn < Wxlef) Code|= 0x10; //lefter |
| 98 | |
| 99 | // Clipping for each of 81 cases. |
| 100 | switch (Code) { |
| 101 | |
| 102 | // From center |
| 103 | |
| 104 | case 0x00: ++visible; break; |
| 105 | case 0x01: Clip1_Left() ; ++visible; break; |
| 106 | case 0x02: Clip1_Right(); ++visible; break; |
| 107 | case 0x04: Clip1_Top(); ++visible; break; |
| 108 | case 0x05: Clip1_Left() ; |
| 109 | if (FC_yk < Wytop) Clip1_Top(); |
| 110 | ++visible; break; |
| 111 | case 0x06: Clip1_Right(); |
| 112 | if (FC_yk < Wytop) Clip1_Top(); |
| 113 | ++visible; break; |
| 114 | case 0x08: Clip1_Bottom(); ++visible; break; |
| 115 | case 0x09: Clip1_Left() ; |
| 116 | if (FC_yk > Wybot) Clip1_Bottom(); |
| 117 | ++visible; break; |
| 118 | case 0x0A: Clip1_Right(); |
| 119 | if (FC_yk > Wybot) Clip1_Bottom(); |
| 120 | ++visible; break; |
| 121 | |
| 122 | |
| 123 | |
| 124 | |
| 125 | |
| 126 | //From left |
| 127 | |
| 128 | case 0x10: Clip0_Left(); ++visible; |
| 129 | case 0x11: break; |
| 130 | case 0x12: Clip0_Left(); Clip1_Right(); |
| 131 | ++visible; break; |