diff options
| author | Diederik van Lierop <mail@diedenrezi.nl> | 2007-06-26 21:07:31 +0000 |
|---|---|---|
| committer | dvlierop2 <dvlierop2@users.sourceforge.net> | 2007-06-26 21:07:31 +0000 |
| commit | a05ff8fca661b5681e43221f29a157fd7a26c106 (patch) | |
| tree | 29fbf8b08f69ee5bf07f5a7225d37d6feaeca424 /src/object-snapper.cpp | |
| parent | Add gtkrc to build.xml. Fix native path on <makefile> (diff) | |
| download | inkscape-a05ff8fca661b5681e43221f29a157fd7a26c106.tar.gz inkscape-a05ff8fca661b5681e43221f29a157fd7a26c106.zip | |
implementing snapping to images
(bzr r3110)
Diffstat (limited to 'src/object-snapper.cpp')
| -rw-r--r-- | src/object-snapper.cpp | 44 |
1 files changed, 26 insertions, 18 deletions
diff --git a/src/object-snapper.cpp b/src/object-snapper.cpp index 8d5b30dff..a904bd93b 100644 --- a/src/object-snapper.cpp +++ b/src/object-snapper.cpp @@ -15,7 +15,9 @@ #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" @@ -89,27 +91,33 @@ void Inkscape::ObjectSnapper::_snapNodes(Inkscape::SnappedPoint &s, root_item = *i; } + SPCurve *curve = NULL; + if (SP_IS_SHAPE(root_item)) { - SPShape const *sh = SP_SHAPE(root_item); - if (sh->curve) { - - int j = 0; - - 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); + curve = sh->curve; + } else if (SP_IS_IMAGE(root_item)) { + SPImage const *im = SP_IMAGE(root_item); + curve = im->curve; + } - /* 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); - } + if (curve) { - j++; + 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++; } } } @@ -126,13 +134,13 @@ void Inkscape::ObjectSnapper::_snapPaths(Inkscape::SnappedPoint &s, 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 i2doc(NR::identity()); SPItem *root_item = NULL; - /* We might have a clone at hand, so make sure we get the root item */ + /* 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)); |
