[Libreoffice-commits] core.git: Branch 'libreoffice-5-3' - include/oox oox/source sd/qa

Tor Lillqvist tml at collabora.com
Tue Mar 7 16:07:14 UTC 2017


 include/oox/export/drawingml.hxx   |    9 ++--
 oox/source/export/chartexport.cxx  |   11 +++--
 oox/source/export/drawingml.cxx    |   75 ++++++++++++++++++++++++-------------
 sd/qa/unit/export-tests-ooxml1.cxx |    6 +-
 4 files changed, 66 insertions(+), 35 deletions(-)

New commits:
commit 31e6b78a196fbf73d61349ad3530cf49ee145186
Author: Tor Lillqvist <tml at collabora.com>
Date:   Wed Feb 15 19:21:06 2017 +0200

    tdf#106304: Fix newline and empty paragraph font size issues in .pptx export
    
    Output <a:br> instead of 
 for hard newlines. This fixes the
    problem that the line before the hard newline in the .pptx export is
    not centred.
    
    The fix for the sd_export_ooxml1 test is a bit hacky, but then so is
    the code in question.
    
    Don't unnecessarily use bogus default char size for a:endParaRPr.
    Instead use the size last used for an a:rPr below the same WriteText()
    call. I am not exactly sure about how this hangs together, but this
    has the desired effect on the exported .pptx.
    
    (cherry picked from commit 1154cda87d518156d1e52dfb81d5e23b32ab23d5)
    (cherry picked from commit 6f93eeb0ba8c4af5c96d1db36f184ffbc71c67ba)
    
    Change-Id: Ie23e0c33e6efb303b183d3b2efce6866d0dda4e8
    Reviewed-on: https://gerrit.libreoffice.org/34887
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Miklos Vajna <vmiklos at collabora.co.uk>

diff --git a/include/oox/export/drawingml.hxx b/include/oox/export/drawingml.hxx
index e9dc0a3..97d8dff 100644
--- a/include/oox/export/drawingml.hxx
+++ b/include/oox/export/drawingml.hxx
@@ -194,12 +194,15 @@ public:
                   sal_Int32 nXmlNamespace, bool bFlipH = false, bool bFlipV = false, sal_Int32 nRotation = 0 );
 
     void WriteText( const css::uno::Reference< css::uno::XInterface >& rXIface, const OUString& presetWarp, bool bBodyPr = true, bool bText = true, sal_Int32 nXmlNamespace = 0);
-    void WriteParagraph( const css::uno::Reference< css::text::XTextContent >& rParagraph );
+    void WriteParagraph( const css::uno::Reference< css::text::XTextContent >& rParagraph,
+                         bool& rbOverridingCharHeight, sal_Int32& rnCharHeight );
     void WriteParagraphProperties( const css::uno::Reference< css::text::XTextContent >& rParagraph );
     void WriteParagraphNumbering( const css::uno::Reference< css::beans::XPropertySet >& rXPropSet,
                                   sal_Int16 nLevel );
-    void WriteRun( const css::uno::Reference< css::text::XTextRange >& rRun );
-    void WriteRunProperties( const css::uno::Reference< css::beans::XPropertySet >& rRun, bool bIsField, sal_Int32 nElement = XML_rPr ,bool bCheckDirect = true);
+    void WriteRun( const css::uno::Reference< css::text::XTextRange >& rRun,
+                   bool& rbOverridingCharHeight, sal_Int32& rnCharHeight );
+    void WriteRunProperties( const css::uno::Reference< css::beans::XPropertySet >& rRun, bool bIsField, sal_Int32 nElement, bool bCheckDirect,
+                             bool& rbOverridingCharHeight, sal_Int32& rnCharHeight );
 
     void WritePresetShape( const char* pShape , std::vector< std::pair<sal_Int32,sal_Int32>> & rAvList );
     void WritePresetShape( const char* pShape );
diff --git a/oox/source/export/chartexport.cxx b/oox/source/export/chartexport.cxx
index ccfc244..41faeca 100644
--- a/oox/source/export/chartexport.cxx
+++ b/oox/source/export/chartexport.cxx
@@ -1102,13 +1102,16 @@ void ChartExport::exportTitle( const Reference< XShape >& xShape )
     pFS->startElement( FSNS( XML_a, XML_pPr ),
             FSEND );
 
-    WriteRunProperties(xPropSet, false, XML_defRPr);
+    bool bDummy = false;
+    sal_Int32 nDummy;
+    WriteRunProperties(xPropSet, false, XML_defRPr, true, bDummy, nDummy );
 
     pFS->endElement( FSNS( XML_a, XML_pPr ) );
 
     pFS->startElement( FSNS( XML_a, XML_r ),
             FSEND );
-    WriteRunProperties( xPropSet, false );
+    bDummy = false;
+    WriteRunProperties( xPropSet, false, XML_rPr, true, bDummy, nDummy );
     pFS->startElement( FSNS( XML_a, XML_t ),
             FSEND );
     pFS->writeEscaped( sText );
@@ -2390,7 +2393,9 @@ void ChartExport::exportTextProps(const Reference<XPropertySet>& xPropSet)
     pFS->startElement(FSNS(XML_a, XML_p), FSEND);
     pFS->startElement(FSNS(XML_a, XML_pPr), FSEND);
 
-    WriteRunProperties(xPropSet, false, XML_defRPr);
+    bool bDummy = false;
+    sal_Int32 nDummy;
+    WriteRunProperties(xPropSet, false, XML_defRPr, true, bDummy, nDummy);
 
     pFS->endElement(FSNS(XML_a, XML_pPr));
     pFS->endElement(FSNS(XML_a, XML_p));
diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx
index bd4c0c1..d9bc62d 100644
--- a/oox/source/export/drawingml.cxx
+++ b/oox/source/export/drawingml.cxx
@@ -1205,7 +1205,8 @@ void DrawingML::WriteShapeTransformation( const Reference< XShape >& rXShape, sa
     WriteTransformation( Rectangle( Point( aPos.X, aPos.Y ), Size( aSize.Width, aSize.Height ) ), nXmlNamespace, bFlipH, bFlipV, OOX_DRAWINGML_EXPORT_ROTATE_CLOCKWISIFY(nRotation) );
 }
 
-void DrawingML::WriteRunProperties( const Reference< XPropertySet >& rRun, bool bIsField, sal_Int32 nElement /*= XML_rPr*/, bool bCheckDirect/* = true */)
+void DrawingML::WriteRunProperties( const Reference< XPropertySet >& rRun, bool bIsField, sal_Int32 nElement, bool bCheckDirect,
+                                    bool& rbOverridingCharHeight, sal_Int32& rnCharHeight )
 {
     Reference< XPropertySet > rXPropSet( rRun, UNO_QUERY );
     Reference< XPropertyState > rXPropState( rRun, UNO_QUERY );
@@ -1222,8 +1223,19 @@ void DrawingML::WriteRunProperties( const Reference< XPropertySet >& rRun, bool
     sal_Int32 nCharEscapement = 0;
     sal_Int32 nCharKerning = 0;
 
-    if( GETA( CharHeight ) )
+    if ( nElement == XML_endParaRPr && rbOverridingCharHeight )
+    {
+        nSize = rnCharHeight;
+    }
+    else if( GETA( CharHeight ) )
+    {
         nSize = (sal_Int32) (100*(*o3tl::doAccess<float>(mAny)));
+        if ( nElement == XML_rPr )
+        {
+            rbOverridingCharHeight = true;
+            rnCharHeight = nSize;
+        }
+    }
 
      if( GETA( CharKerning ) )
         nCharKerning = (sal_Int32)(*o3tl::doAccess<sal_Int16>(mAny));
@@ -1580,7 +1592,8 @@ OString DrawingML::GetUUID()
     return OString(str, SAL_N_ELEMENTS(str));
 }
 
-void DrawingML::WriteRun( const Reference< XTextRange >& rRun )
+void DrawingML::WriteRun( const Reference< XTextRange >& rRun,
+                          bool& rbOverridingCharHeight, sal_Int32& rnCharHeight)
 {
     Reference< XPropertySet > rXPropSet( rRun, UNO_QUERY );
     sal_Int16 nLevel = -1;
@@ -1619,29 +1632,37 @@ void DrawingML::WriteRun( const Reference< XTextRange >& rRun )
         }
     }
 
-    if( ( bWriteField ) )
+    if (sText == "\n")
     {
-        OString sUUID(GetUUID());
-        mpFS->startElementNS( XML_a, XML_fld,
-                              XML_id, sUUID.getStr(),
-                              XML_type, OUStringToOString( sFieldValue, RTL_TEXTENCODING_UTF8 ).getStr(),
-                              FSEND );
+        mpFS->singleElementNS( XML_a, XML_br,
+                               FSEND );
     }
     else
     {
-        mpFS->startElementNS( XML_a, XML_r, FSEND );
-    }
+        if( ( bWriteField ) )
+        {
+            OString sUUID(GetUUID());
+            mpFS->startElementNS( XML_a, XML_fld,
+                                  XML_id, sUUID.getStr(),
+                                  XML_type, OUStringToOString( sFieldValue, RTL_TEXTENCODING_UTF8 ).getStr(),
+                                  FSEND );
+        }
+        else
+        {
+            mpFS->startElementNS( XML_a, XML_r, FSEND );
+        }
 
-    Reference< XPropertySet > xPropSet( rRun, uno::UNO_QUERY );
-    WriteRunProperties( xPropSet, bIsURLField );
-    mpFS->startElementNS( XML_a, XML_t, FSEND );
-    mpFS->writeEscaped( sText );
-    mpFS->endElementNS( XML_a, XML_t );
+        Reference< XPropertySet > xPropSet( rRun, uno::UNO_QUERY );
+        WriteRunProperties( xPropSet, bIsURLField, XML_rPr, true, rbOverridingCharHeight, rnCharHeight );
+        mpFS->startElementNS( XML_a, XML_t, FSEND );
+        mpFS->writeEscaped( sText );
+        mpFS->endElementNS( XML_a, XML_t );
 
-    if( bWriteField )
-        mpFS->endElementNS( XML_a, XML_fld );
-    else
-        mpFS->endElementNS( XML_a, XML_r );
+        if( bWriteField )
+            mpFS->endElementNS( XML_a, XML_fld );
+        else
+            mpFS->endElementNS( XML_a, XML_r );
+    }
 }
 
 OUString GetAutoNumType(sal_Int16 nNumberingType, bool bSDot, bool bPBehind, bool bPBoth)
@@ -2014,7 +2035,8 @@ void DrawingML::WriteParagraphProperties( const Reference< XTextContent >& rPara
     }
 }
 
-void DrawingML::WriteParagraph( const Reference< XTextContent >& rParagraph )
+void DrawingML::WriteParagraph( const Reference< XTextContent >& rParagraph,
+                                bool& rbOverridingCharHeight, sal_Int32& rnCharHeight )
 {
     Reference< XEnumerationAccess > access( rParagraph, UNO_QUERY );
     if( !access.is() )
@@ -2026,7 +2048,6 @@ void DrawingML::WriteParagraph( const Reference< XTextContent >& rParagraph )
 
     mpFS->startElementNS( XML_a, XML_p, FSEND );
 
-
     bool bPropertiesWritten = false;
     while( enumeration->hasMoreElements() )
     {
@@ -2040,11 +2061,11 @@ void DrawingML::WriteParagraph( const Reference< XTextContent >& rParagraph )
                 WriteParagraphProperties( rParagraph );
                 bPropertiesWritten = true;
             }
-            WriteRun( run );
+            WriteRun( run, rbOverridingCharHeight, rnCharHeight );
         }
     }
     Reference< XPropertySet > rXPropSet( rParagraph, UNO_QUERY );
-    WriteRunProperties( rXPropSet , false, XML_endParaRPr, false );
+    WriteRunProperties( rXPropSet, false, XML_endParaRPr, false, rbOverridingCharHeight, rnCharHeight );
 
     mpFS->endElementNS( XML_a, XML_p );
 }
@@ -2215,15 +2236,17 @@ void DrawingML::WriteText( const Reference< XInterface >& rXIface, const OUStrin
         return;
     }
 
+    bool bOverridingCharHeight = false;
+    sal_Int32 nCharHeight;
+
     while( enumeration->hasMoreElements() )
     {
         Reference< XTextContent > paragraph;
         Any any ( enumeration->nextElement() );
 
         if( any >>= paragraph)
-            WriteParagraph( paragraph );
+            WriteParagraph( paragraph, bOverridingCharHeight, nCharHeight );
     }
-
 }
 
 void DrawingML::WritePresetShape( const char* pShape , std::vector< std::pair<sal_Int32,sal_Int32>> & rAvList )
diff --git a/sd/qa/unit/export-tests-ooxml1.cxx b/sd/qa/unit/export-tests-ooxml1.cxx
index 8f2ef49..2fc233b 100644
--- a/sd/qa/unit/export-tests-ooxml1.cxx
+++ b/sd/qa/unit/export-tests-ooxml1.cxx
@@ -254,11 +254,11 @@ void SdOOXMLExportTest1::testN828390_4()
         SdrTextObj *pTxtObj = dynamic_cast<SdrTextObj *>( pObj );
         CPPUNIT_ASSERT( pTxtObj );
         const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject();
-        aEdit.GetCharAttribs(1, rLst);
+        aEdit.GetCharAttribs(0, rLst);
         for( std::vector<EECharAttrib>::reverse_iterator it = rLst.rbegin(); it!=rLst.rend(); ++it)
         {
             const SvxFontHeightItem * pFontHeight = dynamic_cast<const SvxFontHeightItem *>((*it).pAttr);
-            if( pFontHeight )
+            if( pFontHeight && (*it).nStart == 18 )
                 CPPUNIT_ASSERT_EQUAL_MESSAGE( "Font height is wrong", static_cast<sal_uInt32>(1129), pFontHeight->GetHeight() );
             const SvxFontItem *pFont = dynamic_cast<const SvxFontItem *>((*it).pAttr);
             if( pFont )
@@ -267,7 +267,7 @@ void SdOOXMLExportTest1::testN828390_4()
                 bPassed = true;
             }
             const SvxWeightItem *pWeight = dynamic_cast<const SvxWeightItem *>((*it).pAttr);
-            if( pWeight )
+            if( pWeight && (*it).nStart == 18 )
                 CPPUNIT_ASSERT_EQUAL_MESSAGE( "Font Weight is wrong", WEIGHT_BOLD, pWeight->GetWeight() );
         }
     }


More information about the Libreoffice-commits mailing list