core: Optimize BMD.fillRect()
This commit is contained in:
parent
a3d58f0815
commit
4ab0910bff
|
@ -710,6 +710,19 @@ impl<'gc> BitmapData<'gc> {
|
||||||
self.pixels[(x + y * self.width) as usize] = color;
|
self.pixels[(x + y * self.width) as usize] = color;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn set_pixel32_row_raw(&mut self, x1: u32, x2: u32, y: u32, color: Color) {
|
||||||
|
let p1 = (x1 + y * self.width) as usize;
|
||||||
|
let p2 = (x2 + y * self.width) as usize;
|
||||||
|
let slice = &mut self.pixels[p1..p2];
|
||||||
|
slice.fill(color);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn fill(&mut self, color: Color) {
|
||||||
|
self.pixels.fill(color);
|
||||||
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn get_pixel32_raw(&self, x: u32, y: u32) -> Color {
|
pub fn get_pixel32_raw(&self, x: u32, y: u32) -> Color {
|
||||||
self.pixels[(x + y * self.width()) as usize]
|
self.pixels[(x + y * self.width()) as usize]
|
||||||
|
|
|
@ -45,7 +45,9 @@ pub fn fill_rect<'gc>(
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let target = if rect.width() == target.width() && rect.height() == target.height() {
|
let is_full = rect.width() == target.width() && rect.height() == target.height();
|
||||||
|
|
||||||
|
let target = if is_full {
|
||||||
// If we're filling the whole region, we can discard the gpu data
|
// If we're filling the whole region, we can discard the gpu data
|
||||||
target.overwrite_cpu_pixels_from_gpu(mc).0
|
target.overwrite_cpu_pixels_from_gpu(mc).0
|
||||||
} else {
|
} else {
|
||||||
|
@ -55,9 +57,11 @@ pub fn fill_rect<'gc>(
|
||||||
let mut write = target.write(mc);
|
let mut write = target.write(mc);
|
||||||
let color = Color::from(color).to_premultiplied_alpha(write.transparency());
|
let color = Color::from(color).to_premultiplied_alpha(write.transparency());
|
||||||
|
|
||||||
for y in rect.y_min..rect.y_max {
|
if is_full {
|
||||||
for x in rect.x_min..rect.x_max {
|
write.fill(color);
|
||||||
write.set_pixel32_raw(x, y, color);
|
} else {
|
||||||
|
for y in rect.y_min..rect.y_max {
|
||||||
|
write.set_pixel32_row_raw(rect.x_min, rect.x_max, y, color);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
write.set_cpu_dirty(mc, rect);
|
write.set_cpu_dirty(mc, rect);
|
||||||
|
|
Loading…
Reference in New Issue