summaryrefslogtreecommitdiff
path: root/writerfilter
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.co.uk>2016-09-20 09:13:21 +0200
committerMiklos Vajna <vmiklos@collabora.co.uk>2016-09-20 09:54:41 +0200
commit5edebdf67720ac0867b088400e2b31806138dc25 (patch)
tree88f8558ef2b7ff7f56ef7feae6bd631a6b24ca8e /writerfilter
parent81b9c4e20a1749d143715eb4367be104da7c872f (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
Diffstat (limited to 'writerfilter')
-rw-r--r--writerfilter/source/dmapper/GraphicHelpers.cxx2
-rw-r--r--writerfilter/source/rtftok/rtfsdrimport.cxx19
-rw-r--r--writerfilter/source/rtftok/rtfsdrimport.hxx2
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 c04014fed98c..61cde990e775 100644
--- a/writerfilter/source/rtftok/rtfsdrimport.cxx
+++ b/writerfilter/source/rtftok/rtfsdrimport.cxx
@@ -67,10 +67,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();
}
@@ -127,18 +130,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)
@@ -809,7 +819,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