From 369c5bda5679a9b7b02ee347148df97f42862f90 Mon Sep 17 00:00:00 2001 From: Mike Welsh Date: Mon, 14 Dec 2020 19:18:27 -0800 Subject: [PATCH] render: Implement Bitmap smoothing property --- core/src/avm1/globals/movie_clip.rs | 12 ++++++++++++ core/src/backend/render.rs | 4 ++-- core/src/display_object/bitmap.rs | 9 +++++++-- render/canvas/src/lib.rs | 2 +- render/webgl/src/lib.rs | 8 ++++++-- render/wgpu/src/lib.rs | 6 ++++-- 6 files changed, 32 insertions(+), 9 deletions(-) diff --git a/core/src/avm1/globals/movie_clip.rs b/core/src/avm1/globals/movie_clip.rs index 5ef6468bf..f11ee9b89 100644 --- a/core/src/avm1/globals/movie_clip.rs +++ b/core/src/avm1/globals/movie_clip.rs @@ -239,6 +239,17 @@ fn attach_bitmap<'gc>( .write(activation.context.gc_context) .bitmap_handle(activation.context.renderer); + // TODO: Implement pixel snapping + let _pixel_snapping = args + .get(2) + .unwrap_or(&Value::Undefined) + .as_bool(activation.current_swf_version()); + + let smoothing = args + .get(3) + .unwrap_or(&Value::Undefined) + .as_bool(activation.current_swf_version()); + if let Some(bitmap_handle) = bitmap_handle { //TODO: do attached BitmapDatas have character ids? let display_object = Bitmap::new_with_bitmap_data( @@ -248,6 +259,7 @@ fn attach_bitmap<'gc>( bitmap_data.read().width() as u16, bitmap_data.read().height() as u16, Some(bitmap_data), + smoothing, ); movie_clip.replace_at_depth( &mut activation.context, diff --git a/core/src/backend/render.rs b/core/src/backend/render.rs index c86997c39..c1b81c000 100644 --- a/core/src/backend/render.rs +++ b/core/src/backend/render.rs @@ -34,7 +34,7 @@ pub trait RenderBackend: Downcast { ) -> Result; fn begin_frame(&mut self, clear: Color); - fn render_bitmap(&mut self, bitmap: BitmapHandle, transform: &Transform); + fn render_bitmap(&mut self, bitmap: BitmapHandle, transform: &Transform, smoothing: bool); fn render_shape(&mut self, shape: ShapeHandle, transform: &Transform); fn draw_rect(&mut self, color: Color, matrix: &Matrix); fn end_frame(&mut self); @@ -155,7 +155,7 @@ impl RenderBackend for NullRenderer { } fn begin_frame(&mut self, _clear: Color) {} fn end_frame(&mut self) {} - fn render_bitmap(&mut self, _bitmap: BitmapHandle, _transform: &Transform) {} + fn render_bitmap(&mut self, _bitmap: BitmapHandle, _transform: &Transform, _smoothing: bool) {} fn render_shape(&mut self, _shape: ShapeHandle, _transform: &Transform) {} fn draw_rect(&mut self, _color: Color, _matrix: &Matrix) {} fn draw_letterbox(&mut self, _letterbox: Letterbox) {} diff --git a/core/src/display_object/bitmap.rs b/core/src/display_object/bitmap.rs index c3b91d453..04d4f984d 100644 --- a/core/src/display_object/bitmap.rs +++ b/core/src/display_object/bitmap.rs @@ -23,6 +23,7 @@ pub struct BitmapData<'gc> { base: DisplayObjectBase<'gc>, static_data: Gc<'gc, BitmapStatic>, bitmap_data: Option>, + smoothing: bool, } impl<'gc> Bitmap<'gc> { @@ -33,6 +34,7 @@ impl<'gc> Bitmap<'gc> { width: u16, height: u16, bitmap_data: Option>, + smoothing: bool, ) -> Self { Bitmap(GcCell::allocate( context.gc_context, @@ -48,6 +50,7 @@ impl<'gc> Bitmap<'gc> { }, ), bitmap_data, + smoothing, }, )) } @@ -59,7 +62,7 @@ impl<'gc> Bitmap<'gc> { width: u16, height: u16, ) -> Self { - Self::new_with_bitmap_data(context, id, bitmap_handle, width, height, None) + Self::new_with_bitmap_data(context, id, bitmap_handle, width, height, None, true) } #[allow(dead_code)] @@ -117,9 +120,11 @@ impl<'gc> TDisplayObject<'gc> for Bitmap<'gc> { context.transform_stack.push(&*self.transform()); + let bitmap_data = self.0.read(); context.renderer.render_bitmap( - self.0.read().static_data.bitmap_handle, + bitmap_data.static_data.bitmap_handle, context.transform_stack.transform(), + bitmap_data.smoothing, ); context.transform_stack.pop(); diff --git a/render/canvas/src/lib.rs b/render/canvas/src/lib.rs index fa6e0b2cb..f7d7cc47b 100644 --- a/render/canvas/src/lib.rs +++ b/render/canvas/src/lib.rs @@ -564,7 +564,7 @@ impl RenderBackend for WebCanvasRenderBackend { // Noop } - fn render_bitmap(&mut self, bitmap: BitmapHandle, transform: &Transform) { + fn render_bitmap(&mut self, bitmap: BitmapHandle, transform: &Transform, _smoothing: bool) { if self.deactivating_mask { return; } diff --git a/render/webgl/src/lib.rs b/render/webgl/src/lib.rs index 48e6550ad..4c43bbbd3 100644 --- a/render/webgl/src/lib.rs +++ b/render/webgl/src/lib.rs @@ -932,7 +932,7 @@ impl RenderBackend for WebGlRenderBackend { } } - fn render_bitmap(&mut self, bitmap: BitmapHandle, transform: &Transform) { + fn render_bitmap(&mut self, bitmap: BitmapHandle, transform: &Transform, smoothing: bool) { self.set_stencil_state(); if let Some((_, bitmap)) = self.textures.get(bitmap.0) { let texture = &bitmap.texture; @@ -1023,7 +1023,11 @@ impl RenderBackend for WebGlRenderBackend { program.uniform1i(&self.gl, ShaderUniform::BitmapTexture, 0); // Set texture parameters. - let filter = Gl::LINEAR as i32; + let filter = if smoothing { + Gl::LINEAR as i32 + } else { + Gl::NEAREST as i32 + }; self.gl .tex_parameteri(Gl::TEXTURE_2D, Gl::TEXTURE_MAG_FILTER, filter); self.gl diff --git a/render/wgpu/src/lib.rs b/render/wgpu/src/lib.rs index f19673f39..baed9d6d2 100644 --- a/render/wgpu/src/lib.rs +++ b/render/wgpu/src/lib.rs @@ -928,7 +928,7 @@ impl RenderBackend for WgpuRenderBackend { } } - fn render_bitmap(&mut self, bitmap: BitmapHandle, transform: &Transform) { + fn render_bitmap(&mut self, bitmap: BitmapHandle, transform: &Transform, smoothing: bool) { if let Some((_id, texture)) = self.textures.get(bitmap.0) { let (frame_output, encoder) = if let Some((frame_output, encoder)) = &mut self.current_frame { @@ -1070,7 +1070,9 @@ impl RenderBackend for WgpuRenderBackend { render_pass.set_bind_group(2, &bitmap_bind_group, &[]); render_pass.set_bind_group( 3, - self.descriptors.bitmap_samplers.get_bind_group(false, true), + self.descriptors + .bitmap_samplers + .get_bind_group(false, smoothing), &[], ); render_pass.set_vertex_buffer(0, self.quad_vbo.slice(..));