handle negative clipdepths more gracefully
[swftools.git] / lib / devices / render.c
index d9cca51..0170621 100644 (file)
@@ -438,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);
@@ -476,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;
     }
 
@@ -566,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++) {
@@ -588,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);
@@ -597,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)
@@ -619,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;
@@ -730,6 +734,7 @@ void*render_result_get(gfxresult_t*r, const char*name)
            i = i->next;
            if(!i)
                return 0;
+            pagenr--;
        }
        return gfximage_asXPM(&i->img, 64);
     } else if(!strncmp(name,"page",4)) {
@@ -740,6 +745,7 @@ void*render_result_get(gfxresult_t*r, const char*name)
            i = i->next;
            if(!i)
                return 0;
+            pagenr--;
        }
        return &i->img;
     }
@@ -879,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));