[coretext] Use CFRunStatus
Assert that all runs had expected direction, and take hint for non-monotone clusters.
This commit is contained in:
parent
fd1a6aa8d0
commit
10b1104d79
@ -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<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 @@ 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))
|
||||
|
Loading…
Reference in New Issue
Block a user