[GSUB/GDEF] Guess glyph classes after substitution only if no GDEF
Brings down Khmer failures with Daun Penh font from 36% to 20%.
This commit is contained in:
parent
fcdc5f1c88
commit
60da763dfa
|
@ -110,6 +110,7 @@ struct hb_apply_context_t
|
||||||
unsigned int lookup_props;
|
unsigned int lookup_props;
|
||||||
unsigned int property; /* propety of first glyph */
|
unsigned int property; /* propety of first glyph */
|
||||||
unsigned int debug_depth;
|
unsigned int debug_depth;
|
||||||
|
bool has_glyph_classes;
|
||||||
|
|
||||||
|
|
||||||
hb_apply_context_t (hb_font_t *font_,
|
hb_apply_context_t (hb_font_t *font_,
|
||||||
|
@ -120,7 +121,8 @@ struct hb_apply_context_t
|
||||||
direction (buffer_->props.direction),
|
direction (buffer_->props.direction),
|
||||||
lookup_mask (lookup_mask_),
|
lookup_mask (lookup_mask_),
|
||||||
nesting_level_left (MAX_NESTING_LEVEL),
|
nesting_level_left (MAX_NESTING_LEVEL),
|
||||||
lookup_props (0), property (0), debug_depth (0) {}
|
lookup_props (0), property (0), debug_depth (0),
|
||||||
|
has_glyph_classes (hb_ot_layout_has_glyph_classes (face_)) {}
|
||||||
|
|
||||||
void set_lookup (const Lookup &l) {
|
void set_lookup (const Lookup &l) {
|
||||||
lookup_props = l.get_props ();
|
lookup_props = l.get_props ();
|
||||||
|
@ -229,25 +231,29 @@ struct hb_apply_context_t
|
||||||
return _hb_ot_layout_skip_mark (face, &buffer->cur(), lookup_props, &property);
|
return _hb_ot_layout_skip_mark (face, &buffer->cur(), lookup_props, &property);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline void set_klass_guess (unsigned int klass_guess) const
|
||||||
|
{
|
||||||
|
buffer->cur().props_cache() = has_glyph_classes ? 0 : klass_guess;
|
||||||
|
}
|
||||||
|
|
||||||
inline void output_glyph (hb_codepoint_t glyph_index,
|
inline void output_glyph (hb_codepoint_t glyph_index,
|
||||||
unsigned int klass = 0) const
|
unsigned int klass_guess = 0) const
|
||||||
{
|
{
|
||||||
buffer->cur().props_cache() = klass; /*XXX if has gdef? */
|
set_klass_guess (klass_guess);
|
||||||
buffer->output_glyph (glyph_index);
|
buffer->output_glyph (glyph_index);
|
||||||
}
|
}
|
||||||
inline void replace_glyph (hb_codepoint_t glyph_index,
|
inline void replace_glyph (hb_codepoint_t glyph_index,
|
||||||
unsigned int klass = 0) const
|
unsigned int klass_guess = 0) const
|
||||||
{
|
{
|
||||||
buffer->cur().props_cache() = klass; /*XXX if has gdef? */
|
set_klass_guess (klass_guess);
|
||||||
buffer->replace_glyph (glyph_index);
|
buffer->replace_glyph (glyph_index);
|
||||||
}
|
}
|
||||||
inline void replace_glyphs (unsigned int num_in,
|
inline void replace_glyphs (unsigned int num_in,
|
||||||
unsigned int num_out,
|
unsigned int num_out,
|
||||||
hb_codepoint_t *glyph_data,
|
hb_codepoint_t *glyph_data,
|
||||||
unsigned int klass = 0) const
|
unsigned int klass_guess = 0) const
|
||||||
{
|
{
|
||||||
buffer->cur().props_cache() = klass; /* XXX if has gdef? */
|
set_klass_guess (klass_guess);
|
||||||
buffer->replace_glyphs (num_in, num_out, glyph_data);
|
buffer->replace_glyphs (num_in, num_out, glyph_data);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue