From 10b1104d791a0b0103c6bbb083b5819f2b7d328d Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 11 Aug 2014 20:02:45 -0400 Subject: [PATCH] [coretext] Use CFRunStatus Assert that all runs had expected direction, and take hint for non-monotone clusters. --- src/hb-coretext.cc | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/hb-coretext.cc b/src/hb-coretext.cc index 8081bfc68..8caff4816 100644 --- a/src/hb-coretext.cc +++ b/src/hb-coretext.cc @@ -740,12 +740,17 @@ retry: 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(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 @@ retry: } } + /* 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 @@ retry: /* 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))