[kerx] Format

This commit is contained in:
Behdad Esfahbod 2018-11-07 14:11:48 -05:00
parent 649cc3ef27
commit e10a856eb2
1 changed files with 28 additions and 30 deletions

View File

@ -300,10 +300,11 @@ struct KerxSubTableFormat1
for (; i; i--) for (; i; i--)
{ {
unsigned int idx = stack[depth - i]; unsigned int idx = stack[depth - i];
if (idx >= buffer->len) continue;
int v = actions[(i - 1) * tuple_count]; int v = actions[(i - 1) * tuple_count];
/* "The end of the list is marked by an odd value..." /* "The end of the list is marked by an odd value..." Ignore it. */
* Ignore it. */
v &= ~1; v &= ~1;
/* The following flag is undocumented in the spec, but described /* The following flag is undocumented in the spec, but described
@ -314,41 +315,38 @@ struct KerxSubTableFormat1
v = 0; v = 0;
} }
if (idx < buffer->len) if (HB_DIRECTION_IS_HORIZONTAL (buffer->props.direction))
{ {
if (HB_DIRECTION_IS_HORIZONTAL (buffer->props.direction)) if (crossStream)
{ {
if (crossStream) crossOffset += v;
if (!buffer->pos[idx].y_offset)
buffer->pos[idx].y_offset += c->font->em_scale_y (crossOffset);
}
else if (buffer->info[idx].mask & kern_mask)
{
if (!buffer->pos[idx].x_offset)
{ {
crossOffset += v; buffer->pos[idx].x_advance += c->font->em_scale_x (v);
if (!buffer->pos[idx].y_offset) buffer->pos[idx].x_offset += c->font->em_scale_x (v);
buffer->pos[idx].y_offset += c->font->em_scale_y (crossOffset);
}
else if (buffer->info[idx].mask & kern_mask)
{
if (!buffer->pos[idx].x_offset)
{
buffer->pos[idx].x_advance += c->font->em_scale_x (v);
buffer->pos[idx].x_offset += c->font->em_scale_x (v);
}
} }
} }
else }
else
{
if (crossStream)
{ {
if (crossStream) /* CoreText doesn't do crossStream kerning in vertical. We do. */
crossOffset += v;
if (!buffer->pos[idx].x_offset)
buffer->pos[idx].x_offset = c->font->em_scale_x (crossOffset);
}
else if (buffer->info[idx].mask & kern_mask)
{
if (!buffer->pos[idx].y_offset)
{ {
/* CoreText doesn't do crossStream kerning in vertical. We do. */ buffer->pos[idx].y_advance += c->font->em_scale_y (v);
crossOffset += v; buffer->pos[idx].y_offset += c->font->em_scale_y (v);
if (!buffer->pos[idx].x_offset)
buffer->pos[idx].x_offset = c->font->em_scale_x (crossOffset);
}
else if (buffer->info[idx].mask & kern_mask)
{
if (!buffer->pos[idx].y_offset)
{
buffer->pos[idx].y_advance += c->font->em_scale_y (v);
buffer->pos[idx].y_offset += c->font->em_scale_y (v);
}
} }
} }
} }