|
|
|
@ -529,6 +529,32 @@ hb_ot_map_glyphs_fast (hb_buffer_t *buffer) |
|
|
|
|
buffer->content_type = HB_BUFFER_CONTENT_TYPE_GLYPHS; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static inline void |
|
|
|
|
hb_synthesize_glyph_classes (hb_ot_shape_context_t *c) |
|
|
|
|
{ |
|
|
|
|
unsigned int count = c->buffer->len; |
|
|
|
|
hb_glyph_info_t *info = c->buffer->info; |
|
|
|
|
for (unsigned int i = 0; i < count; i++) |
|
|
|
|
{ |
|
|
|
|
hb_ot_layout_glyph_props_flags_t klass; |
|
|
|
|
|
|
|
|
|
/* Never mark default-ignorables as marks.
|
|
|
|
|
* They won't get in the way of lookups anyway, |
|
|
|
|
* but having them as mark will cause them to be skipped |
|
|
|
|
* over if the lookup-flag says so, but at least for the |
|
|
|
|
* Mongolian variation selectors, looks like Uniscribe |
|
|
|
|
* marks them as non-mark. Some Mongolian fonts without |
|
|
|
|
* GDEF rely on this. Another notable character that |
|
|
|
|
* this applies to is COMBINING GRAPHEME JOINER. */ |
|
|
|
|
klass = (_hb_glyph_info_get_general_category (&info[i]) != |
|
|
|
|
HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK || |
|
|
|
|
_hb_glyph_info_is_default_ignorable (&info[i])) ? |
|
|
|
|
HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH : |
|
|
|
|
HB_OT_LAYOUT_GLYPH_PROPS_MARK; |
|
|
|
|
_hb_glyph_info_set_glyph_props (&info[i], klass); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static inline void |
|
|
|
|
hb_ot_substitute_default (hb_ot_shape_context_t *c) |
|
|
|
|
{ |
|
|
|
@ -560,6 +586,9 @@ hb_ot_substitute_complex (hb_ot_shape_context_t *c) |
|
|
|
|
|
|
|
|
|
hb_ot_layout_substitute_start (c->font, buffer); |
|
|
|
|
|
|
|
|
|
if (!hb_ot_layout_has_glyph_classes (c->face)) |
|
|
|
|
hb_synthesize_glyph_classes (c); |
|
|
|
|
|
|
|
|
|
c->plan->substitute (c->font, buffer); |
|
|
|
|
|
|
|
|
|
return; |
|
|
|
|