layout->gpos_blob = Sanitizer<GPOS>::sanitize (hb_face_reference_table (face, HB_OT_TAG_GPOS));
layout->gpos = Sanitizer<GPOS>::lock_instance (layout->gpos_blob);
+ layout->gsub_lookup_count = layout->gsub->get_lookup_count ();
+ layout->gpos_lookup_count = layout->gpos->get_lookup_count ();
+
layout->gsub_digests = (hb_set_digest_t *) calloc (layout->gsub->get_lookup_count (), sizeof (hb_set_digest_t));
layout->gpos_digests = (hb_set_digest_t *) calloc (layout->gpos->get_lookup_count (), sizeof (hb_set_digest_t));
- if (unlikely ((layout->gsub->get_lookup_count() && !layout->gsub_digests) ||
- (layout->gpos->get_lookup_count() && !layout->gpos_digests)))
+ if (unlikely ((layout->gsub_lookup_count && !layout->gsub_digests) ||
+ (layout->gpos_lookup_count && !layout->gpos_digests)))
{
_hb_ot_layout_destroy (layout);
return NULL;
}
- unsigned int count;
- count = layout->gsub->get_lookup_count();
- for (unsigned int i = 0; i < count; i++)
+ for (unsigned int i = 0; i < layout->gsub_lookup_count; i++)
layout->gsub->add_coverage (&layout->gsub_digests[i], i);
- count = layout->gpos->get_lookup_count();
- for (unsigned int i = 0; i < count; i++)
+ for (unsigned int i = 0; i < layout->gpos_lookup_count; i++)
layout->gpos->add_coverage (&layout->gpos_digests[i], i);
return layout;
unsigned int glyphs_length,
unsigned int lookup_index)
{
- if (unlikely (glyphs_length < 1 || glyphs_length > 2)) return false;
- hb_would_apply_context_t c (face, glyphs[0], glyphs_length == 2 ? glyphs[1] : -1, NULL);
- return _get_gsub (face).would_substitute_lookup (&c, lookup_index);
+ if (unlikely (!hb_ot_shaper_face_data_ensure (face))) return false;
+ return hb_ot_layout_would_substitute_lookup_fast (face, glyphs, glyphs_length, lookup_index);
}
hb_bool_t
unsigned int lookup_index)
{
if (unlikely (glyphs_length < 1 || glyphs_length > 2)) return false;
+ if (unlikely (lookup_index >= hb_ot_layout_from_face (face)->gsub_lookup_count)) return false;
hb_would_apply_context_t c (face, glyphs[0], glyphs_length == 2 ? glyphs[1] : -1, &hb_ot_layout_from_face (face)->gsub_digests[lookup_index]);
return hb_ot_layout_from_face (face)->gsub->would_substitute_lookup (&c, lookup_index);
}
unsigned int lookup_index,
hb_mask_t mask)
{
- hb_apply_context_t c (NULL, face, buffer, mask, NULL);
- return _get_gsub (face).substitute_lookup (&c, lookup_index);
+ if (unlikely (!hb_ot_shaper_face_data_ensure (face))) return false;
+ return hb_ot_layout_substitute_lookup_fast (face, buffer, lookup_index, mask);
}
hb_bool_t
unsigned int lookup_index,
hb_mask_t mask)
{
+ if (unlikely (lookup_index >= hb_ot_layout_from_face (face)->gsub_lookup_count)) return false;
hb_apply_context_t c (NULL, face, buffer, mask, &hb_ot_layout_from_face (face)->gsub_digests[lookup_index]);
return hb_ot_layout_from_face (face)->gsub->substitute_lookup (&c, lookup_index);
}
unsigned int lookup_index,
hb_mask_t mask)
{
- hb_apply_context_t c (font, font->face, buffer, mask, NULL);
- return _get_gpos (font->face).position_lookup (&c, lookup_index);
+ if (unlikely (!hb_ot_shaper_face_data_ensure (font->face))) return false;
+ return hb_ot_layout_position_lookup_fast (font, buffer, lookup_index, mask);
}
hb_bool_t
unsigned int lookup_index,
hb_mask_t mask)
{
+ if (unlikely (lookup_index >= hb_ot_layout_from_face (font->face)->gpos_lookup_count)) return false;
hb_apply_context_t c (font, font->face, buffer, mask, &hb_ot_layout_from_face (font->face)->gpos_digests[lookup_index]);
return hb_ot_layout_from_face (font->face)->gpos->position_lookup (&c, lookup_index);
}
{
GPOS::position_finish (font, buffer, zero_width_attached_marks);
}
-
-