summaryrefslogtreecommitdiffstats
path: root/src/live_effects/lpe-transform_2pts.cpp
diff options
context:
space:
mode:
authorJabier Arraiza Cenoz <jabier.arraiza@marker.es>2016-03-15 21:57:03 +0000
committerJabiertxof <jtx@jtx.marker.es>2016-03-15 21:57:03 +0000
commit6bd1c2a30b66e15fe055b22bd47dadb771f7fae2 (patch)
tree1b991cc2736f84fb069666802d485bd29cff6394 /src/live_effects/lpe-transform_2pts.cpp
parentUpdate to limit options to radius = 0, radious > 0 or both (diff)
parentfix-bug-1557192. paint-order crash with multiple items (diff)
downloadinkscape-6bd1c2a30b66e15fe055b22bd47dadb771f7fae2.tar.gz
inkscape-6bd1c2a30b66e15fe055b22bd47dadb771f7fae2.zip
Update to trunk
(bzr r13645.1.119)
Diffstat (limited to '')
-rw-r--r--src/live_effects/lpe-transform_2pts.cpp87
1 files changed, 71 insertions, 16 deletions
diff --git a/src/live_effects/lpe-transform_2pts.cpp b/src/live_effects/lpe-transform_2pts.cpp
index 79ffd74de..1cd59b7fa 100644
--- a/src/live_effects/lpe-transform_2pts.cpp
+++ b/src/live_effects/lpe-transform_2pts.cpp
@@ -19,7 +19,8 @@
#include "sp-path.h"
#include "ui/icon-names.h"
#include "svg/svg.h"
-
+#include "verbs.h"
+// TODO due to internal breakage in glibmm headers, this must be last:
#include <glibmm/i18n.h>
namespace Inkscape {
@@ -29,10 +30,14 @@ LPETransform2Pts::LPETransform2Pts(LivePathEffectObject *lpeobject) :
Effect(lpeobject),
elastic(_("Elastic"), _("Elastic transform mode"), "elastic", &wr, this, false,"", INKSCAPE_ICON("on"), INKSCAPE_ICON("off")),
from_original_width(_("From original width"), _("From original width"), "from_original_width", &wr, this, false,"", INKSCAPE_ICON("on"), INKSCAPE_ICON("off")),
- lock_lenght(_("Lock lenght"), _("Lock lenght to current distance"), "lock_lenght", &wr, this, false,"", INKSCAPE_ICON("on"), INKSCAPE_ICON("off")),
+ lock_lenght(_("Lock length"), _("Lock length to current distance"), "lock_lenght", &wr, this, false,"", INKSCAPE_ICON("on"), INKSCAPE_ICON("off")),
lock_angle(_("Lock angle"), _("Lock angle"), "lock_angle", &wr, this, false,"", INKSCAPE_ICON("on"), INKSCAPE_ICON("off")),
+ flip_horizontal(_("Flip horizontal"), _("Flip horizontal"), "flip_horizontal", &wr, this, false,"", INKSCAPE_ICON("on"), INKSCAPE_ICON("off")),
+ flip_vertical(_("Flip vertical"), _("Flip vertical"), "flip_vertical", &wr, this, false,"", INKSCAPE_ICON("on"), INKSCAPE_ICON("off")),
start(_("Start"), _("Start point"), "start", &wr, this, "Start point"),
end(_("End"), _("End point"), "end", &wr, this, "End point"),
+ strech(_("Stretch"), _("Stretch the result"), "strech", &wr, this, 1),
+ offset(_("Offset"), _("Offset from knots"), "offset", &wr, this, 0),
first_knot(_("First Knot"), _("First Knot"), "first_knot", &wr, this, 1),
last_knot(_("Last Knot"), _("Last Knot"), "last_knot", &wr, this, 1),
helper_size(_("Helper size:"), _("Rotation helper size"), "helper_size", &wr, this, 3),
@@ -41,25 +46,39 @@ LPETransform2Pts::LPETransform2Pts(LivePathEffectObject *lpeobject) :
point_b(Geom::Point()),
pathvector(),
append_path(false),
- previous_angle(Geom::deg_to_rad(0)),
+ previous_angle(Geom::rad_from_deg(0)),
previous_start(Geom::Point()),
previous_lenght(-1)
{
- registerParameter(&start);
- registerParameter(&end);
+
registerParameter(&first_knot);
registerParameter(&last_knot);
registerParameter(&helper_size);
+ registerParameter(&strech);
+ registerParameter(&offset);
+ registerParameter(&start);
+ registerParameter(&end);
registerParameter(&elastic);
registerParameter(&from_original_width);
+ registerParameter(&flip_vertical);
+ registerParameter(&flip_horizontal);
registerParameter(&lock_lenght);
registerParameter(&lock_angle);
first_knot.param_make_integer(true);
+ first_knot.param_overwrite_widget(true);
last_knot.param_make_integer(true);
+ last_knot.param_overwrite_widget(true);
helper_size.param_set_range(0, 999);
helper_size.param_set_increments(1, 1);
helper_size.param_set_digits(0);
+ offset.param_set_range(-999999.0, 999999.0);
+ offset.param_set_increments(1, 1);
+ offset.param_set_digits(2);
+ strech.param_set_range(0, 999.0);
+ strech.param_set_increments(0.01, 0.01);
+ strech.param_set_digits(4);
+ apply_to_clippath_and_mask = true;
}
LPETransform2Pts::~LPETransform2Pts()
@@ -133,10 +152,10 @@ LPETransform2Pts::doBeforeEffect (SPLPEItem const* lpeitem)
}
if(lock_lenght && !lock_angle && previous_lenght != -1) {
Geom::Ray transformed((Geom::Point)start,(Geom::Point)end);
- if(previous_start == start || previous_angle == Geom::deg_to_rad(0)) {
+ if(previous_start == start || previous_angle == Geom::rad_from_deg(0)) {
previous_angle = transformed.angle();
}
- } else if(lock_angle && !lock_lenght && previous_angle != Geom::deg_to_rad(0)) {
+ } else if(lock_angle && !lock_lenght && previous_angle != Geom::rad_from_deg(0)) {
if(previous_start == start){
previous_lenght = Geom::distance((Geom::Point)start, (Geom::Point)end);
}
@@ -149,8 +168,6 @@ LPETransform2Pts::doBeforeEffect (SPLPEItem const* lpeitem)
previous_angle = transformed.angle();
previous_lenght = Geom::distance((Geom::Point)start, (Geom::Point)end);
previous_start = start;
- splpeitem->apply_to_clippath(splpeitem);
- splpeitem->apply_to_mask(splpeitem);
}
void
@@ -176,6 +193,7 @@ LPETransform2Pts::updateIndex()
start.param_set_default();
end.param_set_default();
}
+ DocumentUndo::done(getSPDoc(), SP_VERB_DIALOG_LIVE_PATH_EFFECT, _("Change index of knot"));
}
//todo migrate to PathVector class?
size_t
@@ -259,6 +277,7 @@ Gtk::Widget *LPETransform2Pts::newWidget()
Gtk::HBox * button1 = Gtk::manage(new Gtk::HBox(true,0));
Gtk::HBox * button2 = Gtk::manage(new Gtk::HBox(true,0));
Gtk::HBox * button3 = Gtk::manage(new Gtk::HBox(true,0));
+ Gtk::HBox * button4 = Gtk::manage(new Gtk::HBox(true,0));
while (it != param_vector.end()) {
if ((*it)->widget_is_visible) {
Parameter *param = *it;
@@ -292,7 +311,7 @@ Gtk::Widget *LPETransform2Pts::newWidget()
widg->set_has_tooltip(false);
}
}
- } else if (param->param_key == "lock_angle" || param->param_key == "lock_lenght") {
+ } else if (param->param_key == "flip_horizontal" || param->param_key == "flip_vertical") {
Glib::ustring * tip = param->param_getTooltip();
if (widg) {
button2->pack_start(*widg, true, true, 2);
@@ -303,6 +322,17 @@ Gtk::Widget *LPETransform2Pts::newWidget()
widg->set_has_tooltip(false);
}
}
+ } else if (param->param_key == "lock_angle" || param->param_key == "lock_lenght") {
+ Glib::ustring * tip = param->param_getTooltip();
+ if (widg) {
+ button3->pack_start(*widg, true, true, 2);
+ if (tip) {
+ widg->set_tooltip_text(*tip);
+ } else {
+ widg->set_tooltip_text("");
+ widg->set_has_tooltip(false);
+ }
+ }
} else if (widg) {
vbox->pack_start(*widg, true, true, 2);
if (tip) {
@@ -318,10 +348,11 @@ Gtk::Widget *LPETransform2Pts::newWidget()
}
Gtk::Button *reset = Gtk::manage(new Gtk::Button(Glib::ustring(_("Reset"))));
reset->signal_clicked().connect(sigc::mem_fun(*this, &LPETransform2Pts::reset));
- button3->pack_start(*reset, true, true, 2);
+ button4->pack_start(*reset, true, true, 2);
vbox->pack_start(*button1, true, true, 2);
vbox->pack_start(*button2, true, true, 2);
vbox->pack_start(*button3, true, true, 2);
+ vbox->pack_start(*button4, true, true, 2);
return dynamic_cast<Gtk::Widget *>(vbox);
}
@@ -337,8 +368,26 @@ LPETransform2Pts::doEffect_pwd2 (Geom::Piecewise<Geom::D2<Geom::SBasis> > const
helper.start(point_a);
helper.appendNew<Geom::LineSegment>(point_b);
Geom::Affine m;
+ Geom::Angle original_angle = original.angle();
+ if(flip_horizontal && flip_vertical){
+ m *= Geom::Rotate(-original_angle);
+ m *= Geom::Scale(-1,-1);
+ m *= Geom::Rotate(original_angle);
+ } else if(flip_vertical){
+ m *= Geom::Rotate(-original_angle);
+ m *= Geom::Scale(1,-1);
+ m *= Geom::Rotate(original_angle);
+ } else if(flip_horizontal){
+ m *= Geom::Rotate(-original_angle);
+ m *= Geom::Scale(-1,1);
+ m *= Geom::Rotate(original_angle);
+ }
+ if(strech != 1){
+ m *= Geom::Rotate(-original_angle);
+ m *= Geom::Scale(1,strech);
+ m *= Geom::Rotate(original_angle);
+ }
if(elastic) {
- Geom::Angle original_angle = original.angle();
m *= Geom::Rotate(-original_angle);
if(sca > 1){
m *= Geom::Scale(sca, 1.0);
@@ -346,14 +395,20 @@ LPETransform2Pts::doEffect_pwd2 (Geom::Piecewise<Geom::D2<Geom::SBasis> > const
m *= Geom::Scale(sca, 1.0-((1.0-sca)/2.0));
}
m *= Geom::Rotate(transformed.angle());
- helper *= m;
- m *= Geom::Translate((Geom::Point)start - helper.initialPoint());
} else {
m *= Geom::Scale(sca);
m *= Geom::Rotate(rot);
- helper *= m;
- m *= Geom::Translate((Geom::Point)start - helper.initialPoint());
}
+ helper *= m;
+ Geom::Point trans = (Geom::Point)start - helper.initialPoint();
+ if(flip_horizontal){
+ trans = (Geom::Point)end - helper.initialPoint();
+ }
+ if(offset != 0){
+ trans = Geom::Point::polar(transformed.angle() + Geom::rad_from_deg(-90),offset) + trans;
+ }
+ m *= Geom::Translate(trans);
+
output.concat(pwd2_in * m);
return output;