#include <stdlib.h>
#include <math.h>
-#include <assert.h>
#include <string.h>
#include "../gfxdevice.h"
+#include "../mem.h"
#include "poly.h"
+/* factor that determines into how many line fragments a spline is converted */
+#define SUBFRACTION (2.4)
+
static edge_t*edge_new(int x1, int y1, int x2, int y2)
{
- edge_t*s = malloc(sizeof(edge_t));
+ edge_t*s = rfx_calloc(sizeof(edge_t));
s->a.x = x1;
s->a.y = y1;
s->b.x = x2;
s->b.y = y2;
- s->next = 0;
return s;
}
static inline void gfxpoly_add_edge(gfxpoly_t*poly, double _x1, double _y1, double _x2, double _y2)
{
+ /* we clamp to 31 bit instead of 32 bit because we use
+ a (x1-x2) shortcut when comparing coordinates
+ */
+ if(_x1 < -0x40000000) _x1 = -0x40000000;
+ if(_x1 > 0x3fffffff) _x1 = 0x3fffffff;
+ if(_y1 < -0x40000000) _y1 = -0x40000000;
+ if(_y1 > 0x3fffffff) _y1 = 0x3fffffff;
+ if(_x2 < -0x40000000) _x2 = -0x40000000;
+ if(_x2 > 0x3fffffff) _x2 = 0x3fffffff;
+ if(_y2 < -0x40000000) _y2 = -0x40000000;
+ if(_y2 > 0x3fffffff) _y2 = 0x3fffffff;
+
int x1 = ceil(_x1);
int y1 = ceil(_y1);
int x2 = ceil(_x2);
int y2 = ceil(_y2);
+
if(x1!=x2 || y1!=y2) {
edge_t*s = edge_new(x1, y1, x2, y2);
s->next = poly->edges;
}
}
-gfxpoly_t* gfxpoly_fillToPoly(gfxline_t*line, double gridsize)
+gfxpoly_t* gfxpoly_from_gfxline(gfxline_t*line, double gridsize)
{
gfxpoly_t*p = gfxpoly_new(gridsize);
- /* factor that determines into how many line fragments a spline is converted */
- double subfraction = 2.4;//0.3
-
double z = 1.0 / gridsize;
double lastx=0, lasty=0;
gfxpoly_add_edge(p, lastx, lasty, x, y);
} else if(line->type == gfx_splineTo) {
int parts = (int)(sqrt(fabs(line->x-2*line->sx+lastx) +
- fabs(line->y-2*line->sy+lasty))*subfraction);
+ fabs(line->y-2*line->sy+lasty))*SUBFRACTION);
if(!parts) parts = 1;
double stepsize = 1.0/parts;
int i;
lasty = y;
line = line->next;
}
-
+
gfxline_free(line);
return p;
}
+typedef struct _gfxstroke {
+ segment_dir_t dir;
+ point_t*stroke;
+ fillstyle_t*fs;
+ int num_points;
+} gfxstroke_t;
+typedef struct _gfxcompactpoly {
+ double gridsize;
+ int num_strokes;
+ gfxstroke_t strokes[0];
+} gfxcompactpoly_t;
+
static char* readline(FILE*fi)
{
char c;
return 0;
}
int count = 0;
+ double g = 0;
double lastx=0,lasty=0;
while(1) {
char*line = readline(fi);
}
lastx = x;
lasty = y;
+ } else if(sscanf(line, "%% gridsize %lf", &g) == 1) {
+ p->gridsize = g;
}
free(line);
}
fclose(fi);
- printf("loaded %d points from %s\n", count, filename);
+ if(g) {
+ printf("loaded %d points from %s (gridsize %f)\n", count, filename, g);
+ } else {
+ printf("loaded %d points from %s\n", count, filename);
+ }
return p;
}