Code

now that selection description includes style (filtered, clipped), we need to update...
[inkscape.git] / src / sp-spiral.cpp
index 7b741a940cb80d9230ce3e6789ad54361895754b..624c5ae181ad7513a2200cac5e1c79373270043a 100644 (file)
@@ -19,7 +19,7 @@
 
 #include "svg/svg.h"
 #include "attributes.h"
-#include "display/bezier-utils.h"
+#include <2geom/bezier-utils.h>
 #include "display/curve.h"
 #include <glibmm/i18n.h>
 #include "xml/repr.h"
@@ -36,7 +36,7 @@ static void sp_spiral_set (SPObject *object, unsigned int key, const gchar *valu
 static void sp_spiral_update (SPObject *object, SPCtx *ctx, guint flags);
 
 static gchar * sp_spiral_description (SPItem * item);
-static void sp_spiral_snappoints(SPItem const *item, SnapPointsIter p);
+static void sp_spiral_snappoints(SPItem const *item, SnapPointsIter p, Inkscape::SnapPreferences const *snapprefs);
 
 static void sp_spiral_set_shape (SPShape *shape);
 static void sp_spiral_update_patheffect (SPLPEItem *lpeitem, bool write);
@@ -388,7 +388,7 @@ sp_spiral_fit_and_draw (SPSpiral const *spiral,
        /** \todo
          * We should use better algorithm to specify maximum error.
          */
-       depth = sp_bezier_fit_cubic_full (bezier, NULL, darray, SAMPLE_SIZE,
+       depth = Geom::bezier_fit_cubic_full (bezier, NULL, darray, SAMPLE_SIZE,
                                          hat1, hat2,
                                          SPIRAL_TOLERANCE*SPIRAL_TOLERANCE,
                                          FITTING_MAX_BEZIERS);
@@ -426,7 +426,7 @@ sp_spiral_set_shape (SPShape *shape)
        SP_OBJECT (spiral)->requestModified(SP_OBJECT_MODIFIED_FLAG);
 
        SPCurve *c = new SPCurve ();
-       
+
 #ifdef SPIRAL_VERBOSE
        g_print ("cx=%g, cy=%g, exp=%g, revo=%g, rad=%g, arg=%g, t0=%g\n",
                 spiral->cx,
@@ -455,8 +455,17 @@ sp_spiral_set_shape (SPShape *shape)
                sp_spiral_fit_and_draw (spiral, c, (1.0 - t)/(SAMPLE_SIZE - 1.0),
                                        darray, hat1, hat2, &t);
 
-    sp_lpe_item_perform_path_effect(SP_LPE_ITEM (spiral), c);
-    sp_shape_set_curve_insync ((SPShape *) spiral, c, TRUE);
+    /* Reset the shape'scurve to the "original_curve"
+     * This is very important for LPEs to work properly! (the bbox might be recalculated depending on the curve in shape)*/
+    sp_shape_set_curve_insync (shape, c, TRUE);
+    if (sp_lpe_item_has_path_effect(SP_LPE_ITEM(shape)) && sp_lpe_item_path_effects_enabled(SP_LPE_ITEM(shape))) {
+        SPCurve *c_lpe = c->copy();
+        bool success = sp_lpe_item_perform_path_effect(SP_LPE_ITEM (shape), c_lpe);
+        if (success) {
+            sp_shape_set_curve_insync (shape, c_lpe, TRUE);
+        }
+        c_lpe->unref();
+    }
     c->unref();
 }
 
@@ -487,17 +496,35 @@ sp_spiral_position_set       (SPSpiral          *spiral,
        spiral->rad        = MAX (rad, 0.001);
        spiral->arg        = arg;
        spiral->t0         = CLAMP(t0, 0.0, 0.999);
-       
+
        ((SPObject *)spiral)->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG);
 }
 
 /**
  * Virtual snappoints callback.
  */
-static void sp_spiral_snappoints(SPItem const *item, SnapPointsIter p)
+static void sp_spiral_snappoints(SPItem const *item, SnapPointsIter p, Inkscape::SnapPreferences const *snapprefs)
 {
+       // We will determine the spiral's midpoint ourselves, instead of trusting on the base class
+       // Therefore setSnapObjectMidpoints() is set to false temporarily
+       Inkscape::SnapPreferences local_snapprefs = *snapprefs;
+       local_snapprefs.setSnapObjectMidpoints(false);
+
        if (((SPItemClass *) parent_class)->snappoints) {
-               ((SPItemClass *) parent_class)->snappoints (item, p);
+               ((SPItemClass *) parent_class)->snappoints (item, p, &local_snapprefs);
+       }
+
+       // Help enforcing strict snapping, i.e. only return nodes when we're snapping nodes to nodes or a guide to nodes
+       if (!(snapprefs->getSnapModeNode() || snapprefs->getSnapModeGuide())) {
+               return;
+       }
+
+       if (snapprefs->getSnapObjectMidpoints()) {
+               Geom::Matrix const i2d (sp_item_i2d_affine (item));
+               SPSpiral *spiral = SP_SPIRAL(item);
+               *p = Geom::Point(spiral->cx, spiral->cy) * i2d;
+               // This point is the start-point of the spiral, which is also returned when _snap_to_itemnode has been set
+               // in the object snapper. In that case we will get a duplicate!
        }
 }