From ca23567f41a2d6389f6fd2483a994cf5aa6aeaf8 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 7 Nov 2018 16:19:51 -0500 Subject: [PATCH] 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.. --- src/hb-ot-layout.cc | 6 ++++++ src/hb-ot-layout.hh | 3 +++ src/hb-ot-shape.cc | 14 ++++++-------- src/hb-ot-shape.hh | 2 +- 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc index 9b93bb085..cdc7755ad 100644 --- a/src/hb-ot-layout.cc +++ b/src/hb-ot-layout.cc @@ -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, diff --git a/src/hb-ot-layout.hh b/src/hb-ot-layout.hh index 437ae4776..ee6e0d254 100644 --- a/src/hb-ot-layout.hh +++ b/src/hb-ot-layout.hh @@ -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, diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc index 455c8d689..9b6d47089 100644 --- a/src/hb-ot-shape.cc +++ b/src/hb-ot-shape.cc @@ -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: diff --git a/src/hb-ot-shape.hh b/src/hb-ot-shape.hh index 1cb9e24d7..655e28d6d 100644 --- a/src/hb-ot-shape.hh +++ b/src/hb-ot-shape.hh @@ -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;