< prev index next >
src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-map.cc
Print this page
*** 83,92 ****
--- 83,93 ----
hb_face_t *face,
unsigned int table_index,
unsigned int feature_index,
unsigned int variations_index,
hb_mask_t mask,
+ bool auto_zwnj,
bool auto_zwj)
{
unsigned int lookup_indices[32];
unsigned int offset, len;
unsigned int table_lookup_count;
*** 110,119 ****
--- 111,121 ----
hb_ot_map_t::lookup_map_t *lookup = m.lookups[table_index].push ();
if (unlikely (!lookup))
return;
lookup->mask = mask;
lookup->index = lookup_indices[i];
+ lookup->auto_zwnj = auto_zwnj;
lookup->auto_zwj = auto_zwj;
}
offset += len;
} while (len == ARRAY_LENGTH (lookup_indices));
*** 134,144 ****
void
hb_ot_map_builder_t::compile (hb_ot_map_t &m,
const int *coords,
unsigned int num_coords)
{
! m.global_mask = 1;
unsigned int required_feature_index[2];
hb_tag_t required_feature_tag[2];
/* We default to applying required feature in stage 0. If the required
* feature has a tag that is known to the shaper, we apply required feature
--- 136,150 ----
void
hb_ot_map_builder_t::compile (hb_ot_map_t &m,
const int *coords,
unsigned int num_coords)
{
! static_assert ((!(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];
/* We default to applying required feature in stage 0. If the required
* feature has a tag that is known to the shaper, we apply required feature
*** 186,196 ****
feature_infos.shrink (j + 1);
}
/* Allocate bits now */
! unsigned int next_bit = 1;
for (unsigned int i = 0; i < feature_infos.len; i++)
{
const feature_info_t *info = &feature_infos[i];
unsigned int bits_needed;
--- 192,203 ----
feature_infos.shrink (j + 1);
}
/* Allocate bits now */
! unsigned int next_bit = global_bit_shift + 1;
!
for (unsigned int i = 0; i < feature_infos.len; i++)
{
const feature_info_t *info = &feature_infos[i];
unsigned int bits_needed;
*** 241,255 ****
map->tag = info->tag;
map->index[0] = feature_index[0];
map->index[1] = feature_index[1];
map->stage[0] = info->stage[0];
map->stage[1] = info->stage[1];
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;
} else {
map->shift = next_bit;
map->mask = (1u << (next_bit + bits_needed)) - (1u << next_bit);
next_bit += bits_needed;
m.global_mask |= (info->default_value << map->shift) & map->mask;
--- 248,263 ----
map->tag = info->tag;
map->index[0] = feature_index[0];
map->index[1] = feature_index[1];
map->stage[0] = info->stage[0];
map->stage[1] = info->stage[1];
+ map->auto_zwnj = !(info->flags & F_MANUAL_ZWNJ);
map->auto_zwj = !(info->flags & F_MANUAL_ZWJ);
if ((info->flags & F_GLOBAL) && info->max_value == 1) {
/* Uses the global bit */
! 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);
next_bit += bits_needed;
m.global_mask |= (info->default_value << map->shift) & map->mask;
*** 259,270 ****
}
feature_infos.shrink (0); /* Done with these */
! add_gsub_pause (NULL);
! add_gpos_pause (NULL);
for (unsigned int table_index = 0; table_index < 2; table_index++)
{
/* Collect lookup indices for features */
--- 267,278 ----
}
feature_infos.shrink (0); /* Done with these */
! add_gsub_pause (nullptr);
! add_gpos_pause (nullptr);
for (unsigned int table_index = 0; table_index < 2; table_index++)
{
/* Collect lookup indices for features */
*** 282,300 ****
if (required_feature_index[table_index] != HB_OT_LAYOUT_NO_FEATURE_INDEX &&
required_feature_stage[table_index] == stage)
add_lookups (m, face, table_index,
required_feature_index[table_index],
variations_index,
! 1 /* mask */,
! true /* auto_zwj */);
for (unsigned i = 0; i < m.features.len; i++)
if (m.features[i].stage[table_index] == stage)
add_lookups (m, face, table_index,
m.features[i].index[table_index],
variations_index,
m.features[i].mask,
m.features[i].auto_zwj);
/* Sort lookups and merge duplicates */
if (last_num_lookups < m.lookups[table_index].len)
{
--- 290,308 ----
if (required_feature_index[table_index] != HB_OT_LAYOUT_NO_FEATURE_INDEX &&
required_feature_stage[table_index] == stage)
add_lookups (m, face, table_index,
required_feature_index[table_index],
variations_index,
! global_bit_mask);
for (unsigned i = 0; i < m.features.len; i++)
if (m.features[i].stage[table_index] == stage)
add_lookups (m, face, table_index,
m.features[i].index[table_index],
variations_index,
m.features[i].mask,
+ m.features[i].auto_zwnj,
m.features[i].auto_zwj);
/* Sort lookups and merge duplicates */
if (last_num_lookups < m.lookups[table_index].len)
{
*** 305,314 ****
--- 313,323 ----
if (m.lookups[table_index][i].index != m.lookups[table_index][j].index)
m.lookups[table_index][++j] = m.lookups[table_index][i];
else
{
m.lookups[table_index][j].mask |= m.lookups[table_index][i].mask;
+ m.lookups[table_index][j].auto_zwnj &= m.lookups[table_index][i].auto_zwnj;
m.lookups[table_index][j].auto_zwj &= m.lookups[table_index][i].auto_zwj;
}
m.lookups[table_index].shrink (j + 1);
}
< prev index next >