[HB] Propagate property of first glyph
This slightly grows code size.
This commit is contained in:
parent
eca8e33710
commit
ecf17e849d
|
@ -98,7 +98,7 @@ struct SingleSubst {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool substitute (LOOKUP_ARGS_DEF, unsigned int property) const {
|
inline bool substitute (LOOKUP_ARGS_DEF) const {
|
||||||
|
|
||||||
hb_codepoint_t glyph_id = IN_CURGLYPH ();
|
hb_codepoint_t glyph_id = IN_CURGLYPH ();
|
||||||
|
|
||||||
|
@ -139,7 +139,7 @@ struct Sequence {
|
||||||
_hb_ot_layout_set_glyph_property (layout, substitute[n], property);
|
_hb_ot_layout_set_glyph_property (layout, substitute[n], property);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool substitute_sequence (LOOKUP_ARGS_DEF, unsigned int property) const {
|
inline bool substitute_sequence (LOOKUP_ARGS_DEF) const {
|
||||||
|
|
||||||
if (HB_UNLIKELY (!substitute.len))
|
if (HB_UNLIKELY (!substitute.len))
|
||||||
return false;
|
return false;
|
||||||
|
@ -173,10 +173,10 @@ struct MultipleSubstFormat1 {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
inline bool substitute (LOOKUP_ARGS_DEF, unsigned int property) const {
|
inline bool substitute (LOOKUP_ARGS_DEF) const {
|
||||||
|
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -196,9 +196,9 @@ struct MultipleSubst {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
inline bool substitute (LOOKUP_ARGS_DEF, unsigned int property) const {
|
inline bool substitute (LOOKUP_ARGS_DEF) const {
|
||||||
switch (u.substFormat) {
|
switch (u.substFormat) {
|
||||||
case 1: return u.format1.substitute (LOOKUP_ARGS, property);
|
case 1: return u.format1.substitute (LOOKUP_ARGS);
|
||||||
default:return false;
|
default:return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -222,7 +222,7 @@ struct AlternateSubstFormat1 {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
inline bool substitute (LOOKUP_ARGS_DEF, unsigned int property) const {
|
inline bool substitute (LOOKUP_ARGS_DEF) const {
|
||||||
|
|
||||||
hb_codepoint_t glyph_id = IN_CURGLYPH ();
|
hb_codepoint_t glyph_id = IN_CURGLYPH ();
|
||||||
|
|
||||||
|
@ -274,9 +274,9 @@ struct AlternateSubst {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
inline bool substitute (LOOKUP_ARGS_DEF, unsigned int property) const {
|
inline bool substitute (LOOKUP_ARGS_DEF) const {
|
||||||
switch (u.substFormat) {
|
switch (u.substFormat) {
|
||||||
case 1: return u.format1.substitute (LOOKUP_ARGS, property);
|
case 1: return u.format1.substitute (LOOKUP_ARGS);
|
||||||
default:return false;
|
default:return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -300,7 +300,6 @@ struct Ligature {
|
||||||
inline bool substitute_ligature (LOOKUP_ARGS_DEF, bool is_mark) const {
|
inline bool substitute_ligature (LOOKUP_ARGS_DEF, bool is_mark) const {
|
||||||
|
|
||||||
unsigned int i, j;
|
unsigned int i, j;
|
||||||
unsigned int property;
|
|
||||||
unsigned int count = compCount;
|
unsigned int count = compCount;
|
||||||
|
|
||||||
if (HB_UNLIKELY (buffer->in_pos + count > buffer->in_length ||
|
if (HB_UNLIKELY (buffer->in_pos + count > buffer->in_length ||
|
||||||
|
@ -403,7 +402,7 @@ struct LigatureSubstFormat1 {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
inline bool substitute (LOOKUP_ARGS_DEF, unsigned int property) const {
|
inline bool substitute (LOOKUP_ARGS_DEF) const {
|
||||||
|
|
||||||
hb_codepoint_t glyph_id = IN_CURGLYPH ();
|
hb_codepoint_t glyph_id = IN_CURGLYPH ();
|
||||||
|
|
||||||
|
@ -432,9 +431,9 @@ struct LigatureSubst {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
inline bool substitute (LOOKUP_ARGS_DEF, unsigned int property) const {
|
inline bool substitute (LOOKUP_ARGS_DEF) const {
|
||||||
switch (u.substFormat) {
|
switch (u.substFormat) {
|
||||||
case 1: return u.format1.substitute (LOOKUP_ARGS, property);
|
case 1: return u.format1.substitute (LOOKUP_ARGS);
|
||||||
default:return false;
|
default:return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -453,7 +452,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, unsigned int property) const {
|
inline bool substitute (LOOKUP_ARGS_DEF) const {
|
||||||
return this->apply (LOOKUP_ARGS, substitute_lookup);
|
return this->apply (LOOKUP_ARGS, substitute_lookup);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -500,7 +499,7 @@ ASSERT_SIZE (ChainSubRuleSet, 2);
|
||||||
|
|
||||||
struct ChainContextSubstFormat1 {
|
struct ChainContextSubstFormat1 {
|
||||||
/* TODO */
|
/* TODO */
|
||||||
inline bool substitute (LOOKUP_ARGS_DEF, unsigned int property) const {
|
inline bool substitute (LOOKUP_ARGS_DEF) const {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -560,7 +559,7 @@ ASSERT_SIZE (ChainSubClassSet, 2);
|
||||||
|
|
||||||
struct ChainContextSubstFormat2 {
|
struct ChainContextSubstFormat2 {
|
||||||
/* TODO */
|
/* TODO */
|
||||||
inline bool substitute (LOOKUP_ARGS_DEF, unsigned int property) const {
|
inline bool substitute (LOOKUP_ARGS_DEF) const {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -590,7 +589,7 @@ ASSERT_SIZE (ChainContextSubstFormat2, 12);
|
||||||
|
|
||||||
struct ChainContextSubstFormat3 {
|
struct ChainContextSubstFormat3 {
|
||||||
/* TODO */
|
/* TODO */
|
||||||
inline bool substitute (LOOKUP_ARGS_DEF, unsigned int property) const {
|
inline bool substitute (LOOKUP_ARGS_DEF) const {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -622,11 +621,11 @@ struct ChainContextSubst {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
inline bool substitute (LOOKUP_ARGS_DEF, unsigned int property) const {
|
inline bool substitute (LOOKUP_ARGS_DEF) const {
|
||||||
switch (u.substFormat) {
|
switch (u.substFormat) {
|
||||||
case 1: return u.format1.substitute (LOOKUP_ARGS, property);
|
case 1: return u.format1.substitute (LOOKUP_ARGS);
|
||||||
case 2: return u.format2.substitute (LOOKUP_ARGS, property);
|
case 2: return u.format2.substitute (LOOKUP_ARGS);
|
||||||
case 3: return u.format3.substitute (LOOKUP_ARGS, property);
|
case 3: return u.format3.substitute (LOOKUP_ARGS);
|
||||||
default:return false;
|
default:return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -648,7 +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 bool substitute (LOOKUP_ARGS_DEF, unsigned int property) const;
|
inline bool substitute (LOOKUP_ARGS_DEF) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
USHORT substFormat; /* Format identifier. Set to 1. */
|
USHORT substFormat; /* Format identifier. Set to 1. */
|
||||||
|
@ -674,9 +673,9 @@ struct ExtensionSubst {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool substitute (LOOKUP_ARGS_DEF, unsigned int property) const {
|
inline bool substitute (LOOKUP_ARGS_DEF) const {
|
||||||
switch (u.substFormat) {
|
switch (u.substFormat) {
|
||||||
case 1: return u.format1.substitute (LOOKUP_ARGS, property);
|
case 1: return u.format1.substitute (LOOKUP_ARGS);
|
||||||
default:return false;
|
default:return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -735,21 +734,20 @@ struct SubstLookupSubTable {
|
||||||
friend struct SubstLookup;
|
friend struct SubstLookup;
|
||||||
|
|
||||||
inline bool substitute (LOOKUP_ARGS_DEF,
|
inline bool substitute (LOOKUP_ARGS_DEF,
|
||||||
unsigned int property,
|
|
||||||
unsigned int lookup_type) const {
|
unsigned int lookup_type) const {
|
||||||
|
|
||||||
switch (lookup_type) {
|
switch (lookup_type) {
|
||||||
case GSUB_Single: return u.single.substitute (LOOKUP_ARGS, property);
|
case GSUB_Single: return u.single.substitute (LOOKUP_ARGS);
|
||||||
case GSUB_Multiple: return u.multiple.substitute (LOOKUP_ARGS, property);
|
case GSUB_Multiple: return u.multiple.substitute (LOOKUP_ARGS);
|
||||||
case GSUB_Alternate: return u.alternate.substitute (LOOKUP_ARGS, property);
|
case GSUB_Alternate: return u.alternate.substitute (LOOKUP_ARGS);
|
||||||
case GSUB_Ligature: return u.ligature.substitute (LOOKUP_ARGS, property);
|
case GSUB_Ligature: return u.ligature.substitute (LOOKUP_ARGS);
|
||||||
case GSUB_Context: return u.context.substitute (LOOKUP_ARGS, property);
|
case GSUB_Context: return u.context.substitute (LOOKUP_ARGS);
|
||||||
/*
|
/*
|
||||||
case GSUB_ChainingContext: return u.chainingContext.substitute (LOOKUP_ARGS, property);
|
case GSUB_ChainingContext: return u.chainingContext.substitute (LOOKUP_ARGS);
|
||||||
*/
|
*/
|
||||||
case GSUB_Extension: return u.extension.substitute (LOOKUP_ARGS, property);
|
case GSUB_Extension: return u.extension.substitute (LOOKUP_ARGS);
|
||||||
/*
|
/*
|
||||||
case GSUB_ReverseChainingContextSingle: return u.reverseChainingContextSingle.substitute (LOOKUP_ARGS, property);
|
case GSUB_ReverseChainingContextSingle: return u.reverseChainingContextSingle.substitute (LOOKUP_ARGS);
|
||||||
*/
|
*/
|
||||||
default:return false;
|
default:return false;
|
||||||
}
|
}
|
||||||
|
@ -802,25 +800,32 @@ struct SubstLookup : Lookup {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool substitute_once (hb_ot_layout_t *layout,
|
inline bool substitute_subtables (hb_ot_layout_t *layout,
|
||||||
hb_buffer_t *buffer,
|
hb_buffer_t *buffer,
|
||||||
unsigned int context_length,
|
unsigned int context_length,
|
||||||
unsigned int nesting_level_left) const {
|
unsigned int nesting_level_left,
|
||||||
|
unsigned int property) const {
|
||||||
unsigned int lookup_type = get_type ();
|
unsigned int lookup_type = get_type ();
|
||||||
unsigned int lookup_flag = get_flag ();
|
unsigned int lookup_flag = get_flag ();
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < get_subtable_count (); i++)
|
||||||
|
if (get_subtable (i).substitute (LOOKUP_ARGS,
|
||||||
|
lookup_type))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool substitute_once (hb_ot_layout_t *layout,
|
||||||
|
hb_buffer_t *buffer) const {
|
||||||
|
|
||||||
|
unsigned int lookup_flag = get_flag ();
|
||||||
|
|
||||||
unsigned int property;
|
unsigned int property;
|
||||||
if (!_hb_ot_layout_check_glyph_property (layout, IN_CURITEM (), lookup_flag, &property))
|
if (!_hb_ot_layout_check_glyph_property (layout, IN_CURITEM (), lookup_flag, &property))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
for (unsigned int i = 0; i < get_subtable_count (); i++)
|
return substitute_subtables (layout, buffer, NO_CONTEXT, MAX_NESTING_LEVEL, property);
|
||||||
if (get_subtable (i).substitute (LOOKUP_ARGS,
|
|
||||||
property,
|
|
||||||
lookup_type))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool substitute_string (hb_ot_layout_t *layout,
|
bool substitute_string (hb_ot_layout_t *layout,
|
||||||
|
@ -837,7 +842,7 @@ struct SubstLookup : Lookup {
|
||||||
while (buffer->in_pos < buffer->in_length) {
|
while (buffer->in_pos < buffer->in_length) {
|
||||||
|
|
||||||
if ((~IN_PROPERTIES (buffer->in_pos) & mask) &&
|
if ((~IN_PROPERTIES (buffer->in_pos) & mask) &&
|
||||||
substitute_once (layout, buffer, NO_CONTEXT, MAX_NESTING_LEVEL))
|
substitute_once (layout, buffer))
|
||||||
ret = true;
|
ret = true;
|
||||||
else
|
else
|
||||||
_hb_buffer_next_glyph (buffer);
|
_hb_buffer_next_glyph (buffer);
|
||||||
|
@ -853,7 +858,7 @@ struct SubstLookup : Lookup {
|
||||||
do {
|
do {
|
||||||
|
|
||||||
if ((~IN_PROPERTIES (buffer->in_pos) & mask) &&
|
if ((~IN_PROPERTIES (buffer->in_pos) & mask) &&
|
||||||
substitute_once (layout, buffer, NO_CONTEXT, MAX_NESTING_LEVEL))
|
substitute_once (layout, buffer))
|
||||||
ret = true;
|
ret = true;
|
||||||
else
|
else
|
||||||
buffer->in_pos--;
|
buffer->in_pos--;
|
||||||
|
@ -894,11 +899,10 @@ struct GSUB : GSUBGPOS {
|
||||||
|
|
||||||
/* Out-of-class implementation for methods chaining */
|
/* Out-of-class implementation for methods chaining */
|
||||||
|
|
||||||
inline bool ExtensionSubstFormat1::substitute (LOOKUP_ARGS_DEF, unsigned int property) 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) + extensionOffset)).substitute (LOOKUP_ARGS,
|
||||||
property,
|
|
||||||
get_type ());
|
get_type ());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -913,7 +917,7 @@ static inline bool substitute_lookup (LOOKUP_ARGS_DEF, unsigned int lookup_index
|
||||||
if (HB_UNLIKELY (context_length < 1))
|
if (HB_UNLIKELY (context_length < 1))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return l.substitute_once (layout, buffer, context_length, nesting_level_left);
|
return l.substitute_subtables (layout, buffer, context_length, nesting_level_left, property);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -35,13 +35,15 @@
|
||||||
hb_buffer_t *buffer, \
|
hb_buffer_t *buffer, \
|
||||||
unsigned int context_length HB_GNUC_UNUSED, \
|
unsigned int context_length HB_GNUC_UNUSED, \
|
||||||
unsigned int nesting_level_left HB_GNUC_UNUSED, \
|
unsigned int nesting_level_left HB_GNUC_UNUSED, \
|
||||||
unsigned int lookup_flag
|
unsigned int lookup_flag, \
|
||||||
|
unsigned int property HB_GNUC_UNUSED /* propety of first glyph */
|
||||||
#define LOOKUP_ARGS \
|
#define LOOKUP_ARGS \
|
||||||
layout, \
|
layout, \
|
||||||
buffer, \
|
buffer, \
|
||||||
context_length, \
|
context_length, \
|
||||||
nesting_level_left, \
|
nesting_level_left, \
|
||||||
lookup_flag
|
lookup_flag, \
|
||||||
|
property
|
||||||
|
|
||||||
|
|
||||||
/* Context lookups */
|
/* Context lookups */
|
||||||
|
@ -83,7 +85,6 @@ static inline bool context_lookup (LOOKUP_ARGS_DEF,
|
||||||
ContextLookupContext &context) {
|
ContextLookupContext &context) {
|
||||||
|
|
||||||
unsigned int i, j;
|
unsigned int i, j;
|
||||||
unsigned int property;
|
|
||||||
unsigned int count = glyphCount;
|
unsigned int count = glyphCount;
|
||||||
|
|
||||||
if (HB_UNLIKELY (buffer->in_pos + count > buffer->in_length ||
|
if (HB_UNLIKELY (buffer->in_pos + count > buffer->in_length ||
|
||||||
|
|
Loading…
Reference in New Issue