diff options
Diffstat (limited to 'pango/opentype/hb-ot-layout-gsub-private.hh')
-rw-r--r-- | pango/opentype/hb-ot-layout-gsub-private.hh | 125 |
1 files changed, 124 insertions, 1 deletions
diff --git a/pango/opentype/hb-ot-layout-gsub-private.hh b/pango/opentype/hb-ot-layout-gsub-private.hh index 37cc00b5..af58a1fe 100644 --- a/pango/opentype/hb-ot-layout-gsub-private.hh +++ b/pango/opentype/hb-ot-layout-gsub-private.hh @@ -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) |