From c4d1967a7fdeb51f311012e56bc0567e842a97e0 Mon Sep 17 00:00:00 2001 From: Matthias Kramm Date: Fri, 28 Aug 2009 18:27:48 +0200 Subject: [PATCH] gradient fixes --- lib/devices/render.c | 15 ++++++++------- lib/readers/swf.c | 18 ++++++++++++------ src/gfx2gfx.c | 3 +++ 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/lib/devices/render.c b/lib/devices/render.c index 410c5f7..cdba442 100644 --- a/lib/devices/render.c +++ b/lib/devices/render.c @@ -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}; diff --git a/lib/readers/swf.c b/lib/readers/swf.c index fac12e2..25edb17 100644 --- a/lib/readers/swf.c +++ b/lib/readers/swf.c @@ -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; iendclip(output); } - - if(depths->ids[t]) { - placeObject(&r, t, depths->ids[t]); - } } free(r.clips_waiting); } diff --git a/src/gfx2gfx.c b/src/gfx2gfx.c index 85d6882..67951a1 100644 --- a/src/gfx2gfx.c +++ b/src/gfx2gfx.c @@ -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 { -- 1.7.10.4