diff --git a/src/hb-buffer.h b/src/hb-buffer.h index 995191a9d..0869fafea 100644 --- a/src/hb-buffer.h +++ b/src/hb-buffer.h @@ -72,8 +72,9 @@ typedef struct hb_glyph_info_t { } hb_glyph_info_t; typedef enum { /*< flags >*/ - HB_GLYPH_FLAG_UNSAFE_TO_BREAK = 0x00000002, - HB_GLYPH_FLAG_DEFINED = 0x00000002 /* OR of all defined flags */ + HB_GLYPH_FLAG_UNSAFE_TO_BREAK = 0x00000001, + + HB_GLYPH_FLAG_DEFINED = 0x00000001 /* OR of all defined flags */ } hb_glyph_flags_t; /** diff --git a/src/hb-ot-map.cc b/src/hb-ot-map.cc index 174fd529f..5764a1104 100644 --- a/src/hb-ot-map.cc +++ b/src/hb-ot-map.cc @@ -138,7 +138,11 @@ hb_ot_map_builder_t::compile (hb_ot_map_t &m, const int *coords, unsigned int num_coords) { - m.global_mask = 1; + ASSERT_STATIC (!(HB_GLYPH_FLAG_DEFINED & (HB_GLYPH_FLAG_DEFINED + 1))); + unsigned int global_bit_mask = HB_GLYPH_FLAG_DEFINED + 1; + unsigned int global_bit_shift = _hb_popcount32 (HB_GLYPH_FLAG_DEFINED); + + m.global_mask = global_bit_mask; unsigned int required_feature_index[2]; hb_tag_t required_feature_tag[2]; @@ -190,8 +194,7 @@ hb_ot_map_builder_t::compile (hb_ot_map_t &m, /* Allocate bits now */ - unsigned int next_bit = 1; - next_bit++; /* Allocate for HB_GLYPH_FLAG_UNSAFE_TO_BREAK */ + unsigned int next_bit = global_bit_shift + 1; for (unsigned int i = 0; i < feature_infos.len; i++) { @@ -251,8 +254,8 @@ hb_ot_map_builder_t::compile (hb_ot_map_t &m, map->auto_zwj = !(info->flags & F_MANUAL_ZWJ); if ((info->flags & F_GLOBAL) && info->max_value == 1) { /* Uses the global bit */ - map->shift = 0; - map->mask = 1; + map->shift = global_bit_shift; + map->mask = global_bit_mask; } else { map->shift = next_bit; map->mask = (1u << (next_bit + bits_needed)) - (1u << next_bit); @@ -289,7 +292,7 @@ hb_ot_map_builder_t::compile (hb_ot_map_t &m, add_lookups (m, face, table_index, required_feature_index[table_index], variations_index, - 1 /* mask */); + global_bit_mask); for (unsigned i = 0; i < m.features.len; i++) if (m.features[i].stage[table_index] == stage)