diff --git a/src/hb-open-type-private.hh b/src/hb-open-type-private.hh index 0ccec1dea..7c877058a 100644 --- a/src/hb-open-type-private.hh +++ b/src/hb-open-type-private.hh @@ -39,19 +39,37 @@ * Casts */ -template const char * ConstCharP (const Type X) { return reinterpret_cast(X); } -template char * CharP (Type X) { return reinterpret_cast(X); } -template char * DeConstCharP (const Type X) { return (char *) reinterpret_cast(X); } +template inline const char * ConstCharP (const Type X) { return reinterpret_cast(X); } +template inline char * CharP (Type X) { return reinterpret_cast(X); } +template inline char * DeConstCharP (const Type X) { return (char *) reinterpret_cast(X); } #define CONST_CAST(T,X,Ofs) (*(reinterpret_cast(ConstCharP(&(X)) + Ofs))) #define DECONST_CAST(T,X,Ofs) (*(reinterpret_cast((char *)ConstCharP(&(X)) + Ofs))) #define CAST(T,X,Ofs) (*(reinterpret_cast(CharP(&(X)) + Ofs))) -#define CONST_NEXT(T,X) (*(reinterpret_cast(ConstCharP(&(X)) + (X).get_size ()))) -#define NEXT(T,X) (*(reinterpret_cast(CharP(&(X)) + (X).get_size ()))) -#define CONST_ARRAY_AFTER(T,X) ((reinterpret_cast(ConstCharP(&(X)) + X.get_size ()))) -#define ARRAY_AFTER(T,X) ((reinterpret_cast(CharP(&(X)) + X.get_size ()))) +template +inline const Type& StructAfter(const TObject &X) +{ + return * reinterpret_cast (ConstCharP (&X) + X.get_size()); +} +template +inline Type& StructAfter(TObject &X) +{ + return * reinterpret_cast (CharP (&X) + X.get_size()); +} + +template +inline const Type* ArrayAfter(const TObject &X) +{ + return reinterpret_cast (ConstCharP (&X) + X.get_size()); +} +template +inline Type* ArrayAfter(TObject &X) +{ + return reinterpret_cast (CharP (&X) + X.get_size()); +} + /* * Class features @@ -504,8 +522,8 @@ struct LongOffsetTo : GenericOffsetTo {}; template struct GenericArrayOf { - const Type *const_array(void) const { return CONST_ARRAY_AFTER (Type, len); } - Type *array(void) { return ARRAY_AFTER (Type, len); } + const Type *const_array(void) const { return ArrayAfter (len); } + Type *array(void) { return ArrayAfter (len); } const Type *const_sub_array (unsigned int start_offset, unsigned int *pcount /* IN/OUT */) const { @@ -622,8 +640,8 @@ struct OffsetListOf : OffsetArrayOf template struct HeadlessArrayOf { - const Type *const_array(void) const { return CONST_ARRAY_AFTER (Type, len); } - Type *array(void) { return ARRAY_AFTER (Type, len); } + const Type *const_array(void) const { return ArrayAfter (len); } + Type *array(void) { return ArrayAfter (len); } inline const Type& operator [] (unsigned int i) const { diff --git a/src/hb-ot-layout-common-private.hh b/src/hb-ot-layout-common-private.hh index 05daebdcb..595e6403e 100644 --- a/src/hb-ot-layout-common-private.hh +++ b/src/hb-ot-layout-common-private.hh @@ -287,7 +287,7 @@ struct Lookup unsigned int flag = lookupFlag; if (HB_UNLIKELY (flag & LookupFlag::UseMarkFilteringSet)) { - const USHORT &markFilteringSet = CONST_NEXT (USHORT, subTable); + const USHORT &markFilteringSet = StructAfter (subTable); flag += (markFilteringSet << 16); } return flag; @@ -298,7 +298,7 @@ struct Lookup if (!(SANITIZE (lookupType) && SANITIZE (lookupFlag) && SANITIZE_THIS (subTable))) return false; if (HB_UNLIKELY (lookupFlag & LookupFlag::UseMarkFilteringSet)) { - USHORT &markFilteringSet = NEXT (USHORT, subTable); + USHORT &markFilteringSet = StructAfter (subTable); if (!SANITIZE (markFilteringSet)) return false; } return true; diff --git a/src/hb-ot-layout-gsub-private.hh b/src/hb-ot-layout-gsub-private.hh index a82833716..829911611 100644 --- a/src/hb-ot-layout-gsub-private.hh +++ b/src/hb-ot-layout-gsub-private.hh @@ -586,8 +586,8 @@ struct ReverseChainSingleSubstFormat1 if (HB_LIKELY (index == NOT_COVERED)) return false; - const OffsetArrayOf &lookahead = CONST_NEXT (OffsetArrayOf, backtrack); - const ArrayOf &substitute = CONST_NEXT (ArrayOf, lookahead); + const OffsetArrayOf &lookahead = StructAfter > (backtrack); + const ArrayOf &substitute = StructAfter > (lookahead); if (match_backtrack (APPLY_ARG, backtrack.len, (USHORT *) backtrack.const_array(), @@ -609,10 +609,10 @@ struct ReverseChainSingleSubstFormat1 TRACE_SANITIZE (); if (!SANITIZE_THIS2 (coverage, backtrack)) return false; - OffsetArrayOf &lookahead = NEXT (OffsetArrayOf, backtrack); + OffsetArrayOf &lookahead = StructAfter > (backtrack); if (!SANITIZE_THIS (lookahead)) return false; - ArrayOf &substitute = NEXT (ArrayOf, lookahead); + ArrayOf &substitute = StructAfter > (lookahead); return SANITIZE (substitute); } diff --git a/src/hb-ot-layout-gsubgpos-private.hh b/src/hb-ot-layout-gsubgpos-private.hh index 9418e712d..cc0542b27 100644 --- a/src/hb-ot-layout-gsubgpos-private.hh +++ b/src/hb-ot-layout-gsubgpos-private.hh @@ -569,9 +569,9 @@ struct ChainRule inline bool apply (APPLY_ARG_DEF, ChainContextLookupContext &lookup_context) const { TRACE_APPLY (); - const HeadlessArrayOf &input = CONST_NEXT (HeadlessArrayOf, backtrack); - const ArrayOf &lookahead = CONST_NEXT (ArrayOf, input); - const ArrayOf &lookup = CONST_NEXT (ArrayOf, lookahead); + const HeadlessArrayOf &input = StructAfter > (backtrack); + const ArrayOf &lookahead = StructAfter > (input); + const ArrayOf &lookup = StructAfter > (lookahead); return chain_context_lookup (APPLY_ARG, backtrack.len, backtrack.const_array(), input.len, input.const_array(), @@ -585,11 +585,11 @@ struct ChainRule inline bool sanitize (SANITIZE_ARG_DEF) { TRACE_SANITIZE (); if (!SANITIZE (backtrack)) return false; - HeadlessArrayOf &input = NEXT (HeadlessArrayOf, backtrack); + HeadlessArrayOf &input = StructAfter > (backtrack); if (!SANITIZE (input)) return false; - ArrayOf &lookahead = NEXT (ArrayOf, input); + ArrayOf &lookahead = StructAfter > (input); if (!SANITIZE (lookahead)) return false; - ArrayOf &lookup = NEXT (ArrayOf, lookahead); + ArrayOf &lookup = StructAfter > (lookahead); return SANITIZE (lookup); } @@ -742,14 +742,14 @@ struct ChainContextFormat3 inline bool apply (APPLY_ARG_DEF, apply_lookup_func_t apply_func) const { TRACE_APPLY (); - const OffsetArrayOf &input = CONST_NEXT (OffsetArrayOf, backtrack); + const OffsetArrayOf &input = StructAfter > (backtrack); unsigned int index = (this+input[0]) (IN_CURGLYPH ()); if (HB_LIKELY (index == NOT_COVERED)) return false; - const OffsetArrayOf &lookahead = CONST_NEXT (OffsetArrayOf, input); - const ArrayOf &lookup = CONST_NEXT (ArrayOf, lookahead); + const OffsetArrayOf &lookahead = StructAfter > (input); + const ArrayOf &lookup = StructAfter > (lookahead); struct ChainContextLookupContext lookup_context = { {match_coverage, apply_func}, {ConstCharP(this), ConstCharP(this), ConstCharP(this)} @@ -766,11 +766,11 @@ struct ChainContextFormat3 inline bool sanitize (SANITIZE_ARG_DEF) { TRACE_SANITIZE (); if (!SANITIZE_THIS (backtrack)) return false; - OffsetArrayOf &input = NEXT (OffsetArrayOf, backtrack); + OffsetArrayOf &input = StructAfter > (backtrack); if (!SANITIZE_THIS (input)) return false; - OffsetArrayOf &lookahead = NEXT (OffsetArrayOf, input); + OffsetArrayOf &lookahead = StructAfter > (input); if (!SANITIZE_THIS (lookahead)) return false; - ArrayOf &lookup = NEXT (ArrayOf, lookahead); + ArrayOf &lookup = StructAfter > (lookahead); return SANITIZE (lookup); }