[HB] Add OffsetTo template.
This commit is contained in:
parent
e07f89295b
commit
9e4d9d7b27
|
@ -228,34 +228,36 @@ struct GDEF {
|
||||||
STATIC_DEFINE_GET_FOR_DATA (GDEF);
|
STATIC_DEFINE_GET_FOR_DATA (GDEF);
|
||||||
/* XXX check version here? */
|
/* XXX check version here? */
|
||||||
|
|
||||||
DEFINE_GET_HAS_ACCESSOR (ClassDef, glyph_classes, glyphClassDef);
|
inline bool has_glyph_classes () const { return glyphClassDef != 0; }
|
||||||
DEFINE_GET_HAS_ACCESSOR (AttachList, attach_list, attachList);
|
|
||||||
DEFINE_GET_HAS_ACCESSOR (LigCaretList, lig_caret_list, ligCaretList);
|
|
||||||
DEFINE_GET_HAS_ACCESSOR (ClassDef, mark_attachment_types, markAttachClassDef);
|
|
||||||
|
|
||||||
inline hb_ot_layout_class_t get_glyph_class (hb_codepoint_t glyph) const {
|
inline hb_ot_layout_class_t get_glyph_class (hb_codepoint_t glyph) const {
|
||||||
return get_glyph_classes ().get_class (glyph);
|
return glyphClassDef(this).get_class (glyph);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline bool has_mark_attachment_types () const { return markAttachClassDef != 0; }
|
||||||
inline hb_ot_layout_class_t get_mark_attachment_type (hb_codepoint_t glyph) const {
|
inline hb_ot_layout_class_t get_mark_attachment_type (hb_codepoint_t glyph) const {
|
||||||
return get_mark_attachment_types ().get_class (glyph);
|
return markAttachClassDef(this).get_class (glyph);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO get_attach and get_lig_caret */
|
/* TODO get_attach and get_lig_caret */
|
||||||
|
inline bool has_attach_list () const { return attachList != 0; }
|
||||||
|
inline bool has_lig_caret_list () const { return ligCaretList != 0; }
|
||||||
|
|
||||||
private:
|
|
||||||
Fixed version; /* Version of the GDEF table--initially
|
Fixed version; /* Version of the GDEF table--initially
|
||||||
* 0x00010000 */
|
* 0x00010000 */
|
||||||
Offset glyphClassDef; /* Offset to class definition table
|
OffsetTo<ClassDef>
|
||||||
|
glyphClassDef; /* Offset to class definition table
|
||||||
* for glyph type--from beginning of
|
* for glyph type--from beginning of
|
||||||
* GDEF header (may be Null) */
|
* GDEF header (may be Null) */
|
||||||
Offset attachList; /* Offset to list of glyphs with
|
OffsetTo<AttachList>
|
||||||
|
attachList; /* Offset to list of glyphs with
|
||||||
* attachment points--from beginning
|
* attachment points--from beginning
|
||||||
* of GDEF header (may be Null) */
|
* of GDEF header (may be Null) */
|
||||||
Offset ligCaretList; /* Offset to list of positioning points
|
OffsetTo<LigCaretList>
|
||||||
|
ligCaretList; /* Offset to list of positioning points
|
||||||
* for ligature carets--from beginning
|
* for ligature carets--from beginning
|
||||||
* of GDEF header (may be Null) */
|
* of GDEF header (may be Null) */
|
||||||
Offset markAttachClassDef; /* Offset to class definition table for
|
OffsetTo<ClassDef>
|
||||||
|
markAttachClassDef; /* Offset to class definition table for
|
||||||
* mark attachment type--from beginning
|
* mark attachment type--from beginning
|
||||||
* of GDEF header (may be Null) */
|
* of GDEF header (may be Null) */
|
||||||
};
|
};
|
||||||
|
|
|
@ -793,7 +793,6 @@ struct ContextSubstFormat2 {
|
||||||
/* SubClassSet tables, in Coverage Index order */
|
/* SubClassSet tables, in Coverage Index order */
|
||||||
DEFINE_OFFSET_ARRAY_TYPE (SubClassSet, subClassSet, subClassSetCnt);
|
DEFINE_OFFSET_ARRAY_TYPE (SubClassSet, subClassSet, subClassSetCnt);
|
||||||
DEFINE_GET_ACCESSOR (Coverage, coverage, coverage);
|
DEFINE_GET_ACCESSOR (Coverage, coverage, coverage);
|
||||||
DEFINE_GET_ACCESSOR (ClassDef, class_def, classDef);
|
|
||||||
DEFINE_GET_GLYPH_COVERAGE (glyph_coverage);
|
DEFINE_GET_GLYPH_COVERAGE (glyph_coverage);
|
||||||
|
|
||||||
inline bool substitute (SUBTABLE_SUBSTITUTE_ARGS_DEF) const {
|
inline bool substitute (SUBTABLE_SUBSTITUTE_ARGS_DEF) const {
|
||||||
|
@ -807,14 +806,15 @@ struct ContextSubstFormat2 {
|
||||||
unsigned int index = get_glyph_coverage (glyph_id);
|
unsigned int index = get_glyph_coverage (glyph_id);
|
||||||
|
|
||||||
const SubClassSet &class_set = (*this)[index];
|
const SubClassSet &class_set = (*this)[index];
|
||||||
return class_set.substitute_class (SUBTABLE_SUBSTITUTE_ARGS, get_class_def ());
|
return class_set.substitute_class (SUBTABLE_SUBSTITUTE_ARGS, this+classDef);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
USHORT substFormat; /* Format identifier--format = 2 */
|
USHORT substFormat; /* Format identifier--format = 2 */
|
||||||
Offset coverage; /* Offset to Coverage table--from
|
Offset coverage; /* Offset to Coverage table--from
|
||||||
* beginning of Substitution table */
|
* beginning of Substitution table */
|
||||||
Offset classDef; /* Offset to glyph ClassDef table--from
|
OffsetTo<ClassDef>
|
||||||
|
classDef; /* Offset to glyph ClassDef table--from
|
||||||
* beginning of Substitution table */
|
* beginning of Substitution table */
|
||||||
USHORT subClassSetCnt; /* Number of SubClassSet tables */
|
USHORT subClassSetCnt; /* Number of SubClassSet tables */
|
||||||
Offset subClassSet[]; /* Array of offsets to SubClassSet
|
Offset subClassSet[]; /* Array of offsets to SubClassSet
|
||||||
|
|
|
@ -242,11 +242,6 @@ struct Null <Type> { \
|
||||||
if (HB_UNLIKELY (!Name)) return Null(Type); \
|
if (HB_UNLIKELY (!Name)) return Null(Type); \
|
||||||
return *(const Type*)((const char*)this + Name); \
|
return *(const Type*)((const char*)this + Name); \
|
||||||
}
|
}
|
||||||
#define DEFINE_GET_HAS_ACCESSOR(Type, name, Name) \
|
|
||||||
DEFINE_GET_ACCESSOR (Type, name, Name); \
|
|
||||||
inline bool has_##name (void) const { \
|
|
||||||
return Name != 0; \
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -340,6 +335,21 @@ DEFINE_INT_TYPE_STRUCT (GlyphID, u, 16);
|
||||||
/* Offset to a table, same as uint16 (length = 16 bits), Null offset = 0x0000 */
|
/* Offset to a table, same as uint16 (length = 16 bits), Null offset = 0x0000 */
|
||||||
DEFINE_INT_TYPE_STRUCT (Offset, u, 16);
|
DEFINE_INT_TYPE_STRUCT (Offset, u, 16);
|
||||||
|
|
||||||
|
/* Template subclass of Offset that does the dereferencing. Use: (this+memberName) */
|
||||||
|
template <typename Type>
|
||||||
|
struct OffsetTo : Offset {
|
||||||
|
inline const Type& operator() (const void *base) const {
|
||||||
|
unsigned int offset = *this;
|
||||||
|
if (HB_UNLIKELY (!offset)) return Null(Type);
|
||||||
|
return * (const Type *) ((const char *) base + offset);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename Base, typename Type>
|
||||||
|
inline const Type& operator + (const Base &base, OffsetTo<Type> offset) {
|
||||||
|
return offset(base);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* CheckSum */
|
/* CheckSum */
|
||||||
struct CheckSum : ULONG {
|
struct CheckSum : ULONG {
|
||||||
|
@ -572,9 +582,7 @@ struct Script {
|
||||||
return defaultLangSys != 0;
|
return defaultLangSys != 0;
|
||||||
}
|
}
|
||||||
inline const LangSys& get_default_lang_sys (void) const {
|
inline const LangSys& get_default_lang_sys (void) const {
|
||||||
if (HB_UNLIKELY (!defaultLangSys))
|
return this+defaultLangSys;
|
||||||
return Null(LangSys);
|
|
||||||
return *(LangSys*)((const char*)this + defaultLangSys);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -582,7 +590,8 @@ struct Script {
|
||||||
DEFINE_RECORD_ARRAY_TYPE (LangSys, langSysRecord, langSysCount);
|
DEFINE_RECORD_ARRAY_TYPE (LangSys, langSysRecord, langSysCount);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Offset defaultLangSys; /* Offset to DefaultLangSys table--from
|
OffsetTo<LangSys>
|
||||||
|
defaultLangSys; /* Offset to DefaultLangSys table--from
|
||||||
* beginning of Script table--may be Null */
|
* beginning of Script table--may be Null */
|
||||||
USHORT langSysCount; /* Number of LangSysRecords for this script--
|
USHORT langSysCount; /* Number of LangSysRecords for this script--
|
||||||
* excluding the DefaultLangSys */
|
* excluding the DefaultLangSys */
|
||||||
|
|
Loading…
Reference in New Issue