Micro-optimize line fill primitive generation to avoid calls to `floorf()` and
`ceilf()`
This commit is contained in:
parent
24deb36e9a
commit
84bf4341c2
|
@ -641,7 +641,7 @@ impl ObjectBuilder {
|
||||||
// Ensure this fill is in bounds. If not, cull it.
|
// Ensure this fill is in bounds. If not, cull it.
|
||||||
if self.tile_coords_to_local_index(tile_coords).is_none() {
|
if self.tile_coords_to_local_index(tile_coords).is_none() {
|
||||||
return;
|
return;
|
||||||
};
|
}
|
||||||
|
|
||||||
debug_assert_eq!(TILE_WIDTH, TILE_HEIGHT);
|
debug_assert_eq!(TILE_WIDTH, TILE_HEIGHT);
|
||||||
|
|
||||||
|
@ -758,23 +758,12 @@ impl ObjectBuilder {
|
||||||
(segment.to_x(), segment.from_x())
|
(segment.to_x(), segment.from_x())
|
||||||
};
|
};
|
||||||
|
|
||||||
// FIXME(pcwalton): Optimize this.
|
let mut subsegment_x = (segment_left as i32 & !(TILE_WIDTH as i32 - 1)) as f32;
|
||||||
let segment_tile_left = f32::floor(segment_left) as i32 / TILE_WIDTH as i32;
|
while subsegment_x < segment_right {
|
||||||
let segment_tile_right =
|
|
||||||
util::alignup_i32(f32::ceil(segment_right) as i32, TILE_WIDTH as i32);
|
|
||||||
debug!(
|
|
||||||
"segment_tile_left={} segment_tile_right={} tile_rect={:?}",
|
|
||||||
segment_tile_left,
|
|
||||||
segment_tile_right,
|
|
||||||
self.tile_rect()
|
|
||||||
);
|
|
||||||
|
|
||||||
for subsegment_tile_x in segment_tile_left..segment_tile_right {
|
|
||||||
let (mut fill_from, mut fill_to) = (segment.from(), segment.to());
|
let (mut fill_from, mut fill_to) = (segment.from(), segment.to());
|
||||||
let subsegment_tile_right =
|
let subsegment_x_next = subsegment_x + TILE_WIDTH as f32;
|
||||||
((i32::from(subsegment_tile_x) + 1) * TILE_HEIGHT as i32) as f32;
|
if subsegment_x_next < segment_right {
|
||||||
if subsegment_tile_right < segment_right {
|
let x = subsegment_x_next;
|
||||||
let x = subsegment_tile_right;
|
|
||||||
let point = Vector2F::new(x, segment.solve_y_for_x(x));
|
let point = Vector2F::new(x, segment.solve_y_for_x(x));
|
||||||
if !winding {
|
if !winding {
|
||||||
fill_to = point;
|
fill_to = point;
|
||||||
|
@ -786,8 +775,10 @@ impl ObjectBuilder {
|
||||||
}
|
}
|
||||||
|
|
||||||
let fill_segment = LineSegment2F::new(fill_from, fill_to);
|
let fill_segment = LineSegment2F::new(fill_from, fill_to);
|
||||||
let fill_tile_coords = vec2i(subsegment_tile_x, tile_y);
|
let fill_tile_coords = vec2i(subsegment_x as i32 / TILE_WIDTH as i32, tile_y);
|
||||||
self.add_fill(scene_builder, fill_segment, fill_tile_coords);
|
self.add_fill(scene_builder, fill_segment, fill_tile_coords);
|
||||||
|
|
||||||
|
subsegment_x = subsegment_x_next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue