Convert the last set of cast macros to templates
This commit is contained in:
parent
c38188a191
commit
a3263aa773
|
@ -191,8 +191,8 @@ struct OpenTypeFontFile
|
||||||
if (!SANITIZE_SELF ()) return false;
|
if (!SANITIZE_SELF ()) return false;
|
||||||
switch (tag) {
|
switch (tag) {
|
||||||
default: return true;
|
default: return true;
|
||||||
case TrueTypeTag: case CFFTag: return SANITIZE_THIS (CAST (OffsetTable, *this, 0));
|
case TrueTypeTag: case CFFTag: return SANITIZE_THIS (Cast<OffsetTable> (*this));
|
||||||
case TTCTag: return SANITIZE (CAST (TTCHeader, *this, 0));
|
case TTCTag: return SANITIZE (Cast<TTCHeader> (*this));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -36,30 +36,45 @@
|
||||||
#define NO_INDEX ((unsigned int) 0xFFFF)
|
#define NO_INDEX ((unsigned int) 0xFFFF)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Casts
|
* Casts
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Cast to "const char *" and "char *" */
|
/* Cast to "const char *" and "char *" */
|
||||||
template <typename Type> inline const char * CharP (const Type* X) { return reinterpret_cast<const char *>(X); }
|
template <typename Type>
|
||||||
template <typename Type> inline char * CharP (Type* X) { return reinterpret_cast<char *>(X); }
|
inline const char * CharP (const Type* X)
|
||||||
|
{ return reinterpret_cast<const char *>(X); }
|
||||||
|
template <typename Type>
|
||||||
|
inline char * CharP (Type* X)
|
||||||
|
{ return reinterpret_cast<char *>(X); }
|
||||||
|
|
||||||
#define CONST_CAST(T,X,Ofs) (*(reinterpret_cast<const T *>(CharP(&(X)) + Ofs)))
|
/* Cast to struct T& */
|
||||||
#define CAST(T,X,Ofs) (*(reinterpret_cast<T *>(CharP(&(X)) + Ofs)))
|
template<typename Type, typename TObject>
|
||||||
|
inline const Type& Cast(const TObject &X)
|
||||||
|
{ return reinterpret_cast<const Type&> (X); }
|
||||||
|
template<typename Type, typename TObject>
|
||||||
|
inline Type& Cast(TObject &X)
|
||||||
|
{ return reinterpret_cast<Type&> (X); }
|
||||||
|
|
||||||
|
/* StructAtOffset<T>(X,Ofs) returns the struct T& that is placed at memory
|
||||||
|
* location of X plus Ofs bytes. */
|
||||||
|
template<typename Type, typename TObject>
|
||||||
|
inline const Type& StructAtOffset(const TObject &X, unsigned int offset)
|
||||||
|
{ return * reinterpret_cast<const Type*> (CharP (&X) + offset); }
|
||||||
|
template<typename Type, typename TObject>
|
||||||
|
inline Type& StructAtOffset(TObject &X, unsigned int offset)
|
||||||
|
{ return * reinterpret_cast<Type*> (CharP (&X) + offset); }
|
||||||
|
|
||||||
/* StructAfter<T>(X) returns the struct T& that is placed after X.
|
/* StructAfter<T>(X) returns the struct T& that is placed after X.
|
||||||
* Works with X of variable size also. X must implement get_size() */
|
* Works with X of variable size also. X must implement get_size() */
|
||||||
template<typename Type, typename TObject>
|
template<typename Type, typename TObject>
|
||||||
inline const Type& StructAfter(const TObject &X)
|
inline const Type& StructAfter(const TObject &X)
|
||||||
{
|
{ return StructAtOffset<Type>(X, X.get_size()); }
|
||||||
return * reinterpret_cast<const Type*> (CharP (&X) + X.get_size());
|
|
||||||
}
|
|
||||||
template<typename Type, typename TObject>
|
template<typename Type, typename TObject>
|
||||||
inline Type& StructAfter(TObject &X)
|
inline Type& StructAfter(TObject &X)
|
||||||
{
|
{ return StructAtOffset<Type>(X, X.get_size()); }
|
||||||
return * reinterpret_cast<Type*> (CharP (&X) + X.get_size());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -76,7 +91,7 @@ static const void *_NullPool[32 / sizeof (void *)];
|
||||||
template <typename Type>
|
template <typename Type>
|
||||||
static inline const Type& Null () {
|
static inline const Type& Null () {
|
||||||
ASSERT_STATIC (sizeof (Type) <= sizeof (_NullPool));
|
ASSERT_STATIC (sizeof (Type) <= sizeof (_NullPool));
|
||||||
return CONST_CAST (Type, *_NullPool, 0);
|
return Cast<Type> (*_NullPool);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Specializaiton for arbitrary-content arbitrary-sized Null objects. */
|
/* Specializaiton for arbitrary-content arbitrary-sized Null objects. */
|
||||||
|
@ -84,7 +99,7 @@ static inline const Type& Null () {
|
||||||
static const char _Null##Type[size + 1] = data; /* +1 is for nul-termination in data */ \
|
static const char _Null##Type[size + 1] = data; /* +1 is for nul-termination in data */ \
|
||||||
template <> \
|
template <> \
|
||||||
inline const Type& Null<Type> () { \
|
inline const Type& Null<Type> () { \
|
||||||
return CONST_CAST (Type, *_Null##Type, 0); \
|
return Cast<Type> (*_Null##Type); \
|
||||||
} /* The following line really exists such that we end in a place needing semicolon */ \
|
} /* The following line really exists such that we end in a place needing semicolon */ \
|
||||||
ASSERT_STATIC (sizeof (Type) + 1 <= sizeof (_Null##Type))
|
ASSERT_STATIC (sizeof (Type) + 1 <= sizeof (_Null##Type))
|
||||||
|
|
||||||
|
@ -99,14 +114,14 @@ ASSERT_STATIC (sizeof (Type) + 1 <= sizeof (_Null##Type))
|
||||||
static inline const Type& get_for_data (const char *data) \
|
static inline const Type& get_for_data (const char *data) \
|
||||||
{ \
|
{ \
|
||||||
if (HB_UNLIKELY (data == NULL)) return Null(Type); \
|
if (HB_UNLIKELY (data == NULL)) return Null(Type); \
|
||||||
return CONST_CAST (Type, *data, 0); \
|
return Cast<Type> (*data); \
|
||||||
}
|
}
|
||||||
/* Like get_for_data(), but checks major version first. */
|
/* Like get_for_data(), but checks major version first. */
|
||||||
#define STATIC_DEFINE_GET_FOR_DATA_CHECK_MAJOR_VERSION(Type, MajorMin, MajorMax) \
|
#define STATIC_DEFINE_GET_FOR_DATA_CHECK_MAJOR_VERSION(Type, MajorMin, MajorMax) \
|
||||||
static inline const Type& get_for_data (const char *data) \
|
static inline const Type& get_for_data (const char *data) \
|
||||||
{ \
|
{ \
|
||||||
if (HB_UNLIKELY (data == NULL)) return Null(Type); \
|
if (HB_UNLIKELY (data == NULL)) return Null(Type); \
|
||||||
const Type& t = CONST_CAST (Type, *data, 0); \
|
const Type& t = Cast<Type> (*data); \
|
||||||
if (HB_UNLIKELY (t.version.major < MajorMin || t.version.major > MajorMax)) return Null(Type); \
|
if (HB_UNLIKELY (t.version.major < MajorMin || t.version.major > MajorMax)) return Null(Type); \
|
||||||
return t; \
|
return t; \
|
||||||
}
|
}
|
||||||
|
@ -285,7 +300,7 @@ struct Sanitizer
|
||||||
_hb_sanitize_init (&context, blob);
|
_hb_sanitize_init (&context, blob);
|
||||||
|
|
||||||
/* We drop const here */
|
/* We drop const here */
|
||||||
Type *t = &CAST (Type, * (char *) CharP(context.start), 0);
|
Type *t = &Cast<Type> (* (char *) CharP(context.start));
|
||||||
|
|
||||||
sane = t->sanitize (SANITIZE_ARG_INIT);
|
sane = t->sanitize (SANITIZE_ARG_INIT);
|
||||||
if (sane) {
|
if (sane) {
|
||||||
|
@ -467,7 +482,7 @@ struct GenericOffsetTo : OffsetType
|
||||||
{
|
{
|
||||||
unsigned int offset = *this;
|
unsigned int offset = *this;
|
||||||
if (HB_UNLIKELY (!offset)) return Null(Type);
|
if (HB_UNLIKELY (!offset)) return Null(Type);
|
||||||
return CONST_CAST(Type, *CharP(base), offset);
|
return StructAtOffset<Type> (*CharP(base), offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool sanitize (SANITIZE_ARG_DEF, void *base) {
|
inline bool sanitize (SANITIZE_ARG_DEF, void *base) {
|
||||||
|
@ -475,21 +490,21 @@ struct GenericOffsetTo : OffsetType
|
||||||
if (!SANITIZE_SELF ()) return false;
|
if (!SANITIZE_SELF ()) return false;
|
||||||
unsigned int offset = *this;
|
unsigned int offset = *this;
|
||||||
if (HB_UNLIKELY (!offset)) return true;
|
if (HB_UNLIKELY (!offset)) return true;
|
||||||
return SANITIZE (CAST(Type, *CharP(base), offset)) || NEUTER (*this, 0);
|
return SANITIZE (StructAtOffset<Type> (*CharP(base), offset)) || NEUTER (*this, 0);
|
||||||
}
|
}
|
||||||
inline bool sanitize (SANITIZE_ARG_DEF, void *base, void *base2) {
|
inline bool sanitize (SANITIZE_ARG_DEF, void *base, void *base2) {
|
||||||
TRACE_SANITIZE ();
|
TRACE_SANITIZE ();
|
||||||
if (!SANITIZE_SELF ()) return false;
|
if (!SANITIZE_SELF ()) return false;
|
||||||
unsigned int offset = *this;
|
unsigned int offset = *this;
|
||||||
if (HB_UNLIKELY (!offset)) return true;
|
if (HB_UNLIKELY (!offset)) return true;
|
||||||
return SANITIZE_BASE (CAST(Type, *CharP(base), offset), base2) || NEUTER (*this, 0);
|
return SANITIZE_BASE (StructAtOffset<Type> (*CharP(base), offset), base2) || NEUTER (*this, 0);
|
||||||
}
|
}
|
||||||
inline bool sanitize (SANITIZE_ARG_DEF, void *base, unsigned int user_data) {
|
inline bool sanitize (SANITIZE_ARG_DEF, void *base, unsigned int user_data) {
|
||||||
TRACE_SANITIZE ();
|
TRACE_SANITIZE ();
|
||||||
if (!SANITIZE_SELF ()) return false;
|
if (!SANITIZE_SELF ()) return false;
|
||||||
unsigned int offset = *this;
|
unsigned int offset = *this;
|
||||||
if (HB_UNLIKELY (!offset)) return true;
|
if (HB_UNLIKELY (!offset)) return true;
|
||||||
return SANITIZE_BASE (CAST(Type, *CharP(base), offset), user_data) || NEUTER (*this, 0);
|
return SANITIZE_BASE (StructAtOffset<Type> (*CharP(base), offset), user_data) || NEUTER (*this, 0);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
template <typename Base, typename OffsetType, typename Type>
|
template <typename Base, typename OffsetType, typename Type>
|
||||||
|
|
|
@ -591,7 +591,7 @@ struct PairPosFormat1
|
||||||
buffer->in_pos = j;
|
buffer->in_pos = j;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
record = &CONST_CAST (PairValueRecord, *record, record_size);
|
record = &StructAtOffset<PairValueRecord> (*record, record_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
@ -1361,7 +1361,7 @@ struct ExtensionPos : Extension
|
||||||
{
|
{
|
||||||
unsigned int offset = get_offset ();
|
unsigned int offset = get_offset ();
|
||||||
if (HB_UNLIKELY (!offset)) return Null(PosLookupSubTable);
|
if (HB_UNLIKELY (!offset)) return Null(PosLookupSubTable);
|
||||||
return CONST_CAST (PosLookupSubTable, *this, offset);
|
return StructAtOffset<PosLookupSubTable> (*this, offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool apply (APPLY_ARG_DEF) const;
|
inline bool apply (APPLY_ARG_DEF) const;
|
||||||
|
@ -1445,7 +1445,7 @@ struct PosLookupSubTable
|
||||||
struct PosLookup : Lookup
|
struct PosLookup : Lookup
|
||||||
{
|
{
|
||||||
inline const PosLookupSubTable& get_subtable (unsigned int i) const
|
inline const PosLookupSubTable& get_subtable (unsigned int i) const
|
||||||
{ return this+CONST_CAST (OffsetArrayOf<PosLookupSubTable>, subTable, 0)[i]; }
|
{ return this+Cast<OffsetArrayOf<PosLookupSubTable> > (subTable)[i]; }
|
||||||
|
|
||||||
/* Like get_type(), but looks through extension lookups.
|
/* Like get_type(), but looks through extension lookups.
|
||||||
* Never returns Extension */
|
* Never returns Extension */
|
||||||
|
@ -1524,7 +1524,7 @@ struct PosLookup : Lookup
|
||||||
inline bool sanitize (SANITIZE_ARG_DEF) {
|
inline bool sanitize (SANITIZE_ARG_DEF) {
|
||||||
TRACE_SANITIZE ();
|
TRACE_SANITIZE ();
|
||||||
if (HB_UNLIKELY (!Lookup::sanitize (SANITIZE_ARG))) return false;
|
if (HB_UNLIKELY (!Lookup::sanitize (SANITIZE_ARG))) return false;
|
||||||
OffsetArrayOf<PosLookupSubTable> &list = CAST (OffsetArrayOf<PosLookupSubTable>, subTable, 0);
|
OffsetArrayOf<PosLookupSubTable> &list = Cast<OffsetArrayOf<PosLookupSubTable> > (subTable);
|
||||||
return SANITIZE_THIS (list);
|
return SANITIZE_THIS (list);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -1541,10 +1541,10 @@ struct GPOS : GSUBGPOS
|
||||||
static const hb_tag_t Tag = HB_OT_TAG_GPOS;
|
static const hb_tag_t Tag = HB_OT_TAG_GPOS;
|
||||||
|
|
||||||
static inline const GPOS& get_for_data (const char *data)
|
static inline const GPOS& get_for_data (const char *data)
|
||||||
{ return CONST_CAST(GPOS, GSUBGPOS::get_for_data (data), 0); }
|
{ return Cast<GPOS> (GSUBGPOS::get_for_data (data)); }
|
||||||
|
|
||||||
inline const PosLookup& get_lookup (unsigned int i) const
|
inline const PosLookup& get_lookup (unsigned int i) const
|
||||||
{ return CONST_CAST(PosLookup, GSUBGPOS::get_lookup (i), 0); }
|
{ return Cast<PosLookup> (GSUBGPOS::get_lookup (i)); }
|
||||||
|
|
||||||
inline bool position_lookup (hb_ot_layout_context_t *context,
|
inline bool position_lookup (hb_ot_layout_context_t *context,
|
||||||
hb_buffer_t *buffer,
|
hb_buffer_t *buffer,
|
||||||
|
@ -1555,7 +1555,7 @@ struct GPOS : GSUBGPOS
|
||||||
inline bool sanitize (SANITIZE_ARG_DEF) {
|
inline bool sanitize (SANITIZE_ARG_DEF) {
|
||||||
TRACE_SANITIZE ();
|
TRACE_SANITIZE ();
|
||||||
if (HB_UNLIKELY (!GSUBGPOS::sanitize (SANITIZE_ARG))) return false;
|
if (HB_UNLIKELY (!GSUBGPOS::sanitize (SANITIZE_ARG))) return false;
|
||||||
OffsetTo<PosLookupList> &list = CAST(OffsetTo<PosLookupList>, lookupList, 0);
|
OffsetTo<PosLookupList> &list = Cast<OffsetTo<PosLookupList> > (lookupList);
|
||||||
return SANITIZE_THIS (list);
|
return SANITIZE_THIS (list);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -1583,7 +1583,7 @@ inline bool ExtensionPos::sanitize (SANITIZE_ARG_DEF)
|
||||||
|
|
||||||
unsigned int offset = get_offset ();
|
unsigned int offset = get_offset ();
|
||||||
if (HB_UNLIKELY (!offset)) return true;
|
if (HB_UNLIKELY (!offset)) return true;
|
||||||
return SANITIZE (CAST (PosLookupSubTable, *this, offset));
|
return SANITIZE (StructAtOffset<PosLookupSubTable> (*this, offset));
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool position_lookup (APPLY_ARG_DEF, unsigned int lookup_index)
|
static inline bool position_lookup (APPLY_ARG_DEF, unsigned int lookup_index)
|
||||||
|
|
|
@ -566,7 +566,7 @@ struct ExtensionSubst : Extension
|
||||||
{
|
{
|
||||||
unsigned int offset = get_offset ();
|
unsigned int offset = get_offset ();
|
||||||
if (HB_UNLIKELY (!offset)) return Null(SubstLookupSubTable);
|
if (HB_UNLIKELY (!offset)) return Null(SubstLookupSubTable);
|
||||||
return CONST_CAST (SubstLookupSubTable, *this, offset);
|
return StructAtOffset<SubstLookupSubTable> (*this, offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool apply (APPLY_ARG_DEF) const;
|
inline bool apply (APPLY_ARG_DEF) const;
|
||||||
|
@ -740,7 +740,7 @@ struct SubstLookupSubTable
|
||||||
struct SubstLookup : Lookup
|
struct SubstLookup : Lookup
|
||||||
{
|
{
|
||||||
inline const SubstLookupSubTable& get_subtable (unsigned int i) const
|
inline const SubstLookupSubTable& get_subtable (unsigned int i) const
|
||||||
{ return this+CONST_CAST (OffsetArrayOf<SubstLookupSubTable>, subTable, 0)[i]; }
|
{ return this+Cast<OffsetArrayOf<SubstLookupSubTable> > (subTable)[i]; }
|
||||||
|
|
||||||
/* Like get_type(), but looks through extension lookups.
|
/* Like get_type(), but looks through extension lookups.
|
||||||
* Never returns Extension */
|
* Never returns Extension */
|
||||||
|
@ -833,7 +833,7 @@ struct SubstLookup : Lookup
|
||||||
inline bool sanitize (SANITIZE_ARG_DEF) {
|
inline bool sanitize (SANITIZE_ARG_DEF) {
|
||||||
TRACE_SANITIZE ();
|
TRACE_SANITIZE ();
|
||||||
if (HB_UNLIKELY (!Lookup::sanitize (SANITIZE_ARG))) return false;
|
if (HB_UNLIKELY (!Lookup::sanitize (SANITIZE_ARG))) return false;
|
||||||
OffsetArrayOf<SubstLookupSubTable> &list = CAST (OffsetArrayOf<SubstLookupSubTable>, subTable, 0);
|
OffsetArrayOf<SubstLookupSubTable> &list = Cast<OffsetArrayOf<SubstLookupSubTable> > (subTable);
|
||||||
return SANITIZE_THIS (list);
|
return SANITIZE_THIS (list);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -850,10 +850,10 @@ struct GSUB : GSUBGPOS
|
||||||
static const hb_tag_t Tag = HB_OT_TAG_GSUB;
|
static const hb_tag_t Tag = HB_OT_TAG_GSUB;
|
||||||
|
|
||||||
static inline const GSUB& get_for_data (const char *data)
|
static inline const GSUB& get_for_data (const char *data)
|
||||||
{ return CONST_CAST(GSUB, GSUBGPOS::get_for_data (data), 0); }
|
{ return Cast<GSUB> (GSUBGPOS::get_for_data (data)); }
|
||||||
|
|
||||||
inline const SubstLookup& get_lookup (unsigned int i) const
|
inline const SubstLookup& get_lookup (unsigned int i) const
|
||||||
{ return CONST_CAST(SubstLookup, GSUBGPOS::get_lookup (i), 0); }
|
{ return Cast<SubstLookup> (GSUBGPOS::get_lookup (i)); }
|
||||||
|
|
||||||
inline bool substitute_lookup (hb_ot_layout_context_t *context,
|
inline bool substitute_lookup (hb_ot_layout_context_t *context,
|
||||||
hb_buffer_t *buffer,
|
hb_buffer_t *buffer,
|
||||||
|
@ -865,7 +865,7 @@ struct GSUB : GSUBGPOS
|
||||||
inline bool sanitize (SANITIZE_ARG_DEF) {
|
inline bool sanitize (SANITIZE_ARG_DEF) {
|
||||||
TRACE_SANITIZE ();
|
TRACE_SANITIZE ();
|
||||||
if (HB_UNLIKELY (!GSUBGPOS::sanitize (SANITIZE_ARG))) return false;
|
if (HB_UNLIKELY (!GSUBGPOS::sanitize (SANITIZE_ARG))) return false;
|
||||||
OffsetTo<SubstLookupList> &list = CAST(OffsetTo<SubstLookupList>, lookupList, 0);
|
OffsetTo<SubstLookupList> &list = Cast<OffsetTo<SubstLookupList> > (lookupList);
|
||||||
return SANITIZE_THIS (list);
|
return SANITIZE_THIS (list);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -893,7 +893,7 @@ inline bool ExtensionSubst::sanitize (SANITIZE_ARG_DEF)
|
||||||
|
|
||||||
unsigned int offset = get_offset ();
|
unsigned int offset = get_offset ();
|
||||||
if (HB_UNLIKELY (!offset)) return true;
|
if (HB_UNLIKELY (!offset)) return true;
|
||||||
return SANITIZE (CAST (SubstLookupSubTable, *this, offset));
|
return SANITIZE (StructAtOffset<SubstLookupSubTable> (*this, offset));
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool substitute_lookup (APPLY_ARG_DEF, unsigned int lookup_index)
|
static inline bool substitute_lookup (APPLY_ARG_DEF, unsigned int lookup_index)
|
||||||
|
|
|
@ -299,10 +299,10 @@ struct Rule
|
||||||
inline bool apply (APPLY_ARG_DEF, ContextLookupContext &lookup_context) const
|
inline bool apply (APPLY_ARG_DEF, ContextLookupContext &lookup_context) const
|
||||||
{
|
{
|
||||||
TRACE_APPLY ();
|
TRACE_APPLY ();
|
||||||
const LookupRecord *lookupRecord = &CONST_CAST (LookupRecord, input, input[0].get_size () * (inputCount ? inputCount - 1 : 0));
|
const LookupRecord &lookupRecord = StructAtOffset<LookupRecord> (input, input[0].get_size () * (inputCount ? inputCount - 1 : 0));
|
||||||
return context_lookup (APPLY_ARG,
|
return context_lookup (APPLY_ARG,
|
||||||
inputCount, input,
|
inputCount, input,
|
||||||
lookupCount, lookupRecord,
|
lookupCount, &lookupRecord,
|
||||||
lookup_context);
|
lookup_context);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -448,14 +448,14 @@ struct ContextFormat3
|
||||||
if (HB_LIKELY (index == NOT_COVERED))
|
if (HB_LIKELY (index == NOT_COVERED))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
const LookupRecord *lookupRecord = &CONST_CAST(LookupRecord, coverage, coverage[0].get_size () * glyphCount);
|
const LookupRecord &lookupRecord = StructAtOffset<LookupRecord> (coverage, coverage[0].get_size () * glyphCount);
|
||||||
struct ContextLookupContext lookup_context = {
|
struct ContextLookupContext lookup_context = {
|
||||||
{match_coverage, apply_func},
|
{match_coverage, apply_func},
|
||||||
CharP(this)
|
CharP(this)
|
||||||
};
|
};
|
||||||
return context_lookup (APPLY_ARG,
|
return context_lookup (APPLY_ARG,
|
||||||
glyphCount, (const USHORT *) (coverage + 1),
|
glyphCount, (const USHORT *) (coverage + 1),
|
||||||
lookupCount, lookupRecord,
|
lookupCount, &lookupRecord,
|
||||||
lookup_context);
|
lookup_context);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -466,8 +466,8 @@ struct ContextFormat3
|
||||||
if (!SANITIZE_ARRAY (coverage, OffsetTo<Coverage>::get_size (), glyphCount)) return false;
|
if (!SANITIZE_ARRAY (coverage, OffsetTo<Coverage>::get_size (), glyphCount)) return false;
|
||||||
for (unsigned int i = 0; i < count; i++)
|
for (unsigned int i = 0; i < count; i++)
|
||||||
if (!SANITIZE_THIS (coverage[i])) return false;
|
if (!SANITIZE_THIS (coverage[i])) return false;
|
||||||
LookupRecord *lookupRecord = &CAST(LookupRecord, coverage, OffsetTo<Coverage>::get_size () * glyphCount);
|
LookupRecord &lookupRecord = StructAtOffset<LookupRecord> (coverage, OffsetTo<Coverage>::get_size () * glyphCount);
|
||||||
return SANITIZE_ARRAY (lookupRecord, LookupRecord::get_size (), lookupCount);
|
return SANITIZE_ARRAY (&lookupRecord, LookupRecord::get_size (), lookupCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
Loading…
Reference in New Issue