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
|
#include <grass/gis.h>
#include "path.h"
void path_init(struct path *p)
{
p->vertices = NULL;
p->count = 0;
p->alloc = 0;
p->start = -1;
}
void path_free(struct path *p)
{
if (p->vertices)
G_free(p->vertices);
p->count = 0;
p->alloc = 0;
p->start = -1;
}
void path_alloc(struct path *p, int n)
{
if (p->alloc >= n)
return;
p->alloc = n;
p->vertices = G_realloc(p->vertices, p->alloc * sizeof(struct vertex));
}
void path_reset(struct path *p)
{
p->count = 0;
p->start = -1;
}
void path_append(struct path *p, double x, double y, int mode)
{
struct vertex *v;
if (p->count >= p->alloc)
path_alloc(p, p->alloc ? p->alloc * 2 : 100);
v = &p->vertices[p->count++];
v->x = x;
v->y = y;
v->mode = mode;
}
void path_copy(struct path *dst, const struct path *src)
{
int i;
path_reset(dst);
path_alloc(dst, src->count);
for (i = 0; i < src->count; i++) {
struct vertex *v = &src->vertices[i];
path_append(dst, v->x, v->y, v->mode);
}
dst->start = src->start;
}
void path_begin(struct path *p)
{
p->count = 0;
p->start = -1;
}
void path_move(struct path *p, double x, double y)
{
p->start = p->count;
path_append(p, x, y, P_MOVE);
}
void path_cont(struct path *p, double x, double y)
{
path_append(p, x, y, P_CONT);
}
void path_close(struct path *p)
{
struct vertex *v;
if (p->start < 0)
return;
v = &p->vertices[p->start];
path_append(p, v->x, v->y, P_CLOSE);
p->start = -1;
}
void path_stroke(struct path *p, void (*line)(double, double, double, double))
{
int i;
for (i = 1; i < p->count; i++) {
struct vertex *v0 = &p->vertices[i - 1];
struct vertex *v1 = &p->vertices[i];
if (v1->mode != P_MOVE)
(*line)(v0->x, v0->y, v1->x, v1->y);
}
path_reset(p);
}
|