minor bugfixes and speed improvements in polygon intersector
[swftools.git] / lib / gfxpoly / convert.c
index aea0a17..0e458be 100644 (file)
@@ -5,6 +5,9 @@
 #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 = rfx_calloc(sizeof(edge_t));
@@ -17,10 +20,23 @@ static edge_t*edge_new(int x1, int y1, int x2, int y2)
 
 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;
@@ -32,9 +48,6 @@ 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;
@@ -47,7 +60,7 @@ gfxpoly_t* gfxpoly_from_gfxline(gfxline_t*line, double gridsize)
             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;
@@ -65,11 +78,23 @@ gfxpoly_t* gfxpoly_from_gfxline(gfxline_t*line, double gridsize)
         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;