summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.com>2020-08-03 09:57:57 +0200
committerMiklos Vajna <vmiklos@collabora.com>2020-08-05 10:46:00 +0200
commit1d68ea619ca08264ec357e4388ac2da2b7473d2b (patch)
treeea7f5324306907a3f98c2460816f50b853347fd4
parentb193ca37569f0e916a9d827e8a78ebbba4577a5b (diff)
oox smartart, linear layout: fix scaling of spacing without rules
With this, finally the arrow shape has the correct horizontal position and width, even if the markup is as complex as the PowerPoint UI generates it (the previous version was a more minimal version). (cherry picked from commit 880673412143a7db7ea1bf4766040662dfc085dc) Change-Id: I59f237c582053067e890180a1ae40471e5f46dea Reviewed-on: https://gerrit.libreoffice.org/c/core/+/100113 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com> Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
-rw-r--r--oox/source/drawingml/diagram/diagramlayoutatoms.cxx46
-rw-r--r--sd/qa/unit/data/pptx/smartart-linear-rule.pptxbin43760 -> 43743 bytes
-rw-r--r--sd/qa/unit/import-tests-smartart.cxx5
3 files changed, 48 insertions, 3 deletions
diff --git a/oox/source/drawingml/diagram/diagramlayoutatoms.cxx b/oox/source/drawingml/diagram/diagramlayoutatoms.cxx
index fc1b58e24d27..e23226de61a8 100644
--- a/oox/source/drawingml/diagram/diagramlayoutatoms.cxx
+++ b/oox/source/drawingml/diagram/diagramlayoutatoms.cxx
@@ -964,6 +964,8 @@ void AlgAtom::layoutShape(const ShapePtr& rShape, const std::vector<Constraint>&
{
fCount -= 1.0;
+ bool bIsDependency = false;
+ double fFactor = 0;
for (const auto& rConstraint : rConstraints)
{
if (rConstraint.msForName != aCurrShape->getInternalName())
@@ -971,16 +973,25 @@ void AlgAtom::layoutShape(const ShapePtr& rShape, const std::vector<Constraint>&
continue;
}
- if (aChildrenToShrink.find(rConstraint.msRefForName) == aChildrenToShrink.end())
+ if ((nDir == XML_fromL || nDir == XML_fromR) && rConstraint.mnType != XML_w)
{
continue;
}
+ if ((nDir == XML_fromL || nDir == XML_fromR) && rConstraint.mnType == XML_w)
+ {
+ fFactor = rConstraint.mfFactor;
+ }
- if ((nDir == XML_fromL || nDir == XML_fromR) && rConstraint.mnType != XML_w)
+ if ((nDir == XML_fromT || nDir == XML_fromB) && rConstraint.mnType != XML_h)
{
continue;
}
- if ((nDir == XML_fromT || nDir == XML_fromB) && rConstraint.mnType != XML_h)
+ if ((nDir == XML_fromT || nDir == XML_fromB) && rConstraint.mnType == XML_h)
+ {
+ fFactor = rConstraint.mfFactor;
+ }
+
+ if (aChildrenToShrink.find(rConstraint.msRefForName) == aChildrenToShrink.end())
{
continue;
}
@@ -989,8 +1000,29 @@ void AlgAtom::layoutShape(const ShapePtr& rShape, const std::vector<Constraint>&
// other child which will be scaled.
fCount += rConstraint.mfFactor;
aChildrenToShrinkDeps.insert(aCurrShape->getInternalName());
+ bIsDependency = true;
break;
}
+
+ if (!bIsDependency && aCurrShape->getServiceName() == "com.sun.star.drawing.GroupShape")
+ {
+ bool bScaleDownEmptySpacing = false;
+ if (nDir == XML_fromL || nDir == XML_fromR)
+ {
+ oox::OptValue<sal_Int32> oWidth = findProperty(aProperties, aCurrShape->getInternalName(), XML_w);
+ bScaleDownEmptySpacing = oWidth.has() && oWidth.get() > 0;
+ }
+ if (!bScaleDownEmptySpacing && (nDir == XML_fromT || nDir == XML_fromB))
+ {
+ oox::OptValue<sal_Int32> oHeight = findProperty(aProperties, aCurrShape->getInternalName(), XML_h);
+ bScaleDownEmptySpacing = oHeight.has() && oHeight.get() > 0;
+ }
+ if (bScaleDownEmptySpacing && aCurrShape->getChildren().empty())
+ {
+ fCount += fFactor;
+ aChildrenToShrinkDeps.insert(aCurrShape->getInternalName());
+ }
+ }
}
}
}
@@ -1084,6 +1116,14 @@ void AlgAtom::layoutShape(const ShapePtr& rShape, const std::vector<Constraint>&
aCurrPos.Y = (rShape->getSize().Height - aSize.Height) / 2;
if (nIncY)
aCurrPos.X = (rShape->getSize().Width - aSize.Width) / 2;
+ if (aCurrPos.X < 0)
+ {
+ aCurrPos.X = 0;
+ }
+ if (aCurrPos.Y < 0)
+ {
+ aCurrPos.Y = 0;
+ }
aCurrShape->setPosition(aCurrPos);
diff --git a/sd/qa/unit/data/pptx/smartart-linear-rule.pptx b/sd/qa/unit/data/pptx/smartart-linear-rule.pptx
index e76dfd9ee770..05905299ed27 100644
--- a/sd/qa/unit/data/pptx/smartart-linear-rule.pptx
+++ b/sd/qa/unit/data/pptx/smartart-linear-rule.pptx
Binary files differ
diff --git a/sd/qa/unit/import-tests-smartart.cxx b/sd/qa/unit/import-tests-smartart.cxx
index b64f7f997412..7e5dd78b8b44 100644
--- a/sd/qa/unit/import-tests-smartart.cxx
+++ b/sd/qa/unit/import-tests-smartart.cxx
@@ -1511,6 +1511,11 @@ void SdImportTestSmartArt::testLinearRule()
// - Expected: 3160
// - Actual : 8770
// i.e. there was unexpected spacing on the left of the arrow.
+ // Then the imporoved version of the test document failed with:
+ // - Expected: 3160
+ // - Actual : 19828
+ // i.e. the spacing on the left of the arrow was so large that the shape was mostly outside the
+ // slide.
sal_Int32 nGroupLeft = xGroup->getPosition().X;
sal_Int32 nArrowLeft = xShape->getPosition().X;
CPPUNIT_ASSERT_EQUAL(nGroupLeft, nArrowLeft);