sw/qa/extras/rtfimport/data/fdo82078.rtf | 13 ++++++++++++ sw/qa/extras/rtfimport/rtfimport.cxx | 7 ++++++ writerfilter/source/rtftok/rtfdocumentimpl.cxx | 27 +++++++++++++++++++++++-- writerfilter/source/rtftok/rtfdocumentimpl.hxx | 2 + writerfilter/source/rtftok/rtfsprm.cxx | 1 5 files changed, 48 insertions(+), 2 deletions(-)
New commits: commit 321d7ec2071472b3765a00806715e7ad9f8a306f Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Sat Sep 6 18:26:02 2014 +0200 fdo#82078 RTF import: fix bold text spilling over to non-bold text Regression from commit 41890bf714803969515578b47e63fa9730ea7090 (fdo#54473 fdo#57133 fix RTF import of character styles, 2012-12-04), the problem was that the style undoing magic introduced in 1be0a3fa9ebb22b607c54b47739d4467acfed259 (n#825305: writerfilter RTF import: override style properties like Word, 2014-06-17) was not used for character styles. Change-Id: Id31cfd5574a83bcf2895f0c2fd496fa60791cbb3 diff --git a/sw/qa/extras/rtfimport/data/fdo82078.rtf b/sw/qa/extras/rtfimport/data/fdo82078.rtf new file mode 100644 index 0000000..5899b7e --- /dev/null +++ b/sw/qa/extras/rtfimport/data/fdo82078.rtf @@ -0,0 +1,13 @@ +{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff31507\deff0\stshfdbch0\stshfloch0\stshfhich0\stshfbi0\deflang1033\deflangfe1033\themelang1033\themelangfe0\themelangcs0 +\noqfpromote +{\stylesheet +{\ql \li0\ri0\sl240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 \f40\fs18\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 +\snext0 \sqformat \spriority14 \styrsid11343869 Normal;} +{\*\cs73\b Strong;} +} +\pard +{before } +{\cs73 +after} +\par +} diff --git a/sw/qa/extras/rtfimport/rtfimport.cxx b/sw/qa/extras/rtfimport/rtfimport.cxx index b2ed3d9..ec58d4c 100644 --- a/sw/qa/extras/rtfimport/rtfimport.cxx +++ b/sw/qa/extras/rtfimport/rtfimport.cxx @@ -9,6 +9,7 @@ #include <swmodeltestbase.hxx> #include <com/sun/star/awt/FontDescriptor.hpp> +#include <com/sun/star/awt/FontWeight.hpp> #include <com/sun/star/document/XFilter.hpp> #include <com/sun/star/document/XImporter.hpp> #include <com/sun/star/drawing/EnhancedCustomShapeParameterPair.hpp> @@ -1919,6 +1920,12 @@ DECLARE_RTFIMPORT_TEST(testFdo79959, "fdo79959.rtf") CPPUNIT_ASSERT_EQUAL(true, static_cast<bool>(getStyles("ParagraphStyles")->hasByName("Test"))); } +DECLARE_RTFIMPORT_TEST(testFdo82078, "fdo82078.rtf") +{ + // This was awt::FontWeight::BOLD, i.e. the second run was bold, when it should be normal. + CPPUNIT_ASSERT_EQUAL(awt::FontWeight::NORMAL, getProperty<float>(getRun(getParagraph(1), 2), "CharWeight")); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx index c16b59f..a4bd1dd 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx @@ -445,9 +445,29 @@ writerfilter::Reference<Properties>::Pointer_t RTFDocumentImpl::getProperties(RT if (it != m_aStyleTableEntries.end()) { RTFReferenceProperties& rProps = *(RTFReferenceProperties*)it->second.get(); + + // cloneAndDeduplicate() wants to know about only a single "style", so + // let's merge paragraph and character style properties here. + int nCharStyle = m_aStates.top().nCurrentCharacterStyleIndex; + RTFReferenceTable::Entries_t::iterator itChar = m_aStyleTableEntries.find(nCharStyle); + RTFSprms aStyleSprms = rProps.getSprms(); + RTFSprms aStyleAttributes = rProps.getAttributes(); + if (itChar != m_aStyleTableEntries.end()) + { + // Found active character style, then update aStyleSprms/Attributes. + RTFReferenceProperties& rCharProps = *(RTFReferenceProperties*)itChar->second.get(); + RTFSprms& rCharStyleSprms = rCharProps.getSprms(); + for (RTFSprms::Iterator_t itSprm = rCharStyleSprms.begin(); itSprm != rCharStyleSprms.end(); ++itSprm) + aStyleSprms.set(itSprm->first, itSprm->second); + + RTFSprms& rCharStyleAttributes = rCharProps.getAttributes(); + for (RTFSprms::Iterator_t itAttr = rCharStyleAttributes.begin(); itAttr != rCharStyleAttributes.end(); ++itAttr) + aStyleAttributes.set(itAttr->first, itAttr->second); + } + // Get rid of direct formatting what is already in the style. - RTFSprms const sprms(rSprms.cloneAndDeduplicate(rProps.getSprms())); - RTFSprms const attributes(rAttributes.cloneAndDeduplicate(rProps.getAttributes())); + RTFSprms const sprms(rSprms.cloneAndDeduplicate(aStyleSprms)); + RTFSprms const attributes(rAttributes.cloneAndDeduplicate(aStyleAttributes)); return writerfilter::Reference<Properties>::Pointer_t(new RTFReferenceProperties(attributes, sprms)); } writerfilter::Reference<Properties>::Pointer_t pRet(new RTFReferenceProperties(rAttributes, rSprms)); @@ -2807,6 +2827,7 @@ int RTFDocumentImpl::dispatchFlag(RTFKeyword nKeyword) m_aStates.top().aCharacterSprms = getDefaultState().aCharacterSprms; m_aStates.top().nCurrentEncoding = getEncoding(getFontIndex(m_nDefaultFontIndex)); m_aStates.top().aCharacterAttributes = getDefaultState().aCharacterAttributes; + m_aStates.top().nCurrentCharacterStyleIndex = -1; } break; case RTF_PARD: @@ -3692,6 +3713,7 @@ int RTFDocumentImpl::dispatchValue(RTFKeyword nKeyword, int nParam) } break; case RTF_CS: + m_aStates.top().nCurrentCharacterStyleIndex = nParam; if (m_aStates.top().nDestinationState == DESTINATION_STYLESHEET || m_aStates.top().nDestinationState == DESTINATION_STYLEENTRY) { m_nCurrentStyleIndex = nParam; @@ -5937,6 +5959,7 @@ RTFParserState::RTFParserState(RTFDocumentImpl* pDocumentImpl) nMinute(0), pDestinationText(0), nCurrentStyleIndex(-1), + nCurrentCharacterStyleIndex(-1), pCurrentBuffer(0), bInListpicture(false), bInBackground(false), diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.hxx b/writerfilter/source/rtftok/rtfdocumentimpl.hxx index 7a720f5..c0f6067 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.hxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.hxx @@ -279,6 +279,8 @@ public: /// Index of the current style. int nCurrentStyleIndex; + /// Index of the current character style. + int nCurrentCharacterStyleIndex; /// Points to the active buffer, if there is one. RTFBuffer_t* pCurrentBuffer; diff --git a/writerfilter/source/rtftok/rtfsprm.cxx b/writerfilter/source/rtftok/rtfsprm.cxx index bf2b597..b2fd96c 100644 --- a/writerfilter/source/rtftok/rtfsprm.cxx +++ b/writerfilter/source/rtftok/rtfsprm.cxx @@ -143,6 +143,7 @@ static RTFValue::Pointer_t getDefaultSPRM(Id const id) { case NS_ooxml::LN_CT_Spacing_before: case NS_ooxml::LN_CT_Spacing_after: + case NS_ooxml::LN_EG_RPrBase_b: return RTFValue::Pointer_t(new RTFValue(0)); default: _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits