diff --git a/src/object-snapper.cpp b/src/object-snapper.cpp
index e39d398b1d80be7db5a8a203d15c5e93ae64db34..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
{
- if (willSnapSomething()) {
+ 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))) {
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;
}
-
}
@@ -186,7 +214,7 @@ Inkscape::SnappedPoint Inkscape::ObjectSnapper::_doConstrainedSnap(NR::Point con
/**
* \return true if this Snapper will snap at least one kind of point.
*/
-bool Inkscape::ObjectSnapper::willSnapSomething() const
+bool Inkscape::ObjectSnapper::ThisSnapperMightSnap() const
{
return (_enabled && _snap_to != 0 && (_snap_to_paths || _snap_to_nodes));
}