forma/composition/
state.rs
1use std::cell::{RefCell, RefMut};
6use std::mem;
7use std::rc::Rc;
8
9use rustc_hash::FxHashMap;
10use surpass::painter::Props;
11use surpass::{GeomId, LinesBuilder, Order};
12
13use super::interner::Interner;
14
15#[derive(Debug)]
16pub struct LayerSharedStateInner {
17 pub lines_builder: Option<LinesBuilder>,
18 pub geom_id_to_order: FxHashMap<GeomId, Option<Order>>,
19 pub props_interner: Interner<Props>,
20 geom_id_generator: GeomId,
21}
22
23impl Default for LayerSharedStateInner {
24 fn default() -> Self {
25 Self {
26 lines_builder: Some(LinesBuilder::default()),
27 geom_id_to_order: FxHashMap::default(),
28 props_interner: Interner::default(),
29 geom_id_generator: GeomId::default(),
30 }
31 }
32}
33
34impl LayerSharedStateInner {
35 pub fn new_geom_id(&mut self) -> GeomId {
36 let prev = self.geom_id_generator;
37 mem::replace(&mut self.geom_id_generator, prev.next())
38 }
39}
40
41#[derive(Debug, Default)]
42pub struct LayerSharedState {
43 inner: Rc<RefCell<LayerSharedStateInner>>,
44}
45
46impl LayerSharedState {
47 pub fn new(inner: Rc<RefCell<LayerSharedStateInner>>) -> Self {
48 Self { inner }
49 }
50
51 pub fn inner(&mut self) -> RefMut<'_, LayerSharedStateInner> {
52 self.inner.borrow_mut()
53 }
54}
55
56impl PartialEq<Rc<RefCell<LayerSharedStateInner>>> for LayerSharedState {
57 fn eq(&self, other: &Rc<RefCell<LayerSharedStateInner>>) -> bool {
58 Rc::ptr_eq(&self.inner, other)
59 }
60}
61
62unsafe impl Sync for LayerSharedState {}