Author: jghali
Date: Mon Oct  2 18:37:59 2017
New Revision: 22178

URL: http://scribus.net/websvn/listing.php?repname=Scribus&sc=1&rev=22178
Log:
fix incorrect use of SpecialChars::CJK_NOBREAK_AFTER and 
SpecialChars::CJK_NOBREAK_BEFORE in layout()

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

Modified: trunk/Scribus/scribus/pageitem_textframe.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=22178&path=/trunk/Scribus/scribus/pageitem_textframe.cpp
==============================================================================
--- trunk/Scribus/scribus/pageitem_textframe.cpp        (original)
+++ trunk/Scribus/scribus/pageitem_textframe.cpp        Mon Oct  2 18:37:59 2017
@@ -2244,19 +2244,17 @@
                                current.xPos = qMax(current.xPos, 
current.colLeft);
                        }
                        // remember possible break
-                       if (shapedText.haveMoreText(i + 1, glyphClusters) && 
glyphClusters[i + 1].hasFlag(ScLayout_LineBoundary))
-                       {
-                               if (current.glyphs.length() > 1
-                                       && (current.glyphs[currentIndex - 
1].lastChar() != SpecialChars::CJK_NOBREAK_AFTER)
-                                       && 
(current.glyphs[currentIndex].firstChar() != SpecialChars::CJK_NOBREAK_BEFORE))
-                               {
-//                                     qDebug() << "rememberBreak LineBoundry 
@" << i-1;
-                                       current.rememberBreak(i - 1, breakPos, 
style.rightMargin());
-                               }
-                               if 
(!current.glyphs[currentIndex].hasFlag(ScLayout_LineBoundary))
-                               {
-//                                     qDebug() << "rememberBreak 2nd 
LineBoundry @" << i;
-                                       current.rememberBreak(i, breakPos, 
style.rightMargin());
+                       if (shapedText.haveMoreText(i + 1, glyphClusters))
+                       {
+                               const GlyphCluster& nextCluster = 
glyphClusters[i + 1];
+                               if (nextCluster.hasFlag(ScLayout_LineBoundary))
+                               {
+                                       if 
(!current.glyphs[currentIndex].hasFlag(ScLayout_HyphenationPossible)
+                                               && (itemText.text(a) != '-')
+                                               && (itemText.text(a) != 
SpecialChars::SHYPHEN))
+                                       {
+                                               current.rememberBreak(i, 
breakPos, style.rightMargin());
+                                       }
                                }
                        }
                        if (HasObject)

Modified: trunk/Scribus/scribus/sctextstruct.h
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=22178&path=/trunk/Scribus/scribus/sctextstruct.h
==============================================================================
--- trunk/Scribus/scribus/sctextstruct.h        (original)
+++ trunk/Scribus/scribus/sctextstruct.h        Mon Oct  2 18:37:59 2017
@@ -54,7 +54,9 @@
        ScLayout_RightToLeft      = 1 << 17,     // marks right-to-left glyph
        ScLayout_SmallCap         = 1 << 18,     // marks small caps glyph
        ScLayout_CJKFence         = 1 << 19,     // marks CJK fence glyph that 
needs spacing adjustment at start of line
-       ScLayout_JustificationTracking = 1 << 20 // marks place of tracking in 
justification (e.g. for Thai)
+       ScLayout_NoBreakAfter     = 1 << 20,     // marks glyphs after which a 
line break cannot occur
+       ScLayout_NoBreakBefore    = 1 << 21,     // marks glyphs before which a 
line break cannot occur
+       ScLayout_JustificationTracking = 1 << 22 // marks place of tracking in 
justification (e.g. for Thai)
 };
 
 

Modified: trunk/Scribus/scribus/text/textshaper.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=22178&path=/trunk/Scribus/scribus/text/textshaper.cpp
==============================================================================
--- trunk/Scribus/scribus/text/textshaper.cpp   (original)
+++ trunk/Scribus/scribus/text/textshaper.cpp   Mon Oct  2 18:37:59 2017
@@ -411,6 +411,22 @@
                            SpecialChars::isCJK(m_story.text(firstChar - 
1).unicode()))
                                run.setFlag(ScLayout_ImplicitSpace);
 
+                       int firstStat = 
SpecialChars::getCJKAttr(m_story.text(firstChar));
+                       int currStat  = (firstChar != lastChar) ? 
SpecialChars::getCJKAttr(m_story.text(lastChar)) : firstStat;
+
+                       if (firstStat & SpecialChars::CJK_NOBREAK_BEFORE)
+                               run.setFlag(ScLayout_NoBreakBefore);
+
+                       if (currStat & SpecialChars::CJK_NOBREAK_AFTER)
+                               run.setFlag(ScLayout_NoBreakAfter);
+
+                       if ((firstChar > 0) && (firstStat != 0) && ((firstStat 
& SpecialChars::CJK_NOBREAK_BEFORE) == 0))
+                       {
+                               int prevStat = 
SpecialChars::getCJKAttr(m_story.text(firstChar - 1));
+                               if (prevStat != 0 && ((prevStat & 
SpecialChars::CJK_NOBREAK_AFTER) == 0))
+                                       run.setFlag(ScLayout_LineBoundary);
+                       }
+
                        run.setScaleH(charStyle.scaleH() / 1000.0);
                        run.setScaleV(charStyle.scaleV() / 1000.0);
 
@@ -503,7 +519,6 @@
                                double halfEM = run.style().fontSize() / 10 / 2;
                                double quarterEM = run.style().fontSize() / 10 
/ 4;
 
-                               int currStat = 
SpecialChars::getCJKAttr(m_story.text(lastChar));
                                int nextStat = 
SpecialChars::getCJKAttr(m_story.text(lastChar + 1));
 
                                // 1. add 1/4 aki (space) between a CJK letter 
and


_______________________________________________
scribus-commit mailing list
[email protected]
http://lists.scribus.net/mailman/listinfo/scribus-commit

Reply via email to