diff options
| author | Jabier Arraiza <jabier.arraiza@marker.es> | 2018-05-26 15:41:40 +0000 |
|---|---|---|
| committer | Jabier Arraiza <jabier.arraiza@marker.es> | 2018-05-26 15:41:40 +0000 |
| commit | 4ef70073ad77fb90d1f89f1ea5a65c5833c9f3c9 (patch) | |
| tree | ee901a41bae0158c7dbec61f6c49be9ec78f92ba /src | |
| parent | Fix compilation with poppler 0.65.0 (diff) | |
| download | inkscape-4ef70073ad77fb90d1f89f1ea5a65c5833c9f3c9.tar.gz inkscape-4ef70073ad77fb90d1f89f1ea5a65c5833c9f3c9.zip | |
Add center mirror symmetry butons for perfect symmetry and rotate copyes cleanup
Diffstat (limited to 'src')
| -rw-r--r-- | src/live_effects/lpe-copy_rotate.cpp | 224 | ||||
| -rw-r--r-- | src/live_effects/lpe-copy_rotate.h | 6 | ||||
| -rw-r--r-- | src/live_effects/lpe-mirror_symmetry.cpp | 169 | ||||
| -rw-r--r-- | src/live_effects/lpe-mirror_symmetry.h | 4 |
4 files changed, 224 insertions, 179 deletions
diff --git a/src/live_effects/lpe-copy_rotate.cpp b/src/live_effects/lpe-copy_rotate.cpp index 74ee0cfda..8ac5991a3 100644 --- a/src/live_effects/lpe-copy_rotate.cpp +++ b/src/live_effects/lpe-copy_rotate.cpp @@ -489,118 +489,118 @@ LPECopyRotate::split(Geom::PathVector &path_on, Geom::Path const ÷r) path_on = tmp_path; } -void -LPECopyRotate::setFusion(Geom::PathVector &path_on, Geom::Path divider, double size_divider) -{ - split(path_on,divider); - Geom::PathVector tmp_path; - Geom::Affine pre = Geom::Translate(-origin); - for (Geom::PathVector::const_iterator path_it = path_on.begin(); path_it != path_on.end(); ++path_it) { - Geom::Path original = *path_it; - if (path_it->empty()) { - continue; - } - Geom::PathVector tmp_path_helper; - Geom::Path append_path = original; - Geom::Point previous = original.finalPoint(); - for (int i = 0; i < num_copies; ++i) { - Geom::Rotate rot(-Geom::rad_from_deg(rotation_angle * (i))); - Geom::Affine m = pre * rot * Geom::Translate(origin); - if (i%2 != 0 && mirror_copies) { - Geom::Point point_a = (Geom::Point)origin; - Geom::Point point_b = origin + dir * Geom::Rotate(-Geom::rad_from_deg((rotation_angle*i)+starting_angle)) * size_divider; - Geom::Line ls(point_a, point_b); - m = Geom::reflection (ls.vector(), point_a); - append_path *= m; - } else { - append_path = original; - append_path *= m; - } - previous = append_path.finalPoint(); - if (tmp_path_helper.size() > 0) { - if (Geom::are_near(tmp_path_helper[tmp_path_helper.size()-1].finalPoint(), append_path.finalPoint())) { - Geom::Path tmp_append = append_path.reversed(); - tmp_append.setInitial(tmp_path_helper[tmp_path_helper.size()-1].finalPoint()); - tmp_path_helper[tmp_path_helper.size()-1].append(tmp_append); - } else if (Geom::are_near(tmp_path_helper[tmp_path_helper.size()-1].initialPoint(), append_path.initialPoint())) { - Geom::Path tmp_append = append_path; - tmp_path_helper[tmp_path_helper.size()-1] = tmp_path_helper[tmp_path_helper.size()-1].reversed(); - tmp_append.setInitial(tmp_path_helper[tmp_path_helper.size()-1].finalPoint()); - tmp_path_helper[tmp_path_helper.size()-1].append(tmp_append); - } else if (Geom::are_near(tmp_path_helper[tmp_path_helper.size()-1].finalPoint(), append_path.initialPoint())) { - Geom::Path tmp_append = append_path; - tmp_append.setInitial(tmp_path_helper[tmp_path_helper.size()-1].finalPoint()); - tmp_path_helper[tmp_path_helper.size()-1].append(tmp_append); - } else if (Geom::are_near(tmp_path_helper[tmp_path_helper.size()-1].initialPoint(), append_path.finalPoint())) { - Geom::Path tmp_append = append_path.reversed(); - tmp_path_helper[tmp_path_helper.size()-1] = tmp_path_helper[tmp_path_helper.size()-1].reversed(); - tmp_append.setInitial(tmp_path_helper[tmp_path_helper.size()-1].finalPoint()); - tmp_path_helper[tmp_path_helper.size()-1].append(tmp_append); - } else if (Geom::are_near(tmp_path_helper[0].finalPoint(), append_path.finalPoint())) { - Geom::Path tmp_append = append_path.reversed(); - tmp_append.setInitial(tmp_path_helper[0].finalPoint()); - tmp_path_helper[0].append(tmp_append); - } else if (Geom::are_near(tmp_path_helper[0].initialPoint(), append_path.initialPoint())) { - Geom::Path tmp_append = append_path; - tmp_path_helper[0] = tmp_path_helper[0].reversed(); - tmp_append.setInitial(tmp_path_helper[0].finalPoint()); - tmp_path_helper[0].append(tmp_append); - } else { - tmp_path_helper.push_back(append_path); - } - if ( Geom::are_near(tmp_path_helper[tmp_path_helper.size()-1].finalPoint(),tmp_path_helper[tmp_path_helper.size()-1].initialPoint())) { - tmp_path_helper[tmp_path_helper.size()-1].close(); - } - } else { - tmp_path_helper.push_back(append_path); - } - } - if (tmp_path_helper.size() > 0) { - tmp_path_helper[tmp_path_helper.size()-1] = tmp_path_helper[tmp_path_helper.size()-1]; - tmp_path_helper[0] = tmp_path_helper[0]; - if (rotation_angle * num_copies != 360) { - Geom::Ray base_a(divider.pointAt(1),divider.pointAt(0)); - double diagonal = Geom::distance(Geom::Point(boundingbox_X.min(),boundingbox_Y.min()),Geom::Point(boundingbox_X.max(),boundingbox_Y.max())); - Geom::Rect bbox(Geom::Point(boundingbox_X.min(),boundingbox_Y.min()),Geom::Point(boundingbox_X.max(),boundingbox_Y.max())); - double size_divider = Geom::distance(origin,bbox) + (diagonal * 2); - Geom::Point base_point = origin + dir * Geom::Rotate(-Geom::rad_from_deg((rotation_angle * num_copies) + starting_angle)) * size_divider; - Geom::Ray base_b(divider.pointAt(1), base_point); - if (Geom::are_near(tmp_path_helper[0].initialPoint(),base_a) && - Geom::are_near(tmp_path_helper[0].finalPoint(),base_a)) - { - tmp_path_helper[0].close(); - if (tmp_path_helper.size() > 1) { - tmp_path_helper[tmp_path_helper.size()-1].close(); - } - } else if (Geom::are_near(tmp_path_helper[tmp_path_helper.size()-1].initialPoint(),base_b) && - Geom::are_near(tmp_path_helper[tmp_path_helper.size()-1].finalPoint(),base_b)) - { - tmp_path_helper[0].close(); - if (tmp_path_helper.size() > 1) { - tmp_path_helper[tmp_path_helper.size()-1].close(); - } - } else if ((Geom::are_near(tmp_path_helper[0].initialPoint(),base_a) && - Geom::are_near(tmp_path_helper[tmp_path_helper.size()-1].finalPoint(),base_b)) || - (Geom::are_near(tmp_path_helper[0].initialPoint(),base_b) && - Geom::are_near(tmp_path_helper[tmp_path_helper.size()-1].finalPoint(),base_a))) - { - Geom::Path close_path = Geom::Path(tmp_path_helper[tmp_path_helper.size()-1].finalPoint()); - close_path.appendNew<Geom::LineSegment>((Geom::Point)origin); - close_path.appendNew<Geom::LineSegment>(tmp_path_helper[0].initialPoint()); - tmp_path_helper[0].append(close_path); - } - } - - if (Geom::are_near(tmp_path_helper[0].finalPoint(),tmp_path_helper[0].initialPoint())) { - tmp_path_helper[0].close(); - } - } - tmp_path.insert(tmp_path.end(), tmp_path_helper.begin(), tmp_path_helper.end()); - tmp_path_helper.clear(); - } - path_on = tmp_path; - tmp_path.clear(); -} +//void +//LPECopyRotate::setFusion(Geom::PathVector &path_on, Geom::Path divider, double size_divider) +//{ +// split(path_on,divider); +// Geom::PathVector tmp_path; +// Geom::Affine pre = Geom::Translate(-origin); +// for (Geom::PathVector::const_iterator path_it = path_on.begin(); path_it != path_on.end(); ++path_it) { +// Geom::Path original = *path_it; +// if (path_it->empty()) { +// continue; +// } +// Geom::PathVector tmp_path_helper; +// Geom::Path append_path = original; +// Geom::Point previous = original.finalPoint(); +// for (int i = 0; i < num_copies; ++i) { +// Geom::Rotate rot(-Geom::rad_from_deg(rotation_angle * (i))); +// Geom::Affine m = pre * rot * Geom::Translate(origin); +// if (i%2 != 0 && mirror_copies) { +// Geom::Point point_a = (Geom::Point)origin; +// Geom::Point point_b = origin + dir * Geom::Rotate(-Geom::rad_from_deg((rotation_angle*i)+starting_angle)) * size_divider; +// Geom::Line ls(point_a, point_b); +// m = Geom::reflection (ls.vector(), point_a); +// append_path *= m; +// } else { +// append_path = original; +// append_path *= m; +// } +// previous = append_path.finalPoint(); +// if (tmp_path_helper.size() > 0) { +// if (Geom::are_near(tmp_path_helper[tmp_path_helper.size()-1].finalPoint(), append_path.finalPoint())) { +// Geom::Path tmp_append = append_path.reversed(); +// tmp_append.setInitial(tmp_path_helper[tmp_path_helper.size()-1].finalPoint()); +// tmp_path_helper[tmp_path_helper.size()-1].append(tmp_append); +// } else if (Geom::are_near(tmp_path_helper[tmp_path_helper.size()-1].initialPoint(), append_path.initialPoint())) { +// Geom::Path tmp_append = append_path; +// tmp_path_helper[tmp_path_helper.size()-1] = tmp_path_helper[tmp_path_helper.size()-1].reversed(); +// tmp_append.setInitial(tmp_path_helper[tmp_path_helper.size()-1].finalPoint()); +// tmp_path_helper[tmp_path_helper.size()-1].append(tmp_append); +// } else if (Geom::are_near(tmp_path_helper[tmp_path_helper.size()-1].finalPoint(), append_path.initialPoint())) { +// Geom::Path tmp_append = append_path; +// tmp_append.setInitial(tmp_path_helper[tmp_path_helper.size()-1].finalPoint()); +// tmp_path_helper[tmp_path_helper.size()-1].append(tmp_append); +// } else if (Geom::are_near(tmp_path_helper[tmp_path_helper.size()-1].initialPoint(), append_path.finalPoint())) { +// Geom::Path tmp_append = append_path.reversed(); +// tmp_path_helper[tmp_path_helper.size()-1] = tmp_path_helper[tmp_path_helper.size()-1].reversed(); +// tmp_append.setInitial(tmp_path_helper[tmp_path_helper.size()-1].finalPoint()); +// tmp_path_helper[tmp_path_helper.size()-1].append(tmp_append); +// } else if (Geom::are_near(tmp_path_helper[0].finalPoint(), append_path.finalPoint())) { +// Geom::Path tmp_append = append_path.reversed(); +// tmp_append.setInitial(tmp_path_helper[0].finalPoint()); +// tmp_path_helper[0].append(tmp_append); +// } else if (Geom::are_near(tmp_path_helper[0].initialPoint(), append_path.initialPoint())) { +// Geom::Path tmp_append = append_path; +// tmp_path_helper[0] = tmp_path_helper[0].reversed(); +// tmp_append.setInitial(tmp_path_helper[0].finalPoint()); +// tmp_path_helper[0].append(tmp_append); +// } else { +// tmp_path_helper.push_back(append_path); +// } +// if ( Geom::are_near(tmp_path_helper[tmp_path_helper.size()-1].finalPoint(),tmp_path_helper[tmp_path_helper.size()-1].initialPoint())) { +// tmp_path_helper[tmp_path_helper.size()-1].close(); +// } +// } else { +// tmp_path_helper.push_back(append_path); +// } +// } +// if (tmp_path_helper.size() > 0) { +// tmp_path_helper[tmp_path_helper.size()-1] = tmp_path_helper[tmp_path_helper.size()-1]; +// tmp_path_helper[0] = tmp_path_helper[0]; +// if (rotation_angle * num_copies != 360) { +// Geom::Ray base_a(divider.pointAt(1),divider.pointAt(0)); +// double diagonal = Geom::distance(Geom::Point(boundingbox_X.min(),boundingbox_Y.min()),Geom::Point(boundingbox_X.max(),boundingbox_Y.max())); +// Geom::Rect bbox(Geom::Point(boundingbox_X.min(),boundingbox_Y.min()),Geom::Point(boundingbox_X.max(),boundingbox_Y.max())); +// double size_divider = Geom::distance(origin,bbox) + (diagonal * 2); +// Geom::Point base_point = origin + dir * Geom::Rotate(-Geom::rad_from_deg((rotation_angle * num_copies) + starting_angle)) * size_divider; +// Geom::Ray base_b(divider.pointAt(1), base_point); +// if (Geom::are_near(tmp_path_helper[0].initialPoint(),base_a) && +// Geom::are_near(tmp_path_helper[0].finalPoint(),base_a)) +// { +// tmp_path_helper[0].close(); +// if (tmp_path_helper.size() > 1) { +// tmp_path_helper[tmp_path_helper.size()-1].close(); +// } +// } else if (Geom::are_near(tmp_path_helper[tmp_path_helper.size()-1].initialPoint(),base_b) && +// Geom::are_near(tmp_path_helper[tmp_path_helper.size()-1].finalPoint(),base_b)) +// { +// tmp_path_helper[0].close(); +// if (tmp_path_helper.size() > 1) { +// tmp_path_helper[tmp_path_helper.size()-1].close(); +// } +// } else if ((Geom::are_near(tmp_path_helper[0].initialPoint(),base_a) && +// Geom::are_near(tmp_path_helper[tmp_path_helper.size()-1].finalPoint(),base_b)) || +// (Geom::are_near(tmp_path_helper[0].initialPoint(),base_b) && +// Geom::are_near(tmp_path_helper[tmp_path_helper.size()-1].finalPoint(),base_a))) +// { +// Geom::Path close_path = Geom::Path(tmp_path_helper[tmp_path_helper.size()-1].finalPoint()); +// close_path.appendNew<Geom::LineSegment>((Geom::Point)origin); +// close_path.appendNew<Geom::LineSegment>(tmp_path_helper[0].initialPoint()); +// tmp_path_helper[0].append(close_path); +// } +// } + +// if (Geom::are_near(tmp_path_helper[0].finalPoint(),tmp_path_helper[0].initialPoint())) { +// tmp_path_helper[0].close(); +// } +// } +// tmp_path.insert(tmp_path.end(), tmp_path_helper.begin(), tmp_path_helper.end()); +// tmp_path_helper.clear(); +// } +// path_on = tmp_path; +// tmp_path.clear(); +//} Geom::PathVector LPECopyRotate::doEffect_path (Geom::PathVector const & path_in) diff --git a/src/live_effects/lpe-copy_rotate.h b/src/live_effects/lpe-copy_rotate.h index dcbd1c45e..84c1e402e 100644 --- a/src/live_effects/lpe-copy_rotate.h +++ b/src/live_effects/lpe-copy_rotate.h @@ -37,20 +37,20 @@ public: virtual ~LPECopyRotate(); virtual void doOnApply (SPLPEItem const* lpeitem); virtual Geom::PathVector doEffect_path (Geom::PathVector const & path_in); - Geom::PathVector doEffect_path_post (Geom::PathVector const & path_in); virtual void doBeforeEffect (SPLPEItem const* lpeitem); virtual void doAfterEffect (SPLPEItem const* lpeitem); - virtual void setFusion(Geom::PathVector &path_in, Geom::Path divider, double sizeDivider); - virtual void split(Geom::PathVector &path_in, Geom::Path const ÷r); + void split(Geom::PathVector &path_in, Geom::Path const ÷r); virtual void resetDefaults(SPItem const* item); virtual void transform_multiply(Geom::Affine const& postmul, bool set); virtual void doOnRemove (SPLPEItem const* /*lpeitem*/); virtual void doOnVisibilityToggled(SPLPEItem const* /*lpeitem*/); virtual Gtk::Widget * newWidget(); + Geom::PathVector doEffect_path_post (Geom::PathVector const & path_in); void toItem(Geom::Affine transform, size_t i, bool reset); void cloneD(SPObject *orig, SPObject *dest, Geom::Affine transform, bool reset); Inkscape::XML::Node * createPathBase(SPObject *elemref); void resetStyles(); + //virtual void setFusion(Geom::PathVector &path_in, Geom::Path divider, double sizeDivider); protected: virtual void addCanvasIndicators(SPLPEItem const *lpeitem, std::vector<Geom::PathVector> &hp_vec); diff --git a/src/live_effects/lpe-mirror_symmetry.cpp b/src/live_effects/lpe-mirror_symmetry.cpp index 1e62a98d5..4d9b218a5 100644 --- a/src/live_effects/lpe-mirror_symmetry.cpp +++ b/src/live_effects/lpe-mirror_symmetry.cpp @@ -79,6 +79,8 @@ LPEMirrorSymmetry::LPEMirrorSymmetry(LivePathEffectObject *lpeobject) : previous_center = Geom::Point(0,0); center_point.param_widget_is_visible(false); reset = false; + center_horiz = false; + center_vert = false; } LPEMirrorSymmetry::~LPEMirrorSymmetry() @@ -142,11 +144,21 @@ LPEMirrorSymmetry::newWidget() ++it; } Gtk::HBox * hbox = Gtk::manage(new Gtk::HBox(false,0)); + Gtk::HBox * hbox2 = Gtk::manage(new Gtk::HBox(false,0)); + Gtk::Button * center_vert_button = Gtk::manage(new Gtk::Button(Glib::ustring(_("Vertical center")))); + center_vert_button->signal_clicked().connect(sigc::mem_fun (*this,&LPEMirrorSymmetry::centerVert)); + center_vert_button->set_size_request(110,20); + Gtk::Button * center_horiz_button = Gtk::manage(new Gtk::Button(Glib::ustring(_("Horizontal center")))); + center_horiz_button->signal_clicked().connect(sigc::mem_fun (*this,&LPEMirrorSymmetry::centerHoriz)); + center_horiz_button->set_size_request(110,20); Gtk::Button * reset_button = Gtk::manage(new Gtk::Button(Glib::ustring(_("Reset styles")))); reset_button->signal_clicked().connect(sigc::mem_fun (*this,&LPEMirrorSymmetry::resetStyles)); reset_button->set_size_request(110,20); vbox->pack_start(*hbox, true,true,2); + vbox->pack_start(*hbox2, true,true,2); hbox->pack_start(*reset_button, false, false,2); + hbox2->pack_start(*center_vert_button, false, false,2); + hbox2->pack_start(*center_horiz_button, false, false,2); if(Gtk::Widget* widg = defaultParamSet()) { vbox->pack_start(*widg, true, true, 2); } @@ -154,78 +166,106 @@ LPEMirrorSymmetry::newWidget() } void +LPEMirrorSymmetry::centerVert(){ + center_vert = true; + sp_lpe_item_update_patheffect(sp_lpe_item, true, false); +} + +void +LPEMirrorSymmetry::centerHoriz(){ + center_horiz = true; + sp_lpe_item_update_patheffect(sp_lpe_item, true, false); +} + +void LPEMirrorSymmetry::doBeforeEffect (SPLPEItem const* lpeitem) { using namespace Geom; original_bbox(lpeitem, false, true); Point point_a(boundingbox_X.max(), boundingbox_Y.min()); Point point_b(boundingbox_X.max(), boundingbox_Y.max()); - if (mode == MT_Y) { - point_a = Geom::Point(boundingbox_X.min(),center_point[Y]); - point_b = Geom::Point(boundingbox_X.max(),center_point[Y]); - } - if (mode == MT_X) { - point_a = Geom::Point(center_point[X],boundingbox_Y.min()); - point_b = Geom::Point(center_point[X],boundingbox_Y.max()); - } - if ((Geom::Point)start_point == (Geom::Point)end_point) { - start_point.param_setValue(point_a); - end_point.param_setValue(point_b); - previous_center = Geom::middle_point((Geom::Point)start_point, (Geom::Point)end_point); - center_point.param_setValue(previous_center); - return; - } - if ( mode == MT_X || mode == MT_Y ) { - if (!are_near(previous_center, (Geom::Point)center_point, 0.01)) { - center_point.param_setValue(Geom::middle_point(point_a, point_b)); - end_point.param_setValue(point_b); - start_point.param_setValue(point_a); - } else { - if ( mode == MT_X ) { - if (!are_near(start_point[X], point_a[X], 0.01)) { - start_point.param_setValue(point_a); - } - if (!are_near(end_point[X], point_b[X], 0.01)) { - end_point.param_setValue(point_b); - } - } else { //MT_Y - if (!are_near(start_point[Y], point_a[Y], 0.01)) { - start_point.param_setValue(point_a); - } - if (!are_near(end_point[Y], point_b[Y], 0.01)) { - end_point.param_setValue(point_b); - } - } + Point point_c(boundingbox_X.middle(), boundingbox_Y.middle()); + if (center_vert) { + center_point.param_setValue(point_c); + end_point.param_setValue(Geom::Point(boundingbox_X.middle(), boundingbox_Y.min())); + //force update + start_point.param_setValue(Geom::Point(boundingbox_X.middle(), boundingbox_Y.max()),true); + center_vert = false; + } else if (center_horiz) { + center_point.param_setValue(point_c); + end_point.param_setValue(Geom::Point(boundingbox_X.max(), boundingbox_Y.middle())); + start_point.param_setValue(Geom::Point(boundingbox_X.min(), boundingbox_Y.middle()),true); + //force update + center_horiz = false; + } else { + + if (mode == MT_Y) { + point_a = Geom::Point(boundingbox_X.min(),center_point[Y]); + point_b = Geom::Point(boundingbox_X.max(),center_point[Y]); } - } else if ( mode == MT_FREE) { - if (are_near(previous_center, (Geom::Point)center_point, 0.01)) { - center_point.param_setValue(Geom::middle_point((Geom::Point)start_point, (Geom::Point)end_point)); - - } else { - Geom::Point trans = center_point - Geom::middle_point((Geom::Point)start_point, (Geom::Point)end_point); - start_point.param_setValue(start_point * trans); - end_point.param_setValue(end_point * trans); - + if (mode == MT_X) { + point_a = Geom::Point(center_point[X],boundingbox_Y.min()); + point_b = Geom::Point(center_point[X],boundingbox_Y.max()); } - } else if ( mode == MT_V){ - SPDocument * document = SP_ACTIVE_DOCUMENT; - if (document) { - Geom::Affine transform = i2anc_affine(SP_OBJECT(lpeitem), NULL).inverse(); - Geom::Point sp = Geom::Point(document->getWidth().value("px")/2.0, 0) * transform; - start_point.param_setValue(sp); - Geom::Point ep = Geom::Point(document->getWidth().value("px")/2.0, document->getHeight().value("px")) * transform; - end_point.param_setValue(ep); - center_point.param_setValue(Geom::middle_point((Geom::Point)start_point, (Geom::Point)end_point)); + if ((Geom::Point)start_point == (Geom::Point)end_point) { + start_point.param_setValue(point_a); + end_point.param_setValue(point_b); + previous_center = Geom::middle_point((Geom::Point)start_point, (Geom::Point)end_point); + center_point.param_setValue(previous_center); + return; } - } else { //horizontal page - SPDocument * document = SP_ACTIVE_DOCUMENT; - if (document) { - Geom::Affine transform = i2anc_affine(SP_OBJECT(lpeitem), NULL).inverse(); - Geom::Point sp = Geom::Point(0, document->getHeight().value("px")/2.0) * transform; - start_point.param_setValue(sp); - Geom::Point ep = Geom::Point(document->getWidth().value("px"), document->getHeight().value("px")/2.0) * transform; - end_point.param_setValue(ep); - center_point.param_setValue(Geom::middle_point((Geom::Point)start_point, (Geom::Point)end_point)); + if ( mode == MT_X || mode == MT_Y ) { + if (!are_near(previous_center, (Geom::Point)center_point, 0.01)) { + center_point.param_setValue(Geom::middle_point(point_a, point_b)); + end_point.param_setValue(point_b); + start_point.param_setValue(point_a); + } else { + if ( mode == MT_X ) { + if (!are_near(start_point[X], point_a[X], 0.01)) { + start_point.param_setValue(point_a); + } + if (!are_near(end_point[X], point_b[X], 0.01)) { + end_point.param_setValue(point_b); + } + } else { //MT_Y + if (!are_near(start_point[Y], point_a[Y], 0.01)) { + start_point.param_setValue(point_a); + } + if (!are_near(end_point[Y], point_b[Y], 0.01)) { + end_point.param_setValue(point_b); + } + } + } + } else if ( mode == MT_FREE) { + if (are_near(previous_center, (Geom::Point)center_point, 0.01)) { + center_point.param_setValue(Geom::middle_point((Geom::Point)start_point, (Geom::Point)end_point)); + + } else { + Geom::Point trans = center_point - Geom::middle_point((Geom::Point)start_point, (Geom::Point)end_point); + start_point.param_setValue(start_point * trans); + end_point.param_setValue(end_point * trans); + + } + } else if ( mode == MT_V){ + SPDocument * document = SP_ACTIVE_DOCUMENT; + if (document) { + Geom::Affine transform = i2anc_affine(SP_OBJECT(lpeitem), NULL).inverse(); + Geom::Point sp = Geom::Point(document->getWidth().value("px")/2.0, 0) * transform; + start_point.param_setValue(sp); + Geom::Point ep = Geom::Point(document->getWidth().value("px")/2.0, document->getHeight().value("px")) * transform; + end_point.param_setValue(ep); + center_point.param_setValue(Geom::middle_point((Geom::Point)start_point, (Geom::Point)end_point)); + } + } else { //horizontal page + SPDocument * document = SP_ACTIVE_DOCUMENT; + if (document) { + Geom::Affine transform = i2anc_affine(SP_OBJECT(lpeitem), NULL).inverse(); + Geom::Point sp = Geom::Point(0, document->getHeight().value("px")/2.0) * transform; + start_point.param_setValue(sp); + Geom::Point ep = Geom::Point(document->getWidth().value("px"), document->getHeight().value("px")/2.0) * transform; + end_point.param_setValue(ep); + center_point.param_setValue(Geom::middle_point((Geom::Point)start_point, (Geom::Point)end_point)); + } } } previous_center = center_point; @@ -340,6 +380,7 @@ LPEMirrorSymmetry::resetStyles(){ doAfterEffect(sp_lpe_item); } + //TODO: Migrate the tree next function to effect.cpp/h to avoid duplication void LPEMirrorSymmetry::doOnVisibilityToggled(SPLPEItem const* /*lpeitem*/) @@ -510,7 +551,7 @@ LPEMirrorSymmetry::doEffect_path (Geom::PathVector const & path_in) if (!oposite_fuse) { position *= -1; } - if (cs.size()!=0 && position == 1) { + if (cs.size()!=0 && (position == 1)) { if (time_start != original.size() && original.size() - time_start > Geom::EPSILON) { Geom::Path portion = original.portion(time_start, original.size()); if (!portion.empty()) { diff --git a/src/live_effects/lpe-mirror_symmetry.h b/src/live_effects/lpe-mirror_symmetry.h index d2d04c205..aa02b1352 100644 --- a/src/live_effects/lpe-mirror_symmetry.h +++ b/src/live_effects/lpe-mirror_symmetry.h @@ -53,6 +53,8 @@ public: void cloneD(SPObject *orig, SPObject *dest, bool reset); Inkscape::XML::Node * createPathBase(SPObject *elemref); void resetStyles(); + void centerVert(); + void centerHoriz(); protected: virtual void addCanvasIndicators(SPLPEItem const *lpeitem, std::vector<Geom::PathVector> &hp_vec); @@ -70,6 +72,8 @@ private: Geom::Point previous_center; SPObject * container; bool reset; + bool center_vert; + bool center_horiz; LPEMirrorSymmetry(const LPEMirrorSymmetry&); LPEMirrorSymmetry& operator=(const LPEMirrorSymmetry&); }; |
