summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Breitenlohner <peb@mppmu.mpg.de>2012-11-30 13:28:59 +0000
committerPeter Breitenlohner <peb@mppmu.mpg.de>2012-11-30 13:28:59 +0000
commit22fecb49200c8b5a7e98897f9183a163838e6ff0 (patch)
treeb19e8662445ead783b8f1268e56b47d2b7021a21
parentcdae43322cc315a65b9bee9f62b2e28934fefa6a (diff)
libs/harfbuzz: Update from Khaled
git-svn-id: svn://tug.org/texlive/trunk@28391 c570f23f-e606-0410-a88d-b1316a301751
-rw-r--r--Build/source/libs/harfbuzz/harfbuzz-0.9.7-PATCHES/ChangeLog2
-rw-r--r--Build/source/libs/harfbuzz/harfbuzz-0.9.7-PATCHES/patch-01-Khaled106
-rw-r--r--Build/source/libs/harfbuzz/harfbuzz-0.9.7-PATCHES/patch-01-from-git4921
-rw-r--r--Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-open-file-private.hh10
-rw-r--r--Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-open-type-private.hh82
-rw-r--r--Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-head-table.hh2
-rw-r--r--Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-hhea-table.hh2
-rw-r--r--Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-hmtx-table.hh2
-rw-r--r--Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-layout-common-private.hh44
-rw-r--r--Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-layout-gdef-table.hh24
-rw-r--r--Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-layout-gpos-table.hh524
-rw-r--r--Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-layout-gsub-table.hh752
-rw-r--r--Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-layout-gsubgpos-private.hh806
-rw-r--r--Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-layout.cc116
-rw-r--r--Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-layout.h4
-rw-r--r--Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-maxp-table.hh2
-rw-r--r--Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-name-table.hh6
-rw-r--r--Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-private.hh64
-rw-r--r--Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-shape-plan.cc1
19 files changed, 1335 insertions, 6135 deletions
diff --git a/Build/source/libs/harfbuzz/harfbuzz-0.9.7-PATCHES/ChangeLog b/Build/source/libs/harfbuzz/harfbuzz-0.9.7-PATCHES/ChangeLog
index 05d4127b8ad..a3ecac22094 100644
--- a/Build/source/libs/harfbuzz/harfbuzz-0.9.7-PATCHES/ChangeLog
+++ b/Build/source/libs/harfbuzz/harfbuzz-0.9.7-PATCHES/ChangeLog
@@ -1,6 +1,6 @@
2012-11-30 Peter Breitenlohner <peb@mppmu.mpg.de>
- * patch-01-from-git (new): Update from git as of 2012-11-30.
+ * patch-01-Khaled (new): Partial update from git, from Khaled.
2012-11-29 Peter Breitenlohner <peb@mppmu.mpg.de>
diff --git a/Build/source/libs/harfbuzz/harfbuzz-0.9.7-PATCHES/patch-01-Khaled b/Build/source/libs/harfbuzz/harfbuzz-0.9.7-PATCHES/patch-01-Khaled
new file mode 100644
index 00000000000..c595141ede6
--- /dev/null
+++ b/Build/source/libs/harfbuzz/harfbuzz-0.9.7-PATCHES/patch-01-Khaled
@@ -0,0 +1,106 @@
+diff -ur harfbuzz-0.9.7.orig/src/hb-ot-layout-common-private.hh harfbuzz-0.9.7/src/hb-ot-layout-common-private.hh
+--- harfbuzz-0.9.7.orig/src/hb-ot-layout-common-private.hh 2012-11-17 03:44:32.000000000 +0100
++++ harfbuzz-0.9.7/src/hb-ot-layout-common-private.hh 2012-11-30 14:23:03.000000000 +0100
+@@ -248,6 +248,33 @@
+
+ typedef RecordListOf<Script> ScriptList;
+
++struct FeatureParamsSize
++{
++ inline bool sanitize (hb_sanitize_context_t *c) {
++ TRACE_SANITIZE ();
++ return TRACE_RETURN (c->check_struct (this));
++ }
++
++ USHORT params[5];
++ public:
++ DEFINE_SIZE_STATIC (10);
++};
++
++struct FeatureParams
++{
++ /* Note: currently the only feature with params is 'size', so we hardcode
++ * the length of the table to that of the FeatureParamsSize. */
++
++ inline bool sanitize (hb_sanitize_context_t *c) {
++ TRACE_SANITIZE ();
++ return TRACE_RETURN (c->check_struct (this));
++ }
++
++ union {
++ FeatureParamsSize size;
++ } u;
++ DEFINE_SIZE_STATIC (10);
++};
+
+ struct Feature
+ {
+@@ -260,12 +287,17 @@
+ unsigned int *lookup_tags /* OUT */) const
+ { return lookupIndex.get_indexes (start_index, lookup_count, lookup_tags); }
+
++ inline const FeatureParams &get_feature_params (void) const
++ { return this+featureParams; }
++
+ inline bool sanitize (hb_sanitize_context_t *c) {
+ TRACE_SANITIZE ();
+- return TRACE_RETURN (c->check_struct (this) && lookupIndex.sanitize (c));
++ return TRACE_RETURN (c->check_struct (this) && lookupIndex.sanitize (c) &&
++ featureParams.sanitize (c, this));
+ }
+
+- Offset featureParams; /* Offset to Feature Parameters table (if one
++ OffsetTo<FeatureParams>
++ featureParams; /* Offset to Feature Parameters table (if one
+ * has been defined for the feature), relative
+ * to the beginning of the Feature Table; = Null
+ * if not required */
+diff -ur harfbuzz-0.9.7.orig/src/hb-ot-layout.cc harfbuzz-0.9.7/src/hb-ot-layout.cc
+--- harfbuzz-0.9.7.orig/src/hb-ot-layout.cc 2012-11-17 04:06:56.000000000 +0100
++++ harfbuzz-0.9.7/src/hb-ot-layout.cc 2012-11-30 14:23:03.000000000 +0100
+@@ -539,3 +539,30 @@
+ {
+ OT::GPOS::position_finish (font, buffer, zero_width_attached_marks);
+ }
++
++hb_bool_t
++hb_ot_layout_position_get_size (hb_face_t *face,
++ uint16_t *data /* OUT, 5 items */)
++{
++ const OT::GPOS &gpos = _get_gpos (face);
++
++ unsigned int num_features = gpos.get_feature_count ();
++ for (unsigned int i = 0; i < num_features; i++) {
++
++ if (HB_TAG ('s','i','z','e') == gpos.get_feature_tag (i))
++ {
++ const OT::Feature &f = gpos.get_feature (i);
++ const OT::FeatureParams &params = f.get_feature_params ();
++
++ for (unsigned int i = 0; i < 5; i++)
++ data[i] = params.u.size.params[i];
++
++ return true;
++ }
++ }
++
++ for (unsigned int i = 0; i < 5; i++)
++ data[i] = 0;
++
++ return false;
++}
+diff -ur harfbuzz-0.9.7.orig/src/hb-ot-layout.h harfbuzz-0.9.7/src/hb-ot-layout.h
+--- harfbuzz-0.9.7.orig/src/hb-ot-layout.h 2012-11-17 03:50:38.000000000 +0100
++++ harfbuzz-0.9.7/src/hb-ot-layout.h 2012-11-30 14:23:03.000000000 +0100
+@@ -279,6 +279,11 @@
+ hb_glyph_position_t *positions /* IN / OUT */);
+ #endif
+
++/* Optical 'size' feature info. Returns true if found. */
++hb_bool_t
++hb_ot_layout_position_get_size (hb_face_t *face,
++ uint16_t *data /* OUT, 5 items */);
++
+
+ HB_END_DECLS
+
diff --git a/Build/source/libs/harfbuzz/harfbuzz-0.9.7-PATCHES/patch-01-from-git b/Build/source/libs/harfbuzz/harfbuzz-0.9.7-PATCHES/patch-01-from-git
deleted file mode 100644
index d507194fcc4..00000000000
--- a/Build/source/libs/harfbuzz/harfbuzz-0.9.7-PATCHES/patch-01-from-git
+++ /dev/null
@@ -1,4921 +0,0 @@
-diff -ur harfbuzz-0.9.7.orig/src/hb-open-file-private.hh harfbuzz-0.9.7/src/hb-open-file-private.hh
---- harfbuzz-0.9.7.orig/src/hb-open-file-private.hh 2012-11-17 03:44:11.000000000 +0100
-+++ harfbuzz-0.9.7/src/hb-open-file-private.hh 2012-11-28 09:32:35.000000000 +0100
-@@ -54,7 +54,7 @@
- typedef struct TableRecord
- {
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (c->check_struct (this));
- }
-
-@@ -103,7 +103,7 @@
-
- public:
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (c->check_struct (this) && c->check_array (tables, TableRecord::static_size, numTables));
- }
-
-@@ -131,7 +131,7 @@
- inline const OpenTypeFontFace& get_face (unsigned int i) const { return this+table[i]; }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (table.sanitize (c, this));
- }
-
-@@ -170,7 +170,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- if (unlikely (!u.header.version.sanitize (c))) return TRACE_RETURN (false);
- switch (u.header.version.major) {
- case 2: /* version 2 is compatible with version 1 */
-@@ -232,7 +232,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- if (unlikely (!u.tag.sanitize (c))) return TRACE_RETURN (false);
- switch (u.tag) {
- case CFFTag: /* All the non-collection tags */
-diff -ur harfbuzz-0.9.7.orig/src/hb-open-type-private.hh harfbuzz-0.9.7/src/hb-open-type-private.hh
---- harfbuzz-0.9.7.orig/src/hb-open-type-private.hh 2012-11-17 03:44:17.000000000 +0100
-+++ harfbuzz-0.9.7/src/hb-open-type-private.hh 2012-11-28 09:32:35.000000000 +0100
-@@ -37,6 +37,7 @@
- namespace OT {
-
-
-+
- /*
- * Casts
- */
-@@ -165,12 +166,24 @@
- #endif
-
-
--#define TRACE_SANITIZE() \
-- hb_auto_trace_t<HB_DEBUG_SANITIZE> trace (&c->debug_depth, "SANITIZE", this, HB_FUNC, "");
-+#define TRACE_SANITIZE(this) \
-+ hb_auto_trace_t<HB_DEBUG_SANITIZE, bool> trace \
-+ (&c->debug_depth, c->get_name (), this, HB_FUNC, \
-+ "");
-
-
- struct hb_sanitize_context_t
- {
-+ inline const char *get_name (void) { return "SANITIZE"; }
-+ static const unsigned int max_debug_depth = HB_DEBUG_SANITIZE;
-+ typedef bool return_t;
-+ template <typename T>
-+ inline return_t process (const T &obj) { return obj.sanitize (this); }
-+ static return_t default_return_value (void) { return true; }
-+ bool stop_sublookup_iteration (const return_t r) const { return false; }
-+ return_t recurse (unsigned int lookup_index)
-+ { return default_return_value (); }
-+
- inline void init (hb_blob_t *b)
- {
- this->blob = hb_blob_reference (b);
-@@ -205,10 +218,11 @@
- {
- const char *p = (const char *) base;
-
-- hb_auto_trace_t<HB_DEBUG_SANITIZE> trace (&this->debug_depth, "SANITIZE", this->blob, NULL,
-- "check_range [%p..%p] (%d bytes) in [%p..%p]",
-- p, p + len, len,
-- this->start, this->end);
-+ hb_auto_trace_t<HB_DEBUG_SANITIZE, bool> trace
-+ (&this->debug_depth, "SANITIZE", this->blob, NULL,
-+ "check_range [%p..%p] (%d bytes) in [%p..%p]",
-+ p, p + len, len,
-+ this->start, this->end);
-
- return TRACE_RETURN (likely (this->start <= p && p <= this->end && (unsigned int) (this->end - p) >= len));
- }
-@@ -218,10 +232,11 @@
- const char *p = (const char *) base;
- bool overflows = _hb_unsigned_int_mul_overflows (len, record_size);
-
-- hb_auto_trace_t<HB_DEBUG_SANITIZE> trace (&this->debug_depth, "SANITIZE", this->blob, NULL,
-- "check_array [%p..%p] (%d*%d=%ld bytes) in [%p..%p]",
-- p, p + (record_size * len), record_size, len, (unsigned long) record_size * len,
-- this->start, this->end);
-+ hb_auto_trace_t<HB_DEBUG_SANITIZE, bool> trace
-+ (&this->debug_depth, "SANITIZE", this->blob, NULL,
-+ "check_array [%p..%p] (%d*%d=%ld bytes) in [%p..%p]",
-+ p, p + (record_size * len), record_size, len, (unsigned long) record_size * len,
-+ this->start, this->end);
-
- return TRACE_RETURN (likely (!overflows && this->check_range (base, record_size * len)));
- }
-@@ -237,11 +252,12 @@
- const char *p = (const char *) base;
- this->edit_count++;
-
-- hb_auto_trace_t<HB_DEBUG_SANITIZE> trace (&this->debug_depth, "SANITIZE", this->blob, NULL,
-- "may_edit(%u) [%p..%p] (%d bytes) in [%p..%p] -> %s",
-- this->edit_count,
-- p, p + len, len,
-- this->start, this->end);
-+ hb_auto_trace_t<HB_DEBUG_SANITIZE, bool> trace
-+ (&this->debug_depth, "SANITIZE", this->blob, NULL,
-+ "may_edit(%u) [%p..%p] (%d bytes) in [%p..%p] -> %s",
-+ this->edit_count,
-+ p, p + len, len,
-+ this->start, this->end);
-
- return TRACE_RETURN (this->writable);
- }
-@@ -336,8 +352,10 @@
- #endif
-
-
--#define TRACE_SERIALIZE() \
-- hb_auto_trace_t<HB_DEBUG_SERIALIZE> trace (&c->debug_depth, "SERIALIZE", c, HB_FUNC, "");
-+#define TRACE_SERIALIZE(this) \
-+ hb_auto_trace_t<HB_DEBUG_SERIALIZE, bool> trace \
-+ (&c->debug_depth, "SERIALIZE", c, HB_FUNC, \
-+ "");
-
-
- struct hb_serialize_context_t
-@@ -531,7 +549,7 @@
- inline int cmp (IntType<Type> va) const { Type a = va; Type b = v; return a < b ? -1 : a == b ? 0 : +1; }
- inline int cmp (Type a) const { Type b = v; return a < b ? -1 : a == b ? 0 : +1; }
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (likely (c->check_struct (this)));
- }
- protected:
-@@ -556,7 +574,7 @@
- struct LONGDATETIME
- {
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (likely (c->check_struct (this)));
- }
- private:
-@@ -620,7 +638,7 @@
- inline uint32_t to_int (void) const { return (major << 16) + minor; }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (c->check_struct (this));
- }
-
-@@ -660,7 +678,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c, void *base) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- if (unlikely (!c->check_struct (this))) return TRACE_RETURN (false);
- unsigned int offset = *this;
- if (unlikely (!offset)) return TRACE_RETURN (true);
-@@ -669,7 +687,7 @@
- }
- template <typename T>
- inline bool sanitize (hb_sanitize_context_t *c, void *base, T user_data) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- if (unlikely (!c->check_struct (this))) return TRACE_RETURN (false);
- unsigned int offset = *this;
- if (unlikely (!offset)) return TRACE_RETURN (true);
-@@ -733,7 +751,7 @@
- inline bool serialize (hb_serialize_context_t *c,
- unsigned int items_len)
- {
-- TRACE_SERIALIZE ();
-+ TRACE_SERIALIZE (this);
- if (unlikely (!c->extend_min (*this))) return TRACE_RETURN (false);
- len.set (items_len); /* TODO(serialize) Overflow? */
- if (unlikely (!c->extend (*this))) return TRACE_RETURN (false);
-@@ -744,7 +762,7 @@
- Supplier<Type> &items,
- unsigned int items_len)
- {
-- TRACE_SERIALIZE ();
-+ TRACE_SERIALIZE (this);
- if (unlikely (!serialize (c, items_len))) return TRACE_RETURN (false);
- for (unsigned int i = 0; i < items_len; i++)
- array[i] = items[i];
-@@ -753,7 +771,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- if (unlikely (!sanitize_shallow (c))) return TRACE_RETURN (false);
-
- /* Note: for structs that do not reference other structs,
-@@ -768,7 +786,7 @@
- return TRACE_RETURN (true);
- }
- inline bool sanitize (hb_sanitize_context_t *c, void *base) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- if (unlikely (!sanitize_shallow (c))) return TRACE_RETURN (false);
- unsigned int count = len;
- for (unsigned int i = 0; i < count; i++)
-@@ -778,7 +796,7 @@
- }
- template <typename T>
- inline bool sanitize (hb_sanitize_context_t *c, void *base, T user_data) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- if (unlikely (!sanitize_shallow (c))) return TRACE_RETURN (false);
- unsigned int count = len;
- for (unsigned int i = 0; i < count; i++)
-@@ -789,7 +807,7 @@
-
- private:
- inline bool sanitize_shallow (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (c->check_struct (this) && c->check_array (this, Type::static_size, len));
- }
-
-@@ -831,12 +849,12 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (OffsetArrayOf<Type>::sanitize (c, this));
- }
- template <typename T>
- inline bool sanitize (hb_sanitize_context_t *c, T user_data) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (OffsetArrayOf<Type>::sanitize (c, this, user_data));
- }
- };
-@@ -859,7 +877,7 @@
- Supplier<Type> &items,
- unsigned int items_len)
- {
-- TRACE_SERIALIZE ();
-+ TRACE_SERIALIZE (this);
- if (unlikely (!c->extend_min (*this))) return TRACE_RETURN (false);
- len.set (items_len); /* TODO(serialize) Overflow? */
- if (unlikely (!items_len)) return TRACE_RETURN (true);
-@@ -876,7 +894,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- if (unlikely (!sanitize_shallow (c))) return TRACE_RETURN (false);
-
- /* Note: for structs that do not reference other structs,
-diff -ur harfbuzz-0.9.7.orig/src/hb-ot-head-table.hh harfbuzz-0.9.7/src/hb-ot-head-table.hh
---- harfbuzz-0.9.7.orig/src/hb-ot-head-table.hh 2012-11-17 03:44:21.000000000 +0100
-+++ harfbuzz-0.9.7/src/hb-ot-head-table.hh 2012-11-28 09:32:35.000000000 +0100
-@@ -52,7 +52,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (c->check_struct (this) && likely (version.major == 1));
- }
-
-diff -ur harfbuzz-0.9.7.orig/src/hb-ot-hhea-table.hh harfbuzz-0.9.7/src/hb-ot-hhea-table.hh
---- harfbuzz-0.9.7.orig/src/hb-ot-hhea-table.hh 2012-11-17 03:44:25.000000000 +0100
-+++ harfbuzz-0.9.7/src/hb-ot-hhea-table.hh 2012-11-28 09:32:35.000000000 +0100
-@@ -45,7 +45,7 @@
- static const hb_tag_t Tag = HB_OT_TAG_hhea;
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (c->check_struct (this) && likely (version.major == 1));
- }
-
-diff -ur harfbuzz-0.9.7.orig/src/hb-ot-hmtx-table.hh harfbuzz-0.9.7/src/hb-ot-hmtx-table.hh
---- harfbuzz-0.9.7.orig/src/hb-ot-hmtx-table.hh 2012-11-17 03:44:28.000000000 +0100
-+++ harfbuzz-0.9.7/src/hb-ot-hmtx-table.hh 2012-11-28 09:32:35.000000000 +0100
-@@ -53,7 +53,7 @@
- static const hb_tag_t Tag = HB_OT_TAG_hmtx;
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- /* We don't check for anything specific here. The users of the
- * struct do all the hard work... */
- return TRACE_RETURN (true);
-diff -ur harfbuzz-0.9.7.orig/src/hb-ot-layout-common-private.hh harfbuzz-0.9.7/src/hb-ot-layout-common-private.hh
---- harfbuzz-0.9.7.orig/src/hb-ot-layout-common-private.hh 2012-11-17 03:44:32.000000000 +0100
-+++ harfbuzz-0.9.7/src/hb-ot-layout-common-private.hh 2012-11-28 09:32:35.000000000 +0100
-@@ -61,7 +61,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c, void *base) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (c->check_struct (this) && offset.sanitize (c, base));
- }
-
-@@ -115,7 +115,7 @@
- { return this+RecordArrayOf<Type>::operator [](i).offset; }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (RecordArrayOf<Type>::sanitize (c, this));
- }
- };
-@@ -129,7 +129,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (c->check_struct (this));
- }
-
-@@ -193,7 +193,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (c->check_struct (this) && featureIndex.sanitize (c));
- }
-
-@@ -231,7 +231,7 @@
- inline const LangSys& get_default_lang_sys (void) const { return this+defaultLangSys; }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (defaultLangSys.sanitize (c, this) && langSys.sanitize (c, this));
- }
-
-@@ -248,6 +248,33 @@
-
- typedef RecordListOf<Script> ScriptList;
-
-+struct FeatureParamsSize
-+{
-+ inline bool sanitize (hb_sanitize_context_t *c) {
-+ TRACE_SANITIZE (this);
-+ return TRACE_RETURN (c->check_struct (this));
-+ }
-+
-+ USHORT params[5];
-+ public:
-+ DEFINE_SIZE_STATIC (10);
-+};
-+
-+struct FeatureParams
-+{
-+ /* Note: currently the only feature with params is 'size', so we hardcode
-+ * the length of the table to that of the FeatureParamsSize. */
-+
-+ inline bool sanitize (hb_sanitize_context_t *c) {
-+ TRACE_SANITIZE (this);
-+ return TRACE_RETURN (c->check_struct (this));
-+ }
-+
-+ union {
-+ FeatureParamsSize size;
-+ } u;
-+ DEFINE_SIZE_STATIC (10);
-+};
-
- struct Feature
- {
-@@ -260,12 +287,17 @@
- unsigned int *lookup_tags /* OUT */) const
- { return lookupIndex.get_indexes (start_index, lookup_count, lookup_tags); }
-
-+ inline const FeatureParams &get_feature_params (void) const
-+ { return this+featureParams; }
-+
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-- return TRACE_RETURN (c->check_struct (this) && lookupIndex.sanitize (c));
-+ TRACE_SANITIZE (this);
-+ return TRACE_RETURN (c->check_struct (this) && lookupIndex.sanitize (c) &&
-+ featureParams.sanitize (c, this));
- }
-
-- Offset featureParams; /* Offset to Feature Parameters table (if one
-+ OffsetTo<FeatureParams>
-+ featureParams; /* Offset to Feature Parameters table (if one
- * has been defined for the feature), relative
- * to the beginning of the Feature Table; = Null
- * if not required */
-@@ -318,7 +350,7 @@
- uint32_t lookup_props,
- unsigned int num_subtables)
- {
-- TRACE_SERIALIZE ();
-+ TRACE_SERIALIZE (this);
- if (unlikely (!c->extend_min (*this))) return TRACE_RETURN (false);
- lookupType.set (lookup_type);
- lookupFlag.set (lookup_props & 0xFFFF);
-@@ -332,7 +364,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- /* Real sanitize of the subtables is done by GSUB/GPOS/... */
- if (!(c->check_struct (this) && subTable.sanitize (c))) return TRACE_RETURN (false);
- if (lookupFlag & LookupFlag::UseMarkFilteringSet)
-@@ -377,7 +409,7 @@
- Supplier<GlyphID> &glyphs,
- unsigned int num_glyphs)
- {
-- TRACE_SERIALIZE ();
-+ TRACE_SERIALIZE (this);
- if (unlikely (!c->extend_min (*this))) return TRACE_RETURN (false);
- glyphArray.len.set (num_glyphs);
- if (unlikely (!c->extend (glyphArray))) return TRACE_RETURN (false);
-@@ -388,7 +420,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (glyphArray.sanitize (c));
- }
-
-@@ -445,7 +477,7 @@
- Supplier<GlyphID> &glyphs,
- unsigned int num_glyphs)
- {
-- TRACE_SERIALIZE ();
-+ TRACE_SERIALIZE (this);
- if (unlikely (!c->extend_min (*this))) return TRACE_RETURN (false);
-
- if (unlikely (!num_glyphs)) return TRACE_RETURN (true);
-@@ -474,7 +506,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (rangeRecord.sanitize (c));
- }
-
-@@ -541,8 +573,6 @@
-
- struct Coverage
- {
-- inline unsigned int operator () (hb_codepoint_t glyph_id) const { return get_coverage (glyph_id); }
--
- inline unsigned int get_coverage (hb_codepoint_t glyph_id) const
- {
- switch (u.format) {
-@@ -556,7 +586,7 @@
- Supplier<GlyphID> &glyphs,
- unsigned int num_glyphs)
- {
-- TRACE_SERIALIZE ();
-+ TRACE_SERIALIZE (this);
- if (unlikely (!c->extend_min (*this))) return TRACE_RETURN (false);
- unsigned int num_ranges = 1;
- for (unsigned int i = 1; i < num_glyphs; i++)
-@@ -571,7 +601,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- if (!u.format.sanitize (c)) return TRACE_RETURN (false);
- switch (u.format) {
- case 1: return TRACE_RETURN (u.format1.sanitize (c));
-@@ -682,7 +712,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (c->check_struct (this) && classValue.sanitize (c));
- }
-
-@@ -725,7 +755,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (rangeRecord.sanitize (c));
- }
-
-@@ -756,8 +786,6 @@
-
- struct ClassDef
- {
-- inline unsigned int operator () (hb_codepoint_t glyph_id) const { return get_class (glyph_id); }
--
- inline unsigned int get_class (hb_codepoint_t glyph_id) const
- {
- switch (u.format) {
-@@ -768,7 +796,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- if (!u.format.sanitize (c)) return TRACE_RETURN (false);
- switch (u.format) {
- case 1: return TRACE_RETURN (u.format1.sanitize (c));
-@@ -860,7 +888,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (c->check_struct (this) && c->check_range (this, this->get_size ()));
- }
-
-diff -ur harfbuzz-0.9.7.orig/src/hb-ot-layout-gdef-table.hh harfbuzz-0.9.7/src/hb-ot-layout-gdef-table.hh
---- harfbuzz-0.9.7.orig/src/hb-ot-layout-gdef-table.hh 2012-11-17 03:44:36.000000000 +0100
-+++ harfbuzz-0.9.7/src/hb-ot-layout-gdef-table.hh 2012-11-28 09:32:35.000000000 +0100
-@@ -51,7 +51,7 @@
- unsigned int *point_count /* IN/OUT */,
- unsigned int *point_array /* OUT */) const
- {
-- unsigned int index = (this+coverage) (glyph_id);
-+ unsigned int index = (this+coverage).get_coverage (glyph_id);
- if (index == NOT_COVERED)
- {
- if (point_count)
-@@ -72,7 +72,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (coverage.sanitize (c, this) && attachPoint.sanitize (c, this));
- }
-
-@@ -102,7 +102,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (c->check_struct (this));
- }
-
-@@ -128,7 +128,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (c->check_struct (this));
- }
-
-@@ -151,7 +151,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (c->check_struct (this) && deviceTable.sanitize (c, this));
- }
-
-@@ -179,7 +179,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- if (!u.format.sanitize (c)) return TRACE_RETURN (false);
- switch (u.format) {
- case 1: return TRACE_RETURN (u.format1.sanitize (c));
-@@ -220,7 +220,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (carets.sanitize (c, this));
- }
-
-@@ -242,7 +242,7 @@
- unsigned int *caret_count /* IN/OUT */,
- hb_position_t *caret_array /* OUT */) const
- {
-- unsigned int index = (this+coverage) (glyph_id);
-+ unsigned int index = (this+coverage).get_coverage (glyph_id);
- if (index == NOT_COVERED)
- {
- if (caret_count)
-@@ -254,7 +254,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (coverage.sanitize (c, this) && ligGlyph.sanitize (c, this));
- }
-
-@@ -276,7 +276,7 @@
- { return (this+coverage[set_index]).get_coverage (glyph_id) != NOT_COVERED; }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (coverage.sanitize (c, this));
- }
-
-@@ -300,7 +300,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- if (!u.format.sanitize (c)) return TRACE_RETURN (false);
- switch (u.format) {
- case 1: return TRACE_RETURN (u.format1.sanitize (c));
-@@ -365,7 +365,7 @@
- { return version.to_int () >= 0x00010002 && (this+markGlyphSetsDef[0]).covers (set_index, glyph_id); }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (version.sanitize (c) &&
- likely (version.major == 1) &&
- glyphClassDef.sanitize (c, this) &&
-diff -ur harfbuzz-0.9.7.orig/src/hb-ot-layout-gpos-table.hh harfbuzz-0.9.7/src/hb-ot-layout-gpos-table.hh
---- harfbuzz-0.9.7.orig/src/hb-ot-layout-gpos-table.hh 2012-11-17 03:44:41.000000000 +0100
-+++ harfbuzz-0.9.7/src/hb-ot-layout-gpos-table.hh 2012-11-28 09:32:35.000000000 +0100
-@@ -172,12 +172,12 @@
- }
-
- inline bool sanitize_value (hb_sanitize_context_t *c, void *base, Value *values) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (c->check_range (values, get_size ()) && (!has_device () || sanitize_value_devices (c, base, values)));
- }
-
- inline bool sanitize_values (hb_sanitize_context_t *c, void *base, Value *values, unsigned int count) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- unsigned int len = get_len ();
-
- if (!c->check_array (values, get_size (), count)) return TRACE_RETURN (false);
-@@ -195,7 +195,7 @@
-
- /* Just sanitize referenced Device tables. Doesn't check the values themselves. */
- inline bool sanitize_values_stride_unsafe (hb_sanitize_context_t *c, void *base, Value *values, unsigned int count, unsigned int stride) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
-
- if (!has_device ()) return TRACE_RETURN (true);
-
-@@ -212,9 +212,6 @@
-
- struct AnchorFormat1
- {
-- friend struct Anchor;
--
-- private:
- inline void get_anchor (hb_font_t *font, hb_codepoint_t glyph_id HB_UNUSED,
- hb_position_t *x, hb_position_t *y) const
- {
-@@ -223,7 +220,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (c->check_struct (this));
- }
-
-@@ -237,9 +234,6 @@
-
- struct AnchorFormat2
- {
-- friend struct Anchor;
--
-- private:
- inline void get_anchor (hb_font_t *font, hb_codepoint_t glyph_id,
- hb_position_t *x, hb_position_t *y) const
- {
-@@ -255,7 +249,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (c->check_struct (this));
- }
-
-@@ -270,9 +264,6 @@
-
- struct AnchorFormat3
- {
-- friend struct Anchor;
--
-- private:
- inline void get_anchor (hb_font_t *font, hb_codepoint_t glyph_id HB_UNUSED,
- hb_position_t *x, hb_position_t *y) const
- {
-@@ -286,7 +277,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (c->check_struct (this) && xDeviceTable.sanitize (c, this) && yDeviceTable.sanitize (c, this));
- }
-
-@@ -321,7 +312,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- if (!u.format.sanitize (c)) return TRACE_RETURN (false);
- switch (u.format) {
- case 1: return TRACE_RETURN (u.format1.sanitize (c));
-@@ -351,7 +342,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c, unsigned int cols) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- if (!c->check_struct (this)) return TRACE_RETURN (false);
- if (unlikely (rows > 0 && cols >= ((unsigned int) -1) / rows)) return TRACE_RETURN (false);
- unsigned int count = rows * cols;
-@@ -376,7 +367,7 @@
- friend struct MarkArray;
-
- inline bool sanitize (hb_sanitize_context_t *c, void *base) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (c->check_struct (this) && markAnchor.sanitize (c, base));
- }
-
-@@ -396,7 +387,7 @@
- const AnchorMatrix &anchors, unsigned int class_count,
- unsigned int glyph_pos) const
- {
-- TRACE_APPLY ();
-+ TRACE_APPLY (this);
- const MarkRecord &record = ArrayOf<MarkRecord>::operator[](mark_index);
- unsigned int mark_class = record.klass;
-
-@@ -418,7 +409,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (ArrayOf<MarkRecord>::sanitize (c, this));
- }
- };
-@@ -428,9 +419,11 @@
-
- struct SinglePosFormat1
- {
-- friend struct SinglePos;
--
-- private:
-+ inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
-+ {
-+ TRACE_COLLECT_GLYPHS (this);
-+ (this+coverage).add_coverage (&c->input);
-+ }
-
- inline const Coverage &get_coverage (void) const
- {
-@@ -439,8 +432,8 @@
-
- inline bool apply (hb_apply_context_t *c) const
- {
-- TRACE_APPLY ();
-- unsigned int index = (this+coverage) (c->buffer->cur().codepoint);
-+ TRACE_APPLY (this);
-+ unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
- if (likely (index == NOT_COVERED)) return TRACE_RETURN (false);
-
- valueFormat.apply_value (c->font, c->direction, this,
-@@ -451,7 +444,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (c->check_struct (this) && coverage.sanitize (c, this) && valueFormat.sanitize_value (c, this, values));
- }
-
-@@ -471,9 +464,11 @@
-
- struct SinglePosFormat2
- {
-- friend struct SinglePos;
--
-- private:
-+ inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
-+ {
-+ TRACE_COLLECT_GLYPHS (this);
-+ (this+coverage).add_coverage (&c->input);
-+ }
-
- inline const Coverage &get_coverage (void) const
- {
-@@ -482,8 +477,8 @@
-
- inline bool apply (hb_apply_context_t *c) const
- {
-- TRACE_APPLY ();
-- unsigned int index = (this+coverage) (c->buffer->cur().codepoint);
-+ TRACE_APPLY (this);
-+ unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
- if (likely (index == NOT_COVERED)) return TRACE_RETURN (false);
-
- if (likely (index >= valueCount)) return TRACE_RETURN (false);
-@@ -497,7 +492,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (c->check_struct (this) && coverage.sanitize (c, this) && valueFormat.sanitize_values (c, this, values, valueCount));
- }
-
-@@ -517,31 +512,19 @@
-
- struct SinglePos
- {
-- friend struct PosLookupSubTable;
--
-- private:
--
-- inline const Coverage &get_coverage (void) const
-+ template <typename context_t>
-+ inline typename context_t::return_t process (context_t *c) const
- {
-+ TRACE_PROCESS (this);
- switch (u.format) {
-- case 1: return u.format1.get_coverage ();
-- case 2: return u.format2.get_coverage ();
-- default:return Null(Coverage);
-- }
-- }
--
-- inline bool apply (hb_apply_context_t *c) const
-- {
-- TRACE_APPLY ();
-- switch (u.format) {
-- case 1: return TRACE_RETURN (u.format1.apply (c));
-- case 2: return TRACE_RETURN (u.format2.apply (c));
-- default:return TRACE_RETURN (false);
-+ case 1: return TRACE_RETURN (c->process (u.format1));
-+ case 2: return TRACE_RETURN (c->process (u.format2));
-+ default:return TRACE_RETURN (c->default_return_value ());
- }
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- if (!u.format.sanitize (c)) return TRACE_RETURN (false);
- switch (u.format) {
- case 1: return TRACE_RETURN (u.format1.sanitize (c));
-@@ -577,17 +560,34 @@
- {
- friend struct PairPosFormat1;
-
-+ inline void collect_glyphs (hb_collect_glyphs_context_t *c,
-+ const ValueFormat *valueFormats) const
-+ {
-+ TRACE_COLLECT_GLYPHS (this);
-+ unsigned int len1 = valueFormats[0].get_len ();
-+ unsigned int len2 = valueFormats[1].get_len ();
-+ unsigned int record_size = USHORT::static_size * (1 + len1 + len2);
-+
-+ const PairValueRecord *record = CastP<PairValueRecord> (array);
-+ unsigned int count = len;
-+ for (unsigned int i = 0; i < count; i++)
-+ {
-+ c->input.add (record->secondGlyph);
-+ record = &StructAtOffset<PairValueRecord> (record, record_size);
-+ }
-+ }
-+
- inline bool apply (hb_apply_context_t *c,
- const ValueFormat *valueFormats,
- unsigned int pos) const
- {
-- TRACE_APPLY ();
-+ TRACE_APPLY (this);
- unsigned int len1 = valueFormats[0].get_len ();
- unsigned int len2 = valueFormats[1].get_len ();
- unsigned int record_size = USHORT::static_size * (1 + len1 + len2);
-
-- unsigned int count = len;
- const PairValueRecord *record = CastP<PairValueRecord> (array);
-+ unsigned int count = len;
- for (unsigned int i = 0; i < count; i++)
- {
- if (c->buffer->info[pos].codepoint == record->secondGlyph)
-@@ -615,7 +615,7 @@
- };
-
- inline bool sanitize (hb_sanitize_context_t *c, const sanitize_closure_t *closure) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- if (!(c->check_struct (this)
- && c->check_array (array, USHORT::static_size * closure->stride, len))) return TRACE_RETURN (false);
-
-@@ -635,9 +635,14 @@
-
- struct PairPosFormat1
- {
-- friend struct PairPos;
--
-- private:
-+ inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
-+ {
-+ TRACE_COLLECT_GLYPHS (this);
-+ (this+coverage).add_coverage (&c->input);
-+ unsigned int count = pairSet.len;
-+ for (unsigned int i = 0; i < count; i++)
-+ (this+pairSet[i]).collect_glyphs (c, &valueFormat1);
-+ }
-
- inline const Coverage &get_coverage (void) const
- {
-@@ -646,11 +651,11 @@
-
- inline bool apply (hb_apply_context_t *c) const
- {
-- TRACE_APPLY ();
-+ TRACE_APPLY (this);
- hb_apply_context_t::mark_skipping_forward_iterator_t skippy_iter (c, c->buffer->idx, 1);
- if (skippy_iter.has_no_chance ()) return TRACE_RETURN (false);
-
-- unsigned int index = (this+coverage) (c->buffer->cur().codepoint);
-+ unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
- if (likely (index == NOT_COVERED)) return TRACE_RETURN (false);
-
- if (!skippy_iter.next ()) return TRACE_RETURN (false);
-@@ -659,7 +664,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
-
- unsigned int len1 = valueFormat1.get_len ();
- unsigned int len2 = valueFormat2.get_len ();
-@@ -693,9 +698,23 @@
-
- struct PairPosFormat2
- {
-- friend struct PairPos;
-+ inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
-+ {
-+ TRACE_COLLECT_GLYPHS (this);
-+ /* (this+coverage).add_coverage (&c->input); // Don't need this. */
-
-- private:
-+ /* TODO only add values for pairs that have nonzero adjustments. */
-+
-+ unsigned int count1 = class1Count;
-+ const ClassDef &klass1 = this+classDef1;
-+ for (unsigned int i = 0; i < count1; i++)
-+ klass1.add_class (&c->input, i);
-+
-+ unsigned int count2 = class2Count;
-+ const ClassDef &klass2 = this+classDef2;
-+ for (unsigned int i = 0; i < count2; i++)
-+ klass2.add_class (&c->input, i);
-+ }
-
- inline const Coverage &get_coverage (void) const
- {
-@@ -704,11 +723,11 @@
-
- inline bool apply (hb_apply_context_t *c) const
- {
-- TRACE_APPLY ();
-+ TRACE_APPLY (this);
- hb_apply_context_t::mark_skipping_forward_iterator_t skippy_iter (c, c->buffer->idx, 1);
- if (skippy_iter.has_no_chance ()) return TRACE_RETURN (false);
-
-- unsigned int index = (this+coverage) (c->buffer->cur().codepoint);
-+ unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
- if (likely (index == NOT_COVERED)) return TRACE_RETURN (false);
-
- if (!skippy_iter.next ()) return TRACE_RETURN (false);
-@@ -717,8 +736,8 @@
- unsigned int len2 = valueFormat2.get_len ();
- unsigned int record_len = len1 + len2;
-
-- unsigned int klass1 = (this+classDef1) (c->buffer->cur().codepoint);
-- unsigned int klass2 = (this+classDef2) (c->buffer->info[skippy_iter.idx].codepoint);
-+ unsigned int klass1 = (this+classDef1).get_class (c->buffer->cur().codepoint);
-+ unsigned int klass2 = (this+classDef2).get_class (c->buffer->info[skippy_iter.idx].codepoint);
- if (unlikely (klass1 >= class1Count || klass2 >= class2Count)) return TRACE_RETURN (false);
-
- const Value *v = &values[record_len * (klass1 * class2Count + klass2)];
-@@ -735,7 +754,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- if (!(c->check_struct (this)
- && coverage.sanitize (c, this)
- && classDef1.sanitize (c, this)
-@@ -783,31 +802,19 @@
-
- struct PairPos
- {
-- friend struct PosLookupSubTable;
--
-- private:
--
-- inline const Coverage &get_coverage (void) const
-+ template <typename context_t>
-+ inline typename context_t::return_t process (context_t *c) const
- {
-+ TRACE_PROCESS (this);
- switch (u.format) {
-- case 1: return u.format1.get_coverage ();
-- case 2: return u.format2.get_coverage ();
-- default:return Null(Coverage);
-- }
-- }
--
-- inline bool apply (hb_apply_context_t *c) const
-- {
-- TRACE_APPLY ();
-- switch (u.format) {
-- case 1: return TRACE_RETURN (u.format1.apply (c));
-- case 2: return TRACE_RETURN (u.format2.apply (c));
-- default:return TRACE_RETURN (false);
-+ case 1: return TRACE_RETURN (c->process (u.format1));
-+ case 2: return TRACE_RETURN (c->process (u.format2));
-+ default:return TRACE_RETURN (c->default_return_value ());
- }
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- if (!u.format.sanitize (c)) return TRACE_RETURN (false);
- switch (u.format) {
- case 1: return TRACE_RETURN (u.format1.sanitize (c));
-@@ -830,7 +837,7 @@
- friend struct CursivePosFormat1;
-
- inline bool sanitize (hb_sanitize_context_t *c, void *base) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (entryAnchor.sanitize (c, base) && exitAnchor.sanitize (c, base));
- }
-
-@@ -849,9 +856,11 @@
-
- struct CursivePosFormat1
- {
-- friend struct CursivePos;
--
-- private:
-+ inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
-+ {
-+ TRACE_COLLECT_GLYPHS (this);
-+ (this+coverage).add_coverage (&c->input);
-+ }
-
- inline const Coverage &get_coverage (void) const
- {
-@@ -860,7 +869,7 @@
-
- inline bool apply (hb_apply_context_t *c) const
- {
-- TRACE_APPLY ();
-+ TRACE_APPLY (this);
-
- /* We don't handle mark glyphs here. */
- if (c->property & HB_OT_LAYOUT_GLYPH_PROPS_MARK) return TRACE_RETURN (false);
-@@ -868,12 +877,12 @@
- hb_apply_context_t::mark_skipping_forward_iterator_t skippy_iter (c, c->buffer->idx, 1);
- if (skippy_iter.has_no_chance ()) return TRACE_RETURN (false);
-
-- const EntryExitRecord &this_record = entryExitRecord[(this+coverage) (c->buffer->cur().codepoint)];
-+ const EntryExitRecord &this_record = entryExitRecord[(this+coverage).get_coverage (c->buffer->cur().codepoint)];
- if (!this_record.exitAnchor) return TRACE_RETURN (false);
-
- if (!skippy_iter.next ()) return TRACE_RETURN (false);
-
-- const EntryExitRecord &next_record = entryExitRecord[(this+coverage) (c->buffer->info[skippy_iter.idx].codepoint)];
-+ const EntryExitRecord &next_record = entryExitRecord[(this+coverage).get_coverage (c->buffer->info[skippy_iter.idx].codepoint)];
- if (!next_record.entryAnchor) return TRACE_RETURN (false);
-
- unsigned int i = c->buffer->idx;
-@@ -941,7 +950,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (coverage.sanitize (c, this) && entryExitRecord.sanitize (c, this));
- }
-
-@@ -959,29 +968,18 @@
-
- struct CursivePos
- {
-- friend struct PosLookupSubTable;
--
-- private:
--
-- inline const Coverage &get_coverage (void) const
-- {
-- switch (u.format) {
-- case 1: return u.format1.get_coverage ();
-- default:return Null(Coverage);
-- }
-- }
--
-- inline bool apply (hb_apply_context_t *c) const
-+ template <typename context_t>
-+ inline typename context_t::return_t process (context_t *c) const
- {
-- TRACE_APPLY ();
-+ TRACE_PROCESS (this);
- switch (u.format) {
-- case 1: return TRACE_RETURN (u.format1.apply (c));
-- default:return TRACE_RETURN (false);
-+ case 1: return TRACE_RETURN (c->process (u.format1));
-+ default:return TRACE_RETURN (c->default_return_value ());
- }
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- if (!u.format.sanitize (c)) return TRACE_RETURN (false);
- switch (u.format) {
- case 1: return TRACE_RETURN (u.format1.sanitize (c));
-@@ -1004,9 +1002,13 @@
-
- struct MarkBasePosFormat1
- {
-- friend struct MarkBasePos;
--
-- private:
-+ inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
-+ {
-+ TRACE_COLLECT_GLYPHS (this);
-+ (this+markCoverage).add_coverage (&c->input);
-+ (this+baseCoverage).add_coverage (&c->input);
-+ /* TODO only add combinations that have nonzero adjustment. */
-+ }
-
- inline const Coverage &get_coverage (void) const
- {
-@@ -1015,8 +1017,8 @@
-
- inline bool apply (hb_apply_context_t *c) const
- {
-- TRACE_APPLY ();
-- unsigned int mark_index = (this+markCoverage) (c->buffer->cur().codepoint);
-+ TRACE_APPLY (this);
-+ unsigned int mark_index = (this+markCoverage).get_coverage (c->buffer->cur().codepoint);
- if (likely (mark_index == NOT_COVERED)) return TRACE_RETURN (false);
-
- /* now we search backwards for a non-mark glyph */
-@@ -1032,14 +1034,14 @@
- /* The following assertion is too strong, so we've disabled it. */
- if (!(property & HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH)) {/*return TRACE_RETURN (false);*/}
-
-- unsigned int base_index = (this+baseCoverage) (c->buffer->info[skippy_iter.idx].codepoint);
-+ unsigned int base_index = (this+baseCoverage).get_coverage (c->buffer->info[skippy_iter.idx].codepoint);
- if (base_index == NOT_COVERED) return TRACE_RETURN (false);
-
- return TRACE_RETURN ((this+markArray).apply (c, mark_index, base_index, this+baseArray, classCount, skippy_iter.idx));
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (c->check_struct (this) && markCoverage.sanitize (c, this) && baseCoverage.sanitize (c, this) &&
- markArray.sanitize (c, this) && baseArray.sanitize (c, this, (unsigned int) classCount));
- }
-@@ -1065,29 +1067,18 @@
-
- struct MarkBasePos
- {
-- friend struct PosLookupSubTable;
--
-- private:
--
-- inline const Coverage &get_coverage (void) const
-+ template <typename context_t>
-+ inline typename context_t::return_t process (context_t *c) const
- {
-+ TRACE_PROCESS (this);
- switch (u.format) {
-- case 1: return u.format1.get_coverage ();
-- default:return Null(Coverage);
-- }
-- }
--
-- inline bool apply (hb_apply_context_t *c) const
-- {
-- TRACE_APPLY ();
-- switch (u.format) {
-- case 1: return TRACE_RETURN (u.format1.apply (c));
-- default:return TRACE_RETURN (false);
-+ case 1: return TRACE_RETURN (c->process (u.format1));
-+ default:return TRACE_RETURN (c->default_return_value ());
- }
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- if (!u.format.sanitize (c)) return TRACE_RETURN (false);
- switch (u.format) {
- case 1: return TRACE_RETURN (u.format1.sanitize (c));
-@@ -1115,9 +1106,13 @@
-
- struct MarkLigPosFormat1
- {
-- friend struct MarkLigPos;
--
-- private:
-+ inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
-+ {
-+ TRACE_COLLECT_GLYPHS (this);
-+ (this+markCoverage).add_coverage (&c->input);
-+ (this+ligatureCoverage).add_coverage (&c->input);
-+ /* TODO only add combinations that have nonzero adjustment. */
-+ }
-
- inline const Coverage &get_coverage (void) const
- {
-@@ -1126,8 +1121,8 @@
-
- inline bool apply (hb_apply_context_t *c) const
- {
-- TRACE_APPLY ();
-- unsigned int mark_index = (this+markCoverage) (c->buffer->cur().codepoint);
-+ TRACE_APPLY (this);
-+ unsigned int mark_index = (this+markCoverage).get_coverage (c->buffer->cur().codepoint);
- if (likely (mark_index == NOT_COVERED)) return TRACE_RETURN (false);
-
- /* now we search backwards for a non-mark glyph */
-@@ -1139,7 +1134,7 @@
- if (!(property & HB_OT_LAYOUT_GLYPH_PROPS_LIGATURE)) {/*return TRACE_RETURN (false);*/}
-
- unsigned int j = skippy_iter.idx;
-- unsigned int lig_index = (this+ligatureCoverage) (c->buffer->info[j].codepoint);
-+ unsigned int lig_index = (this+ligatureCoverage).get_coverage (c->buffer->info[j].codepoint);
- if (lig_index == NOT_COVERED) return TRACE_RETURN (false);
-
- const LigatureArray& lig_array = this+ligatureArray;
-@@ -1166,7 +1161,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (c->check_struct (this) && markCoverage.sanitize (c, this) && ligatureCoverage.sanitize (c, this) &&
- markArray.sanitize (c, this) && ligatureArray.sanitize (c, this, (unsigned int) classCount));
- }
-@@ -1193,29 +1188,18 @@
-
- struct MarkLigPos
- {
-- friend struct PosLookupSubTable;
--
-- private:
--
-- inline const Coverage &get_coverage (void) const
-- {
-- switch (u.format) {
-- case 1: return u.format1.get_coverage ();
-- default:return Null(Coverage);
-- }
-- }
--
-- inline bool apply (hb_apply_context_t *c) const
-+ template <typename context_t>
-+ inline typename context_t::return_t process (context_t *c) const
- {
-- TRACE_APPLY ();
-+ TRACE_PROCESS (this);
- switch (u.format) {
-- case 1: return TRACE_RETURN (u.format1.apply (c));
-- default:return TRACE_RETURN (false);
-+ case 1: return TRACE_RETURN (c->process (u.format1));
-+ default:return TRACE_RETURN (c->default_return_value ());
- }
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- if (!u.format.sanitize (c)) return TRACE_RETURN (false);
- switch (u.format) {
- case 1: return TRACE_RETURN (u.format1.sanitize (c));
-@@ -1238,9 +1222,13 @@
-
- struct MarkMarkPosFormat1
- {
-- friend struct MarkMarkPos;
--
-- private:
-+ inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
-+ {
-+ TRACE_COLLECT_GLYPHS (this);
-+ (this+mark1Coverage).add_coverage (&c->input);
-+ (this+mark2Coverage).add_coverage (&c->input);
-+ /* TODO only add combinations that have nonzero adjustment. */
-+ }
-
- inline const Coverage &get_coverage (void) const
- {
-@@ -1249,8 +1237,8 @@
-
- inline bool apply (hb_apply_context_t *c) const
- {
-- TRACE_APPLY ();
-- unsigned int mark1_index = (this+mark1Coverage) (c->buffer->cur().codepoint);
-+ TRACE_APPLY (this);
-+ unsigned int mark1_index = (this+mark1Coverage).get_coverage (c->buffer->cur().codepoint);
- if (likely (mark1_index == NOT_COVERED)) return TRACE_RETURN (false);
-
- /* now we search backwards for a suitable mark glyph until a non-mark glyph */
-@@ -1283,14 +1271,14 @@
- return TRACE_RETURN (false);
-
- good:
-- unsigned int mark2_index = (this+mark2Coverage) (c->buffer->info[j].codepoint);
-+ unsigned int mark2_index = (this+mark2Coverage).get_coverage (c->buffer->info[j].codepoint);
- if (mark2_index == NOT_COVERED) return TRACE_RETURN (false);
-
- return TRACE_RETURN ((this+mark1Array).apply (c, mark1_index, mark2_index, this+mark2Array, classCount, j));
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (c->check_struct (this) && mark1Coverage.sanitize (c, this) &&
- mark2Coverage.sanitize (c, this) && mark1Array.sanitize (c, this)
- && mark2Array.sanitize (c, this, (unsigned int) classCount));
-@@ -1319,29 +1307,18 @@
-
- struct MarkMarkPos
- {
-- friend struct PosLookupSubTable;
--
-- private:
--
-- inline const Coverage &get_coverage (void) const
-- {
-- switch (u.format) {
-- case 1: return u.format1.get_coverage ();
-- default:return Null(Coverage);
-- }
-- }
--
-- inline bool apply (hb_apply_context_t *c) const
-+ template <typename context_t>
-+ inline typename context_t::return_t process (context_t *c) const
- {
-- TRACE_APPLY ();
-+ TRACE_PROCESS (this);
- switch (u.format) {
-- case 1: return TRACE_RETURN (u.format1.apply (c));
-- default:return TRACE_RETURN (false);
-+ case 1: return TRACE_RETURN (c->process (u.format1));
-+ default:return TRACE_RETURN (c->default_return_value ());
- }
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- if (!u.format.sanitize (c)) return TRACE_RETURN (false);
- switch (u.format) {
- case 1: return TRACE_RETURN (u.format1.sanitize (c));
-@@ -1357,50 +1334,13 @@
- };
-
-
--static inline bool position_lookup (hb_apply_context_t *c, unsigned int lookup_index);
-+struct ContextPos : Context {};
-
--struct ContextPos : Context
--{
-- friend struct PosLookupSubTable;
--
-- private:
-- inline bool apply (hb_apply_context_t *c) const
-- {
-- TRACE_APPLY ();
-- return TRACE_RETURN (Context::apply (c, position_lookup));
-- }
--};
-+struct ChainContextPos : ChainContext {};
-
--struct ChainContextPos : ChainContext
-+struct ExtensionPos : Extension<ExtensionPos>
- {
-- friend struct PosLookupSubTable;
--
-- private:
-- inline bool apply (hb_apply_context_t *c) const
-- {
-- TRACE_APPLY ();
-- return TRACE_RETURN (ChainContext::apply (c, position_lookup));
-- }
--};
--
--
--struct ExtensionPos : Extension
--{
-- friend struct PosLookupSubTable;
--
-- private:
-- inline const struct PosLookupSubTable& get_subtable (void) const
-- {
-- unsigned int offset = get_offset ();
-- if (unlikely (!offset)) return Null(PosLookupSubTable);
-- return StructAtOffset<PosLookupSubTable> (this, offset);
-- }
--
-- inline const Coverage &get_coverage (void) const;
--
-- inline bool apply (hb_apply_context_t *c) const;
--
-- inline bool sanitize (hb_sanitize_context_t *c);
-+ typedef struct PosLookupSubTable LookupSubTable;
- };
-
-
-@@ -1426,41 +1366,26 @@
- Extension = 9
- };
-
-- inline const Coverage &get_coverage (unsigned int lookup_type) const
-- {
-- switch (lookup_type) {
-- case Single: return u.single.get_coverage ();
-- case Pair: return u.pair.get_coverage ();
-- case Cursive: return u.cursive.get_coverage ();
-- case MarkBase: return u.markBase.get_coverage ();
-- case MarkLig: return u.markLig.get_coverage ();
-- case MarkMark: return u.markMark.get_coverage ();
-- case Context: return u.context.get_coverage ();
-- case ChainContext: return u.chainContext.get_coverage ();
-- case Extension: return u.extension.get_coverage ();
-- default: return Null(Coverage);
-- }
-- }
--
-- inline bool apply (hb_apply_context_t *c, unsigned int lookup_type) const
-+ template <typename context_t>
-+ inline typename context_t::return_t process (context_t *c, unsigned int lookup_type) const
- {
-- TRACE_APPLY ();
-+ TRACE_PROCESS (this);
- switch (lookup_type) {
-- case Single: return TRACE_RETURN (u.single.apply (c));
-- case Pair: return TRACE_RETURN (u.pair.apply (c));
-- case Cursive: return TRACE_RETURN (u.cursive.apply (c));
-- case MarkBase: return TRACE_RETURN (u.markBase.apply (c));
-- case MarkLig: return TRACE_RETURN (u.markLig.apply (c));
-- case MarkMark: return TRACE_RETURN (u.markMark.apply (c));
-- case Context: return TRACE_RETURN (u.context.apply (c));
-- case ChainContext: return TRACE_RETURN (u.chainContext.apply (c));
-- case Extension: return TRACE_RETURN (u.extension.apply (c));
-- default: return TRACE_RETURN (false);
-+ case Single: return TRACE_RETURN (u.single.process (c));
-+ case Pair: return TRACE_RETURN (u.pair.process (c));
-+ case Cursive: return TRACE_RETURN (u.cursive.process (c));
-+ case MarkBase: return TRACE_RETURN (u.markBase.process (c));
-+ case MarkLig: return TRACE_RETURN (u.markLig.process (c));
-+ case MarkMark: return TRACE_RETURN (u.markMark.process (c));
-+ case Context: return TRACE_RETURN (u.context.process (c));
-+ case ChainContext: return TRACE_RETURN (u.chainContext.process (c));
-+ case Extension: return TRACE_RETURN (u.extension.process (c));
-+ default: return TRACE_RETURN (c->default_return_value ());
- }
- }
-
- inline bool sanitize (hb_sanitize_context_t *c, unsigned int lookup_type) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- if (!u.header.sub_format.sanitize (c))
- return TRACE_RETURN (false);
- switch (lookup_type) {
-@@ -1480,7 +1405,7 @@
- protected:
- union {
- struct {
-- USHORT sub_format;
-+ USHORT sub_format;
- } header;
- SinglePos single;
- PairPos pair;
-@@ -1502,35 +1427,54 @@
- inline const PosLookupSubTable& get_subtable (unsigned int i) const
- { return this+CastR<OffsetArrayOf<PosLookupSubTable> > (subTable)[i]; }
-
-+ template <typename context_t>
-+ inline typename context_t::return_t process (context_t *c) const
-+ {
-+ TRACE_PROCESS (this);
-+ unsigned int lookup_type = get_type ();
-+ unsigned int count = get_subtable_count ();
-+ for (unsigned int i = 0; i < count; i++) {
-+ typename context_t::return_t r = get_subtable (i).process (c, lookup_type);
-+ if (c->stop_sublookup_iteration (r))
-+ return TRACE_RETURN (r);
-+ }
-+ return TRACE_RETURN (c->default_return_value ());
-+ }
-+ template <typename context_t>
-+ static inline typename context_t::return_t process_recurse_func (context_t *c, unsigned int lookup_index);
-+
-+ inline hb_collect_glyphs_context_t::return_t collect_glyphs_lookup (hb_collect_glyphs_context_t *c) const
-+ {
-+ TRACE_COLLECT_GLYPHS (this);
-+ c->set_recurse_func (process_recurse_func<hb_collect_glyphs_context_t>);
-+ return TRACE_RETURN (process (c));
-+ }
-+
- template <typename set_t>
- inline void add_coverage (set_t *glyphs) const
- {
-+ hb_get_coverage_context_t c;
- const Coverage *last = NULL;
- unsigned int count = get_subtable_count ();
- for (unsigned int i = 0; i < count; i++) {
-- const Coverage *c = &get_subtable (i).get_coverage (get_type ());
-- if (c != last) {
-- c->add_coverage (glyphs);
-- last = c;
-+ const Coverage *coverage = &get_subtable (i).process (&c, get_type ());
-+ if (coverage != last) {
-+ coverage->add_coverage (glyphs);
-+ last = coverage;
- }
- }
- }
-
- inline bool apply_once (hb_apply_context_t *c) const
- {
-- unsigned int lookup_type = get_type ();
--
-+ TRACE_APPLY (this);
- if (!c->check_glyph_property (&c->buffer->cur(), c->lookup_props, &c->property))
-- return false;
--
-- unsigned int count = get_subtable_count ();
-- for (unsigned int i = 0; i < count; i++)
-- if (get_subtable (i).apply (c, lookup_type))
-- return true;
--
-- return false;
-+ return TRACE_RETURN (false);
-+ return TRACE_RETURN (process (c));
- }
-
-+ static bool apply_recurse_func (hb_apply_context_t *c, unsigned int lookup_index);
-+
- inline bool apply_string (hb_apply_context_t *c, const hb_set_digest_t *digest) const
- {
- bool ret = false;
-@@ -1538,6 +1482,7 @@
- if (unlikely (!c->buffer->len || !c->lookup_mask))
- return false;
-
-+ c->set_recurse_func (apply_recurse_func);
- c->set_lookup (*this);
-
- c->buffer->idx = 0;
-@@ -1556,7 +1501,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- if (unlikely (!Lookup::sanitize (c))) return TRACE_RETURN (false);
- OffsetArrayOf<PosLookupSubTable> &list = CastR<OffsetArrayOf<PosLookupSubTable> > (subTable);
- return TRACE_RETURN (list.sanitize (c, this, get_type ()));
-@@ -1584,7 +1529,7 @@
- static inline void position_finish (hb_font_t *font, hb_buffer_t *buffer, hb_bool_t zero_width_attahced_marks);
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- if (unlikely (!GSUBGPOS::sanitize (c))) return TRACE_RETURN (false);
- OffsetTo<PosLookupList> &list = CastR<OffsetTo<PosLookupList> > (lookupList);
- return TRACE_RETURN (list.sanitize (c, this));
-@@ -1673,38 +1618,25 @@
-
- /* Out-of-class implementation for methods recursing */
-
--inline const Coverage & ExtensionPos::get_coverage (void) const
--{
-- return get_subtable ().get_coverage (get_type ());
--}
--
--inline bool ExtensionPos::apply (hb_apply_context_t *c) const
--{
-- TRACE_APPLY ();
-- return TRACE_RETURN (get_subtable ().apply (c, get_type ()));
--}
--
--inline bool ExtensionPos::sanitize (hb_sanitize_context_t *c)
-+template <typename context_t>
-+inline typename context_t::return_t PosLookup::process_recurse_func (context_t *c, unsigned int lookup_index)
- {
-- TRACE_SANITIZE ();
-- if (unlikely (!Extension::sanitize (c))) return TRACE_RETURN (false);
-- unsigned int offset = get_offset ();
-- if (unlikely (!offset)) return TRACE_RETURN (true);
-- return TRACE_RETURN (StructAtOffset<PosLookupSubTable> (this, offset).sanitize (c, get_type ()));
-+ const GPOS &gpos = *(hb_ot_layout_from_face (c->face)->gpos);
-+ const PosLookup &l = gpos.get_lookup (lookup_index);
-+ return l.process (c);
- }
-
--static inline bool position_lookup (hb_apply_context_t *c, unsigned int lookup_index)
-+inline bool PosLookup::apply_recurse_func (hb_apply_context_t *c, unsigned int lookup_index)
- {
- const GPOS &gpos = *(hb_ot_layout_from_face (c->face)->gpos);
- const PosLookup &l = gpos.get_lookup (lookup_index);
--
-- if (unlikely (c->nesting_level_left == 0))
-- return false;
--
-- hb_apply_context_t new_c (*c);
-- new_c.nesting_level_left--;
-- new_c.set_lookup (l);
-- return l.apply_once (&new_c);
-+ unsigned int saved_lookup_props = c->lookup_props;
-+ unsigned int saved_property = c->property;
-+ c->set_lookup (l);
-+ bool ret = l.apply_once (c);
-+ c->lookup_props = saved_lookup_props;
-+ c->property = saved_property;
-+ return ret;
- }
-
-
-diff -ur harfbuzz-0.9.7.orig/src/hb-ot-layout-gsub-table.hh harfbuzz-0.9.7/src/hb-ot-layout-gsub-table.hh
---- harfbuzz-0.9.7.orig/src/hb-ot-layout-gsub-table.hh 2012-11-21 04:48:45.000000000 +0100
-+++ harfbuzz-0.9.7/src/hb-ot-layout-gsub-table.hh 2012-11-28 09:32:35.000000000 +0100
-@@ -37,13 +37,9 @@
-
- struct SingleSubstFormat1
- {
-- friend struct SingleSubst;
--
-- private:
--
- inline void closure (hb_closure_context_t *c) const
- {
-- TRACE_CLOSURE ();
-+ TRACE_CLOSURE (this);
- Coverage::Iter iter;
- for (iter.init (this+coverage); iter.more (); iter.next ()) {
- hb_codepoint_t glyph_id = iter.get_glyph ();
-@@ -54,6 +50,7 @@
-
- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
- {
-+ TRACE_COLLECT_GLYPHS (this);
- Coverage::Iter iter;
- for (iter.init (this+coverage); iter.more (); iter.next ()) {
- hb_codepoint_t glyph_id = iter.get_glyph ();
-@@ -67,11 +64,17 @@
- return this+coverage;
- }
-
-+ inline bool would_apply (hb_would_apply_context_t *c) const
-+ {
-+ TRACE_WOULD_APPLY (this);
-+ return TRACE_RETURN (c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED);
-+ }
-+
- inline bool apply (hb_apply_context_t *c) const
- {
-- TRACE_APPLY ();
-+ TRACE_APPLY (this);
- hb_codepoint_t glyph_id = c->buffer->cur().codepoint;
-- unsigned int index = (this+coverage) (glyph_id);
-+ unsigned int index = (this+coverage).get_coverage (glyph_id);
- if (likely (index == NOT_COVERED)) return TRACE_RETURN (false);
-
- /* According to the Adobe Annotated OpenType Suite, result is always
-@@ -87,7 +90,7 @@
- unsigned int num_glyphs,
- int delta)
- {
-- TRACE_SERIALIZE ();
-+ TRACE_SERIALIZE (this);
- if (unlikely (!c->extend_min (*this))) return TRACE_RETURN (false);
- if (unlikely (!coverage.serialize (c, this).serialize (c, glyphs, num_glyphs))) return TRACE_RETURN (false);
- deltaGlyphID.set (delta); /* TODO(serilaize) overflow? */
-@@ -95,7 +98,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (coverage.sanitize (c, this) && deltaGlyphID.sanitize (c));
- }
-
-@@ -112,13 +115,9 @@
-
- struct SingleSubstFormat2
- {
-- friend struct SingleSubst;
--
-- private:
--
- inline void closure (hb_closure_context_t *c) const
- {
-- TRACE_CLOSURE ();
-+ TRACE_CLOSURE (this);
- Coverage::Iter iter;
- for (iter.init (this+coverage); iter.more (); iter.next ()) {
- if (c->glyphs->has (iter.get_glyph ()))
-@@ -128,6 +127,7 @@
-
- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
- {
-+ TRACE_COLLECT_GLYPHS (this);
- Coverage::Iter iter;
- for (iter.init (this+coverage); iter.more (); iter.next ()) {
- c->input.add (iter.get_glyph ());
-@@ -140,11 +140,17 @@
- return this+coverage;
- }
-
-+ inline bool would_apply (hb_would_apply_context_t *c) const
-+ {
-+ TRACE_WOULD_APPLY (this);
-+ return TRACE_RETURN (c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED);
-+ }
-+
- inline bool apply (hb_apply_context_t *c) const
- {
-- TRACE_APPLY ();
-+ TRACE_APPLY (this);
- hb_codepoint_t glyph_id = c->buffer->cur().codepoint;
-- unsigned int index = (this+coverage) (glyph_id);
-+ unsigned int index = (this+coverage).get_coverage (glyph_id);
- if (likely (index == NOT_COVERED)) return TRACE_RETURN (false);
-
- if (unlikely (index >= substitute.len)) return TRACE_RETURN (false);
-@@ -160,7 +166,7 @@
- Supplier<GlyphID> &substitutes,
- unsigned int num_glyphs)
- {
-- TRACE_SERIALIZE ();
-+ TRACE_SERIALIZE (this);
- if (unlikely (!c->extend_min (*this))) return TRACE_RETURN (false);
- if (unlikely (!substitute.serialize (c, substitutes, num_glyphs))) return TRACE_RETURN (false);
- if (unlikely (!coverage.serialize (c, this).serialize (c, glyphs, num_glyphs))) return TRACE_RETURN (false);
-@@ -168,7 +174,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (coverage.sanitize (c, this) && substitute.sanitize (c));
- }
-
-@@ -186,47 +192,14 @@
-
- struct SingleSubst
- {
-- friend struct SubstLookupSubTable;
-- friend struct SubstLookup;
--
-- private:
--
-- inline void closure (hb_closure_context_t *c) const
-+ template <typename context_t>
-+ inline typename context_t::return_t process (context_t *c) const
- {
-- TRACE_CLOSURE ();
-+ TRACE_PROCESS (this);
- switch (u.format) {
-- case 1: u.format1.closure (c); break;
-- case 2: u.format2.closure (c); break;
-- default: break;
-- }
-- }
--
-- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
-- {
-- TRACE_CLOSURE ();
-- switch (u.format) {
-- case 1: u.format1.collect_glyphs (c); break;
-- case 2: u.format2.collect_glyphs (c); break;
-- default: break;
-- }
-- }
--
-- inline const Coverage &get_coverage (void) const
-- {
-- switch (u.format) {
-- case 1: return u.format1.get_coverage ();
-- case 2: return u.format2.get_coverage ();
-- default:return Null(Coverage);
-- }
-- }
--
-- inline bool apply (hb_apply_context_t *c) const
-- {
-- TRACE_APPLY ();
-- switch (u.format) {
-- case 1: return TRACE_RETURN (u.format1.apply (c));
-- case 2: return TRACE_RETURN (u.format2.apply (c));
-- default:return TRACE_RETURN (false);
-+ case 1: return TRACE_RETURN (c->process (u.format1));
-+ case 2: return TRACE_RETURN (c->process (u.format2));
-+ default:return TRACE_RETURN (c->default_return_value ());
- }
- }
-
-@@ -235,7 +208,7 @@
- Supplier<GlyphID> &substitutes,
- unsigned int num_glyphs)
- {
-- TRACE_SERIALIZE ();
-+ TRACE_SERIALIZE (this);
- if (unlikely (!c->extend_min (u.format))) return TRACE_RETURN (false);
- unsigned int format = 2;
- int delta;
-@@ -258,7 +231,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- if (!u.format.sanitize (c)) return TRACE_RETURN (false);
- switch (u.format) {
- case 1: return TRACE_RETURN (u.format1.sanitize (c));
-@@ -278,13 +251,9 @@
-
- struct Sequence
- {
-- friend struct MultipleSubstFormat1;
--
-- private:
--
- inline void closure (hb_closure_context_t *c) const
- {
-- TRACE_CLOSURE ();
-+ TRACE_CLOSURE (this);
- unsigned int count = substitute.len;
- for (unsigned int i = 0; i < count; i++)
- c->glyphs->add (substitute[i]);
-@@ -292,6 +261,7 @@
-
- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
- {
-+ TRACE_COLLECT_GLYPHS (this);
- unsigned int count = substitute.len;
- for (unsigned int i = 0; i < count; i++)
- c->output.add (substitute[i]);
-@@ -299,7 +269,7 @@
-
- inline bool apply (hb_apply_context_t *c) const
- {
-- TRACE_APPLY ();
-+ TRACE_APPLY (this);
- if (unlikely (!substitute.len)) return TRACE_RETURN (false);
-
- unsigned int klass = c->property & HB_OT_LAYOUT_GLYPH_PROPS_LIGATURE ? HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH : 0;
-@@ -317,15 +287,14 @@
- Supplier<GlyphID> &glyphs,
- unsigned int num_glyphs)
- {
-- TRACE_SERIALIZE ();
-+ TRACE_SERIALIZE (this);
- if (unlikely (!c->extend_min (*this))) return TRACE_RETURN (false);
- if (unlikely (!substitute.serialize (c, glyphs, num_glyphs))) return TRACE_RETURN (false);
- return TRACE_RETURN (true);
- }
-
-- public:
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (substitute.sanitize (c));
- }
-
-@@ -338,13 +307,9 @@
-
- struct MultipleSubstFormat1
- {
-- friend struct MultipleSubst;
--
-- private:
--
- inline void closure (hb_closure_context_t *c) const
- {
-- TRACE_CLOSURE ();
-+ TRACE_CLOSURE (this);
- Coverage::Iter iter;
- for (iter.init (this+coverage); iter.more (); iter.next ()) {
- if (c->glyphs->has (iter.get_glyph ()))
-@@ -354,6 +319,7 @@
-
- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
- {
-+ TRACE_COLLECT_GLYPHS (this);
- (this+coverage).add_coverage (&c->input);
- unsigned int count = sequence.len;
- for (unsigned int i = 0; i < count; i++)
-@@ -365,11 +331,17 @@
- return this+coverage;
- }
-
-+ inline bool would_apply (hb_would_apply_context_t *c) const
-+ {
-+ TRACE_WOULD_APPLY (this);
-+ return TRACE_RETURN (c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED);
-+ }
-+
- inline bool apply (hb_apply_context_t *c) const
- {
-- TRACE_APPLY ();
-+ TRACE_APPLY (this);
-
-- unsigned int index = (this+coverage) (c->buffer->cur().codepoint);
-+ unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
- if (likely (index == NOT_COVERED)) return TRACE_RETURN (false);
-
- return TRACE_RETURN ((this+sequence[index]).apply (c));
-@@ -381,7 +353,7 @@
- unsigned int num_glyphs,
- Supplier<GlyphID> &substitute_glyphs_list)
- {
-- TRACE_SERIALIZE ();
-+ TRACE_SERIALIZE (this);
- if (unlikely (!c->extend_min (*this))) return TRACE_RETURN (false);
- if (unlikely (!sequence.serialize (c, num_glyphs))) return TRACE_RETURN (false);
- for (unsigned int i = 0; i < num_glyphs; i++)
-@@ -394,7 +366,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (coverage.sanitize (c, this) && sequence.sanitize (c, this));
- }
-
-@@ -412,42 +384,13 @@
-
- struct MultipleSubst
- {
-- friend struct SubstLookupSubTable;
-- friend struct SubstLookup;
--
-- private:
--
-- inline void closure (hb_closure_context_t *c) const
-- {
-- TRACE_CLOSURE ();
-- switch (u.format) {
-- case 1: u.format1.closure (c); break;
-- default: break;
-- }
-- }
--
-- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
-- {
-- switch (u.format) {
-- case 1: u.format1.collect_glyphs (c); break;
-- default: break;
-- }
-- }
--
-- inline const Coverage &get_coverage (void) const
-- {
-- switch (u.format) {
-- case 1: return u.format1.get_coverage ();
-- default:return Null(Coverage);
-- }
-- }
--
-- inline bool apply (hb_apply_context_t *c) const
-+ template <typename context_t>
-+ inline typename context_t::return_t process (context_t *c) const
- {
-- TRACE_APPLY ();
-+ TRACE_PROCESS (this);
- switch (u.format) {
-- case 1: return TRACE_RETURN (u.format1.apply (c));
-- default:return TRACE_RETURN (false);
-+ case 1: return TRACE_RETURN (c->process (u.format1));
-+ default:return TRACE_RETURN (c->default_return_value ());
- }
- }
-
-@@ -457,7 +400,7 @@
- unsigned int num_glyphs,
- Supplier<GlyphID> &substitute_glyphs_list)
- {
-- TRACE_SERIALIZE ();
-+ TRACE_SERIALIZE (this);
- if (unlikely (!c->extend_min (u.format))) return TRACE_RETURN (false);
- unsigned int format = 1;
- u.format.set (format);
-@@ -468,7 +411,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- if (!u.format.sanitize (c)) return TRACE_RETURN (false);
- switch (u.format) {
- case 1: return TRACE_RETURN (u.format1.sanitize (c));
-@@ -489,13 +432,9 @@
-
- struct AlternateSubstFormat1
- {
-- friend struct AlternateSubst;
--
-- private:
--
- inline void closure (hb_closure_context_t *c) const
- {
-- TRACE_CLOSURE ();
-+ TRACE_CLOSURE (this);
- Coverage::Iter iter;
- for (iter.init (this+coverage); iter.more (); iter.next ()) {
- if (c->glyphs->has (iter.get_glyph ())) {
-@@ -509,6 +448,7 @@
-
- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
- {
-+ TRACE_COLLECT_GLYPHS (this);
- Coverage::Iter iter;
- for (iter.init (this+coverage); iter.more (); iter.next ()) {
- c->input.add (iter.get_glyph ());
-@@ -524,12 +464,18 @@
- return this+coverage;
- }
-
-+ inline bool would_apply (hb_would_apply_context_t *c) const
-+ {
-+ TRACE_WOULD_APPLY (this);
-+ return TRACE_RETURN (c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED);
-+ }
-+
- inline bool apply (hb_apply_context_t *c) const
- {
-- TRACE_APPLY ();
-+ TRACE_APPLY (this);
- hb_codepoint_t glyph_id = c->buffer->cur().codepoint;
-
-- unsigned int index = (this+coverage) (glyph_id);
-+ unsigned int index = (this+coverage).get_coverage (glyph_id);
- if (likely (index == NOT_COVERED)) return TRACE_RETURN (false);
-
- const AlternateSet &alt_set = this+alternateSet[index];
-@@ -558,7 +504,7 @@
- unsigned int num_glyphs,
- Supplier<GlyphID> &alternate_glyphs_list)
- {
-- TRACE_SERIALIZE ();
-+ TRACE_SERIALIZE (this);
- if (unlikely (!c->extend_min (*this))) return TRACE_RETURN (false);
- if (unlikely (!alternateSet.serialize (c, num_glyphs))) return TRACE_RETURN (false);
- for (unsigned int i = 0; i < num_glyphs; i++)
-@@ -571,7 +517,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (coverage.sanitize (c, this) && alternateSet.sanitize (c, this));
- }
-
-@@ -589,42 +535,13 @@
-
- struct AlternateSubst
- {
-- friend struct SubstLookupSubTable;
-- friend struct SubstLookup;
--
-- private:
--
-- inline void closure (hb_closure_context_t *c) const
-- {
-- TRACE_CLOSURE ();
-- switch (u.format) {
-- case 1: u.format1.closure (c); break;
-- default: break;
-- }
-- }
--
-- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
-- {
-- switch (u.format) {
-- case 1: u.format1.collect_glyphs (c); break;
-- default: break;
-- }
-- }
--
-- inline const Coverage &get_coverage (void) const
-- {
-- switch (u.format) {
-- case 1: return u.format1.get_coverage ();
-- default:return Null(Coverage);
-- }
-- }
--
-- inline bool apply (hb_apply_context_t *c) const
-+ template <typename context_t>
-+ inline typename context_t::return_t process (context_t *c) const
- {
-- TRACE_APPLY ();
-+ TRACE_PROCESS (this);
- switch (u.format) {
-- case 1: return TRACE_RETURN (u.format1.apply (c));
-- default:return TRACE_RETURN (false);
-+ case 1: return TRACE_RETURN (c->process (u.format1));
-+ default:return TRACE_RETURN (c->default_return_value ());
- }
- }
-
-@@ -634,7 +551,7 @@
- unsigned int num_glyphs,
- Supplier<GlyphID> &alternate_glyphs_list)
- {
-- TRACE_SERIALIZE ();
-+ TRACE_SERIALIZE (this);
- if (unlikely (!c->extend_min (u.format))) return TRACE_RETURN (false);
- unsigned int format = 1;
- u.format.set (format);
-@@ -645,7 +562,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- if (!u.format.sanitize (c)) return TRACE_RETURN (false);
- switch (u.format) {
- case 1: return TRACE_RETURN (u.format1.sanitize (c));
-@@ -663,13 +580,9 @@
-
- struct Ligature
- {
-- friend struct LigatureSet;
--
-- private:
--
- inline void closure (hb_closure_context_t *c) const
- {
-- TRACE_CLOSURE ();
-+ TRACE_CLOSURE (this);
- unsigned int count = component.len;
- for (unsigned int i = 1; i < count; i++)
- if (!c->glyphs->has (component[i]))
-@@ -679,6 +592,7 @@
-
- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
- {
-+ TRACE_COLLECT_GLYPHS (this);
- unsigned int count = component.len;
- for (unsigned int i = 1; i < count; i++)
- c->input.add (component[i]);
-@@ -687,25 +601,26 @@
-
- inline bool would_apply (hb_would_apply_context_t *c) const
- {
-+ TRACE_WOULD_APPLY (this);
- if (c->len != component.len)
-- return false;
-+ return TRACE_RETURN (false);
-
- for (unsigned int i = 1; i < c->len; i++)
- if (likely (c->glyphs[i] != component[i]))
-- return false;
-+ return TRACE_RETURN (false);
-
-- return true;
-+ return TRACE_RETURN (true);
- }
-
- inline bool apply (hb_apply_context_t *c) const
- {
-- TRACE_APPLY ();
-+ TRACE_APPLY (this);
- unsigned int count = component.len;
- if (unlikely (count < 1)) return TRACE_RETURN (false);
-
-- unsigned int end_offset;
-- bool is_mark_ligature;
-- unsigned int total_component_count;
-+ unsigned int end_offset = 0;
-+ bool is_mark_ligature = false;
-+ unsigned int total_component_count = 0;
-
- if (likely (!match_input (c, count,
- &component[1],
-@@ -736,7 +651,7 @@
- Supplier<GlyphID> &components, /* Starting from second */
- unsigned int num_components /* Including first component */)
- {
-- TRACE_SERIALIZE ();
-+ TRACE_SERIALIZE (this);
- if (unlikely (!c->extend_min (*this))) return TRACE_RETURN (false);
- ligGlyph = ligature;
- if (unlikely (!component.serialize (c, components, num_components))) return TRACE_RETURN (false);
-@@ -745,7 +660,7 @@
-
- public:
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (ligGlyph.sanitize (c) && component.sanitize (c));
- }
-
-@@ -761,13 +676,9 @@
-
- struct LigatureSet
- {
-- friend struct LigatureSubstFormat1;
--
-- private:
--
- inline void closure (hb_closure_context_t *c) const
- {
-- TRACE_CLOSURE ();
-+ TRACE_CLOSURE (this);
- unsigned int num_ligs = ligature.len;
- for (unsigned int i = 0; i < num_ligs; i++)
- (this+ligature[i]).closure (c);
-@@ -775,6 +686,7 @@
-
- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
- {
-+ TRACE_COLLECT_GLYPHS (this);
- unsigned int num_ligs = ligature.len;
- for (unsigned int i = 0; i < num_ligs; i++)
- (this+ligature[i]).collect_glyphs (c);
-@@ -782,19 +694,20 @@
-
- inline bool would_apply (hb_would_apply_context_t *c) const
- {
-+ TRACE_WOULD_APPLY (this);
- unsigned int num_ligs = ligature.len;
- for (unsigned int i = 0; i < num_ligs; i++)
- {
- const Ligature &lig = this+ligature[i];
- if (lig.would_apply (c))
-- return true;
-+ return TRACE_RETURN (true);
- }
-- return false;
-+ return TRACE_RETURN (false);
- }
-
- inline bool apply (hb_apply_context_t *c) const
- {
-- TRACE_APPLY ();
-+ TRACE_APPLY (this);
- unsigned int num_ligs = ligature.len;
- for (unsigned int i = 0; i < num_ligs; i++)
- {
-@@ -811,7 +724,7 @@
- unsigned int num_ligatures,
- Supplier<GlyphID> &component_list /* Starting from second for each ligature */)
- {
-- TRACE_SERIALIZE ();
-+ TRACE_SERIALIZE (this);
- if (unlikely (!c->extend_min (*this))) return TRACE_RETURN (false);
- if (unlikely (!ligature.serialize (c, num_ligatures))) return TRACE_RETURN (false);
- for (unsigned int i = 0; i < num_ligatures; i++)
-@@ -824,9 +737,8 @@
- return TRACE_RETURN (true);
- }
-
-- public:
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (ligature.sanitize (c, this));
- }
-
-@@ -840,13 +752,9 @@
-
- struct LigatureSubstFormat1
- {
-- friend struct LigatureSubst;
--
-- private:
--
- inline void closure (hb_closure_context_t *c) const
- {
-- TRACE_CLOSURE ();
-+ TRACE_CLOSURE (this);
- Coverage::Iter iter;
- for (iter.init (this+coverage); iter.more (); iter.next ()) {
- if (c->glyphs->has (iter.get_glyph ()))
-@@ -856,6 +764,7 @@
-
- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
- {
-+ TRACE_COLLECT_GLYPHS (this);
- Coverage::Iter iter;
- for (iter.init (this+coverage); iter.more (); iter.next ()) {
- c->input.add (iter.get_glyph ());
-@@ -870,15 +779,20 @@
-
- inline bool would_apply (hb_would_apply_context_t *c) const
- {
-- return (this+ligatureSet[(this+coverage) (c->glyphs[0])]).would_apply (c);
-+ TRACE_WOULD_APPLY (this);
-+ unsigned int index = (this+coverage).get_coverage (c->glyphs[0]);
-+ if (likely (index == NOT_COVERED)) return TRACE_RETURN (false);
-+
-+ const LigatureSet &lig_set = this+ligatureSet[index];
-+ return TRACE_RETURN (lig_set.would_apply (c));
- }
-
- inline bool apply (hb_apply_context_t *c) const
- {
-- TRACE_APPLY ();
-+ TRACE_APPLY (this);
- hb_codepoint_t glyph_id = c->buffer->cur().codepoint;
-
-- unsigned int index = (this+coverage) (glyph_id);
-+ unsigned int index = (this+coverage).get_coverage (glyph_id);
- if (likely (index == NOT_COVERED)) return TRACE_RETURN (false);
-
- const LigatureSet &lig_set = this+ligatureSet[index];
-@@ -893,7 +807,7 @@
- Supplier<unsigned int> &component_count_list,
- Supplier<GlyphID> &component_list /* Starting from second for each ligature */)
- {
-- TRACE_SERIALIZE ();
-+ TRACE_SERIALIZE (this);
- if (unlikely (!c->extend_min (*this))) return TRACE_RETURN (false);
- if (unlikely (!ligatureSet.serialize (c, num_first_glyphs))) return TRACE_RETURN (false);
- for (unsigned int i = 0; i < num_first_glyphs; i++)
-@@ -908,7 +822,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (coverage.sanitize (c, this) && ligatureSet.sanitize (c, this));
- }
-
-@@ -926,50 +840,13 @@
-
- struct LigatureSubst
- {
-- friend struct SubstLookupSubTable;
-- friend struct SubstLookup;
--
-- private:
--
-- inline void closure (hb_closure_context_t *c) const
-- {
-- TRACE_CLOSURE ();
-- switch (u.format) {
-- case 1: u.format1.closure (c); break;
-- default: break;
-- }
-- }
--
-- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
-- {
-- switch (u.format) {
-- case 1: u.format1.collect_glyphs (c); break;
-- default: break;
-- }
-- }
--
-- inline const Coverage &get_coverage (void) const
-- {
-- switch (u.format) {
-- case 1: return u.format1.get_coverage ();
-- default:return Null(Coverage);
-- }
-- }
--
-- inline bool would_apply (hb_would_apply_context_t *c) const
-- {
-- switch (u.format) {
-- case 1: return u.format1.would_apply (c);
-- default:return false;
-- }
-- }
--
-- inline bool apply (hb_apply_context_t *c) const
-+ template <typename context_t>
-+ inline typename context_t::return_t process (context_t *c) const
- {
-- TRACE_APPLY ();
-+ TRACE_PROCESS (this);
- switch (u.format) {
-- case 1: return TRACE_RETURN (u.format1.apply (c));
-- default:return TRACE_RETURN (false);
-+ case 1: return TRACE_RETURN (c->process (u.format1));
-+ default:return TRACE_RETURN (c->default_return_value ());
- }
- }
-
-@@ -981,7 +858,7 @@
- Supplier<unsigned int> &component_count_list,
- Supplier<GlyphID> &component_list /* Starting from second for each ligature */)
- {
-- TRACE_SERIALIZE ();
-+ TRACE_SERIALIZE (this);
- if (unlikely (!c->extend_min (u.format))) return TRACE_RETURN (false);
- unsigned int format = 1;
- u.format.set (format);
-@@ -993,7 +870,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- if (!u.format.sanitize (c)) return TRACE_RETURN (false);
- switch (u.format) {
- case 1: return TRACE_RETURN (u.format1.sanitize (c));
-@@ -1009,83 +886,13 @@
- };
-
-
--static inline bool substitute_lookup (hb_apply_context_t *c, unsigned int lookup_index);
--static inline void closure_lookup (hb_closure_context_t *c, unsigned int lookup_index);
--static inline void collect_glyphs_lookup (hb_collect_glyphs_context_t *c, unsigned int lookup_index);
--
--struct ContextSubst : Context
--{
-- friend struct SubstLookupSubTable;
--
-- private:
--
-- inline void closure (hb_closure_context_t *c) const
-- {
-- TRACE_CLOSURE ();
-- return Context::closure (c, closure_lookup);
-- }
--
-- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
-- {
-- return Context::collect_glyphs (c, collect_glyphs_lookup);
-- }
--
-- inline bool apply (hb_apply_context_t *c) const
-- {
-- TRACE_APPLY ();
-- return TRACE_RETURN (Context::apply (c, substitute_lookup));
-- }
--};
--
--struct ChainContextSubst : ChainContext
--{
-- friend struct SubstLookupSubTable;
--
-- private:
-+struct ContextSubst : Context {};
-
-- inline void closure (hb_closure_context_t *c) const
-- {
-- TRACE_CLOSURE ();
-- return ChainContext::closure (c, closure_lookup);
-- }
-+struct ChainContextSubst : ChainContext {};
-
-- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
-- {
-- return ChainContext::collect_glyphs (c, collect_glyphs_lookup);
-- }
--
-- inline bool apply (hb_apply_context_t *c) const
-- {
-- TRACE_APPLY ();
-- return TRACE_RETURN (ChainContext::apply (c, substitute_lookup));
-- }
--};
--
--
--struct ExtensionSubst : Extension
-+struct ExtensionSubst : Extension<ExtensionSubst>
- {
-- friend struct SubstLookupSubTable;
-- friend struct SubstLookup;
--
-- private:
-- inline const struct SubstLookupSubTable& get_subtable (void) const
-- {
-- unsigned int offset = get_offset ();
-- if (unlikely (!offset)) return Null(SubstLookupSubTable);
-- return StructAtOffset<SubstLookupSubTable> (this, offset);
-- }
--
-- inline void closure (hb_closure_context_t *c) const;
--
-- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const;
--
-- inline const Coverage &get_coverage (void) const;
--
-- inline bool would_apply (hb_would_apply_context_t *c) const;
--
-- inline bool apply (hb_apply_context_t *c) const;
--
-- inline bool sanitize (hb_sanitize_context_t *c);
-+ typedef struct SubstLookupSubTable LookupSubTable;
-
- inline bool is_reverse (void) const;
- };
-@@ -1093,13 +900,9 @@
-
- struct ReverseChainSingleSubstFormat1
- {
-- friend struct ReverseChainSingleSubst;
--
-- private:
--
- inline void closure (hb_closure_context_t *c) const
- {
-- TRACE_CLOSURE ();
-+ TRACE_CLOSURE (this);
- const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
-
- unsigned int count;
-@@ -1124,6 +927,8 @@
-
- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
- {
-+ TRACE_COLLECT_GLYPHS (this);
-+
- const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
-
- unsigned int count;
-@@ -1149,13 +954,19 @@
- return this+coverage;
- }
-
-+ inline bool would_apply (hb_would_apply_context_t *c) const
-+ {
-+ TRACE_WOULD_APPLY (this);
-+ return TRACE_RETURN (c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED);
-+ }
-+
- inline bool apply (hb_apply_context_t *c) const
- {
-- TRACE_APPLY ();
-+ TRACE_APPLY (this);
- if (unlikely (c->nesting_level_left != MAX_NESTING_LEVEL))
- return TRACE_RETURN (false); /* No chaining to this type */
-
-- unsigned int index = (this+coverage) (c->buffer->cur().codepoint);
-+ unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
- if (likely (index == NOT_COVERED)) return TRACE_RETURN (false);
-
- const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
-@@ -1178,7 +989,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- if (!(coverage.sanitize (c, this) && backtrack.sanitize (c, this)))
- return TRACE_RETURN (false);
- OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
-@@ -1210,46 +1021,18 @@
-
- struct ReverseChainSingleSubst
- {
-- friend struct SubstLookupSubTable;
--
-- private:
--
-- inline void closure (hb_closure_context_t *c) const
-- {
-- TRACE_CLOSURE ();
-- switch (u.format) {
-- case 1: u.format1.closure (c); break;
-- default: break;
-- }
-- }
--
-- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
-- {
-- switch (u.format) {
-- case 1: u.format1.collect_glyphs (c); break;
-- default: break;
-- }
-- }
--
-- inline const Coverage &get_coverage (void) const
-- {
-- switch (u.format) {
-- case 1: return u.format1.get_coverage ();
-- default:return Null(Coverage);
-- }
-- }
--
-- inline bool apply (hb_apply_context_t *c) const
-+ template <typename context_t>
-+ inline typename context_t::return_t process (context_t *c) const
- {
-- TRACE_APPLY ();
-+ TRACE_PROCESS (this);
- switch (u.format) {
-- case 1: return TRACE_RETURN (u.format1.apply (c));
-- default:return TRACE_RETURN (false);
-+ case 1: return TRACE_RETURN (c->process (u.format1));
-+ default:return TRACE_RETURN (c->default_return_value ());
- }
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- if (!u.format.sanitize (c)) return TRACE_RETURN (false);
- switch (u.format) {
- case 1: return TRACE_RETURN (u.format1.sanitize (c));
-@@ -1285,98 +1068,25 @@
- ReverseChainSingle = 8
- };
-
-- inline void closure (hb_closure_context_t *c,
-- unsigned int lookup_type) const
-+ template <typename context_t>
-+ inline typename context_t::return_t process (context_t *c, unsigned int lookup_type) const
- {
-- TRACE_CLOSURE ();
-+ TRACE_PROCESS (this);
- switch (lookup_type) {
-- case Single: u.single.closure (c); break;
-- case Multiple: u.multiple.closure (c); break;
-- case Alternate: u.alternate.closure (c); break;
-- case Ligature: u.ligature.closure (c); break;
-- case Context: u.context.closure (c); break;
-- case ChainContext: u.chainContext.closure (c); break;
-- case Extension: u.extension.closure (c); break;
-- case ReverseChainSingle: u.reverseChainContextSingle.closure (c); break;
-- default: break;
-- }
-- }
--
-- inline void collect_glyphs (hb_collect_glyphs_context_t *c,
-- unsigned int lookup_type) const
-- {
-- switch (lookup_type) {
-- case Single: u.single.collect_glyphs (c); break;
-- case Multiple: u.multiple.collect_glyphs (c); break;
-- case Alternate: u.alternate.collect_glyphs (c); break;
-- case Ligature: u.ligature.collect_glyphs (c); break;
-- case Context: u.context.collect_glyphs (c); break;
-- case ChainContext: u.chainContext.collect_glyphs (c); break;
-- case Extension: u.extension.collect_glyphs (c); break;
-- case ReverseChainSingle: u.reverseChainContextSingle.collect_glyphs (c); break;
-- default: break;
-- }
-- }
--
-- inline const Coverage &get_coverage (unsigned int lookup_type) const
-- {
-- switch (lookup_type) {
-- case Single: return u.single.get_coverage ();
-- case Multiple: return u.multiple.get_coverage ();
-- case Alternate: return u.alternate.get_coverage ();
-- case Ligature: return u.ligature.get_coverage ();
-- case Context: return u.context.get_coverage ();
-- case ChainContext: return u.chainContext.get_coverage ();
-- case Extension: return u.extension.get_coverage ();
-- case ReverseChainSingle: return u.reverseChainContextSingle.get_coverage ();
-- default: return Null(Coverage);
-- }
-- }
--
-- inline bool would_apply (hb_would_apply_context_t *c,
-- unsigned int lookup_type) const
-- {
-- TRACE_WOULD_APPLY ();
-- if (get_coverage (lookup_type).get_coverage (c->glyphs[0]) == NOT_COVERED) return false;
-- if (c->len == 1) {
-- switch (lookup_type) {
-- case Single:
-- case Multiple:
-- case Alternate:
-- case ReverseChainSingle:
-- return true;
-- }
-- }
--
-- /* Only need to look further for lookups that support substitutions
-- * of input longer than 1. */
-- switch (lookup_type) {
-- case Ligature: return u.ligature.would_apply (c);
-- case Context: return u.context.would_apply (c);
-- case ChainContext: return u.chainContext.would_apply (c);
-- case Extension: return u.extension.would_apply (c);
-- default: return false;
-- }
-- }
--
-- inline bool apply (hb_apply_context_t *c, unsigned int lookup_type) const
-- {
-- TRACE_APPLY ();
-- switch (lookup_type) {
-- case Single: return TRACE_RETURN (u.single.apply (c));
-- case Multiple: return TRACE_RETURN (u.multiple.apply (c));
-- case Alternate: return TRACE_RETURN (u.alternate.apply (c));
-- case Ligature: return TRACE_RETURN (u.ligature.apply (c));
-- case Context: return TRACE_RETURN (u.context.apply (c));
-- case ChainContext: return TRACE_RETURN (u.chainContext.apply (c));
-- case Extension: return TRACE_RETURN (u.extension.apply (c));
-- case ReverseChainSingle: return TRACE_RETURN (u.reverseChainContextSingle.apply (c));
-- default: return TRACE_RETURN (false);
-+ case Single: return TRACE_RETURN (u.single.process (c));
-+ case Multiple: return TRACE_RETURN (u.multiple.process (c));
-+ case Alternate: return TRACE_RETURN (u.alternate.process (c));
-+ case Ligature: return TRACE_RETURN (u.ligature.process (c));
-+ case Context: return TRACE_RETURN (u.context.process (c));
-+ case ChainContext: return TRACE_RETURN (u.chainContext.process (c));
-+ case Extension: return TRACE_RETURN (u.extension.process (c));
-+ case ReverseChainSingle: return TRACE_RETURN (u.reverseChainContextSingle.process (c));
-+ default: return TRACE_RETURN (c->default_return_value ());
- }
- }
-
- inline bool sanitize (hb_sanitize_context_t *c, unsigned int lookup_type) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- if (!u.header.sub_format.sanitize (c))
- return TRACE_RETURN (false);
- switch (lookup_type) {
-@@ -1427,63 +1137,68 @@
- return lookup_type_is_reverse (type);
- }
-
-- inline void closure (hb_closure_context_t *c) const
-+ template <typename context_t>
-+ inline typename context_t::return_t process (context_t *c) const
- {
-+ TRACE_PROCESS (this);
- unsigned int lookup_type = get_type ();
- unsigned int count = get_subtable_count ();
-- for (unsigned int i = 0; i < count; i++)
-- get_subtable (i).closure (c, lookup_type);
-+ for (unsigned int i = 0; i < count; i++) {
-+ typename context_t::return_t r = get_subtable (i).process (c, lookup_type);
-+ if (c->stop_sublookup_iteration (r))
-+ return TRACE_RETURN (r);
-+ }
-+ return TRACE_RETURN (c->default_return_value ());
-+ }
-+ template <typename context_t>
-+ static inline typename context_t::return_t process_recurse_func (context_t *c, unsigned int lookup_index);
-+
-+ inline hb_closure_context_t::return_t closure (hb_closure_context_t *c) const
-+ {
-+ TRACE_CLOSURE (this);
-+ c->set_recurse_func (process_recurse_func<hb_closure_context_t>);
-+ return TRACE_RETURN (process (c));
-+ }
-+
-+ inline hb_collect_glyphs_context_t::return_t collect_glyphs_lookup (hb_collect_glyphs_context_t *c) const
-+ {
-+ TRACE_COLLECT_GLYPHS (this);
-+ c->set_recurse_func (process_recurse_func<hb_collect_glyphs_context_t>);
-+ return TRACE_RETURN (process (c));
- }
-
- template <typename set_t>
- inline void add_coverage (set_t *glyphs) const
- {
-+ hb_get_coverage_context_t c;
- const Coverage *last = NULL;
- unsigned int count = get_subtable_count ();
- for (unsigned int i = 0; i < count; i++) {
-- const Coverage *c = &get_subtable (i).get_coverage (get_type ());
-- if (c != last) {
-- c->add_coverage (glyphs);
-- last = c;
-+ const Coverage *coverage = &get_subtable (i).process (&c, get_type ());
-+ if (coverage != last) {
-+ coverage->add_coverage (glyphs);
-+ last = coverage;
- }
- }
- }
-
-- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
-- {
-- unsigned int lookup_type = get_type ();
-- unsigned int count = get_subtable_count ();
-- for (unsigned int i = 0; i < count; i++)
-- get_subtable (i).collect_glyphs (c, lookup_type);
-- }
--
- inline bool would_apply (hb_would_apply_context_t *c, const hb_set_digest_t *digest) const
- {
-- if (unlikely (!c->len)) return false;
-- if (!digest->may_have (c->glyphs[0])) return false;
-- unsigned int lookup_type = get_type ();
-- unsigned int count = get_subtable_count ();
-- for (unsigned int i = 0; i < count; i++)
-- if (get_subtable (i).would_apply (c, lookup_type))
-- return true;
-- return false;
-+ TRACE_WOULD_APPLY (this);
-+ if (unlikely (!c->len)) return TRACE_RETURN (false);
-+ if (!digest->may_have (c->glyphs[0])) return TRACE_RETURN (false);
-+ return TRACE_RETURN (process (c));
- }
-
- inline bool apply_once (hb_apply_context_t *c) const
- {
-- unsigned int lookup_type = get_type ();
--
-+ TRACE_APPLY (this);
- if (!c->check_glyph_property (&c->buffer->cur(), c->lookup_props, &c->property))
-- return false;
--
-- unsigned int count = get_subtable_count ();
-- for (unsigned int i = 0; i < count; i++)
-- if (get_subtable (i).apply (c, lookup_type))
-- return true;
--
-- return false;
-+ return TRACE_RETURN (false);
-+ return TRACE_RETURN (process (c));
- }
-
-+ static bool apply_recurse_func (hb_apply_context_t *c, unsigned int lookup_index);
- inline bool apply_string (hb_apply_context_t *c, const hb_set_digest_t *digest) const
- {
- bool ret = false;
-@@ -1491,6 +1206,7 @@
- if (unlikely (!c->buffer->len || !c->lookup_mask))
- return false;
-
-+ c->set_recurse_func (apply_recurse_func);
- c->set_lookup (*this);
-
- if (likely (!is_reverse ()))
-@@ -1532,11 +1248,9 @@
- return ret;
- }
-
-- private:
- inline SubstLookupSubTable& serialize_subtable (hb_serialize_context_t *c,
- unsigned int i)
- { return CastR<OffsetArrayOf<SubstLookupSubTable> > (subTable)[i].serialize (c, this); }
-- public:
-
- inline bool serialize_single (hb_serialize_context_t *c,
- uint32_t lookup_props,
-@@ -1544,7 +1258,7 @@
- Supplier<GlyphID> &substitutes,
- unsigned int num_glyphs)
- {
-- TRACE_SERIALIZE ();
-+ TRACE_SERIALIZE (this);
- if (unlikely (!Lookup::serialize (c, SubstLookupSubTable::Single, lookup_props, 1))) return TRACE_RETURN (false);
- return TRACE_RETURN (serialize_subtable (c, 0).u.single.serialize (c, glyphs, substitutes, num_glyphs));
- }
-@@ -1556,7 +1270,7 @@
- unsigned int num_glyphs,
- Supplier<GlyphID> &substitute_glyphs_list)
- {
-- TRACE_SERIALIZE ();
-+ TRACE_SERIALIZE (this);
- if (unlikely (!Lookup::serialize (c, SubstLookupSubTable::Multiple, lookup_props, 1))) return TRACE_RETURN (false);
- return TRACE_RETURN (serialize_subtable (c, 0).u.multiple.serialize (c, glyphs, substitute_len_list, num_glyphs,
- substitute_glyphs_list));
-@@ -1569,7 +1283,7 @@
- unsigned int num_glyphs,
- Supplier<GlyphID> &alternate_glyphs_list)
- {
-- TRACE_SERIALIZE ();
-+ TRACE_SERIALIZE (this);
- if (unlikely (!Lookup::serialize (c, SubstLookupSubTable::Alternate, lookup_props, 1))) return TRACE_RETURN (false);
- return TRACE_RETURN (serialize_subtable (c, 0).u.alternate.serialize (c, glyphs, alternate_len_list, num_glyphs,
- alternate_glyphs_list));
-@@ -1584,7 +1298,7 @@
- Supplier<unsigned int> &component_count_list,
- Supplier<GlyphID> &component_list /* Starting from second for each ligature */)
- {
-- TRACE_SERIALIZE ();
-+ TRACE_SERIALIZE (this);
- if (unlikely (!Lookup::serialize (c, SubstLookupSubTable::Ligature, lookup_props, 1))) return TRACE_RETURN (false);
- return TRACE_RETURN (serialize_subtable (c, 0).u.ligature.serialize (c, first_glyphs, ligature_per_first_glyph_count_list, num_first_glyphs,
- ligatures_list, component_count_list, component_list));
-@@ -1592,7 +1306,7 @@
-
- inline bool sanitize (hb_sanitize_context_t *c)
- {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- if (unlikely (!Lookup::sanitize (c))) return TRACE_RETURN (false);
- OffsetArrayOf<SubstLookupSubTable> &list = CastR<OffsetArrayOf<SubstLookupSubTable> > (subTable);
- if (unlikely (!list.sanitize (c, this, get_type ()))) return TRACE_RETURN (false);
-@@ -1634,12 +1348,8 @@
- static inline void substitute_start (hb_font_t *font, hb_buffer_t *buffer);
- static inline void substitute_finish (hb_font_t *font, hb_buffer_t *buffer);
-
-- inline void closure_lookup (hb_closure_context_t *c,
-- unsigned int lookup_index) const
-- { return get_lookup (lookup_index).closure (c); }
--
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- if (unlikely (!GSUBGPOS::sanitize (c))) return TRACE_RETURN (false);
- OffsetTo<SubstLookupList> &list = CastR<OffsetTo<SubstLookupList> > (lookupList);
- return TRACE_RETURN (list.sanitize (c, this));
-@@ -1672,83 +1382,33 @@
-
- /* Out-of-class implementation for methods recursing */
-
--inline void ExtensionSubst::closure (hb_closure_context_t *c) const
--{
-- get_subtable ().closure (c, get_type ());
--}
--
--inline void ExtensionSubst::collect_glyphs (hb_collect_glyphs_context_t *c) const
--{
-- get_subtable ().collect_glyphs (c, get_type ());
--}
--
--inline const Coverage & ExtensionSubst::get_coverage (void) const
--{
-- return get_subtable ().get_coverage (get_type ());
--}
--
--inline bool ExtensionSubst::would_apply (hb_would_apply_context_t *c) const
--{
-- return get_subtable ().would_apply (c, get_type ());
--}
--
--inline bool ExtensionSubst::apply (hb_apply_context_t *c) const
--{
-- TRACE_APPLY ();
-- return TRACE_RETURN (get_subtable ().apply (c, get_type ()));
--}
--
--inline bool ExtensionSubst::sanitize (hb_sanitize_context_t *c)
--{
-- TRACE_SANITIZE ();
-- if (unlikely (!Extension::sanitize (c))) return TRACE_RETURN (false);
-- unsigned int offset = get_offset ();
-- if (unlikely (!offset)) return TRACE_RETURN (true);
-- return TRACE_RETURN (StructAtOffset<SubstLookupSubTable> (this, offset).sanitize (c, get_type ()));
--}
--
- inline bool ExtensionSubst::is_reverse (void) const
- {
- unsigned int type = get_type ();
- if (unlikely (type == SubstLookupSubTable::Extension))
-- return CastR<ExtensionSubst> (get_subtable()).is_reverse ();
-+ return CastR<ExtensionSubst> (get_subtable<SubstLookupSubTable>()).is_reverse ();
- return SubstLookup::lookup_type_is_reverse (type);
- }
-
--static inline void closure_lookup (hb_closure_context_t *c, unsigned int lookup_index)
--{
-- const GSUB &gsub = *(hb_ot_layout_from_face (c->face)->gsub);
-- const SubstLookup &l = gsub.get_lookup (lookup_index);
--
-- if (unlikely (c->nesting_level_left == 0))
-- return;
--
-- c->nesting_level_left--;
-- l.closure (c);
-- c->nesting_level_left++;
--}
--
--static inline void collect_glyphs_lookup (hb_collect_glyphs_context_t *c, unsigned int lookup_index)
-+template <typename context_t>
-+inline typename context_t::return_t SubstLookup::process_recurse_func (context_t *c, unsigned int lookup_index)
- {
- const GSUB &gsub = *(hb_ot_layout_from_face (c->face)->gsub);
- const SubstLookup &l = gsub.get_lookup (lookup_index);
--
-- /* XXX TODO */
-- l.collect_glyphs (c);
-+ return l.process (c);
- }
-
--static inline bool substitute_lookup (hb_apply_context_t *c, unsigned int lookup_index)
-+inline bool SubstLookup::apply_recurse_func (hb_apply_context_t *c, unsigned int lookup_index)
- {
- const GSUB &gsub = *(hb_ot_layout_from_face (c->face)->gsub);
- const SubstLookup &l = gsub.get_lookup (lookup_index);
--
-- if (unlikely (c->nesting_level_left == 0))
-- return false;
--
-- hb_apply_context_t new_c (*c);
-- new_c.nesting_level_left--;
-- new_c.set_lookup (l);
-- return l.apply_once (&new_c);
-+ unsigned int saved_lookup_props = c->lookup_props;
-+ unsigned int saved_property = c->property;
-+ c->set_lookup (l);
-+ bool ret = l.apply_once (c);
-+ c->lookup_props = saved_lookup_props;
-+ c->property = saved_property;
-+ return ret;
- }
-
-
-diff -ur harfbuzz-0.9.7.orig/src/hb-ot-layout-gsubgpos-private.hh harfbuzz-0.9.7/src/hb-ot-layout-gsubgpos-private.hh
---- harfbuzz-0.9.7.orig/src/hb-ot-layout-gsubgpos-private.hh 2012-11-21 04:48:45.000000000 +0100
-+++ harfbuzz-0.9.7/src/hb-ot-layout-gsubgpos-private.hh 2012-11-28 09:32:35.000000000 +0100
-@@ -37,44 +37,83 @@
- namespace OT {
-
-
-+
-+#define TRACE_PROCESS(this) \
-+ hb_auto_trace_t<context_t::max_debug_depth, typename context_t::return_t> trace \
-+ (&c->debug_depth, c->get_name (), this, HB_FUNC, \
-+ "");
-+
-+
- #ifndef HB_DEBUG_CLOSURE
- #define HB_DEBUG_CLOSURE (HB_DEBUG+0)
- #endif
-
--#define TRACE_CLOSURE() \
-- hb_auto_trace_t<HB_DEBUG_CLOSURE> trace (&c->debug_depth, "CLOSURE", this, HB_FUNC, "");
--
-+#define TRACE_CLOSURE(this) \
-+ hb_auto_trace_t<HB_DEBUG_CLOSURE, void_t> trace \
-+ (&c->debug_depth, c->get_name (), this, HB_FUNC, \
-+ "");
-
- struct hb_closure_context_t
- {
-+ inline const char *get_name (void) { return "CLOSURE"; }
-+ static const unsigned int max_debug_depth = HB_DEBUG_CLOSURE;
-+ typedef void_t return_t;
-+ typedef return_t (*recurse_func_t) (hb_closure_context_t *c, unsigned int lookup_index);
-+ template <typename T>
-+ inline return_t process (const T &obj) { obj.closure (this); return VOID; }
-+ static return_t default_return_value (void) { return VOID; }
-+ bool stop_sublookup_iteration (const return_t r) const { return false; }
-+ return_t recurse (unsigned int lookup_index)
-+ {
-+ if (unlikely (nesting_level_left == 0 || !recurse_func))
-+ return default_return_value ();
-+
-+ nesting_level_left--;
-+ recurse_func (this, lookup_index);
-+ nesting_level_left++;
-+ return default_return_value ();
-+ }
-+
- hb_face_t *face;
- hb_set_t *glyphs;
-+ recurse_func_t recurse_func;
- unsigned int nesting_level_left;
- unsigned int debug_depth;
-
--
- hb_closure_context_t (hb_face_t *face_,
- hb_set_t *glyphs_,
- unsigned int nesting_level_left_ = MAX_NESTING_LEVEL) :
- face (face_),
- glyphs (glyphs_),
-+ recurse_func (NULL),
- nesting_level_left (nesting_level_left_),
- debug_depth (0) {}
-+
-+ void set_recurse_func (recurse_func_t func) { recurse_func = func; }
- };
-
-
-
--/* TODO Add TRACE_RETURN annotation to gsub. */
- #ifndef HB_DEBUG_WOULD_APPLY
- #define HB_DEBUG_WOULD_APPLY (HB_DEBUG+0)
- #endif
-
--#define TRACE_WOULD_APPLY() \
-- hb_auto_trace_t<HB_DEBUG_WOULD_APPLY> trace (&c->debug_depth, "WOULD_APPLY", this, HB_FUNC, "%d glyphs", c->len);
--
-+#define TRACE_WOULD_APPLY(this) \
-+ hb_auto_trace_t<HB_DEBUG_WOULD_APPLY, bool> trace \
-+ (&c->debug_depth, c->get_name (), this, HB_FUNC, \
-+ "%d glyphs", c->len);
-
- struct hb_would_apply_context_t
- {
-+ inline const char *get_name (void) { return "WOULD_APPLY"; }
-+ static const unsigned int max_debug_depth = HB_DEBUG_WOULD_APPLY;
-+ typedef bool return_t;
-+ template <typename T>
-+ inline return_t process (const T &obj) { return obj.would_apply (this); }
-+ static return_t default_return_value (void) { return false; }
-+ bool stop_sublookup_iteration (const return_t r) const { return r; }
-+ return_t recurse (unsigned int lookup_index) { return true; }
-+
- hb_face_t *face;
- const hb_codepoint_t *glyphs;
- unsigned int len;
-@@ -89,40 +128,85 @@
- glyphs (glyphs_),
- len (len_),
- zero_context (zero_context_),
-- debug_depth (0) {};
-+ debug_depth (0) {}
- };
-
-
-
--/* TODO Add TRACE_RETURN annotation to gsub. */
- #ifndef HB_DEBUG_COLLECT_GLYPHS
- #define HB_DEBUG_COLLECT_GLYPHS (HB_DEBUG+0)
- #endif
-
--#define TRACE_COLLECT_GLYPHS() \
-- hb_auto_trace_t<HB_DEBUG_COLLECT_GLYPHS> trace (&c->debug_depth, "COLLECT_GLYPHS", this, HB_FUNC, "");
--
-+#define TRACE_COLLECT_GLYPHS(this) \
-+ hb_auto_trace_t<HB_DEBUG_COLLECT_GLYPHS, void_t> trace \
-+ (&c->debug_depth, c->get_name (), this, HB_FUNC, \
-+ "");
-
- struct hb_collect_glyphs_context_t
- {
-+ inline const char *get_name (void) { return "COLLECT_GLYPHS"; }
-+ static const unsigned int max_debug_depth = HB_DEBUG_COLLECT_GLYPHS;
-+ typedef void_t return_t;
-+ typedef return_t (*recurse_func_t) (hb_collect_glyphs_context_t *c, unsigned int lookup_index);
-+ template <typename T>
-+ inline return_t process (const T &obj) { obj.collect_glyphs (this); return VOID; }
-+ static return_t default_return_value (void) { return VOID; }
-+ bool stop_sublookup_iteration (const return_t r) const { return false; }
-+ return_t recurse (unsigned int lookup_index)
-+ {
-+ if (unlikely (nesting_level_left == 0 || !recurse_func))
-+ return default_return_value ();
-+
-+ nesting_level_left--;
-+ /* Only collect output glyphs in the recursion. */
-+ hb_collect_glyphs_context_t new_c (this->face, NULL, NULL, NULL, &output, nesting_level_left);
-+ recurse_func (&new_c, lookup_index);
-+ nesting_level_left++;
-+ return default_return_value ();
-+ }
-+
- hb_face_t *face;
- hb_set_t &before;
- hb_set_t &input;
- hb_set_t &after;
- hb_set_t &output;
-+ recurse_func_t recurse_func;
-+ unsigned int nesting_level_left;
- unsigned int debug_depth;
-
- hb_collect_glyphs_context_t (hb_face_t *face_,
- hb_set_t *glyphs_before, /* OUT. May be NULL */
- hb_set_t *glyphs_input, /* OUT. May be NULL */
- hb_set_t *glyphs_after, /* OUT. May be NULL */
-- hb_set_t *glyphs_output /* OUT. May be NULL */) :
-+ hb_set_t *glyphs_output, /* OUT. May be NULL */
-+ unsigned int nesting_level_left_ = MAX_NESTING_LEVEL) :
- face (face_),
- before (glyphs_before ? *glyphs_before : *hb_set_get_empty ()),
- input (glyphs_input ? *glyphs_input : *hb_set_get_empty ()),
- after (glyphs_after ? *glyphs_after : *hb_set_get_empty ()),
- output (glyphs_output ? *glyphs_output : *hb_set_get_empty ()),
-- debug_depth (0) {};
-+ recurse_func (NULL),
-+ nesting_level_left (nesting_level_left_),
-+ debug_depth (0) {}
-+
-+ void set_recurse_func (recurse_func_t func) { recurse_func = func; }
-+};
-+
-+
-+
-+struct hb_get_coverage_context_t
-+{
-+ inline const char *get_name (void) { return "GET_COVERAGE"; }
-+ static const unsigned int max_debug_depth = 0;
-+ typedef const Coverage &return_t;
-+ template <typename T>
-+ inline return_t process (const T &obj) { return obj.get_coverage (); }
-+ static return_t default_return_value (void) { return Null(Coverage); }
-+
-+ hb_get_coverage_context_t (void) :
-+ debug_depth (0) {}
-+
-+ unsigned int debug_depth;
- };
-
-
-@@ -131,23 +215,44 @@
- #define HB_DEBUG_APPLY (HB_DEBUG+0)
- #endif
-
--#define TRACE_APPLY() \
-- hb_auto_trace_t<HB_DEBUG_APPLY> trace (&c->debug_depth, "APPLY", this, HB_FUNC, "idx %d codepoint %u", c->buffer->idx, c->buffer->cur().codepoint);
--
-+#define TRACE_APPLY(this) \
-+ hb_auto_trace_t<HB_DEBUG_APPLY, bool> trace \
-+ (&c->debug_depth, c->get_name (), this, HB_FUNC, \
-+ "idx %d codepoint %u", c->buffer->idx, c->buffer->cur().codepoint);
-
- struct hb_apply_context_t
- {
-+ inline const char *get_name (void) { return "APPLY"; }
-+ static const unsigned int max_debug_depth = HB_DEBUG_APPLY;
-+ typedef bool return_t;
-+ typedef return_t (*recurse_func_t) (hb_apply_context_t *c, unsigned int lookup_index);
-+ template <typename T>
-+ inline return_t process (const T &obj) { return obj.apply (this); }
-+ static return_t default_return_value (void) { return false; }
-+ bool stop_sublookup_iteration (const return_t r) const { return r; }
-+ return_t recurse (unsigned int lookup_index)
-+ {
-+ if (unlikely (nesting_level_left == 0 || !recurse_func))
-+ return default_return_value ();
-+
-+ nesting_level_left--;
-+ recurse_func (this, lookup_index);
-+ nesting_level_left++;
-+ return default_return_value ();
-+ }
-+
- hb_font_t *font;
- hb_face_t *face;
- hb_buffer_t *buffer;
- hb_direction_t direction;
- hb_mask_t lookup_mask;
-+ recurse_func_t recurse_func;
- unsigned int nesting_level_left;
- unsigned int lookup_props;
- unsigned int property; /* propety of first glyph */
-- unsigned int debug_depth;
- const GDEF &gdef;
- bool has_glyph_classes;
-+ unsigned int debug_depth;
-
-
- hb_apply_context_t (hb_font_t *font_,
-@@ -156,18 +261,16 @@
- font (font_), face (font->face), buffer (buffer_),
- direction (buffer_->props.direction),
- lookup_mask (lookup_mask_),
-+ recurse_func (NULL),
- nesting_level_left (MAX_NESTING_LEVEL),
-- lookup_props (0), property (0), debug_depth (0),
-+ lookup_props (0), property (0),
- gdef (*hb_ot_layout_from_face (face)->gdef),
-- has_glyph_classes (gdef.has_glyph_classes ()) {}
-+ has_glyph_classes (gdef.has_glyph_classes ()),
-+ debug_depth (0) {}
-
-- void set_lookup_props (unsigned int lookup_props_) {
-- lookup_props = lookup_props_;
-- }
--
-- void set_lookup (const Lookup &l) {
-- lookup_props = l.get_props ();
-- }
-+ void set_recurse_func (recurse_func_t func) { recurse_func = func; }
-+ void set_lookup_props (unsigned int lookup_props_) { lookup_props = lookup_props_; }
-+ void set_lookup (const Lookup &l) { lookup_props = l.get_props (); }
-
- struct mark_skipping_forward_iterator_t
- {
-@@ -373,22 +476,23 @@
-
-
- typedef bool (*intersects_func_t) (hb_set_t *glyphs, const USHORT &value, const void *data);
-+typedef void (*collect_glyphs_func_t) (hb_set_t *glyphs, const USHORT &value, const void *data);
- typedef bool (*match_func_t) (hb_codepoint_t glyph_id, const USHORT &value, const void *data);
--typedef void (*closure_lookup_func_t) (hb_closure_context_t *c, unsigned int lookup_index);
--typedef void (*collect_glyphs_lookup_func_t) (hb_collect_glyphs_context_t *c, unsigned int lookup_index);
--typedef bool (*apply_lookup_func_t) (hb_apply_context_t *c, unsigned int lookup_index);
-
- struct ContextClosureFuncs
- {
- intersects_func_t intersects;
-- closure_lookup_func_t closure;
-+};
-+struct ContextCollectGlyphsFuncs
-+{
-+ collect_glyphs_func_t collect;
- };
- struct ContextApplyFuncs
- {
- match_func_t match;
-- apply_lookup_func_t apply;
- };
-
-+
- static inline bool intersects_glyph (hb_set_t *glyphs, const USHORT &value, const void *data HB_UNUSED)
- {
- return glyphs->has (value);
-@@ -417,6 +521,32 @@
- }
-
-
-+static inline void collect_glyph (hb_set_t *glyphs, const USHORT &value, const void *data HB_UNUSED)
-+{
-+ glyphs->add (value);
-+}
-+static inline void collect_class (hb_set_t *glyphs, const USHORT &value, const void *data)
-+{
-+ const ClassDef &class_def = *reinterpret_cast<const ClassDef *>(data);
-+ class_def.add_class (glyphs, value);
-+}
-+static inline void collect_coverage (hb_set_t *glyphs, const USHORT &value, const void *data)
-+{
-+ const OffsetTo<Coverage> &coverage = (const OffsetTo<Coverage>&)value;
-+ (data+coverage).add_coverage (glyphs);
-+}
-+static inline void collect_array (hb_collect_glyphs_context_t *c,
-+ hb_set_t *glyphs,
-+ unsigned int count,
-+ const USHORT values[],
-+ collect_glyphs_func_t collect_func,
-+ const void *collect_data)
-+{
-+ for (unsigned int i = 0; i < count; i++)
-+ collect_func (glyphs, values[i], collect_data);
-+}
-+
-+
- static inline bool match_glyph (hb_codepoint_t glyph_id, const USHORT &value, const void *data HB_UNUSED)
- {
- return glyph_id == value;
-@@ -432,7 +562,6 @@
- return (data+coverage).get_coverage (glyph_id) != NOT_COVERED;
- }
-
--
- static inline bool would_match_input (hb_would_apply_context_t *c,
- unsigned int count, /* Including the first glyph (not matched) */
- const USHORT input[], /* Array of input values--start with second glyph */
-@@ -457,7 +586,7 @@
- bool *p_is_mark_ligature = NULL,
- unsigned int *p_total_component_count = NULL)
- {
-- hb_auto_trace_t<HB_DEBUG_APPLY> trace (&c->debug_depth, "APPLY", NULL, HB_FUNC, "idx %d codepoint %u", c->buffer->idx, c->buffer->cur().codepoint);
-+ TRACE_APPLY (NULL);
-
- hb_apply_context_t::mark_skipping_forward_iterator_t skippy_iter (c, c->buffer->idx, count - 1);
- if (skippy_iter.has_no_chance ()) return TRACE_RETURN (false);
-@@ -614,7 +743,7 @@
- match_func_t match_func,
- const void *match_data)
- {
-- hb_auto_trace_t<HB_DEBUG_APPLY> trace (&c->debug_depth, "APPLY", NULL, HB_FUNC, "idx %d codepoint %u", c->buffer->idx, c->buffer->cur().codepoint);
-+ TRACE_APPLY (NULL);
-
- hb_apply_context_t::mark_skipping_backward_iterator_t skippy_iter (c, c->buffer->backtrack_len (), count, true);
- if (skippy_iter.has_no_chance ())
-@@ -639,7 +768,7 @@
- const void *match_data,
- unsigned int offset)
- {
-- hb_auto_trace_t<HB_DEBUG_APPLY> trace (&c->debug_depth, "APPLY", NULL, HB_FUNC, "idx %d codepoint %u", c->buffer->idx, c->buffer->cur().codepoint);
-+ TRACE_APPLY (NULL);
-
- hb_apply_context_t::mark_skipping_forward_iterator_t skippy_iter (c, c->buffer->idx + offset - 1, count, true);
- if (skippy_iter.has_no_chance ())
-@@ -662,7 +791,7 @@
- struct LookupRecord
- {
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (c->check_struct (this));
- }
-
-@@ -675,22 +804,22 @@
- };
-
-
--static inline void closure_lookup (hb_closure_context_t *c,
-- unsigned int lookupCount,
-- const LookupRecord lookupRecord[], /* Array of LookupRecords--in design order */
-- closure_lookup_func_t closure_func)
-+template <typename context_t>
-+static inline void recurse_lookups (context_t *c,
-+ unsigned int lookupCount,
-+ const LookupRecord lookupRecord[] /* Array of LookupRecords--in design order */)
- {
- for (unsigned int i = 0; i < lookupCount; i++)
-- closure_func (c, lookupRecord->lookupListIndex);
-+ c->recurse (lookupRecord->lookupListIndex);
- }
-
- static inline bool apply_lookup (hb_apply_context_t *c,
- unsigned int count, /* Including the first glyph */
- unsigned int lookupCount,
-- const LookupRecord lookupRecord[], /* Array of LookupRecords--in design order */
-- apply_lookup_func_t apply_func)
-+ const LookupRecord lookupRecord[] /* Array of LookupRecords--in design order */)
- {
-- hb_auto_trace_t<HB_DEBUG_APPLY> trace (&c->debug_depth, "APPLY", NULL, HB_FUNC, "idx %d codepoint %u", c->buffer->idx, c->buffer->cur().codepoint);
-+ TRACE_APPLY (NULL);
-+
- unsigned int end = c->buffer->len;
- if (unlikely (count == 0 || c->buffer->idx + count > end))
- return TRACE_RETURN (false);
-@@ -719,7 +848,7 @@
- unsigned int old_pos = c->buffer->idx;
-
- /* Apply a lookup */
-- bool done = apply_func (c, lookupRecord->lookupListIndex);
-+ bool done = c->recurse (lookupRecord->lookupListIndex);
-
- lookupRecord++;
- lookupCount--;
-@@ -753,6 +882,12 @@
- const void *intersects_data;
- };
-
-+struct ContextCollectGlyphsLookupContext
-+{
-+ ContextCollectGlyphsFuncs funcs;
-+ const void *collect_data;
-+};
-+
- struct ContextApplyLookupContext
- {
- ContextApplyFuncs funcs;
-@@ -769,11 +904,23 @@
- if (intersects_array (c,
- inputCount ? inputCount - 1 : 0, input,
- lookup_context.funcs.intersects, lookup_context.intersects_data))
-- closure_lookup (c,
-- lookupCount, lookupRecord,
-- lookup_context.funcs.closure);
-+ recurse_lookups (c,
-+ lookupCount, lookupRecord);
- }
-
-+static inline void context_collect_glyphs_lookup (hb_collect_glyphs_context_t *c,
-+ unsigned int inputCount, /* Including the first glyph (not matched) */
-+ const USHORT input[], /* Array of input values--start with second glyph */
-+ unsigned int lookupCount,
-+ const LookupRecord lookupRecord[],
-+ ContextCollectGlyphsLookupContext &lookup_context)
-+{
-+ collect_array (c, &c->input,
-+ inputCount ? inputCount - 1 : 0, input,
-+ lookup_context.funcs.collect, lookup_context.collect_data);
-+ recurse_lookups (c,
-+ lookupCount, lookupRecord);
-+}
-
- static inline bool context_would_apply_lookup (hb_would_apply_context_t *c,
- unsigned int inputCount, /* Including the first glyph (not matched) */
-@@ -798,19 +945,14 @@
- lookup_context.funcs.match, lookup_context.match_data)
- && apply_lookup (c,
- inputCount,
-- lookupCount, lookupRecord,
-- lookup_context.funcs.apply);
-+ lookupCount, lookupRecord);
- }
-
- struct Rule
- {
-- friend struct RuleSet;
--
-- private:
--
- inline void closure (hb_closure_context_t *c, ContextClosureLookupContext &lookup_context) const
- {
-- TRACE_CLOSURE ();
-+ TRACE_CLOSURE (this);
- const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (input, input[0].static_size * (inputCount ? inputCount - 1 : 0));
- context_closure_lookup (c,
- inputCount, input,
-@@ -818,23 +960,33 @@
- lookup_context);
- }
-
-+ inline void collect_glyphs (hb_collect_glyphs_context_t *c, ContextCollectGlyphsLookupContext &lookup_context) const
-+ {
-+ TRACE_COLLECT_GLYPHS (this);
-+ const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (input, input[0].static_size * (inputCount ? inputCount - 1 : 0));
-+ context_collect_glyphs_lookup (c,
-+ inputCount, input,
-+ lookupCount, lookupRecord,
-+ lookup_context);
-+ }
-+
- inline bool would_apply (hb_would_apply_context_t *c, ContextApplyLookupContext &lookup_context) const
- {
-- TRACE_WOULD_APPLY ();
-+ TRACE_WOULD_APPLY (this);
- const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (input, input[0].static_size * (inputCount ? inputCount - 1 : 0));
- return TRACE_RETURN (context_would_apply_lookup (c, inputCount, input, lookupCount, lookupRecord, lookup_context));
- }
-
- inline bool apply (hb_apply_context_t *c, ContextApplyLookupContext &lookup_context) const
- {
-- TRACE_APPLY ();
-+ TRACE_APPLY (this);
- const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (input, input[0].static_size * (inputCount ? inputCount - 1 : 0));
- return TRACE_RETURN (context_apply_lookup (c, inputCount, input, lookupCount, lookupRecord, lookup_context));
- }
-
- public:
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return inputCount.sanitize (c)
- && lookupCount.sanitize (c)
- && c->check_range (input,
-@@ -859,15 +1011,23 @@
- {
- inline void closure (hb_closure_context_t *c, ContextClosureLookupContext &lookup_context) const
- {
-- TRACE_CLOSURE ();
-+ TRACE_CLOSURE (this);
- unsigned int num_rules = rule.len;
- for (unsigned int i = 0; i < num_rules; i++)
- (this+rule[i]).closure (c, lookup_context);
- }
-
-+ inline void collect_glyphs (hb_collect_glyphs_context_t *c, ContextCollectGlyphsLookupContext &lookup_context) const
-+ {
-+ TRACE_COLLECT_GLYPHS (this);
-+ unsigned int num_rules = rule.len;
-+ for (unsigned int i = 0; i < num_rules; i++)
-+ (this+rule[i]).collect_glyphs (c, lookup_context);
-+ }
-+
- inline bool would_apply (hb_would_apply_context_t *c, ContextApplyLookupContext &lookup_context) const
- {
-- TRACE_WOULD_APPLY ();
-+ TRACE_WOULD_APPLY (this);
- unsigned int num_rules = rule.len;
- for (unsigned int i = 0; i < num_rules; i++)
- {
-@@ -879,7 +1039,7 @@
-
- inline bool apply (hb_apply_context_t *c, ContextApplyLookupContext &lookup_context) const
- {
-- TRACE_APPLY ();
-+ TRACE_APPLY (this);
- unsigned int num_rules = rule.len;
- for (unsigned int i = 0; i < num_rules; i++)
- {
-@@ -890,7 +1050,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (rule.sanitize (c, this));
- }
-
-@@ -905,18 +1065,14 @@
-
- struct ContextFormat1
- {
-- friend struct Context;
--
-- private:
--
-- inline void closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const
-+ inline void closure (hb_closure_context_t *c) const
- {
-- TRACE_CLOSURE ();
-+ TRACE_CLOSURE (this);
-
- const Coverage &cov = (this+coverage);
-
- struct ContextClosureLookupContext lookup_context = {
-- {intersects_glyph, closure_func},
-+ {intersects_glyph},
- NULL
- };
-
-@@ -928,35 +1084,55 @@
- }
- }
-
-+ inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
-+ {
-+ TRACE_COLLECT_GLYPHS (this);
-+ (this+coverage).add_coverage (&c->input);
-+
-+ struct ContextCollectGlyphsLookupContext lookup_context = {
-+ {collect_glyph},
-+ NULL
-+ };
-+
-+ unsigned int count = ruleSet.len;
-+ for (unsigned int i = 0; i < count; i++)
-+ (this+ruleSet[i]).collect_glyphs (c, lookup_context);
-+ }
-+
- inline bool would_apply (hb_would_apply_context_t *c) const
- {
-- TRACE_WOULD_APPLY ();
-+ TRACE_WOULD_APPLY (this);
-
-- const RuleSet &rule_set = this+ruleSet[(this+coverage) (c->glyphs[0])];
-+ const RuleSet &rule_set = this+ruleSet[(this+coverage).get_coverage (c->glyphs[0])];
- struct ContextApplyLookupContext lookup_context = {
-- {match_glyph, NULL},
-+ {match_glyph},
- NULL
- };
- return TRACE_RETURN (rule_set.would_apply (c, lookup_context));
- }
-
-- inline bool apply (hb_apply_context_t *c, apply_lookup_func_t apply_func) const
-+ inline const Coverage &get_coverage (void) const
- {
-- TRACE_APPLY ();
-- unsigned int index = (this+coverage) (c->buffer->cur().codepoint);
-+ return this+coverage;
-+ }
-+
-+ inline bool apply (hb_apply_context_t *c) const
-+ {
-+ TRACE_APPLY (this);
-+ unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
- if (likely (index == NOT_COVERED))
- return TRACE_RETURN (false);
-
- const RuleSet &rule_set = this+ruleSet[index];
- struct ContextApplyLookupContext lookup_context = {
-- {match_glyph, apply_func},
-+ {match_glyph},
- NULL
- };
- return TRACE_RETURN (rule_set.apply (c, lookup_context));
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (coverage.sanitize (c, this) && ruleSet.sanitize (c, this));
- }
-
-@@ -975,20 +1151,16 @@
-
- struct ContextFormat2
- {
-- friend struct Context;
--
-- private:
--
-- inline void closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const
-+ inline void closure (hb_closure_context_t *c) const
- {
-- TRACE_CLOSURE ();
-+ TRACE_CLOSURE (this);
- if (!(this+coverage).intersects (c->glyphs))
- return;
-
- const ClassDef &class_def = this+classDef;
-
- struct ContextClosureLookupContext lookup_context = {
-- {intersects_class, closure_func},
-+ {intersects_class},
- NULL
- };
-
-@@ -1000,38 +1172,58 @@
- }
- }
-
-+ inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
-+ {
-+ TRACE_COLLECT_GLYPHS (this);
-+ (this+coverage).add_coverage (&c->input);
-+
-+ struct ContextCollectGlyphsLookupContext lookup_context = {
-+ {collect_class},
-+ NULL
-+ };
-+
-+ unsigned int count = ruleSet.len;
-+ for (unsigned int i = 0; i < count; i++)
-+ (this+ruleSet[i]).collect_glyphs (c, lookup_context);
-+ }
-+
- inline bool would_apply (hb_would_apply_context_t *c) const
- {
-- TRACE_WOULD_APPLY ();
-+ TRACE_WOULD_APPLY (this);
-
- const ClassDef &class_def = this+classDef;
-- unsigned int index = class_def (c->glyphs[0]);
-+ unsigned int index = class_def.get_class (c->glyphs[0]);
- const RuleSet &rule_set = this+ruleSet[index];
- struct ContextApplyLookupContext lookup_context = {
-- {match_class, NULL},
-+ {match_class},
- &class_def
- };
- return TRACE_RETURN (rule_set.would_apply (c, lookup_context));
- }
-
-- inline bool apply (hb_apply_context_t *c, apply_lookup_func_t apply_func) const
-+ inline const Coverage &get_coverage (void) const
-+ {
-+ return this+coverage;
-+ }
-+
-+ inline bool apply (hb_apply_context_t *c) const
- {
-- TRACE_APPLY ();
-- unsigned int index = (this+coverage) (c->buffer->cur().codepoint);
-+ TRACE_APPLY (this);
-+ unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
- if (likely (index == NOT_COVERED)) return TRACE_RETURN (false);
-
- const ClassDef &class_def = this+classDef;
-- index = class_def (c->buffer->cur().codepoint);
-+ index = class_def.get_class (c->buffer->cur().codepoint);
- const RuleSet &rule_set = this+ruleSet[index];
- struct ContextApplyLookupContext lookup_context = {
-- {match_class, apply_func},
-+ {match_class},
- &class_def
- };
- return TRACE_RETURN (rule_set.apply (c, lookup_context));
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (coverage.sanitize (c, this) && classDef.sanitize (c, this) && ruleSet.sanitize (c, this));
- }
-
-@@ -1053,19 +1245,15 @@
-
- struct ContextFormat3
- {
-- friend struct Context;
--
-- private:
--
-- inline void closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const
-+ inline void closure (hb_closure_context_t *c) const
- {
-- TRACE_CLOSURE ();
-+ TRACE_CLOSURE (this);
- if (!(this+coverage[0]).intersects (c->glyphs))
- return;
-
- const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (coverage, coverage[0].static_size * glyphCount);
- struct ContextClosureLookupContext lookup_context = {
-- {intersects_coverage, closure_func},
-+ {intersects_coverage},
- this
- };
- context_closure_lookup (c,
-@@ -1074,34 +1262,56 @@
- lookup_context);
- }
-
-+ inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
-+ {
-+ TRACE_COLLECT_GLYPHS (this);
-+ (this+coverage[0]).add_coverage (&c->input);
-+
-+ const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (coverage, coverage[0].static_size * glyphCount);
-+ struct ContextCollectGlyphsLookupContext lookup_context = {
-+ {collect_coverage},
-+ NULL
-+ };
-+
-+ context_collect_glyphs_lookup (c,
-+ glyphCount, (const USHORT *) (coverage + 1),
-+ lookupCount, lookupRecord,
-+ lookup_context);
-+ }
-+
- inline bool would_apply (hb_would_apply_context_t *c) const
- {
-- TRACE_WOULD_APPLY ();
-+ TRACE_WOULD_APPLY (this);
-
- const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (coverage, coverage[0].static_size * glyphCount);
- struct ContextApplyLookupContext lookup_context = {
-- {match_coverage, NULL},
-+ {match_coverage},
- this
- };
- return TRACE_RETURN (context_would_apply_lookup (c, glyphCount, (const USHORT *) (coverage + 1), lookupCount, lookupRecord, lookup_context));
- }
-
-- inline bool apply (hb_apply_context_t *c, apply_lookup_func_t apply_func) const
-+ inline const Coverage &get_coverage (void) const
- {
-- TRACE_APPLY ();
-- unsigned int index = (this+coverage[0]) (c->buffer->cur().codepoint);
-+ return this+coverage[0];
-+ }
-+
-+ inline bool apply (hb_apply_context_t *c) const
-+ {
-+ TRACE_APPLY (this);
-+ unsigned int index = (this+coverage[0]).get_coverage (c->buffer->cur().codepoint);
- if (likely (index == NOT_COVERED)) return TRACE_RETURN (false);
-
- const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (coverage, coverage[0].static_size * glyphCount);
- struct ContextApplyLookupContext lookup_context = {
-- {match_coverage, apply_func},
-+ {match_coverage},
- this
- };
- return TRACE_RETURN (context_apply_lookup (c, glyphCount, (const USHORT *) (coverage + 1), lookupCount, lookupRecord, lookup_context));
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- if (!c->check_struct (this)) return TRACE_RETURN (false);
- unsigned int count = glyphCount;
- if (!c->check_array (coverage, coverage[0].static_size, count)) return TRACE_RETURN (false);
-@@ -1127,63 +1337,20 @@
-
- struct Context
- {
-- protected:
--
-- inline void closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const
-+ template <typename context_t>
-+ inline typename context_t::return_t process (context_t *c) const
- {
-- TRACE_CLOSURE ();
-+ TRACE_PROCESS (this);
- switch (u.format) {
-- case 1: u.format1.closure (c, closure_func); break;
-- case 2: u.format2.closure (c, closure_func); break;
-- case 3: u.format3.closure (c, closure_func); break;
-- default: break;
-- }
-- }
--
-- inline void collect_glyphs (hb_collect_glyphs_context_t *c, collect_glyphs_lookup_func_t closure_func) const
-- {
-- TRACE_CLOSURE ();
-- switch (u.format) {
--// case 1: u.format1.collect_glyphs (c); break;
--// case 2: u.format2.collect_glyphs (c); break;
--// case 3: u.format2.collect_glyphs (c); break;
-- default: break;
-- }
-- }
--
-- inline const Coverage &get_coverage (void) const
-- {
-- switch (u.format) {
-- case 1: return this + u.format1.coverage;
-- case 2: return this + u.format2.coverage;
-- case 3: return this + u.format3.coverage[0];
-- default:return Null(Coverage);
-- }
-- }
--
-- inline bool would_apply (hb_would_apply_context_t *c) const
-- {
-- switch (u.format) {
-- case 1: return u.format1.would_apply (c);
-- case 2: return u.format2.would_apply (c);
-- case 3: return u.format3.would_apply (c);
-- default:return false;
-- }
-- }
--
-- inline bool apply (hb_apply_context_t *c, apply_lookup_func_t apply_func) const
-- {
-- TRACE_APPLY ();
-- switch (u.format) {
-- case 1: return TRACE_RETURN (u.format1.apply (c, apply_func));
-- case 2: return TRACE_RETURN (u.format2.apply (c, apply_func));
-- case 3: return TRACE_RETURN (u.format3.apply (c, apply_func));
-- default:return TRACE_RETURN (false);
-+ case 1: return TRACE_RETURN (c->process (u.format1));
-+ case 2: return TRACE_RETURN (c->process (u.format2));
-+ case 3: return TRACE_RETURN (c->process (u.format3));
-+ default:return TRACE_RETURN (c->default_return_value ());
- }
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- if (!u.format.sanitize (c)) return TRACE_RETURN (false);
- switch (u.format) {
- case 1: return TRACE_RETURN (u.format1.sanitize (c));
-@@ -1211,6 +1378,12 @@
- const void *intersects_data[3];
- };
-
-+struct ChainContextCollectGlyphsLookupContext
-+{
-+ ContextCollectGlyphsFuncs funcs;
-+ const void *collect_data[3];
-+};
-+
- struct ChainContextApplyLookupContext
- {
- ContextApplyFuncs funcs;
-@@ -1237,9 +1410,32 @@
- && intersects_array (c,
- lookaheadCount, lookahead,
- lookup_context.funcs.intersects, lookup_context.intersects_data[2]))
-- closure_lookup (c,
-- lookupCount, lookupRecord,
-- lookup_context.funcs.closure);
-+ recurse_lookups (c,
-+ lookupCount, lookupRecord);
-+}
-+
-+static inline void chain_context_collect_glyphs_lookup (hb_collect_glyphs_context_t *c,
-+ unsigned int backtrackCount,
-+ const USHORT backtrack[],
-+ unsigned int inputCount, /* Including the first glyph (not matched) */
-+ const USHORT input[], /* Array of input values--start with second glyph */
-+ unsigned int lookaheadCount,
-+ const USHORT lookahead[],
-+ unsigned int lookupCount,
-+ const LookupRecord lookupRecord[],
-+ ChainContextCollectGlyphsLookupContext &lookup_context)
-+{
-+ collect_array (c, &c->before,
-+ backtrackCount, backtrack,
-+ lookup_context.funcs.collect, lookup_context.collect_data[0]);
-+ collect_array (c, &c->input,
-+ inputCount ? inputCount - 1 : 0, input,
-+ lookup_context.funcs.collect, lookup_context.collect_data[1]);
-+ collect_array (c, &c->after,
-+ lookaheadCount, lookahead,
-+ lookup_context.funcs.collect, lookup_context.collect_data[2]);
-+ recurse_lookups (c,
-+ lookupCount, lookupRecord);
- }
-
- static inline bool chain_context_would_apply_lookup (hb_would_apply_context_t *c,
-@@ -1270,7 +1466,7 @@
- const LookupRecord lookupRecord[],
- ChainContextApplyLookupContext &lookup_context)
- {
-- unsigned int lookahead_offset;
-+ unsigned int lookahead_offset = 0;
- return match_input (c,
- inputCount, input,
- lookup_context.funcs.match, lookup_context.match_data[1],
-@@ -1284,19 +1480,14 @@
- lookahead_offset)
- && apply_lookup (c,
- inputCount,
-- lookupCount, lookupRecord,
-- lookup_context.funcs.apply);
-+ lookupCount, lookupRecord);
- }
-
- struct ChainRule
- {
-- friend struct ChainRuleSet;
--
-- private:
--
- inline void closure (hb_closure_context_t *c, ChainContextClosureLookupContext &lookup_context) const
- {
-- TRACE_CLOSURE ();
-+ TRACE_CLOSURE (this);
- const HeadlessArrayOf<USHORT> &input = StructAfter<HeadlessArrayOf<USHORT> > (backtrack);
- const ArrayOf<USHORT> &lookahead = StructAfter<ArrayOf<USHORT> > (input);
- const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
-@@ -1308,9 +1499,23 @@
- lookup_context);
- }
-
-+ inline void collect_glyphs (hb_collect_glyphs_context_t *c, ChainContextCollectGlyphsLookupContext &lookup_context) const
-+ {
-+ TRACE_COLLECT_GLYPHS (this);
-+ const HeadlessArrayOf<USHORT> &input = StructAfter<HeadlessArrayOf<USHORT> > (backtrack);
-+ const ArrayOf<USHORT> &lookahead = StructAfter<ArrayOf<USHORT> > (input);
-+ const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
-+ chain_context_collect_glyphs_lookup (c,
-+ backtrack.len, backtrack.array,
-+ input.len, input.array,
-+ lookahead.len, lookahead.array,
-+ lookup.len, lookup.array,
-+ lookup_context);
-+ }
-+
- inline bool would_apply (hb_would_apply_context_t *c, ChainContextApplyLookupContext &lookup_context) const
- {
-- TRACE_WOULD_APPLY ();
-+ TRACE_WOULD_APPLY (this);
- const HeadlessArrayOf<USHORT> &input = StructAfter<HeadlessArrayOf<USHORT> > (backtrack);
- const ArrayOf<USHORT> &lookahead = StructAfter<ArrayOf<USHORT> > (input);
- const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
-@@ -1323,7 +1528,7 @@
-
- inline bool apply (hb_apply_context_t *c, ChainContextApplyLookupContext &lookup_context) const
- {
-- TRACE_APPLY ();
-+ TRACE_APPLY (this);
- const HeadlessArrayOf<USHORT> &input = StructAfter<HeadlessArrayOf<USHORT> > (backtrack);
- const ArrayOf<USHORT> &lookahead = StructAfter<ArrayOf<USHORT> > (input);
- const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
-@@ -1334,9 +1539,8 @@
- lookup.array, lookup_context));
- }
-
-- public:
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- if (!backtrack.sanitize (c)) return TRACE_RETURN (false);
- HeadlessArrayOf<USHORT> &input = StructAfter<HeadlessArrayOf<USHORT> > (backtrack);
- if (!input.sanitize (c)) return TRACE_RETURN (false);
-@@ -1368,15 +1572,23 @@
- {
- inline void closure (hb_closure_context_t *c, ChainContextClosureLookupContext &lookup_context) const
- {
-- TRACE_CLOSURE ();
-+ TRACE_CLOSURE (this);
- unsigned int num_rules = rule.len;
- for (unsigned int i = 0; i < num_rules; i++)
- (this+rule[i]).closure (c, lookup_context);
- }
-
-+ inline void collect_glyphs (hb_collect_glyphs_context_t *c, ChainContextCollectGlyphsLookupContext &lookup_context) const
-+ {
-+ TRACE_COLLECT_GLYPHS (this);
-+ unsigned int num_rules = rule.len;
-+ for (unsigned int i = 0; i < num_rules; i++)
-+ (this+rule[i]).collect_glyphs (c, lookup_context);
-+ }
-+
- inline bool would_apply (hb_would_apply_context_t *c, ChainContextApplyLookupContext &lookup_context) const
- {
-- TRACE_WOULD_APPLY ();
-+ TRACE_WOULD_APPLY (this);
- unsigned int num_rules = rule.len;
- for (unsigned int i = 0; i < num_rules; i++)
- if ((this+rule[i]).would_apply (c, lookup_context))
-@@ -1387,7 +1599,7 @@
-
- inline bool apply (hb_apply_context_t *c, ChainContextApplyLookupContext &lookup_context) const
- {
-- TRACE_APPLY ();
-+ TRACE_APPLY (this);
- unsigned int num_rules = rule.len;
- for (unsigned int i = 0; i < num_rules; i++)
- if ((this+rule[i]).apply (c, lookup_context))
-@@ -1397,7 +1609,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (rule.sanitize (c, this));
- }
-
-@@ -1411,17 +1623,13 @@
-
- struct ChainContextFormat1
- {
-- friend struct ChainContext;
--
-- private:
--
-- inline void closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const
-+ inline void closure (hb_closure_context_t *c) const
- {
-- TRACE_CLOSURE ();
-+ TRACE_CLOSURE (this);
- const Coverage &cov = (this+coverage);
-
- struct ChainContextClosureLookupContext lookup_context = {
-- {intersects_glyph, closure_func},
-+ {intersects_glyph},
- {NULL, NULL, NULL}
- };
-
-@@ -1433,34 +1641,54 @@
- }
- }
-
-+ inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
-+ {
-+ TRACE_COLLECT_GLYPHS (this);
-+ (this+coverage).add_coverage (&c->input);
-+
-+ struct ChainContextCollectGlyphsLookupContext lookup_context = {
-+ {collect_glyph},
-+ {NULL, NULL, NULL}
-+ };
-+
-+ unsigned int count = ruleSet.len;
-+ for (unsigned int i = 0; i < count; i++)
-+ (this+ruleSet[i]).collect_glyphs (c, lookup_context);
-+ }
-+
- inline bool would_apply (hb_would_apply_context_t *c) const
- {
-- TRACE_WOULD_APPLY ();
-+ TRACE_WOULD_APPLY (this);
-
-- const ChainRuleSet &rule_set = this+ruleSet[(this+coverage) (c->glyphs[0])];
-+ const ChainRuleSet &rule_set = this+ruleSet[(this+coverage).get_coverage (c->glyphs[0])];
- struct ChainContextApplyLookupContext lookup_context = {
-- {match_glyph, NULL},
-+ {match_glyph},
- {NULL, NULL, NULL}
- };
- return TRACE_RETURN (rule_set.would_apply (c, lookup_context));
- }
-
-- inline bool apply (hb_apply_context_t *c, apply_lookup_func_t apply_func) const
-+ inline const Coverage &get_coverage (void) const
- {
-- TRACE_APPLY ();
-- unsigned int index = (this+coverage) (c->buffer->cur().codepoint);
-+ return this+coverage;
-+ }
-+
-+ inline bool apply (hb_apply_context_t *c) const
-+ {
-+ TRACE_APPLY (this);
-+ unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
- if (likely (index == NOT_COVERED)) return TRACE_RETURN (false);
-
- const ChainRuleSet &rule_set = this+ruleSet[index];
- struct ChainContextApplyLookupContext lookup_context = {
-- {match_glyph, apply_func},
-+ {match_glyph},
- {NULL, NULL, NULL}
- };
- return TRACE_RETURN (rule_set.apply (c, lookup_context));
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (coverage.sanitize (c, this) && ruleSet.sanitize (c, this));
- }
-
-@@ -1478,13 +1706,9 @@
-
- struct ChainContextFormat2
- {
-- friend struct ChainContext;
--
-- private:
--
-- inline void closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const
-+ inline void closure (hb_closure_context_t *c) const
- {
-- TRACE_CLOSURE ();
-+ TRACE_CLOSURE (this);
- if (!(this+coverage).intersects (c->glyphs))
- return;
-
-@@ -1493,7 +1717,7 @@
- const ClassDef &lookahead_class_def = this+lookaheadClassDef;
-
- struct ChainContextClosureLookupContext lookup_context = {
-- {intersects_class, closure_func},
-+ {intersects_class},
- {&backtrack_class_def,
- &input_class_def,
- &lookahead_class_def}
-@@ -1507,35 +1731,55 @@
- }
- }
-
-+ inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
-+ {
-+ TRACE_COLLECT_GLYPHS (this);
-+ (this+coverage).add_coverage (&c->input);
-+
-+ struct ChainContextCollectGlyphsLookupContext lookup_context = {
-+ {collect_class},
-+ {NULL, NULL, NULL}
-+ };
-+
-+ unsigned int count = ruleSet.len;
-+ for (unsigned int i = 0; i < count; i++)
-+ (this+ruleSet[i]).collect_glyphs (c, lookup_context);
-+ }
-+
- inline bool would_apply (hb_would_apply_context_t *c) const
- {
-- TRACE_WOULD_APPLY ();
-+ TRACE_WOULD_APPLY (this);
-
- const ClassDef &input_class_def = this+inputClassDef;
-
-- unsigned int index = input_class_def (c->glyphs[0]);
-+ unsigned int index = input_class_def.get_class (c->glyphs[0]);
- const ChainRuleSet &rule_set = this+ruleSet[index];
- struct ChainContextApplyLookupContext lookup_context = {
-- {match_class, NULL},
-+ {match_class},
- {NULL, &input_class_def, NULL}
- };
- return TRACE_RETURN (rule_set.would_apply (c, lookup_context));
- }
-
-- inline bool apply (hb_apply_context_t *c, apply_lookup_func_t apply_func) const
-+ inline const Coverage &get_coverage (void) const
-+ {
-+ return this+coverage;
-+ }
-+
-+ inline bool apply (hb_apply_context_t *c) const
- {
-- TRACE_APPLY ();
-- unsigned int index = (this+coverage) (c->buffer->cur().codepoint);
-+ TRACE_APPLY (this);
-+ unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
- if (likely (index == NOT_COVERED)) return TRACE_RETURN (false);
-
- const ClassDef &backtrack_class_def = this+backtrackClassDef;
- const ClassDef &input_class_def = this+inputClassDef;
- const ClassDef &lookahead_class_def = this+lookaheadClassDef;
-
-- index = input_class_def (c->buffer->cur().codepoint);
-+ index = input_class_def.get_class (c->buffer->cur().codepoint);
- const ChainRuleSet &rule_set = this+ruleSet[index];
- struct ChainContextApplyLookupContext lookup_context = {
-- {match_class, apply_func},
-+ {match_class},
- {&backtrack_class_def,
- &input_class_def,
- &lookahead_class_def}
-@@ -1544,7 +1788,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (coverage.sanitize (c, this) && backtrackClassDef.sanitize (c, this) &&
- inputClassDef.sanitize (c, this) && lookaheadClassDef.sanitize (c, this) &&
- ruleSet.sanitize (c, this));
-@@ -1576,13 +1820,9 @@
-
- struct ChainContextFormat3
- {
-- friend struct ChainContext;
--
-- private:
--
-- inline void closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const
-+ inline void closure (hb_closure_context_t *c) const
- {
-- TRACE_CLOSURE ();
-+ TRACE_CLOSURE (this);
- const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
-
- if (!(this+input[0]).intersects (c->glyphs))
-@@ -1591,7 +1831,7 @@
- const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (input);
- const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
- struct ChainContextClosureLookupContext lookup_context = {
-- {intersects_coverage, closure_func},
-+ {intersects_coverage},
- {this, this, this}
- };
- chain_context_closure_lookup (c,
-@@ -1602,21 +1842,36 @@
- lookup_context);
- }
-
-- inline const Coverage &get_coverage (void) const
-+ inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
- {
-+ TRACE_COLLECT_GLYPHS (this);
- const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
-- return this+input[0];
-+
-+ (this+input[0]).add_coverage (&c->input);
-+
-+ const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (input);
-+ const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
-+ struct ChainContextCollectGlyphsLookupContext lookup_context = {
-+ {collect_coverage},
-+ {this, this, this}
-+ };
-+ chain_context_collect_glyphs_lookup (c,
-+ backtrack.len, (const USHORT *) backtrack.array,
-+ input.len, (const USHORT *) input.array + 1,
-+ lookahead.len, (const USHORT *) lookahead.array,
-+ lookup.len, lookup.array,
-+ lookup_context);
- }
-
- inline bool would_apply (hb_would_apply_context_t *c) const
- {
-- TRACE_WOULD_APPLY ();
-+ TRACE_WOULD_APPLY (this);
-
- const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
- const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (input);
- const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
- struct ChainContextApplyLookupContext lookup_context = {
-- {match_coverage, NULL},
-+ {match_coverage},
- {this, this, this}
- };
- return TRACE_RETURN (chain_context_would_apply_lookup (c,
-@@ -1626,18 +1881,24 @@
- lookup.len, lookup.array, lookup_context));
- }
-
-- inline bool apply (hb_apply_context_t *c, apply_lookup_func_t apply_func) const
-+ inline const Coverage &get_coverage (void) const
-+ {
-+ const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
-+ return this+input[0];
-+ }
-+
-+ inline bool apply (hb_apply_context_t *c) const
- {
-- TRACE_APPLY ();
-+ TRACE_APPLY (this);
- const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
-
-- unsigned int index = (this+input[0]) (c->buffer->cur().codepoint);
-+ unsigned int index = (this+input[0]).get_coverage (c->buffer->cur().codepoint);
- if (likely (index == NOT_COVERED)) return TRACE_RETURN (false);
-
- const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (input);
- const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
- struct ChainContextApplyLookupContext lookup_context = {
-- {match_coverage, apply_func},
-+ {match_coverage},
- {this, this, this}
- };
- return TRACE_RETURN (chain_context_apply_lookup (c,
-@@ -1648,7 +1909,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- if (!backtrack.sanitize (c, this)) return TRACE_RETURN (false);
- OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
- if (!input.sanitize (c, this)) return TRACE_RETURN (false);
-@@ -1681,63 +1942,20 @@
-
- struct ChainContext
- {
-- protected:
--
-- inline void closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const
-- {
-- TRACE_CLOSURE ();
-- switch (u.format) {
-- case 1: u.format1.closure (c, closure_func); break;
-- case 2: u.format2.closure (c, closure_func); break;
-- case 3: u.format3.closure (c, closure_func); break;
-- default: break;
-- }
-- }
--
-- inline void collect_glyphs (hb_collect_glyphs_context_t *c, collect_glyphs_lookup_func_t closure_func) const
-+ template <typename context_t>
-+ inline typename context_t::return_t process (context_t *c) const
- {
-- TRACE_CLOSURE ();
-+ TRACE_PROCESS (this);
- switch (u.format) {
--// case 1: u.format1.collect_glyphs (c); break;
--// case 2: u.format2.collect_glyphs (c); break;
--// case 3: u.format2.collect_glyphs (c); break;
-- default: break;
-- }
-- }
--
-- inline const Coverage &get_coverage (void) const
-- {
-- switch (u.format) {
-- case 1: return this + u.format1.coverage;
-- case 2: return this + u.format2.coverage;
-- case 3: return u.format3.get_coverage ();
-- default:return Null(Coverage);
-- }
-- }
--
-- inline bool would_apply (hb_would_apply_context_t *c) const
-- {
-- switch (u.format) {
-- case 1: return u.format1.would_apply (c);
-- case 2: return u.format2.would_apply (c);
-- case 3: return u.format3.would_apply (c);
-- default:return false;
-- }
-- }
--
-- inline bool apply (hb_apply_context_t *c, apply_lookup_func_t apply_func) const
-- {
-- TRACE_APPLY ();
-- switch (u.format) {
-- case 1: return TRACE_RETURN (u.format1.apply (c, apply_func));
-- case 2: return TRACE_RETURN (u.format2.apply (c, apply_func));
-- case 3: return TRACE_RETURN (u.format3.apply (c, apply_func));
-- default:return TRACE_RETURN (false);
-+ case 1: return TRACE_RETURN (c->process (u.format1));
-+ case 2: return TRACE_RETURN (c->process (u.format2));
-+ case 3: return TRACE_RETURN (c->process (u.format3));
-+ default:return TRACE_RETURN (c->default_return_value ());
- }
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- if (!u.format.sanitize (c)) return TRACE_RETURN (false);
- switch (u.format) {
- case 1: return TRACE_RETURN (u.format1.sanitize (c));
-@@ -1759,14 +1977,11 @@
-
- struct ExtensionFormat1
- {
-- friend struct Extension;
--
-- protected:
- inline unsigned int get_type (void) const { return extensionLookupType; }
- inline unsigned int get_offset (void) const { return extensionOffset; }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (c->check_struct (this));
- }
-
-@@ -1781,6 +1996,7 @@
- DEFINE_SIZE_STATIC (8);
- };
-
-+template <typename T>
- struct Extension
- {
- inline unsigned int get_type (void) const
-@@ -1798,8 +2014,22 @@
- }
- }
-
-- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ template <typename X>
-+ inline const X& get_subtable (void) const
-+ {
-+ unsigned int offset = get_offset ();
-+ if (unlikely (!offset)) return Null(typename T::LookupSubTable);
-+ return StructAtOffset<typename T::LookupSubTable> (this, offset);
-+ }
-+
-+ template <typename context_t>
-+ inline typename context_t::return_t process (context_t *c) const
-+ {
-+ return get_subtable<typename T::LookupSubTable> ().process (c, get_type ());
-+ }
-+
-+ inline bool sanitize_self (hb_sanitize_context_t *c) {
-+ TRACE_SANITIZE (this);
- if (!u.format.sanitize (c)) return TRACE_RETURN (false);
- switch (u.format) {
- case 1: return TRACE_RETURN (u.format1.sanitize (c));
-@@ -1807,6 +2037,14 @@
- }
- }
-
-+ inline bool sanitize (hb_sanitize_context_t *c) {
-+ TRACE_SANITIZE (this);
-+ if (!sanitize_self (c)) return TRACE_RETURN (false);
-+ unsigned int offset = get_offset ();
-+ if (unlikely (!offset)) return TRACE_RETURN (true);
-+ return TRACE_RETURN (StructAtOffset<typename T::LookupSubTable> (this, offset).sanitize (c, get_type ()));
-+ }
-+
- protected:
- union {
- USHORT format; /* Format identifier */
-@@ -1856,7 +2094,7 @@
- { return (this+lookupList)[i]; }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (version.sanitize (c) && likely (version.major == 1) &&
- scriptList.sanitize (c, this) &&
- featureList.sanitize (c, this) &&
-diff -ur harfbuzz-0.9.7.orig/src/hb-ot-layout.cc harfbuzz-0.9.7/src/hb-ot-layout.cc
---- harfbuzz-0.9.7.orig/src/hb-ot-layout.cc 2012-11-17 04:06:56.000000000 +0100
-+++ harfbuzz-0.9.7/src/hb-ot-layout.cc 2012-11-28 09:32:35.000000000 +0100
-@@ -401,6 +401,103 @@
- return f.get_lookup_indexes (start_offset, lookup_count, lookup_indexes);
- }
-
-+static void
-+_hb_ot_layout_collect_lookups_lookups (hb_face_t *face,
-+ hb_tag_t table_tag,
-+ unsigned int feature_index,
-+ hb_set_t *lookup_indexes /* OUT */)
-+{
-+ unsigned int lookup_indices[32];
-+ unsigned int offset, len;
-+
-+ offset = 0;
-+ do {
-+ len = ARRAY_LENGTH (lookup_indices);
-+ hb_ot_layout_feature_get_lookups (face,
-+ table_tag,
-+ feature_index,
-+ offset, &len,
-+ lookup_indices);
-+
-+ for (unsigned int i = 0; i < len; i++)
-+ lookup_indexes->add (lookup_indices[i]);
-+
-+ offset += len;
-+ } while (len == ARRAY_LENGTH (lookup_indices));
-+}
-+
-+static void
-+_hb_ot_layout_collect_lookups_features (hb_face_t *face,
-+ hb_tag_t table_tag,
-+ unsigned int script_index,
-+ unsigned int language_index,
-+ const hb_tag_t *features,
-+ hb_set_t *lookup_indexes /* OUT */)
-+{
-+ if (!features)
-+ {
-+ /* All features */
-+ unsigned int count = hb_ot_layout_language_get_feature_tags (face, table_tag, script_index, language_index, 0, NULL, NULL);
-+ for (unsigned int feature_index = 0; feature_index < count; feature_index++)
-+ _hb_ot_layout_collect_lookups_lookups (face, table_tag, feature_index, lookup_indexes);
-+ } else {
-+ for (; *features; features++)
-+ {
-+ unsigned int feature_index;
-+ if (hb_ot_layout_language_find_feature (face, table_tag, script_index, language_index, *features, &feature_index))
-+ _hb_ot_layout_collect_lookups_lookups (face, table_tag, feature_index, lookup_indexes);
-+ }
-+ }
-+}
-+
-+static void
-+_hb_ot_layout_collect_lookups_languages (hb_face_t *face,
-+ hb_tag_t table_tag,
-+ unsigned int script_index,
-+ const hb_tag_t *languages,
-+ const hb_tag_t *features,
-+ hb_set_t *lookup_indexes /* OUT */)
-+{
-+ if (!languages)
-+ {
-+ /* All languages */
-+ unsigned int count = hb_ot_layout_script_get_language_tags (face, table_tag, script_index, 0, NULL, NULL);
-+ for (unsigned int language_index = 0; language_index < count; language_index++)
-+ _hb_ot_layout_collect_lookups_features (face, table_tag, script_index, language_index, features, lookup_indexes);
-+ } else {
-+ for (; *languages; languages++)
-+ {
-+ unsigned int language_index;
-+ if (hb_ot_layout_script_find_language (face, table_tag, script_index, *languages, &language_index))
-+ _hb_ot_layout_collect_lookups_features (face, table_tag, script_index, language_index, features, lookup_indexes);
-+ }
-+ }
-+}
-+
-+void
-+hb_ot_layout_collect_lookups (hb_face_t *face,
-+ hb_tag_t table_tag,
-+ const hb_tag_t *scripts,
-+ const hb_tag_t *languages,
-+ const hb_tag_t *features,
-+ hb_set_t *lookup_indexes /* OUT */)
-+{
-+ if (!scripts)
-+ {
-+ /* All scripts */
-+ unsigned int count = hb_ot_layout_table_get_script_tags (face, table_tag, 0, NULL, NULL);
-+ for (unsigned int script_index = 0; script_index < count; script_index++)
-+ _hb_ot_layout_collect_lookups_languages (face, table_tag, script_index, languages, features, lookup_indexes);
-+ } else {
-+ for (; *scripts; scripts++)
-+ {
-+ unsigned int script_index;
-+ if (hb_ot_layout_table_find_script (face, table_tag, *scripts, &script_index))
-+ _hb_ot_layout_collect_lookups_languages (face, table_tag, script_index, languages, features, lookup_indexes);
-+ }
-+ }
-+}
-+
- void
- hb_ot_layout_lookup_collect_glyphs (hb_face_t *face,
- hb_tag_t table_tag,
-@@ -418,13 +515,13 @@
- case HB_OT_TAG_GSUB:
- {
- const OT::SubstLookup& l = hb_ot_layout_from_face (face)->gsub->get_lookup (lookup_index);
-- l.collect_glyphs (&c);
-+ l.collect_glyphs_lookup (&c);
- return;
- }
- case HB_OT_TAG_GPOS:
- {
- const OT::PosLookup& l = hb_ot_layout_from_face (face)->gpos->get_lookup (lookup_index);
--// l.collect_glyphs (&c);
-+ l.collect_glyphs_lookup (&c);
- return;
- }
- }
-@@ -500,7 +597,10 @@
- hb_set_t *glyphs)
- {
- OT::hb_closure_context_t c (face, glyphs);
-- _get_gsub (face).closure_lookup (&c, lookup_index);
-+
-+ const OT::SubstLookup& l = _get_gsub (face).get_lookup (lookup_index);
-+
-+ l.closure (&c);
- }
-
- /*
-@@ -539,3 +639,34 @@
- {
- OT::GPOS::position_finish (font, buffer, zero_width_attached_marks);
- }
-+
-+hb_bool_t
-+hb_ot_layout_position_get_size (hb_face_t *face,
-+ uint16_t *data /* OUT, 5 items */)
-+{
-+ const OT::GPOS &gpos = _get_gpos (face);
-+ unsigned int script_index;
-+ gpos.find_script_index (HB_OT_TAG_DEFAULT_SCRIPT, &script_index);
-+ const OT::LangSys &l = gpos.get_script (script_index).get_lang_sys (HB_OT_TAG_DEFAULT_LANGUAGE);
-+
-+ unsigned int num_features = l.get_feature_count ();
-+ for (unsigned int i = 0; i < num_features; i++) {
-+ unsigned int f_index = l.get_feature_index (i);
-+
-+ if (HB_TAG ('s','i','z','e') == gpos.get_feature_tag (f_index))
-+ {
-+ const OT::Feature &f = gpos.get_feature (f_index);
-+ const OT::FeatureParams &params = f.get_feature_params ();
-+
-+ for (unsigned int i = 0; i < 5; i++)
-+ data[i] = params.u.size.params[i];
-+
-+ return true;
-+ }
-+ }
-+
-+ for (unsigned int i = 0; i < 5; i++)
-+ data[i] = 0;
-+
-+ return false;
-+}
-diff -ur harfbuzz-0.9.7.orig/src/hb-ot-layout.h harfbuzz-0.9.7/src/hb-ot-layout.h
---- harfbuzz-0.9.7.orig/src/hb-ot-layout.h 2012-11-17 03:50:38.000000000 +0100
-+++ harfbuzz-0.9.7/src/hb-ot-layout.h 2012-11-28 09:32:35.000000000 +0100
-@@ -179,15 +179,13 @@
- unsigned int *lookup_count /* IN/OUT */,
- unsigned int *lookup_indexes /* OUT */);
-
--#ifdef HB_NOT_IMPLEMENTED
- void
--Xhb_ot_layout_collect_lookups (hb_face_t *face,
-+hb_ot_layout_collect_lookups (hb_face_t *face,
- hb_tag_t table_tag,
- const hb_tag_t *scripts,
- const hb_tag_t *languages,
- const hb_tag_t *features,
- hb_set_t *lookup_indexes /* OUT */);
--#endif
-
- void
- hb_ot_shape_plan_collect_lookups (hb_shape_plan_t *shape_plan,
-@@ -279,6 +277,11 @@
- hb_glyph_position_t *positions /* IN / OUT */);
- #endif
-
-+/* Optical 'size' feature info. Returns true if found. */
-+hb_bool_t
-+hb_ot_layout_position_get_size (hb_face_t *face,
-+ uint16_t *data /* OUT, 5 items */);
-+
-
- HB_END_DECLS
-
-diff -ur harfbuzz-0.9.7.orig/src/hb-ot-maxp-table.hh harfbuzz-0.9.7/src/hb-ot-maxp-table.hh
---- harfbuzz-0.9.7.orig/src/hb-ot-maxp-table.hh 2012-11-17 03:44:57.000000000 +0100
-+++ harfbuzz-0.9.7/src/hb-ot-maxp-table.hh 2012-11-28 09:32:35.000000000 +0100
-@@ -48,7 +48,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (c->check_struct (this) &&
- likely (version.major == 1 || (version.major == 0 && version.minor == 0x5000)));
- }
-diff -ur harfbuzz-0.9.7.orig/src/hb-ot-name-table.hh harfbuzz-0.9.7/src/hb-ot-name-table.hh
---- harfbuzz-0.9.7.orig/src/hb-ot-name-table.hh 2012-11-17 03:45:06.000000000 +0100
-+++ harfbuzz-0.9.7/src/hb-ot-name-table.hh 2012-11-28 09:32:35.000000000 +0100
-@@ -57,7 +57,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c, void *base) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- /* We can check from base all the way up to the end of string... */
- return TRACE_RETURN (c->check_struct (this) && c->check_range ((char *) base, (unsigned int) length + offset));
- }
-@@ -99,7 +99,7 @@
- }
-
- inline bool sanitize_records (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- char *string_pool = (char *) this + stringOffset;
- unsigned int _count = count;
- for (unsigned int i = 0; i < _count; i++)
-@@ -108,7 +108,7 @@
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) {
-- TRACE_SANITIZE ();
-+ TRACE_SANITIZE (this);
- return TRACE_RETURN (c->check_struct (this) &&
- likely (format == 0 || format == 1) &&
- c->check_array (nameRecord, nameRecord[0].static_size, count) &&
-diff -ur harfbuzz-0.9.7.orig/src/hb-private.hh harfbuzz-0.9.7/src/hb-private.hh
---- harfbuzz-0.9.7.orig/src/hb-private.hh 2012-11-16 22:33:18.000000000 +0100
-+++ harfbuzz-0.9.7/src/hb-private.hh 2012-11-28 09:32:35.000000000 +0100
-@@ -62,6 +62,12 @@
- #endif
-
-
-+/* Void! */
-+struct _void_t;
-+typedef const _void_t &void_t;
-+#define VOID (* (const _void_t *) NULL)
-+
-+
- /* Basics */
-
-
-@@ -582,7 +588,11 @@
- } else
- fprintf (stderr, " " VRBAR LBAR);
-
-- if (func) {
-+ if (func)
-+ {
-+ /* Skip "typename" */
-+ if (0 == strncmp (func, "typename ", 9))
-+ func += 9;
- /* Skip return type */
- const char *space = strchr (func, ' ');
- if (space)
-@@ -657,10 +667,39 @@
-
-
- /*
-+ * Printer
-+ */
-+
-+template <typename T>
-+struct hb_printer_t {};
-+
-+template <>
-+struct hb_printer_t<bool> {
-+ const char *print (bool v) { return v ? "true" : "false"; }
-+};
-+
-+template <>
-+struct hb_printer_t<void_t> {
-+ const char *print (void_t v) { return ""; }
-+};
-+
-+
-+/*
- * Trace
- */
-
--template <int max_level>
-+template <typename T>
-+static inline void _hb_warn_no_return (bool returned)
-+{
-+ if (unlikely (!returned)) {
-+ fprintf (stderr, "OUCH, returned with no call to TRACE_RETURN. This is a bug, please report.\n");
-+ }
-+}
-+template <>
-+inline void _hb_warn_no_return<void_t> (bool returned)
-+{}
-+
-+template <int max_level, typename ret_t>
- struct hb_auto_trace_t {
- explicit inline hb_auto_trace_t (unsigned int *plevel_,
- const char *what_,
-@@ -678,23 +717,23 @@
- }
- inline ~hb_auto_trace_t (void)
- {
-- if (unlikely (!returned)) {
-- fprintf (stderr, "OUCH, returned with no call to TRACE_RETURN. This is a bug, please report. Level was %d.\n", plevel ? *plevel : -1);
-+ _hb_warn_no_return<ret_t> (returned);
-+ if (!returned) {
- _hb_debug_msg<max_level> (what, obj, NULL, true, plevel ? *plevel : 1, -1, " ");
-- return;
- }
--
- if (plevel) --*plevel;
- }
-
-- inline bool ret (bool v, unsigned int line = 0)
-+ inline ret_t ret (ret_t v, unsigned int line = 0)
- {
- if (unlikely (returned)) {
- fprintf (stderr, "OUCH, double calls to TRACE_RETURN. This is a bug, please report.\n");
- return v;
- }
-
-- _hb_debug_msg<max_level> (what, obj, NULL, true, plevel ? *plevel : 1, -1, "return %s (line %d)", v ? "true" : "false", line);
-+ _hb_debug_msg<max_level> (what, obj, NULL, true, plevel ? *plevel : 1, -1,
-+ "return %s (line %d)",
-+ hb_printer_t<ret_t>().print (v), line);
- if (plevel) --*plevel;
- plevel = NULL;
- returned = true;
-@@ -703,12 +742,12 @@
-
- private:
- unsigned int *plevel;
-- bool returned;
- const char *what;
- const void *obj;
-+ bool returned;
- };
--template <> /* Optimize when tracing is disabled */
--struct hb_auto_trace_t<0> {
-+template <typename ret_t> /* Optimize when tracing is disabled */
-+struct hb_auto_trace_t<0, ret_t> {
- explicit inline hb_auto_trace_t (unsigned int *plevel_ HB_UNUSED,
- const char *what HB_UNUSED,
- const void *obj HB_UNUSED,
-@@ -716,8 +755,7 @@
- const char *message HB_UNUSED,
- ...) {}
-
-- template <typename T>
-- inline T ret (T v, unsigned int line = 0) { return v; }
-+ inline ret_t ret (ret_t v, unsigned int line = 0) { return v; }
- };
-
- #define TRACE_RETURN(RET) trace.ret (RET, __LINE__)
-diff -ur harfbuzz-0.9.7.orig/src/hb-shape-plan.cc harfbuzz-0.9.7/src/hb-shape-plan.cc
---- harfbuzz-0.9.7.orig/src/hb-shape-plan.cc 2012-11-16 22:33:18.000000000 +0100
-+++ harfbuzz-0.9.7/src/hb-shape-plan.cc 2012-11-28 09:32:35.000000000 +0100
-@@ -304,4 +304,5 @@
- const char *
- hb_shape_plan_get_shaper (hb_shape_plan_t *shape_plan)
- {
-+ return shape_plan->shaper_name;
- }
diff --git a/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-open-file-private.hh b/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-open-file-private.hh
index 250504ae20b..20d5e871697 100644
--- a/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-open-file-private.hh
+++ b/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-open-file-private.hh
@@ -54,7 +54,7 @@ struct TTCHeader;
typedef struct TableRecord
{
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (c->check_struct (this));
}
@@ -103,7 +103,7 @@ typedef struct OffsetTable
public:
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (c->check_struct (this) && c->check_array (tables, TableRecord::static_size, numTables));
}
@@ -131,7 +131,7 @@ struct TTCHeaderVersion1
inline const OpenTypeFontFace& get_face (unsigned int i) const { return this+table[i]; }
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (table.sanitize (c, this));
}
@@ -170,7 +170,7 @@ struct TTCHeader
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
if (unlikely (!u.header.version.sanitize (c))) return TRACE_RETURN (false);
switch (u.header.version.major) {
case 2: /* version 2 is compatible with version 1 */
@@ -232,7 +232,7 @@ struct OpenTypeFontFile
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
if (unlikely (!u.tag.sanitize (c))) return TRACE_RETURN (false);
switch (u.tag) {
case CFFTag: /* All the non-collection tags */
diff --git a/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-open-type-private.hh b/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-open-type-private.hh
index 2372235a5ae..2e03dc3d0ca 100644
--- a/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-open-type-private.hh
+++ b/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-open-type-private.hh
@@ -37,7 +37,6 @@
namespace OT {
-
/*
* Casts
*/
@@ -166,24 +165,12 @@ ASSERT_STATIC (Type::min_size + 1 <= sizeof (_Null##Type))
#endif
-#define TRACE_SANITIZE(this) \
- hb_auto_trace_t<HB_DEBUG_SANITIZE, bool> trace \
- (&c->debug_depth, c->get_name (), this, HB_FUNC, \
- "");
+#define TRACE_SANITIZE() \
+ hb_auto_trace_t<HB_DEBUG_SANITIZE> trace (&c->debug_depth, "SANITIZE", this, HB_FUNC, "");
struct hb_sanitize_context_t
{
- inline const char *get_name (void) { return "SANITIZE"; }
- static const unsigned int max_debug_depth = HB_DEBUG_SANITIZE;
- typedef bool return_t;
- template <typename T>
- inline return_t process (const T &obj) { return obj.sanitize (this); }
- static return_t default_return_value (void) { return true; }
- bool stop_sublookup_iteration (const return_t r) const { return false; }
- return_t recurse (unsigned int lookup_index)
- { return default_return_value (); }
-
inline void init (hb_blob_t *b)
{
this->blob = hb_blob_reference (b);
@@ -218,11 +205,10 @@ struct hb_sanitize_context_t
{
const char *p = (const char *) base;
- hb_auto_trace_t<HB_DEBUG_SANITIZE, bool> trace
- (&this->debug_depth, "SANITIZE", this->blob, NULL,
- "check_range [%p..%p] (%d bytes) in [%p..%p]",
- p, p + len, len,
- this->start, this->end);
+ hb_auto_trace_t<HB_DEBUG_SANITIZE> trace (&this->debug_depth, "SANITIZE", this->blob, NULL,
+ "check_range [%p..%p] (%d bytes) in [%p..%p]",
+ p, p + len, len,
+ this->start, this->end);
return TRACE_RETURN (likely (this->start <= p && p <= this->end && (unsigned int) (this->end - p) >= len));
}
@@ -232,11 +218,10 @@ struct hb_sanitize_context_t
const char *p = (const char *) base;
bool overflows = _hb_unsigned_int_mul_overflows (len, record_size);
- hb_auto_trace_t<HB_DEBUG_SANITIZE, bool> trace
- (&this->debug_depth, "SANITIZE", this->blob, NULL,
- "check_array [%p..%p] (%d*%d=%ld bytes) in [%p..%p]",
- p, p + (record_size * len), record_size, len, (unsigned long) record_size * len,
- this->start, this->end);
+ hb_auto_trace_t<HB_DEBUG_SANITIZE> trace (&this->debug_depth, "SANITIZE", this->blob, NULL,
+ "check_array [%p..%p] (%d*%d=%ld bytes) in [%p..%p]",
+ p, p + (record_size * len), record_size, len, (unsigned long) record_size * len,
+ this->start, this->end);
return TRACE_RETURN (likely (!overflows && this->check_range (base, record_size * len)));
}
@@ -252,12 +237,11 @@ struct hb_sanitize_context_t
const char *p = (const char *) base;
this->edit_count++;
- hb_auto_trace_t<HB_DEBUG_SANITIZE, bool> trace
- (&this->debug_depth, "SANITIZE", this->blob, NULL,
- "may_edit(%u) [%p..%p] (%d bytes) in [%p..%p] -> %s",
- this->edit_count,
- p, p + len, len,
- this->start, this->end);
+ hb_auto_trace_t<HB_DEBUG_SANITIZE> trace (&this->debug_depth, "SANITIZE", this->blob, NULL,
+ "may_edit(%u) [%p..%p] (%d bytes) in [%p..%p] -> %s",
+ this->edit_count,
+ p, p + len, len,
+ this->start, this->end);
return TRACE_RETURN (this->writable);
}
@@ -352,10 +336,8 @@ struct Sanitizer
#endif
-#define TRACE_SERIALIZE(this) \
- hb_auto_trace_t<HB_DEBUG_SERIALIZE, bool> trace \
- (&c->debug_depth, "SERIALIZE", c, HB_FUNC, \
- "");
+#define TRACE_SERIALIZE() \
+ hb_auto_trace_t<HB_DEBUG_SERIALIZE> trace (&c->debug_depth, "SERIALIZE", c, HB_FUNC, "");
struct hb_serialize_context_t
@@ -549,7 +531,7 @@ struct IntType
inline int cmp (IntType<Type> va) const { Type a = va; Type b = v; return a < b ? -1 : a == b ? 0 : +1; }
inline int cmp (Type a) const { Type b = v; return a < b ? -1 : a == b ? 0 : +1; }
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (likely (c->check_struct (this)));
}
protected:
@@ -574,7 +556,7 @@ typedef USHORT UFWORD;
struct LONGDATETIME
{
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (likely (c->check_struct (this)));
}
private:
@@ -638,7 +620,7 @@ struct FixedVersion
inline uint32_t to_int (void) const { return (major << 16) + minor; }
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (c->check_struct (this));
}
@@ -678,7 +660,7 @@ struct GenericOffsetTo : OffsetType
}
inline bool sanitize (hb_sanitize_context_t *c, void *base) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
if (unlikely (!c->check_struct (this))) return TRACE_RETURN (false);
unsigned int offset = *this;
if (unlikely (!offset)) return TRACE_RETURN (true);
@@ -687,7 +669,7 @@ struct GenericOffsetTo : OffsetType
}
template <typename T>
inline bool sanitize (hb_sanitize_context_t *c, void *base, T user_data) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
if (unlikely (!c->check_struct (this))) return TRACE_RETURN (false);
unsigned int offset = *this;
if (unlikely (!offset)) return TRACE_RETURN (true);
@@ -751,7 +733,7 @@ struct GenericArrayOf
inline bool serialize (hb_serialize_context_t *c,
unsigned int items_len)
{
- TRACE_SERIALIZE (this);
+ TRACE_SERIALIZE ();
if (unlikely (!c->extend_min (*this))) return TRACE_RETURN (false);
len.set (items_len); /* TODO(serialize) Overflow? */
if (unlikely (!c->extend (*this))) return TRACE_RETURN (false);
@@ -762,7 +744,7 @@ struct GenericArrayOf
Supplier<Type> &items,
unsigned int items_len)
{
- TRACE_SERIALIZE (this);
+ TRACE_SERIALIZE ();
if (unlikely (!serialize (c, items_len))) return TRACE_RETURN (false);
for (unsigned int i = 0; i < items_len; i++)
array[i] = items[i];
@@ -771,7 +753,7 @@ struct GenericArrayOf
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
if (unlikely (!sanitize_shallow (c))) return TRACE_RETURN (false);
/* Note: for structs that do not reference other structs,
@@ -786,7 +768,7 @@ struct GenericArrayOf
return TRACE_RETURN (true);
}
inline bool sanitize (hb_sanitize_context_t *c, void *base) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
if (unlikely (!sanitize_shallow (c))) return TRACE_RETURN (false);
unsigned int count = len;
for (unsigned int i = 0; i < count; i++)
@@ -796,7 +778,7 @@ struct GenericArrayOf
}
template <typename T>
inline bool sanitize (hb_sanitize_context_t *c, void *base, T user_data) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
if (unlikely (!sanitize_shallow (c))) return TRACE_RETURN (false);
unsigned int count = len;
for (unsigned int i = 0; i < count; i++)
@@ -807,7 +789,7 @@ struct GenericArrayOf
private:
inline bool sanitize_shallow (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (c->check_struct (this) && c->check_array (this, Type::static_size, len));
}
@@ -849,12 +831,12 @@ struct OffsetListOf : OffsetArrayOf<Type>
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (OffsetArrayOf<Type>::sanitize (c, this));
}
template <typename T>
inline bool sanitize (hb_sanitize_context_t *c, T user_data) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (OffsetArrayOf<Type>::sanitize (c, this, user_data));
}
};
@@ -877,7 +859,7 @@ struct HeadlessArrayOf
Supplier<Type> &items,
unsigned int items_len)
{
- TRACE_SERIALIZE (this);
+ TRACE_SERIALIZE ();
if (unlikely (!c->extend_min (*this))) return TRACE_RETURN (false);
len.set (items_len); /* TODO(serialize) Overflow? */
if (unlikely (!items_len)) return TRACE_RETURN (true);
@@ -894,7 +876,7 @@ struct HeadlessArrayOf
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
if (unlikely (!sanitize_shallow (c))) return TRACE_RETURN (false);
/* Note: for structs that do not reference other structs,
diff --git a/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-head-table.hh b/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-head-table.hh
index 3a9451295de..b3b3a14c682 100644
--- a/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-head-table.hh
+++ b/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-head-table.hh
@@ -52,7 +52,7 @@ struct head
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (c->check_struct (this) && likely (version.major == 1));
}
diff --git a/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-hhea-table.hh b/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-hhea-table.hh
index 2b89c4e0208..fa3088cc3ca 100644
--- a/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-hhea-table.hh
+++ b/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-hhea-table.hh
@@ -45,7 +45,7 @@ struct hhea
static const hb_tag_t Tag = HB_OT_TAG_hhea;
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (c->check_struct (this) && likely (version.major == 1));
}
diff --git a/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-hmtx-table.hh b/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-hmtx-table.hh
index b94337d0be7..e09996ce42e 100644
--- a/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-hmtx-table.hh
+++ b/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-hmtx-table.hh
@@ -53,7 +53,7 @@ struct hmtx
static const hb_tag_t Tag = HB_OT_TAG_hmtx;
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
/* We don't check for anything specific here. The users of the
* struct do all the hard work... */
return TRACE_RETURN (true);
diff --git a/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-layout-common-private.hh b/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-layout-common-private.hh
index 0b753b83346..10dc3c47b06 100644
--- a/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-layout-common-private.hh
+++ b/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-layout-common-private.hh
@@ -61,7 +61,7 @@ struct Record
}
inline bool sanitize (hb_sanitize_context_t *c, void *base) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (c->check_struct (this) && offset.sanitize (c, base));
}
@@ -115,7 +115,7 @@ struct RecordListOf : RecordArrayOf<Type>
{ return this+RecordArrayOf<Type>::operator [](i).offset; }
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (RecordArrayOf<Type>::sanitize (c, this));
}
};
@@ -129,7 +129,7 @@ struct RangeRecord
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (c->check_struct (this));
}
@@ -193,7 +193,7 @@ struct LangSys
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (c->check_struct (this) && featureIndex.sanitize (c));
}
@@ -231,7 +231,7 @@ struct Script
inline const LangSys& get_default_lang_sys (void) const { return this+defaultLangSys; }
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (defaultLangSys.sanitize (c, this) && langSys.sanitize (c, this));
}
@@ -251,7 +251,7 @@ typedef RecordListOf<Script> ScriptList;
struct FeatureParamsSize
{
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (c->check_struct (this));
}
@@ -266,7 +266,7 @@ struct FeatureParams
* the length of the table to that of the FeatureParamsSize. */
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (c->check_struct (this));
}
@@ -291,7 +291,7 @@ struct Feature
{ return this+featureParams; }
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (c->check_struct (this) && lookupIndex.sanitize (c) &&
featureParams.sanitize (c, this));
}
@@ -350,7 +350,7 @@ struct Lookup
uint32_t lookup_props,
unsigned int num_subtables)
{
- TRACE_SERIALIZE (this);
+ TRACE_SERIALIZE ();
if (unlikely (!c->extend_min (*this))) return TRACE_RETURN (false);
lookupType.set (lookup_type);
lookupFlag.set (lookup_props & 0xFFFF);
@@ -364,7 +364,7 @@ struct Lookup
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
/* Real sanitize of the subtables is done by GSUB/GPOS/... */
if (!(c->check_struct (this) && subTable.sanitize (c))) return TRACE_RETURN (false);
if (lookupFlag & LookupFlag::UseMarkFilteringSet)
@@ -409,7 +409,7 @@ struct CoverageFormat1
Supplier<GlyphID> &glyphs,
unsigned int num_glyphs)
{
- TRACE_SERIALIZE (this);
+ TRACE_SERIALIZE ();
if (unlikely (!c->extend_min (*this))) return TRACE_RETURN (false);
glyphArray.len.set (num_glyphs);
if (unlikely (!c->extend (glyphArray))) return TRACE_RETURN (false);
@@ -420,7 +420,7 @@ struct CoverageFormat1
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (glyphArray.sanitize (c));
}
@@ -477,7 +477,7 @@ struct CoverageFormat2
Supplier<GlyphID> &glyphs,
unsigned int num_glyphs)
{
- TRACE_SERIALIZE (this);
+ TRACE_SERIALIZE ();
if (unlikely (!c->extend_min (*this))) return TRACE_RETURN (false);
if (unlikely (!num_glyphs)) return TRACE_RETURN (true);
@@ -506,7 +506,7 @@ struct CoverageFormat2
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (rangeRecord.sanitize (c));
}
@@ -573,6 +573,8 @@ struct CoverageFormat2
struct Coverage
{
+ inline unsigned int operator () (hb_codepoint_t glyph_id) const { return get_coverage (glyph_id); }
+
inline unsigned int get_coverage (hb_codepoint_t glyph_id) const
{
switch (u.format) {
@@ -586,7 +588,7 @@ struct Coverage
Supplier<GlyphID> &glyphs,
unsigned int num_glyphs)
{
- TRACE_SERIALIZE (this);
+ TRACE_SERIALIZE ();
if (unlikely (!c->extend_min (*this))) return TRACE_RETURN (false);
unsigned int num_ranges = 1;
for (unsigned int i = 1; i < num_glyphs; i++)
@@ -601,7 +603,7 @@ struct Coverage
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
if (!u.format.sanitize (c)) return TRACE_RETURN (false);
switch (u.format) {
case 1: return TRACE_RETURN (u.format1.sanitize (c));
@@ -712,7 +714,7 @@ struct ClassDefFormat1
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (c->check_struct (this) && classValue.sanitize (c));
}
@@ -755,7 +757,7 @@ struct ClassDefFormat2
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (rangeRecord.sanitize (c));
}
@@ -786,6 +788,8 @@ struct ClassDefFormat2
struct ClassDef
{
+ inline unsigned int operator () (hb_codepoint_t glyph_id) const { return get_class (glyph_id); }
+
inline unsigned int get_class (hb_codepoint_t glyph_id) const
{
switch (u.format) {
@@ -796,7 +800,7 @@ struct ClassDef
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
if (!u.format.sanitize (c)) return TRACE_RETURN (false);
switch (u.format) {
case 1: return TRACE_RETURN (u.format1.sanitize (c));
@@ -888,7 +892,7 @@ struct Device
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (c->check_struct (this) && c->check_range (this, this->get_size ()));
}
diff --git a/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-layout-gdef-table.hh b/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-layout-gdef-table.hh
index ff2d09c51f0..900dedd1a3f 100644
--- a/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-layout-gdef-table.hh
+++ b/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-layout-gdef-table.hh
@@ -51,7 +51,7 @@ struct AttachList
unsigned int *point_count /* IN/OUT */,
unsigned int *point_array /* OUT */) const
{
- unsigned int index = (this+coverage).get_coverage (glyph_id);
+ unsigned int index = (this+coverage) (glyph_id);
if (index == NOT_COVERED)
{
if (point_count)
@@ -72,7 +72,7 @@ struct AttachList
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (coverage.sanitize (c, this) && attachPoint.sanitize (c, this));
}
@@ -102,7 +102,7 @@ struct CaretValueFormat1
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (c->check_struct (this));
}
@@ -128,7 +128,7 @@ struct CaretValueFormat2
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (c->check_struct (this));
}
@@ -151,7 +151,7 @@ struct CaretValueFormat3
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (c->check_struct (this) && deviceTable.sanitize (c, this));
}
@@ -179,7 +179,7 @@ struct CaretValue
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
if (!u.format.sanitize (c)) return TRACE_RETURN (false);
switch (u.format) {
case 1: return TRACE_RETURN (u.format1.sanitize (c));
@@ -220,7 +220,7 @@ struct LigGlyph
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (carets.sanitize (c, this));
}
@@ -242,7 +242,7 @@ struct LigCaretList
unsigned int *caret_count /* IN/OUT */,
hb_position_t *caret_array /* OUT */) const
{
- unsigned int index = (this+coverage).get_coverage (glyph_id);
+ unsigned int index = (this+coverage) (glyph_id);
if (index == NOT_COVERED)
{
if (caret_count)
@@ -254,7 +254,7 @@ struct LigCaretList
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (coverage.sanitize (c, this) && ligGlyph.sanitize (c, this));
}
@@ -276,7 +276,7 @@ struct MarkGlyphSetsFormat1
{ return (this+coverage[set_index]).get_coverage (glyph_id) != NOT_COVERED; }
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (coverage.sanitize (c, this));
}
@@ -300,7 +300,7 @@ struct MarkGlyphSets
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
if (!u.format.sanitize (c)) return TRACE_RETURN (false);
switch (u.format) {
case 1: return TRACE_RETURN (u.format1.sanitize (c));
@@ -365,7 +365,7 @@ struct GDEF
{ return version.to_int () >= 0x00010002 && (this+markGlyphSetsDef[0]).covers (set_index, glyph_id); }
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (version.sanitize (c) &&
likely (version.major == 1) &&
glyphClassDef.sanitize (c, this) &&
diff --git a/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-layout-gpos-table.hh b/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-layout-gpos-table.hh
index 8f0d38feeba..afe18b5fc80 100644
--- a/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-layout-gpos-table.hh
+++ b/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-layout-gpos-table.hh
@@ -172,12 +172,12 @@ struct ValueFormat : USHORT
}
inline bool sanitize_value (hb_sanitize_context_t *c, void *base, Value *values) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (c->check_range (values, get_size ()) && (!has_device () || sanitize_value_devices (c, base, values)));
}
inline bool sanitize_values (hb_sanitize_context_t *c, void *base, Value *values, unsigned int count) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
unsigned int len = get_len ();
if (!c->check_array (values, get_size (), count)) return TRACE_RETURN (false);
@@ -195,7 +195,7 @@ struct ValueFormat : USHORT
/* Just sanitize referenced Device tables. Doesn't check the values themselves. */
inline bool sanitize_values_stride_unsafe (hb_sanitize_context_t *c, void *base, Value *values, unsigned int count, unsigned int stride) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
if (!has_device ()) return TRACE_RETURN (true);
@@ -212,6 +212,9 @@ struct ValueFormat : USHORT
struct AnchorFormat1
{
+ friend struct Anchor;
+
+ private:
inline void get_anchor (hb_font_t *font, hb_codepoint_t glyph_id HB_UNUSED,
hb_position_t *x, hb_position_t *y) const
{
@@ -220,7 +223,7 @@ struct AnchorFormat1
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (c->check_struct (this));
}
@@ -234,6 +237,9 @@ struct AnchorFormat1
struct AnchorFormat2
{
+ friend struct Anchor;
+
+ private:
inline void get_anchor (hb_font_t *font, hb_codepoint_t glyph_id,
hb_position_t *x, hb_position_t *y) const
{
@@ -249,7 +255,7 @@ struct AnchorFormat2
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (c->check_struct (this));
}
@@ -264,6 +270,9 @@ struct AnchorFormat2
struct AnchorFormat3
{
+ friend struct Anchor;
+
+ private:
inline void get_anchor (hb_font_t *font, hb_codepoint_t glyph_id HB_UNUSED,
hb_position_t *x, hb_position_t *y) const
{
@@ -277,7 +286,7 @@ struct AnchorFormat3
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (c->check_struct (this) && xDeviceTable.sanitize (c, this) && yDeviceTable.sanitize (c, this));
}
@@ -312,7 +321,7 @@ struct Anchor
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
if (!u.format.sanitize (c)) return TRACE_RETURN (false);
switch (u.format) {
case 1: return TRACE_RETURN (u.format1.sanitize (c));
@@ -342,7 +351,7 @@ struct AnchorMatrix
}
inline bool sanitize (hb_sanitize_context_t *c, unsigned int cols) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
if (!c->check_struct (this)) return TRACE_RETURN (false);
if (unlikely (rows > 0 && cols >= ((unsigned int) -1) / rows)) return TRACE_RETURN (false);
unsigned int count = rows * cols;
@@ -367,7 +376,7 @@ struct MarkRecord
friend struct MarkArray;
inline bool sanitize (hb_sanitize_context_t *c, void *base) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (c->check_struct (this) && markAnchor.sanitize (c, base));
}
@@ -387,7 +396,7 @@ struct MarkArray : ArrayOf<MarkRecord> /* Array of MarkRecords--in Coverage orde
const AnchorMatrix &anchors, unsigned int class_count,
unsigned int glyph_pos) const
{
- TRACE_APPLY (this);
+ TRACE_APPLY ();
const MarkRecord &record = ArrayOf<MarkRecord>::operator[](mark_index);
unsigned int mark_class = record.klass;
@@ -409,7 +418,7 @@ struct MarkArray : ArrayOf<MarkRecord> /* Array of MarkRecords--in Coverage orde
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (ArrayOf<MarkRecord>::sanitize (c, this));
}
};
@@ -419,11 +428,9 @@ struct MarkArray : ArrayOf<MarkRecord> /* Array of MarkRecords--in Coverage orde
struct SinglePosFormat1
{
- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
- {
- TRACE_COLLECT_GLYPHS (this);
- (this+coverage).add_coverage (&c->input);
- }
+ friend struct SinglePos;
+
+ private:
inline const Coverage &get_coverage (void) const
{
@@ -432,8 +439,8 @@ struct SinglePosFormat1
inline bool apply (hb_apply_context_t *c) const
{
- TRACE_APPLY (this);
- unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
+ TRACE_APPLY ();
+ unsigned int index = (this+coverage) (c->buffer->cur().codepoint);
if (likely (index == NOT_COVERED)) return TRACE_RETURN (false);
valueFormat.apply_value (c->font, c->direction, this,
@@ -444,7 +451,7 @@ struct SinglePosFormat1
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (c->check_struct (this) && coverage.sanitize (c, this) && valueFormat.sanitize_value (c, this, values));
}
@@ -464,11 +471,9 @@ struct SinglePosFormat1
struct SinglePosFormat2
{
- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
- {
- TRACE_COLLECT_GLYPHS (this);
- (this+coverage).add_coverage (&c->input);
- }
+ friend struct SinglePos;
+
+ private:
inline const Coverage &get_coverage (void) const
{
@@ -477,8 +482,8 @@ struct SinglePosFormat2
inline bool apply (hb_apply_context_t *c) const
{
- TRACE_APPLY (this);
- unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
+ TRACE_APPLY ();
+ unsigned int index = (this+coverage) (c->buffer->cur().codepoint);
if (likely (index == NOT_COVERED)) return TRACE_RETURN (false);
if (likely (index >= valueCount)) return TRACE_RETURN (false);
@@ -492,7 +497,7 @@ struct SinglePosFormat2
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (c->check_struct (this) && coverage.sanitize (c, this) && valueFormat.sanitize_values (c, this, values, valueCount));
}
@@ -512,19 +517,31 @@ struct SinglePosFormat2
struct SinglePos
{
- template <typename context_t>
- inline typename context_t::return_t process (context_t *c) const
+ friend struct PosLookupSubTable;
+
+ private:
+
+ inline const Coverage &get_coverage (void) const
{
- TRACE_PROCESS (this);
switch (u.format) {
- case 1: return TRACE_RETURN (c->process (u.format1));
- case 2: return TRACE_RETURN (c->process (u.format2));
- default:return TRACE_RETURN (c->default_return_value ());
+ case 1: return u.format1.get_coverage ();
+ case 2: return u.format2.get_coverage ();
+ default:return Null(Coverage);
+ }
+ }
+
+ inline bool apply (hb_apply_context_t *c) const
+ {
+ TRACE_APPLY ();
+ switch (u.format) {
+ case 1: return TRACE_RETURN (u.format1.apply (c));
+ case 2: return TRACE_RETURN (u.format2.apply (c));
+ default:return TRACE_RETURN (false);
}
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
if (!u.format.sanitize (c)) return TRACE_RETURN (false);
switch (u.format) {
case 1: return TRACE_RETURN (u.format1.sanitize (c));
@@ -560,34 +577,17 @@ struct PairSet
{
friend struct PairPosFormat1;
- inline void collect_glyphs (hb_collect_glyphs_context_t *c,
- const ValueFormat *valueFormats) const
- {
- TRACE_COLLECT_GLYPHS (this);
- unsigned int len1 = valueFormats[0].get_len ();
- unsigned int len2 = valueFormats[1].get_len ();
- unsigned int record_size = USHORT::static_size * (1 + len1 + len2);
-
- const PairValueRecord *record = CastP<PairValueRecord> (array);
- unsigned int count = len;
- for (unsigned int i = 0; i < count; i++)
- {
- c->input.add (record->secondGlyph);
- record = &StructAtOffset<PairValueRecord> (record, record_size);
- }
- }
-
inline bool apply (hb_apply_context_t *c,
const ValueFormat *valueFormats,
unsigned int pos) const
{
- TRACE_APPLY (this);
+ TRACE_APPLY ();
unsigned int len1 = valueFormats[0].get_len ();
unsigned int len2 = valueFormats[1].get_len ();
unsigned int record_size = USHORT::static_size * (1 + len1 + len2);
- const PairValueRecord *record = CastP<PairValueRecord> (array);
unsigned int count = len;
+ const PairValueRecord *record = CastP<PairValueRecord> (array);
for (unsigned int i = 0; i < count; i++)
{
if (c->buffer->info[pos].codepoint == record->secondGlyph)
@@ -615,7 +615,7 @@ struct PairSet
};
inline bool sanitize (hb_sanitize_context_t *c, const sanitize_closure_t *closure) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
if (!(c->check_struct (this)
&& c->check_array (array, USHORT::static_size * closure->stride, len))) return TRACE_RETURN (false);
@@ -635,14 +635,9 @@ struct PairSet
struct PairPosFormat1
{
- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
- {
- TRACE_COLLECT_GLYPHS (this);
- (this+coverage).add_coverage (&c->input);
- unsigned int count = pairSet.len;
- for (unsigned int i = 0; i < count; i++)
- (this+pairSet[i]).collect_glyphs (c, &valueFormat1);
- }
+ friend struct PairPos;
+
+ private:
inline const Coverage &get_coverage (void) const
{
@@ -651,11 +646,11 @@ struct PairPosFormat1
inline bool apply (hb_apply_context_t *c) const
{
- TRACE_APPLY (this);
+ TRACE_APPLY ();
hb_apply_context_t::mark_skipping_forward_iterator_t skippy_iter (c, c->buffer->idx, 1);
if (skippy_iter.has_no_chance ()) return TRACE_RETURN (false);
- unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
+ unsigned int index = (this+coverage) (c->buffer->cur().codepoint);
if (likely (index == NOT_COVERED)) return TRACE_RETURN (false);
if (!skippy_iter.next ()) return TRACE_RETURN (false);
@@ -664,7 +659,7 @@ struct PairPosFormat1
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
unsigned int len1 = valueFormat1.get_len ();
unsigned int len2 = valueFormat2.get_len ();
@@ -698,23 +693,9 @@ struct PairPosFormat1
struct PairPosFormat2
{
- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
- {
- TRACE_COLLECT_GLYPHS (this);
- /* (this+coverage).add_coverage (&c->input); // Don't need this. */
-
- /* TODO only add values for pairs that have nonzero adjustments. */
+ friend struct PairPos;
- unsigned int count1 = class1Count;
- const ClassDef &klass1 = this+classDef1;
- for (unsigned int i = 0; i < count1; i++)
- klass1.add_class (&c->input, i);
-
- unsigned int count2 = class2Count;
- const ClassDef &klass2 = this+classDef2;
- for (unsigned int i = 0; i < count2; i++)
- klass2.add_class (&c->input, i);
- }
+ private:
inline const Coverage &get_coverage (void) const
{
@@ -723,11 +704,11 @@ struct PairPosFormat2
inline bool apply (hb_apply_context_t *c) const
{
- TRACE_APPLY (this);
+ TRACE_APPLY ();
hb_apply_context_t::mark_skipping_forward_iterator_t skippy_iter (c, c->buffer->idx, 1);
if (skippy_iter.has_no_chance ()) return TRACE_RETURN (false);
- unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
+ unsigned int index = (this+coverage) (c->buffer->cur().codepoint);
if (likely (index == NOT_COVERED)) return TRACE_RETURN (false);
if (!skippy_iter.next ()) return TRACE_RETURN (false);
@@ -736,8 +717,8 @@ struct PairPosFormat2
unsigned int len2 = valueFormat2.get_len ();
unsigned int record_len = len1 + len2;
- unsigned int klass1 = (this+classDef1).get_class (c->buffer->cur().codepoint);
- unsigned int klass2 = (this+classDef2).get_class (c->buffer->info[skippy_iter.idx].codepoint);
+ unsigned int klass1 = (this+classDef1) (c->buffer->cur().codepoint);
+ unsigned int klass2 = (this+classDef2) (c->buffer->info[skippy_iter.idx].codepoint);
if (unlikely (klass1 >= class1Count || klass2 >= class2Count)) return TRACE_RETURN (false);
const Value *v = &values[record_len * (klass1 * class2Count + klass2)];
@@ -754,7 +735,7 @@ struct PairPosFormat2
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
if (!(c->check_struct (this)
&& coverage.sanitize (c, this)
&& classDef1.sanitize (c, this)
@@ -802,19 +783,31 @@ struct PairPosFormat2
struct PairPos
{
- template <typename context_t>
- inline typename context_t::return_t process (context_t *c) const
+ friend struct PosLookupSubTable;
+
+ private:
+
+ inline const Coverage &get_coverage (void) const
+ {
+ switch (u.format) {
+ case 1: return u.format1.get_coverage ();
+ case 2: return u.format2.get_coverage ();
+ default:return Null(Coverage);
+ }
+ }
+
+ inline bool apply (hb_apply_context_t *c) const
{
- TRACE_PROCESS (this);
+ TRACE_APPLY ();
switch (u.format) {
- case 1: return TRACE_RETURN (c->process (u.format1));
- case 2: return TRACE_RETURN (c->process (u.format2));
- default:return TRACE_RETURN (c->default_return_value ());
+ case 1: return TRACE_RETURN (u.format1.apply (c));
+ case 2: return TRACE_RETURN (u.format2.apply (c));
+ default:return TRACE_RETURN (false);
}
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
if (!u.format.sanitize (c)) return TRACE_RETURN (false);
switch (u.format) {
case 1: return TRACE_RETURN (u.format1.sanitize (c));
@@ -837,7 +830,7 @@ struct EntryExitRecord
friend struct CursivePosFormat1;
inline bool sanitize (hb_sanitize_context_t *c, void *base) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (entryAnchor.sanitize (c, base) && exitAnchor.sanitize (c, base));
}
@@ -856,11 +849,9 @@ struct EntryExitRecord
struct CursivePosFormat1
{
- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
- {
- TRACE_COLLECT_GLYPHS (this);
- (this+coverage).add_coverage (&c->input);
- }
+ friend struct CursivePos;
+
+ private:
inline const Coverage &get_coverage (void) const
{
@@ -869,7 +860,7 @@ struct CursivePosFormat1
inline bool apply (hb_apply_context_t *c) const
{
- TRACE_APPLY (this);
+ TRACE_APPLY ();
/* We don't handle mark glyphs here. */
if (c->property & HB_OT_LAYOUT_GLYPH_PROPS_MARK) return TRACE_RETURN (false);
@@ -877,12 +868,12 @@ struct CursivePosFormat1
hb_apply_context_t::mark_skipping_forward_iterator_t skippy_iter (c, c->buffer->idx, 1);
if (skippy_iter.has_no_chance ()) return TRACE_RETURN (false);
- const EntryExitRecord &this_record = entryExitRecord[(this+coverage).get_coverage (c->buffer->cur().codepoint)];
+ const EntryExitRecord &this_record = entryExitRecord[(this+coverage) (c->buffer->cur().codepoint)];
if (!this_record.exitAnchor) return TRACE_RETURN (false);
if (!skippy_iter.next ()) return TRACE_RETURN (false);
- const EntryExitRecord &next_record = entryExitRecord[(this+coverage).get_coverage (c->buffer->info[skippy_iter.idx].codepoint)];
+ const EntryExitRecord &next_record = entryExitRecord[(this+coverage) (c->buffer->info[skippy_iter.idx].codepoint)];
if (!next_record.entryAnchor) return TRACE_RETURN (false);
unsigned int i = c->buffer->idx;
@@ -950,7 +941,7 @@ struct CursivePosFormat1
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (coverage.sanitize (c, this) && entryExitRecord.sanitize (c, this));
}
@@ -968,18 +959,29 @@ struct CursivePosFormat1
struct CursivePos
{
- template <typename context_t>
- inline typename context_t::return_t process (context_t *c) const
+ friend struct PosLookupSubTable;
+
+ private:
+
+ inline const Coverage &get_coverage (void) const
{
- TRACE_PROCESS (this);
switch (u.format) {
- case 1: return TRACE_RETURN (c->process (u.format1));
- default:return TRACE_RETURN (c->default_return_value ());
+ case 1: return u.format1.get_coverage ();
+ default:return Null(Coverage);
+ }
+ }
+
+ inline bool apply (hb_apply_context_t *c) const
+ {
+ TRACE_APPLY ();
+ switch (u.format) {
+ case 1: return TRACE_RETURN (u.format1.apply (c));
+ default:return TRACE_RETURN (false);
}
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
if (!u.format.sanitize (c)) return TRACE_RETURN (false);
switch (u.format) {
case 1: return TRACE_RETURN (u.format1.sanitize (c));
@@ -1002,13 +1004,9 @@ typedef AnchorMatrix BaseArray; /* base-major--
struct MarkBasePosFormat1
{
- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
- {
- TRACE_COLLECT_GLYPHS (this);
- (this+markCoverage).add_coverage (&c->input);
- (this+baseCoverage).add_coverage (&c->input);
- /* TODO only add combinations that have nonzero adjustment. */
- }
+ friend struct MarkBasePos;
+
+ private:
inline const Coverage &get_coverage (void) const
{
@@ -1017,8 +1015,8 @@ struct MarkBasePosFormat1
inline bool apply (hb_apply_context_t *c) const
{
- TRACE_APPLY (this);
- unsigned int mark_index = (this+markCoverage).get_coverage (c->buffer->cur().codepoint);
+ TRACE_APPLY ();
+ unsigned int mark_index = (this+markCoverage) (c->buffer->cur().codepoint);
if (likely (mark_index == NOT_COVERED)) return TRACE_RETURN (false);
/* now we search backwards for a non-mark glyph */
@@ -1034,14 +1032,14 @@ struct MarkBasePosFormat1
/* The following assertion is too strong, so we've disabled it. */
if (!(property & HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH)) {/*return TRACE_RETURN (false);*/}
- unsigned int base_index = (this+baseCoverage).get_coverage (c->buffer->info[skippy_iter.idx].codepoint);
+ unsigned int base_index = (this+baseCoverage) (c->buffer->info[skippy_iter.idx].codepoint);
if (base_index == NOT_COVERED) return TRACE_RETURN (false);
return TRACE_RETURN ((this+markArray).apply (c, mark_index, base_index, this+baseArray, classCount, skippy_iter.idx));
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (c->check_struct (this) && markCoverage.sanitize (c, this) && baseCoverage.sanitize (c, this) &&
markArray.sanitize (c, this) && baseArray.sanitize (c, this, (unsigned int) classCount));
}
@@ -1067,18 +1065,29 @@ struct MarkBasePosFormat1
struct MarkBasePos
{
- template <typename context_t>
- inline typename context_t::return_t process (context_t *c) const
+ friend struct PosLookupSubTable;
+
+ private:
+
+ inline const Coverage &get_coverage (void) const
+ {
+ switch (u.format) {
+ case 1: return u.format1.get_coverage ();
+ default:return Null(Coverage);
+ }
+ }
+
+ inline bool apply (hb_apply_context_t *c) const
{
- TRACE_PROCESS (this);
+ TRACE_APPLY ();
switch (u.format) {
- case 1: return TRACE_RETURN (c->process (u.format1));
- default:return TRACE_RETURN (c->default_return_value ());
+ case 1: return TRACE_RETURN (u.format1.apply (c));
+ default:return TRACE_RETURN (false);
}
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
if (!u.format.sanitize (c)) return TRACE_RETURN (false);
switch (u.format) {
case 1: return TRACE_RETURN (u.format1.sanitize (c));
@@ -1106,13 +1115,9 @@ typedef OffsetListOf<LigatureAttach> LigatureArray;
struct MarkLigPosFormat1
{
- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
- {
- TRACE_COLLECT_GLYPHS (this);
- (this+markCoverage).add_coverage (&c->input);
- (this+ligatureCoverage).add_coverage (&c->input);
- /* TODO only add combinations that have nonzero adjustment. */
- }
+ friend struct MarkLigPos;
+
+ private:
inline const Coverage &get_coverage (void) const
{
@@ -1121,8 +1126,8 @@ struct MarkLigPosFormat1
inline bool apply (hb_apply_context_t *c) const
{
- TRACE_APPLY (this);
- unsigned int mark_index = (this+markCoverage).get_coverage (c->buffer->cur().codepoint);
+ TRACE_APPLY ();
+ unsigned int mark_index = (this+markCoverage) (c->buffer->cur().codepoint);
if (likely (mark_index == NOT_COVERED)) return TRACE_RETURN (false);
/* now we search backwards for a non-mark glyph */
@@ -1134,7 +1139,7 @@ struct MarkLigPosFormat1
if (!(property & HB_OT_LAYOUT_GLYPH_PROPS_LIGATURE)) {/*return TRACE_RETURN (false);*/}
unsigned int j = skippy_iter.idx;
- unsigned int lig_index = (this+ligatureCoverage).get_coverage (c->buffer->info[j].codepoint);
+ unsigned int lig_index = (this+ligatureCoverage) (c->buffer->info[j].codepoint);
if (lig_index == NOT_COVERED) return TRACE_RETURN (false);
const LigatureArray& lig_array = this+ligatureArray;
@@ -1161,7 +1166,7 @@ struct MarkLigPosFormat1
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (c->check_struct (this) && markCoverage.sanitize (c, this) && ligatureCoverage.sanitize (c, this) &&
markArray.sanitize (c, this) && ligatureArray.sanitize (c, this, (unsigned int) classCount));
}
@@ -1188,18 +1193,29 @@ struct MarkLigPosFormat1
struct MarkLigPos
{
- template <typename context_t>
- inline typename context_t::return_t process (context_t *c) const
+ friend struct PosLookupSubTable;
+
+ private:
+
+ inline const Coverage &get_coverage (void) const
+ {
+ switch (u.format) {
+ case 1: return u.format1.get_coverage ();
+ default:return Null(Coverage);
+ }
+ }
+
+ inline bool apply (hb_apply_context_t *c) const
{
- TRACE_PROCESS (this);
+ TRACE_APPLY ();
switch (u.format) {
- case 1: return TRACE_RETURN (c->process (u.format1));
- default:return TRACE_RETURN (c->default_return_value ());
+ case 1: return TRACE_RETURN (u.format1.apply (c));
+ default:return TRACE_RETURN (false);
}
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
if (!u.format.sanitize (c)) return TRACE_RETURN (false);
switch (u.format) {
case 1: return TRACE_RETURN (u.format1.sanitize (c));
@@ -1222,13 +1238,9 @@ typedef AnchorMatrix Mark2Array; /* mark2-major--
struct MarkMarkPosFormat1
{
- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
- {
- TRACE_COLLECT_GLYPHS (this);
- (this+mark1Coverage).add_coverage (&c->input);
- (this+mark2Coverage).add_coverage (&c->input);
- /* TODO only add combinations that have nonzero adjustment. */
- }
+ friend struct MarkMarkPos;
+
+ private:
inline const Coverage &get_coverage (void) const
{
@@ -1237,8 +1249,8 @@ struct MarkMarkPosFormat1
inline bool apply (hb_apply_context_t *c) const
{
- TRACE_APPLY (this);
- unsigned int mark1_index = (this+mark1Coverage).get_coverage (c->buffer->cur().codepoint);
+ TRACE_APPLY ();
+ unsigned int mark1_index = (this+mark1Coverage) (c->buffer->cur().codepoint);
if (likely (mark1_index == NOT_COVERED)) return TRACE_RETURN (false);
/* now we search backwards for a suitable mark glyph until a non-mark glyph */
@@ -1271,14 +1283,14 @@ struct MarkMarkPosFormat1
return TRACE_RETURN (false);
good:
- unsigned int mark2_index = (this+mark2Coverage).get_coverage (c->buffer->info[j].codepoint);
+ unsigned int mark2_index = (this+mark2Coverage) (c->buffer->info[j].codepoint);
if (mark2_index == NOT_COVERED) return TRACE_RETURN (false);
return TRACE_RETURN ((this+mark1Array).apply (c, mark1_index, mark2_index, this+mark2Array, classCount, j));
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (c->check_struct (this) && mark1Coverage.sanitize (c, this) &&
mark2Coverage.sanitize (c, this) && mark1Array.sanitize (c, this)
&& mark2Array.sanitize (c, this, (unsigned int) classCount));
@@ -1307,18 +1319,29 @@ struct MarkMarkPosFormat1
struct MarkMarkPos
{
- template <typename context_t>
- inline typename context_t::return_t process (context_t *c) const
+ friend struct PosLookupSubTable;
+
+ private:
+
+ inline const Coverage &get_coverage (void) const
{
- TRACE_PROCESS (this);
switch (u.format) {
- case 1: return TRACE_RETURN (c->process (u.format1));
- default:return TRACE_RETURN (c->default_return_value ());
+ case 1: return u.format1.get_coverage ();
+ default:return Null(Coverage);
+ }
+ }
+
+ inline bool apply (hb_apply_context_t *c) const
+ {
+ TRACE_APPLY ();
+ switch (u.format) {
+ case 1: return TRACE_RETURN (u.format1.apply (c));
+ default:return TRACE_RETURN (false);
}
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
if (!u.format.sanitize (c)) return TRACE_RETURN (false);
switch (u.format) {
case 1: return TRACE_RETURN (u.format1.sanitize (c));
@@ -1334,13 +1357,50 @@ struct MarkMarkPos
};
-struct ContextPos : Context {};
+static inline bool position_lookup (hb_apply_context_t *c, unsigned int lookup_index);
+
+struct ContextPos : Context
+{
+ friend struct PosLookupSubTable;
+
+ private:
+ inline bool apply (hb_apply_context_t *c) const
+ {
+ TRACE_APPLY ();
+ return TRACE_RETURN (Context::apply (c, position_lookup));
+ }
+};
+
+struct ChainContextPos : ChainContext
+{
+ friend struct PosLookupSubTable;
+
+ private:
+ inline bool apply (hb_apply_context_t *c) const
+ {
+ TRACE_APPLY ();
+ return TRACE_RETURN (ChainContext::apply (c, position_lookup));
+ }
+};
-struct ChainContextPos : ChainContext {};
-struct ExtensionPos : Extension<ExtensionPos>
+struct ExtensionPos : Extension
{
- typedef struct PosLookupSubTable LookupSubTable;
+ friend struct PosLookupSubTable;
+
+ private:
+ inline const struct PosLookupSubTable& get_subtable (void) const
+ {
+ unsigned int offset = get_offset ();
+ if (unlikely (!offset)) return Null(PosLookupSubTable);
+ return StructAtOffset<PosLookupSubTable> (this, offset);
+ }
+
+ inline const Coverage &get_coverage (void) const;
+
+ inline bool apply (hb_apply_context_t *c) const;
+
+ inline bool sanitize (hb_sanitize_context_t *c);
};
@@ -1366,26 +1426,41 @@ struct PosLookupSubTable
Extension = 9
};
- template <typename context_t>
- inline typename context_t::return_t process (context_t *c, unsigned int lookup_type) const
+ inline const Coverage &get_coverage (unsigned int lookup_type) const
+ {
+ switch (lookup_type) {
+ case Single: return u.single.get_coverage ();
+ case Pair: return u.pair.get_coverage ();
+ case Cursive: return u.cursive.get_coverage ();
+ case MarkBase: return u.markBase.get_coverage ();
+ case MarkLig: return u.markLig.get_coverage ();
+ case MarkMark: return u.markMark.get_coverage ();
+ case Context: return u.context.get_coverage ();
+ case ChainContext: return u.chainContext.get_coverage ();
+ case Extension: return u.extension.get_coverage ();
+ default: return Null(Coverage);
+ }
+ }
+
+ inline bool apply (hb_apply_context_t *c, unsigned int lookup_type) const
{
- TRACE_PROCESS (this);
+ TRACE_APPLY ();
switch (lookup_type) {
- case Single: return TRACE_RETURN (u.single.process (c));
- case Pair: return TRACE_RETURN (u.pair.process (c));
- case Cursive: return TRACE_RETURN (u.cursive.process (c));
- case MarkBase: return TRACE_RETURN (u.markBase.process (c));
- case MarkLig: return TRACE_RETURN (u.markLig.process (c));
- case MarkMark: return TRACE_RETURN (u.markMark.process (c));
- case Context: return TRACE_RETURN (u.context.process (c));
- case ChainContext: return TRACE_RETURN (u.chainContext.process (c));
- case Extension: return TRACE_RETURN (u.extension.process (c));
- default: return TRACE_RETURN (c->default_return_value ());
+ case Single: return TRACE_RETURN (u.single.apply (c));
+ case Pair: return TRACE_RETURN (u.pair.apply (c));
+ case Cursive: return TRACE_RETURN (u.cursive.apply (c));
+ case MarkBase: return TRACE_RETURN (u.markBase.apply (c));
+ case MarkLig: return TRACE_RETURN (u.markLig.apply (c));
+ case MarkMark: return TRACE_RETURN (u.markMark.apply (c));
+ case Context: return TRACE_RETURN (u.context.apply (c));
+ case ChainContext: return TRACE_RETURN (u.chainContext.apply (c));
+ case Extension: return TRACE_RETURN (u.extension.apply (c));
+ default: return TRACE_RETURN (false);
}
}
inline bool sanitize (hb_sanitize_context_t *c, unsigned int lookup_type) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
if (!u.header.sub_format.sanitize (c))
return TRACE_RETURN (false);
switch (lookup_type) {
@@ -1405,7 +1480,7 @@ struct PosLookupSubTable
protected:
union {
struct {
- USHORT sub_format;
+ USHORT sub_format;
} header;
SinglePos single;
PairPos pair;
@@ -1427,53 +1502,34 @@ struct PosLookup : Lookup
inline const PosLookupSubTable& get_subtable (unsigned int i) const
{ return this+CastR<OffsetArrayOf<PosLookupSubTable> > (subTable)[i]; }
- template <typename context_t>
- inline typename context_t::return_t process (context_t *c) const
- {
- TRACE_PROCESS (this);
- unsigned int lookup_type = get_type ();
- unsigned int count = get_subtable_count ();
- for (unsigned int i = 0; i < count; i++) {
- typename context_t::return_t r = get_subtable (i).process (c, lookup_type);
- if (c->stop_sublookup_iteration (r))
- return TRACE_RETURN (r);
- }
- return TRACE_RETURN (c->default_return_value ());
- }
- template <typename context_t>
- static inline typename context_t::return_t process_recurse_func (context_t *c, unsigned int lookup_index);
-
- inline hb_collect_glyphs_context_t::return_t collect_glyphs_lookup (hb_collect_glyphs_context_t *c) const
- {
- TRACE_COLLECT_GLYPHS (this);
- c->set_recurse_func (process_recurse_func<hb_collect_glyphs_context_t>);
- return TRACE_RETURN (process (c));
- }
-
template <typename set_t>
inline void add_coverage (set_t *glyphs) const
{
- hb_get_coverage_context_t c;
const Coverage *last = NULL;
unsigned int count = get_subtable_count ();
for (unsigned int i = 0; i < count; i++) {
- const Coverage *coverage = &get_subtable (i).process (&c, get_type ());
- if (coverage != last) {
- coverage->add_coverage (glyphs);
- last = coverage;
+ const Coverage *c = &get_subtable (i).get_coverage (get_type ());
+ if (c != last) {
+ c->add_coverage (glyphs);
+ last = c;
}
}
}
inline bool apply_once (hb_apply_context_t *c) const
{
- TRACE_APPLY (this);
+ unsigned int lookup_type = get_type ();
+
if (!c->check_glyph_property (&c->buffer->cur(), c->lookup_props, &c->property))
- return TRACE_RETURN (false);
- return TRACE_RETURN (process (c));
- }
+ return false;
- static bool apply_recurse_func (hb_apply_context_t *c, unsigned int lookup_index);
+ unsigned int count = get_subtable_count ();
+ for (unsigned int i = 0; i < count; i++)
+ if (get_subtable (i).apply (c, lookup_type))
+ return true;
+
+ return false;
+ }
inline bool apply_string (hb_apply_context_t *c, const hb_set_digest_t *digest) const
{
@@ -1482,7 +1538,6 @@ struct PosLookup : Lookup
if (unlikely (!c->buffer->len || !c->lookup_mask))
return false;
- c->set_recurse_func (apply_recurse_func);
c->set_lookup (*this);
c->buffer->idx = 0;
@@ -1501,7 +1556,7 @@ struct PosLookup : Lookup
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
if (unlikely (!Lookup::sanitize (c))) return TRACE_RETURN (false);
OffsetArrayOf<PosLookupSubTable> &list = CastR<OffsetArrayOf<PosLookupSubTable> > (subTable);
return TRACE_RETURN (list.sanitize (c, this, get_type ()));
@@ -1529,7 +1584,7 @@ struct GPOS : GSUBGPOS
static inline void position_finish (hb_font_t *font, hb_buffer_t *buffer, hb_bool_t zero_width_attahced_marks);
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
if (unlikely (!GSUBGPOS::sanitize (c))) return TRACE_RETURN (false);
OffsetTo<PosLookupList> &list = CastR<OffsetTo<PosLookupList> > (lookupList);
return TRACE_RETURN (list.sanitize (c, this));
@@ -1618,25 +1673,38 @@ GPOS::position_finish (hb_font_t *font HB_UNUSED, hb_buffer_t *buffer, hb_bool_t
/* Out-of-class implementation for methods recursing */
-template <typename context_t>
-inline typename context_t::return_t PosLookup::process_recurse_func (context_t *c, unsigned int lookup_index)
+inline const Coverage & ExtensionPos::get_coverage (void) const
{
- const GPOS &gpos = *(hb_ot_layout_from_face (c->face)->gpos);
- const PosLookup &l = gpos.get_lookup (lookup_index);
- return l.process (c);
+ return get_subtable ().get_coverage (get_type ());
+}
+
+inline bool ExtensionPos::apply (hb_apply_context_t *c) const
+{
+ TRACE_APPLY ();
+ return TRACE_RETURN (get_subtable ().apply (c, get_type ()));
}
-inline bool PosLookup::apply_recurse_func (hb_apply_context_t *c, unsigned int lookup_index)
+inline bool ExtensionPos::sanitize (hb_sanitize_context_t *c)
+{
+ TRACE_SANITIZE ();
+ if (unlikely (!Extension::sanitize (c))) return TRACE_RETURN (false);
+ unsigned int offset = get_offset ();
+ if (unlikely (!offset)) return TRACE_RETURN (true);
+ return TRACE_RETURN (StructAtOffset<PosLookupSubTable> (this, offset).sanitize (c, get_type ()));
+}
+
+static inline bool position_lookup (hb_apply_context_t *c, unsigned int lookup_index)
{
const GPOS &gpos = *(hb_ot_layout_from_face (c->face)->gpos);
const PosLookup &l = gpos.get_lookup (lookup_index);
- unsigned int saved_lookup_props = c->lookup_props;
- unsigned int saved_property = c->property;
- c->set_lookup (l);
- bool ret = l.apply_once (c);
- c->lookup_props = saved_lookup_props;
- c->property = saved_property;
- return ret;
+
+ if (unlikely (c->nesting_level_left == 0))
+ return false;
+
+ hb_apply_context_t new_c (*c);
+ new_c.nesting_level_left--;
+ new_c.set_lookup (l);
+ return l.apply_once (&new_c);
}
diff --git a/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-layout-gsub-table.hh b/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-layout-gsub-table.hh
index 373cf6955d2..4acd67b3a3e 100644
--- a/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-layout-gsub-table.hh
+++ b/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-layout-gsub-table.hh
@@ -37,9 +37,13 @@ namespace OT {
struct SingleSubstFormat1
{
+ friend struct SingleSubst;
+
+ private:
+
inline void closure (hb_closure_context_t *c) const
{
- TRACE_CLOSURE (this);
+ TRACE_CLOSURE ();
Coverage::Iter iter;
for (iter.init (this+coverage); iter.more (); iter.next ()) {
hb_codepoint_t glyph_id = iter.get_glyph ();
@@ -50,7 +54,6 @@ struct SingleSubstFormat1
inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
{
- TRACE_COLLECT_GLYPHS (this);
Coverage::Iter iter;
for (iter.init (this+coverage); iter.more (); iter.next ()) {
hb_codepoint_t glyph_id = iter.get_glyph ();
@@ -64,17 +67,11 @@ struct SingleSubstFormat1
return this+coverage;
}
- inline bool would_apply (hb_would_apply_context_t *c) const
- {
- TRACE_WOULD_APPLY (this);
- return TRACE_RETURN (c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED);
- }
-
inline bool apply (hb_apply_context_t *c) const
{
- TRACE_APPLY (this);
+ TRACE_APPLY ();
hb_codepoint_t glyph_id = c->buffer->cur().codepoint;
- unsigned int index = (this+coverage).get_coverage (glyph_id);
+ unsigned int index = (this+coverage) (glyph_id);
if (likely (index == NOT_COVERED)) return TRACE_RETURN (false);
/* According to the Adobe Annotated OpenType Suite, result is always
@@ -90,7 +87,7 @@ struct SingleSubstFormat1
unsigned int num_glyphs,
int delta)
{
- TRACE_SERIALIZE (this);
+ TRACE_SERIALIZE ();
if (unlikely (!c->extend_min (*this))) return TRACE_RETURN (false);
if (unlikely (!coverage.serialize (c, this).serialize (c, glyphs, num_glyphs))) return TRACE_RETURN (false);
deltaGlyphID.set (delta); /* TODO(serilaize) overflow? */
@@ -98,7 +95,7 @@ struct SingleSubstFormat1
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (coverage.sanitize (c, this) && deltaGlyphID.sanitize (c));
}
@@ -115,9 +112,13 @@ struct SingleSubstFormat1
struct SingleSubstFormat2
{
+ friend struct SingleSubst;
+
+ private:
+
inline void closure (hb_closure_context_t *c) const
{
- TRACE_CLOSURE (this);
+ TRACE_CLOSURE ();
Coverage::Iter iter;
for (iter.init (this+coverage); iter.more (); iter.next ()) {
if (c->glyphs->has (iter.get_glyph ()))
@@ -127,7 +128,6 @@ struct SingleSubstFormat2
inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
{
- TRACE_COLLECT_GLYPHS (this);
Coverage::Iter iter;
for (iter.init (this+coverage); iter.more (); iter.next ()) {
c->input.add (iter.get_glyph ());
@@ -140,17 +140,11 @@ struct SingleSubstFormat2
return this+coverage;
}
- inline bool would_apply (hb_would_apply_context_t *c) const
- {
- TRACE_WOULD_APPLY (this);
- return TRACE_RETURN (c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED);
- }
-
inline bool apply (hb_apply_context_t *c) const
{
- TRACE_APPLY (this);
+ TRACE_APPLY ();
hb_codepoint_t glyph_id = c->buffer->cur().codepoint;
- unsigned int index = (this+coverage).get_coverage (glyph_id);
+ unsigned int index = (this+coverage) (glyph_id);
if (likely (index == NOT_COVERED)) return TRACE_RETURN (false);
if (unlikely (index >= substitute.len)) return TRACE_RETURN (false);
@@ -166,7 +160,7 @@ struct SingleSubstFormat2
Supplier<GlyphID> &substitutes,
unsigned int num_glyphs)
{
- TRACE_SERIALIZE (this);
+ TRACE_SERIALIZE ();
if (unlikely (!c->extend_min (*this))) return TRACE_RETURN (false);
if (unlikely (!substitute.serialize (c, substitutes, num_glyphs))) return TRACE_RETURN (false);
if (unlikely (!coverage.serialize (c, this).serialize (c, glyphs, num_glyphs))) return TRACE_RETURN (false);
@@ -174,7 +168,7 @@ struct SingleSubstFormat2
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (coverage.sanitize (c, this) && substitute.sanitize (c));
}
@@ -192,14 +186,47 @@ struct SingleSubstFormat2
struct SingleSubst
{
- template <typename context_t>
- inline typename context_t::return_t process (context_t *c) const
+ friend struct SubstLookupSubTable;
+ friend struct SubstLookup;
+
+ private:
+
+ inline void closure (hb_closure_context_t *c) const
{
- TRACE_PROCESS (this);
+ TRACE_CLOSURE ();
switch (u.format) {
- case 1: return TRACE_RETURN (c->process (u.format1));
- case 2: return TRACE_RETURN (c->process (u.format2));
- default:return TRACE_RETURN (c->default_return_value ());
+ case 1: u.format1.closure (c); break;
+ case 2: u.format2.closure (c); break;
+ default: break;
+ }
+ }
+
+ inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
+ {
+ TRACE_CLOSURE ();
+ switch (u.format) {
+ case 1: u.format1.collect_glyphs (c); break;
+ case 2: u.format2.collect_glyphs (c); break;
+ default: break;
+ }
+ }
+
+ inline const Coverage &get_coverage (void) const
+ {
+ switch (u.format) {
+ case 1: return u.format1.get_coverage ();
+ case 2: return u.format2.get_coverage ();
+ default:return Null(Coverage);
+ }
+ }
+
+ inline bool apply (hb_apply_context_t *c) const
+ {
+ TRACE_APPLY ();
+ switch (u.format) {
+ case 1: return TRACE_RETURN (u.format1.apply (c));
+ case 2: return TRACE_RETURN (u.format2.apply (c));
+ default:return TRACE_RETURN (false);
}
}
@@ -208,7 +235,7 @@ struct SingleSubst
Supplier<GlyphID> &substitutes,
unsigned int num_glyphs)
{
- TRACE_SERIALIZE (this);
+ TRACE_SERIALIZE ();
if (unlikely (!c->extend_min (u.format))) return TRACE_RETURN (false);
unsigned int format = 2;
int delta;
@@ -231,7 +258,7 @@ struct SingleSubst
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
if (!u.format.sanitize (c)) return TRACE_RETURN (false);
switch (u.format) {
case 1: return TRACE_RETURN (u.format1.sanitize (c));
@@ -251,9 +278,13 @@ struct SingleSubst
struct Sequence
{
+ friend struct MultipleSubstFormat1;
+
+ private:
+
inline void closure (hb_closure_context_t *c) const
{
- TRACE_CLOSURE (this);
+ TRACE_CLOSURE ();
unsigned int count = substitute.len;
for (unsigned int i = 0; i < count; i++)
c->glyphs->add (substitute[i]);
@@ -261,7 +292,6 @@ struct Sequence
inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
{
- TRACE_COLLECT_GLYPHS (this);
unsigned int count = substitute.len;
for (unsigned int i = 0; i < count; i++)
c->output.add (substitute[i]);
@@ -269,7 +299,7 @@ struct Sequence
inline bool apply (hb_apply_context_t *c) const
{
- TRACE_APPLY (this);
+ TRACE_APPLY ();
if (unlikely (!substitute.len)) return TRACE_RETURN (false);
unsigned int klass = c->property & HB_OT_LAYOUT_GLYPH_PROPS_LIGATURE ? HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH : 0;
@@ -287,14 +317,15 @@ struct Sequence
Supplier<GlyphID> &glyphs,
unsigned int num_glyphs)
{
- TRACE_SERIALIZE (this);
+ TRACE_SERIALIZE ();
if (unlikely (!c->extend_min (*this))) return TRACE_RETURN (false);
if (unlikely (!substitute.serialize (c, glyphs, num_glyphs))) return TRACE_RETURN (false);
return TRACE_RETURN (true);
}
+ public:
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (substitute.sanitize (c));
}
@@ -307,9 +338,13 @@ struct Sequence
struct MultipleSubstFormat1
{
+ friend struct MultipleSubst;
+
+ private:
+
inline void closure (hb_closure_context_t *c) const
{
- TRACE_CLOSURE (this);
+ TRACE_CLOSURE ();
Coverage::Iter iter;
for (iter.init (this+coverage); iter.more (); iter.next ()) {
if (c->glyphs->has (iter.get_glyph ()))
@@ -319,7 +354,6 @@ struct MultipleSubstFormat1
inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
{
- TRACE_COLLECT_GLYPHS (this);
(this+coverage).add_coverage (&c->input);
unsigned int count = sequence.len;
for (unsigned int i = 0; i < count; i++)
@@ -331,17 +365,11 @@ struct MultipleSubstFormat1
return this+coverage;
}
- inline bool would_apply (hb_would_apply_context_t *c) const
- {
- TRACE_WOULD_APPLY (this);
- return TRACE_RETURN (c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED);
- }
-
inline bool apply (hb_apply_context_t *c) const
{
- TRACE_APPLY (this);
+ TRACE_APPLY ();
- unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
+ unsigned int index = (this+coverage) (c->buffer->cur().codepoint);
if (likely (index == NOT_COVERED)) return TRACE_RETURN (false);
return TRACE_RETURN ((this+sequence[index]).apply (c));
@@ -353,7 +381,7 @@ struct MultipleSubstFormat1
unsigned int num_glyphs,
Supplier<GlyphID> &substitute_glyphs_list)
{
- TRACE_SERIALIZE (this);
+ TRACE_SERIALIZE ();
if (unlikely (!c->extend_min (*this))) return TRACE_RETURN (false);
if (unlikely (!sequence.serialize (c, num_glyphs))) return TRACE_RETURN (false);
for (unsigned int i = 0; i < num_glyphs; i++)
@@ -366,7 +394,7 @@ struct MultipleSubstFormat1
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (coverage.sanitize (c, this) && sequence.sanitize (c, this));
}
@@ -384,13 +412,42 @@ struct MultipleSubstFormat1
struct MultipleSubst
{
- template <typename context_t>
- inline typename context_t::return_t process (context_t *c) const
+ friend struct SubstLookupSubTable;
+ friend struct SubstLookup;
+
+ private:
+
+ inline void closure (hb_closure_context_t *c) const
+ {
+ TRACE_CLOSURE ();
+ switch (u.format) {
+ case 1: u.format1.closure (c); break;
+ default: break;
+ }
+ }
+
+ inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
+ {
+ switch (u.format) {
+ case 1: u.format1.collect_glyphs (c); break;
+ default: break;
+ }
+ }
+
+ inline const Coverage &get_coverage (void) const
+ {
+ switch (u.format) {
+ case 1: return u.format1.get_coverage ();
+ default:return Null(Coverage);
+ }
+ }
+
+ inline bool apply (hb_apply_context_t *c) const
{
- TRACE_PROCESS (this);
+ TRACE_APPLY ();
switch (u.format) {
- case 1: return TRACE_RETURN (c->process (u.format1));
- default:return TRACE_RETURN (c->default_return_value ());
+ case 1: return TRACE_RETURN (u.format1.apply (c));
+ default:return TRACE_RETURN (false);
}
}
@@ -400,7 +457,7 @@ struct MultipleSubst
unsigned int num_glyphs,
Supplier<GlyphID> &substitute_glyphs_list)
{
- TRACE_SERIALIZE (this);
+ TRACE_SERIALIZE ();
if (unlikely (!c->extend_min (u.format))) return TRACE_RETURN (false);
unsigned int format = 1;
u.format.set (format);
@@ -411,7 +468,7 @@ struct MultipleSubst
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
if (!u.format.sanitize (c)) return TRACE_RETURN (false);
switch (u.format) {
case 1: return TRACE_RETURN (u.format1.sanitize (c));
@@ -432,9 +489,13 @@ typedef ArrayOf<GlyphID> AlternateSet; /* Array of alternate GlyphIDs--in
struct AlternateSubstFormat1
{
+ friend struct AlternateSubst;
+
+ private:
+
inline void closure (hb_closure_context_t *c) const
{
- TRACE_CLOSURE (this);
+ TRACE_CLOSURE ();
Coverage::Iter iter;
for (iter.init (this+coverage); iter.more (); iter.next ()) {
if (c->glyphs->has (iter.get_glyph ())) {
@@ -448,7 +509,6 @@ struct AlternateSubstFormat1
inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
{
- TRACE_COLLECT_GLYPHS (this);
Coverage::Iter iter;
for (iter.init (this+coverage); iter.more (); iter.next ()) {
c->input.add (iter.get_glyph ());
@@ -464,18 +524,12 @@ struct AlternateSubstFormat1
return this+coverage;
}
- inline bool would_apply (hb_would_apply_context_t *c) const
- {
- TRACE_WOULD_APPLY (this);
- return TRACE_RETURN (c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED);
- }
-
inline bool apply (hb_apply_context_t *c) const
{
- TRACE_APPLY (this);
+ TRACE_APPLY ();
hb_codepoint_t glyph_id = c->buffer->cur().codepoint;
- unsigned int index = (this+coverage).get_coverage (glyph_id);
+ unsigned int index = (this+coverage) (glyph_id);
if (likely (index == NOT_COVERED)) return TRACE_RETURN (false);
const AlternateSet &alt_set = this+alternateSet[index];
@@ -504,7 +558,7 @@ struct AlternateSubstFormat1
unsigned int num_glyphs,
Supplier<GlyphID> &alternate_glyphs_list)
{
- TRACE_SERIALIZE (this);
+ TRACE_SERIALIZE ();
if (unlikely (!c->extend_min (*this))) return TRACE_RETURN (false);
if (unlikely (!alternateSet.serialize (c, num_glyphs))) return TRACE_RETURN (false);
for (unsigned int i = 0; i < num_glyphs; i++)
@@ -517,7 +571,7 @@ struct AlternateSubstFormat1
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (coverage.sanitize (c, this) && alternateSet.sanitize (c, this));
}
@@ -535,13 +589,42 @@ struct AlternateSubstFormat1
struct AlternateSubst
{
- template <typename context_t>
- inline typename context_t::return_t process (context_t *c) const
+ friend struct SubstLookupSubTable;
+ friend struct SubstLookup;
+
+ private:
+
+ inline void closure (hb_closure_context_t *c) const
+ {
+ TRACE_CLOSURE ();
+ switch (u.format) {
+ case 1: u.format1.closure (c); break;
+ default: break;
+ }
+ }
+
+ inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
{
- TRACE_PROCESS (this);
switch (u.format) {
- case 1: return TRACE_RETURN (c->process (u.format1));
- default:return TRACE_RETURN (c->default_return_value ());
+ case 1: u.format1.collect_glyphs (c); break;
+ default: break;
+ }
+ }
+
+ inline const Coverage &get_coverage (void) const
+ {
+ switch (u.format) {
+ case 1: return u.format1.get_coverage ();
+ default:return Null(Coverage);
+ }
+ }
+
+ inline bool apply (hb_apply_context_t *c) const
+ {
+ TRACE_APPLY ();
+ switch (u.format) {
+ case 1: return TRACE_RETURN (u.format1.apply (c));
+ default:return TRACE_RETURN (false);
}
}
@@ -551,7 +634,7 @@ struct AlternateSubst
unsigned int num_glyphs,
Supplier<GlyphID> &alternate_glyphs_list)
{
- TRACE_SERIALIZE (this);
+ TRACE_SERIALIZE ();
if (unlikely (!c->extend_min (u.format))) return TRACE_RETURN (false);
unsigned int format = 1;
u.format.set (format);
@@ -562,7 +645,7 @@ struct AlternateSubst
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
if (!u.format.sanitize (c)) return TRACE_RETURN (false);
switch (u.format) {
case 1: return TRACE_RETURN (u.format1.sanitize (c));
@@ -580,9 +663,13 @@ struct AlternateSubst
struct Ligature
{
+ friend struct LigatureSet;
+
+ private:
+
inline void closure (hb_closure_context_t *c) const
{
- TRACE_CLOSURE (this);
+ TRACE_CLOSURE ();
unsigned int count = component.len;
for (unsigned int i = 1; i < count; i++)
if (!c->glyphs->has (component[i]))
@@ -592,7 +679,6 @@ struct Ligature
inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
{
- TRACE_COLLECT_GLYPHS (this);
unsigned int count = component.len;
for (unsigned int i = 1; i < count; i++)
c->input.add (component[i]);
@@ -601,26 +687,25 @@ struct Ligature
inline bool would_apply (hb_would_apply_context_t *c) const
{
- TRACE_WOULD_APPLY (this);
if (c->len != component.len)
- return TRACE_RETURN (false);
+ return false;
for (unsigned int i = 1; i < c->len; i++)
if (likely (c->glyphs[i] != component[i]))
- return TRACE_RETURN (false);
+ return false;
- return TRACE_RETURN (true);
+ return true;
}
inline bool apply (hb_apply_context_t *c) const
{
- TRACE_APPLY (this);
+ TRACE_APPLY ();
unsigned int count = component.len;
if (unlikely (count < 1)) return TRACE_RETURN (false);
- unsigned int end_offset = 0;
- bool is_mark_ligature = false;
- unsigned int total_component_count = 0;
+ unsigned int end_offset;
+ bool is_mark_ligature;
+ unsigned int total_component_count;
if (likely (!match_input (c, count,
&component[1],
@@ -651,7 +736,7 @@ struct Ligature
Supplier<GlyphID> &components, /* Starting from second */
unsigned int num_components /* Including first component */)
{
- TRACE_SERIALIZE (this);
+ TRACE_SERIALIZE ();
if (unlikely (!c->extend_min (*this))) return TRACE_RETURN (false);
ligGlyph = ligature;
if (unlikely (!component.serialize (c, components, num_components))) return TRACE_RETURN (false);
@@ -660,7 +745,7 @@ struct Ligature
public:
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (ligGlyph.sanitize (c) && component.sanitize (c));
}
@@ -676,9 +761,13 @@ struct Ligature
struct LigatureSet
{
+ friend struct LigatureSubstFormat1;
+
+ private:
+
inline void closure (hb_closure_context_t *c) const
{
- TRACE_CLOSURE (this);
+ TRACE_CLOSURE ();
unsigned int num_ligs = ligature.len;
for (unsigned int i = 0; i < num_ligs; i++)
(this+ligature[i]).closure (c);
@@ -686,7 +775,6 @@ struct LigatureSet
inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
{
- TRACE_COLLECT_GLYPHS (this);
unsigned int num_ligs = ligature.len;
for (unsigned int i = 0; i < num_ligs; i++)
(this+ligature[i]).collect_glyphs (c);
@@ -694,20 +782,19 @@ struct LigatureSet
inline bool would_apply (hb_would_apply_context_t *c) const
{
- TRACE_WOULD_APPLY (this);
unsigned int num_ligs = ligature.len;
for (unsigned int i = 0; i < num_ligs; i++)
{
const Ligature &lig = this+ligature[i];
if (lig.would_apply (c))
- return TRACE_RETURN (true);
+ return true;
}
- return TRACE_RETURN (false);
+ return false;
}
inline bool apply (hb_apply_context_t *c) const
{
- TRACE_APPLY (this);
+ TRACE_APPLY ();
unsigned int num_ligs = ligature.len;
for (unsigned int i = 0; i < num_ligs; i++)
{
@@ -724,7 +811,7 @@ struct LigatureSet
unsigned int num_ligatures,
Supplier<GlyphID> &component_list /* Starting from second for each ligature */)
{
- TRACE_SERIALIZE (this);
+ TRACE_SERIALIZE ();
if (unlikely (!c->extend_min (*this))) return TRACE_RETURN (false);
if (unlikely (!ligature.serialize (c, num_ligatures))) return TRACE_RETURN (false);
for (unsigned int i = 0; i < num_ligatures; i++)
@@ -737,8 +824,9 @@ struct LigatureSet
return TRACE_RETURN (true);
}
+ public:
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (ligature.sanitize (c, this));
}
@@ -752,9 +840,13 @@ struct LigatureSet
struct LigatureSubstFormat1
{
+ friend struct LigatureSubst;
+
+ private:
+
inline void closure (hb_closure_context_t *c) const
{
- TRACE_CLOSURE (this);
+ TRACE_CLOSURE ();
Coverage::Iter iter;
for (iter.init (this+coverage); iter.more (); iter.next ()) {
if (c->glyphs->has (iter.get_glyph ()))
@@ -764,7 +856,6 @@ struct LigatureSubstFormat1
inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
{
- TRACE_COLLECT_GLYPHS (this);
Coverage::Iter iter;
for (iter.init (this+coverage); iter.more (); iter.next ()) {
c->input.add (iter.get_glyph ());
@@ -779,20 +870,15 @@ struct LigatureSubstFormat1
inline bool would_apply (hb_would_apply_context_t *c) const
{
- TRACE_WOULD_APPLY (this);
- unsigned int index = (this+coverage).get_coverage (c->glyphs[0]);
- if (likely (index == NOT_COVERED)) return TRACE_RETURN (false);
-
- const LigatureSet &lig_set = this+ligatureSet[index];
- return TRACE_RETURN (lig_set.would_apply (c));
+ return (this+ligatureSet[(this+coverage) (c->glyphs[0])]).would_apply (c);
}
inline bool apply (hb_apply_context_t *c) const
{
- TRACE_APPLY (this);
+ TRACE_APPLY ();
hb_codepoint_t glyph_id = c->buffer->cur().codepoint;
- unsigned int index = (this+coverage).get_coverage (glyph_id);
+ unsigned int index = (this+coverage) (glyph_id);
if (likely (index == NOT_COVERED)) return TRACE_RETURN (false);
const LigatureSet &lig_set = this+ligatureSet[index];
@@ -807,7 +893,7 @@ struct LigatureSubstFormat1
Supplier<unsigned int> &component_count_list,
Supplier<GlyphID> &component_list /* Starting from second for each ligature */)
{
- TRACE_SERIALIZE (this);
+ TRACE_SERIALIZE ();
if (unlikely (!c->extend_min (*this))) return TRACE_RETURN (false);
if (unlikely (!ligatureSet.serialize (c, num_first_glyphs))) return TRACE_RETURN (false);
for (unsigned int i = 0; i < num_first_glyphs; i++)
@@ -822,7 +908,7 @@ struct LigatureSubstFormat1
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (coverage.sanitize (c, this) && ligatureSet.sanitize (c, this));
}
@@ -840,13 +926,50 @@ struct LigatureSubstFormat1
struct LigatureSubst
{
- template <typename context_t>
- inline typename context_t::return_t process (context_t *c) const
+ friend struct SubstLookupSubTable;
+ friend struct SubstLookup;
+
+ private:
+
+ inline void closure (hb_closure_context_t *c) const
+ {
+ TRACE_CLOSURE ();
+ switch (u.format) {
+ case 1: u.format1.closure (c); break;
+ default: break;
+ }
+ }
+
+ inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
+ {
+ switch (u.format) {
+ case 1: u.format1.collect_glyphs (c); break;
+ default: break;
+ }
+ }
+
+ inline const Coverage &get_coverage (void) const
+ {
+ switch (u.format) {
+ case 1: return u.format1.get_coverage ();
+ default:return Null(Coverage);
+ }
+ }
+
+ inline bool would_apply (hb_would_apply_context_t *c) const
+ {
+ switch (u.format) {
+ case 1: return u.format1.would_apply (c);
+ default:return false;
+ }
+ }
+
+ inline bool apply (hb_apply_context_t *c) const
{
- TRACE_PROCESS (this);
+ TRACE_APPLY ();
switch (u.format) {
- case 1: return TRACE_RETURN (c->process (u.format1));
- default:return TRACE_RETURN (c->default_return_value ());
+ case 1: return TRACE_RETURN (u.format1.apply (c));
+ default:return TRACE_RETURN (false);
}
}
@@ -858,7 +981,7 @@ struct LigatureSubst
Supplier<unsigned int> &component_count_list,
Supplier<GlyphID> &component_list /* Starting from second for each ligature */)
{
- TRACE_SERIALIZE (this);
+ TRACE_SERIALIZE ();
if (unlikely (!c->extend_min (u.format))) return TRACE_RETURN (false);
unsigned int format = 1;
u.format.set (format);
@@ -870,7 +993,7 @@ struct LigatureSubst
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
if (!u.format.sanitize (c)) return TRACE_RETURN (false);
switch (u.format) {
case 1: return TRACE_RETURN (u.format1.sanitize (c));
@@ -886,13 +1009,83 @@ struct LigatureSubst
};
-struct ContextSubst : Context {};
+static inline bool substitute_lookup (hb_apply_context_t *c, unsigned int lookup_index);
+static inline void closure_lookup (hb_closure_context_t *c, unsigned int lookup_index);
+static inline void collect_glyphs_lookup (hb_collect_glyphs_context_t *c, unsigned int lookup_index);
-struct ChainContextSubst : ChainContext {};
+struct ContextSubst : Context
+{
+ friend struct SubstLookupSubTable;
-struct ExtensionSubst : Extension<ExtensionSubst>
+ private:
+
+ inline void closure (hb_closure_context_t *c) const
+ {
+ TRACE_CLOSURE ();
+ return Context::closure (c, closure_lookup);
+ }
+
+ inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
+ {
+ return Context::collect_glyphs (c, collect_glyphs_lookup);
+ }
+
+ inline bool apply (hb_apply_context_t *c) const
+ {
+ TRACE_APPLY ();
+ return TRACE_RETURN (Context::apply (c, substitute_lookup));
+ }
+};
+
+struct ChainContextSubst : ChainContext
{
- typedef struct SubstLookupSubTable LookupSubTable;
+ friend struct SubstLookupSubTable;
+
+ private:
+
+ inline void closure (hb_closure_context_t *c) const
+ {
+ TRACE_CLOSURE ();
+ return ChainContext::closure (c, closure_lookup);
+ }
+
+ inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
+ {
+ return ChainContext::collect_glyphs (c, collect_glyphs_lookup);
+ }
+
+ inline bool apply (hb_apply_context_t *c) const
+ {
+ TRACE_APPLY ();
+ return TRACE_RETURN (ChainContext::apply (c, substitute_lookup));
+ }
+};
+
+
+struct ExtensionSubst : Extension
+{
+ friend struct SubstLookupSubTable;
+ friend struct SubstLookup;
+
+ private:
+ inline const struct SubstLookupSubTable& get_subtable (void) const
+ {
+ unsigned int offset = get_offset ();
+ if (unlikely (!offset)) return Null(SubstLookupSubTable);
+ return StructAtOffset<SubstLookupSubTable> (this, offset);
+ }
+
+ inline void closure (hb_closure_context_t *c) const;
+
+ inline void collect_glyphs (hb_collect_glyphs_context_t *c) const;
+
+ inline const Coverage &get_coverage (void) const;
+
+ inline bool would_apply (hb_would_apply_context_t *c) const;
+
+ inline bool apply (hb_apply_context_t *c) const;
+
+ inline bool sanitize (hb_sanitize_context_t *c);
inline bool is_reverse (void) const;
};
@@ -900,9 +1093,13 @@ struct ExtensionSubst : Extension<ExtensionSubst>
struct ReverseChainSingleSubstFormat1
{
+ friend struct ReverseChainSingleSubst;
+
+ private:
+
inline void closure (hb_closure_context_t *c) const
{
- TRACE_CLOSURE (this);
+ TRACE_CLOSURE ();
const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
unsigned int count;
@@ -927,8 +1124,6 @@ struct ReverseChainSingleSubstFormat1
inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
{
- TRACE_COLLECT_GLYPHS (this);
-
const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
unsigned int count;
@@ -954,19 +1149,13 @@ struct ReverseChainSingleSubstFormat1
return this+coverage;
}
- inline bool would_apply (hb_would_apply_context_t *c) const
- {
- TRACE_WOULD_APPLY (this);
- return TRACE_RETURN (c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED);
- }
-
inline bool apply (hb_apply_context_t *c) const
{
- TRACE_APPLY (this);
+ TRACE_APPLY ();
if (unlikely (c->nesting_level_left != MAX_NESTING_LEVEL))
return TRACE_RETURN (false); /* No chaining to this type */
- unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
+ unsigned int index = (this+coverage) (c->buffer->cur().codepoint);
if (likely (index == NOT_COVERED)) return TRACE_RETURN (false);
const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
@@ -989,7 +1178,7 @@ struct ReverseChainSingleSubstFormat1
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
if (!(coverage.sanitize (c, this) && backtrack.sanitize (c, this)))
return TRACE_RETURN (false);
OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
@@ -1021,18 +1210,46 @@ struct ReverseChainSingleSubstFormat1
struct ReverseChainSingleSubst
{
- template <typename context_t>
- inline typename context_t::return_t process (context_t *c) const
+ friend struct SubstLookupSubTable;
+
+ private:
+
+ inline void closure (hb_closure_context_t *c) const
+ {
+ TRACE_CLOSURE ();
+ switch (u.format) {
+ case 1: u.format1.closure (c); break;
+ default: break;
+ }
+ }
+
+ inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
+ {
+ switch (u.format) {
+ case 1: u.format1.collect_glyphs (c); break;
+ default: break;
+ }
+ }
+
+ inline const Coverage &get_coverage (void) const
{
- TRACE_PROCESS (this);
switch (u.format) {
- case 1: return TRACE_RETURN (c->process (u.format1));
- default:return TRACE_RETURN (c->default_return_value ());
+ case 1: return u.format1.get_coverage ();
+ default:return Null(Coverage);
+ }
+ }
+
+ inline bool apply (hb_apply_context_t *c) const
+ {
+ TRACE_APPLY ();
+ switch (u.format) {
+ case 1: return TRACE_RETURN (u.format1.apply (c));
+ default:return TRACE_RETURN (false);
}
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
if (!u.format.sanitize (c)) return TRACE_RETURN (false);
switch (u.format) {
case 1: return TRACE_RETURN (u.format1.sanitize (c));
@@ -1068,25 +1285,98 @@ struct SubstLookupSubTable
ReverseChainSingle = 8
};
- template <typename context_t>
- inline typename context_t::return_t process (context_t *c, unsigned int lookup_type) const
+ inline void closure (hb_closure_context_t *c,
+ unsigned int lookup_type) const
{
- TRACE_PROCESS (this);
+ TRACE_CLOSURE ();
switch (lookup_type) {
- case Single: return TRACE_RETURN (u.single.process (c));
- case Multiple: return TRACE_RETURN (u.multiple.process (c));
- case Alternate: return TRACE_RETURN (u.alternate.process (c));
- case Ligature: return TRACE_RETURN (u.ligature.process (c));
- case Context: return TRACE_RETURN (u.context.process (c));
- case ChainContext: return TRACE_RETURN (u.chainContext.process (c));
- case Extension: return TRACE_RETURN (u.extension.process (c));
- case ReverseChainSingle: return TRACE_RETURN (u.reverseChainContextSingle.process (c));
- default: return TRACE_RETURN (c->default_return_value ());
+ case Single: u.single.closure (c); break;
+ case Multiple: u.multiple.closure (c); break;
+ case Alternate: u.alternate.closure (c); break;
+ case Ligature: u.ligature.closure (c); break;
+ case Context: u.context.closure (c); break;
+ case ChainContext: u.chainContext.closure (c); break;
+ case Extension: u.extension.closure (c); break;
+ case ReverseChainSingle: u.reverseChainContextSingle.closure (c); break;
+ default: break;
+ }
+ }
+
+ inline void collect_glyphs (hb_collect_glyphs_context_t *c,
+ unsigned int lookup_type) const
+ {
+ switch (lookup_type) {
+ case Single: u.single.collect_glyphs (c); break;
+ case Multiple: u.multiple.collect_glyphs (c); break;
+ case Alternate: u.alternate.collect_glyphs (c); break;
+ case Ligature: u.ligature.collect_glyphs (c); break;
+ case Context: u.context.collect_glyphs (c); break;
+ case ChainContext: u.chainContext.collect_glyphs (c); break;
+ case Extension: u.extension.collect_glyphs (c); break;
+ case ReverseChainSingle: u.reverseChainContextSingle.collect_glyphs (c); break;
+ default: break;
+ }
+ }
+
+ inline const Coverage &get_coverage (unsigned int lookup_type) const
+ {
+ switch (lookup_type) {
+ case Single: return u.single.get_coverage ();
+ case Multiple: return u.multiple.get_coverage ();
+ case Alternate: return u.alternate.get_coverage ();
+ case Ligature: return u.ligature.get_coverage ();
+ case Context: return u.context.get_coverage ();
+ case ChainContext: return u.chainContext.get_coverage ();
+ case Extension: return u.extension.get_coverage ();
+ case ReverseChainSingle: return u.reverseChainContextSingle.get_coverage ();
+ default: return Null(Coverage);
+ }
+ }
+
+ inline bool would_apply (hb_would_apply_context_t *c,
+ unsigned int lookup_type) const
+ {
+ TRACE_WOULD_APPLY ();
+ if (get_coverage (lookup_type).get_coverage (c->glyphs[0]) == NOT_COVERED) return false;
+ if (c->len == 1) {
+ switch (lookup_type) {
+ case Single:
+ case Multiple:
+ case Alternate:
+ case ReverseChainSingle:
+ return true;
+ }
+ }
+
+ /* Only need to look further for lookups that support substitutions
+ * of input longer than 1. */
+ switch (lookup_type) {
+ case Ligature: return u.ligature.would_apply (c);
+ case Context: return u.context.would_apply (c);
+ case ChainContext: return u.chainContext.would_apply (c);
+ case Extension: return u.extension.would_apply (c);
+ default: return false;
+ }
+ }
+
+ inline bool apply (hb_apply_context_t *c, unsigned int lookup_type) const
+ {
+ TRACE_APPLY ();
+ switch (lookup_type) {
+ case Single: return TRACE_RETURN (u.single.apply (c));
+ case Multiple: return TRACE_RETURN (u.multiple.apply (c));
+ case Alternate: return TRACE_RETURN (u.alternate.apply (c));
+ case Ligature: return TRACE_RETURN (u.ligature.apply (c));
+ case Context: return TRACE_RETURN (u.context.apply (c));
+ case ChainContext: return TRACE_RETURN (u.chainContext.apply (c));
+ case Extension: return TRACE_RETURN (u.extension.apply (c));
+ case ReverseChainSingle: return TRACE_RETURN (u.reverseChainContextSingle.apply (c));
+ default: return TRACE_RETURN (false);
}
}
inline bool sanitize (hb_sanitize_context_t *c, unsigned int lookup_type) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
if (!u.header.sub_format.sanitize (c))
return TRACE_RETURN (false);
switch (lookup_type) {
@@ -1137,68 +1427,63 @@ struct SubstLookup : Lookup
return lookup_type_is_reverse (type);
}
- template <typename context_t>
- inline typename context_t::return_t process (context_t *c) const
+ inline void closure (hb_closure_context_t *c) const
{
- TRACE_PROCESS (this);
unsigned int lookup_type = get_type ();
unsigned int count = get_subtable_count ();
- for (unsigned int i = 0; i < count; i++) {
- typename context_t::return_t r = get_subtable (i).process (c, lookup_type);
- if (c->stop_sublookup_iteration (r))
- return TRACE_RETURN (r);
- }
- return TRACE_RETURN (c->default_return_value ());
- }
- template <typename context_t>
- static inline typename context_t::return_t process_recurse_func (context_t *c, unsigned int lookup_index);
-
- inline hb_closure_context_t::return_t closure (hb_closure_context_t *c) const
- {
- TRACE_CLOSURE (this);
- c->set_recurse_func (process_recurse_func<hb_closure_context_t>);
- return TRACE_RETURN (process (c));
- }
-
- inline hb_collect_glyphs_context_t::return_t collect_glyphs_lookup (hb_collect_glyphs_context_t *c) const
- {
- TRACE_COLLECT_GLYPHS (this);
- c->set_recurse_func (process_recurse_func<hb_collect_glyphs_context_t>);
- return TRACE_RETURN (process (c));
+ for (unsigned int i = 0; i < count; i++)
+ get_subtable (i).closure (c, lookup_type);
}
template <typename set_t>
inline void add_coverage (set_t *glyphs) const
{
- hb_get_coverage_context_t c;
const Coverage *last = NULL;
unsigned int count = get_subtable_count ();
for (unsigned int i = 0; i < count; i++) {
- const Coverage *coverage = &get_subtable (i).process (&c, get_type ());
- if (coverage != last) {
- coverage->add_coverage (glyphs);
- last = coverage;
+ const Coverage *c = &get_subtable (i).get_coverage (get_type ());
+ if (c != last) {
+ c->add_coverage (glyphs);
+ last = c;
}
}
}
+ inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
+ {
+ unsigned int lookup_type = get_type ();
+ unsigned int count = get_subtable_count ();
+ for (unsigned int i = 0; i < count; i++)
+ get_subtable (i).collect_glyphs (c, lookup_type);
+ }
+
inline bool would_apply (hb_would_apply_context_t *c, const hb_set_digest_t *digest) const
{
- TRACE_WOULD_APPLY (this);
- if (unlikely (!c->len)) return TRACE_RETURN (false);
- if (!digest->may_have (c->glyphs[0])) return TRACE_RETURN (false);
- return TRACE_RETURN (process (c));
+ if (unlikely (!c->len)) return false;
+ if (!digest->may_have (c->glyphs[0])) return false;
+ unsigned int lookup_type = get_type ();
+ unsigned int count = get_subtable_count ();
+ for (unsigned int i = 0; i < count; i++)
+ if (get_subtable (i).would_apply (c, lookup_type))
+ return true;
+ return false;
}
inline bool apply_once (hb_apply_context_t *c) const
{
- TRACE_APPLY (this);
+ unsigned int lookup_type = get_type ();
+
if (!c->check_glyph_property (&c->buffer->cur(), c->lookup_props, &c->property))
- return TRACE_RETURN (false);
- return TRACE_RETURN (process (c));
+ return false;
+
+ unsigned int count = get_subtable_count ();
+ for (unsigned int i = 0; i < count; i++)
+ if (get_subtable (i).apply (c, lookup_type))
+ return true;
+
+ return false;
}
- static bool apply_recurse_func (hb_apply_context_t *c, unsigned int lookup_index);
inline bool apply_string (hb_apply_context_t *c, const hb_set_digest_t *digest) const
{
bool ret = false;
@@ -1206,7 +1491,6 @@ struct SubstLookup : Lookup
if (unlikely (!c->buffer->len || !c->lookup_mask))
return false;
- c->set_recurse_func (apply_recurse_func);
c->set_lookup (*this);
if (likely (!is_reverse ()))
@@ -1248,9 +1532,11 @@ struct SubstLookup : Lookup
return ret;
}
+ private:
inline SubstLookupSubTable& serialize_subtable (hb_serialize_context_t *c,
unsigned int i)
{ return CastR<OffsetArrayOf<SubstLookupSubTable> > (subTable)[i].serialize (c, this); }
+ public:
inline bool serialize_single (hb_serialize_context_t *c,
uint32_t lookup_props,
@@ -1258,7 +1544,7 @@ struct SubstLookup : Lookup
Supplier<GlyphID> &substitutes,
unsigned int num_glyphs)
{
- TRACE_SERIALIZE (this);
+ TRACE_SERIALIZE ();
if (unlikely (!Lookup::serialize (c, SubstLookupSubTable::Single, lookup_props, 1))) return TRACE_RETURN (false);
return TRACE_RETURN (serialize_subtable (c, 0).u.single.serialize (c, glyphs, substitutes, num_glyphs));
}
@@ -1270,7 +1556,7 @@ struct SubstLookup : Lookup
unsigned int num_glyphs,
Supplier<GlyphID> &substitute_glyphs_list)
{
- TRACE_SERIALIZE (this);
+ TRACE_SERIALIZE ();
if (unlikely (!Lookup::serialize (c, SubstLookupSubTable::Multiple, lookup_props, 1))) return TRACE_RETURN (false);
return TRACE_RETURN (serialize_subtable (c, 0).u.multiple.serialize (c, glyphs, substitute_len_list, num_glyphs,
substitute_glyphs_list));
@@ -1283,7 +1569,7 @@ struct SubstLookup : Lookup
unsigned int num_glyphs,
Supplier<GlyphID> &alternate_glyphs_list)
{
- TRACE_SERIALIZE (this);
+ TRACE_SERIALIZE ();
if (unlikely (!Lookup::serialize (c, SubstLookupSubTable::Alternate, lookup_props, 1))) return TRACE_RETURN (false);
return TRACE_RETURN (serialize_subtable (c, 0).u.alternate.serialize (c, glyphs, alternate_len_list, num_glyphs,
alternate_glyphs_list));
@@ -1298,7 +1584,7 @@ struct SubstLookup : Lookup
Supplier<unsigned int> &component_count_list,
Supplier<GlyphID> &component_list /* Starting from second for each ligature */)
{
- TRACE_SERIALIZE (this);
+ TRACE_SERIALIZE ();
if (unlikely (!Lookup::serialize (c, SubstLookupSubTable::Ligature, lookup_props, 1))) return TRACE_RETURN (false);
return TRACE_RETURN (serialize_subtable (c, 0).u.ligature.serialize (c, first_glyphs, ligature_per_first_glyph_count_list, num_first_glyphs,
ligatures_list, component_count_list, component_list));
@@ -1306,7 +1592,7 @@ struct SubstLookup : Lookup
inline bool sanitize (hb_sanitize_context_t *c)
{
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
if (unlikely (!Lookup::sanitize (c))) return TRACE_RETURN (false);
OffsetArrayOf<SubstLookupSubTable> &list = CastR<OffsetArrayOf<SubstLookupSubTable> > (subTable);
if (unlikely (!list.sanitize (c, this, get_type ()))) return TRACE_RETURN (false);
@@ -1348,8 +1634,12 @@ struct GSUB : GSUBGPOS
static inline void substitute_start (hb_font_t *font, hb_buffer_t *buffer);
static inline void substitute_finish (hb_font_t *font, hb_buffer_t *buffer);
+ inline void closure_lookup (hb_closure_context_t *c,
+ unsigned int lookup_index) const
+ { return get_lookup (lookup_index).closure (c); }
+
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
if (unlikely (!GSUBGPOS::sanitize (c))) return TRACE_RETURN (false);
OffsetTo<SubstLookupList> &list = CastR<OffsetTo<SubstLookupList> > (lookupList);
return TRACE_RETURN (list.sanitize (c, this));
@@ -1382,33 +1672,83 @@ GSUB::substitute_finish (hb_font_t *font HB_UNUSED, hb_buffer_t *buffer HB_UNUSE
/* Out-of-class implementation for methods recursing */
+inline void ExtensionSubst::closure (hb_closure_context_t *c) const
+{
+ get_subtable ().closure (c, get_type ());
+}
+
+inline void ExtensionSubst::collect_glyphs (hb_collect_glyphs_context_t *c) const
+{
+ get_subtable ().collect_glyphs (c, get_type ());
+}
+
+inline const Coverage & ExtensionSubst::get_coverage (void) const
+{
+ return get_subtable ().get_coverage (get_type ());
+}
+
+inline bool ExtensionSubst::would_apply (hb_would_apply_context_t *c) const
+{
+ return get_subtable ().would_apply (c, get_type ());
+}
+
+inline bool ExtensionSubst::apply (hb_apply_context_t *c) const
+{
+ TRACE_APPLY ();
+ return TRACE_RETURN (get_subtable ().apply (c, get_type ()));
+}
+
+inline bool ExtensionSubst::sanitize (hb_sanitize_context_t *c)
+{
+ TRACE_SANITIZE ();
+ if (unlikely (!Extension::sanitize (c))) return TRACE_RETURN (false);
+ unsigned int offset = get_offset ();
+ if (unlikely (!offset)) return TRACE_RETURN (true);
+ return TRACE_RETURN (StructAtOffset<SubstLookupSubTable> (this, offset).sanitize (c, get_type ()));
+}
+
inline bool ExtensionSubst::is_reverse (void) const
{
unsigned int type = get_type ();
if (unlikely (type == SubstLookupSubTable::Extension))
- return CastR<ExtensionSubst> (get_subtable<SubstLookupSubTable>()).is_reverse ();
+ return CastR<ExtensionSubst> (get_subtable()).is_reverse ();
return SubstLookup::lookup_type_is_reverse (type);
}
-template <typename context_t>
-inline typename context_t::return_t SubstLookup::process_recurse_func (context_t *c, unsigned int lookup_index)
+static inline void closure_lookup (hb_closure_context_t *c, unsigned int lookup_index)
+{
+ const GSUB &gsub = *(hb_ot_layout_from_face (c->face)->gsub);
+ const SubstLookup &l = gsub.get_lookup (lookup_index);
+
+ if (unlikely (c->nesting_level_left == 0))
+ return;
+
+ c->nesting_level_left--;
+ l.closure (c);
+ c->nesting_level_left++;
+}
+
+static inline void collect_glyphs_lookup (hb_collect_glyphs_context_t *c, unsigned int lookup_index)
{
const GSUB &gsub = *(hb_ot_layout_from_face (c->face)->gsub);
const SubstLookup &l = gsub.get_lookup (lookup_index);
- return l.process (c);
+
+ /* XXX TODO */
+ l.collect_glyphs (c);
}
-inline bool SubstLookup::apply_recurse_func (hb_apply_context_t *c, unsigned int lookup_index)
+static inline bool substitute_lookup (hb_apply_context_t *c, unsigned int lookup_index)
{
const GSUB &gsub = *(hb_ot_layout_from_face (c->face)->gsub);
const SubstLookup &l = gsub.get_lookup (lookup_index);
- unsigned int saved_lookup_props = c->lookup_props;
- unsigned int saved_property = c->property;
- c->set_lookup (l);
- bool ret = l.apply_once (c);
- c->lookup_props = saved_lookup_props;
- c->property = saved_property;
- return ret;
+
+ if (unlikely (c->nesting_level_left == 0))
+ return false;
+
+ hb_apply_context_t new_c (*c);
+ new_c.nesting_level_left--;
+ new_c.set_lookup (l);
+ return l.apply_once (&new_c);
}
diff --git a/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-layout-gsubgpos-private.hh b/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-layout-gsubgpos-private.hh
index 40e8aa9f7dd..42726811b6e 100644
--- a/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-layout-gsubgpos-private.hh
+++ b/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-layout-gsubgpos-private.hh
@@ -37,83 +37,44 @@
namespace OT {
-
-#define TRACE_PROCESS(this) \
- hb_auto_trace_t<context_t::max_debug_depth, typename context_t::return_t> trace \
- (&c->debug_depth, c->get_name (), this, HB_FUNC, \
- "");
-
-
#ifndef HB_DEBUG_CLOSURE
#define HB_DEBUG_CLOSURE (HB_DEBUG+0)
#endif
-#define TRACE_CLOSURE(this) \
- hb_auto_trace_t<HB_DEBUG_CLOSURE, void_t> trace \
- (&c->debug_depth, c->get_name (), this, HB_FUNC, \
- "");
+#define TRACE_CLOSURE() \
+ hb_auto_trace_t<HB_DEBUG_CLOSURE> trace (&c->debug_depth, "CLOSURE", this, HB_FUNC, "");
+
struct hb_closure_context_t
{
- inline const char *get_name (void) { return "CLOSURE"; }
- static const unsigned int max_debug_depth = HB_DEBUG_CLOSURE;
- typedef void_t return_t;
- typedef return_t (*recurse_func_t) (hb_closure_context_t *c, unsigned int lookup_index);
- template <typename T>
- inline return_t process (const T &obj) { obj.closure (this); return VOID; }
- static return_t default_return_value (void) { return VOID; }
- bool stop_sublookup_iteration (const return_t r) const { return false; }
- return_t recurse (unsigned int lookup_index)
- {
- if (unlikely (nesting_level_left == 0 || !recurse_func))
- return default_return_value ();
-
- nesting_level_left--;
- recurse_func (this, lookup_index);
- nesting_level_left++;
- return default_return_value ();
- }
-
hb_face_t *face;
hb_set_t *glyphs;
- recurse_func_t recurse_func;
unsigned int nesting_level_left;
unsigned int debug_depth;
+
hb_closure_context_t (hb_face_t *face_,
hb_set_t *glyphs_,
unsigned int nesting_level_left_ = MAX_NESTING_LEVEL) :
face (face_),
glyphs (glyphs_),
- recurse_func (NULL),
nesting_level_left (nesting_level_left_),
debug_depth (0) {}
-
- void set_recurse_func (recurse_func_t func) { recurse_func = func; }
};
+/* TODO Add TRACE_RETURN annotation to gsub. */
#ifndef HB_DEBUG_WOULD_APPLY
#define HB_DEBUG_WOULD_APPLY (HB_DEBUG+0)
#endif
-#define TRACE_WOULD_APPLY(this) \
- hb_auto_trace_t<HB_DEBUG_WOULD_APPLY, bool> trace \
- (&c->debug_depth, c->get_name (), this, HB_FUNC, \
- "%d glyphs", c->len);
+#define TRACE_WOULD_APPLY() \
+ hb_auto_trace_t<HB_DEBUG_WOULD_APPLY> trace (&c->debug_depth, "WOULD_APPLY", this, HB_FUNC, "%d glyphs", c->len);
+
struct hb_would_apply_context_t
{
- inline const char *get_name (void) { return "WOULD_APPLY"; }
- static const unsigned int max_debug_depth = HB_DEBUG_WOULD_APPLY;
- typedef bool return_t;
- template <typename T>
- inline return_t process (const T &obj) { return obj.would_apply (this); }
- static return_t default_return_value (void) { return false; }
- bool stop_sublookup_iteration (const return_t r) const { return r; }
- return_t recurse (unsigned int lookup_index) { return true; }
-
hb_face_t *face;
const hb_codepoint_t *glyphs;
unsigned int len;
@@ -128,85 +89,40 @@ struct hb_would_apply_context_t
glyphs (glyphs_),
len (len_),
zero_context (zero_context_),
- debug_depth (0) {}
+ debug_depth (0) {};
};
+/* TODO Add TRACE_RETURN annotation to gsub. */
#ifndef HB_DEBUG_COLLECT_GLYPHS
#define HB_DEBUG_COLLECT_GLYPHS (HB_DEBUG+0)
#endif
-#define TRACE_COLLECT_GLYPHS(this) \
- hb_auto_trace_t<HB_DEBUG_COLLECT_GLYPHS, void_t> trace \
- (&c->debug_depth, c->get_name (), this, HB_FUNC, \
- "");
+#define TRACE_COLLECT_GLYPHS() \
+ hb_auto_trace_t<HB_DEBUG_COLLECT_GLYPHS> trace (&c->debug_depth, "COLLECT_GLYPHS", this, HB_FUNC, "");
+
struct hb_collect_glyphs_context_t
{
- inline const char *get_name (void) { return "COLLECT_GLYPHS"; }
- static const unsigned int max_debug_depth = HB_DEBUG_COLLECT_GLYPHS;
- typedef void_t return_t;
- typedef return_t (*recurse_func_t) (hb_collect_glyphs_context_t *c, unsigned int lookup_index);
- template <typename T>
- inline return_t process (const T &obj) { obj.collect_glyphs (this); return VOID; }
- static return_t default_return_value (void) { return VOID; }
- bool stop_sublookup_iteration (const return_t r) const { return false; }
- return_t recurse (unsigned int lookup_index)
- {
- if (unlikely (nesting_level_left == 0 || !recurse_func))
- return default_return_value ();
-
- nesting_level_left--;
- /* Only collect output glyphs in the recursion. */
- hb_collect_glyphs_context_t new_c (this->face, NULL, NULL, NULL, &output, nesting_level_left);
- recurse_func (&new_c, lookup_index);
- nesting_level_left++;
- return default_return_value ();
- }
-
hb_face_t *face;
hb_set_t &before;
hb_set_t &input;
hb_set_t &after;
hb_set_t &output;
- recurse_func_t recurse_func;
- unsigned int nesting_level_left;
unsigned int debug_depth;
hb_collect_glyphs_context_t (hb_face_t *face_,
hb_set_t *glyphs_before, /* OUT. May be NULL */
hb_set_t *glyphs_input, /* OUT. May be NULL */
hb_set_t *glyphs_after, /* OUT. May be NULL */
- hb_set_t *glyphs_output, /* OUT. May be NULL */
- unsigned int nesting_level_left_ = MAX_NESTING_LEVEL) :
+ hb_set_t *glyphs_output /* OUT. May be NULL */) :
face (face_),
before (glyphs_before ? *glyphs_before : *hb_set_get_empty ()),
input (glyphs_input ? *glyphs_input : *hb_set_get_empty ()),
after (glyphs_after ? *glyphs_after : *hb_set_get_empty ()),
output (glyphs_output ? *glyphs_output : *hb_set_get_empty ()),
- recurse_func (NULL),
- nesting_level_left (nesting_level_left_),
- debug_depth (0) {}
-
- void set_recurse_func (recurse_func_t func) { recurse_func = func; }
-};
-
-
-
-struct hb_get_coverage_context_t
-{
- inline const char *get_name (void) { return "GET_COVERAGE"; }
- static const unsigned int max_debug_depth = 0;
- typedef const Coverage &return_t;
- template <typename T>
- inline return_t process (const T &obj) { return obj.get_coverage (); }
- static return_t default_return_value (void) { return Null(Coverage); }
-
- hb_get_coverage_context_t (void) :
- debug_depth (0) {}
-
- unsigned int debug_depth;
+ debug_depth (0) {};
};
@@ -215,44 +131,23 @@ struct hb_get_coverage_context_t
#define HB_DEBUG_APPLY (HB_DEBUG+0)
#endif
-#define TRACE_APPLY(this) \
- hb_auto_trace_t<HB_DEBUG_APPLY, bool> trace \
- (&c->debug_depth, c->get_name (), this, HB_FUNC, \
- "idx %d codepoint %u", c->buffer->idx, c->buffer->cur().codepoint);
+#define TRACE_APPLY() \
+ hb_auto_trace_t<HB_DEBUG_APPLY> trace (&c->debug_depth, "APPLY", this, HB_FUNC, "idx %d codepoint %u", c->buffer->idx, c->buffer->cur().codepoint);
+
struct hb_apply_context_t
{
- inline const char *get_name (void) { return "APPLY"; }
- static const unsigned int max_debug_depth = HB_DEBUG_APPLY;
- typedef bool return_t;
- typedef return_t (*recurse_func_t) (hb_apply_context_t *c, unsigned int lookup_index);
- template <typename T>
- inline return_t process (const T &obj) { return obj.apply (this); }
- static return_t default_return_value (void) { return false; }
- bool stop_sublookup_iteration (const return_t r) const { return r; }
- return_t recurse (unsigned int lookup_index)
- {
- if (unlikely (nesting_level_left == 0 || !recurse_func))
- return default_return_value ();
-
- nesting_level_left--;
- recurse_func (this, lookup_index);
- nesting_level_left++;
- return default_return_value ();
- }
-
hb_font_t *font;
hb_face_t *face;
hb_buffer_t *buffer;
hb_direction_t direction;
hb_mask_t lookup_mask;
- recurse_func_t recurse_func;
unsigned int nesting_level_left;
unsigned int lookup_props;
unsigned int property; /* propety of first glyph */
+ unsigned int debug_depth;
const GDEF &gdef;
bool has_glyph_classes;
- unsigned int debug_depth;
hb_apply_context_t (hb_font_t *font_,
@@ -261,16 +156,18 @@ struct hb_apply_context_t
font (font_), face (font->face), buffer (buffer_),
direction (buffer_->props.direction),
lookup_mask (lookup_mask_),
- recurse_func (NULL),
nesting_level_left (MAX_NESTING_LEVEL),
- lookup_props (0), property (0),
+ lookup_props (0), property (0), debug_depth (0),
gdef (*hb_ot_layout_from_face (face)->gdef),
- has_glyph_classes (gdef.has_glyph_classes ()),
- debug_depth (0) {}
+ has_glyph_classes (gdef.has_glyph_classes ()) {}
+
+ void set_lookup_props (unsigned int lookup_props_) {
+ lookup_props = lookup_props_;
+ }
- void set_recurse_func (recurse_func_t func) { recurse_func = func; }
- void set_lookup_props (unsigned int lookup_props_) { lookup_props = lookup_props_; }
- void set_lookup (const Lookup &l) { lookup_props = l.get_props (); }
+ void set_lookup (const Lookup &l) {
+ lookup_props = l.get_props ();
+ }
struct mark_skipping_forward_iterator_t
{
@@ -476,23 +373,22 @@ struct hb_apply_context_t
typedef bool (*intersects_func_t) (hb_set_t *glyphs, const USHORT &value, const void *data);
-typedef void (*collect_glyphs_func_t) (hb_set_t *glyphs, const USHORT &value, const void *data);
typedef bool (*match_func_t) (hb_codepoint_t glyph_id, const USHORT &value, const void *data);
+typedef void (*closure_lookup_func_t) (hb_closure_context_t *c, unsigned int lookup_index);
+typedef void (*collect_glyphs_lookup_func_t) (hb_collect_glyphs_context_t *c, unsigned int lookup_index);
+typedef bool (*apply_lookup_func_t) (hb_apply_context_t *c, unsigned int lookup_index);
struct ContextClosureFuncs
{
intersects_func_t intersects;
-};
-struct ContextCollectGlyphsFuncs
-{
- collect_glyphs_func_t collect;
+ closure_lookup_func_t closure;
};
struct ContextApplyFuncs
{
match_func_t match;
+ apply_lookup_func_t apply;
};
-
static inline bool intersects_glyph (hb_set_t *glyphs, const USHORT &value, const void *data HB_UNUSED)
{
return glyphs->has (value);
@@ -521,32 +417,6 @@ static inline bool intersects_array (hb_closure_context_t *c,
}
-static inline void collect_glyph (hb_set_t *glyphs, const USHORT &value, const void *data HB_UNUSED)
-{
- glyphs->add (value);
-}
-static inline void collect_class (hb_set_t *glyphs, const USHORT &value, const void *data)
-{
- const ClassDef &class_def = *reinterpret_cast<const ClassDef *>(data);
- class_def.add_class (glyphs, value);
-}
-static inline void collect_coverage (hb_set_t *glyphs, const USHORT &value, const void *data)
-{
- const OffsetTo<Coverage> &coverage = (const OffsetTo<Coverage>&)value;
- (data+coverage).add_coverage (glyphs);
-}
-static inline void collect_array (hb_collect_glyphs_context_t *c,
- hb_set_t *glyphs,
- unsigned int count,
- const USHORT values[],
- collect_glyphs_func_t collect_func,
- const void *collect_data)
-{
- for (unsigned int i = 0; i < count; i++)
- collect_func (glyphs, values[i], collect_data);
-}
-
-
static inline bool match_glyph (hb_codepoint_t glyph_id, const USHORT &value, const void *data HB_UNUSED)
{
return glyph_id == value;
@@ -562,6 +432,7 @@ static inline bool match_coverage (hb_codepoint_t glyph_id, const USHORT &value,
return (data+coverage).get_coverage (glyph_id) != NOT_COVERED;
}
+
static inline bool would_match_input (hb_would_apply_context_t *c,
unsigned int count, /* Including the first glyph (not matched) */
const USHORT input[], /* Array of input values--start with second glyph */
@@ -586,7 +457,7 @@ static inline bool match_input (hb_apply_context_t *c,
bool *p_is_mark_ligature = NULL,
unsigned int *p_total_component_count = NULL)
{
- TRACE_APPLY (NULL);
+ hb_auto_trace_t<HB_DEBUG_APPLY> trace (&c->debug_depth, "APPLY", NULL, HB_FUNC, "idx %d codepoint %u", c->buffer->idx, c->buffer->cur().codepoint);
hb_apply_context_t::mark_skipping_forward_iterator_t skippy_iter (c, c->buffer->idx, count - 1);
if (skippy_iter.has_no_chance ()) return TRACE_RETURN (false);
@@ -743,7 +614,7 @@ static inline bool match_backtrack (hb_apply_context_t *c,
match_func_t match_func,
const void *match_data)
{
- TRACE_APPLY (NULL);
+ hb_auto_trace_t<HB_DEBUG_APPLY> trace (&c->debug_depth, "APPLY", NULL, HB_FUNC, "idx %d codepoint %u", c->buffer->idx, c->buffer->cur().codepoint);
hb_apply_context_t::mark_skipping_backward_iterator_t skippy_iter (c, c->buffer->backtrack_len (), count, true);
if (skippy_iter.has_no_chance ())
@@ -768,7 +639,7 @@ static inline bool match_lookahead (hb_apply_context_t *c,
const void *match_data,
unsigned int offset)
{
- TRACE_APPLY (NULL);
+ hb_auto_trace_t<HB_DEBUG_APPLY> trace (&c->debug_depth, "APPLY", NULL, HB_FUNC, "idx %d codepoint %u", c->buffer->idx, c->buffer->cur().codepoint);
hb_apply_context_t::mark_skipping_forward_iterator_t skippy_iter (c, c->buffer->idx + offset - 1, count, true);
if (skippy_iter.has_no_chance ())
@@ -791,7 +662,7 @@ static inline bool match_lookahead (hb_apply_context_t *c,
struct LookupRecord
{
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (c->check_struct (this));
}
@@ -804,22 +675,22 @@ struct LookupRecord
};
-template <typename context_t>
-static inline void recurse_lookups (context_t *c,
- unsigned int lookupCount,
- const LookupRecord lookupRecord[] /* Array of LookupRecords--in design order */)
+static inline void closure_lookup (hb_closure_context_t *c,
+ unsigned int lookupCount,
+ const LookupRecord lookupRecord[], /* Array of LookupRecords--in design order */
+ closure_lookup_func_t closure_func)
{
for (unsigned int i = 0; i < lookupCount; i++)
- c->recurse (lookupRecord->lookupListIndex);
+ closure_func (c, lookupRecord->lookupListIndex);
}
static inline bool apply_lookup (hb_apply_context_t *c,
unsigned int count, /* Including the first glyph */
unsigned int lookupCount,
- const LookupRecord lookupRecord[] /* Array of LookupRecords--in design order */)
+ const LookupRecord lookupRecord[], /* Array of LookupRecords--in design order */
+ apply_lookup_func_t apply_func)
{
- TRACE_APPLY (NULL);
-
+ hb_auto_trace_t<HB_DEBUG_APPLY> trace (&c->debug_depth, "APPLY", NULL, HB_FUNC, "idx %d codepoint %u", c->buffer->idx, c->buffer->cur().codepoint);
unsigned int end = c->buffer->len;
if (unlikely (count == 0 || c->buffer->idx + count > end))
return TRACE_RETURN (false);
@@ -848,7 +719,7 @@ static inline bool apply_lookup (hb_apply_context_t *c,
unsigned int old_pos = c->buffer->idx;
/* Apply a lookup */
- bool done = c->recurse (lookupRecord->lookupListIndex);
+ bool done = apply_func (c, lookupRecord->lookupListIndex);
lookupRecord++;
lookupCount--;
@@ -882,12 +753,6 @@ struct ContextClosureLookupContext
const void *intersects_data;
};
-struct ContextCollectGlyphsLookupContext
-{
- ContextCollectGlyphsFuncs funcs;
- const void *collect_data;
-};
-
struct ContextApplyLookupContext
{
ContextApplyFuncs funcs;
@@ -904,23 +769,11 @@ static inline void context_closure_lookup (hb_closure_context_t *c,
if (intersects_array (c,
inputCount ? inputCount - 1 : 0, input,
lookup_context.funcs.intersects, lookup_context.intersects_data))
- recurse_lookups (c,
- lookupCount, lookupRecord);
+ closure_lookup (c,
+ lookupCount, lookupRecord,
+ lookup_context.funcs.closure);
}
-static inline void context_collect_glyphs_lookup (hb_collect_glyphs_context_t *c,
- unsigned int inputCount, /* Including the first glyph (not matched) */
- const USHORT input[], /* Array of input values--start with second glyph */
- unsigned int lookupCount,
- const LookupRecord lookupRecord[],
- ContextCollectGlyphsLookupContext &lookup_context)
-{
- collect_array (c, &c->input,
- inputCount ? inputCount - 1 : 0, input,
- lookup_context.funcs.collect, lookup_context.collect_data);
- recurse_lookups (c,
- lookupCount, lookupRecord);
-}
static inline bool context_would_apply_lookup (hb_would_apply_context_t *c,
unsigned int inputCount, /* Including the first glyph (not matched) */
@@ -945,14 +798,19 @@ static inline bool context_apply_lookup (hb_apply_context_t *c,
lookup_context.funcs.match, lookup_context.match_data)
&& apply_lookup (c,
inputCount,
- lookupCount, lookupRecord);
+ lookupCount, lookupRecord,
+ lookup_context.funcs.apply);
}
struct Rule
{
+ friend struct RuleSet;
+
+ private:
+
inline void closure (hb_closure_context_t *c, ContextClosureLookupContext &lookup_context) const
{
- TRACE_CLOSURE (this);
+ TRACE_CLOSURE ();
const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (input, input[0].static_size * (inputCount ? inputCount - 1 : 0));
context_closure_lookup (c,
inputCount, input,
@@ -960,33 +818,23 @@ struct Rule
lookup_context);
}
- inline void collect_glyphs (hb_collect_glyphs_context_t *c, ContextCollectGlyphsLookupContext &lookup_context) const
- {
- TRACE_COLLECT_GLYPHS (this);
- const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (input, input[0].static_size * (inputCount ? inputCount - 1 : 0));
- context_collect_glyphs_lookup (c,
- inputCount, input,
- lookupCount, lookupRecord,
- lookup_context);
- }
-
inline bool would_apply (hb_would_apply_context_t *c, ContextApplyLookupContext &lookup_context) const
{
- TRACE_WOULD_APPLY (this);
+ TRACE_WOULD_APPLY ();
const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (input, input[0].static_size * (inputCount ? inputCount - 1 : 0));
return TRACE_RETURN (context_would_apply_lookup (c, inputCount, input, lookupCount, lookupRecord, lookup_context));
}
inline bool apply (hb_apply_context_t *c, ContextApplyLookupContext &lookup_context) const
{
- TRACE_APPLY (this);
+ TRACE_APPLY ();
const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (input, input[0].static_size * (inputCount ? inputCount - 1 : 0));
return TRACE_RETURN (context_apply_lookup (c, inputCount, input, lookupCount, lookupRecord, lookup_context));
}
public:
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return inputCount.sanitize (c)
&& lookupCount.sanitize (c)
&& c->check_range (input,
@@ -1011,23 +859,15 @@ struct RuleSet
{
inline void closure (hb_closure_context_t *c, ContextClosureLookupContext &lookup_context) const
{
- TRACE_CLOSURE (this);
+ TRACE_CLOSURE ();
unsigned int num_rules = rule.len;
for (unsigned int i = 0; i < num_rules; i++)
(this+rule[i]).closure (c, lookup_context);
}
- inline void collect_glyphs (hb_collect_glyphs_context_t *c, ContextCollectGlyphsLookupContext &lookup_context) const
- {
- TRACE_COLLECT_GLYPHS (this);
- unsigned int num_rules = rule.len;
- for (unsigned int i = 0; i < num_rules; i++)
- (this+rule[i]).collect_glyphs (c, lookup_context);
- }
-
inline bool would_apply (hb_would_apply_context_t *c, ContextApplyLookupContext &lookup_context) const
{
- TRACE_WOULD_APPLY (this);
+ TRACE_WOULD_APPLY ();
unsigned int num_rules = rule.len;
for (unsigned int i = 0; i < num_rules; i++)
{
@@ -1039,7 +879,7 @@ struct RuleSet
inline bool apply (hb_apply_context_t *c, ContextApplyLookupContext &lookup_context) const
{
- TRACE_APPLY (this);
+ TRACE_APPLY ();
unsigned int num_rules = rule.len;
for (unsigned int i = 0; i < num_rules; i++)
{
@@ -1050,7 +890,7 @@ struct RuleSet
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (rule.sanitize (c, this));
}
@@ -1065,14 +905,18 @@ struct RuleSet
struct ContextFormat1
{
- inline void closure (hb_closure_context_t *c) const
+ friend struct Context;
+
+ private:
+
+ inline void closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const
{
- TRACE_CLOSURE (this);
+ TRACE_CLOSURE ();
const Coverage &cov = (this+coverage);
struct ContextClosureLookupContext lookup_context = {
- {intersects_glyph},
+ {intersects_glyph, closure_func},
NULL
};
@@ -1084,55 +928,35 @@ struct ContextFormat1
}
}
- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
- {
- TRACE_COLLECT_GLYPHS (this);
- (this+coverage).add_coverage (&c->input);
-
- struct ContextCollectGlyphsLookupContext lookup_context = {
- {collect_glyph},
- NULL
- };
-
- unsigned int count = ruleSet.len;
- for (unsigned int i = 0; i < count; i++)
- (this+ruleSet[i]).collect_glyphs (c, lookup_context);
- }
-
inline bool would_apply (hb_would_apply_context_t *c) const
{
- TRACE_WOULD_APPLY (this);
+ TRACE_WOULD_APPLY ();
- const RuleSet &rule_set = this+ruleSet[(this+coverage).get_coverage (c->glyphs[0])];
+ const RuleSet &rule_set = this+ruleSet[(this+coverage) (c->glyphs[0])];
struct ContextApplyLookupContext lookup_context = {
- {match_glyph},
+ {match_glyph, NULL},
NULL
};
return TRACE_RETURN (rule_set.would_apply (c, lookup_context));
}
- inline const Coverage &get_coverage (void) const
+ inline bool apply (hb_apply_context_t *c, apply_lookup_func_t apply_func) const
{
- return this+coverage;
- }
-
- inline bool apply (hb_apply_context_t *c) const
- {
- TRACE_APPLY (this);
- unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
+ TRACE_APPLY ();
+ unsigned int index = (this+coverage) (c->buffer->cur().codepoint);
if (likely (index == NOT_COVERED))
return TRACE_RETURN (false);
const RuleSet &rule_set = this+ruleSet[index];
struct ContextApplyLookupContext lookup_context = {
- {match_glyph},
+ {match_glyph, apply_func},
NULL
};
return TRACE_RETURN (rule_set.apply (c, lookup_context));
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (coverage.sanitize (c, this) && ruleSet.sanitize (c, this));
}
@@ -1151,16 +975,20 @@ struct ContextFormat1
struct ContextFormat2
{
- inline void closure (hb_closure_context_t *c) const
+ friend struct Context;
+
+ private:
+
+ inline void closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const
{
- TRACE_CLOSURE (this);
+ TRACE_CLOSURE ();
if (!(this+coverage).intersects (c->glyphs))
return;
const ClassDef &class_def = this+classDef;
struct ContextClosureLookupContext lookup_context = {
- {intersects_class},
+ {intersects_class, closure_func},
NULL
};
@@ -1172,58 +1000,38 @@ struct ContextFormat2
}
}
- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
- {
- TRACE_COLLECT_GLYPHS (this);
- (this+coverage).add_coverage (&c->input);
-
- struct ContextCollectGlyphsLookupContext lookup_context = {
- {collect_class},
- NULL
- };
-
- unsigned int count = ruleSet.len;
- for (unsigned int i = 0; i < count; i++)
- (this+ruleSet[i]).collect_glyphs (c, lookup_context);
- }
-
inline bool would_apply (hb_would_apply_context_t *c) const
{
- TRACE_WOULD_APPLY (this);
+ TRACE_WOULD_APPLY ();
const ClassDef &class_def = this+classDef;
- unsigned int index = class_def.get_class (c->glyphs[0]);
+ unsigned int index = class_def (c->glyphs[0]);
const RuleSet &rule_set = this+ruleSet[index];
struct ContextApplyLookupContext lookup_context = {
- {match_class},
+ {match_class, NULL},
&class_def
};
return TRACE_RETURN (rule_set.would_apply (c, lookup_context));
}
- inline const Coverage &get_coverage (void) const
+ inline bool apply (hb_apply_context_t *c, apply_lookup_func_t apply_func) const
{
- return this+coverage;
- }
-
- inline bool apply (hb_apply_context_t *c) const
- {
- TRACE_APPLY (this);
- unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
+ TRACE_APPLY ();
+ unsigned int index = (this+coverage) (c->buffer->cur().codepoint);
if (likely (index == NOT_COVERED)) return TRACE_RETURN (false);
const ClassDef &class_def = this+classDef;
- index = class_def.get_class (c->buffer->cur().codepoint);
+ index = class_def (c->buffer->cur().codepoint);
const RuleSet &rule_set = this+ruleSet[index];
struct ContextApplyLookupContext lookup_context = {
- {match_class},
+ {match_class, apply_func},
&class_def
};
return TRACE_RETURN (rule_set.apply (c, lookup_context));
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (coverage.sanitize (c, this) && classDef.sanitize (c, this) && ruleSet.sanitize (c, this));
}
@@ -1245,15 +1053,19 @@ struct ContextFormat2
struct ContextFormat3
{
- inline void closure (hb_closure_context_t *c) const
+ friend struct Context;
+
+ private:
+
+ inline void closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const
{
- TRACE_CLOSURE (this);
+ TRACE_CLOSURE ();
if (!(this+coverage[0]).intersects (c->glyphs))
return;
const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (coverage, coverage[0].static_size * glyphCount);
struct ContextClosureLookupContext lookup_context = {
- {intersects_coverage},
+ {intersects_coverage, closure_func},
this
};
context_closure_lookup (c,
@@ -1262,56 +1074,34 @@ struct ContextFormat3
lookup_context);
}
- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
- {
- TRACE_COLLECT_GLYPHS (this);
- (this+coverage[0]).add_coverage (&c->input);
-
- const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (coverage, coverage[0].static_size * glyphCount);
- struct ContextCollectGlyphsLookupContext lookup_context = {
- {collect_coverage},
- NULL
- };
-
- context_collect_glyphs_lookup (c,
- glyphCount, (const USHORT *) (coverage + 1),
- lookupCount, lookupRecord,
- lookup_context);
- }
-
inline bool would_apply (hb_would_apply_context_t *c) const
{
- TRACE_WOULD_APPLY (this);
+ TRACE_WOULD_APPLY ();
const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (coverage, coverage[0].static_size * glyphCount);
struct ContextApplyLookupContext lookup_context = {
- {match_coverage},
+ {match_coverage, NULL},
this
};
return TRACE_RETURN (context_would_apply_lookup (c, glyphCount, (const USHORT *) (coverage + 1), lookupCount, lookupRecord, lookup_context));
}
- inline const Coverage &get_coverage (void) const
+ inline bool apply (hb_apply_context_t *c, apply_lookup_func_t apply_func) const
{
- return this+coverage[0];
- }
-
- inline bool apply (hb_apply_context_t *c) const
- {
- TRACE_APPLY (this);
- unsigned int index = (this+coverage[0]).get_coverage (c->buffer->cur().codepoint);
+ TRACE_APPLY ();
+ unsigned int index = (this+coverage[0]) (c->buffer->cur().codepoint);
if (likely (index == NOT_COVERED)) return TRACE_RETURN (false);
const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (coverage, coverage[0].static_size * glyphCount);
struct ContextApplyLookupContext lookup_context = {
- {match_coverage},
+ {match_coverage, apply_func},
this
};
return TRACE_RETURN (context_apply_lookup (c, glyphCount, (const USHORT *) (coverage + 1), lookupCount, lookupRecord, lookup_context));
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
if (!c->check_struct (this)) return TRACE_RETURN (false);
unsigned int count = glyphCount;
if (!c->check_array (coverage, coverage[0].static_size, count)) return TRACE_RETURN (false);
@@ -1337,20 +1127,63 @@ struct ContextFormat3
struct Context
{
- template <typename context_t>
- inline typename context_t::return_t process (context_t *c) const
+ protected:
+
+ inline void closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const
{
- TRACE_PROCESS (this);
+ TRACE_CLOSURE ();
switch (u.format) {
- case 1: return TRACE_RETURN (c->process (u.format1));
- case 2: return TRACE_RETURN (c->process (u.format2));
- case 3: return TRACE_RETURN (c->process (u.format3));
- default:return TRACE_RETURN (c->default_return_value ());
+ case 1: u.format1.closure (c, closure_func); break;
+ case 2: u.format2.closure (c, closure_func); break;
+ case 3: u.format3.closure (c, closure_func); break;
+ default: break;
+ }
+ }
+
+ inline void collect_glyphs (hb_collect_glyphs_context_t *c, collect_glyphs_lookup_func_t closure_func) const
+ {
+ TRACE_CLOSURE ();
+ switch (u.format) {
+// case 1: u.format1.collect_glyphs (c); break;
+// case 2: u.format2.collect_glyphs (c); break;
+// case 3: u.format2.collect_glyphs (c); break;
+ default: break;
+ }
+ }
+
+ inline const Coverage &get_coverage (void) const
+ {
+ switch (u.format) {
+ case 1: return this + u.format1.coverage;
+ case 2: return this + u.format2.coverage;
+ case 3: return this + u.format3.coverage[0];
+ default:return Null(Coverage);
+ }
+ }
+
+ inline bool would_apply (hb_would_apply_context_t *c) const
+ {
+ switch (u.format) {
+ case 1: return u.format1.would_apply (c);
+ case 2: return u.format2.would_apply (c);
+ case 3: return u.format3.would_apply (c);
+ default:return false;
+ }
+ }
+
+ inline bool apply (hb_apply_context_t *c, apply_lookup_func_t apply_func) const
+ {
+ TRACE_APPLY ();
+ switch (u.format) {
+ case 1: return TRACE_RETURN (u.format1.apply (c, apply_func));
+ case 2: return TRACE_RETURN (u.format2.apply (c, apply_func));
+ case 3: return TRACE_RETURN (u.format3.apply (c, apply_func));
+ default:return TRACE_RETURN (false);
}
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
if (!u.format.sanitize (c)) return TRACE_RETURN (false);
switch (u.format) {
case 1: return TRACE_RETURN (u.format1.sanitize (c));
@@ -1378,12 +1211,6 @@ struct ChainContextClosureLookupContext
const void *intersects_data[3];
};
-struct ChainContextCollectGlyphsLookupContext
-{
- ContextCollectGlyphsFuncs funcs;
- const void *collect_data[3];
-};
-
struct ChainContextApplyLookupContext
{
ContextApplyFuncs funcs;
@@ -1410,32 +1237,9 @@ static inline void chain_context_closure_lookup (hb_closure_context_t *c,
&& intersects_array (c,
lookaheadCount, lookahead,
lookup_context.funcs.intersects, lookup_context.intersects_data[2]))
- recurse_lookups (c,
- lookupCount, lookupRecord);
-}
-
-static inline void chain_context_collect_glyphs_lookup (hb_collect_glyphs_context_t *c,
- unsigned int backtrackCount,
- const USHORT backtrack[],
- unsigned int inputCount, /* Including the first glyph (not matched) */
- const USHORT input[], /* Array of input values--start with second glyph */
- unsigned int lookaheadCount,
- const USHORT lookahead[],
- unsigned int lookupCount,
- const LookupRecord lookupRecord[],
- ChainContextCollectGlyphsLookupContext &lookup_context)
-{
- collect_array (c, &c->before,
- backtrackCount, backtrack,
- lookup_context.funcs.collect, lookup_context.collect_data[0]);
- collect_array (c, &c->input,
- inputCount ? inputCount - 1 : 0, input,
- lookup_context.funcs.collect, lookup_context.collect_data[1]);
- collect_array (c, &c->after,
- lookaheadCount, lookahead,
- lookup_context.funcs.collect, lookup_context.collect_data[2]);
- recurse_lookups (c,
- lookupCount, lookupRecord);
+ closure_lookup (c,
+ lookupCount, lookupRecord,
+ lookup_context.funcs.closure);
}
static inline bool chain_context_would_apply_lookup (hb_would_apply_context_t *c,
@@ -1466,7 +1270,7 @@ static inline bool chain_context_apply_lookup (hb_apply_context_t *c,
const LookupRecord lookupRecord[],
ChainContextApplyLookupContext &lookup_context)
{
- unsigned int lookahead_offset = 0;
+ unsigned int lookahead_offset;
return match_input (c,
inputCount, input,
lookup_context.funcs.match, lookup_context.match_data[1],
@@ -1480,14 +1284,19 @@ static inline bool chain_context_apply_lookup (hb_apply_context_t *c,
lookahead_offset)
&& apply_lookup (c,
inputCount,
- lookupCount, lookupRecord);
+ lookupCount, lookupRecord,
+ lookup_context.funcs.apply);
}
struct ChainRule
{
+ friend struct ChainRuleSet;
+
+ private:
+
inline void closure (hb_closure_context_t *c, ChainContextClosureLookupContext &lookup_context) const
{
- TRACE_CLOSURE (this);
+ TRACE_CLOSURE ();
const HeadlessArrayOf<USHORT> &input = StructAfter<HeadlessArrayOf<USHORT> > (backtrack);
const ArrayOf<USHORT> &lookahead = StructAfter<ArrayOf<USHORT> > (input);
const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
@@ -1499,23 +1308,9 @@ struct ChainRule
lookup_context);
}
- inline void collect_glyphs (hb_collect_glyphs_context_t *c, ChainContextCollectGlyphsLookupContext &lookup_context) const
- {
- TRACE_COLLECT_GLYPHS (this);
- const HeadlessArrayOf<USHORT> &input = StructAfter<HeadlessArrayOf<USHORT> > (backtrack);
- const ArrayOf<USHORT> &lookahead = StructAfter<ArrayOf<USHORT> > (input);
- const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
- chain_context_collect_glyphs_lookup (c,
- backtrack.len, backtrack.array,
- input.len, input.array,
- lookahead.len, lookahead.array,
- lookup.len, lookup.array,
- lookup_context);
- }
-
inline bool would_apply (hb_would_apply_context_t *c, ChainContextApplyLookupContext &lookup_context) const
{
- TRACE_WOULD_APPLY (this);
+ TRACE_WOULD_APPLY ();
const HeadlessArrayOf<USHORT> &input = StructAfter<HeadlessArrayOf<USHORT> > (backtrack);
const ArrayOf<USHORT> &lookahead = StructAfter<ArrayOf<USHORT> > (input);
const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
@@ -1528,7 +1323,7 @@ struct ChainRule
inline bool apply (hb_apply_context_t *c, ChainContextApplyLookupContext &lookup_context) const
{
- TRACE_APPLY (this);
+ TRACE_APPLY ();
const HeadlessArrayOf<USHORT> &input = StructAfter<HeadlessArrayOf<USHORT> > (backtrack);
const ArrayOf<USHORT> &lookahead = StructAfter<ArrayOf<USHORT> > (input);
const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
@@ -1539,8 +1334,9 @@ struct ChainRule
lookup.array, lookup_context));
}
+ public:
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
if (!backtrack.sanitize (c)) return TRACE_RETURN (false);
HeadlessArrayOf<USHORT> &input = StructAfter<HeadlessArrayOf<USHORT> > (backtrack);
if (!input.sanitize (c)) return TRACE_RETURN (false);
@@ -1572,23 +1368,15 @@ struct ChainRuleSet
{
inline void closure (hb_closure_context_t *c, ChainContextClosureLookupContext &lookup_context) const
{
- TRACE_CLOSURE (this);
+ TRACE_CLOSURE ();
unsigned int num_rules = rule.len;
for (unsigned int i = 0; i < num_rules; i++)
(this+rule[i]).closure (c, lookup_context);
}
- inline void collect_glyphs (hb_collect_glyphs_context_t *c, ChainContextCollectGlyphsLookupContext &lookup_context) const
- {
- TRACE_COLLECT_GLYPHS (this);
- unsigned int num_rules = rule.len;
- for (unsigned int i = 0; i < num_rules; i++)
- (this+rule[i]).collect_glyphs (c, lookup_context);
- }
-
inline bool would_apply (hb_would_apply_context_t *c, ChainContextApplyLookupContext &lookup_context) const
{
- TRACE_WOULD_APPLY (this);
+ TRACE_WOULD_APPLY ();
unsigned int num_rules = rule.len;
for (unsigned int i = 0; i < num_rules; i++)
if ((this+rule[i]).would_apply (c, lookup_context))
@@ -1599,7 +1387,7 @@ struct ChainRuleSet
inline bool apply (hb_apply_context_t *c, ChainContextApplyLookupContext &lookup_context) const
{
- TRACE_APPLY (this);
+ TRACE_APPLY ();
unsigned int num_rules = rule.len;
for (unsigned int i = 0; i < num_rules; i++)
if ((this+rule[i]).apply (c, lookup_context))
@@ -1609,7 +1397,7 @@ struct ChainRuleSet
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (rule.sanitize (c, this));
}
@@ -1623,13 +1411,17 @@ struct ChainRuleSet
struct ChainContextFormat1
{
- inline void closure (hb_closure_context_t *c) const
+ friend struct ChainContext;
+
+ private:
+
+ inline void closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const
{
- TRACE_CLOSURE (this);
+ TRACE_CLOSURE ();
const Coverage &cov = (this+coverage);
struct ChainContextClosureLookupContext lookup_context = {
- {intersects_glyph},
+ {intersects_glyph, closure_func},
{NULL, NULL, NULL}
};
@@ -1641,54 +1433,34 @@ struct ChainContextFormat1
}
}
- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
- {
- TRACE_COLLECT_GLYPHS (this);
- (this+coverage).add_coverage (&c->input);
-
- struct ChainContextCollectGlyphsLookupContext lookup_context = {
- {collect_glyph},
- {NULL, NULL, NULL}
- };
-
- unsigned int count = ruleSet.len;
- for (unsigned int i = 0; i < count; i++)
- (this+ruleSet[i]).collect_glyphs (c, lookup_context);
- }
-
inline bool would_apply (hb_would_apply_context_t *c) const
{
- TRACE_WOULD_APPLY (this);
+ TRACE_WOULD_APPLY ();
- const ChainRuleSet &rule_set = this+ruleSet[(this+coverage).get_coverage (c->glyphs[0])];
+ const ChainRuleSet &rule_set = this+ruleSet[(this+coverage) (c->glyphs[0])];
struct ChainContextApplyLookupContext lookup_context = {
- {match_glyph},
+ {match_glyph, NULL},
{NULL, NULL, NULL}
};
return TRACE_RETURN (rule_set.would_apply (c, lookup_context));
}
- inline const Coverage &get_coverage (void) const
- {
- return this+coverage;
- }
-
- inline bool apply (hb_apply_context_t *c) const
+ inline bool apply (hb_apply_context_t *c, apply_lookup_func_t apply_func) const
{
- TRACE_APPLY (this);
- unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
+ TRACE_APPLY ();
+ unsigned int index = (this+coverage) (c->buffer->cur().codepoint);
if (likely (index == NOT_COVERED)) return TRACE_RETURN (false);
const ChainRuleSet &rule_set = this+ruleSet[index];
struct ChainContextApplyLookupContext lookup_context = {
- {match_glyph},
+ {match_glyph, apply_func},
{NULL, NULL, NULL}
};
return TRACE_RETURN (rule_set.apply (c, lookup_context));
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (coverage.sanitize (c, this) && ruleSet.sanitize (c, this));
}
@@ -1706,9 +1478,13 @@ struct ChainContextFormat1
struct ChainContextFormat2
{
- inline void closure (hb_closure_context_t *c) const
+ friend struct ChainContext;
+
+ private:
+
+ inline void closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const
{
- TRACE_CLOSURE (this);
+ TRACE_CLOSURE ();
if (!(this+coverage).intersects (c->glyphs))
return;
@@ -1717,7 +1493,7 @@ struct ChainContextFormat2
const ClassDef &lookahead_class_def = this+lookaheadClassDef;
struct ChainContextClosureLookupContext lookup_context = {
- {intersects_class},
+ {intersects_class, closure_func},
{&backtrack_class_def,
&input_class_def,
&lookahead_class_def}
@@ -1731,55 +1507,35 @@ struct ChainContextFormat2
}
}
- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
- {
- TRACE_COLLECT_GLYPHS (this);
- (this+coverage).add_coverage (&c->input);
-
- struct ChainContextCollectGlyphsLookupContext lookup_context = {
- {collect_class},
- {NULL, NULL, NULL}
- };
-
- unsigned int count = ruleSet.len;
- for (unsigned int i = 0; i < count; i++)
- (this+ruleSet[i]).collect_glyphs (c, lookup_context);
- }
-
inline bool would_apply (hb_would_apply_context_t *c) const
{
- TRACE_WOULD_APPLY (this);
+ TRACE_WOULD_APPLY ();
const ClassDef &input_class_def = this+inputClassDef;
- unsigned int index = input_class_def.get_class (c->glyphs[0]);
+ unsigned int index = input_class_def (c->glyphs[0]);
const ChainRuleSet &rule_set = this+ruleSet[index];
struct ChainContextApplyLookupContext lookup_context = {
- {match_class},
+ {match_class, NULL},
{NULL, &input_class_def, NULL}
};
return TRACE_RETURN (rule_set.would_apply (c, lookup_context));
}
- inline const Coverage &get_coverage (void) const
- {
- return this+coverage;
- }
-
- inline bool apply (hb_apply_context_t *c) const
+ inline bool apply (hb_apply_context_t *c, apply_lookup_func_t apply_func) const
{
- TRACE_APPLY (this);
- unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
+ TRACE_APPLY ();
+ unsigned int index = (this+coverage) (c->buffer->cur().codepoint);
if (likely (index == NOT_COVERED)) return TRACE_RETURN (false);
const ClassDef &backtrack_class_def = this+backtrackClassDef;
const ClassDef &input_class_def = this+inputClassDef;
const ClassDef &lookahead_class_def = this+lookaheadClassDef;
- index = input_class_def.get_class (c->buffer->cur().codepoint);
+ index = input_class_def (c->buffer->cur().codepoint);
const ChainRuleSet &rule_set = this+ruleSet[index];
struct ChainContextApplyLookupContext lookup_context = {
- {match_class},
+ {match_class, apply_func},
{&backtrack_class_def,
&input_class_def,
&lookahead_class_def}
@@ -1788,7 +1544,7 @@ struct ChainContextFormat2
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (coverage.sanitize (c, this) && backtrackClassDef.sanitize (c, this) &&
inputClassDef.sanitize (c, this) && lookaheadClassDef.sanitize (c, this) &&
ruleSet.sanitize (c, this));
@@ -1820,9 +1576,13 @@ struct ChainContextFormat2
struct ChainContextFormat3
{
- inline void closure (hb_closure_context_t *c) const
+ friend struct ChainContext;
+
+ private:
+
+ inline void closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const
{
- TRACE_CLOSURE (this);
+ TRACE_CLOSURE ();
const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
if (!(this+input[0]).intersects (c->glyphs))
@@ -1831,7 +1591,7 @@ struct ChainContextFormat3
const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (input);
const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
struct ChainContextClosureLookupContext lookup_context = {
- {intersects_coverage},
+ {intersects_coverage, closure_func},
{this, this, this}
};
chain_context_closure_lookup (c,
@@ -1842,36 +1602,21 @@ struct ChainContextFormat3
lookup_context);
}
- inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
+ inline const Coverage &get_coverage (void) const
{
- TRACE_COLLECT_GLYPHS (this);
const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
-
- (this+input[0]).add_coverage (&c->input);
-
- const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (input);
- const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
- struct ChainContextCollectGlyphsLookupContext lookup_context = {
- {collect_coverage},
- {this, this, this}
- };
- chain_context_collect_glyphs_lookup (c,
- backtrack.len, (const USHORT *) backtrack.array,
- input.len, (const USHORT *) input.array + 1,
- lookahead.len, (const USHORT *) lookahead.array,
- lookup.len, lookup.array,
- lookup_context);
+ return this+input[0];
}
inline bool would_apply (hb_would_apply_context_t *c) const
{
- TRACE_WOULD_APPLY (this);
+ TRACE_WOULD_APPLY ();
const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (input);
const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
struct ChainContextApplyLookupContext lookup_context = {
- {match_coverage},
+ {match_coverage, NULL},
{this, this, this}
};
return TRACE_RETURN (chain_context_would_apply_lookup (c,
@@ -1881,24 +1626,18 @@ struct ChainContextFormat3
lookup.len, lookup.array, lookup_context));
}
- inline const Coverage &get_coverage (void) const
+ inline bool apply (hb_apply_context_t *c, apply_lookup_func_t apply_func) const
{
+ TRACE_APPLY ();
const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
- return this+input[0];
- }
- inline bool apply (hb_apply_context_t *c) const
- {
- TRACE_APPLY (this);
- const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
-
- unsigned int index = (this+input[0]).get_coverage (c->buffer->cur().codepoint);
+ unsigned int index = (this+input[0]) (c->buffer->cur().codepoint);
if (likely (index == NOT_COVERED)) return TRACE_RETURN (false);
const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (input);
const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
struct ChainContextApplyLookupContext lookup_context = {
- {match_coverage},
+ {match_coverage, apply_func},
{this, this, this}
};
return TRACE_RETURN (chain_context_apply_lookup (c,
@@ -1909,7 +1648,7 @@ struct ChainContextFormat3
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
if (!backtrack.sanitize (c, this)) return TRACE_RETURN (false);
OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
if (!input.sanitize (c, this)) return TRACE_RETURN (false);
@@ -1942,20 +1681,63 @@ struct ChainContextFormat3
struct ChainContext
{
- template <typename context_t>
- inline typename context_t::return_t process (context_t *c) const
+ protected:
+
+ inline void closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const
+ {
+ TRACE_CLOSURE ();
+ switch (u.format) {
+ case 1: u.format1.closure (c, closure_func); break;
+ case 2: u.format2.closure (c, closure_func); break;
+ case 3: u.format3.closure (c, closure_func); break;
+ default: break;
+ }
+ }
+
+ inline void collect_glyphs (hb_collect_glyphs_context_t *c, collect_glyphs_lookup_func_t closure_func) const
+ {
+ TRACE_CLOSURE ();
+ switch (u.format) {
+// case 1: u.format1.collect_glyphs (c); break;
+// case 2: u.format2.collect_glyphs (c); break;
+// case 3: u.format2.collect_glyphs (c); break;
+ default: break;
+ }
+ }
+
+ inline const Coverage &get_coverage (void) const
+ {
+ switch (u.format) {
+ case 1: return this + u.format1.coverage;
+ case 2: return this + u.format2.coverage;
+ case 3: return u.format3.get_coverage ();
+ default:return Null(Coverage);
+ }
+ }
+
+ inline bool would_apply (hb_would_apply_context_t *c) const
+ {
+ switch (u.format) {
+ case 1: return u.format1.would_apply (c);
+ case 2: return u.format2.would_apply (c);
+ case 3: return u.format3.would_apply (c);
+ default:return false;
+ }
+ }
+
+ inline bool apply (hb_apply_context_t *c, apply_lookup_func_t apply_func) const
{
- TRACE_PROCESS (this);
+ TRACE_APPLY ();
switch (u.format) {
- case 1: return TRACE_RETURN (c->process (u.format1));
- case 2: return TRACE_RETURN (c->process (u.format2));
- case 3: return TRACE_RETURN (c->process (u.format3));
- default:return TRACE_RETURN (c->default_return_value ());
+ case 1: return TRACE_RETURN (u.format1.apply (c, apply_func));
+ case 2: return TRACE_RETURN (u.format2.apply (c, apply_func));
+ case 3: return TRACE_RETURN (u.format3.apply (c, apply_func));
+ default:return TRACE_RETURN (false);
}
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
if (!u.format.sanitize (c)) return TRACE_RETURN (false);
switch (u.format) {
case 1: return TRACE_RETURN (u.format1.sanitize (c));
@@ -1977,11 +1759,14 @@ struct ChainContext
struct ExtensionFormat1
{
+ friend struct Extension;
+
+ protected:
inline unsigned int get_type (void) const { return extensionLookupType; }
inline unsigned int get_offset (void) const { return extensionOffset; }
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (c->check_struct (this));
}
@@ -1996,7 +1781,6 @@ struct ExtensionFormat1
DEFINE_SIZE_STATIC (8);
};
-template <typename T>
struct Extension
{
inline unsigned int get_type (void) const
@@ -2014,22 +1798,8 @@ struct Extension
}
}
- template <typename X>
- inline const X& get_subtable (void) const
- {
- unsigned int offset = get_offset ();
- if (unlikely (!offset)) return Null(typename T::LookupSubTable);
- return StructAtOffset<typename T::LookupSubTable> (this, offset);
- }
-
- template <typename context_t>
- inline typename context_t::return_t process (context_t *c) const
- {
- return get_subtable<typename T::LookupSubTable> ().process (c, get_type ());
- }
-
- inline bool sanitize_self (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ inline bool sanitize (hb_sanitize_context_t *c) {
+ TRACE_SANITIZE ();
if (!u.format.sanitize (c)) return TRACE_RETURN (false);
switch (u.format) {
case 1: return TRACE_RETURN (u.format1.sanitize (c));
@@ -2037,14 +1807,6 @@ struct Extension
}
}
- inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
- if (!sanitize_self (c)) return TRACE_RETURN (false);
- unsigned int offset = get_offset ();
- if (unlikely (!offset)) return TRACE_RETURN (true);
- return TRACE_RETURN (StructAtOffset<typename T::LookupSubTable> (this, offset).sanitize (c, get_type ()));
- }
-
protected:
union {
USHORT format; /* Format identifier */
@@ -2094,7 +1856,7 @@ struct GSUBGPOS
{ return (this+lookupList)[i]; }
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (version.sanitize (c) && likely (version.major == 1) &&
scriptList.sanitize (c, this) &&
featureList.sanitize (c, this) &&
diff --git a/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-layout.cc b/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-layout.cc
index 2572c007359..aaef3130bf2 100644
--- a/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-layout.cc
+++ b/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-layout.cc
@@ -401,103 +401,6 @@ hb_ot_layout_feature_get_lookups (hb_face_t *face,
return f.get_lookup_indexes (start_offset, lookup_count, lookup_indexes);
}
-static void
-_hb_ot_layout_collect_lookups_lookups (hb_face_t *face,
- hb_tag_t table_tag,
- unsigned int feature_index,
- hb_set_t *lookup_indexes /* OUT */)
-{
- unsigned int lookup_indices[32];
- unsigned int offset, len;
-
- offset = 0;
- do {
- len = ARRAY_LENGTH (lookup_indices);
- hb_ot_layout_feature_get_lookups (face,
- table_tag,
- feature_index,
- offset, &len,
- lookup_indices);
-
- for (unsigned int i = 0; i < len; i++)
- lookup_indexes->add (lookup_indices[i]);
-
- offset += len;
- } while (len == ARRAY_LENGTH (lookup_indices));
-}
-
-static void
-_hb_ot_layout_collect_lookups_features (hb_face_t *face,
- hb_tag_t table_tag,
- unsigned int script_index,
- unsigned int language_index,
- const hb_tag_t *features,
- hb_set_t *lookup_indexes /* OUT */)
-{
- if (!features)
- {
- /* All features */
- unsigned int count = hb_ot_layout_language_get_feature_tags (face, table_tag, script_index, language_index, 0, NULL, NULL);
- for (unsigned int feature_index = 0; feature_index < count; feature_index++)
- _hb_ot_layout_collect_lookups_lookups (face, table_tag, feature_index, lookup_indexes);
- } else {
- for (; *features; features++)
- {
- unsigned int feature_index;
- if (hb_ot_layout_language_find_feature (face, table_tag, script_index, language_index, *features, &feature_index))
- _hb_ot_layout_collect_lookups_lookups (face, table_tag, feature_index, lookup_indexes);
- }
- }
-}
-
-static void
-_hb_ot_layout_collect_lookups_languages (hb_face_t *face,
- hb_tag_t table_tag,
- unsigned int script_index,
- const hb_tag_t *languages,
- const hb_tag_t *features,
- hb_set_t *lookup_indexes /* OUT */)
-{
- if (!languages)
- {
- /* All languages */
- unsigned int count = hb_ot_layout_script_get_language_tags (face, table_tag, script_index, 0, NULL, NULL);
- for (unsigned int language_index = 0; language_index < count; language_index++)
- _hb_ot_layout_collect_lookups_features (face, table_tag, script_index, language_index, features, lookup_indexes);
- } else {
- for (; *languages; languages++)
- {
- unsigned int language_index;
- if (hb_ot_layout_script_find_language (face, table_tag, script_index, *languages, &language_index))
- _hb_ot_layout_collect_lookups_features (face, table_tag, script_index, language_index, features, lookup_indexes);
- }
- }
-}
-
-void
-hb_ot_layout_collect_lookups (hb_face_t *face,
- hb_tag_t table_tag,
- const hb_tag_t *scripts,
- const hb_tag_t *languages,
- const hb_tag_t *features,
- hb_set_t *lookup_indexes /* OUT */)
-{
- if (!scripts)
- {
- /* All scripts */
- unsigned int count = hb_ot_layout_table_get_script_tags (face, table_tag, 0, NULL, NULL);
- for (unsigned int script_index = 0; script_index < count; script_index++)
- _hb_ot_layout_collect_lookups_languages (face, table_tag, script_index, languages, features, lookup_indexes);
- } else {
- for (; *scripts; scripts++)
- {
- unsigned int script_index;
- if (hb_ot_layout_table_find_script (face, table_tag, *scripts, &script_index))
- _hb_ot_layout_collect_lookups_languages (face, table_tag, script_index, languages, features, lookup_indexes);
- }
- }
-}
-
void
hb_ot_layout_lookup_collect_glyphs (hb_face_t *face,
hb_tag_t table_tag,
@@ -515,13 +418,13 @@ hb_ot_layout_lookup_collect_glyphs (hb_face_t *face,
case HB_OT_TAG_GSUB:
{
const OT::SubstLookup& l = hb_ot_layout_from_face (face)->gsub->get_lookup (lookup_index);
- l.collect_glyphs_lookup (&c);
+ l.collect_glyphs (&c);
return;
}
case HB_OT_TAG_GPOS:
{
const OT::PosLookup& l = hb_ot_layout_from_face (face)->gpos->get_lookup (lookup_index);
- l.collect_glyphs_lookup (&c);
+// l.collect_glyphs (&c);
return;
}
}
@@ -597,10 +500,7 @@ hb_ot_layout_lookup_substitute_closure (hb_face_t *face,
hb_set_t *glyphs)
{
OT::hb_closure_context_t c (face, glyphs);
-
- const OT::SubstLookup& l = _get_gsub (face).get_lookup (lookup_index);
-
- l.closure (&c);
+ _get_gsub (face).closure_lookup (&c, lookup_index);
}
/*
@@ -645,17 +545,13 @@ hb_ot_layout_position_get_size (hb_face_t *face,
uint16_t *data /* OUT, 5 items */)
{
const OT::GPOS &gpos = _get_gpos (face);
- unsigned int script_index;
- gpos.find_script_index (HB_OT_TAG_DEFAULT_SCRIPT, &script_index);
- const OT::LangSys &l = gpos.get_script (script_index).get_lang_sys (HB_OT_TAG_DEFAULT_LANGUAGE);
- unsigned int num_features = l.get_feature_count ();
+ unsigned int num_features = gpos.get_feature_count ();
for (unsigned int i = 0; i < num_features; i++) {
- unsigned int f_index = l.get_feature_index (i);
- if (HB_TAG ('s','i','z','e') == gpos.get_feature_tag (f_index))
+ if (HB_TAG ('s','i','z','e') == gpos.get_feature_tag (i))
{
- const OT::Feature &f = gpos.get_feature (f_index);
+ const OT::Feature &f = gpos.get_feature (i);
const OT::FeatureParams &params = f.get_feature_params ();
for (unsigned int i = 0; i < 5; i++)
diff --git a/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-layout.h b/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-layout.h
index adb483ce9df..023f0718fc8 100644
--- a/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-layout.h
+++ b/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-layout.h
@@ -179,13 +179,15 @@ hb_ot_layout_feature_get_lookups (hb_face_t *face,
unsigned int *lookup_count /* IN/OUT */,
unsigned int *lookup_indexes /* OUT */);
+#ifdef HB_NOT_IMPLEMENTED
void
-hb_ot_layout_collect_lookups (hb_face_t *face,
+Xhb_ot_layout_collect_lookups (hb_face_t *face,
hb_tag_t table_tag,
const hb_tag_t *scripts,
const hb_tag_t *languages,
const hb_tag_t *features,
hb_set_t *lookup_indexes /* OUT */);
+#endif
void
hb_ot_shape_plan_collect_lookups (hb_shape_plan_t *shape_plan,
diff --git a/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-maxp-table.hh b/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-maxp-table.hh
index 0ce3ebcc2a6..ef2b9f1cc62 100644
--- a/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-maxp-table.hh
+++ b/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-maxp-table.hh
@@ -48,7 +48,7 @@ struct maxp
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (c->check_struct (this) &&
likely (version.major == 1 || (version.major == 0 && version.minor == 0x5000)));
}
diff --git a/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-name-table.hh b/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-name-table.hh
index 75a1b94ea31..ab7a692ede1 100644
--- a/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-name-table.hh
+++ b/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-ot-name-table.hh
@@ -57,7 +57,7 @@ struct NameRecord
}
inline bool sanitize (hb_sanitize_context_t *c, void *base) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
/* We can check from base all the way up to the end of string... */
return TRACE_RETURN (c->check_struct (this) && c->check_range ((char *) base, (unsigned int) length + offset));
}
@@ -99,7 +99,7 @@ struct name
}
inline bool sanitize_records (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
char *string_pool = (char *) this + stringOffset;
unsigned int _count = count;
for (unsigned int i = 0; i < _count; i++)
@@ -108,7 +108,7 @@ struct name
}
inline bool sanitize (hb_sanitize_context_t *c) {
- TRACE_SANITIZE (this);
+ TRACE_SANITIZE ();
return TRACE_RETURN (c->check_struct (this) &&
likely (format == 0 || format == 1) &&
c->check_array (nameRecord, nameRecord[0].static_size, count) &&
diff --git a/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-private.hh b/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-private.hh
index 265fba15d8d..42c025909ae 100644
--- a/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-private.hh
+++ b/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-private.hh
@@ -62,12 +62,6 @@
#endif
-/* Void! */
-struct _void_t;
-typedef const _void_t &void_t;
-#define VOID (* (const _void_t *) NULL)
-
-
/* Basics */
@@ -588,11 +582,7 @@ _hb_debug_msg_va (const char *what,
} else
fprintf (stderr, " " VRBAR LBAR);
- if (func)
- {
- /* Skip "typename" */
- if (0 == strncmp (func, "typename ", 9))
- func += 9;
+ if (func) {
/* Skip return type */
const char *space = strchr (func, ' ');
if (space)
@@ -667,39 +657,10 @@ _hb_debug_msg<0> (const char *what HB_UNUSED,
/*
- * Printer
- */
-
-template <typename T>
-struct hb_printer_t {};
-
-template <>
-struct hb_printer_t<bool> {
- const char *print (bool v) { return v ? "true" : "false"; }
-};
-
-template <>
-struct hb_printer_t<void_t> {
- const char *print (void_t v) { return ""; }
-};
-
-
-/*
* Trace
*/
-template <typename T>
-static inline void _hb_warn_no_return (bool returned)
-{
- if (unlikely (!returned)) {
- fprintf (stderr, "OUCH, returned with no call to TRACE_RETURN. This is a bug, please report.\n");
- }
-}
-template <>
-inline void _hb_warn_no_return<void_t> (bool returned)
-{}
-
-template <int max_level, typename ret_t>
+template <int max_level>
struct hb_auto_trace_t {
explicit inline hb_auto_trace_t (unsigned int *plevel_,
const char *what_,
@@ -717,23 +678,23 @@ struct hb_auto_trace_t {
}
inline ~hb_auto_trace_t (void)
{
- _hb_warn_no_return<ret_t> (returned);
- if (!returned) {
+ if (unlikely (!returned)) {
+ fprintf (stderr, "OUCH, returned with no call to TRACE_RETURN. This is a bug, please report. Level was %d.\n", plevel ? *plevel : -1);
_hb_debug_msg<max_level> (what, obj, NULL, true, plevel ? *plevel : 1, -1, " ");
+ return;
}
+
if (plevel) --*plevel;
}
- inline ret_t ret (ret_t v, unsigned int line = 0)
+ inline bool ret (bool v, unsigned int line = 0)
{
if (unlikely (returned)) {
fprintf (stderr, "OUCH, double calls to TRACE_RETURN. This is a bug, please report.\n");
return v;
}
- _hb_debug_msg<max_level> (what, obj, NULL, true, plevel ? *plevel : 1, -1,
- "return %s (line %d)",
- hb_printer_t<ret_t>().print (v), line);
+ _hb_debug_msg<max_level> (what, obj, NULL, true, plevel ? *plevel : 1, -1, "return %s (line %d)", v ? "true" : "false", line);
if (plevel) --*plevel;
plevel = NULL;
returned = true;
@@ -742,12 +703,12 @@ struct hb_auto_trace_t {
private:
unsigned int *plevel;
+ bool returned;
const char *what;
const void *obj;
- bool returned;
};
-template <typename ret_t> /* Optimize when tracing is disabled */
-struct hb_auto_trace_t<0, ret_t> {
+template <> /* Optimize when tracing is disabled */
+struct hb_auto_trace_t<0> {
explicit inline hb_auto_trace_t (unsigned int *plevel_ HB_UNUSED,
const char *what HB_UNUSED,
const void *obj HB_UNUSED,
@@ -755,7 +716,8 @@ struct hb_auto_trace_t<0, ret_t> {
const char *message HB_UNUSED,
...) {}
- inline ret_t ret (ret_t v, unsigned int line = 0) { return v; }
+ template <typename T>
+ inline T ret (T v, unsigned int line = 0) { return v; }
};
#define TRACE_RETURN(RET) trace.ret (RET, __LINE__)
diff --git a/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-shape-plan.cc b/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-shape-plan.cc
index 22a226f3a6c..7735d4eecab 100644
--- a/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-shape-plan.cc
+++ b/Build/source/libs/harfbuzz/harfbuzz-0.9.7/src/hb-shape-plan.cc
@@ -304,5 +304,4 @@ retry:
const char *
hb_shape_plan_get_shaper (hb_shape_plan_t *shape_plan)
{
- return shape_plan->shaper_name;
}