diff options
author | Mark Hung <marklh9@gmail.com> | 2016-10-09 15:03:18 +0800 |
---|---|---|
committer | Khaled Hosny <khaledhosny@eglug.org> | 2016-10-15 21:12:31 +0000 |
commit | dcef76b34aa1dca8389b3c068dc3d82a11d2c382 (patch) | |
tree | 1efe62fc621110f614152c9660ec67b3bb5d7496 | |
parent | 04677dcba24c76a9860839ab59fb3bff86b2b6d1 (diff) |
tdf#43740 Count CJK characters to distribute spaces.
lcl_AddSpace determine the amount of space to distribute
to a portion based on its text length. Counting the number
of CJK characters prevent including codepoints that are not
visible, such as surrogate pairs or Unicode variance
selectors, by mistake.
Change-Id: Ia20a7f76ea1ea3c1f4638db865721eaa26a8c82c
Reviewed-on: https://gerrit.libreoffice.org/29616
Reviewed-by: Khaled Hosny <khaledhosny@eglug.org>
Tested-by: Khaled Hosny <khaledhosny@eglug.org>
-rw-r--r-- | sw/source/core/inc/scriptinfo.hxx | 1 | ||||
-rw-r--r-- | sw/source/core/text/porlay.cxx | 21 | ||||
-rw-r--r-- | sw/source/core/text/portxt.cxx | 2 |
3 files changed, 23 insertions, 1 deletions
diff --git a/sw/source/core/inc/scriptinfo.hxx b/sw/source/core/inc/scriptinfo.hxx index e0ee73c491df..962a87f68eb1 100644 --- a/sw/source/core/inc/scriptinfo.hxx +++ b/sw/source/core/inc/scriptinfo.hxx @@ -352,6 +352,7 @@ public: sal_Int32 nLen, sal_Int32 nNumberOfBlanks = 0, long nSpaceAdd = 0 ); + static sal_Int32 CountCJKCharacters( const OUString &rText, sal_Int32 nPos, sal_Int32 nEnd, LanguageType aLang); static SwScriptInfo* GetScriptInfo( const SwTextNode& rNode, bool bAllowInvalid = false ); diff --git a/sw/source/core/text/porlay.cxx b/sw/source/core/text/porlay.cxx index 9dd9c952dd1c..0df03c6a5c98 100644 --- a/sw/source/core/text/porlay.cxx +++ b/sw/source/core/text/porlay.cxx @@ -30,6 +30,7 @@ #include <breakit.hxx> #include <unicode/uchar.h> #include <com/sun/star/i18n/ScriptType.hpp> +#include <com/sun/star/i18n/CharacterIteratorMode.hpp> #include <com/sun/star/i18n/CTLScriptType.hpp> #include <com/sun/star/i18n/WordType.hpp> #include <paratr.hxx> @@ -2142,4 +2143,24 @@ void SwScriptInfo::CalcHiddenRanges( const SwTextNode& rNode, MultiSelection& rH rNode.SetHiddenCharAttribute( bNewHiddenCharsHidePara, bNewContainsHiddenChars ); } +sal_Int32 SwScriptInfo::CountCJKCharacters( const OUString &rText, sal_Int32 nPos, sal_Int32 nEnd, LanguageType aLang) +{ + sal_Int32 nCount = 0; + if ( nEnd > nPos && g_pBreakIt->GetBreakIter().is() ) + { + sal_Int32 nDone = 0; + const lang::Locale &rLocale = g_pBreakIt->GetLocale( aLang ); + while ( nPos < nEnd ) + { + nPos = g_pBreakIt->GetBreakIter()->nextCharacters( rText, nPos, + rLocale, + i18n::CharacterIteratorMode::SKIPCELL, 1, nDone ); + nCount++; + } + } + else + nCount = nEnd - nPos ; + + return nCount; +} /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/core/text/portxt.cxx b/sw/source/core/text/portxt.cxx index e12955cc5f3e..2c200c09eec0 100644 --- a/sw/source/core/text/portxt.cxx +++ b/sw/source/core/text/portxt.cxx @@ -99,7 +99,7 @@ static sal_Int32 lcl_AddSpace( const SwTextSizeInfo &rInf, const OUString* pStr, pPor->IsPostItsPortion() ) ) pPor = pPor->GetPortion(); - nCnt += nEnd - nPos; + nCnt += SwScriptInfo::CountCJKCharacters( *pStr, nPos, nEnd, aLang ); if ( !pPor || pPor->IsHolePortion() || pPor->InFixMargGrp() || pPor->IsBreakPortion() ) |