[Libreoffice-commits] core.git: include/xmloff svx/source xmloff/inc xmloff/source

Noel Grandin (via logerrit) logerrit at kemper.freedesktop.org
Sat Aug 22 19:08:29 UTC 2020


 include/xmloff/DashStyle.hxx               |    4 
 include/xmloff/GradientStyle.hxx           |    4 
 include/xmloff/HatchStyle.hxx              |    4 
 include/xmloff/ImageStyle.hxx              |    4 
 include/xmloff/MarkerStyle.hxx             |    4 
 svx/source/xml/xmlxtimp.cxx                |  207 +++++++++++++----------------
 xmloff/inc/TransGradientStyle.hxx          |    4 
 xmloff/source/style/DashStyle.cxx          |   61 +++-----
 xmloff/source/style/FillStyleContext.cxx   |   55 +++----
 xmloff/source/style/FillStyleContext.hxx   |   48 ++++--
 xmloff/source/style/GradientStyle.cxx      |   77 +++-------
 xmloff/source/style/HatchStyle.cxx         |   58 +++-----
 xmloff/source/style/ImageStyle.cxx         |   45 +-----
 xmloff/source/style/MarkerStyle.cxx        |   46 ++----
 xmloff/source/style/TransGradientStyle.cxx |   67 +++------
 xmloff/source/style/xmlstyle.cxx           |   64 ++++----
 16 files changed, 332 insertions(+), 420 deletions(-)

New commits:
commit 0527778df5f1ace8731043d070cf54b7b8648545
Author:     Noel Grandin <noel.grandin at collabora.co.uk>
AuthorDate: Fri Aug 21 13:19:36 2020 +0200
Commit:     Noel Grandin <noel.grandin at collabora.co.uk>
CommitDate: Sat Aug 22 21:07:53 2020 +0200

    use fastparser for fill styles
    
    Change-Id: I2dcc34863eec5f3ba02ee6df4e64604926b072d4
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/101171
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.grandin at collabora.co.uk>

diff --git a/include/xmloff/DashStyle.hxx b/include/xmloff/DashStyle.hxx
index e9c5aac073c3..76bce512477a 100644
--- a/include/xmloff/DashStyle.hxx
+++ b/include/xmloff/DashStyle.hxx
@@ -28,7 +28,7 @@ class SvXMLImport;
 class SvXMLExport;
 namespace com::sun::star {
     namespace uno { template<class A> class Reference; }
-    namespace xml::sax { class XAttributeList; }
+    namespace xml::sax { class XFastAttributeList; }
     namespace uno { class Any; }
 }
 
@@ -42,7 +42,7 @@ public:
     ~XMLDashStyleImport();
 
     void importXML(
-        const css::uno::Reference< css::xml::sax::XAttributeList >& xAttrList,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList,
         css::uno::Any& rValue,
         OUString& rStrName );
 };
diff --git a/include/xmloff/GradientStyle.hxx b/include/xmloff/GradientStyle.hxx
index 94f2fb2b9b28..5037505cc46a 100644
--- a/include/xmloff/GradientStyle.hxx
+++ b/include/xmloff/GradientStyle.hxx
@@ -29,7 +29,7 @@ class SvXMLImport;
 class SvXMLExport;
 namespace com::sun::star {
     namespace uno { template<class A> class Reference; }
-    namespace xml::sax { class XAttributeList; }
+    namespace xml::sax { class XFastAttributeList; }
     namespace uno { class Any; }
 }
 
@@ -43,7 +43,7 @@ public:
     ~XMLGradientStyleImport();
 
     void importXML(
-        const css::uno::Reference< css::xml::sax::XAttributeList >& xAttrList,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList,
         css::uno::Any& rValue,
         OUString& rStrName );
 };
diff --git a/include/xmloff/HatchStyle.hxx b/include/xmloff/HatchStyle.hxx
index 17d69fcc825d..a08eede0c180 100644
--- a/include/xmloff/HatchStyle.hxx
+++ b/include/xmloff/HatchStyle.hxx
@@ -29,7 +29,7 @@ class SvXMLImport;
 class SvXMLExport;
 namespace com::sun::star {
     namespace uno { template<class A> class Reference; }
-    namespace xml::sax { class XAttributeList; }
+    namespace xml::sax { class XFastAttributeList; }
     namespace uno { class Any; }
 }
 
@@ -43,7 +43,7 @@ public:
     ~XMLHatchStyleImport();
 
     void importXML(
-        const css::uno::Reference< css::xml::sax::XAttributeList>& xAttrList,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList>& xAttrList,
         css::uno::Any& rValue,
         OUString& rStrName );
 };
diff --git a/include/xmloff/ImageStyle.hxx b/include/xmloff/ImageStyle.hxx
index 3b017faa2120..b6e8cb8b0811 100644
--- a/include/xmloff/ImageStyle.hxx
+++ b/include/xmloff/ImageStyle.hxx
@@ -27,7 +27,7 @@
 
 namespace com::sun::star::uno { class Any; }
 namespace com::sun::star::uno { template <typename > class Reference; }
-namespace com::sun::star::xml::sax { class XAttributeList; }
+namespace com::sun::star::xml::sax { class XFastAttributeList; }
 
 class SvXMLExport;
 class SvXMLImport;
@@ -36,7 +36,7 @@ namespace XMLImageStyle
 {
 
 UNLESS_MERGELIBS(XMLOFF_DLLPUBLIC) void exportXML(OUString const & rStrName, css::uno::Any const & rValue, SvXMLExport& rExport);
-UNLESS_MERGELIBS(XMLOFF_DLLPUBLIC) bool importXML(css::uno::Reference<css::xml::sax::XAttributeList> const & xAttrList,
+UNLESS_MERGELIBS(XMLOFF_DLLPUBLIC) bool importXML(css::uno::Reference<css::xml::sax::XFastAttributeList> const & xAttrList,
                                 css::uno::Any& rValue, OUString& rStrName, SvXMLImport& rImport);
 
 }
diff --git a/include/xmloff/MarkerStyle.hxx b/include/xmloff/MarkerStyle.hxx
index 947039d435b3..b3b73b4ba6f2 100644
--- a/include/xmloff/MarkerStyle.hxx
+++ b/include/xmloff/MarkerStyle.hxx
@@ -29,7 +29,7 @@ class SvXMLImport;
 class SvXMLExport;
 namespace com::sun::star {
     namespace uno { template<class A> class Reference; }
-    namespace xml::sax { class XAttributeList; }
+    namespace xml::sax { class XFastAttributeList; }
     namespace uno { class Any; }
 }
 
@@ -43,7 +43,7 @@ public:
     ~XMLMarkerStyleImport();
 
     void importXML(
-        const css::uno::Reference< css::xml::sax::XAttributeList >& xAttrList,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList,
         css::uno::Any& rValue,
         OUString& rStrName );
 };
diff --git a/svx/source/xml/xmlxtimp.cxx b/svx/source/xml/xmlxtimp.cxx
index 7e9ffe67443a..75e4b97e84a5 100644
--- a/svx/source/xml/xmlxtimp.cxx
+++ b/svx/source/xml/xmlxtimp.cxx
@@ -76,12 +76,12 @@ public:
             const css::uno::Reference< css::xml::sax::XFastAttributeList > & Attribs) override;
 
 protected:
-    void importColor( const uno::Reference< XAttributeList >& xAttrList, Any& rAny, OUString& rName );
-    void importMarker( const uno::Reference< XAttributeList >& xAttrList, Any& rAny, OUString& rName );
-    void importDash( const uno::Reference< XAttributeList >& xAttrList, Any& rAny, OUString& rName );
-    void importHatch( const uno::Reference< XAttributeList >& xAttrList, Any& rAny, OUString& rName );
-    void importGradient( const uno::Reference< XAttributeList >& xAttrList, Any& rAny, OUString& rName );
-    void importBitmap( const uno::Reference< XAttributeList >& xAttrList, Any& rAny, OUString& rName );
+    static void importColor( const uno::Reference< XFastAttributeList >& xAttrList, Any& rAny, OUString& rName );
+    void importMarker( const uno::Reference< XFastAttributeList >& xAttrList, Any& rAny, OUString& rName );
+    void importDash( const uno::Reference< XFastAttributeList >& xAttrList, Any& rAny, OUString& rName );
+    void importHatch( const uno::Reference< XFastAttributeList >& xAttrList, Any& rAny, OUString& rName );
+    void importGradient( const uno::Reference< XFastAttributeList >& xAttrList, Any& rAny, OUString& rName );
+    void importBitmap( const uno::Reference< XFastAttributeList >& xAttrList, Any& rAny, OUString& rName );
 
 private:
     uno::Reference< XNameContainer > mxTable;
@@ -101,132 +101,123 @@ css::uno::Reference< css::xml::sax::XFastContextHandler >
         SvxXMLTableImportContext::createFastChildContext(sal_Int32 nElement,
             const css::uno::Reference< css::xml::sax::XFastAttributeList > & rAttrList)
 {
-    if( IsTokenInNamespace(nElement, XML_NAMESPACE_DRAW) ||
-        IsTokenInNamespace(nElement, XML_NAMESPACE_DRAW_OOO) )
+    if( !(IsTokenInNamespace(nElement, XML_NAMESPACE_DRAW) ||
+          IsTokenInNamespace(nElement, XML_NAMESPACE_DRAW_OOO) ))
+            return nullptr;
+
+    std::vector<std::pair<sal_Int32, OString>> aTmpAttrList;
+    for (auto& aIter : sax_fastparser::castToFastAttributeList( rAttrList ))
+        aTmpAttrList.push_back({aIter.getToken(), OString(aIter.toCString())});
+    if( mbOOoFormat &&
+         (SvxXMLTableImportContextEnum::Dash == meContext || SvxXMLTableImportContextEnum::Hatch == meContext ||
+         SvxXMLTableImportContextEnum::Bitmap == meContext) )
     {
-        SvXMLAttributeList *pAttrList = new SvXMLAttributeList;
-        for (auto& aIter : sax_fastparser::castToFastAttributeList( rAttrList ))
-            pAttrList->AddAttribute(
-                SvXMLImport::getNamespacePrefixFromToken(aIter.getToken(), nullptr) + ":" +
-                GetXMLToken(static_cast<XMLTokenEnum>(aIter.getToken() & TOKEN_MASK)),
-                aIter.toString());
-        if( mbOOoFormat &&
-             (SvxXMLTableImportContextEnum::Dash == meContext || SvxXMLTableImportContextEnum::Hatch == meContext ||
-             SvxXMLTableImportContextEnum::Bitmap == meContext) )
+        for( auto & aIter : aTmpAttrList )
         {
-            sal_Int16 nAttrCount = pAttrList->getLength();
-            for( sal_Int16 i=0; i < nAttrCount; i++ )
+            sal_Int32 aLocalAttr = aIter.first & TOKEN_MASK;
+            if( aIter.first == XML_ELEMENT(XLINK, XML_HREF) &&
+                SvxXMLTableImportContextEnum::Bitmap == meContext )
             {
-                const OUString& rAttrName = pAttrList->getNameByIndex( i );
-                OUString aLocalName;
-                sal_uInt16 nPrefix_ =
-                    GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName,
-                                                                &aLocalName );
-                if( XML_NAMESPACE_XLINK == nPrefix_ &&
-                    SvxXMLTableImportContextEnum::Bitmap == meContext &&
-                    IsXMLToken( aLocalName, XML_HREF ) )
-                {
-                    const OUString rValue = pAttrList->getValueByIndex( i );
-                    if( !rValue.isEmpty() && '#' == rValue[0] )
-                        pAttrList->SetValueByIndex( i, rValue.copy( 1 ) );
-                }
-                else if( (XML_NAMESPACE_DRAW == nPrefix_ || XML_NAMESPACE_DRAW_OOO == nPrefix_) &&
-                          ( ( SvxXMLTableImportContextEnum::Dash == meContext &&
-                              (IsXMLToken( aLocalName, XML_DOTS1_LENGTH ) ||
-                               IsXMLToken( aLocalName, XML_DOTS2_LENGTH ) ||
-                               IsXMLToken( aLocalName, XML_DISTANCE )) ) ||
-                            ( SvxXMLTableImportContextEnum::Hatch == meContext &&
-                              IsXMLToken( aLocalName, XML_DISTANCE ) ) ) )
+                OString rValue = aIter.second;
+                if( !rValue.isEmpty() && '#' == rValue[0] )
+                    rValue = rValue.copy( 1 );
+            }
+            else if( (IsTokenInNamespace(aIter.first, XML_NAMESPACE_DRAW) || IsTokenInNamespace(aIter.first, XML_NAMESPACE_DRAW_OOO)) &&
+                      ( ( SvxXMLTableImportContextEnum::Dash == meContext &&
+                          ( aLocalAttr == XML_DOTS1_LENGTH ||
+                            aLocalAttr == XML_DOTS2_LENGTH ||
+                            aLocalAttr == XML_DISTANCE ) ) ||
+                        ( SvxXMLTableImportContextEnum::Hatch == meContext &&
+                          ( aLocalAttr == XML_DISTANCE ) ) ) )
+            {
+                OString& rValue = aIter.second;
+                sal_Int32 nPos = rValue.getLength();
+                while( nPos && rValue[nPos-1] <= ' ' )
+                    --nPos;
+                if( nPos > 2 &&
+                    ('c'==rValue[nPos-2] || 'C'==rValue[nPos-2]) &&
+                    ('h'==rValue[nPos-1] || 'H'==rValue[nPos-1]) )
                 {
-                    const OUString rValue = pAttrList->getValueByIndex( i );
-                    sal_Int32 nPos = rValue.getLength();
-                    while( nPos && rValue[nPos-1] <= ' ' )
-                        --nPos;
-                    if( nPos > 2 &&
-                        ('c'==rValue[nPos-2] || 'C'==rValue[nPos-2]) &&
-                        ('h'==rValue[nPos-1] || 'H'==rValue[nPos-1]) )
-                    {
-                        pAttrList->SetValueByIndex( i, rValue.copy( 0, nPos-2 ) );
-                    }
+                    rValue = rValue.copy( 0, nPos-2 );
                 }
             }
         }
-        try
+    }
+    try
+    {
+        rtl::Reference<sax_fastparser::FastAttributeList> xFastList = new sax_fastparser::FastAttributeList(nullptr);
+        for (auto& aIter : aTmpAttrList)
+            xFastList->add(aIter.first, aIter.second);
+
+        Any aAny;
+        OUString aName;
+
+        switch( meContext )
         {
-            Any aAny;
-            OUString aName;
+        case SvxXMLTableImportContextEnum::Color:
+            importColor( xFastList.get(), aAny, aName );
+            break;
+        case SvxXMLTableImportContextEnum::Marker:
+            importMarker( xFastList.get(), aAny, aName  );
+            break;
+        case SvxXMLTableImportContextEnum::Dash:
+            importDash( xFastList.get(), aAny, aName  );
+            break;
+        case SvxXMLTableImportContextEnum::Hatch:
+            importHatch( xFastList.get(), aAny, aName  );
+            break;
+        case SvxXMLTableImportContextEnum::Gradient:
+            importGradient( xFastList.get(), aAny, aName  );
+            break;
+        case SvxXMLTableImportContextEnum::Bitmap:
+            importBitmap( xFastList.get(), aAny, aName  );
+            break;
+        }
 
-            switch( meContext )
+        if( !aName.isEmpty() && aAny.hasValue() )
+        {
+            if( mxTable->hasByName( aName ) )
             {
-            case SvxXMLTableImportContextEnum::Color:
-                importColor( pAttrList, aAny, aName );
-                break;
-            case SvxXMLTableImportContextEnum::Marker:
-                importMarker( pAttrList, aAny, aName  );
-                break;
-            case SvxXMLTableImportContextEnum::Dash:
-                importDash( pAttrList, aAny, aName  );
-                break;
-            case SvxXMLTableImportContextEnum::Hatch:
-                importHatch( pAttrList, aAny, aName  );
-                break;
-            case SvxXMLTableImportContextEnum::Gradient:
-                importGradient( pAttrList, aAny, aName  );
-                break;
-            case SvxXMLTableImportContextEnum::Bitmap:
-                importBitmap( pAttrList, aAny, aName  );
-                break;
+                mxTable->replaceByName( aName, aAny );
             }
-
-            if( !aName.isEmpty() && aAny.hasValue() )
+            else
             {
-                if( mxTable->hasByName( aName ) )
-                {
-                    mxTable->replaceByName( aName, aAny );
-                }
-                else
-                {
-                    mxTable->insertByName( aName, aAny );
-                }
+                mxTable->insertByName( aName, aAny );
             }
         }
-        catch (const uno::Exception&)
-        {
-            DBG_UNHANDLED_EXCEPTION("svx");
-        }
-        return new SvXMLImportContext( GetImport() );
     }
-    return nullptr;
+    catch (const uno::Exception&)
+    {
+        DBG_UNHANDLED_EXCEPTION("svx");
+    }
+    return new SvXMLImportContext( GetImport() );
 }
 
-void SvxXMLTableImportContext::importColor( const uno::Reference< XAttributeList >& xAttrList, Any& rAny, OUString& rName )
+void SvxXMLTableImportContext::importColor( const uno::Reference< XFastAttributeList >& xAttrList, Any& rAny, OUString& rName )
 {
-    const sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
-    for( sal_Int16 i=0; i < nAttrCount; i++ )
+    for (auto& aIter : sax_fastparser::castToFastAttributeList( xAttrList ))
     {
-        const OUString& rFullAttrName = xAttrList->getNameByIndex( i );
-        OUString aLocalName;
-        sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( rFullAttrName, &aLocalName );
-
-
-        if( XML_NAMESPACE_DRAW == nPrefix || XML_NAMESPACE_DRAW_OOO == nPrefix )
+        switch (aIter.getToken())
         {
-            if( aLocalName == GetXMLToken(XML_NAME) )
-            {
-                rName = xAttrList->getValueByIndex( i );
-            }
-            else if( aLocalName == GetXMLToken(XML_COLOR) )
+            case XML_ELEMENT(DRAW, XML_NAME):
+            case XML_ELEMENT(DRAW_OOO, XML_NAME):
+                rName = aIter.toString();
+                break;
+            case XML_ELEMENT(DRAW, XML_COLOR):
+            case XML_ELEMENT(DRAW_OOO, XML_COLOR):
             {
                 sal_Int32 nColor(0);
-                ::sax::Converter::convertColor(nColor,
-                        xAttrList->getValueByIndex( i ));
+                ::sax::Converter::convertColor(nColor, aIter.toString());
                 rAny <<= nColor;
+                break;
             }
+            default:
+                SAL_WARN("xmloff", "unknown attribute " << SvXMLImport::getPrefixAndNameFromToken(aIter.getToken()) << "=" << aIter.toString());
         }
     }
 }
 
-void SvxXMLTableImportContext::importMarker( const uno::Reference< XAttributeList >& xAttrList, Any& rAny, OUString& rName )
+void SvxXMLTableImportContext::importMarker( const uno::Reference< XFastAttributeList >& xAttrList, Any& rAny, OUString& rName )
 {
     try
     {
@@ -239,7 +230,7 @@ void SvxXMLTableImportContext::importMarker( const uno::Reference< XAttributeLis
     }
 }
 
-void SvxXMLTableImportContext::importDash( const uno::Reference< XAttributeList >& xAttrList, Any& rAny, OUString& rName )
+void SvxXMLTableImportContext::importDash( const uno::Reference< XFastAttributeList >& xAttrList, Any& rAny, OUString& rName )
 {
     try
     {
@@ -252,7 +243,7 @@ void SvxXMLTableImportContext::importDash( const uno::Reference< XAttributeList
     }
 }
 
-void SvxXMLTableImportContext::importHatch( const uno::Reference< XAttributeList >& xAttrList, Any& rAny, OUString& rName )
+void SvxXMLTableImportContext::importHatch( const uno::Reference< XFastAttributeList >& xAttrList, Any& rAny, OUString& rName )
 {
     try
     {
@@ -265,7 +256,7 @@ void SvxXMLTableImportContext::importHatch( const uno::Reference< XAttributeList
     }
 }
 
-void SvxXMLTableImportContext::importGradient( const uno::Reference< XAttributeList >& xAttrList, Any& rAny, OUString& rName )
+void SvxXMLTableImportContext::importGradient( const uno::Reference< XFastAttributeList >& xAttrList, Any& rAny, OUString& rName )
 {
     try
     {
@@ -278,7 +269,7 @@ void SvxXMLTableImportContext::importGradient( const uno::Reference< XAttributeL
     }
 }
 
-void SvxXMLTableImportContext::importBitmap( const uno::Reference< XAttributeList >& xAttrList, Any& rAny, OUString& rName )
+void SvxXMLTableImportContext::importBitmap( const uno::Reference< XFastAttributeList >& xAttrList, Any& rAny, OUString& rName )
 {
     try
     {
diff --git a/xmloff/inc/TransGradientStyle.hxx b/xmloff/inc/TransGradientStyle.hxx
index 6a1174c419d8..61637eac9ab0 100644
--- a/xmloff/inc/TransGradientStyle.hxx
+++ b/xmloff/inc/TransGradientStyle.hxx
@@ -27,7 +27,7 @@ class SvXMLImport;
 class SvXMLExport;
 namespace com::sun::star {
     namespace uno { template<class A> class Reference; }
-    namespace xml::sax { class XAttributeList; }
+    namespace xml::sax { class XFastAttributeList; }
     namespace uno { class Any; }
 }
 
@@ -41,7 +41,7 @@ public:
     ~XMLTransGradientStyleImport();
 
     void importXML(
-        const css::uno::Reference< css::xml::sax::XAttributeList >& xAttrList,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList,
         css::uno::Any& rValue,
         OUString& rStrName );
 };
diff --git a/xmloff/source/style/DashStyle.cxx b/xmloff/source/style/DashStyle.cxx
index ee3bdfdd5dda..2fb258492cb4 100644
--- a/xmloff/source/style/DashStyle.cxx
+++ b/xmloff/source/style/DashStyle.cxx
@@ -89,7 +89,7 @@ XMLDashStyleImport::~XMLDashStyleImport()
 }
 
 void XMLDashStyleImport::importXML(
-    const uno::Reference< xml::sax::XAttributeList >& xAttrList,
+    const uno::Reference< xml::sax::XFastAttributeList >& xAttrList,
     uno::Any& rValue,
     OUString& rStrName )
 {
@@ -104,90 +104,83 @@ void XMLDashStyleImport::importXML(
 
     bool bIsRel = false;
 
-    SvXMLNamespaceMap& rNamespaceMap = rImport.GetNamespaceMap();
     SvXMLUnitConverter& rUnitConverter = rImport.GetMM100UnitConverter();
 
-    static const SvXMLTokenMap aTokenMap( aDashStyleAttrTokenMap );
-
-    sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
-    for( sal_Int16 i=0; i < nAttrCount; i++ )
+    for (auto &aIter : sax_fastparser::castToFastAttributeList( xAttrList ))
     {
-        const OUString& rFullAttrName = xAttrList->getNameByIndex( i );
-        OUString aStrAttrName;
-        sal_uInt16 nPrefix = rNamespaceMap.GetKeyByAttrName( rFullAttrName, &aStrAttrName );
-        const OUString& rStrValue = xAttrList->getValueByIndex( i );
+        const OUString aStrValue = aIter.toString();
 
-        switch( aTokenMap.Get( nPrefix, aStrAttrName ) )
+        switch( aIter.getToken() )
         {
-        case XML_TOK_DASH_NAME:
+        case XML_ELEMENT(DRAW, XML_NAME):
             {
-                rStrName = rStrValue;
+                rStrName = aStrValue;
             }
             break;
-        case XML_TOK_DASH_DISPLAY_NAME:
+        case XML_ELEMENT(DRAW, XML_DISPLAY_NAME):
             {
-                aDisplayName = rStrValue;
+                aDisplayName = aStrValue;
             }
             break;
-        case XML_TOK_DASH_STYLE:
+        case XML_ELEMENT(DRAW, XML_STYLE):
             {
-                SvXMLUnitConverter::convertEnum( aLineDash.Style, rStrValue, pXML_DashStyle_Enum );
+                SvXMLUnitConverter::convertEnum( aLineDash.Style, aStrValue, pXML_DashStyle_Enum );
             }
             break;
-        case XML_TOK_DASH_DOTS1:
-            aLineDash.Dots = static_cast<sal_Int16>(rStrValue.toInt32());
+        case XML_ELEMENT(DRAW, XML_DOTS1):
+            aLineDash.Dots = static_cast<sal_Int16>(aStrValue.toInt32());
             break;
 
-        case XML_TOK_DASH_DOTS1LEN:
+        case XML_ELEMENT(DRAW, XML_DOTS1_LENGTH):
             {
-                if( rStrValue.indexOf( '%' ) != -1 ) // it's a percentage
+                if( aStrValue.indexOf( '%' ) != -1 ) // it's a percentage
                 {
                     bIsRel = true;
-                    ::sax::Converter::convertPercent(aLineDash.DotLen, rStrValue);
+                    ::sax::Converter::convertPercent(aLineDash.DotLen, aStrValue);
                 }
                 else
                 {
                     rUnitConverter.convertMeasureToCore( aLineDash.DotLen,
-                            rStrValue );
+                            aStrValue );
                 }
             }
             break;
 
-        case XML_TOK_DASH_DOTS2:
-            aLineDash.Dashes = static_cast<sal_Int16>(rStrValue.toInt32());
+        case XML_ELEMENT(DRAW, XML_DOTS2):
+            aLineDash.Dashes = static_cast<sal_Int16>(aStrValue.toInt32());
             break;
 
-        case XML_TOK_DASH_DOTS2LEN:
+        case XML_ELEMENT(DRAW, XML_DOTS2_LENGTH):
             {
-                if( rStrValue.indexOf( '%' ) != -1 ) // it's a percentage
+                if( aStrValue.indexOf( '%' ) != -1 ) // it's a percentage
                 {
                     bIsRel = true;
-                    ::sax::Converter::convertPercent(aLineDash.DashLen, rStrValue);
+                    ::sax::Converter::convertPercent(aLineDash.DashLen, aStrValue);
                 }
                 else
                 {
                     rUnitConverter.convertMeasureToCore( aLineDash.DashLen,
-                            rStrValue );
+                            aStrValue );
                 }
             }
             break;
 
-        case XML_TOK_DASH_DISTANCE:
+        case XML_ELEMENT(DRAW, XML_DISTANCE):
             {
-                if( rStrValue.indexOf( '%' ) != -1 ) // it's a percentage
+                if( aStrValue.indexOf( '%' ) != -1 ) // it's a percentage
                 {
                     bIsRel = true;
-                    ::sax::Converter::convertPercent(aLineDash.Distance, rStrValue);
+                    ::sax::Converter::convertPercent(aLineDash.Distance, aStrValue);
                 }
                 else
                 {
                     rUnitConverter.convertMeasureToCore( aLineDash.Distance,
-                            rStrValue );
+                            aStrValue );
                 }
             }
             break;
         default:
-            SAL_INFO("xmloff.style", "Unknown token at import dash style");
+            SAL_WARN("xmloff.style", "unknown attribute " << SvXMLImport::getPrefixAndNameFromToken(aIter.getToken()) << "=" << aStrValue);
         }
     }
 
diff --git a/xmloff/source/style/FillStyleContext.cxx b/xmloff/source/style/FillStyleContext.cxx
index 9f0daa7ee4be..58ae6cd6786a 100644
--- a/xmloff/source/style/FillStyleContext.cxx
+++ b/xmloff/source/style/FillStyleContext.cxx
@@ -34,12 +34,10 @@
 using namespace ::com::sun::star;
 
 
-XMLGradientStyleContext::XMLGradientStyleContext( SvXMLImport& rImport, sal_uInt16 nPrfx,
-                                              const OUString& rLName,
-                                              const uno::Reference< xml::sax::XAttributeList >& xAttrList)
-:   SvXMLStyleContext(rImport, nPrfx, rLName, xAttrList)
+XMLGradientStyleContext::XMLGradientStyleContext( SvXMLImport& rImport, sal_Int32 ,
+                                              const uno::Reference< xml::sax::XFastAttributeList >& xAttrList)
+:   SvXMLStyleContext(rImport)
 {
-
     // start import
     XMLGradientStyleImport aGradientStyle( GetImport() );
     aGradientStyle.importXML( xAttrList, maAny, maStrName );
@@ -49,7 +47,7 @@ XMLGradientStyleContext::~XMLGradientStyleContext()
 {
 }
 
-void XMLGradientStyleContext::EndElement()
+void XMLGradientStyleContext::endFastElement(sal_Int32 )
 {
     uno::Reference< container::XNameContainer > xGradient( GetImport().GetGradientHelper() );
 
@@ -77,10 +75,9 @@ bool XMLGradientStyleContext::IsTransient() const
 }
 
 
-XMLHatchStyleContext::XMLHatchStyleContext( SvXMLImport& rImport, sal_uInt16 nPrfx,
-                                              const OUString& rLName,
-                                              const uno::Reference< xml::sax::XAttributeList >& xAttrList)
-:   SvXMLStyleContext(rImport, nPrfx, rLName, xAttrList)
+XMLHatchStyleContext::XMLHatchStyleContext( SvXMLImport& rImport, sal_Int32 /*nElement*/,
+                                            const uno::Reference< xml::sax::XFastAttributeList >& xAttrList)
+:   SvXMLStyleContext(rImport)
 {
     // start import
     XMLHatchStyleImport aHatchStyle( GetImport() );
@@ -91,7 +88,7 @@ XMLHatchStyleContext::~XMLHatchStyleContext()
 {
 }
 
-void XMLHatchStyleContext::EndElement()
+void XMLHatchStyleContext::endFastElement(sal_Int32 )
 {
     uno::Reference< container::XNameContainer > xHatch( GetImport().GetHatchHelper() );
 
@@ -119,10 +116,9 @@ bool XMLHatchStyleContext::IsTransient() const
 }
 
 
-XMLBitmapStyleContext::XMLBitmapStyleContext( SvXMLImport& rImport, sal_uInt16 nPrfx,
-                                              const OUString& rLName,
-                                              const uno::Reference< xml::sax::XAttributeList >& xAttrList)
-:   SvXMLStyleContext(rImport, nPrfx, rLName, xAttrList)
+XMLBitmapStyleContext::XMLBitmapStyleContext( SvXMLImport& rImport, sal_Int32 /*nElement*/,
+                                              const uno::Reference< xml::sax::XFastAttributeList >& xAttrList)
+:   SvXMLStyleContext(rImport)
 {
     // start import
     XMLImageStyle::importXML( xAttrList, maAny, maStrName, rImport );
@@ -152,7 +148,7 @@ SvXMLImportContextRef XMLBitmapStyleContext::CreateChildContext( sal_uInt16 nPre
     return pContext;
 }
 
-void XMLBitmapStyleContext::EndElement()
+void XMLBitmapStyleContext::endFastElement(sal_Int32 )
 {
     if (!maAny.has<uno::Reference<graphic::XGraphic>>() && mxBase64Stream.is())
     {
@@ -196,10 +192,9 @@ bool XMLBitmapStyleContext::IsTransient() const
 }
 
 
-XMLTransGradientStyleContext::XMLTransGradientStyleContext( SvXMLImport& rImport, sal_uInt16 nPrfx,
-                                              const OUString& rLName,
-                                              const uno::Reference< xml::sax::XAttributeList >& xAttrList)
-:   SvXMLStyleContext(rImport, nPrfx, rLName, xAttrList)
+XMLTransGradientStyleContext::XMLTransGradientStyleContext( SvXMLImport& rImport, sal_Int32 /*nElement*/,
+                                              const uno::Reference< xml::sax::XFastAttributeList >& xAttrList)
+:   SvXMLStyleContext(rImport)
 {
     // start import
     XMLTransGradientStyleImport aTransGradientStyle( GetImport() );
@@ -210,7 +205,7 @@ XMLTransGradientStyleContext::~XMLTransGradientStyleContext()
 {
 }
 
-void XMLTransGradientStyleContext::EndElement()
+void XMLTransGradientStyleContext::endFastElement(sal_Int32 )
 {
     uno::Reference< container::XNameContainer > xTransGradient( GetImport().GetTransGradientHelper() );
 
@@ -238,10 +233,9 @@ bool XMLTransGradientStyleContext::IsTransient() const
 }
 
 
-XMLMarkerStyleContext::XMLMarkerStyleContext( SvXMLImport& rImport, sal_uInt16 nPrfx,
-                                              const OUString& rLName,
-                                              const uno::Reference< xml::sax::XAttributeList >& xAttrList)
-:   SvXMLStyleContext(rImport, nPrfx, rLName, xAttrList)
+XMLMarkerStyleContext::XMLMarkerStyleContext( SvXMLImport& rImport, sal_Int32 /*nElement*/,
+                                              const uno::Reference< xml::sax::XFastAttributeList >& xAttrList)
+:   SvXMLStyleContext(rImport)
 {
     // start import
     XMLMarkerStyleImport aMarkerStyle( GetImport() );
@@ -252,7 +246,7 @@ XMLMarkerStyleContext::~XMLMarkerStyleContext()
 {
 }
 
-void XMLMarkerStyleContext::EndElement()
+void XMLMarkerStyleContext::endFastElement(sal_Int32 )
 {
     uno::Reference< container::XNameContainer > xMarker( GetImport().GetMarkerHelper() );
 
@@ -280,10 +274,9 @@ bool XMLMarkerStyleContext::IsTransient() const
 }
 
 
-XMLDashStyleContext::XMLDashStyleContext( SvXMLImport& rImport, sal_uInt16 nPrfx,
-                                          const OUString& rLName,
-                                          const uno::Reference< xml::sax::XAttributeList >& xAttrList)
-:   SvXMLStyleContext(rImport, nPrfx, rLName, xAttrList)
+XMLDashStyleContext::XMLDashStyleContext( SvXMLImport& rImport, sal_Int32 /*nElement*/,
+                                          const uno::Reference< xml::sax::XFastAttributeList >& xAttrList)
+:   SvXMLStyleContext(rImport)
 {
     // start import
     XMLDashStyleImport aDashStyle( GetImport() );
@@ -294,7 +287,7 @@ XMLDashStyleContext::~XMLDashStyleContext()
 {
 }
 
-void XMLDashStyleContext::EndElement()
+void XMLDashStyleContext::endFastElement(sal_Int32 )
 {
     uno::Reference< container::XNameContainer > xDashes( GetImport().GetDashHelper() );
 
diff --git a/xmloff/source/style/FillStyleContext.hxx b/xmloff/source/style/FillStyleContext.hxx
index d351f619de68..51e751075be4 100644
--- a/xmloff/source/style/FillStyleContext.hxx
+++ b/xmloff/source/style/FillStyleContext.hxx
@@ -34,11 +34,13 @@ private:
 
 public:
 
-    XMLGradientStyleContext( SvXMLImport& rImport,  sal_uInt16 nPrfx,  const OUString& rLName,
-                           const css::uno::Reference< css::xml::sax::XAttributeList >& xAttrList );
+    XMLGradientStyleContext( SvXMLImport& rImport, sal_Int32 nElement,
+                           const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList );
     virtual ~XMLGradientStyleContext() override;
 
-    virtual void EndElement() override;
+    virtual void SAL_CALL startFastElement( sal_Int32 /*nElement*/,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& ) override {}
+    virtual void SAL_CALL endFastElement(sal_Int32 nElement) override;
 
     virtual bool IsTransient() const override;
 };
@@ -53,11 +55,13 @@ private:
 
 public:
 
-    XMLHatchStyleContext( SvXMLImport& rImport,  sal_uInt16 nPrfx,  const OUString& rLName,
-                           const css::uno::Reference< css::xml::sax::XAttributeList >& xAttrList );
+    XMLHatchStyleContext( SvXMLImport& rImport, sal_Int32 nElement,
+                           const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList );
     virtual ~XMLHatchStyleContext() override;
 
-    virtual void EndElement() override;
+    virtual void SAL_CALL startFastElement( sal_Int32 /*nElement*/,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& ) override {}
+    virtual void SAL_CALL endFastElement(sal_Int32 nElement) override;
 
     virtual bool IsTransient() const override;
 };
@@ -73,8 +77,8 @@ private:
 
 public:
 
-    XMLBitmapStyleContext( SvXMLImport& rImport,  sal_uInt16 nPrfx,  const OUString& rLName,
-                           const css::uno::Reference< css::xml::sax::XAttributeList >& xAttrList );
+    XMLBitmapStyleContext( SvXMLImport& rImport, sal_Int32 nElement,
+                           const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList );
     virtual ~XMLBitmapStyleContext() override;
 
     virtual SvXMLImportContextRef CreateChildContext(
@@ -82,7 +86,9 @@ public:
             const OUString& rLocalName,
             const css::uno::Reference< css::xml::sax::XAttributeList > & xAttrList ) override;
 
-    virtual void EndElement() override;
+    virtual void SAL_CALL startFastElement( sal_Int32 /*nElement*/,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& ) override {}
+    virtual void SAL_CALL endFastElement(sal_Int32 nElement) override;
 
     virtual bool IsTransient() const override;
 };
@@ -97,11 +103,13 @@ private:
 
 public:
 
-    XMLTransGradientStyleContext( SvXMLImport& rImport,  sal_uInt16 nPrfx,  const OUString& rLName,
-                           const css::uno::Reference< css::xml::sax::XAttributeList >& xAttrList );
+    XMLTransGradientStyleContext( SvXMLImport& rImport, sal_Int32 nElement,
+                           const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList );
     virtual ~XMLTransGradientStyleContext() override;
 
-    virtual void EndElement() override;
+    virtual void SAL_CALL startFastElement( sal_Int32 /*nElement*/,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& ) override {}
+    virtual void SAL_CALL endFastElement(sal_Int32 nElement) override;
 
     virtual bool IsTransient() const override;
 };
@@ -116,11 +124,13 @@ private:
 
 public:
 
-    XMLMarkerStyleContext( SvXMLImport& rImport,  sal_uInt16 nPrfx,  const OUString& rLName,
-                           const css::uno::Reference< css::xml::sax::XAttributeList >& xAttrList );
+    XMLMarkerStyleContext( SvXMLImport& rImport, sal_Int32 nElement,
+                           const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList );
     virtual ~XMLMarkerStyleContext() override;
 
-    virtual void EndElement() override;
+    virtual void SAL_CALL startFastElement( sal_Int32 /*nElement*/,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& ) override {}
+    virtual void SAL_CALL endFastElement(sal_Int32 nElement) override;
 
     virtual bool IsTransient() const override;
 };
@@ -135,11 +145,13 @@ private:
 
 public:
 
-    XMLDashStyleContext( SvXMLImport& rImport,  sal_uInt16 nPrfx,  const OUString& rLName,
-                           const css::uno::Reference< css::xml::sax::XAttributeList >& xAttrList );
+    XMLDashStyleContext( SvXMLImport& rImport, sal_Int32 nElement,
+                           const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList );
     virtual ~XMLDashStyleContext() override;
 
-    virtual void EndElement() override;
+    virtual void SAL_CALL startFastElement( sal_Int32 /*nElement*/,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& ) override {}
+    virtual void SAL_CALL endFastElement(sal_Int32 nElement) override;
 
     virtual bool IsTransient() const override;
 };
diff --git a/xmloff/source/style/GradientStyle.cxx b/xmloff/source/style/GradientStyle.cxx
index 4b55f603ed1c..46567e5f8c11 100644
--- a/xmloff/source/style/GradientStyle.cxx
+++ b/xmloff/source/style/GradientStyle.cxx
@@ -83,26 +83,10 @@ XMLGradientStyleImport::~XMLGradientStyleImport()
 }
 
 void XMLGradientStyleImport::importXML(
-    const uno::Reference< xml::sax::XAttributeList >& xAttrList,
+    const uno::Reference< xml::sax::XFastAttributeList >& xAttrList,
     uno::Any& rValue,
     OUString& rStrName )
 {
-    static const SvXMLTokenMapEntry aGradientAttrTokenMap[] =
-    {
-        { XML_NAMESPACE_DRAW, XML_NAME, XML_TOK_GRADIENT_NAME },
-        { XML_NAMESPACE_DRAW, XML_DISPLAY_NAME, XML_TOK_GRADIENT_DISPLAY_NAME },
-        { XML_NAMESPACE_DRAW, XML_STYLE, XML_TOK_GRADIENT_STYLE },
-        { XML_NAMESPACE_DRAW, XML_CX, XML_TOK_GRADIENT_CX },
-        { XML_NAMESPACE_DRAW, XML_CY, XML_TOK_GRADIENT_CY },
-        { XML_NAMESPACE_DRAW, XML_START_COLOR, XML_TOK_GRADIENT_STARTCOLOR },
-        { XML_NAMESPACE_DRAW, XML_END_COLOR, XML_TOK_GRADIENT_ENDCOLOR },
-        { XML_NAMESPACE_DRAW, XML_START_INTENSITY, XML_TOK_GRADIENT_STARTINT },
-        { XML_NAMESPACE_DRAW, XML_END_INTENSITY, XML_TOK_GRADIENT_ENDINT },
-        { XML_NAMESPACE_DRAW, XML_GRADIENT_ANGLE, XML_TOK_GRADIENT_ANGLE },
-        { XML_NAMESPACE_DRAW, XML_BORDER, XML_TOK_GRADIENT_BORDER, },
-        XML_TOKEN_MAP_END
-    };
-
     OUString aDisplayName;
 
     awt::Gradient aGradient;
@@ -113,57 +97,50 @@ void XMLGradientStyleImport::importXML(
     aGradient.Angle = 0;
     aGradient.Border = 0;
 
-    static const SvXMLTokenMap aTokenMap( aGradientAttrTokenMap );
-    SvXMLNamespaceMap& rNamespaceMap = rImport.GetNamespaceMap();
-
-    sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
-    for( sal_Int16 i=0; i < nAttrCount; i++ )
+    for (auto &aIter : sax_fastparser::castToFastAttributeList( xAttrList ))
     {
-        const OUString& rFullAttrName = xAttrList->getNameByIndex( i );
-        OUString aStrAttrName;
-        sal_uInt16 nPrefix = rNamespaceMap.GetKeyByAttrName( rFullAttrName, &aStrAttrName );
-        const OUString& rStrValue = xAttrList->getValueByIndex( i );
+        const OUString aStrValue = aIter.toString();
 
         sal_Int32 nTmpValue;
 
-        switch( aTokenMap.Get( nPrefix, aStrAttrName ) )
+        switch( aIter.getToken() )
         {
-        case XML_TOK_GRADIENT_NAME:
-            rStrName = rStrValue;
+        case XML_ELEMENT(DRAW, XML_NAME):
+            rStrName = aStrValue;
             break;
-        case XML_TOK_GRADIENT_DISPLAY_NAME:
-            aDisplayName = rStrValue;
+        case XML_ELEMENT(DRAW, XML_DISPLAY_NAME):
+            aDisplayName = aStrValue;
             break;
-        case XML_TOK_GRADIENT_STYLE:
-            SvXMLUnitConverter::convertEnum( aGradient.Style, rStrValue, pXML_GradientStyle_Enum );
+        case XML_ELEMENT(DRAW, XML_STYLE):
+            SvXMLUnitConverter::convertEnum( aGradient.Style, aStrValue, pXML_GradientStyle_Enum );
             break;
-        case XML_TOK_GRADIENT_CX:
-            ::sax::Converter::convertPercent( nTmpValue, rStrValue );
+        case XML_ELEMENT(DRAW, XML_CX):
+            ::sax::Converter::convertPercent( nTmpValue, aStrValue );
             aGradient.XOffset = static_cast< sal_Int16 >( nTmpValue );
             break;
-        case XML_TOK_GRADIENT_CY:
-            ::sax::Converter::convertPercent( nTmpValue, rStrValue );
+        case XML_ELEMENT(DRAW, XML_CY):
+            ::sax::Converter::convertPercent( nTmpValue, aStrValue );
             aGradient.YOffset = static_cast< sal_Int16 >( nTmpValue );
             break;
-        case XML_TOK_GRADIENT_STARTCOLOR:
-            ::sax::Converter::convertColor(aGradient.StartColor, rStrValue);
+        case XML_ELEMENT(DRAW, XML_START_COLOR):
+            ::sax::Converter::convertColor(aGradient.StartColor, aStrValue);
             break;
-        case XML_TOK_GRADIENT_ENDCOLOR:
-            ::sax::Converter::convertColor(aGradient.EndColor, rStrValue);
+        case XML_ELEMENT(DRAW, XML_END_COLOR):
+            ::sax::Converter::convertColor(aGradient.EndColor, aStrValue);
             break;
-        case XML_TOK_GRADIENT_STARTINT:
-            ::sax::Converter::convertPercent( nTmpValue, rStrValue );
+        case XML_ELEMENT(DRAW, XML_START_INTENSITY):
+            ::sax::Converter::convertPercent( nTmpValue, aStrValue );
             aGradient.StartIntensity = static_cast< sal_Int16 >( nTmpValue );
             break;
-        case XML_TOK_GRADIENT_ENDINT:
-            ::sax::Converter::convertPercent( nTmpValue, rStrValue );
+        case XML_ELEMENT(DRAW, XML_END_INTENSITY):
+            ::sax::Converter::convertPercent( nTmpValue, aStrValue );
             aGradient.EndIntensity = static_cast< sal_Int16 >( nTmpValue );
             break;
-        case XML_TOK_GRADIENT_ANGLE:
+        case XML_ELEMENT(DRAW, XML_GRADIENT_ANGLE):
             {
                 auto const cmp12(rImport.GetODFVersion().compareTo(ODFVER_012_TEXT));
                 bool const bSuccess =
-                    ::sax::Converter::convertAngle(aGradient.Angle, rStrValue,
+                    ::sax::Converter::convertAngle(aGradient.Angle, aStrValue,
                         // tdf#89475 try to detect borked OOo angles
                         (cmp12 < 0) || (cmp12 == 0
                             && (rImport.isGeneratorVersionOlderThan(SvXMLImport::AOO_4x, SvXMLImport::LO_7x)
@@ -172,13 +149,13 @@ void XMLGradientStyleImport::importXML(
                 SAL_INFO_IF(!bSuccess, "xmloff.style", "failed to import draw:angle");
             }
             break;
-        case XML_TOK_GRADIENT_BORDER:
-            ::sax::Converter::convertPercent( nTmpValue, rStrValue );
+        case XML_ELEMENT(DRAW, XML_BORDER):
+            ::sax::Converter::convertPercent( nTmpValue, aStrValue );
             aGradient.Border = static_cast< sal_Int16 >( nTmpValue );
             break;
 
         default:
-            SAL_INFO("xmloff.style", "Unknown token at import gradient style");
+            SAL_WARN("xmloff.style", "unknown attribute " << SvXMLImport::getPrefixAndNameFromToken(aIter.getToken()) << "=" << aStrValue);
         }
     }
 
diff --git a/xmloff/source/style/HatchStyle.cxx b/xmloff/source/style/HatchStyle.cxx
index e4bb36068c00..61a51fbd7c02 100644
--- a/xmloff/source/style/HatchStyle.cxx
+++ b/xmloff/source/style/HatchStyle.cxx
@@ -74,21 +74,10 @@ XMLHatchStyleImport::~XMLHatchStyleImport()
 }
 
 void XMLHatchStyleImport::importXML(
-    const uno::Reference< xml::sax::XAttributeList >& xAttrList,
+    const uno::Reference< xml::sax::XFastAttributeList >& xAttrList,
     uno::Any& rValue,
     OUString& rStrName )
 {
-    static const SvXMLTokenMapEntry aHatchAttrTokenMap[] =
-    {
-        { XML_NAMESPACE_DRAW, XML_NAME, XML_TOK_HATCH_NAME },
-        { XML_NAMESPACE_DRAW, XML_DISPLAY_NAME, XML_TOK_HATCH_DISPLAY_NAME },
-        { XML_NAMESPACE_DRAW, XML_STYLE, XML_TOK_HATCH_STYLE },
-        { XML_NAMESPACE_DRAW, XML_COLOR, XML_TOK_HATCH_COLOR },
-        { XML_NAMESPACE_DRAW, XML_DISTANCE, XML_TOK_HATCH_DISTANCE },
-        { XML_NAMESPACE_DRAW, XML_ROTATION, XML_TOK_HATCH_ROTATION },
-        XML_TOKEN_MAP_END
-    };
-
     OUString aDisplayName;
 
     drawing::Hatch aHatch;
@@ -97,44 +86,43 @@ void XMLHatchStyleImport::importXML(
     aHatch.Distance = 0;
     aHatch.Angle = 0;
 
-    static const SvXMLTokenMap aTokenMap( aHatchAttrTokenMap );
-    const SvXMLNamespaceMap& rNamespaceMap = rImport.GetNamespaceMap();
     SvXMLUnitConverter& rUnitConverter = rImport.GetMM100UnitConverter();
 
-    sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
-    for( sal_Int16 i=0; i < nAttrCount; i++ )
+    for (auto &aIter : sax_fastparser::castToFastAttributeList( xAttrList ))
     {
-        const OUString& rFullAttrName = xAttrList->getNameByIndex( i );
-        OUString aStrAttrName;
-        sal_uInt16 nPrefix = rNamespaceMap.GetKeyByAttrName( rFullAttrName, &aStrAttrName );
-        const OUString& rStrValue = xAttrList->getValueByIndex( i );
-
-        switch( aTokenMap.Get( nPrefix, aStrAttrName ) )
+        const OUString aStrValue = aIter.toString();
+        switch( aIter.getToken() )
         {
-            case XML_TOK_HATCH_NAME:
-                rStrName = rStrValue;
+            case XML_ELEMENT(DRAW, XML_NAME):
+            case XML_ELEMENT(DRAW_OOO, XML_NAME):
+                rStrName = aStrValue;
                 break;
-            case XML_TOK_HATCH_DISPLAY_NAME:
-                aDisplayName = rStrValue;
+            case XML_ELEMENT(DRAW, XML_DISPLAY_NAME):
+            case XML_ELEMENT(DRAW_OOO, XML_DISPLAY_NAME):
+                aDisplayName = aStrValue;
                 break;
-            case XML_TOK_HATCH_STYLE:
-                SvXMLUnitConverter::convertEnum( aHatch.Style, rStrValue, pXML_HatchStyle_Enum );
+            case XML_ELEMENT(DRAW, XML_STYLE):
+            case XML_ELEMENT(DRAW_OOO, XML_STYLE):
+                SvXMLUnitConverter::convertEnum( aHatch.Style, aStrValue, pXML_HatchStyle_Enum );
                 break;
-            case XML_TOK_HATCH_COLOR:
-                ::sax::Converter::convertColor(aHatch.Color, rStrValue);
+            case XML_ELEMENT(DRAW, XML_COLOR):
+            case XML_ELEMENT(DRAW_OOO, XML_COLOR):
+                ::sax::Converter::convertColor(aHatch.Color, aStrValue);
                 break;
-            case XML_TOK_HATCH_DISTANCE:
-                rUnitConverter.convertMeasureToCore(aHatch.Distance, rStrValue);
+            case XML_ELEMENT(DRAW, XML_DISTANCE):
+            case XML_ELEMENT(DRAW_OOO, XML_DISTANCE):
+                rUnitConverter.convertMeasureToCore(aHatch.Distance, aStrValue);
                 break;
-            case XML_TOK_HATCH_ROTATION:
+            case XML_ELEMENT(DRAW, XML_ROTATION):
+            case XML_ELEMENT(DRAW_OOO, XML_ROTATION):
             {
                 sal_Int32 nValue;
-                if (::sax::Converter::convertNumber(nValue, rStrValue, 0, 3600))
+                if (::sax::Converter::convertNumber(nValue, aStrValue, 0, 3600))
                     aHatch.Angle = sal_Int16(nValue);
                 break;
             }
             default:
-                SAL_INFO("xmloff.style", "Unknown token at import hatch style");
+                SAL_WARN("xmloff.style", "unknown attribute " << SvXMLImport::getPrefixAndNameFromToken(aIter.getToken()) << "=" << aStrValue);
         }
     }
 
diff --git a/xmloff/source/style/ImageStyle.cxx b/xmloff/source/style/ImageStyle.cxx
index 7acb976fec51..b9be2e5318d0 100644
--- a/xmloff/source/style/ImageStyle.cxx
+++ b/xmloff/source/style/ImageStyle.cxx
@@ -88,65 +88,48 @@ void XMLImageStyle::exportXML(OUString const & rStrName, uno::Any const & rValue
     }
 }
 
-bool XMLImageStyle::importXML(uno::Reference<xml::sax::XAttributeList> const & xAttrList,
+bool XMLImageStyle::importXML(uno::Reference<xml::sax::XFastAttributeList> const & xAttrList,
                               uno::Any& rValue, OUString& rStrName, SvXMLImport& rImport)
 {
-    static const SvXMLTokenMapEntry aHatchAttrTokenMap[] =
-    {
-        { XML_NAMESPACE_DRAW, XML_NAME, XML_TOK_IMAGE_NAME },
-        { XML_NAMESPACE_DRAW, XML_DISPLAY_NAME, XML_TOK_IMAGE_DISPLAY_NAME },
-        { XML_NAMESPACE_XLINK, XML_HREF, XML_TOK_IMAGE_URL },
-        { XML_NAMESPACE_XLINK, XML_TYPE, XML_TOK_IMAGE_TYPE },
-        { XML_NAMESPACE_XLINK, XML_SHOW, XML_TOK_IMAGE_SHOW },
-        { XML_NAMESPACE_XLINK, XML_ACTUATE, XML_TOK_IMAGE_ACTUATE },
-        XML_TOKEN_MAP_END
-    };
-
     bool bHasHRef = false;
     bool bHasName = false;
     OUString aDisplayName;
     uno::Reference<graphic::XGraphic> xGraphic;
 
-    static const SvXMLTokenMap aTokenMap( aHatchAttrTokenMap );
-
-    sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
-    for( sal_Int16 i=0; i < nAttrCount; i++ )
+    for (auto &aIter : sax_fastparser::castToFastAttributeList( xAttrList ))
     {
-        const OUString& rFullAttrName = xAttrList->getNameByIndex( i );
-        OUString aStrAttrName;
-        sal_uInt16 nPrefix = rImport.GetNamespaceMap().GetKeyByAttrName( rFullAttrName, &aStrAttrName );
-        const OUString& rStrValue = xAttrList->getValueByIndex( i );
+        const OUString aStrValue = aIter.toString();
 
-        switch( aTokenMap.Get( nPrefix, aStrAttrName ) )
+        switch( aIter.getToken() )
         {
-            case XML_TOK_IMAGE_NAME:
+            case XML_ELEMENT(DRAW, XML_NAME):
                 {
-                    rStrName = rStrValue;
+                    rStrName = aStrValue;
                     bHasName = true;
                 }
                 break;
-            case XML_TOK_IMAGE_DISPLAY_NAME:
+            case XML_ELEMENT(DRAW, XML_DISPLAY_NAME):
                 {
-                    aDisplayName = rStrValue;
+                    aDisplayName = aStrValue;
                 }
                 break;
-            case XML_TOK_IMAGE_URL:
+            case XML_ELEMENT(XLINK, XML_HREF):
                 {
-                    xGraphic = rImport.loadGraphicByURL(rStrValue);
+                    xGraphic = rImport.loadGraphicByURL(aStrValue);
                     bHasHRef = true;
                 }
                 break;
-            case XML_TOK_IMAGE_TYPE:
+            case XML_ELEMENT(XLINK, XML_TYPE):
                 // ignore
                 break;
-            case XML_TOK_IMAGE_SHOW:
+            case XML_ELEMENT(XLINK, XML_SHOW):
                 // ignore
                 break;
-            case XML_TOK_IMAGE_ACTUATE:
+            case XML_ELEMENT(XLINK, XML_ACTUATE):
                 // ignore
                 break;
             default:
-                SAL_WARN("xmloff.style", "Unknown token at import fill bitmap style");
+                SAL_WARN("xmloff.style", "unknown attribute " << SvXMLImport::getPrefixAndNameFromToken(aIter.getToken()) << "=" << aStrValue);
         }
     }
 
diff --git a/xmloff/source/style/MarkerStyle.cxx b/xmloff/source/style/MarkerStyle.cxx
index e0ec8fdd1d97..ac19851fb3d6 100644
--- a/xmloff/source/style/MarkerStyle.cxx
+++ b/xmloff/source/style/MarkerStyle.cxx
@@ -26,6 +26,7 @@
 #include <xmloff/xmltoken.hxx>
 #include <xmloff/xmlexp.hxx>
 #include <xmloff/xmlimp.hxx>
+#include <sal/log.hxx>
 #include <rtl/ustring.hxx>
 #include <com/sun/star/drawing/PolyPolygonBezierCoords.hpp>
 #include <basegfx/polygon/b2dpolypolygon.hxx>
@@ -48,7 +49,7 @@ XMLMarkerStyleImport::~XMLMarkerStyleImport()
 }
 
 void XMLMarkerStyleImport::importXML(
-    const uno::Reference< xml::sax::XAttributeList >& xAttrList,
+    const uno::Reference< xml::sax::XFastAttributeList >& xAttrList,
     uno::Any& rValue,
     OUString& rStrName )
 {
@@ -58,37 +59,32 @@ void XMLMarkerStyleImport::importXML(
 
     std::unique_ptr<SdXMLImExViewBox> xViewBox;
 
-    SvXMLNamespaceMap& rNamespaceMap = rImport.GetNamespaceMap();
     SvXMLUnitConverter& rUnitConverter = rImport.GetMM100UnitConverter();
 
     OUString strPathData;
 
-    sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
-    for( sal_Int16 i = 0; i < nAttrCount; i++ )
+    for (auto &aIter : sax_fastparser::castToFastAttributeList( xAttrList ))
     {
-        OUString aStrFullAttrName = xAttrList->getNameByIndex( i );
-        OUString aStrAttrName;
-        rNamespaceMap.GetKeyByAttrName( aStrFullAttrName, &aStrAttrName );
-        OUString aStrValue = xAttrList->getValueByIndex( i );
+        OUString aStrValue = aIter.toString();
 
-        if( IsXMLToken( aStrAttrName, XML_NAME ) )
+        switch (aIter.getToken() & TOKEN_MASK)
         {
-            rStrName = aStrValue;
-        }
-        else if( IsXMLToken( aStrAttrName, XML_DISPLAY_NAME ) )
-        {
-            aDisplayName = aStrValue;
-        }
-        else if( IsXMLToken( aStrAttrName, XML_VIEWBOX ) )
-        {
-            xViewBox.reset(new SdXMLImExViewBox(aStrValue, rUnitConverter));
-            bHasViewBox = true;
-
-        }
-        else if( IsXMLToken( aStrAttrName, XML_D ) )
-        {
-            strPathData = aStrValue;
-            bHasPathData = true;
+            case XML_NAME:
+                rStrName = aStrValue;
+                break;
+            case XML_DISPLAY_NAME:
+                aDisplayName = aStrValue;
+                break;
+            case XML_VIEWBOX:
+                xViewBox.reset(new SdXMLImExViewBox(aStrValue, rUnitConverter));
+                bHasViewBox = true;
+                break;
+            case XML_D:
+                strPathData = aStrValue;
+                bHasPathData = true;
+                break;
+            default:
+                SAL_WARN("xmloff.style", "unknown attribute " << SvXMLImport::getPrefixAndNameFromToken(aIter.getToken()) << "=" << aStrValue);
         }
     }
 
diff --git a/xmloff/source/style/TransGradientStyle.cxx b/xmloff/source/style/TransGradientStyle.cxx
index 9e95ca5e4edf..811dc2e0ea0b 100644
--- a/xmloff/source/style/TransGradientStyle.cxx
+++ b/xmloff/source/style/TransGradientStyle.cxx
@@ -80,7 +80,7 @@ XMLTransGradientStyleImport::~XMLTransGradientStyleImport()
 }
 
 void XMLTransGradientStyleImport::importXML(
-    const uno::Reference< xml::sax::XAttributeList >& xAttrList,
+    const uno::Reference< xml::sax::XFastAttributeList >& xAttrList,
     uno::Any& rValue,
     OUString& rStrName )
 {
@@ -94,62 +94,41 @@ void XMLTransGradientStyleImport::importXML(
     aGradient.Angle = 0;
     aGradient.Border = 0;
 
-    static const SvXMLTokenMapEntry aTrGradientAttrTokenMap[] =
+    for (auto &aIter : sax_fastparser::castToFastAttributeList( xAttrList ))
     {
-        { XML_NAMESPACE_DRAW, XML_NAME, XML_TOK_GRADIENT_NAME },
-        { XML_NAMESPACE_DRAW, XML_DISPLAY_NAME, XML_TOK_GRADIENT_DISPLAY_NAME },
-        { XML_NAMESPACE_DRAW, XML_STYLE, XML_TOK_GRADIENT_STYLE },
-        { XML_NAMESPACE_DRAW, XML_CX, XML_TOK_GRADIENT_CX },
-        { XML_NAMESPACE_DRAW, XML_CY, XML_TOK_GRADIENT_CY },
-        { XML_NAMESPACE_DRAW, XML_START, XML_TOK_GRADIENT_START },
-        { XML_NAMESPACE_DRAW, XML_END, XML_TOK_GRADIENT_END },
-        { XML_NAMESPACE_DRAW, XML_GRADIENT_ANGLE, XML_TOK_GRADIENT_ANGLE },
-        { XML_NAMESPACE_DRAW, XML_BORDER, XML_TOK_GRADIENT_BORDER, },
-        XML_TOKEN_MAP_END
-    };
-
-    static const SvXMLTokenMap aTokenMap( aTrGradientAttrTokenMap );
-    SvXMLNamespaceMap& rNamespaceMap = rImport.GetNamespaceMap();
-
-    sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
-    for( sal_Int16 i=0; i < nAttrCount; i++ )
-    {
-        const OUString& rFullAttrName = xAttrList->getNameByIndex( i );
-        OUString aStrAttrName;
-        sal_uInt16 nPrefix = rNamespaceMap.GetKeyByAttrName( rFullAttrName, &aStrAttrName );
-        const OUString& rStrValue = xAttrList->getValueByIndex( i );
+        const OUString aStrValue = aIter.toString();
 
         sal_Int32 nTmpValue;
 
-        switch( aTokenMap.Get( nPrefix, aStrAttrName ) )
+        switch( aIter.getToken() )
         {
-        case XML_TOK_GRADIENT_NAME:
+        case XML_ELEMENT(DRAW, XML_NAME):
             {
-                rStrName = rStrValue;
+                rStrName = aStrValue;
             }
             break;
-        case XML_TOK_GRADIENT_DISPLAY_NAME:
+        case XML_ELEMENT(DRAW, XML_DISPLAY_NAME):
             {
-                aDisplayName = rStrValue;
+                aDisplayName = aStrValue;
             }
             break;
-        case XML_TOK_GRADIENT_STYLE:
+        case XML_ELEMENT(DRAW, XML_STYLE):
             {
-                SvXMLUnitConverter::convertEnum( aGradient.Style, rStrValue, pXML_GradientStyle_Enum );
+                SvXMLUnitConverter::convertEnum( aGradient.Style, aStrValue, pXML_GradientStyle_Enum );
             }
             break;
-        case XML_TOK_GRADIENT_CX:
-            ::sax::Converter::convertPercent( nTmpValue, rStrValue );
+        case XML_ELEMENT(DRAW, XML_CX):
+            ::sax::Converter::convertPercent( nTmpValue, aStrValue );
             aGradient.XOffset = sal::static_int_cast< sal_Int16 >(nTmpValue);
             break;
-        case XML_TOK_GRADIENT_CY:
-            ::sax::Converter::convertPercent( nTmpValue, rStrValue );
+        case XML_ELEMENT(DRAW, XML_CY):
+            ::sax::Converter::convertPercent( nTmpValue, aStrValue );
             aGradient.YOffset = sal::static_int_cast< sal_Int16 >(nTmpValue);
             break;
-        case XML_TOK_GRADIENT_START:
+        case XML_ELEMENT(DRAW, XML_START):
             {
                 sal_Int32 aStartTransparency;
-                ::sax::Converter::convertPercent( aStartTransparency, rStrValue );
+                ::sax::Converter::convertPercent( aStartTransparency, aStrValue );
 
                 sal_uInt8 n = sal::static_int_cast< sal_uInt8 >(
                     ( (100 - aStartTransparency) * 255 ) / 100 );
@@ -158,10 +137,10 @@ void XMLTransGradientStyleImport::importXML(
                 aGradient.StartColor = static_cast<sal_Int32>( aColor );
             }
             break;
-        case XML_TOK_GRADIENT_END:
+        case XML_ELEMENT(DRAW, XML_END):
             {
                 sal_Int32 aEndTransparency;
-                ::sax::Converter::convertPercent( aEndTransparency, rStrValue );
+                ::sax::Converter::convertPercent( aEndTransparency, aStrValue );
 
                 sal_uInt8 n = sal::static_int_cast< sal_uInt8 >(
                     ( (100 - aEndTransparency) * 255 ) / 100 );
@@ -170,11 +149,11 @@ void XMLTransGradientStyleImport::importXML(
                 aGradient.EndColor = static_cast<sal_Int32>( aColor );
             }
             break;
-        case XML_TOK_GRADIENT_ANGLE:
+        case XML_ELEMENT(DRAW, XML_GRADIENT_ANGLE):
             {
                 auto const cmp12(rImport.GetODFVersion().compareTo(ODFVER_012_TEXT));
                 bool const bSuccess =
-                    ::sax::Converter::convertAngle(aGradient.Angle, rStrValue,
+                    ::sax::Converter::convertAngle(aGradient.Angle, aStrValue,
                         // tdf#89475 try to detect borked OOo angles
                         (cmp12 < 0) || (cmp12 == 0
                             && (rImport.isGeneratorVersionOlderThan(SvXMLImport::AOO_4x, SvXMLImport::LO_7x)
@@ -183,13 +162,13 @@ void XMLTransGradientStyleImport::importXML(
                 SAL_INFO_IF(!bSuccess, "xmloff.style", "failed to import draw:angle");
             }
             break;
-        case XML_TOK_GRADIENT_BORDER:
-            ::sax::Converter::convertPercent( nTmpValue, rStrValue );
+        case XML_ELEMENT(DRAW, XML_BORDER):
+            ::sax::Converter::convertPercent( nTmpValue, aStrValue );
             aGradient.Border = sal::static_int_cast< sal_Int16 >(nTmpValue);
             break;
 
         default:
-            SAL_INFO("xmloff.style", "Unknown token at import transparency gradient style");
+            SAL_WARN("xmloff.style", "unknown attribute " << SvXMLImport::getPrefixAndNameFromToken(aIter.getToken()) << "=" << aStrValue);
         }
     }
 
diff --git a/xmloff/source/style/xmlstyle.cxx b/xmloff/source/style/xmlstyle.cxx
index a4e3d158ccea..6c4fc1856c0a 100644
--- a/xmloff/source/style/xmlstyle.cxx
+++ b/xmloff/source/style/xmlstyle.cxx
@@ -429,6 +429,38 @@ SvXMLStyleContext *SvXMLStylesContext::CreateStyleChildContext(
                 GetImport(), nElement, xAttrList);
             break;
 
+        // FillStyles
+
+        case XML_ELEMENT(DRAW, XML_GRADIENT):
+        {
+            pStyle = new XMLGradientStyleContext( GetImport(), nElement, xAttrList );
+            break;
+        }
+        case XML_ELEMENT(DRAW, XML_HATCH):
+        {
+            pStyle = new XMLHatchStyleContext( GetImport(), nElement, xAttrList );
+            break;
+        }
+        case XML_ELEMENT(DRAW, XML_FILL_IMAGE):
+        {
+            pStyle = new XMLBitmapStyleContext( GetImport(), nElement, xAttrList );
+            break;
+        }
+        case XML_ELEMENT(DRAW, XML_OPACITY):
+        {
+            pStyle = new XMLTransGradientStyleContext( GetImport(), nElement, xAttrList );
+            break;
+        }
+        case XML_ELEMENT(DRAW, XML_MARKER):
+        {
+            pStyle = new XMLMarkerStyleContext( GetImport(), nElement, xAttrList );
+            break;
+        }
+        case XML_ELEMENT(DRAW, XML_STROKE_DASH):
+        {
+            pStyle = new XMLDashStyleContext( GetImport(), nElement, xAttrList );
+            break;
+        }
     }
 
     return pStyle;
@@ -492,38 +524,6 @@ SvXMLStyleContext *SvXMLStylesContext::CreateStyleChildContext( sal_uInt16 p_nPr
                 break;
 
 
-            // FillStyles
-
-            case XML_TOK_STYLES_GRADIENTSTYLES:
-            {
-                pStyle = new XMLGradientStyleContext( GetImport(), p_nPrefix, rLocalName, xAttrList );
-                break;
-            }
-            case XML_TOK_STYLES_HATCHSTYLES:
-            {
-                pStyle = new XMLHatchStyleContext( GetImport(), p_nPrefix, rLocalName, xAttrList );
-                break;
-            }
-            case XML_TOK_STYLES_BITMAPSTYLES:
-            {
-                pStyle = new XMLBitmapStyleContext( GetImport(), p_nPrefix, rLocalName, xAttrList );
-                break;
-            }
-            case XML_TOK_STYLES_TRANSGRADIENTSTYLES:
-            {
-                pStyle = new XMLTransGradientStyleContext( GetImport(), p_nPrefix, rLocalName, xAttrList );
-                break;
-            }
-            case XML_TOK_STYLES_MARKERSTYLES:
-            {
-                pStyle = new XMLMarkerStyleContext( GetImport(), p_nPrefix, rLocalName, xAttrList );
-                break;
-            }
-            case XML_TOK_STYLES_DASHSTYLES:
-            {
-                pStyle = new XMLDashStyleContext( GetImport(), p_nPrefix, rLocalName, xAttrList );
-                break;
-            }
         }
     }
 


More information about the Libreoffice-commits mailing list