oox/source/drawingml/effectpropertiescontext.cxx | 38 ++++ oox/source/export/drawingml.cxx | 100 +++++++++-- sw/inc/hints.hxx | 2 sw/qa/extras/ooxmlexport/data/shape-effect-preservation.docx |binary sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx | 41 ++++ sw/source/core/attr/hints.cxx | 7 sw/source/core/text/txtfrm.cxx | 22 +- sw/source/core/txtnode/thints.cxx | 20 +- 8 files changed, 207 insertions(+), 23 deletions(-)
New commits: commit ae4e79e7728b39bdb98f023d950dbbfa7c4c38d4 Author: Jacobo Aragunde Pérez <jaragu...@igalia.com> Date: Wed Apr 30 12:14:02 2014 +0200 oox: Code protection against empty effects This is an extra check against clumsy programmers like me to prevent generating incorrect documents. Change-Id: I22261e3b6123a9a44461683519e33224f08adb5a diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx index a1f00fd..1fde44a 100644 --- a/oox/source/export/drawingml.cxx +++ b/oox/source/export/drawingml.cxx @@ -2251,20 +2251,23 @@ void DrawingML::WriteShapeEffects( Reference< XPropertySet > rXPropSet ) } } - mpFS->startElementNS(XML_a, XML_effectLst, FSEND); - sax_fastparser::XFastAttributeListRef xAttrList( aOuterShdwAttrList ); - mpFS->startElement( nEffectToken, xAttrList ); - - if( bContainsColor ) + if( nEffectToken > 0 ) { - if( sSchemeClr.isEmpty() ) - WriteColor( nRgbClr, nAlpha ); - else - WriteColor( sSchemeClr, aTransformations ); - } + mpFS->startElementNS(XML_a, XML_effectLst, FSEND); + sax_fastparser::XFastAttributeListRef xAttrList( aOuterShdwAttrList ); + mpFS->startElement( nEffectToken, xAttrList ); - mpFS->endElement( nEffectToken ); - mpFS->endElementNS(XML_a, XML_effectLst); + if( bContainsColor ) + { + if( sSchemeClr.isEmpty() ) + WriteColor( nRgbClr, nAlpha ); + else + WriteColor( sSchemeClr, aTransformations ); + } + + mpFS->endElement( nEffectToken ); + mpFS->endElementNS(XML_a, XML_effectLst); + } } } commit 2310af236659f4fdd4c26b1e277e568d04a20687 Author: Jacobo Aragunde Pérez <jaragu...@igalia.com> Date: Wed Apr 30 11:18:49 2014 +0200 ooxml: Preserve blur effect on shapes. Reused the code for other effects just adding the new attribute "grow". I didn't add a unit test for this effect because I found no way to apply it to an object in Word, but it's technically part of the standard. Change-Id: I391aff17f59d49d6bf339a71481dcdb51c537c9e diff --git a/oox/source/drawingml/effectpropertiescontext.cxx b/oox/source/drawingml/effectpropertiescontext.cxx index 6699678..2493ec9 100644 --- a/oox/source/drawingml/effectpropertiescontext.cxx +++ b/oox/source/drawingml/effectpropertiescontext.cxx @@ -80,6 +80,9 @@ void EffectPropertiesContext::saveUnsupportedAttribs( const AttributeList& rAttr if( rAttribs.hasAttribute( XML_stPos ) ) mrEffectProperties.appendUnsupportedEffectAttrib( "stPos", makeAny( rAttribs.getInteger( XML_stPos, 0 ) ) ); + if( rAttribs.hasAttribute( XML_grow ) ) + mrEffectProperties.appendUnsupportedEffectAttrib( "grow", + makeAny( rAttribs.getInteger( XML_grow, 0 ) ) ); } ContextHandlerRef EffectPropertiesContext::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) @@ -109,6 +112,7 @@ ContextHandlerRef EffectPropertiesContext::onCreateContext( sal_Int32 nElement, case A_TOKEN( glow ): case A_TOKEN( softEdge ): case A_TOKEN( reflection ): + case A_TOKEN( blur ): { if( nElement == A_TOKEN( glow ) ) mrEffectProperties.msUnsupportedEffectName = "glow"; @@ -116,6 +120,8 @@ ContextHandlerRef EffectPropertiesContext::onCreateContext( sal_Int32 nElement, mrEffectProperties.msUnsupportedEffectName = "softEdge"; else if( nElement == A_TOKEN( reflection ) ) mrEffectProperties.msUnsupportedEffectName = "reflection"; + else if( nElement == A_TOKEN( blur ) ) + mrEffectProperties.msUnsupportedEffectName = "blur"; saveUnsupportedAttribs( rAttribs ); return new ColorContext( *this, mrEffectProperties.maShadow.moShadowColor ); } diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx index 8cf14e3..a1f00fd 100644 --- a/oox/source/export/drawingml.cxx +++ b/oox/source/export/drawingml.cxx @@ -2102,7 +2102,7 @@ void DrawingML::WriteShapeEffects( Reference< XPropertySet > rXPropSet ) { if( aEffectProps[i].Name == "outerShdw" || aEffectProps[i].Name == "innerShdw" || aEffectProps[i].Name == "glow" || aEffectProps[i].Name == "softEdge" - || aEffectProps[i].Name == "reflection" ) + || aEffectProps[i].Name == "reflection" || aEffectProps[i].Name == "blur" ) { // assign the proper tag and enable bContainsColor if necessary if( aEffectProps[i].Name == "outerShdw" ) @@ -2124,6 +2124,8 @@ void DrawingML::WriteShapeEffects( Reference< XPropertySet > rXPropSet ) nEffectToken = FSNS( XML_a, XML_softEdge ); else if( aEffectProps[i].Name == "reflection" ) nEffectToken = FSNS( XML_a, XML_reflection ); + else if( aEffectProps[i].Name == "blur" ) + nEffectToken = FSNS( XML_a, XML_blur ); // read tag attributes uno::Sequence< beans::PropertyValue > aOuterShdwProps; @@ -2220,6 +2222,12 @@ void DrawingML::WriteShapeEffects( Reference< XPropertySet > rXPropSet ) aOuterShdwProps[j].Value >>= nVal; aOuterShdwAttrList->add( XML_stPos, OString::number( nVal ).getStr() ); } + else if( aOuterShdwProps[j].Name == "grow" ) + { + sal_Int32 nVal = 0; + aOuterShdwProps[j].Value >>= nVal; + aOuterShdwAttrList->add( XML_grow, OString::number( nVal ).getStr() ); + } } } else if(aEffectProps[i].Name == "ShadowRgbClr") commit f519bfdef11d7b14fbdc7bdbeb286783e08416ed Author: Jacobo Aragunde Pérez <jaragu...@igalia.com> Date: Tue Apr 29 20:28:18 2014 +0200 ooxml: Preserve reflection effect on shapes. Reused most of the code of other effects, but adding some new attributes specific for this effect. Finally, modified an existing unit test to add a check for reflection. Change-Id: Iffd0c1203e9c66a8d7b7f748d98d9c3ef01c7bbf diff --git a/oox/source/drawingml/effectpropertiescontext.cxx b/oox/source/drawingml/effectpropertiescontext.cxx index 8a2a6f4..6699678 100644 --- a/oox/source/drawingml/effectpropertiescontext.cxx +++ b/oox/source/drawingml/effectpropertiescontext.cxx @@ -65,6 +65,21 @@ void EffectPropertiesContext::saveUnsupportedAttribs( const AttributeList& rAttr if( rAttribs.hasAttribute( XML_rad ) ) mrEffectProperties.appendUnsupportedEffectAttrib( "rad", makeAny( rAttribs.getInteger( XML_rad, 0 ) ) ); + if( rAttribs.hasAttribute( XML_endA ) ) + mrEffectProperties.appendUnsupportedEffectAttrib( "endA", + makeAny( rAttribs.getInteger( XML_endA, 0 ) ) ); + if( rAttribs.hasAttribute( XML_endPos ) ) + mrEffectProperties.appendUnsupportedEffectAttrib( "endPos", + makeAny( rAttribs.getInteger( XML_endPos, 0 ) ) ); + if( rAttribs.hasAttribute( XML_fadeDir ) ) + mrEffectProperties.appendUnsupportedEffectAttrib( "fadeDir", + makeAny( rAttribs.getInteger( XML_fadeDir, 0 ) ) ); + if( rAttribs.hasAttribute( XML_stA ) ) + mrEffectProperties.appendUnsupportedEffectAttrib( "stA", + makeAny( rAttribs.getInteger( XML_stA, 0 ) ) ); + if( rAttribs.hasAttribute( XML_stPos ) ) + mrEffectProperties.appendUnsupportedEffectAttrib( "stPos", + makeAny( rAttribs.getInteger( XML_stPos, 0 ) ) ); } ContextHandlerRef EffectPropertiesContext::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) @@ -93,11 +108,14 @@ ContextHandlerRef EffectPropertiesContext::onCreateContext( sal_Int32 nElement, break; case A_TOKEN( glow ): case A_TOKEN( softEdge ): + case A_TOKEN( reflection ): { if( nElement == A_TOKEN( glow ) ) mrEffectProperties.msUnsupportedEffectName = "glow"; - else + else if( nElement == A_TOKEN( softEdge ) ) mrEffectProperties.msUnsupportedEffectName = "softEdge"; + else if( nElement == A_TOKEN( reflection ) ) + mrEffectProperties.msUnsupportedEffectName = "reflection"; saveUnsupportedAttribs( rAttribs ); return new ColorContext( *this, mrEffectProperties.maShadow.moShadowColor ); } diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx index 84a6e0f..8cf14e3 100644 --- a/oox/source/export/drawingml.cxx +++ b/oox/source/export/drawingml.cxx @@ -2101,7 +2101,8 @@ void DrawingML::WriteShapeEffects( Reference< XPropertySet > rXPropSet ) for( sal_Int32 i=0; i < aEffectProps.getLength(); ++i ) { if( aEffectProps[i].Name == "outerShdw" || aEffectProps[i].Name == "innerShdw" - || aEffectProps[i].Name == "glow" || aEffectProps[i].Name == "softEdge" ) + || aEffectProps[i].Name == "glow" || aEffectProps[i].Name == "softEdge" + || aEffectProps[i].Name == "reflection" ) { // assign the proper tag and enable bContainsColor if necessary if( aEffectProps[i].Name == "outerShdw" ) @@ -2121,6 +2122,8 @@ void DrawingML::WriteShapeEffects( Reference< XPropertySet > rXPropSet ) } else if( aEffectProps[i].Name == "softEdge" ) nEffectToken = FSNS( XML_a, XML_softEdge ); + else if( aEffectProps[i].Name == "reflection" ) + nEffectToken = FSNS( XML_a, XML_reflection ); // read tag attributes uno::Sequence< beans::PropertyValue > aOuterShdwProps; @@ -2187,6 +2190,36 @@ void DrawingML::WriteShapeEffects( Reference< XPropertySet > rXPropSet ) aOuterShdwProps[j].Value >>= nVal; aOuterShdwAttrList->add( XML_rad, OString::number( nVal ).getStr() ); } + else if( aOuterShdwProps[j].Name == "endA" ) + { + sal_Int32 nVal = 0; + aOuterShdwProps[j].Value >>= nVal; + aOuterShdwAttrList->add( XML_endA, OString::number( nVal ).getStr() ); + } + else if( aOuterShdwProps[j].Name == "endPos" ) + { + sal_Int32 nVal = 0; + aOuterShdwProps[j].Value >>= nVal; + aOuterShdwAttrList->add( XML_endPos, OString::number( nVal ).getStr() ); + } + else if( aOuterShdwProps[j].Name == "fadeDir" ) + { + sal_Int32 nVal = 0; + aOuterShdwProps[j].Value >>= nVal; + aOuterShdwAttrList->add( XML_fadeDir, OString::number( nVal ).getStr() ); + } + else if( aOuterShdwProps[j].Name == "stA" ) + { + sal_Int32 nVal = 0; + aOuterShdwProps[j].Value >>= nVal; + aOuterShdwAttrList->add( XML_stA, OString::number( nVal ).getStr() ); + } + else if( aOuterShdwProps[j].Name == "stPos" ) + { + sal_Int32 nVal = 0; + aOuterShdwProps[j].Value >>= nVal; + aOuterShdwAttrList->add( XML_stPos, OString::number( nVal ).getStr() ); + } } } else if(aEffectProps[i].Name == "ShadowRgbClr") diff --git a/sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx b/sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx index f65f535..6ec9982 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx @@ -1125,6 +1125,23 @@ DECLARE_OOXMLEXPORT_TEST(testShapeEffectPreservation, "shape-effect-preservation assertXPath(pXmlDoc, "/w:document/w:body/w:p[6]/w:r/mc:AlternateContent/mc:Choice/w:drawing/" "wp:anchor/a:graphic/a:graphicData/wps:wsp/wps:spPr/a:effectLst/a:glow/a:schemeClr/a:alpha", "val", "40000"); + + // 6th shape with reflection + assertXPath(pXmlDoc, "/w:document/w:body/w:p[7]/w:r/mc:AlternateContent/mc:Choice/w:drawing/" + "wp:anchor/a:graphic/a:graphicData/wps:wsp/wps:spPr/a:effectLst/a:reflection", + "blurRad", "6350"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[7]/w:r/mc:AlternateContent/mc:Choice/w:drawing/" + "wp:anchor/a:graphic/a:graphicData/wps:wsp/wps:spPr/a:effectLst/a:reflection", + "stA", "50000"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[7]/w:r/mc:AlternateContent/mc:Choice/w:drawing/" + "wp:anchor/a:graphic/a:graphicData/wps:wsp/wps:spPr/a:effectLst/a:reflection", + "endA", "300"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[7]/w:r/mc:AlternateContent/mc:Choice/w:drawing/" + "wp:anchor/a:graphic/a:graphicData/wps:wsp/wps:spPr/a:effectLst/a:reflection", + "endPos", "55500"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[7]/w:r/mc:AlternateContent/mc:Choice/w:drawing/" + "wp:anchor/a:graphic/a:graphicData/wps:wsp/wps:spPr/a:effectLst/a:reflection/*", + 0 ); // should not be present } DECLARE_OOXMLEXPORT_TEST(fdo77719, "fdo77719.docx") commit 9a61470eb1fa161cba70f2e9c4ea8817dc7f617e Author: Jacobo Aragunde Pérez <jaragu...@igalia.com> Date: Tue Apr 29 20:16:36 2014 +0200 ooxml: Preserve glow effect on shapes. Reused most of the code of outerShdw and innerShdw effects. Modified an existing unit test to add a check for innerShdw. Change-Id: I7328fe696721d28c35b26ca1b702c7f64c63ab21 diff --git a/oox/source/drawingml/effectpropertiescontext.cxx b/oox/source/drawingml/effectpropertiescontext.cxx index 90e7050..8a2a6f4 100644 --- a/oox/source/drawingml/effectpropertiescontext.cxx +++ b/oox/source/drawingml/effectpropertiescontext.cxx @@ -91,9 +91,13 @@ ContextHandlerRef EffectPropertiesContext::onCreateContext( sal_Int32 nElement, return new ColorContext( *this, mrEffectProperties.maShadow.moShadowColor ); } break; + case A_TOKEN( glow ): case A_TOKEN( softEdge ): { - mrEffectProperties.msUnsupportedEffectName = "softEdge"; + if( nElement == A_TOKEN( glow ) ) + mrEffectProperties.msUnsupportedEffectName = "glow"; + else + mrEffectProperties.msUnsupportedEffectName = "softEdge"; saveUnsupportedAttribs( rAttribs ); return new ColorContext( *this, mrEffectProperties.maShadow.moShadowColor ); } diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx index e9b4b2b..84a6e0f 100644 --- a/oox/source/export/drawingml.cxx +++ b/oox/source/export/drawingml.cxx @@ -2101,7 +2101,7 @@ void DrawingML::WriteShapeEffects( Reference< XPropertySet > rXPropSet ) for( sal_Int32 i=0; i < aEffectProps.getLength(); ++i ) { if( aEffectProps[i].Name == "outerShdw" || aEffectProps[i].Name == "innerShdw" - || aEffectProps[i].Name == "softEdge" ) + || aEffectProps[i].Name == "glow" || aEffectProps[i].Name == "softEdge" ) { // assign the proper tag and enable bContainsColor if necessary if( aEffectProps[i].Name == "outerShdw" ) @@ -2114,6 +2114,11 @@ void DrawingML::WriteShapeEffects( Reference< XPropertySet > rXPropSet ) nEffectToken = FSNS( XML_a, XML_innerShdw ); bContainsColor = true; } + else if( aEffectProps[i].Name == "glow" ) + { + nEffectToken = FSNS( XML_a, XML_glow ); + bContainsColor = true; + } else if( aEffectProps[i].Name == "softEdge" ) nEffectToken = FSNS( XML_a, XML_softEdge ); diff --git a/sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx b/sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx index 9a213e3..f65f535 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx @@ -1111,6 +1111,20 @@ DECLARE_OOXMLEXPORT_TEST(testShapeEffectPreservation, "shape-effect-preservation assertXPath(pXmlDoc, "/w:document/w:body/w:p[5]/w:r/mc:AlternateContent/mc:Choice/w:drawing/" "wp:anchor/a:graphic/a:graphicData/wps:wsp/wps:spPr/a:effectLst/a:softEdge/*", 0 ); // should not be present + + // 5th shape with glow effect, scheme color + assertXPath(pXmlDoc, "/w:document/w:body/w:p[6]/w:r/mc:AlternateContent/mc:Choice/w:drawing/" + "wp:anchor/a:graphic/a:graphicData/wps:wsp/wps:spPr/a:effectLst/a:glow", + "rad", "101600"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[6]/w:r/mc:AlternateContent/mc:Choice/w:drawing/" + "wp:anchor/a:graphic/a:graphicData/wps:wsp/wps:spPr/a:effectLst/a:glow/a:schemeClr", + "val", "accent2"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[6]/w:r/mc:AlternateContent/mc:Choice/w:drawing/" + "wp:anchor/a:graphic/a:graphicData/wps:wsp/wps:spPr/a:effectLst/a:glow/a:schemeClr/a:satMod", + "val", "175000"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[6]/w:r/mc:AlternateContent/mc:Choice/w:drawing/" + "wp:anchor/a:graphic/a:graphicData/wps:wsp/wps:spPr/a:effectLst/a:glow/a:schemeClr/a:alpha", + "val", "40000"); } DECLARE_OOXMLEXPORT_TEST(fdo77719, "fdo77719.docx") commit 5b3f88bfea3111e9b9fb26ef9d84f9018c11ab7e Author: Jacobo Aragunde Pérez <jaragu...@igalia.com> Date: Tue Apr 29 19:55:35 2014 +0200 ooxml: Preserve soft edge effect on shapes. Reused most of the code of outerShdw and innerShdw effects, but adding a new attribute "rad" and a flag to check if a color definition must be written inside the effect definition. Finally, modified an existing unit test to add a check for softEdge. Change-Id: I0d32714bde9a5b05c726acd47b85b1dea3c6a581 diff --git a/oox/source/drawingml/effectpropertiescontext.cxx b/oox/source/drawingml/effectpropertiescontext.cxx index 40f7318..90e7050 100644 --- a/oox/source/drawingml/effectpropertiescontext.cxx +++ b/oox/source/drawingml/effectpropertiescontext.cxx @@ -62,6 +62,9 @@ void EffectPropertiesContext::saveUnsupportedAttribs( const AttributeList& rAttr if( rAttribs.hasAttribute( XML_sy ) ) mrEffectProperties.appendUnsupportedEffectAttrib( "sy", makeAny( rAttribs.getInteger( XML_sy, 0 ) ) ); + if( rAttribs.hasAttribute( XML_rad ) ) + mrEffectProperties.appendUnsupportedEffectAttrib( "rad", + makeAny( rAttribs.getInteger( XML_rad, 0 ) ) ); } ContextHandlerRef EffectPropertiesContext::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) @@ -88,6 +91,13 @@ ContextHandlerRef EffectPropertiesContext::onCreateContext( sal_Int32 nElement, return new ColorContext( *this, mrEffectProperties.maShadow.moShadowColor ); } break; + case A_TOKEN( softEdge ): + { + mrEffectProperties.msUnsupportedEffectName = "softEdge"; + saveUnsupportedAttribs( rAttribs ); + return new ColorContext( *this, mrEffectProperties.maShadow.moShadowColor ); + } + break; } return 0; diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx index ece1fa2..e9b4b2b 100644 --- a/oox/source/export/drawingml.cxx +++ b/oox/source/export/drawingml.cxx @@ -2092,6 +2092,7 @@ void DrawingML::WriteShapeEffects( Reference< XPropertySet > rXPropSet ) return; OUString sSchemeClr; + bool bContainsColor = false; sal_uInt32 nRgbClr = 0; sal_Int32 nEffectToken = 0; sal_Int32 nAlpha = MAX_PERCENT; @@ -2099,11 +2100,24 @@ void DrawingML::WriteShapeEffects( Reference< XPropertySet > rXPropSet ) sax_fastparser::FastAttributeList *aOuterShdwAttrList = mpFS->createAttrList(); for( sal_Int32 i=0; i < aEffectProps.getLength(); ++i ) { - if( aEffectProps[i].Name == "outerShdw" || aEffectProps[i].Name == "innerShdw" ) + if( aEffectProps[i].Name == "outerShdw" || aEffectProps[i].Name == "innerShdw" + || aEffectProps[i].Name == "softEdge" ) { - nEffectToken = ( aEffectProps[i].Name == "outerShdw") ? - FSNS( XML_a, XML_outerShdw ) : - FSNS( XML_a, XML_innerShdw ); + // assign the proper tag and enable bContainsColor if necessary + if( aEffectProps[i].Name == "outerShdw" ) + { + nEffectToken = FSNS( XML_a, XML_outerShdw ); + bContainsColor = true; + } + else if( aEffectProps[i].Name == "innerShdw" ) + { + nEffectToken = FSNS( XML_a, XML_innerShdw ); + bContainsColor = true; + } + else if( aEffectProps[i].Name == "softEdge" ) + nEffectToken = FSNS( XML_a, XML_softEdge ); + + // read tag attributes uno::Sequence< beans::PropertyValue > aOuterShdwProps; aEffectProps[i].Value >>= aOuterShdwProps; for( sal_Int32 j=0; j < aOuterShdwProps.getLength(); ++j ) @@ -2162,6 +2176,12 @@ void DrawingML::WriteShapeEffects( Reference< XPropertySet > rXPropSet ) aOuterShdwProps[j].Value >>= nVal; aOuterShdwAttrList->add( XML_sy, OString::number( nVal ).getStr() ); } + else if( aOuterShdwProps[j].Name == "rad" ) + { + sal_Int32 nVal = 0; + aOuterShdwProps[j].Value >>= nVal; + aOuterShdwAttrList->add( XML_rad, OString::number( nVal ).getStr() ); + } } } else if(aEffectProps[i].Name == "ShadowRgbClr") @@ -2189,10 +2209,13 @@ void DrawingML::WriteShapeEffects( Reference< XPropertySet > rXPropSet ) sax_fastparser::XFastAttributeListRef xAttrList( aOuterShdwAttrList ); mpFS->startElement( nEffectToken, xAttrList ); - if( sSchemeClr.isEmpty() ) - WriteColor( nRgbClr, nAlpha ); - else - WriteColor( sSchemeClr, aTransformations ); + if( bContainsColor ) + { + if( sSchemeClr.isEmpty() ) + WriteColor( nRgbClr, nAlpha ); + else + WriteColor( sSchemeClr, aTransformations ); + } mpFS->endElement( nEffectToken ); mpFS->endElementNS(XML_a, XML_effectLst); diff --git a/sw/qa/extras/ooxmlexport/data/shape-effect-preservation.docx b/sw/qa/extras/ooxmlexport/data/shape-effect-preservation.docx index 35c7aba..bd0ac80 100644 Binary files a/sw/qa/extras/ooxmlexport/data/shape-effect-preservation.docx and b/sw/qa/extras/ooxmlexport/data/shape-effect-preservation.docx differ diff --git a/sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx b/sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx index 50ce902..9a213e3 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx @@ -1087,7 +1087,7 @@ DECLARE_OOXMLEXPORT_TEST(testShapeEffectPreservation, "shape-effect-preservation "wp:anchor/a:graphic/a:graphicData/wps:wsp/wps:spPr/a:effectLst/a:outerShdw/a:schemeClr/a:alpha", "val", "40000"); - // second shape with inner shadow, rgb color + // third shape with inner shadow, rgb color assertXPath(pXmlDoc, "/w:document/w:body/w:p[3]/w:r/mc:AlternateContent/mc:Choice/w:drawing/" "wp:anchor/a:graphic/a:graphicData/wps:wsp/wps:spPr/a:effectLst/a:innerShdw", "blurRad", "63500"); @@ -1103,6 +1103,14 @@ DECLARE_OOXMLEXPORT_TEST(testShapeEffectPreservation, "shape-effect-preservation assertXPath(pXmlDoc, "/w:document/w:body/w:p[3]/w:r/mc:AlternateContent/mc:Choice/w:drawing/" "wp:anchor/a:graphic/a:graphicData/wps:wsp/wps:spPr/a:effectLst/a:innerShdw/a:srgbClr/a:alpha", "val", "50000"); + + // 4th shape with soft edge + assertXPath(pXmlDoc, "/w:document/w:body/w:p[5]/w:r/mc:AlternateContent/mc:Choice/w:drawing/" + "wp:anchor/a:graphic/a:graphicData/wps:wsp/wps:spPr/a:effectLst/a:softEdge", + "rad", "127000"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[5]/w:r/mc:AlternateContent/mc:Choice/w:drawing/" + "wp:anchor/a:graphic/a:graphicData/wps:wsp/wps:spPr/a:effectLst/a:softEdge/*", + 0 ); // should not be present } DECLARE_OOXMLEXPORT_TEST(fdo77719, "fdo77719.docx") commit dddae1f0b950f1ce8ab4bcd24991f1917fa36aa6 Author: Jacobo Aragunde Pérez <jaragu...@igalia.com> Date: Sat Apr 26 12:21:00 2014 +0200 fdo#71556: Remove unwanted a11y event on text insertion The accessibility event text-attributes-changed was being emitted every time we typed because typing implies changing the RSID internal format attribute. This change was triggering the event but it shouldn't, as it is an invisible attribute. I had added a new member to SwUpdateAttr class to be able to indicate which format attributes are being changed (until now, it just indicated that some attribute changed with RES_TXTATR_AUTOFMT and no more details). This member is populated when an SwUpdateAttr object is being created for a RES_TXTATR_AUTOFMT. Finally, I check the contents of this list to look for relevant a11y attributes before issuing the events, if there aren't then no events are issued. Change-Id: Ieaedf888ccc1bff9c7af64a1412ca1d3b5411351 diff --git a/sw/inc/hints.hxx b/sw/inc/hints.hxx index 82eb27c..be1f1ac 100644 --- a/sw/inc/hints.hxx +++ b/sw/inc/hints.hxx @@ -99,7 +99,9 @@ public: sal_Int32 nStart; sal_Int32 nEnd; sal_uInt16 nWhichAttr; + std::vector<sal_uInt16> aWhichFmtAttr; // attributes changed inside RES_TXTATR_AUTOFMT SwUpdateAttr( sal_Int32 nS, sal_Int32 nE, sal_uInt16 nW ); + SwUpdateAttr( sal_Int32 nS, sal_Int32 nE, sal_uInt16 nW, std::vector<sal_uInt16> aW ); }; /** SwRefMarkFldUpdate is sent when the referencemarks should be updated. diff --git a/sw/source/core/attr/hints.cxx b/sw/source/core/attr/hints.cxx index 44614b8..9b0f6a6 100644 --- a/sw/source/core/attr/hints.cxx +++ b/sw/source/core/attr/hints.cxx @@ -45,7 +45,12 @@ SwDelTxt::SwDelTxt( sal_Int32 nS, sal_Int32 nL ) } SwUpdateAttr::SwUpdateAttr( sal_Int32 nS, sal_Int32 nE, sal_uInt16 nW ) - : SwMsgPoolItem( RES_UPDATE_ATTR ), nStart( nS ), nEnd( nE ), nWhichAttr( nW ) + : SwMsgPoolItem( RES_UPDATE_ATTR ), nStart( nS ), nEnd( nE ), nWhichAttr( nW ), aWhichFmtAttr() +{ +} + +SwUpdateAttr::SwUpdateAttr( sal_Int32 nS, sal_Int32 nE, sal_uInt16 nW, std::vector<sal_uInt16> aW ) + : SwMsgPoolItem( RES_UPDATE_ATTR ), nStart( nS ), nEnd( nE ), nWhichAttr( nW ), aWhichFmtAttr( aW ) { } diff --git a/sw/source/core/text/txtfrm.cxx b/sw/source/core/text/txtfrm.cxx index 0139fd7..1da7fa4 100644 --- a/sw/source/core/text/txtfrm.cxx +++ b/sw/source/core/text/txtfrm.cxx @@ -845,6 +845,16 @@ static bool isA11yRelevantAttribute(MSHORT nWhich) return nWhich != RES_CHRATR_RSID; } +static bool hasA11yRelevantAttribute( const std::vector<MSHORT>& nWhich ) +{ + for( std::vector<MSHORT>::const_iterator nItr = nWhich.begin(); + nItr < nWhich.end(); ++nItr ) + if ( isA11yRelevantAttribute( *nItr ) ) + return true; + + return false; +} + void SwTxtFrm::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew ) { const MSHORT nWhich = pOld ? pOld->Which() : pNew ? pNew->Which() : 0; @@ -967,11 +977,15 @@ void SwTxtFrm::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew ) } } - // #i104008# - SwViewShell* pViewSh = getRootFrm() ? getRootFrm()->GetCurrShell() : 0; - if ( pViewSh ) + if( isA11yRelevantAttribute( ((SwUpdateAttr*)pNew)->nWhichAttr ) && + hasA11yRelevantAttribute( ((SwUpdateAttr*)pNew)->aWhichFmtAttr ) ) { - pViewSh->InvalidateAccessibleParaAttrs( *this ); + // #i104008# + SwViewShell* pViewSh = getRootFrm() ? getRootFrm()->GetCurrShell() : 0; + if ( pViewSh ) + { + pViewSh->InvalidateAccessibleParaAttrs( *this ); + } } } break; diff --git a/sw/source/core/txtnode/thints.cxx b/sw/source/core/txtnode/thints.cxx index 60336fb1..cae6296 100644 --- a/sw/source/core/txtnode/thints.cxx +++ b/sw/source/core/txtnode/thints.cxx @@ -2955,6 +2955,7 @@ bool SwpHints::TryInsertHint( sal_Int32 *pHtEnd = pHint->GetEnd(); sal_uInt16 nWhich = pHint->Which(); + std::vector<sal_uInt16> aWhichSublist; switch( nWhich ) { @@ -2972,10 +2973,9 @@ bool SwpHints::TryInsertHint( // #i75430# Recalc hidden flags if necessary case RES_TXTATR_AUTOFMT: { + boost::shared_ptr<SfxItemSet> const pSet( pHint->GetAutoFmt().GetStyleHandle() ); if (*pHint->GetStart() == *pHint->GetEnd()) { - boost::shared_ptr<SfxItemSet> const pSet( - pHint->GetAutoFmt().GetStyleHandle()); if (pSet->Count() == 1 && pSet->GetItem(RES_CHRATR_RSID, false)) { // empty range RSID-only hints could cause trouble, there's no rNode.DestroyAttr(pHint); // need for them so don't insert @@ -2986,6 +2986,19 @@ bool SwpHints::TryInsertHint( const SfxPoolItem* pHiddenItem = CharFmt::GetItem( *pHint, RES_CHRATR_HIDDEN ); if ( pHiddenItem ) rNode.SetCalcHiddenCharFlags(); + + // fdo#71556: populate aWhichFmtAttr member of SwMsgPoolItem + const sal_uInt16 *pRanges = pSet->GetRanges(); + while( (*pRanges) != 0 ) + { + sal_uInt16 nBeg = (*pRanges); + ++pRanges; + sal_uInt16 nEnd = (*pRanges); + ++pRanges; + for( sal_uInt16 nSubElem = nBeg; nSubElem <= nEnd; ++nSubElem ) + if( pSet->HasItem( nSubElem ) ) + aWhichSublist.push_back( nSubElem ); + } break; } case RES_TXTATR_INETFMT: @@ -3237,7 +3250,8 @@ bool SwpHints::TryInsertHint( // ... und die Abhaengigen benachrichtigen if ( rNode.GetDepends() ) { - SwUpdateAttr aHint( nHtStart, nHtStart == nHintEnd ? nHintEnd + 1 : nHintEnd, nWhich ); + SwUpdateAttr aHint( nHtStart, nHtStart == nHintEnd ? nHintEnd + 1 : nHintEnd, + nWhich, aWhichSublist ); rNode.ModifyNotification( 0, &aHint ); } commit 62f6bb72f00e30427e29b499c24432f5f980fa9f Author: Jacobo Aragunde Pérez <jaragu...@igalia.com> Date: Thu Apr 24 12:36:16 2014 +0200 oox: syntax fix: wrong index Change-Id: I8b76da14c75050f60b0af10cdadda821484db4f1 diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx index 5cdc69c..ece1fa2 100644 --- a/oox/source/export/drawingml.cxx +++ b/oox/source/export/drawingml.cxx @@ -2105,7 +2105,7 @@ void DrawingML::WriteShapeEffects( Reference< XPropertySet > rXPropSet ) FSNS( XML_a, XML_outerShdw ) : FSNS( XML_a, XML_innerShdw ); uno::Sequence< beans::PropertyValue > aOuterShdwProps; - aEffectProps[0].Value >>= aOuterShdwProps; + aEffectProps[i].Value >>= aOuterShdwProps; for( sal_Int32 j=0; j < aOuterShdwProps.getLength(); ++j ) { if( aOuterShdwProps[j].Name == "algn" )
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits