summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Hung <marklh9@gmail.com>2016-10-09 15:03:18 +0800
committerKhaled Hosny <khaledhosny@eglug.org>2016-10-15 21:12:31 +0000
commitdcef76b34aa1dca8389b3c068dc3d82a11d2c382 (patch)
tree1efe62fc621110f614152c9660ec67b3bb5d7496
parent04677dcba24c76a9860839ab59fb3bff86b2b6d1 (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.hxx1
-rw-r--r--sw/source/core/text/porlay.cxx21
-rw-r--r--sw/source/core/text/portxt.cxx2
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() )