Index: third_party/harfbuzz-ng/src/hb-ot-layout-gsub-table.hh |
diff --git a/third_party/harfbuzz-ng/src/hb-ot-layout-gsub-table.hh b/third_party/harfbuzz-ng/src/hb-ot-layout-gsub-table.hh |
index 5d67be0ec0f311b170130b857d512f6c6a963f2c..ebe4c9ec4e4e0b7f6053de32cfedd8516cb27a28 100644 |
--- a/third_party/harfbuzz-ng/src/hb-ot-layout-gsub-table.hh |
+++ b/third_party/harfbuzz-ng/src/hb-ot-layout-gsub-table.hh |
@@ -97,7 +97,8 @@ struct SingleSubstFormat1 |
return TRACE_RETURN (true); |
} |
- inline bool sanitize (hb_sanitize_context_t *c) { |
+ inline bool sanitize (hb_sanitize_context_t *c) const |
+ { |
TRACE_SANITIZE (this); |
return TRACE_RETURN (coverage.sanitize (c, this) && deltaGlyphID.sanitize (c)); |
} |
@@ -173,7 +174,8 @@ struct SingleSubstFormat2 |
return TRACE_RETURN (true); |
} |
- inline bool sanitize (hb_sanitize_context_t *c) { |
+ inline bool sanitize (hb_sanitize_context_t *c) const |
+ { |
TRACE_SANITIZE (this); |
return TRACE_RETURN (coverage.sanitize (c, this) && substitute.sanitize (c)); |
} |
@@ -223,6 +225,7 @@ struct SingleSubst |
inline typename context_t::return_t dispatch (context_t *c) const |
{ |
TRACE_DISPATCH (this, u.format); |
+ if (unlikely (!c->may_dispatch (this, &u.format))) TRACE_RETURN (c->default_return_value ()); |
switch (u.format) { |
case 1: return TRACE_RETURN (c->dispatch (u.format1)); |
case 2: return TRACE_RETURN (c->dispatch (u.format2)); |
@@ -230,16 +233,6 @@ struct SingleSubst |
} |
} |
- inline bool sanitize (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)); |
- case 2: return TRACE_RETURN (u.format2.sanitize (c)); |
- default:return TRACE_RETURN (true); |
- } |
- } |
- |
protected: |
union { |
USHORT format; /* Format identifier */ |
@@ -312,7 +305,8 @@ struct Sequence |
return TRACE_RETURN (true); |
} |
- inline bool sanitize (hb_sanitize_context_t *c) { |
+ inline bool sanitize (hb_sanitize_context_t *c) const |
+ { |
TRACE_SANITIZE (this); |
return TRACE_RETURN (substitute.sanitize (c)); |
} |
@@ -384,7 +378,8 @@ struct MultipleSubstFormat1 |
return TRACE_RETURN (true); |
} |
- inline bool sanitize (hb_sanitize_context_t *c) { |
+ inline bool sanitize (hb_sanitize_context_t *c) const |
+ { |
TRACE_SANITIZE (this); |
return TRACE_RETURN (coverage.sanitize (c, this) && sequence.sanitize (c, this)); |
} |
@@ -423,21 +418,13 @@ struct MultipleSubst |
inline typename context_t::return_t dispatch (context_t *c) const |
{ |
TRACE_DISPATCH (this, u.format); |
+ if (unlikely (!c->may_dispatch (this, &u.format))) TRACE_RETURN (c->default_return_value ()); |
switch (u.format) { |
case 1: return TRACE_RETURN (c->dispatch (u.format1)); |
default:return TRACE_RETURN (c->default_return_value ()); |
} |
} |
- inline bool sanitize (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)); |
- default:return TRACE_RETURN (true); |
- } |
- } |
- |
protected: |
union { |
USHORT format; /* Format identifier */ |
@@ -535,7 +522,8 @@ struct AlternateSubstFormat1 |
return TRACE_RETURN (true); |
} |
- inline bool sanitize (hb_sanitize_context_t *c) { |
+ inline bool sanitize (hb_sanitize_context_t *c) const |
+ { |
TRACE_SANITIZE (this); |
return TRACE_RETURN (coverage.sanitize (c, this) && alternateSet.sanitize (c, this)); |
} |
@@ -574,21 +562,13 @@ struct AlternateSubst |
inline typename context_t::return_t dispatch (context_t *c) const |
{ |
TRACE_DISPATCH (this, u.format); |
+ if (unlikely (!c->may_dispatch (this, &u.format))) TRACE_RETURN (c->default_return_value ()); |
switch (u.format) { |
case 1: return TRACE_RETURN (c->dispatch (u.format1)); |
default:return TRACE_RETURN (c->default_return_value ()); |
} |
} |
- inline bool sanitize (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)); |
- default:return TRACE_RETURN (true); |
- } |
- } |
- |
protected: |
union { |
USHORT format; /* Format identifier */ |
@@ -686,7 +666,8 @@ struct Ligature |
} |
public: |
- inline bool sanitize (hb_sanitize_context_t *c) { |
+ inline bool sanitize (hb_sanitize_context_t *c) const |
+ { |
TRACE_SANITIZE (this); |
return TRACE_RETURN (ligGlyph.sanitize (c) && component.sanitize (c)); |
} |
@@ -764,7 +745,8 @@ struct LigatureSet |
return TRACE_RETURN (true); |
} |
- inline bool sanitize (hb_sanitize_context_t *c) { |
+ inline bool sanitize (hb_sanitize_context_t *c) const |
+ { |
TRACE_SANITIZE (this); |
return TRACE_RETURN (ligature.sanitize (c, this)); |
} |
@@ -848,7 +830,8 @@ struct LigatureSubstFormat1 |
return TRACE_RETURN (true); |
} |
- inline bool sanitize (hb_sanitize_context_t *c) { |
+ inline bool sanitize (hb_sanitize_context_t *c) const |
+ { |
TRACE_SANITIZE (this); |
return TRACE_RETURN (coverage.sanitize (c, this) && ligatureSet.sanitize (c, this)); |
} |
@@ -890,21 +873,13 @@ struct LigatureSubst |
inline typename context_t::return_t dispatch (context_t *c) const |
{ |
TRACE_DISPATCH (this, u.format); |
+ if (unlikely (!c->may_dispatch (this, &u.format))) TRACE_RETURN (c->default_return_value ()); |
switch (u.format) { |
case 1: return TRACE_RETURN (c->dispatch (u.format1)); |
default:return TRACE_RETURN (c->default_return_value ()); |
} |
} |
- inline bool sanitize (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)); |
- default:return TRACE_RETURN (true); |
- } |
- } |
- |
protected: |
union { |
USHORT format; /* Format identifier */ |
@@ -1017,14 +992,15 @@ struct ReverseChainSingleSubstFormat1 |
return TRACE_RETURN (false); |
} |
- inline bool sanitize (hb_sanitize_context_t *c) { |
+ inline bool sanitize (hb_sanitize_context_t *c) const |
+ { |
TRACE_SANITIZE (this); |
if (!(coverage.sanitize (c, this) && backtrack.sanitize (c, this))) |
return TRACE_RETURN (false); |
- OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (backtrack); |
+ const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (backtrack); |
if (!lookahead.sanitize (c, this)) |
return TRACE_RETURN (false); |
- ArrayOf<GlyphID> &substitute = StructAfter<ArrayOf<GlyphID> > (lookahead); |
+ const ArrayOf<GlyphID> &substitute = StructAfter<ArrayOf<GlyphID> > (lookahead); |
return TRACE_RETURN (substitute.sanitize (c)); |
} |
@@ -1054,21 +1030,13 @@ struct ReverseChainSingleSubst |
inline typename context_t::return_t dispatch (context_t *c) const |
{ |
TRACE_DISPATCH (this, u.format); |
+ if (unlikely (!c->may_dispatch (this, &u.format))) TRACE_RETURN (c->default_return_value ()); |
switch (u.format) { |
case 1: return TRACE_RETURN (c->dispatch (u.format1)); |
default:return TRACE_RETURN (c->default_return_value ()); |
} |
} |
- inline bool sanitize (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)); |
- default:return TRACE_RETURN (true); |
- } |
- } |
- |
protected: |
union { |
USHORT format; /* Format identifier */ |
@@ -1101,6 +1069,8 @@ struct SubstLookupSubTable |
inline typename context_t::return_t dispatch (context_t *c, unsigned int lookup_type) const |
{ |
TRACE_DISPATCH (this, lookup_type); |
+ /* The sub_format passed to may_dispatch is unnecessary but harmless. */ |
+ if (unlikely (!c->may_dispatch (this, &u.sub_format))) TRACE_RETURN (c->default_return_value ()); |
switch (lookup_type) { |
case Single: return TRACE_RETURN (u.single.dispatch (c)); |
case Multiple: return TRACE_RETURN (u.multiple.dispatch (c)); |
@@ -1114,28 +1084,9 @@ struct SubstLookupSubTable |
} |
} |
- inline bool sanitize (hb_sanitize_context_t *c, unsigned int lookup_type) { |
- TRACE_SANITIZE (this); |
- if (!u.header.sub_format.sanitize (c)) |
- return TRACE_RETURN (false); |
- switch (lookup_type) { |
- case Single: return TRACE_RETURN (u.single.sanitize (c)); |
- case Multiple: return TRACE_RETURN (u.multiple.sanitize (c)); |
- case Alternate: return TRACE_RETURN (u.alternate.sanitize (c)); |
- case Ligature: return TRACE_RETURN (u.ligature.sanitize (c)); |
- case Context: return TRACE_RETURN (u.context.sanitize (c)); |
- case ChainContext: return TRACE_RETURN (u.chainContext.sanitize (c)); |
- case Extension: return TRACE_RETURN (u.extension.sanitize (c)); |
- case ReverseChainSingle: return TRACE_RETURN (u.reverseChainContextSingle.sanitize (c)); |
- default: return TRACE_RETURN (true); |
- } |
- } |
- |
protected: |
union { |
- struct { |
- USHORT sub_format; |
- } header; |
+ USHORT sub_format; |
SingleSubst single; |
MultipleSubst multiple; |
AlternateSubst alternate; |
@@ -1146,14 +1097,14 @@ struct SubstLookupSubTable |
ReverseChainSingleSubst reverseChainContextSingle; |
} u; |
public: |
- DEFINE_SIZE_UNION (2, header.sub_format); |
+ DEFINE_SIZE_UNION (2, sub_format); |
}; |
struct SubstLookup : Lookup |
{ |
inline const SubstLookupSubTable& get_subtable (unsigned int i) const |
- { return this+CastR<OffsetArrayOf<SubstLookupSubTable> > (subTable)[i]; } |
+ { return Lookup::get_subtable<SubstLookupSubTable> (i); } |
inline static bool lookup_type_is_reverse (unsigned int lookup_type) |
{ return lookup_type == SubstLookupSubTable::ReverseChainSingle; } |
@@ -1166,6 +1117,12 @@ struct SubstLookup : Lookup |
return lookup_type_is_reverse (type); |
} |
+ inline bool apply (hb_apply_context_t *c) const |
+ { |
+ TRACE_APPLY (this); |
+ return TRACE_RETURN (dispatch (c)); |
+ } |
+ |
inline hb_closure_context_t::return_t closure (hb_closure_context_t *c) const |
{ |
TRACE_CLOSURE (this); |
@@ -1183,39 +1140,24 @@ struct SubstLookup : Lookup |
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).dispatch (&c, get_type ()); |
- if (coverage != last) { |
- coverage->add_coverage (glyphs); |
- last = coverage; |
- } |
- } |
+ hb_add_coverage_context_t<set_t> c (glyphs); |
+ dispatch (&c); |
} |
- inline bool would_apply (hb_would_apply_context_t *c, const hb_set_digest_t *digest) const |
+ inline bool would_apply (hb_would_apply_context_t *c, |
+ const hb_ot_layout_lookup_accelerator_t *accel) const |
{ |
TRACE_WOULD_APPLY (this); |
if (unlikely (!c->len)) return TRACE_RETURN (false); |
- if (!digest->may_have (c->glyphs[0])) return TRACE_RETURN (false); |
+ if (!accel->may_have (c->glyphs[0])) return TRACE_RETURN (false); |
return TRACE_RETURN (dispatch (c)); |
} |
- inline bool apply_once (hb_apply_context_t *c) const |
- { |
- TRACE_APPLY (this); |
- if (!c->check_glyph_property (&c->buffer->cur(), c->lookup_props)) |
- return TRACE_RETURN (false); |
- return TRACE_RETURN (dispatch (c)); |
- } |
- |
static bool apply_recurse_func (hb_apply_context_t *c, unsigned int lookup_index); |
inline SubstLookupSubTable& serialize_subtable (hb_serialize_context_t *c, |
unsigned int i) |
- { return CastR<OffsetArrayOf<SubstLookupSubTable> > (subTable)[i].serialize (c, this); } |
+ { return get_subtables<SubstLookupSubTable> ()[i].serialize (c, this); } |
inline bool serialize_single (hb_serialize_context_t *c, |
uint32_t lookup_props, |
@@ -1274,24 +1216,14 @@ struct SubstLookup : Lookup |
template <typename context_t> |
inline typename context_t::return_t dispatch (context_t *c) const |
- { |
- unsigned int lookup_type = get_type (); |
- TRACE_DISPATCH (this, lookup_type); |
- unsigned int count = get_subtable_count (); |
- for (unsigned int i = 0; i < count; i++) { |
- typename context_t::return_t r = get_subtable (i).dispatch (c, lookup_type); |
- if (c->stop_sublookup_iteration (r)) |
- return TRACE_RETURN (r); |
- } |
- return TRACE_RETURN (c->default_return_value ()); |
- } |
+ { return Lookup::dispatch<SubstLookupSubTable> (c); } |
- inline bool sanitize (hb_sanitize_context_t *c) |
+ inline bool sanitize (hb_sanitize_context_t *c) const |
{ |
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); |
+ const OffsetArrayOf<SubstLookupSubTable> &list = get_subtables<SubstLookupSubTable> (); |
+ if (unlikely (!dispatch (c))) return TRACE_RETURN (false); |
if (unlikely (get_type () == SubstLookupSubTable::Extension)) |
{ |
@@ -1324,10 +1256,11 @@ 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 bool sanitize (hb_sanitize_context_t *c) { |
+ inline bool sanitize (hb_sanitize_context_t *c) const |
+ { |
TRACE_SANITIZE (this); |
if (unlikely (!GSUBGPOS::sanitize (c))) return TRACE_RETURN (false); |
- OffsetTo<SubstLookupList> &list = CastR<OffsetTo<SubstLookupList> > (lookupList); |
+ const OffsetTo<SubstLookupList> &list = CastR<OffsetTo<SubstLookupList> > (lookupList); |
return TRACE_RETURN (list.sanitize (c, this)); |
} |
public: |
@@ -1362,7 +1295,7 @@ GSUB::substitute_finish (hb_font_t *font HB_UNUSED, hb_buffer_t *buffer HB_UNUSE |
{ |
unsigned int type = get_type (); |
if (unlikely (type == SubstLookupSubTable::Extension)) |
- return CastR<ExtensionSubst> (get_subtable<SubstLookupSubTable>()).is_reverse (); |
+ return CastR<ExtensionSubst> (get_subtable<LookupSubTable>()).is_reverse (); |
return SubstLookup::lookup_type_is_reverse (type); |
} |
@@ -1380,8 +1313,8 @@ template <typename context_t> |
const SubstLookup &l = gsub.get_lookup (lookup_index); |
unsigned int saved_lookup_props = c->lookup_props; |
c->set_lookup (l); |
- bool ret = l.apply_once (c); |
- c->lookup_props = saved_lookup_props; |
+ bool ret = l.dispatch (c); |
+ c->set_lookup_props (saved_lookup_props); |
return ret; |
} |