diff options
| author | Martin <mhaug@live.de> | 2022-01-01 12:56:03 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-01-01 12:56:03 +0100 |
| commit | 28fc2893e873d44aa31a64a87cb3e2e975977a70 (patch) | |
| tree | bad022650bb488492386e4fc079dde3807b89304 /src/layout/mod.rs | |
| parent | 5d5d8a21cfc041ab08d30229f4ecb4cbb415cbc5 (diff) | |
| parent | 179a9f479831c4941253c0517fccdec3acd8f2ff (diff) | |
Merge pull request #53 from typst/style-chains
Diffstat (limited to 'src/layout/mod.rs')
| -rw-r--r-- | src/layout/mod.rs | 51 |
1 files changed, 19 insertions, 32 deletions
diff --git a/src/layout/mod.rs b/src/layout/mod.rs index 4c982bb8..e1df3d11 100644 --- a/src/layout/mod.rs +++ b/src/layout/mod.rs @@ -15,7 +15,7 @@ use std::fmt::{self, Debug, Formatter}; use std::hash::{Hash, Hasher}; use std::rc::Rc; -use crate::eval::Styles; +use crate::eval::{StyleChain, StyleMap}; use crate::font::FontStore; use crate::frame::Frame; use crate::geom::{Align, Linear, Point, Sides, Size, Spec, Transform}; @@ -30,8 +30,8 @@ pub struct RootNode(pub Vec<PageNode>); impl RootNode { /// Layout the document into a sequence of frames, one per page. pub fn layout(&self, ctx: &mut Context) -> Vec<Rc<Frame>> { - let mut ctx = LayoutContext::new(ctx); - self.0.iter().flat_map(|node| node.layout(&mut ctx)).collect() + let (mut ctx, styles) = LayoutContext::new(ctx); + self.0.iter().flat_map(|node| node.layout(&mut ctx, styles)).collect() } } @@ -52,6 +52,7 @@ pub trait Layout { &self, ctx: &mut LayoutContext, regions: &Regions, + styles: StyleChain, ) -> Vec<Constrained<Rc<Frame>>>; /// Convert to a packed node. @@ -63,7 +64,7 @@ pub trait Layout { #[cfg(feature = "layout-cache")] hash: self.hash64(), node: Rc::new(self), - styles: Styles::new(), + styles: StyleMap::new(), } } } @@ -77,26 +78,23 @@ pub struct LayoutContext<'a> { /// Caches layouting artifacts. #[cfg(feature = "layout-cache")] pub layouts: &'a mut LayoutCache, - /// The inherited style properties. - // TODO(style): This probably shouldn't be here. - pub styles: Styles, /// How deeply nested the current layout tree position is. #[cfg(feature = "layout-cache")] - pub level: usize, + level: usize, } impl<'a> LayoutContext<'a> { /// Create a new layout context. - pub fn new(ctx: &'a mut Context) -> Self { - Self { + fn new(ctx: &'a mut Context) -> (Self, StyleChain<'a>) { + let this = Self { fonts: &mut ctx.fonts, images: &mut ctx.images, #[cfg(feature = "layout-cache")] layouts: &mut ctx.layouts, - styles: ctx.styles.clone(), #[cfg(feature = "layout-cache")] level: 0, - } + }; + (this, StyleChain::new(&ctx.styles)) } } @@ -111,6 +109,7 @@ impl Layout for EmptyNode { &self, _: &mut LayoutContext, regions: &Regions, + _: StyleChain, ) -> Vec<Constrained<Rc<Frame>>> { let size = regions.expand.select(regions.current, Size::zero()); let mut cts = Constraints::new(regions.expand); @@ -128,7 +127,7 @@ pub struct PackedNode { #[cfg(feature = "layout-cache")] hash: u64, /// The node's styles. - pub styles: Styles, + pub styles: StyleMap, } impl PackedNode { @@ -146,7 +145,7 @@ impl PackedNode { } /// Style the node with styles from a style map. - pub fn styled(mut self, styles: Styles) -> Self { + pub fn styled(mut self, styles: StyleMap) -> Self { if self.styles.is_empty() { self.styles = styles; } else { @@ -206,22 +205,25 @@ impl Layout for PackedNode { &self, ctx: &mut LayoutContext, regions: &Regions, + styles: StyleChain, ) -> Vec<Constrained<Rc<Frame>>> { + let chained = self.styles.chain(&styles); + #[cfg(not(feature = "layout-cache"))] - return self.layout_impl(ctx, regions); + return self.node.layout(ctx, regions, chained); #[cfg(feature = "layout-cache")] let hash = { let mut state = fxhash::FxHasher64::default(); self.hash(&mut state); - ctx.styles.hash(&mut state); + styles.hash(&mut state); state.finish() }; #[cfg(feature = "layout-cache")] ctx.layouts.get(hash, regions).unwrap_or_else(|| { ctx.level += 1; - let frames = self.layout_impl(ctx, regions); + let frames = self.node.layout(ctx, regions, chained); ctx.level -= 1; let entry = FramesEntry::new(frames.clone(), ctx.level); @@ -250,21 +252,6 @@ impl Layout for PackedNode { } } -impl PackedNode { - /// Layout the node without checking the cache. - fn layout_impl( - &self, - ctx: &mut LayoutContext, - regions: &Regions, - ) -> Vec<Constrained<Rc<Frame>>> { - let new = self.styles.chain(&ctx.styles); - let prev = std::mem::replace(&mut ctx.styles, new); - let frames = self.node.layout(ctx, regions); - ctx.styles = prev; - frames - } -} - impl Default for PackedNode { fn default() -> Self { EmptyNode.pack() |
