[repacker] use position instead of memory address as key in device_tables map.

This commit is contained in:
Garret Rieger 2022-08-08 16:57:28 +00:00
parent 163fbf0be1
commit fe15f2559f
1 changed files with 10 additions and 8 deletions

View File

@ -236,7 +236,7 @@ struct PairPosFormat2 : public OT::Layout::GPOS_impl::PairPosFormat2_4<SmallType
hb_vector_t<unsigned> split_points; hb_vector_t<unsigned> split_points;
hb_hashmap_t<void*, unsigned> device_tables = get_all_device_tables (c, this_index); hb_hashmap_t<unsigned, unsigned> device_tables = get_all_device_tables (c, this_index);
hb_vector_t<unsigned> format1_device_table_indices = valueFormat1.get_device_table_indices (); hb_vector_t<unsigned> format1_device_table_indices = valueFormat1.get_device_table_indices ();
hb_vector_t<unsigned> format2_device_table_indices = valueFormat2.get_device_table_indices (); hb_vector_t<unsigned> format2_device_table_indices = valueFormat2.get_device_table_indices ();
bool has_device_tables = bool(format1_device_table_indices) || bool(format2_device_table_indices); bool has_device_tables = bool(format1_device_table_indices) || bool(format2_device_table_indices);
@ -315,7 +315,7 @@ struct PairPosFormat2 : public OT::Layout::GPOS_impl::PairPosFormat2_4<SmallType
unsigned max_coverage_size; unsigned max_coverage_size;
unsigned max_class_def_size; unsigned max_class_def_size;
const hb_hashmap_t<void*, unsigned>& device_tables; const hb_hashmap_t<unsigned, unsigned>& device_tables;
const hb_vector_t<unsigned>& format1_device_table_indices; const hb_vector_t<unsigned>& format1_device_table_indices;
const hb_vector_t<unsigned>& format2_device_table_indices; const hb_vector_t<unsigned>& format2_device_table_indices;
@ -481,7 +481,8 @@ struct PairPosFormat2 : public OT::Layout::GPOS_impl::PairPosFormat2_4<SmallType
for (unsigned i : device_table_indices) for (unsigned i : device_table_indices)
{ {
OT::Offset16* record = (OT::Offset16*) &values[old_value_record_index + i]; OT::Offset16* record = (OT::Offset16*) &values[old_value_record_index + i];
if (!split_context.device_tables.has ((void*) record)) continue; unsigned record_position = ((char*) record) - ((char*) this);
if (!split_context.device_tables.has (record_position)) continue;
split_context.c.graph.move_child ( split_context.c.graph.move_child (
split_context.this_index, split_context.this_index,
@ -543,15 +544,15 @@ struct PairPosFormat2 : public OT::Layout::GPOS_impl::PairPosFormat2_4<SmallType
class_def_1_v.table_size ()); class_def_1_v.table_size ());
} }
hb_hashmap_t<void*, unsigned> hb_hashmap_t<unsigned, unsigned>
get_all_device_tables (gsubgpos_graph_context_t& c, get_all_device_tables (gsubgpos_graph_context_t& c,
unsigned this_index) const unsigned this_index) const
{ {
hb_hashmap_t<void*, unsigned> result; hb_hashmap_t<unsigned, unsigned> result;
const auto& o = c.graph.object (this_index); const auto& o = c.graph.object (this_index);
for (const auto& l : o.real_links) { for (const auto& l : o.real_links) {
result.set ((void*) (((uint8_t*)this) + l.position), l.objidx); result.set (l.position, l.objidx);
} }
return result; return result;
@ -582,7 +583,7 @@ struct PairPosFormat2 : public OT::Layout::GPOS_impl::PairPosFormat2_4<SmallType
} }
unsigned size_of_value_record_children (gsubgpos_graph_context_t& c, unsigned size_of_value_record_children (gsubgpos_graph_context_t& c,
const hb_hashmap_t<void*, unsigned>& device_tables, const hb_hashmap_t<unsigned, unsigned>& device_tables,
const hb_vector_t<unsigned> device_table_indices, const hb_vector_t<unsigned> device_table_indices,
unsigned value_record_index, unsigned value_record_index,
hb_set_t& visited) hb_set_t& visited)
@ -591,8 +592,9 @@ struct PairPosFormat2 : public OT::Layout::GPOS_impl::PairPosFormat2_4<SmallType
for (unsigned i : device_table_indices) for (unsigned i : device_table_indices)
{ {
OT::Layout::GPOS_impl::Value* record = &values[value_record_index + i]; OT::Layout::GPOS_impl::Value* record = &values[value_record_index + i];
unsigned record_position = ((char*) record) - ((char*) this);
unsigned* obj_idx; unsigned* obj_idx;
if (!device_tables.has ((void*) record, &obj_idx)) continue; if (!device_tables.has (record_position, &obj_idx)) continue;
size += c.graph.find_subgraph_size (*obj_idx, visited); size += c.graph.find_subgraph_size (*obj_idx, visited);
} }
return size; return size;