small speed improvements
[swftools.git] / lib / gfxpoly / convert.c
index f404dfc..e326333 100644 (file)
@@ -1,11 +1,13 @@
 #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 = rfx_calloc(sizeof(edge_t));
@@ -22,6 +24,7 @@ static inline void gfxpoly_add_edge(gfxpoly_t*poly, double _x1, double _y1, doub
     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;
@@ -33,9 +36,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;
@@ -48,7 +48,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;
@@ -66,11 +66,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;
@@ -105,6 +117,7 @@ gfxpoly_t* gfxpoly_from_file(const char*filename, double gridsize)
         return 0;
     }
     int count = 0;
+    double g = 0;
     double lastx=0,lasty=0;
     while(1) {
         char*line = readline(fi);
@@ -125,10 +138,16 @@ gfxpoly_t* gfxpoly_from_file(const char*filename, double gridsize)
             }
             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;
 }