[HB] Cleanup format unions
This commit is contained in:
parent
da1097bc3b
commit
f8dc67b3c2
|
@ -129,23 +129,23 @@ ASSERT_SIZE (CaretValueFormat3, 6);
|
||||||
struct CaretValue {
|
struct CaretValue {
|
||||||
/* XXX we need access to a load-contour-point vfunc here */
|
/* XXX we need access to a load-contour-point vfunc here */
|
||||||
int get_caret_value (int ppem) const {
|
int get_caret_value (int ppem) const {
|
||||||
switch (u.caretValueFormat) {
|
switch (u.format) {
|
||||||
case 1: return u.format1.get_caret_value(ppem);
|
case 1: return u.format1->get_caret_value(ppem);
|
||||||
case 2: return u.format2.get_caret_value(ppem);
|
case 2: return u.format2->get_caret_value(ppem);
|
||||||
case 3: return u.format3.get_caret_value(ppem);
|
case 3: return u.format3->get_caret_value(ppem);
|
||||||
default:return 0;
|
default:return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
union {
|
union {
|
||||||
USHORT caretValueFormat; /* Format identifier */
|
USHORT format; /* Format identifier */
|
||||||
CaretValueFormat1 format1;
|
CaretValueFormat1 format1[];
|
||||||
CaretValueFormat2 format2;
|
CaretValueFormat2 format2[];
|
||||||
CaretValueFormat3 format3;
|
CaretValueFormat3 format3[];
|
||||||
} u;
|
} u;
|
||||||
};
|
};
|
||||||
DEFINE_NULL (CaretValue, 2);
|
ASSERT_SIZE (CaretValue, 2);
|
||||||
|
|
||||||
struct LigGlyph {
|
struct LigGlyph {
|
||||||
|
|
||||||
|
|
|
@ -91,9 +91,9 @@ struct SingleSubst {
|
||||||
private:
|
private:
|
||||||
|
|
||||||
inline bool single_substitute (hb_codepoint_t &glyph_id) const {
|
inline bool single_substitute (hb_codepoint_t &glyph_id) const {
|
||||||
switch (u.substFormat) {
|
switch (u.format) {
|
||||||
case 1: return u.format1.single_substitute (glyph_id);
|
case 1: return u.format1->single_substitute (glyph_id);
|
||||||
case 2: return u.format2.single_substitute (glyph_id);
|
case 2: return u.format2->single_substitute (glyph_id);
|
||||||
default:return false;
|
default:return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -118,12 +118,12 @@ struct SingleSubst {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
union {
|
union {
|
||||||
USHORT substFormat; /* Format identifier */
|
USHORT format; /* Format identifier */
|
||||||
SingleSubstFormat1 format1;
|
SingleSubstFormat1 format1[];
|
||||||
SingleSubstFormat2 format2;
|
SingleSubstFormat2 format2[];
|
||||||
} u;
|
} u;
|
||||||
};
|
};
|
||||||
DEFINE_NULL (SingleSubst, 2);
|
ASSERT_SIZE (SingleSubst, 2);
|
||||||
|
|
||||||
|
|
||||||
struct Sequence {
|
struct Sequence {
|
||||||
|
@ -197,19 +197,19 @@ struct MultipleSubst {
|
||||||
private:
|
private:
|
||||||
|
|
||||||
inline bool substitute (LOOKUP_ARGS_DEF) const {
|
inline bool substitute (LOOKUP_ARGS_DEF) const {
|
||||||
switch (u.substFormat) {
|
switch (u.format) {
|
||||||
case 1: return u.format1.substitute (LOOKUP_ARGS);
|
case 1: return u.format1->substitute (LOOKUP_ARGS);
|
||||||
default:return false;
|
default:return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
union {
|
union {
|
||||||
USHORT substFormat; /* Format identifier */
|
USHORT format; /* Format identifier */
|
||||||
MultipleSubstFormat1 format1;
|
MultipleSubstFormat1 format1[];
|
||||||
} u;
|
} u;
|
||||||
};
|
};
|
||||||
DEFINE_NULL (MultipleSubst, 2);
|
ASSERT_SIZE (MultipleSubst, 2);
|
||||||
|
|
||||||
|
|
||||||
typedef ArrayOf<GlyphID> AlternateSet; /* Array of alternate GlyphIDs--in
|
typedef ArrayOf<GlyphID> AlternateSet; /* Array of alternate GlyphIDs--in
|
||||||
|
@ -275,19 +275,19 @@ struct AlternateSubst {
|
||||||
private:
|
private:
|
||||||
|
|
||||||
inline bool substitute (LOOKUP_ARGS_DEF) const {
|
inline bool substitute (LOOKUP_ARGS_DEF) const {
|
||||||
switch (u.substFormat) {
|
switch (u.format) {
|
||||||
case 1: return u.format1.substitute (LOOKUP_ARGS);
|
case 1: return u.format1->substitute (LOOKUP_ARGS);
|
||||||
default:return false;
|
default:return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
union {
|
union {
|
||||||
USHORT substFormat; /* Format identifier */
|
USHORT format; /* Format identifier */
|
||||||
AlternateSubstFormat1 format1;
|
AlternateSubstFormat1 format1[];
|
||||||
} u;
|
} u;
|
||||||
};
|
};
|
||||||
DEFINE_NULL (AlternateSubst, 2);
|
ASSERT_SIZE (AlternateSubst, 2);
|
||||||
|
|
||||||
|
|
||||||
struct Ligature {
|
struct Ligature {
|
||||||
|
@ -432,19 +432,19 @@ struct LigatureSubst {
|
||||||
private:
|
private:
|
||||||
|
|
||||||
inline bool substitute (LOOKUP_ARGS_DEF) const {
|
inline bool substitute (LOOKUP_ARGS_DEF) const {
|
||||||
switch (u.substFormat) {
|
switch (u.format) {
|
||||||
case 1: return u.format1.substitute (LOOKUP_ARGS);
|
case 1: return u.format1->substitute (LOOKUP_ARGS);
|
||||||
default:return false;
|
default:return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
union {
|
union {
|
||||||
USHORT substFormat; /* Format identifier */
|
USHORT format; /* Format identifier */
|
||||||
LigatureSubstFormat1 format1;
|
LigatureSubstFormat1 format1[];
|
||||||
} u;
|
} u;
|
||||||
};
|
};
|
||||||
DEFINE_NULL (LigatureSubst, 2);
|
ASSERT_SIZE (LigatureSubst, 2);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -456,7 +456,7 @@ struct ContextSubst : Context {
|
||||||
return this->apply (LOOKUP_ARGS, substitute_lookup);
|
return this->apply (LOOKUP_ARGS, substitute_lookup);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
DEFINE_NULL (ContextSubst, 2);
|
ASSERT_SIZE (ContextSubst, 2);
|
||||||
|
|
||||||
|
|
||||||
struct ChainSubRule {
|
struct ChainSubRule {
|
||||||
|
@ -622,23 +622,23 @@ struct ChainContextSubst {
|
||||||
private:
|
private:
|
||||||
|
|
||||||
inline bool substitute (LOOKUP_ARGS_DEF) const {
|
inline bool substitute (LOOKUP_ARGS_DEF) const {
|
||||||
switch (u.substFormat) {
|
switch (u.format) {
|
||||||
case 1: return u.format1.substitute (LOOKUP_ARGS);
|
case 1: return u.format1->substitute (LOOKUP_ARGS);
|
||||||
case 2: return u.format2.substitute (LOOKUP_ARGS);
|
case 2: return u.format2->substitute (LOOKUP_ARGS);
|
||||||
case 3: return u.format3.substitute (LOOKUP_ARGS);
|
case 3: return u.format3->substitute (LOOKUP_ARGS);
|
||||||
default:return false;
|
default:return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
union {
|
union {
|
||||||
USHORT substFormat; /* Format identifier */
|
USHORT format; /* Format identifier */
|
||||||
ChainContextSubstFormat1 format1;
|
ChainContextSubstFormat1 format1[];
|
||||||
ChainContextSubstFormat2 format2;
|
ChainContextSubstFormat2 format2[];
|
||||||
ChainContextSubstFormat3 format3;
|
ChainContextSubstFormat3 format3[];
|
||||||
} u;
|
} u;
|
||||||
};
|
};
|
||||||
DEFINE_NULL (ChainContextSubst, 2);
|
ASSERT_SIZE (ChainContextSubst, 2);
|
||||||
|
|
||||||
|
|
||||||
struct ExtensionSubstFormat1 {
|
struct ExtensionSubstFormat1 {
|
||||||
|
@ -647,6 +647,7 @@ struct ExtensionSubstFormat1 {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
inline unsigned int get_type (void) const { return extensionLookupType; }
|
inline unsigned int get_type (void) const { return extensionLookupType; }
|
||||||
|
inline unsigned int get_offset (void) const { return (extensionOffset[0] << 16) + extensionOffset[1]; }
|
||||||
inline bool substitute (LOOKUP_ARGS_DEF) const;
|
inline bool substitute (LOOKUP_ARGS_DEF) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -654,8 +655,10 @@ struct ExtensionSubstFormat1 {
|
||||||
USHORT extensionLookupType; /* Lookup type of subtable referenced
|
USHORT extensionLookupType; /* Lookup type of subtable referenced
|
||||||
* by ExtensionOffset (i.e. the
|
* by ExtensionOffset (i.e. the
|
||||||
* extension subtable). */
|
* extension subtable). */
|
||||||
ULONG extensionOffset; /* Offset to the extension subtable,
|
USHORT extensionOffset[2]; /* Offset to the extension subtable,
|
||||||
* of lookup type subtable. */
|
* of lookup type subtable.
|
||||||
|
* Defined as two shorts to avoid
|
||||||
|
* alignment requirements. */
|
||||||
};
|
};
|
||||||
ASSERT_SIZE (ExtensionSubstFormat1, 8);
|
ASSERT_SIZE (ExtensionSubstFormat1, 8);
|
||||||
|
|
||||||
|
@ -667,26 +670,26 @@ struct ExtensionSubst {
|
||||||
private:
|
private:
|
||||||
|
|
||||||
inline unsigned int get_type (void) const {
|
inline unsigned int get_type (void) const {
|
||||||
switch (u.substFormat) {
|
switch (u.format) {
|
||||||
case 1: return u.format1.get_type ();
|
case 1: return u.format1->get_type ();
|
||||||
default:return 0;
|
default:return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool substitute (LOOKUP_ARGS_DEF) const {
|
inline bool substitute (LOOKUP_ARGS_DEF) const {
|
||||||
switch (u.substFormat) {
|
switch (u.format) {
|
||||||
case 1: return u.format1.substitute (LOOKUP_ARGS);
|
case 1: return u.format1->substitute (LOOKUP_ARGS);
|
||||||
default:return false;
|
default:return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
union {
|
union {
|
||||||
USHORT substFormat; /* Format identifier */
|
USHORT format; /* Format identifier */
|
||||||
ExtensionSubstFormat1 format1;
|
ExtensionSubstFormat1 format1[];
|
||||||
} u;
|
} u;
|
||||||
};
|
};
|
||||||
DEFINE_NULL (ExtensionSubst, 2);
|
ASSERT_SIZE (ExtensionSubst, 2);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -905,7 +908,7 @@ struct GSUB : GSUBGPOS {
|
||||||
inline bool ExtensionSubstFormat1::substitute (LOOKUP_ARGS_DEF) const {
|
inline bool ExtensionSubstFormat1::substitute (LOOKUP_ARGS_DEF) const {
|
||||||
/* XXX either check in sanitize or here that the lookuptype is not 7 again,
|
/* XXX either check in sanitize or here that the lookuptype is not 7 again,
|
||||||
* or we can loop indefinitely. */
|
* or we can loop indefinitely. */
|
||||||
return (*(SubstLookupSubTable *)(((char *) this) + extensionOffset)).substitute (LOOKUP_ARGS,
|
return (*(SubstLookupSubTable *)(((char *) this) + get_offset ())).substitute (LOOKUP_ARGS,
|
||||||
get_type ());
|
get_type ());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -315,22 +315,22 @@ struct Context {
|
||||||
protected:
|
protected:
|
||||||
bool apply (LOOKUP_ARGS_DEF, apply_lookup_func_t apply_func) const {
|
bool apply (LOOKUP_ARGS_DEF, apply_lookup_func_t apply_func) const {
|
||||||
switch (u.format) {
|
switch (u.format) {
|
||||||
case 1: return u.format1.apply (LOOKUP_ARGS, apply_func);
|
case 1: return u.format1->apply (LOOKUP_ARGS, apply_func);
|
||||||
case 2: return u.format2.apply (LOOKUP_ARGS, apply_func);
|
case 2: return u.format2->apply (LOOKUP_ARGS, apply_func);
|
||||||
case 3: return u.format3.apply (LOOKUP_ARGS, apply_func);
|
case 3: return u.format3->apply (LOOKUP_ARGS, apply_func);
|
||||||
default:return false;
|
default:return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
union {
|
union {
|
||||||
USHORT format; /* Format identifier */
|
USHORT format; /* Format identifier */
|
||||||
ContextFormat1 format1;
|
ContextFormat1 format1[];
|
||||||
ContextFormat2 format2;
|
ContextFormat2 format2[];
|
||||||
ContextFormat3 format3;
|
ContextFormat3 format3[];
|
||||||
} u;
|
} u;
|
||||||
};
|
};
|
||||||
DEFINE_NULL (Context, 2);
|
ASSERT_SIZE (Context, 2);
|
||||||
|
|
||||||
|
|
||||||
#endif /* HB_OT_LAYOUT_GSUBGPOS_PRIVATE_H */
|
#endif /* HB_OT_LAYOUT_GSUBGPOS_PRIVATE_H */
|
||||||
|
|
|
@ -167,22 +167,11 @@ static const char NullPool[16] = "";
|
||||||
|
|
||||||
/* Generic template for nul-content sizeof-sized Null objects. */
|
/* Generic template for nul-content sizeof-sized Null objects. */
|
||||||
template <typename Type>
|
template <typename Type>
|
||||||
struct NullSize {
|
|
||||||
char bytes[sizeof (Type)];
|
|
||||||
};
|
|
||||||
template <typename Type>
|
|
||||||
struct Null {
|
struct Null {
|
||||||
ASSERT_STATIC (sizeof (NullSize<Type>) <= sizeof (NullPool));
|
ASSERT_STATIC (sizeof (Type) <= sizeof (NullPool));
|
||||||
static inline const Type &get () { return (const Type&) *(const Type*) NullPool; }
|
static inline const Type &get () { return (const Type&) *(const Type*) NullPool; }
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Specializaiton for nul-content arbitrary-sized Null objects. */
|
|
||||||
#define DEFINE_NULL(Type, size) \
|
|
||||||
template <> \
|
|
||||||
struct NullSize <Type> { \
|
|
||||||
char bytes[size]; \
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Specializaiton for arbitrary-content arbitrary-sized Null objects. */
|
/* Specializaiton for arbitrary-content arbitrary-sized Null objects. */
|
||||||
#define DEFINE_NULL_DATA(Type, size, data) \
|
#define DEFINE_NULL_DATA(Type, size, data) \
|
||||||
template <> \
|
template <> \
|
||||||
|
@ -785,9 +774,9 @@ ASSERT_SIZE (CoverageFormat2, 4);
|
||||||
|
|
||||||
struct Coverage {
|
struct Coverage {
|
||||||
unsigned int get_coverage (hb_codepoint_t glyph_id) const {
|
unsigned int get_coverage (hb_codepoint_t glyph_id) const {
|
||||||
switch (u.coverageFormat) {
|
switch (u.format) {
|
||||||
case 1: return u.format1.get_coverage(glyph_id);
|
case 1: return u.format1->get_coverage(glyph_id);
|
||||||
case 2: return u.format2.get_coverage(glyph_id);
|
case 2: return u.format2->get_coverage(glyph_id);
|
||||||
default:return NOT_COVERED;
|
default:return NOT_COVERED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -798,12 +787,12 @@ struct Coverage {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
union {
|
union {
|
||||||
USHORT coverageFormat; /* Format identifier */
|
USHORT format; /* Format identifier */
|
||||||
CoverageFormat1 format1;
|
CoverageFormat1 format1[];
|
||||||
CoverageFormat2 format2;
|
CoverageFormat2 format2[];
|
||||||
} u;
|
} u;
|
||||||
};
|
};
|
||||||
DEFINE_NULL (Coverage, 2);
|
ASSERT_SIZE (Coverage, 2);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Class Definition Table
|
* Class Definition Table
|
||||||
|
@ -870,21 +859,21 @@ ASSERT_SIZE (ClassDefFormat2, 4);
|
||||||
|
|
||||||
struct ClassDef {
|
struct ClassDef {
|
||||||
hb_ot_layout_class_t get_class (hb_codepoint_t glyph_id) const {
|
hb_ot_layout_class_t get_class (hb_codepoint_t glyph_id) const {
|
||||||
switch (u.classFormat) {
|
switch (u.format) {
|
||||||
case 1: return u.format1.get_class(glyph_id);
|
case 1: return u.format1->get_class(glyph_id);
|
||||||
case 2: return u.format2.get_class(glyph_id);
|
case 2: return u.format2->get_class(glyph_id);
|
||||||
default:return 0;
|
default:return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
union {
|
union {
|
||||||
USHORT classFormat; /* Format identifier */
|
USHORT format; /* Format identifier */
|
||||||
ClassDefFormat1 format1;
|
ClassDefFormat1 format1[];
|
||||||
ClassDefFormat2 format2;
|
ClassDefFormat2 format2[];
|
||||||
} u;
|
} u;
|
||||||
};
|
};
|
||||||
DEFINE_NULL (ClassDef, 2);
|
ASSERT_SIZE (ClassDef, 2);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Device Tables
|
* Device Tables
|
||||||
|
|
Loading…
Reference in New Issue