added dumping of matrices and gradients
[swftools.git] / lib / devices / render.c
index 2449a2c..0170621 100644 (file)
@@ -28,6 +28,7 @@
 #define PNG_INLINE_EXPORTS
 #include "../types.h"
 #include "../png.c"
+#include "render.h"
 
 typedef gfxcolor_t RGBA;
 
@@ -272,13 +273,13 @@ static void fill_line_solid(RGBA*line, U32*z, int y, int x1, int x2, RGBA col)
         col.r = (col.r*col.a)>>8;
         col.g = (col.g*col.a)>>8;
         col.b = (col.b*col.a)>>8;
-        col.a = 255;
         do {
            if(z[bitpos]&bit) {
                line[x].r = ((line[x].r*ainv)>>8)+col.r;
                line[x].g = ((line[x].g*ainv)>>8)+col.g;
                line[x].b = ((line[x].b*ainv)>>8)+col.b;
-               line[x].a = 255;
+               //line[x].a = 255;
+               line[x].a = ((line[x].a*ainv)>>8)+col.a;
            }
            bit <<= 1;
            if(!bit) {
@@ -437,6 +438,7 @@ void fill(gfxdevice_t*dev, fillinfo_t*fill)
 void fill_solid(gfxdevice_t*dev, gfxcolor_t* color)
 {
     fillinfo_t info;
+    memset(&info, 0, sizeof(info));
     info.type = filltype_solid;
     info.color = color;
     fill(dev, &info);
@@ -465,8 +467,8 @@ void newclip(struct _gfxdevice*dev)
 {
     internal_t*i = (internal_t*)dev->internal;
     
-    clipbuffer_t*c = rfx_calloc(sizeof(clipbuffer_t));
-    c->data = rfx_calloc(sizeof(U32) * i->bitwidth * i->height2);
+    clipbuffer_t*c = (clipbuffer_t*)rfx_calloc(sizeof(clipbuffer_t));
+    c->data = (U32*)rfx_calloc(sizeof(U32) * i->bitwidth * i->height2);
     c->next = i->clipbuf;
     i->clipbuf = c;
     if(c->next)
@@ -475,12 +477,13 @@ void newclip(struct _gfxdevice*dev)
        memset(c->data, 0, sizeof(U32)*i->bitwidth*i->height2);
 }
 
-void endclip(struct _gfxdevice*dev)
+void endclip(struct _gfxdevice*dev, char removelast)
 {
     internal_t*i = (internal_t*)dev->internal;
-    
-    if(!i->clipbuf) {
-       fprintf(stderr, "endclip without any active clip buffers");
+   
+    /* test for at least one cliplevel (the one we created ourselves) */
+    if(!i->clipbuf || (!i->clipbuf->next && !removelast)) {
+       fprintf(stderr, "endclip without any active clip buffers\n");
        return;
     }
 
@@ -501,8 +504,6 @@ void render_stroke(struct _gfxdevice*dev, gfxline_t*line, gfxcoord_t width, gfxc
     }*/
 
     while(line) {
-        int x1,y1,x2,y2,x3,y3;
-
         if(line->type == gfx_moveTo) {
         } else if(line->type == gfx_lineTo) {
            double x1=x*i->zoom,y1=y*i->zoom;
@@ -510,14 +511,14 @@ void render_stroke(struct _gfxdevice*dev, gfxline_t*line, gfxcoord_t width, gfxc
            add_solidline(dev, x1, y1, x3, y3, width * i->multiply);
            fill_solid(dev, color);
         } else if(line->type == gfx_splineTo) {
-           int c,t,parts,qparts;
+           int t,parts;
            double xx,yy;
            
            double x1=x*i->zoom,y1=y*i->zoom;
            double x2=line->sx*i->zoom,y2=line->sy*i->zoom;
            double x3=line->x*i->zoom,y3=line->y*i->zoom;
             
-            c = abs(x3-2*x2+x1) + abs(y3-2*y2+y1);
+            double c = abs(x3-2*x2+x1) + abs(y3-2*y2+y1);
             xx=x1;
            yy=y1;
 
@@ -567,7 +568,7 @@ static void draw_line(gfxdevice_t*dev, gfxline_t*line)
             xx=x1;
            yy=y1;
 
-            parts = (int)(sqrt(c)/3);
+            parts = (int)(sqrt(c));
             if(!parts) parts = 1;
 
             for(t=1;t<=parts;t++) {
@@ -589,6 +590,7 @@ void render_startclip(struct _gfxdevice*dev, gfxline_t*line)
 {
     internal_t*i = (internal_t*)dev->internal;
     fillinfo_t info;
+    memset(&info, 0, sizeof(info));
     newclip(dev);
     info.type = filltype_clip;
     draw_line(dev, line);
@@ -598,7 +600,7 @@ void render_startclip(struct _gfxdevice*dev, gfxline_t*line)
 void render_endclip(struct _gfxdevice*dev)
 {
     internal_t*i = (internal_t*)dev->internal;
-    endclip(dev);
+    endclip(dev, 0);
 }
 
 void render_fill(struct _gfxdevice*dev, gfxline_t*line, gfxcolor_t*color)
@@ -620,6 +622,7 @@ void render_fillbitmap(struct _gfxdevice*dev, gfxline_t*line, gfximage_t*img, gf
     draw_line(dev, line);
 
     fillinfo_t info;
+    memset(&info, 0, sizeof(info));
     info.type = filltype_bitmap;
     info.image = img;
     info.matrix = &m2;
@@ -648,6 +651,8 @@ void render_addfont(struct _gfxdevice*dev, gfxfont_t*font)
 void render_drawchar(struct _gfxdevice*dev, gfxfont_t*font, int glyphnr, gfxcolor_t*color, gfxmatrix_t*matrix)
 {
     internal_t*i = (internal_t*)dev->internal;
+    if(!font)
+       return;
 
     /* align characters to whole pixels */
     matrix->tx = (int)(matrix->tx * i->antialize) / i->antialize;
@@ -667,7 +672,7 @@ void render_result_write(gfxresult_t*r, int filedesc)
 {
     internal_result_t*i= (internal_result_t*)r->internal;
 }
-int render_result_save(gfxresult_t*r, char*filename)
+int render_result_save(gfxresult_t*r, const char*filename)
 {
     internal_result_t*i= (internal_result_t*)r->internal;
     if(!i) {
@@ -718,7 +723,7 @@ char*gfximage_asXPM(gfximage_t*img, int depth)
     *p = 0;
     return p;
 }
-void*render_result_get(gfxresult_t*r, char*name)
+void*render_result_get(gfxresult_t*r, const char*name)
 {
     internal_result_t*i= (internal_result_t*)r->internal;
     if(!strncmp(name,"xpm",3)) {
@@ -729,6 +734,7 @@ void*render_result_get(gfxresult_t*r, char*name)
            i = i->next;
            if(!i)
                return 0;
+            pagenr--;
        }
        return gfximage_asXPM(&i->img, 64);
     } else if(!strncmp(name,"page",4)) {
@@ -739,6 +745,7 @@ void*render_result_get(gfxresult_t*r, char*name)
            i = i->next;
            if(!i)
                return 0;
+            pagenr--;
        }
        return &i->img;
     }
@@ -751,10 +758,15 @@ void render_result_destroy(gfxresult_t*r)
     while(i) {
        internal_result_t*next = i->next;
        free(i->img.data);i->img.data = 0;
-       free(i);
+
+        /* FIXME memleak
+           the following rfx_free causes a segfault on WIN32 machines,
+           if executed */
+        //rfx_free(i);
+
        i = next;
     }
-    free(r);
+    rfx_free(r);
 }
 
 gfxresult_t* render_finish(struct _gfxdevice*dev)
@@ -812,7 +824,7 @@ void render_startpage(struct _gfxdevice*dev, int width, int height)
 
 static void store_image(internal_t*i, internal_result_t*ir)
 {
-    ir->img.data = malloc(i->width*i->height*sizeof(RGBA));
+    ir->img.data = (gfxcolor_t*)malloc(i->width*i->height*sizeof(gfxcolor_t));
     ir->img.width = i->width;
     ir->img.height = i->height;
 
@@ -873,10 +885,10 @@ void render_endpage(struct _gfxdevice*dev)
        exit(1);
     }
 
-    endclip(dev);
+    endclip(dev, 1);
     while(i->clipbuf) {
        fprintf(stderr, "Warning: unclosed clip while processing endpage()\n");
-       endclip(dev);
+       endclip(dev, 1);
     }
     
     internal_result_t*ir= (internal_result_t*)rfx_calloc(sizeof(internal_result_t));
@@ -905,7 +917,7 @@ void render_endpage(struct _gfxdevice*dev)
     i->height2 = 0;
 }
 
-void render_drawlink(struct _gfxdevice*dev, gfxline_t*line, char*action)
+void render_drawlink(struct _gfxdevice*dev, gfxline_t*line, const char*action)
 {
     /* not supported for this output device */
 }
@@ -913,7 +925,6 @@ void render_drawlink(struct _gfxdevice*dev, gfxline_t*line, char*action)
 void gfxdevice_render_init(gfxdevice_t*dev)
 {
     internal_t*i = (internal_t*)rfx_calloc(sizeof(internal_t));
-    int y;
     memset(dev, 0, sizeof(gfxdevice_t));
     
     dev->name = "render";