From 71b4af858ea698f9c3fcffdfc61e3f70a7b10f63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Aragunde=20P=C3=A9rez?= Date: Tue, 22 Apr 2014 20:30:24 +0200 Subject: [PATCH] ooxml: Preserve outer shadow effect on shapes. The goal is preserving the shadow effect with all its attributes using the shape grab bag. This is the relevant piece of XML in the document: In first place, we added members to the structure EffectProperties to store the effect name and attributes. Later, when we create the shape, we add them to the shape grab bag together with the shadow color (if it is a theme color we store its name and transformations like in other cases). Finally, we read back all these data from the shape grab bag and write them back to the document. I added a unit test for this shape property. Change-Id: Idda2d5e2970cb8563e2ed13a84b2fa2d4b99aa70 --- include/oox/drawingml/effectproperties.hxx | 7 ++ include/oox/export/drawingml.hxx | 1 + oox/source/drawingml/effectproperties.cxx | 30 +++++ .../drawingml/effectpropertiescontext.cxx | 29 +++++ oox/source/drawingml/shape.cxx | 27 ++++ oox/source/export/drawingml.cxx | 118 ++++++++++++++++++ oox/source/export/shapes.cxx | 1 + .../data/shape-effect-preservation.docx | Bin 0 -> 17276 bytes sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx | 59 +++++++++ 9 files changed, 272 insertions(+) create mode 100644 sw/qa/extras/ooxmlexport/data/shape-effect-preservation.docx diff --git a/include/oox/drawingml/effectproperties.hxx b/include/oox/drawingml/effectproperties.hxx index 83519c0221a7..618c7b90fe38 100644 --- a/include/oox/drawingml/effectproperties.hxx +++ b/include/oox/drawingml/effectproperties.hxx @@ -34,6 +34,10 @@ struct OOX_DLLPUBLIC EffectProperties { EffectShadowProperties maShadow; + /** Store unsupported effect type name and its attributes */ + OptValue< OUString > msUnsupportedEffectName; + std::vector< css::beans::PropertyValue > maUnsupportedEffectAttribs; + /** Overwrites all members that are explicitly set in rSourceProps. */ void assignUsed( const EffectProperties& rSourceProps ); @@ -41,6 +45,9 @@ struct OOX_DLLPUBLIC EffectProperties void pushToPropMap( PropertyMap& rPropMap, const GraphicHelper& rGraphicHelper ) const; + + void appendUnsupportedEffectAttrib( const OUString& aKey, const css::uno::Any& aValue ); + css::beans::PropertyValue getUnsupportedEffect(); }; diff --git a/include/oox/export/drawingml.hxx b/include/oox/export/drawingml.hxx index 3efcf93bbcb6..7793e6bff2a3 100644 --- a/include/oox/export/drawingml.hxx +++ b/include/oox/export/drawingml.hxx @@ -173,6 +173,7 @@ public: void WritePolyPolygon( const PolyPolygon& rPolyPolygon ); void WriteFill( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > xPropSet ); void WriteShapeStyle( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > rXPropSet ); + void WriteShapeEffects( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > rXPropSet ); static void ResetCounters(); diff --git a/oox/source/drawingml/effectproperties.cxx b/oox/source/drawingml/effectproperties.cxx index 7e89726abf14..be3b3d00cd18 100644 --- a/oox/source/drawingml/effectproperties.cxx +++ b/oox/source/drawingml/effectproperties.cxx @@ -30,6 +30,8 @@ void EffectShadowProperties::assignUsed(const EffectShadowProperties& rSourcePro void EffectProperties::assignUsed( const EffectProperties& rSourceProps ) { maShadow.assignUsed(rSourceProps.maShadow); + msUnsupportedEffectName.assignIfUsed( rSourceProps.msUnsupportedEffectName ); + maUnsupportedEffectAttribs = rSourceProps.maUnsupportedEffectAttribs; } void EffectProperties::pushToPropMap( PropertyMap& rPropMap, @@ -51,6 +53,34 @@ void EffectProperties::pushToPropMap( PropertyMap& rPropMap, } } +void EffectProperties::appendUnsupportedEffectAttrib( const OUString& aKey, const css::uno::Any& aValue ) +{ + css::beans::PropertyValue aProperty; + aProperty.Name = aKey; + aProperty.Value = aValue; + maUnsupportedEffectAttribs.push_back(aProperty); +} + +css::beans::PropertyValue EffectProperties::getUnsupportedEffect() +{ + css::beans::PropertyValue pRet; + if(!msUnsupportedEffectName.has()) + return pRet; + + css::uno::Sequence aSeq(maUnsupportedEffectAttribs.size()); + css::beans::PropertyValue* pSeq = aSeq.getArray(); + for (std::vector::iterator i = maUnsupportedEffectAttribs.begin(); i != maUnsupportedEffectAttribs.end(); ++i) + *pSeq++ = *i; + + pRet.Name = msUnsupportedEffectName.use(); + pRet.Value = css::uno::Any( aSeq ); + + msUnsupportedEffectName.reset(); + maUnsupportedEffectAttribs.clear(); + + return pRet; +} + } // namespace drawingml diff --git a/oox/source/drawingml/effectpropertiescontext.cxx b/oox/source/drawingml/effectpropertiescontext.cxx index 53997888e6aa..705adb046d18 100644 --- a/oox/source/drawingml/effectpropertiescontext.cxx +++ b/oox/source/drawingml/effectpropertiescontext.cxx @@ -39,6 +39,35 @@ ContextHandlerRef EffectPropertiesContext::onCreateContext( sal_Int32 nElement, { case A_TOKEN( outerShdw ): { + mrEffectProperties.msUnsupportedEffectName = "outerShdw"; + if( rAttribs.hasAttribute( XML_algn ) ) + mrEffectProperties.appendUnsupportedEffectAttrib( "algn", + makeAny( rAttribs.getString( XML_algn, "" ) ) ); + if( rAttribs.hasAttribute( XML_blurRad ) ) + mrEffectProperties.appendUnsupportedEffectAttrib( "blurRad", + makeAny( rAttribs.getInteger( XML_blurRad, 0 ) ) ); + if( rAttribs.hasAttribute( XML_dir ) ) + mrEffectProperties.appendUnsupportedEffectAttrib( "dir", + makeAny( rAttribs.getInteger( XML_dir, 0 ) ) ); + if( rAttribs.hasAttribute( XML_dist ) ) + mrEffectProperties.appendUnsupportedEffectAttrib( "dist", + makeAny( rAttribs.getInteger( XML_dist, 0 ) ) ); + if( rAttribs.hasAttribute( XML_kx ) ) + mrEffectProperties.appendUnsupportedEffectAttrib( "kx", + makeAny( rAttribs.getInteger( XML_kx, 0 ) ) ); + if( rAttribs.hasAttribute( XML_ky ) ) + mrEffectProperties.appendUnsupportedEffectAttrib( "ky", + makeAny( rAttribs.getInteger( XML_ky, 0 ) ) ); + if( rAttribs.hasAttribute( XML_rotWithShape ) ) + mrEffectProperties.appendUnsupportedEffectAttrib( "rotWithShape", + makeAny( rAttribs.getInteger( XML_rotWithShape, 0 ) ) ); + if( rAttribs.hasAttribute( XML_sx ) ) + mrEffectProperties.appendUnsupportedEffectAttrib( "sx", + makeAny( rAttribs.getInteger( XML_sx, 0 ) ) ); + if( rAttribs.hasAttribute( XML_sy ) ) + mrEffectProperties.appendUnsupportedEffectAttrib( "sy", + makeAny( rAttribs.getInteger( XML_sy, 0 ) ) ); + mrEffectProperties.maShadow.moShadowDist = rAttribs.getInteger( XML_dist, 0 ); mrEffectProperties.maShadow.moShadowDir = rAttribs.getInteger( XML_dir, 0 ); return new ColorContext( *this, mrEffectProperties.maShadow.moShadowColor ); diff --git a/oox/source/drawingml/shape.cxx b/oox/source/drawingml/shape.cxx index 1d0d4525801f..d3964be2f862 100644 --- a/oox/source/drawingml/shape.cxx +++ b/oox/source/drawingml/shape.cxx @@ -893,6 +893,33 @@ Reference< XShape > Shape::createAndInsert( putPropertyToGrabBag( "GradFillDefinition", Any( aGradientStops ) ); putPropertyToGrabBag( "OriginalGradFill", aShapeProps.getProperty(PROP_FillGradient) ); } + + // store unsupported effect attributes in the grab bag + PropertyValue aEffect = aEffectProperties.getUnsupportedEffect(); + if( aEffect.Name != "" ) + { + Sequence< PropertyValue > aEffectsGrabBag( 3 ); + PUT_PROP( aEffectsGrabBag, 0, aEffect.Name, aEffect.Value ); + + OUString sColorScheme = aEffectProperties.maShadow.moShadowColor.getSchemeName(); + if( sColorScheme.isEmpty() ) + { + // RGB color and transparency value + PUT_PROP( aEffectsGrabBag, 1, "ShadowRgbClr", + aEffectProperties.maShadow.moShadowColor.getColor( rGraphicHelper, nFillPhClr ) ); + PUT_PROP( aEffectsGrabBag, 2, "ShadowRgbClrTransparency", + aEffectProperties.maShadow.moShadowColor.getTransparency() ); + } + else + { + // scheme color with name and transformations + PUT_PROP( aEffectsGrabBag, 1, "ShadowColorSchemeClr", sColorScheme ); + PUT_PROP( aEffectsGrabBag, 2, "ShadowColorTransformations", + aEffectProperties.maShadow.moShadowColor.getTransformations() ); + } + + putPropertyToGrabBag( "EffectProperties", Any( aEffectsGrabBag ) ); + } } // These can have a custom geometry, so position should be set here, diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx index fb0cd6a5df5b..a14cf72bc32d 100644 --- a/oox/source/export/drawingml.cxx +++ b/oox/source/export/drawingml.cxx @@ -2076,6 +2076,124 @@ void DrawingML::WriteShapeStyle( Reference< XPropertySet > xPropSet ) mpFS->singleElementNS( XML_a, XML_fontRef, XML_idx, "minor", FSEND ); } +void DrawingML::WriteShapeEffects( Reference< XPropertySet > rXPropSet ) +{ + if( !GetProperty( rXPropSet, "InteropGrabBag" ) ) + return; + + Sequence< PropertyValue > aGrabBag, aEffectProps; + mAny >>= aGrabBag; + for( sal_Int32 i=0; i < aGrabBag.getLength(); ++i ) + { + if( aGrabBag[i].Name == "EffectProperties" ) + aGrabBag[i].Value >>= aEffectProps; + } + if( aEffectProps.getLength() == 0 ) + return; + + OUString sSchemeClr; + sal_uInt32 nRgbClr = 0; + sal_Int32 nAlpha = MAX_PERCENT; + Sequence< PropertyValue > aTransformations; + sax_fastparser::FastAttributeList *aOuterShdwAttrList = mpFS->createAttrList(); + for( sal_Int32 i=0; i < aEffectProps.getLength(); ++i ) + { + if(aEffectProps[i].Name == "outerShdw") + { + uno::Sequence< beans::PropertyValue > aOuterShdwProps; + aEffectProps[0].Value >>= aOuterShdwProps; + for( sal_Int32 j=0; j < aOuterShdwProps.getLength(); ++j ) + { + if( aOuterShdwProps[j].Name == "algn" ) + { + OUString sVal; + aOuterShdwProps[j].Value >>= sVal; + aOuterShdwAttrList->add( XML_algn, OUStringToOString( sVal, RTL_TEXTENCODING_UTF8 ).getStr() ); + } + else if( aOuterShdwProps[j].Name == "blurRad" ) + { + sal_Int32 nVal = 0; + aOuterShdwProps[j].Value >>= nVal; + aOuterShdwAttrList->add( XML_blurRad, OString::number( nVal ).getStr() ); + } + else if( aOuterShdwProps[j].Name == "dir" ) + { + sal_Int32 nVal = 0; + aOuterShdwProps[j].Value >>= nVal; + aOuterShdwAttrList->add( XML_dir, OString::number( nVal ).getStr() ); + } + else if( aOuterShdwProps[j].Name == "dist" ) + { + sal_Int32 nVal = 0; + aOuterShdwProps[j].Value >>= nVal; + aOuterShdwAttrList->add( XML_dist, OString::number( nVal ).getStr() ); + } + else if( aOuterShdwProps[j].Name == "kx" ) + { + sal_Int32 nVal = 0; + aOuterShdwProps[j].Value >>= nVal; + aOuterShdwAttrList->add( XML_kx, OString::number( nVal ).getStr() ); + } + else if( aOuterShdwProps[j].Name == "ky" ) + { + sal_Int32 nVal = 0; + aOuterShdwProps[j].Value >>= nVal; + aOuterShdwAttrList->add( XML_ky, OString::number( nVal ).getStr() ); + } + else if( aOuterShdwProps[j].Name == "rotWithShape" ) + { + sal_Int32 nVal = 0; + aOuterShdwProps[j].Value >>= nVal; + aOuterShdwAttrList->add( XML_rotWithShape, OString::number( nVal ).getStr() ); + } + else if( aOuterShdwProps[j].Name == "sx" ) + { + sal_Int32 nVal = 0; + aOuterShdwProps[j].Value >>= nVal; + aOuterShdwAttrList->add( XML_sx, OString::number( nVal ).getStr() ); + } + else if( aOuterShdwProps[j].Name == "sy" ) + { + sal_Int32 nVal = 0; + aOuterShdwProps[j].Value >>= nVal; + aOuterShdwAttrList->add( XML_sy, OString::number( nVal ).getStr() ); + } + } + } + else if(aEffectProps[i].Name == "ShadowRgbClr") + { + aEffectProps[i].Value >>= nRgbClr; + } + else if(aEffectProps[i].Name == "ShadowRgbClrTransparency") + { + sal_Int32 nTransparency; + aEffectProps[i].Value >>= nTransparency; + // Calculate alpha value (see oox/source/drawingml/color.cxx : getTransparency()) + nAlpha = MAX_PERCENT - ( PER_PERCENT * nTransparency ); + } + else if(aEffectProps[i].Name == "ShadowColorSchemeClr") + { + aEffectProps[i].Value >>= sSchemeClr; + } + else if(aEffectProps[i].Name == "ShadowColorTransformations") + { + aEffectProps[i].Value >>= aTransformations; + } + } + + mpFS->startElementNS(XML_a, XML_effectLst, FSEND); + sax_fastparser::XFastAttributeListRef xAttrList( aOuterShdwAttrList ); + mpFS->startElementNS( XML_a, XML_outerShdw, xAttrList ); + + if( sSchemeClr.isEmpty() ) + WriteColor( nRgbClr, nAlpha ); + else + WriteColor( sSchemeClr, aTransformations ); + + mpFS->endElementNS( XML_a, XML_outerShdw ); + mpFS->endElementNS(XML_a, XML_effectLst); +} + } } diff --git a/oox/source/export/shapes.cxx b/oox/source/export/shapes.cxx index 28b01ab60fbd..49d1a4bf31e4 100644 --- a/oox/source/export/shapes.cxx +++ b/oox/source/export/shapes.cxx @@ -373,6 +373,7 @@ ShapeExport& ShapeExport::WriteCustomShape( Reference< XShape > xShape ) { WriteFill( rXPropSet ); WriteOutline( rXPropSet ); + WriteShapeEffects( rXPropSet ); } pFS->endElementNS( mnXmlNamespace, XML_spPr ); diff --git a/sw/qa/extras/ooxmlexport/data/shape-effect-preservation.docx b/sw/qa/extras/ooxmlexport/data/shape-effect-preservation.docx new file mode 100644 index 0000000000000000000000000000000000000000..aecbd59826d9ff0936a4e5280790c20380db8ef1 GIT binary patch literal 17276 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 F{|_s5Q8xep literal 0 HcmV?d00001 diff --git a/sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx b/sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx index 674b496821b8..a6fdc9eb98b4 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx @@ -1029,6 +1029,65 @@ DECLARE_OOXMLEXPORT_TEST(testFdo76979, "fdo76979.docx") assertXPath(pXmlDoc, "//wps:spPr/a:solidFill/a:srgbClr", "val", "FFFFFF"); } +DECLARE_OOXMLEXPORT_TEST(testShapeEffectPreservation, "shape-effect-preservation.docx") +{ + xmlDocPtr pXmlDoc = parseExport("word/document.xml"); + if (!pXmlDoc) + return; + + // first shape with outer shadow, rgb color + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:r/mc:AlternateContent/mc:Choice/w:drawing/" + "wp:anchor/a:graphic/a:graphicData/wps:wsp/wps:spPr/a:effectLst/a:outerShdw", + "algn", "tl"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:r/mc:AlternateContent/mc:Choice/w:drawing/" + "wp:anchor/a:graphic/a:graphicData/wps:wsp/wps:spPr/a:effectLst/a:outerShdw", + "blurRad", "50800"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:r/mc:AlternateContent/mc:Choice/w:drawing/" + "wp:anchor/a:graphic/a:graphicData/wps:wsp/wps:spPr/a:effectLst/a:outerShdw", + "dir", "2700000"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:r/mc:AlternateContent/mc:Choice/w:drawing/" + "wp:anchor/a:graphic/a:graphicData/wps:wsp/wps:spPr/a:effectLst/a:outerShdw", + "dist", "38100"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:r/mc:AlternateContent/mc:Choice/w:drawing/" + "wp:anchor/a:graphic/a:graphicData/wps:wsp/wps:spPr/a:effectLst/a:outerShdw", + "rotWithShape", "0"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:r/mc:AlternateContent/mc:Choice/w:drawing/" + "wp:anchor/a:graphic/a:graphicData/wps:wsp/wps:spPr/a:effectLst/a:outerShdw/a:srgbClr", + "val", "000000"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:r/mc:AlternateContent/mc:Choice/w:drawing/" + "wp:anchor/a:graphic/a:graphicData/wps:wsp/wps:spPr/a:effectLst/a:outerShdw/a:srgbClr/a:alpha", + "val", "40000"); + + // second shape with outer shadow, scheme color + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:r/mc:AlternateContent/mc:Choice/w:drawing/" + "wp:anchor/a:graphic/a:graphicData/wps:wsp/wps:spPr/a:effectLst/a:outerShdw", + "algn", "tl"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:r/mc:AlternateContent/mc:Choice/w:drawing/" + "wp:anchor/a:graphic/a:graphicData/wps:wsp/wps:spPr/a:effectLst/a:outerShdw", + "blurRad", "114300"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:r/mc:AlternateContent/mc:Choice/w:drawing/" + "wp:anchor/a:graphic/a:graphicData/wps:wsp/wps:spPr/a:effectLst/a:outerShdw", + "dir", "2700000"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:r/mc:AlternateContent/mc:Choice/w:drawing/" + "wp:anchor/a:graphic/a:graphicData/wps:wsp/wps:spPr/a:effectLst/a:outerShdw", + "dist", "203200"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:r/mc:AlternateContent/mc:Choice/w:drawing/" + "wp:anchor/a:graphic/a:graphicData/wps:wsp/wps:spPr/a:effectLst/a:outerShdw", + "rotWithShape", "0"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:r/mc:AlternateContent/mc:Choice/w:drawing/" + "wp:anchor/a:graphic/a:graphicData/wps:wsp/wps:spPr/a:effectLst/a:outerShdw/a:schemeClr", + "val", "accent1"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:r/mc:AlternateContent/mc:Choice/w:drawing/" + "wp:anchor/a:graphic/a:graphicData/wps:wsp/wps:spPr/a:effectLst/a:outerShdw/a:schemeClr/a:lumMod", + "val", "40000"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:r/mc:AlternateContent/mc:Choice/w:drawing/" + "wp:anchor/a:graphic/a:graphicData/wps:wsp/wps:spPr/a:effectLst/a:outerShdw/a:schemeClr/a:lumOff", + "val", "60000"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:r/mc:AlternateContent/mc:Choice/w:drawing/" + "wp:anchor/a:graphic/a:graphicData/wps:wsp/wps:spPr/a:effectLst/a:outerShdw/a:schemeClr/a:alpha", + "val", "40000"); +} + #endif CPPUNIT_PLUGIN_IMPLEMENT();