diff options
author | Miklos Vajna <vmiklos@collabora.com> | 2021-01-19 16:59:38 +0100 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.com> | 2021-01-20 14:57:24 +0100 |
commit | 51b0a654b2c75c7b4e42763603a4e23c25317dc5 (patch) | |
tree | 12f9bd08450c8f150273635393c1c0117bc3adaf /oox | |
parent | 6845a140ad6fb6640f9209e34cf7aa0865b8aea6 (diff) |
oox smartart: composite algo: handle right constraint when left+width is given
The bugdoc had this constraint:
<dgm:constr type="l" for="ch" forName="text" refType="r" refFor="ch" refForName="img"/>
While img has no "r", it has:
<dgm:constr type="w" for="ch" forName="img" refType="w" refFor="ch" refForName="box" fact="0.2"/>
<dgm:constr type="l" for="ch" forName="img" refType="h" refFor="ch" refForName="box" fact="0.1"/>
Which is enough to fix the x position of the text to not overlap with
img.
(cherry picked from commit 1359e8c566970fcef860f7ba7f54a07d8e6e0513)
Change-Id: I80db290bd1695884ffb7b1eabaffa09462e8883d
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/109703
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com>
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
Diffstat (limited to 'oox')
-rw-r--r-- | oox/source/drawingml/diagram/diagramlayoutatoms.cxx | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/oox/source/drawingml/diagram/diagramlayoutatoms.cxx b/oox/source/drawingml/diagram/diagramlayoutatoms.cxx index 6e9626c2f9fe..410b2c9e677e 100644 --- a/oox/source/drawingml/diagram/diagramlayoutatoms.cxx +++ b/oox/source/drawingml/diagram/diagramlayoutatoms.cxx @@ -821,6 +821,37 @@ sal_Int32 AlgAtom::getVerticalShapesCount(const ShapePtr& rShape) namespace { /** + * Decides if a certain reference type (e.g. "right") can be inferred from the available properties + * in rMap (e.g. left and width). Returns true if rValue is written to. + */ +bool InferFromLayoutProperty(const LayoutProperty& rMap, sal_Int32 nRefType, sal_Int32& rValue) +{ + switch (nRefType) + { + case XML_r: + { + auto it = rMap.find(XML_l); + if (it == rMap.end()) + { + return false; + } + sal_Int32 nLeft = it->second; + it = rMap.find(XML_w); + if (it == rMap.end()) + { + return false; + } + rValue = nLeft + it->second; + return true; + } + default: + break; + } + + return false; +} + +/** * Apply rConstraint to the rProperties shared layout state. * * Note that the order in which constraints are applied matters, given that constraints can refer to @@ -840,11 +871,22 @@ void ApplyConstraintToLayout(const Constraint& rConstraint, LayoutPropertyMap& r return; const LayoutProperty::const_iterator aRefType = aRef->second.find(rConstraint.mnRefType); + sal_Int32 nInferredValue = 0; if (aRefType != aRef->second.end()) + { + // Reference is found directly. rProperties[rConstraint.msForName][rConstraint.mnType] = aRefType->second * rConstraint.mfFactor; + } + else if (InferFromLayoutProperty(aRef->second, rConstraint.mnRefType, nInferredValue)) + { + // Reference can be inferred. + rProperties[rConstraint.msForName][rConstraint.mnType] + = nInferredValue * rConstraint.mfFactor; + } else { + // Reference not found, assume a fixed value. // Values are never in EMU, while oox::drawingml::Shape position and size are always in // EMU. double fUnitFactor = 0; |