From 9599b2d09faaabe9b1764213fe73f6fdc8da3494 Mon Sep 17 00:00:00 2001 From: Nathan Adams Date: Wed, 29 Apr 2020 12:59:55 +0200 Subject: [PATCH] render: Move some loose utility functions to utils.rs in wgpu renderer --- render/wgpu/src/lib.rs | 96 +++------------------------------------- render/wgpu/src/utils.rs | 95 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 100 insertions(+), 91 deletions(-) diff --git a/render/wgpu/src/lib.rs b/render/wgpu/src/lib.rs index 928b1c466..7ebba53a4 100644 --- a/render/wgpu/src/lib.rs +++ b/render/wgpu/src/lib.rs @@ -1,4 +1,3 @@ -use lyon::path::Path; use lyon::tessellation::{ self, geometry_builder::{BuffersBuilder, FillVertexConstructor, VertexBuffers}, @@ -8,9 +7,9 @@ use ruffle_core::backend::render::swf::{self, FillStyle}; use ruffle_core::backend::render::{ BitmapHandle, BitmapInfo, Color, Letterbox, RenderBackend, ShapeHandle, Transform, }; -use ruffle_core::shape_utils::{DrawCommand, DrawPath}; +use ruffle_core::shape_utils::DrawPath; use std::convert::TryInto; -use swf::{CharacterId, DefineBitsLossless, Glyph, Shape, Twips}; +use swf::{CharacterId, DefineBitsLossless, Glyph, Shape}; use bytemuck::{Pod, Zeroable}; use futures::executor::block_on; @@ -18,7 +17,9 @@ use raw_window_handle::HasRawWindowHandle; use crate::pipelines::Pipelines; use crate::shapes::{Draw, DrawType, GradientUniforms, IncompleteDrawType, Mesh}; -use crate::utils::create_buffer_with_data; +use crate::utils::{ + create_buffer_with_data, ruffle_path_to_lyon_path, swf_bitmap_to_gl_matrix, swf_to_gl_matrix, +}; type Error = Box; @@ -1323,33 +1324,6 @@ impl RenderBackend for WGPURenderBackend { } } -fn point(x: Twips, y: Twips) -> lyon::math::Point { - lyon::math::Point::new(x.to_pixels() as f32, y.to_pixels() as f32) -} - -fn ruffle_path_to_lyon_path(commands: Vec, is_closed: bool) -> Path { - let mut builder = Path::builder(); - for cmd in commands { - match cmd { - DrawCommand::MoveTo { x, y } => { - builder.move_to(point(x, y)); - } - DrawCommand::LineTo { x, y } => { - builder.line_to(point(x, y)); - } - DrawCommand::CurveTo { x1, y1, x2, y2 } => { - builder.quadratic_bezier_to(point(x1, y1), point(x2, y2)); - } - } - } - - if is_closed { - builder.close(); - } - - builder.build() -} - fn create_quad_buffers(device: &wgpu::Device) -> (wgpu::Buffer, wgpu::Buffer, wgpu::Buffer) { let vertices = [ GPUVertex { @@ -1409,66 +1383,6 @@ struct Texture { texture: wgpu::Texture, } -#[allow(clippy::many_single_char_names)] -fn swf_to_gl_matrix(m: swf::Matrix) -> [[f32; 4]; 4] { - let tx = m.translate_x.get() as f32; - let ty = m.translate_y.get() as f32; - let det = m.scale_x * m.scale_y - m.rotate_skew_1 * m.rotate_skew_0; - let mut a = m.scale_y / det; - let mut b = -m.rotate_skew_1 / det; - let mut c = -(tx * m.scale_y - m.rotate_skew_1 * ty) / det; - let mut d = -m.rotate_skew_0 / det; - let mut e = m.scale_x / det; - let mut f = (tx * m.rotate_skew_0 - m.scale_x * ty) / det; - - a *= 20.0 / 32768.0; - b *= 20.0 / 32768.0; - d *= 20.0 / 32768.0; - e *= 20.0 / 32768.0; - - c /= 32768.0; - f /= 32768.0; - c += 0.5; - f += 0.5; - [ - [a, d, 0.0, 0.0], - [b, e, 0., 0.0], - [c, f, 1.0, 0.0], - [0.0, 0.0, 0.0, 0.0], - ] -} - -#[allow(clippy::many_single_char_names)] -fn swf_bitmap_to_gl_matrix(m: swf::Matrix, bitmap_width: u32, bitmap_height: u32) -> [[f32; 4]; 4] { - let bitmap_width = bitmap_width as f32; - let bitmap_height = bitmap_height as f32; - - let tx = m.translate_x.get() as f32; - let ty = m.translate_y.get() as f32; - let det = m.scale_x * m.scale_y - m.rotate_skew_1 * m.rotate_skew_0; - let mut a = m.scale_y / det; - let mut b = -m.rotate_skew_1 / det; - let mut c = -(tx * m.scale_y - m.rotate_skew_1 * ty) / det; - let mut d = -m.rotate_skew_0 / det; - let mut e = m.scale_x / det; - let mut f = (tx * m.rotate_skew_0 - m.scale_x * ty) / det; - - a *= 20.0 / bitmap_width; - b *= 20.0 / bitmap_width; - d *= 20.0 / bitmap_height; - e *= 20.0 / bitmap_height; - - c /= bitmap_width; - f /= bitmap_height; - - [ - [a, d, 0.0, 0.0], - [b, e, 0.0, 0.0], - [c, f, 1.0, 0.0], - [0.0, 0.0, 0.0, 0.0], - ] -} - struct RuffleVertexCtor { color: [f32; 4], } diff --git a/render/wgpu/src/utils.rs b/render/wgpu/src/utils.rs index f77bfc9b1..865f702d9 100644 --- a/render/wgpu/src/utils.rs +++ b/render/wgpu/src/utils.rs @@ -1,3 +1,7 @@ +use lyon::lyon_algorithms::path::Path; +use ruffle_core::shape_utils::DrawCommand; +use ruffle_core::swf; +use swf::Twips; macro_rules! create_debug_label { ($($arg:tt)*) => ( if cfg!(feature = "render_debug_labels") { @@ -22,3 +26,94 @@ pub fn create_buffer_with_data( mapped.data.copy_from_slice(data); mapped.finish() } + +pub fn point(x: Twips, y: Twips) -> lyon::math::Point { + lyon::math::Point::new(x.to_pixels() as f32, y.to_pixels() as f32) +} + +pub fn ruffle_path_to_lyon_path(commands: Vec, is_closed: bool) -> Path { + let mut builder = Path::builder(); + for cmd in commands { + match cmd { + DrawCommand::MoveTo { x, y } => { + builder.move_to(point(x, y)); + } + DrawCommand::LineTo { x, y } => { + builder.line_to(point(x, y)); + } + DrawCommand::CurveTo { x1, y1, x2, y2 } => { + builder.quadratic_bezier_to(point(x1, y1), point(x2, y2)); + } + } + } + + if is_closed { + builder.close(); + } + + builder.build() +} + +#[allow(clippy::many_single_char_names)] +pub fn swf_to_gl_matrix(m: swf::Matrix) -> [[f32; 4]; 4] { + let tx = m.translate_x.get() as f32; + let ty = m.translate_y.get() as f32; + let det = m.scale_x * m.scale_y - m.rotate_skew_1 * m.rotate_skew_0; + let mut a = m.scale_y / det; + let mut b = -m.rotate_skew_1 / det; + let mut c = -(tx * m.scale_y - m.rotate_skew_1 * ty) / det; + let mut d = -m.rotate_skew_0 / det; + let mut e = m.scale_x / det; + let mut f = (tx * m.rotate_skew_0 - m.scale_x * ty) / det; + + a *= 20.0 / 32768.0; + b *= 20.0 / 32768.0; + d *= 20.0 / 32768.0; + e *= 20.0 / 32768.0; + + c /= 32768.0; + f /= 32768.0; + c += 0.5; + f += 0.5; + [ + [a, d, 0.0, 0.0], + [b, e, 0., 0.0], + [c, f, 1.0, 0.0], + [0.0, 0.0, 0.0, 0.0], + ] +} + +#[allow(clippy::many_single_char_names)] +pub fn swf_bitmap_to_gl_matrix( + m: swf::Matrix, + bitmap_width: u32, + bitmap_height: u32, +) -> [[f32; 4]; 4] { + let bitmap_width = bitmap_width as f32; + let bitmap_height = bitmap_height as f32; + + let tx = m.translate_x.get() as f32; + let ty = m.translate_y.get() as f32; + let det = m.scale_x * m.scale_y - m.rotate_skew_1 * m.rotate_skew_0; + let mut a = m.scale_y / det; + let mut b = -m.rotate_skew_1 / det; + let mut c = -(tx * m.scale_y - m.rotate_skew_1 * ty) / det; + let mut d = -m.rotate_skew_0 / det; + let mut e = m.scale_x / det; + let mut f = (tx * m.rotate_skew_0 - m.scale_x * ty) / det; + + a *= 20.0 / bitmap_width; + b *= 20.0 / bitmap_width; + d *= 20.0 / bitmap_height; + e *= 20.0 / bitmap_height; + + c /= bitmap_width; + f /= bitmap_height; + + [ + [a, d, 0.0, 0.0], + [b, e, 0.0, 0.0], + [c, f, 1.0, 0.0], + [0.0, 0.0, 0.0, 0.0], + ] +}