From 7fe0e28c22331a353d396f8bc1e3a60f1580a96d Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 26 Sep 2016 17:51:47 +0100 Subject: [PATCH] [MATH] Start fleshing out glyph variant API --- src/hb-font-private.hh | 4 ++ src/hb-ot-layout-math-table.hh | 10 ++--- src/hb-ot-layout.cc | 75 ++++++++++++---------------------- src/hb-ot-layout.h | 20 +++++++++ src/hb-ot-math.h | 18 ++++++++ 5 files changed, 72 insertions(+), 55 deletions(-) diff --git a/src/hb-font-private.hh b/src/hb-font-private.hh index 0b7557794..07bc90093 100644 --- a/src/hb-font-private.hh +++ b/src/hb-font-private.hh @@ -118,6 +118,10 @@ struct hb_font_t { /* Convert from font-space to user-space */ inline hb_position_t em_scale_x (int16_t v) { return em_scale (v, this->x_scale); } inline hb_position_t em_scale_y (int16_t v) { return em_scale (v, this->y_scale); } + inline hb_position_t em_scale_dir (int16_t v, hb_direction_t direction) + { return em_scale (v, + HB_DIRECTION_IS_VERTICAL(direction) ? + this->y_scale : this->x_scale); } /* Convert from parent-font user-space to our user-space */ inline hb_position_t parent_scale_x_distance (hb_position_t v) { diff --git a/src/hb-ot-layout-math-table.hh b/src/hb-ot-layout-math-table.hh index bec53f36d..81fc1b009 100644 --- a/src/hb-ot-layout-math-table.hh +++ b/src/hb-ot-layout-math-table.hh @@ -582,13 +582,9 @@ struct MathVariants sanitize_offsets (c)); } - inline hb_position_t get_min_connector_overlap (hb_font_t *font, - bool horizontal) const - { - return horizontal ? - font->em_scale_x (minConnectorOverlap) : - font->em_scale_y (minConnectorOverlap); - } + inline hb_position_t get_min_connector_overlap (hb_direction_t direction, + hb_font_t *font) const + { return font->em_scale_dir (minConnectorOverlap, direction); } inline bool get_glyph_construction (hb_codepoint_t glyph, diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc index e92d38b0b..eeebb5d77 100644 --- a/src/hb-ot-layout.cc +++ b/src/hb-ot-layout.cc @@ -1279,7 +1279,7 @@ hb_ot_layout_get_math_constant (hb_font_t *font, * * Since: 1.4 **/ -HB_EXTERN hb_position_t +hb_position_t hb_ot_layout_get_math_italics_correction (hb_font_t *font, hb_codepoint_t glyph) { @@ -1297,7 +1297,7 @@ hb_ot_layout_get_math_italics_correction (hb_font_t *font, * * Since: 1.4 **/ -HB_EXTERN hb_position_t +hb_position_t hb_ot_layout_get_math_top_accent_attachment (hb_font_t *font, hb_codepoint_t glyph) { @@ -1315,7 +1315,7 @@ hb_ot_layout_get_math_top_accent_attachment (hb_font_t *font, * * Since: 1.4 **/ -HB_EXTERN hb_bool_t +hb_bool_t hb_ot_layout_is_math_extended_shape (hb_face_t *face, hb_codepoint_t glyph) { @@ -1351,56 +1351,35 @@ hb_ot_layout_get_math_kerning (hb_font_t *font, return math.get_math_glyph_info().get_kerning (glyph, kern, correction_height, font); } -#if 0 -/** - * hb_ot_layout_get_math_italic_correction_for_glyph_assembly: - * @font: an #hb_font_t with an OpenType MATH table - * @base_glyph: index of the glyph to stretch - * @horizontal: direction of the stretching - * - * This function tries and get the italic correction associated to the glyph - * assembly used to stretch the base glyph in the specified direction. - * - * Return value: the italic correction of the glyph assembly or 0 - * - * Since: ???? - **/ -HB_EXTERN hb_position_t -hb_ot_layout_get_math_italic_correction_for_glyph_assembly (hb_font_t *font, - hb_codepoint_t base_glyph, - hb_bool_t horizontal) +HB_EXTERN unsigned int +hb_ot_layout_get_math_glyph_variants (hb_font_t *font, + hb_codepoint_t glyph, + hb_direction_t direction, + unsigned int start_offset, + unsigned int *variant_count, /* IN/OUT */ + hb_math_glyph_variant_t *variants /* OUT */) { const OT::MATH &math = _get_math (font->face); - - if (math.has_math_variants()) { - const OT::MathGlyphConstruction* glyph_construction; - if (math.get_math_variants(). - get_glyph_construction(base_glyph, horizontal, glyph_construction) && - glyph_construction->has_glyph_assembly()) - return glyph_construction-> - get_glyph_assembly().get_italic_correction(font); - } - return 0; } -HB_INTERNAL hb_bool_t -hb_ot_layout_get_math_glyph_construction (hb_font_t *font, - hb_codepoint_t glyph, - hb_bool_t horizontal, - hb_position_t &minConnectorOverlap, - const OT::MathGlyphConstruction *&glyph_construction) +hb_position_t +hb_ot_layout_get_math_min_connector_overlap (hb_font_t *font, + hb_direction_t direction) { const OT::MATH &math = _get_math (font->face); - - if (!math.has_math_variants()) return false; - - const OT::MathVariants &mathVariants = math.get_math_variants(); - if (!mathVariants.get_glyph_construction(glyph, horizontal, - glyph_construction)) return false; - - minConnectorOverlap = mathVariants.get_min_connector_overlap(font, horizontal); - - return true; + return math.get_math_variants().get_min_connector_overlap (direction, font); +} + +HB_EXTERN unsigned int +hb_ot_layout_get_math_glyph_assembly_parts (hb_font_t *font, + hb_codepoint_t glyph, + hb_direction_t direction, + unsigned int start_offset, + unsigned int *parts_count, /* IN/OUT */ + hb_math_glyph_part_t *parts, /* OUT */ + hb_position_t *italic_correction /* OUT */) +{ + const OT::MATH &math = _get_math (font->face); + return 0; } -#endif diff --git a/src/hb-ot-layout.h b/src/hb-ot-layout.h index 9c1c57bb4..8eb8d6cbd 100644 --- a/src/hb-ot-layout.h +++ b/src/hb-ot-layout.h @@ -328,6 +328,26 @@ hb_ot_layout_get_math_kerning (hb_font_t *font, hb_ot_math_kern_t kern, hb_position_t correction_height); +HB_EXTERN unsigned int +hb_ot_layout_get_math_glyph_variants (hb_font_t *font, + hb_codepoint_t glyph, + hb_direction_t direction, + unsigned int start_offset, + unsigned int *variant_count, /* IN/OUT */ + hb_math_glyph_variant_t *variants /* OUT */); + +HB_EXTERN hb_position_t +hb_ot_layout_get_math_min_connector_overlap (hb_font_t *font, + hb_direction_t direction); + +HB_EXTERN unsigned int +hb_ot_layout_get_math_glyph_assembly_parts (hb_font_t *font, + hb_codepoint_t glyph, + hb_direction_t direction, + unsigned int start_offset, + unsigned int *parts_count, /* IN/OUT */ + hb_math_glyph_part_t *parts, /* OUT */ + hb_position_t *italic_correction /* OUT */); HB_END_DECLS diff --git a/src/hb-ot-math.h b/src/hb-ot-math.h index a62b4b612..bf37975d2 100644 --- a/src/hb-ot-math.h +++ b/src/hb-ot-math.h @@ -102,6 +102,24 @@ typedef enum { HB_OT_MATH_KERN_BOTTOM_LEFT = 3 } hb_ot_math_kern_t; +typedef struct hb_math_glyph_variant_t { + hb_codepoint_t glyph; + hb_position_t advance; +} hb_math_glyph_variant_t; + +typedef enum { /*< flags >*/ + HB_MATH_GLYPH_PART_FLAG_EXTENDER = 0x00000001u /* Extender glyph */ +} hb_math_glyph_part_flags_t; + +typedef struct hb_math_glyph_part_t { + hb_codepoint_t glyph; + hb_position_t start_connector_length; + hb_position_t end_connector_length; + hb_position_t full_advance; + hb_math_glyph_part_flags_t flags; +} hb_math_glyph_part_t; + + HB_END_DECLS #endif /* HB_OT_MATH_H */