Code

fix parameter ranges, copyedit
[inkscape.git] / src / object-edit.cpp
index d335ced533aeec1082cd905bbe5d5b468ecd834a..4e8ce86c443ff34bda21632ece6070fddfebaa23 100644 (file)
@@ -25,9 +25,7 @@
 #include "sp-spiral.h"
 #include "sp-offset.h"
 #include "sp-flowtext.h"
-#include "prefs-utils.h"
-#include "inkscape.h"
-#include "snap.h"
+#include "preferences.h"
 #include "desktop-affine.h"
 #include "style.h"
 #include "desktop.h"
@@ -43,7 +41,6 @@
 #include "object-edit.h"
 
 #include <libnr/nr-scale-ops.h>
-#include <libnr/nr-matrix-div.h>
 
 #include "xml/repr.h"
 
@@ -56,11 +53,7 @@ static KnotHolder *sp_lpe_knot_holder(SPItem *item, SPDesktop *desktop)
     KnotHolder *knot_holder = new KnotHolder(desktop, item, NULL);
 
     Inkscape::LivePathEffect::Effect *effect = sp_lpe_item_get_current_lpe(SP_LPE_ITEM(item));
-    if (!effect) {
-        g_error("sp_lpe_knot_holder: logical error, this method cannot be called with item having an LPE");
-    } else {
-        effect->addHandles(knot_holder);
-    }
+    effect->addHandles(knot_holder, desktop, item);
 
     return knot_holder;
 }
@@ -91,6 +84,7 @@ sp_item_knot_holder(SPItem *item, SPDesktop *desktop)
         knotholder = new FlowtextKnotHolder(desktop, SP_FLOWTEXT(item)->get_frame(NULL), NULL);
     } else if ((SP_OBJECT(item)->style->fill.isPaintserver())
                && SP_IS_PATTERN(SP_STYLE_FILL_SERVER(SP_OBJECT(item)->style))) {
+        knotholder = new KnotHolder(desktop, item, NULL);
         knotholder->add_pattern_knotholder();
     }
 
@@ -102,54 +96,46 @@ sp_item_knot_holder(SPItem *item, SPDesktop *desktop)
 /* handle for horizontal rounding radius */
 class RectKnotHolderEntityRX : public KnotHolderEntity {
 public:
-    virtual NR::Point knot_get_func();
-    virtual void knot_set_func(NR::Point const &p, NR::Point const &origin, guint state);
-    virtual void knot_click_func(guint state);
+    virtual Geom::Point knot_get();
+    virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
+    virtual void knot_click(guint state);
 };
 
 /* handle for vertical rounding radius */
 class RectKnotHolderEntityRY : public KnotHolderEntity {
 public:
-    virtual NR::Point knot_get_func();
-    virtual void knot_set_func(NR::Point const &p, NR::Point const &origin, guint state);
-    virtual void knot_click_func(guint state);
+    virtual Geom::Point knot_get();
+    virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
+    virtual void knot_click(guint state);
 };
 
 /* handle for width/height adjustment */
 class RectKnotHolderEntityWH : public KnotHolderEntity {
 public:
-    virtual NR::Point knot_get_func();
-    virtual void knot_set_func(NR::Point const &p, NR::Point const &origin, guint state);
+    virtual Geom::Point knot_get();
+    virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
+
+protected:
+    void set_internal(Geom::Point const &p, Geom::Point const &origin, guint state);
 };
 
 /* handle for x/y adjustment */
 class RectKnotHolderEntityXY : public KnotHolderEntity {
 public:
-    virtual NR::Point knot_get_func();
-    virtual void knot_set_func(NR::Point const &p, NR::Point const &origin, guint state);
+    virtual Geom::Point knot_get();
+    virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
 };
 
-static NR::Point snap_knot_position(SPItem *item, NR::Point const &p)
-{
-    SPDesktop const *desktop = inkscape_active_desktop();
-    NR::Matrix const i2d (sp_item_i2d_affine (item));
-    NR::Point s = p * i2d;
-    SnapManager &m = desktop->namedview->snap_manager;
-    m.setup(desktop, item);
-    m.freeSnapReturnByRef(Inkscape::Snapper::SNAPPOINT_NODE, s);
-    return s * i2d.inverse();
-}
-
-NR::Point
-RectKnotHolderEntityRX::knot_get_func()
+Geom::Point
+RectKnotHolderEntityRX::knot_get()
 {
     SPRect *rect = SP_RECT(item);
 
-    return NR::Point(rect->x.computed + rect->width.computed - rect->rx.computed, rect->y.computed);
+    return Geom::Point(rect->x.computed + rect->width.computed - rect->rx.computed, rect->y.computed);
 }
 
 void
-RectKnotHolderEntityRX::knot_set_func(NR::Point const &p, NR::Point const &/*origin*/, guint state)
+RectKnotHolderEntityRX::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint state)
 {
     SPRect *rect = SP_RECT(item);
 
@@ -159,11 +145,11 @@ RectKnotHolderEntityRX::knot_set_func(NR::Point const &p, NR::Point const &/*ori
 
     if (state & GDK_CONTROL_MASK) {
         gdouble temp = MIN(rect->height.computed, rect->width.computed) / 2.0;
-        rect->rx.computed = rect->ry.computed = CLAMP(rect->x.computed + rect->width.computed - p[NR::X], 0.0, temp);
+        rect->rx.computed = rect->ry.computed = CLAMP(rect->x.computed + rect->width.computed - p[Geom::X], 0.0, temp);
         rect->rx._set = rect->ry._set = true;
 
     } else {
-        rect->rx.computed = CLAMP(rect->x.computed + rect->width.computed - p[NR::X], 0.0, rect->width.computed / 2.0);
+        rect->rx.computed = CLAMP(rect->x.computed + rect->width.computed - p[Geom::X], 0.0, rect->width.computed / 2.0);
         rect->rx._set = true;
     }
 
@@ -173,7 +159,7 @@ RectKnotHolderEntityRX::knot_set_func(NR::Point const &p, NR::Point const &/*ori
 }
 
 void
-RectKnotHolderEntityRX::knot_click_func(guint state)
+RectKnotHolderEntityRX::knot_click(guint state)
 {
     SPRect *rect = SP_RECT(item);
 
@@ -189,16 +175,16 @@ RectKnotHolderEntityRX::knot_click_func(guint state)
     update_knot();
 }
 
-NR::Point
-RectKnotHolderEntityRY::knot_get_func()
+Geom::Point
+RectKnotHolderEntityRY::knot_get()
 {
     SPRect *rect = SP_RECT(item);
 
-    return NR::Point(rect->x.computed + rect->width.computed, rect->y.computed + rect->ry.computed);
+    return Geom::Point(rect->x.computed + rect->width.computed, rect->y.computed + rect->ry.computed);
 }
 
 void
-RectKnotHolderEntityRY::knot_set_func(NR::Point const &p, NR::Point const &/*origin*/, guint state)
+RectKnotHolderEntityRY::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint state)
 {
     SPRect *rect = SP_RECT(item);
 
@@ -208,15 +194,15 @@ RectKnotHolderEntityRY::knot_set_func(NR::Point const &p, NR::Point const &/*ori
 
     if (state & GDK_CONTROL_MASK) {
         gdouble temp = MIN(rect->height.computed, rect->width.computed) / 2.0;
-        rect->rx.computed = rect->ry.computed = CLAMP(p[NR::Y] - rect->y.computed, 0.0, temp);
+        rect->rx.computed = rect->ry.computed = CLAMP(p[Geom::Y] - rect->y.computed, 0.0, temp);
         rect->ry._set = rect->rx._set = true;
     } else {
         if (!rect->rx._set || rect->rx.computed == 0) {
-            rect->ry.computed = CLAMP(p[NR::Y] - rect->y.computed,
+            rect->ry.computed = CLAMP(p[Geom::Y] - rect->y.computed,
                                       0.0,
                                       MIN(rect->height.computed / 2.0, rect->width.computed / 2.0));
         } else {
-            rect->ry.computed = CLAMP(p[NR::Y] - rect->y.computed,
+            rect->ry.computed = CLAMP(p[Geom::Y] - rect->y.computed,
                                       0.0,
                                       rect->height.computed / 2.0);
         }
@@ -230,7 +216,7 @@ RectKnotHolderEntityRY::knot_set_func(NR::Point const &p, NR::Point const &/*ori
 }
 
 void
-RectKnotHolderEntityRY::knot_click_func(guint state)
+RectKnotHolderEntityRY::knot_click(guint state)
 {
     SPRect *rect = SP_RECT(item);
 
@@ -259,29 +245,31 @@ static void sp_rect_clamp_radii(SPRect *rect)
     }
 }
 
-NR::Point
-RectKnotHolderEntityWH::knot_get_func()
+Geom::Point
+RectKnotHolderEntityWH::knot_get()
 {
     SPRect *rect = SP_RECT(item);
 
-    return NR::Point(rect->x.computed + rect->width.computed, rect->y.computed + rect->height.computed);
+    return Geom::Point(rect->x.computed + rect->width.computed, rect->y.computed + rect->height.computed);
 }
 
-static void sp_rect_wh_set_internal(SPRect *rect, NR::Point const &p, NR::Point const &origin, guint state)
+void
+RectKnotHolderEntityWH::set_internal(Geom::Point const &p, Geom::Point const &origin, guint state)
 {
-    NR::Point const s = snap_knot_position(rect, p);
+    SPRect *rect = SP_RECT(item);
+    Geom::Point const s = snap_knot_position(p);
 
     if (state & GDK_CONTROL_MASK) {
         // original width/height when drag started
-        gdouble const w_orig = (origin[NR::X] - rect->x.computed);
-        gdouble const h_orig = (origin[NR::Y] - rect->y.computed);
+        gdouble const w_orig = (origin[Geom::X] - rect->x.computed);
+        gdouble const h_orig = (origin[Geom::Y] - rect->y.computed);
 
         //original ratio
         gdouble const ratio = (w_orig / h_orig);
 
         // mouse displacement since drag started
-        gdouble const minx = s[NR::X] - origin[NR::X];
-        gdouble const miny = s[NR::Y] - origin[NR::Y];
+        gdouble const minx = s[Geom::X] - origin[Geom::X];
+        gdouble const miny = s[Geom::Y] - origin[Geom::Y];
 
         if (fabs(minx) > fabs(miny)) {
 
@@ -311,8 +299,8 @@ static void sp_rect_wh_set_internal(SPRect *rect, NR::Point const &p, NR::Point
 
     } else {
         // move freely
-        rect->width.computed = MAX(s[NR::X] - rect->x.computed, 0);
-        rect->height.computed = MAX(s[NR::Y] - rect->y.computed, 0);
+        rect->width.computed = MAX(s[Geom::X] - rect->x.computed, 0);
+        rect->height.computed = MAX(s[Geom::Y] - rect->y.computed, 0);
         rect->width._set = rect->height._set = true;
     }
 
@@ -322,25 +310,22 @@ static void sp_rect_wh_set_internal(SPRect *rect, NR::Point const &p, NR::Point
 }
 
 void
-RectKnotHolderEntityWH::knot_set_func(NR::Point const &p, NR::Point const &origin, guint state)
+RectKnotHolderEntityWH::knot_set(Geom::Point const &p, Geom::Point const &origin, guint state)
 {
-    SPRect *rect = SP_RECT(item);
-
-    sp_rect_wh_set_internal(rect, p, origin, state);
-
+    set_internal(p, origin, state);
     update_knot();
 }
 
-NR::Point
-RectKnotHolderEntityXY::knot_get_func()
+Geom::Point
+RectKnotHolderEntityXY::knot_get()
 {
     SPRect *rect = SP_RECT(item);
 
-    return NR::Point(rect->x.computed, rect->y.computed);
+    return Geom::Point(rect->x.computed, rect->y.computed);
 }
 
 void
-RectKnotHolderEntityXY::knot_set_func(NR::Point const &p, NR::Point const &origin, guint state)
+RectKnotHolderEntityXY::knot_set(Geom::Point const &p, Geom::Point const &origin, guint state)
 {
     SPRect *rect = SP_RECT(item);
 
@@ -349,14 +334,14 @@ RectKnotHolderEntityXY::knot_set_func(NR::Point const &p, NR::Point const &origi
     gdouble opposite_y = (rect->y.computed + rect->height.computed);
 
     // original width/height when drag started
-    gdouble w_orig = opposite_x - origin[NR::X];
-    gdouble h_orig = opposite_y - origin[NR::Y];
+    gdouble w_orig = opposite_x - origin[Geom::X];
+    gdouble h_orig = opposite_y - origin[Geom::Y];
 
-    NR::Point const s = snap_knot_position(rect, p);
+    Geom::Point const s = snap_knot_position(p);
 
     // mouse displacement since drag started
-    gdouble minx = s[NR::X] - origin[NR::X];
-    gdouble miny = s[NR::Y] - origin[NR::Y];
+    gdouble minx = s[Geom::X] - origin[Geom::X];
+    gdouble miny = s[Geom::Y] - origin[Geom::Y];
 
     if (state & GDK_CONTROL_MASK) {
         //original ratio
@@ -365,30 +350,30 @@ RectKnotHolderEntityXY::knot_set_func(NR::Point const &p, NR::Point const &origi
         if (fabs(minx) > fabs(miny)) {
 
             // snap to horizontal or diagonal
-            rect->x.computed = MIN(s[NR::X], opposite_x);
+            rect->x.computed = MIN(s[Geom::X], opposite_x);
             rect->width.computed = MAX(w_orig - minx, 0);
             if (minx != 0 && fabs(miny/minx) > 0.5 * 1/ratio && (SGN(minx) == SGN(miny))) {
                 // closer to the diagonal and in same-sign quarters, change both using ratio
-                rect->y.computed = MIN(origin[NR::Y] + minx / ratio, opposite_y);
+                rect->y.computed = MIN(origin[Geom::Y] + minx / ratio, opposite_y);
                 rect->height.computed = MAX(h_orig - minx / ratio, 0);
             } else {
                 // closer to the horizontal, change only width, height is h_orig
-                rect->y.computed = MIN(origin[NR::Y], opposite_y);
+                rect->y.computed = MIN(origin[Geom::Y], opposite_y);
                 rect->height.computed = MAX(h_orig, 0);
             }
 
         } else {
 
             // snap to vertical or diagonal
-            rect->y.computed = MIN(s[NR::Y], opposite_y);
+            rect->y.computed = MIN(s[Geom::Y], opposite_y);
             rect->height.computed = MAX(h_orig - miny, 0);
             if (miny != 0 && fabs(minx/miny) > 0.5 *ratio && (SGN(minx) == SGN(miny))) {
                 // closer to the diagonal and in same-sign quarters, change both using ratio
-                rect->x.computed = MIN(origin[NR::X] + miny * ratio, opposite_x);
+                rect->x.computed = MIN(origin[Geom::X] + miny * ratio, opposite_x);
                 rect->width.computed = MAX(w_orig - miny * ratio, 0);
             } else {
                 // closer to the vertical, change only height, width is w_orig
-                rect->x.computed = MIN(origin[NR::X], opposite_x);
+                rect->x.computed = MIN(origin[Geom::X], opposite_x);
                 rect->width.computed = MAX(w_orig, 0);
             }
 
@@ -398,9 +383,9 @@ RectKnotHolderEntityXY::knot_set_func(NR::Point const &p, NR::Point const &origi
 
     } else {
         // move freely
-        rect->x.computed = MIN(s[NR::X], opposite_x);
+        rect->x.computed = MIN(s[Geom::X], opposite_x);
         rect->width.computed = MAX(w_orig - minx, 0);
-        rect->y.computed = MIN(s[NR::Y], opposite_y);
+        rect->y.computed = MIN(s[Geom::Y], opposite_y);
         rect->height.computed = MAX(h_orig - miny, 0);
         rect->width._set = rect->height._set = rect->x._set = rect->y._set = true;
     }
@@ -447,27 +432,27 @@ RectKnotHolder::RectKnotHolder(SPDesktop *desktop, SPItem *item, SPKnotHolderRel
 
 class Box3DKnotHolderEntity : public KnotHolderEntity {
 public:
-    virtual NR::Point knot_get_func() = 0;
-    virtual void knot_set_func(NR::Point const &p, NR::Point const &origin, guint state) = 0;
+    virtual Geom::Point knot_get() = 0;
+    virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state) = 0;
 
-    static NR::Point knot_get_func_generic(SPItem *item, unsigned int knot_id);
-    static void knot_set_func_generic(SPItem *item, unsigned int knot_id, NR::Point const &p, guint state);
+    Geom::Point knot_get_generic(SPItem *item, unsigned int knot_id);
+    void knot_set_generic(SPItem *item, unsigned int knot_id, Geom::Point const &p, guint state);
 };
 
-NR::Point
-Box3DKnotHolderEntity::knot_get_func_generic(SPItem *item, unsigned int knot_id)
+Geom::Point
+Box3DKnotHolderEntity::knot_get_generic(SPItem *item, unsigned int knot_id)
 {
     return box3d_get_corner_screen(SP_BOX3D(item), knot_id);
 }
 
 void
-Box3DKnotHolderEntity::knot_set_func_generic(SPItem *item, unsigned int knot_id, NR::Point const &new_pos, guint state)
+Box3DKnotHolderEntity::knot_set_generic(SPItem *item, unsigned int knot_id, Geom::Point const &new_pos, guint state)
 {
-    NR::Point const s = snap_knot_position(item, new_pos);
+    Geom::Point const s = snap_knot_position(new_pos);
 
     g_assert(item != NULL);
     SPBox3D *box = SP_BOX3D(item);
-    NR::Matrix const i2d (sp_item_i2d_affine (item));
+    Geom::Matrix const i2d (sp_item_i2d_affine (item));
 
     Box3D::Axis movement;
     if ((knot_id < 4) != (state & GDK_SHIFT_MASK)) {
@@ -483,167 +468,167 @@ Box3DKnotHolderEntity::knot_set_func_generic(SPItem *item, unsigned int knot_id,
 
 class Box3DKnotHolderEntity0 : public Box3DKnotHolderEntity {
 public:
-    virtual NR::Point knot_get_func();
-    virtual void knot_set_func(NR::Point const &p, NR::Point const &origin, guint state);
+    virtual Geom::Point knot_get();
+    virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
 };
 
 class Box3DKnotHolderEntity1 : public Box3DKnotHolderEntity {
 public:
-    virtual NR::Point knot_get_func();
-    virtual void knot_set_func(NR::Point const &p, NR::Point const &origin, guint state);
+    virtual Geom::Point knot_get();
+    virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
 };
 
 class Box3DKnotHolderEntity2 : public Box3DKnotHolderEntity {
 public:
-    virtual NR::Point knot_get_func();
-    virtual void knot_set_func(NR::Point const &p, NR::Point const &origin, guint state);
+    virtual Geom::Point knot_get();
+    virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
 };
 
 class Box3DKnotHolderEntity3 : public Box3DKnotHolderEntity {
 public:
-    virtual NR::Point knot_get_func();
-    virtual void knot_set_func(NR::Point const &p, NR::Point const &origin, guint state);
+    virtual Geom::Point knot_get();
+    virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
 };
 
 class Box3DKnotHolderEntity4 : public Box3DKnotHolderEntity {
 public:
-    virtual NR::Point knot_get_func();
-    virtual void knot_set_func(NR::Point const &p, NR::Point const &origin, guint state);
+    virtual Geom::Point knot_get();
+    virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
 };
 
 class Box3DKnotHolderEntity5 : public Box3DKnotHolderEntity {
 public:
-    virtual NR::Point knot_get_func();
-    virtual void knot_set_func(NR::Point const &p, NR::Point const &origin, guint state);
+    virtual Geom::Point knot_get();
+    virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
 };
 
 class Box3DKnotHolderEntity6 : public Box3DKnotHolderEntity {
 public:
-    virtual NR::Point knot_get_func();
-    virtual void knot_set_func(NR::Point const &p, NR::Point const &origin, guint state);
+    virtual Geom::Point knot_get();
+    virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
 };
 
 class Box3DKnotHolderEntity7 : public Box3DKnotHolderEntity {
 public:
-    virtual NR::Point knot_get_func();
-    virtual void knot_set_func(NR::Point const &p, NR::Point const &origin, guint state);
+    virtual Geom::Point knot_get();
+    virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
 };
 
 class Box3DKnotHolderEntityCenter : public KnotHolderEntity {
 public:
-    virtual NR::Point knot_get_func();
-    virtual void knot_set_func(NR::Point const &p, NR::Point const &origin, guint state);
+    virtual Geom::Point knot_get();
+    virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
 };
 
-NR::Point
-Box3DKnotHolderEntity0::knot_get_func()
+Geom::Point
+Box3DKnotHolderEntity0::knot_get()
 {
-    return knot_get_func_generic(item, 0);
+    return knot_get_generic(item, 0);
 }
 
-NR::Point
-Box3DKnotHolderEntity1::knot_get_func()
+Geom::Point
+Box3DKnotHolderEntity1::knot_get()
 {
-    return knot_get_func_generic(item, 1);
+    return knot_get_generic(item, 1);
 }
 
-NR::Point
-Box3DKnotHolderEntity2::knot_get_func()
+Geom::Point
+Box3DKnotHolderEntity2::knot_get()
 {
-    return knot_get_func_generic(item, 2);
+    return knot_get_generic(item, 2);
 }
 
-NR::Point
-Box3DKnotHolderEntity3::knot_get_func()
+Geom::Point
+Box3DKnotHolderEntity3::knot_get()
 {
-    return knot_get_func_generic(item, 3);
+    return knot_get_generic(item, 3);
 }
 
-NR::Point
-Box3DKnotHolderEntity4::knot_get_func()
+Geom::Point
+Box3DKnotHolderEntity4::knot_get()
 {
-    return knot_get_func_generic(item, 4);
+    return knot_get_generic(item, 4);
 }
 
-NR::Point
-Box3DKnotHolderEntity5::knot_get_func()
+Geom::Point
+Box3DKnotHolderEntity5::knot_get()
 {
-    return knot_get_func_generic(item, 5);
+    return knot_get_generic(item, 5);
 }
 
-NR::Point
-Box3DKnotHolderEntity6::knot_get_func()
+Geom::Point
+Box3DKnotHolderEntity6::knot_get()
 {
-    return knot_get_func_generic(item, 6);
+    return knot_get_generic(item, 6);
 }
 
-NR::Point
-Box3DKnotHolderEntity7::knot_get_func()
+Geom::Point
+Box3DKnotHolderEntity7::knot_get()
 {
-    return knot_get_func_generic(item, 7);
+    return knot_get_generic(item, 7);
 }
 
-NR::Point
-Box3DKnotHolderEntityCenter::knot_get_func()
+Geom::Point
+Box3DKnotHolderEntityCenter::knot_get()
 {
     return box3d_get_center_screen(SP_BOX3D(item));
 }
 
 void
-Box3DKnotHolderEntity0::knot_set_func(NR::Point const &new_pos, NR::Point const &/*origin*/, guint state)
+Box3DKnotHolderEntity0::knot_set(Geom::Point const &new_pos, Geom::Point const &/*origin*/, guint state)
 {
-    knot_set_func_generic(item, 0, new_pos, state);
+    knot_set_generic(item, 0, new_pos, state);
 }
 
 void
-Box3DKnotHolderEntity1::knot_set_func(NR::Point const &new_pos, NR::Point const &/*origin*/, guint state)
+Box3DKnotHolderEntity1::knot_set(Geom::Point const &new_pos, Geom::Point const &/*origin*/, guint state)
 {
-    knot_set_func_generic(item, 1, new_pos, state);
+    knot_set_generic(item, 1, new_pos, state);
 }
 
 void
-Box3DKnotHolderEntity2::knot_set_func(NR::Point const &new_pos, NR::Point const &/*origin*/, guint state)
+Box3DKnotHolderEntity2::knot_set(Geom::Point const &new_pos, Geom::Point const &/*origin*/, guint state)
 {
-    knot_set_func_generic(item, 2, new_pos, state);
+    knot_set_generic(item, 2, new_pos, state);
 }
 
 void
-Box3DKnotHolderEntity3::knot_set_func(NR::Point const &new_pos, NR::Point const &/*origin*/, guint state)
+Box3DKnotHolderEntity3::knot_set(Geom::Point const &new_pos, Geom::Point const &/*origin*/, guint state)
 {
-    knot_set_func_generic(item, 3, new_pos, state);
+    knot_set_generic(item, 3, new_pos, state);
 }
 
 void
-Box3DKnotHolderEntity4::knot_set_func(NR::Point const &new_pos, NR::Point const &/*origin*/, guint state)
+Box3DKnotHolderEntity4::knot_set(Geom::Point const &new_pos, Geom::Point const &/*origin*/, guint state)
 {
-    knot_set_func_generic(item, 4, new_pos, state);
+    knot_set_generic(item, 4, new_pos, state);
 }
 
 void
-Box3DKnotHolderEntity5::knot_set_func(NR::Point const &new_pos, NR::Point const &/*origin*/, guint state)
+Box3DKnotHolderEntity5::knot_set(Geom::Point const &new_pos, Geom::Point const &/*origin*/, guint state)
 {
-    knot_set_func_generic(item, 5, new_pos, state);
+    knot_set_generic(item, 5, new_pos, state);
 }
 
 void
-Box3DKnotHolderEntity6::knot_set_func(NR::Point const &new_pos, NR::Point const &/*origin*/, guint state)
+Box3DKnotHolderEntity6::knot_set(Geom::Point const &new_pos, Geom::Point const &/*origin*/, guint state)
 {
-    knot_set_func_generic(item, 6, new_pos, state);
+    knot_set_generic(item, 6, new_pos, state);
 }
 
 void
-Box3DKnotHolderEntity7::knot_set_func(NR::Point const &new_pos, NR::Point const &/*origin*/, guint state)
+Box3DKnotHolderEntity7::knot_set(Geom::Point const &new_pos, Geom::Point const &/*origin*/, guint state)
 {
-    knot_set_func_generic(item, 7, new_pos, state);
+    knot_set_generic(item, 7, new_pos, state);
 }
 
 void
-Box3DKnotHolderEntityCenter::knot_set_func(NR::Point const &new_pos, NR::Point const &origin, guint state)
+Box3DKnotHolderEntityCenter::knot_set(Geom::Point const &new_pos, Geom::Point const &origin, guint state)
 {
-    NR::Point const s = snap_knot_position(item, new_pos);
+    Geom::Point const s = snap_knot_position(new_pos);
 
     SPBox3D *box = SP_BOX3D(item);
-    NR::Matrix const i2d (sp_item_i2d_affine (item));
+    Geom::Matrix const i2d (sp_item_i2d_affine (item));
 
     box3d_set_center (SP_BOX3D(item), s * i2d, origin * i2d, !(state & GDK_SHIFT_MASK) ? Box3D::XY : Box3D::Z,
                       state & GDK_CONTROL_MASK);
@@ -710,29 +695,29 @@ Box3DKnotHolder::Box3DKnotHolder(SPDesktop *desktop, SPItem *item, SPKnotHolderR
 
 class ArcKnotHolderEntityStart : public KnotHolderEntity {
 public:
-    virtual NR::Point knot_get_func();
-    virtual void knot_set_func(NR::Point const &p, NR::Point const &origin, guint state);
+    virtual Geom::Point knot_get();
+    virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
 };
 
 class ArcKnotHolderEntityEnd : public KnotHolderEntity {
 public:
-    virtual NR::Point knot_get_func();
-    virtual void knot_set_func(NR::Point const &p, NR::Point const &origin, guint state);
-    virtual void knot_click_func(guint state);
+    virtual Geom::Point knot_get();
+    virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
+    virtual void knot_click(guint state);
 };
 
 class ArcKnotHolderEntityRX : public KnotHolderEntity {
 public:
-    virtual NR::Point knot_get_func();
-    virtual void knot_set_func(NR::Point const &p, NR::Point const &origin, guint state);
-    virtual void knot_click_func(guint state);
+    virtual Geom::Point knot_get();
+    virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
+    virtual void knot_click(guint state);
 };
 
 class ArcKnotHolderEntityRY : public KnotHolderEntity {
 public:
-    virtual NR::Point knot_get_func();
-    virtual void knot_set_func(NR::Point const &p, NR::Point const &origin, guint state);
-    virtual void knot_click_func(guint state);
+    virtual Geom::Point knot_get();
+    virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
+    virtual void knot_click(guint state);
 };
 
 /*
@@ -742,10 +727,10 @@ public:
  *   -1 : outside
  */
 static gint
-sp_genericellipse_side(SPGenericEllipse *ellipse, NR::Point const &p)
+sp_genericellipse_side(SPGenericEllipse *ellipse, Geom::Point const &p)
 {
-    gdouble dx = (p[NR::X] - ellipse->cx.computed) / ellipse->rx.computed;
-    gdouble dy = (p[NR::Y] - ellipse->cy.computed) / ellipse->ry.computed;
+    gdouble dx = (p[Geom::X] - ellipse->cx.computed) / ellipse->rx.computed;
+    gdouble dy = (p[Geom::Y] - ellipse->cy.computed) / ellipse->ry.computed;
 
     gdouble s = dx * dx + dy * dy;
     if (s < 1.0) return 1;
@@ -754,17 +739,18 @@ sp_genericellipse_side(SPGenericEllipse *ellipse, NR::Point const &p)
 }
 
 void
-ArcKnotHolderEntityStart::knot_set_func(NR::Point const &p, NR::Point const &/*origin*/, guint state)
+ArcKnotHolderEntityStart::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint state)
 {
-    int snaps = prefs_get_int_attribute("options.rotationsnapsperpi", "value", 12);
+    Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+    int snaps = prefs->getInt("/options/rotationsnapsperpi/value", 12);
 
     SPGenericEllipse *ge = SP_GENERICELLIPSE(item);
     SPArc *arc = SP_ARC(item);
 
     ge->closed = (sp_genericellipse_side(ge, p) == -1) ? TRUE : FALSE;
 
-    NR::Point delta = p - NR::Point(ge->cx.computed, ge->cy.computed);
-    NR::scale sc(ge->rx.computed, ge->ry.computed);
+    Geom::Point delta = p - Geom::Point(ge->cx.computed, ge->cy.computed);
+    Geom::Scale sc(ge->rx.computed, ge->ry.computed);
     ge->start = atan2(delta * sc.inverse());
     if ( ( state & GDK_CONTROL_MASK )
          && snaps )
@@ -775,8 +761,8 @@ ArcKnotHolderEntityStart::knot_set_func(NR::Point const &p, NR::Point const &/*o
     ((SPObject *)arc)->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG);
 }
 
-NR::Point
-ArcKnotHolderEntityStart::knot_get_func()
+Geom::Point
+ArcKnotHolderEntityStart::knot_get()
 {
     SPGenericEllipse *ge = SP_GENERICELLIPSE(item);
     SPArc *arc = SP_ARC(item);
@@ -785,17 +771,18 @@ ArcKnotHolderEntityStart::knot_get_func()
 }
 
 void
-ArcKnotHolderEntityEnd::knot_set_func(NR::Point const &p, NR::Point const &/*origin*/, guint state)
+ArcKnotHolderEntityEnd::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint state)
 {
-    int snaps = prefs_get_int_attribute("options.rotationsnapsperpi", "value", 12);
+    Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+    int snaps = prefs->getInt("/options/rotationsnapsperpi/value", 12);
 
     SPGenericEllipse *ge = SP_GENERICELLIPSE(item);
     SPArc *arc = SP_ARC(item);
 
     ge->closed = (sp_genericellipse_side(ge, p) == -1) ? TRUE : FALSE;
 
-    NR::Point delta = p - NR::Point(ge->cx.computed, ge->cy.computed);
-    NR::scale sc(ge->rx.computed, ge->ry.computed);
+    Geom::Point delta = p - Geom::Point(ge->cx.computed, ge->cy.computed);
+    Geom::Scale sc(ge->rx.computed, ge->ry.computed);
     ge->end = atan2(delta * sc.inverse());
     if ( ( state & GDK_CONTROL_MASK )
          && snaps )
@@ -806,8 +793,8 @@ ArcKnotHolderEntityEnd::knot_set_func(NR::Point const &p, NR::Point const &/*ori
     ((SPObject *)arc)->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG);
 }
 
-NR::Point
-ArcKnotHolderEntityEnd::knot_get_func()
+Geom::Point
+ArcKnotHolderEntityEnd::knot_get()
 {
     SPGenericEllipse *ge = SP_GENERICELLIPSE(item);
     SPArc *arc = SP_ARC(item);
@@ -817,7 +804,7 @@ ArcKnotHolderEntityEnd::knot_get_func()
 
 
 void
-ArcKnotHolderEntityEnd::knot_click_func(guint state)
+ArcKnotHolderEntityEnd::knot_click(guint state)
 {
     SPGenericEllipse *ge = SP_GENERICELLIPSE(item);
 
@@ -829,32 +816,31 @@ ArcKnotHolderEntityEnd::knot_click_func(guint state)
 
 
 void
-ArcKnotHolderEntityRX::knot_set_func(NR::Point const &p, NR::Point const &/*origin*/, guint state)
+ArcKnotHolderEntityRX::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint state)
 {
     SPGenericEllipse *ge = SP_GENERICELLIPSE(item);
-    SPArc *arc = SP_ARC(item);
 
-    NR::Point const s = snap_knot_position(arc, p);
+    Geom::Point const s = snap_knot_position(p);
 
-    ge->rx.computed = fabs( ge->cx.computed - s[NR::X] );
+    ge->rx.computed = fabs( ge->cx.computed - s[Geom::X] );
 
     if ( state & GDK_CONTROL_MASK ) {
         ge->ry.computed = ge->rx.computed;
     }
 
-    ((SPObject *)arc)->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG);
+    ((SPObject *)item)->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG);
 }
 
-NR::Point
-ArcKnotHolderEntityRX::knot_get_func()
+Geom::Point
+ArcKnotHolderEntityRX::knot_get()
 {
     SPGenericEllipse *ge = SP_GENERICELLIPSE(item);
 
-    return (NR::Point(ge->cx.computed, ge->cy.computed) -  NR::Point(ge->rx.computed, 0));
+    return (Geom::Point(ge->cx.computed, ge->cy.computed) -  Geom::Point(ge->rx.computed, 0));
 }
 
 void
-ArcKnotHolderEntityRX::knot_click_func(guint state)
+ArcKnotHolderEntityRX::knot_click(guint state)
 {
     SPGenericEllipse *ge = SP_GENERICELLIPSE(item);
 
@@ -865,32 +851,31 @@ ArcKnotHolderEntityRX::knot_click_func(guint state)
 }
 
 void
-ArcKnotHolderEntityRY::knot_set_func(NR::Point const &p, NR::Point const &/*origin*/, guint state)
+ArcKnotHolderEntityRY::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint state)
 {
     SPGenericEllipse *ge = SP_GENERICELLIPSE(item);
-    SPArc *arc = SP_ARC(item);
 
-    NR::Point const s = snap_knot_position(arc, p);
+    Geom::Point const s = snap_knot_position(p);
 
-    ge->ry.computed = fabs( ge->cy.computed - s[NR::Y] );
+    ge->ry.computed = fabs( ge->cy.computed - s[Geom::Y] );
 
     if ( state & GDK_CONTROL_MASK ) {
         ge->rx.computed = ge->ry.computed;
     }
 
-    ((SPObject *)arc)->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG);
+    ((SPObject *)item)->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG);
 }
 
-NR::Point
-ArcKnotHolderEntityRY::knot_get_func()
+Geom::Point
+ArcKnotHolderEntityRY::knot_get()
 {
     SPGenericEllipse *ge = SP_GENERICELLIPSE(item);
 
-    return (NR::Point(ge->cx.computed, ge->cy.computed) -  NR::Point(0, ge->ry.computed));
+    return (Geom::Point(ge->cx.computed, ge->cy.computed) -  Geom::Point(0, ge->ry.computed));
 }
 
 void
-ArcKnotHolderEntityRY::knot_click_func(guint state)
+ArcKnotHolderEntityRY::knot_click(guint state)
 {
     SPGenericEllipse *ge = SP_GENERICELLIPSE(item);
 
@@ -933,26 +918,26 @@ ArcKnotHolder::ArcKnotHolder(SPDesktop *desktop, SPItem *item, SPKnotHolderRelea
 
 class StarKnotHolderEntity1 : public KnotHolderEntity {
 public:
-    virtual NR::Point knot_get_func();
-    virtual void knot_set_func(NR::Point const &p, NR::Point const &origin, guint state);
-    virtual void knot_click_func(guint state);
+    virtual Geom::Point knot_get();
+    virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
+    virtual void knot_click(guint state);
 };
 
 class StarKnotHolderEntity2 : public KnotHolderEntity {
 public:
-    virtual NR::Point knot_get_func();
-    virtual void knot_set_func(NR::Point const &p, NR::Point const &origin, guint state);
-    virtual void knot_click_func(guint state);
+    virtual Geom::Point knot_get();
+    virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
+    virtual void knot_click(guint state);
 };
 
 void
-StarKnotHolderEntity1::knot_set_func(NR::Point const &p, NR::Point const &/*origin*/, guint state)
+StarKnotHolderEntity1::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint state)
 {
     SPStar *star = SP_STAR(item);
 
-    NR::Point const s = snap_knot_position(star, p);
+    Geom::Point const s = snap_knot_position(p);
 
-    NR::Point d = s - star->center;
+    Geom::Point d = s - to_2geom(star->center);
 
     double arg1 = atan2(d);
     double darg1 = arg1 - star->arg[0];
@@ -972,14 +957,14 @@ StarKnotHolderEntity1::knot_set_func(NR::Point const &p, NR::Point const &/*orig
 }
 
 void
-StarKnotHolderEntity2::knot_set_func(NR::Point const &p, NR::Point const &/*origin*/, guint state)
+StarKnotHolderEntity2::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint state)
 {
     SPStar *star = SP_STAR(item);
 
-    NR::Point const s = snap_knot_position(star, p);
+    Geom::Point const s = snap_knot_position(p);
 
     if (star->flatsided == false) {
-        NR::Point d = s - star->center;
+        Geom::Point d = s - to_2geom(star->center);
 
         double arg1 = atan2(d);
         double darg1 = arg1 - star->arg[1];
@@ -1000,8 +985,8 @@ StarKnotHolderEntity2::knot_set_func(NR::Point const &p, NR::Point const &/*orig
     }
 }
 
-NR::Point
-StarKnotHolderEntity1::knot_get_func()
+Geom::Point
+StarKnotHolderEntity1::knot_get()
 {
     g_assert(item != NULL);
 
@@ -1011,8 +996,8 @@ StarKnotHolderEntity1::knot_get_func()
 
 }
 
-NR::Point
-StarKnotHolderEntity2::knot_get_func()
+Geom::Point
+StarKnotHolderEntity2::knot_get()
 {
     g_assert(item != NULL);
 
@@ -1039,13 +1024,13 @@ sp_star_knot_click(SPItem *item, guint state)
 }
 
 void
-StarKnotHolderEntity1::knot_click_func(guint state)
+StarKnotHolderEntity1::knot_click(guint state)
 {
     return sp_star_knot_click(item, state);
 }
 
 void
-StarKnotHolderEntity2::knot_click_func(guint state)
+StarKnotHolderEntity2::knot_click(guint state)
 {
     return sp_star_knot_click(item, state);
 }
@@ -1076,15 +1061,15 @@ StarKnotHolder::StarKnotHolder(SPDesktop *desktop, SPItem *item, SPKnotHolderRel
 
 class SpiralKnotHolderEntityInner : public KnotHolderEntity {
 public:
-    virtual NR::Point knot_get_func();
-    virtual void knot_set_func(NR::Point const &p, NR::Point const &origin, guint state);
-    virtual void knot_click_func(guint state);
+    virtual Geom::Point knot_get();
+    virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
+    virtual void knot_click(guint state);
 };
 
 class SpiralKnotHolderEntityOuter : public KnotHolderEntity {
 public:
-    virtual NR::Point knot_get_func();
-    virtual void knot_set_func(NR::Point const &p, NR::Point const &origin, guint state);
+    virtual Geom::Point knot_get();
+    virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
 };
 
 
@@ -1095,14 +1080,15 @@ public:
  *   [control] constrain inner arg to round per PI/4
  */
 void
-SpiralKnotHolderEntityInner::knot_set_func(NR::Point const &p, NR::Point const &/*origin*/, guint state)
+SpiralKnotHolderEntityInner::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint state)
 {
-    int snaps = prefs_get_int_attribute("options.rotationsnapsperpi", "value", 12);
+    Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+    int snaps = prefs->getInt("/options/rotationsnapsperpi/value", 12);
 
     SPSpiral *spiral = SP_SPIRAL(item);
 
-    gdouble   dx = p[NR::X] - spiral->cx;
-    gdouble   dy = p[NR::Y] - spiral->cy;
+    gdouble   dx = p[Geom::X] - spiral->cx;
+    gdouble   dy = p[Geom::Y] - spiral->cy;
 
     if (state & GDK_MOD1_MASK) {
         // adjust divergence by vertical drag, relative to rad
@@ -1137,14 +1123,15 @@ SpiralKnotHolderEntityInner::knot_set_func(NR::Point const &p, NR::Point const &
  *   [control] constrain inner arg to round per PI/4
  */
 void
-SpiralKnotHolderEntityOuter::knot_set_func(NR::Point const &p, NR::Point const &/*origin*/, guint state)
+SpiralKnotHolderEntityOuter::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint state)
 {
-    int snaps = prefs_get_int_attribute("options.rotationsnapsperpi", "value", 12);
+    Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+    int snaps = prefs->getInt("/options/rotationsnapsperpi/value", 12);
 
     SPSpiral *spiral = SP_SPIRAL(item);
 
-    gdouble  dx = p[NR::X] - spiral->cx;
-    gdouble  dy = p[NR::Y] - spiral->cy;
+    gdouble  dx = p[Geom::X] - spiral->cx;
+    gdouble  dy = p[Geom::Y] - spiral->cy;
 
     if (state & GDK_SHIFT_MASK) { // rotate without roll/unroll
         spiral->arg = atan2(dy, dx) - 2.0*M_PI*spiral->revo;
@@ -1209,16 +1196,16 @@ SpiralKnotHolderEntityOuter::knot_set_func(NR::Point const &p, NR::Point const &
     ((SPObject *)spiral)->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG);
 }
 
-NR::Point
-SpiralKnotHolderEntityInner::knot_get_func()
+Geom::Point
+SpiralKnotHolderEntityInner::knot_get()
 {
     SPSpiral *spiral = SP_SPIRAL(item);
 
     return sp_spiral_get_xy(spiral, spiral->t0);
 }
 
-NR::Point
-SpiralKnotHolderEntityOuter::knot_get_func()
+Geom::Point
+SpiralKnotHolderEntityOuter::knot_get()
 {
     SPSpiral *spiral = SP_SPIRAL(item);
 
@@ -1226,7 +1213,7 @@ SpiralKnotHolderEntityOuter::knot_get_func()
 }
 
 void
-SpiralKnotHolderEntityInner::knot_click_func(guint state)
+SpiralKnotHolderEntityInner::knot_click(guint state)
 {
     SPSpiral *spiral = SP_SPIRAL(item);
 
@@ -1260,12 +1247,12 @@ SpiralKnotHolder::SpiralKnotHolder(SPDesktop *desktop, SPItem *item, SPKnotHolde
 
 class OffsetKnotHolderEntity : public KnotHolderEntity {
 public:
-    virtual NR::Point knot_get_func();
-    virtual void knot_set_func(NR::Point const &p, NR::Point const &origin, guint state);
+    virtual Geom::Point knot_get();
+    virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
 };
 
 void
-OffsetKnotHolderEntity::knot_set_func(NR::Point const &p, NR::Point const &/*origin*/, guint /*state*/)
+OffsetKnotHolderEntity::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint /*state*/)
 {
     SPOffset *offset = SP_OFFSET(item);
 
@@ -1277,12 +1264,12 @@ OffsetKnotHolderEntity::knot_set_func(NR::Point const &p, NR::Point const &/*ori
 }
 
 
-NR::Point
-OffsetKnotHolderEntity::knot_get_func()
+Geom::Point
+OffsetKnotHolderEntity::knot_get()
 {
     SPOffset *offset = SP_OFFSET(item);
 
-    NR::Point np;
+    Geom::Point np;
     sp_offset_top_point(offset,&np);
     return np;
 }
@@ -1298,26 +1285,27 @@ OffsetKnotHolder::OffsetKnotHolder(SPDesktop *desktop, SPItem *item, SPKnotHolde
     add_pattern_knotholder();
 }
 
-class FlowtextKnotHolderEntity : public KnotHolderEntity {
+// TODO: this is derived from RectKnotHolderEntityWH because it used the same static function
+// set_internal as the latter before KnotHolderEntity was C++ified. Check whether this also makes
+// sense logically.
+class FlowtextKnotHolderEntity : public RectKnotHolderEntityWH {
 public:
-    virtual NR::Point knot_get_func();
-    virtual void knot_set_func(NR::Point const &p, NR::Point const &origin, guint state);
+    virtual Geom::Point knot_get();
+    virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
 };
 
-NR::Point
-FlowtextKnotHolderEntity::knot_get_func()
+Geom::Point
+FlowtextKnotHolderEntity::knot_get()
 {
     SPRect *rect = SP_RECT(item);
 
-    return NR::Point(rect->x.computed + rect->width.computed, rect->y.computed + rect->height.computed);
+    return Geom::Point(rect->x.computed + rect->width.computed, rect->y.computed + rect->height.computed);
 }
 
 void
-FlowtextKnotHolderEntity::knot_set_func(NR::Point const &p, NR::Point const &origin, guint state)
+FlowtextKnotHolderEntity::knot_set(Geom::Point const &p, Geom::Point const &origin, guint state)
 {
-    SPRect *rect = SP_RECT(item);
-
-    sp_rect_wh_set_internal(rect, p, origin, state);
+    set_internal(p, origin, state);
 }
 
 FlowtextKnotHolder::FlowtextKnotHolder(SPDesktop *desktop, SPItem *item, SPKnotHolderReleasedFunc relhandler) :