annotate dmline.c @ 133:92cc5e1fa180

Some work on line drawing routines.
author Matti Hamalainen <ccr@tnsp.org>
date Fri, 05 Oct 2012 00:36:40 +0300
parents 997e26f17946
children 79dac918c81e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1 /*
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
2 * DMLib
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
3 * -- Arbitrary line drawing functions
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
4 * Programmed and designed by Matti 'ccr' Hamalainen
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
5 * (C) Copyright 2011 Tecnic Software productions (TNSP)
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
6 */
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
7 #include "dmlib.h"
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
8
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
9
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
10 /* Clip line coordinates. Return value:
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
11 * = 0 : No clipping needed.
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
12 * > 0 : Clipped. Line partially inside the clipping area.
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
13 * < 0 : Line completely outside the clipping area.
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
14 */
133
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
15 #define dmClipBits(Q, x, y) \
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
16 do { \
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
17 Q = 0; \
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
18 if (x < clipX0) Q |= 1; \
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
19 else \
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
20 if (x > clipX1) Q |= 2; \
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
21 if (y < clipY0) Q |= 4; \
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
22 else \
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
23 if (y > clipY1) Q |= 8; \
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
24 } while (0)
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
25
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
26 #define xA (*x0)
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
27 #define xB (*x1)
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
28 #define yA (*y0)
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
29 #define yB (*y1)
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
30
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
31 int dmClipLineCoords(int *x0, int *y0, int *x1, int *y1, SDL_Surface *screen)
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
32 {
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
33 const int clipX0 = screen->clip_rect.x,
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
34 clipY0 = screen->clip_rect.y;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
35 const int clipX1 = clipX0 + screen->clip_rect.w - 1,
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
36 clipY1 = clipY0 + screen->clip_rect.h - 1;
133
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
37
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
38 int cA, cB;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
39
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
40 dmClipBits(cA, xA, yA);
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
41 dmClipBits(cB, xB, yB);
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
42
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
43 if (cA & cB)
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
44 return -1; /* the line segment is outside */
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
45
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
46 if ((cA | cB) == 0) /* the line segment is inside of the clipping rectangle */
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
47 return 0;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
48
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
49 #if 1
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
50 // Cohen-Sutherland clipping method
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
51 do
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
52 {
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
53 const int c = cA ? cA : cB;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
54 int x, y;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
55
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
56 if (c & 1)
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
57 {
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
58 y = yA + ((clipX0 - xA)*(yB - yA)) / (xB - xA);
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
59 x = clipX0;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
60 }
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
61 else
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
62 if (c & 2)
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
63 {
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
64 y = yA + ((clipX1 - xA)*(yB - yA)) / (xB - xA);
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
65 x = clipX1;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
66 }
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
67 else
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
68 if (c & 4)
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
69 {
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
70 x = xA + ((clipY0 - yA)*(xB - xA)) / (yB - yA);
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
71 y = clipY0;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
72 }
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
73 else
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
74 if (c & 8)
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
75 {
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
76 x = xA + ((clipY1 - yA)*(xB - xA)) / (yB - yA);
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
77 y = clipY1;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
78 }
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
79
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
80 if (c == cA)
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
81 {
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
82 xA = x;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
83 yA = y;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
84 dmClipBits(cA, xA, yA);
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
85 }
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
86 else
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
87 {
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
88 xB = x;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
89 yB = y;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
90 dmClipBits(cB, xB, yB);
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
91 }
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
92
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
93 } while (cA | cB);
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
94 #else
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
95 // Buyu-Skala clipping method
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
96 const int dx = xB - xA;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
97 const int dy = yB - yA;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
98 float k, m;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
99 int z;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
100
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
101 switch (cA + cB)
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
102 {
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
103 case 1:
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
104 if (cA == 1)
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
105 {
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
106 xA = clipX0;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
107 yA = (clipX0 - xB) * dy / dx + yB;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
108 }
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
109 else
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
110 {
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
111 xB = clipX0;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
112 yB = (clipX0 - xA) * dy / dx + yA;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
113 }
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
114 break;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
115
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
116 case 3:
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
117 k = dy / dx;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
118 yA = (clipX0 - xA) * k + yA;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
119 xA = clipX0;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
120 yB = (clipX1 - xB) * k + yB;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
121 xB = clipX1;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
122 break;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
123
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
124 case 5:
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
125 k = dy / dx;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
126 z = (clipX0 - xA) * k + yA;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
127 if (z < clipY0)
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
128 {
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
129 switch (cA)
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
130 {
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
131 case 0:
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
132 xB = xB + (clipY0 - yB) / k;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
133 yB = clipY0;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
134 break;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
135 case 5:
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
136 xA = xA + (clipY0 - yA) / k;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
137 yA = clipY0;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
138 break;
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
139
133
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
140 default:
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
141 return -1; /* the line segment is outside */
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
142 }
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
143 }
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
144 else
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
145 {
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
146 switch (cA)
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
147 {
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
148 case 0:
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
149 xB = clipX0;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
150 yB = z;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
151 break;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
152 case 1:
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
153 xB = xB + (clipY0 - yB) / k;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
154 yB = clipY0;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
155 xA = clipX0;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
156 yA = z;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
157 break;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
158 case 4:
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
159 xA = xA + (clipY0 - yA) / k;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
160 yA = clipY0;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
161 xB = clipX0;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
162 yB = z;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
163 break;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
164 case 5:
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
165 xA = clipX0;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
166 yA = z;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
167 break;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
168 }
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
169 }
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
170 break;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
171
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
172 case 7:
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
173 switch (cA)
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
174 {
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
175 case 1:
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
176 k = dy / dx;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
177 yA = (clipX0 - xB) * k + yB;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
178 if (yA < clipY0)
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
179 return -1; /* the line segment is outside */
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
180 xA = clipX0;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
181 yB = (clipX1 - clipX0) * k + yA;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
182 if (yB < clipY0)
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
183 {
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
184 xB = (clipY0 - yB) / k + clipX1;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
185 yB = clipY0;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
186 }
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
187 else
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
188 xB = clipX1;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
189 break;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
190
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
191 /* similarly for cases cA == 2, 5, 6 */
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
192 }
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
193 case 15:
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
194 switch (cA)
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
195 {
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
196 case 5:
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
197 if (dy * (clipX1 - clipX0) < dx * (clipY1 - clipY0))
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
198 {
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
199 k = dy / dx;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
200 yA = (clipX0 - xB) * k + yB;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
201 if (yA > clipY1)
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
202 return -1; /* the line segment is outside */
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
203 yB = (clipX1 - clipX0) * k + yA;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
204 if (yB < clipY0)
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
205 return -1; /* the line segment is outside */
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
206 if (yA < clipY0)
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
207 {
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
208 xA = (clipY0 - yA) / k + clipX0;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
209 yA = clipY0;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
210 xB = clipX1;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
211 }
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
212 else
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
213 {
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
214 xA = clipX0;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
215 if (yB > clipY1)
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
216 {
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
217 xB = (clipY1 - yB) / k + clipX1;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
218 yB = clipY1;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
219 }
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
220 else
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
221 xB = clipX1;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
222 }
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
223 }
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
224 else
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
225 {
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
226 m = dx / dy;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
227 xA = (clipY0 - yB) * m + xB;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
228 if (xA > clipX1)
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
229 return -1; /* the line segment is outside */
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
230 xB = (clipY1 - clipY0) * m + xA;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
231 if (xB < clipX0)
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
232 return -1; /* the line segment is outside */
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
233 if (xA < clipX0)
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
234 {
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
235 yA = (clipX0 - xA) / m + clipY0;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
236 xA = clipX0;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
237 yB = clipY1;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
238 }
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
239 else
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
240 {
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
241 yA = clipY0;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
242 if (xB > clipX1)
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
243 {
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
244 yB = (clipX1 - xB) / m + clipY1;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
245 xB = clipX1;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
246 }
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
247 else
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
248 yB = clipY1;
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
249 }
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
250 }
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
251
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
252 /* similarly for cases cA == 6, 9, 10 */
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
253 }
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
254
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
255 /* cases 2, 4, 8 are similar as case 1, cases 6, 9, 10 are similar as case 5 */
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
256 /* cases 11, 13, 14 are similar as case 7, case 12 is similar case 3 */
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
257 } /* of case cA + cB */
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
258 #endif
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
259
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
260 return 1;
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
261 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
262
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
263
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
264
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
265 #include "dmlinefunc.h"
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
266
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
267 static const DMDrawLineFunc dmDrawLineTable[DMD_NMODES][DMD_NBITDEPTHS] =
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
268 {
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
269 /* DMD_NONE */ { dmDrawLine8 , dmDrawLine32 },
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
270 /* DMD_TRANSPARENT */ { dmDrawLine8Transparent , dmDrawLine32Transparent },
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
271 /* DMD_SATURATE */ { dmDrawLine8Saturate , dmDrawLine32Saturate },
133
92cc5e1fa180 Some work on line drawing routines.
Matti Hamalainen <ccr@tnsp.org>
parents: 22
diff changeset
272 #if 0
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
273 /* DMD_NONE + AA */ { NULL, NULL },
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
274 /* DMD_TRANSP + AA */ { NULL, NULL },
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
275 /* DMD_SATURATE + AA */ { dmDrawLine8AASaturate , dmDrawLine32AASaturate },
22
997e26f17946 Initial fixes for getting the line drawing functions "working".
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
276 #endif
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
277 };
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
278
22
997e26f17946 Initial fixes for getting the line drawing functions "working".
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
279 static const int ndmDrawLineTable = sizeof(dmDrawLineTable) / sizeof(dmDrawLineTable[0]);
997e26f17946 Initial fixes for getting the line drawing functions "working".
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
280
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
281
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
282 DMDrawLineFunc dmGetDrawLineFunc(SDL_PixelFormat *dst, int mode)
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
283 {
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
284 int index;
22
997e26f17946 Initial fixes for getting the line drawing functions "working".
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
285 if (dst == NULL || mode < 0 || mode >= ndmDrawLineTable)
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
286 return NULL;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
287
22
997e26f17946 Initial fixes for getting the line drawing functions "working".
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
288 if ((index = dmBitsPerPixel2Index(dst->BitsPerPixel)) < 0)
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
289 return NULL;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
290
22
997e26f17946 Initial fixes for getting the line drawing functions "working".
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
291 return dmDrawLineTable[mode][index];
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
292 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
293
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
294
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
295 int dmDrawLineAny(SDL_Surface *screen, int x0, int y0, int x1, int y1, const Uint32 col, int mode)
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
296 {
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
297 DMDrawLineFunc bfunc = dmGetDrawLineFunc(screen->format, mode);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
298
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
299 if (bfunc == NULL)
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
300 return -15;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
301
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
302 return bfunc(screen, x0, y0, x1, y1, col);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
303 }