diff options
author | Zolnai Tamás <tamas.zolnai@collabora.com> | 2014-01-27 12:07:59 +0100 |
---|---|---|
committer | Zolnai Tamás <tamas.zolnai@collabora.com> | 2014-01-30 09:17:28 +0100 |
commit | 4fa88a5a636e133a6d3fa4269db2c7f52d89bc75 (patch) | |
tree | ce301e22936fb961c418eea7c6b3d0489607f50f | |
parent | 7abec64c676e6b1a8f7c005a9f4b2c710b69473d (diff) |
drawingML export: transparency of solid filled shape
Change-Id: I97968dd5f5233e17870bdfdf2864ae8ce9179080
-rw-r--r-- | 0001-drawingML-export-transparency-of-solid-filled-shape.patch | 469 | ||||
-rw-r--r-- | include/oox/export/drawingml.hxx | 6 | ||||
-rw-r--r-- | oox/source/export/drawingml.cxx | 55 | ||||
-rw-r--r-- | sw/qa/extras/ooxmlexport/data/dml-solidfill-alpha.docx | bin | 0 -> 17049 bytes | |||
-rw-r--r-- | sw/qa/extras/ooxmlexport/ooxmlexport.cxx | 11 |
5 files changed, 526 insertions, 15 deletions
diff --git a/0001-drawingML-export-transparency-of-solid-filled-shape.patch b/0001-drawingML-export-transparency-of-solid-filled-shape.patch new file mode 100644 index 000000000000..0d057ebc9ef0 --- /dev/null +++ b/0001-drawingML-export-transparency-of-solid-filled-shape.patch @@ -0,0 +1,469 @@ +From b619805c7d21ddd22c7d30b52047b6e98edf160c Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Zolnai=20Tam=C3=A1s?= <tamas.zolnai@collabora.com> +Date: Mon, 27 Jan 2014 12:07:59 +0100 +Subject: [PATCH] drawingML export: transparency of solid filled shape + +Change-Id: I97968dd5f5233e17870bdfdf2864ae8ce9179080 +--- + helpcontent2 | 2 +- + include/oox/export/drawingml.hxx | 6 +-- + oox/source/export/drawingml.cxx | 55 ++++++++++++++++----- + .../ooxmlexport/data/dml-solidfill-alpha.docx | Bin 0 -> 17049 bytes + sw/qa/extras/ooxmlexport/ooxmlexport.cxx | 13 +++++ + 5 files changed, 60 insertions(+), 16 deletions(-) + create mode 100644 sw/qa/extras/ooxmlexport/data/dml-solidfill-alpha.docx + +diff --git a/helpcontent2 b/helpcontent2 +index d1b5923..63d3d0a 160000 +--- a/helpcontent2 ++++ b/helpcontent2 +@@ -1 +1 @@ +-Subproject commit d1b5923e46b6bca00d9e2875bc94d904be894e78 ++Subproject commit 63d3d0a24085e9bbad5518be9d13284e0b1bfa06 +diff --git a/include/oox/export/drawingml.hxx b/include/oox/export/drawingml.hxx +index 31c6f20..42dd305 100644 +--- a/include/oox/export/drawingml.hxx ++++ b/include/oox/export/drawingml.hxx +@@ -114,13 +114,13 @@ public: + + OUString WriteImage( const Graphic &rGraphic ); + +- void WriteColor( sal_uInt32 nColor ); ++ void WriteColor( sal_uInt32 nColor, sal_Int32 nAlpha = 0 ); + void WriteGradientStop( sal_uInt16 nStop, sal_uInt32 nColor ); + void WriteLineArrow( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > rXPropSet, sal_Bool bLineStart ); + void WriteConnectorConnections( EscherConnectorListEntry& rConnectorEntry, sal_Int32 nStartID, sal_Int32 nEndID ); + +- void WriteSolidFill( sal_uInt32 nColor ); +- void WriteSolidFill( OUString sSchemeName ); ++ void WriteSolidFill( sal_uInt32 nColor, sal_Int32 nAlpha = 0 ); ++ void WriteSolidFill( OUString sSchemeName, sal_Int32 nAlpha = 0 ); + 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 WriteBlipFill( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > rXPropSet, OUString sURLPropName, sal_Int32 nXmlNamespace ); +diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx +index db05030..f8d1bdc 100644 +--- a/oox/source/export/drawingml.cxx ++++ b/oox/source/export/drawingml.cxx +@@ -21,6 +21,7 @@ + #include "oox/export/drawingml.hxx" + #include "oox/export/utils.hxx" + #include <oox/token/tokens.hxx> ++#include <oox/drawingml/drawingmltypes.hxx> + + #include <cstdio> + #include <com/sun/star/awt/CharSet.hpp> +@@ -148,7 +149,7 @@ bool DrawingML::GetPropertyAndState( Reference< XPropertySet > rXPropSet, Refere + return bRetValue; + } + +-void DrawingML::WriteColor( sal_uInt32 nColor ) ++void DrawingML::WriteColor( sal_uInt32 nColor, sal_Int32 nAlpha ) + { + OString sColor = OString::number( nColor, 16 ); + if( sColor.getLength() < 6 ) { +@@ -164,22 +165,43 @@ void DrawingML::WriteColor( sal_uInt32 nColor ) + + sColor = sBuf.getStr(); + } +- mpFS->singleElementNS( XML_a, XML_srgbClr, XML_val, sColor.getStr(), FSEND ); ++ if( nAlpha ) ++ { ++ mpFS->startElementNS( XML_a, XML_srgbClr, XML_val, sColor.getStr(), FSEND ); ++ mpFS->singleElementNS( XML_a, XML_alpha, XML_val, OString::number(nAlpha), FSEND ); ++ mpFS->endElementNS( XML_a, XML_srgbClr ); ++ ++ } ++ else ++ { ++ mpFS->singleElementNS( XML_a, XML_srgbClr, XML_val, sColor.getStr(), FSEND ); ++ } + } + +-void DrawingML::WriteSolidFill( sal_uInt32 nColor ) ++void DrawingML::WriteSolidFill( sal_uInt32 nColor, sal_Int32 nAlpha ) + { + mpFS->startElementNS( XML_a, XML_solidFill, FSEND ); +- WriteColor( nColor ); ++ WriteColor( nColor, nAlpha ); + mpFS->endElementNS( XML_a, XML_solidFill ); + } + +-void DrawingML::WriteSolidFill( OUString sSchemeName ) ++void DrawingML::WriteSolidFill( OUString sSchemeName, sal_Int32 nAlpha ) + { + mpFS->startElementNS( XML_a, XML_solidFill, FSEND ); +- mpFS->singleElementNS( XML_a, XML_schemeClr, XML_val, +- OUStringToOString( sSchemeName, RTL_TEXTENCODING_ASCII_US ).getStr(), +- FSEND ); ++ if( nAlpha ) ++ { ++ mpFS->startElementNS( XML_a, XML_schemeClr, XML_val, ++ OUStringToOString( sSchemeName, RTL_TEXTENCODING_ASCII_US ).getStr(), ++ FSEND ); ++ mpFS->singleElementNS( XML_a, XML_alpha, XML_val, OString::number(nAlpha), FSEND ); ++ mpFS->endElementNS( XML_a, XML_schemeClr ); ++ } ++ else ++ { ++ mpFS->singleElementNS( XML_a, XML_schemeClr, XML_val, ++ OUStringToOString( sSchemeName, RTL_TEXTENCODING_ASCII_US ).getStr(), ++ FSEND ); ++ } + mpFS->endElementNS( XML_a, XML_solidFill ); + } + +@@ -208,13 +230,22 @@ void DrawingML::WriteSolidFill( Reference< XPropertySet > rXPropSet ) + aGrabBag[i].Value >>= aStyleProperties; + } + ++ sal_Int32 nAlpha = 0; ++ if( GetProperty( rXPropSet, "FillTransparence" ) ) ++ { ++ sal_Int32 nTransparency; ++ rXPropSet->getPropertyValue( "FillTransparence" ) >>= nTransparency; ++ // Calculate alpha value (see oox/source/drawingml/color.cxx : getTransparency()) ++ nAlpha = (MAX_PERCENT - ( PER_PERCENT * nTransparency ) ); ++ } ++ + // write XML + if ( nFillColor != nOriginalColor ) + // the user has set a different color for the shape +- WriteSolidFill( nFillColor & 0xffffff ); ++ WriteSolidFill( nFillColor & 0xffffff, nAlpha ); + else if ( !sColorFillScheme.isEmpty() ) + // the shape had a scheme color and the user didn't change it +- WriteSolidFill( sColorFillScheme ); ++ WriteSolidFill( sColorFillScheme, nAlpha ); + else if ( aStyleProperties.hasElements() ) + { + sal_uInt32 nThemeColor = 0; +@@ -226,13 +257,13 @@ void DrawingML::WriteSolidFill( Reference< XPropertySet > rXPropSet ) + } + if ( nFillColor != nThemeColor ) + // the shape contains a theme but it wasn't being used +- WriteSolidFill( nFillColor & 0xffffff ); ++ WriteSolidFill( 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. + } + else + // the shape had a custom color and the user didn't change it +- WriteSolidFill( nFillColor & 0xffffff ); ++ WriteSolidFill( nFillColor & 0xffffff, nAlpha ); + } + + void DrawingML::WriteGradientStop( sal_uInt16 nStop, sal_uInt32 nColor ) +diff --git a/sw/qa/extras/ooxmlexport/data/dml-solidfill-alpha.docx b/sw/qa/extras/ooxmlexport/data/dml-solidfill-alpha.docx +new file mode 100644 +index 0000000000000000000000000000000000000000..9f2c46d2e827207787caeacfd79af742e09c140a +GIT binary patch +literal 17049 +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 + +literal 0 +HcmV?d00001 + +diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx +index 90a6b9c..e3735e7 100644 +--- a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx ++++ b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx +@@ -2624,6 +2624,19 @@ DECLARE_OOXMLEXPORT_TEST(testFdo73556,"fdo73556.docx") + CPPUNIT_ASSERT_EQUAL(sal_Int32(3751), tableWidth); + } + ++DECLARE_OOXMLEXPORT_TEST(testDMLSolidfillAlpha, "dml-solidfill-alpha.docx") ++{ ++ // Problem was that the transparency was not exported (a:alpha). ++ // RGB color (a:srgbClr) ++ uno::Reference<beans::XPropertySet> xShape(getShape(1), uno::UNO_QUERY); ++ CPPUNIT_ASSERT_EQUAL(sal_Int32(0x000101FF), getProperty<sal_Int32>(xShape, "FillColor")); ++ CPPUNIT_ASSERT_EQUAL(sal_Int16(70), getProperty<sal_Int16>(xShape, "FillTransparence")); ++ ++ // Theme color (a:schemeClr) ++ xShape.set(getShape(2), uno::UNO_QUERY); ++ CPPUNIT_ASSERT_EQUAL(sal_Int32(0x004F81BD), getProperty<sal_Int32>(xShape, "FillColor")); ++ CPPUNIT_ASSERT_EQUAL(sal_Int16(20), getProperty<sal_Int16>(xShape, "FillTransparence")); ++} + #endif + + CPPUNIT_PLUGIN_IMPLEMENT(); +-- +1.8.4 + diff --git a/include/oox/export/drawingml.hxx b/include/oox/export/drawingml.hxx index 445e895875fb..000cd4e81302 100644 --- a/include/oox/export/drawingml.hxx +++ b/include/oox/export/drawingml.hxx @@ -115,13 +115,13 @@ public: OUString WriteImage( const Graphic &rGraphic ); - void WriteColor( sal_uInt32 nColor ); + void WriteColor( sal_uInt32 nColor, sal_Int32 nAlpha = 0 ); void WriteGradientStop( sal_uInt16 nStop, sal_uInt32 nColor ); void WriteLineArrow( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > rXPropSet, sal_Bool bLineStart ); void WriteConnectorConnections( EscherConnectorListEntry& rConnectorEntry, sal_Int32 nStartID, sal_Int32 nEndID ); - void WriteSolidFill( sal_uInt32 nColor ); - void WriteSolidFill( OUString sSchemeName ); + void WriteSolidFill( sal_uInt32 nColor, sal_Int32 nAlpha = 0 ); + void WriteSolidFill( OUString sSchemeName, sal_Int32 nAlpha = 0 ); 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 WriteBlipFill( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > rXPropSet, OUString sURLPropName, sal_Int32 nXmlNamespace ); diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx index 3b84ea0ff8b9..c9eefec9825c 100644 --- a/oox/source/export/drawingml.cxx +++ b/oox/source/export/drawingml.cxx @@ -22,6 +22,7 @@ #include "oox/export/utils.hxx" #include <oox/drawingml/color.hxx> #include <oox/token/tokens.hxx> +#include <oox/drawingml/drawingmltypes.hxx> #include <cstdio> #include <com/sun/star/awt/CharSet.hpp> @@ -149,7 +150,7 @@ bool DrawingML::GetPropertyAndState( Reference< XPropertySet > rXPropSet, Refere return bRetValue; } -void DrawingML::WriteColor( sal_uInt32 nColor ) +void DrawingML::WriteColor( sal_uInt32 nColor, sal_Int32 nAlpha ) { OString sColor = OString::number( nColor, 16 ); if( sColor.getLength() < 6 ) { @@ -165,22 +166,43 @@ void DrawingML::WriteColor( sal_uInt32 nColor ) sColor = sBuf.getStr(); } - mpFS->singleElementNS( XML_a, XML_srgbClr, XML_val, sColor.getStr(), FSEND ); + if( nAlpha ) + { + mpFS->startElementNS( XML_a, XML_srgbClr, XML_val, sColor.getStr(), FSEND ); + mpFS->singleElementNS( XML_a, XML_alpha, XML_val, OString::number(nAlpha), FSEND ); + mpFS->endElementNS( XML_a, XML_srgbClr ); + + } + else + { + mpFS->singleElementNS( XML_a, XML_srgbClr, XML_val, sColor.getStr(), FSEND ); + } } -void DrawingML::WriteSolidFill( sal_uInt32 nColor ) +void DrawingML::WriteSolidFill( sal_uInt32 nColor, sal_Int32 nAlpha ) { mpFS->startElementNS( XML_a, XML_solidFill, FSEND ); - WriteColor( nColor ); + WriteColor( nColor, nAlpha ); mpFS->endElementNS( XML_a, XML_solidFill ); } -void DrawingML::WriteSolidFill( OUString sSchemeName ) +void DrawingML::WriteSolidFill( OUString sSchemeName, sal_Int32 nAlpha ) { mpFS->startElementNS( XML_a, XML_solidFill, FSEND ); - mpFS->singleElementNS( XML_a, XML_schemeClr, XML_val, - OUStringToOString( sSchemeName, RTL_TEXTENCODING_ASCII_US ).getStr(), - FSEND ); + if( nAlpha ) + { + mpFS->startElementNS( XML_a, XML_schemeClr, XML_val, + OUStringToOString( sSchemeName, RTL_TEXTENCODING_ASCII_US ).getStr(), + FSEND ); + mpFS->singleElementNS( XML_a, XML_alpha, XML_val, OString::number(nAlpha), FSEND ); + mpFS->endElementNS( XML_a, XML_schemeClr ); + } + else + { + mpFS->singleElementNS( XML_a, XML_schemeClr, XML_val, + OUStringToOString( sSchemeName, RTL_TEXTENCODING_ASCII_US ).getStr(), + FSEND ); + } mpFS->endElementNS( XML_a, XML_solidFill ); } @@ -209,13 +231,22 @@ void DrawingML::WriteSolidFill( Reference< XPropertySet > rXPropSet ) aGrabBag[i].Value >>= aStyleProperties; } + sal_Int32 nAlpha = 0; + if( GetProperty( rXPropSet, "FillTransparence" ) ) + { + sal_Int32 nTransparency; + rXPropSet->getPropertyValue( "FillTransparence" ) >>= nTransparency; + // Calculate alpha value (see oox/source/drawingml/color.cxx : getTransparency()) + nAlpha = (MAX_PERCENT - ( PER_PERCENT * nTransparency ) ); + } + // write XML if ( nFillColor != nOriginalColor ) // the user has set a different color for the shape - WriteSolidFill( nFillColor & 0xffffff ); + WriteSolidFill( nFillColor & 0xffffff, nAlpha ); else if ( !sColorFillScheme.isEmpty() ) // the shape had a scheme color and the user didn't change it - WriteSolidFill( sColorFillScheme ); + WriteSolidFill( sColorFillScheme, nAlpha ); else if ( aStyleProperties.hasElements() ) { sal_uInt32 nThemeColor = 0; @@ -227,13 +258,13 @@ void DrawingML::WriteSolidFill( Reference< XPropertySet > rXPropSet ) } if ( nFillColor != nThemeColor ) // the shape contains a theme but it wasn't being used - WriteSolidFill( nFillColor & 0xffffff ); + WriteSolidFill( 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. } else // the shape had a custom color and the user didn't change it - WriteSolidFill( nFillColor & 0xffffff ); + WriteSolidFill( nFillColor & 0xffffff, nAlpha ); } void DrawingML::WriteGradientStop( sal_uInt16 nStop, sal_uInt32 nColor ) diff --git a/sw/qa/extras/ooxmlexport/data/dml-solidfill-alpha.docx b/sw/qa/extras/ooxmlexport/data/dml-solidfill-alpha.docx Binary files differnew file mode 100644 index 000000000000..9f2c46d2e827 --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/dml-solidfill-alpha.docx diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx index 746422e368e4..315fb0ba29f4 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx @@ -2698,6 +2698,17 @@ DECLARE_OOXMLEXPORT_TEST(testLineStyle_DashType, "LineStyle_DashType.docx") assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:r[2]/mc:AlternateContent/mc:Choice/w:drawing/wp:anchor/a:graphic/a:graphicData/wps:wsp/wps:spPr/a:ln/a:prstDash", "val", "dash"); } +DECLARE_OOXMLEXPORT_TEST(testDMLSolidfillAlpha, "dml-solidfill-alpha.docx") +{ + // Problem was that the transparency was not exported (a:alpha). + // RGB color (a:srgbClr) + uno::Reference<beans::XPropertySet> xShape(getShape(1), uno::UNO_QUERY);; + CPPUNIT_ASSERT_EQUAL(sal_Int16(70), getProperty<sal_Int16>(xShape, "FillTransparence")); + + // Theme color (a:schemeClr) + xShape.set(getShape(2), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int16(20), getProperty<sal_Int16>(xShape, "FillTransparence")); +} #endif CPPUNIT_PLUGIN_IMPLEMENT(); |