diff options
| author | Laurenz <laurmaedje@gmail.com> | 2022-11-08 15:31:15 +0100 |
|---|---|---|
| committer | Laurenz <laurmaedje@gmail.com> | 2022-11-08 16:37:07 +0100 |
| commit | 12a59963b08b68cc39dcded4d3d3e6a6631c2732 (patch) | |
| tree | 3d20b014ada1ac06d2e74611a1798d7fb18dca33 /library/src/layout | |
| parent | a7a4cae2948176119e8995bd8e1868f2d0e65029 (diff) | |
Reduce style chain bloat
Diffstat (limited to 'library/src/layout')
| -rw-r--r-- | library/src/layout/mod.rs | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/library/src/layout/mod.rs b/library/src/layout/mod.rs index e116f159..1032ba54 100644 --- a/library/src/layout/mod.rs +++ b/library/src/layout/mod.rs @@ -33,7 +33,7 @@ use typst::frame::Frame; use typst::geom::*; use typst::model::{ capability, Barrier, Content, Node, SequenceNode, Show, StyleChain, StyleEntry, - StyleMap, StyleVec, StyleVecBuilder, StyledNode, Target, + StyleVec, StyleVecBuilder, StyledNode, Target, }; use typst::World; @@ -253,8 +253,10 @@ struct Builder<'a> { struct Scratch<'a> { /// An arena where intermediate style chains are stored. styles: Arena<StyleChain<'a>>, + /// An arena for individual intermediate style entries. + entries: Arena<StyleEntry>, /// An arena where intermediate content resulting from show rules is stored. - templates: Arena<Content>, + content: Arena<Content>, } /// Determines whether a style could interrupt some composable structure. @@ -305,7 +307,7 @@ impl<'a> Builder<'a> { ) -> SourceResult<()> { if let Some(text) = content.downcast::<TextNode>() { if let Some(realized) = styles.apply(self.world, Target::Text(&text.0))? { - let stored = self.scratch.templates.alloc(realized); + let stored = self.scratch.content.alloc(realized); return self.accept(stored, styles); } } else if let Some(styled) = content.downcast::<StyledNode>() { @@ -357,16 +359,18 @@ impl<'a> Builder<'a> { content: &'a Content, styles: StyleChain<'a>, ) -> SourceResult<bool> { - let Some(mut realized) = styles.apply(self.world, Target::Node(content))? else { + let barrier = StyleEntry::Barrier(Barrier::new(content.id())); + let styles = self + .scratch + .entries + .alloc(barrier) + .chain(self.scratch.styles.alloc(styles)); + + let Some(realized) = styles.apply(self.world, Target::Node(content))? else { return Ok(false); }; - let mut map = StyleMap::new(); - let barrier = Barrier::new(content.id()); - map.push(StyleEntry::Barrier(barrier)); - map.push(StyleEntry::Barrier(barrier)); - realized = realized.styled_with_map(map); - let stored = self.scratch.templates.alloc(realized); + let stored = self.scratch.content.alloc(realized); self.accept(stored, styles)?; Ok(true) @@ -680,7 +684,7 @@ impl<'a> ListBuilder<'a> { DESC | _ => ListNode::<DESC> { tight, attached, items }.pack(), }; - let stored = parent.scratch.templates.alloc(content); + let stored = parent.scratch.content.alloc(content); parent.accept(stored, shared)?; for (content, styles) in self.staged { |
