bool CurveGradient::set_param(const String & param, const ValueBase &value) { IMPORT_VALUE(param_origin); IMPORT_VALUE(param_width); if(param=="bline" && value.get_type()==ValueBase::TYPE_LIST) { param_bline=value; bline_loop=value.get_loop(); sync(); return true; } IMPORT_VALUE(param_gradient); IMPORT_VALUE(param_loop); IMPORT_VALUE(param_zigzag); IMPORT_VALUE(param_perpendicular); IMPORT_VALUE(param_fast); if(param=="offset") return set_param("origin", value); return Layer_Composite::set_param(param,value); }
ValueBase synfig::convert_bline_to_segment_list(const ValueBase& bline) { std::vector<Segment> ret; // std::vector<BLinePoint> list(bline.operator std::vector<BLinePoint>()); //std::vector<BLinePoint> list(bline); std::vector<BLinePoint> list(bline.get_list().begin(),bline.get_list().end()); std::vector<BLinePoint>::const_iterator iter; BLinePoint prev,first; //start with prev = first and iter on the second... if(list.empty()) return ValueBase(ret,bline.get_loop()); first = prev = list.front(); for(iter=++list.begin();iter!=list.end();++iter) { ret.push_back( Segment( prev.get_vertex(), prev.get_tangent2(), iter->get_vertex(), iter->get_tangent1() ) ); prev=*iter; } if(bline.get_loop()) { ret.push_back( Segment( prev.get_vertex(), prev.get_tangent2(), first.get_vertex(), first.get_tangent1() ) ); } return ValueBase(ret,bline.get_loop()); }
ValueBase synfig::convert_bline_to_width_list(const ValueBase& bline) { std::vector<Real> ret; // std::vector<BLinePoint> list(bline.operator std::vector<BLinePoint>()); //std::vector<BLinePoint> list(bline); std::vector<BLinePoint> list(bline.get_list().begin(),bline.get_list().end()); std::vector<BLinePoint>::const_iterator iter; if(bline.empty()) return ValueBase(ValueBase::TYPE_LIST); for(iter=list.begin();iter!=list.end();++iter) ret.push_back(iter->get_width()); if(bline.get_loop()) ret.push_back(list.front().get_width()); return ValueBase(ret,bline.get_loop()); }
ValueBase synfig::convert_bline_to_wplist(const ValueBase& bline) { // returns if the parameter is not a list or if it is a list, it is empty if(bline.empty()) return ValueBase(type_list); // returns if the contained type is not blinepoint if(bline.get_contained_type()!=type_bline_point) return ValueBase(type_list); std::vector<WidthPoint> ret; std::vector<BLinePoint> list(bline.get_list_of(BLinePoint())); std::vector<BLinePoint>::const_iterator iter; Real position, totalpoints, i(0); totalpoints=(Real)list.size(); // Inserts all the points at the positions given by the bline // positions are 0.0 to 1.0 equally spaced based on the number of blinepoints for(iter=list.begin();iter!=list.end();++iter) { position=i/totalpoints; ret.push_back(WidthPoint(position,iter->get_width())); i=i+1.0; } // If the bline is not looped then make the cups type rounded for the // first and last width points. // In the future when this function is used to convert old blines to // new wlines the end and start cups should be readed from the oultline // layer if(!bline.get_loop()) { std::vector<WidthPoint>::iterator iter; iter=ret.end(); iter--; iter->set_side_type_after(WidthPoint::TYPE_ROUNDED); iter=ret.begin(); iter->set_side_type_before(WidthPoint::TYPE_ROUNDED); } return ValueBase(ret); }