forma/composition/
state.rs

1// Copyright 2022 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5use 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
62// Safe as long as `inner` can only be accessed by `&mut self`.
63unsafe impl Sync for LayerSharedState {}