Index: third_party/harfbuzz-ng/src/hb-ot-layout-common-private.hh |
diff --git a/third_party/harfbuzz-ng/src/hb-ot-layout-common-private.hh b/third_party/harfbuzz-ng/src/hb-ot-layout-common-private.hh |
index abd063c89612e0f821e92ef6bb268138129bd1ba..3db7f57ab424f9951c87b8ec4238d9845b6db118 100644 |
--- a/third_party/harfbuzz-ng/src/hb-ot-layout-common-private.hh |
+++ b/third_party/harfbuzz-ng/src/hb-ot-layout-common-private.hh |
@@ -37,6 +37,12 @@ |
namespace OT { |
+#define TRACE_DISPATCH(this, format) \ |
+ hb_auto_trace_t<context_t::max_debug_depth, typename context_t::return_t> trace \ |
+ (&c->debug_depth, c->get_name (), this, HB_FUNC, \ |
+ "format %d", (int) format); |
+ |
+ |
#define NOT_COVERED ((unsigned int) -1) |
#define MAX_NESTING_LEVEL 8 |
#define MAX_CONTEXT_LENGTH 64 |
@@ -63,9 +69,10 @@ struct Record |
struct sanitize_closure_t { |
hb_tag_t tag; |
- void *list_base; |
+ const void *list_base; |
}; |
- inline bool sanitize (hb_sanitize_context_t *c, void *base) { |
+ inline bool sanitize (hb_sanitize_context_t *c, const void *base) const |
+ { |
TRACE_SANITIZE (this); |
const sanitize_closure_t closure = {tag, base}; |
return TRACE_RETURN (c->check_struct (this) && offset.sanitize (c, base, &closure)); |
@@ -121,7 +128,8 @@ struct RecordListOf : RecordArrayOf<Type> |
inline const Type& operator [] (unsigned int i) const |
{ return this+RecordArrayOf<Type>::operator [](i).offset; } |
- inline bool sanitize (hb_sanitize_context_t *c) { |
+ inline bool sanitize (hb_sanitize_context_t *c) const |
+ { |
TRACE_SANITIZE (this); |
return TRACE_RETURN (RecordArrayOf<Type>::sanitize (c, this)); |
} |
@@ -134,7 +142,8 @@ struct RangeRecord |
return g < start ? -1 : g <= end ? 0 : +1 ; |
} |
- inline bool sanitize (hb_sanitize_context_t *c) { |
+ inline bool sanitize (hb_sanitize_context_t *c) const |
+ { |
TRACE_SANITIZE (this); |
return TRACE_RETURN (c->check_struct (this)); |
} |
@@ -199,7 +208,8 @@ struct LangSys |
} |
inline bool sanitize (hb_sanitize_context_t *c, |
- const Record<LangSys>::sanitize_closure_t * = NULL) { |
+ const Record<LangSys>::sanitize_closure_t * = NULL) const |
+ { |
TRACE_SANITIZE (this); |
return TRACE_RETURN (c->check_struct (this) && featureIndex.sanitize (c)); |
} |
@@ -238,7 +248,8 @@ struct Script |
inline const LangSys& get_default_lang_sys (void) const { return this+defaultLangSys; } |
inline bool sanitize (hb_sanitize_context_t *c, |
- const Record<Script>::sanitize_closure_t * = NULL) { |
+ const Record<Script>::sanitize_closure_t * = NULL) const |
+ { |
TRACE_SANITIZE (this); |
return TRACE_RETURN (defaultLangSys.sanitize (c, this) && langSys.sanitize (c, this)); |
} |
@@ -260,7 +271,8 @@ typedef RecordListOf<Script> ScriptList; |
/* http://www.microsoft.com/typography/otspec/features_pt.htm#size */ |
struct FeatureParamsSize |
{ |
- inline bool sanitize (hb_sanitize_context_t *c) { |
+ inline bool sanitize (hb_sanitize_context_t *c) const |
+ { |
TRACE_SANITIZE (this); |
if (unlikely (!c->check_struct (this))) return TRACE_RETURN (false); |
@@ -371,7 +383,8 @@ struct FeatureParamsSize |
/* http://www.microsoft.com/typography/otspec/features_pt.htm#ssxx */ |
struct FeatureParamsStylisticSet |
{ |
- inline bool sanitize (hb_sanitize_context_t *c) { |
+ inline bool sanitize (hb_sanitize_context_t *c) const |
+ { |
TRACE_SANITIZE (this); |
/* Right now minorVersion is at zero. Which means, any table supports |
* the uiNameID field. */ |
@@ -404,7 +417,8 @@ struct FeatureParamsStylisticSet |
/* http://www.microsoft.com/typography/otspec/features_ae.htm#cv01-cv99 */ |
struct FeatureParamsCharacterVariants |
{ |
- inline bool sanitize (hb_sanitize_context_t *c) { |
+ inline bool sanitize (hb_sanitize_context_t *c) const |
+ { |
TRACE_SANITIZE (this); |
return TRACE_RETURN (c->check_struct (this) && |
characters.sanitize (c)); |
@@ -444,7 +458,8 @@ struct FeatureParamsCharacterVariants |
struct FeatureParams |
{ |
- inline bool sanitize (hb_sanitize_context_t *c, hb_tag_t tag) { |
+ inline bool sanitize (hb_sanitize_context_t *c, hb_tag_t tag) const |
+ { |
TRACE_SANITIZE (this); |
if (tag == HB_TAG ('s','i','z','e')) |
return TRACE_RETURN (u.size.sanitize (c)); |
@@ -486,7 +501,8 @@ struct Feature |
{ return this+featureParams; } |
inline bool sanitize (hb_sanitize_context_t *c, |
- const Record<Feature>::sanitize_closure_t *closure) { |
+ const Record<Feature>::sanitize_closure_t *closure) const |
+ { |
TRACE_SANITIZE (this); |
if (unlikely (!(c->check_struct (this) && lookupIndex.sanitize (c)))) |
return TRACE_RETURN (false); |
@@ -561,6 +577,17 @@ struct Lookup |
{ |
inline unsigned int get_subtable_count (void) const { return subTable.len; } |
+ template <typename SubTableType> |
+ inline const SubTableType& get_subtable (unsigned int i) const |
+ { return this+CastR<OffsetArrayOf<SubTableType> > (subTable)[i]; } |
+ |
+ template <typename SubTableType> |
+ inline const OffsetArrayOf<SubTableType>& get_subtables (void) const |
+ { return CastR<OffsetArrayOf<SubTableType> > (subTable); } |
+ template <typename SubTableType> |
+ inline OffsetArrayOf<SubTableType>& get_subtables (void) |
+ { return CastR<OffsetArrayOf<SubTableType> > (subTable); } |
+ |
inline unsigned int get_type (void) const { return lookupType; } |
/* lookup_props is a 32-bit integer where the lower 16-bit is LookupFlag and |
@@ -577,6 +604,20 @@ struct Lookup |
return flag; |
} |
+ template <typename SubTableType, 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<SubTableType> (i).dispatch (c, lookup_type); |
+ if (c->stop_sublookup_iteration (r)) |
+ return TRACE_RETURN (r); |
+ } |
+ return TRACE_RETURN (c->default_return_value ()); |
+ } |
+ |
inline bool serialize (hb_serialize_context_t *c, |
unsigned int lookup_type, |
uint32_t lookup_props, |
@@ -595,18 +636,20 @@ struct Lookup |
return TRACE_RETURN (true); |
} |
- inline bool sanitize (hb_sanitize_context_t *c) { |
+ inline bool sanitize (hb_sanitize_context_t *c) const |
+ { |
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) |
{ |
- USHORT &markFilteringSet = StructAfter<USHORT> (subTable); |
+ const USHORT &markFilteringSet = StructAfter<USHORT> (subTable); |
if (!markFilteringSet.sanitize (c)) return TRACE_RETURN (false); |
} |
return TRACE_RETURN (true); |
} |
+ private: |
USHORT lookupType; /* Different enumerations for GSUB and GPOS */ |
USHORT lookupFlag; /* Lookup qualifiers */ |
ArrayOf<Offset<> > |
@@ -651,7 +694,8 @@ struct CoverageFormat1 |
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 (glyphArray.sanitize (c)); |
} |
@@ -737,7 +781,8 @@ struct CoverageFormat2 |
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 (rangeRecord.sanitize (c)); |
} |
@@ -832,7 +877,8 @@ struct Coverage |
} |
} |
- inline bool sanitize (hb_sanitize_context_t *c) { |
+ inline bool sanitize (hb_sanitize_context_t *c) const |
+ { |
TRACE_SANITIZE (this); |
if (!u.format.sanitize (c)) return TRACE_RETURN (false); |
switch (u.format) { |
@@ -938,12 +984,14 @@ struct ClassDefFormat1 |
private: |
inline unsigned int get_class (hb_codepoint_t glyph_id) const |
{ |
- if (unlikely ((unsigned int) (glyph_id - startGlyph) < classValue.len)) |
- return classValue[glyph_id - startGlyph]; |
+ unsigned int i = (unsigned int) (glyph_id - startGlyph); |
+ if (unlikely (i < classValue.len)) |
+ return classValue[i]; |
return 0; |
} |
- inline bool sanitize (hb_sanitize_context_t *c) { |
+ inline bool sanitize (hb_sanitize_context_t *c) const |
+ { |
TRACE_SANITIZE (this); |
return TRACE_RETURN (c->check_struct (this) && classValue.sanitize (c)); |
} |
@@ -994,12 +1042,13 @@ struct ClassDefFormat2 |
inline unsigned int get_class (hb_codepoint_t glyph_id) const |
{ |
int i = rangeRecord.bsearch (glyph_id); |
- if (i != -1) |
+ if (unlikely (i != -1)) |
return rangeRecord[i].value; |
return 0; |
} |
- inline bool sanitize (hb_sanitize_context_t *c) { |
+ inline bool sanitize (hb_sanitize_context_t *c) const |
+ { |
TRACE_SANITIZE (this); |
return TRACE_RETURN (rangeRecord.sanitize (c)); |
} |
@@ -1056,7 +1105,8 @@ struct ClassDef |
} |
} |
- inline bool sanitize (hb_sanitize_context_t *c) { |
+ inline bool sanitize (hb_sanitize_context_t *c) const |
+ { |
TRACE_SANITIZE (this); |
if (!u.format.sanitize (c)) return TRACE_RETURN (false); |
switch (u.format) { |
@@ -1148,7 +1198,8 @@ struct Device |
return USHORT::static_size * (4 + ((endSize - startSize) >> (4 - f))); |
} |
- inline bool sanitize (hb_sanitize_context_t *c) { |
+ inline bool sanitize (hb_sanitize_context_t *c) const |
+ { |
TRACE_SANITIZE (this); |
return TRACE_RETURN (c->check_struct (this) && c->check_range (this, this->get_size ())); |
} |