tdf#137438 drawingml: separate outline from text import

By ignoring the a:ln group, the contents in that group
(like transparency) were being applied to the text.
Well, it should only apply to a line around the text,
which LO isn't doing.
[Well, LO can do this as Fontwork, but perhaps that
doesn't match so well with text in shapes generally?]

At any rate, don't allow one group's settings
to override the others. Keep them separate and then apply
a bit of merging logic to try to achieve the best look.

So emulate a little bit. If the outline is not very
transparent (less transparent than the main text)
then it may (if thick or opaque enough) dominate
the text.

For simplicity (and because there is no right answer overall)
I just compared transparency and used the more opaque colour.

Unit tests potentially affected:
-export-tests-ooxml1.cxx: tdf100348_FontworkBitmapFill.odp -> PPTX
   -now imports black instead of yellow (MSO sees gradient colors)
   -so previously completely wrong, and now perhaps even more wrong?
-export-tests-ooxml3.cxx: tdf114848.pptx
   -shows blue text regardless - defined by area.
   -can't see where this is set in MSO2016. Perhaps illegal?
-  : tdf125573_FontWorkScaleX.pptx
   -no visual difference. Same as tdf100348, but with black outline.
-  : tdf119087.pptx
   -should be green, not purple. [Added test for that.]
-  : tdf143315-WordartWithoutBullet.ppt
   -no visual difference (COL_AUTO outline?)
-import-tests2.cxx: tdf129686.pptx
   -poor test usage (but also weird transparent default).
   -no visual change.
-ooxmlimport2.cx: tdf143476_lockedCanvas_position.docx
   -no visual difference. Irrelevant since we can't RT

Change-Id: Iff0d95506dd64825444a99e62a6c2bd5e1dc122f
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/125300
Tested-by: Jenkins
Reviewed-by: Justin Luth <jluth@mail.com>
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
diff --git a/oox/inc/drawingml/textcharacterproperties.hxx b/oox/inc/drawingml/textcharacterproperties.hxx
index 2724af4..49d4125 100644
--- a/oox/inc/drawingml/textcharacterproperties.hxx
+++ b/oox/inc/drawingml/textcharacterproperties.hxx
@@ -26,6 +26,7 @@
#include <drawingml/textfont.hxx>

#include <drawingml/fillproperties.hxx>
#include <drawingml/lineproperties.hxx>

namespace oox { class PropertySet; }

@@ -57,6 +58,8 @@ struct TextCharacterProperties
    OptValue< bool >    moItalic;
    OptValue< bool >    moUnderlineLineFollowText;
    OptValue< bool >    moUnderlineFillFollowText;
    OptValue<LineProperties> moTextOutlineProperties;

    FillProperties      maFillProperties;
    /// Set if there was a property set that alters run visually during import
    bool mbHasVisualRunProperties;
diff --git a/oox/source/drawingml/textcharacterproperties.cxx b/oox/source/drawingml/textcharacterproperties.cxx
index bd4d051..9200e96 100644
--- a/oox/source/drawingml/textcharacterproperties.cxx
+++ b/oox/source/drawingml/textcharacterproperties.cxx
@@ -65,6 +65,7 @@ void TextCharacterProperties::assignUsed( const TextCharacterProperties& rSource
    moItalic.assignIfUsed( rSourceProps.moItalic );
    moUnderlineLineFollowText.assignIfUsed( rSourceProps.moUnderlineLineFollowText );
    moUnderlineFillFollowText.assignIfUsed( rSourceProps.moUnderlineFillFollowText );
    moTextOutlineProperties.assignIfUsed(rSourceProps.moTextOutlineProperties);

    maTextEffectsProperties = rSourceProps.maTextEffectsProperties;
    maFillProperties.assignUsed( rSourceProps.maFillProperties );
@@ -110,6 +111,17 @@ void TextCharacterProperties::pushToPropMap( PropertyMap& rPropMap, const XmlFil
    if ( maFillProperties.moFillType.has() )
    {
        Color aColor = maFillProperties.getBestSolidColor();
        // tdf#137438 Emulate text outline color/transparency.
        // If the outline color dominates, then use it as the text color.
        if (moTextOutlineProperties.has()
            && moTextOutlineProperties.get().maLineFill.moFillType.has()
            && moTextOutlineProperties.get().maLineFill.moFillType.get() != XML_noFill)
        {
            Color aLineColor = moTextOutlineProperties.get().maLineFill.getBestSolidColor();
            sal_Int16 nLineTransparency = aLineColor.getTransparency();
            if (nLineTransparency < aColor.getTransparency())
                aColor = aLineColor;
        }
        rPropMap.setProperty(PROP_CharColor, aColor.getColor(rFilter.getGraphicHelper()));
        // set color theme index
        rPropMap.setProperty(PROP_CharColorTheme, aColor.getSchemeColorIndex());
diff --git a/oox/source/drawingml/textcharacterpropertiescontext.cxx b/oox/source/drawingml/textcharacterpropertiescontext.cxx
index ce2ac6a..31ad3be 100644
--- a/oox/source/drawingml/textcharacterpropertiescontext.cxx
+++ b/oox/source/drawingml/textcharacterpropertiescontext.cxx
@@ -21,6 +21,7 @@

#include <oox/helper/attributelist.hxx>
#include <drawingml/colorchoicecontext.hxx>
#include <drawingml/linepropertiescontext.hxx>
#include <drawingml/misccontexts.hxx>
#include <drawingml/textcharacterproperties.hxx>
#include <drawingml/texteffectscontext.hxx>
@@ -113,9 +114,9 @@ ContextHandlerRef TextCharacterPropertiesContext::onCreateContext( sal_Int32 aEl

    switch( aElementToken )
    {
// TODO unsupported yet
//        case A_TOKEN( ln ):         // CT_LineProperties
//            return new LinePropertiesContext( getHandler(), rAttribs, maTextOutlineProperties );
        case A_TOKEN(ln): // CT_LineProperties
            // TODO still largely unsupported
            return new LinePropertiesContext(*this, rAttribs, mrTextCharacterProperties.moTextOutlineProperties.use());
        // EG_FillProperties
        case A_TOKEN( noFill ):
        case A_TOKEN( solidFill ):
diff --git a/sd/qa/unit/export-tests-ooxml3.cxx b/sd/qa/unit/export-tests-ooxml3.cxx
index 4fc288f..a9a740e 100644
--- a/sd/qa/unit/export-tests-ooxml3.cxx
+++ b/sd/qa/unit/export-tests-ooxml3.cxx
@@ -1551,6 +1551,19 @@ void SdOOXMLExportTest3::testTdf119087()
        = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf119087.pptx"), PPTX);
    xDocShRef = saveAndReload(xDocShRef.get(), PPTX);
    // This would fail both on export validation, and reloading the saved pptx file.

    // Get first paragraph of the text
    uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(0, 0, xDocShRef));
    uno::Reference<text::XTextRange> const xParagraph(getParagraphFromShape(0, xShape));
    // Get first run of the paragraph
    uno::Reference<text::XTextRange> xRun(getRunFromParagraph(0, xParagraph));
    uno::Reference<beans::XPropertySet> xPropSet(xRun, uno::UNO_QUERY_THROW);

    Color nColor = COL_AUTO;
    xPropSet->getPropertyValue("CharColor") >>= nColor;
    CPPUNIT_ASSERT_EQUAL(Color(0x00B050), nColor);

    xDocShRef->DoClose();
}

void SdOOXMLExportTest3::testTdf131554()
diff --git a/sd/qa/unit/import-tests2.cxx b/sd/qa/unit/import-tests2.cxx
index c8f8c76..9a5021f 100644
--- a/sd/qa/unit/import-tests2.cxx
+++ b/sd/qa/unit/import-tests2.cxx
@@ -562,8 +562,8 @@ void SdImportTest2::testTdf129686()
    sal_Int16 nTransparency = 0;
    xPropSet->getPropertyValue("CharTransparence") >>= nTransparency;

    // 100 = no transparency
    CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int16>(100), nTransparency);
    // 0 = no transparency, 100 (default) = completely transparent (unless COL_AUTO)
    CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int16>(0), nTransparency);

    xDocShRef->DoClose();
}