diff options
author | Miklos Vajna <vmiklos@collabora.co.uk> | 2016-09-20 09:13:21 +0200 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2016-09-21 09:31:45 +0000 |
commit | b29110c74188b8245403bdc7e32dc9e65edb09e6 (patch) | |
tree | 9a455f94fc97450798ec6cad3ee945477a8bd70a /writerfilter | |
parent | c7a18b2edcaeca80bac512d3018ed9cae1eb0caf (diff) |
tdf#84684 RTF import: fix ZOrder of child shapes inside group shape
Both ODF and OOXML's drawingML seem to just not write ZOrder for child
shapes (instead they just describe them in a bottom-up order), but RTF
does use dhgt, it seems. Given that ZOrder has different meaning inside
and outside a group shape use a stack of GraphicZOrderHelpers to get the
correct result.
Change-Id: I68dbd9f0ae59a1759da14bf414dc1d277d1c927d
(cherry picked from commit 5edebdf67720ac0867b088400e2b31806138dc25)
Reviewed-on: https://gerrit.libreoffice.org/29091
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'writerfilter')
-rw-r--r-- | writerfilter/source/dmapper/GraphicHelpers.cxx | 2 | ||||
-rw-r--r-- | writerfilter/source/rtftok/rtfsdrimport.cxx | 19 | ||||
-rw-r--r-- | writerfilter/source/rtftok/rtfsdrimport.hxx | 2 |
3 files changed, 18 insertions, 5 deletions
diff --git a/writerfilter/source/dmapper/GraphicHelpers.cxx b/writerfilter/source/dmapper/GraphicHelpers.cxx index 3d410b2e809a..0dccda708970 100644 --- a/writerfilter/source/dmapper/GraphicHelpers.cxx +++ b/writerfilter/source/dmapper/GraphicHelpers.cxx @@ -261,7 +261,7 @@ sal_Int32 GraphicZOrderHelper::findZOrder( sal_Int32 relativeHeight, bool bOldSt // std::map is iterated sorted by key // Old-style ordering differs in what should happen when there is already an item with the same z-order: - // we belong under it in case of new-style, but we belong below it in case of old-style. + // we belong under it in case of new-style, but we belong above it in case of old-style. bool bCond = bOldStyle ? (it->first > relativeHeight) : (it->first >= relativeHeight); if( bCond ) diff --git a/writerfilter/source/rtftok/rtfsdrimport.cxx b/writerfilter/source/rtftok/rtfsdrimport.cxx index b3517b8590e4..4a4001337790 100644 --- a/writerfilter/source/rtftok/rtfsdrimport.cxx +++ b/writerfilter/source/rtftok/rtfsdrimport.cxx @@ -53,10 +53,13 @@ RTFSdrImport::RTFSdrImport(RTFDocumentImpl& rDocument, uno::Reference<drawing::XDrawPageSupplier> xDrawings(xDstDoc, uno::UNO_QUERY); if (xDrawings.is()) m_aParents.push(xDrawings->getDrawPage()); + m_aGraphicZOrderHelpers.push(writerfilter::dmapper::GraphicZOrderHelper()); } RTFSdrImport::~RTFSdrImport() { + if (!m_aGraphicZOrderHelpers.empty()) + m_aGraphicZOrderHelpers.pop(); if (m_aParents.size()) m_aParents.pop(); } @@ -113,18 +116,25 @@ std::vector<beans::PropertyValue> RTFSdrImport::getTextFrameDefaults(bool bNew) void RTFSdrImport::pushParent(uno::Reference<drawing::XShapes> const& xParent) { m_aParents.push(xParent); + m_aGraphicZOrderHelpers.push(writerfilter::dmapper::GraphicZOrderHelper()); } void RTFSdrImport::popParent() { + if (!m_aGraphicZOrderHelpers.empty()) + m_aGraphicZOrderHelpers.pop(); m_aParents.pop(); } void RTFSdrImport::resolveDhgt(uno::Reference<beans::XPropertySet> const& xPropertySet, sal_Int32 const nZOrder, bool const bOldStyle) { - xPropertySet->setPropertyValue("ZOrder", uno::makeAny(m_aGraphicZOrderHelper.findZOrder(nZOrder, bOldStyle))); - m_aGraphicZOrderHelper.addItem(xPropertySet, nZOrder); + if (!m_aGraphicZOrderHelpers.empty()) + { + writerfilter::dmapper::GraphicZOrderHelper& rHelper = m_aGraphicZOrderHelpers.top(); + xPropertySet->setPropertyValue("ZOrder", uno::makeAny(rHelper.findZOrder(nZOrder, bOldStyle))); + rHelper.addItem(xPropertySet, nZOrder); + } } void RTFSdrImport::resolveLineColorAndWidth(bool bTextFrame, const uno::Reference<beans::XPropertySet>& xPropertySet, uno::Any& rLineColor, uno::Any& rLineWidth) @@ -795,7 +805,10 @@ void RTFSdrImport::resolve(RTFShape& rShape, bool bClose, ShapeOrPict const shap { resolveLineColorAndWidth(m_bTextFrame, xPropertySet, aLineColor, aLineWidth); if (rShape.oZ) - resolveDhgt(xPropertySet, *rShape.oZ, /*bOldStyle=*/false); + { + bool bOldStyle = m_aParents.size() > 1; + resolveDhgt(xPropertySet, *rShape.oZ, bOldStyle); + } if (m_bTextFrame) // Writer textframes implement text::WritingMode2, which is a different data type. xPropertySet->setPropertyValue("WritingMode", uno::makeAny(sal_Int16(eWritingMode))); diff --git a/writerfilter/source/rtftok/rtfsdrimport.hxx b/writerfilter/source/rtftok/rtfsdrimport.hxx index afbbe4270b95..5e21b84d9946 100644 --- a/writerfilter/source/rtftok/rtfsdrimport.hxx +++ b/writerfilter/source/rtftok/rtfsdrimport.hxx @@ -73,7 +73,7 @@ private: bool m_bTextGraphicObject; /// if inside \pict, but actually it's a shape (not a picture) bool m_bFakePict; - writerfilter::dmapper::GraphicZOrderHelper m_aGraphicZOrderHelper; + std::stack<writerfilter::dmapper::GraphicZOrderHelper> m_aGraphicZOrderHelpers; }; } // namespace rtftok } // namespace writerfilter |