From d5bd0590ae2fbc7b0dee86385a565aef00ffb835 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 18 Oct 2013 16:44:54 +0200 Subject: [PATCH] Zero marks by GDEF for Tibetan See: http://lists.freedesktop.org/archives/harfbuzz/2013-April/003101.html --- src/hb-ot-layout-gsubgpos-private.hh | 4 ++-- src/hb-ot-shape-complex-arabic.cc | 10 +++++++--- src/hb-ot-shape-complex-default.cc | 17 ++++++++++++++++- src/hb-ot-shape-complex-indic.cc | 8 +++++++- src/hb-ot-shape-complex-myanmar.cc | 15 ++++++++++----- src/hb-ot-shape-complex-private.hh | 8 ++++++-- src/hb-ot-shape-complex-sea.cc | 14 ++++++++++---- src/hb-ot-shape-complex-thai.cc | 9 ++++++++- src/hb-ot-shape.cc | 4 ++-- 9 files changed, 68 insertions(+), 21 deletions(-) diff --git a/src/hb-ot-layout-gsubgpos-private.hh b/src/hb-ot-layout-gsubgpos-private.hh index 16c96fafb..7fa324700 100644 --- a/src/hb-ot-layout-gsubgpos-private.hh +++ b/src/hb-ot-layout-gsubgpos-private.hh @@ -616,8 +616,8 @@ struct hb_apply_context_t } inline void _set_glyph_props (hb_codepoint_t glyph_index, - unsigned int class_guess = 0, - bool ligature = false) const + unsigned int class_guess = 0, + bool ligature = false) const { unsigned int add_in = _hb_glyph_info_get_glyph_props (&buffer->cur()) & HB_OT_LAYOUT_GLYPH_PROPS_PRESERVE; diff --git a/src/hb-ot-shape-complex-arabic.cc b/src/hb-ot-shape-complex-arabic.cc index 4f6c86e8e..212b71481 100644 --- a/src/hb-ot-shape-complex-arabic.cc +++ b/src/hb-ot-shape-complex-arabic.cc @@ -177,8 +177,6 @@ collect_features_arabic (hb_ot_shape_planner_t *plan) * * This also makes Arial Bold in Windows7 work. See: * https://bugzilla.mozilla.org/show_bug.cgi?id=644184 - * - * TODO: Add test cases for these two. */ map->add_gsub_pause (nuke_joiners); @@ -357,6 +355,12 @@ retry: arabic_fallback_plan_shape (fallback_plan, font, buffer); } +static hb_ot_shape_zero_width_marks_t +zero_width_marks_preference_arabic (const hb_segment_properties_t *props HB_UNUSED) +{ + return HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE; +} + const hb_ot_complex_shaper_t _hb_ot_complex_shaper_arabic = { @@ -370,6 +374,6 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_arabic = NULL, /* decompose */ NULL, /* compose */ setup_masks_arabic, - HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE, + zero_width_marks_preference_arabic, true, /* fallback_position */ }; diff --git a/src/hb-ot-shape-complex-default.cc b/src/hb-ot-shape-complex-default.cc index d6afa0e1c..946825d7d 100644 --- a/src/hb-ot-shape-complex-default.cc +++ b/src/hb-ot-shape-complex-default.cc @@ -203,6 +203,21 @@ compose_default (const hb_ot_shape_normalize_context_t *c, return found; } +static hb_ot_shape_zero_width_marks_t +zero_width_marks_preference_default (const hb_segment_properties_t *props) +{ + switch ((hb_tag_t) props->script) + { + /* Unicode-2.0 additions */ + case HB_SCRIPT_TIBETAN: + return HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE; + + default: + return HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_UNICODE_LATE; + } +} + + const hb_ot_complex_shaper_t _hb_ot_complex_shaper_default = { "default", @@ -215,6 +230,6 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_default = NULL, /* decompose */ compose_default, NULL, /* setup_masks */ - HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_UNICODE_LATE, + zero_width_marks_preference_default, true, /* fallback_position */ }; diff --git a/src/hb-ot-shape-complex-indic.cc b/src/hb-ot-shape-complex-indic.cc index 9a8b4e38e..f30e593ed 100644 --- a/src/hb-ot-shape-complex-indic.cc +++ b/src/hb-ot-shape-complex-indic.cc @@ -1791,6 +1791,12 @@ compose_indic (const hb_ot_shape_normalize_context_t *c, return c->unicode->compose (a, b, ab); } +static hb_ot_shape_zero_width_marks_t +zero_width_marks_preference_indic (const hb_segment_properties_t *props HB_UNUSED) +{ + return HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE; +} + const hb_ot_complex_shaper_t _hb_ot_complex_shaper_indic = { @@ -1804,6 +1810,6 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_indic = decompose_indic, compose_indic, setup_masks_indic, - HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE, + zero_width_marks_preference_indic, false, /* fallback_position */ }; diff --git a/src/hb-ot-shape-complex-myanmar.cc b/src/hb-ot-shape-complex-myanmar.cc index a32405a82..6cd7a2cb7 100644 --- a/src/hb-ot-shape-complex-myanmar.cc +++ b/src/hb-ot-shape-complex-myanmar.cc @@ -263,6 +263,12 @@ set_myanmar_properties (hb_glyph_info_t &info) +static hb_ot_shape_normalization_mode_t +normalization_preference_myanmar (const hb_segment_properties_t *props HB_UNUSED) +{ + return HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT; +} + static void setup_masks_myanmar (const hb_ot_shape_plan_t *plan HB_UNUSED, hb_buffer_t *buffer, @@ -519,11 +525,10 @@ final_reordering (const hb_ot_shape_plan_t *plan, HB_BUFFER_DEALLOCATE_VAR (buffer, myanmar_position); } - -static hb_ot_shape_normalization_mode_t -normalization_preference_myanmar (const hb_segment_properties_t *props HB_UNUSED) +static hb_ot_shape_zero_width_marks_t +zero_width_marks_preference_myanmar (const hb_segment_properties_t *props HB_UNUSED) { - return HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT; + return HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY; } @@ -539,6 +544,6 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_myanmar = NULL, /* decompose */ NULL, /* compose */ setup_masks_myanmar, - HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY, + zero_width_marks_preference_myanmar, false, /* fallback_position */ }; diff --git a/src/hb-ot-shape-complex-private.hh b/src/hb-ot-shape-complex-private.hh index ac0072ba5..3109516aa 100644 --- a/src/hb-ot-shape-complex-private.hh +++ b/src/hb-ot-shape-complex-private.hh @@ -39,7 +39,7 @@ #define complex_var_u8_1() var2.u8[3] -enum hb_ot_shape_zero_width_marks_type_t { +enum hb_ot_shape_zero_width_marks_t { HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE, // HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_UNICODE_EARLY, HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_UNICODE_LATE, @@ -140,7 +140,11 @@ struct hb_ot_complex_shaper_t hb_buffer_t *buffer, hb_font_t *font); - hb_ot_shape_zero_width_marks_type_t zero_width_marks; + /* zero_width_marks_preference() + * Called during shape(). + */ + hb_ot_shape_zero_width_marks_t + (*zero_width_marks_preference) (const hb_segment_properties_t *props); bool fallback_position; }; diff --git a/src/hb-ot-shape-complex-sea.cc b/src/hb-ot-shape-complex-sea.cc index da687ed64..69d6678c6 100644 --- a/src/hb-ot-shape-complex-sea.cc +++ b/src/hb-ot-shape-complex-sea.cc @@ -162,6 +162,12 @@ set_sea_properties (hb_glyph_info_t &info) } +static hb_ot_shape_normalization_mode_t +normalization_preference_sea (const hb_segment_properties_t *props HB_UNUSED) +{ + return HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT; +} + static void setup_masks_sea (const hb_ot_shape_plan_t *plan HB_UNUSED, hb_buffer_t *buffer, @@ -360,10 +366,10 @@ final_reordering (const hb_ot_shape_plan_t *plan, } -static hb_ot_shape_normalization_mode_t -normalization_preference_sea (const hb_segment_properties_t *props HB_UNUSED) +static hb_ot_shape_zero_width_marks_t +zero_width_marks_preference_sea (const hb_segment_properties_t *props HB_UNUSED) { - return HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT; + return HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE; } @@ -379,6 +385,6 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_sea = NULL, /* decompose */ NULL, /* compose */ setup_masks_sea, - HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE, + zero_width_marks_preference_sea, false, /* fallback_position */ }; diff --git a/src/hb-ot-shape-complex-thai.cc b/src/hb-ot-shape-complex-thai.cc index 45945339d..955fc4477 100644 --- a/src/hb-ot-shape-complex-thai.cc +++ b/src/hb-ot-shape-complex-thai.cc @@ -361,6 +361,13 @@ preprocess_text_thai (const hb_ot_shape_plan_t *plan, do_thai_pua_shaping (plan, buffer, font); } +static hb_ot_shape_zero_width_marks_t +zero_width_marks_preference_thai (const hb_segment_properties_t *props HB_UNUSED) +{ + return HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_UNICODE_LATE; +} + + const hb_ot_complex_shaper_t _hb_ot_complex_shaper_thai = { "thai", @@ -373,6 +380,6 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_thai = NULL, /* decompose */ NULL, /* compose */ NULL, /* setup_masks */ - HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_UNICODE_LATE, + zero_width_marks_preference_thai, false,/* fallback_position */ }; diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc index 02966438b..76c0fe314 100644 --- a/src/hb-ot-shape.cc +++ b/src/hb-ot-shape.cc @@ -441,7 +441,7 @@ hb_ot_position_complex (hb_ot_shape_context_t *c) bool ret = false; unsigned int count = c->buffer->len; - switch (c->plan->shaper->zero_width_marks) + switch (c->plan->shaper->zero_width_marks_preference (&c->plan->props)) { case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY: zero_mark_widths_by_gdef (c->buffer); @@ -483,7 +483,7 @@ hb_ot_position_complex (hb_ot_shape_context_t *c) ret = true; } - switch (c->plan->shaper->zero_width_marks) + switch (c->plan->shaper->zero_width_marks_preference (&c->plan->props)) { case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_UNICODE_LATE: zero_mark_widths_by_unicode (c->buffer);