[repacker] add as_table() helper to graph.
diff --git a/src/graph/graph.hh b/src/graph/graph.hh
index cd95fe0..5f23414 100644
--- a/src/graph/graph.hh
+++ b/src/graph/graph.hh
@@ -169,6 +169,21 @@
}
};
+ template <typename T>
+ struct vertex_and_table_t
+ {
+ vertex_and_table_t () : index (0), vertex (nullptr), table (nullptr)
+ {}
+
+ unsigned index;
+ vertex_t* vertex;
+ T* table;
+
+ operator bool () {
+ return table && vertex;
+ }
+ };
+
/*
* A topological sorting of an object graph. Ordered
* in reverse serialization order (first object in the
@@ -373,6 +388,31 @@
}
}
+ template <typename T>
+ vertex_and_table_t<T> as_table (unsigned parent, const void* offset)
+ {
+ return as_table<T> (index_for_offset (parent, offset));
+ }
+
+ template <typename T>
+ vertex_and_table_t<T> as_table (unsigned index)
+ {
+ if (index >= vertices_.length)
+ return vertex_and_table_t<T> ();
+
+ vertex_and_table_t<T> r;
+ r.vertex = &vertices_[index];
+ r.table = (T*) r.vertex->obj.head;
+ r.index = index;
+ if (!r.table)
+ return vertex_and_table_t<T> ();
+
+ if (!r.table->sanitize (*(r.vertex)))
+ return vertex_and_table_t<T> ();
+
+ return r;
+ }
+
// Finds the object id of the object pointed to by the offset at 'offset'
// within object[node_idx].
unsigned index_for_offset (unsigned node_idx, const void* offset) const
diff --git a/src/graph/markbasepos-graph.hh b/src/graph/markbasepos-graph.hh
index e0223c0..7442d04 100644
--- a/src/graph/markbasepos-graph.hh
+++ b/src/graph/markbasepos-graph.hh
@@ -176,24 +176,20 @@
unsigned class_count= classCount;
class_to_info.resize (class_count);
- unsigned mark_array_id =
- c.graph.index_for_offset (this_index, &markArray);
- auto& mark_array_v = c.graph.vertices_[mark_array_id];
- MarkArray* mark_array = (MarkArray*) mark_array_v.obj.head;
- // TODO sanitize
-
- unsigned mark_count = mark_array->len;
+ auto mark_array = c.graph.as_table<MarkArray> (this_index, &markArray);
+ if (!mark_array) return hb_vector_t<class_info_t> ();
+ unsigned mark_count = mark_array.table->len;
for (unsigned mark = 0; mark < mark_count; mark++)
{
- unsigned klass = (*mark_array)[mark].get_class ();
+ unsigned klass = (*mark_array.table)[mark].get_class ();
class_to_info[klass].marks.add (mark);
}
- for (const auto& link : mark_array_v.obj.real_links)
+ for (const auto& link : mark_array.vertex->obj.real_links)
{
unsigned mark = (link.position - 2) /
OT::Layout::GPOS_impl::MarkRecord::static_size;
- unsigned klass = (*mark_array)[mark].get_class ();
+ unsigned klass = (*mark_array.table)[mark].get_class ();
class_to_info[klass].child_indices.push (link.objidx);
}
@@ -289,26 +285,24 @@
marks.get_population () * 2 + 4))
return -1;
- unsigned mark_array_id =
- graph.index_for_offset (sc.this_index, &markArray);
- auto& mark_array_v = graph.vertices_[mark_array_id];
- MarkArray* mark_array = (MarkArray*) mark_array_v.obj.head;
- // TODO sanitize
- unsigned new_mark_array = mark_array->clone (sc.c,
- mark_array_id,
- sc.mark_array_links,
- marks);
+ auto mark_array =
+ graph.as_table <MarkArray> (sc.this_index, &markArray);
+ if (!mark_array) return -1;
+ unsigned new_mark_array =
+ mark_array.table->clone (sc.c,
+ mark_array.index,
+ sc.mark_array_links,
+ marks);
graph.add_link (&(prime->markArray), prime_id, new_mark_array);
- unsigned base_array_id =
- graph.index_for_offset (sc.this_index, &baseArray);
- auto& base_array_v = graph.vertices_[base_array_id];
- AnchorMatrix* base_array = (AnchorMatrix*) base_array_v.obj.head;
- // TODO sanitize
- unsigned new_base_array = base_array->clone (sc.c,
- mark_array_id,
- sc.base_array_links,
- start, end);
+ auto base_array =
+ graph.as_table<AnchorMatrix> (sc.this_index, &baseArray);
+ if (!base_array) return -1;
+ unsigned new_base_array =
+ base_array.table->clone (sc.c,
+ mark_array.index,
+ sc.base_array_links,
+ start, end);
graph.add_link (&(prime->baseArray), prime_id, new_base_array);
return prime_id;