summaryrefslogtreecommitdiffstats
path: root/src/object-snapper.cpp
diff options
context:
space:
mode:
authorDiederik van Lierop <mail@diedenrezi.nl>2007-05-16 17:12:52 +0000
committerdvlierop2 <dvlierop2@users.sourceforge.net>2007-05-16 17:12:52 +0000
commita27f4de24bb16c5b78ab93f87856a72209821286 (patch)
treeae33a45bc6de0838c134c4b3605bf07336c08438 /src/object-snapper.cpp
parentFixed some feBlend rendering bugs (diff)
downloadinkscape-a27f4de24bb16c5b78ab93f87856a72209821286.tar.gz
inkscape-a27f4de24bb16c5b78ab93f87856a72209821286.zip
Implement object-snapping for clones (see bug #1511260)
(bzr r3018)
Diffstat (limited to 'src/object-snapper.cpp')
-rw-r--r--src/object-snapper.cpp36
1 files changed, 28 insertions, 8 deletions
diff --git a/src/object-snapper.cpp b/src/object-snapper.cpp
index d63376e14..8d5b30dff 100644
--- a/src/object-snapper.cpp
+++ b/src/object-snapper.cpp
@@ -16,6 +16,7 @@
#include "sp-namedview.h"
#include "sp-path.h"
#include "sp-item-group.h"
+#include "sp-use.h"
#include "display/curve.h"
#include "desktop.h"
#include "inkscape.h"
@@ -77,20 +78,30 @@ void Inkscape::ObjectSnapper::_snapNodes(Inkscape::SnappedPoint &s,
SPDesktop const *desktop = SP_ACTIVE_DESKTOP;
for (std::list<SPItem*>::const_iterator i = cand.begin(); i != cand.end(); i++) {
- if (SP_IS_SHAPE(*i)) {
+
+ 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;
+ }
+
+ if (SP_IS_SHAPE(root_item)) {
- SPShape const *sh = SP_SHAPE(*i);
+ SPShape const *sh = SP_SHAPE(root_item);
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()) {
@@ -119,10 +130,20 @@ void Inkscape::ObjectSnapper::_snapPaths(Inkscape::SnappedPoint &s,
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;
@@ -144,7 +165,6 @@ void Inkscape::ObjectSnapper::_snapPaths(Inkscape::SnappedPoint &s,
delete livarot_path;
}
-
}