core: Skip bitmapdata.draw which will affect 0 pixels

This commit is contained in:
Nathan Adams 2023-03-24 19:04:50 +01:00
parent e6d36ade7f
commit 966f5bc816
1 changed files with 16 additions and 19 deletions

View File

@ -1199,27 +1199,17 @@ pub fn draw<'gc>(
clip_rect: Option<Rectangle<Twips>>, clip_rect: Option<Rectangle<Twips>>,
quality: StageQuality, quality: StageQuality,
) -> Result<(), BitmapDataDrawError> { ) -> Result<(), BitmapDataDrawError> {
let (target, include_dirty_area) = target.overwrite_cpu_pixels_from_gpu(context); // Calculate the maximum potential area that this draw call will affect
let mut write = target.write(context.gc_context); let bounds = source.bounds();
let mut dirty_region =
let bitmapdata_width = write.width(); PixelRegion::encompassing_twips(transform.matrix * bounds.0, transform.matrix * bounds.1);
let bitmapdata_height = write.height(); dirty_region.clamp(target.width(), target.height());
if dirty_region.width() == 0 || dirty_region.height() == 0 {
return Ok(());
}
let mut transform_stack = ruffle_render::transform::TransformStack::new(); let mut transform_stack = ruffle_render::transform::TransformStack::new();
transform_stack.push(&transform); transform_stack.push(&transform);
let handle = write.bitmap_handle(context.renderer).unwrap();
// Calculate the maximum potential area that this draw call will affect
let matrix = transform_stack.transform().matrix;
let bounds = source.bounds();
let mut dirty_region = PixelRegion::encompassing_twips(matrix * bounds.0, matrix * bounds.1);
dirty_region.clamp(bitmapdata_width, bitmapdata_height);
// If we have another dirty area to preserve, expand this to include it
if let Some(old) = include_dirty_area {
dirty_region.union(old);
}
let mut render_context = RenderContext { let mut render_context = RenderContext {
renderer: context.renderer, renderer: context.renderer,
@ -1277,7 +1267,7 @@ pub fn draw<'gc>(
render_context.commands.pop_mask(); render_context.commands.pop_mask();
} }
write.update_dirty_texture(render_context.renderer); let handle = target.bitmap_handle(render_context.gc_context, render_context.renderer);
let commands = if blend_mode == BlendMode::Normal { let commands = if blend_mode == BlendMode::Normal {
render_context.commands render_context.commands
@ -1287,6 +1277,13 @@ pub fn draw<'gc>(
commands commands
}; };
let (target, include_dirty_area) = target.overwrite_cpu_pixels_from_gpu(context);
let mut write = target.write(context.gc_context);
// If we have another dirty area to preserve, expand this to include it
if let Some(old) = include_dirty_area {
dirty_region.union(old);
}
let image = context let image = context
.renderer .renderer
.render_offscreen(handle, commands, quality, dirty_region); .render_offscreen(handle, commands, quality, dirty_region);