[Libreoffice-commits] core.git: download.lst vcl/source

Martin Hosken martin_hosken at sil.org
Mon Oct 26 18:56:03 UTC 2015


 download.lst                          |    2 +-
 vcl/source/glyphs/graphite_layout.cxx |   23 +++++++++++++++++++----
 2 files changed, 20 insertions(+), 5 deletions(-)

New commits:
commit f5be64cde53680bbff3ffa4d3b630f4fd2b6bca0
Author: Martin Hosken <martin_hosken at sil.org>
Date:   Fri Oct 23 21:01:24 2015 +0700

    Fix graphite line endings for stacking spaces
    
    Change-Id: I63dab1bea8cbe9c702b543978d04fb6aeb7d363d
    Reviewed-on: https://gerrit.libreoffice.org/19557
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Martin Hosken <martin_hosken at sil.org>

diff --git a/download.lst b/download.lst
index b1ebb89..d88d76a 100755
--- a/download.lst
+++ b/download.lst
@@ -52,7 +52,7 @@ export FREEHAND_TARBALL := libfreehand-0.1.1.tar.bz2
 export FREETYPE_TARBALL := dbf2caca1d3afd410a29217a9809d397-freetype-2.4.8.tar.bz2
 export GLEW_TARBALL := 3941e9cab2f4f9d8faee3e8d57ae7664-glew-1.12.0.zip
 export GLM_TARBALL := bae83fa5dc7f081768daace6e199adc3-glm-0.9.4.6-libreoffice.zip
-export GRAPHITE_TARBALL := 7cda6fc6bc197b216777b15ce52c38a8-graphite2-1.3.3.tgz
+export GRAPHITE_TARBALL := 5c0c9ac0996fbb4a0e17780ff5441959-graphite2-minimal-1.3.4.tgz
 export HARFBUZZ_MD5SUM := 0e27e531f4c4acff601ebff0957755c2
 export HARFBUZZ_TARBALL := harfbuzz-0.9.40.tar.bz2
 export HSQLDB_TARBALL := 17410483b5b5f267aa18b7e00b65e6e0-hsqldb_1_8_0.zip
diff --git a/vcl/source/glyphs/graphite_layout.cxx b/vcl/source/glyphs/graphite_layout.cxx
index 4a723a3..eaff971 100644
--- a/vcl/source/glyphs/graphite_layout.cxx
+++ b/vcl/source/glyphs/graphite_layout.cxx
@@ -118,6 +118,13 @@ const gr_slot *get_next_base(const gr_slot *slot, bool bRtl)
     return slot;
 }
 
+bool isWhite(sal_Unicode nChar)
+{
+    if (nChar <= 0x0020 || nChar == 0x00A0 || (nChar >= 0x2000 && nChar <= 0x200F) || nChar == 0x3000)
+        return true;
+    return false;
+}
+
 // The Graphite glyph stream is really a sequence of glyph attachment trees
 //  each rooted at a non-attached base glyph.  fill_from walks the glyph stream,
 //  finds each non-attached base glyph and calls append to record them as a
@@ -135,6 +142,8 @@ GraphiteLayout::fillFrom(gr_segment * pSegment, ImplLayoutArgs &rArgs, float fSc
     int clusterStart = -1;
     int clusterFirstChar = -1;
     const gr_slot *nextBaseSlot;
+    const sal_Unicode *pStr = rArgs.mrStr.getStr();
+    int firstChar;
 
     if (!nGlyphs || lastCharPos - mnSegCharOffset == 0) return;
     const gr_slot* baseSlot = bRtl ? gr_seg_last_slot(pSegment) : gr_seg_first_slot(pSegment);
@@ -142,19 +151,24 @@ GraphiteLayout::fillFrom(gr_segment * pSegment, ImplLayoutArgs &rArgs, float fSc
     while (baseSlot && gr_slot_attached_to(baseSlot) != NULL && !gr_slot_can_insert_before(baseSlot))
         baseSlot = bRtl ? gr_slot_prev_in_segment(baseSlot) : gr_slot_next_in_segment(baseSlot);
     assert(baseSlot);
+    int nextChar = gr_cinfo_base(gr_seg_cinfo(pSegment, gr_slot_before(baseSlot))) + mnSegCharOffset;
+    float thisBoundary = 0.;
     float nextBoundary = gr_slot_origin_X(baseSlot);
     // now loop over bases
     for ( ; baseSlot; baseSlot = nextBaseSlot)
     {
-        float thisBoundary = nextBoundary;
-        int firstChar = gr_cinfo_base(gr_seg_cinfo(pSegment, gr_slot_before(baseSlot))) + mnSegCharOffset;
+        firstChar = nextChar;
+        thisBoundary = nextBoundary;
         nextBaseSlot = get_next_base(bRtl ? gr_slot_prev_in_segment(baseSlot) : gr_slot_next_in_segment(baseSlot), bRtl);
+        nextChar = nextBaseSlot ? gr_cinfo_base(gr_seg_cinfo(pSegment, gr_slot_before(nextBaseSlot))) + mnSegCharOffset : -1;
         nextBoundary = nextBaseSlot ? gr_slot_origin_X(nextBaseSlot) : gr_seg_advance_X(pSegment);
+
         if (firstChar < mnMinCharPos || firstChar >= mnEndCharPos)
         {
             // handle clipping of diacritic from base
             nextBaseSlot = bRtl ? gr_slot_prev_in_segment(baseSlot) : gr_slot_next_in_segment(baseSlot);
             nextBoundary = nextBaseSlot ? gr_slot_origin_X(nextBaseSlot) : gr_seg_advance_X(pSegment);
+            nextChar = nextBaseSlot ? gr_cinfo_base(gr_seg_cinfo(pSegment, gr_slot_before(nextBaseSlot))) + mnSegCharOffset : -1;
             continue;
         }
         // handle reordered clusters. Presumes reordered glyphs have monotonic opposite char index until the cluster base.
@@ -204,7 +218,8 @@ GraphiteLayout::fillFrom(gr_segment * pSegment, ImplLayoutArgs &rArgs, float fSc
         mvGlyph2Char[baseGlyph] = firstChar;
         append(pSegment, rArgs, baseSlot, thisBoundary, nextBoundary, fScaling, nDxOffset, true, firstChar, baseGlyph, bRtl);
         if (thisBoundary < fMinX) fMinX = thisBoundary;
-        if (nextBoundary > fMaxX) fMaxX = nextBoundary;
+        if (nextBoundary > fMaxX && (nextChar < mnMinCharPos || nextChar >= mnEndCharPos || !isWhite(pStr[nextChar]) || fMaxX <= 0.0f))
+            fMaxX = nextBoundary;
     }
 
     long nXOffset = round_to_long(fMinX * fScaling);
@@ -433,7 +448,7 @@ bool GraphiteLayout::LayoutText(ImplLayoutArgs & rArgs)
             fprintf(grLog(),"Gr::LayoutText %d-%d, context %d-%d, len %d, numchars %" SAL_PRI_SIZET "u, rtl %d scaling %f:",
                 rArgs.mnMinCharPos, rArgs.mnEndCharPos,
                 nBidiMinRunPos, nBidiEndRunPos,
-                mnLength, numchars, bRightToLeft, mfScaling);
+                nLength, numchars, bRightToLeft, mfScaling);
             for (int i = mnSegCharOffset; i < nBidiEndRunPos; ++i)
                 fprintf(grLog(), " %04X", rArgs.mrStr[i]);
             fprintf(grLog(), "\n");


More information about the Libreoffice-commits mailing list