From 5a59bb48216352d04f78c9a9392ca7cef280d7b2 Mon Sep 17 00:00:00 2001 From: Laurenz Date: Thu, 18 Nov 2021 12:50:28 +0100 Subject: [PATCH] Page fill --- src/eval/template.rs | 9 ++++++--- src/library/page.rs | 26 +++++++++++++++++++++++--- src/library/shape.rs | 1 + src/style/mod.rs | 3 +++ tests/ref/layout/page.png | Bin 6907 -> 5829 bytes tests/typ/layout/page.typ | 22 +++++++++++----------- 6 files changed, 44 insertions(+), 17 deletions(-) diff --git a/src/eval/template.rs b/src/eval/template.rs index 7801dc799..307bff2a2 100644 --- a/src/eval/template.rs +++ b/src/eval/template.rs @@ -6,7 +6,7 @@ use std::ops::{Add, AddAssign}; use std::rc::Rc; use crate::diag::StrResult; -use crate::geom::{Align, Dir, GenAxis, Length, Linear, Sides, Size}; +use crate::geom::{Align, Dir, GenAxis, Length, Linear, Paint, Sides, Size}; use crate::layout::{Layout, PackedNode}; use crate::library::{ Decoration, DocumentNode, FlowChild, FlowNode, PageNode, ParChild, ParNode, @@ -384,6 +384,7 @@ impl Builder { struct PageBuilder { size: Size, padding: Sides, + fill: Option, hard: bool, } @@ -392,15 +393,17 @@ impl PageBuilder { Self { size: style.page.size, padding: style.page.margins(), + fill: style.page.fill, hard, } } fn build(self, child: FlowNode, keep: bool) -> Option { - let Self { size, padding, hard } = self; + let Self { size, padding, fill, hard } = self; (!child.children.is_empty() || (keep && hard)).then(|| PageNode { - size, child: child.pack().padded(padding), + size, + fill, }) } } diff --git a/src/library/page.rs b/src/library/page.rs index a5935002b..6642de166 100644 --- a/src/library/page.rs +++ b/src/library/page.rs @@ -18,6 +18,7 @@ pub fn page(ctx: &mut EvalContext, args: &mut Args) -> TypResult { let right = args.named("right")?; let bottom = args.named("bottom")?; let flip = args.named("flip")?; + let fill = args.named("fill")?; ctx.template.modify(move |style| { let page = style.page_mut(); @@ -60,6 +61,10 @@ pub fn page(ctx: &mut EvalContext, args: &mut Args) -> TypResult { if flip.unwrap_or(false) { std::mem::swap(&mut page.size.w, &mut page.size.h); } + + if let Some(fill) = fill { + page.fill = Some(Paint::Color(fill)); + } }); ctx.template.pagebreak(false); @@ -77,10 +82,12 @@ pub fn pagebreak(_: &mut EvalContext, _: &mut Args) -> TypResult { /// Layouts its children onto one or multiple pages. #[derive(Debug, Hash)] pub struct PageNode { - /// The size of the page. - pub size: Size, /// The node that produces the actual pages. pub child: PackedNode, + /// The size of the page. + pub size: Size, + /// The background fill. + pub fill: Option, } impl PageNode { @@ -90,6 +97,19 @@ impl PageNode { // that axis. let expand = self.size.to_spec().map(Length::is_finite); let regions = Regions::repeat(self.size, self.size, expand); - self.child.layout(ctx, ®ions).into_iter().map(|c| c.item).collect() + + // Layout the child. + let mut frames: Vec<_> = + self.child.layout(ctx, ®ions).into_iter().map(|c| c.item).collect(); + + // Add background fill if requested. + if let Some(fill) = self.fill { + for frame in &mut frames { + let element = Element::Geometry(Geometry::Rect(frame.size), fill); + Rc::make_mut(frame).prepend(Point::zero(), element) + } + } + + frames } } diff --git a/src/library/shape.rs b/src/library/shape.rs index 7c543958b..d0df5f480 100644 --- a/src/library/shape.rs +++ b/src/library/shape.rs @@ -131,6 +131,7 @@ impl Layout for ShapeNode { frames = node.layout(ctx, &pod); } + // TODO: What if there are multiple or no frames? // Extract the frame. Rc::take(frames.into_iter().next().unwrap().item) } else { diff --git a/src/style/mod.rs b/src/style/mod.rs index 9cf2de073..4588163bd 100644 --- a/src/style/mod.rs +++ b/src/style/mod.rs @@ -71,6 +71,8 @@ pub struct PageStyle { /// The amount of white space on each side of the page. If a side is set to /// `None`, the default for the paper class is used. pub margins: Sides>, + /// The background fill of the page. + pub fill: Option, } impl PageStyle { @@ -93,6 +95,7 @@ impl Default for PageStyle { class: paper.class(), size: paper.size(), margins: Sides::splat(None), + fill: None, } } } diff --git a/tests/ref/layout/page.png b/tests/ref/layout/page.png index 75ad00d120a80d32e79e439d4a2b1961b801f634..dae3d48827e0fd227ac8e8bc6b2e0ef8b1467e58 100644 GIT binary patch literal 5829 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 cGh49%&XYLSKVQJq$ns330sQ8_0B=q!XaE2J literal 6907 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 C*zs!s diff --git a/tests/typ/layout/page.typ b/tests/typ/layout/page.typ index 1d2fdb622..9bb3097d7 100644 --- a/tests/typ/layout/page.typ +++ b/tests/typ/layout/page.typ @@ -2,15 +2,15 @@ --- // Set width and height. -#page(width: 120pt, height: 120pt) +#page(width: 80pt, height: 80pt) [#page(width: 40pt) High] [#page(height: 40pt) Wide] // Set all margins at once. [ - #page(margins: 30pt) - #align(top, left)[TL] - #align(bottom, right)[BR] + #page(margins: 5pt) + #place(top, left)[TL] + #place(bottom, right)[BR] ] // Set individual margins. @@ -26,15 +26,10 @@ // Flipped predefined paper. [#page(paper: "a11", flip: true) Flipped A11] -// Flipped custom page size. -#page(width: 40pt, height: 120pt) -#page(flip: true) -Wide - --- // Test a combination of pages with bodies and normal content. -#page(height: 50pt) +#page(width: 80pt, height: 30pt) [#page() First] [#page() Second] @@ -43,4 +38,9 @@ Wide Fourth [#page(height: 25pt)] Sixth -[#page() Seventh and last] +[#page() Seventh] + +--- +#page(width: 80pt, height: 40pt, fill: eastern) +#font(15pt, "Roboto", fill: white, smallcaps: true) +Typst