summaryrefslogtreecommitdiff
path: root/pango/opentype/hb-ot-layout-gsub-private.hh
diff options
context:
space:
mode:
Diffstat (limited to 'pango/opentype/hb-ot-layout-gsub-private.hh')
-rw-r--r--pango/opentype/hb-ot-layout-gsub-private.hh125
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)