diff options
| author | Nathan Lee <2431820-nathanal@users.noreply.gitlab.com> | 2019-06-03 13:54:15 +0000 |
|---|---|---|
| committer | Nathan Lee <2431820-nathanal@users.noreply.gitlab.com> | 2019-06-03 14:08:16 +0000 |
| commit | 91dc0a4a88c4379971252de5cec319b5f5ad1b5e (patch) | |
| tree | 4dd525e8f126d9e481e2a761b1d31f367c836a40 /src/object/sp-tspan.cpp | |
| parent | Crashfix deleting path with invisible text on path (diff) | |
| download | inkscape-91dc0a4a88c4379971252de5cec319b5f5ad1b5e.tar.gz inkscape-91dc0a4a88c4379971252de5cec319b5f5ad1b5e.zip | |
Change TextPath to Text positioning
Uses originalPath instead of bounding-box.
Make positioning consistent with text that
is not visible (too long for path).
Diffstat (limited to 'src/object/sp-tspan.cpp')
| -rw-r--r-- | src/object/sp-tspan.cpp | 51 |
1 files changed, 19 insertions, 32 deletions
diff --git a/src/object/sp-tspan.cpp b/src/object/sp-tspan.cpp index 76c9b1a3a..1649367d3 100644 --- a/src/object/sp-tspan.cpp +++ b/src/object/sp-tspan.cpp @@ -480,31 +480,6 @@ SPItem *sp_textpath_get_path_item(SPTextPath *tp) void sp_textpath_to_text(SPObject *tp) { SPObject *text = tp->parent; - - Geom::OptRect bbox = SP_ITEM(text)->geometricBounds(SP_ITEM(text)->i2doc_affine()); - Geom::Point xy; - if (!bbox) { - // Text is not shown on canvas at all - // Copied from Layout::fitToPathAlign - Path *path = dynamic_cast<SPTextPath*>(tp)->originalPath; - SVGLength const startOffset = dynamic_cast<SPTextPath*>(tp)->startOffset; - double offset = 0.0; - if (startOffset._set) { - if (startOffset.unit == SVGLength::PERCENT) - offset = startOffset.computed * path->Length(); - else - offset = startOffset.computed; - } - int unused = 0; - Path::cut_position *cut_pos = path->CurvilignToPosition(1, &offset, unused); - Geom::Point midpoint; - Geom::Point tangent; - path->PointAndTangentAt(cut_pos[0].piece, cut_pos[0].t, midpoint, tangent); - xy = midpoint; - } else { - xy = bbox->min(); - xy *= tp->document->getDocumentScale().inverse(); // Convert to user-units. - } // make a list of textpath children std::vector<Inkscape::XML::Node *> tp_reprs; @@ -522,15 +497,27 @@ void sp_textpath_to_text(SPObject *tp) text->getRepr()->addChild(copy, nullptr); // fixme: copy id } + // set x/y on text (to be near where it was when on path) + // Copied from Layout::fitToPathAlign + Path *path = dynamic_cast<SPTextPath*>(tp)->originalPath; + SVGLength const startOffset = dynamic_cast<SPTextPath*>(tp)->startOffset; + double offset = 0.0; + if (startOffset._set) { + if (startOffset.unit == SVGLength::PERCENT) + offset = startOffset.computed * path->Length(); + else + offset = startOffset.computed; + } + int unused = 0; + Path::cut_position *cut_pos = path->CurvilignToPosition(1, &offset, unused); + Geom::Point midpoint; + Geom::Point tangent; + path->PointAndTangentAt(cut_pos[0].piece, cut_pos[0].t, midpoint, tangent); + sp_repr_set_svg_double(text->getRepr(), "x", midpoint[Geom::X]); + sp_repr_set_svg_double(text->getRepr(), "y", midpoint[Geom::Y]); + //remove textpath tp->deleteObject(); - - // set x/y on text (to be near where it was when on path) - /* fixme: Yuck, is this really the right test? */ - if (xy[Geom::X] != 1e18 && xy[Geom::Y] != 1e18) { - sp_repr_set_svg_double(text->getRepr(), "x", xy[Geom::X]); - sp_repr_set_svg_double(text->getRepr(), "y", xy[Geom::Y]); - } } |
