summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sw/qa/extras/rtfimport/data/fdo82078.rtf13
-rw-r--r--sw/qa/extras/rtfimport/rtfimport.cxx7
-rw-r--r--writerfilter/source/rtftok/rtfdocumentimpl.cxx27
-rw-r--r--writerfilter/source/rtftok/rtfdocumentimpl.hxx2
-rw-r--r--writerfilter/source/rtftok/rtfsprm.cxx1
5 files changed, 48 insertions, 2 deletions
diff --git a/sw/qa/extras/rtfimport/data/fdo82078.rtf b/sw/qa/extras/rtfimport/data/fdo82078.rtf
new file mode 100644
index 000000000000..5899b7e1c0f6
--- /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 b2ed3d98e845..ec58d4ca6c03 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 c16b59fc47ed..a4bd1ddeca16 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 7a720f5b1814..c0f606777d8a 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 bf2b597d1a35..b2fd96c6e5a0 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: