X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fsp-tspan.cpp;h=3b5780721dda18940d5f295947f3eee01b4b6dd1;hb=ac2da9791491d91d5552e1c7ff67a8c4292bff9b;hp=8ec7af1500c2e4d4e40194399c7356e581b94719;hpb=6b15695578f07a3f72c4c9475c1a261a3021472a;p=inkscape.git diff --git a/src/sp-tspan.cpp b/src/sp-tspan.cpp index 8ec7af150..3b5780721 100644 --- a/src/sp-tspan.cpp +++ b/src/sp-tspan.cpp @@ -33,6 +33,9 @@ #include "sp-use-reference.h" #include "sp-tspan.h" #include "sp-textpath.h" +#include "text-editing.h" +#include "style.h" +#include "libnr/nr-matrix-fns.h" #include "xml/repr.h" @@ -48,6 +51,7 @@ static void sp_tspan_release(SPObject *object); static void sp_tspan_set(SPObject *object, unsigned key, gchar const *value); static void sp_tspan_update(SPObject *object, SPCtx *ctx, guint flags); static void sp_tspan_modified(SPObject *object, unsigned flags); +static void sp_tspan_bbox(SPItem const *item, NRRect *bbox, NR::Matrix const &transform, unsigned const flags); static Inkscape::XML::Node *sp_tspan_write(SPObject *object, Inkscape::XML::Node *repr, guint flags); static SPItemClass *tspan_parent_class; @@ -94,6 +98,8 @@ sp_tspan_class_init(SPTSpanClass *classname) sp_object_class->update = sp_tspan_update; sp_object_class->modified = sp_tspan_modified; sp_object_class->write = sp_tspan_write; + + item_class->bbox = sp_tspan_bbox; } static void @@ -190,6 +196,32 @@ sp_tspan_modified(SPObject *object, unsigned flags) } } +static void sp_tspan_bbox(SPItem const *item, NRRect *bbox, NR::Matrix const &transform, unsigned const flags) +{ + // find out the ancestor text which holds our layout + SPObject *parent_text = SP_OBJECT(item); + for (; parent_text != NULL && !SP_IS_TEXT(parent_text); parent_text = SP_OBJECT_PARENT (parent_text)); + if (parent_text == NULL) return; + + // get the bbox of our portion of the layout + SP_TEXT(parent_text)->layout.getBoundingBox(bbox, transform, sp_text_get_length_upto(parent_text, item), sp_text_get_length_upto(item, NULL) - 1); + + // Add stroke width + SPStyle* style=SP_OBJECT_STYLE (item); + if (style->stroke.type != SP_PAINT_TYPE_NONE) { + 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); + if ( fabs(bbox->x1 - bbox->x0) > -0.00001 && fabs(bbox->y1 - bbox->y0) > -0.00001 ) { + bbox->x0-=0.5*width; + bbox->x1+=0.5*width; + bbox->y0-=0.5*width; + bbox->y1+=0.5*width; + } + } + } +} + static Inkscape::XML::Node * sp_tspan_write(SPObject *object, Inkscape::XML::Node *repr, guint flags) { @@ -421,7 +453,7 @@ void refresh_textpath_source(SPTextPath* tp) tp->sourcePath->sourceDirty=false; // finalisons - if ( tp->sourcePath->originalPath ) { + if ( tp->sourcePath->originalPath ) { if (tp->originalPath) { delete tp->originalPath; } @@ -542,7 +574,7 @@ sp_textpath_to_text(SPObject *tp) // make a copy of each textpath child Inkscape::XML::Node *copy = ((Inkscape::XML::Node *) i->data)->duplicate(); // remove the old repr from under textpath - SP_OBJECT_REPR(tp)->removeChild((Inkscape::XML::Node *) i->data); + SP_OBJECT_REPR(tp)->removeChild((Inkscape::XML::Node *) i->data); // put its copy into under textPath SP_OBJECT_REPR(text)->addChild(copy, NULL); // fixme: copy id } @@ -551,7 +583,7 @@ sp_textpath_to_text(SPObject *tp) tp->deleteObject(); g_slist_free(tp_reprs); - // set x/y on text + // set x/y on text /* fixme: Yuck, is this really the right test? */ if (xy[NR::X] != 1e18 && xy[NR::Y] != 1e18) { sp_repr_set_svg_double(SP_OBJECT_REPR(text), "x", xy[NR::X]);