summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Stahl <mstahl@redhat.com>2016-02-02 14:10:02 +0100
committerThorsten Behrens <Thorsten.Behrens@CIB.de>2016-02-02 22:23:37 +0000
commit89aa74dd903a7919b33982bc2efc74c8ec902fdc (patch)
tree0b56391f0a426c05c4f156f7a5247a20d6fc33de
parentResolves: tdf#97375 use Invalidate in all modes (diff)
downloadcore-89aa74dd903a7919b33982bc2efc74c8ec902fdc.tar.gz
core-89aa74dd903a7919b33982bc2efc74c8ec902fdc.zip
xmloff: tdf#96147: ODF export: fix duplicate fo:background-color
... attributes that happen if both CharHighlight and CharBackColor properties are used, because the CharBackTransparent property wasn't taken into account, and combining the CharBackColor and CharBackTransparent properties happens *after* XMLTextExportPropertySetMapper::ContextFilter() runs. Also, it looks like a transparent highlight wouldn't export properly but apparently DomainMapper::getColorFromId() won't create such. (regression from f880962f5bf26bfaef06bd3f9e67e2d901a2e74c) (cherry picked from commit 8dadefc35f8b33648fb6adbdaca75ea52b2705db) Change-Id: Ib628ef8bb377482f74fadb97c81afb95fbbf7184 Reviewed-on: https://gerrit.libreoffice.org/22046 Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk> Tested-by: Miklos Vajna <vmiklos@collabora.co.uk> (cherry picked from commit e92dcab1407fa26fc5ee68d0b626b87bc04f1b3b) Reviewed-on: https://gerrit.libreoffice.org/22054 Reviewed-by: Markus Mohrhard <markus.mohrhard@googlemail.com> Reviewed-by: David Ostrovsky <david@ostrovsky.org> Reviewed-by: Thorsten Behrens <Thorsten.Behrens@CIB.de> Tested-by: Thorsten Behrens <Thorsten.Behrens@CIB.de>
-rw-r--r--include/xmloff/txtprmap.hxx7
-rw-r--r--sw/qa/extras/globalfilter/globalfilter.cxx80
-rw-r--r--xmloff/source/text/txtexppr.cxx10
-rw-r--r--xmloff/source/text/txtprmap.cxx4
4 files changed, 96 insertions, 5 deletions
diff --git a/include/xmloff/txtprmap.hxx b/include/xmloff/txtprmap.hxx
index 5fa8e3cbb509..79baf8bbaa3c 100644
--- a/include/xmloff/txtprmap.hxx
+++ b/include/xmloff/txtprmap.hxx
@@ -197,9 +197,10 @@
#define CTF_RELWIDTHREL (XML_TEXT_CTF_START + 168)
#define CTF_RELHEIGHTREL (XML_TEXT_CTF_START + 169)
#define CTF_CHAR_BACKGROUND (XML_TEXT_CTF_START + 170)
-#define CTF_CHAR_HIGHLIGHT (XML_TEXT_CTF_START + 171)
-#define CTF_FILLSTYLE (XML_TEXT_CTF_START + 172)
-#define CTF_FILLCOLOR (XML_TEXT_CTF_START + 173)
+#define CTF_CHAR_BACKGROUND_TRANSPARENCY (XML_TEXT_CTF_START + 171)
+#define CTF_CHAR_HIGHLIGHT (XML_TEXT_CTF_START + 172)
+#define CTF_FILLSTYLE (XML_TEXT_CTF_START + 173)
+#define CTF_FILLCOLOR (XML_TEXT_CTF_START + 174)
enum class TextPropMap {
diff --git a/sw/qa/extras/globalfilter/globalfilter.cxx b/sw/qa/extras/globalfilter/globalfilter.cxx
index f2a7cf26af91..18e17e3fb8ca 100644
--- a/sw/qa/extras/globalfilter/globalfilter.cxx
+++ b/sw/qa/extras/globalfilter/globalfilter.cxx
@@ -30,6 +30,7 @@ public:
void testImageWithSpecialID();
void testGraphicShape();
void testCharHighlight();
+ void testCharHighlightODF();
void testCharHighlightBody();
void testMSCharBackgroundEditing();
void testCharBackgroundToHighlighting();
@@ -41,6 +42,7 @@ public:
CPPUNIT_TEST(testImageWithSpecialID);
CPPUNIT_TEST(testGraphicShape);
CPPUNIT_TEST(testCharHighlight);
+ CPPUNIT_TEST(testCharHighlightODF);
CPPUNIT_TEST(testMSCharBackgroundEditing);
CPPUNIT_TEST(testCharBackgroundToHighlighting);
#if !defined(WNT)
@@ -471,6 +473,84 @@ void Test::testCharHighlight()
testCharHighlightBody();
}
+void Test::testCharHighlightODF()
+{
+ mxComponent = loadFromDesktop(getURLFromSrc("/sw/qa/extras/globalfilter/data/char_background_editing.docx"),
+ "com.sun.star.text.TextDocument");
+
+ // don't check import, testMSCharBackgroundEditing already does that
+
+ uno::Reference<text::XTextRange> xPara = getParagraph(1);
+ for (int i = 1; i <= 4; ++i)
+ {
+ uno::Reference<beans::XPropertySet> xRun(getRun(xPara,i), uno::UNO_QUERY);
+ switch (i)
+ {
+ case 1: // non-transparent highlight
+ xRun->setPropertyValue("CharBackColor", uno::makeAny(static_cast<sal_Int32>(128)));
+ xRun->setPropertyValue("CharBackTransparent", uno::makeAny(true));
+ xRun->setPropertyValue("CharHighlight", uno::makeAny(static_cast<sal_Int32>(64)));
+ break;
+
+ case 2: // transparent backcolor
+ xRun->setPropertyValue("CharBackColor", uno::makeAny(static_cast<sal_Int32>(128)));
+ xRun->setPropertyValue("CharBackTransparent", uno::makeAny(true));
+ xRun->setPropertyValue("CharHighlight", uno::makeAny(static_cast<sal_Int32>(COL_TRANSPARENT)));
+ break;
+
+ case 3: // non-transparent backcolor
+ xRun->setPropertyValue("CharBackColor", uno::makeAny(static_cast<sal_Int32>(128)));
+ xRun->setPropertyValue("CharBackTransparent", uno::makeAny(false));
+ xRun->setPropertyValue("CharHighlight", uno::makeAny(static_cast<sal_Int32>(COL_TRANSPARENT)));
+ break;
+
+ case 4: // non-transparent highlight again
+ xRun->setPropertyValue("CharBackColor", uno::makeAny(static_cast<sal_Int32>(128)));
+ xRun->setPropertyValue("CharBackTransparent", uno::makeAny(false));
+ xRun->setPropertyValue("CharHighlight", uno::makeAny(static_cast<sal_Int32>(64)));
+ break;
+ }
+ }
+
+ uno::Reference<frame::XStorable> xStorable(mxComponent, uno::UNO_QUERY);
+ utl::MediaDescriptor aMediaDescriptor;
+ aMediaDescriptor["FilterName"] <<= OUString::createFromAscii("writer8");
+
+ utl::TempFile aTempFile;
+ aTempFile.EnableKillingFile();
+ xStorable->storeToURL(aTempFile.GetURL(), aMediaDescriptor.getAsConstPropertyValueList());
+
+ uno::Reference< lang::XComponent > xComponent(xStorable, uno::UNO_QUERY);
+ xComponent->dispose();
+ mxComponent = loadFromDesktop(aTempFile.GetURL(), "com.sun.star.text.TextDocument");
+
+ xPara.set(getParagraph(1));
+ for (int i = 1; i <= 4; ++i)
+ {
+ uno::Reference<beans::XPropertySet> xRun(getRun(xPara,i), uno::UNO_QUERY);
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(COL_TRANSPARENT), getProperty<sal_Int32>(xRun, "CharHighlight"));
+ switch (i)
+ {
+ case 1: // non-transparent highlight
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(64), getProperty<sal_Int32>(xRun, "CharBackColor"));
+ CPPUNIT_ASSERT_EQUAL(sal_False, getProperty<sal_Bool>(xRun, "CharBackTransparent"));
+ break;
+ case 2: // transparent backcolor
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(COL_TRANSPARENT), getProperty<sal_Int32>(xRun, "CharBackColor"));
+ CPPUNIT_ASSERT_EQUAL(sal_True, getProperty<sal_Bool>(xRun, "CharBackTransparent"));
+ break;
+ case 3: // non-transparent backcolor
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(128), getProperty<sal_Int32>(xRun, "CharBackColor"));
+ CPPUNIT_ASSERT_EQUAL(sal_False, getProperty<sal_Bool>(xRun, "CharBackTransparent"));
+ break;
+ case 4: // non-transparent highlight again
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(64), getProperty<sal_Int32>(xRun, "CharBackColor"));
+ CPPUNIT_ASSERT_EQUAL(sal_False, getProperty<sal_Bool>(xRun, "CharBackTransparent"));
+ break;
+ }
+ }
+}
+
void Test::testMSCharBackgroundEditing()
{
// Simulate the editing process of imported MSO character background attributes
diff --git a/xmloff/source/text/txtexppr.cxx b/xmloff/source/text/txtexppr.cxx
index bd0ed88978a1..cb728682ec25 100644
--- a/xmloff/source/text/txtexppr.cxx
+++ b/xmloff/source/text/txtexppr.cxx
@@ -669,6 +669,7 @@ void XMLTextExportPropertySetMapper::ContextFilter(
// character background and highlight
XMLPropertyState* pCharBackground = NULL;
+ XMLPropertyState* pCharBackgroundTransparency = NULL;
XMLPropertyState* pCharHighlight = NULL;
bool bNeedsAnchor = false;
@@ -831,6 +832,7 @@ void XMLTextExportPropertySetMapper::ContextFilter(
break;
case CTF_CHAR_BACKGROUND: pCharBackground = propertyState; break;
+ case CTF_CHAR_BACKGROUND_TRANSPARENCY: pCharBackgroundTransparency = propertyState; break;
case CTF_CHAR_HIGHLIGHT: pCharHighlight = propertyState; break;
}
}
@@ -1137,12 +1139,20 @@ void XMLTextExportPropertySetMapper::ContextFilter(
// When both background attributes are available export the visible one
if( pCharHighlight && pCharBackground )
{
+ assert(pCharBackgroundTransparency); // always together
sal_uInt32 nColor = COL_TRANSPARENT;
pCharHighlight->maValue >>= nColor;
if( nColor == COL_TRANSPARENT )
+ {
+ // actually this would not be exported as transparent anyway
+ // and we'd need another property CharHighlightTransparent for that
pCharHighlight->mnIndex = -1;
+ }
else
+ {
pCharBackground->mnIndex = -1;
+ pCharBackgroundTransparency->mnIndex = -1;
+ }
}
SvXMLExportPropertyMapper::ContextFilter(bEnableFoFontFamily, rProperties, rPropSet);
diff --git a/xmloff/source/text/txtprmap.cxx b/xmloff/source/text/txtprmap.cxx
index 7f892f483e65..17d3622e1b78 100644
--- a/xmloff/source/text/txtprmap.cxx
+++ b/xmloff/source/text/txtprmap.cxx
@@ -192,7 +192,7 @@ XMLPropertyMapEntry aXMLParaPropMap[] =
// TODO: not used?
// RES_CHRATR_BACKGROUND
MT_E( "CharBackColor", FO, BACKGROUND_COLOR, XML_TYPE_COLORTRANSPARENT|MID_FLAG_MULTI_PROPERTY, CTF_CHAR_BACKGROUND ),
- MT_E( "CharBackTransparent", FO, BACKGROUND_COLOR, XML_TYPE_ISTRANSPARENT|MID_FLAG_MERGE_ATTRIBUTE, 0 ),
+ MT_E( "CharBackTransparent", FO, BACKGROUND_COLOR, XML_TYPE_ISTRANSPARENT|MID_FLAG_MERGE_ATTRIBUTE, CTF_CHAR_BACKGROUND_TRANSPARENCY),
MT_E( "CharBackColor", FO, TEXT_BACKGROUND_COLOR, XML_TYPE_COLOR|MID_FLAG_SPECIAL_ITEM_EXPORT, CTF_OLDTEXTBACKGROUND ),
// RES_CHRATR_CJK_FONT
MT_ED( "CharFontNameAsian", STYLE, FONT_NAME_ASIAN, XML_TYPE_STRING|MID_FLAG_SPECIAL_ITEM_IMPORT, CTF_FONTNAME_CJK ),
@@ -535,7 +535,7 @@ XMLPropertyMapEntry aXMLTextPropMap[] =
// TODO: not used?
// RES_CHRATR_BACKGROUND
MT_E( "CharBackColor", FO, BACKGROUND_COLOR, XML_TYPE_COLORTRANSPARENT|MID_FLAG_MULTI_PROPERTY, CTF_CHAR_BACKGROUND ),
- MT_E( "CharBackTransparent", FO, BACKGROUND_COLOR, XML_TYPE_ISTRANSPARENT|MID_FLAG_MERGE_ATTRIBUTE, 0 ),
+ MT_E( "CharBackTransparent", FO, BACKGROUND_COLOR, XML_TYPE_ISTRANSPARENT|MID_FLAG_MERGE_ATTRIBUTE, CTF_CHAR_BACKGROUND_TRANSPARENCY),
{ "CharShadingValue", sizeof("CharShadingValue")-1, XML_NAMESPACE_LO_EXT, XML_CHAR_SHADING_VALUE, XML_TYPE_NUMBER|XML_TYPE_PROP_TEXT, 0, SvtSaveOptions::ODFVER_012_EXT_COMPAT, false },
MT_E( "CharBackColor", FO, TEXT_BACKGROUND_COLOR, XML_TYPE_COLOR|MID_FLAG_SPECIAL_ITEM_EXPORT, CTF_OLDTEXTBACKGROUND ),
// RES_CHRATR_CJK_FONT