summaryrefslogtreecommitdiffstats
path: root/src/object/sp-tspan.cpp
diff options
context:
space:
mode:
authorNathan Lee <2431820-nathanal@users.noreply.gitlab.com>2019-06-03 13:54:15 +0000
committerNathan Lee <2431820-nathanal@users.noreply.gitlab.com>2019-06-03 14:08:16 +0000
commit91dc0a4a88c4379971252de5cec319b5f5ad1b5e (patch)
tree4dd525e8f126d9e481e2a761b1d31f367c836a40 /src/object/sp-tspan.cpp
parentCrashfix deleting path with invisible text on path (diff)
downloadinkscape-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.cpp51
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]);
- }
}