[kerx] Implement Format4 action_type=2 coordinate-based attachment

Untested.
This commit is contained in:
Behdad Esfahbod 2018-10-11 01:17:57 -04:00
parent 1622ba5943
commit b6bc0d4ff6
1 changed files with 12 additions and 9 deletions

View File

@ -343,6 +343,7 @@ struct KerxSubTableFormat4
if (mark_set && entry->data.ankrActionIndex != 0xFFFF) if (mark_set && entry->data.ankrActionIndex != 0xFFFF)
{ {
hb_glyph_position_t &o = buffer->cur_pos();
switch (action_type) switch (action_type)
{ {
case 0: /* Control Point Actions.*/ case 0: /* Control Point Actions.*/
@ -373,12 +374,9 @@ struct KerxSubTableFormat4
currAnchorPoint, currAnchorPoint,
c->face->get_num_glyphs (), c->face->get_num_glyphs (),
c->ankr_end); c->ankr_end);
hb_glyph_position_t &o = buffer->cur_pos();
o.x_offset = c->font->em_scale_x (markAnchor.xCoordinate) - c->font->em_scale_x (currAnchor.xCoordinate); o.x_offset = c->font->em_scale_x (markAnchor.xCoordinate) - c->font->em_scale_x (currAnchor.xCoordinate);
o.y_offset = c->font->em_scale_y (markAnchor.yCoordinate) - c->font->em_scale_y (currAnchor.yCoordinate); o.y_offset = c->font->em_scale_y (markAnchor.yCoordinate) - c->font->em_scale_y (currAnchor.yCoordinate);
o.attach_type() = ATTACH_TYPE_MARK;
o.attach_chain() = (int) mark - (int) buffer->idx;
buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT;
} }
break; break;
@ -387,14 +385,19 @@ struct KerxSubTableFormat4
const FWORD *data = (const FWORD *) &ankrData[entry->data.ankrActionIndex]; const FWORD *data = (const FWORD *) &ankrData[entry->data.ankrActionIndex];
if (!c->sanitizer.check_array (data, 4)) if (!c->sanitizer.check_array (data, 4))
return false; return false;
HB_UNUSED int markX = *data++; int markX = *data++;
HB_UNUSED int markY = *data++; int markY = *data++;
HB_UNUSED int currX = *data++; int currX = *data++;
HB_UNUSED int currY = *data++; int currY = *data++;
/* TODO */
o.x_offset = c->font->em_scale_x (markX) - c->font->em_scale_x (currX);
o.y_offset = c->font->em_scale_y (markY) - c->font->em_scale_y (currY);
} }
break; break;
} }
o.attach_type() = ATTACH_TYPE_MARK;
o.attach_chain() = (int) mark - (int) buffer->idx;
buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT;
} }
if (flags & Mark) if (flags & Mark)