jellyflow_runtime/runtime/fit_view/
options.rs1use crate::node_origin::normalize_node_origin;
2
3const MAX_FIT_VIEW_PADDING: f32 = 0.45;
4
5#[derive(Debug, Clone, Copy)]
6pub struct FitViewComputeOptions {
7 pub viewport_width_px: f32,
9 pub viewport_height_px: f32,
11 pub node_origin: (f32, f32),
16 pub padding: f32,
20 pub margin_px_fallback: f32,
22 pub min_zoom: f32,
24 pub max_zoom: f32,
26}
27
28impl FitViewComputeOptions {
29 pub fn normalized(mut self) -> Option<Self> {
30 if !self.viewport_width_px.is_finite()
31 || !self.viewport_height_px.is_finite()
32 || self.viewport_width_px <= 1.0
33 || self.viewport_height_px <= 1.0
34 {
35 return None;
36 }
37
38 self.node_origin = normalize_node_origin(self.node_origin);
39
40 if !self.margin_px_fallback.is_finite() || self.margin_px_fallback < 0.0 {
41 self.margin_px_fallback = 0.0;
42 }
43
44 if !self.padding.is_finite() {
45 self.padding = 0.0;
46 }
47 self.padding = self.padding.clamp(0.0, MAX_FIT_VIEW_PADDING);
48
49 if !self.min_zoom.is_finite() || self.min_zoom <= 0.0 {
50 self.min_zoom = 1.0;
51 }
52 if !self.max_zoom.is_finite() || self.max_zoom <= 0.0 {
53 self.max_zoom = 1.0;
54 }
55 if self.min_zoom > self.max_zoom {
56 std::mem::swap(&mut self.min_zoom, &mut self.max_zoom);
57 }
58
59 Some(self)
60 }
61}