Example #1
0
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);
}