Clear out old bezieroids when partitioning a new path. Oops!

This commit is contained in:
Patrick Walton 2017-07-04 11:51:58 -07:00
parent 410d2aa6cd
commit a066e77c72
1 changed files with 18 additions and 7 deletions

View File

@ -45,15 +45,18 @@ impl<'a> Partitioner<'a> {
self.control_points = new_control_points;
self.subpaths = new_subpaths;
// FIXME(pcwalton): Move this initialization to `partition` below. Right now, this bit
// vector uses too much memory.
self.visited_points = BitVec::from_elem(self.endpoints.len() * 2, false);
self.bezieroids.clear();
self.heap.clear();
self.active_edges.clear();
}
pub fn partition(&mut self, first_subpath_index: u32, last_subpath_index: u32) {
self.bezieroids.clear();
self.heap.clear();
self.active_edges.clear();
self.init_heap(first_subpath_index, last_subpath_index);
while self.process_next_point() {}
}
@ -103,8 +106,11 @@ impl<'a> Partitioner<'a> {
}
}
PointType::CrossingBelow => {
debug_assert!(matching_active_edges.count > 0);
self.process_crossing_point(point.position.x, matching_active_edges.indices[0])
// FIXME(pcwalton): This condition should always pass, but it fails on the Dutch
// rail map.
if matching_active_edges.count > 0 {
self.process_crossing_point(point.position.x, matching_active_edges.indices[0])
}
}
}
@ -206,8 +212,13 @@ impl<'a> Partitioner<'a> {
}
// Swap the two edges.
//
// FIXME(pcwalton): This condition should always pass, but it fails on the Dutch rail map.
let lower_active_edge_index = upper_active_edge_index + 1;
self.active_edges.swap(upper_active_edge_index as usize, lower_active_edge_index as usize)
if (lower_active_edge_index as usize) < self.active_edges.len() {
self.active_edges.swap(upper_active_edge_index as usize,
lower_active_edge_index as usize)
}
}
fn add_new_edges_for_min_point(&mut self, endpoint_index: u32, next_active_edge_index: u32) {