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
|
#ifndef BOUNDARIES_H_INCLUDED
#define BOUNDARIES_H_INCLUDED
#include <stdbool.h>
#include <stdint.h>
#include "triangle.h"
typedef struct boundary_info {
/*----------------------------------------------------------------------------
Information about visible triangle rows' boundaries. Also see the
"boundary buffer functions" below.
A "visible" triangle row is one which:
1. Corresponds to a frame buffer row whose index (from top to bottom) is
equal to or greater than 0 and smaller than the image height; and
2. Has at least some of its pixels between the frame buffer columns whose
index (from left to right) is equal to or greater than 0 and smaller
than the image width.
-----------------------------------------------------------------------------*/
int16_t start_scanline;
/* Index of the frame buffer scanline which contains the first visible
row of the current triangle, if there is any such row. If not, it
contains the value -1.
*/
int16_t num_upper_rows;
/* The number of visible rows in the upper part of the triangle. The
upper part of a triangle is composed of all the rows starting from
the top vertex down to the middle vertex, but not including this
last one.
*/
int16_t num_lower_rows;
/* The number of visible rows in the lower part of the triangle. The
lower part of a triangle is composed of all the rows from the
middle vertex to the bottom vertex -- all inclusive.
*/
int16_t * buffer;
/* This is the "boundary buffer": a pointer to an array of int16_t's
where each consecutive pair of values indicates, in this order, the
columns of the left and right boundary pixels for a particular
visible triangle row. Those boundaries are inclusive on both sides
and may be outside the limits of the frame buffer. This field is
initialized and freed by the functions "init_boundary_buffer" and
"free_boundary_buffer", respectively.
*/
} boundary_info;
void
init_boundary_buffer(boundary_info * const bdi,
int16_t const height);
void
free_boundary_buffer(boundary_info *);
bool
gen_triangle_boundaries(Xy const xy,
boundary_info * const bdi,
int16_t const width,
int16_t const height);
void
get_triangle_boundaries(uint16_t const row_index,
int32_t * const left,
int32_t * const right,
const boundary_info * const bdi);
#endif
|