Subversion Repositories Games.Descent

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1 pmbaty 1
/*
2
 * Portions of this file are copyright Rebirth contributors and licensed as
3
 * described in COPYING.txt.
4
 * Portions of this file are copyright Parallax Software and licensed
5
 * according to the Parallax license below.
6
 * See COPYING.txt for license details.
7
 
8
THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
9
SOFTWARE CORPORATION ("PARALLAX").  PARALLAX, IN DISTRIBUTING THE CODE TO
10
END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
11
ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
12
IN USING, DISPLAYING,  AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
13
SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
14
FREE PURPOSES.  IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
15
CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES.  THE END-USER UNDERSTANDS
16
AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
17
COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION.  ALL RIGHTS RESERVED.
18
*/
19
/*
20
 *
21
 * Macros used for clipping
22
 *
23
 */
24
 
25
 
26
// sort two values
27
#define SORT2(a,b) do {                                                 \
28
        using std::swap;        \
29
        if((a) > (b)) swap(a,b);                                           \
30
} while(0)
31
 
32
# define FIXSCALE(var,arg,num,den) ((var) = fixmuldiv((arg),(num),(den)))
33
 
34
#define CLIPLINE(x1,y1,x2,y2,XMIN,YMIN,XMAX,YMAX,WHEN_OUTSIDE,WHEN_CLIPPED,MY_SCALE) do {       \
35
        int temp;                                                  \
36
        if(y1 > y2)                                                         \
37
                {                                                                                                                               \
38
                        using std::swap;        \
39
                        swap(y1,y2); swap(x1,x2); }                                 \
40
        if((y2 < YMIN) || (y1 > YMAX))                                      \
41
                { WHEN_OUTSIDE; }                                               \
42
        if(x1 < x2) {                                                       \
43
                if((x2 < XMIN) || (x1 > XMAX)) {                                \
44
                        WHEN_OUTSIDE;                                               \
45
                }                                                               \
46
                if(x1 < XMIN) {                                                 \
47
                        MY_SCALE(temp,(y2 - y1),(XMIN - x1),(x2 - x1)); \
48
                        if((y1 += temp) > YMAX) { WHEN_OUTSIDE; }                   \
49
                        x1 = XMIN;                                                  \
50
                        WHEN_CLIPPED;                                               \
51
                }                                                               \
52
                if(x2 > XMAX) {                                                 \
53
                        MY_SCALE(temp,(y2 - y1),(x2 - XMAX),(x2 - x1)); \
54
                        if((y2 -= temp) < YMIN) { WHEN_OUTSIDE; }                   \
55
                        x2 = XMAX;                                                  \
56
                        WHEN_CLIPPED;                                               \
57
                }                                                               \
58
                if(y1 < YMIN) {                                                 \
59
                        MY_SCALE(temp,(x2 - x1),(YMIN - y1),(y2 - y1)); \
60
                        x1 += temp;                                                 \
61
                        y1 = YMIN;                                                  \
62
                        WHEN_CLIPPED;                                               \
63
                }                                                               \
64
                if(y2 > YMAX) {                                                 \
65
                        MY_SCALE(temp,(x2 - x1),(y2 - YMAX),(y2 - y1)); \
66
                        x2 -= temp;                                                 \
67
                        y2 = YMAX;                                                  \
68
                        WHEN_CLIPPED;                                               \
69
                }                                                               \
70
        }                                                                   \
71
        else {                                                              \
72
                if((x1 < XMIN) || (x2 > XMAX)) {                                \
73
                        WHEN_OUTSIDE;                                               \
74
                }                                                               \
75
                if(x1 > XMAX) {                                                 \
76
                        MY_SCALE(temp,(y2 - y1),(x1 - XMAX),(x1 - x2)); \
77
                        if((y1 += temp) > YMAX) { WHEN_OUTSIDE; }                   \
78
                        x1 = XMAX;                                                  \
79
                        WHEN_CLIPPED;                                               \
80
                }                                                               \
81
                if(x2 < XMIN) {                                                 \
82
                        MY_SCALE(temp,(y2 - y1),(XMIN - x2),(x1 - x2)); \
83
                        if((y2 -= temp) < YMIN) { WHEN_OUTSIDE; }                   \
84
                        x2 = XMIN;                                                  \
85
                        WHEN_CLIPPED;                                               \
86
                }                                                               \
87
                if(y1 < YMIN) {                                                 \
88
                        MY_SCALE(temp,(x1 - x2),(YMIN - y1),(y2 - y1)); \
89
                        x1 -= temp;                                                 \
90
                        y1 = YMIN;                                                  \
91
                        WHEN_CLIPPED;                                               \
92
                }                                                               \
93
                if(y2 > YMAX) {                                                 \
94
                        MY_SCALE(temp,(x1 - x2),(y2 - YMAX),(y2 - y1)); \
95
                        x2 += temp;                                                 \
96
                        y2 = YMAX;                                                  \
97
                        WHEN_CLIPPED;                                               \
98
                }                                                               \
99
        }                                                                   \
100
} while(0)