-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathtriangle.c
More file actions
127 lines (105 loc) · 2.63 KB
/
triangle.c
File metadata and controls
127 lines (105 loc) · 2.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#define SHIFT_CONST 6
//TODO Move to some common module
void draw_horizontal_line2(int x1, int y, int x2, unsigned char color,
unsigned char* buffer)
{
int i, swap;
unsigned char* ptr;
//TODO Remove some checks?
if (y >= 0 && y <= 319) {
if (x1 > x2) {
swap = x1;
x1 = x2;
x2 = swap;
}
if (x1 < 0) {
x1 = 0;
}
if (x2 > 319) {
x2 = 319;
}
ptr = buffer + y * 320 + x1;
for (i = x1; i <= x2; i++, ptr++) {
*ptr = color;
}
}
}
void draw_triangle2(int x1, int y1, int x2, int y2, int x3, int y3,
unsigned char color, unsigned char* buffer)
{
int dx12, dx13, dx23, fixedx1, fixedx2, i;
int line_x1, line_x2;
int swap;
if (y1 > y2) {
swap = y1;
y1 = y2;
y2 = swap;
swap = x1;
x1 = x2;
x2 = swap;
}
if (y2 > y3) {
swap = y2;
y2 = y3;
y3 = swap;
swap = x2;
x2 = x3;
x3 = swap;
}
if (y1 > y2) {
swap = y1;
y1 = y2;
y2 = swap;
swap = x1;
x1 = x2;
x2 = swap;
}
if ((i = y2 - y1) != 0)
dx12 = ((x2 - x1) << SHIFT_CONST) / i;
else
dx12 = 0;
if ((i = y3 - y1) != 0)
dx13 = ((x3 - x1) << SHIFT_CONST) / i;
else
dx13 = 0;
if ((i = y3 - y2) != 0)
dx23 = ((x3 - x2) << SHIFT_CONST) / i;
else
dx23 = 0;
fixedx1 = fixedx2 = x1 << SHIFT_CONST;
for (i = y1; i < y2; i++) {
if (i >= 0 && i <= 199) {
line_x1 = fixedx1 >> SHIFT_CONST;
line_x2 = fixedx2 >> SHIFT_CONST;
if (line_x1 < 0)
line_x1 = 0;
else if (line_x1 > 319)
line_x1 = 319;
if (line_x2 < 0)
line_x2 = 0;
else if (line_x2 > 319)
line_x2 = 319;
draw_horizontal_line2(line_x1, i, line_x2, color, buffer);
}
fixedx1 += dx13;
fixedx2 += dx12;
}
fixedx2 = x2 << SHIFT_CONST;
for (i = y2; i < y3; i++) {
if (i >= 0 && i <= 199) {
line_x1 = fixedx1 >> SHIFT_CONST;
line_x2 = fixedx2 >> SHIFT_CONST;
if (line_x1 < 0)
line_x1 = 0;
else if (line_x1 > 319)
line_x1 = 319;
if (line_x2 < 0)
line_x2 = 0;
else if (line_x2 > 319)
line_x2 = 319;
draw_horizontal_line2(line_x1, i, line_x2, color, buffer);
}
fixedx1 += dx13;
fixedx2 += dx23;
}
}