[CoreText] Ensure cluster indices in output buffer are non-decreasing.
Does not provide Uniscribe-compatible results, but should at least avoid breaking hb-view due to out-of-order cluster values. For RTL runs, ensure cluster values are non-increasing (instead of non-decreasing).
This commit is contained in:
parent
441d3bb7de
commit
ac2085d4b3
|
@ -319,5 +319,42 @@ _hb_coretext_shape (hb_font_t *font,
|
|||
pos->y_offset = info->var2.u32;
|
||||
}
|
||||
|
||||
// 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.
|
||||
// This does *not* mean we'll form the same clusters as Uniscribe
|
||||
// or the native OT backend, only that the cluster indices will be
|
||||
// non-decreasing in the output buffer.
|
||||
if (HB_DIRECTION_IS_FORWARD (buffer->props.direction)) {
|
||||
unsigned int prev_cluster = 0;
|
||||
for (unsigned int i = 0; i < count; i++) {
|
||||
unsigned int curr_cluster = buffer->info[i].cluster;
|
||||
if (curr_cluster < prev_cluster) {
|
||||
for (unsigned int j = i; j > 0; j--) {
|
||||
if (buffer->info[j - 1].cluster > curr_cluster)
|
||||
buffer->info[j - 1].cluster = curr_cluster;
|
||||
else
|
||||
break;
|
||||
}
|
||||
}
|
||||
prev_cluster = curr_cluster;
|
||||
}
|
||||
} else {
|
||||
// For RTL runs, we make them non-increasing instead.
|
||||
unsigned int prev_cluster = (unsigned int)-1;
|
||||
for (unsigned int i = 0; i < count; i++) {
|
||||
unsigned int curr_cluster = buffer->info[i].cluster;
|
||||
if (curr_cluster > prev_cluster) {
|
||||
for (unsigned int j = i; j > 0; j--) {
|
||||
if (buffer->info[j - 1].cluster < curr_cluster)
|
||||
buffer->info[j - 1].cluster = curr_cluster;
|
||||
else
|
||||
break;
|
||||
}
|
||||
}
|
||||
prev_cluster = curr_cluster;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue