summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJabier Arraiza <jabier.arraiza@marker.es>2018-05-26 15:41:40 +0000
committerJabier Arraiza <jabier.arraiza@marker.es>2018-05-26 15:41:40 +0000
commit4ef70073ad77fb90d1f89f1ea5a65c5833c9f3c9 (patch)
treeee901a41bae0158c7dbec61f6c49be9ec78f92ba /src
parentFix compilation with poppler 0.65.0 (diff)
downloadinkscape-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.cpp224
-rw-r--r--src/live_effects/lpe-copy_rotate.h6
-rw-r--r--src/live_effects/lpe-mirror_symmetry.cpp169
-rw-r--r--src/live_effects/lpe-mirror_symmetry.h4
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 &divider)
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 &divider);
+ void split(Geom::PathVector &path_in, Geom::Path const &divider);
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&);
};