diff options
author | Noel Grandin <noel.grandin@collabora.co.uk> | 2020-03-09 14:08:41 +0200 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2020-03-09 20:29:33 +0100 |
commit | c8dbdd691e8d08d16f421d471eb269804de262d5 (patch) | |
tree | bf8a9a5556f66420411a09ca7f506364c8a5b040 | |
parent | c63e40eabf6886a6e6584be8d5a1cb2b573b86ff (diff) |
use FastParser in XMLAnimationsContext
Change-Id: Ib6c99e7aa9d2797a04b9590c69008f6895f13780
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/90217
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
-rw-r--r-- | xmloff/inc/animimp.hxx | 18 | ||||
-rw-r--r-- | xmloff/source/draw/animimp.cxx | 240 | ||||
-rw-r--r-- | xmloff/source/draw/ximppage.cxx | 8 |
3 files changed, 128 insertions, 138 deletions
diff --git a/xmloff/inc/animimp.hxx b/xmloff/inc/animimp.hxx index 8e2ead46867b..1511994a89c2 100644 --- a/xmloff/inc/animimp.hxx +++ b/xmloff/inc/animimp.hxx @@ -23,24 +23,22 @@ #include <memory> #include <xmloff/xmlictxt.hxx> - -class AnimImpImpl; +#include <com/sun/star/beans/XPropertySet.hpp> // presentations:animations class XMLAnimationsContext final : public SvXMLImportContext { - std::shared_ptr<AnimImpImpl> mpImpl; - public: + css::uno::Reference< css::beans::XPropertySet > mxLastShape; + OUString maLastShapeId; + + XMLAnimationsContext( SvXMLImport& rImport); - XMLAnimationsContext( SvXMLImport& rImport, - sal_uInt16 nPrfx, - const OUString& rLocalName, - const css::uno::Reference< css::xml::sax::XAttributeList>& xAttrList); + virtual void SAL_CALL startFastElement( sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override; - virtual SvXMLImportContextRef CreateChildContext( sal_uInt16 nPrefix, const OUString& rLocalName, - const css::uno::Reference< css::xml::sax::XAttributeList>& xAttrList ) override; + virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( + sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList >& AttrList ) override; }; #endif // INCLUDED_XMLOFF_INC_ANIMIMP_HXX diff --git a/xmloff/source/draw/animimp.cxx b/xmloff/source/draw/animimp.cxx index f2178aeb8454..580491ae3eb2 100644 --- a/xmloff/source/draw/animimp.cxx +++ b/xmloff/source/draw/animimp.cxx @@ -27,6 +27,7 @@ #include <sax/tools/converter.hxx> #include <osl/diagnose.h> +#include <sal/log.hxx> #include <xmloff/xmltoken.hxx> #include <xmloff/xmlimp.hxx> @@ -315,12 +316,8 @@ AnimationEffect ImplSdXMLgetEffect( XMLEffect eKind, XMLEffectDirection eDirecti } } -class AnimImpImpl +namespace { -public: - Reference< XPropertySet > mxLastShape; - OUString maLastShapeId; - static constexpr OUStringLiteral gsDimColor = "DimColor"; static constexpr OUStringLiteral gsDimHide = "DimHide"; static constexpr OUStringLiteral gsDimPrev = "DimPrevious"; @@ -348,7 +345,7 @@ enum XMLActionKind class XMLAnimationsEffectContext : public SvXMLImportContext { public: - std::shared_ptr<AnimImpImpl> mpImpl; + rtl::Reference<XMLAnimationsContext> mxAnimationsContext; XMLActionKind meKind; bool mbTextEffect; @@ -367,152 +364,141 @@ public: public: XMLAnimationsEffectContext( SvXMLImport& rImport, - sal_uInt16 nPrfx, - const OUString& rLocalName, - const Reference< XAttributeList >& xAttrList, - const std::shared_ptr<AnimImpImpl>& pImpl); + sal_Int32 nElement, + const Reference< XFastAttributeList >& xAttrList, + XMLAnimationsContext& rAnimationsContext); - virtual void EndElement() override; + virtual void SAL_CALL startFastElement( sal_Int32 /*nElement*/, + const css::uno::Reference< css::xml::sax::XFastAttributeList >& /*xAttrList*/ ) override {} - virtual SvXMLImportContextRef CreateChildContext( sal_uInt16 nPrefix, const OUString& rLocalName, - const Reference< XAttributeList >& xAttrList ) override; + virtual void SAL_CALL endFastElement(sal_Int32 nElement) override; + + virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( + sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override; }; class XMLAnimationsSoundContext : public SvXMLImportContext { public: - XMLAnimationsSoundContext( SvXMLImport& rImport, sal_uInt16 nPrfx, const OUString& rLocalName, const Reference< XAttributeList >& xAttrList, XMLAnimationsEffectContext* pParent ); + XMLAnimationsSoundContext( SvXMLImport& rImport, sal_Int32 nElement, const Reference< XFastAttributeList >& xAttrList, XMLAnimationsEffectContext* pParent ); + + virtual void SAL_CALL startFastElement( sal_Int32 /*nElement*/, + const css::uno::Reference< css::xml::sax::XFastAttributeList >& /*xAttrList*/ ) override {} }; } -XMLAnimationsSoundContext::XMLAnimationsSoundContext( SvXMLImport& rImport, sal_uInt16 nPrfx, const OUString& rLocalName, const Reference< XAttributeList >& xAttrList, XMLAnimationsEffectContext* pParent ) -: SvXMLImportContext( rImport, nPrfx, rLocalName ) +XMLAnimationsSoundContext::XMLAnimationsSoundContext( SvXMLImport& rImport, sal_Int32 nElement, const Reference< XFastAttributeList >& xAttrList, XMLAnimationsEffectContext* pParent ) +: SvXMLImportContext( rImport ) { - if( pParent && nPrfx == XML_NAMESPACE_PRESENTATION && IsXMLToken( rLocalName, XML_SOUND ) ) + if( !pParent || nElement != XML_ELEMENT(PRESENTATION, XML_SOUND) ) + return; + + sax_fastparser::FastAttributeList *pAttribList = + sax_fastparser::FastAttributeList::castToFastAttributeList( xAttrList ); + for (auto &aIter : *pAttribList) { - const sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; - for(sal_Int16 i=0; i < nAttrCount; i++) + OUString sValue = aIter.toString(); + switch( aIter.getToken() ) { - OUString sAttrName = xAttrList->getNameByIndex( i ); - OUString aLocalName; - sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName ); - OUString sValue = xAttrList->getValueByIndex( i ); - - switch( nPrefix ) - { - case XML_NAMESPACE_XLINK: - if( IsXMLToken( aLocalName, XML_HREF ) ) - { - pParent->maSoundURL = rImport.GetAbsoluteReference(sValue); - } + case XML_ELEMENT(XLINK, XML_HREF): + pParent->maSoundURL = rImport.GetAbsoluteReference(sValue); break; - case XML_NAMESPACE_PRESENTATION: - if( IsXMLToken( aLocalName, XML_PLAY_FULL ) ) - { - pParent->mbPlayFull = IsXMLToken( sValue, XML_TRUE ); - } - } + case XML_ELEMENT(PRESENTATION, XML_PLAY_FULL): + pParent->mbPlayFull = IsXMLToken( sValue, XML_TRUE ); + break; + default: + SAL_WARN("xmloff", "unknown attribute " << SvXMLImport::getPrefixAndNameFromToken(aIter.getToken()) << "=" << sValue); } } } -XMLAnimationsEffectContext::XMLAnimationsEffectContext( SvXMLImport& rImport, sal_uInt16 nPrfx, const OUString& rLocalName, const Reference< XAttributeList >& xAttrList, const std::shared_ptr<AnimImpImpl>& pImpl ) -: SvXMLImportContext(rImport, nPrfx, rLocalName), - mpImpl( pImpl ), +XMLAnimationsEffectContext::XMLAnimationsEffectContext( SvXMLImport& rImport, + sal_Int32 nElement, + const Reference< XFastAttributeList >& xAttrList, + XMLAnimationsContext& rAnimationsContext ) +: SvXMLImportContext(rImport), + mxAnimationsContext( &rAnimationsContext ), meKind( XMLE_SHOW ), mbTextEffect( false ), meEffect( EK_none ), meDirection( ED_none ), mnStartScale( 100 ), meSpeed( AnimationSpeed_MEDIUM ), maDimColor(0), mbPlayFull( false ) { - if( IsXMLToken( rLocalName, XML_SHOW_SHAPE ) ) + switch(nElement & TOKEN_MASK) { - meKind = XMLE_SHOW; - } - else if( IsXMLToken( rLocalName, XML_SHOW_TEXT ) ) - { - meKind = XMLE_SHOW; - mbTextEffect = true; - } - else if( IsXMLToken( rLocalName, XML_HIDE_SHAPE ) ) - { - meKind = XMLE_HIDE; - } - else if( IsXMLToken( rLocalName, XML_HIDE_TEXT ) ) - { - meKind = XMLE_HIDE; - mbTextEffect = true; - } - else if( IsXMLToken( rLocalName, XML_DIM ) ) - { - meKind = XMLE_DIM; - } - else if( IsXMLToken( rLocalName, XML_PLAY ) ) - { - meKind = XMLE_PLAY; - } - else - { - // unknown action, overread - return; + case XML_SHOW_SHAPE: + meKind = XMLE_SHOW; + break; + case XML_SHOW_TEXT: + meKind = XMLE_SHOW; + mbTextEffect = true; + break; + case XML_HIDE_SHAPE: + meKind = XMLE_HIDE; + break; + case XML_HIDE_TEXT: + meKind = XMLE_HIDE; + mbTextEffect = true; + break; + case XML_DIM: + meKind = XMLE_DIM; + break; + case XML_PLAY: + meKind = XMLE_PLAY; + break; + default: + SAL_WARN("xmloff", "unknown element " << SvXMLImport::getPrefixAndNameFromToken(nElement)); + // unknown action, overread + return; } - // read attributes - const sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; - for(sal_Int16 i=0; i < nAttrCount; i++) + sax_fastparser::FastAttributeList *pAttribList = + sax_fastparser::FastAttributeList::castToFastAttributeList( xAttrList ); + for (auto &aIter : *pAttribList) { - OUString sAttrName = xAttrList->getNameByIndex( i ); - OUString aLocalName; - sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName ); - OUString sValue = xAttrList->getValueByIndex( i ); - - switch( nPrefix ) + OUString sValue = aIter.toString(); + switch( aIter.getToken() ) { - case XML_NAMESPACE_DRAW: - if( IsXMLToken( aLocalName, XML_SHAPE_ID ) ) - { + case XML_ELEMENT(DRAW, XML_SHAPE_ID): maShapeId = sValue; - } - else if( IsXMLToken( aLocalName, XML_COLOR ) ) - { + break; + case XML_ELEMENT(DRAW, XML_COLOR): ::sax::Converter::convertColor(maDimColor, sValue); - } - break; + break; - case XML_NAMESPACE_PRESENTATION: - if( IsXMLToken( aLocalName, XML_EFFECT ) ) - { + case XML_ELEMENT(PRESENTATION, XML_EFFECT): SvXMLUnitConverter::convertEnum( meEffect, sValue, aXML_AnimationEffect_EnumMap ); - } - else if( IsXMLToken(aLocalName, XML_DIRECTION ) ) - { + break; + case XML_ELEMENT(PRESENTATION, XML_DIRECTION): SvXMLUnitConverter::convertEnum( meDirection, sValue, aXML_AnimationDirection_EnumMap ); - } - else if( IsXMLToken( aLocalName, XML_START_SCALE ) ) + break; + case XML_ELEMENT(PRESENTATION, XML_START_SCALE): { sal_Int32 nScale; if (::sax::Converter::convertPercent( nScale, sValue )) mnStartScale = static_cast<sal_Int16>(nScale); + break; } - else if( IsXMLToken( aLocalName, XML_SPEED ) ) - { + case XML_ELEMENT(PRESENTATION, XML_SPEED): SvXMLUnitConverter::convertEnum( meSpeed, sValue, aXML_AnimationSpeed_EnumMap ); - } - else if( IsXMLToken( aLocalName, XML_PATH_ID ) ) - { + break; + case XML_ELEMENT(PRESENTATION, XML_PATH_ID): maPathShapeId = sValue; - } - break; + break; + default: + SAL_WARN("xmloff", "unknown attribute " << SvXMLImport::getPrefixAndNameFromToken(aIter.getToken()) << "=" << sValue); } } } -SvXMLImportContextRef XMLAnimationsEffectContext::CreateChildContext( sal_uInt16 nPrefix, const OUString& rLocalName, const Reference< XAttributeList>& xAttrList ) +css::uno::Reference< css::xml::sax::XFastContextHandler > XMLAnimationsEffectContext::createFastChildContext( + sal_Int32 nElement, + const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) { - return new XMLAnimationsSoundContext( GetImport(), nPrefix, rLocalName, xAttrList, this ); + return new XMLAnimationsSoundContext( GetImport(), nElement, xAttrList, this ); } -void XMLAnimationsEffectContext::EndElement() +void XMLAnimationsEffectContext::endFastElement(sal_Int32 ) { // set effect on shape @@ -523,7 +509,7 @@ void XMLAnimationsEffectContext::EndElement() if( !maShapeId.isEmpty() ) { Reference< XPropertySet > xSet; - if( mpImpl->maLastShapeId != maShapeId ) + if( mxAnimationsContext->maLastShapeId != maShapeId ) { xSet.set( GetImport().getInterfaceToIdentifierMapper().getReference( maShapeId ), UNO_QUERY ); if( xSet.is() ) @@ -531,30 +517,30 @@ void XMLAnimationsEffectContext::EndElement() // check for presentation shape service { Reference< XServiceInfo > xServiceInfo( xSet, UNO_QUERY ); - if( !xServiceInfo.is() || !xServiceInfo->supportsService( AnimImpImpl::gsPresShapeService ) ) + if( !xServiceInfo.is() || !xServiceInfo->supportsService( gsPresShapeService ) ) return; } - mpImpl->maLastShapeId = maShapeId; - mpImpl->mxLastShape = xSet; + mxAnimationsContext->maLastShapeId = maShapeId; + mxAnimationsContext->mxLastShape = xSet; } } else { - xSet = mpImpl->mxLastShape; + xSet = mxAnimationsContext->mxLastShape; } if( xSet.is() ) { if( meKind == XMLE_DIM ) { - xSet->setPropertyValue( AnimImpImpl::gsDimPrev, Any(true) ); + xSet->setPropertyValue( gsDimPrev, Any(true) ); - xSet->setPropertyValue( AnimImpImpl::gsDimColor, Any(maDimColor) ); + xSet->setPropertyValue( gsDimColor, Any(maDimColor) ); } else if( meKind == XMLE_PLAY ) { - xSet->setPropertyValue( AnimImpImpl::gsIsAnimation, Any(true) ); + xSet->setPropertyValue( gsIsAnimation, Any(true) ); // #i42894# speed is not supported for the old group animation fallback, so no need to set it // aAny <<= meSpeed; @@ -564,21 +550,21 @@ void XMLAnimationsEffectContext::EndElement() { if( meKind == XMLE_HIDE && !mbTextEffect && meEffect == EK_none ) { - xSet->setPropertyValue( AnimImpImpl::gsDimHide, Any(true) ); + xSet->setPropertyValue( gsDimHide, Any(true) ); } else { const AnimationEffect eEffect = ImplSdXMLgetEffect( meEffect, meDirection, mnStartScale, meKind == XMLE_SHOW ); - OUString s = mbTextEffect ? AnimImpImpl::gsTextEffect : AnimImpImpl::gsEffect; + OUString s = mbTextEffect ? gsTextEffect : gsEffect; xSet->setPropertyValue( s, makeAny( eEffect ) ); - xSet->setPropertyValue( AnimImpImpl::gsSpeed, makeAny( meSpeed ) ); + xSet->setPropertyValue( gsSpeed, makeAny( meSpeed ) ); if( eEffect == AnimationEffect_PATH && !maPathShapeId.isEmpty() ) { Reference< XShape > xPath( GetImport().getInterfaceToIdentifierMapper().getReference( maPathShapeId ), UNO_QUERY ); if( xPath.is() ) - xSet->setPropertyValue( AnimImpImpl::gsAnimPath, makeAny( xPath ) ); + xSet->setPropertyValue( gsAnimPath, makeAny( xPath ) ); } } } @@ -587,9 +573,9 @@ void XMLAnimationsEffectContext::EndElement() { if( xSet.is() ) { - xSet->setPropertyValue( AnimImpImpl::gsSound, Any(maSoundURL) ); - xSet->setPropertyValue( AnimImpImpl::gsPlayFull, Any(mbPlayFull) ); - xSet->setPropertyValue( AnimImpImpl::gsSoundOn, Any(true) ); + xSet->setPropertyValue( gsSound, Any(maSoundURL) ); + xSet->setPropertyValue( gsPlayFull, Any(mbPlayFull) ); + xSet->setPropertyValue( gsSoundOn, Any(true) ); } else { @@ -605,17 +591,19 @@ void XMLAnimationsEffectContext::EndElement() } -XMLAnimationsContext::XMLAnimationsContext( SvXMLImport& rImport, sal_uInt16 nPrfx, const OUString& rLocalName, - const css::uno::Reference< css::xml::sax::XAttributeList>& ) -: SvXMLImportContext(rImport, nPrfx, rLocalName) -, mpImpl(std::make_shared<AnimImpImpl>()) +XMLAnimationsContext::XMLAnimationsContext( SvXMLImport& rImport ) +: SvXMLImportContext(rImport) { } -SvXMLImportContextRef XMLAnimationsContext::CreateChildContext( sal_uInt16 nPrefix, const OUString& rLocalName, - const css::uno::Reference< css::xml::sax::XAttributeList>& xAttrList ) +void XMLAnimationsContext::startFastElement( sal_Int32 /*nElement*/, + const css::uno::Reference< css::xml::sax::XFastAttributeList >& /*xAttrList*/ ) +{} + +css::uno::Reference< css::xml::sax::XFastContextHandler > XMLAnimationsContext::createFastChildContext( + sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) { - return new XMLAnimationsEffectContext( GetImport(), nPrefix, rLocalName, xAttrList, mpImpl ); + return new XMLAnimationsEffectContext( GetImport(), nElement, xAttrList, *this ); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/xmloff/source/draw/ximppage.cxx b/xmloff/source/draw/ximppage.cxx index 1c3c555b719d..5bc4c9a8cc83 100644 --- a/xmloff/source/draw/ximppage.cxx +++ b/xmloff/source/draw/ximppage.cxx @@ -240,9 +240,13 @@ void SdXMLGenericPageContext::startFastElement( sal_Int32 /*nElement*/, const Re } css::uno::Reference< css::xml::sax::XFastContextHandler > SdXMLGenericPageContext::createFastChildContext( - sal_Int32 /*nElement*/, + sal_Int32 nElement, const Reference< xml::sax::XFastAttributeList>& /*xAttrList*/ ) { + if( nElement == XML_ELEMENT(PRESENTATION, XML_ANIMATIONS) ) + { + return new XMLAnimationsContext( GetImport() ); + } return nullptr; } @@ -254,7 +258,7 @@ SvXMLImportContextRef SdXMLGenericPageContext::CreateChildContext( sal_uInt16 nP if( nPrefix == XML_NAMESPACE_PRESENTATION && IsXMLToken( rLocalName, XML_ANIMATIONS ) ) { - xContext = new XMLAnimationsContext( GetImport(), nPrefix, rLocalName, xAttrList ); + // handled in createFastChildContext } else if( nPrefix == XML_NAMESPACE_OFFICE && IsXMLToken( rLocalName, XML_FORMS ) ) { |