More scren scaling fixes

This commit is contained in:
Ebu
2025-12-02 14:11:40 +01:00
parent 52ad48ed41
commit 654f23f14f
2 changed files with 29 additions and 21 deletions

View File

@@ -2,6 +2,7 @@ use crate::{parameters::PluginParams, window::EditorWindow};
use baseview::{ use baseview::{
Event, EventStatus, MouseButton, MouseEvent, WindowEvent, WindowHandler, gl::GlContext, Event, EventStatus, MouseButton, MouseEvent, WindowEvent, WindowHandler, gl::GlContext,
}; };
use crossbeam::atomic::AtomicCell;
use ebu_dsp::Rect; use ebu_dsp::Rect;
use femtovg::{Canvas, Color, FontId, ImageFlags, ImageId, Paint, Path, renderer::OpenGl}; use femtovg::{Canvas, Color, FontId, ImageFlags, ImageId, Paint, Path, renderer::OpenGl};
use nih_plug::prelude::*; use nih_plug::prelude::*;
@@ -23,7 +24,7 @@ pub struct PluginGui {
params: Arc<PluginParams>, params: Arc<PluginParams>,
canvas: Option<Canvas<OpenGl>>, canvas: Option<Canvas<OpenGl>>,
_gui_context: Arc<dyn GuiContext>, _gui_context: Arc<dyn GuiContext>,
scaling_factor: f32, scaling_factor: Arc<AtomicCell<Option<f32>>>,
freshener_screen_bounds: Rect<f32>, freshener_screen_bounds: Rect<f32>,
@@ -41,13 +42,13 @@ pub struct PluginGui {
fn create_canvas( fn create_canvas(
context: &GlContext, context: &GlContext,
params: &PluginParams, params: &PluginParams,
scaling_factor: f32, scaling_factor: &AtomicCell<Option<f32>>,
) -> Result<Canvas<OpenGl>, &'static str> { ) -> Result<Canvas<OpenGl>, &'static str> {
let renderer = unsafe { OpenGl::new_from_function(|s| context.get_proc_address(s)) } let renderer = unsafe { OpenGl::new_from_function(|s| context.get_proc_address(s)) }
.map_err(|_| "Failed to create OpenGL renderer")?; .map_err(|_| "Failed to create OpenGL renderer")?;
let mut canvas = Canvas::new(renderer).map_err(|_| "Failed to create femtovg canvas")?; let mut canvas = Canvas::new(renderer).map_err(|_| "Failed to create femtovg canvas")?;
let (width, height) = params.editor_state.size(); 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) Ok(canvas)
} }
@@ -56,14 +57,14 @@ impl PluginGui {
window: &mut baseview::Window<'_>, window: &mut baseview::Window<'_>,
gui_context: Arc<dyn GuiContext>, gui_context: Arc<dyn GuiContext>,
params: Arc<PluginParams>, params: Arc<PluginParams>,
scaling_factor: f32, scaling_factor: Arc<AtomicCell<Option<f32>>>,
) -> Self { ) -> Self {
let mut this = Self { let mut this = Self {
font: Err("Not loaded".to_owned()), font: Err("Not loaded".to_owned()),
params: params.clone(), params: params.clone(),
canvas: None, canvas: None,
_gui_context: gui_context, _gui_context: gui_context,
scaling_factor, scaling_factor: scaling_factor.clone(),
dirty: true, dirty: true,
mouse_position: (0.0, 0.0), mouse_position: (0.0, 0.0),
drag_start_mouse_pos: (0.0, 0.0), drag_start_mouse_pos: (0.0, 0.0),
@@ -79,7 +80,7 @@ impl PluginGui {
unsafe { unsafe {
context.make_current(); context.make_current();
} }
if let Ok(mut canvas) = create_canvas(context, &params, scaling_factor) { if let Ok(mut canvas) = create_canvas(context, &params, &scaling_factor) {
this.font = canvas this.font = canvas
.add_font_mem(DROID_SANS_FONT) .add_font_mem(DROID_SANS_FONT)
.map_err(|err| format!("{:?}", err)); .map_err(|err| format!("{:?}", err));
@@ -122,17 +123,18 @@ impl WindowHandler for PluginGui {
return; return;
} }
let canvas = self.canvas.as_mut().unwrap(); let canvas = self.canvas.as_mut().unwrap();
let scaling_factor = self.scaling_factor.load().unwrap_or(1.0);
if !self.dirty { if !self.dirty {
//return; //return;
} }
let font_size = 12.0 * self.scaling_factor; let font_size = 12.0 * scaling_factor;
self.freshener_screen_bounds = Rect { self.freshener_screen_bounds = Rect {
x: 120.0 * self.scaling_factor, x: 120.0 * scaling_factor,
y: 20.0 * self.scaling_factor, y: 20.0 * scaling_factor,
width: FRESHENER_FRAME_WIDTH * self.scaling_factor, width: FRESHENER_FRAME_WIDTH * scaling_factor,
height: FRESHENER_FRAME_HEIGHT * self.scaling_factor, height: FRESHENER_FRAME_HEIGHT * scaling_factor,
}; };
let context = match window.gl_context() { let context = match window.gl_context() {
@@ -160,10 +162,10 @@ impl WindowHandler for PluginGui {
let mut freshener_path = Path::new(); let mut freshener_path = Path::new();
freshener_path.rect( freshener_path.rect(
self.freshener_screen_bounds.x * self.scaling_factor, self.freshener_screen_bounds.x,
self.freshener_screen_bounds.y * self.scaling_factor, self.freshener_screen_bounds.y,
self.freshener_screen_bounds.width * self.scaling_factor, self.freshener_screen_bounds.width,
self.freshener_screen_bounds.height * self.scaling_factor, self.freshener_screen_bounds.height,
); );
let frame_index = (self.params.freshness.unmodulated_normalized_value() let frame_index = (self.params.freshness.unmodulated_normalized_value()
@@ -236,9 +238,10 @@ impl WindowHandler for PluginGui {
y += font_size; y += font_size;
} }
}; };
let scaling_factor = self.scaling_factor.load();
print("Debug version"); print("Debug version");
print(&format!("scaling_factor {}", self.scaling_factor)); print(&format!("scaling_factor {:?}", scaling_factor));
print(&format!( print(&format!(
"screen_bounds {:#?}", "screen_bounds {:#?}",
self.freshener_screen_bounds self.freshener_screen_bounds
@@ -275,7 +278,11 @@ impl WindowHandler for PluginGui {
Event::Window(WindowEvent::Resized(size)) => { Event::Window(WindowEvent::Resized(size)) => {
let phys_size = size.physical_size(); let phys_size = size.physical_size();
if let Some(canvas) = self.canvas.as_mut() { 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; self.dirty = true;
} }

View File

@@ -6,7 +6,7 @@ use crate::{AirFreshener, editor::EditorHandle, parameters::PluginParams, gui::P
pub struct EditorWindow { pub struct EditorWindow {
params: Arc<PluginParams>, params: Arc<PluginParams>,
scaling_factor: AtomicCell<Option<f32>>, scaling_factor: Arc<AtomicCell<Option<f32>>>,
} }
impl EditorWindow { impl EditorWindow {
@@ -15,9 +15,9 @@ impl EditorWindow {
Self { Self {
params, params,
#[cfg(target_os = "macos")] #[cfg(target_os = "macos")]
scaling_factor: AtomicCell::new(None), scaling_factor: Arc::ne(AtomicCell::new(None)),
#[cfg(not(target_os = "macos"))] #[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<dyn std::any::Any + Send> { ) -> Box<dyn std::any::Any + Send> {
let (unscaled_width, unscaled_height) = self.params.editor_state.size(); let (unscaled_width, unscaled_height) = self.params.editor_state.size();
let scaling_factor = self.scaling_factor.load(); let scaling_factor = self.scaling_factor.load();
let move_scaling_factor = self.scaling_factor.clone();
let gui_context = context.clone(); let gui_context = context.clone();
let params = self.params.clone(); let params = self.params.clone();
let window = Window::open_parented(&parent, WindowOpenOptions { let window = Window::open_parented(&parent, WindowOpenOptions {
@@ -49,7 +50,7 @@ impl Editor for EditorWindow {
..Default::default() ..Default::default()
}) })
}, move |window: &mut baseview::Window<'_>| -> PluginGui { }, 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); self.params.editor_state.open.store(true, Ordering::Release);
Box::new(EditorHandle { Box::new(EditorHandle {