diff options
Diffstat (limited to 'writerfilter')
-rw-r--r-- | writerfilter/source/rtftok/rtfdocumentimpl.cxx | 13 | ||||
-rw-r--r-- | writerfilter/source/rtftok/rtfdocumentimpl.hxx | 4 | ||||
-rw-r--r-- | writerfilter/source/rtftok/rtfvalue.cxx | 52 | ||||
-rw-r--r-- | writerfilter/source/rtftok/rtfvalue.hxx | 6 |
4 files changed, 60 insertions, 15 deletions
diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx index 785d7975cbb7..f78539bc79f4 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx @@ -1537,7 +1537,14 @@ void RTFDocumentImpl::replayBuffer(RTFBuffer_t& rBuffer, else if (std::get<0>(aTuple) == BUFFER_STARTSHAPE) m_pSdrImport->resolve(std::get<1>(aTuple)->getShape(), false, RTFSdrImport::SHAPE); else if (std::get<0>(aTuple) == BUFFER_RESOLVESHAPE) + { + // Make sure there is no current buffer while replaying the shape, + // otherwise it gets re-buffered. + RTFBuffer_t* pCurrentBuffer = m_aStates.top().pCurrentBuffer; + m_aStates.top().pCurrentBuffer = nullptr; m_pSdrImport->resolve(std::get<1>(aTuple)->getShape(), true, RTFSdrImport::SHAPE); + m_aStates.top().pCurrentBuffer = pCurrentBuffer; + } else if (std::get<0>(aTuple) == BUFFER_ENDSHAPE) m_pSdrImport->close(); else if (std::get<0>(aTuple) == BUFFER_RESOLVESUBSTREAM) @@ -1548,6 +1555,8 @@ void RTFDocumentImpl::replayBuffer(RTFBuffer_t& rBuffer, OUString aCustomMark = rAttributes.find(2)->getString(); resolveSubstream(nPos, nId, aCustomMark); } + else if (std::get<0>(aTuple) == BUFFER_PICTURE) + m_aStates.top().aPicture = std::get<1>(aTuple)->getPicture(); else assert(false); } @@ -2092,6 +2101,10 @@ RTFError RTFDocumentImpl::popState() else { // Shape inside table: buffer the import to have correct anchor position. + // Also buffer the RTFPicture of the state stack as it contains + // the shape size. + auto pPictureValue = std::make_shared<RTFValue>(m_aStates.top().aPicture); + m_aStates.top().pCurrentBuffer->push_back(Buf_t(BUFFER_PICTURE, pPictureValue, nullptr)); auto pValue = std::make_shared<RTFValue>(m_aStates.top().aShape); m_aStates.top().pCurrentBuffer->push_back(Buf_t(BUFFER_RESOLVESHAPE, pValue, nullptr)); } diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.hxx b/writerfilter/source/rtftok/rtfdocumentimpl.hxx index 5128264a6684..0f627c650521 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.hxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.hxx @@ -59,7 +59,9 @@ enum RTFBufferTypes /// Imports a shape. BUFFER_RESOLVESHAPE, BUFFER_ENDSHAPE, - BUFFER_RESOLVESUBSTREAM + BUFFER_RESOLVESUBSTREAM, + /// Restores RTFParserState::aPicture. + BUFFER_PICTURE }; /// Form field types diff --git a/writerfilter/source/rtftok/rtfvalue.cxx b/writerfilter/source/rtftok/rtfvalue.cxx index 9a2f79d4e2be..330640fc31ba 100644 --- a/writerfilter/source/rtftok/rtfvalue.cxx +++ b/writerfilter/source/rtftok/rtfvalue.cxx @@ -24,7 +24,8 @@ RTFValue::RTFValue(int nValue, OUString sValue, uno::Reference<io::XInputStream> xStream, uno::Reference<embed::XEmbeddedObject> xObject, bool bForceString, - const RTFShape& aShape) + const RTFShape& aShape, + const RTFPicture& rPicture) : m_nValue(nValue), m_sValue(std::move(sValue)), m_pAttributes(std::make_shared<RTFSprms>(rAttributes)), @@ -33,7 +34,8 @@ RTFValue::RTFValue(int nValue, OUString sValue, m_xStream(std::move(xStream)), m_xObject(std::move(xObject)), m_bForceString(bForceString), - m_pShape(std::make_shared<RTFShape>(aShape)) + m_pShape(std::make_shared<RTFShape>(aShape)), + m_pPicture(std::make_shared<RTFPicture>(rPicture)) { } @@ -42,7 +44,8 @@ RTFValue::RTFValue() m_pAttributes(std::make_shared<RTFSprms>()), m_pSprms(std::make_shared<RTFSprms>()), m_bForceString(false), - m_pShape(std::make_shared<RTFShape>()) + m_pShape(std::make_shared<RTFShape>()), + m_pPicture(std::make_shared<RTFPicture>()) { } @@ -50,7 +53,8 @@ RTFValue::RTFValue(int nValue) : m_nValue(nValue), m_pAttributes(std::make_shared<RTFSprms>()), m_pSprms(std::make_shared<RTFSprms>()), - m_bForceString(false) + m_bForceString(false), + m_pPicture(std::make_shared<RTFPicture>()) { m_pShape.reset(new RTFShape()); } @@ -61,7 +65,8 @@ RTFValue::RTFValue(OUString sValue, bool bForce) m_pAttributes(std::make_shared<RTFSprms>()), m_pSprms(std::make_shared<RTFSprms>()), m_bForceString(bForce), - m_pShape(std::make_shared<RTFShape>()) + m_pShape(std::make_shared<RTFShape>()), + m_pPicture(std::make_shared<RTFPicture>()) { } @@ -70,7 +75,8 @@ RTFValue::RTFValue(RTFSprms rAttributes) m_pAttributes(std::make_shared<RTFSprms>(rAttributes)), m_pSprms(std::make_shared<RTFSprms>()), m_bForceString(false), - m_pShape(std::make_shared<RTFShape>()) + m_pShape(std::make_shared<RTFShape>()), + m_pPicture(std::make_shared<RTFPicture>()) { } @@ -79,7 +85,8 @@ RTFValue::RTFValue(RTFSprms rAttributes, RTFSprms rSprms) m_pAttributes(std::make_shared<RTFSprms>(rAttributes)), m_pSprms(std::make_shared<RTFSprms>(rSprms)), m_bForceString(false), - m_pShape(std::make_shared<RTFShape>()) + m_pShape(std::make_shared<RTFShape>()), + m_pPicture(std::make_shared<RTFPicture>()) { } @@ -89,7 +96,8 @@ RTFValue::RTFValue(uno::Reference<drawing::XShape> xShape) m_pSprms(std::make_shared<RTFSprms>()), m_xShape(std::move(xShape)), m_bForceString(false), - m_pShape(std::make_shared<RTFShape>()) + m_pShape(std::make_shared<RTFShape>()), + m_pPicture(std::make_shared<RTFPicture>()) { } @@ -99,7 +107,8 @@ RTFValue::RTFValue(uno::Reference<io::XInputStream> xStream) m_pSprms(std::make_shared<RTFSprms>()), m_xStream(std::move(xStream)), m_bForceString(false), - m_pShape(std::make_shared<RTFShape>()) + m_pShape(std::make_shared<RTFShape>()), + m_pPicture(std::make_shared<RTFPicture>()) { } @@ -109,7 +118,8 @@ RTFValue::RTFValue(uno::Reference<embed::XEmbeddedObject> xObject) m_pSprms(std::make_shared<RTFSprms>()), m_xObject(std::move(xObject)), m_bForceString(false), - m_pShape(std::make_shared<RTFShape>()) + m_pShape(std::make_shared<RTFShape>()), + m_pPicture(std::make_shared<RTFPicture>()) { } @@ -118,7 +128,18 @@ RTFValue::RTFValue(const RTFShape& aShape) m_pAttributes(std::make_shared<RTFSprms>()), m_pSprms(std::make_shared<RTFSprms>()), m_bForceString(false), - m_pShape(std::make_shared<RTFShape>(aShape)) + m_pShape(std::make_shared<RTFShape>(aShape)), + m_pPicture(std::make_shared<RTFPicture>()) +{ +} + +RTFValue::RTFValue(const RTFPicture& rPicture) + : m_nValue(), + m_pAttributes(std::make_shared<RTFSprms>()), + m_pSprms(std::make_shared<RTFSprms>()), + m_bForceString(false), + m_pShape(std::make_shared<RTFShape>()), + m_pPicture(std::make_shared<RTFPicture>(rPicture)) { } @@ -163,6 +184,11 @@ RTFShape& RTFValue::getShape() const return *m_pShape; } +RTFPicture& RTFValue::getPicture() const +{ + return *m_pPicture; +} + writerfilter::Reference<Properties>::Pointer_t RTFValue::getProperties() { return std::make_shared<RTFReferenceProperties>(*m_pAttributes, *m_pSprms); @@ -185,12 +211,12 @@ std::string RTFValue::toString() const RTFValue* RTFValue::Clone() { - return new RTFValue(m_nValue, m_sValue, *m_pAttributes, *m_pSprms, m_xShape, m_xStream, m_xObject, m_bForceString, *m_pShape); + return new RTFValue(m_nValue, m_sValue, *m_pAttributes, *m_pSprms, m_xShape, m_xStream, m_xObject, m_bForceString, *m_pShape, *m_pPicture); } RTFValue* RTFValue::CloneWithSprms(RTFSprms const& rAttributes, RTFSprms const& rSprms) { - return new RTFValue(m_nValue, m_sValue, rAttributes, rSprms, m_xShape, m_xStream, m_xObject, m_bForceString, *m_pShape); + return new RTFValue(m_nValue, m_sValue, rAttributes, rSprms, m_xShape, m_xStream, m_xObject, m_bForceString, *m_pShape, *m_pPicture); } bool RTFValue::equals(RTFValue& rOther) diff --git a/writerfilter/source/rtftok/rtfvalue.hxx b/writerfilter/source/rtftok/rtfvalue.hxx index 37febd208a73..202c30a30e7e 100644 --- a/writerfilter/source/rtftok/rtfvalue.hxx +++ b/writerfilter/source/rtftok/rtfvalue.hxx @@ -20,6 +20,7 @@ namespace rtftok { class RTFSprms; class RTFShape; +class RTFPicture; /// Value of an RTF keyword class RTFValue : public Value @@ -30,7 +31,7 @@ public: css::uno::Reference<css::drawing::XShape> xShape, css::uno::Reference<css::io::XInputStream> xStream, css::uno::Reference<css::embed::XEmbeddedObject> xObject, - bool bForceString, const RTFShape& aShape); + bool bForceString, const RTFShape& aShape, const RTFPicture& rPicture); RTFValue(); explicit RTFValue(int nValue); RTFValue(OUString sValue, bool bForce = false); @@ -40,6 +41,7 @@ public: explicit RTFValue(css::uno::Reference<css::io::XInputStream> xStream); explicit RTFValue(css::uno::Reference<css::embed::XEmbeddedObject> xObject); explicit RTFValue(const RTFShape& aShape); + explicit RTFValue(const RTFPicture& rPicture); virtual ~RTFValue() override; void setString(const OUString& sValue); virtual int getInt() const override; @@ -55,6 +57,7 @@ public: RTFSprms& getAttributes(); RTFSprms& getSprms(); RTFShape& getShape() const; + RTFPicture& getPicture() const; bool equals(RTFValue& rOther); private: RTFValue& operator=(RTFValue const& rOther) = delete; @@ -67,6 +70,7 @@ private: css::uno::Reference<css::embed::XEmbeddedObject> m_xObject; bool m_bForceString; std::shared_ptr<RTFShape> m_pShape; + std::shared_ptr<RTFPicture> m_pPicture; }; } // namespace rtftok } // namespace writerfilter |