From: kramm Date: Tue, 16 Nov 2004 13:57:17 +0000 (+0000) Subject: improved line rendering quality. X-Git-Tag: release-0-6-3~168 X-Git-Url: http://git.asbjorn.biz/?p=swftools.git;a=commitdiff_plain;h=f27ce8fa3df8e15dc792bd008a37c5981b994267 improved line rendering quality. --- diff --git a/lib/modules/swfrender.c b/lib/modules/swfrender.c index e3236af..bf2fea6 100644 --- a/lib/modules/swfrender.c +++ b/lib/modules/swfrender.c @@ -66,7 +66,12 @@ static inline void add_pixel(RENDERBUF*dest, float x, int y, renderpoint_t*p) p->fx = x; swf_SetBlock(i->lines[y].points, (U8*)p, sizeof(renderpoint_t)); } -static void add_line(RENDERBUF*buf, double x1, int y1, double x2, int y2, renderpoint_t*p, char thin) + +/* set this to 0.777777 or something if the "both fillstyles set while not inside shape" + problem appears to often */ +#define CUT 0.5 + +static void add_line(RENDERBUF*buf, double x1, double y1, double x2, double y2, renderpoint_t*p, char thin) { renderbuf_internal*i = (renderbuf_internal*)buf->internal; /* if(DEBUG&4) { @@ -74,63 +79,52 @@ static void add_line(RENDERBUF*buf, double x1, int y1, double x2, int y2, render printf(" l[%d - %.2f/%.2f -> %.2f/%.2f]", l, x1/20.0, y1/20.0, x2/20.0, y2/20.0); }*/ - /* SCALE DOWN */ - y1*=i->multiply; - y2*=i->multiply; - x1*=i->multiply; - x2*=i->multiply; - - y1/=20; - y2/=20; + y1=y1*i->multiply; + y2=y2*i->multiply; + x1=x1*i->multiply; + x2=x2*i->multiply; + + y1 = y1/20.0; + y2 = y2/20.0; + x1 = x1/20.0; + x2 = x2/20.0; + + if(y2 < y1) { + double x = x1;x1 = x2;x2=x; + double y = y1;y1 = y2;y2=y; + } - int diffy = y2 - y1; - int starty = y1; - int posy=0; double diffx = x2 - x1; - double stepx; - double startx = x1; - double posx=0; + double diffy = y2 - y1; + + double ny1 = (int)(y1)+CUT; + double ny2 = (int)(y2)+CUT; - if(diffy<0) { - startx = x2; - starty = y2; - diffx = -diffx; - diffy = -diffy; + if(ny1 < y1) { + ny1 = (int)(y1) + 1.0 + CUT; } - - if(diffy == 0) { - if(thin) { - stepx = diffx; - } else { - return; - } - } else { - stepx = diffx / diffy; + if(ny2 >= y2) { + ny2 = (int)(y2) - 1.0 + CUT; } - - if(thin) - diffy++; - while(posy ny2) + return; + + double stepx = diffx/diffy; + x1 = x1 + (ny1-y1)*stepx; + x2 = x2 + (ny2-y2)*stepx; + + int posy=(int)ny1; + int endy=(int)ny2; + double posx=0; + double startx = x1; - add_pixel(buf, xx ,yy, p); + while(posy<=endy) { + float xx = (float)(startx + posx); + add_pixel(buf, xx ,posy, p); posx+=stepx; - if(thin) { - float x2 = (float)((startx + posx)/20.0); - if(xx==x2) { - if(stepx<0) { - x2 = xx-1; - } else { - x2 = xx+1; - } - } - add_pixel(buf, x2, yy, p); - } posy++; } - return; } #define PI 3.14159265358979 static void add_solidline(RENDERBUF*buf, double x1, double y1, double x2, double y2, int width, renderpoint_t*p) @@ -144,22 +138,14 @@ static void add_solidline(RENDERBUF*buf, double x1, double y1, double x2, double int t; int segments; - double lastx; + double lastx,lasty; double vx,vy; - double xx; - - int lasty; - int yy; + double xx,yy; /* The Flash Player does this, too. This means every line is always at least one pixel wide */ width += 20; - /*if(width<=20) { - add_line(buf, x1, y1, x2, y2, p, 1); - return; - }*/ - sd = (double)dx*(double)dx+(double)dy*(double)dy; d = sqrt(sd); @@ -181,27 +167,27 @@ static void add_solidline(RENDERBUF*buf, double x1, double y1, double x2, double vy=vy*width*0.5; xx = x2+vx; - yy = (int)(y2+vy); - add_line(buf, x1+vx, (int)(y1+vy), xx, yy, p, 0); + yy = y2+vy; + add_line(buf, x1+vx, y1+vy, xx, yy, p, 0); lastx = xx; lasty = yy; for(t=1;t