More scren scaling fixes
This commit is contained in:
41
src/gui.rs
41
src/gui.rs
@@ -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, ¶ms, scaling_factor) {
|
if let Ok(mut canvas) = create_canvas(context, ¶ms, &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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user