[Libreoffice-commits] core.git: 2 commits - chart2/qa include/oox oox/source

Markus Mohrhard markus.mohrhard at collabora.co.uk
Tue Feb 11 17:41:42 PST 2014


 chart2/qa/extras/chart2export.cxx                         |   13 +
 chart2/qa/extras/data/docx/fdo74115_WallGradientFill.docx |binary
 include/oox/export/chartexport.hxx                        |    3 
 include/oox/export/drawingml.hxx                          |    2 
 oox/source/drawingml/chart/objectformatter.cxx            |    2 
 oox/source/export/chartexport.cxx                         |   62 ++++
 oox/source/export/drawingml.cxx                           |  175 +++++++-------
 7 files changed, 171 insertions(+), 86 deletions(-)

New commits:
commit f38a223d6d455b07a4fdbfe842b2b367306544d5
Author: Markus Mohrhard <markus.mohrhard at collabora.co.uk>
Date:   Wed Feb 12 02:39:15 2014 +0100

    small stylistic changes
    
    Change-Id: I31cbdc8e09474252205edb837bfd1a8a7299b52b

diff --git a/oox/source/export/chartexport.cxx b/oox/source/export/chartexport.cxx
index 4d8d931..939e5a4 100644
--- a/oox/source/export/chartexport.cxx
+++ b/oox/source/export/chartexport.cxx
@@ -1163,10 +1163,11 @@ void ChartExport::exportFill( Reference< XPropertySet > xPropSet )
     xPropSet->getPropertyValue( "FillStyle" ) >>= aFillStyle;
     switch( aFillStyle )
     {
-    case FillStyle_GRADIENT :
-        exportGradientFill( xPropSet );
-    default:
-        WriteFill( xPropSet );
+        case FillStyle_GRADIENT :
+            exportGradientFill( xPropSet );
+            break;
+        default:
+            WriteFill( xPropSet );
     }
 }
 
diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx
index 1584356..ee3f9b1 100644
--- a/oox/source/export/drawingml.cxx
+++ b/oox/source/export/drawingml.cxx
@@ -338,6 +338,7 @@ void DrawingML::WriteGradientFill( Reference< XPropertySet > rXPropSet )
                     aGrabBag[i].Value >>= aOriginalGradient;
         }
 
+        mpFS->startElementNS( XML_a, XML_gradFill, FSEND );
         // check if an ooxml gradient had been imported and if the user has modified it
         if( aGradientStops.hasElements() && EqualGradients( aOriginalGradient, aGradient ) )
         {
@@ -345,11 +346,11 @@ void DrawingML::WriteGradientFill( Reference< XPropertySet > rXPropSet )
         }
         else
             WriteGradientFill(aGradient);
+        mpFS->endElementNS( XML_a, XML_gradFill );
     }
 }
 void DrawingML::WriteGrabBagGradientFill( Sequence< PropertyValue > aGradientStops, awt::Gradient rGradient )
 {
-    mpFS->startElementNS( XML_a, XML_gradFill, FSEND );
     // write back the original gradient
     mpFS->startElementNS( XML_a, XML_gsLst, FSEND );
 
@@ -396,50 +397,48 @@ void DrawingML::WriteGrabBagGradientFill( Sequence< PropertyValue > aGradientSto
     mpFS->singleElementNS( XML_a, XML_lin,
                            XML_ang, I32S( ( ( ( 3600 - rGradient.Angle + 900 ) * 6000 ) % 21600000 ) ),
                            FSEND );
-    mpFS->endElementNS( XML_a, XML_gradFill );
 }
 
 void DrawingML::WriteGradientFill( awt::Gradient rGradient )
 {
-    mpFS->startElementNS( XML_a, XML_gradFill, FSEND );
     switch( rGradient.Style ) {
-    default:
-    case GradientStyle_LINEAR:
-        mpFS->startElementNS( XML_a, XML_gsLst, FSEND );
-        WriteGradientStop( 0, ColorWithIntensity( rGradient.StartColor, rGradient.StartIntensity ) );
-        WriteGradientStop( 100, ColorWithIntensity( rGradient.EndColor, rGradient.EndIntensity ) );
-        mpFS->endElementNS( XML_a, XML_gsLst );
-        mpFS->singleElementNS( XML_a, XML_lin,
-                XML_ang, I32S( ( ( ( 3600 - rGradient.Angle + 900 ) * 6000 ) % 21600000 ) ),
-                FSEND );
-        break;
+        default:
+        case GradientStyle_LINEAR:
+            mpFS->startElementNS( XML_a, XML_gsLst, FSEND );
+            WriteGradientStop( 0, ColorWithIntensity( rGradient.StartColor, rGradient.StartIntensity ) );
+            WriteGradientStop( 100, ColorWithIntensity( rGradient.EndColor, rGradient.EndIntensity ) );
+            mpFS->endElementNS( XML_a, XML_gsLst );
+            mpFS->singleElementNS( XML_a, XML_lin,
+                    XML_ang, I32S( ( ( ( 3600 - rGradient.Angle + 900 ) * 6000 ) % 21600000 ) ),
+                    FSEND );
+            break;
 
-    case GradientStyle_AXIAL:
-        mpFS->startElementNS( XML_a, XML_gsLst, FSEND );
-        WriteGradientStop( 0, ColorWithIntensity( rGradient.EndColor, rGradient.EndIntensity ) );
-        WriteGradientStop( 50, ColorWithIntensity( rGradient.StartColor, rGradient.StartIntensity ) );
-        WriteGradientStop( 100, ColorWithIntensity( rGradient.EndColor, rGradient.EndIntensity ) );
-        mpFS->endElementNS( XML_a, XML_gsLst );
-        mpFS->singleElementNS( XML_a, XML_lin,
-                XML_ang, I32S( ( ( ( 3600 - rGradient.Angle + 900 ) * 6000 ) % 21600000 ) ),
-                FSEND );
-        break;
+        case GradientStyle_AXIAL:
+            mpFS->startElementNS( XML_a, XML_gsLst, FSEND );
+            WriteGradientStop( 0, ColorWithIntensity( rGradient.EndColor, rGradient.EndIntensity ) );
+            WriteGradientStop( 50, ColorWithIntensity( rGradient.StartColor, rGradient.StartIntensity ) );
+            WriteGradientStop( 100, ColorWithIntensity( rGradient.EndColor, rGradient.EndIntensity ) );
+            mpFS->endElementNS( XML_a, XML_gsLst );
+            mpFS->singleElementNS( XML_a, XML_lin,
+                    XML_ang, I32S( ( ( ( 3600 - rGradient.Angle + 900 ) * 6000 ) % 21600000 ) ),
+                    FSEND );
+            break;
 
-        /* I don't see how to apply transformation to gradients, so
-         * elliptical will end as radial and square as
-         * rectangular. also position offsets are not applied */
-    case GradientStyle_RADIAL:
-    case GradientStyle_ELLIPTICAL:
-    case GradientStyle_RECT:
-    case GradientStyle_SQUARE:
-        mpFS->startElementNS( XML_a, XML_gsLst, FSEND );
-        WriteGradientStop( 0, ColorWithIntensity( rGradient.EndColor, rGradient.EndIntensity ) );
-        WriteGradientStop( 100, ColorWithIntensity( rGradient.StartColor, rGradient.StartIntensity ) );
-        mpFS->endElementNS( XML_a, XML_gsLst );
-        mpFS->singleElementNS( XML_a, XML_path,
-                XML_path, ( rGradient.Style == awt::GradientStyle_RADIAL || rGradient.Style == awt::GradientStyle_ELLIPTICAL ) ? "circle" : "rect",
-                        FSEND );
-        break;
+            /* I don't see how to apply transformation to gradients, so
+             * elliptical will end as radial and square as
+             * rectangular. also position offsets are not applied */
+        case GradientStyle_RADIAL:
+        case GradientStyle_ELLIPTICAL:
+        case GradientStyle_RECT:
+        case GradientStyle_SQUARE:
+            mpFS->startElementNS( XML_a, XML_gsLst, FSEND );
+            WriteGradientStop( 0, ColorWithIntensity( rGradient.EndColor, rGradient.EndIntensity ) );
+            WriteGradientStop( 100, ColorWithIntensity( rGradient.StartColor, rGradient.StartIntensity ) );
+            mpFS->endElementNS( XML_a, XML_gsLst );
+            mpFS->singleElementNS( XML_a, XML_path,
+                    XML_path, ( rGradient.Style == awt::GradientStyle_RADIAL || rGradient.Style == awt::GradientStyle_ELLIPTICAL ) ? "circle" : "rect",
+                    FSEND );
+            break;
     }
     mpFS->endElementNS( XML_a, XML_gradFill );
 }
commit a5f0344b410e2fbf1e80b18fa6d5094f44cc06bc
Author: Vinaya Mandke <vinaya.mandke at synerzip.com>
Date:   Wed Jan 29 12:40:01 2014 +0530

    fdo#74115 Fix for DOCX GradientFill for Chart Wall
    
    Fixed import and export for chart wall Gradient Fill in DOCX
    Added UT for the same.
    
    Conflicts:
    	chart2/qa/extras/chart2export.cxx
    
    Change-Id: Ie6caa2b238aeb70f7225145da8c5c78003e73002

diff --git a/chart2/qa/extras/chart2export.cxx b/chart2/qa/extras/chart2export.cxx
index 399c0bb..d51bd1c 100644
--- a/chart2/qa/extras/chart2export.cxx
+++ b/chart2/qa/extras/chart2export.cxx
@@ -43,6 +43,7 @@ public:
     void testUpDownBars();
     void testDoughnutChart();
     void testDisplayUnits();
+    void testFdo74115WallGradientFill();
 
     CPPUNIT_TEST_SUITE(Chart2ExportTest);
     CPPUNIT_TEST(test);
@@ -58,6 +59,7 @@ public:
     CPPUNIT_TEST(testUpDownBars);
     CPPUNIT_TEST(testDoughnutChart);
     CPPUNIT_TEST(testDisplayUnits);
+    CPPUNIT_TEST(testFdo74115WallGradientFill);
     CPPUNIT_TEST_SUITE_END();
 
 protected:
@@ -162,6 +164,7 @@ xmlNodeSetPtr Chart2ExportTest::getXPathNode(xmlDocPtr pXmlDoc, const OString& r
     xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("w"), BAD_CAST("http://schemas.openxmlformats.org/wordprocessingml/2006/main"));
     xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("v"), BAD_CAST("urn:schemas-microsoft-com:vml"));
     xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("c"), BAD_CAST("http://schemas.openxmlformats.org/drawingml/2006/chart"));
+    xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("a"), BAD_CAST("http://schemas.openxmlformats.org/drawingml/2006/main"));
     xmlXPathObjectPtr pXmlXpathObj = xmlXPathEvalExpression(BAD_CAST(rXPath.getStr()), pXmlXpathCtx);
     return pXmlXpathObj->nodesetval;
 }
@@ -540,9 +543,19 @@ void Chart2ExportTest::testDisplayUnits()
     load("/chart2/qa/extras/data/docx/", "DisplayUnits.docx");
     xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text");
     CPPUNIT_ASSERT(pXmlDoc);
+
     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx/c:dispUnits/c:builtInUnit", "val", "billions");
 }
 
+void Chart2ExportTest::testFdo74115WallGradientFill()
+{
+    load("/chart2/qa/extras/data/docx/", "fdo74115_WallGradientFill.docx");
+    xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML Text");
+    CPPUNIT_ASSERT(pXmlDoc);
+
+    assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:spPr/a:gradFill");
+}
+
 CPPUNIT_TEST_SUITE_REGISTRATION(Chart2ExportTest);
 
 CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/chart2/qa/extras/data/docx/fdo74115_WallGradientFill.docx b/chart2/qa/extras/data/docx/fdo74115_WallGradientFill.docx
new file mode 100644
index 0000000..e10334b
Binary files /dev/null and b/chart2/qa/extras/data/docx/fdo74115_WallGradientFill.docx differ
diff --git a/include/oox/export/chartexport.hxx b/include/oox/export/chartexport.hxx
index 729e9ef..c9c13ba 100644
--- a/include/oox/export/chartexport.hxx
+++ b/include/oox/export/chartexport.hxx
@@ -120,6 +120,9 @@ private:
     void exportTitle( com::sun::star::uno::Reference<
                           ::com::sun::star::drawing::XShape > xShape );
     void exportPlotArea( );
+    void exportPlotAreaShapeProps( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > xPropSet  );
+    void exportFill( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > xPropSet );
+    void exportGradientFill( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > xPropSet );
     void exportDataTable( );
 
     void exportAreaChart( com::sun::star::uno::Reference< com::sun::star::chart2::XChartType > xChartType );
diff --git a/include/oox/export/drawingml.hxx b/include/oox/export/drawingml.hxx
index 84ac606..8b963f7 100644
--- a/include/oox/export/drawingml.hxx
+++ b/include/oox/export/drawingml.hxx
@@ -130,6 +130,8 @@ public:
     void WriteSolidFill( OUString sSchemeName, ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > aTransformations );
     void WriteSolidFill( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > rXPropSet );
     void WriteGradientFill( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > rXPropSet );
+    void WriteGradientFill( ::com::sun::star::awt::Gradient rGradient );
+    void WriteGrabBagGradientFill( ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > aGradientStops, ::com::sun::star::awt::Gradient rGradient);
     void WriteBlipFill( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > rXPropSet, OUString sURLPropName, sal_Int32 nXmlNamespace );
     void WriteBlipFill( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > rXPropSet, OUString sURLPropName );
     void WriteSrcRect( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >, const OUString& );
diff --git a/oox/source/drawingml/chart/objectformatter.cxx b/oox/source/drawingml/chart/objectformatter.cxx
index 29cc07b..a840381 100644
--- a/oox/source/drawingml/chart/objectformatter.cxx
+++ b/oox/source/drawingml/chart/objectformatter.cxx
@@ -467,7 +467,7 @@ static const sal_Int32 spnCommonPropIds[] =
 {
     PROP_LineStyle, PROP_LineWidth, PROP_LineColor, PROP_LineTransparence, PROP_LineDashName,
     PROP_INVALID, PROP_INVALID, PROP_INVALID, PROP_INVALID, PROP_INVALID, PROP_INVALID, PROP_INVALID,
-    PROP_FillStyle, PROP_FillColor, PROP_FillTransparence, PROP_FillGradientName,
+    PROP_FillStyle, PROP_FillColor, PROP_FillTransparence, PROP_INVALID, PROP_FillGradientName,
     PROP_FillBitmapName, PROP_FillBitmapMode, PROP_FillBitmapSizeX, PROP_FillBitmapSizeY,
     PROP_FillBitmapPositionOffsetX, PROP_FillBitmapPositionOffsetY, PROP_FillBitmapRectanglePoint
 };
diff --git a/oox/source/export/chartexport.cxx b/oox/source/export/chartexport.cxx
index ed5ea8b..4d8d931 100644
--- a/oox/source/export/chartexport.cxx
+++ b/oox/source/export/chartexport.cxx
@@ -25,6 +25,7 @@
 
 #include <cstdio>
 
+#include <com/sun/star/awt/Gradient.hpp>
 #include <com/sun/star/chart/XChartDocument.hpp>
 #include <com/sun/star/chart/ChartLegendPosition.hpp>
 #include <com/sun/star/chart/XTwoAxisXSupplier.hpp>
@@ -1124,19 +1125,77 @@ void ChartExport::exportPlotArea( )
     exportDataTable();
 
     // shape properties
+    /*
+     * Export the Plot area Shape Properties
+     * eg: Fill and Outline
+     */
     Reference< ::com::sun::star::chart::X3DDisplay > xWallFloorSupplier( mxDiagram, uno::UNO_QUERY );
     if( xWallFloorSupplier.is() )
     {
         Reference< beans::XPropertySet > xWallPropSet( xWallFloorSupplier->getWall(), uno::UNO_QUERY );
         if( xWallPropSet.is() )
         {
-            exportShapeProps( xWallPropSet );
+            exportPlotAreaShapeProps( xWallPropSet );
         }
     }
+
     pFS->endElement( FSNS( XML_c, XML_plotArea ) );
 
 }
 
+void ChartExport::exportPlotAreaShapeProps( Reference< XPropertySet > xPropSet )
+{
+    FSHelperPtr pFS = GetFS();
+    pFS->startElement( FSNS( XML_c, XML_spPr ),
+            FSEND );
+
+    exportFill( xPropSet );
+    WriteOutline( xPropSet );
+
+    pFS->endElement( FSNS( XML_c, XML_spPr ) );
+}
+
+void ChartExport::exportFill( Reference< XPropertySet > xPropSet )
+{
+    if ( !GetProperty( xPropSet, "FillStyle" ) )
+        return;
+    FillStyle aFillStyle( FillStyle_NONE );
+    xPropSet->getPropertyValue( "FillStyle" ) >>= aFillStyle;
+    switch( aFillStyle )
+    {
+    case FillStyle_GRADIENT :
+        exportGradientFill( xPropSet );
+    default:
+        WriteFill( xPropSet );
+    }
+}
+
+void ChartExport::exportGradientFill( Reference< XPropertySet > xPropSet )
+{
+    if( xPropSet.is() )
+     {
+        OUString sFillGradientName;
+        xPropSet->getPropertyValue("FillGradientName") >>= sFillGradientName;
+
+        awt::Gradient aGradient;
+        uno::Reference< lang::XMultiServiceFactory > xFact( getModel(), uno::UNO_QUERY );
+        try
+        {
+            uno::Reference< container::XNameAccess > xGradient( xFact->createInstance("com.sun.star.drawing.GradientTable"), uno::UNO_QUERY );
+            uno::Any rValue = xGradient->getByName( sFillGradientName );
+            if( (rValue >>= aGradient) )
+            {
+                WriteGradientFill( aGradient );
+            }
+        }
+        catch( const uno::Exception & rEx )
+        {
+            DBG_WARNING( "Gradient Property not Found; ChartExport::exportPlotAreaGradientFill" );
+        }
+
+    }
+}
+
 void ChartExport::exportDataTable( )
 {
     FSHelperPtr pFS = GetFS();
diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx
index 0f95e70..1584356 100644
--- a/oox/source/export/drawingml.cxx
+++ b/oox/source/export/drawingml.cxx
@@ -338,102 +338,110 @@ void DrawingML::WriteGradientFill( Reference< XPropertySet > rXPropSet )
                     aGrabBag[i].Value >>= aOriginalGradient;
         }
 
-        mpFS->startElementNS( XML_a, XML_gradFill, FSEND );
-
         // check if an ooxml gradient had been imported and if the user has modified it
         if( aGradientStops.hasElements() && EqualGradients( aOriginalGradient, aGradient ) )
         {
-            // write back the original gradient
-            mpFS->startElementNS( XML_a, XML_gsLst, FSEND );
+            WriteGrabBagGradientFill(aGradientStops, aGradient);
+        }
+        else
+            WriteGradientFill(aGradient);
+    }
+}
+void DrawingML::WriteGrabBagGradientFill( Sequence< PropertyValue > aGradientStops, awt::Gradient rGradient )
+{
+    mpFS->startElementNS( XML_a, XML_gradFill, FSEND );
+    // write back the original gradient
+    mpFS->startElementNS( XML_a, XML_gsLst, FSEND );
 
-            // get original stops and write them
-            for( sal_Int32 i=0; i < aGradientStops.getLength(); ++i )
-            {
-                Sequence< PropertyValue > aGradientStop;
-                aGradientStops[i].Value >>= aGradientStop;
-
-                // get values
-                OUString sSchemeClr;
-                double nPos = 0;
-                sal_Int16 nTransparency = 0;
-                sal_Int32 nRgbClr = 0;
-                Sequence< PropertyValue > aTransformations;
-                for( sal_Int32 j=0; j < aGradientStop.getLength(); ++j )
-                    if( aGradientStop[j].Name == "SchemeClr" )
-                        aGradientStop[j].Value >>= sSchemeClr;
-                    else if( aGradientStop[j].Name == "RgbClr" )
-                        aGradientStop[j].Value >>= nRgbClr;
-                    else if( aGradientStop[j].Name == "Pos" )
-                        aGradientStop[j].Value >>= nPos;
-                    else if( aGradientStop[j].Name == "Transparency" )
-                        aGradientStop[j].Value >>= nTransparency;
-                    else if( aGradientStop[j].Name == "Transformations" )
-                        aGradientStop[j].Value >>= aTransformations;
-
-                // write stop
-                mpFS->startElementNS( XML_a, XML_gs,
-                                      XML_pos, OString::number( nPos * 100000.0 ).getStr(),
-                                      FSEND );
-                if( sSchemeClr.isEmpty() )
-                {
-                    // Calculate alpha value (see oox/source/drawingml/color.cxx : getTransparency())
-                    sal_Int32 nAlpha = (MAX_PERCENT - ( PER_PERCENT * nTransparency ) );
-                    WriteColor( nRgbClr, nAlpha );
-                }
-                else
-                    WriteColor( sSchemeClr, aTransformations );
-                mpFS->endElementNS( XML_a, XML_gs );
-            }
-            mpFS->endElementNS( XML_a, XML_gsLst );
+    // get original stops and write them
+    for( sal_Int32 i=0; i < aGradientStops.getLength(); ++i )
+    {
+        Sequence< PropertyValue > aGradientStop;
+        aGradientStops[i].Value >>= aGradientStop;
 
-            mpFS->singleElementNS( XML_a, XML_lin,
-                                   XML_ang, I32S( ( ( ( 3600 - aGradient.Angle + 900 ) * 6000 ) % 21600000 ) ),
-                                   FSEND );
+        // get values
+        OUString sSchemeClr;
+        double nPos = 0;
+        sal_Int16 nTransparency = 0;
+        sal_Int32 nRgbClr = 0;
+        Sequence< PropertyValue > aTransformations;
+        for( sal_Int32 j=0; j < aGradientStop.getLength(); ++j )
+            if( aGradientStop[j].Name == "SchemeClr" )
+                aGradientStop[j].Value >>= sSchemeClr;
+            else if( aGradientStop[j].Name == "RgbClr" )
+                aGradientStop[j].Value >>= nRgbClr;
+            else if( aGradientStop[j].Name == "Pos" )
+                aGradientStop[j].Value >>= nPos;
+            else if( aGradientStop[j].Name == "Transparency" )
+                aGradientStop[j].Value >>= nTransparency;
+            else if( aGradientStop[j].Name == "Transformations" )
+                aGradientStop[j].Value >>= aTransformations;
+
+        // write stop
+        mpFS->startElementNS( XML_a, XML_gs,
+                              XML_pos, OString::number( nPos * 100000.0 ).getStr(),
+                              FSEND );
+        if( sSchemeClr.isEmpty() )
+        {
+            // Calculate alpha value (see oox/source/drawingml/color.cxx : getTransparency())
+            sal_Int32 nAlpha = (MAX_PERCENT - ( PER_PERCENT * nTransparency ) );
+            WriteColor( nRgbClr, nAlpha );
         }
         else
-            switch( aGradient.Style ) {
-            default:
-            case GradientStyle_LINEAR:
-                mpFS->startElementNS( XML_a, XML_gsLst, FSEND );
-                WriteGradientStop( 0, ColorWithIntensity( aGradient.StartColor, aGradient.StartIntensity ) );
-                WriteGradientStop( 100, ColorWithIntensity( aGradient.EndColor, aGradient.EndIntensity ) );
-                mpFS->endElementNS( XML_a, XML_gsLst );
-                mpFS->singleElementNS( XML_a, XML_lin,
-                                       XML_ang, I32S( ( ( ( 3600 - aGradient.Angle + 900 ) * 6000 ) % 21600000 ) ),
-                                       FSEND );
-                break;
+            WriteColor( sSchemeClr, aTransformations );
+        mpFS->endElementNS( XML_a, XML_gs );
+    }
+    mpFS->endElementNS( XML_a, XML_gsLst );
 
-            case GradientStyle_AXIAL:
-                mpFS->startElementNS( XML_a, XML_gsLst, FSEND );
-                WriteGradientStop( 0, ColorWithIntensity( aGradient.EndColor, aGradient.EndIntensity ) );
-                WriteGradientStop( 50, ColorWithIntensity( aGradient.StartColor, aGradient.StartIntensity ) );
-                WriteGradientStop( 100, ColorWithIntensity( aGradient.EndColor, aGradient.EndIntensity ) );
-                mpFS->endElementNS( XML_a, XML_gsLst );
-                mpFS->singleElementNS( XML_a, XML_lin,
-                                       XML_ang, I32S( ( ( ( 3600 - aGradient.Angle + 900 ) * 6000 ) % 21600000 ) ),
-                                       FSEND );
-                break;
+    mpFS->singleElementNS( XML_a, XML_lin,
+                           XML_ang, I32S( ( ( ( 3600 - rGradient.Angle + 900 ) * 6000 ) % 21600000 ) ),
+                           FSEND );
+    mpFS->endElementNS( XML_a, XML_gradFill );
+}
 
-                /* I don't see how to apply transformation to gradients, so
-                 * elliptical will end as radial and square as
-                 * rectangular. also position offsets are not applied */
-            case GradientStyle_RADIAL:
-            case GradientStyle_ELLIPTICAL:
-            case GradientStyle_RECT:
-            case GradientStyle_SQUARE:
-                mpFS->startElementNS( XML_a, XML_gsLst, FSEND );
-                WriteGradientStop( 0, ColorWithIntensity( aGradient.EndColor, aGradient.EndIntensity ) );
-                WriteGradientStop( 100, ColorWithIntensity( aGradient.StartColor, aGradient.StartIntensity ) );
-                mpFS->endElementNS( XML_a, XML_gsLst );
-                mpFS->singleElementNS( XML_a, XML_path,
-                                       XML_path, ( aGradient.Style == awt::GradientStyle_RADIAL || aGradient.Style == awt::GradientStyle_ELLIPTICAL ) ? "circle" : "rect",
-                                       FSEND );
-                break;
-            }
+void DrawingML::WriteGradientFill( awt::Gradient rGradient )
+{
+    mpFS->startElementNS( XML_a, XML_gradFill, FSEND );
+    switch( rGradient.Style ) {
+    default:
+    case GradientStyle_LINEAR:
+        mpFS->startElementNS( XML_a, XML_gsLst, FSEND );
+        WriteGradientStop( 0, ColorWithIntensity( rGradient.StartColor, rGradient.StartIntensity ) );
+        WriteGradientStop( 100, ColorWithIntensity( rGradient.EndColor, rGradient.EndIntensity ) );
+        mpFS->endElementNS( XML_a, XML_gsLst );
+        mpFS->singleElementNS( XML_a, XML_lin,
+                XML_ang, I32S( ( ( ( 3600 - rGradient.Angle + 900 ) * 6000 ) % 21600000 ) ),
+                FSEND );
+        break;
 
-        mpFS->endElementNS( XML_a, XML_gradFill );
-    }
+    case GradientStyle_AXIAL:
+        mpFS->startElementNS( XML_a, XML_gsLst, FSEND );
+        WriteGradientStop( 0, ColorWithIntensity( rGradient.EndColor, rGradient.EndIntensity ) );
+        WriteGradientStop( 50, ColorWithIntensity( rGradient.StartColor, rGradient.StartIntensity ) );
+        WriteGradientStop( 100, ColorWithIntensity( rGradient.EndColor, rGradient.EndIntensity ) );
+        mpFS->endElementNS( XML_a, XML_gsLst );
+        mpFS->singleElementNS( XML_a, XML_lin,
+                XML_ang, I32S( ( ( ( 3600 - rGradient.Angle + 900 ) * 6000 ) % 21600000 ) ),
+                FSEND );
+        break;
 
+        /* I don't see how to apply transformation to gradients, so
+         * elliptical will end as radial and square as
+         * rectangular. also position offsets are not applied */
+    case GradientStyle_RADIAL:
+    case GradientStyle_ELLIPTICAL:
+    case GradientStyle_RECT:
+    case GradientStyle_SQUARE:
+        mpFS->startElementNS( XML_a, XML_gsLst, FSEND );
+        WriteGradientStop( 0, ColorWithIntensity( rGradient.EndColor, rGradient.EndIntensity ) );
+        WriteGradientStop( 100, ColorWithIntensity( rGradient.StartColor, rGradient.StartIntensity ) );
+        mpFS->endElementNS( XML_a, XML_gsLst );
+        mpFS->singleElementNS( XML_a, XML_path,
+                XML_path, ( rGradient.Style == awt::GradientStyle_RADIAL || rGradient.Style == awt::GradientStyle_ELLIPTICAL ) ? "circle" : "rect",
+                        FSEND );
+        break;
+    }
+    mpFS->endElementNS( XML_a, XML_gradFill );
 }
 
 void DrawingML::WriteLineArrow( Reference< XPropertySet > rXPropSet, sal_Bool bLineStart )


More information about the Libreoffice-commits mailing list