[HB] Unify first glyph property checking
This commit is contained in:
parent
66bf7ce4e3
commit
13068232e7
|
@ -98,11 +98,7 @@ struct SingleSubst {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool substitute (LOOKUP_ARGS_DEF) const {
|
inline bool substitute (LOOKUP_ARGS_DEF, unsigned int property) const {
|
||||||
|
|
||||||
unsigned int property;
|
|
||||||
if (!_hb_ot_layout_check_glyph_property (layout, IN_CURITEM (), lookup_flag, &property))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
hb_codepoint_t glyph_id = IN_CURGLYPH ();
|
hb_codepoint_t glyph_id = IN_CURGLYPH ();
|
||||||
|
|
||||||
|
@ -177,11 +173,7 @@ struct MultipleSubstFormat1 {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
inline bool substitute (LOOKUP_ARGS_DEF) const {
|
inline bool substitute (LOOKUP_ARGS_DEF, unsigned int property) const {
|
||||||
|
|
||||||
unsigned int property;
|
|
||||||
if (!_hb_ot_layout_check_glyph_property (layout, IN_CURITEM (), lookup_flag, &property))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
unsigned int index = (this+coverage) (IN_CURGLYPH ());
|
unsigned int index = (this+coverage) (IN_CURGLYPH ());
|
||||||
return (this+sequence[index]).substitute_sequence (LOOKUP_ARGS, property);
|
return (this+sequence[index]).substitute_sequence (LOOKUP_ARGS, property);
|
||||||
|
@ -204,9 +196,9 @@ struct MultipleSubst {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
inline bool substitute (LOOKUP_ARGS_DEF) const {
|
inline bool substitute (LOOKUP_ARGS_DEF, unsigned int property) const {
|
||||||
switch (u.substFormat) {
|
switch (u.substFormat) {
|
||||||
case 1: return u.format1.substitute (LOOKUP_ARGS);
|
case 1: return u.format1.substitute (LOOKUP_ARGS, property);
|
||||||
default:return false;
|
default:return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -230,11 +222,7 @@ struct AlternateSubstFormat1 {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
inline bool substitute (LOOKUP_ARGS_DEF) const {
|
inline bool substitute (LOOKUP_ARGS_DEF, unsigned int property) const {
|
||||||
|
|
||||||
unsigned int property;
|
|
||||||
if (!_hb_ot_layout_check_glyph_property (layout, IN_CURITEM (), lookup_flag, &property))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
hb_codepoint_t glyph_id = IN_CURGLYPH ();
|
hb_codepoint_t glyph_id = IN_CURGLYPH ();
|
||||||
|
|
||||||
|
@ -286,9 +274,9 @@ struct AlternateSubst {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
inline bool substitute (LOOKUP_ARGS_DEF) const {
|
inline bool substitute (LOOKUP_ARGS_DEF, unsigned int property) const {
|
||||||
switch (u.substFormat) {
|
switch (u.substFormat) {
|
||||||
case 1: return u.format1.substitute (LOOKUP_ARGS);
|
case 1: return u.format1.substitute (LOOKUP_ARGS, property);
|
||||||
default:return false;
|
default:return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -415,11 +403,7 @@ struct LigatureSubstFormat1 {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
inline bool substitute (LOOKUP_ARGS_DEF) const {
|
inline bool substitute (LOOKUP_ARGS_DEF, unsigned int property) const {
|
||||||
|
|
||||||
unsigned int property;
|
|
||||||
if (!_hb_ot_layout_check_glyph_property (layout, IN_CURITEM (), lookup_flag, &property))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
hb_codepoint_t glyph_id = IN_CURGLYPH ();
|
hb_codepoint_t glyph_id = IN_CURGLYPH ();
|
||||||
|
|
||||||
|
@ -448,9 +432,9 @@ struct LigatureSubst {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
inline bool substitute (LOOKUP_ARGS_DEF) const {
|
inline bool substitute (LOOKUP_ARGS_DEF, unsigned int property) const {
|
||||||
switch (u.substFormat) {
|
switch (u.substFormat) {
|
||||||
case 1: return u.format1.substitute (LOOKUP_ARGS);
|
case 1: return u.format1.substitute (LOOKUP_ARGS, property);
|
||||||
default:return false;
|
default:return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -469,7 +453,7 @@ static inline bool substitute_lookup (LOOKUP_ARGS_DEF, unsigned int lookup_index
|
||||||
|
|
||||||
struct ContextSubst : Context {
|
struct ContextSubst : Context {
|
||||||
|
|
||||||
inline bool substitute (LOOKUP_ARGS_DEF) const {
|
inline bool substitute (LOOKUP_ARGS_DEF, unsigned int property) const {
|
||||||
return this->apply (LOOKUP_ARGS, substitute_lookup);
|
return this->apply (LOOKUP_ARGS, substitute_lookup);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -516,7 +500,7 @@ ASSERT_SIZE (ChainSubRuleSet, 2);
|
||||||
|
|
||||||
struct ChainContextSubstFormat1 {
|
struct ChainContextSubstFormat1 {
|
||||||
/* TODO */
|
/* TODO */
|
||||||
inline bool substitute (LOOKUP_ARGS_DEF) const {
|
inline bool substitute (LOOKUP_ARGS_DEF, unsigned int property) const {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -576,7 +560,7 @@ ASSERT_SIZE (ChainSubClassSet, 2);
|
||||||
|
|
||||||
struct ChainContextSubstFormat2 {
|
struct ChainContextSubstFormat2 {
|
||||||
/* TODO */
|
/* TODO */
|
||||||
inline bool substitute (LOOKUP_ARGS_DEF) const {
|
inline bool substitute (LOOKUP_ARGS_DEF, unsigned int property) const {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -606,7 +590,7 @@ ASSERT_SIZE (ChainContextSubstFormat2, 12);
|
||||||
|
|
||||||
struct ChainContextSubstFormat3 {
|
struct ChainContextSubstFormat3 {
|
||||||
/* TODO */
|
/* TODO */
|
||||||
inline bool substitute (LOOKUP_ARGS_DEF) const {
|
inline bool substitute (LOOKUP_ARGS_DEF, unsigned int property) const {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -638,11 +622,11 @@ struct ChainContextSubst {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
inline bool substitute (LOOKUP_ARGS_DEF) const {
|
inline bool substitute (LOOKUP_ARGS_DEF, unsigned int property) const {
|
||||||
switch (u.substFormat) {
|
switch (u.substFormat) {
|
||||||
case 1: return u.format1.substitute (LOOKUP_ARGS);
|
case 1: return u.format1.substitute (LOOKUP_ARGS, property);
|
||||||
case 2: return u.format2.substitute (LOOKUP_ARGS);
|
case 2: return u.format2.substitute (LOOKUP_ARGS, property);
|
||||||
case 3: return u.format3.substitute (LOOKUP_ARGS);
|
case 3: return u.format3.substitute (LOOKUP_ARGS, property);
|
||||||
default:return false;
|
default:return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -664,7 +648,7 @@ struct ExtensionSubstFormat1 {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
inline unsigned int get_type (void) const { return extensionLookupType; }
|
inline unsigned int get_type (void) const { return extensionLookupType; }
|
||||||
inline bool substitute (LOOKUP_ARGS_DEF) const;
|
inline bool substitute (LOOKUP_ARGS_DEF, unsigned int property) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
USHORT substFormat; /* Format identifier. Set to 1. */
|
USHORT substFormat; /* Format identifier. Set to 1. */
|
||||||
|
@ -690,9 +674,9 @@ struct ExtensionSubst {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool substitute (LOOKUP_ARGS_DEF) const {
|
inline bool substitute (LOOKUP_ARGS_DEF, unsigned int property) const {
|
||||||
switch (u.substFormat) {
|
switch (u.substFormat) {
|
||||||
case 1: return u.format1.substitute (LOOKUP_ARGS);
|
case 1: return u.format1.substitute (LOOKUP_ARGS, property);
|
||||||
default:return false;
|
default:return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -752,18 +736,23 @@ struct SubstLookupSubTable {
|
||||||
|
|
||||||
inline bool substitute (LOOKUP_ARGS_DEF,
|
inline bool substitute (LOOKUP_ARGS_DEF,
|
||||||
unsigned int lookup_type) const {
|
unsigned int lookup_type) const {
|
||||||
|
|
||||||
|
unsigned int property;
|
||||||
|
if (!_hb_ot_layout_check_glyph_property (layout, IN_CURITEM (), lookup_flag, &property))
|
||||||
|
return false;
|
||||||
|
|
||||||
switch (lookup_type) {
|
switch (lookup_type) {
|
||||||
case GSUB_Single: return u.single.substitute (LOOKUP_ARGS);
|
case GSUB_Single: return u.single.substitute (LOOKUP_ARGS, property);
|
||||||
case GSUB_Multiple: return u.multiple.substitute (LOOKUP_ARGS);
|
case GSUB_Multiple: return u.multiple.substitute (LOOKUP_ARGS, property);
|
||||||
case GSUB_Alternate: return u.alternate.substitute (LOOKUP_ARGS);
|
case GSUB_Alternate: return u.alternate.substitute (LOOKUP_ARGS, property);
|
||||||
case GSUB_Ligature: return u.ligature.substitute (LOOKUP_ARGS);
|
case GSUB_Ligature: return u.ligature.substitute (LOOKUP_ARGS, property);
|
||||||
case GSUB_Context: return u.context.substitute (LOOKUP_ARGS);
|
case GSUB_Context: return u.context.substitute (LOOKUP_ARGS, property);
|
||||||
/*
|
/*
|
||||||
case GSUB_ChainingContext: return u.chainingContext.substitute (LOOKUP_ARGS);
|
case GSUB_ChainingContext: return u.chainingContext.substitute (LOOKUP_ARGS, property);
|
||||||
*/
|
*/
|
||||||
case GSUB_Extension: return u.extension.substitute (LOOKUP_ARGS);
|
case GSUB_Extension: return u.extension.substitute (LOOKUP_ARGS, property);
|
||||||
/*
|
/*
|
||||||
case GSUB_ReverseChainingContextSingle: return u.reverseChainingContextSingle.substitute (LOOKUP_ARGS);
|
case GSUB_ReverseChainingContextSingle: return u.reverseChainingContextSingle.substitute (LOOKUP_ARGS, property);
|
||||||
*/
|
*/
|
||||||
default:return false;
|
default:return false;
|
||||||
}
|
}
|
||||||
|
@ -910,7 +899,7 @@ struct GSUB : GSUBGPOS {
|
||||||
|
|
||||||
/* Out-of-class implementation for methods chaining */
|
/* Out-of-class implementation for methods chaining */
|
||||||
|
|
||||||
inline bool ExtensionSubstFormat1::substitute (LOOKUP_ARGS_DEF) const {
|
inline bool ExtensionSubstFormat1::substitute (LOOKUP_ARGS_DEF, unsigned int property) 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) + extensionOffset)).substitute (LOOKUP_ARGS,
|
||||||
|
|
|
@ -198,10 +198,6 @@ struct ContextFormat1 {
|
||||||
|
|
||||||
inline bool apply (LOOKUP_ARGS_DEF, apply_lookup_func_t apply_func) const {
|
inline bool apply (LOOKUP_ARGS_DEF, apply_lookup_func_t apply_func) const {
|
||||||
|
|
||||||
unsigned int property;
|
|
||||||
if (!_hb_ot_layout_check_glyph_property (layout, IN_CURITEM (), lookup_flag, &property))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
unsigned int index = (this+coverage) (IN_CURGLYPH ());
|
unsigned int index = (this+coverage) (IN_CURGLYPH ());
|
||||||
const RuleSet &rule_set = this+ruleSet[index];
|
const RuleSet &rule_set = this+ruleSet[index];
|
||||||
struct ContextLookupContext context = {
|
struct ContextLookupContext context = {
|
||||||
|
@ -236,10 +232,6 @@ struct ContextFormat2 {
|
||||||
|
|
||||||
inline bool apply (LOOKUP_ARGS_DEF, apply_lookup_func_t apply_func) const {
|
inline bool apply (LOOKUP_ARGS_DEF, apply_lookup_func_t apply_func) const {
|
||||||
|
|
||||||
unsigned int property;
|
|
||||||
if (!_hb_ot_layout_check_glyph_property (layout, IN_CURITEM (), lookup_flag, &property))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
unsigned int index = (this+coverage) (IN_CURGLYPH ());
|
unsigned int index = (this+coverage) (IN_CURGLYPH ());
|
||||||
const RuleSet &rule_set = this+ruleSet[index];
|
const RuleSet &rule_set = this+ruleSet[index];
|
||||||
/* LONGTERMTODO: Old code fetches glyph classes at most once and caches
|
/* LONGTERMTODO: Old code fetches glyph classes at most once and caches
|
||||||
|
@ -297,10 +289,6 @@ struct ContextFormat3 {
|
||||||
|
|
||||||
inline bool apply (LOOKUP_ARGS_DEF, apply_lookup_func_t apply_func) const {
|
inline bool apply (LOOKUP_ARGS_DEF, apply_lookup_func_t apply_func) const {
|
||||||
|
|
||||||
unsigned int property;
|
|
||||||
if (!_hb_ot_layout_check_glyph_property (layout, IN_CURITEM (), lookup_flag, &property))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if ((*this)[0].get_coverage (IN_CURGLYPH () == NOT_COVERED))
|
if ((*this)[0].get_coverage (IN_CURGLYPH () == NOT_COVERED))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue