From 3357d145f81cb7b746c910018fe3a0dfab00972c Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 27 Oct 2010 12:30:46 -0400 Subject: [PATCH] Implement vertical support in get_lig_carets() --- src/hb-ot-layout-gdef-private.hh | 34 ++++++++++++++++++---------------- src/hb-ot-layout.cc | 3 ++- src/hb-ot-layout.h | 1 + 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/src/hb-ot-layout-gdef-private.hh b/src/hb-ot-layout-gdef-private.hh index 52d528a..c7bd738 100644 --- a/src/hb-ot-layout-gdef-private.hh +++ b/src/hb-ot-layout-gdef-private.hh @@ -94,10 +94,9 @@ struct CaretValueFormat1 friend struct CaretValue; private: - inline int get_caret_value (hb_ot_layout_context_t *c, hb_codepoint_t glyph_id HB_UNUSED) const + inline int get_caret_value (hb_ot_layout_context_t *c, hb_direction_t direction, hb_codepoint_t glyph_id HB_UNUSED) const { - /* TODO vertical */ - return c->scale_x (coordinate); + return HB_DIRECTION_IS_HORIZONTAL (direction) ? c->scale_x (coordinate) : c->scale_y (coordinate); } inline bool sanitize (hb_sanitize_context_t *c) { @@ -117,12 +116,11 @@ struct CaretValueFormat2 friend struct CaretValue; private: - inline int get_caret_value (hb_ot_layout_context_t *c, hb_codepoint_t glyph_id) const + inline int get_caret_value (hb_ot_layout_context_t *c, hb_direction_t direction, hb_codepoint_t glyph_id) const { - /* TODO vertical */ hb_position_t x, y; if (hb_font_get_contour_point (c->font, c->face, caretValuePoint, glyph_id, &x, &y)) - return x; + return HB_DIRECTION_IS_HORIZONTAL (direction) ? x : y; else return 0; } @@ -143,10 +141,11 @@ struct CaretValueFormat3 { friend struct CaretValue; - inline int get_caret_value (hb_ot_layout_context_t *c, hb_codepoint_t glyph_id HB_UNUSED) const + inline int get_caret_value (hb_ot_layout_context_t *c, hb_direction_t direction, hb_codepoint_t glyph_id) const { - /* TODO vertical */ - return c->scale_x (coordinate) + ((this+deviceTable).get_x_delta (c)); + return HB_DIRECTION_IS_HORIZONTAL (direction) ? + c->scale_x (coordinate) + (this+deviceTable).get_x_delta (c) : + c->scale_y (coordinate) + (this+deviceTable).get_y_delta (c); } inline bool sanitize (hb_sanitize_context_t *c) { @@ -168,12 +167,12 @@ struct CaretValueFormat3 struct CaretValue { - inline int get_caret_value (hb_ot_layout_context_t *c, hb_codepoint_t glyph_id) const + inline int get_caret_value (hb_ot_layout_context_t *c, hb_direction_t direction, hb_codepoint_t glyph_id) const { switch (u.format) { - case 1: return u.format1.get_caret_value (c, glyph_id); - case 2: return u.format2.get_caret_value (c, glyph_id); - case 3: return u.format3.get_caret_value (c, glyph_id); + case 1: return u.format1.get_caret_value (c, direction, glyph_id); + case 2: return u.format2.get_caret_value (c, direction, glyph_id); + case 3: return u.format3.get_caret_value (c, direction, glyph_id); default:return 0; } } @@ -203,6 +202,7 @@ struct CaretValue struct LigGlyph { inline unsigned int get_lig_carets (hb_ot_layout_context_t *c, + hb_direction_t direction, hb_codepoint_t glyph_id, unsigned int start_offset, unsigned int *caret_count /* IN/OUT */, @@ -212,7 +212,7 @@ struct LigGlyph const OffsetTo *array = carets.sub_array (start_offset, caret_count); unsigned int count = *caret_count; for (unsigned int i = 0; i < count; i++) - caret_array[i] = (this+array[i]).get_caret_value (c, glyph_id); + caret_array[i] = (this+array[i]).get_caret_value (c, direction, glyph_id); } return carets.len; @@ -235,6 +235,7 @@ struct LigGlyph struct LigCaretList { inline unsigned int get_lig_carets (hb_ot_layout_context_t *c, + hb_direction_t direction, hb_codepoint_t glyph_id, unsigned int start_offset, unsigned int *caret_count /* IN/OUT */, @@ -248,7 +249,7 @@ struct LigCaretList return 0; } const LigGlyph &lig_glyph = this+ligGlyph[index]; - return lig_glyph.get_lig_carets (c, glyph_id, start_offset, caret_count, caret_array); + return lig_glyph.get_lig_carets (c, direction, glyph_id, start_offset, caret_count, caret_array); } inline bool sanitize (hb_sanitize_context_t *c) { @@ -350,11 +351,12 @@ struct GDEF inline bool has_lig_carets (void) const { return ligCaretList != 0; } inline unsigned int get_lig_carets (hb_ot_layout_context_t *c, + hb_direction_t direction, hb_codepoint_t glyph_id, unsigned int start_offset, unsigned int *caret_count /* IN/OUT */, int *caret_array /* OUT */) const - { return (this+ligCaretList).get_lig_carets (c, glyph_id, start_offset, caret_count, caret_array); } + { return (this+ligCaretList).get_lig_carets (c, direction, glyph_id, start_offset, caret_count, caret_array); } inline bool has_mark_sets (void) const { return version >= 0x00010002 && markGlyphSetsDef[0] != 0; } inline bool mark_set_covers (unsigned int set_index, hb_codepoint_t glyph_id) const diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc index 5126f37..3028d86 100644 --- a/src/hb-ot-layout.cc +++ b/src/hb-ot-layout.cc @@ -318,6 +318,7 @@ hb_ot_layout_get_attach_points (hb_face_t *face, unsigned int hb_ot_layout_get_lig_carets (hb_font_t *font, hb_face_t *face, + hb_direction_t direction, hb_codepoint_t glyph, unsigned int start_offset, unsigned int *caret_count /* IN/OUT */, @@ -326,7 +327,7 @@ hb_ot_layout_get_lig_carets (hb_font_t *font, hb_ot_layout_context_t c; c.font = font; c.face = face; - return _get_gdef (face).get_lig_carets (&c, glyph, start_offset, caret_count, caret_array); + return _get_gdef (face).get_lig_carets (&c, direction, glyph, start_offset, caret_count, caret_array); } /* diff --git a/src/hb-ot-layout.h b/src/hb-ot-layout.h index e1b6381..9c47435 100644 --- a/src/hb-ot-layout.h +++ b/src/hb-ot-layout.h @@ -86,6 +86,7 @@ hb_ot_layout_get_attach_points (hb_face_t *face, unsigned int hb_ot_layout_get_lig_carets (hb_font_t *font, hb_face_t *face, + hb_direction_t direction, hb_codepoint_t glyph, unsigned int start_offset, unsigned int *caret_count /* IN/OUT */, -- 2.7.4