summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorKrzysztof Kosi??ski <tweenk.pl@gmail.com>2010-02-07 01:22:44 +0000
committerKrzysztof KosiƄski <tweenk.pl@gmail.com>2010-02-07 01:22:44 +0000
commita19670da5137c1403f53f4a9725248acc8459950 (patch)
tree3e9b5c0d622a5bd94a7baddaa795a75d01600f03 /src
parentFix performance regressions in the node tool and a stupid crash bug (diff)
downloadinkscape-a19670da5137c1403f53f4a9725248acc8459950.tar.gz
inkscape-a19670da5137c1403f53f4a9725248acc8459950.zip
Fix path transformation (LP bug #515237)
Fixed bugs: - https://launchpad.net/bugs/515237 (bzr r9062)
Diffstat (limited to 'src')
-rw-r--r--src/2geom/hvlinesegment.h4
-rw-r--r--src/2geom/path.cpp13
-rw-r--r--src/gradient-drag.cpp5
3 files changed, 17 insertions, 5 deletions
diff --git a/src/2geom/hvlinesegment.h b/src/2geom/hvlinesegment.h
index ac91ec80a..6c42b06aa 100644
--- a/src/2geom/hvlinesegment.h
+++ b/src/2geom/hvlinesegment.h
@@ -216,7 +216,7 @@ class HLineSegment : public Curve
{
Point ip = initialPoint() * m;
Point ep = finalPoint() * m;
- if (m.onlyScaleAndTranslation()) {
+ if (ip[Y] == ep[Y]) {
return new HLineSegment(ip[X], ep[X], ip[Y]);
} else {
return new LineSegment(ip, ep);
@@ -457,7 +457,7 @@ class VLineSegment : public Curve
{
Point ip = initialPoint() * m;
Point ep = finalPoint() * m;
- if (m.onlyScaleAndTranslation()) {
+ if (ip[X] == ep[X]) {
return new VLineSegment(ip[X], ip[Y], ep[Y]);
} else {
return new LineSegment(ip, ep);
diff --git a/src/2geom/path.cpp b/src/2geom/path.cpp
index 88c7a99b9..05a69d616 100644
--- a/src/2geom/path.cpp
+++ b/src/2geom/path.cpp
@@ -89,8 +89,17 @@ Path &Path::operator*=(Matrix const &m) {
}
prev = (*it)->finalPoint();
}
- for ( int i = 0 ; i < 2 ; ++i ) {
- final_->setPoint(i, (*final_)[i] * m);
+ if (closed_) {
+ Geom::Point pt = front().initialPoint();
+ if (size_open() > 0) {
+ Curve *l = const_cast<Curve*>((get_curves().end() - 2)->get());
+ l->setFinal(pt);
+ }
+ final_->setInitial(pt);
+ final_->setFinal(pt);
+ } else {
+ final_->setInitial(back().finalPoint());
+ final_->setFinal(front().initialPoint());
}
if (get_curves().size() > 1) {
if ( front().initialPoint() != initialPoint() || back().finalPoint() != finalPoint() ) {
diff --git a/src/gradient-drag.cpp b/src/gradient-drag.cpp
index 5facfefd0..5be435a64 100644
--- a/src/gradient-drag.cpp
+++ b/src/gradient-drag.cpp
@@ -1154,7 +1154,10 @@ Moves this dragger to the point of the given draggable, acting upon all other dr
void
GrDragger::moveThisToDraggable (SPItem *item, gint point_type, gint point_i, bool fill_or_stroke, bool write_repr)
{
- this->point = sp_item_gradient_get_coords (item, point_type, point_i, fill_or_stroke);
+ GrDraggable *dr_first = (GrDraggable *) this->draggables->data;
+ if (!dr_first) return;
+
+ this->point = sp_item_gradient_get_coords (dr_first->item, dr_first->point_type, dr_first->point_i, dr_first->fill_or_stroke);
this->point_original = this->point;
sp_knot_moveto (this->knot, this->point);