Code

Make curvature work again by fixing a minor omission
[inkscape.git] / src / gradient-drag.cpp
index 9432d4b5a004d777c3d111a1271a1b950c639f49..c16ed2456548e33f7adcc5a72d874835ca79b1d1 100644 (file)
 #include "desktop-style.h"
 #include "document.h"
 #include "display/sp-ctrlline.h"
+#include "display/sp-canvas-util.h"
 #include "xml/repr.h"
 #include "svg/css-ostringstream.h"
 #include "svg/svg.h"
 #include "libnr/nr-point-fns.h"
-#include "prefs-utils.h"
+#include "preferences.h"
 #include "sp-item.h"
 #include "style.h"
 #include "knot.h"
@@ -282,7 +283,7 @@ guint32 GrDrag::getColor()
 }
 
 SPStop *
-GrDrag::addStopNearPoint (SPItem *item, NR::Point mouse_p, double tolerance)
+GrDrag::addStopNearPoint (SPItem *item, Geom::Point mouse_p, double tolerance)
 {
     gfloat offset; // type of SPStop.offset = gfloat
     SPGradient *gradient;
@@ -293,11 +294,11 @@ GrDrag::addStopNearPoint (SPItem *item, NR::Point mouse_p, double tolerance)
     do {
         gradient = sp_item_gradient (item, fill_or_stroke);
         if (SP_IS_LINEARGRADIENT(gradient)) {
-            NR::Point begin   = sp_item_gradient_get_coords(item, POINT_LG_BEGIN, 0, fill_or_stroke);
-            NR::Point end     = sp_item_gradient_get_coords(item, POINT_LG_END, 0, fill_or_stroke);
+            Geom::Point begin   = sp_item_gradient_get_coords(item, POINT_LG_BEGIN, 0, fill_or_stroke);
+            Geom::Point end     = sp_item_gradient_get_coords(item, POINT_LG_END, 0, fill_or_stroke);
 
-            NR::Point nearest = snap_vector_midpoint (mouse_p, begin, end, 0);
-            double dist_screen = NR::L2 (mouse_p - nearest);
+            Geom::Point nearest = snap_vector_midpoint (mouse_p, begin, end, 0);
+            double dist_screen = Geom::L2 (mouse_p - nearest);
             if ( dist_screen < tolerance ) {
                 // add the knot
                 offset = get_offset_between_points(nearest, begin, end);
@@ -305,10 +306,10 @@ GrDrag::addStopNearPoint (SPItem *item, NR::Point mouse_p, double tolerance)
                 break; // break out of the while loop: add only one knot
             }
         } else if (SP_IS_RADIALGRADIENT(gradient)) {
-            NR::Point begin = sp_item_gradient_get_coords(item, POINT_RG_CENTER, 0, fill_or_stroke);
-            NR::Point end   = sp_item_gradient_get_coords(item, POINT_RG_R1, 0, fill_or_stroke);
-            NR::Point nearest = snap_vector_midpoint (mouse_p, begin, end, 0);
-            double dist_screen = NR::L2 (mouse_p - nearest);
+            Geom::Point begin = sp_item_gradient_get_coords(item, POINT_RG_CENTER, 0, fill_or_stroke);
+            Geom::Point end   = sp_item_gradient_get_coords(item, POINT_RG_R1, 0, fill_or_stroke);
+            Geom::Point nearest = snap_vector_midpoint (mouse_p, begin, end, 0);
+            double dist_screen = Geom::L2 (mouse_p - nearest);
             if ( dist_screen < tolerance ) {
                 offset = get_offset_between_points(nearest, begin, end);
                 addknot = true;
@@ -318,7 +319,7 @@ GrDrag::addStopNearPoint (SPItem *item, NR::Point mouse_p, double tolerance)
 
             end    = sp_item_gradient_get_coords(item, POINT_RG_R2, 0, fill_or_stroke);
             nearest = snap_vector_midpoint (mouse_p, begin, end, 0);
-            dist_screen = NR::L2 (mouse_p - nearest);
+            dist_screen = Geom::L2 (mouse_p - nearest);
             if ( dist_screen < tolerance ) {
                 offset = get_offset_between_points(nearest, begin, end);
                 addknot = true;
@@ -357,13 +358,13 @@ GrDrag::addStopNearPoint (SPItem *item, NR::Point mouse_p, double tolerance)
 
 
 bool
-GrDrag::dropColor(SPItem */*item*/, gchar *c, NR::Point p)
+GrDrag::dropColor(SPItem */*item*/, gchar const *c, Geom::Point p)
 {
     // first, see if we can drop onto one of the existing draggers
     for (GList *i = draggers; i != NULL; i = i->next) { // for all draggables of dragger
         GrDragger *d = (GrDragger *) i->data;
 
-        if (NR::L2(p - d->point)*desktop->current_zoom() < 5) {
+        if (Geom::L2(p - d->point)*desktop->current_zoom() < 5) {
            SPCSSAttr *stop = sp_repr_css_attr_new ();
            sp_repr_css_set_property (stop, "stop-color", c);
            sp_repr_css_set_property (stop, "stop-opacity", "1");
@@ -383,8 +384,8 @@ GrDrag::dropColor(SPItem */*item*/, gchar *c, NR::Point p)
     if (lines) {
         for (GSList *l = lines; (l != NULL) && (!over_line); l = l->next) {
             line = (SPCtrlLine*) l->data;
-            NR::Point nearest = snap_vector_midpoint (p, line->s, line->e, 0);
-            double dist_screen = NR::L2 (p - nearest) * desktop->current_zoom();
+            Geom::Point nearest = snap_vector_midpoint (p, line->s, line->e, 0);
+            double dist_screen = Geom::L2 (p - nearest) * desktop->current_zoom();
             if (line->item && dist_screen < 5) {
                 SPStop *stop = addStopNearPoint (line->item, p, 5/desktop->current_zoom());
                 if (stop) {
@@ -516,16 +517,33 @@ GrDraggable::getServer ()
     return server;
 }
 
+static
+boost::optional<Geom::Point>
+get_snap_vector (Geom::Point p, Geom::Point o, double snap, double initial)
+{
+    double r = L2 (p - o);
+    if (r < 1e-3) {
+        return boost::optional<Geom::Point>();
+    }
+
+    double angle = atan2 (p - o);
+    // snap angle to snaps increments, starting from initial:
+    double a_snapped = initial + floor((angle - initial)/snap + 0.5) * snap;
+    // calculate the new position and subtract p to get the vector:
+    return (o + r * Geom::Point(cos(a_snapped), sin(a_snapped)) - p);
+}
+
 static void
-gr_knot_moved_handler(SPKnot *knot, NR::Point const *ppointer, guint state, gpointer data)
+gr_knot_moved_handler(SPKnot *knot, Geom::Point const &ppointer, guint state, gpointer data)
 {
     GrDragger *dragger = (GrDragger *) data;
     GrDrag *drag = dragger->parent;
 
-    NR::Point p = *ppointer;
+    Geom::Point p = ppointer;
 
-    // FIXME: take from prefs
-    double snap_dist = SNAP_DIST / dragger->parent->desktop->current_zoom();
+    SPDesktop *desktop = dragger->parent->desktop;
+       SnapManager &m = desktop->namedview->snap_manager;
+       double snap_dist = m.snapprefs.getObjectTolerance() / dragger->parent->desktop->current_zoom();
 
     if (state & GDK_SHIFT_MASK) {
         // with Shift; unsnap if we carry more than one draggable
@@ -548,7 +566,7 @@ gr_knot_moved_handler(SPKnot *knot, NR::Point const *ppointer, guint state, gpoi
         // without Shift or Ctrl; see if we need to snap to another dragger
         for (GList *di = dragger->parent->draggers; di != NULL; di = di->next) {
             GrDragger *d_new = (GrDragger *) di->data;
-            if (dragger->mayMerge(d_new) && NR::L2 (d_new->point - p) < snap_dist) {
+            if (dragger->mayMerge(d_new) && Geom::L2 (d_new->point - p) < snap_dist) {
 
                 // Merge draggers:
                 for (GSList const* i = dragger->draggables; i != NULL; i = i->next) { // for all draggables of dragger
@@ -578,43 +596,42 @@ gr_knot_moved_handler(SPKnot *knot, NR::Point const *ppointer, guint state, gpoi
 
     if (!((state & GDK_SHIFT_MASK) || ((state & GDK_CONTROL_MASK) && (state & GDK_MOD1_MASK)))) {
         // Try snapping to the grid or guides
-        SPDesktop *desktop = dragger->parent->desktop;
-        SnapManager &m = desktop->namedview->snap_manager;
         m.setup(desktop);
-        Inkscape::SnappedPoint s = m.freeSnap(Inkscape::Snapper::SNAPPOINT_NODE, to_2geom(p));
+        Inkscape::SnappedPoint s = m.freeSnap(Inkscape::SnapPreferences::SNAPPOINT_NODE, to_2geom(p), Inkscape::SNAPSOURCE_HANDLE);
         if (s.getSnapped()) {
             p = s.getPoint();
             sp_knot_moveto (knot, p);
-        } else {
+        } else if (m.snapprefs.getSnapEnabledGlobally() && m.snapprefs.getSnapModeNode() && !(m.snapprefs.getSnapPostponedGlobally())) {
             bool was_snapped = false;
             double dist = NR_HUGE;
             // No snapping so far, let's see if we need to snap to any of the levels
             for (guint i = 0; i < dragger->parent->hor_levels.size(); i++) {
-                dist = fabs(p[NR::Y] - dragger->parent->hor_levels[i]);
+                dist = fabs(p[Geom::Y] - dragger->parent->hor_levels[i]);
                 if (dist < snap_dist) {
-                    p[NR::Y] = dragger->parent->hor_levels[i];
-                    s = Inkscape::SnappedPoint(p, Inkscape::SNAPTARGET_GRADIENT, dist, snap_dist, false, false);
+                    p[Geom::Y] = dragger->parent->hor_levels[i];
+                    s = Inkscape::SnappedPoint(p, Inkscape::SNAPSOURCE_HANDLE, Inkscape::SNAPTARGET_GRADIENTS_PARENT_BBOX, dist, snap_dist, false, false);
                     was_snapped = true;
                     sp_knot_moveto (knot, p);
                 }
             }
             for (guint i = 0; i < dragger->parent->vert_levels.size(); i++) {
-                dist = fabs(p[NR::X] - dragger->parent->vert_levels[i]);
+                dist = fabs(p[Geom::X] - dragger->parent->vert_levels[i]);
                 if (dist < snap_dist) {
-                    p[NR::X] = dragger->parent->vert_levels[i];
-                    s = Inkscape::SnappedPoint(p, Inkscape::SNAPTARGET_GRADIENT, dist, snap_dist, false, false);
+                    p[Geom::X] = dragger->parent->vert_levels[i];
+                    s = Inkscape::SnappedPoint(p, Inkscape::SNAPSOURCE_HANDLE, Inkscape::SNAPTARGET_GRADIENTS_PARENT_BBOX, dist, snap_dist, false, false);
                     was_snapped = true;
                     sp_knot_moveto (knot, p);
                 }
             }
             if (was_snapped) {
-                desktop->snapindicator->set_new_snappoint(s);
+                desktop->snapindicator->set_new_snaptarget(s);
             }
         }
     }
 
     if (state & GDK_CONTROL_MASK) {
-        unsigned snaps = abs(prefs_get_int_attribute("options.rotationsnapsperpi", "value", 12));
+        Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+        unsigned snaps = abs(prefs->getInt("/options/rotationsnapsperpi/value", 12));
         /* 0 means no snapping. */
 
         // This list will store snap vectors from all draggables of dragger
@@ -623,7 +640,7 @@ gr_knot_moved_handler(SPKnot *knot, NR::Point const *ppointer, guint state, gpoi
         for (GSList const* i = dragger->draggables; i != NULL; i = i->next) {
             GrDraggable *draggable = (GrDraggable *) i->data;
 
-            NR::Point *dr_snap = NULL;
+            Geom::Point dr_snap(Geom::infinity(), Geom::infinity());
 
             if (draggable->point_type == POINT_LG_BEGIN || draggable->point_type == POINT_LG_END) {
                 for (GList *di = dragger->parent->draggers; di != NULL; di = di->next) {
@@ -636,11 +653,11 @@ gr_knot_moved_handler(SPKnot *knot, NR::Point const *ppointer, guint state, gpoi
                         // found the other end of the linear gradient;
                         if (state & GDK_SHIFT_MASK) {
                             // moving linear around center
-                            NR::Point center = NR::Point (0.5*(d_new->point + dragger->point));
-                            dr_snap = &center;
+                            Geom::Point center = Geom::Point (0.5*(d_new->point + dragger->point));
+                            dr_snap = center;
                         } else {
                             // moving linear around the other end
-                            dr_snap = &d_new->point;
+                            dr_snap = d_new->point;
                         }
                     }
                 }
@@ -653,37 +670,37 @@ gr_knot_moved_handler(SPKnot *knot, NR::Point const *ppointer, guint state, gpoi
                                     POINT_RG_CENTER,
                                     draggable->fill_or_stroke)) {
                         // found the center of the radial gradient;
-                        dr_snap = &(d_new->point);
+                        dr_snap = d_new->point;
                     }
                 }
             } else if (draggable->point_type == POINT_RG_CENTER) {
                 // radial center snaps to hor/vert relative to its original position
-                dr_snap = &(dragger->point_original);
+                dr_snap = dragger->point_original;
             }
 
-            NR::Point *snap_vector = NULL;
-            if (dr_snap) {
+            boost::optional<Geom::Point> snap_vector;
+            if (dr_snap.isFinite()) {
                 if (state & GDK_MOD1_MASK) {
                     // with Alt, snap to the original angle and its perpendiculars
-                    snap_vector = get_snap_vector (p, *dr_snap, M_PI/2, NR::atan2 (dragger->point_original - *dr_snap));
+                    snap_vector = get_snap_vector (p, dr_snap, M_PI/2, Geom::atan2 (dragger->point_original - dr_snap));
                 } else {
                     // with Ctrl, snap to M_PI/snaps
-                    snap_vector = get_snap_vector (p, *dr_snap, M_PI/snaps, 0);
+                    snap_vector = get_snap_vector (p, dr_snap, M_PI/snaps, 0);
                 }
             }
             if (snap_vector) {
-                snap_vectors = g_slist_prepend (snap_vectors, snap_vector);
+                snap_vectors = g_slist_prepend (snap_vectors, &(*snap_vector));
             }
         }
 
         // Move by the smallest of snap vectors:
-        NR::Point move(9999, 9999);
+        Geom::Point move(9999, 9999);
         for (GSList const *i = snap_vectors; i != NULL; i = i->next) {
-            NR::Point *snap_vector = (NR::Point *) i->data;
-            if (NR::L2(*snap_vector) < NR::L2(move))
+            Geom::Point *snap_vector = (Geom::Point *) i->data;
+            if (Geom::L2(*snap_vector) < Geom::L2(move))
                 move = *snap_vector;
         }
-        if (move[NR::X] < 9999) {
+        if (move[Geom::X] < 9999) {
             p += move;
             sp_knot_moveto (knot, p);
         }
@@ -695,8 +712,8 @@ gr_knot_moved_handler(SPKnot *knot, NR::Point const *ppointer, guint state, gpoi
     bool scale_radial = (state & GDK_CONTROL_MASK) && (state & GDK_SHIFT_MASK);
 
     if (drag->keep_selection) {
-        NR::Point diff = p - dragger->point;
-        drag->selected_move_nowrite (diff[NR::X], diff[NR::Y], scale_radial);
+        Geom::Point diff = p - dragger->point;
+        drag->selected_move_nowrite (diff[Geom::X], diff[Geom::Y], scale_radial);
     } else {
         dragger->point = p;
         dragger->fireDraggables (false, scale_radial);
@@ -707,7 +724,7 @@ gr_knot_moved_handler(SPKnot *knot, NR::Point const *ppointer, guint state, gpoi
 
 
 static void
-gr_midpoint_limits(GrDragger *dragger, SPObject *server, NR::Point *begin, NR::Point *end, NR::Point *low_lim, NR::Point *high_lim, GSList **moving)
+gr_midpoint_limits(GrDragger *dragger, SPObject *server, Geom::Point *begin, Geom::Point *end, Geom::Point *low_lim, Geom::Point *high_lim, GSList **moving)
 {
 
     GrDrag *drag = dragger->parent;
@@ -795,7 +812,7 @@ gr_midpoint_limits(GrDragger *dragger, SPObject *server, NR::Point *begin, NR::P
 Called when a midpoint knot is dragged.
 */
 static void
-gr_knot_moved_midpoint_handler(SPKnot */*knot*/, NR::Point const *ppointer, guint state, gpointer data)
+gr_knot_moved_midpoint_handler(SPKnot */*knot*/, Geom::Point const &ppointer, guint state, gpointer data)
 {
     GrDragger *dragger = (GrDragger *) data;
     GrDrag *drag = dragger->parent;
@@ -805,9 +822,9 @@ gr_knot_moved_midpoint_handler(SPKnot */*knot*/, NR::Point const *ppointer, guin
     // FIXME: take from prefs
     double snap_fraction = 0.1;
 
-    NR::Point p = *ppointer;
-    NR::Point begin(0,0), end(0,0);
-    NR::Point low_lim(0,0), high_lim(0,0);
+    Geom::Point p = ppointer;
+    Geom::Point begin(0,0), end(0,0);
+    Geom::Point low_lim(0,0), high_lim(0,0);
 
     SPObject *server = draggable->getServer();
 
@@ -819,20 +836,20 @@ gr_knot_moved_midpoint_handler(SPKnot */*knot*/, NR::Point const *ppointer, guin
     } else {
         p = snap_vector_midpoint (p, low_lim, high_lim, 0);
     }
-    NR::Point displacement = p - dragger->point;
+    Geom::Point displacement = p - dragger->point;
 
     for (GSList const* i = moving; i != NULL; i = i->next) {
         GrDragger *drg = (GrDragger*) i->data;
         SPKnot *drgknot = drg->knot;
-        NR::Point this_move = displacement;
+        Geom::Point this_move = displacement;
         if (state & GDK_MOD1_MASK) {
             // FIXME: unify all these profiles (here, in nodepath, in tweak) in one place
             double alpha = 1.0;
-            if (NR::L2(drg->point - dragger->point) + NR::L2(drg->point - begin) - 1e-3 > NR::L2(dragger->point - begin)) { // drg is on the end side from dragger
-                double x = NR::L2(drg->point - dragger->point)/NR::L2(end - dragger->point);
+            if (Geom::L2(drg->point - dragger->point) + Geom::L2(drg->point - begin) - 1e-3 > Geom::L2(dragger->point - begin)) { // drg is on the end side from dragger
+                double x = Geom::L2(drg->point - dragger->point)/Geom::L2(end - dragger->point);
                 this_move = (0.5 * cos (M_PI * (pow(x, alpha))) + 0.5) * this_move;
             } else { // drg is on the begin side from dragger
-                double x = NR::L2(drg->point - dragger->point)/NR::L2(begin - dragger->point);
+                double x = Geom::L2(drg->point - dragger->point)/Geom::L2(begin - dragger->point);
                 this_move = (0.5 * cos (M_PI * (pow(x, alpha))) + 0.5) * this_move;
             }
         }
@@ -1269,20 +1286,19 @@ GrDragger::updateDependencies (bool write_repr)
 
 
 
-GrDragger::GrDragger (GrDrag *parent, NR::Point p, GrDraggable *draggable)
+GrDragger::GrDragger (GrDrag *parent, Geom::Point p, GrDraggable *draggable)
+  : point(p),
+    point_original(p)
 {
     this->draggables = NULL;
 
     this->parent = parent;
 
-    this->point = p;
-    this->point_original = p;
-
     // create the knot
     this->knot = sp_knot_new (parent->desktop, NULL);
     this->knot->setMode(SP_KNOT_MODE_XOR);
     this->knot->setFill(GR_KNOT_COLOR_NORMAL, GR_KNOT_COLOR_MOUSEOVER, GR_KNOT_COLOR_MOUSEOVER);
-    this->knot->setStroke(0x000000ff, 0x000000ff, 0x000000ff);
+    this->knot->setStroke(0x0000007f, 0x0000007f, 0x0000007f);
     sp_knot_update_ctrl(this->knot);
 
     // move knot to the given point
@@ -1430,12 +1446,12 @@ GrDrag::selectAll()
 \brief Select all stops/draggers that match the coords
 */
 void
-GrDrag::selectByCoords(std::vector<NR::Point> coords)
+GrDrag::selectByCoords(std::vector<Geom::Point> coords)
 {
     for (GList *l = this->draggers; l != NULL; l = l->next) {
         GrDragger *d = ((GrDragger *) l->data);
         for (guint k = 0; k < coords.size(); k++) {
-            if (NR::L2 (d->point - coords[k]) < 1e-4) {
+            if (Geom::L2 (d->point - coords[k]) < 1e-4) {
                 setSelected (d, true, true);
             }
         }
@@ -1522,10 +1538,11 @@ GrDrag::setDeselected (GrDragger *dragger)
 Create a line from p1 to p2 and add it to the lines list
  */
 void
-GrDrag::addLine (SPItem *item, NR::Point p1, NR::Point p2, guint32 rgba)
+GrDrag::addLine (SPItem *item, Geom::Point p1, Geom::Point p2, guint32 rgba)
 {
     SPCanvasItem *line = sp_canvas_item_new(sp_desktop_controls(this->desktop),
                                                             SP_TYPE_CTRLLINE, NULL);
+    sp_canvas_item_move_to_z(line, 0);
     SP_CTRLLINE(line)->item = item;
     sp_ctrlline_set_coords(SP_CTRLLINE(line), p1, p2);
     if (rgba != GR_LINE_COLOR_FILL) // fill is the default, so don't set color for it to speed up redraw
@@ -1541,11 +1558,11 @@ new dragger and add it to draggers list
 void
 GrDrag::addDragger (GrDraggable *draggable)
 {
-    NR::Point p = sp_item_gradient_get_coords (draggable->item, draggable->point_type, draggable->point_i, draggable->fill_or_stroke);
+    Geom::Point p = sp_item_gradient_get_coords (draggable->item, draggable->point_type, draggable->point_i, draggable->fill_or_stroke);
 
     for (GList *i = this->draggers; i != NULL; i = i->next) {
         GrDragger *dragger = (GrDragger *) i->data;
-        if (dragger->mayMerge (draggable) && NR::L2 (dragger->point - p) < MERGE_DIST) {
+        if (dragger->mayMerge (draggable) && Geom::L2 (dragger->point - p) < MERGE_DIST) {
             // distance is small, merge this draggable into dragger, no need to create new dragger
             dragger->addDraggable (draggable);
             dragger->updateKnotShape();
@@ -1691,7 +1708,7 @@ GrDrag::updateLines ()
             if (SP_IS_LINEARGRADIENT (server)) {
                 this->addLine (item, sp_item_gradient_get_coords (item, POINT_LG_BEGIN, 0, true), sp_item_gradient_get_coords (item, POINT_LG_END, 0, true), GR_LINE_COLOR_FILL);
             } else if (SP_IS_RADIALGRADIENT (server)) {
-                NR::Point center = sp_item_gradient_get_coords (item, POINT_RG_CENTER, 0, true);
+                Geom::Point center = sp_item_gradient_get_coords (item, POINT_RG_CENTER, 0, true);
                 this->addLine (item, center, sp_item_gradient_get_coords (item, POINT_RG_R1, 0, true), GR_LINE_COLOR_FILL);
                 this->addLine (item, center, sp_item_gradient_get_coords (item, POINT_RG_R2, 0, true), GR_LINE_COLOR_FILL);
             }
@@ -1702,7 +1719,7 @@ GrDrag::updateLines ()
             if (SP_IS_LINEARGRADIENT (server)) {
                 this->addLine (item, sp_item_gradient_get_coords (item, POINT_LG_BEGIN, 0, false), sp_item_gradient_get_coords (item, POINT_LG_END, 0, false), GR_LINE_COLOR_STROKE);
             } else if (SP_IS_RADIALGRADIENT (server)) {
-                NR::Point center = sp_item_gradient_get_coords (item, POINT_RG_CENTER, 0, false);
+                Geom::Point center = sp_item_gradient_get_coords (item, POINT_RG_CENTER, 0, false);
                 this->addLine (item, center, sp_item_gradient_get_coords (item, POINT_RG_R1, 0, false), GR_LINE_COLOR_STROKE);
                 this->addLine (item, center, sp_item_gradient_get_coords (item, POINT_RG_R2, 0, false), GR_LINE_COLOR_STROKE);
             }
@@ -1723,15 +1740,15 @@ GrDrag::updateLevels ()
 
     for (GSList const* i = this->selection->itemList(); i != NULL; i = i->next) {
         SPItem *item = SP_ITEM(i->data);
-        boost::optional<NR::Rect> rect = sp_item_bbox_desktop (item);
+        Geom::OptRect rect = sp_item_bbox_desktop (item);
         if (rect) {
             // Remember the edges of the bbox and the center axis
-            hor_levels.push_back(rect->min()[NR::Y]);
-            hor_levels.push_back(rect->max()[NR::Y]);
-            hor_levels.push_back(0.5 * (rect->min()[NR::Y] + rect->max()[NR::Y]));
-            vert_levels.push_back(rect->min()[NR::X]);
-            vert_levels.push_back(rect->max()[NR::X]);
-            vert_levels.push_back(0.5 * (rect->min()[NR::X] + rect->max()[NR::X]));
+            hor_levels.push_back(rect->min()[Geom::Y]);
+            hor_levels.push_back(rect->max()[Geom::Y]);
+            hor_levels.push_back(0.5 * (rect->min()[Geom::Y] + rect->max()[Geom::Y]));
+            vert_levels.push_back(rect->min()[Geom::X]);
+            vert_levels.push_back(rect->max()[Geom::X]);
+            vert_levels.push_back(0.5 * (rect->min()[Geom::X] + rect->max()[Geom::X]));
         }
     }
 }
@@ -1790,7 +1807,7 @@ GrDrag::selected_move (double x, double y, bool write_repr, bool scale_radial)
             }
 
             did = true;
-            d->point += NR::Point (x, y);
+            d->point += Geom::Point (x, y);
             d->point_original = d->point;
             sp_knot_moveto (d->knot, d->point);
 
@@ -1813,16 +1830,16 @@ GrDrag::selected_move (double x, double y, bool write_repr, bool scale_radial)
         // a midpoint dragger can (logically) only contain one GrDraggable
         GrDraggable *draggable = (GrDraggable *) dragger->draggables->data;
 
-        NR::Point begin(0,0), end(0,0);
-        NR::Point low_lim(0,0), high_lim(0,0);
+        Geom::Point begin(0,0), end(0,0);
+        Geom::Point low_lim(0,0), high_lim(0,0);
 
         SPObject *server = draggable->getServer();
         GSList *moving = NULL;
         gr_midpoint_limits(dragger, server, &begin, &end, &low_lim, &high_lim, &moving);
 
-        NR::Point p(x, y);
+        Geom::Point p(x, y);
         p = snap_vector_midpoint (dragger->point + p, low_lim, high_lim, 0);
-        NR::Point displacement = p - dragger->point;
+        Geom::Point displacement = p - dragger->point;
 
         for (GSList const* i = moving; i != NULL; i = i->next) {
             GrDragger *drg = (GrDragger*) i->data;
@@ -2000,13 +2017,13 @@ GrDrag::deleteSelected (bool just_one)
                         SP_OBJECT_REPR(stopinfo->vector)->removeChild(SP_OBJECT_REPR(stopinfo->spstop));
 
                         SPLinearGradient *lg = SP_LINEARGRADIENT(stopinfo->gradient);
-                        NR::Point oldbegin = NR::Point (lg->x1.computed, lg->y1.computed);
-                        NR::Point end = NR::Point (lg->x2.computed, lg->y2.computed);
+                        Geom::Point oldbegin = Geom::Point (lg->x1.computed, lg->y1.computed);
+                        Geom::Point end = Geom::Point (lg->x2.computed, lg->y2.computed);
                         SPStop *stop = sp_first_stop(stopinfo->vector);
                         gdouble offset = stop->offset;
-                        NR::Point newbegin = oldbegin + offset * (end - oldbegin);
-                        lg->x1.computed = newbegin[NR::X];
-                        lg->y1.computed = newbegin[NR::Y];
+                        Geom::Point newbegin = oldbegin + offset * (end - oldbegin);
+                        lg->x1.computed = newbegin[Geom::X];
+                        lg->y1.computed = newbegin[Geom::Y];
 
                         Inkscape::XML::Node *repr = SP_OBJECT_REPR(stopinfo->gradient);
                         sp_repr_set_svg_double(repr, "x1", lg->x1.computed);
@@ -2029,13 +2046,13 @@ GrDrag::deleteSelected (bool just_one)
                         SP_OBJECT_REPR(stopinfo->vector)->removeChild(SP_OBJECT_REPR(stopinfo->spstop));
 
                         SPLinearGradient *lg = SP_LINEARGRADIENT(stopinfo->gradient);
-                        NR::Point begin = NR::Point (lg->x1.computed, lg->y1.computed);
-                        NR::Point oldend = NR::Point (lg->x2.computed, lg->y2.computed);
+                        Geom::Point begin = Geom::Point (lg->x1.computed, lg->y1.computed);
+                        Geom::Point oldend = Geom::Point (lg->x2.computed, lg->y2.computed);
                         SPStop *laststop = sp_last_stop(stopinfo->vector);
                         gdouble offset = laststop->offset;
-                        NR::Point newend = begin + offset * (oldend - begin);
-                        lg->x2.computed = newend[NR::X];
-                        lg->y2.computed = newend[NR::Y];
+                        Geom::Point newend = begin + offset * (oldend - begin);
+                        lg->x2.computed = newend[Geom::X];
+                        lg->y2.computed = newend[Geom::Y];
 
                         Inkscape::XML::Node *repr = SP_OBJECT_REPR(stopinfo->gradient);
                         sp_repr_set_svg_double(repr, "x2", lg->x2.computed);