diff --git a/src/object-snapper.cpp b/src/object-snapper.cpp
index 5492fc439cac8465a1e07db5704d32147097c4c9..a904bd93baa52505d016819338abeb3fb531cd31 100644 (file)
--- a/src/object-snapper.cpp
+++ b/src/object-snapper.cpp
#include "document.h"
#include "sp-namedview.h"
#include "sp-path.h"
+#include "sp-image.h"
#include "sp-item-group.h"
+#include "sp-item.h"
+#include "sp-use.h"
#include "display/curve.h"
#include "desktop.h"
#include "inkscape.h"
std::list<SPItem const *> const &it,
NR::Point const &p) const
{
- SPDesktop const *desktop = SP_ACTIVE_DESKTOP;
- for (SPObject* o = sp_object_first_child(r); o != NULL; o = SP_OBJECT_NEXT(o)) {
- if (SP_IS_ITEM(o) && !SP_ITEM(o)->isLocked() && !desktop->itemIsHidden(SP_ITEM(o))) {
-
- /* See if this item is on the ignore list */
- std::list<SPItem const *>::const_iterator i = it.begin();
- while (i != it.end() && *i != o) {
- i++;
- }
-
- if (i == it.end()) {
- /* See if the item is within range */
- if (SP_IS_GROUP(o)) {
- _findCandidates(c, o, it, p);
- } else {
- NR::Maybe<NR::Rect> b = sp_item_bbox_desktop(SP_ITEM(o));
- if ( b && NR::expand(*b, -getDistance()).contains(p) ) {
- c.push_back(SP_ITEM(o));
+ if (ThisSnapperMightSnap()) {
+ SPDesktop const *desktop = SP_ACTIVE_DESKTOP;
+ for (SPObject* o = sp_object_first_child(r); o != NULL; o = SP_OBJECT_NEXT(o)) {
+ if (SP_IS_ITEM(o) && !SP_ITEM(o)->isLocked() && !desktop->itemIsHidden(SP_ITEM(o))) {
+
+ /* See if this item is on the ignore list */
+ std::list<SPItem const *>::const_iterator i = it.begin();
+ while (i != it.end() && *i != o) {
+ i++;
+ }
+
+ if (i == it.end()) {
+ /* See if the item is within range */
+ if (SP_IS_GROUP(o)) {
+ _findCandidates(c, o, it, p);
+ } else {
+ NR::Maybe<NR::Rect> b = sp_item_bbox_desktop(SP_ITEM(o));
+ if ( b && NR::expand(*b, -getDistance()).contains(p) ) {
+ c.push_back(SP_ITEM(o));
+ }
}
}
+
}
-
}
}
}
SPDesktop const *desktop = SP_ACTIVE_DESKTOP;
for (std::list<SPItem*>::const_iterator i = cand.begin(); i != cand.end(); i++) {
- if (SP_IS_SHAPE(*i)) {
-
- SPShape const *sh = SP_SHAPE(*i);
- if (sh->curve) {
-
- int j = 0;
- NR::Matrix const i2doc = sp_item_i2doc_affine(*i);
-
- while (SP_CURVE_BPATH(sh->curve)[j].code != NR_END) {
-
- /* Get this node in desktop coordinates */
- NArtBpath const &bp = SP_CURVE_BPATH(sh->curve)[j];
- NR::Point const n = desktop->doc2dt(bp.c(3) * i2doc);
-
- /* Try to snap to this node of the path */
- NR::Coord const dist = NR::L2(n - p);
- if (dist < getDistance() && dist < s.getDistance()) {
- s = SnappedPoint(n, dist);
- }
-
- j++;
+
+ NR::Matrix i2doc(NR::identity());
+ SPItem *root_item = NULL;
+ if (SP_IS_USE(*i)) {
+ i2doc = sp_use_get_root_transform(SP_USE(*i));
+ root_item = sp_use_root(SP_USE(*i));
+ } else {
+ i2doc = sp_item_i2doc_affine(*i);
+ root_item = *i;
+ }
+
+ SPCurve *curve = NULL;
+
+ if (SP_IS_SHAPE(root_item)) {
+ SPShape const *sh = SP_SHAPE(root_item);
+ curve = sh->curve;
+ } else if (SP_IS_IMAGE(root_item)) {
+ SPImage const *im = SP_IMAGE(root_item);
+ curve = im->curve;
+ }
+
+ if (curve) {
+
+ int j = 0;
+
+ while (SP_CURVE_BPATH(curve)[j].code != NR_END) {
+
+ /* Get this node in desktop coordinates */
+ NArtBpath const &bp = SP_CURVE_BPATH(curve)[j];
+ NR::Point const n = desktop->doc2dt(bp.c(3) * i2doc);
+
+ /* Try to snap to this node of the path */
+ NR::Coord const dist = NR::L2(n - p);
+ if (dist < getDistance() && dist < s.getDistance()) {
+ s = SnappedPoint(n, dist);
}
+
+ j++;
}
}
}
SPDesktop const *desktop = SP_ACTIVE_DESKTOP;
NR::Point const p_doc = desktop->dt2doc(p);
-
+
for (std::list<SPItem*>::const_iterator i = cand.begin(); i != cand.end(); i++) {
/* Transform the requested snap point to this item's coordinates */
- NR::Matrix const i2doc = sp_item_i2doc_affine(*i);
+ NR::Matrix i2doc(NR::identity());
+ SPItem *root_item = NULL;
+ /* We might have a clone at hand, so make sure we get the root item */
+ if (SP_IS_USE(*i)) {
+ i2doc = sp_use_get_root_transform(SP_USE(*i));
+ root_item = sp_use_root(SP_USE(*i));
+ } else {
+ i2doc = sp_item_i2doc_affine(*i);
+ root_item = *i;
+ }
+
NR::Point const p_it = p_doc * i2doc.inverse();
- Path *livarot_path = Path_for_item(*i, true, true);
+ Path *livarot_path = Path_for_item(root_item, false, false);
if (!livarot_path)
continue;
delete livarot_path;
}
-
}
@@ -181,6 +211,15 @@ Inkscape::SnappedPoint Inkscape::ObjectSnapper::_doConstrainedSnap(NR::Point con
return _doFreeSnap(p, it);
}
+/**
+ * \return true if this Snapper will snap at least one kind of point.
+ */
+bool Inkscape::ObjectSnapper::ThisSnapperMightSnap() const
+{
+ return (_enabled && _snap_to != 0 && (_snap_to_paths || _snap_to_nodes));
+}
+
+
/*
Local Variables:
mode:c++