Author: jghali
Date: Thu Oct 13 12:13:14 2016
New Revision: 21462

URL: http://scribus.net/websvn/listing.php?repname=Scribus&sc=1&rev=21462
Log:
#14308: Incorrect justification of Chinese text

Modified:
    trunk/Scribus/scribus/pageitem_textframe.cpp
    trunk/Scribus/scribus/text/textshaper.cpp
    trunk/Scribus/scribus/util_text.cpp
    trunk/Scribus/scribus/util_text.h

Modified: trunk/Scribus/scribus/pageitem_textframe.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=21462&path=/trunk/Scribus/scribus/pageitem_textframe.cpp
==============================================================================
--- trunk/Scribus/scribus/pageitem_textframe.cpp        (original)
+++ trunk/Scribus/scribus/pageitem_textframe.cpp        Thu Oct 13 12:13:14 2016
@@ -65,6 +65,7 @@
 #include "units.h"
 #include "util.h"
 #include "util_math.h"
+#include "util_text.h"
 
 using namespace std;
 
@@ -875,60 +876,6 @@
        }
 }
 
-
-static bool checkCJK(QChar ch) {
-       unsigned int code = ch.unicode();
-       if (    (0x2E80 < code && code < 0x2EFF)   ||  // CJK Radicals 
Supplement
-               (0x3000 < code && code < 0x303F)   ||  // CJK Symbols and 
Punctuation
-               (0x3040 < code && code <= 0x30FF)  ||  // Hiragana, Katakana
-               (0x31C0 < code && code < 0x31EF)   ||  // CJK Strokes
-               (0x3200 < code && code < 0x32FF)   ||  // Enclosed CJK Letters 
and Months
-               (0x3300 < code && code < 0x33FF)   ||  // CJK Compatibility
-               (0x3400 < code && code < 0x4DBF)   ||  // CJK Unified 
Ideographs Extension A
-               (0x4E00 < code && code < 0x9FFF)   ||  // CJK Unified Ideographs
-               (0xF900 < code && code < 0xFAFF)   ||  // CJK Compatibility 
Ideographs
-               (0xFE30 < code && code < 0xFE4F)   ||  // CJK Compatibility 
Forms
-               (0x20000 < code && code < 0x2A6DF) ||  // CJK Unified 
Ideographs Extension B
-               (0x2A700 < code && code < 0x2B73F) ||  // CJK Unified 
Ideographs Extension C
-               (0x2B740 < code && code < 0x2B81F) ||  // CJK Unified 
Ideographs Extension D
-               (0x2F800 < code && code < 0x2FA1F) ||  // CJK Compatibility 
Ideographs Supplement
-               (0xFF01 < code && code < 0xFF0F)   ||
-               (0xFF1A < code && code < 0xFF20)   ||
-               (0xFF58 < code && code < 0xFFDC)   ||
-               (code == 0x3000) ||
-               (code == 0x3002) ||
-               (code == 0x201C) ||
-               (code == 0x201D))
-               return true;
-       else
-               return false;
-}
-
-static bool allowedCJKBreakAfter(QChar ch) {
-       unsigned int code[] = {0x201C, 0x300C, 0xFF08, 0xFF3B, 0xFF5B, 0xFF5F, 
0xFF62, 0xFF0D, 0};
-       for (int i = 0; code[i]; ++i)
-               if (code[i] == ch.unicode())
-                       return false;
-       return true;
-}
-
-static int allowedCJKBreakBefore(QChar ch) {
-       unsigned int code[] =
-        {0x201D, 0x3001, 0x3002, 0x300D, 0xFF01, 0xFF09, 0xFF0C, 0xFF0E, 
0xFF1A,
-         0xFF1B, 0xFF1F, 0xFF3D, 0xFF5D, 0xFF60, 0xFF63, 0xFF64, 0};
-       for (int i = 0; code[i]; ++i)
-               if (code[i] == ch.unicode())
-                       return false;
-       return true;
-}
-
-static bool implicitBreak(QChar f, QChar s) {
-       if (checkCJK(f) && checkCJK(s)) {
-               return allowedCJKBreakAfter(f) && allowedCJKBreakBefore(s);
-       } else
-               return false;
-}
-
 /// called when line length is known and line is to be justified
 static void justifyLine(const ParagraphStyle& style, LineControl& curr)
 {
@@ -1729,7 +1676,7 @@
                                                case SpecialChars::CJK_KANJI:
                                                case SpecialChars::CJK_KANA:
                                                case SpecialChars::CJK_NOTOP:
-                                                       lastGlyph.xadvance += 
charStyle.fontSize() / 10 / 4;
+                                                       lastGlyph.xadvance += 
charStyle.fontSize() / 10 / 4 / lastGlyph.scaleH;
                                                }
                                        } else {        // next char is CJK, too
                                                switch(curStat & 
SpecialChars::CJK_CHAR_MASK){
@@ -1740,7 +1687,7 @@
                                                        case 
SpecialChars::CJK_COMMA:
                                                        case 
SpecialChars::CJK_PERIOD:
                                                        case 
SpecialChars::CJK_MIDPOINT:
-                                                               
lastGlyph.xadvance -= charStyle.fontSize() / 10 / 2;
+                                                               
lastGlyph.xadvance -= charStyle.fontSize() / 10 / 2 / lastGlyph.scaleH;
                                                        }
                                                        break;
                                                case SpecialChars::CJK_COMMA:
@@ -1748,13 +1695,13 @@
                                                        switch(nextStat & 
SpecialChars::CJK_CHAR_MASK){
                                                        case 
SpecialChars::CJK_FENCE_BEGIN:
                                                        case 
SpecialChars::CJK_FENCE_END:
-                                                               
lastGlyph.xadvance -= charStyle.fontSize() / 10 / 2;;
+                                                               
lastGlyph.xadvance -= charStyle.fontSize() / 10 / 2 / lastGlyph.scaleH;
                                                        }
                                                        break;
                                                case SpecialChars::CJK_MIDPOINT:
                                                        switch(nextStat & 
SpecialChars::CJK_CHAR_MASK){
                                                        case 
SpecialChars::CJK_FENCE_BEGIN:
-                                                               
lastGlyph.xadvance -= charStyle.fontSize() / 10 / 2;
+                                                               
lastGlyph.xadvance -= charStyle.fontSize() / 10 / 2 / lastGlyph.scaleH;
                                                        }
                                                        break;
                                                case 
SpecialChars::CJK_FENCE_BEGIN:
@@ -1765,7 +1712,7 @@
                                                                prevStat = 
SpecialChars::getCJKAttr(itemText.text(glyphRuns[i - 1].lastChar())) & 
SpecialChars::CJK_CHAR_MASK;
                                                        }
                                                        if (prevStat == 
SpecialChars::CJK_FENCE_BEGIN){
-                                                               
lastGlyph.xadvance -= charStyle.fontSize() / 10 / 2;
+                                                               
lastGlyph.xadvance -= charStyle.fontSize() / 10 / 2 / lastGlyph.scaleH;
                                                                
lastGlyph.xoffset -= charStyle.fontSize() / 10 / 2;
                                                        }
                                                        break;
@@ -1778,7 +1725,7 @@
                                                case SpecialChars::CJK_KANA:
                                                case SpecialChars::CJK_NOTOP:
                                                        // use the size of the 
current char instead of the next one
-                                                       lastGlyph.xadvance += 
charStyle.fontSize() / 10 / 4;
+                                                       lastGlyph.xadvance += 
charStyle.fontSize() / 10 / 4 / lastGlyph.scaleH;
                                                }
                                        }
                                }

Modified: trunk/Scribus/scribus/text/textshaper.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=21462&path=/trunk/Scribus/scribus/text/textshaper.cpp
==============================================================================
--- trunk/Scribus/scribus/text/textshaper.cpp   (original)
+++ trunk/Scribus/scribus/text/textshaper.cpp   Thu Oct 13 12:13:14 2016
@@ -14,6 +14,7 @@
 #include "styles/paragraphstyle.h"
 #include "textshaper.h"
 #include "text/specialchars.h"
+#include "util_text.h"
 
 TextShaper::TextShaper(PageItem_TextFrame* textItem, int startIndex)
              : m_startIndex(startIndex),
@@ -199,9 +200,15 @@
 
        if (runIndex > 0)
        {
-               GlyphLayout& last = m_runs[runIndex - 1].glyphs().last();
-               last.xadvance += runStyle.font().glyphKerning(last.glyph, 
gl.glyph, runStyle.fontSize() / 10);
+               GlyphRun& lastRun = m_runs[runIndex - 1];
+               GlyphLayout& lastLayout = lastRun.glyphs().last();
+
+               lastLayout.xadvance += 
runStyle.font().glyphKerning(lastLayout.glyph, gl.glyph, runStyle.fontSize() / 
10);
                m_lastKernedIndex = qMax(m_lastKernedIndex, runIndex - 1);
+
+               QChar lastChar = itemText.text(lastRun.lastChar());
+               if (implicitSpace(lastChar, ch))
+                       run.setFlag(ScLayout_ImplicitSpace);
        }
 
        //show control characters for marks

Modified: trunk/Scribus/scribus/util_text.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=21462&path=/trunk/Scribus/scribus/util_text.cpp
==============================================================================
--- trunk/Scribus/scribus/util_text.cpp (original)
+++ trunk/Scribus/scribus/util_text.cpp Thu Oct 13 12:13:14 2016
@@ -21,6 +21,68 @@
 #include "scribusdoc.h"
 #include "util_text.h"
 #include "serializer.h"
+
+bool checkCJK(QChar ch)
+{
+       unsigned int code = ch.unicode();
+       if (    (0x2E80 < code && code < 0x2EFF)   ||  // CJK Radicals 
Supplement
+               (0x3000 < code && code < 0x303F)   ||  // CJK Symbols and 
Punctuation
+               (0x3040 < code && code <= 0x30FF)  ||  // Hiragana, Katakana
+               (0x31C0 < code && code < 0x31EF)   ||  // CJK Strokes
+               (0x3200 < code && code < 0x32FF)   ||  // Enclosed CJK Letters 
and Months
+               (0x3300 < code && code < 0x33FF)   ||  // CJK Compatibility
+               (0x3400 < code && code < 0x4DBF)   ||  // CJK Unified 
Ideographs Extension A
+               (0x4E00 < code && code < 0x9FFF)   ||  // CJK Unified Ideographs
+               (0xF900 < code && code < 0xFAFF)   ||  // CJK Compatibility 
Ideographs
+               (0xFE30 < code && code < 0xFE4F)   ||  // CJK Compatibility 
Forms
+               (0x20000 < code && code < 0x2A6DF) ||  // CJK Unified 
Ideographs Extension B
+               (0x2A700 < code && code < 0x2B73F) ||  // CJK Unified 
Ideographs Extension C
+               (0x2B740 < code && code < 0x2B81F) ||  // CJK Unified 
Ideographs Extension D
+               (0x2F800 < code && code < 0x2FA1F) ||  // CJK Compatibility 
Ideographs Supplement
+               (0xFF01 < code && code < 0xFF0F)   ||
+               (0xFF1A < code && code < 0xFF20)   ||
+               (0xFF58 < code && code < 0xFFDC)   ||
+               (code == 0x3000) ||
+               (code == 0x3002) ||
+               (code == 0x201C) ||
+               (code == 0x201D))
+               return true;
+       else
+               return false;
+}
+
+bool allowedCJKBreakAfter(QChar ch)
+{
+       unsigned int code[] = {0x201C, 0x300C, 0xFF08, 0xFF3B, 0xFF5B, 0xFF5F, 
0xFF62, 0xFF0D, 0};
+       for (int i = 0; code[i]; ++i)
+               if (code[i] == ch.unicode())
+                       return false;
+       return true;
+}
+
+int allowedCJKBreakBefore(QChar ch)
+{
+       unsigned int code[] =
+        {0x201D, 0x3001, 0x3002, 0x300D, 0xFF01, 0xFF09, 0xFF0C, 0xFF0E, 
0xFF1A,
+         0xFF1B, 0xFF1F, 0xFF3D, 0xFF5D, 0xFF60, 0xFF63, 0xFF64, 0};
+       for (int i = 0; code[i]; ++i)
+               if (code[i] == ch.unicode())
+                       return false;
+       return true;
+}
+
+bool implicitSpace(QChar f, QChar s)
+{
+       return checkCJK(f) && checkCJK(s);
+}
+
+bool implicitBreak(QChar f, QChar s)
+{
+       if (checkCJK(f) && checkCJK(s)) {
+               return allowedCJKBreakAfter(f) && allowedCJKBreakBefore(s);
+       } else
+               return false;
+}
 
 int findParagraphStyle(ScribusDoc* doc, const ParagraphStyle& parStyle)
 {

Modified: trunk/Scribus/scribus/util_text.h
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=21462&path=/trunk/Scribus/scribus/util_text.h
==============================================================================
--- trunk/Scribus/scribus/util_text.h   (original)
+++ trunk/Scribus/scribus/util_text.h   Thu Oct 13 12:13:14 2016
@@ -17,6 +17,12 @@
 
 class  ScribusDoc;
 
+bool checkCJK(QChar ch);
+bool allowedCJKBreakAfter(QChar ch);
+int  allowedCJKBreakBefore(QChar ch);
+bool implicitSpace(QChar f, QChar s);
+bool implicitBreak(QChar f, QChar s);
+
 #ifndef NLS_CONFORMANCE
 int SCRIBUS_API findParagraphStyle(ScribusDoc* doc, const ParagraphStyle& 
parStyle);
 int SCRIBUS_API findParagraphStyle(ScribusDoc* doc, const QString &name);


_______________________________________________
scribus-commit mailing list
scribus-commit@lists.scribus.net
http://lists.scribus.net/mailman/listinfo/scribus-commit

Reply via email to