Date: prev next · Thread: first prev next last
2011 Archives by date, by thread · List index


Hi,

The attached patch removes one use of SvBytes and SvXub_StrLens from
SwScriptInfo.

There are still other uses in there to be replaced, but the bits don't
interact very much.

Changes under LGPLv3+/MPL

Nigel.
From 8d92a6e07a576a76b429f98c10ab48975a69768f Mon Sep 17 00:00:00 2001
From: Nigel Hawkins <n.hawkins@gmx.com>
Date: Tue, 8 Feb 2011 14:05:29 +0000
Subject: [PATCH 3/3] Remove some svArray usage in SwScriptInfo

---
 sw/source/core/inc/scriptinfo.hxx |   23 +++++++++++-----
 sw/source/core/text/porlay.cxx    |   52 ++++++++++++++++--------------------
 2 files changed, 39 insertions(+), 36 deletions(-)

diff --git a/sw/source/core/inc/scriptinfo.hxx b/sw/source/core/inc/scriptinfo.hxx
index 5b46b8d..ef3a365 100644
--- a/sw/source/core/inc/scriptinfo.hxx
+++ b/sw/source/core/inc/scriptinfo.hxx
@@ -99,8 +99,16 @@ public:
 class SwScriptInfo
 {
 private:
-    SvXub_StrLens aScriptChg;
-    SvBytes aScriptType;
+    //! Records a single change in script type.
+    struct ScriptChangeInfo
+    {
+        xub_StrLen position; //!< Character position at which we change script
+        BYTE       type;     //!< Script type (Latin/Asian/Complex) that we change to.
+        inline ScriptChangeInfo(xub_StrLen pos, BYTE typ) : position(pos), type(typ) {};
+    };
+    //TODO - This is sorted, so should probably be a std::set rather than vector.
+    //       But we also use random access (probably unnecessarily).
+    std::vector<ScriptChangeInfo> aScriptChanges;
     SvXub_StrLens aDirChg;
     SvBytes aDirType;
     SvXub_StrLens aKashida;
@@ -357,16 +365,17 @@ inline void SwScriptInfo::SetInvalidity( const xub_StrLen nPos )
     if ( nPos < nInvalidityPos )
         nInvalidityPos = nPos;
 };
-inline USHORT SwScriptInfo::CountScriptChg() const { return aScriptChg.Count(); }
+
+inline USHORT SwScriptInfo::CountScriptChg() const { return aScriptChanges.size(); }
 inline xub_StrLen SwScriptInfo::GetScriptChg( const USHORT nCnt ) const
 {
-    OSL_ENSURE( nCnt < aScriptChg.Count(),"No ScriptChange today!");
-    return aScriptChg[ nCnt ];
+    OSL_ENSURE( nCnt < aScriptChanges.size(),"No ScriptChange today!");
+    return aScriptChanges[nCnt].position;
 }
 inline BYTE SwScriptInfo::GetScriptType( const xub_StrLen nCnt ) const
 {
-    OSL_ENSURE( nCnt < aScriptChg.Count(),"No ScriptType today!");
-    return aScriptType[ nCnt ];
+    OSL_ENSURE( nCnt < aScriptChanges.size(),"No ScriptType today!");
+    return aScriptChanges[nCnt].type;
 }
 
 inline USHORT SwScriptInfo::CountDirChg() const { return aDirChg.Count(); }
diff --git a/sw/source/core/text/porlay.cxx b/sw/source/core/text/porlay.cxx
index 7c6a4b3..51d6c55 100644
--- a/sw/source/core/text/porlay.cxx
+++ b/sw/source/core/text/porlay.cxx
@@ -915,9 +915,7 @@ void SwScriptInfo::InitScriptInfo( const SwTxtNode& rNode, sal_Bool bRTL )
     //
 
     // remove invalid entries from script information arrays
-    const USHORT nScriptRemove = aScriptChg.Count() - nCnt;
-    aScriptChg.Remove( nCnt, nScriptRemove );
-    aScriptType.Remove( nCnt, nScriptRemove );
+    aScriptChanges.erase( aScriptChanges.begin() + nCnt, aScriptChanges.end() );
 
     // get the start of the last compression group
     USHORT nLastCompression = nChg;
@@ -981,8 +979,8 @@ void SwScriptInfo::InitScriptInfo( const SwTxtNode& rNode, sal_Bool bRTL )
 
         if ( nScript != nNextScript )
         {
-            aScriptChg.Insert( nEnd, nCnt );
-            aScriptType.Insert( nScript, nCnt++ );
+            aScriptChanges.push_back( ScriptChangeInfo(nEnd, nScript) );
+            nCnt++;
             nScript = nNextScript;
         }
     }
@@ -991,7 +989,7 @@ void SwScriptInfo::InitScriptInfo( const SwTxtNode& rNode, sal_Bool bRTL )
     // UPDATE THE SCRIPT INFO ARRAYS:
     //
 
-    while ( nChg < rTxt.Len() || ( !aScriptChg.Count() && !rTxt.Len() ) )
+    while ( nChg < rTxt.Len() || ( !aScriptChanges.empty() && !rTxt.Len() ) )
     {
         OSL_ENSURE( i18n::ScriptType::WEAK != nScript,
                 "Inserting WEAK into SwScriptInfo structure" );
@@ -1032,18 +1030,18 @@ void SwScriptInfo::InitScriptInfo( const SwTxtNode& rNode, sal_Bool bRTL )
             if (nType == U_NON_SPACING_MARK || nType == U_ENCLOSING_MARK ||
                 nType == U_COMBINING_SPACING_MARK )
             {
-                aScriptChg.Insert( nChg - 1, nCnt );
+                aScriptChanges.push_back( ScriptChangeInfo(nChg-1, nScript) );
             }
             else
             {
-                aScriptChg.Insert( nChg, nCnt );
+                aScriptChanges.push_back( ScriptChangeInfo(nChg, nScript) );
             }
         }
         else
         {
-            aScriptChg.Insert( nChg, nCnt );
+            aScriptChanges.push_back( ScriptChangeInfo(nChg, nScript) );
         }
-        aScriptType.Insert( nScript, nCnt++ );
+        ++nCnt;
 
         // if current script is asian, we search for compressable characters
         // in this range
@@ -1360,37 +1358,33 @@ void SwScriptInfo::InitScriptInfo( const SwTxtNode& rNode, sal_Bool bRTL )
                 // we have to insert a new script change:
                 if ( nStart > 0 && nStartPosOfGroup < nStart )
                 {
-                    aScriptChg.Insert( nStart, nScriptIdx );
-                    aScriptType.Insert( nScriptTypeOfGroup, nScriptIdx );
+                    aScriptChanges.insert(aScriptChanges.begin() + nScriptIdx,
+                                          ScriptChangeInfo(nStart, nScriptTypeOfGroup) );
                     ++nScriptIdx;
                 }
 
                 // Remove entries in ScriptArray which end inside the RTL run:
-                while ( nScriptIdx < aScriptChg.Count() && GetScriptChg( nScriptIdx ) <= nEnd )
+                while ( nScriptIdx < aScriptChanges.size() && GetScriptChg( nScriptIdx ) <= nEnd )
                 {
-                    aScriptChg.Remove( nScriptIdx, 1 );
-                    aScriptType.Remove( nScriptIdx, 1 );
+                    aScriptChanges.erase(aScriptChanges.begin() + nScriptIdx);
                 }
 
                 // Insert a new entry in ScriptArray for the end of the RTL run:
-                aScriptChg.Insert( nEnd, nScriptIdx );
-                aScriptType.Insert( i18n::ScriptType::COMPLEX, nScriptIdx );
+                aScriptChanges.insert(aScriptChanges.begin() + nScriptIdx,
+                                      ScriptChangeInfo(nEnd, i18n::ScriptType::COMPLEX) );
 
 #if OSL_DEBUG_LEVEL > 1
-                BYTE nScriptType;
-                BYTE nLastScriptType = i18n::ScriptType::WEAK;
-                xub_StrLen nScriptChg;
-                xub_StrLen nLastScriptChg = 0;
-                (void) nLastScriptChg;
-                (void) nLastScriptType;
-
-                for ( USHORT i2 = 0; i2 < aScriptChg.Count(); ++i2 )
+                // Check that ScriptChangeInfos are in increasing order of
+                // position and that we don't have "empty" changes.
+                BYTE nLastTyp = i18n::ScriptType::WEAK;
+                xub_StrLen nLastPos = 0;
+                for (aScriptChanges::const_iterator i2 = aScriptChanges.begin(); i2 < 
aScriptChanges.end(); ++i2)
                 {
-                    nScriptChg = GetScriptChg( i2 );
-                    nScriptType = GetScriptType( i2 );
-                    OSL_ENSURE( nLastScriptType != nScriptType &&
-                            nLastScriptChg < nScriptChg,
+                    OSL_ENSURE( nLastTyp != i2->type &&
+                            nLastPos < i2->position,
                             "Heavy InitScriptType() confusion" );
+                    nLastPos = i2->position;
+                    nLastTyp = i2->type;
                 }
 #endif
             }
-- 
1.7.0.4


Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.