X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fsp-text.cpp;h=0390df6bfa7901646c55470a47dda7a8c1f6b18c;hb=9e973c4fb2183b877bb600a7e9c75e93b3e7d6d1;hp=c9811ec6e18420d291de0efbd875a55beaadf6ef;hpb=36a048753a41b465ae130b361fb3b68c605e3e86;p=inkscape.git diff --git a/src/sp-text.cpp b/src/sp-text.cpp index c9811ec6e..0390df6bf 100644 --- a/src/sp-text.cpp +++ b/src/sp-text.cpp @@ -46,6 +46,7 @@ #include "mod360.h" #include "sp-textpath.h" +#include "sp-tref.h" #include "sp-tspan.h" #include "text-editing.h" @@ -64,7 +65,7 @@ static void sp_text_child_added (SPObject *object, Inkscape::XML::Node *rch, Ink static void sp_text_remove_child (SPObject *object, Inkscape::XML::Node *rch); static void sp_text_update (SPObject *object, SPCtx *ctx, guint flags); static void sp_text_modified (SPObject *object, guint flags); -static Inkscape::XML::Node *sp_text_write (SPObject *object, Inkscape::XML::Node *repr, guint flags); +static Inkscape::XML::Node *sp_text_write (SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags); static void sp_text_bbox(SPItem const *item, NRRect *bbox, NR::Matrix const &transform, unsigned const flags); static NRArenaItem *sp_text_show (SPItem *item, NRArena *arena, unsigned key, unsigned flags); @@ -193,7 +194,7 @@ sp_text_child_added (SPObject *object, Inkscape::XML::Node *rch, Inkscape::XML:: if (((SPObjectClass *) text_parent_class)->child_added) ((SPObjectClass *) text_parent_class)->child_added (object, rch, ref); - text->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG | SP_TEXT_CONTENT_MODIFIED_FLAG); + text->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG | SP_TEXT_CONTENT_MODIFIED_FLAG | SP_TEXT_LAYOUT_MODIFIED_FLAG); } static void @@ -248,6 +249,7 @@ sp_text_update (SPObject *object, SPCtx *ctx, guint flags) sp_item_invoke_bbox(text, &paintbox, NR::identity(), TRUE); for (SPItemView* v = text->display; v != NULL; v = v->next) { text->_clearFlow(NR_ARENA_GROUP(v->arenaitem)); + nr_arena_group_set_style(NR_ARENA_GROUP(v->arenaitem), SP_OBJECT_STYLE(object)); // pass the bbox of the text object as paintbox (used for paintserver fills) text->layout.show(NR_ARENA_GROUP(v->arenaitem), &paintbox); } @@ -273,6 +275,7 @@ sp_text_modified (SPObject *object, guint flags) sp_item_invoke_bbox(text, &paintbox, NR::identity(), TRUE); for (SPItemView* v = text->display; v != NULL; v = v->next) { text->_clearFlow(NR_ARENA_GROUP(v->arenaitem)); + nr_arena_group_set_style(NR_ARENA_GROUP(v->arenaitem), SP_OBJECT_STYLE(object)); text->layout.show(NR_ARENA_GROUP(v->arenaitem), &paintbox); } } @@ -296,20 +299,20 @@ sp_text_modified (SPObject *object, guint flags) } static Inkscape::XML::Node * -sp_text_write (SPObject *object, Inkscape::XML::Node *repr, guint flags) +sp_text_write (SPObject *object, Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags) { SPText *text = SP_TEXT (object); if (flags & SP_OBJECT_WRITE_BUILD) { if (!repr) - repr = sp_repr_new ("svg:text"); + repr = xml_doc->createElement("svg:text"); GSList *l = NULL; for (SPObject *child = sp_object_first_child(object) ; child != NULL ; child = SP_OBJECT_NEXT(child) ) { Inkscape::XML::Node *crepr = NULL; if (SP_IS_STRING(child)) { - crepr = sp_repr_new_text(SP_STRING(child)->string.c_str()); + crepr = xml_doc->createTextNode(SP_STRING(child)->string.c_str()); } else { - crepr = child->updateRepr(NULL, flags); + crepr = child->updateRepr(xml_doc, NULL, flags); } if (crepr) l = g_slist_prepend (l, crepr); } @@ -340,7 +343,7 @@ sp_text_write (SPObject *object, Inkscape::XML::Node *repr, guint flags) SP_OBJECT_REPR(text)->setAttribute("sodipodi:linespacing", NULL); if (((SPObjectClass *) (text_parent_class))->write) - ((SPObjectClass *) (text_parent_class))->write (object, repr, flags); + ((SPObjectClass *) (text_parent_class))->write (object, xml_doc, repr, flags); return repr; } @@ -352,7 +355,7 @@ sp_text_bbox(SPItem const *item, NRRect *bbox, NR::Matrix const &transform, unsi // Add stroke width SPStyle* style=SP_OBJECT_STYLE (item); - if (style->stroke.type != SP_PAINT_TYPE_NONE) { + if (!style->stroke.isNone()) { double const scale = expansion(transform); if ( fabs(style->stroke_width.computed * scale) > 0.01 ) { // sinon c'est 0=oon veut pas de bord double const width = MAX(0.125, style->stroke_width.computed * scale); @@ -398,8 +401,8 @@ sp_text_description(SPItem *item) SPText *text = (SPText *) item; SPStyle *style = SP_OBJECT_STYLE(text); - font_instance *tf = (font_factory::Default())->Face(style->text->font_family.value, - font_style_to_pos(*style)); + font_instance *tf = font_factory::Default()->FaceFromStyle(style); + char name_buf[256]; char *n; if (tf) { @@ -425,7 +428,7 @@ static void sp_text_snappoints(SPItem const *item, SnapPointsIter p) // the baseline anchor of the first char Inkscape::Text::Layout const *layout = te_get_layout((SPItem *) item); if(layout != NULL) { - *p = layout->characterAnchorPoint(layout->begin()) * sp_item_i2d_affine(item); + *p = layout->characterAnchorPoint(layout->begin()) * from_2geom(sp_item_i2d_affine(item)); } } @@ -490,7 +493,7 @@ sp_text_print (SPItem *item, SPPrintContext *ctx) dbox.y0 = 0.0; dbox.x1 = sp_document_width (SP_OBJECT_DOCUMENT (item)); dbox.y1 = sp_document_height (SP_OBJECT_DOCUMENT (item)); - NR::Matrix const ctm = sp_item_i2d_affine(item); + NR::Matrix const ctm = from_2geom(sp_item_i2d_affine(item)); group->layout.print(ctx,&pbox,&dbox,&bbox,ctm); } @@ -513,6 +516,9 @@ unsigned SPText::_buildLayoutInput(SPObject *root, Inkscape::Text::Layout::Optio 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); } + else if (SP_IS_TREF(root)) { + SP_TREF(root)->attributes.mergeInto(&optional_attrs, parent_optional_attrs, parent_attrs_offset, true, true); + } else if (SP_IS_TEXTPATH(root)) { in_textpath = true; SP_TEXTPATH(root)->attributes.mergeInto(&optional_attrs, parent_optional_attrs, parent_attrs_offset, false, true); @@ -547,7 +553,7 @@ unsigned SPText::_buildLayoutInput(SPObject *root, Inkscape::Text::Layout::Optio Glib::ustring const &string = SP_STRING(child)->string; layout.appendText(string, root->style, child, &optional_attrs, child_attrs_offset + length); length += string.length(); - } else { + } else if (!sp_repr_is_meta_element(child->repr)) { length += _buildLayoutInput(child, optional_attrs, child_attrs_offset + length, in_textpath); } } @@ -580,8 +586,7 @@ void SPText::rebuildLayout() if (!tspan->attributes.singleXYCoordinates()) continue; Inkscape::Text::Layout::iterator iter = layout.sourceToIterator(tspan); NR::Point anchor_point = layout.chunkAnchorPoint(iter); - sp_repr_set_svg_double(SP_OBJECT_REPR(tspan), "x", anchor_point[NR::X]); - sp_repr_set_svg_double(SP_OBJECT_REPR(tspan), "y", anchor_point[NR::Y]); + tspan->attributes.setFirstXY(anchor_point); } } @@ -616,6 +621,9 @@ void SPText::_adjustCoordsRecursive(SPItem *item, NR::Matrix const &m, double ex SP_TEXT(item)->attributes.transform(m, ex, ex, is_root); else if (SP_IS_TEXTPATH(item)) SP_TEXTPATH(item)->attributes.transform(m, ex, ex, is_root); + else if (SP_IS_TREF(item)) { + SP_TREF(item)->attributes.transform(m, ex, ex, is_root); + } for (SPObject *o = item->children; o != NULL; o = o->next) { if (SP_IS_ITEM(o)) @@ -715,6 +723,19 @@ NR::Point TextTagAttributes::firstXY() const return point; } +void TextTagAttributes::setFirstXY(NR::Point &point) +{ + SVGLength zero_length; + zero_length = 0.0; + + if (attributes.x.empty()) + attributes.x.resize(1, zero_length); + if (attributes.y.empty()) + attributes.y.resize(1, zero_length); + attributes.x[0].computed = point[NR::X]; + attributes.y[0].computed = point[NR::Y]; +} + void TextTagAttributes::mergeInto(Inkscape::Text::Layout::OptionalTextTagAttrs *output, Inkscape::Text::Layout::OptionalTextTagAttrs const &parent_attrs, unsigned parent_attrs_offset, bool copy_xy, bool copy_dxdyrotate) const { mergeSingleAttribute(&output->x, parent_attrs.x, parent_attrs_offset, copy_xy ? &attributes.x : NULL); @@ -726,11 +747,14 @@ void TextTagAttributes::mergeInto(Inkscape::Text::Layout::OptionalTextTagAttrs * void TextTagAttributes::mergeSingleAttribute(std::vector *output_list, std::vector const &parent_list, unsigned parent_offset, std::vector const *overlay_list) { + output_list->clear(); if (overlay_list == NULL) { - output_list->resize(std::max(0, (int)parent_list.size() - (int)parent_offset)); - std::copy(parent_list.begin() + parent_offset, parent_list.end(), output_list->begin()); + if (parent_list.size() > parent_offset) + { + output_list->reserve(parent_list.size() - parent_offset); + std::copy(parent_list.begin() + parent_offset, parent_list.end(), std::back_inserter(*output_list)); + } } else { - output_list->clear(); output_list->reserve(std::max((int)parent_list.size() - (int)parent_offset, (int)overlay_list->size())); unsigned overlay_offset = 0; while (parent_offset < parent_list.size() || overlay_offset < overlay_list->size()) {