diff options
author | Miklos Vajna <vmiklos@collabora.co.uk> | 2016-05-10 09:16:17 +0200 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2016-05-18 11:38:55 +0000 |
commit | 7879b89da30025c8efb812bb31a88f9e382b42a5 (patch) | |
tree | a929635e95f4a3bb090522175e28abe60de57bed /writerfilter | |
parent | 853df7a5fa2b48f62a350c0e9eb1be3f6014dedc (diff) |
tdf#96275 RTF import: fix anchor of shapes inside tables
Table text is buffered, so buffer the shape import as well, otherwise
the anchor will precede the buffered text -> incorrect anchor position.
(cherry picked from commit 015fd55c94b7b650ed8e572cafaf3b0f903b01b9)
Conflicts:
writerfilter/source/rtftok/rtfdocumentimpl.cxx
Change-Id: I527b898e2cd5fafaf122a20e11df66ba8d3185cf
Reviewed-on: https://gerrit.libreoffice.org/24937
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/rtftok/rtfdocumentimpl.cxx | 11 | ||||
-rw-r--r-- | writerfilter/source/rtftok/rtfdocumentimpl.hxx | 4 |
2 files changed, 13 insertions, 2 deletions
diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx index 2e1e350fde94..2f1737bae972 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx @@ -1515,6 +1515,8 @@ void RTFDocumentImpl::replayBuffer(RTFBuffer_t& rBuffer, parBreak(); else if (boost::get<0>(aTuple) == BUFFER_STARTSHAPE) m_pSdrImport->resolve(boost::get<1>(aTuple)->getShape(), false, RTFSdrImport::SHAPE); + else if (boost::get<0>(aTuple) == BUFFER_RESOLVESHAPE) + m_pSdrImport->resolve(boost::get<1>(aTuple)->getShape(), true, RTFSdrImport::SHAPE); else if (boost::get<0>(aTuple) == BUFFER_ENDSHAPE) m_pSdrImport->close(); else if (boost::get<0>(aTuple) == BUFFER_RESOLVESUBSTREAM) @@ -5331,7 +5333,14 @@ RTFError RTFDocumentImpl::popState() { // Don't trigger a shape import in case we're only leaving the \shpinst of the groupshape itself. RTFSdrImport::ShapeOrPict eType = (aState.eDestination == Destination::SHAPEINSTRUCTION) ? RTFSdrImport::SHAPE : RTFSdrImport::PICT; - m_pSdrImport->resolve(m_aStates.top().aShape, true, eType); + if (!m_aStates.top().pCurrentBuffer || eType != RTFSdrImport::SHAPE) + m_pSdrImport->resolve(m_aStates.top().aShape, true, eType); + else + { + // Shape inside table: buffer the import to have correct anchor position. + auto pValue = std::make_shared<RTFValue>(m_aStates.top().aShape); + m_aStates.top().pCurrentBuffer->push_back(Buf_t(BUFFER_RESOLVESHAPE, pValue, nullptr)); + } } else if (aState.bInShapeGroup && !aState.bInShape) { diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.hxx b/writerfilter/source/rtftok/rtfdocumentimpl.hxx index e089f01436f8..17318c4fd47a 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.hxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.hxx @@ -44,7 +44,7 @@ enum class RTFBorderState CHARACTER }; -/// Minimalistic buffer of elements for nested cells. +/// Different kind of buffers for table cell contents. enum RTFBufferTypes { BUFFER_PROPS, @@ -56,6 +56,8 @@ enum RTFBufferTypes BUFFER_ENDRUN, BUFFER_PAR, BUFFER_STARTSHAPE, + /// Imports a shape. + BUFFER_RESOLVESHAPE, BUFFER_ENDSHAPE, BUFFER_RESOLVESUBSTREAM }; |