summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/eval/template.rs15
-rw-r--r--src/eval/walk.rs6
-rw-r--r--src/library/flow.rs4
-rw-r--r--src/library/grid.rs2
-rw-r--r--src/library/pad.rs5
-rw-r--r--src/library/shape.rs41
-rw-r--r--src/library/sized.rs18
-rw-r--r--src/library/stack.rs2
-rw-r--r--src/library/transform.rs2
-rw-r--r--tests/ref/elements/circle.pngbin12965 -> 12498 bytes
-rw-r--r--tests/ref/elements/ellipse.pngbin7717 -> 7146 bytes
-rw-r--r--tests/ref/layout/grid-1.pngbin3248 -> 3255 bytes
-rw-r--r--tests/typ/elements/circle.typ15
-rw-r--r--tests/typ/elements/ellipse.typ6
-rw-r--r--tests/typ/layout/grid-1.typ24
-rw-r--r--tests/typ/layout/grid-3.typ4
-rw-r--r--tests/typ/layout/grid-4.typ8
-rw-r--r--tests/typ/layout/stack-1.typ3
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
index 41079fda..2b938c89 100644
--- a/tests/ref/elements/circle.png
+++ b/tests/ref/elements/circle.png
Binary files differ
diff --git a/tests/ref/elements/ellipse.png b/tests/ref/elements/ellipse.png
index 98e66902..77124e1d 100644
--- a/tests/ref/elements/ellipse.png
+++ b/tests/ref/elements/ellipse.png
Binary files differ
diff --git a/tests/ref/layout/grid-1.png b/tests/ref/layout/grid-1.png
index 06b3a231..df8ab644 100644
--- a/tests/ref/layout/grid-1.png
+++ b/tests/ref/layout/grid-1.png
Binary files differ
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()