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..
diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc
index 9b93bb0..cdc7755 100644
--- a/src/hb-ot-layout.cc
+++ b/src/hb-ot-layout.cc
@@ -63,6 +63,12 @@
   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 437ae47..ee6e0d2 100644
--- a/src/hb-ot-layout.hh
+++ b/src/hb-ot-layout.hh
@@ -48,6 +48,9 @@
 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 455c8d6..9b6d470 100644
--- a/src/hb-ot-shape.cc
+++ b/src/hb-ot-shape.cc
@@ -131,13 +131,12 @@
       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_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 @@
 	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 1cb9e24..655e28d 100644
--- a/src/hb-ot-shape.hh
+++ b/src/hb-ot-shape.hh
@@ -51,8 +51,8 @@
   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;