use crate::geometry::Rect;
use lightweight_pdf_core::{Align, Border, Color, ImageFormat, TextStyle};
use std::sync::Arc;
#[derive(Clone, Debug)]
pub enum RenderNode {
Empty,
TextLines {
area: Rect,
style: TextStyle,
lines: Vec<String>,
line_height_pt: f32,
},
Rect {
area: Rect,
background: Option<Color>,
border: Option<Border>,
},
Line {
x1: f32,
y1: f32,
x2: f32,
y2: f32,
thickness: f32,
color: Color,
},
Image {
area: Rect,
bytes: Arc<[u8]>,
format: ImageFormat,
width_px: u32,
height_px: u32,
components: u8,
},
Group {
area: Rect,
clip: bool,
background: Option<Color>,
border: Option<Border>,
children: Vec<RenderNode>,
},
}
impl RenderNode {
pub fn clipped(area: Rect, inner: RenderNode) -> RenderNode {
RenderNode::Group {
area,
clip: true,
background: None,
border: None,
children: vec![inner],
}
}
pub fn height(&self) -> f32 {
match self {
RenderNode::Empty => 0.0,
RenderNode::TextLines { area, .. }
| RenderNode::Rect { area, .. }
| RenderNode::Group { area, .. }
| RenderNode::Image { area, .. } => area.height,
RenderNode::Line { .. } => 0.0,
}
}
}
pub fn align_offset(align: Align, available: f32, used: f32) -> f32 {
match align {
Align::Start => 0.0,
Align::Center => ((available - used) / 2.0).max(0.0),
Align::End => (available - used).max(0.0),
}
}