summaryrefslogtreecommitdiff
path: root/graphite/graphite2-0.9.4.patch
blob: e8e44a588ffe22640528fc5af137ac32960dd24e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
diff -r b3a86877ec68 src/Pass.cpp
--- misc/build/graphite2-0.9.4/src/Pass.cpp	Wed May 11 09:34:52 2011 +0700
+++ misc/build/graphite2-0.9.4/src/Pass.cpp	Mon May 16 14:23:58 2011 +0700
@@ -513,6 +513,7 @@
 bool Pass::testConstraint(const Rule &r, Machine & m) const
 {
     if (r.sort - r.preContext > (int)m.slotMap().size() - m.slotMap().context())    return false;
+    if (m.slotMap().context() - r.preContext < 0) return false;
     if (!*r.constraint)                 return true;
     assert(r.constraint->constraint());
 
@@ -527,6 +528,7 @@
     Machine::status_t status = Machine::finished;
     for (int n = r.sort; n && map; --n, ++map)
     {
+	if (!*map) continue;
         const int32 ret = r.constraint->run(m, map, status);
         if (!ret || status != Machine::finished)
         {
diff -r b3a86877ec68 src/Rule.h
--- misc/build/graphite2-0.9.4/src/Rule.h	Wed May 11 09:34:52 2011 +0700
+++ misc/build/graphite2-0.9.4/src/Rule.h	Mon May 16 14:23:58 2011 +0700
@@ -187,8 +187,9 @@
   // Merge the new sorted rules list into the current sorted result set.
   const RuleEntry * lre = begin(), * rre = state.rules;
   RuleEntry * out = m_rules + (m_begin == m_rules)*MAX_RULES;    
+  const RuleEntry * lrend = out + MAX_RULES;
   m_begin = out; 
-  while (lre != end())
+  while (lre != end() && out != lrend)
   {
     if (*lre < *rre)      *out++ = *lre++;
     else if (*rre < *lre) { *out++ = *rre++; }
@@ -196,12 +197,12 @@
 
     if (rre == state.rules_end) 
     { 
-      while (lre != end()) { *out++ = *lre++; }
+      while (lre != end() && out != lrend) { *out++ = *lre++; }
       m_end = out;
       return;
     }
   }
-  while (rre != state.rules_end) { *out++ = *rre++; }
+  while (rre != state.rules_end && out != lrend) { *out++ = *rre++; }
   m_end = out;
 }
 
diff -r b3a86877ec68 src/opcodes.h
--- misc/build/graphite2-0.9.4/src/opcodes.h	Wed May 11 09:34:52 2011 +0700
+++ misc/build/graphite2-0.9.4/src/opcodes.h	Mon May 16 14:23:58 2011 +0700
@@ -274,6 +274,7 @@
         {
             seg.last()->next(newSlot);
             newSlot->prev(seg.last());
+	    newSlot->before(seg.last()->before());
             seg.last(newSlot);
         }
         else
@@ -286,10 +287,12 @@
     {
         iss->prev()->next(newSlot);
         newSlot->prev(iss->prev());
+	newSlot->before(iss->prev()->after());
     }
     else
     {
         newSlot->prev(NULL);
+	newSlot->before(iss->before());
         seg.first(newSlot);
     }
     newSlot->next(iss);
@@ -297,10 +300,12 @@
     {
         iss->prev(newSlot);
         newSlot->originate(iss->original());
+	newSlot->after(iss->before());
     }
     else if (newSlot->prev())
     {
         newSlot->originate(newSlot->prev()->original());
+	newSlot->after(newSlot->prev()->after());
     }
     else
     {