mirror of
https://github.com/harfbuzz/harfbuzz.git
synced 2025-04-14 17:13:40 +00:00
[instancer] remap layout var_idxes code update
make hb_collect_variation_indices_context_t only collect layout variation indices.
This commit is contained in:
parent
c8c97864e8
commit
77f24d822e
3 changed files with 28 additions and 52 deletions
|
@ -922,17 +922,32 @@ struct GDEF
|
|||
{ get_lig_caret_list ().collect_variation_indices (c); }
|
||||
|
||||
void remap_layout_variation_indices (const hb_set_t *layout_variation_indices,
|
||||
const hb_vector_t<int>& normalized_coords,
|
||||
bool calculate_delta, /* not pinned at default */
|
||||
bool no_variations, /* all axes pinned */
|
||||
hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *layout_variation_idx_delta_map /* OUT */) const
|
||||
{
|
||||
if (!has_var_store ()) return;
|
||||
if (layout_variation_indices->is_empty ()) return;
|
||||
|
||||
const VariationStore &var_store = get_var_store ();
|
||||
float *store_cache = var_store.create_cache ();
|
||||
|
||||
unsigned new_major = 0, new_minor = 0;
|
||||
unsigned last_major = (layout_variation_indices->get_min ()) >> 16;
|
||||
for (unsigned idx : layout_variation_indices->iter ())
|
||||
{
|
||||
int delta = 0;
|
||||
if (calculate_delta)
|
||||
delta = roundf (var_store.get_delta (idx, normalized_coords.arrayZ,
|
||||
normalized_coords.length, store_cache));
|
||||
|
||||
if (no_variations)
|
||||
{
|
||||
layout_variation_idx_delta_map->set (idx, hb_pair_t<unsigned, int> (HB_OT_LAYOUT_NO_VARIATIONS_INDEX, delta));
|
||||
continue;
|
||||
}
|
||||
|
||||
uint16_t major = idx >> 16;
|
||||
if (major >= get_var_store ().get_sub_table_count ()) break;
|
||||
if (major >= var_store.get_sub_table_count ()) break;
|
||||
if (major != last_major)
|
||||
{
|
||||
new_minor = 0;
|
||||
|
@ -940,14 +955,11 @@ struct GDEF
|
|||
}
|
||||
|
||||
unsigned new_idx = (new_major << 16) + new_minor;
|
||||
if (!layout_variation_idx_delta_map->has (idx))
|
||||
continue;
|
||||
int delta = hb_second (layout_variation_idx_delta_map->get (idx));
|
||||
|
||||
layout_variation_idx_delta_map->set (idx, hb_pair_t<unsigned, int> (new_idx, delta));
|
||||
++new_minor;
|
||||
last_major = major;
|
||||
}
|
||||
var_store.destroy_cache (store_cache);
|
||||
}
|
||||
|
||||
protected:
|
||||
|
|
|
@ -191,27 +191,15 @@ struct hb_collect_variation_indices_context_t :
|
|||
static return_t default_return_value () { return hb_empty_t (); }
|
||||
|
||||
hb_set_t *layout_variation_indices;
|
||||
hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *varidx_delta_map;
|
||||
hb_vector_t<int> *normalized_coords;
|
||||
const VariationStore *var_store;
|
||||
const hb_set_t *glyph_set;
|
||||
const hb_map_t *gpos_lookups;
|
||||
float *store_cache;
|
||||
|
||||
hb_collect_variation_indices_context_t (hb_set_t *layout_variation_indices_,
|
||||
hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *varidx_delta_map_,
|
||||
hb_vector_t<int> *normalized_coords_,
|
||||
const VariationStore *var_store_,
|
||||
const hb_set_t *glyph_set_,
|
||||
const hb_map_t *gpos_lookups_,
|
||||
float *store_cache_) :
|
||||
const hb_map_t *gpos_lookups_) :
|
||||
layout_variation_indices (layout_variation_indices_),
|
||||
varidx_delta_map (varidx_delta_map_),
|
||||
normalized_coords (normalized_coords_),
|
||||
var_store (var_store_),
|
||||
glyph_set (glyph_set_),
|
||||
gpos_lookups (gpos_lookups_),
|
||||
store_cache (store_cache_) {}
|
||||
gpos_lookups (gpos_lookups_) {}
|
||||
};
|
||||
|
||||
template<typename OutputArray>
|
||||
|
@ -3984,17 +3972,7 @@ struct VariationDevice
|
|||
}
|
||||
|
||||
void collect_variation_index (hb_collect_variation_indices_context_t *c) const
|
||||
{
|
||||
c->layout_variation_indices->add (varIdx);
|
||||
int delta = 0;
|
||||
if (c->normalized_coords && c->var_store)
|
||||
delta = roundf (c->var_store->get_delta (varIdx, c->normalized_coords->arrayZ,
|
||||
c->normalized_coords->length, c->store_cache));
|
||||
|
||||
/* set new varidx to HB_OT_LAYOUT_NO_VARIATIONS_INDEX here, will remap
|
||||
* varidx later*/
|
||||
c->varidx_delta_map->set (varIdx, hb_pair_t<unsigned, int> (HB_OT_LAYOUT_NO_VARIATIONS_INDEX, delta));
|
||||
}
|
||||
{ c->layout_variation_indices->add (varIdx); }
|
||||
|
||||
bool sanitize (hb_sanitize_context_t *c) const
|
||||
{
|
||||
|
|
|
@ -399,34 +399,20 @@ _collect_layout_variation_indices (hb_subset_plan_t* plan)
|
|||
return;
|
||||
}
|
||||
|
||||
const OT::VariationStore *var_store = nullptr;
|
||||
hb_set_t varidx_set;
|
||||
float *store_cache = nullptr;
|
||||
bool collect_delta = plan->pinned_at_default ? false : true;
|
||||
if (collect_delta)
|
||||
{
|
||||
if (gdef->has_var_store ())
|
||||
{
|
||||
var_store = &(gdef->get_var_store ());
|
||||
store_cache = var_store->create_cache ();
|
||||
}
|
||||
}
|
||||
|
||||
OT::hb_collect_variation_indices_context_t c (&varidx_set,
|
||||
&plan->layout_variation_idx_delta_map,
|
||||
plan->normalized_coords ? &(plan->normalized_coords) : nullptr,
|
||||
var_store,
|
||||
&plan->_glyphset_gsub,
|
||||
&plan->gpos_lookups,
|
||||
store_cache);
|
||||
&plan->gpos_lookups);
|
||||
gdef->collect_variation_indices (&c);
|
||||
|
||||
if (hb_ot_layout_has_positioning (plan->source))
|
||||
gpos->collect_variation_indices (&c);
|
||||
|
||||
var_store->destroy_cache (store_cache);
|
||||
|
||||
gdef->remap_layout_variation_indices (&varidx_set, &plan->layout_variation_idx_delta_map);
|
||||
gdef->remap_layout_variation_indices (&varidx_set,
|
||||
plan->normalized_coords,
|
||||
!plan->pinned_at_default,
|
||||
plan->all_axes_pinned,
|
||||
&plan->layout_variation_idx_delta_map);
|
||||
|
||||
unsigned subtable_count = gdef->has_var_store () ? gdef->get_var_store ().get_sub_table_count () : 0;
|
||||
_generate_varstore_inner_maps (varidx_set, subtable_count, plan->gdef_varstore_inner_maps);
|
||||
|
|
Loading…
Add table
Reference in a new issue