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 @@ + +