Fix nasty off-by-one error in MIN point finding
This commit is contained in:
parent
e09a3f2977
commit
6575012cc9
|
@ -87,7 +87,8 @@ fn main() {
|
||||||
thread_pool_builder.build_global().unwrap();
|
thread_pool_builder.build_global().unwrap();
|
||||||
|
|
||||||
let scene = Scene::from_path(&input_path);
|
let scene = Scene::from_path(&input_path);
|
||||||
println!("Scene bounds: {:?}", scene.bounds);
|
println!("Scene bounds: {:?} View box: {:?}", scene.bounds, scene.view_box);
|
||||||
|
//println!("{:#?}", scene.objects[0]);
|
||||||
|
|
||||||
let start_time = Instant::now();
|
let start_time = Instant::now();
|
||||||
let mut built_scene = BuiltScene::new(&scene.view_box, scene.objects.len() as u32);
|
let mut built_scene = BuiltScene::new(&scene.view_box, scene.objects.len() as u32);
|
||||||
|
@ -161,7 +162,7 @@ struct GroupStyle {
|
||||||
impl ComputedStyle {
|
impl ComputedStyle {
|
||||||
fn new() -> ComputedStyle {
|
fn new() -> ComputedStyle {
|
||||||
ComputedStyle {
|
ComputedStyle {
|
||||||
fill_color: None,
|
fill_color: Some(SvgColor::black()),
|
||||||
stroke_width: 1.0,
|
stroke_width: 1.0,
|
||||||
stroke_color: None,
|
stroke_color: None,
|
||||||
transform: Transform2D::identity(),
|
transform: Transform2D::identity(),
|
||||||
|
@ -245,7 +246,6 @@ impl Scene {
|
||||||
}
|
}
|
||||||
|
|
||||||
return scene;
|
return scene;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn push_group_style(&mut self,
|
fn push_group_style(&mut self,
|
||||||
|
@ -281,7 +281,13 @@ impl Scene {
|
||||||
Transform2D::row_major(a, b, c, d, e, f).cast();
|
Transform2D::row_major(a, b, c, d, e, f).cast();
|
||||||
current_transform = current_transform.pre_mul(&transform)
|
current_transform = current_transform.pre_mul(&transform)
|
||||||
}
|
}
|
||||||
_ => {}
|
Ok(TransformListToken::Scale { sx, sy }) => {
|
||||||
|
current_transform =
|
||||||
|
current_transform.pre_scale(sx as f32, sy as f32)
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
eprintln!("warning: unknown transform list token");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
group_style.transform = Some(current_transform);
|
group_style.transform = Some(current_transform);
|
||||||
|
@ -1059,6 +1065,7 @@ impl<'o> Tiler<'o> {
|
||||||
current_tile_x,
|
current_tile_x,
|
||||||
current_subtile_x,
|
current_subtile_x,
|
||||||
current_winding);
|
current_winding);
|
||||||
|
println!("... segment={:#?}", active_edge.segment);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// FIXME(pcwalton): Remove this debug code!
|
// FIXME(pcwalton): Remove this debug code!
|
||||||
|
@ -1097,7 +1104,7 @@ impl<'o> Tiler<'o> {
|
||||||
debug_assert!(current_tile_x == segment_tile_x);
|
debug_assert!(current_tile_x == segment_tile_x);
|
||||||
debug_assert!(current_tile_x < self.built_object.tile_rect.max_x());
|
debug_assert!(current_tile_x < self.built_object.tile_rect.max_x());
|
||||||
let segment_subtile_x = segment_x - (current_tile_x as f32) * TILE_WIDTH;
|
let segment_subtile_x = segment_x - (current_tile_x as f32) * TILE_WIDTH;
|
||||||
if segment_subtile_x >= current_subtile_x {
|
if segment_subtile_x > current_subtile_x {
|
||||||
let current_x = (current_tile_x as f32) * TILE_WIDTH + current_subtile_x;
|
let current_x = (current_tile_x as f32) * TILE_WIDTH + current_subtile_x;
|
||||||
let left = Point2D::new(current_x, tile_origin_y);
|
let left = Point2D::new(current_x, tile_origin_y);
|
||||||
let right = Point2D::new(segment_x, tile_origin_y);
|
let right = Point2D::new(segment_x, tile_origin_y);
|
||||||
|
@ -1135,7 +1142,18 @@ impl<'o> Tiler<'o> {
|
||||||
// TODO(pcwalton): Could use a bitset of processed edges…
|
// TODO(pcwalton): Could use a bitset of processed edges…
|
||||||
let prev_endpoint_index = contour.prev_endpoint_index_of(point_index.point());
|
let prev_endpoint_index = contour.prev_endpoint_index_of(point_index.point());
|
||||||
let next_endpoint_index = contour.next_endpoint_index_of(point_index.point());
|
let next_endpoint_index = contour.next_endpoint_index_of(point_index.point());
|
||||||
|
/*
|
||||||
|
println!("adding new active edge, tile_y={} point_index={:?} prev={} next={} pos={:?} prevpos={:?} nextpos={:?}",
|
||||||
|
tile_y,
|
||||||
|
point_index,
|
||||||
|
prev_endpoint_index,
|
||||||
|
next_endpoint_index,
|
||||||
|
contour.position_of(point_index.point()),
|
||||||
|
contour.position_of(prev_endpoint_index),
|
||||||
|
contour.position_of(next_endpoint_index));
|
||||||
|
*/
|
||||||
if contour.point_is_logically_above(point_index.point(), prev_endpoint_index) {
|
if contour.point_is_logically_above(point_index.point(), prev_endpoint_index) {
|
||||||
|
//println!("... adding prev endpoint");
|
||||||
process_active_segment(contour,
|
process_active_segment(contour,
|
||||||
prev_endpoint_index,
|
prev_endpoint_index,
|
||||||
&mut self.active_edges,
|
&mut self.active_edges,
|
||||||
|
@ -1146,9 +1164,15 @@ impl<'o> Tiler<'o> {
|
||||||
point_index: PointIndex::new(point_index.contour(), prev_endpoint_index),
|
point_index: PointIndex::new(point_index.contour(), prev_endpoint_index),
|
||||||
y: contour.position_of(prev_endpoint_index).y,
|
y: contour.position_of(prev_endpoint_index).y,
|
||||||
});
|
});
|
||||||
|
//println!("... done adding prev endpoint");
|
||||||
}
|
}
|
||||||
|
|
||||||
if contour.point_is_logically_above(point_index.point(), next_endpoint_index) {
|
if contour.point_is_logically_above(point_index.point(), next_endpoint_index) {
|
||||||
|
/*
|
||||||
|
println!("... adding next endpoint {} -> {}",
|
||||||
|
point_index.point(),
|
||||||
|
next_endpoint_index);
|
||||||
|
*/
|
||||||
process_active_segment(contour,
|
process_active_segment(contour,
|
||||||
point_index.point(),
|
point_index.point(),
|
||||||
&mut self.active_edges,
|
&mut self.active_edges,
|
||||||
|
@ -1159,6 +1183,7 @@ impl<'o> Tiler<'o> {
|
||||||
point_index: PointIndex::new(point_index.contour(), next_endpoint_index),
|
point_index: PointIndex::new(point_index.contour(), next_endpoint_index),
|
||||||
y: contour.position_of(next_endpoint_index).y,
|
y: contour.position_of(next_endpoint_index).y,
|
||||||
});
|
});
|
||||||
|
//println!("... done adding next endpoint");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1171,7 +1196,7 @@ impl<'o> Tiler<'o> {
|
||||||
let mut cur_endpoint_index = 0;
|
let mut cur_endpoint_index = 0;
|
||||||
let mut prev_endpoint_index = contour.prev_endpoint_index_of(cur_endpoint_index);
|
let mut prev_endpoint_index = contour.prev_endpoint_index_of(cur_endpoint_index);
|
||||||
let mut next_endpoint_index = contour.next_endpoint_index_of(cur_endpoint_index);
|
let mut next_endpoint_index = contour.next_endpoint_index_of(cur_endpoint_index);
|
||||||
while cur_endpoint_index < next_endpoint_index {
|
loop {
|
||||||
if contour.point_is_logically_above(cur_endpoint_index, prev_endpoint_index) &&
|
if contour.point_is_logically_above(cur_endpoint_index, prev_endpoint_index) &&
|
||||||
contour.point_is_logically_above(cur_endpoint_index, next_endpoint_index) {
|
contour.point_is_logically_above(cur_endpoint_index, next_endpoint_index) {
|
||||||
self.point_queue.push(QueuedEndpoint {
|
self.point_queue.push(QueuedEndpoint {
|
||||||
|
@ -1180,6 +1205,10 @@ impl<'o> Tiler<'o> {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if cur_endpoint_index >= next_endpoint_index {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
prev_endpoint_index = cur_endpoint_index;
|
prev_endpoint_index = cur_endpoint_index;
|
||||||
cur_endpoint_index = next_endpoint_index;
|
cur_endpoint_index = next_endpoint_index;
|
||||||
next_endpoint_index = contour.next_endpoint_index_of(cur_endpoint_index);
|
next_endpoint_index = contour.next_endpoint_index_of(cur_endpoint_index);
|
||||||
|
@ -1194,9 +1223,9 @@ fn process_active_segment(contour: &Contour,
|
||||||
built_object: &mut BuiltObject,
|
built_object: &mut BuiltObject,
|
||||||
tile_y: i16) {
|
tile_y: i16) {
|
||||||
let mut segment = contour.segment_after(from_endpoint_index);
|
let mut segment = contour.segment_after(from_endpoint_index);
|
||||||
if segment.is_degenerate() {
|
/*if segment.is_degenerate() {
|
||||||
return
|
return
|
||||||
}
|
}*/
|
||||||
|
|
||||||
process_active_edge(&mut segment, built_object, tile_y);
|
process_active_edge(&mut segment, built_object, tile_y);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue