chart2/qa/extras/chart2export.cxx                                 |   28 +++++
 chart2/qa/extras/data/docx/testColorGradientWithTransparancy.docx |binary
 chart2/qa/extras/data/ods/testColorGradientWithTransparancy.ods   |binary
 include/oox/export/drawingml.hxx                                  |    6 -
 oox/source/export/chartexport.cxx                                 |   20 ++-
 oox/source/export/drawingml.cxx                                   |   55 
++++++----
 6 files changed, 83 insertions(+), 26 deletions(-)

New commits:
commit ef43ee69a355c0eda49d2f62540fbcf1299a59d2
Author:     Balazs Varga <balazs.varga...@gmail.com>
AuthorDate: Tue Oct 22 09:43:29 2019 +0200
Commit:     László Németh <nem...@numbertext.org>
CommitDate: Tue Nov 5 15:55:34 2019 +0100

    tdf#108065 tdf#128609 OOXML chart export: fix transparent color gradient
    
    Linear and axial color gradients keep their solid or gradient
    transparencies.
    
    Change-Id: I37dfe016864bded49c767cea5c8c865455281de0
    Reviewed-on: https://gerrit.libreoffice.org/81308
    Reviewed-by: László Németh <nem...@numbertext.org>
    Tested-by: László Németh <nem...@numbertext.org>

diff --git a/chart2/qa/extras/chart2export.cxx 
b/chart2/qa/extras/chart2export.cxx
index 694ba5501043..5f2b9ee6825b 100644
--- a/chart2/qa/extras/chart2export.cxx
+++ b/chart2/qa/extras/chart2export.cxx
@@ -89,6 +89,8 @@ public:
     void testChartTitlePropertiesColorFillDOCX();
     void testChartTitlePropertiesGradientFillDOCX();
     void testChartTitlePropertiesBitmapFillDOCX();
+    void testColorGradientWithTransparancyDOCX();
+    void testColorGradientWithTransparancyODS();
     void testBarChartDataPointPropDOCX();
     void testFdo83058dlblPos();
     void testAutoTitleDelXLSX();
@@ -195,6 +197,8 @@ public:
     CPPUNIT_TEST(testChartTitlePropertiesColorFillDOCX);
     CPPUNIT_TEST(testChartTitlePropertiesGradientFillDOCX);
     CPPUNIT_TEST(testChartTitlePropertiesBitmapFillDOCX);
+    CPPUNIT_TEST(testColorGradientWithTransparancyDOCX);
+    CPPUNIT_TEST(testColorGradientWithTransparancyODS);
     CPPUNIT_TEST(testBarChartDataPointPropDOCX);
     CPPUNIT_TEST(testFdo83058dlblPos);
     CPPUNIT_TEST(testAutoTitleDelXLSX);
@@ -1219,6 +1223,30 @@ void 
Chart2ExportTest::testChartTitlePropertiesBitmapFillDOCX()
     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:spPr/a:ln/a:noFill", 
1);
 }
 
+void Chart2ExportTest::testColorGradientWithTransparancyDOCX()
+{
+    // Test color gradient (two color) with gradient transparency
+    load("/chart2/qa/extras/data/docx/", 
"testColorGradientWithTransparancy.docx");
+    xmlDocPtr pXmlDoc = parseExport("word/charts/chart", "Office Open XML 
Text");
+    CPPUNIT_ASSERT(pXmlDoc);
+    // Test the transparency of the first color
+    assertXPath(pXmlDoc, 
"/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:spPr/a:gradFill/a:gsLst/a:gs[1]/a:srgbClr/a:alpha",
 "val", "60000");
+    // Test the transparency of the second color
+    assertXPath(pXmlDoc, 
"/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:spPr/a:gradFill/a:gsLst/a:gs[2]/a:srgbClr/a:alpha",
 "val", "90196");
+}
+
+void Chart2ExportTest::testColorGradientWithTransparancyODS()
+{
+    // Test color gradient (two color) with simple transparency
+    load("/chart2/qa/extras/data/ods/", 
"testColorGradientWithTransparancy.ods");
+    xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML");
+    CPPUNIT_ASSERT(pXmlDoc);
+    // Test the transparency of the first color
+    assertXPath(pXmlDoc, 
"/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:spPr/a:gradFill/a:gsLst/a:gs[1]/a:srgbClr/a:alpha",
 "val", "60000");
+    // Test the transparency of the second color
+    assertXPath(pXmlDoc, 
"/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:spPr/a:gradFill/a:gsLst/a:gs[2]/a:srgbClr/a:alpha",
 "val", "60000");
+}
+
 void Chart2ExportTest::testBarChartDataPointPropDOCX()
 {
     load("/chart2/qa/extras/data/docx/", "testBarChartDataPointPropDOCX.docx");
diff --git a/chart2/qa/extras/data/docx/testColorGradientWithTransparancy.docx 
b/chart2/qa/extras/data/docx/testColorGradientWithTransparancy.docx
new file mode 100644
index 000000000000..adc2aff042bf
Binary files /dev/null and 
b/chart2/qa/extras/data/docx/testColorGradientWithTransparancy.docx differ
diff --git a/chart2/qa/extras/data/ods/testColorGradientWithTransparancy.ods 
b/chart2/qa/extras/data/ods/testColorGradientWithTransparancy.ods
new file mode 100644
index 000000000000..d8a41c02c186
Binary files /dev/null and 
b/chart2/qa/extras/data/ods/testColorGradientWithTransparancy.ods differ
diff --git a/include/oox/export/drawingml.hxx b/include/oox/export/drawingml.hxx
index c0d451fdf0f4..a3da6a3cb442 100644
--- a/include/oox/export/drawingml.hxx
+++ b/include/oox/export/drawingml.hxx
@@ -193,10 +193,8 @@ public:
     void WriteSolidFill( const css::uno::Reference< css::beans::XPropertySet 
>& rXPropSet );
     void WriteGradientFill( const css::uno::Reference< 
css::beans::XPropertySet >& rXPropSet );
 
-    /// In case rXPropSet is set, it may serve as a source of gradient 
transparency information.
-    void WriteGradientFill(css::awt::Gradient rGradient,
-                           const 
css::uno::Reference<css::beans::XPropertySet>& rXPropSet
-                           = css::uno::Reference<css::beans::XPropertySet>());
+    void WriteGradientFill( css::awt::Gradient rGradient, css::awt::Gradient 
rTransparenceGradient,
+                            const 
css::uno::Reference<css::beans::XPropertySet>& rXPropSet = 
css::uno::Reference<css::beans::XPropertySet>());
 
     void WriteGrabBagGradientFill( const css::uno::Sequence< 
css::beans::PropertyValue >& aGradientStops, css::awt::Gradient rGradient);
 
diff --git a/oox/source/export/chartexport.cxx 
b/oox/source/export/chartexport.cxx
index 4eb82d71805e..c4bf38eff9ef 100644
--- a/oox/source/export/chartexport.cxx
+++ b/oox/source/export/chartexport.cxx
@@ -1543,16 +1543,28 @@ void ChartExport::exportGradientFill( const Reference< 
XPropertySet >& xPropSet
         xPropSet->getPropertyValue("FillGradientName") >>= sFillGradientName;
 
         awt::Gradient aGradient;
+        awt::Gradient aTransparenceGradient;
         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 )
+            uno::Any rGradientValue = xGradient->getByName( sFillGradientName 
);
+            if( rGradientValue >>= aGradient )
             {
                 mpFS->startElementNS(XML_a, XML_gradFill);
-                WriteGradientFill( aGradient );
-                mpFS->endElementNS( XML_a, XML_gradFill );
+                OUString sFillTransparenceGradientName;
+                if( 
(xPropSet->getPropertyValue("FillTransparenceGradientName") >>= 
sFillTransparenceGradientName) && !sFillTransparenceGradientName.isEmpty())
+                {
+                    uno::Reference< container::XNameAccess > 
xTransparenceGradient(xFact->createInstance("com.sun.star.drawing.TransparencyGradientTable"),
 uno::UNO_QUERY);
+                    uno::Any rTransparenceValue = 
xTransparenceGradient->getByName(sFillTransparenceGradientName);
+                    rTransparenceValue >>= aTransparenceGradient;;
+                    WriteGradientFill(aGradient, aTransparenceGradient);
+                }
+                else
+                {
+                    WriteGradientFill(aGradient, aTransparenceGradient, 
xPropSet);
+                }
+                mpFS->endElementNS(XML_a, XML_gradFill);
             }
         }
         catch (const uno::Exception &)
diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx
index fb5f6ed7a4cd..a5c152dcf6d1 100644
--- a/oox/source/export/drawingml.cxx
+++ b/oox/source/export/drawingml.cxx
@@ -481,6 +481,7 @@ bool DrawingML::EqualGradients( awt::Gradient aGradient1, 
awt::Gradient aGradien
 void DrawingML::WriteGradientFill( const Reference< XPropertySet >& rXPropSet )
 {
     awt::Gradient aGradient;
+    awt::Gradient aTransparenceGradient;
     if (GetProperty(rXPropSet, "FillGradient"))
     {
         aGradient = *o3tl::doAccess<awt::Gradient>(mAny);
@@ -515,7 +516,9 @@ void DrawingML::WriteGradientFill( const Reference< 
XPropertySet >& rXPropSet )
         else
         {
             mpFS->startElementNS(XML_a, XML_gradFill, XML_rotWithShape, "0");
-            WriteGradientFill(aGradient, rXPropSet);
+            if( GetProperty(rXPropSet, "FillTransparenceGradient") )
+                aTransparenceGradient = *o3tl::doAccess<awt::Gradient>(mAny);
+            WriteGradientFill(aGradient, aTransparenceGradient);
             mpFS->endElementNS( XML_a, XML_gradFill );
         }
     }
@@ -580,7 +583,7 @@ void DrawingML::WriteGrabBagGradientFill( const Sequence< 
PropertyValue >& aGrad
     }
 }
 
-void DrawingML::WriteGradientFill(awt::Gradient rGradient,
+void DrawingML::WriteGradientFill(awt::Gradient rGradient, awt::Gradient 
rTransparenceGradient,
                                   const uno::Reference<beans::XPropertySet>& 
rXPropSet)
 {
     switch( rGradient.Style )
@@ -588,21 +591,19 @@ void DrawingML::WriteGradientFill(awt::Gradient rGradient,
         default:
         case awt::GradientStyle_LINEAR:
         {
-            awt::Gradient aTransparenceGradient;
-            bool bTransparent = false;
-            if (rXPropSet.is() && GetProperty(rXPropSet, 
"FillTransparenceGradient"))
+            mpFS->startElementNS(XML_a, XML_gsLst);
+            sal_Int32 nStartAlpha;
+            sal_Int32 nEndAlpha;
+            if( rXPropSet.is() && GetProperty(rXPropSet, "FillTransparence") )
             {
-                aTransparenceGradient = *o3tl::doAccess<awt::Gradient>(mAny);
-                bTransparent = true;
+                sal_Int32 nTransparency = 0;
+                mAny >>= nTransparency;
+                nStartAlpha = nEndAlpha = (MAX_PERCENT - (PER_PERCENT * 
nTransparency));
             }
-
-            mpFS->startElementNS(XML_a, XML_gsLst);
-            sal_Int32 nStartAlpha = MAX_PERCENT;
-            sal_Int32 nEndAlpha = MAX_PERCENT;
-            if (bTransparent)
+            else
             {
-                nStartAlpha = 
GetAlphaFromTransparenceGradient(aTransparenceGradient, true);
-                nEndAlpha = 
GetAlphaFromTransparenceGradient(aTransparenceGradient, false);
+                nStartAlpha = 
GetAlphaFromTransparenceGradient(rTransparenceGradient, true);
+                nEndAlpha = 
GetAlphaFromTransparenceGradient(rTransparenceGradient, false);
             }
             WriteGradientStop(0, ColorWithIntensity(rGradient.StartColor, 
rGradient.StartIntensity),
                               nStartAlpha);
@@ -616,15 +617,33 @@ void DrawingML::WriteGradientFill(awt::Gradient rGradient,
         }
 
         case awt::GradientStyle_AXIAL:
+        {
             mpFS->startElementNS(XML_a, XML_gsLst);
-            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 );
+            sal_Int32 nStartAlpha;
+            sal_Int32 nEndAlpha;
+            if (rXPropSet.is() && GetProperty(rXPropSet, "FillTransparence"))
+            {
+                sal_Int32 nTransparency = 0;
+                mAny >>= nTransparency;
+                nStartAlpha = nEndAlpha = (MAX_PERCENT - (PER_PERCENT * 
nTransparency));
+            }
+            else
+            {
+                nStartAlpha = 
GetAlphaFromTransparenceGradient(rTransparenceGradient, true);
+                nEndAlpha = 
GetAlphaFromTransparenceGradient(rTransparenceGradient, false);
+            }
+            WriteGradientStop(0, ColorWithIntensity(rGradient.EndColor, 
rGradient.EndIntensity),
+                              nEndAlpha);
+            WriteGradientStop(50, ColorWithIntensity(rGradient.StartColor, 
rGradient.StartIntensity),
+                              nStartAlpha);
+            WriteGradientStop(100, ColorWithIntensity(rGradient.EndColor, 
rGradient.EndIntensity),
+                              nEndAlpha);
+            mpFS->endElementNS(XML_a, XML_gsLst);
             mpFS->singleElementNS(
                 XML_a, XML_lin, XML_ang,
                 OString::number((((3600 - rGradient.Angle + 900) * 6000) % 
21600000)));
             break;
+        }
 
         case awt::GradientStyle_RADIAL:
         {
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to