diff --git a/src/gui.rs b/src/gui.rs index 0ced3d0..6452278 100644 --- a/src/gui.rs +++ b/src/gui.rs @@ -2,6 +2,7 @@ use crate::{parameters::PluginParams, window::EditorWindow}; use baseview::{ Event, EventStatus, MouseButton, MouseEvent, WindowEvent, WindowHandler, gl::GlContext, }; +use crossbeam::atomic::AtomicCell; use ebu_dsp::Rect; use femtovg::{Canvas, Color, FontId, ImageFlags, ImageId, Paint, Path, renderer::OpenGl}; use nih_plug::prelude::*; @@ -23,7 +24,7 @@ pub struct PluginGui { params: Arc, canvas: Option>, _gui_context: Arc, - scaling_factor: f32, + scaling_factor: Arc>>, freshener_screen_bounds: Rect, @@ -41,13 +42,13 @@ pub struct PluginGui { fn create_canvas( context: &GlContext, params: &PluginParams, - scaling_factor: f32, + scaling_factor: &AtomicCell>, ) -> Result, &'static str> { let renderer = unsafe { OpenGl::new_from_function(|s| context.get_proc_address(s)) } .map_err(|_| "Failed to create OpenGL renderer")?; let mut canvas = Canvas::new(renderer).map_err(|_| "Failed to create femtovg canvas")?; let (width, height) = params.editor_state.size(); - canvas.set_size(width, height, scaling_factor); + canvas.set_size(width, height, scaling_factor.load().unwrap_or(1.0)); Ok(canvas) } @@ -56,14 +57,14 @@ impl PluginGui { window: &mut baseview::Window<'_>, gui_context: Arc, params: Arc, - scaling_factor: f32, + scaling_factor: Arc>>, ) -> Self { let mut this = Self { font: Err("Not loaded".to_owned()), params: params.clone(), canvas: None, _gui_context: gui_context, - scaling_factor, + scaling_factor: scaling_factor.clone(), dirty: true, mouse_position: (0.0, 0.0), drag_start_mouse_pos: (0.0, 0.0), @@ -79,7 +80,7 @@ impl PluginGui { unsafe { context.make_current(); } - if let Ok(mut canvas) = create_canvas(context, ¶ms, scaling_factor) { + if let Ok(mut canvas) = create_canvas(context, ¶ms, &scaling_factor) { this.font = canvas .add_font_mem(DROID_SANS_FONT) .map_err(|err| format!("{:?}", err)); @@ -122,17 +123,18 @@ impl WindowHandler for PluginGui { return; } let canvas = self.canvas.as_mut().unwrap(); + let scaling_factor = self.scaling_factor.load().unwrap_or(1.0); if !self.dirty { //return; } - let font_size = 12.0 * self.scaling_factor; + let font_size = 12.0 * scaling_factor; self.freshener_screen_bounds = Rect { - x: 120.0 * self.scaling_factor, - y: 20.0 * self.scaling_factor, - width: FRESHENER_FRAME_WIDTH * self.scaling_factor, - height: FRESHENER_FRAME_HEIGHT * self.scaling_factor, + x: 120.0 * scaling_factor, + y: 20.0 * scaling_factor, + width: FRESHENER_FRAME_WIDTH * scaling_factor, + height: FRESHENER_FRAME_HEIGHT * scaling_factor, }; let context = match window.gl_context() { @@ -160,10 +162,10 @@ impl WindowHandler for PluginGui { let mut freshener_path = Path::new(); freshener_path.rect( - self.freshener_screen_bounds.x * self.scaling_factor, - self.freshener_screen_bounds.y * self.scaling_factor, - self.freshener_screen_bounds.width * self.scaling_factor, - self.freshener_screen_bounds.height * self.scaling_factor, + self.freshener_screen_bounds.x, + self.freshener_screen_bounds.y, + self.freshener_screen_bounds.width, + self.freshener_screen_bounds.height, ); let frame_index = (self.params.freshness.unmodulated_normalized_value() @@ -236,9 +238,10 @@ impl WindowHandler for PluginGui { y += font_size; } }; + let scaling_factor = self.scaling_factor.load(); print("Debug version"); - print(&format!("scaling_factor {}", self.scaling_factor)); + print(&format!("scaling_factor {:?}", scaling_factor)); print(&format!( "screen_bounds {:#?}", self.freshener_screen_bounds @@ -275,7 +278,11 @@ impl WindowHandler for PluginGui { Event::Window(WindowEvent::Resized(size)) => { let phys_size = size.physical_size(); if let Some(canvas) = self.canvas.as_mut() { - canvas.set_size(phys_size.width, phys_size.height, self.scaling_factor); + canvas.set_size( + phys_size.width, + phys_size.height, + self.scaling_factor.load().unwrap_or(1.0), + ); } self.dirty = true; } diff --git a/src/window.rs b/src/window.rs index 4e5cb82..1849043 100644 --- a/src/window.rs +++ b/src/window.rs @@ -6,7 +6,7 @@ use crate::{AirFreshener, editor::EditorHandle, parameters::PluginParams, gui::P pub struct EditorWindow { params: Arc, - scaling_factor: AtomicCell>, + scaling_factor: Arc>>, } impl EditorWindow { @@ -15,9 +15,9 @@ impl EditorWindow { Self { params, #[cfg(target_os = "macos")] - scaling_factor: AtomicCell::new(None), + scaling_factor: Arc::ne(AtomicCell::new(None)), #[cfg(not(target_os = "macos"))] - scaling_factor: AtomicCell::new(Some(1.0)), + scaling_factor: Arc::new(AtomicCell::new(Some(1.0))), } } } @@ -30,6 +30,7 @@ impl Editor for EditorWindow { ) -> Box { let (unscaled_width, unscaled_height) = self.params.editor_state.size(); let scaling_factor = self.scaling_factor.load(); + let move_scaling_factor = self.scaling_factor.clone(); let gui_context = context.clone(); let params = self.params.clone(); let window = Window::open_parented(&parent, WindowOpenOptions { @@ -49,7 +50,7 @@ impl Editor for EditorWindow { ..Default::default() }) }, move |window: &mut baseview::Window<'_>| -> PluginGui { - PluginGui::new(window, gui_context, params, scaling_factor.unwrap_or(1.0)) + PluginGui::new(window, gui_context, params, move_scaling_factor) }); self.params.editor_state.open.store(true, Ordering::Release); Box::new(EditorHandle {