diff --git a/src/sp-text.cpp b/src/sp-text.cpp
index 9266297bef3772cb622d0612f58fcbb97e5a7df9..4b896db9cd980ad8d90d8f6a4408bb1e2165b618 100644 (file)
--- a/src/sp-text.cpp
+++ b/src/sp-text.cpp
static NRArenaItem *sp_text_show (SPItem *item, NRArena *arena, unsigned key, unsigned flags);
static void sp_text_hide (SPItem *item, unsigned key);
static char *sp_text_description (SPItem *item);
-static void sp_text_snappoints(SPItem const *item, SnapPointsIter p, Inkscape::SnapPreferences const *snapprefs);
+static void sp_text_snappoints(SPItem const *item, std::vector<Inkscape::SnapCandidatePoint> &p, Inkscape::SnapPreferences const *snapprefs);
static Geom::Matrix sp_text_set_transform(SPItem *item, Geom::Matrix const &xform);
static void sp_text_print (SPItem *item, SPPrintContext *gpc);
SPStyle *style = SP_OBJECT_STYLE(text);
font_instance *tf = font_factory::Default()->FaceFromStyle(style);
-
+
char name_buf[256];
char *n;
if (tf) {
GString *xs = SP_PX_TO_METRIC_STRING(style->font_size.computed, sp_desktop_namedview(SP_ACTIVE_DESKTOP)->getDefaultMetric());
+ char const *trunc = "";
+ Inkscape::Text::Layout const *layout = te_get_layout((SPItem *) item);
+ if (layout && layout->inputTruncated()) {
+ trunc = _(" [truncated]");
+ }
+
char *ret = ( SP_IS_TEXT_TEXTPATH(item)
- ? g_strdup_printf(_("<b>Text on path</b> (%s, %s)"), n, xs->str)
- : g_strdup_printf(_("<b>Text</b> (%s, %s)"), n, xs->str) );
+ ? g_strdup_printf(_("<b>Text on path</b>%s (%s, %s)"), trunc, n, xs->str)
+ : g_strdup_printf(_("<b>Text</b>%s (%s, %s)"), trunc, n, xs->str) );
g_free(n);
return ret;
}
-static void sp_text_snappoints(SPItem const *item, SnapPointsIter p, Inkscape::SnapPreferences const *snapprefs)
+static void sp_text_snappoints(SPItem const *item, std::vector<Inkscape::SnapCandidatePoint> &p, Inkscape::SnapPreferences const */*snapprefs*/)
{
- // the baseline anchor of the first char
+ // Choose a point on the baseline for snapping from or to, with the horizontal position
+ // of this point depending on the text alignment (left vs. right)
Inkscape::Text::Layout const *layout = te_get_layout((SPItem *) item);
- if(layout != NULL) {
- *p = layout->characterAnchorPoint(layout->begin()) * sp_item_i2d_affine(item);
+ if (layout != NULL && layout->outputExists()) {
+ boost::optional<Geom::Point> pt = layout->baselineAnchorPoint();
+ if (pt) {
+ p.push_back(Inkscape::SnapCandidatePoint((*pt) * sp_item_i2d_affine(item), Inkscape::SNAPSOURCE_TEXT_BASELINE, Inkscape::SNAPTARGET_TEXT_BASELINE));
+ }
}
}
@@ -518,6 +528,8 @@ unsigned SPText::_buildLayoutInput(SPObject *root, Inkscape::Text::Layout::Optio
}
else if (SP_IS_TSPAN(root)) {
SPTSpan *tspan = SP_TSPAN(root);
+ // x, y attributes are stripped from some tspans marked with role="line" as we do our own line layout.
+ // This should be checked carefully, as it can undo line layout in imported SVG files.
bool use_xy = !in_textpath && (tspan->role == SP_TSPAN_ROLE_UNSPECIFIED || !tspan->attributes.singleXYCoordinates());
tspan->attributes.mergeInto(&optional_attrs, parent_optional_attrs, parent_attrs_offset, use_xy, true);
}
if (style && !NR_DF_TEST_CLOSE (ex, 1.0, NR_EPSILON)) {
if (!style->font_size.set && is_root) {
style->font_size.set = 1;
- style->font_size.type = SP_FONT_SIZE_LENGTH;
}
+ style->font_size.type = SP_FONT_SIZE_LENGTH;
style->font_size.computed *= ex;
style->letter_spacing.computed *= ex;
style->word_spacing.computed *= ex;
@@ -916,6 +928,50 @@ void TextTagAttributes::transform(Geom::Matrix const &matrix, double scale_x, do
*it = it->computed * scale_y;
}
+double TextTagAttributes::getDx(unsigned index)
+{
+ if( attributes.dx.size() == 0 ) {
+ return 0.0;
+ }
+ if( index < attributes.dx.size() ) {
+ return attributes.dx[index].computed;
+ } else {
+ return 0.0; // attributes.dx.back().computed;
+ }
+}
+
+
+double TextTagAttributes::getDy(unsigned index)
+{
+ if( attributes.dy.size() == 0 ) {
+ return 0.0;
+ }
+ if( index < attributes.dy.size() ) {
+ return attributes.dy[index].computed;
+ } else {
+ return 0.0; // attributes.dy.back().computed;
+ }
+}
+
+
+void TextTagAttributes::addToDx(unsigned index, double delta)
+{
+ SVGLength zero_length;
+ zero_length = 0.0;
+
+ if (attributes.dx.size() < index + 1) attributes.dx.resize(index + 1, zero_length);
+ attributes.dx[index] = attributes.dx[index].computed + delta;
+}
+
+void TextTagAttributes::addToDy(unsigned index, double delta)
+{
+ SVGLength zero_length;
+ zero_length = 0.0;
+
+ if (attributes.dy.size() < index + 1) attributes.dy.resize(index + 1, zero_length);
+ attributes.dy[index] = attributes.dy[index].computed + delta;
+}
+
void TextTagAttributes::addToDxDy(unsigned index, Geom::Point const &adjust)
{
SVGLength zero_length;
}
}
+double TextTagAttributes::getRotate(unsigned index)
+{
+ if( attributes.rotate.size() == 0 ) {
+ return 0.0;
+ }
+ if( index < attributes.rotate.size() ) {
+ return attributes.rotate[index].computed;
+ } else {
+ return attributes.rotate.back().computed;
+ }
+}
+
+
void TextTagAttributes::addToRotate(unsigned index, double delta)
{
SVGLength zero_length;
zero_length = 0.0;
- if (attributes.rotate.size() < index + 1) {
+ if (attributes.rotate.size() < index + 2) {
if (attributes.rotate.empty())
- attributes.rotate.resize(index + 1, zero_length);
+ attributes.rotate.resize(index + 2, zero_length);
else
- attributes.rotate.resize(index + 1, attributes.rotate.back());
+ attributes.rotate.resize(index + 2, attributes.rotate.back());
}
attributes.rotate[index] = mod360(attributes.rotate[index].computed + delta);
}
+void TextTagAttributes::setRotate(unsigned index, double angle)
+{
+ SVGLength zero_length;
+ zero_length = 0.0;
+
+ if (attributes.rotate.size() < index + 2) {
+ if (attributes.rotate.empty())
+ attributes.rotate.resize(index + 2, zero_length);
+ else
+ attributes.rotate.resize(index + 2, attributes.rotate.back());
+ }
+ attributes.rotate[index] = mod360(angle);
+}
+
+
/*
Local Variables:
mode:c++
fill-column:99
End:
*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :