lightweight_pdf_layout/
render_node.rs1use crate::geometry::Rect;
2use lightweight_pdf_core::{Align, Border, Color, ImageFormat, TextStyle};
3use std::sync::Arc;
4
5#[derive(Clone, Debug)]
9pub enum RenderNode {
10 Empty,
11 TextLines {
13 area: Rect,
14 style: TextStyle,
15 lines: Vec<String>,
16 line_height_pt: f32,
17 },
18 Rect {
19 area: Rect,
20 background: Option<Color>,
21 border: Option<Border>,
22 },
23 Line {
24 x1: f32,
25 y1: f32,
26 x2: f32,
27 y2: f32,
28 thickness: f32,
29 color: Color,
30 },
31 Image {
36 area: Rect,
37 bytes: Arc<[u8]>,
38 format: ImageFormat,
39 width_px: u32,
40 height_px: u32,
41 components: u8,
42 },
43 Group {
46 area: Rect,
47 clip: bool,
48 background: Option<Color>,
49 border: Option<Border>,
50 children: Vec<RenderNode>,
51 },
52}
53
54impl RenderNode {
55 pub fn clipped(area: Rect, inner: RenderNode) -> RenderNode {
59 RenderNode::Group {
60 area,
61 clip: true,
62 background: None,
63 border: None,
64 children: vec![inner],
65 }
66 }
67
68 pub fn height(&self) -> f32 {
69 match self {
70 RenderNode::Empty => 0.0,
71 RenderNode::TextLines { area, .. }
72 | RenderNode::Rect { area, .. }
73 | RenderNode::Group { area, .. }
74 | RenderNode::Image { area, .. } => area.height,
75 RenderNode::Line { .. } => 0.0,
76 }
77 }
78}
79
80pub fn align_offset(align: Align, available: f32, used: f32) -> f32 {
82 match align {
83 Align::Start => 0.0,
84 Align::Center => ((available - used) / 2.0).max(0.0),
85 Align::End => (available - used).max(0.0),
86 }
87}