gradient fixes
authorMatthias Kramm <kramm@quiss.org>
Fri, 28 Aug 2009 16:27:48 +0000 (18:27 +0200)
committerMatthias Kramm <kramm@quiss.org>
Fri, 28 Aug 2009 16:27:48 +0000 (18:27 +0200)
lib/devices/render.c
lib/readers/swf.c
src/gfx2gfx.c

index 410c5f7..cdba442 100644 (file)
@@ -89,7 +89,7 @@ typedef struct _fillinfo {
     gfxmatrix_t*matrix;
     gfxcxform_t*cxform;
     RGBA*gradient;
-    char clip_or_radial;
+    char linear_or_radial;
 } fillinfo_t;
 
 
@@ -338,7 +338,7 @@ static void fill_line_bitmap(RGBA*line, U32*z, int y, int x1, int x2, fillinfo_t
            int yy = (int)(yy1 - x * yinc1);
            int ainv;
 
-           if(info->clip_or_radial) {
+           if(info->linear_or_radial) {
                if(xx<0) xx=0;
                if(xx>=b->width) xx = b->width-1;
                if(yy<0) yy=0;
@@ -378,6 +378,7 @@ static void fill_line_gradient(RGBA*line, U32*z, int y, int x1, int x2, fillinfo
        /* x direction equals y direction */
        return;
     }
+    
     det = 1.0/det;
     double xx1 =  (  (-m->tx) * m->m11 - (y - m->ty) * m->m10) * det;
     double yy1 =  (- (-m->tx) * m->m01 + (y - m->ty) * m->m00) * det;
@@ -393,7 +394,7 @@ static void fill_line_gradient(RGBA*line, U32*z, int y, int x1, int x2, fillinfo
            int ainv;
 
             int pos = 0;
-            if(info->clip_or_radial) {
+            if(info->linear_or_radial) {
                 double xx = xx1 + x * xinc1;
                 double yy = yy1 + y * yinc1;
                 double r = sqrt(xx*xx + yy*yy);
@@ -409,9 +410,9 @@ static void fill_line_gradient(RGBA*line, U32*z, int y, int x1, int x2, fillinfo
            ainv = 255-col.a;
 
            /* needs bitmap with premultiplied alpha */
-           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].r = ((line[x].r*ainv)/255)+col.r;
+           line[x].g = ((line[x].g*ainv)/255)+col.g;
+           line[x].b = ((line[x].b*ainv)/255)+col.b;
            line[x].a = 255;
        }
        bit <<= 1;
@@ -714,7 +715,7 @@ void render_fillgradient(struct _gfxdevice*dev, gfxline_t*line, gfxgradient_t*gr
     m2.m00 *= i->zoom; m2.m01 *= i->zoom; m2.tx *= i->zoom;
     m2.m10 *= i->zoom; m2.m11 *= i->zoom; m2.ty *= i->zoom;
 
-    info.clip_or_radial = type == gfxgradient_radial;
+    info.linear_or_radial = type == gfxgradient_radial;
 
     int pos = 0;
     gfxcolor_t color = {0,0,0,0};
index fac12e2..25edb17 100644 (file)
@@ -234,7 +234,15 @@ static void renderFilled(render_t*r, gfxline_t*line, FILLSTYLE*f, CXFORM*cx, MAT
     } else if(f->type == FILL_LINEAR || f->type == FILL_RADIAL) {
        gfxmatrix_t m;
        gfxgradient_t* g;
-       convertMatrix(&f->m, &m);
+       MATRIX* m2 = &f->m;
+       //swf_MatrixJoin(&m2, po_m, &f->m);
+
+       double z = f->type==FILL_RADIAL?4:4;
+       m.m00 = m2->sx/z/20.0; m.m10 = m2->r1/z/20.0;
+       m.m01 = m2->r0/z/20.0; m.m11 = m2->sy/z/20.0;
+       m.tx = m2->tx/20.0;
+       m.ty = m2->ty/20.0;
+
        g = convertGradient(&f->gradient);
        r->device->fillgradient(r->device, line, g, f->type == FILL_LINEAR ? gfxgradient_linear : gfxgradient_radial, &m);
        free(g);
@@ -598,15 +606,13 @@ void swfpage_render(gfxpage_t*page, gfxdevice_t*output)
 
     int t;
     for(t=0;t<65536;t++) {
+       if(depths->ids[t]) {
+           placeObject(&r, t, depths->ids[t]);
+       }
         int i;
-
         for(i=0; i<r.clips_waiting[t]; i++) {
             output->endclip(output);
         }
-
-       if(depths->ids[t]) {
-           placeObject(&r, t, depths->ids[t]);
-       }
     }
     free(r.clips_waiting);
 }
index 85d6882..67951a1 100644 (file)
@@ -34,6 +34,7 @@
 #include "../../swftools/lib/devices/swf.h"
 #include "../../swftools/lib/devices/text.h"
 #include "../../swftools/lib/devices/render.h"
+#include "../../swftools/lib/devices/file.h"
 #include "../../swftools/lib/devices/bbox.h"
 #ifdef HAVE_LRF
 #include "../../swftools/lib/devices/lrf.h"
@@ -258,6 +259,8 @@ int main(int argn, char *argv[])
            out->setparameter(out, "antialize", "4");
         } else if(!strcasecmp(format, "txt")) {
             gfxdevice_text_init(out);
+        } else if(!strcasecmp(format, "log")) {
+            gfxdevice_file_init(out, "/tmp/device.log");
         } else if(!strcasecmp(format, "pdf")) {
             gfxdevice_pdf_init(out);
         } else {