git.asbjorn.biz
/
swftools.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
several small fixes in polygon code
[swftools.git]
/
lib
/
gfxpoly
/
convert.c
diff --git
a/lib/gfxpoly/convert.c
b/lib/gfxpoly/convert.c
index
5619f79
..
ad884f1
100644
(file)
--- a/
lib/gfxpoly/convert.c
+++ b/
lib/gfxpoly/convert.c
@@
-188,24
+188,20
@@
typedef struct _compactpoly {
segment_dir_t dir;
} compactpoly_t;
segment_dir_t dir;
} compactpoly_t;
-void add_segment(compactpoly_t*data, point_t start, segment_dir_t dir)
+void finish_segment(compactpoly_t*data)
{
{
+ if(data->num_points <= 1)
+ return;
if(data->poly->num_strokes == data->strokes_size) {
data->strokes_size <<= 1;
assert(data->strokes_size > data->poly->num_strokes);
if(data->poly->num_strokes == data->strokes_size) {
data->strokes_size <<= 1;
assert(data->strokes_size > data->poly->num_strokes);
- data->poly->strokes = rfx_realloc(data->poly->strokes, data->strokes_size);
+ data->poly->strokes = rfx_realloc(data->poly->strokes, sizeof(gfxstroke_t)*data->strokes_size);
}
}
- data->poly->strokes[data->poly->num_strokes].dir = dir;
- data->points[0] = start;
- data->num_points = 1;
- data->dir = dir;
-}
-void finish_segment(compactpoly_t*data)
-{
- if(data->num_points <= 1)
- return;
point_t*p = malloc(sizeof(point_t)*data->num_points);
point_t*p = malloc(sizeof(point_t)*data->num_points);
- data->poly->strokes[data->poly->num_strokes-1].points = p;
+ gfxstroke_t*s = &data->poly->strokes[data->poly->num_strokes];
+ s->num_points = data->num_points;
+ s->dir = data->dir;
+ s->points = p;
if(data->dir == DIR_UP) {
int t;
int s = data->num_points;
if(data->dir == DIR_UP) {
int t;
int s = data->num_points;
@@
-232,16
+228,17
@@
static void compactlineto(void*_data, double _x, double _y)
point_t p;
p.x = convert_coord(_x);
p.y = convert_coord(_y);
point_t p;
p.x = convert_coord(_x);
p.y = convert_coord(_y);
- if(p.y < data->last.y && data->dir != DIR_UP ||
- p.y > data->last.y && data->dir != DIR_DOWN) {
- data->dir = p.y > data->last.y ? DIR_DOWN : DIR_UP;
+ if(p.y < data->last.y && data->dir != DIR_UP ||
+ p.y >= data->last.y && data->dir != DIR_DOWN) {
finish_segment(data);
finish_segment(data);
- add_segment(data, data->last, data->dir);
+ data->dir = p.y > data->last.y ? DIR_DOWN : DIR_UP;
+ data->points[0] = data->last;
+ data->num_points = 1;
}
if(data->points_size == data->num_points) {
data->points_size <<= 1;
assert(data->points_size > data->num_points);
}
if(data->points_size == data->num_points) {
data->points_size <<= 1;
assert(data->points_size > data->num_points);
- data->points = rfx_realloc(data->points, data->points_size);
+ data->points = rfx_realloc(data->points, sizeof(point_t)*data->points_size);
}
data->points[data->num_points++] = p;
}
}
data->points[data->num_points++] = p;
}
@@
-259,13
+256,14
@@
static void compactinit(compactpoly_t*data, double gridsize)
data->strokes_size = 16;
data->num_points = 0;
data->points_size = 16;
data->strokes_size = 16;
data->num_points = 0;
data->points_size = 16;
+ data->dir = DIR_UNKNOWN;
data->points = (point_t*)rfx_alloc(sizeof(point_t)*data->points_size);
data->poly->strokes = (gfxstroke_t*)rfx_alloc(sizeof(gfxstroke_t)*data->strokes_size);
}
static gfxcompactpoly_t*compactfinish(compactpoly_t*data)
{
finish_segment(data);
data->points = (point_t*)rfx_alloc(sizeof(point_t)*data->points_size);
data->poly->strokes = (gfxstroke_t*)rfx_alloc(sizeof(gfxstroke_t)*data->strokes_size);
}
static gfxcompactpoly_t*compactfinish(compactpoly_t*data)
{
finish_segment(data);
- data->poly->strokes = rfx_realloc(data->poly->strokes, sizeof(gfxstroke_t)*data->poly->num_strokes);
+ data->poly->strokes = (gfxstroke_t*)rfx_realloc(data->poly->strokes, sizeof(gfxstroke_t)*data->poly->num_strokes);
free(data->points);
return data->poly;
}
free(data->points);
return data->poly;
}