summaryrefslogtreecommitdiffstats
path: root/src/pen-context.cpp
diff options
context:
space:
mode:
authorjtx <javier.arraiza@marker.es>2013-02-14 17:44:03 +0000
committerjtx <javier.arraiza@marker.es>2013-02-14 17:44:03 +0000
commite18ec9f6b20ec15306e07adfad1587a6ae9b7f59 (patch)
tree66c5c58dc4c43c712745cd50cfeb986539ca321c /src/pen-context.cpp
parentFirst Steps, BSpline Live Path Ok, working Pen Context (diff)
parentAll done except cusp continuous and close bspline (diff)
downloadinkscape-e18ec9f6b20ec15306e07adfad1587a6ae9b7f59.tar.gz
inkscape-e18ec9f6b20ec15306e07adfad1587a6ae9b7f59.zip
Fix cusp continuous? path close broken
(bzr r11950.3.1)
Diffstat (limited to 'src/pen-context.cpp')
-rw-r--r--src/pen-context.cpp120
1 files changed, 90 insertions, 30 deletions
diff --git a/src/pen-context.cpp b/src/pen-context.cpp
index 3c8e46a54..9577ecbf9 100644
--- a/src/pen-context.cpp
+++ b/src/pen-context.cpp
@@ -583,7 +583,7 @@ static gint pen_handle_button_press(SPPenContext *const pc, GdkEventButton const
//BSpline
//Esto evita arrastrar los manejadores ya que el punto se crea
//al soltar el botón del ratón.
- if((pc->spiro || pc->bspline) && pc->state != SP_PEN_CONTEXT_CLOSE ) pc->state = SP_PEN_CONTEXT_POINT;
+ if((pc->spiro || pc->bspline) && pc->state != SP_PEN_CONTEXT_CLOSE) pc->state = SP_PEN_CONTEXT_POINT;
//BSpline End
ret = TRUE;
break;
@@ -984,8 +984,20 @@ static void pen_redraw_all (SPPenContext *const pc)
// handles
//BSpline
- if (pc->p[0] != pc->p[1] && !pc->spiro && !pc->bspline) {
+ SPCurve * WPower = new SPCurve();
+ Geom::D2< Geom::SBasis > SBasisWPower;
+ float WP = 0;
+ if (pc->p[0] != pc->p[1] && !pc->spiro /*&& !pc->bspline*/) {
//BSpline End
+ if(pc->bspline){
+ WPower->moveto(pc->red_curve->first_segment()->initialPoint());
+ WPower->lineto(pc->red_curve->first_segment()->finalPoint());
+ SBasisWPower = WPower->first_segment()->toSBasis();
+
+ WPower->reset();
+ pc->p[1] = SBasisWPower.valueAt(WP);
+ }
+
SP_CTRL(pc->c1)->moveto(pc->p[1]);
pc->cl1->setCoords(pc->p[0], pc->p[1]);
sp_canvas_item_show(pc->c1);
@@ -994,16 +1006,23 @@ static void pen_redraw_all (SPPenContext *const pc)
sp_canvas_item_hide(pc->c1);
sp_canvas_item_hide(pc->cl1);
}
-
+ Geom::Point p2;
Geom::Curve const * last_seg = pc->green_curve->last_segment();
if (last_seg) {
Geom::CubicBezier const * cubic = dynamic_cast<Geom::CubicBezier const *>( last_seg );
//BSpline
if ( cubic &&
- (*cubic)[2] != pc->p[0]&& !pc->spiro && !pc->bspline )
+ (*cubic)[2] != pc->p[0]&& !pc->spiro /*&& !pc->bspline*/ )
{
//BSpline End
- Geom::Point p2 = (*cubic)[2];
+ if(pc->bspline){
+ WPower->moveto(last_seg->finalPoint());
+ WPower->lineto(last_seg->initialPoint());
+ SBasisWPower = WPower->first_segment()->toSBasis();
+ p2 = SBasisWPower.valueAt(WP);
+ }else{
+ p2 = (*cubic)[2];
+ }
SP_CTRL(pc->c0)->moveto(p2);
pc->cl0->setCoords(p2, pc->p[0]);
sp_canvas_item_show(pc->c0);
@@ -1766,16 +1785,10 @@ static void spiro_doEffect(SPCurve * curve)
//Unimos todas las curvas en juego y llamamos a la función doEffect.
static void bspline(SPPenContext *const pc, bool Shift)
{
+ using Geom::X;
+ using Geom::Y;
+ Geom::CubicBezier const *cubic;
if(!Shift){
-
- using Geom::X;
- using Geom::Y;
- Geom::CubicBezier const *cubic;
- //Continuamos la curva en modo CUSP
- //Guardamos el valor de inicio en cusp para que no se redibuje como SYMM
- if(pc->anchor_statusbar && pc->red_curve->is_empty()){
- saShift = true;
- }
//NODO CUSP formado por nodo SMOOTH
//solo mobemos el manejador del nodo final de cada segmento
//Es suficiente para mostrar el nodo como CUSP
@@ -1784,34 +1797,81 @@ static void bspline(SPPenContext *const pc, bool Shift)
pc->npoints = 5;
pc->p[0] = pc->red_curve->first_segment()->initialPoint();
pc->p[3] = pc->red_curve->first_segment()->finalPoint();
- if(pc->green_curve->is_empty())
- pc->p[1] = pc->p[0] + (1./3)*(pc->p[0] - pc->p[3]);
- else
+ if(pc->green_curve->is_empty()){
+ pc->p[1] = pc->p[0] + (1./3)*(pc->p[3] - pc->p[0]);
+ pc->p[1] = Geom::Point(pc->p[1][X]+1,pc->p[1][Y]+1);
+ }else{
cubic = dynamic_cast<Geom::CubicBezier const*>(&*pc->green_curve->last_segment());
- if(cubic && ((*cubic)[2] == (*cubic)[3]))
+ if(!cubic || ((*cubic)[2] == (*cubic)[3]))
pc->p[1] = pc->p[0];
- else
- pc->p[1] = pc->p[0] + (1./3)*(pc->p[0] - pc->p[3]);
+ else{
+ SPCurve * WPower = new SPCurve();
+ Geom::D2< Geom::SBasis > SBasisWPower;
+ WPower->moveto(pc->green_curve->last_segment()->finalPoint());
+ WPower->lineto(pc->green_curve->last_segment()->initialPoint());
+ float WP = Geom::nearest_point((*cubic)[2],*WPower->first_segment());
+ WPower->reset();
+ WPower->moveto(pc->red_curve->last_segment()->initialPoint());
+ WPower->lineto(pc->red_curve->last_segment()->finalPoint());
+ SBasisWPower = WPower->first_segment()->toSBasis();
+ WPower->reset();
+ pc->p[1] = SBasisWPower.valueAt(WP);
+ pc->p[1] = Geom::Point(pc->p[1][X]+1,pc->p[1][Y]+1);
+ }
+ }
pc->p[2] = pc->p[3] + (1./3)*(pc->p[0] - pc->p[3]);
+ pc->p[2] = Geom::Point(pc->p[2][X]+1,pc->p[2][Y]+1);
}
+ if(pc->green_curve->is_empty() && saShift)
+ pc->p[1] = pc->p[0];
+ if(pc->anchor_statusbar && pc->red_curve->is_empty())
+ saShift = false;
}else{
+ //Continuamos la curva en modo CUSP
+ //Guardamos el valor de inicio en cusp para que no se redibuje como SYMM
if(pc->anchor_statusbar && pc->red_curve->is_empty()){
- saShift = false;
+ saShift = true;
+ SPCurve *previousCurve = new SPCurve();
+ if(pc->sa && !pc->sa->curve->is_empty()){
+ previousCurve = pc->sa->curve->copy();
+ if (pc->sa->start) {
+ previousCurve = previousCurve->create_reverse();
+ }
+ cubic = dynamic_cast<Geom::CubicBezier const*>(&*previousCurve->last_segment());
+ if(cubic){
+ SPCurve *lastSeg = new SPCurve();
+ lastSeg->moveto((*cubic)[0]);
+ lastSeg->curveto((*cubic)[1],(*cubic)[3],(*cubic)[3]);
+ previousCurve->backspace();
+ previousCurve->append_continuous(lastSeg, 0.0625);
+ pc->sa = previousCurve;
+ }
+ }
}
+
if(!pc->green_curve->is_empty()){
//Damos valor original a la variable por si se necesita de nuevo
saShift = false;
}
- if (pc->npoints == 5 || !pc->red_curve->is_empty()){
- pc->npoints = 2;
- pc->p[1]= pc->p[3];
- }
- if(pc->green_curve->is_empty() && saShift){
+ if (!pc->red_curve->is_empty()){
pc->npoints = 5;
- pc->p[3] = pc->p[1];
- pc->p[2] = pc->p[3];
- pc->p[1] = pc->p[0] + (1./3)*(pc->p[0] - pc->p[3]);
+ pc->p[0] = pc->red_curve->first_segment()->initialPoint();
+ pc->p[3] = pc->red_curve->first_segment()->finalPoint();
+ if(pc->green_curve->is_empty()){
+ pc->p[1] = pc->p[0];
+ }else{
+ cubic = dynamic_cast<Geom::CubicBezier const*>(&*pc->green_curve->last_segment());
+ if(!cubic || ((*cubic)[2] == (*cubic)[3])){
+ pc->p[1] = pc->p[0];
+ pc->p[2] = pc->p[3];
+ }else{
+ pc->p[1] = pc->p[0] + (1./3)*(pc->p[3] - pc->p[0]);
+ pc->p[1] = Geom::Point(pc->p[1][X]+1,pc->p[1][Y]+1);
+ pc->p[2] = pc->p[3];
+ }
+
+ }
}
}
bspline_build(pc);
@@ -1944,7 +2004,7 @@ static void bspline_doEffect(SPCurve * curve)
cubicIn = dynamic_cast<Geom::CubicBezier const*>(&*curve_it1);
cubicOut = dynamic_cast<Geom::CubicBezier const*>(&*curve_it2);
cubicEnd = dynamic_cast<Geom::CubicBezier const*>(&*curve_end);
- if (path_it->closed() && cubicIn && cubicEnd && (*cubicIn)[1] != (*cubicEnd)[2]){
+ if (path_it->closed()){
//Calculamos el nodo de inicio BSpline
SBasisIn = in->first_segment()->toSBasis();
SBasisEnd = end->first_segment()->toSBasis();