diff options
author | Tamás Zolnai <tamas.zolnai@collabora.com> | 2019-05-18 17:42:25 +0200 |
---|---|---|
committer | Tamás Zolnai <tamas.zolnai@collabora.com> | 2019-05-20 16:46:19 +0200 |
commit | 259d01a34d27df2fbfd11c3bf6fe9dc508ff6ac2 (patch) | |
tree | b1b8acf552ec6cea17a16f2044eb3e4b33623ea6 /oox | |
parent | 0385f4235850b8c3949f6564e1e5b79cbe56b146 (diff) |
tdf#125360: PPTX: Shape fill transparency is not exported
.. if the original shape fill is defined with a theme
Override the alpha value with the current value get from
FillTransparence API attirbute even if the color is defined
with a style or a color scheme.
Change-Id: I09d26238a9c2b501279e6749687dc535e614bbd6
Reviewed-on: https://gerrit.libreoffice.org/72596
Tested-by: Jenkins
Reviewed-by: Tamás Zolnai <tamas.zolnai@collabora.com>
Diffstat (limited to 'oox')
-rw-r--r-- | oox/source/export/drawingml.cxx | 47 |
1 files changed, 37 insertions, 10 deletions
diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx index 78225dcc532a..cd91bb12cbe0 100644 --- a/oox/source/export/drawingml.cxx +++ b/oox/source/export/drawingml.cxx @@ -268,7 +268,7 @@ void DrawingML::WriteColor( ::Color nColor, sal_Int32 nAlpha ) } } -void DrawingML::WriteColor( const OUString& sColorSchemeName, const Sequence< PropertyValue >& aTransformations ) +void DrawingML::WriteColor( const OUString& sColorSchemeName, const Sequence< PropertyValue >& aTransformations, sal_Int32 nAlpha ) { // prevent writing a tag with empty val attribute if( sColorSchemeName.isEmpty() ) @@ -277,7 +277,13 @@ void DrawingML::WriteColor( const OUString& sColorSchemeName, const Sequence< Pr if( aTransformations.hasElements() ) { mpFS->startElementNS(XML_a, XML_schemeClr, XML_val, sColorSchemeName.toUtf8()); - WriteColorTransformations( aTransformations ); + WriteColorTransformations( aTransformations, nAlpha ); + mpFS->endElementNS( XML_a, XML_schemeClr ); + } + else if(nAlpha < MAX_PERCENT) + { + mpFS->startElementNS(XML_a, XML_schemeClr, XML_val, sColorSchemeName.toUtf8()); + mpFS->singleElementNS(XML_a, XML_alpha, XML_val, OString::number(nAlpha)); mpFS->endElementNS( XML_a, XML_schemeClr ); } else @@ -286,15 +292,22 @@ void DrawingML::WriteColor( const OUString& sColorSchemeName, const Sequence< Pr } } -void DrawingML::WriteColorTransformations( const Sequence< PropertyValue >& aTransformations ) +void DrawingML::WriteColorTransformations( const Sequence< PropertyValue >& aTransformations, sal_Int32 nAlpha ) { for( sal_Int32 i = 0; i < aTransformations.getLength(); i++ ) { sal_Int32 nToken = Color::getColorTransformationToken( aTransformations[i].Name ); if( nToken != XML_TOKEN_INVALID && aTransformations[i].Value.hasValue() ) { - sal_Int32 nValue = aTransformations[i].Value.get<sal_Int32>(); - mpFS->singleElementNS(XML_a, nToken, XML_val, OString::number(nValue)); + if(nToken == XML_alpha && nAlpha < MAX_PERCENT) + { + mpFS->singleElementNS(XML_a, nToken, XML_val, OString::number(nAlpha)); + } + else + { + sal_Int32 nValue = aTransformations[i].Value.get<sal_Int32>(); + mpFS->singleElementNS(XML_a, nToken, XML_val, OString::number(nValue)); + } } } } @@ -306,10 +319,10 @@ void DrawingML::WriteSolidFill( ::Color nColor, sal_Int32 nAlpha ) mpFS->endElementNS( XML_a, XML_solidFill ); } -void DrawingML::WriteSolidFill( const OUString& sSchemeName, const Sequence< PropertyValue >& aTransformations ) +void DrawingML::WriteSolidFill( const OUString& sSchemeName, const Sequence< PropertyValue >& aTransformations, sal_Int32 nAlpha ) { mpFS->startElementNS(XML_a, XML_solidFill); - WriteColor( sSchemeName, aTransformations ); + WriteColor( sSchemeName, aTransformations, nAlpha ); mpFS->endElementNS( XML_a, XML_solidFill ); } @@ -359,22 +372,36 @@ void DrawingML::WriteSolidFill( const Reference< XPropertySet >& rXPropSet ) else if ( !sColorFillScheme.isEmpty() ) { // the shape had a scheme color and the user didn't change it - WriteSolidFill( sColorFillScheme, aTransformations ); + WriteSolidFill( sColorFillScheme, aTransformations, nAlpha ); } else if ( aStyleProperties.hasElements() ) { sal_uInt32 nThemeColor = 0; + sal_Int32 nThemeAlpha = MAX_PERCENT; for( sal_Int32 i=0; i < aStyleProperties.getLength(); ++i ) { if( aStyleProperties[i].Name == "Color" ) { aStyleProperties[i].Value >>= nThemeColor; - break; + } + else if(aStyleProperties[i].Name == "Transformations" ) + { + Sequence< PropertyValue > aStyleTransformations; + aStyleProperties[i].Value >>= aStyleTransformations; + for( sal_Int32 j = 0; j < aStyleTransformations.getLength(); j++ ) + { + if (aStyleTransformations[j].Name == "alpha" ) + { + aStyleTransformations[j].Value >>= nThemeAlpha; + break; + } + } } } - if ( nFillColor != nThemeColor ) + if ( nFillColor != nThemeColor || nAlpha != nThemeAlpha ) // the shape contains a theme but it wasn't being used WriteSolidFill( ::Color(nFillColor & 0xffffff), nAlpha ); + // in case the shape used the style color and the user didn't change it, // we must not write a <a: solidFill> tag. } |