xmloff/inc/animimp.hxx          |   18 +--
 xmloff/source/draw/animimp.cxx  |  240 +++++++++++++++++++---------------------
 xmloff/source/draw/ximppage.cxx |    8 +
 3 files changed, 128 insertions(+), 138 deletions(-)

New commits:
commit c8dbdd691e8d08d16f421d471eb269804de262d5
Author:     Noel Grandin <noel.gran...@collabora.co.uk>
AuthorDate: Mon Mar 9 14:08:41 2020 +0200
Commit:     Noel Grandin <noel.gran...@collabora.co.uk>
CommitDate: Mon Mar 9 20:29:33 2020 +0100

    use FastParser in XMLAnimationsContext
    
    Change-Id: Ib6c99e7aa9d2797a04b9590c69008f6895f13780
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/90217
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>

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 ) )
     {
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to