summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Build/source/libs/README2
-rw-r--r--Build/source/libs/graphite2/ChangeLog5
-rwxr-xr-xBuild/source/libs/graphite2/configure20
-rw-r--r--Build/source/libs/graphite2/graphite2-PATCHES/ChangeLog5
-rw-r--r--Build/source/libs/graphite2/graphite2-PATCHES/TL-Changes2
-rw-r--r--Build/source/libs/graphite2/graphite2-src/ChangeLog3
-rw-r--r--Build/source/libs/graphite2/graphite2-src/include/graphite2/Font.h2
-rw-r--r--Build/source/libs/graphite2/graphite2-src/src/CmapCache.cpp16
-rw-r--r--Build/source/libs/graphite2/graphite2-src/src/Code.cpp17
-rw-r--r--Build/source/libs/graphite2/graphite2-src/src/Face.cpp2
-rw-r--r--Build/source/libs/graphite2/graphite2-src/src/FileFace.cpp8
-rw-r--r--Build/source/libs/graphite2/graphite2-src/src/GlyphCache.cpp2
-rw-r--r--Build/source/libs/graphite2/graphite2-src/src/Pass.cpp15
-rw-r--r--Build/source/libs/graphite2/graphite2-src/src/Segment.cpp9
-rw-r--r--Build/source/libs/graphite2/graphite2-src/src/Slot.cpp8
-rw-r--r--Build/source/libs/graphite2/graphite2-src/src/TtfUtil.cpp14
-rw-r--r--Build/source/libs/graphite2/graphite2-src/src/call_machine.cpp4
-rw-r--r--Build/source/libs/graphite2/graphite2-src/src/direct_machine.cpp28
-rw-r--r--Build/source/libs/graphite2/graphite2-src/src/inc/Code.h2
-rw-r--r--Build/source/libs/graphite2/graphite2-src/src/inc/GlyphCache.h1
-rw-r--r--Build/source/libs/graphite2/graphite2-src/src/inc/Machine.h3
-rw-r--r--Build/source/libs/graphite2/graphite2-src/src/inc/TtfUtil.h4
-rw-r--r--Build/source/libs/graphite2/graphite2-src/src/inc/opcodes.h10
-rw-r--r--Build/source/libs/graphite2/version.ac2
24 files changed, 116 insertions, 68 deletions
diff --git a/Build/source/libs/README b/Build/source/libs/README
index 540dc3f561d..2287aaccfdd 100644
--- a/Build/source/libs/README
+++ b/Build/source/libs/README
@@ -21,7 +21,7 @@ gd 2.1.1 - checked 14jan15
gmp 6.1.0 - checked 28dec15
http://ftp.gnu.org/gnu/gmp/
-graphite2 1.3.5 - checked 20jan16
+graphite2 1.3.6 - checked 01mar16
http://sourceforge.net/projects/silgraphite/files/graphite2/
harfbuzz 1.2.3 - checked 25feb16
diff --git a/Build/source/libs/graphite2/ChangeLog b/Build/source/libs/graphite2/ChangeLog
index 7b4f7aa594b..b6790892f5b 100644
--- a/Build/source/libs/graphite2/ChangeLog
+++ b/Build/source/libs/graphite2/ChangeLog
@@ -1,3 +1,8 @@
+2016-03-01 Akira Kakuto <kakuto@fuk.kindai.ac.jp>
+
+ Import graphite2-1.3.6.
+ * version.ac: Adjusted.
+
2016-02-15 Karl Berry <karl@tug.org>
* graphite2-PATCHES: rename from graphite2-src-PATCHES.
diff --git a/Build/source/libs/graphite2/configure b/Build/source/libs/graphite2/configure
index 007b001d54a..4a2c29c0268 100755
--- a/Build/source/libs/graphite2/configure
+++ b/Build/source/libs/graphite2/configure
@@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for graphite2 (TeX Live) 1.3.5.
+# Generated by GNU Autoconf 2.69 for graphite2 (TeX Live) 1.3.6.
#
# Report bugs to <tex-k@tug.org>.
#
@@ -579,8 +579,8 @@ MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='graphite2 (TeX Live)'
PACKAGE_TARNAME='graphite2--tex-live-'
-PACKAGE_VERSION='1.3.5'
-PACKAGE_STRING='graphite2 (TeX Live) 1.3.5'
+PACKAGE_VERSION='1.3.6'
+PACKAGE_STRING='graphite2 (TeX Live) 1.3.6'
PACKAGE_BUGREPORT='tex-k@tug.org'
PACKAGE_URL=''
@@ -1254,7 +1254,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures graphite2 (TeX Live) 1.3.5 to adapt to many kinds of systems.
+\`configure' configures graphite2 (TeX Live) 1.3.6 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1321,7 +1321,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of graphite2 (TeX Live) 1.3.5:";;
+ short | recursive ) echo "Configuration of graphite2 (TeX Live) 1.3.6:";;
esac
cat <<\_ACEOF
@@ -1419,7 +1419,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-graphite2 (TeX Live) configure 1.3.5
+graphite2 (TeX Live) configure 1.3.6
generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc.
@@ -1558,7 +1558,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by graphite2 (TeX Live) $as_me 1.3.5, which was
+It was created by graphite2 (TeX Live) $as_me 1.3.6, which was
generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@
@@ -3481,7 +3481,7 @@ fi
# Define the identity of the package.
PACKAGE='graphite2--tex-live-'
- VERSION='1.3.5'
+ VERSION='1.3.6'
cat >>confdefs.h <<_ACEOF
@@ -5577,7 +5577,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by graphite2 (TeX Live) $as_me 1.3.5, which was
+This file was extended by graphite2 (TeX Live) $as_me 1.3.6, which was
generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -5643,7 +5643,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
-graphite2 (TeX Live) config.status 1.3.5
+graphite2 (TeX Live) config.status 1.3.6
configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\"
diff --git a/Build/source/libs/graphite2/graphite2-PATCHES/ChangeLog b/Build/source/libs/graphite2/graphite2-PATCHES/ChangeLog
index a50f2b72941..baa126ff8e2 100644
--- a/Build/source/libs/graphite2/graphite2-PATCHES/ChangeLog
+++ b/Build/source/libs/graphite2/graphite2-PATCHES/ChangeLog
@@ -1,3 +1,8 @@
+2016-03-01 Akira Kakuto <kakuto@fuk.kindai.ac.jp>
+
+ Imported graphite2-1.3.6 source tree from:
+ http://sourceforge.net/projects/silgraphite/files/graphite2/
+
2016-01-20 Akira Kakuto <kakuto@fuk.kindai.ac.jp>
Imported graphite2-1.3.5 source tree from:
diff --git a/Build/source/libs/graphite2/graphite2-PATCHES/TL-Changes b/Build/source/libs/graphite2/graphite2-PATCHES/TL-Changes
index 56d22845393..08fa835e4f2 100644
--- a/Build/source/libs/graphite2/graphite2-PATCHES/TL-Changes
+++ b/Build/source/libs/graphite2/graphite2-PATCHES/TL-Changes
@@ -1,4 +1,4 @@
-Changes applied to the graphite2-1.3.5/ tree as obtained from:
+Changes applied to the graphite2-1.3.6/ tree as obtained from:
http://sourceforge.net/projects/silgraphite/files/graphite2/
Removed unused dirs:
diff --git a/Build/source/libs/graphite2/graphite2-src/ChangeLog b/Build/source/libs/graphite2/graphite2-src/ChangeLog
index 40f8fd4a7ef..522b8101175 100644
--- a/Build/source/libs/graphite2/graphite2-src/ChangeLog
+++ b/Build/source/libs/graphite2/graphite2-src/ChangeLog
@@ -1,3 +1,6 @@
+1.3.6
+ . Bug fixes
+
1.3.5
. Bug fixes
. Security bug fix
diff --git a/Build/source/libs/graphite2/graphite2-src/include/graphite2/Font.h b/Build/source/libs/graphite2/graphite2-src/include/graphite2/Font.h
index 8c96ec3cc7b..30b89994e74 100644
--- a/Build/source/libs/graphite2/graphite2-src/include/graphite2/Font.h
+++ b/Build/source/libs/graphite2/graphite2-src/include/graphite2/Font.h
@@ -30,7 +30,7 @@
#define GR2_VERSION_MAJOR 1
#define GR2_VERSION_MINOR 3
-#define GR2_VERSION_BUGFIX 5
+#define GR2_VERSION_BUGFIX 6
#ifdef __cplusplus
extern "C"
diff --git a/Build/source/libs/graphite2/graphite2-src/src/CmapCache.cpp b/Build/source/libs/graphite2/graphite2-src/src/CmapCache.cpp
index a945ef23443..d070019a340 100644
--- a/Build/source/libs/graphite2/graphite2-src/src/CmapCache.cpp
+++ b/Build/source/libs/graphite2/graphite2-src/src/CmapCache.cpp
@@ -38,11 +38,11 @@ const void * bmp_subtable(const Face::Table & cmap)
{
const void * stbl;
if (!cmap.size()) return 0;
- if (TtfUtil::CheckCmapSubtable4(stbl = TtfUtil::FindCmapSubtable(cmap, 3, 1, cmap.size()), cmap.size())
- || TtfUtil::CheckCmapSubtable4(stbl = TtfUtil::FindCmapSubtable(cmap, 0, 3, cmap.size()), cmap.size())
- || TtfUtil::CheckCmapSubtable4(stbl = TtfUtil::FindCmapSubtable(cmap, 0, 2, cmap.size()), cmap.size())
- || TtfUtil::CheckCmapSubtable4(stbl = TtfUtil::FindCmapSubtable(cmap, 0, 1, cmap.size()), cmap.size())
- || TtfUtil::CheckCmapSubtable4(stbl = TtfUtil::FindCmapSubtable(cmap, 0, 0, cmap.size()), cmap.size()))
+ if (TtfUtil::CheckCmapSubtable4(stbl = TtfUtil::FindCmapSubtable(cmap, 3, 1, cmap.size()), cmap + cmap.size())
+ || TtfUtil::CheckCmapSubtable4(stbl = TtfUtil::FindCmapSubtable(cmap, 0, 3, cmap.size()), cmap + cmap.size())
+ || TtfUtil::CheckCmapSubtable4(stbl = TtfUtil::FindCmapSubtable(cmap, 0, 2, cmap.size()), cmap + cmap.size())
+ || TtfUtil::CheckCmapSubtable4(stbl = TtfUtil::FindCmapSubtable(cmap, 0, 1, cmap.size()), cmap + cmap.size())
+ || TtfUtil::CheckCmapSubtable4(stbl = TtfUtil::FindCmapSubtable(cmap, 0, 0, cmap.size()), cmap + cmap.size()))
return stbl;
return 0;
}
@@ -51,8 +51,8 @@ const void * smp_subtable(const Face::Table & cmap)
{
const void * stbl;
if (!cmap.size()) return 0;
- if (TtfUtil::CheckCmapSubtable12(stbl = TtfUtil::FindCmapSubtable(cmap, 3, 10, cmap.size()), cmap.size())
- || TtfUtil::CheckCmapSubtable12(stbl = TtfUtil::FindCmapSubtable(cmap, 0, 4, cmap.size()), cmap.size()))
+ if (TtfUtil::CheckCmapSubtable12(stbl = TtfUtil::FindCmapSubtable(cmap, 3, 10, cmap.size()), cmap + cmap.size())
+ || TtfUtil::CheckCmapSubtable12(stbl = TtfUtil::FindCmapSubtable(cmap, 0, 4, cmap.size()), cmap + cmap.size()))
return stbl;
return 0;
}
@@ -64,7 +64,7 @@ bool cache_subtable(uint16 * blocks[], const void * cst, const unsigned int limi
int rangeKey = 0;
uint32 codePoint = NextCodePoint(cst, 0, &rangeKey),
prevCodePoint = 0;
- while (codePoint != limit)
+ while (codePoint < limit)
{
unsigned int block = codePoint >> 8;
if (!blocks[block])
diff --git a/Build/source/libs/graphite2/graphite2-src/src/Code.cpp b/Build/source/libs/graphite2/graphite2-src/src/Code.cpp
index 02ad54d7dcd..aa7959708da 100644
--- a/Build/source/libs/graphite2/graphite2-src/src/Code.cpp
+++ b/Build/source/libs/graphite2/graphite2-src/src/Code.cpp
@@ -84,8 +84,9 @@ public:
struct limits;
struct analysis
{
+ static const int NUMCONTEXTS = 256;
uint8 slotref;
- context contexts[256];
+ context contexts[NUMCONTEXTS];
byte max_ref;
analysis() : slotref(0), max_ref(0) {};
@@ -368,6 +369,8 @@ opcode Machine::Code::decoder::fetch_opcode(const byte * bc)
if (--_stack_depth < 0)
failure(underfull_stack);
valid_upto(gr_slatMax, bc[0]);
+ if (attrCode(bc[0]) == gr_slatUserDefn) // use IATTR for user attributes
+ failure(out_of_range_data);
test_context();
break;
case IATTR_SET_SLOT :
@@ -381,6 +384,8 @@ opcode Machine::Code::decoder::fetch_opcode(const byte * bc)
++_stack_depth;
valid_upto(gr_slatMax, bc[0]);
valid_upto(_rule_length, _pre_context + int8(bc[1]));
+ if (attrCode(bc[0]) == gr_slatUserDefn) // use IATTR for user attributes
+ failure(out_of_range_data);
break;
case PUSH_GLYPH_ATTR_OBS :
++_stack_depth;
@@ -661,14 +666,14 @@ bool Machine::Code::decoder::validate_opcode(const opcode opc, const byte * cons
bool Machine::Code::decoder::valid_upto(const uint16 limit, const uint16 x) const throw()
{
- const bool t = x < limit;
+ const bool t = (limit != 0) && (x < limit);
if (!t) failure(out_of_range_data);
return t;
}
bool Machine::Code::decoder::test_context() const throw()
{
- if (_pre_context >= _rule_length)
+ if (_pre_context >= _rule_length || _analysis.slotref >= analysis::NUMCONTEXTS - 1)
{
failure(out_of_range_data);
return false;
@@ -686,7 +691,7 @@ void Machine::Code::failure(const status_t s) throw() {
inline
void Machine::Code::decoder::analysis::set_ref(int index, bool incinsert) throw() {
if (incinsert && contexts[slotref].flags.inserted) --index;
- if (index + slotref < 0) return;
+ if (index + slotref < 0 || index + slotref >= NUMCONTEXTS) return;
contexts[index + slotref].flags.referenced = true;
if ((index > 0 || !contexts[index + slotref].flags.inserted) && index + slotref > max_ref) max_ref = index + slotref;
}
@@ -695,7 +700,7 @@ void Machine::Code::decoder::analysis::set_ref(int index, bool incinsert) throw(
inline
void Machine::Code::decoder::analysis::set_noref(int index) throw() {
if (contexts[slotref].flags.inserted) --index;
- if (index + slotref < 0) return;
+ if (index + slotref < 0 || index + slotref >= NUMCONTEXTS) return;
if ((index > 0 || !contexts[index + slotref].flags.inserted) && index + slotref > max_ref) max_ref = index + slotref;
}
@@ -703,7 +708,7 @@ void Machine::Code::decoder::analysis::set_noref(int index) throw() {
inline
void Machine::Code::decoder::analysis::set_changed(int index) throw() {
if (contexts[slotref].flags.inserted) --index;
- if (index + slotref < 0) return;
+ if (index + slotref < 0 || index + slotref >= NUMCONTEXTS) return;
contexts[index + slotref].flags.changed = true;
if ((index > 0 || !contexts[index + slotref].flags.inserted) && index + slotref > max_ref) max_ref = index + slotref;
}
diff --git a/Build/source/libs/graphite2/graphite2-src/src/Face.cpp b/Build/source/libs/graphite2/graphite2-src/src/Face.cpp
index 7aefdb98de0..e9b1b1c177c 100644
--- a/Build/source/libs/graphite2/graphite2-src/src/Face.cpp
+++ b/Build/source/libs/graphite2/graphite2-src/src/Face.cpp
@@ -238,7 +238,7 @@ uint16 Face::getGlyphMetric(uint16 gid, uint8 metric) const
case kgmetAscent : return m_ascent;
case kgmetDescent : return m_descent;
default:
- if (gid > glyphs().numGlyphs()) return 0;
+ if (gid >= glyphs().numGlyphs()) return 0;
return glyphs().glyph(gid)->getMetric(metric);
}
}
diff --git a/Build/source/libs/graphite2/graphite2-src/src/FileFace.cpp b/Build/source/libs/graphite2/graphite2-src/src/FileFace.cpp
index 43aff71a719..d1510d3e9e8 100644
--- a/Build/source/libs/graphite2/graphite2-src/src/FileFace.cpp
+++ b/Build/source/libs/graphite2/graphite2-src/src/FileFace.cpp
@@ -60,8 +60,12 @@ FileFace::FileFace(const char *filename)
if (!TtfUtil::GetTableDirInfo(_header_tbl, tbl_offset, tbl_len)) return;
_table_dir = (TtfUtil::Sfnt::OffsetSubTable::Entry*)gralloc<char>(tbl_len);
if (fseek(_file, tbl_offset, SEEK_SET)) return;
- if (_table_dir)
- if (fread(_table_dir, 1, tbl_len, _file) != tbl_len) return;
+ if (_table_dir && fread(_table_dir, 1, tbl_len, _file) != tbl_len)
+ {
+ free(_table_dir);
+ _table_dir = NULL;
+ }
+ return;
}
FileFace::~FileFace()
diff --git a/Build/source/libs/graphite2/graphite2-src/src/GlyphCache.cpp b/Build/source/libs/graphite2/graphite2-src/src/GlyphCache.cpp
index 1cd5054f71f..8792f9700b3 100644
--- a/Build/source/libs/graphite2/graphite2-src/src/GlyphCache.cpp
+++ b/Build/source/libs/graphite2/graphite2-src/src/GlyphCache.cpp
@@ -265,7 +265,7 @@ GlyphCache::Loader::Loader(const Face & face, const bool dumb_font)
{
if ((m_pGlat = Face::Table(face, Tag::Glat, 0x00030000)) == NULL
|| (m_pGloc = Face::Table(face, Tag::Gloc)) == NULL
- || m_pGloc.size() < 6)
+ || m_pGloc.size() < 8)
{
_head = Face::Table();
return;
diff --git a/Build/source/libs/graphite2/graphite2-src/src/Pass.cpp b/Build/source/libs/graphite2/graphite2-src/src/Pass.cpp
index f6d269931d6..fcf0384a60c 100644
--- a/Build/source/libs/graphite2/graphite2-src/src/Pass.cpp
+++ b/Build/source/libs/graphite2/graphite2-src/src/Pass.cpp
@@ -100,7 +100,9 @@ bool Pass::readPass(const byte * const pass_start, size_t pass_length, size_t su
if (e.test(pass_length < 40, E_BADPASSLENGTH)) return face.error(e);
// Read in basic values
const byte flags = be::read<byte>(p);
- if (e.test((flags & 0x1f) && pt < PASS_TYPE_POSITIONING, E_BADCOLLISIONPASS))
+ if (e.test((flags & 0x1f) &&
+ (pt < PASS_TYPE_POSITIONING || !m_silf->aCollision() || !face.glyphs().hasBoxes()),
+ E_BADCOLLISIONPASS))
return face.error(e);
m_numCollRuns = flags & 0x7;
m_kernColls = (flags >> 3) & 0x3;
@@ -236,7 +238,7 @@ bool Pass::readRules(const byte * rule_map, const size_t num_entries,
if (e.test(!(m_rules && m_codes && m_progs), E_OUTOFMEM)) return face.error(e);
Rule * r = m_rules + m_numRules - 1;
- for (size_t n = m_numRules; n; --n, --r, ac_end = ac_begin, rc_end = rc_begin)
+ for (size_t n = m_numRules; r >= m_rules; --n, --r, ac_end = ac_begin, rc_end = rc_begin)
{
face.error_context((face.error_context() & 0xFFFF00) + EC_ARULE + ((n - 1) << 24));
r->preContext = *--precontext;
@@ -408,6 +410,7 @@ bool Pass::runGraphite(vm::Machine & m, FiniteStateMachine & fsm, bool reverse)
do
{
findNDoRule(s, m, fsm);
+ if (m.status() != Machine::finished) return false;
if (s && (s == m.slotMap().highwater() || m.slotMap().highpassed() || --lc == 0)) {
if (!lc)
s = m.slotMap().highwater();
@@ -498,7 +501,12 @@ void Pass::findNDoRule(Slot * & slot, Machine &m, FiniteStateMachine & fsm) cons
// Search for the first rule which passes the constraint
const RuleEntry * r = fsm.rules.begin(),
* const re = fsm.rules.end();
- while (r != re && !testConstraint(*r->rule, m)) ++r;
+ while (r != re && !testConstraint(*r->rule, m))
+ {
+ ++r;
+ if (m.status() != Machine::finished)
+ return;
+ }
#if !defined GRAPHITE2_NTRACING
if (fsm.dbgout)
@@ -533,6 +541,7 @@ void Pass::findNDoRule(Slot * & slot, Machine &m, FiniteStateMachine & fsm) cons
if (r != re)
{
const int adv = doAction(r->rule->action, slot, m);
+ if (m.status() != Machine::finished) return;
if (r->rule->action->deletes()) fsm.slots.collectGarbage(slot);
adjustSlot(adv, slot, fsm.slots);
return;
diff --git a/Build/source/libs/graphite2/graphite2-src/src/Segment.cpp b/Build/source/libs/graphite2/graphite2-src/src/Segment.cpp
index 980f68c3cbc..ecc35f50aa0 100644
--- a/Build/source/libs/graphite2/graphite2-src/src/Segment.cpp
+++ b/Build/source/libs/graphite2/graphite2-src/src/Segment.cpp
@@ -210,8 +210,13 @@ void Segment::freeSlot(Slot *aSlot)
aSlot->attachedTo()->removeChild(aSlot);
while (aSlot->firstChild())
{
- aSlot->firstChild()->attachTo(NULL);
- aSlot->removeChild(aSlot->firstChild());
+ if (aSlot->firstChild()->attachedTo() == aSlot)
+ {
+ aSlot->firstChild()->attachTo(NULL);
+ aSlot->removeChild(aSlot->firstChild());
+ }
+ else
+ aSlot->firstChild(NULL);
}
// reset the slot incase it is reused
::new (aSlot) Slot(aSlot->userAttrs());
diff --git a/Build/source/libs/graphite2/graphite2-src/src/Slot.cpp b/Build/source/libs/graphite2/graphite2-src/src/Slot.cpp
index 551bec977e5..3330c8131fb 100644
--- a/Build/source/libs/graphite2/graphite2-src/src/Slot.cpp
+++ b/Build/source/libs/graphite2/graphite2-src/src/Slot.cpp
@@ -197,6 +197,8 @@ int Slot::getAttr(const Segment *seg, attrCode ind, uint8 subindex) const
{
ind = gr_slatUserDefn;
subindex = 0;
+ if (seg->numAttrs() == 0)
+ return 0;
}
else if (ind >= gr_slatJStretch && ind < gr_slatJStretch + 20 && ind != gr_slatJWidth)
{
@@ -274,6 +276,8 @@ void Slot::setAttr(Segment *seg, attrCode ind, uint8 subindex, int16 value, cons
{
ind = gr_slatUserDefn;
subindex = 0;
+ if (seg->numAttrs() == 0)
+ return;
}
else if (ind >= gr_slatJStretch && ind < gr_slatJStretch + 20 && ind != gr_slatJWidth)
{
@@ -421,7 +425,7 @@ bool Slot::removeChild(Slot *ap)
else if (ap == m_child)
{
Slot *nSibling = m_child->nextSibling();
- m_child->sibling(NULL);
+ m_child->removeSibling(nSibling);
m_child = nSibling;
return true;
}
@@ -436,7 +440,7 @@ bool Slot::removeSibling(Slot *ap)
else if (ap == m_sibling)
{
m_sibling = m_sibling->nextSibling();
- ap->sibling(NULL);
+ if (m_sibling) ap->removeSibling(m_sibling);
return true;
}
else
diff --git a/Build/source/libs/graphite2/graphite2-src/src/TtfUtil.cpp b/Build/source/libs/graphite2/graphite2-src/src/TtfUtil.cpp
index 90ced6aee6a..85a4e6a0a81 100644
--- a/Build/source/libs/graphite2/graphite2-src/src/TtfUtil.cpp
+++ b/Build/source/libs/graphite2/graphite2-src/src/TtfUtil.cpp
@@ -889,8 +889,9 @@ const void * FindCmapSubtable(const void * pCmap, int nPlatformId, /* =3 */ int
/*----------------------------------------------------------------------------------------------
Check the Microsoft Unicode subtable for expected values
----------------------------------------------------------------------------------------------*/
-bool CheckCmapSubtable4(const void * pCmapSubtable4, size_t table_len /*, unsigned int maxgid*/)
+bool CheckCmapSubtable4(const void * pCmapSubtable4, const void * pCmapEnd /*, unsigned int maxgid*/)
{
+ size_t table_len = (const byte *)pCmapEnd - (const byte *)pCmapSubtable4;
if (!pCmapSubtable4) return false;
const Sfnt::CmapSubTable * pTable = reinterpret_cast<const Sfnt::CmapSubTable *>(pCmapSubtable4);
// Bob H say some freeware TT fonts have version 1 (eg, CALIGULA.TTF)
@@ -1049,7 +1050,7 @@ unsigned int CmapSubtable4NextCodepoint(const void *pCmap31, unsigned int nUnico
// Just in case we have a bad key:
while (iRange > 0 && be::peek<uint16>(pStartCode + iRange) > nUnicodePrev)
iRange--;
- while (be::peek<uint16>(pTable->end_code + iRange) < nUnicodePrev)
+ while (iRange < nRange - 1 && be::peek<uint16>(pTable->end_code + iRange) < nUnicodePrev)
iRange++;
// Now iRange is the range containing nUnicodePrev.
@@ -1074,14 +1075,15 @@ unsigned int CmapSubtable4NextCodepoint(const void *pCmap31, unsigned int nUnico
// ends with 0xFFFF.
if (pRangeKey)
*pRangeKey = iRange + 1;
- return be::peek<uint16>(pStartCode + iRange + 1);
+ return (iRange + 1 >= nRange) ? 0xFFFF : be::peek<uint16>(pStartCode + iRange + 1);
}
/*----------------------------------------------------------------------------------------------
Check the Microsoft UCS-4 subtable for expected values.
----------------------------------------------------------------------------------------------*/
-bool CheckCmapSubtable12(const void *pCmapSubtable12, size_t table_len /*, unsigned int maxgid*/)
+bool CheckCmapSubtable12(const void *pCmapSubtable12, const void *pCmapEnd /*, unsigned int maxgid*/)
{
+ size_t table_len = (const byte *)pCmapEnd - (const byte *)pCmapSubtable12;
if (!pCmapSubtable12) return false;
const Sfnt::CmapSubTable * pTable = reinterpret_cast<const Sfnt::CmapSubTable *>(pCmapSubtable12);
if (be::swap(pTable->format) != 12)
@@ -1093,7 +1095,7 @@ bool CheckCmapSubtable12(const void *pCmapSubtable12, size_t table_len /*, unsig
if (length < sizeof(Sfnt::CmapSubTableFormat12))
return false;
uint32 num_groups = be::swap(pTable12->num_groups);
- if (length != (sizeof(Sfnt::CmapSubTableFormat12) + (num_groups - 1) * sizeof(uint32) * 3))
+ if (num_groups > 0x10000000 || length != (sizeof(Sfnt::CmapSubTableFormat12) + (num_groups - 1) * sizeof(uint32) * 3))
return false;
#if 0
for (unsigned int i = 0; i < num_groups; ++i)
@@ -1166,7 +1168,7 @@ unsigned int CmapSubtable12NextCodepoint(const void *pCmap310, unsigned int nUni
// Just in case we have a bad key:
while (iRange > 0 && be::swap(pTable->group[iRange].start_char_code) > nUnicodePrev)
iRange--;
- while (be::swap(pTable->group[iRange].end_char_code) < nUnicodePrev)
+ while (iRange < nRange - 1 && be::swap(pTable->group[iRange].end_char_code) < nUnicodePrev)
iRange++;
// Now iRange is the range containing nUnicodePrev.
diff --git a/Build/source/libs/graphite2/graphite2-src/src/call_machine.cpp b/Build/source/libs/graphite2/graphite2-src/src/call_machine.cpp
index e1d0ce5d2ff..09c2038c410 100644
--- a/Build/source/libs/graphite2/graphite2-src/src/call_machine.cpp
+++ b/Build/source/libs/graphite2/graphite2-src/src/call_machine.cpp
@@ -72,6 +72,7 @@ struct regbank {
const instr * & ip;
uint8 direction;
int8 flags;
+ Machine::status_t & status;
};
typedef bool (* ip_t)(registers);
@@ -88,6 +89,7 @@ namespace {
#define mapb reg.map_base
#define flags reg.flags
#define dir reg.direction
+#define status reg.status
#include "inc/opcodes.h"
@@ -113,7 +115,7 @@ Machine::stack_t Machine::run(const instr * program,
const byte * dp = data;
stack_t * sp = _stack + Machine::STACK_GUARD,
* const sb = sp;
- regbank reg = {*map, map, _map, _map.begin()+_map.context(), ip, _map.dir(), 0};
+ regbank reg = {*map, map, _map, _map.begin()+_map.context(), ip, _map.dir(), 0, _status};
// Run the program
while ((reinterpret_cast<ip_t>(*++ip))(dp, sp, sb, reg)) {}
diff --git a/Build/source/libs/graphite2/graphite2-src/src/direct_machine.cpp b/Build/source/libs/graphite2/graphite2-src/src/direct_machine.cpp
index b6b9ee04235..7d80438fb42 100644
--- a/Build/source/libs/graphite2/graphite2-src/src/direct_machine.cpp
+++ b/Build/source/libs/graphite2/graphite2-src/src/direct_machine.cpp
@@ -62,6 +62,7 @@ const void * direct_run(const bool get_table_mode,
Machine::stack_t * stack,
slotref * & __map,
uint8 _dir,
+ Machine::status_t & status,
SlotMap * __smap=0)
{
// We need to define and return to opcode table from within this function
@@ -71,17 +72,17 @@ const void * direct_run(const bool get_table_mode,
return opcode_table;
// Declare virtual machine registers
- const instr * ip = program;
- const byte * dp = data;
- Machine::stack_t * sp = stack + Machine::STACK_GUARD,
- * const sb = sp;
- SlotMap & smap = *__smap;
- Segment & seg = smap.segment;
- slotref is = *__map,
- * map = __map,
- * const mapb = smap.begin()+smap.context();
- uint8 dir = _dir;
- int8 flags = 0;
+ const instr * ip = program;
+ const byte * dp = data;
+ Machine::stack_t * sp = stack + Machine::STACK_GUARD,
+ * const sb = sp;
+ SlotMap & smap = *__smap;
+ Segment & seg = smap.segment;
+ slotref is = *__map,
+ * map = __map,
+ * const mapb = smap.begin()+smap.context();
+ uint8 dir = _dir;
+ int8 flags = 0;
// start the program
goto **ip;
@@ -100,7 +101,8 @@ const void * direct_run(const bool get_table_mode,
const opcode_t * Machine::getOpcodeTable() throw()
{
slotref * dummy;
- return static_cast<const opcode_t *>(direct_run(true, 0, 0, 0, dummy, 0));
+ Machine::status_t dumstat = Machine::finished;
+ return static_cast<const opcode_t *>(direct_run(true, 0, 0, 0, dummy, 0, dumstat));
}
@@ -111,7 +113,7 @@ Machine::stack_t Machine::run(const instr * program,
assert(program != 0);
const stack_t *sp = static_cast<const stack_t *>(
- direct_run(false, program, data, _stack, is, _map.dir(), &_map));
+ direct_run(false, program, data, _stack, is, _map.dir(), _status, &_map));
const stack_t ret = sp == _stack+STACK_GUARD+1 ? *sp-- : 0;
check_final_stack(sp);
return ret;
diff --git a/Build/source/libs/graphite2/graphite2-src/src/inc/Code.h b/Build/source/libs/graphite2/graphite2-src/src/inc/Code.h
index 02d09a109d6..5451a34809b 100644
--- a/Build/source/libs/graphite2/graphite2-src/src/inc/Code.h
+++ b/Build/source/libs/graphite2/graphite2-src/src/inc/Code.h
@@ -114,7 +114,7 @@ public:
inline
size_t Machine::Code::estimateCodeDataOut(size_t n_bc)
{
- return n_bc * (sizeof(instr)+sizeof(byte));
+ return (n_bc + 1) * (sizeof(instr)+sizeof(byte));
}
diff --git a/Build/source/libs/graphite2/graphite2-src/src/inc/GlyphCache.h b/Build/source/libs/graphite2/graphite2-src/src/inc/GlyphCache.h
index cf7c2469c3c..3c0add58d07 100644
--- a/Build/source/libs/graphite2/graphite2-src/src/inc/GlyphCache.h
+++ b/Build/source/libs/graphite2/graphite2-src/src/inc/GlyphCache.h
@@ -112,6 +112,7 @@ public:
const SlantBox & getSubBoundingSlantBox(unsigned short glyphid, uint8 subindex) const;
const BBox & getSubBoundingBBox(unsigned short glyphid, uint8 subindex) const;
bool check(unsigned short glyphid) const;
+ bool hasBoxes() const { return _boxes != 0; }
CLASS_NEW_DELETE;
diff --git a/Build/source/libs/graphite2/graphite2-src/src/inc/Machine.h b/Build/source/libs/graphite2/graphite2-src/src/inc/Machine.h
index 4efb70cd946..d7bb4f389fd 100644
--- a/Build/source/libs/graphite2/graphite2-src/src/inc/Machine.h
+++ b/Build/source/libs/graphite2/graphite2-src/src/inc/Machine.h
@@ -140,7 +140,8 @@ public:
stack_underflow,
stack_not_empty,
stack_overflow,
- slot_offset_out_bounds
+ slot_offset_out_bounds,
+ died_early
};
Machine(SlotMap &) throw();
diff --git a/Build/source/libs/graphite2/graphite2-src/src/inc/TtfUtil.h b/Build/source/libs/graphite2/graphite2-src/src/inc/TtfUtil.h
index 43ef2daa9ed..fe1c2a585fc 100644
--- a/Build/source/libs/graphite2/graphite2-src/src/inc/TtfUtil.h
+++ b/Build/source/libs/graphite2/graphite2-src/src/inc/TtfUtil.h
@@ -137,11 +137,11 @@ public:
////////////////////////////////// cmap lookup tools
const void * FindCmapSubtable(const void * pCmap, int nPlatformId = 3,
int nEncodingId = 1, size_t length = 0);
- bool CheckCmapSubtable4(const void * pCmap31, size_t table_len /*, unsigned int maxgid*/);
+ bool CheckCmapSubtable4(const void * pCmap31, const void * pCmapEnd /*, unsigned int maxgid*/);
gid16 CmapSubtable4Lookup(const void * pCmapSubtabel4, unsigned int nUnicodeId, int rangeKey = 0);
unsigned int CmapSubtable4NextCodepoint(const void *pCmap31, unsigned int nUnicodeId,
int * pRangeKey = 0);
- bool CheckCmapSubtable12(const void *pCmap310, size_t table_len /*, unsigned int maxgid*/);
+ bool CheckCmapSubtable12(const void *pCmap310, const void * pCmapEnd /*, unsigned int maxgid*/);
gid16 CmapSubtable12Lookup(const void * pCmap310, unsigned int uUnicodeId, int rangeKey = 0);
unsigned int CmapSubtable12NextCodepoint(const void *pCmap310, unsigned int nUnicodeId,
int * pRangeKey = 0);
diff --git a/Build/source/libs/graphite2/graphite2-src/src/inc/opcodes.h b/Build/source/libs/graphite2/graphite2-src/src/inc/opcodes.h
index ce87092b64f..76da50bf409 100644
--- a/Build/source/libs/graphite2/graphite2-src/src/inc/opcodes.h
+++ b/Build/source/libs/graphite2/graphite2-src/src/inc/opcodes.h
@@ -76,7 +76,7 @@ of the License or (at your option) any later version.
#define push(n) { *++sp = n; }
#define pop() (*sp--)
#define slotat(x) (map[(x)])
-#define DIE { is=seg.last(); EXIT(1); }
+#define DIE { is=seg.last(); status = Machine::died_early; EXIT(1); }
#define POSITIONED 1
STARTOP(nop)
@@ -392,7 +392,7 @@ STARTOP(attr_add)
const int val = int(pop());
if ((slat == gr_slatPosX || slat == gr_slatPosY) && (flags & POSITIONED) == 0)
{
- seg.positionSlots(0, *smap.begin(), *(smap.end()-1), dir);
+ seg.positionSlots(0, *smap.begin(), *(smap.end()-1), seg.currdir());
flags |= POSITIONED;
}
int res = is->getAttr(&seg, slat, 0);
@@ -405,7 +405,7 @@ STARTOP(attr_sub)
const int val = int(pop());
if ((slat == gr_slatPosX || slat == gr_slatPosY) && (flags & POSITIONED) == 0)
{
- seg.positionSlots(0, *smap.begin(), *(smap.end()-1), dir);
+ seg.positionSlots(0, *smap.begin(), *(smap.end()-1), seg.currdir());
flags |= POSITIONED;
}
int res = is->getAttr(&seg, slat, 0);
@@ -434,7 +434,7 @@ STARTOP(push_slot_attr)
const int slot_ref = int8(param[1]);
if ((slat == gr_slatPosX || slat == gr_slatPosY) && (flags & POSITIONED) == 0)
{
- seg.positionSlots(0, *smap.begin(), *(smap.end()-1), dir);
+ seg.positionSlots(0, *smap.begin(), *(smap.end()-1), seg.currdir());
flags |= POSITIONED;
}
slotref slot = slotat(slot_ref);
@@ -510,7 +510,7 @@ STARTOP(push_islot_attr)
idx = uint8(param[2]);
if ((slat == gr_slatPosX || slat == gr_slatPosY) && (flags & POSITIONED) == 0)
{
- seg.positionSlots(0, *smap.begin(), *(smap.end()-1), dir);
+ seg.positionSlots(0, *smap.begin(), *(smap.end()-1), seg.currdir());
flags |= POSITIONED;
}
slotref slot = slotat(slot_ref);
diff --git a/Build/source/libs/graphite2/version.ac b/Build/source/libs/graphite2/version.ac
index ed721a18c23..10ef86c5e7e 100644
--- a/Build/source/libs/graphite2/version.ac
+++ b/Build/source/libs/graphite2/version.ac
@@ -8,4 +8,4 @@ dnl
dnl --------------------------------------------------------
dnl
dnl m4-include this file to define the current graphite2 version
-m4_define([graphite2_version], [1.3.5])
+m4_define([graphite2_version], [1.3.6])