220096c307e85318afc75fd4c6c89b8259bbabfe braney Wed Jan 10 07:47:21 2018 -0800 call mixDot correctly when drawing anti-aliased curves diff --git src/hg/lib/hvGfx.c src/hg/lib/hvGfx.c index bb02c58..e710428 100644 --- src/hg/lib/hvGfx.c +++ src/hg/lib/hvGfx.c @@ -322,39 +322,39 @@ if (cur != 0) { /* no straight line */ xx += sx; xx *= sx = x0 < x2 ? 1 : -1; /* x step direction */ yy += sy; yy *= sy = y0 < y2 ? 1 : -1; /* y step direction */ xy = 2*xx*yy; xx *= xx; yy *= yy; /* differences 2nd degree */ if (cur*sx*sy < 0) { /* negated curvature? */ xx = -xx; yy = -yy; xy = -xy; cur = -cur; } dx = 4.0*sy*(x1-x0)*cur+xx-xy; /* differences 1st degree */ dy = 4.0*sx*(y0-y1)*cur+yy-xy; xx += xx; yy += yy; err = dx+dy+xy; /* error 1st step */ do { cur = fmin(dx+xy,-xy-dy); ed = fmax(dx+xy,-xy-dy); /* approximate error distance */ ed += 2*ed*cur*cur/(4*ed*ed+cur*cur); - mixDot(hvg, x0,y0, 255*fabs(err-dx-dy-xy)/ed, color); /* plot curve */ + mixDot(hvg, x0,y0, 1-fabs(err-dx-dy-xy)/ed, color); /* plot curve */ if (x0 == x2 || y0 == y2) break; /* last pixel -> curve finished */ x1 = x0; cur = dx-err; y1 = 2*err+dy < 0; if (2*err+dx > 0) { /* x step */ - if (err-dy < ed) mixDot(hvg, x0,y0+sy, 255*fabs(err-dy)/ed, color); + if (err-dy < ed) mixDot(hvg, x0,y0+sy, 1-fabs(err-dy)/ed, color); x0 += sx; dx -= xy; err += dy += yy; } if (y1) { /* y step */ - if (cur < ed) mixDot(hvg, x1+sx,y0, 255*fabs(cur)/ed, color); + if (cur < ed) mixDot(hvg, x1+sx,y0, 1-fabs(cur)/ed, color); y0 += sy; dy -= xy; err += dx += xx; } } while (dy < dx); /* gradient negates -> close curves */ } hvGfxLine(hvg, x0,y0, x2,y2, color); /* plot remaining needle to end */ } void hvGfxCurveAA(struct hvGfx *hvg, int x0, int y0, int x1, int y1, int x2, int y2, Color color) /* Draw a segment of an anti-aliased curve within 3 points (quadratic Bezier) * Adapted trivially from code posted at http://members.chello.at/~easyfilter/bresenham.html */ { int x = x0-x1, y = y0-y1; double t = x0-2*x1+x2, r; if ((long)x*(x2-x1) > 0) { /* horizontal cut at P4? */