From bc0a9076aa43a0782bcf81e55d3f84f6af0f68e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Aragunde=20P=C3=A9rez?= Date: Thu, 16 Jan 2014 10:27:46 +0100 Subject: [PATCH] ooxml: Preserve shape theme attribute for solid fill Users can select the fill color for a shape among the theme-defined colors. This results in the following XML: ... ... Now we store both the original fill color and the name of the theme-defined color, if it exists, on the import phase. They are put into the InteropGrabBag of the shape with the names OriginalSolidFillClr and SpPrSolidFillSchemeClr. Additionally, we needed to to store the decoded theme color inside StyleFillRef. On the export phase we have to take into account several combinations of factors: * If the final color for the shape fill is different from the original color, we must ignore any theme attributes and write the new color. * If the fill color is unchanged and some theme color exists, we must write the theme color. * If the fill color is unchanged and no theme color exists, we must check if the original color matches the style-defined color. If it does, we must not write any tag. * Otherwise we must write the tag with the RGB color. The method putPropertiesToGrabBag was added to the Shape object for convenience. The data files for some /sd/qa/ unit tests were updated to reflect the new properties inside the Shape InteropGrabBag. Change-Id: If0915c5442872a8acab0a8a081f60c89c97277bd --- include/oox/drawingml/shape.hxx | 2 + include/oox/export/drawingml.hxx | 1 + oox/source/drawingml/shape.cxx | 43 ++- oox/source/export/drawingml.cxx | 59 +++- sd/qa/unit/data/xml/fdo47434_0.xml | 8 + sd/qa/unit/data/xml/fdo71434_0.xml | 4 +- sd/qa/unit/data/xml/n593612_0.xml | 5 +- sd/qa/unit/data/xml/n762695_0.xml | 11 +- sd/qa/unit/data/xml/n762695_1.xml | 20 +- sd/qa/unit/data/xml/n819614_0.xml | 448 ++++++++++++++++++++++------- sd/qa/unit/data/xml/n820786_0.xml | 108 ++++++- 11 files changed, 583 insertions(+), 126 deletions(-) diff --git a/include/oox/drawingml/shape.hxx b/include/oox/drawingml/shape.hxx index 01cc1e97710b..c1618ba69133 100644 --- a/include/oox/drawingml/shape.hxx +++ b/include/oox/drawingml/shape.hxx @@ -219,6 +219,8 @@ protected: void putPropertyToGrabBag( const ::com::sun::star::beans::PropertyValue& pProperty ); + void putPropertiesToGrabBag( + const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& aProperties ); std::vector< ShapePtr > maChildren; // only used for group shapes com::sun::star::awt::Size maChSize; // only used for group shapes diff --git a/include/oox/export/drawingml.hxx b/include/oox/export/drawingml.hxx index 2de1ba0187ee..65ae6f3d1281 100644 --- a/include/oox/export/drawingml.hxx +++ b/include/oox/export/drawingml.hxx @@ -118,6 +118,7 @@ public: void WriteConnectorConnections( EscherConnectorListEntry& rConnectorEntry, sal_Int32 nStartID, sal_Int32 nEndID ); void WriteSolidFill( sal_uInt32 nColor ); + void WriteSolidFill( OUString sSchemeName ); 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/drawingml/shape.cxx b/oox/source/drawingml/shape.cxx index 09d74bf2ded1..c9889db608d0 100644 --- a/oox/source/drawingml/shape.cxx +++ b/oox/source/drawingml/shape.cxx @@ -568,11 +568,13 @@ Reference< XShape > Shape::createAndInsert( OUString sColorScheme = pFillRef->maPhClr.getSchemeName(); if( !sColorScheme.isEmpty() ) { - Sequence< PropertyValue > aProperties(2); + Sequence< PropertyValue > aProperties(3); aProperties[0].Name = "SchemeClr"; aProperties[0].Value = Any( sColorScheme ); aProperties[1].Name = "Idx"; aProperties[1].Value = Any( pFillRef->mnThemedIdx ); + aProperties[2].Name = "Color"; + aProperties[2].Value = Any( nFillPhClr ); PropertyValue pStyleFillRef; pStyleFillRef.Name = "StyleFillRef"; @@ -764,6 +766,18 @@ Reference< XShape > Shape::createAndInsert( mxShape->setPosition(awt::Point(aShapeRectHmm.X, aShapeRectHmm.Y)); mxShape->setSize(awt::Size(aShapeRectHmm.Width, aShapeRectHmm.Height)); } + + Sequence< PropertyValue > aProperties( 1 ); + aProperties[0].Name = "OriginalSolidFillClr"; + aProperties[0].Value = aShapeProps[PROP_FillColor]; + OUString sColorFillScheme = aFillProperties.maFillColor.getSchemeName(); + if( !aFillProperties.maFillColor.isPlaceHolder() && !sColorFillScheme.isEmpty() ) + { + aProperties.realloc( 2 ); + aProperties[1].Name = "SpPrSolidFillSchemeClr"; + aProperties[1].Value = Any( sColorFillScheme ); + } + putPropertiesToGrabBag( aProperties ); } // These can have a custom geometry, so position should be set here, @@ -1070,6 +1084,33 @@ void Shape::putPropertyToGrabBag( const PropertyValue& pProperty ) } } +void Shape::putPropertiesToGrabBag( const Sequence< PropertyValue >& aProperties ) +{ + Reference< XPropertySet > xSet( mxShape, UNO_QUERY ); + Reference< XPropertySetInfo > xSetInfo( xSet->getPropertySetInfo() ); + const OUString& aGrabBagPropName = OUString( UNO_NAME_MISC_OBJ_INTEROPGRABBAG ); + if( mxShape.is() && xSet.is() && xSetInfo.is() && xSetInfo->hasPropertyByName( aGrabBagPropName ) ) + { + // get existing grab bag + Sequence< PropertyValue > aGrabBag; + xSet->getPropertyValue( aGrabBagPropName ) >>= aGrabBag; + sal_Int32 length = aGrabBag.getLength(); + + // update grab bag size to contain the new items + aGrabBag.realloc( length + aProperties.getLength() ); + + // put the new items + for( sal_Int32 i=0; i < aProperties.getLength(); ++i ) + { + aGrabBag[length + i].Name = aProperties[i].Name; + aGrabBag[length + i].Value = aProperties[i].Value; + } + + // put it back to the shape + xSet->setPropertyValue( aGrabBagPropName, Any( aGrabBag ) ); + } +} + // ============================================================================ } } diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx index e98a3260837a..ebcfb165cb54 100644 --- a/oox/source/export/drawingml.cxx +++ b/oox/source/export/drawingml.cxx @@ -174,10 +174,65 @@ void DrawingML::WriteSolidFill( sal_uInt32 nColor ) mpFS->endElementNS( XML_a, XML_solidFill ); } +void DrawingML::WriteSolidFill( OUString sSchemeName ) +{ + mpFS->startElementNS( XML_a, XML_solidFill, FSEND ); + mpFS->singleElementNS( XML_a, XML_schemeClr, XML_val, + OUStringToOString( sSchemeName, RTL_TEXTENCODING_ASCII_US ).getStr(), + FSEND ); + mpFS->endElementNS( XML_a, XML_solidFill ); +} + void DrawingML::WriteSolidFill( Reference< XPropertySet > rXPropSet ) { - if ( GetProperty( rXPropSet, "FillColor" ) ) - WriteSolidFill( *((sal_uInt32*) mAny.getValue()) & 0xffffff ); + // get fill color + sal_uInt32 nFillColor; + if ( !GetProperty( rXPropSet, "FillColor" ) ) + return; + mAny >>= nFillColor; + + // get InteropGrabBag and search the relevant attributes + OUString sColorFillScheme; + sal_uInt32 nOriginalColor; + Sequence< PropertyValue > aStyleProperties; + if ( GetProperty( rXPropSet, "InteropGrabBag" ) ) + { + Sequence< PropertyValue > aGrabBag; + mAny >>= aGrabBag; + for( sal_Int32 i=0; i < aGrabBag.getLength(); ++i ) + if( aGrabBag[i].Name == "SpPrSolidFillSchemeClr" ) + aGrabBag[i].Value >>= sColorFillScheme; + else if( aGrabBag[i].Name == "OriginalSolidFillClr" ) + aGrabBag[i].Value >>= nOriginalColor; + else if( aGrabBag[i].Name == "StyleFillRef" ) + aGrabBag[i].Value >>= aStyleProperties; + } + + // write XML + if ( nFillColor != nOriginalColor ) + // the user has set a different color for the shape + WriteSolidFill( nFillColor & 0xffffff ); + else if ( !sColorFillScheme.isEmpty() ) + // the shape had a scheme color and the user didn't change it + WriteSolidFill( sColorFillScheme ); + else if ( aStyleProperties.hasElements() ) + { + sal_uInt32 nThemeColor; + for( sal_Int32 i=0; i < aStyleProperties.getLength(); ++i ) + if( aStyleProperties[i].Name == "Color" ) + { + aStyleProperties[i].Value >>= nThemeColor; + break; + } + if ( nFillColor != nThemeColor ) + // the shape contains a theme but it wasn't being used + WriteSolidFill( nFillColor & 0xffffff ); + // in case the shape used the style color and the user didn't change it, + // we must not write a tag. + } + else + // the shape had a custom color and the user didn't change it + WriteSolidFill( nFillColor & 0xffffff ); } void DrawingML::WriteGradientStop( sal_uInt16 nStop, sal_uInt32 nColor ) diff --git a/sd/qa/unit/data/xml/fdo47434_0.xml b/sd/qa/unit/data/xml/fdo47434_0.xml index 21b0a2931e08..f091b2aae6e4 100644 --- a/sd/qa/unit/data/xml/fdo47434_0.xml +++ b/sd/qa/unit/data/xml/fdo47434_0.xml @@ -24,10 +24,12 @@ + + @@ -92,10 +94,12 @@ + + @@ -160,10 +164,12 @@ + + @@ -228,10 +234,12 @@ + + diff --git a/sd/qa/unit/data/xml/fdo71434_0.xml b/sd/qa/unit/data/xml/fdo71434_0.xml index 1605ba5e408c..46efeb13c295 100644 --- a/sd/qa/unit/data/xml/fdo71434_0.xml +++ b/sd/qa/unit/data/xml/fdo71434_0.xml @@ -6,6 +6,8 @@ - + + + diff --git a/sd/qa/unit/data/xml/n593612_0.xml b/sd/qa/unit/data/xml/n593612_0.xml index c4501c4dee23..aa5d1f7f5212 100644 --- a/sd/qa/unit/data/xml/n593612_0.xml +++ b/sd/qa/unit/data/xml/n593612_0.xml @@ -13,7 +13,10 @@ - + + + + diff --git a/sd/qa/unit/data/xml/n762695_0.xml b/sd/qa/unit/data/xml/n762695_0.xml index 1d1e35f1581c..7b61b2e9c768 100644 --- a/sd/qa/unit/data/xml/n762695_0.xml +++ b/sd/qa/unit/data/xml/n762695_0.xml @@ -14,10 +14,13 @@ + + + @@ -107,7 +110,9 @@ - + + + @@ -185,7 +190,9 @@ - + + + diff --git a/sd/qa/unit/data/xml/n762695_1.xml b/sd/qa/unit/data/xml/n762695_1.xml index fb24ba080015..2cc28c2caf35 100644 --- a/sd/qa/unit/data/xml/n762695_1.xml +++ b/sd/qa/unit/data/xml/n762695_1.xml @@ -13,7 +13,9 @@ - + + + @@ -100,7 +102,9 @@ - + + + @@ -187,7 +191,9 @@ - + + + @@ -341,7 +347,9 @@ - + + + @@ -495,7 +503,9 @@ - + + + diff --git a/sd/qa/unit/data/xml/n819614_0.xml b/sd/qa/unit/data/xml/n819614_0.xml index 6a834be4c2f5..8157412ddd5c 100644 --- a/sd/qa/unit/data/xml/n819614_0.xml +++ b/sd/qa/unit/data/xml/n819614_0.xml @@ -38,7 +38,9 @@ - + + + @@ -98,7 +100,9 @@ - + + + @@ -158,7 +162,9 @@ - + + + @@ -218,7 +224,9 @@ - + + + @@ -282,7 +290,9 @@ - + + + @@ -342,7 +352,9 @@ - + + + @@ -402,7 +414,9 @@ - + + + @@ -462,7 +476,9 @@ - + + + @@ -522,7 +538,9 @@ - + + + @@ -582,7 +600,9 @@ - + + + @@ -642,7 +662,9 @@ - + + + @@ -706,7 +728,9 @@ - + + + @@ -766,7 +790,9 @@ - + + + @@ -826,7 +852,9 @@ - + + + @@ -886,7 +914,9 @@ - + + + @@ -950,7 +980,9 @@ - + + + @@ -1010,7 +1042,9 @@ - + + + @@ -1070,7 +1104,9 @@ - + + + @@ -1130,7 +1166,9 @@ - + + + @@ -1190,7 +1228,9 @@ - + + + @@ -1250,7 +1290,9 @@ - + + + @@ -1310,7 +1352,9 @@ - + + + @@ -1370,7 +1414,9 @@ - + + + @@ -1430,7 +1476,9 @@ - + + + @@ -1490,7 +1538,9 @@ - + + + @@ -1550,7 +1600,9 @@ - + + + @@ -1614,7 +1666,9 @@ - + + + @@ -1674,7 +1728,9 @@ - + + + @@ -1734,7 +1790,9 @@ - + + + @@ -1794,7 +1852,9 @@ - + + + @@ -1854,7 +1914,9 @@ - + + + @@ -1914,7 +1976,9 @@ - + + + @@ -1974,7 +2038,9 @@ - + + + @@ -2038,7 +2104,9 @@ - + + + @@ -2098,7 +2166,9 @@ - + + + @@ -2158,7 +2228,9 @@ - + + + @@ -2218,7 +2290,9 @@ - + + + @@ -2278,7 +2352,9 @@ - + + + @@ -2338,7 +2414,9 @@ - + + + @@ -2398,7 +2476,9 @@ - + + + @@ -2458,7 +2538,9 @@ - + + + @@ -2518,7 +2600,9 @@ - + + + @@ -2578,7 +2662,9 @@ - + + + @@ -2638,7 +2724,9 @@ - + + + @@ -2702,7 +2790,9 @@ - + + + @@ -2762,7 +2852,9 @@ - + + + @@ -2822,7 +2914,9 @@ - + + + @@ -2882,7 +2976,9 @@ - + + + @@ -2942,7 +3038,9 @@ - + + + @@ -3002,7 +3100,9 @@ - + + + @@ -3062,7 +3162,9 @@ - + + + @@ -3122,7 +3224,9 @@ - + + + @@ -3182,7 +3286,9 @@ - + + + @@ -3242,7 +3348,9 @@ - + + + @@ -3302,7 +3410,9 @@ - + + + @@ -3366,7 +3476,9 @@ - + + + @@ -3431,7 +3543,9 @@ - + + + @@ -3496,7 +3610,9 @@ - + + + @@ -3561,7 +3677,10 @@ - + + + + @@ -3626,7 +3745,9 @@ - + + + @@ -3691,7 +3812,9 @@ - + + + @@ -3756,7 +3879,9 @@ - + + + @@ -3821,7 +3946,9 @@ - + + + @@ -3886,7 +4013,9 @@ - + + + @@ -3951,7 +4080,9 @@ - + + + @@ -4016,7 +4147,9 @@ - + + + @@ -4081,7 +4214,9 @@ - + + + @@ -4146,7 +4281,9 @@ - + + + @@ -4211,7 +4348,9 @@ - + + + @@ -4276,7 +4415,9 @@ - + + + @@ -4341,7 +4482,9 @@ - + + + @@ -4406,7 +4549,9 @@ - + + + @@ -4471,7 +4616,9 @@ - + + + @@ -4536,7 +4683,9 @@ - + + + @@ -4601,7 +4750,9 @@ - + + + @@ -4666,7 +4817,9 @@ - + + + @@ -4731,7 +4884,9 @@ - + + + @@ -4796,7 +4951,9 @@ - + + + @@ -4861,7 +5018,9 @@ - + + + @@ -4926,7 +5085,9 @@ - + + + @@ -4991,7 +5152,9 @@ - + + + @@ -5056,7 +5219,9 @@ - + + + @@ -5121,7 +5286,9 @@ - + + + @@ -5186,7 +5353,9 @@ - + + + @@ -5251,7 +5420,9 @@ - + + + @@ -5316,7 +5487,9 @@ - + + + @@ -5381,7 +5554,9 @@ - + + + @@ -5446,7 +5621,9 @@ - + + + @@ -5511,7 +5688,9 @@ - + + + @@ -5576,7 +5755,10 @@ - + + + + @@ -5641,7 +5823,9 @@ - + + + @@ -5706,7 +5890,10 @@ - + + + + @@ -5771,7 +5958,9 @@ - + + + @@ -5836,7 +6025,9 @@ - + + + @@ -5901,7 +6092,9 @@ - + + + @@ -5966,7 +6159,9 @@ - + + + @@ -6031,7 +6226,9 @@ - + + + @@ -6096,7 +6293,9 @@ - + + + @@ -6161,7 +6360,9 @@ - + + + @@ -6226,7 +6427,9 @@ - + + + @@ -6291,7 +6494,9 @@ - + + + @@ -6356,7 +6561,9 @@ - + + + @@ -6421,7 +6628,9 @@ - + + + @@ -6486,7 +6695,9 @@ - + + + @@ -6551,7 +6762,10 @@ - + + + + @@ -6616,7 +6830,9 @@ - + + + @@ -6681,7 +6897,9 @@ - + + + @@ -6746,7 +6964,9 @@ - + + + @@ -6811,7 +7031,9 @@ - + + + @@ -6876,7 +7098,9 @@ - + + + @@ -6941,7 +7165,9 @@ - + + + diff --git a/sd/qa/unit/data/xml/n820786_0.xml b/sd/qa/unit/data/xml/n820786_0.xml index 335b6150e512..81d667b70c6c 100644 --- a/sd/qa/unit/data/xml/n820786_0.xml +++ b/sd/qa/unit/data/xml/n820786_0.xml @@ -13,7 +13,9 @@ - + + + @@ -80,7 +82,9 @@ - + + + @@ -165,7 +169,9 @@ - + + + @@ -259,10 +265,12 @@ + + @@ -331,10 +339,12 @@ + + @@ -403,10 +413,12 @@ + + @@ -475,10 +487,12 @@ + + @@ -547,10 +561,12 @@ + + @@ -619,10 +635,12 @@ + + @@ -691,10 +709,12 @@ + + @@ -763,10 +783,12 @@ + + @@ -835,10 +857,12 @@ + + @@ -907,10 +931,12 @@ + + @@ -979,10 +1005,12 @@ + + @@ -1051,10 +1079,12 @@ + + @@ -1123,10 +1153,12 @@ + + @@ -1195,10 +1227,12 @@ + + @@ -1267,10 +1301,12 @@ + + @@ -1339,10 +1375,12 @@ + + @@ -1411,10 +1449,12 @@ + + @@ -1483,10 +1523,12 @@ + + @@ -1555,10 +1597,12 @@ + + @@ -1627,10 +1671,12 @@ + + @@ -1699,10 +1745,12 @@ + + @@ -1771,10 +1819,12 @@ + + @@ -1843,10 +1893,12 @@ + + @@ -1915,10 +1967,12 @@ + + @@ -1987,10 +2041,12 @@ + + @@ -2059,10 +2115,12 @@ + + @@ -2131,10 +2189,12 @@ + + @@ -2203,10 +2263,12 @@ + + @@ -2275,10 +2337,12 @@ + + @@ -2347,10 +2411,12 @@ + + @@ -2419,10 +2485,12 @@ + + @@ -2491,10 +2559,12 @@ + + @@ -2563,10 +2633,12 @@ + + @@ -2635,10 +2707,12 @@ + + @@ -2707,10 +2781,12 @@ + + @@ -2779,10 +2855,12 @@ + + @@ -2851,10 +2929,12 @@ + + @@ -2923,10 +3003,12 @@ + + @@ -2995,10 +3077,12 @@ + + @@ -3067,10 +3151,12 @@ + + @@ -3139,10 +3225,12 @@ + + @@ -3211,10 +3299,12 @@ + + @@ -3283,10 +3373,12 @@ + + @@ -3355,10 +3447,12 @@ + + @@ -3427,10 +3521,12 @@ + + @@ -3499,10 +3595,12 @@ + + @@ -3571,10 +3669,12 @@ + + @@ -3643,10 +3743,12 @@ + +