1#![allow(non_snake_case)]
2
3use std::collections::HashMap;
4use std::rc::Rc;
5use std::sync::Arc;
6
7use repose_core::*;
8use repose_tree::{NodeId, TreeStats, ViewTree};
9use rustc_hash::FxHashMap;
10use taffy::TaffyTree;
11
12#[derive(Clone, Copy, Debug, Default)]
19pub(crate) struct TextBaselines {
20 pub(crate) first: f32,
21 pub(crate) last: f32,
22 pub(crate) content_h: f32,
23}
24
25pub(crate) struct ScopeLayoutTree {
26 pub(crate) taffy: TaffyTree<NodeContext>,
27 pub(crate) taffy_map: FxHashMap<NodeId, taffy::NodeId>,
28 pub(crate) reverse_map: FxHashMap<taffy::NodeId, NodeId>,
29 pub(crate) root_taffy_id: Option<taffy::NodeId>,
30 pub(crate) last_constraints:
31 Option<(taffy::Size<Option<f32>>, taffy::Size<taffy::AvailableSpace>)>,
32 pub(crate) cached_size: Option<taffy::Size<f32>>,
33 pub(crate) text_cache: FxHashMap<NodeId, TextLayout>,
34 pub(crate) valid: bool,
35 pub(crate) baseline_map: FxHashMap<NodeId, TextBaselines>,
38 pub(crate) baseline_shifts: FxHashMap<NodeId, f32>,
41}
42
43impl ScopeLayoutTree {
44 pub(crate) fn new() -> Self {
45 Self {
46 taffy: TaffyTree::new(),
47 taffy_map: FxHashMap::default(),
48 reverse_map: FxHashMap::default(),
49 root_taffy_id: None,
50 last_constraints: None,
51 cached_size: None,
52 text_cache: FxHashMap::default(),
53 valid: false,
54 baseline_map: FxHashMap::default(),
55 baseline_shifts: FxHashMap::default(),
56 }
57 }
58}
59
60pub struct LayoutEngine {
61 pub(crate) tree: ViewTree,
62
63 pub(crate) taffy: TaffyTree<NodeContext>,
65
66 pub(crate) taffy_map: FxHashMap<NodeId, taffy::NodeId>,
67
68 pub(crate) reverse_map: FxHashMap<taffy::NodeId, NodeId>,
70
71 pub(crate) scope_trees: HashMap<String, ScopeLayoutTree>,
73
74 pub(crate) scope_root_map: FxHashMap<NodeId, String>,
76
77 pub(crate) node_to_scope: FxHashMap<NodeId, String>,
79
80 pub(crate) text_cache: FxHashMap<NodeId, TextLayout>,
82
83 pub(crate) baseline_map: FxHashMap<NodeId, TextBaselines>,
86 pub(crate) baseline_shifts: FxHashMap<NodeId, f32>,
89
90 pub(crate) last_size_px: Option<(u32, u32)>,
92
93 pub(crate) layout_valid: bool,
95
96 pub(crate) paint_cache: FxHashMap<NodeId, PaintCacheEntry>,
98
99 pub stats: LayoutStats,
101
102 pub(crate) prev_focused: Option<u64>,
104
105 pub(crate) focus_callbacks: FxHashMap<u64, Rc<dyn Fn(bool)>>,
107
108 pub(crate) last_locals_stamp: Option<u64>,
110
111 pub(crate) view_ids: FxHashMap<NodeId, u64>,
113 pub(crate) next_view_id: u64,
114
115 pub(crate) layer_id_counter: u32,
117
118 pub(crate) prev_observed_rects: FxHashMap<u64, repose_core::Rect>,
120
121 pub(crate) focus_group_stack: Vec<u64>,
125
126 pub(crate) focus_interaction_sources: FxHashMap<u64, InteractionSource>,
129}
130
131#[derive(Clone, Debug, Default)]
133pub struct LayoutStats {
134 pub tree: TreeStats,
135
136 pub taffy_created: usize,
138
139 pub taffy_reused: usize,
141
142 pub layout_hits: usize,
144
145 pub layout_misses: usize,
147
148 pub paint_cache_hits: usize,
150
151 pub paint_cache_misses: usize,
153
154 pub paint_culled: usize,
156
157 pub layout_time_ms: f32,
159
160 pub paint_time_ms: f32,
162}
163
164#[derive(Clone)]
165pub(crate) struct PaintCacheEntry {
166 pub(crate) subtree_hash: u64,
167 pub(crate) stamp: u64,
168 pub(crate) rect: repose_core::Rect,
169 pub(crate) parent_offset_px: (f32, f32),
170 pub(crate) sem_parent: Option<u64>,
171 pub(crate) alpha_q: u8,
172 pub(crate) nodes: Rc<Vec<SceneNode>>,
173 pub(crate) hits: Rc<Vec<HitRegion>>,
174 pub(crate) sems: Rc<Vec<SemNode>>,
175}
176
177#[derive(Clone, Copy, Debug, PartialEq, Eq)]
179pub enum IntrinsicSizeMode {
180 MinContent,
182 MaxContent,
184}
185
186#[derive(Clone)]
190pub(crate) enum NodeContext {
191 Text {
192 text: String,
193 font_sp: Sp,
194 soft_wrap: bool,
195 max_lines: Option<usize>,
196 overflow: TextOverflow,
197 font_family: Option<&'static str>,
198 font_weight: FontWeight,
199 font_style: FontStyle,
200 letter_spacing: Sp,
201 line_height: Sp,
202 font_variation_settings: Option<Arc<str>>,
203 annotations: Option<Arc<[TextSpan]>>,
204 },
205 Container,
206 ScrollContainer,
207 TextInput {
208 multiline: bool,
209 },
210}
211
212#[derive(Clone)]
213pub(crate) struct TextLayout {
214 pub(crate) lines: Vec<String>,
215 pub(crate) line_ranges: Vec<(usize, usize)>,
217 pub(crate) size_px: f32,
218 pub(crate) line_h_px: f32,
219 pub(crate) line_widths: Vec<f32>,
221 pub(crate) line_heights: Vec<f32>,
224}