From 13528d0c78cadb1f67267c9a692558caef9fdaa6 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 27 Oct 2010 14:09:27 -0400 Subject: [PATCH] Supposedly implement vertical support in GPOS Not tested at all. --- src/hb-ot-layout-gpos-private.hh | 27 ++++++++++++++++++++------- src/hb-ot-layout.cc | 39 ++++++++++++++++++++++++--------------- 2 files changed, 44 insertions(+), 22 deletions(-) diff --git a/src/hb-ot-layout-gpos-private.hh b/src/hb-ot-layout-gpos-private.hh index 6be604e..187dc98 100644 --- a/src/hb-ot-layout-gpos-private.hh +++ b/src/hb-ot-layout-gpos-private.hh @@ -855,27 +855,40 @@ struct CursivePosFormat1 (this+this_record.exitAnchor).get_anchor (c->layout, c->buffer->info[i].codepoint, &exit_x, &exit_y); (this+next_record.entryAnchor).get_anchor (c->layout, c->buffer->info[j].codepoint, &entry_x, &entry_y); - /* TODO vertical */ + hb_direction_t direction = c->buffer->props.direction; - /* Align the exit anchor of the left glyph with the entry anchor of the right glyph. */ - if (c->buffer->props.direction == HB_DIRECTION_RTL) + /* Align the exit anchor of the left/top glyph with the entry anchor of the right/bottom glyph + * by adjusting advance of the left/top glyph. */ + if (HB_DIRECTION_IS_BACKWARD (direction)) { - c->buffer->pos[j].x_advance = c->buffer->pos[j].x_offset + entry_x - exit_x; + if (likely (HB_DIRECTION_IS_HORIZONTAL (direction))) + c->buffer->pos[j].x_advance = c->buffer->pos[j].x_offset + entry_x - exit_x; + else + c->buffer->pos[j].y_advance = c->buffer->pos[j].y_offset + entry_y - exit_y; } else { - c->buffer->pos[i].x_advance = c->buffer->pos[i].x_offset + exit_x - entry_x; + if (likely (HB_DIRECTION_IS_HORIZONTAL (direction))) + c->buffer->pos[i].x_advance = c->buffer->pos[i].x_offset + exit_x - entry_x; + else + c->buffer->pos[i].y_advance = c->buffer->pos[i].y_offset + exit_y - entry_y; } if (c->lookup_flag & LookupFlag::RightToLeft) { c->buffer->pos[i].cursive_chain = j - i; - c->buffer->pos[i].y_offset = entry_y - exit_y; + if (likely (HB_DIRECTION_IS_HORIZONTAL (direction))) + c->buffer->pos[i].y_offset = entry_y - exit_y; + else + c->buffer->pos[i].x_offset = entry_x - exit_x; } else { c->buffer->pos[j].cursive_chain = i - j; - c->buffer->pos[j].y_offset = exit_y - entry_y; + if (likely (HB_DIRECTION_IS_HORIZONTAL (direction))) + c->buffer->pos[j].y_offset = exit_y - entry_y; + else + c->buffer->pos[j].x_offset = exit_x - entry_x; } c->buffer->i = j; diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc index 75fa203..f85bf86 100644 --- a/src/hb-ot-layout.cc +++ b/src/hb-ot-layout.cc @@ -607,25 +607,34 @@ hb_ot_layout_position_finish (hb_font_t *font HB_UNUSED, unsigned int i, j; unsigned int len = hb_buffer_get_length (buffer); hb_internal_glyph_position_t *pos = (hb_internal_glyph_position_t *) hb_buffer_get_glyph_positions (buffer); + hb_direction_t direction = buffer->props.direction; /* TODO: Vertical */ - /* Handle cursive connections */ - /* First handle all chain-back connections */ - for (j = 0; j < len; j++) { - if (pos[j].cursive_chain < 0) - { - pos[j].y_offset += pos[j + pos[j].cursive_chain].y_offset; - pos[j].cursive_chain = 0; + /* Handle cursive connections: + * First handle all chain-back connections, then handle all chain-forward connections. */ + if (likely (HB_DIRECTION_IS_HORIZONTAL (direction))) + { + for (j = 0; j < len; j++) { + if (pos[j].cursive_chain < 0) + pos[j].y_offset += pos[j + pos[j].cursive_chain].y_offset; + } + for (i = len; i > 0; i--) { + j = i - 1; + if (pos[j].cursive_chain > 0) + pos[j].y_offset += pos[j + pos[j].cursive_chain].y_offset; } } - /* Then handle all chain-forward connections */ - for (i = len; i > 0; i--) { - j = i - 1; - if (pos[j].cursive_chain > 0) - { - pos[j].y_offset += pos[j + pos[j].cursive_chain].y_offset; - pos[j].cursive_chain = 0; + else + { + for (j = 0; j < len; j++) { + if (pos[j].cursive_chain < 0) + pos[j].x_offset += pos[j + pos[j].cursive_chain].x_offset; + } + for (i = len; i > 0; i--) { + j = i - 1; + if (pos[j].cursive_chain > 0) + pos[j].x_offset += pos[j + pos[j].cursive_chain].x_offset; } } @@ -639,7 +648,7 @@ hb_ot_layout_position_finish (hb_font_t *font HB_UNUSED, pos[i].x_offset += pos[back].x_offset; pos[i].y_offset += pos[back].y_offset; - if (buffer->props.direction == HB_DIRECTION_RTL) + if (HB_DIRECTION_IS_BACKWARD (buffer->props.direction)) for (j = back + 1; j < i + 1; j++) { pos[i].x_offset += pos[j].x_advance; pos[i].y_offset += pos[j].y_advance; -- 2.7.4