diff options
| -rw-r--r-- | src/eval/template.rs | 15 | ||||
| -rw-r--r-- | src/eval/walk.rs | 6 | ||||
| -rw-r--r-- | src/library/flow.rs | 4 | ||||
| -rw-r--r-- | src/library/grid.rs | 2 | ||||
| -rw-r--r-- | src/library/pad.rs | 5 | ||||
| -rw-r--r-- | src/library/shape.rs | 41 | ||||
| -rw-r--r-- | src/library/sized.rs | 18 | ||||
| -rw-r--r-- | src/library/stack.rs | 2 | ||||
| -rw-r--r-- | src/library/transform.rs | 2 | ||||
| -rw-r--r-- | tests/ref/elements/circle.png | bin | 12965 -> 12498 bytes | |||
| -rw-r--r-- | tests/ref/elements/ellipse.png | bin | 7717 -> 7146 bytes | |||
| -rw-r--r-- | tests/ref/layout/grid-1.png | bin | 3248 -> 3255 bytes | |||
| -rw-r--r-- | tests/typ/elements/circle.typ | 15 | ||||
| -rw-r--r-- | tests/typ/elements/ellipse.typ | 6 | ||||
| -rw-r--r-- | tests/typ/layout/grid-1.typ | 24 | ||||
| -rw-r--r-- | tests/typ/layout/grid-3.typ | 4 | ||||
| -rw-r--r-- | tests/typ/layout/grid-4.typ | 8 | ||||
| -rw-r--r-- | tests/typ/layout/stack-1.typ | 3 |
18 files changed, 76 insertions, 79 deletions
diff --git a/src/eval/template.rs b/src/eval/template.rs index 82a069f9..0604cc05 100644 --- a/src/eval/template.rs +++ b/src/eval/template.rs @@ -149,12 +149,15 @@ impl Template { Self(Rc::new(vec![TemplateNode::Decorated(deco, self)])) } - /// Build the flow node resulting from instantiating the template with the - /// given style. - pub fn to_flow(&self, style: &Style) -> FlowNode { - let mut builder = Builder::new(style, false); - builder.template(self); - builder.build_flow() + /// Pack the template into a layout node. + pub fn pack(&self, style: &Style) -> PackedNode { + if let [TemplateNode::Block(f) | TemplateNode::Inline(f)] = self.0.as_slice() { + f(style) + } else { + let mut builder = Builder::new(style, false); + builder.template(self); + builder.build_flow().pack() + } } /// Build the layout tree resulting from instantiating the template with the diff --git a/src/eval/walk.rs b/src/eval/walk.rs index 134f10c7..fe7f0e98 100644 --- a/src/eval/walk.rs +++ b/src/eval/walk.rs @@ -124,7 +124,7 @@ impl Walk for EnumNode { fn walk_item(ctx: &mut EvalContext, label: EcoString, body: Template) { ctx.template += Template::from_block(move |style| { - let label = ParNode { + let label = Layout::pack(ParNode { dir: style.par.dir, leading: style.leading(), children: vec![ParChild::Text( @@ -132,13 +132,13 @@ fn walk_item(ctx: &mut EvalContext, label: EcoString, body: Template) { style.aligns.inline, Rc::clone(&style.text), )], - }; + }); let spacing = style.text.size / 2.0; GridNode { tracks: Spec::new(vec![TrackSizing::Auto; 2], vec![]), gutter: Spec::new(vec![TrackSizing::Linear(spacing.into())], vec![]), - children: vec![label.pack(), body.to_flow(style).pack()], + children: vec![label, body.pack(style)], } }); } diff --git a/src/library/flow.rs b/src/library/flow.rs index c41fb62c..25162d19 100644 --- a/src/library/flow.rs +++ b/src/library/flow.rs @@ -27,9 +27,7 @@ pub fn flow(_: &mut EvalContext, args: &mut Args) -> TypResult<Value> { .iter() .map(|child| match child { Child::Spacing(spacing) => FlowChild::Spacing(*spacing), - Child::Any(child) => { - FlowChild::Node(child.to_flow(style).pack(), style.aligns.block) - } + Child::Any(node) => FlowChild::Node(node.pack(style), style.aligns.block), }) .collect(); diff --git a/src/library/grid.rs b/src/library/grid.rs index 692ed210..62c10e5a 100644 --- a/src/library/grid.rs +++ b/src/library/grid.rs @@ -45,7 +45,7 @@ pub fn grid(_: &mut EvalContext, args: &mut Args) -> TypResult<Value> { GridNode { tracks: tracks.clone(), gutter: gutter.clone(), - children: children.iter().map(|child| child.to_flow(style).pack()).collect(), + children: children.iter().map(|child| child.pack(style)).collect(), } }))) } diff --git a/src/library/pad.rs b/src/library/pad.rs index 88f8c562..1ec1b4a2 100644 --- a/src/library/pad.rs +++ b/src/library/pad.rs @@ -17,10 +17,7 @@ pub fn pad(_: &mut EvalContext, args: &mut Args) -> TypResult<Value> { ); Ok(Value::Template(Template::from_inline(move |style| { - PadNode { - padding, - child: body.to_flow(style).pack(), - } + PadNode { padding, child: body.pack(style) } }))) } diff --git a/src/library/shape.rs b/src/library/shape.rs index 112987ad..ecf21dc9 100644 --- a/src/library/shape.rs +++ b/src/library/shape.rs @@ -56,21 +56,11 @@ pub fn circle(_: &mut EvalContext, args: &mut Args) -> TypResult<Value> { fn shape_impl( kind: ShapeKind, - mut width: Option<Linear>, - mut height: Option<Linear>, + width: Option<Linear>, + height: Option<Linear>, fill: Option<Color>, body: Option<Template>, ) -> Value { - // Set default shape size if there's no body. - if body.is_none() { - let v = Length::pt(30.0).into(); - height.get_or_insert(v); - width.get_or_insert(match kind { - ShapeKind::Square | ShapeKind::Circle => v, - ShapeKind::Rect | ShapeKind::Ellipse => 1.5 * v, - }); - } - // Set default fill if there's no fill. let fill = fill.unwrap_or(Color::Rgba(RgbaColor::gray(175))); @@ -78,7 +68,7 @@ fn shape_impl( let shape = Layout::pack(ShapeNode { kind, fill: Some(Paint::Color(fill)), - child: body.as_ref().map(|body| body.to_flow(style).pack()), + child: body.as_ref().map(|body| body.pack(style)), }); if width.is_some() || height.is_some() { @@ -126,15 +116,15 @@ impl Layout for ShapeNode { let mut frame = if let Some(child) = &self.child { let mut node: &dyn Layout = child; - let padded; + let storage; if matches!(self.kind, ShapeKind::Circle | ShapeKind::Ellipse) { // Padding with this ratio ensures that a rectangular child fits // perfectly into a circle / an ellipse. - padded = PadNode { + storage = PadNode { padding: Sides::splat(Relative::new(0.5 - SQRT_2 / 4.0).into()), child: child.clone(), }; - node = &padded; + node = &storage; } // Now, layout the child. @@ -155,7 +145,24 @@ impl Layout for ShapeNode { assert_eq!(frames.len(), 1); Rc::take(frames.into_iter().next().unwrap().item) } else { - Frame::new(regions.current, regions.current.h) + let default = Length::pt(30.0); + let size = Size::new( + if regions.expand.x && regions.current.w.is_finite() { + regions.current.w + } else { + match self.kind { + ShapeKind::Square | ShapeKind::Circle => default, + ShapeKind::Rect | ShapeKind::Ellipse => 1.5 * default, + } + }, + if regions.expand.y && regions.current.h.is_finite() { + regions.current.h + } else { + default + }, + ); + + Frame::new(size, size.h) }; // Add background shape if desired. diff --git a/src/library/sized.rs b/src/library/sized.rs index 631f9e6f..686d79b9 100644 --- a/src/library/sized.rs +++ b/src/library/sized.rs @@ -6,14 +6,11 @@ pub fn box_(_: &mut EvalContext, args: &mut Args) -> TypResult<Value> { let height = args.named("height")?; let body: Template = args.find().unwrap_or_default(); Ok(Value::Template(Template::from_inline(move |style| { - let flow = body.to_flow(style).pack(); + let child = body.pack(style); if width.is_some() || height.is_some() { - Layout::pack(SizedNode { - sizing: Spec::new(width, height), - child: flow, - }) + Layout::pack(SizedNode { sizing: Spec::new(width, height), child }) } else { - flow + child } }))) } @@ -24,14 +21,11 @@ pub fn block(_: &mut EvalContext, args: &mut Args) -> TypResult<Value> { let height = args.named("height")?; let body: Template = args.find().unwrap_or_default(); Ok(Value::Template(Template::from_block(move |style| { - let flow = body.to_flow(style).pack(); + let child = body.pack(style); if width.is_some() || height.is_some() { - Layout::pack(SizedNode { - sizing: Spec::new(width, height), - child: flow, - }) + Layout::pack(SizedNode { sizing: Spec::new(width, height), child }) } else { - flow + child } }))) } diff --git a/src/library/stack.rs b/src/library/stack.rs index dec5ec2d..b97964db 100644 --- a/src/library/stack.rs +++ b/src/library/stack.rs @@ -40,7 +40,7 @@ pub fn stack(_: &mut EvalContext, args: &mut Args) -> TypResult<Value> { children.push(StackChild::Spacing(v)); } - let node = child.to_flow(style).pack(); + let node = child.pack(style); children.push(StackChild::Node(node)); delayed = spacing; } diff --git a/src/library/transform.rs b/src/library/transform.rs index 20d2bc1d..85d65703 100644 --- a/src/library/transform.rs +++ b/src/library/transform.rs @@ -9,7 +9,7 @@ pub fn move_(_: &mut EvalContext, args: &mut Args) -> TypResult<Value> { Ok(Value::Template(Template::from_inline(move |style| { MoveNode { offset: Spec::new(x, y), - child: body.to_flow(style).pack(), + child: body.pack(style), } }))) } diff --git a/tests/ref/elements/circle.png b/tests/ref/elements/circle.png Binary files differindex 41079fda..2b938c89 100644 --- a/tests/ref/elements/circle.png +++ b/tests/ref/elements/circle.png diff --git a/tests/ref/elements/ellipse.png b/tests/ref/elements/ellipse.png Binary files differindex 98e66902..77124e1d 100644 --- a/tests/ref/elements/ellipse.png +++ b/tests/ref/elements/ellipse.png diff --git a/tests/ref/layout/grid-1.png b/tests/ref/layout/grid-1.png Binary files differindex 06b3a231..df8ab644 100644 --- a/tests/ref/layout/grid-1.png +++ b/tests/ref/layout/grid-1.png diff --git a/tests/typ/elements/circle.typ b/tests/typ/elements/circle.typ index c36f9f94..4413d0d9 100644 --- a/tests/typ/elements/circle.typ +++ b/tests/typ/elements/circle.typ @@ -14,16 +14,15 @@ Auto-sized circle. \ ] Center-aligned rect in auto-sized circle. -#circle(fill: forest)[ - #align(center, center) - #rect(fill: conifer, pad(5pt)[ - But, soft! - ]) -] +#circle(fill: forest, + align(center, center, + rect(fill: conifer, pad(5pt)[But, soft!]) + ) +) -100%-width rect in auto-sized circle. \ +Rect in auto-sized circle. \ #circle(fill: forest, - rect(width: 100%, fill: conifer)[ + rect(fill: conifer)[ But, soft! what light through yonder window breaks? ] ) diff --git a/tests/typ/elements/ellipse.typ b/tests/typ/elements/ellipse.typ index 106a8172..3c8572b1 100644 --- a/tests/typ/elements/ellipse.typ +++ b/tests/typ/elements/ellipse.typ @@ -5,10 +5,10 @@ #ellipse() --- -100% rect in 100% ellipse in fixed rect. \ +Rect in ellipse in fixed rect. \ #rect(width: 3cm, height: 2cm, fill: rgb("2a631a"), - ellipse(width: 100%, height: 100%, fill: forest, - rect(width: 100%, height: 100%, fill: conifer)[ + ellipse(fill: forest, + rect(fill: conifer)[ #align(center, center) Stuff inside an ellipse! ] diff --git a/tests/typ/layout/grid-1.typ b/tests/typ/layout/grid-1.typ index 23723712..afd01a5f 100644 --- a/tests/typ/layout/grid-1.typ +++ b/tests/typ/layout/grid-1.typ @@ -7,17 +7,17 @@ #grid( columns: (auto, 1fr, 3fr, 0.25cm, 3%, 2mm + 10%), cell(0.5cm, rgb("2a631a")), - cell(100%, forest), - cell(100%, conifer), - cell(100%, rgb("ff0000")), - cell(100%, rgb("00ff00")), - cell(80%, rgb("00faf0")), - cell(1cm, rgb("00ff00")), + cell(100%, forest), + cell(100%, conifer), + cell(100%, rgb("ff0000")), + cell(100%, rgb("00ff00")), + cell(80%, rgb("00faf0")), + cell(1cm, rgb("00ff00")), cell(0.5cm, rgb("2a631a")), - cell(100%, forest), - cell(100%, conifer), - cell(100%, rgb("ff0000")), - cell(100%, rgb("00ff00")), + cell(100%, forest), + cell(100%, conifer), + cell(100%, rgb("ff0000")), + cell(100%, rgb("00ff00")), ) #grid() @@ -29,7 +29,7 @@ row-gutter: 1fr, rect(fill: eastern)[dddaa aaa aaa], rect(fill: conifer)[ccc], - rect(width: 100%, fill: rgb("dddddd"))[aaa], + rect(fill: rgb("dddddd"))[aaa], ) --- @@ -39,6 +39,6 @@ columns: (1fr,), rows: (1fr, auto, 2fr), [], - box(width: 100%)[A bit more to the top], + [A bit more to the top], [], ) diff --git a/tests/typ/layout/grid-3.typ b/tests/typ/layout/grid-3.typ index 42d2ce97..af971875 100644 --- a/tests/typ/layout/grid-3.typ +++ b/tests/typ/layout/grid-3.typ @@ -67,9 +67,9 @@ columns: 2 * (1fr,), rows: (1fr, 2fr, auto, 1fr, 1cm), row-gutter: 10pt, - rect(height: 100%, width: 100%, fill: rgb("ff0000"))[No height], + rect(fill: rgb("ff0000"))[No height], [foo], - rect(height: 100%, width: 100%, fill: rgb("fc0030"))[Still no height], + rect(fill: rgb("fc0030"))[Still no height], [bar], [The nature of being itself is in question. Am I One? What is being alive?], [baz], diff --git a/tests/typ/layout/grid-4.typ b/tests/typ/layout/grid-4.typ index 02ac0486..d6aa6358 100644 --- a/tests/typ/layout/grid-4.typ +++ b/tests/typ/layout/grid-4.typ @@ -15,10 +15,10 @@ #grid( columns: (1fr,) * 4, rows: (1cm,), - rect(width: 50%, height: 100%, fill: conifer), - rect(width: 50%, height: 100%, fill: forest), - rect(width: 50%, height: 100%, fill: conifer), - rect(width: 50%, height: 100%, fill: forest), + rect(width: 50%, fill: conifer), + rect(width: 50%, fill: forest), + rect(width: 50%, fill: conifer), + rect(width: 50%, fill: forest), ) --- diff --git a/tests/typ/layout/stack-1.typ b/tests/typ/layout/stack-1.typ index b8d8a09d..42a0137d 100644 --- a/tests/typ/layout/stack-1.typ +++ b/tests/typ/layout/stack-1.typ @@ -13,9 +13,8 @@ w => rect(width: w, height: 10pt, fill: next()) } -#let items = for w in widths { (shaded(w),) } +#let items = for w in widths { (align(right, shaded(w)),) } -#align(right) #page(width: 50pt, margins: 0pt) #stack(dir: btt, ..items) #pagebreak() |
