Disable fallback mark positioning if kern table has cross-stream kerning

Happens even if the cross-stream kerning is for cursive attachment only.  Oh well..
This commit is contained in:
Behdad Esfahbod 2018-11-07 16:19:51 -05:00
parent 5cf6f94dfd
commit ca23567f41
4 changed files with 16 additions and 9 deletions

View File

@ -63,6 +63,12 @@ hb_ot_layout_has_kerning (hb_face_t *face)
return face->table.kern->has_data ();
}
hb_bool_t
hb_ot_layout_has_cross_kerning (hb_face_t *face)
{
return face->table.kern->has_cross_stream ();
}
void
hb_ot_layout_kern (hb_ot_shape_plan_t *plan,
hb_font_t *font,

View File

@ -48,6 +48,9 @@ struct hb_ot_shape_plan_t;
HB_INTERNAL hb_bool_t
hb_ot_layout_has_kerning (hb_face_t *face);
HB_INTERNAL hb_bool_t
hb_ot_layout_has_cross_kerning (hb_face_t *face);
HB_INTERNAL void
hb_ot_layout_kern (hb_ot_shape_plan_t *plan,
hb_font_t *font,

View File

@ -131,13 +131,12 @@ hb_ot_shape_planner_t::compile (hb_ot_shape_plan_t &plan,
plan.apply_kerx = true;
else if (hb_ot_layout_has_kerning (face))
plan.apply_kern = true;
else
plan.fallback_kerning = true;
}
bool has_kern_mark = plan.apply_kern && hb_ot_layout_has_cross_kerning (face);
plan.zero_marks = !plan.apply_kerx && !has_kern_mark;
plan.has_gpos_mark = !!plan.map.get_1_mask (HB_TAG ('m','a','r','k'));
if (!plan.apply_gpos && !plan.apply_kerx)
plan.fallback_mark_positioning = true;
plan.fallback_mark_positioning = !plan.apply_gpos && !plan.apply_kerx && !has_kern_mark;
/* Currently we always apply trak. */
plan.apply_trak = plan.requested_tracking && hb_aat_layout_has_tracking (face);
@ -853,7 +852,7 @@ hb_ot_position_complex (const hb_ot_shape_context_t *c)
hb_ot_layout_position_start (c->font, c->buffer);
if (!c->plan->apply_kerx)
if (c->plan->zero_marks)
switch (c->plan->shaper->zero_width_marks)
{
case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY:
@ -866,20 +865,19 @@ hb_ot_position_complex (const hb_ot_shape_context_t *c)
break;
}
/* XXX Clean up relationship between these. */
if (c->plan->apply_gpos)
c->plan->position (c->font, c->buffer);
else if (c->plan->apply_kerx)
hb_aat_layout_position (c->plan, c->font, c->buffer);
else if (c->plan->apply_kern)
hb_ot_layout_kern (c->plan, c->font, c->buffer);
else if (c->plan->fallback_kerning)
else
_hb_ot_shape_fallback_kern (c->plan, c->font, c->buffer);
if (c->plan->apply_trak)
hb_aat_layout_track (c->plan, c->font, c->buffer);
if (!c->plan->apply_kerx)
if (c->plan->zero_marks)
switch (c->plan->shaper->zero_width_marks)
{
case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE:

View File

@ -51,8 +51,8 @@ struct hb_ot_shape_plan_t
bool requested_tracking : 1;
bool has_frac : 1;
bool has_gpos_mark : 1;
bool zero_marks : 1;
bool fallback_glyph_classes : 1;
bool fallback_kerning : 1;
bool fallback_mark_positioning : 1;
bool apply_gpos : 1;