From: Johan Engelen Date: Tue, 27 Jul 2010 19:56:51 +0000 (+0200) Subject: powerstroke: arbitrary number of control points. X-Git-Url: https://git.tokkee.org/?a=commitdiff_plain;h=475f79972f5d3572c0a3c98161ce8e406dd8b3da;p=inkscape.git powerstroke: arbitrary number of control points. --- diff --git a/src/live_effects/lpe-powerstroke.cpp b/src/live_effects/lpe-powerstroke.cpp index b349f9aa6..da2b9d6a9 100644 --- a/src/live_effects/lpe-powerstroke.cpp +++ b/src/live_effects/lpe-powerstroke.cpp @@ -26,16 +26,10 @@ namespace LivePathEffect { LPEPowerStroke::LPEPowerStroke(LivePathEffectObject *lpeobject) : Effect(lpeobject), - offset_1(_("Start Offset"), _("Handle to control the distance of the offset from the curve"), "offset_1", &wr, this), - offset_2(_("End Offset"), _("Handle to control the distance of the offset from the curve"), "offset_2", &wr, this), - offset_3(_("End Offset"), _("Handle to control the distance of the offset from the curve"), "offset_3", &wr, this), offset_points(_("Offset points"), _("Offset points"), "offset_points", &wr, this) { show_orig_path = true; - registerParameter( dynamic_cast(&offset_1) ); - registerParameter( dynamic_cast(&offset_2) ); - registerParameter( dynamic_cast(&offset_3) ); registerParameter( dynamic_cast(&offset_points) ); } @@ -48,9 +42,12 @@ LPEPowerStroke::~LPEPowerStroke() void LPEPowerStroke::doOnApply(SPLPEItem *lpeitem) { - offset_1.param_set_and_write_new_value(*(SP_SHAPE(lpeitem)->curve->first_point())); - offset_2.param_set_and_write_new_value(*(SP_SHAPE(lpeitem)->curve->last_point())); - offset_3.param_set_and_write_new_value(*(SP_SHAPE(lpeitem)->curve->last_point())); + std::vector points; + points.push_back( *(SP_SHAPE(lpeitem)->curve->first_point()) ); + Geom::Path const *path = SP_SHAPE(lpeitem)->curve->first_path(); + points.push_back( path->pointAt(path->size()/2) ); + points.push_back( *(SP_SHAPE(lpeitem)->curve->last_point()) ); + offset_points.param_set_and_write_new_value(points); } static void append_half_circle(Geom::Piecewise > &pwd2, @@ -68,38 +65,27 @@ LPEPowerStroke::doEffect_pwd2 (Geom::Piecewise > const & { using namespace Geom; - double t1 = nearest_point(offset_1, pwd2_in); - double offset1 = L2(pwd2_in.valueAt(t1) - offset_1); + std::vector ts(offset_points.data().size()); - double t2 = nearest_point(offset_2, pwd2_in); - double offset2 = L2(pwd2_in.valueAt(t2) - offset_2); - - double t3 = nearest_point(offset_3, pwd2_in); - double offset3 = L2(pwd2_in.valueAt(t3) - offset_3); - - /* - unsigned number_of_points = offset_points.data.size(); - double* t = new double[number_of_points]; - Point* offset = new double[number_of_points]; - for (unsigned i = 0; i < number_of_points; ++i) { - t[i] = nearest_point(offset_points.data[i], pwd2_in); - Point A = pwd2_in.valueAt(t[i]); - offset[i] = L2(A - offset_points.data[i]); + for (unsigned int i; i < ts.size(); ++i) { + double t = nearest_point(offset_points.data().at(i), pwd2_in); + double offset = L2(pwd2_in.valueAt(t) - offset_points.data().at(i)); + ts.at(i) = Geom::Point(t, offset); } - */ // create stroke path where points (x,y) = (t, offset) Path strokepath; strokepath.start( Point(pwd2_in.domain().min(),0) ); - strokepath.appendNew( Point(t1, offset1) ); - strokepath.appendNew( Point(t2, offset2) ); - strokepath.appendNew( Point(t3, offset3) ); + for (unsigned int i = 0 ; i < ts.size(); ++i) { + strokepath.appendNew(ts.at(i)); + } strokepath.appendNew( Point(pwd2_in.domain().max(), 0) ); - strokepath.appendNew( Point(t3, -offset3) ); - strokepath.appendNew( Point(t2, -offset2) ); - strokepath.appendNew( Point(t1, -offset1) ); + for (unsigned int i = 0; i < ts.size(); ++i) { + Geom::Point temp = ts.at(ts.size() - 1 - i); + strokepath.appendNew( Geom::Point(temp[X], - temp[Y]) ); + } strokepath.close(); - + D2 > patternd2 = make_cuts_independent(strokepath.toPwSb()); Piecewise x = Piecewise(patternd2[0]); Piecewise y = Piecewise(patternd2[1]); diff --git a/src/live_effects/lpe-powerstroke.h b/src/live_effects/lpe-powerstroke.h index 811c63259..66b2ab89f 100644 --- a/src/live_effects/lpe-powerstroke.h +++ b/src/live_effects/lpe-powerstroke.h @@ -29,9 +29,6 @@ public: virtual void doOnApply(SPLPEItem *lpeitem); private: - PointParam offset_1; - PointParam offset_2; - PointParam offset_3; PowerStrokePointArrayParam offset_points; LPEPowerStroke(const LPEPowerStroke&); diff --git a/src/live_effects/parameter/array.h b/src/live_effects/parameter/array.h index e5f230111..89c344594 100644 --- a/src/live_effects/parameter/array.h +++ b/src/live_effects/parameter/array.h @@ -85,10 +85,7 @@ public: g_free(str); } -private: - ArrayParam(const ArrayParam&); - ArrayParam& operator=(const ArrayParam&); - +protected: std::vector _vector; size_t _default_size; @@ -103,6 +100,10 @@ private: } StorageType readsvg(const gchar * str); + +private: + ArrayParam(const ArrayParam&); + ArrayParam& operator=(const ArrayParam&); }; diff --git a/src/live_effects/parameter/powerstrokepointarray.cpp b/src/live_effects/parameter/powerstrokepointarray.cpp index 923266a94..49ef05319 100644 --- a/src/live_effects/parameter/powerstrokepointarray.cpp +++ b/src/live_effects/parameter/powerstrokepointarray.cpp @@ -33,7 +33,7 @@ PowerStrokePointArrayParam::PowerStrokePointArrayParam( const Glib::ustring& lab { knot_shape = SP_KNOT_SHAPE_DIAMOND; knot_mode = SP_KNOT_MODE_XOR; - knot_color = 0xffffff00; + knot_color = 0xff00ff00; handle_tip = g_strdup(htip); } @@ -110,15 +110,16 @@ PowerStrokePointArrayParamKnotHolderEntity::PowerStrokePointArrayParamKnotHolder void PowerStrokePointArrayParamKnotHolderEntity::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint /*state*/) { -// Geom::Point const s = snap_knot_position(p); -// pparam->param_setValue(s); -// sp_lpe_item_update_patheffect(SP_LPE_ITEM(item), false, false); + Geom::Point const s = snap_knot_position(p); + _pparam->_vector.at(_index) = s; +// _pparam->param_set_and_write_new_value(_pparam->_vector); + sp_lpe_item_update_patheffect(SP_LPE_ITEM(item), false, false); } Geom::Point PowerStrokePointArrayParamKnotHolderEntity::knot_get() { - Geom::Point canvas_point; + Geom::Point canvas_point = _pparam->_vector.at(_index); return canvas_point; } @@ -131,11 +132,11 @@ PowerStrokePointArrayParamKnotHolderEntity::knot_click(guint /*state*/) void PowerStrokePointArrayParam::addKnotHolderEntities(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item) { - //PowerStrokePointArrayParamKnotHolderEntity *e = new PowerStrokePointArrayParamKnotHolderEntity(this); - // TODO: can we ditch handleTip() etc. because we have access to handle_tip etc. itself??? - //e->create(desktop, item, knotholder, handleTip(), knot_shape, knot_mode, knot_color); - //knotholder->add(e); - + for (unsigned int i = 0; i < _vector.size(); ++i) { + PowerStrokePointArrayParamKnotHolderEntity *e = new PowerStrokePointArrayParamKnotHolderEntity(this, i); + e->create(desktop, item, knotholder, handle_tip, knot_shape, knot_mode, knot_color); + knotholder->add(e); + } } } /* namespace LivePathEffect */ diff --git a/src/live_effects/parameter/powerstrokepointarray.h b/src/live_effects/parameter/powerstrokepointarray.h index 0a33c0369..66eb3c987 100644 --- a/src/live_effects/parameter/powerstrokepointarray.h +++ b/src/live_effects/parameter/powerstrokepointarray.h @@ -22,6 +22,8 @@ namespace Inkscape { namespace LivePathEffect { +class PowerStrokePointArrayParamKnotHolderEntity; + class PowerStrokePointArrayParam : public ArrayParam { public: PowerStrokePointArrayParam( const Glib::ustring& label, @@ -41,6 +43,8 @@ public: virtual bool providesKnotHolderEntities() { return true; } virtual void addKnotHolderEntities(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item); + friend class PowerStrokePointArrayParamKnotHolderEntity; + private: PowerStrokePointArrayParam(const PowerStrokePointArrayParam&); PowerStrokePointArrayParam& operator=(const PowerStrokePointArrayParam&);