From 282e965e030e7a1e9ae3455f877f7e8f8e1ea8dd Mon Sep 17 00:00:00 2001 From: Matthew Petroff Date: Tue, 10 Sep 2013 23:50:49 -0400 Subject: Fix document unit change for 3d boxes and (mostly) for text on path. (bzr r12475.1.12) --- src/sp-item-group.cpp | 43 ++++++++++++++++++++++++++++++++++--------- src/sp-text.cpp | 11 +++++++++-- src/sp-text.h | 7 +++++++ 3 files changed, 50 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/sp-item-group.cpp b/src/sp-item-group.cpp index 1b3a53828..ec368bbac 100644 --- a/src/sp-item-group.cpp +++ b/src/sp-item-group.cpp @@ -52,6 +52,7 @@ #include "verbs.h" #include "layer-model.h" #include "selection-chemistry.h" +#include "sp-textpath.h" using Inkscape::DocumentUndo; @@ -569,22 +570,46 @@ void SPGroup::scaleChildItemsRec(Geom::Scale const &sc, Geom::Point const &p) if ( hasChildren() ) { for (SPObject *o = firstChild() ; o ; o = o->getNext() ) { if ( SP_IS_ITEM(o) ) { - if (SP_IS_GROUP(o)) { + if (SP_IS_GROUP(o) && !SP_IS_BOX3D(o)) { SP_GROUP(o)->scaleChildItemsRec(sc, p); } else { - SPItem *item = reinterpret_cast(o); + SPItem *item = SP_ITEM(o); Geom::OptRect bbox = item->desktopVisualBounds(); if (bbox) { - // Clear selection (TODO: save and restore selection) - sp_desktop_selection(SP_ACTIVE_DESKTOP)->clear(); - // Scale item Geom::Translate const s(p); Geom::Affine final = s.inverse() * sc * s; - Inkscape::LayerModel layers = Inkscape::LayerModel(); - Inkscape::Selection selection(&layers, SP_ACTIVE_DESKTOP); - selection.add(item); - sp_selection_apply_affine(&selection, final, true, true); + + Geom::Point old_center(0,0); + if (item->isCenterSet()) { + old_center = item->getCenter(); + } + + if (SP_IS_TEXT_TEXTPATH(item) && item->transform.isIdentity()) { + if (item->transform.isIdentity()) { + SP_TEXT(item)->optimizeTextpathText(); + } else { + // TODO: transformed text on textpath + } + } + + if (SP_IS_BOX3D(item)) { + // Force recalculation from perspective + box3d_position_set(SP_BOX3D(item)); + } else if (SP_IS_USE(item)) { + // calculate the matrix we need to apply to the clone + // to cancel its induced transform from its original + Geom::Affine move = final.inverse() * item->transform * final; + item->doWriteTransform(item->getRepr(), move, &move, true); + } else { + item->set_i2d_affine(item->i2dt_affine() * final); + item->doWriteTransform(item->getRepr(), item->transform, NULL, true); + } + + if (item->isCenterSet() && !(final.isTranslation() || final.isIdentity())) { + item->setCenter(old_center * final); + item->updateRepr(); + } } } } diff --git a/src/sp-text.cpp b/src/sp-text.cpp index 2e2bf15bc..05a1827fe 100644 --- a/src/sp-text.cpp +++ b/src/sp-text.cpp @@ -109,6 +109,8 @@ sp_text_init (SPText *text) { new (&text->layout) Inkscape::Text::Layout; new (&text->attributes) TextTagAttributes; + + text->_optimizeTextpathText = false; } static void @@ -427,8 +429,13 @@ sp_text_set_transform (SPItem *item, Geom::Affine const &xform) SPText *text = SP_TEXT(item); // we cannot optimize textpath because changing its fontsize will break its match to the path - if (SP_IS_TEXT_TEXTPATH (text)) - return xform; + if (SP_IS_TEXT_TEXTPATH (text)) { + if (!text->_optimizeTextpathText) { + return xform; + } else { + text->_optimizeTextpathText = false; + } + } /* This function takes care of scaling & translation only, we return whatever parts we can't handle. */ diff --git a/src/sp-text.h b/src/sp-text.h index 457f11f06..aa80c18b2 100644 --- a/src/sp-text.h +++ b/src/sp-text.h @@ -59,6 +59,8 @@ struct SPText : public SPItem { /** discards the drawing objects representing this text. */ void _clearFlow(Inkscape::DrawingGroup *in_arena); + bool _optimizeTextpathText; + private: /** Recursively walks the xml tree adding tags and their contents. The non-trivial code does two things: firstly, it manages the positioning @@ -66,6 +68,11 @@ private: breaks and makes sure both that they are assigned the correct SPObject and that we don't get a spurious extra one at the end of the flow. */ unsigned _buildLayoutInput(SPObject *root, Inkscape::Text::Layout::OptionalTextTagAttrs const &parent_optional_attrs, unsigned parent_attrs_offset, bool in_textpath); + +public: + /** Optimize textpath text on next set_transform. */ + void optimizeTextpathText() + {_optimizeTextpathText = true;} }; struct SPTextClass { -- cgit v1.2.3