[coretext] Use CFRunStatus

Assert that all runs had expected direction, and take hint for
non-monotone clusters.
diff --git a/src/hb-coretext.cc b/src/hb-coretext.cc
index 8081bfc..8caff48 100644
--- a/src/hb-coretext.cc
+++ b/src/hb-coretext.cc
@@ -740,12 +740,17 @@
     unsigned int num_runs = CFArrayGetCount (glyph_runs);
 
     buffer->len = 0;
+    uint32_t status_and = ~0, status_or = 0;
 
     const CFRange range_all = CFRangeMake (0, 0);
 
     for (unsigned int i = 0; i < num_runs; i++)
     {
       CTRunRef run = static_cast<CTRunRef>(CFArrayGetValueAtIndex (glyph_runs, i));
+      CTRunStatus run_status = CTRunGetStatus (run);
+      status_or  |= run_status;
+      status_and &= run_status;
+      DEBUG_MSG (CORETEXT, run, "CTRunStatus: %x", run_status);
 
       /* CoreText does automatic font fallback (AKA "cascading") for  characters
        * not supported by the requested font, and provides no way to turn it off,
@@ -863,6 +868,11 @@
       }
     }
 
+    /* Make sure all runs had the expected direction. */
+    bool backward = HB_DIRECTION_IS_BACKWARD (buffer->props.direction);
+    assert (bool (status_and & kCTRunStatusRightToLeft) == backward);
+    assert (bool (status_or  & kCTRunStatusRightToLeft) == backward);
+
     buffer->clear_positions ();
 
     unsigned int count = buffer->len;
@@ -878,12 +888,15 @@
 
     /* Fix up clusters so that we never return out-of-order indices;
      * if core text has reordered glyphs, we'll merge them to the
-     * beginning of the reordered cluster.
+     * beginning of the reordered cluster.  CoreText is nice enough
+     * to tell us whenever it has produced nonmonotonic results...
+     * Note that we assume the input clusters were nonmonotonic to
+     * begin with.
      *
      * This does *not* mean we'll form the same clusters as Uniscribe
      * or the native OT backend, only that the cluster indices will be
      * monotonic in the output buffer. */
-    if (count > 1)
+    if (count > 1 && (status_or & kCTRunStatusNonMonotonic))
     {
       hb_glyph_info_t *info = buffer->info;
       if (HB_DIRECTION_IS_FORWARD (buffer->props.direction))