summaryrefslogtreecommitdiffstats
path: root/src/sp-item-group.cpp
diff options
context:
space:
mode:
authormathog <>2014-09-08 17:13:03 +0000
committermathog <>2014-09-08 17:13:03 +0000
commit71c3b0398381d4bace1427bbda11f486fcbcc307 (patch)
treeda5143086f2d7335ce1c8f9d1c9177603dde2304 /src/sp-item-group.cpp
parentTranslations. Italian translation update (75%) by Firas Hanife. (diff)
downloadinkscape-71c3b0398381d4bace1427bbda11f486fcbcc307.tar.gz
inkscape-71c3b0398381d4bace1427bbda11f486fcbcc307.zip
partial rollback of r13544, allow old recursive behavior for some locations, but not EMF import
(bzr r13549)
Diffstat (limited to 'src/sp-item-group.cpp')
-rw-r--r--src/sp-item-group.cpp49
1 files changed, 29 insertions, 20 deletions
diff --git a/src/sp-item-group.cpp b/src/sp-item-group.cpp
index 3d03edd85..5936cfbe5 100644
--- a/src/sp-item-group.cpp
+++ b/src/sp-item-group.cpp
@@ -644,32 +644,41 @@ void SPGroup::translateChildItems(Geom::Translate const &tr)
}
}
-// Recursively scale child items around a point
-void SPGroup::scaleChildItemsRec(Geom::Scale const &sc, Geom::Point const &p)
+// Recursively (or not) scale child items around a point
+void SPGroup::scaleChildItemsRec(Geom::Scale const &sc, Geom::Point const &p, bool noRecurse)
{
if ( hasChildren() ) {
for (SPObject *o = firstChild() ; o ; o = o->getNext() ) {
if ( SP_IS_ITEM(o) ) {
if (SP_IS_GROUP(o) && !SP_IS_BOX3D(o)) {
- // Doing it this way breaks clipping because transforms are applied
- // in coordinates for draws but nothing in defs is changed
- // SP_GROUP(o)->scaleChildItemsRec(sc, p);
- // instead change the transform on the entire group, and the transform
- // is applied after any references to clipping paths.
- SPItem *item = SP_ITEM(o);
- Geom::Translate const s(p);
- Geom::Affine final = s.inverse() * sc * s;
- Geom::Affine tAff = item->i2dt_affine() * final;
- item->set_i2d_affine(tAff);
- tAff = item->transform;
- // Eliminate common rounding error affecting EMF/WMF input.
- // When the rounding error persists it converts the simple
- // transform=scale() to transform=matrix().
- if(std::abs(tAff[4]) < 1.0e-5 && std::abs(tAff[5]) < 1.0e-5){
- tAff[4] = 0.0;
- tAff[5] = 0.0;
+ /* Using recursion breaks clipping because transforms are applied
+ in coordinates for draws but nothing in defs is changed
+ instead change the transform on the entire group, and the transform
+ is applied after any references to clipping paths. However NOT using
+ recursion apparently breaks as of r13544 other parts of Inkscape
+ involved with showing/modifying units. So offer both for use
+ in different contexts.
+ */
+ if(noRecurse) {
+ // used for EMF import
+ SPItem *item = SP_ITEM(o);
+ Geom::Translate const s(p);
+ Geom::Affine final = s.inverse() * sc * s;
+ Geom::Affine tAff = item->i2dt_affine() * final;
+ item->set_i2d_affine(tAff);
+ tAff = item->transform;
+ // Eliminate common rounding error affecting EMF/WMF input.
+ // When the rounding error persists it converts the simple
+ // transform=scale() to transform=matrix().
+ if(std::abs(tAff[4]) < 1.0e-5 && std::abs(tAff[5]) < 1.0e-5){
+ tAff[4] = 0.0;
+ tAff[5] = 0.0;
+ }
+ item->doWriteTransform(item->getRepr(), tAff, NULL, true);
+ } else {
+ // used for other import
+ SP_GROUP(o)->scaleChildItemsRec(sc, p, false);
}
- item->doWriteTransform(item->getRepr(), tAff, NULL, true);
} else {
SPItem *item = SP_ITEM(o);
Geom::OptRect bbox = item->desktopVisualBounds();