inline Color SpiralGradient::color_func(const Point &pos, float supersample)const { Gradient gradient=param_gradient.get(Gradient()); Point center=param_center.get(Point()); Real radius=param_radius.get(Real()); Angle angle=param_angle.get(Angle()); bool clockwise=param_clockwise.get(bool()); const Point centered(pos-center); Angle a; a=Angle::tan(-centered[1],centered[0]).mod(); a=a+angle; if(supersample<0.00001)supersample=0.00001; Real dist((pos-center).mag()/radius); if(clockwise) dist+=Angle::rot(a.mod()).get(); else dist-=Angle::rot(a.mod()).get(); dist-=floor(dist); if(dist+supersample*0.5>1.0) { float left(supersample*0.5-(dist-1.0)); float right(supersample*0.5+(dist-1.0)); Color pool(gradient(1.0-(left*0.5),left).premult_alpha()*left/supersample); pool+=gradient(right*0.5,right).premult_alpha()*right/supersample; return pool.demult_alpha(); } if(dist-supersample*0.5<0.0) { float left(supersample*0.5-dist); float right(supersample*0.5+dist); Color pool(gradient(right*0.5,right).premult_alpha()*right/supersample); pool+=gradient(1.0-left*0.5,left).premult_alpha()*left/supersample; return pool.demult_alpha(); } return gradient(dist,supersample); }