void gfxline_show(gfxline_t*l, FILE*fi)
{
while(l) {
- if(l->type == moveTo) {
+ if(l->type == gfx_moveTo) {
fprintf(fi, "moveTo %.2f,%.2f\n", l->x, l->y);
}
- if(l->type == lineTo) {
+ if(l->type == gfx_lineTo) {
fprintf(fi, "lineTo %.2f,%.2f\n", l->x, l->y);
}
- if(l->type == splineTo) {
+ if(l->type == gfx_splineTo) {
fprintf(fi, "splineTo %.2f,%.2f %.2f,%.2f\n", l->sx, l->sy, l->x, l->y);
}
l = l->next;
test.control.y += test.end.y;
}
-#define PROBES
+//#define PROBES
#ifdef PROBES
/* measure the spline's accurancy, by taking a number of probes */
for(t=0;t<probes;t++) {
/* convert control point representation to
d*x^3 + c*x^2 + b*x + a */
-
- /* FIXME: we need to do this for the subspline between [start,end],
- not [0,1] */
dx= s->end.x - s->control2.x*3 + s->control1.x*3 - s->start.x;
dy= s->end.y - s->control2.y*3 + s->control1.y*3 - s->start.y;
+ /* we need to do this for the subspline between [start,end], not [0,1]
+ as a transformation of t->a*t+b does nothing to highest coefficient
+ of the spline except multiply it with a^3, we just need to modify
+ d here. */
+ {double m = end-start;
+ dx*=m*m*m;
+ dy*=m*m*m;
+ }
+
/* use the integral over (f(x)-g(x))^2 between 0 and 1
to measure the approximation quality.
- (it boils down to const*d^2)
- */
+ (it boils down to const*d^2) */
recurse = (dx*dx + dy*dy > quality2);
#endif
return num;
}
-void gfxdraw_conicTo(gfxdrawer_t*draw, double cx, double cy, double tox, double toy)
+void gfxdraw_conicTo(gfxdrawer_t*draw, double cx, double cy, double tox, double toy, double quality)
{
double c1x = (draw->x + 2 * cx) / 3;
double c1y = (draw->y + 2 * cy) / 3;
double c2x = (2 * cx + tox) / 3;
double c2y = (2 * cy + toy) / 3;
- gfxdraw_cubicTo(draw, c1x, c1y, c2x, c2y, tox, toy);
+ gfxdraw_cubicTo(draw, c1x, c1y, c2x, c2y, tox, toy, quality);
}
-void gfxdraw_cubicTo(gfxdrawer_t*draw, double c1x, double c1y, double c2x, double c2y, double x, double y)
+void gfxdraw_cubicTo(gfxdrawer_t*draw, double c1x, double c1y, double c2x, double c2y, double x, double y, double quality)
{
qspline_t q[128];
cspline_t c;
- double maxerror = 0.01;
+ double maxerror = quality>0 ? quality : 1.0;
int t,num;
c.start.x = draw->x;