diff --git a/src/object/sp-tspan.cpp b/src/object/sp-tspan.cpp index 7a0db5687de2bd8f4e13dabf3fcdc06193630c65..1649367d313a1b9a57cf1f37ccb34500a4e04e22 100644 --- a/src/object/sp-tspan.cpp +++ b/src/object/sp-tspan.cpp @@ -480,15 +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()); - - if (!bbox) { - return; - } - - Geom::Point xy = bbox->min(); - xy *= tp->document->getDocumentScale().inverse(); // Convert to user-units. // make a list of textpath children std::vector tp_reprs; @@ -506,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(tp)->originalPath; + SVGLength const startOffset = dynamic_cast(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]); - } }