|
|
|
@ -35,6 +35,7 @@ struct SingleSubstFormat1 |
|
|
|
|
friend struct SingleSubst; |
|
|
|
|
|
|
|
|
|
private: |
|
|
|
|
|
|
|
|
|
inline bool apply (APPLY_ARG_DEF) const |
|
|
|
|
{ |
|
|
|
|
hb_codepoint_t glyph_id = IN_CURGLYPH (); |
|
|
|
@ -52,6 +53,10 @@ struct SingleSubstFormat1 |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline bool sanitize (SANITIZE_ARG_DEF) { |
|
|
|
|
return SANITIZE_THIS (coverage) && SANITIZE (deltaGlyphID); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private: |
|
|
|
|
USHORT format; /* Format identifier--format = 1 */ |
|
|
|
|
OffsetTo<Coverage> |
|
|
|
@ -67,6 +72,7 @@ struct SingleSubstFormat2 |
|
|
|
|
friend struct SingleSubst; |
|
|
|
|
|
|
|
|
|
private: |
|
|
|
|
|
|
|
|
|
inline bool apply (APPLY_ARG_DEF) const |
|
|
|
|
{ |
|
|
|
|
hb_codepoint_t glyph_id = IN_CURGLYPH (); |
|
|
|
@ -87,6 +93,10 @@ struct SingleSubstFormat2 |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline bool sanitize (SANITIZE_ARG_DEF) { |
|
|
|
|
return SANITIZE_THIS (coverage) && SANITIZE (substitute); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private: |
|
|
|
|
USHORT format; /* Format identifier--format = 2 */ |
|
|
|
|
OffsetTo<Coverage> |
|
|
|
@ -103,6 +113,7 @@ struct SingleSubst |
|
|
|
|
friend struct SubstLookupSubTable; |
|
|
|
|
|
|
|
|
|
private: |
|
|
|
|
|
|
|
|
|
inline bool apply (APPLY_ARG_DEF) const |
|
|
|
|
{ |
|
|
|
|
switch (u.format) { |
|
|
|
@ -112,6 +123,15 @@ struct SingleSubst |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline bool sanitize (SANITIZE_ARG_DEF) { |
|
|
|
|
if (!SANITIZE (u.format)) return false; |
|
|
|
|
switch (u.format) { |
|
|
|
|
case 1: return u.format1->sanitize (SANITIZE_ARG); |
|
|
|
|
case 2: return u.format2->sanitize (SANITIZE_ARG); |
|
|
|
|
default:return true; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private: |
|
|
|
|
union { |
|
|
|
|
USHORT format; /* Format identifier */ |
|
|
|
@ -150,6 +170,11 @@ struct Sequence |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public: |
|
|
|
|
inline bool sanitize (SANITIZE_ARG_DEF) { |
|
|
|
|
return SANITIZE (substitute); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private: |
|
|
|
|
ArrayOf<GlyphID> |
|
|
|
|
substitute; /* String of GlyphIDs to substitute */ |
|
|
|
@ -161,6 +186,7 @@ struct MultipleSubstFormat1 |
|
|
|
|
friend struct MultipleSubst; |
|
|
|
|
|
|
|
|
|
private: |
|
|
|
|
|
|
|
|
|
inline bool apply (APPLY_ARG_DEF) const |
|
|
|
|
{ |
|
|
|
|
|
|
|
|
@ -171,6 +197,10 @@ struct MultipleSubstFormat1 |
|
|
|
|
return (this+sequence[index]).apply (APPLY_ARG); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline bool sanitize (SANITIZE_ARG_DEF) { |
|
|
|
|
return SANITIZE_THIS2 (coverage, sequence); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private: |
|
|
|
|
USHORT format; /* Format identifier--format = 1 */ |
|
|
|
|
OffsetTo<Coverage> |
|
|
|
@ -187,6 +217,7 @@ struct MultipleSubst |
|
|
|
|
friend struct SubstLookupSubTable; |
|
|
|
|
|
|
|
|
|
private: |
|
|
|
|
|
|
|
|
|
inline bool apply (APPLY_ARG_DEF) const |
|
|
|
|
{ |
|
|
|
|
switch (u.format) { |
|
|
|
@ -195,6 +226,14 @@ struct MultipleSubst |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline bool sanitize (SANITIZE_ARG_DEF) { |
|
|
|
|
if (!SANITIZE (u.format)) return false; |
|
|
|
|
switch (u.format) { |
|
|
|
|
case 1: return u.format1->sanitize (SANITIZE_ARG); |
|
|
|
|
default:return true; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private: |
|
|
|
|
union { |
|
|
|
|
USHORT format; /* Format identifier */ |
|
|
|
@ -213,6 +252,7 @@ struct AlternateSubstFormat1 |
|
|
|
|
friend struct AlternateSubst; |
|
|
|
|
|
|
|
|
|
private: |
|
|
|
|
|
|
|
|
|
inline bool apply (APPLY_ARG_DEF) const |
|
|
|
|
{ |
|
|
|
|
hb_codepoint_t glyph_id = IN_CURGLYPH (); |
|
|
|
@ -249,6 +289,10 @@ struct AlternateSubstFormat1 |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline bool sanitize (SANITIZE_ARG_DEF) { |
|
|
|
|
return SANITIZE_THIS2 (coverage, alternateSet); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private: |
|
|
|
|
USHORT format; /* Format identifier--format = 1 */ |
|
|
|
|
OffsetTo<Coverage> |
|
|
|
@ -265,6 +309,7 @@ struct AlternateSubst |
|
|
|
|
friend struct SubstLookupSubTable; |
|
|
|
|
|
|
|
|
|
private: |
|
|
|
|
|
|
|
|
|
inline bool apply (APPLY_ARG_DEF) const |
|
|
|
|
{ |
|
|
|
|
switch (u.format) { |
|
|
|
@ -273,6 +318,14 @@ struct AlternateSubst |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline bool sanitize (SANITIZE_ARG_DEF) { |
|
|
|
|
if (!SANITIZE (u.format)) return false; |
|
|
|
|
switch (u.format) { |
|
|
|
|
case 1: return u.format1->sanitize (SANITIZE_ARG); |
|
|
|
|
default:return true; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private: |
|
|
|
|
union { |
|
|
|
|
USHORT format; /* Format identifier */ |
|
|
|
@ -352,6 +405,11 @@ struct Ligature |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public: |
|
|
|
|
inline bool sanitize (SANITIZE_ARG_DEF) { |
|
|
|
|
return SANITIZE2 (ligGlyph, component); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private: |
|
|
|
|
GlyphID ligGlyph; /* GlyphID of ligature to substitute */ |
|
|
|
|
HeadlessArrayOf<GlyphID> |
|
|
|
@ -379,6 +437,11 @@ struct LigatureSet |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public: |
|
|
|
|
inline bool sanitize (SANITIZE_ARG_DEF) { |
|
|
|
|
return SANITIZE_THIS (ligature); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private: |
|
|
|
|
OffsetArrayOf<Ligature> |
|
|
|
|
ligature; /* Array LigatureSet tables
|
|
|
|
@ -405,6 +468,10 @@ struct LigatureSubstFormat1 |
|
|
|
|
return lig_set.apply (APPLY_ARG, first_is_mark); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline bool sanitize (SANITIZE_ARG_DEF) { |
|
|
|
|
return SANITIZE_THIS2 (coverage, ligatureSet); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private: |
|
|
|
|
USHORT format; /* Format identifier--format = 1 */ |
|
|
|
|
OffsetTo<Coverage> |
|
|
|
@ -429,6 +496,14 @@ struct LigatureSubst |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline bool sanitize (SANITIZE_ARG_DEF) { |
|
|
|
|
if (!SANITIZE (u.format)) return false; |
|
|
|
|
switch (u.format) { |
|
|
|
|
case 1: return u.format1->sanitize (SANITIZE_ARG); |
|
|
|
|
default:return true; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private: |
|
|
|
|
union { |
|
|
|
|
USHORT format; /* Format identifier */ |
|
|
|
@ -467,7 +542,14 @@ struct ExtensionSubst : Extension |
|
|
|
|
friend struct SubstLookupSubTable; |
|
|
|
|
|
|
|
|
|
private: |
|
|
|
|
inline const struct SubstLookupSubTable& get_subtable (void) const |
|
|
|
|
{ return (const struct SubstLookupSubTable&) Extension::get_subtable (); } |
|
|
|
|
inline struct SubstLookupSubTable& get_subtable (void) |
|
|
|
|
{ return (struct SubstLookupSubTable&) Extension::get_subtable (); } |
|
|
|
|
|
|
|
|
|
inline bool apply (APPLY_ARG_DEF) const; |
|
|
|
|
|
|
|
|
|
inline bool sanitize (SANITIZE_ARG_DEF); |
|
|
|
|
}; |
|
|
|
|
ASSERT_SIZE (ExtensionSubst, 2); |
|
|
|
|
|
|
|
|
@ -507,6 +589,19 @@ struct ReverseChainSingleSubstFormat1 |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline bool sanitize (SANITIZE_ARG_DEF) { |
|
|
|
|
if (!SANITIZE_THIS2 (coverage, backtrack)) |
|
|
|
|
return false; |
|
|
|
|
OffsetArrayOf<Coverage> &lookahead = (OffsetArrayOf<Coverage>&) |
|
|
|
|
*((const char *) &backtrack + backtrack.get_size ()); |
|
|
|
|
if (!SANITIZE_THIS (lookahead)) |
|
|
|
|
return false; |
|
|
|
|
ArrayOf<GlyphID> &substitute = (ArrayOf<GlyphID>&) |
|
|
|
|
*((const char *) &lookahead + lookahead.get_size ()); |
|
|
|
|
if (!SANITIZE (substitute)) |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private: |
|
|
|
|
USHORT format; /* Format identifier--format = 1 */ |
|
|
|
|
OffsetTo<Coverage> |
|
|
|
@ -539,6 +634,14 @@ struct ReverseChainSingleSubst |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline bool sanitize (SANITIZE_ARG_DEF) { |
|
|
|
|
if (!SANITIZE (u.format)) return false; |
|
|
|
|
switch (u.format) { |
|
|
|
|
case 1: return u.format1->sanitize (SANITIZE_ARG); |
|
|
|
|
default:return true; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private: |
|
|
|
|
union { |
|
|
|
|
USHORT format; /* Format identifier */ |
|
|
|
@ -583,6 +686,21 @@ struct SubstLookupSubTable |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline bool sanitize (SANITIZE_ARG_DEF) { |
|
|
|
|
if (!SANITIZE (u.format)) return false; |
|
|
|
|
switch (u.format) { |
|
|
|
|
case Single: return u.single->sanitize (SANITIZE_ARG); |
|
|
|
|
case Multiple: return u.multiple->sanitize (SANITIZE_ARG); |
|
|
|
|
case Alternate: return u.alternate->sanitize (SANITIZE_ARG); |
|
|
|
|
case Ligature: return u.ligature->sanitize (SANITIZE_ARG); |
|
|
|
|
case Context: return u.context->sanitize (SANITIZE_ARG); |
|
|
|
|
case ChainContext: return u.chainContext->sanitize (SANITIZE_ARG); |
|
|
|
|
case Extension: return u.extension->sanitize (SANITIZE_ARG); |
|
|
|
|
case ReverseChainSingle: return u.reverseChainContextSingle->sanitize (SANITIZE_ARG); |
|
|
|
|
default:return true; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private: |
|
|
|
|
union { |
|
|
|
|
USHORT format; |
|
|
|
@ -729,7 +847,12 @@ inline bool ExtensionSubst::apply (APPLY_ARG_DEF) const |
|
|
|
|
if (HB_UNLIKELY (lookup_type == SubstLookupSubTable::Extension)) |
|
|
|
|
return false; |
|
|
|
|
|
|
|
|
|
return ((SubstLookupSubTable&) get_subtable ()).apply (APPLY_ARG, lookup_type); |
|
|
|
|
return get_subtable ().apply (APPLY_ARG, lookup_type); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline bool ExtensionSubst::sanitize (SANITIZE_ARG_DEF) |
|
|
|
|
{ |
|
|
|
|
return Extension::sanitize (SANITIZE_ARG) && get_subtable ().sanitize (SANITIZE_ARG); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static inline bool substitute_lookup (APPLY_ARG_DEF, unsigned int lookup_index) |
|
|
|
|