X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;ds=sidebyside;f=synfig-core%2Ftrunk%2Fsrc%2Fmodules%2Fmod_gradient%2Fcurvegradient.cpp;h=7d48f05f55a6ee4d9fd698020111ae56db81b363;hb=c3ad95144d148602f672e95ddda1f18fc35502f8;hp=623074f5e282bf0bf5ac21fb4fe8493436168cee;hpb=7e269984944814ced9a7b031e0049fceff6e11d2;p=synfig.git diff --git a/synfig-core/trunk/src/modules/mod_gradient/curvegradient.cpp b/synfig-core/trunk/src/modules/mod_gradient/curvegradient.cpp index 623074f..7d48f05 100644 --- a/synfig-core/trunk/src/modules/mod_gradient/curvegradient.cpp +++ b/synfig-core/trunk/src/modules/mod_gradient/curvegradient.cpp @@ -105,7 +105,7 @@ inline float calculate_distance(const std::vector& bline) } std::vector::const_iterator -find_closest(const std::vector& bline,const Point& p,bool loop=false,float *bline_dist_ret=0) +find_closest(bool fast, const std::vector& bline,const Point& p,float& t,bool loop=false,float *bline_dist_ret=0) { std::vector::const_iterator iter,next,ret; std::vector::const_iterator end(bline.end()); @@ -118,6 +118,7 @@ find_closest(const std::vector& bline,const Point& p,bool lo float best_bline_dist(0); float best_bline_len(0); float total_bline_dist(0); + float best_pos(0); etl::hermite best_curve; if(loop) @@ -149,23 +150,43 @@ find_closest(const std::vector& bline,const Point& p,bool lo len=curve.length(); } + if (fast) + { #define POINT_CHECK(x) bp=curve(x); thisdist=(bp-p).mag_squared(); if(thisdist::const_iterator iter,next; @@ -234,12 +257,12 @@ CurveGradient::color_func(const Point &point_, int quality, float supersample)co // Taking into account looping. if(perpendicular) { - next=find_closest(bline,point,bline_loop,&perp_dist); + next=find_closest(fast,bline,point,t,bline_loop,&perp_dist); perp_dist/=curve_length_; } else { - next=find_closest(bline,point,bline_loop); + next=find_closest(fast,bline,point,t,bline_loop); } iter=next++; @@ -276,7 +299,8 @@ CurveGradient::color_func(const Point &point_, int quality, float supersample)co } // Figure out the closest point on the curve - const float t(curve.find_closest(point,search_iterations)); + if (fast) + t = curve.find_closest(fast, point,search_iterations); // Calculate our values @@ -362,7 +386,7 @@ CurveGradient::color_func(const Point &point_, int quality, float supersample)co } float -CurveGradient::calc_supersample(const synfig::Point &x, float pw,float ph)const +CurveGradient::calc_supersample(const synfig::Point &/*x*/, float pw,float /*ph*/)const { return pw; } @@ -386,6 +410,7 @@ CurveGradient::set_param(const String & param, const ValueBase &value) IMPORT(offset); IMPORT(perpendicular); + IMPORT(fast); if(param=="bline" && value.get_type()==ValueBase::TYPE_LIST) { @@ -413,6 +438,7 @@ CurveGradient::get_param(const String & param)const EXPORT(zigzag); EXPORT(width); EXPORT(perpendicular); + EXPORT(fast); EXPORT_NAME(); EXPORT_VERSION(); @@ -446,6 +472,8 @@ CurveGradient::get_param_vocab()const .set_local_name(_("ZigZag"))); ret.push_back(ParamDesc("perpendicular") .set_local_name(_("Perpendicular"))); + ret.push_back(ParamDesc("fast") + .set_local_name(_("Fast"))); return ret; }