[Libreoffice-commits] core.git: sw/inc sw/source

Miklos Vajna vmiklos at collabora.co.uk
Mon Dec 23 05:22:55 PST 2013


 sw/inc/unocoll.hxx                           |    2 -
 sw/source/filter/ww8/docxattributeoutput.cxx |   34 +++++++++++++++++++++++++--
 sw/source/filter/ww8/docxattributeoutput.hxx |    2 +
 3 files changed, 35 insertions(+), 3 deletions(-)

New commits:
commit 9e118293188607ac883ed65754aaccc9ef2c6abb
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Mon Dec 23 14:16:01 2013 +0100

    sw: drawingml export of textframe gradients
    
    CppunitTest_sw_ooxmlexport's testTextframeGradient is a reproducer for
    this problem.
    
    Change-Id: I8a0a1e8728cd82d96bdc7167e57cae72932429c5

diff --git a/sw/inc/unocoll.hxx b/sw/inc/unocoll.hxx
index b3e77dc..29a95bd 100644
--- a/sw/inc/unocoll.hxx
+++ b/sw/inc/unocoll.hxx
@@ -308,7 +308,7 @@ cppu::WeakImplHelper4
     ::com::sun::star::lang::XServiceInfo
 > SwXFramesBaseClass;
 
-class SwXFrames : public SwXFramesBaseClass,
+class SW_DLLPUBLIC SwXFrames : public SwXFramesBaseClass,
     public SwUnoCollection
 {
     const FlyCntType    eType;
diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx
index 29a6cd4..99bba6d 100644
--- a/sw/source/filter/ww8/docxattributeoutput.cxx
+++ b/sw/source/filter/ww8/docxattributeoutput.cxx
@@ -31,6 +31,8 @@
 #include "fmtruby.hxx"
 #include "breakit.hxx"
 #include "redline.hxx"
+#include "unocoll.hxx"
+#include "unoframe.hxx"
 
 #include <comphelper/string.hxx>
 #include <oox/token/tokens.hxx>
@@ -5800,12 +5802,15 @@ void DocxAttributeOutput::FormatBackground( const SvxBrushItem& rBrush )
 
 void DocxAttributeOutput::FormatFillStyle( const XFillStyleItem& rFillStyle )
 {
-    m_oFillStyle.reset(rFillStyle.GetValue());
+    if (!m_bIgnoreNextFill)
+        m_oFillStyle.reset(rFillStyle.GetValue());
+    else
+        m_bIgnoreNextFill = false;
 }
 
 void DocxAttributeOutput::FormatFillGradient( const XFillGradientItem& rFillGradient )
 {
-    if (*m_oFillStyle == XFILL_GRADIENT)
+    if (m_oFillStyle && *m_oFillStyle == XFILL_GRADIENT && !m_bDMLTextFrameSyntax)
     {
         if ( !m_pFlyFillAttrList )
             m_pFlyFillAttrList = m_pSerializer->createAttrList();
@@ -5849,11 +5854,35 @@ void DocxAttributeOutput::FormatFillGradient( const XFillGradientItem& rFillGrad
         m_pFlyAttrList->add(XML_fillcolor , "#" + sColor1);
         m_pFlyFillAttrList->add(XML_color2, "#" + sColor2);
     }
+    else if (m_oFillStyle && *m_oFillStyle == XFILL_GRADIENT && m_bDMLTextFrameSyntax)
+    {
+        uno::Reference<beans::XPropertySet> xPropertySet = SwXFrames::GetObject(const_cast<SwFrmFmt&>(m_rExport.mpParentFrame->GetFrmFmt()), FLYCNTTYPE_FRM);
+        m_rDrawingML.SetFS(m_pSerializer);
+        m_rDrawingML.WriteGradientFill(xPropertySet);
+    }
     m_oFillStyle.reset();
 }
 
 void DocxAttributeOutput::FormatBox( const SvxBoxItem& rBox )
 {
+    if (m_bDMLTextFrameSyntax)
+    {
+        // <a:gradFill> should be before <a:ln>.
+        const SfxPoolItem* pItem = GetExport().HasItem(RES_FILL_STYLE);
+        if (pItem)
+        {
+            const XFillStyleItem* pFillStyle = static_cast<const XFillStyleItem*>(pItem);
+            FormatFillStyle(*pFillStyle);
+        }
+
+        pItem = GetExport().HasItem(RES_FILL_GRADIENT);
+        if (pItem)
+        {
+            const XFillGradientItem* pFillGradient = static_cast<const XFillGradientItem*>(pItem);
+            FormatFillGradient(*pFillGradient);
+        }
+        m_bIgnoreNextFill = true;
+    }
     if (m_bTextFrameSyntax || m_bDMLTextFrameSyntax)
     {
         const SvxBorderLine* pLeft = rBox.GetLeft( );
@@ -6314,6 +6343,7 @@ DocxAttributeOutput::DocxAttributeOutput( DocxExport &rExport, FSHelperPtr pSeri
       m_nextFontId( 1 ),
       m_tableReference(new TableReference()),
       m_oldTableReference(new TableReference()),
+      m_bIgnoreNextFill(false),
       m_bBtLr(false),
       m_bFrameBtLr(false),
       m_pTableStyleExport(new DocxTableStyleExport(rExport.pDoc, pSerializer)),
diff --git a/sw/source/filter/ww8/docxattributeoutput.hxx b/sw/source/filter/ww8/docxattributeoutput.hxx
index a2a3977..fb75459 100644
--- a/sw/source/filter/ww8/docxattributeoutput.hxx
+++ b/sw/source/filter/ww8/docxattributeoutput.hxx
@@ -801,6 +801,8 @@ private:
     std::vector<ww8::WW8TableNodeInfoInner::Pointer_t> tableFirstCells;
 
     boost::optional<XFillStyle> m_oFillStyle;
+    /// If FormatBox() already handled fill style / gradient.
+    bool m_bIgnoreNextFill;
 
     /// Is fake rotation detected, so rotation with 90 degrees should be ignored in this cell?
     bool m_bBtLr;


More information about the Libreoffice-commits mailing list