[repacker] optimize AnchorMatrix::clone.

Previous runtime is O(n^2) reduced to O(n).
This commit is contained in:
Garret Rieger 2022-08-18 01:48:10 +00:00
parent 29e3b2467e
commit 6f5c52b604
1 changed files with 22 additions and 17 deletions

View File

@ -91,26 +91,31 @@ struct AnchorMatrix : public OT::Layout::GPOS_impl::AnchorMatrix
AnchorMatrix* prime = (AnchorMatrix*) c.graph.object (prime_id).head;
prime->rows = base_count;
for (unsigned base = 0; base < base_count; base++)
auto& o = c.graph.vertices_[this_index].obj;
int num_links = o.real_links.length;
for (int i = 0; i < num_links; i++)
{
for (unsigned klass = start; klass < end; klass++)
{
unsigned new_klass = klass - start;
const auto& link = o.real_links[i];
unsigned old_index = (link.position - 2) / OT::Offset16::static_size;
unsigned klass = old_index % class_count;
if (klass < start || klass >= end) continue;
unsigned old_index = base * class_count + klass;
unsigned new_index = base * new_class_count + new_klass;
unsigned base = old_index / class_count;
unsigned new_klass = klass - start;
unsigned new_index = base * new_class_count + new_klass;
unsigned offset_pos = (char*) &(this->matrixZ[old_index]) -
(char*) this;
unsigned* objidx;
if (pos_to_index.has (offset_pos, &objidx))
// TODO(garretrieger): move_child is O(n) (n is number of children), can use the pos_to_index
// map to speed it up.
c.graph.move_child (this_index,
&(this->matrixZ[old_index]),
prime_id,
&(prime->matrixZ[new_index]));
}
unsigned child_idx = link.objidx;
c.graph.add_link (&(prime->matrixZ[new_index]),
prime_id,
child_idx);
auto& child = c.graph.vertices_[child_idx];
child.remove_parent (this_index);
o.real_links.remove (i);
num_links--;
i--;
}
return prime_id;