summaryrefslogtreecommitdiffstats
path: root/src/ui
diff options
context:
space:
mode:
authorjtx <javier.arraiza@marker.es>2013-03-01 11:09:45 +0000
committerjtx <javier.arraiza@marker.es>2013-03-01 11:09:45 +0000
commitbea047adffe8c71c5d2eddef0b570470741da74a (patch)
tree8080fb9016c6aaf932d6dc1f48c5dc663dd4d8d4 /src/ui
parentRefactor problem cusp nodes (diff)
parentBSpline refactor (diff)
downloadinkscape-bea047adffe8c71c5d2eddef0b570470741da74a.tar.gz
inkscape-bea047adffe8c71c5d2eddef0b570470741da74a.zip
Update from branch
(bzr r11950.3.3)
Diffstat (limited to 'src/ui')
-rw-r--r--src/ui/tool/curve-drag-point.cpp20
-rw-r--r--src/ui/tool/node.cpp45
-rw-r--r--src/ui/tool/path-manipulator.cpp65
3 files changed, 59 insertions, 71 deletions
diff --git a/src/ui/tool/curve-drag-point.cpp b/src/ui/tool/curve-drag-point.cpp
index b83ce1b3c..40dcb5058 100644
--- a/src/ui/tool/curve-drag-point.cpp
+++ b/src/ui/tool/curve-drag-point.cpp
@@ -53,9 +53,12 @@ bool CurveDragPoint::grabbed(GdkEventMotion */*event*/)
// delta is a vector equal 1/3 of distance from first to second
Geom::Point delta = (second->position() - first->position()) / 3.0;
- first->front()->move(first->front()->position() + delta);
- second->back()->move(second->back()->position() - delta);
-
+ //BSpline
+ if(!_pm.isBSpline()){
+ first->front()->move(first->front()->position() + delta);
+ second->back()->move(second->back()->position() - delta);
+ }
+ //BSpline End
_pm.update();
} else {
_segment_was_degenerate = false;
@@ -87,10 +90,13 @@ void CurveDragPoint::dragged(Geom::Point &new_pos, GdkEventMotion *event)
Geom::Point delta = new_pos - position();
Geom::Point offset0 = ((1-weight)/(3*t*(1-t)*(1-t))) * delta;
Geom::Point offset1 = (weight/(3*t*t*(1-t))) * delta;
-
- first->front()->move(first->front()->position() + offset0);
- second->back()->move(second->back()->position() + offset1);
-
+ //BSpline
+ if(!_pm.isBSpline()){
+ first->front()->move(first->front()->position() + offset0);
+ second->back()->move(second->back()->position() + offset1);
+ }else if(weight>=0.8)second->back()->move(new_pos);
+ else if(weight<=0.2)first->front()->move(new_pos);
+ //BSpline End
_pm.update();
}
diff --git a/src/ui/tool/node.cpp b/src/ui/tool/node.cpp
index 447133b7c..4cac0e543 100644
--- a/src/ui/tool/node.cpp
+++ b/src/ui/tool/node.cpp
@@ -138,11 +138,14 @@ void Handle::move(Geom::Point const &new_pos)
//BSpline
bool isBSpline = false;
double pos = 0;
- Handle *h = this;
+ Handle *h = NULL;
+ Handle *h2 = NULL;
if(_pm().isBSpline()){
isBSpline = true;
- //BSpline End
+ if(!_parent->selected())
+ _parent->_selection.insert(_parent);
}
+ //BSpline End
if (Geom::are_near(new_pos, _parent->position())) {
// The handle becomes degenerate.
@@ -176,12 +179,11 @@ void Handle::move(Geom::Point const &new_pos)
setPosition(new_pos);
//BSpline
if(isBSpline){
+ h = this;
setPosition(_pm().BSplineHandleReposition(h));
pos = _pm().BSplineHandlePosition(h);
- other->setPosition(_pm().BSplineHandleReposition(other,pos));
- if(pos == 0){
- _parent->setPosition(h->position());
- }
+ h2 = this->other();
+ this->other()->setPosition(_pm().BSplineHandleReposition(h2,pos));
}
//BSpline End
return;
@@ -216,12 +218,11 @@ void Handle::move(Geom::Point const &new_pos)
setPosition(new_pos);
//BSpline
if(isBSpline){
+ h = this;
setPosition(_pm().BSplineHandleReposition(h));
pos = _pm().BSplineHandlePosition(h);
- other->setPosition(_pm().BSplineHandleReposition(other,pos));
- if(pos == 0){
- _parent->setPosition(h->position());
- }
+ h2 = this->other();
+ this->other()->setPosition(_pm().BSplineHandleReposition(h2,pos));
}
//BSpline End
}
@@ -577,17 +578,35 @@ void Node::move(Geom::Point const &new_pos)
Geom::Point old_pos = position();
Geom::Point delta = new_pos - position();
//BSpline
+ double prevPos = 0;
double pos = 0;
+ double nextPos = 0;
+ Node *n = this;
+ Node * nextNode = n->nodeToward(n->front());
+ Node * prevNode = n->nodeToward(n->back());
if(_pm().isBSpline()){
- Node *n = this;
+ if(prevNode)
+ prevPos = _pm().BSplineHandlePosition(prevNode->front());
pos = _pm().BSplineHandlePosition(n->front());
if(pos == 0)
pos = _pm().BSplineHandlePosition(n->back());
+ if(nextNode)
+ nextPos = _pm().BSplineHandlePosition(nextNode->back());
}
//BSpline End
setPosition(new_pos);
+ //BSpline
+ if(prevNode)
+ prevNode->front()->setPosition(_pm().BSplineHandleReposition(prevNode->front(),prevPos));
+ if(nextNode)
+ nextNode->back()->setPosition(_pm().BSplineHandleReposition(nextNode->back(),nextPos));
+ //BSpline End
_front.setPosition(_front.position() + delta);
_back.setPosition(_back.position() + delta);
+ //BSpline End
+ // if the node has a smooth handle after a line segment, it should be kept colinear
+ // with the segment
+ _fixNeighbors(old_pos, new_pos);
//BSpline
if(_pm().isBSpline()){
Handle* front = &_front;
@@ -595,10 +614,6 @@ void Node::move(Geom::Point const &new_pos)
_front.setPosition(_pm().BSplineHandleReposition(front,pos));
_back.setPosition(_pm().BSplineHandleReposition(back,pos));
}
- //BSpline End
- // if the node has a smooth handle after a line segment, it should be kept colinear
- // with the segment
- _fixNeighbors(old_pos, new_pos);
}
void Node::transform(Geom::Affine const &m)
diff --git a/src/ui/tool/path-manipulator.cpp b/src/ui/tool/path-manipulator.cpp
index 03e25dfa3..7c23ee153 100644
--- a/src/ui/tool/path-manipulator.cpp
+++ b/src/ui/tool/path-manipulator.cpp
@@ -1182,28 +1182,33 @@ bool PathManipulator::isBSpline(){
}
return false;
}
+
double PathManipulator::BSplineHandlePosition(Handle *h){
+ using Geom::X;
+ using Geom::Y;
double pos = 0;
Node *n = h->parent();
- Geom::D2< Geom::SBasis > SBasisInsideNodes;
SPCurve *lineInsideNodes = new SPCurve();
Node * nextNode = n->nodeToward(h);
- if(nextNode){
+ Geom::Point positionH = h->position();
+ positionH = Geom::Point(positionH[X] - 0.0625,positionH[Y] - 0.0625);
+ if(nextNode && n->position() != h->position()){
lineInsideNodes->moveto(n->position());
lineInsideNodes->lineto(nextNode->position());
- SBasisInsideNodes = lineInsideNodes->first_segment()->toSBasis();
- pos = Geom::nearest_point(h->position(),*lineInsideNodes->first_segment());
+ pos = Geom::nearest_point(positionH,*lineInsideNodes->first_segment());
}
return pos;
}
Geom::Point PathManipulator::BSplineHandleReposition(Handle *h){
- double pos = 0;
- pos = this->BSplineHandlePosition(h);
+ double pos = this->BSplineHandlePosition(h);
return BSplineHandleReposition(h,pos);
}
Geom::Point PathManipulator::BSplineHandleReposition(Handle *h,double pos){
+ using Geom::X;
+ using Geom::Y;
+ Geom::Point ret(0,0);
Node *n = h->parent();
Geom::D2< Geom::SBasis > SBasisInsideNodes;
SPCurve *lineInsideNodes = new SPCurve();
@@ -1212,10 +1217,12 @@ Geom::Point PathManipulator::BSplineHandleReposition(Handle *h,double pos){
lineInsideNodes->moveto(n->position());
lineInsideNodes->lineto(nextNode->position());
SBasisInsideNodes = lineInsideNodes->first_segment()->toSBasis();
+ ret = SBasisInsideNodes.valueAt(pos);
+ ret = Geom::Point(ret[X] + 0.0625,ret[Y] + 0.0625);
}else{
- return n->position();
+ ret = n->position();
}
- return SBasisInsideNodes.valueAt(pos);
+ return ret;
}
/** Construct the geometric representation of nodes and handles, update the outline
@@ -1232,55 +1239,15 @@ void PathManipulator::_createGeometryFromControlPoints(bool alert_LPE)
continue;
}
NodeList::iterator prev = subpath->begin();
- //BSpline
- double pos = 0;
- bool isBSpline = false;
- if(this->isBSpline())
- isBSpline = true;
- if(isBSpline){
- pos = BSplineHandlePosition(prev.ptr()->front());
- prev.ptr()->front()->setPosition(BSplineHandleReposition(prev.ptr()->front(),pos));
- if(pos == 0){
- prev.ptr()->setPosition(prev.ptr()->front()->position());
- }
- }
- //BSpline End
builder.moveTo(prev->position());
for (NodeList::iterator i = ++subpath->begin(); i != subpath->end(); ++i) {
- //BSpline
- if (isBSpline) {
- pos = BSplineHandlePosition(i.ptr()->front());
- if(pos == 0)
- pos = BSplineHandlePosition(i.ptr()->back());
- i.ptr()->front()->setPosition(BSplineHandleReposition(i.ptr()->front(),pos));
- i.ptr()->back()->setPosition(BSplineHandleReposition(i.ptr()->back(),pos));
- if(pos == 0){
- i.ptr()->setPosition(i.ptr()->front()->position());
- }
- }
-
- //BSpline End
build_segment(builder, prev.ptr(), i.ptr());
prev = i;
}
+
if (subpath->closed()) {
// Here we link the last and first node if the path is closed.
// If the last segment is Bezier, we add it.
- /*
- //BSpline
- if (isBSpline) {
- pos = BSplineHandlePosition(prev.ptr()->front());
- if(pos == 0)
- pos = BSplineHandlePosition(subpath->begin().ptr()->back());
- subpath->begin().ptr()->front()->setPosition(BSplineHandleReposition(subpath->begin().ptr()->front(),pos));
- prev.ptr()->back()->setPosition(BSplineHandleReposition(prev.ptr()->back(),pos));
- if(pos == 0){
- subpath->begin().ptr()->setPosition(subpath->begin().ptr()->front()->position());
- prev.ptr()->setPosition(prev.ptr()->back()->position());
- }
- }
- //BSpline End
- /*/
if (!prev->front()->isDegenerate() || !subpath->begin()->back()->isDegenerate()) {
build_segment(builder, prev.ptr(), subpath->begin().ptr());
}