made font pretransforming always generate points to the right of the origin
[swftools.git] / lib / gfxtools.c
index 55c4925..f6853da 100644 (file)
@@ -234,7 +234,7 @@ void gfxtool_draw_dashed_line(gfxdrawer_t*d, gfxline_t*line, float*r, float phas
         return;
     }
     if(r[0]<0 || phase<0) {
-       fprintf(stderr, "gfxtool: invalid (negative) dashes: %f, phase=%f", r[0], phase);
+       fprintf(stderr, "gfxtool: invalid (negative) dashes: %f, phase=%f\n", r[0], phase);
        return;
     }
 
@@ -656,6 +656,13 @@ gfxbbox_t gfxbbox_expand_to_point(gfxbbox_t box, gfxcoord_t x, gfxcoord_t y)
     return box;
 }
 
+gfxbbox_t gfxbbox_expand_to_bbox(gfxbbox_t box, gfxbbox_t box2)
+{
+    gfxbbox_expand_to_point(box, box2.xmin, box2.ymin);
+    gfxbbox_expand_to_point(box, box2.xmax, box2.ymax);
+    return box;
+}
+
 void gfxbbox_intersect(gfxbbox_t*box1, gfxbbox_t*box2)
 {
     if(box2->xmin > box1->xmin)
@@ -728,8 +735,8 @@ void gfxline_transform(gfxline_t*line, gfxmatrix_t*matrix)
 
 void gfxmatrix_dump(gfxmatrix_t*m, FILE*fi, char*prefix)
 {
-    fprintf(fi, "%f %f | %f\n", m->m00, m->m10, m->tx);
-    fprintf(fi, "%f %f | %f\n", m->m01, m->m11, m->ty);
+    fprintf(fi, "%s%f %f | %f\n", prefix, m->m00, m->m10, m->tx);
+    fprintf(fi, "%s%f %f | %f\n", prefix, m->m01, m->m11, m->ty);
 }
 
 void gfxmatrix_transform(gfxmatrix_t*m, double* v, double*dest)
@@ -1038,7 +1045,7 @@ gfxline_t* gfxline_restitch(gfxline_t*line)
     gfxline_t*prev=0;
     while(line) {
        gfxline_t*next = line->next;
-       if(line->type == gfx_moveTo) {
+       if(line->type == gfx_moveTo && (line->next && line->next->type != gfx_moveTo)) {
            gfxpoint_t xy = {line->x, line->y};
            dict_put(ff, &xy, line);
            prev = line;
@@ -1137,18 +1144,56 @@ gfxline_t* gfxline_reverse(gfxline_t*line)
     return b;
 }
 
-void gfximage_save_jpeg(gfximage_t*img, char*filename, int quality)
+void gfxgradient_destroy(gfxgradient_t*gradient)
 {
-    unsigned char*data = malloc(img->width*img->height*3);
-    int t;
-    int size = img->width*img->height;
-    int s = 0;
-    for(t=0;t<size;t++) {
-       data[s+0] = img->data[t].r;
-       data[s+1] = img->data[t].g;
-       data[s+2] = img->data[t].b;
-       s+=3;
+    while(gradient) {
+       gfxgradient_t*next = gradient->next;
+       free(gradient);
+       gradient = next;
+    }
+}
+
+gfxparams_t* gfxparams_new()
+{
+    return (gfxparams_t*)rfx_calloc(sizeof(gfxparams_t));
+}
+
+void gfxparams_store(gfxparams_t*params, const char*key, const char*value)
+{
+    gfxparam_t*o = params->params;
+    while(o) {
+        if(!strcmp(key, o->key)) {
+            /* overwrite old value */
+            free((void*)o->value);
+            o->value = strdup(value);
+            return;
+        }
+        o = o->next;
+    }
+    gfxparam_t*p = (gfxparam_t*)malloc(sizeof(gfxparam_t));
+    p->key = strdup(key);
+    p->value = strdup(value);
+    p->next = 0;
+
+    if(params->last) {
+       params->last->next = p;
+       params->last = p;
+    } else {
+       params->params = p;
+       params->last = p;
+    }
+}
+
+void gfxparams_free(gfxparams_t*params)
+{
+    gfxparam_t*p = params->params;
+    while(p) {
+       gfxparam_t*next = p->next;
+       free((void*)p->key);
+       if(p->value) free((void*)p->value);
+       free(p);
+       p = next;
     }
-    jpeg_save(data, img->width, img->height, quality, filename);
+    free(params);
 }