From 9748ae7299330f0245e97f7b1f18cd1207043e62 Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Tue, 11 Aug 2020 17:52:48 +0430 Subject: [PATCH] Revert "Reordering fails when GDEF table is absent #2140" This reverts commit f4cd99f28eefe695b86876736166fd119e22e04e. As requested in https://github.com/harfbuzz/harfbuzz/issues/2516#issuecomment-670969185 --- src/hb-ot-layout-gsubgpos.hh | 35 ++++++++++++++++------------------- src/hb-ot-layout.hh | 8 ++++---- 2 files changed, 20 insertions(+), 23 deletions(-) diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index 6969d7870..ba239628c 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -624,56 +624,53 @@ struct hb_ot_apply_context_t : return true; } - void _set_glyph_class (hb_codepoint_t glyph_index, - unsigned int class_guess = 0, - bool ligature = false, - bool component = false) const + void _set_glyph_props (hb_codepoint_t glyph_index, + unsigned int class_guess = 0, + bool ligature = false, + bool component = false) const { - unsigned int props = _hb_glyph_info_get_glyph_props (&buffer->cur()); - - props |= HB_OT_LAYOUT_GLYPH_PROPS_SUBSTITUTED; + unsigned int add_in = _hb_glyph_info_get_glyph_props (&buffer->cur()) & + HB_OT_LAYOUT_GLYPH_PROPS_PRESERVE; + add_in |= HB_OT_LAYOUT_GLYPH_PROPS_SUBSTITUTED; if (ligature) { - props |= HB_OT_LAYOUT_GLYPH_PROPS_LIGATED; + add_in |= HB_OT_LAYOUT_GLYPH_PROPS_LIGATED; /* In the only place that the MULTIPLIED bit is used, Uniscribe * seems to only care about the "last" transformation between * Ligature and Multiple substitutions. Ie. if you ligate, expand, * and ligate again, it forgives the multiplication and acts as * if only ligation happened. As such, clear MULTIPLIED bit. */ - props &= ~HB_OT_LAYOUT_GLYPH_PROPS_MULTIPLIED; + add_in &= ~HB_OT_LAYOUT_GLYPH_PROPS_MULTIPLIED; } if (component) - props |= HB_OT_LAYOUT_GLYPH_PROPS_MULTIPLIED; - + add_in |= HB_OT_LAYOUT_GLYPH_PROPS_MULTIPLIED; if (likely (has_glyph_classes)) - props = (props & ~HB_OT_LAYOUT_GLYPH_PROPS_CLASS_MASK) | gdef.get_glyph_props (glyph_index); + _hb_glyph_info_set_glyph_props (&buffer->cur(), add_in | gdef.get_glyph_props (glyph_index)); else if (class_guess) - props = (props & ~HB_OT_LAYOUT_GLYPH_PROPS_CLASS_MASK) | class_guess; - - _hb_glyph_info_set_glyph_props (&buffer->cur(), props); + _hb_glyph_info_set_glyph_props (&buffer->cur(), add_in | class_guess); } void replace_glyph (hb_codepoint_t glyph_index) const { - _set_glyph_class (glyph_index); + _set_glyph_props (glyph_index); buffer->replace_glyph (glyph_index); } void replace_glyph_inplace (hb_codepoint_t glyph_index) const { - _set_glyph_class (glyph_index); + _set_glyph_props (glyph_index); buffer->cur().codepoint = glyph_index; } void replace_glyph_with_ligature (hb_codepoint_t glyph_index, unsigned int class_guess) const { - _set_glyph_class (glyph_index, class_guess, true); + _set_glyph_props (glyph_index, class_guess, true); buffer->replace_glyph (glyph_index); } void output_glyph_for_component (hb_codepoint_t glyph_index, unsigned int class_guess) const { - _set_glyph_class (glyph_index, class_guess, false, true); + _set_glyph_props (glyph_index, class_guess, false, true); buffer->output_glyph (glyph_index); } }; diff --git a/src/hb-ot-layout.hh b/src/hb-ot-layout.hh index 4e052b0c2..f3bb15581 100644 --- a/src/hb-ot-layout.hh +++ b/src/hb-ot-layout.hh @@ -80,14 +80,14 @@ enum hb_ot_layout_glyph_props_flags_t HB_OT_LAYOUT_GLYPH_PROPS_LIGATURE = 0x04u, HB_OT_LAYOUT_GLYPH_PROPS_MARK = 0x08u, - HB_OT_LAYOUT_GLYPH_PROPS_CLASS_MASK = HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH | - HB_OT_LAYOUT_GLYPH_PROPS_LIGATURE | - HB_OT_LAYOUT_GLYPH_PROPS_MARK, - /* The following are used internally; not derived from GDEF. */ HB_OT_LAYOUT_GLYPH_PROPS_SUBSTITUTED = 0x10u, HB_OT_LAYOUT_GLYPH_PROPS_LIGATED = 0x20u, HB_OT_LAYOUT_GLYPH_PROPS_MULTIPLIED = 0x40u, + + HB_OT_LAYOUT_GLYPH_PROPS_PRESERVE = HB_OT_LAYOUT_GLYPH_PROPS_SUBSTITUTED | + HB_OT_LAYOUT_GLYPH_PROPS_LIGATED | + HB_OT_LAYOUT_GLYPH_PROPS_MULTIPLIED }; HB_MARK_AS_FLAG_T (hb_ot_layout_glyph_props_flags_t);