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 f880962f5b
)
Change-Id: Ib628ef8bb377482f74fadb97c81afb95fbbf7184
This commit is contained in:
@@ -197,9 +197,10 @@
|
|||||||
#define CTF_RELWIDTHREL (XML_TEXT_CTF_START + 168)
|
#define CTF_RELWIDTHREL (XML_TEXT_CTF_START + 168)
|
||||||
#define CTF_RELHEIGHTREL (XML_TEXT_CTF_START + 169)
|
#define CTF_RELHEIGHTREL (XML_TEXT_CTF_START + 169)
|
||||||
#define CTF_CHAR_BACKGROUND (XML_TEXT_CTF_START + 170)
|
#define CTF_CHAR_BACKGROUND (XML_TEXT_CTF_START + 170)
|
||||||
#define CTF_CHAR_HIGHLIGHT (XML_TEXT_CTF_START + 171)
|
#define CTF_CHAR_BACKGROUND_TRANSPARENCY (XML_TEXT_CTF_START + 171)
|
||||||
#define CTF_FILLSTYLE (XML_TEXT_CTF_START + 172)
|
#define CTF_CHAR_HIGHLIGHT (XML_TEXT_CTF_START + 172)
|
||||||
#define CTF_FILLCOLOR (XML_TEXT_CTF_START + 173)
|
#define CTF_FILLSTYLE (XML_TEXT_CTF_START + 173)
|
||||||
|
#define CTF_FILLCOLOR (XML_TEXT_CTF_START + 174)
|
||||||
|
|
||||||
|
|
||||||
enum class TextPropMap {
|
enum class TextPropMap {
|
||||||
|
@@ -30,6 +30,7 @@ public:
|
|||||||
void testImageWithSpecialID();
|
void testImageWithSpecialID();
|
||||||
void testGraphicShape();
|
void testGraphicShape();
|
||||||
void testCharHighlight();
|
void testCharHighlight();
|
||||||
|
void testCharHighlightODF();
|
||||||
void testCharHighlightBody();
|
void testCharHighlightBody();
|
||||||
void testMSCharBackgroundEditing();
|
void testMSCharBackgroundEditing();
|
||||||
void testCharBackgroundToHighlighting();
|
void testCharBackgroundToHighlighting();
|
||||||
@@ -43,6 +44,7 @@ public:
|
|||||||
CPPUNIT_TEST(testImageWithSpecialID);
|
CPPUNIT_TEST(testImageWithSpecialID);
|
||||||
CPPUNIT_TEST(testGraphicShape);
|
CPPUNIT_TEST(testGraphicShape);
|
||||||
CPPUNIT_TEST(testCharHighlight);
|
CPPUNIT_TEST(testCharHighlight);
|
||||||
|
CPPUNIT_TEST(testCharHighlightODF);
|
||||||
CPPUNIT_TEST(testMSCharBackgroundEditing);
|
CPPUNIT_TEST(testMSCharBackgroundEditing);
|
||||||
CPPUNIT_TEST(testCharBackgroundToHighlighting);
|
CPPUNIT_TEST(testCharBackgroundToHighlighting);
|
||||||
#if !defined(WNT)
|
#if !defined(WNT)
|
||||||
@@ -473,6 +475,84 @@ void Test::testCharHighlight()
|
|||||||
testCharHighlightBody();
|
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()
|
void Test::testMSCharBackgroundEditing()
|
||||||
{
|
{
|
||||||
// Simulate the editing process of imported MSO character background attributes
|
// Simulate the editing process of imported MSO character background attributes
|
||||||
|
@@ -669,6 +669,7 @@ void XMLTextExportPropertySetMapper::ContextFilter(
|
|||||||
|
|
||||||
// character background and highlight
|
// character background and highlight
|
||||||
XMLPropertyState* pCharBackground = nullptr;
|
XMLPropertyState* pCharBackground = nullptr;
|
||||||
|
XMLPropertyState* pCharBackgroundTransparency = nullptr;
|
||||||
XMLPropertyState* pCharHighlight = nullptr;
|
XMLPropertyState* pCharHighlight = nullptr;
|
||||||
|
|
||||||
bool bNeedsAnchor = false;
|
bool bNeedsAnchor = false;
|
||||||
@@ -831,6 +832,7 @@ void XMLTextExportPropertySetMapper::ContextFilter(
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case CTF_CHAR_BACKGROUND: pCharBackground = propertyState; break;
|
case CTF_CHAR_BACKGROUND: pCharBackground = propertyState; break;
|
||||||
|
case CTF_CHAR_BACKGROUND_TRANSPARENCY: pCharBackgroundTransparency = propertyState; break;
|
||||||
case CTF_CHAR_HIGHLIGHT: pCharHighlight = 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
|
// When both background attributes are available export the visible one
|
||||||
if( pCharHighlight && pCharBackground )
|
if( pCharHighlight && pCharBackground )
|
||||||
{
|
{
|
||||||
|
assert(pCharBackgroundTransparency); // always together
|
||||||
sal_uInt32 nColor = COL_TRANSPARENT;
|
sal_uInt32 nColor = COL_TRANSPARENT;
|
||||||
pCharHighlight->maValue >>= nColor;
|
pCharHighlight->maValue >>= nColor;
|
||||||
if( nColor == COL_TRANSPARENT )
|
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;
|
pCharHighlight->mnIndex = -1;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
pCharBackground->mnIndex = -1;
|
pCharBackground->mnIndex = -1;
|
||||||
|
pCharBackgroundTransparency->mnIndex = -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SvXMLExportPropertyMapper::ContextFilter(bEnableFoFontFamily, rProperties, rPropSet);
|
SvXMLExportPropertyMapper::ContextFilter(bEnableFoFontFamily, rProperties, rPropSet);
|
||||||
|
@@ -192,7 +192,7 @@ XMLPropertyMapEntry aXMLParaPropMap[] =
|
|||||||
// TODO: not used?
|
// TODO: not used?
|
||||||
// RES_CHRATR_BACKGROUND
|
// RES_CHRATR_BACKGROUND
|
||||||
MT_E( "CharBackColor", FO, BACKGROUND_COLOR, XML_TYPE_COLORTRANSPARENT|MID_FLAG_MULTI_PROPERTY, CTF_CHAR_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 ),
|
MT_E( "CharBackColor", FO, TEXT_BACKGROUND_COLOR, XML_TYPE_COLOR|MID_FLAG_SPECIAL_ITEM_EXPORT, CTF_OLDTEXTBACKGROUND ),
|
||||||
// RES_CHRATR_CJK_FONT
|
// RES_CHRATR_CJK_FONT
|
||||||
MT_ED( "CharFontNameAsian", STYLE, FONT_NAME_ASIAN, XML_TYPE_STRING|MID_FLAG_SPECIAL_ITEM_IMPORT, CTF_FONTNAME_CJK ),
|
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?
|
// TODO: not used?
|
||||||
// RES_CHRATR_BACKGROUND
|
// RES_CHRATR_BACKGROUND
|
||||||
MT_E( "CharBackColor", FO, BACKGROUND_COLOR, XML_TYPE_COLORTRANSPARENT|MID_FLAG_MULTI_PROPERTY, CTF_CHAR_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 },
|
{ "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 ),
|
MT_E( "CharBackColor", FO, TEXT_BACKGROUND_COLOR, XML_TYPE_COLOR|MID_FLAG_SPECIAL_ITEM_EXPORT, CTF_OLDTEXTBACKGROUND ),
|
||||||
// RES_CHRATR_CJK_FONT
|
// RES_CHRATR_CJK_FONT
|
||||||
|
Reference in New Issue
Block a user