| Cairo: A Vector Graphics Library | ||||
|---|---|---|---|---|
typedef struct {
cairo_status_t status;
cairo_path_data_t *data;
int num_data;
} cairo_path_t;
A data structure for holding a path. This data structure serves as
the return value for cairo_copy_path_data() and
cairo_copy_path_data_flat() as well the input value for
cairo_append_path().
See cairo_path_data_t for hints on how to iterate over the actual data within the path.
The num_data member gives the number of elements in the data array. This number is larger than the number of independent path portions (defined in cairo_path_data_type_t), since the data includes both headers and coordinates for each portion.
cairo_status_t status; |
the current error status |
cairo_path_data_t *data; |
the elements in the path |
int num_data; |
the number of elements in the data array |
union cairo_path_data_t {
struct {
cairo_path_data_type_t type;
int length;
} header;
struct {
double x, y;
} point;
};
cairo_path_data_t is used to represent the path data inside a cairo_path_t.
The data structure is designed to try to balance the demands of efficiency and ease-of-use. A path is represented as an array of cairo_path_data_t, which is a union of headers and points.
Each portion of the path is represented by one or more elements in the array, (one header followed by 0 or more points). The length value of the header is the number of array elements for the current portion including the header, (ie. length == 1 + # of points), and where the number of points for each element type must be as follows:
CAIRO_PATH_MOVE_TO: 1 point
CAIRO_PATH_LINE_TO: 1 point
CAIRO_PATH_CURVE_TO: 3 points
CAIRO_PATH_CLOSE_PATH: 0 points
The semantics and ordering of the coordinate values are consistent
with cairo_move_to(), cairo_line_to(), cairo_curve_to(), and
cairo_close_path().
Here is sample code for iterating through a cairo_path_t:
int i;
cairo_path_t *path;
cairo_path_data_t *data;
path = cairo_copy_path (cr);
for (i=0; i < path->num_data; i += path->data[i].header.length) {
data = &path->data[i];
switch (data->header.type) {
case CAIRO_PATH_MOVE_TO:
do_move_to_things (data[1].point.x, data[1].point.y);
break;
case CAIRO_PATH_LINE_TO:
do_line_to_things (data[1].point.x, data[1].point.y);
break;
case CAIRO_PATH_CURVE_TO:
do_curve_to_things (data[1].point.x, data[1].point.y,
data[2].point.x, data[2].point.y,
data[3].point.x, data[3].point.y);
break;
case CAIRO_PATH_CLOSE_PATH:
do_close_path_things();
break;
}
}
cairo_path_destroy (path);